shithub: hugo

Download patch

ref: c502f078bc964a683f05fb4e877b3a1b50894837
parent: 4ebaec890614b8b2f53e2a984aed48b3ac31938e
author: spf13 <[email protected]>
date: Wed May 28 20:48:40 EDT 2014

Add handling for publishDates (which will be ignored if in the future). Fixed #260

--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -51,7 +51,7 @@
 
 var hugoCmdV *cobra.Command
 
-var BuildWatch, Draft, UglyUrls, Verbose, Logging, VerboseLog, DisableRSS, DisableSitemap bool
+var BuildWatch, Draft, Future, UglyUrls, Verbose, Logging, VerboseLog, DisableRSS, DisableSitemap bool
 var Source, Destination, Theme, BaseUrl, CfgFile, LogFile string
 
 func Execute() {
@@ -70,6 +70,7 @@
 
 func init() {
 	HugoCmd.PersistentFlags().BoolVarP(&Draft, "buildDrafts", "D", false, "include content marked as draft")
+	HugoCmd.PersistentFlags().BoolVarP(&Future, "buildFuture", "F", false, "include content with datePublished in the future")
 	HugoCmd.PersistentFlags().BoolVar(&DisableRSS, "disableRSS", false, "Do not build RSS files")
 	HugoCmd.PersistentFlags().BoolVar(&DisableSitemap, "disableSitemap", false, "Do not build Sitemap file")
 	HugoCmd.PersistentFlags().StringVarP(&Source, "source", "s", "", "filesystem path to read files relative from")
@@ -108,6 +109,7 @@
 	viper.SetDefault("PublishDir", "public")
 	viper.SetDefault("DefaultLayout", "post")
 	viper.SetDefault("BuildDrafts", false)
+	viper.SetDefault("BuildFuture", false)
 	viper.SetDefault("UglyUrls", false)
 	viper.SetDefault("Verbose", false)
 	viper.SetDefault("CanonifyUrls", false)
@@ -120,6 +122,10 @@
 
 	if hugoCmdV.PersistentFlags().Lookup("buildDrafts").Changed {
 		viper.Set("BuildDrafts", Draft)
+	}
+
+	if hugoCmdV.PersistentFlags().Lookup("buildFuture").Changed {
+		viper.Set("BuildFuture", Future)
 	}
 
 	if hugoCmdV.PersistentFlags().Lookup("uglyUrls").Changed {
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -44,6 +44,7 @@
 	Params            map[string]interface{}
 	contentType       string
 	Draft             bool
+	PublishDate       time.Time
 	Aliases           []string
 	Tmpl              Template
 	Markup            string
@@ -276,6 +277,15 @@
 	}
 }
 
+func (page *Page) ShouldBuild() bool {
+	if viper.GetBool("BuildFuture") || page.PublishDate.IsZero() || page.PublishDate.Before(time.Now()) {
+		if viper.GetBool("BuildDrafts") || !page.Draft {
+			return true
+		}
+	}
+	return false
+}
+
 func (p *Page) Permalink() (string, error) {
 	link, err := p.permalink()
 	if err != nil {
@@ -323,8 +333,10 @@
 			page.contentType = cast.ToString(v)
 		case "keywords":
 			page.Keywords = cast.ToStringSlice(v)
-		case "date", "pubdate":
+		case "date":
 			page.Date = cast.ToTime(v)
+		case "publishdate", "pubdate":
+			page.PublishDate = cast.ToTime(v)
 		case "draft":
 			page.Draft = cast.ToBool(v)
 		case "layout":
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -344,7 +344,7 @@
 				return err
 			}
 
-			if viper.GetBool("BuildDrafts") || !page.Draft {
+			if page.ShouldBuild() {
 				s.Pages = append(s.Pages, page)
 			}
 
--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -219,6 +219,66 @@
 	}
 }
 
+func TestDraftAndFutureRender(t *testing.T) {
+	files := make(map[string][]byte)
+	target := &target.InMemoryTarget{Files: files}
+	sources := []source.ByteSource{
+		{"sect/doc1.md", []byte("---\ntitle: doc1\ndraft: true\npublishdate: \"2414-05-29\"\n---\n# doc1\n*some content*"), "sect"},
+		{"sect/doc2.md", []byte("---\ntitle: doc2\ndraft: true\npublishdate: \"2012-05-29\"\n---\n# doc2\n*some content*"), "sect"},
+		{"sect/doc3.md", []byte("---\ntitle: doc3\ndraft: false\npublishdate: \"2414-05-29\"\n---\n# doc3\n*some content*"), "sect"},
+		{"sect/doc4.md", []byte("---\ntitle: doc4\ndraft: false\npublishdate: \"2012-05-29\"\n---\n# doc4\n*some content*"), "sect"},
+	}
+
+	siteSetup := func() *Site {
+		s := &Site{
+			Target: target,
+			Source: &source.InMemorySource{ByteSource: sources},
+		}
+
+		s.initializeSiteInfo()
+
+		if err := s.CreatePages(); err != nil {
+			t.Fatalf("Unable to create pages: %s", err)
+		}
+		return s
+	}
+
+	viper.Set("baseurl", "http://auth/bub")
+
+	// Testing Defaults.. Only draft:true and publishDate in the past should be rendered
+	s := siteSetup()
+	if len(s.Pages) != 1 {
+		t.Fatal("Draft or Future dated content published unexpectedly")
+	}
+
+	// only publishDate in the past should be rendered
+	viper.Set("BuildDrafts", true)
+	s = siteSetup()
+	if len(s.Pages) != 2 {
+		t.Fatal("Future Dated Posts published unexpectedly")
+	}
+
+	//  drafts should not be rendered, but all dates should
+	viper.Set("BuildDrafts", false)
+	viper.Set("BuildFuture", true)
+	s = siteSetup()
+	if len(s.Pages) != 2 {
+		t.Fatal("Draft posts published unexpectedly")
+	}
+
+	// all 4 should be included
+	viper.Set("BuildDrafts", true)
+	viper.Set("BuildFuture", true)
+	s = siteSetup()
+	if len(s.Pages) != 4 {
+		t.Fatal("Drafts or Future posts not included as expected")
+	}
+
+	//setting defaults back
+	viper.Set("BuildDrafts", false)
+	viper.Set("BuildFuture", false)
+}
+
 func TestSkipRender(t *testing.T) {
 	files := make(map[string][]byte)
 	target := &target.InMemoryTarget{Files: files}