package main import ( "bufio" "compress/gzip" "d1pkgweb/deb822" "fmt" "net/http" "os" ) func processSuite(suiteCfg SuiteCfg, relCfg ReleaseCfg, baseDir string, result chan error) { relName := relCfg.Release suiteName := suiteCfg.Name for _, component := range suiteCfg.Components { // For each component in the suite fullURL := fmt.Sprintf("%s/%s", relCfg.RepoURL, component.URL) fmt.Fprintf(os.Stderr, "Processing: %s\n", fullURL) f, err := http.Get(fullURL) if err != nil { fmt.Fprintf(os.Stderr, "...Ignoring %s\n", fullURL) } else { uncompressed, err := gzip.NewReader(f.Body) if err != nil { fmt.Fprintf(os.Stderr, "error uncompressing %s\n", fullURL) continue } r := bufio.NewScanner(uncompressed) for s, err := deb822.ScanStanza(r); s["Package"] != ""; s, err = deb822.ScanStanza(r) { if err == nil { deb822.Stanza2HtmlPage(s, pkgTempl, baseDir, relName, suiteName, component.Name) } else { fmt.Printf("error: %s\n", err) } } } } result <- nil } func processRelease(relCfg ReleaseCfg, baseDir string, result chan error) { c := make(chan error) numWorkers := 0 for _, suiteCfg := range relCfg.Suites { // For each suite of the release numWorkers++ go processSuite(suiteCfg, relCfg, baseDir, c) } select { case e := <-c: numWorkers-- if numWorkers == 0 { result <- e return } } result <- nil return } func main() { args := os.Args if len(args) < 2 { fmt.Printf("Usage: %s \n", args[0]) return } confFile := args[1] conf := readConfig(confFile) c := make(chan error) numWorkers := 0 for _, relCfg := range conf.PkgSets { // For each release... numWorkers++ go processRelease(relCfg, ".", c) } var err = make([]error, numWorkers) select { case e := <-c: numWorkers-- err[numWorkers] = e if numWorkers == 0 { fmt.Fprintf(os.Stderr, "Exiting from main....") os.Exit(0) } } }