package main import ( "archive/tar" "bufio" "compress/gzip" "errors" "fmt" "io" "net/http" "os" "strconv" flag "github.com/spf13/pflag" ) func main() { var ( url = flag.StringP("url", "u", "", "Url to the APKINDEX.tar.gz") output = flag.StringP("output", "o", "index.md", "Output path") templateType = flag.StringP("template-type", "t", "text", "Template system to be used, options: html, text") templateFile = flag.StringP("template-file", "f", "text", "Template file to be used") ) flag.Parse() err := run( *url, *output, *templateType, *templateFile, ) if err != nil { fmt.Println(err) os.Exit(1) } } func run( url string, output string, templateType string, templateFile string, ) error { tarStream, err := fechIndex(url) if err != nil { return fmt.Errorf("Error fecthing index file: %w", err) } defer tarStream.Close() archive, err := gzip.NewReader(tarStream) if err != nil { return fmt.Errorf("Error creating gzip reader: %w", err) } tr := tar.NewReader(archive) for { h, err := tr.Next() if err != nil { return fmt.Errorf("Error reading next tar entry: %w", err) } if h.FileInfo().Name() == "APKINDEX" { break } } var ( s = bufio.NewScanner(tr) entries = make([]*Entry, 0) lines = make([]string, 0) ) for s.Scan() { l := s.Text() if l == "" { entry := Parse(lines) entries = append(entries, entry) lines = make([]string, 0) } else { lines = append(lines, l) } } outputFile, err := getOutputFile(output) if err != nil { return fmt.Errorf("Error openning output file: %w", err) } tmpl, err := GetTemplate(templateType, templateFile) if err != nil { return fmt.Errorf("Error loading template file: %w", err) } err = tmpl.Execute(outputFile, entries) if err != nil { return fmt.Errorf("Error executing template: %w", err) } return nil } func getOutputFile(output string) (*os.File, error) { if output != "" { outputFile, err := os.Create(output) if err != nil { return nil, err } return outputFile, nil } else { return os.Stdout, nil } } func fechIndex(url string) (io.ReadCloser, error) { resp, err := http.Get(url) if err != nil { return nil, err } if resp.StatusCode != 200 { return nil, errors.New("Http error " + strconv.Itoa(resp.StatusCode)) } return resp.Body, nil }