diff options
-rw-r--r-- | config.go | 8 | ||||
-rw-r--r-- | d1pkgweb.go | 91 |
2 files changed, 69 insertions, 30 deletions
@@ -11,15 +11,15 @@ type CompCfg struct { URL string `yaml:"URL"` } -type Suite struct { +type SuiteCfg struct { Name string `yaml:"Name"` Components []CompCfg `yaml:"Components"` } type ReleaseCfg struct { - Release string `yaml:"Release"` - RepoURL string `yaml:"RepoURL"` - Suites []Suite `yaml:"Suites"` + Release string `yaml:"Release"` + RepoURL string `yaml:"RepoURL"` + Suites []SuiteCfg `yaml:"Suites"` } type PkgwebCfg struct { diff --git a/d1pkgweb.go b/d1pkgweb.go index b8b048f..d78f004 100644 --- a/d1pkgweb.go +++ b/d1pkgweb.go @@ -9,6 +9,57 @@ import ( "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 @@ -21,34 +72,22 @@ func main() { confFile := args[1] conf := readConfig(confFile) - //fmt.Printf("Got config: %s\n", *conf) + c := make(chan error) + numWorkers := 0 for _, relCfg := range conf.PkgSets { // For each release... - relName := relCfg.Release - for _, suiteCfg := range relCfg.Suites { // For each suite of the 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, ".", relName, suiteName, component.Name) - } else { - fmt.Printf("error: %s\n", err) - } - } - } - } + 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) } } } |