From 0c6fc00a430d12fcab760e4e4a67bd3fff07fe8f Mon Sep 17 00:00:00 2001 From: jo Date: Thu, 7 Nov 2019 17:28:41 +0100 Subject: [PATCH] Replace build.go/calens with goreleaser --- .gitignore | 1 + .goreleaser.yml | 80 ++++ build.go | 559 ---------------------------- changelog/0.9.7_2018-02-18/issue-53 | 3 - changelog/CHANGELOG-GitHub.tmpl | 31 -- changelog/CHANGELOG.tmpl | 32 -- changelog/TEMPLATE | 12 - changelog/unreleased/issue-44 | 4 - changelog/unreleased/issue-60 | 8 - changelog/unreleased/pull-64 | 8 - 10 files changed, 81 insertions(+), 657 deletions(-) create mode 100644 .goreleaser.yml delete mode 100644 build.go delete mode 100644 changelog/0.9.7_2018-02-18/issue-53 delete mode 100644 changelog/CHANGELOG-GitHub.tmpl delete mode 100644 changelog/CHANGELOG.tmpl delete mode 100644 changelog/TEMPLATE delete mode 100644 changelog/unreleased/issue-44 delete mode 100644 changelog/unreleased/issue-60 delete mode 100644 changelog/unreleased/pull-64 diff --git a/.gitignore b/.gitignore index 0edb3ce..153f863 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /rest-server +/dist/ diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 0000000..0083fee --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,80 @@ +# For more details check the documentation at https://goreleaser.com +before: + hooks: + - go mod tidy + +build: &build + main: ./cmd/rest-server/main.go + flags: + - -tags=release + env: + - CGO_ENABLED=0 + +builds: + - id: build-darwin + <<: *build + goos: [darwin] + goarch: [386, amd64, arm, arm64] + + - id: build-dragonfly + <<: *build + goos: [dragonfly] + goarch: [amd64] + + - id: build-freebsd + <<: *build + goos: [freebsd] + goarch: [386, amd64, arm] + + - id: build-linux + <<: *build + goos: [linux] + goarch: + [386, amd64, arm, arm64, ppc64, ppc64le, mips, mipsle, mips64, mips64le] + + - id: build-netbsd + <<: *build + goos: [netbsd] + goarch: [386, amd64, arm] + + - id: build-openbsd + <<: *build + goos: [openbsd] + goarch: [386, amd64, arm, arm64] + + - id: build-plan9 + <<: *build + goos: [plan9] + goarch: [386, amd64, arm] + + - id: build-solaris + <<: *build + goos: [solaris] + goarch: [amd64] + + - id: build-windows + <<: *build + goos: [windows] + goarch: [386, amd64] + +archives: + - format: tar.gz + format_overrides: + - goos: windows + format: zip + files: + - LICENSE + - README.md + +checksum: + name_template: "sha256sums.txt" + +snapshot: + name_template: "{{.ShortCommit}}" + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" diff --git a/build.go b/build.go deleted file mode 100644 index 026387d..0000000 --- a/build.go +++ /dev/null @@ -1,559 +0,0 @@ -// BSD 2-Clause License -// -// Copyright (c) 2016-2018, Alexander Neumann -// All rights reserved. -// -// This file has been copied from the repository at: -// https://github.com/fd0/build-go -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build ignore_build_go - -package main - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "runtime" - "strconv" - "strings" -) - -// config contains the configuration for the program to build. -var config = Config{ - Name: "rest-server", // name of the program executable and directory - Namespace: "github.com/restic/rest-server", // subdir of GOPATH, e.g. "github.com/foo/bar" - Main: "github.com/restic/rest-server/cmd/rest-server", // package name for the main package - Tests: []string{ // tests to run - "github.com/restic/rest-server", - "github.com/restic/rest-server/cmd/rest-server", - }, - MinVersion: GoVersion{Major: 1, Minor: 7, Patch: 0}, // minimum Go version supported -} - -// Config configures the build. -type Config struct { - Name string - Namespace string - Main string - Tests []string - MinVersion GoVersion -} - -var ( - verbose bool - keepGopath bool - runTests bool - enableCGO bool -) - -// specialDir returns true if the file begins with a special character ('.' or '_'). -func specialDir(name string) bool { - if name == "." { - return false - } - - base := filepath.Base(name) - if base == "vendor" || base[0] == '_' || base[0] == '.' { - return true - } - - return false -} - -// excludePath returns true if the file should not be copied to the new GOPATH. -func excludePath(name string) bool { - ext := path.Ext(name) - if ext == ".go" || ext == ".s" || ext == ".h" { - return false - } - - parentDir := filepath.Base(filepath.Dir(name)) - if parentDir == "testdata" { - return false - } - - return true -} - -// updateGopath builds a valid GOPATH at dst, with all Go files in src/ copied -// to dst/prefix/, so calling -// -// updateGopath("/tmp/gopath", "/home/u/restic", "github.com/restic/restic") -// -// with "/home/u/restic" containing the file "foo.go" yields the following tree -// at "/tmp/gopath": -// -// /tmp/gopath -// └── src -// └── github.com -// └── restic -// └── restic -// └── foo.go -func updateGopath(dst, src, prefix string) error { - verbosePrintf("copy contents of %v to %v\n", src, filepath.Join(dst, prefix)) - return filepath.Walk(src, func(name string, fi os.FileInfo, err error) error { - if name == src { - return err - } - - if specialDir(name) { - if fi.IsDir() { - return filepath.SkipDir - } - - return nil - } - - if err != nil { - return err - } - - if fi.IsDir() { - return nil - } - - if excludePath(name) { - return nil - } - - intermediatePath, err := filepath.Rel(src, name) - if err != nil { - return err - } - - fileSrc := filepath.Join(src, intermediatePath) - fileDst := filepath.Join(dst, "src", prefix, intermediatePath) - - return copyFile(fileDst, fileSrc) - }) -} - -func directoryExists(dirname string) bool { - stat, err := os.Stat(dirname) - if err != nil && os.IsNotExist(err) { - return false - } - - return stat.IsDir() -} - -// copyFile creates dst from src, preserving file attributes and timestamps. -func copyFile(dst, src string) error { - fi, err := os.Stat(src) - if err != nil { - return err - } - - fsrc, err := os.Open(src) - if err != nil { - return err - } - - if err = os.MkdirAll(filepath.Dir(dst), 0755); err != nil { - return err - } - - fdst, err := os.Create(dst) - if err != nil { - return err - } - - if _, err = io.Copy(fdst, fsrc); err != nil { - return err - } - - if err = fsrc.Close(); err != nil { - return err - } - - if err = fdst.Close(); err != nil { - return err - } - - if err = os.Chmod(dst, fi.Mode()); err != nil { - return err - } - - return os.Chtimes(dst, fi.ModTime(), fi.ModTime()) -} - -// die prints the message with fmt.Fprintf() to stderr and exits with an error -// code. -func die(message string, args ...interface{}) { - fmt.Fprintf(os.Stderr, message, args...) - os.Exit(1) -} - -func showUsage(output io.Writer) { - fmt.Fprintf(output, "USAGE: go run build.go OPTIONS\n") - fmt.Fprintf(output, "\n") - fmt.Fprintf(output, "OPTIONS:\n") - fmt.Fprintf(output, " -v --verbose output more messages\n") - fmt.Fprintf(output, " -t --tags specify additional build tags\n") - fmt.Fprintf(output, " -k --keep-gopath do not remove the GOPATH after build\n") - fmt.Fprintf(output, " -T --test run tests\n") - fmt.Fprintf(output, " -o --output set output file name\n") - fmt.Fprintf(output, " --enable-cgo use CGO to link against libc\n") - fmt.Fprintf(output, " --goos value set GOOS for cross-compilation\n") - fmt.Fprintf(output, " --goarch value set GOARCH for cross-compilation\n") -} - -func verbosePrintf(message string, args ...interface{}) { - if !verbose { - return - } - - fmt.Printf("build: "+message, args...) -} - -// cleanEnv returns a clean environment with GOPATH and GOBIN removed (if -// present). -func cleanEnv() (env []string) { - for _, v := range os.Environ() { - if strings.HasPrefix(v, "GOPATH=") || strings.HasPrefix(v, "GOBIN=") { - continue - } - - env = append(env, v) - } - - return env -} - -// build runs "go build args..." with GOPATH set to gopath. -func build(cwd, goos, goarch, gopath string, args ...string) error { - a := []string{"build"} - a = append(a, "-asmflags", fmt.Sprintf("-trimpath=%s", gopath)) - a = append(a, "-gcflags", fmt.Sprintf("-trimpath=%s", gopath)) - a = append(a, args...) - cmd := exec.Command("go", a...) - cmd.Env = append(cleanEnv(), "GOPATH="+gopath, "GOARCH="+goarch, "GOOS="+goos) - if !enableCGO { - cmd.Env = append(cmd.Env, "CGO_ENABLED=0") - } - - cmd.Dir = cwd - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - verbosePrintf("go %s\n", args) - - return cmd.Run() -} - -// test runs "go test args..." with GOPATH set to gopath. -func test(cwd, gopath string, args ...string) error { - args = append([]string{"test"}, args...) - cmd := exec.Command("go", args...) - cmd.Env = append(cleanEnv(), "GOPATH="+gopath) - cmd.Dir = cwd - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - verbosePrintf("go %s\n", args) - - return cmd.Run() -} - -// getVersion returns the version string from the file VERSION in the current -// directory. -func getVersionFromFile() string { - buf, err := ioutil.ReadFile("VERSION") - if err != nil { - verbosePrintf("error reading file VERSION: %v\n", err) - return "" - } - - return strings.TrimSpace(string(buf)) -} - -// getVersion returns a version string which is a combination of the contents -// of the file VERSION in the current directory and the version from git (if -// available). -func getVersion() string { - versionFile := getVersionFromFile() - versionGit := getVersionFromGit() - - verbosePrintf("version from file 'VERSION' is %q, version from git %q\n", - versionFile, versionGit) - - switch { - case versionFile == "": - return versionGit - case versionGit == "": - return versionFile - } - - return fmt.Sprintf("%s (%s)", versionFile, versionGit) -} - -// getVersionFromGit returns a version string that identifies the currently -// checked out git commit. -func getVersionFromGit() string { - cmd := exec.Command("git", "describe", - "--long", "--tags", "--dirty", "--always") - out, err := cmd.Output() - if err != nil { - verbosePrintf("git describe returned error: %v\n", err) - return "" - } - - version := strings.TrimSpace(string(out)) - verbosePrintf("git version is %s\n", version) - return version -} - -// Constants represents a set of constants that are set in the final binary to -// the given value via compiler flags. -type Constants map[string]string - -// LDFlags returns the string that can be passed to go build's `-ldflags`. -func (cs Constants) LDFlags() string { - l := make([]string, 0, len(cs)) - - for k, v := range cs { - l = append(l, fmt.Sprintf(`-X "%s=%s"`, k, v)) - } - - return strings.Join(l, " ") -} - -// GoVersion is the version of Go used to compile the project. -type GoVersion struct { - Major int - Minor int - Patch int -} - -// ParseGoVersion parses the Go version s. If s cannot be parsed, the returned GoVersion is null. -func ParseGoVersion(s string) (v GoVersion) { - if !strings.HasPrefix(s, "go") { - return - } - - s = s[2:] - data := strings.Split(s, ".") - if len(data) != 3 { - return - } - - major, err := strconv.Atoi(data[0]) - if err != nil { - return - } - - minor, err := strconv.Atoi(data[1]) - if err != nil { - return - } - - patch, err := strconv.Atoi(data[2]) - if err != nil { - return - } - - v = GoVersion{ - Major: major, - Minor: minor, - Patch: patch, - } - return -} - -// AtLeast returns true if v is at least as new as other. If v is empty, true is returned. -func (v GoVersion) AtLeast(other GoVersion) bool { - var empty GoVersion - - // the empty version satisfies all versions - if v == empty { - return true - } - - if v.Major < other.Major { - return false - } - - if v.Minor < other.Minor { - return false - } - - if v.Patch < other.Patch { - return false - } - - return true -} - -func (v GoVersion) String() string { - return fmt.Sprintf("Go %d.%d.%d", v.Major, v.Minor, v.Patch) -} - -func main() { - ver := ParseGoVersion(runtime.Version()) - if !ver.AtLeast(config.MinVersion) { - fmt.Fprintf(os.Stderr, "%s detected, this program requires at least %s\n", ver, config.MinVersion) - os.Exit(1) - } - - buildTags := []string{} - - skipNext := false - params := os.Args[1:] - - targetGOOS := runtime.GOOS - targetGOARCH := runtime.GOARCH - - var outputFilename string - - for i, arg := range params { - if skipNext { - skipNext = false - continue - } - - switch arg { - case "-v", "--verbose": - verbose = true - case "-k", "--keep-gopath": - keepGopath = true - case "-t", "-tags", "--tags": - if i+1 >= len(params) { - die("-t given but no tag specified") - } - skipNext = true - buildTags = strings.Split(params[i+1], " ") - case "-o", "--output": - skipNext = true - outputFilename = params[i+1] - case "-T", "--test": - runTests = true - case "--enable-cgo": - enableCGO = true - case "--goos": - skipNext = true - targetGOOS = params[i+1] - case "--goarch": - skipNext = true - targetGOARCH = params[i+1] - case "-h": - showUsage(os.Stdout) - return - default: - fmt.Fprintf(os.Stderr, "Error: unknown option %q\n\n", arg) - showUsage(os.Stderr) - os.Exit(1) - } - } - - if len(buildTags) == 0 { - verbosePrintf("adding build-tag release\n") - buildTags = []string{"release"} - } - - for i := range buildTags { - buildTags[i] = strings.TrimSpace(buildTags[i]) - } - - verbosePrintf("build tags: %s\n", buildTags) - - root, err := os.Getwd() - if err != nil { - die("Getwd(): %v\n", err) - } - - gopath, err := ioutil.TempDir("", fmt.Sprintf("%v-build-", config.Name)) - if err != nil { - die("TempDir(): %v\n", err) - } - - verbosePrintf("create GOPATH at %v\n", gopath) - if err = updateGopath(gopath, root, config.Namespace); err != nil { - die("copying files from %v/src to %v/src failed: %v\n", root, gopath, err) - } - - vendor := filepath.Join(root, "vendor") - if directoryExists(vendor) { - if err = updateGopath(gopath, vendor, filepath.Join(config.Namespace, "vendor")); err != nil { - die("copying files from %v to %v failed: %v\n", root, gopath, err) - } - } - - defer func() { - if !keepGopath { - verbosePrintf("remove %v\n", gopath) - if err = os.RemoveAll(gopath); err != nil { - die("remove GOPATH at %s failed: %v\n", err) - } - } else { - verbosePrintf("leaving temporary GOPATH at %v\n", gopath) - } - }() - - if outputFilename == "" { - outputFilename = config.Name - if targetGOOS == "windows" { - outputFilename += ".exe" - } - } - - cwd, err := os.Getwd() - if err != nil { - die("Getwd() returned %v\n", err) - } - output := outputFilename - if !filepath.IsAbs(output) { - output = filepath.Join(cwd, output) - } - - version := getVersion() - constants := Constants{} - if version != "" { - constants["main.version"] = version - } - ldflags := "-s -w " + constants.LDFlags() - verbosePrintf("ldflags: %s\n", ldflags) - - args := []string{ - "-tags", strings.Join(buildTags, " "), - "-ldflags", ldflags, - "-o", output, config.Main, - } - - err = build(filepath.Join(gopath, "src"), targetGOOS, targetGOARCH, gopath, args...) - if err != nil { - die("build failed: %v\n", err) - } - - if runTests { - verbosePrintf("running tests\n") - - err = test(cwd, gopath, config.Tests...) - if err != nil { - die("running tests failed: %v\n", err) - } - } -} diff --git a/changelog/0.9.7_2018-02-18/issue-53 b/changelog/0.9.7_2018-02-18/issue-53 deleted file mode 100644 index 95fa5b4..0000000 --- a/changelog/0.9.7_2018-02-18/issue-53 +++ /dev/null @@ -1,3 +0,0 @@ -Enhancement: Rename --cpuprofile to --cpu-profile - -https://github.com/restic/rest-server/issues/53 diff --git a/changelog/CHANGELOG-GitHub.tmpl b/changelog/CHANGELOG-GitHub.tmpl deleted file mode 100644 index 0ba9fe0..0000000 --- a/changelog/CHANGELOG-GitHub.tmpl +++ /dev/null @@ -1,31 +0,0 @@ -{{- range $changes := . }}{{ with $changes -}} -Changelog for rest-server {{ .Version }} ({{ .Date }}) -========================================= - -The following sections list the changes in rest-server {{ .Version }} relevant to users. The changes are ordered by importance. - -Summary -------- -{{ range $entry := .Entries }}{{ with $entry }} - * {{ .TypeShort }} [#{{ .PrimaryID }}]({{ .PrimaryURL }}): {{ .Title }} -{{- end }}{{ end }} - -Details -------- -{{ range $entry := .Entries }}{{ with $entry }} - * {{ .Type }} #{{ .PrimaryID }}: {{ .Title }} -{{ range $par := .Paragraphs }} - {{ $par }} -{{ end }} - {{ range $id := .Issues -}} -{{ ` ` }}[#{{ $id }}](https://github.com/restic/rest-server/issues/{{ $id -}}) -{{- end -}} -{{ range $id := .PRs -}} -{{ ` ` }}[#{{ $id }}](https://github.com/restic/rest-server/pull/{{ $id -}}) -{{- end -}} -{{ ` ` }}{{ range $url := .OtherURLs -}} -{{ $url -}} -{{- end }} -{{ end }}{{ end }} - -{{ end }}{{ end -}} diff --git a/changelog/CHANGELOG.tmpl b/changelog/CHANGELOG.tmpl deleted file mode 100644 index 3251123..0000000 --- a/changelog/CHANGELOG.tmpl +++ /dev/null @@ -1,32 +0,0 @@ -{{- range $changes := . }}{{ with $changes -}} -Changelog for rest-server {{ .Version }} ({{ .Date }}) -============================================ - -The following sections list the changes in rest-server {{ .Version }} relevant -to users. The changes are ordered by importance. - -Summary -------- -{{ range $entry := .Entries }}{{ with $entry }} - * {{ .TypeShort }} #{{ .PrimaryID }}: {{ .Title }} -{{- end }}{{ end }} - -Details -------- -{{ range $entry := .Entries }}{{ with $entry }} - * {{ .Type }} #{{ .PrimaryID }}: {{ .Title }} -{{ range $par := .Paragraphs }} - {{ wrap $par 80 3 }} -{{ end -}} -{{ range $id := .Issues }} - https://github.com/restic/restic/issues/{{ $id -}} -{{ end -}} -{{ range $id := .PRs }} - https://github.com/restic/restic/pull/{{ $id -}} -{{ end -}} -{{ range $url := .OtherURLs }} - {{ $url -}} -{{ end }} -{{ end }}{{ end }} - -{{ end }}{{ end -}} diff --git a/changelog/TEMPLATE b/changelog/TEMPLATE deleted file mode 100644 index 8b3beb0..0000000 --- a/changelog/TEMPLATE +++ /dev/null @@ -1,12 +0,0 @@ -Bugfix: Fix behavior for foobar (in present tense) - -We've fixed the behavior for foobar, a long-standing annoyance for rest-server -users. - -The text in the paragraphs is written in past tense. The last section is a list -of issue URLs, PR URLs and other URLs. The first issue ID (or the first PR ID, -in case there aren't any issue links) is used as the primary ID. - -https://github.com/restic/restic/issues/1234 -https://github.com/restic/restic/pull/55555 -https://forum.restic/.net/foo/bar/baz diff --git a/changelog/unreleased/issue-44 b/changelog/unreleased/issue-44 deleted file mode 100644 index 1f50b25..0000000 --- a/changelog/unreleased/issue-44 +++ /dev/null @@ -1,4 +0,0 @@ -Enhancement: Add changelog file - -https://github.com/restic/rest-server/issues/44 -https://github.com/restic/rest-server/pull/62 diff --git a/changelog/unreleased/issue-60 b/changelog/unreleased/issue-60 deleted file mode 100644 index 846db57..0000000 --- a/changelog/unreleased/issue-60 +++ /dev/null @@ -1,8 +0,0 @@ -Security: Require auth by default, add --no-auth flag - -In order to prevent users from accidentally exposing rest-server without -authentication, rest-server now defaults to requiring a .htpasswd. If you want -to disable authentication, you need to explicitly pass the new --no-auth flag. - -https://github.com/restic/rest-server/issues/60 -https://github.com/restic/rest-server/pull/61 diff --git a/changelog/unreleased/pull-64 b/changelog/unreleased/pull-64 deleted file mode 100644 index c5f9cd0..0000000 --- a/changelog/unreleased/pull-64 +++ /dev/null @@ -1,8 +0,0 @@ -Security: Refuse overwriting config file in append-only mode - -While working on the `rclone serve restic` command we noticed that is currently -possible to overwrite the config file in a repo even if `--append-only` is -specified. The first commit adds proper tests, and the second commit fixes the -issue. - -https://github.com/restic/rest-server/pull/64