func Store(m *Merge) (string, error) { data, err := json.Marshal(m) if err != nil { return "", err } gist := Gist{ Description: "a bit o' spruce, from http://play.spruce.cf", Public: true, Files: map[string]GistFile{ "spruce.json": GistFile{Content: string(data)}, }, } encoded, err := json.Marshal(gist) if err != nil { return "", err } body := strings.NewReader(string(encoded)) c := client.New() resp, err := c.Post("https://api.github.com/gists", "application/json", body) log.Printf("got a response: %v", resp) if err != nil { return "", err } if resp.StatusCode != 201 { return "", fmt.Errorf("failed to create gist: API returned %s", resp.Status) } created, err := parseGist(resp) if err != nil { return "", err } return created.ID, nil }
func Retrieve(key string) (*Merge, error) { c := client.New() resp, err := c.Get(fmt.Sprintf("https://api.github.com/gists/%s", key)) if err != nil { return nil, err } if resp.StatusCode != 200 { return nil, fmt.Errorf("not found") } gist, err := parseGist(resp) if err != nil { return nil, err } f, ok := gist.Files["spruce.json"] if !ok { return nil, err } var m Merge err = json.Unmarshal([]byte(f.Content), &m) if err != nil { return nil, err } return &m, nil }
func Releases(owner, repo string) ([]string, error) { c := client.New() r, err := c.Get(fmt.Sprintf("https://api.github.com/repos/%s/%s/tags", owner, repo)) if err != nil { return nil, err } if r.StatusCode != 200 { return nil, fmt.Errorf("API %s", r.Status) } b, err := ioutil.ReadAll(r.Body) if err != nil { return nil, err } var data []struct{ Name string } err = json.Unmarshal(b, &data) if err != nil { return nil, err } versions := make([]string, 0) for _, tag := range data { if VersionMatch.MatchString(tag.Name) { versions = append(versions, tag.Name[1:]) } } return versions, nil }