ref: c502f078bc964a683f05fb4e877b3a1b50894837
parent: 4ebaec890614b8b2f53e2a984aed48b3ac31938e
	author: spf13 <steve.francia@gmail.com>
	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}--
⑨