Skip to content
Snippets Groups Projects
Select Git revision
  • 46cf3c540a75db10076b4725cb41f7347d9d8102
  • main default protected
2 results

main.go

Blame
  • 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