code: func ComputeLogs(c context.Context, oldCheckout, newCheckout Checkout, history HistoryFunc) (Logs, error) {
  	var resultMu sync.Mutex
  	result := make(Logs)
  	err := parallel.WorkPool(8, func(ch chan<- func() error) {
  		for repo, revision := range newCheckout {
  			repo := repo
  			newRev := revision
  			oldRev, ok := oldCheckout[repo]
  			if !ok {
  				continue
  			}
  			host, project, _ := gitiles.ParseRepoURL(repo)
  			ch <- func() error {
  				log, err := history(c, host, project, oldRev, newRev)
  				if err != nil {
  					return err
  				}
  				if len(log) <= 1 {
  					return nil
  				}
  				resultMu.Lock()
  				result[repo] = log[:len(log)-1]
  				resultMu.Unlock()
  				return nil
  			}
  		}
  	})
  	return result, err
  }
docs: // ComputeLogs produces a set of Git diffs between oldCheckout and newCheckout, using the
  // repositories in the newCheckout. historyFunc is used to grab the Git history.