func getCBBuildsWithFilter()

in cli/bpbuild/build.go [21:67]


func getCBBuildsWithFilter(projectID string, filter string, cFilters []clientBuildFilter) ([]*cloudbuild.Build, error) {
	ctx := context.Background()
	cloudbuildService, err := cloudbuild.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("error creating cloudbuild service: %w", err)
	}

	c, err := cloudbuildService.Projects.Builds.List(projectID).Filter(filter).Do()
	if err != nil {
		return nil, fmt.Errorf("error listing builds with filter %s in project %s: %w", filter, projectID, err)
	}

	cbBuilds := []*cloudbuild.Build{}
	appendClientFilteredBuilds := func(builds []*cloudbuild.Build) {
		for _, b := range builds {
			appendBuild := true
			for _, cFilter := range cFilters {
				// skip if any client side filter evaluates to false
				if !cFilter(b) {
					appendBuild = false
					break
				}
			}
			if appendBuild {
				cbBuilds = append(cbBuilds, b)
			}
		}
	}

	if len(c.Builds) < 1 {
		return nil, fmt.Errorf("no builds found with filter %s in project %s", filter, projectID)
	}
	appendClientFilteredBuilds(c.Builds)

	// pagination
	for {
		c, err = cloudbuildService.Projects.Builds.List(projectID).Filter(filter).PageToken(c.NextPageToken).Do()
		if err != nil {
			return nil, fmt.Errorf("error retrieving next page with token %s: %w", c.NextPageToken, err)
		}
		appendClientFilteredBuilds(c.Builds)
		if c.NextPageToken == "" {
			break
		}
	}
	return cbBuilds, nil
}