diff --git a/commands/deploy.go b/commands/deploy.go index 6f8eac35..65cd9240 100644 --- a/commands/deploy.go +++ b/commands/deploy.go @@ -68,7 +68,7 @@ func newDeployCmd() *deployCmd { cc.cmd.Flags().Bool("confirm", false, "ask for confirmation before making changes to the target") cc.cmd.Flags().Bool("dryRun", false, "dry run") cc.cmd.Flags().Bool("force", false, "force upload of all files") - cc.cmd.Flags().Bool("invalidateCDN", true, "invalidate the CDN cache via the CloudFrontDistributionID listed in the deployment target") + cc.cmd.Flags().Bool("invalidateCDN", true, "invalidate the CDN cache via the cloudFrontDistributionID listed in the deployment target") cc.cmd.Flags().Int("maxDeletes", 256, "maximum # of files to delete, or -1 to disable") return cc diff --git a/deploy/deployConfig.go b/deploy/deployConfig.go index b4fa325b..0ea675b8 100644 --- a/deploy/deployConfig.go +++ b/deploy/deployConfig.go @@ -48,15 +48,15 @@ type matcher struct { // CacheControl specifies caching attributes to use when serving the blob. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control - CacheControl string `mapstructure:"Cache-Control"` + CacheControl string // ContentEncoding specifies the encoding used for the blob's content, if any. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding - ContentEncoding string `mapstructure:"Content-Encoding"` + ContentEncoding string // ContentType specifies the MIME type of the blob being written. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type - ContentType string `mapstructure:"Content-Type"` + ContentType string // Gzip determines whether the file should be gzipped before upload. // If so, the ContentEncoding field will automatically be set to "gzip". diff --git a/deploy/deployConfig_test.go b/deploy/deployConfig_test.go index 3f849d89..47e9e1e4 100644 --- a/deploy/deployConfig_test.go +++ b/deploy/deployConfig_test.go @@ -14,6 +14,7 @@ package deploy import ( + "fmt" "testing" "github.com/gohugoio/hugo/config" @@ -32,29 +33,48 @@ someOtherValue = "foo" order = ["o1", "o2"] +# All lowercase. [[deployment.targets]] -Name = "name1" -URL = "url1" -CloudFrontDistributionID = "cdn1" +name = "name0" +url = "url0" +cloudfrontdistributionid = "cdn0" +# All uppercase. +[[deployment.targets]] +NAME = "name1" +URL = "url1" +CLOUDFRONTDISTRIBUTIONID = "cdn1" + +# Camelcase. [[deployment.targets]] name = "name2" url = "url2" -cloudfrontdistributionid = "cdn2" +cloudFrontDistributionID = "cdn2" +# All lowercase. [[deployment.matchers]] -Pattern = "^pattern1$" -Cache-Control = "cachecontrol1" -Content-Encoding = "contentencoding1" -Content-Type = "contenttype1" -Gzip = true -Force = true +pattern = "^pattern0$" +cachecontrol = "cachecontrol0" +contentencoding = "contentencoding0" +contenttype = "contenttype0" +# All uppercase. +[[deployment.matchers]] +PATTERN = "^pattern1$" +CACHECONTROL = "cachecontrol1" +CONTENTENCODING = "contentencoding1" +CONTENTTYPE = "contenttype1" +GZIP = true +FORCE = true + +# Camelcase. [[deployment.matchers]] pattern = "^pattern2$" -cache-control = "cachecontrol2" -content-encoding = "contentencoding2" -content-type = "contenttype2" +cacheControl = "cachecontrol2" +contentEncoding = "contentencoding2" +contentType = "contenttype2" +gzip = true +force = true ` cfg, err := config.FromConfigString(tomlConfig, "toml") assert.NoError(err) @@ -62,34 +82,33 @@ content-type = "contenttype2" dcfg, err := decodeConfig(cfg) assert.NoError(err) + // Order. assert.Equal(2, len(dcfg.Order)) assert.Equal("o1", dcfg.Order[0]) assert.Equal("o2", dcfg.Order[1]) assert.Equal(2, len(dcfg.ordering)) - assert.Equal(2, len(dcfg.Targets)) - assert.Equal("name1", dcfg.Targets[0].Name) - assert.Equal("url1", dcfg.Targets[0].URL) - assert.Equal("cdn1", dcfg.Targets[0].CloudFrontDistributionID) - assert.Equal("name2", dcfg.Targets[1].Name) - assert.Equal("url2", dcfg.Targets[1].URL) - assert.Equal("cdn2", dcfg.Targets[1].CloudFrontDistributionID) + // Targets. + assert.Equal(3, len(dcfg.Targets)) + for i := 0; i < 3; i++ { + tgt := dcfg.Targets[i] + assert.Equal(fmt.Sprintf("name%d", i), tgt.Name) + assert.Equal(fmt.Sprintf("url%d", i), tgt.URL) + assert.Equal(fmt.Sprintf("cdn%d", i), tgt.CloudFrontDistributionID) + } - assert.Equal(2, len(dcfg.Matchers)) - assert.Equal("^pattern1$", dcfg.Matchers[0].Pattern) - assert.NotNil(dcfg.Matchers[0].re) - assert.Equal("cachecontrol1", dcfg.Matchers[0].CacheControl) - assert.Equal("contentencoding1", dcfg.Matchers[0].ContentEncoding) - assert.Equal("contenttype1", dcfg.Matchers[0].ContentType) - assert.True(dcfg.Matchers[0].Gzip) - assert.True(dcfg.Matchers[0].Force) - assert.Equal("^pattern2$", dcfg.Matchers[1].Pattern) - assert.NotNil(dcfg.Matchers[1].re) - assert.Equal("cachecontrol2", dcfg.Matchers[1].CacheControl) - assert.Equal("contentencoding2", dcfg.Matchers[1].ContentEncoding) - assert.Equal("contenttype2", dcfg.Matchers[1].ContentType) - assert.False(dcfg.Matchers[1].Gzip) - assert.False(dcfg.Matchers[1].Force) + // Matchers. + assert.Equal(3, len(dcfg.Matchers)) + for i := 0; i < 3; i++ { + m := dcfg.Matchers[i] + assert.Equal(fmt.Sprintf("^pattern%d$", i), m.Pattern) + assert.NotNil(m.re) + assert.Equal(fmt.Sprintf("cachecontrol%d", i), m.CacheControl) + assert.Equal(fmt.Sprintf("contentencoding%d", i), m.ContentEncoding) + assert.Equal(fmt.Sprintf("contenttype%d", i), m.ContentType) + assert.Equal(i != 0, m.Gzip) + assert.Equal(i != 0, m.Force) + } } func TestInvalidOrderingPattern(t *testing.T) { diff --git a/docs/content/en/hosting-and-deployment/hugo-deploy.md b/docs/content/en/hosting-and-deployment/hugo-deploy.md index 07234164..fa578a60 100644 --- a/docs/content/en/hosting-and-deployment/hugo-deploy.md +++ b/docs/content/en/hosting-and-deployment/hugo-deploy.md @@ -58,12 +58,12 @@ a detailed example: # By default, files are uploaded in an arbitrary order. # Files that match the regular expressions in the "Order" list # will be uploaded first, in the listed order. -Order = [".jpg$", ".gif$"] +order = [".jpg$", ".gif$"] [[deployment.targets]] # An arbitrary name for this target. -Name = "mydeployment" +name = "mydeployment" # The Go Cloud Development Kit URL to deploy to. Examples: # URL = "gs://" # For GCS; see https://gocloud.dev/howto/blob/open-bucket/#gcs. # URL = "s3://?region=" # For S3; see https://gocloud.dev/howto/blob/open-bucket/#s3. @@ -71,7 +71,7 @@ Name = "mydeployment" # You can use a "prefix=" query parameter to target a subfolder of the bucket: # URL = "gs://?prefix=a/subfolder/" # If you are using a CloudFront CDN, deploy will invalidate the cache as needed. -CloudFrontDistributionID = +cloudFrontDistributionID = # ... add more [[deployment.targets]] sections ... @@ -82,17 +82,17 @@ CloudFrontDistributionID = [[deployment.matchers]] # Cache static assets for 20 years. -Pattern = "^.+\\.(js|css|svg|ttf)$" -Cache-Control = "max-age=630720000, no-transform, public" +pattern = "^.+\\.(js|css|svg|ttf)$" +cacheControl = "max-age=630720000, no-transform, public" gzip = true [[deployment.matchers]] -Pattern = "^.+\\.(png|jpg)$" -Cache-Control = "max-age=630720000, no-transform, public" +pattern = "^.+\\.(png|jpg)$" +cacheControl = "max-age=630720000, no-transform, public" gzip = false [[deployment.matchers]] -Pattern = "^.+\\.(html|xml|json)$" +pattern = "^.+\\.(html|xml|json)$" gzip = true ``` @@ -100,11 +100,12 @@ gzip = true To deploy to a target: ``` -hugo deploy --target= +hugo deploy --target= ``` -Hugo will identify any local changes that need to be uploaded, and ask for -confirmation before doing anything. +Hugo will identify and apply any local changes that need to be reflected to the +remote target. You can use `--dryRun` to see the changes without applying them, +or `--confirm` to be prompted before making changes. See `hugo help deploy` for more command-line options.