[mirror] Command-line application for uploading a site to a git-pages server

Expose version via `--version` and `User-Agent:`.

The version is sent via `User-Agent:` because it may be useful at
some point to work around bugs server-side (or prompt the user to
update). If undesired, build with `-buildvcs=false`.

Packagers building without a full git checkout should override version
in the `version.go` file.

Changed files
+28 -1
+22 -1
main.go
··· 10 10 "net/http" 11 11 "net/url" 12 12 "os" 13 + "runtime/debug" 13 14 14 15 "github.com/google/uuid" 15 16 "github.com/klauspost/compress/zstd" ··· 25 26 var debugManifestFlag = pflag.Bool("debug-manifest", false, "retrieve site manifest as ProtoJSON, for debugging") 26 27 var serverFlag = pflag.String("server", "", "hostname of server to connect to") 27 28 var verboseFlag = pflag.Bool("verbose", false, "display more information for debugging") 29 + var versionFlag = pflag.Bool("version", false, "display version information") 28 30 29 31 func singleOperation() bool { 30 32 operations := 0 ··· 46 48 if *debugManifestFlag { 47 49 operations++ 48 50 } 51 + if *versionFlag { 52 + operations++ 53 + } 49 54 return operations == 1 50 55 } 51 56 57 + func versionInfo() string { 58 + version := "(unknown)" 59 + if versionOverride != "" { 60 + version = versionOverride 61 + } else if buildInfo, ok := debug.ReadBuildInfo(); ok { 62 + version = buildInfo.Main.Version 63 + } 64 + return fmt.Sprintf("git-pages-cli %s", version) 65 + } 66 + 52 67 func displayFS(root fs.FS) error { 53 68 return fs.WalkDir(root, ".", func(name string, entry fs.DirEntry, err error) error { 54 69 if err != nil { ··· 90 105 91 106 func main() { 92 107 pflag.Parse() 93 - if !singleOperation() || len(pflag.Args()) != 1 { 108 + if !singleOperation() || (!*versionFlag && len(pflag.Args()) != 1) { 94 109 fmt.Fprintf(os.Stderr, 95 110 "Usage: %s <site-url> [--challenge|--upload-git url|--upload-dir path|--delete]\n", 96 111 os.Args[0], 97 112 ) 98 113 os.Exit(125) 114 + } 115 + 116 + if *versionFlag { 117 + fmt.Fprintln(os.Stdout, versionInfo()) 118 + os.Exit(0) 99 119 } 100 120 101 121 var err error ··· 182 202 default: 183 203 panic("no operation chosen") 184 204 } 205 + request.Header.Add("User-Agent", versionInfo()) 185 206 if *passwordFlag != "" { 186 207 request.Header.Add("Authorization", fmt.Sprintf("Pages %s", *passwordFlag)) 187 208 }
+6
version.go
··· 1 + // By default the version information is retrieved from VCS. 2 + // If not available during build, override it here: 3 + 4 + package main 5 + 6 + const versionOverride = "" // set to e.g. "v1.2.3" as appropriate