Drop dashes in http header matcher attributes; other changes from code review

This commit is contained in:
Robert van Gent 2019-05-31 09:55:48 -07:00 committed by Bjørn Erik Pedersen
parent 1384d77a04
commit b0f536fb27
4 changed files with 70 additions and 50 deletions

View file

@ -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

View file

@ -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".

View file

@ -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) {

View file

@ -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://<Bucket Name>" # For GCS; see https://gocloud.dev/howto/blob/open-bucket/#gcs.
# URL = "s3://<Bucket Name>?region=<AWS 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://<Bucket Name>?prefix=a/subfolder/"
# If you are using a CloudFront CDN, deploy will invalidate the cache as needed.
CloudFrontDistributionID = <ID>
cloudFrontDistributionID = <ID>
# ... add more [[deployment.targets]] sections ...
@ -82,17 +82,17 @@ CloudFrontDistributionID = <ID>
[[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=<target>
hugo deploy --target=<target name>
```
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.