123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- package main
-
- import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "os"
- "time"
-
- "config"
-
- gogit "gopkg.in/src-d/go-git.v4"
- "gopkg.in/src-d/go-git.v4/plumbing/object"
- )
-
- // getDashboardsVersions reads the "versions.json" file at the root of the git
- // repository and returns its content as a map.
- // If the file doesn't exist, returns an empty map.
- // Return an error if there was an issue looking for the file (except when the
- // file doesn't exist), reading it or formatting its content into a map.
- func getDashboardsVersions(clonePath string) (versions map[string]int, err error) {
- versions = make(map[string]int)
-
- filename := clonePath + "/versions.json"
-
- _, err = os.Stat(filename)
- if os.IsNotExist(err) {
- return versions, nil
- }
-
- data, err := ioutil.ReadFile(filename)
- if err != nil {
- return
- }
-
- err = json.Unmarshal(data, &versions)
- return
- }
-
- // writeVersions updates or creates the "versions.json" file at the root of the
- // git repository. It takes as parameter a map of versions computed by
- // getDashboardsVersions and a map linking a dashboard slug to an instance of
- // diffVersion instance, and uses them both to compute an updated map of
- // versions that it will convert to JSON, indent and write down into the
- // "versions.json" file.
- // Returns an error if there was an issue when conerting to JSON, indenting or
- // writing on disk.
- func writeVersions(
- versions map[string]int, dv map[string]diffVersion, clonePath string,
- ) (err error) {
- for slug, diff := range dv {
- versions[slug] = diff.newVersion
- }
-
- rawJSON, err := json.Marshal(versions)
- if err != nil {
- return
- }
-
- indentedJSON, err := indent(rawJSON)
- if err != nil {
- return
- }
-
- filename := clonePath + "/versions.json"
- return rewriteFile(filename, indentedJSON)
- }
-
- // commitNewVersions creates a git commit from updated dashboard files (that
- // have previously been added to the git index) and an updated "versions.json"
- // file that it creates (with writeVersions) and add to the index.
- // Returns an error if there was an issue when creating the "versions.json"
- // file, adding it to the index or creating the commit.
- func commitNewVersions(
- versions map[string]int, dv map[string]diffVersion, worktree *gogit.Worktree,
- cfg *config.Config,
- ) (err error) {
- if err = writeVersions(versions, dv, cfg.Git.ClonePath); err != nil {
- return err
- }
-
- if _, err = worktree.Add("versions.json"); err != nil {
- return err
- }
-
- _, err = worktree.Commit(getCommitMessage(dv), &gogit.CommitOptions{
- Author: &object.Signature{
- Name: cfg.Git.CommitsAuthor.Name,
- Email: cfg.Git.CommitsAuthor.Email,
- When: time.Now(),
- },
- })
-
- return
- }
-
- // getCommitMessage creates a commit message that summarises the version updates
- // included in the commit.
- func getCommitMessage(dv map[string]diffVersion) string {
- message := "Updated dashboards\n"
-
- for slug, diff := range dv {
- message += fmt.Sprintf(
- "%s: %d => %d\n", slug, diff.oldVersion, diff.newVersion,
- )
- }
-
- return message
- }
|