code: func simplisticBlamelist(c context.Context, build *model.BuildSummary) (result []*ui.Commit, err error) {
  	bs := build.GitilesCommit()
  	if bs == nil {
  		return
  	}
  
  	builds, commits, err := build.PreviousByGitilesCommit(c)
  	switch {
  	case err == nil || err == model.ErrUnknownPreviousBuild:
  		// continue
  	case status.Code(err) == codes.PermissionDenied:
  		err = grpcutil.UnauthenticatedTag.Apply(err)
  		return
  	default:
  		return
  	}
  
  	result = make([]*ui.Commit, 0, len(commits)+1)
  	for _, commit := range commits {
  		result = append(result, uiCommit(commit, protoutil.GitilesRepoURL(bs)))
  	}
  	logging.Infof(c, "Fetched %d commit blamelist from Gitiles", len(result))
  
  	// this means that there were more than 100 commits in-between.
  	if len(builds) == 0 && len(commits) > 0 {
  		result = append(result, &ui.Commit{
  			Description: "<blame list capped at 100 commits>",
  			Revision:    &ui.Link{},
  			AuthorName:  "<blame list capped at 100 commits>",
  		})
  	}
  
  	return
  }
docs: // simplisticBlamelist returns a slice of ui.Commit for a build, and/or an error.
  //
  // HACK(iannucci) - Getting the frontend to render a proper blamelist will
  // require some significant refactoring. To do this properly, we'll need:
  //   * The frontend to get BuildSummary from the backend.
  //   * BuildSummary to have a .PreviousBuild() API.
  //   * The frontend to obtain the annotation streams itself (so it could see
  //     the SourceManifest objects inside of them). Currently getRespBuild defers
  //     to swarming's implementation of buildsource.ID.Get(), which only returns
  //     the resp object.