Skip to content

Commit

Permalink
Drop dashes in http header matcher attributes; other changes from cod…
Browse files Browse the repository at this point in the history
…e review
  • Loading branch information
vangent authored and bep committed May 31, 2019
1 parent 1384d77 commit b0f536f
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 50 deletions.
2 changes: 1 addition & 1 deletion commands/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions deploy/deployConfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -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".
Expand Down
89 changes: 54 additions & 35 deletions deploy/deployConfig_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
package deploy

import (
"fmt"
"testing"

"github.com/gohugoio/hugo/config"
Expand All @@ -32,64 +33,82 @@ someOtherValue = "foo"
order = ["o1", "o2"]
# All lowercase.
[[deployment.targets]]
Name = "name1"
name = "name0"
url = "url0"
cloudfrontdistributionid = "cdn0"
# All uppercase.
[[deployment.targets]]
NAME = "name1"
URL = "url1"
CloudFrontDistributionID = "cdn1"
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)

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)

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)
// 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)
}

// 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) {
Expand Down
23 changes: 12 additions & 11 deletions docs/content/en/hosting-and-deployment/hugo-deploy.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,20 +58,20 @@ 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.
# URL = "azblob://$web" # For Azure Storage; see https://gocloud.dev/howto/blob/open-bucket/#azure.
# 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 ...
Expand All @@ -82,29 +82,30 @@ 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
```

## Deploy

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.

Expand Down

0 comments on commit b0f536f

Please sign in to comment.