From 00b0b14fc27d5456aa337aec55d58d2786e6522e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Fr=C3=B6ssman?= Date: Thu, 11 Feb 2016 15:07:22 +0100 Subject: [PATCH] Add file_exists option: overwrite/skip/fail Closes #9 --- DOCS.md | 1 + main.go | 46 +++++++++++++++++++++++++++++++++++++++++----- types.go | 13 +++++++------ 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/DOCS.md b/DOCS.md index a934242..4259020 100644 --- a/DOCS.md +++ b/DOCS.md @@ -3,6 +3,7 @@ can override the default configuration with the following parameters: * `api_key` - GitHub oauth token with public_repo or repo permission * `files` - Files to upload to GitHub Release, globs are allowed +* `file_exists` - What to do if an file asset already exists, supported values: **overwrite** (default), **skip** and **fail** * `checksum` - Checksum takes hash methods to include in your GitHub release for the files specified. Supported hash methods include md5, sha1, sha256, sha512, adler32, and crc32. * `draft` - create a draft release if set to true * `base_url` - GitHub base URL, only required for GHE diff --git a/main.go b/main.go index 00bd080..f7f1336 100644 --- a/main.go +++ b/main.go @@ -37,6 +37,13 @@ func main() { os.Exit(0) } + if vargs.FileExists == "" { + vargs.FileExists = "overwrite" + } + if !fileExistsValues[vargs.FileExists] { + fmt.Printf("invalid value for file_exists: use [empty], overwrite, skip or fail") + } + if vargs.BaseURL == "" { vargs.BaseURL = "https://api.github.com/" } else if !strings.HasSuffix(vargs.BaseURL, "/") { @@ -104,6 +111,7 @@ func main() { Repo: repo.Name, Tag: filepath.Base(build.Ref), Draft: vargs.Draft, + FileExists: vargs.FileExists, } release, err := rc.buildRelease() @@ -118,13 +126,20 @@ func main() { } } +var fileExistsValues = map[string]bool{ + "overwrite": true, + "fail": true, + "skip": true, +} + // Release holds ties the drone env data and github client together. type releaseClient struct { *github.Client - Owner string - Repo string - Tag string - Draft bool + Owner string + Repo string + Tag string + Draft bool + FileExists string } func (rc *releaseClient) buildRelease() (*github.RepositoryRelease, error) { @@ -159,7 +174,7 @@ func (rc *releaseClient) getRelease() (*github.RepositoryRelease, error) { func (rc *releaseClient) newRelease() (*github.RepositoryRelease, error) { rr := &github.RepositoryRelease{ TagName: github.String(rc.Tag), - Draft: &rc.Draft, + Draft: &rc.Draft, } release, _, err := rc.Client.Repositories.CreateRelease(rc.Owner, rc.Repo, rr) if err != nil { @@ -176,7 +191,28 @@ func (rc *releaseClient) uploadFiles(id int, files []string) error { return fmt.Errorf("Failed to fetch existing assets: %s", err) } + var uploadFiles []string +files: for _, file := range files { + for _, asset := range assets { + if *asset.Name == path.Base(file) { + switch rc.FileExists { + case "overwrite": + // do nothing + case "fail": + return fmt.Errorf("Asset file %s already exists", path.Base(file)) + case "skip": + fmt.Printf("Skipping pre-existing %s artifact\n", *asset.Name) + continue files + default: + return fmt.Errorf("Internal error, unkown file_exist value %s", rc.FileExists) + } + } + } + uploadFiles = append(uploadFiles, file) + } + + for _, file := range uploadFiles { handle, err := os.Open(file) if err != nil { return fmt.Errorf("Failed to read %s artifact: %s", file, err) diff --git a/types.go b/types.go index c77e566..8deee02 100644 --- a/types.go +++ b/types.go @@ -4,10 +4,11 @@ import "github.com/drone/drone-go/drone" // Params are the parameters that the GitHub Release plugin can parse. type Params struct { - BaseURL string `json:"base_url"` - UploadURL string `json:"upload_url"` - APIKey string `json:"api_key"` - Files drone.StringSlice `json:"files"` - Checksum drone.StringSlice `json:"checksum"` - Draft bool `json:"draft"` + BaseURL string `json:"base_url"` + UploadURL string `json:"upload_url"` + APIKey string `json:"api_key"` + Files drone.StringSlice `json:"files"` + Checksum drone.StringSlice `json:"checksum"` + Draft bool `json:"draft"` + FileExists string `json:"file_exists"` }