Select Git revision
main.go 6.78 KiB
package main
import (
"archive/tar"
"bytes"
"compress/bzip2"
"context"
"encoding/json"
"flag"
"fmt"
"io"
"log"
"net/http"
"net/url"
"regexp"
"strings"
"sync"
"time"
)
var (
flagBaseURL string
flagListen string
flagGitlabHost string
flagGitlabProject string
)
type GLAssetLink struct {
ID int64 `json:"id"`
Name string `json:"name"`
TagName string `json:"tag_name"`
URL string `json:"url"`
}
type GLRelease struct {
Name string `json:"name"`
TagName string `json:"tag_name"`
ReleasedAt time.Time `json:"released_at"`
Assets struct {
Links []GLAssetLink `json:"links"`
} `json:"assets"`
}
func getReleases(ctx context.Context) ([]GLRelease, error) {
path := fmt.Sprintf("https://%s/api/v4/projects/%s/releases?order_by=created_at", flagGitlabHost, url.PathEscape(flagGitlabProject))
req, err := http.NewRequestWithContext(ctx, "GET", path, nil)
if err != nil {
return nil, fmt.Errorf("when building request: %w", err)
}
res, err := http.DefaultTransport.RoundTrip(req)
if err != nil {
return nil, fmt.Errorf("when performing request: %w", err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
return nil, fmt.Errorf("invalid response code %d", res.StatusCode)
}
var releases []GLRelease
j := json.NewDecoder(res.Body)
err = j.Decode(&releases)
if err != nil {
return nil, fmt.Errorf("when performing request: %w", err)
}
return releases, nil
}
type req struct {
getReleases chan []GLRelease