go-hep.org/x/hep@v0.38.1/ci/update-godoc.go (about)

     1  // Copyright ©2019 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build ignore
     6  
     7  package main
     8  
     9  import (
    10  	"bufio"
    11  	"bytes"
    12  	"flag"
    13  	"fmt"
    14  	"log"
    15  	"net/http"
    16  	"net/url"
    17  	"os"
    18  	"os/exec"
    19  	"strings"
    20  
    21  	"golang.org/x/sync/errgroup"
    22  )
    23  
    24  func main() {
    25  
    26  	log.SetPrefix("")
    27  	log.SetFlags(0)
    28  
    29  	njobs := flag.Int("j", 5, "number of parallel godoc update jobs")
    30  
    31  	flag.Parse()
    32  
    33  	pkgs, err := pkgList()
    34  	if err != nil {
    35  		log.Fatal(err)
    36  	}
    37  
    38  	var (
    39  		n   = len(pkgs) / *njobs
    40  		grp errgroup.Group
    41  	)
    42  	log.Printf("pkgs:  %d", len(pkgs))
    43  	log.Printf("njobs: %d", *njobs)
    44  
    45  	for i := 0; i < len(pkgs); i += n {
    46  		beg := i
    47  		end := beg + n
    48  		if end > len(pkgs) {
    49  			end = len(pkgs)
    50  		}
    51  		grp.Go(func() error {
    52  			for _, pkg := range pkgs[beg:end] {
    53  				log.Printf("updating %q...", pkg)
    54  				v := make(url.Values)
    55  				v.Add("path", pkg)
    56  				resp, err := http.PostForm("https://godoc.org/-/refresh", v)
    57  				if err != nil {
    58  					return fmt.Errorf("could not post %q: %w", pkg, err)
    59  				}
    60  				if resp.StatusCode != http.StatusOK {
    61  					return fmt.Errorf("invalid response status for %q: %v", pkg, resp.Status)
    62  				}
    63  			}
    64  			return nil
    65  		})
    66  	}
    67  
    68  	err = grp.Wait()
    69  	if err != nil {
    70  		log.Printf("error running group: %v", err)
    71  	}
    72  }
    73  
    74  func pkgList() ([]string, error) {
    75  	out := new(bytes.Buffer)
    76  	cmd := exec.Command("go", "list", "./...")
    77  	cmd.Stdout = out
    78  	cmd.Stderr = os.Stderr
    79  	cmd.Stdin = os.Stdin
    80  
    81  	err := cmd.Run()
    82  	if err != nil {
    83  		return nil, fmt.Errorf("could not get package list: %w", err)
    84  	}
    85  
    86  	var pkgs []string
    87  	scan := bufio.NewScanner(out)
    88  	for scan.Scan() {
    89  		pkg := scan.Text()
    90  		if strings.Contains(pkg, "vendor") {
    91  			continue
    92  		}
    93  		pkgs = append(pkgs, pkg)
    94  	}
    95  
    96  	return pkgs, nil
    97  }
    98  
    99  /*
   100  for pkg in $(go list ./...); do curl -X POST -d "path=${pkg}" https://godoc.org/-/refresh; done
   101  */