commands: Make all list commands list what 'all' did before

Also, always include the CSV header.

Updates #10953
This commit is contained in:
Bjørn Erik Pedersen 2023-05-22 09:49:58 +02:00
parent 2db7ec622f
commit 6ca8a40f25
2 changed files with 69 additions and 45 deletions

View file

@ -16,6 +16,10 @@ package commands
import ( import (
"context" "context"
"encoding/csv" "encoding/csv"
"os"
"path/filepath"
"strconv"
"strings"
"time" "time"
"github.com/bep/simplecobra" "github.com/bep/simplecobra"
@ -28,7 +32,20 @@ import (
// newListCommand creates a new list command and its subcommands. // newListCommand creates a new list command and its subcommands.
func newListCommand() *listCommand { func newListCommand() *listCommand {
list := func(cd *simplecobra.Commandeer, r *rootCommand, createRecord func(page.Page) []string, opts ...any) error { createRecord := func(workingDir string, p page.Page) []string {
return []string{
filepath.ToSlash(strings.TrimPrefix(p.File().Filename(), workingDir+string(os.PathSeparator))),
p.Slug(),
p.Title(),
p.Date().Format(time.RFC3339),
p.ExpiryDate().Format(time.RFC3339),
p.PublishDate().Format(time.RFC3339),
strconv.FormatBool(p.Draft()),
p.Permalink(),
}
}
list := func(cd *simplecobra.Commandeer, r *rootCommand, shouldInclude func(page.Page) bool, opts ...any) error {
bcfg := hugolib.BuildCfg{SkipRender: true} bcfg := hugolib.BuildCfg{SkipRender: true}
cfg := config.New() cfg := config.New()
for i := 0; i < len(opts); i += 2 { for i := 0; i < len(opts); i += 2 {
@ -42,8 +59,20 @@ func newListCommand() *listCommand {
writer := csv.NewWriter(r.Out) writer := csv.NewWriter(r.Out)
defer writer.Flush() defer writer.Flush()
writer.Write([]string{
"path",
"slug",
"title",
"date",
"expiryDate",
"publishDate",
"draft",
"permalink",
})
for _, p := range h.Pages() { for _, p := range h.Pages() {
if record := createRecord(p); record != nil { if shouldInclude(p) {
record := createRecord(h.Conf.BaseConfig().WorkingDir, p)
if err := writer.Write(record); err != nil { if err := writer.Write(record); err != nil {
return err return err
} }
@ -64,16 +93,14 @@ func newListCommand() *listCommand {
short: "List all drafts", short: "List all drafts",
long: `List all of the drafts in your content directory.`, long: `List all of the drafts in your content directory.`,
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
createRecord := func(p page.Page) []string { shouldInclude := func(p page.Page) bool {
if !p.Draft() || p.File().IsZero() { if !p.Draft() || p.File().IsZero() {
return nil return false
} }
return []string{ return true
p.File().Path(),
p.PublishDate().Format(time.RFC3339)}
} }
return list(cd, r, createRecord, return list(cd, r, shouldInclude,
"buildDrafts", true, "buildDrafts", true,
"buildFuture", true, "buildFuture", true,
"buildExpired", true, "buildExpired", true,
@ -85,17 +112,14 @@ func newListCommand() *listCommand {
short: "List all posts dated in the future", short: "List all posts dated in the future",
long: `List all of the posts in your content directory which will be posted in the future.`, long: `List all of the posts in your content directory which will be posted in the future.`,
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
createRecord := func(p page.Page) []string { shouldInclude := func(p page.Page) bool {
if !resource.IsFuture(p) || p.File().IsZero() { if !resource.IsFuture(p) || p.File().IsZero() {
return nil return false
}
return []string{
p.File().Path(),
p.PublishDate().Format(time.RFC3339),
} }
return true
} }
return list(cd, r, createRecord, return list(cd, r, shouldInclude,
"buildFuture", true, "buildFuture", true,
"buildDrafts", true, "buildDrafts", true,
) )
@ -106,17 +130,13 @@ func newListCommand() *listCommand {
short: "List all posts already expired", short: "List all posts already expired",
long: `List all of the posts in your content directory which has already expired.`, long: `List all of the posts in your content directory which has already expired.`,
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
createRecord := func(p page.Page) []string { shouldInclude := func(p page.Page) bool {
if !resource.IsExpired(p) || p.File().IsZero() { if !resource.IsExpired(p) || p.File().IsZero() {
return nil return false
} }
return []string{ return true
p.File().Path(),
p.PublishDate().Format(time.RFC3339),
}
} }
return list(cd, r, createRecord, return list(cd, r, shouldInclude,
"buildExpired", true, "buildExpired", true,
"buildDrafts", true, "buildDrafts", true,
) )
@ -127,17 +147,10 @@ func newListCommand() *listCommand {
short: "List all posts", short: "List all posts",
long: `List all of the posts in your content directory, include drafts, future and expired pages.`, long: `List all of the posts in your content directory, include drafts, future and expired pages.`,
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
createRecord := func(p page.Page) []string { shouldInclude := func(p page.Page) bool {
if p.File().IsZero() { return !p.File().IsZero()
return nil
}
return []string{
p.File().Path(),
p.PublishDate().Format(time.RFC3339),
}
} }
return list(cd, r, createRecord, "buildDrafts", true, "buildFuture", true, "buildExpired", true) return list(cd, r, shouldInclude, "buildDrafts", true, "buildFuture", true, "buildExpired", true)
}, },
}, },
}, },

View file

@ -2,32 +2,43 @@
hugo list drafts hugo list drafts
! stderr . ! stderr .
stdout 'draft.md,2019-01-01T00:00:00Z' stdout 'path,slug,title,date,expiryDate,publishDate,draft,permalink'
stdout 'draftexpired.md,2018-01-01T00:00:00Z' stdout 'content/draft.md,draft,The Draft,2019-01-01T00:00:00Z,2032-01-01T00:00:00Z,2018-01-01T00:00:00Z,true,https://example.org/draft/'
stdout 'draftfuture.md,2030-01-01T00:00:00Z' stdout 'draftexpired.md'
stdout 'draftfuture.md'
! stdout '/expired.md'
hugo list future hugo list future
stdout 'future.md,2030-01-01T00:00:00Z' stdout 'path,slug,title,date,expiryDate,publishDate,draft,permalink'
stdout 'draftfuture.md,2030-01-01T00:00:00Z' stdout 'future.md'
stdout 'draftfuture.md'
! stdout 'expired.md'
hugo list expired hugo list expired
stdout 'expired.md,2018-01-01T00:00:00Z' stdout 'path,slug,title,date,expiryDate,publishDate,draft,permalink'
stdout 'draftexpired.md,2018-01-01T00:00:00Z' stdout 'expired.md'
stdout 'draftexpired.md'
! stdout 'future.md'
hugo list all hugo list all
stdout 'future.md,2030-01-01T00:00:00Z' stdout 'path,slug,title,date,expiryDate,publishDate,draft,permalink'
stdout 'draft.md,2019-01-01T00:00:00Z' stdout 'future.md'
stdout 'expired.md,2018-01-01T00:00:00Z' stdout 'draft.md'
stdout 'draftexpired.md,2018-01-01T00:00:00Z' stdout 'expired.md'
stdout 'draftfuture.md,2030-01-01T00:00:00Z' stdout 'draftexpired.md'
stdout 'draftfuture.md'
-- hugo.toml -- -- hugo.toml --
baseURL = "https://example.org/" baseURL = "https://example.org/"
disableKinds = ["taxonomy", "term"] disableKinds = ["taxonomy", "term"]
-- content/draft.md -- -- content/draft.md --
--- ---
title: "The Draft"
slug: "draft"
draft: true draft: true
date: 2019-01-01 date: 2019-01-01
expiryDate: 2032-01-01
publishDate: 2018-01-01
--- ---
-- content/expired.md -- -- content/expired.md --
--- ---