From b6fdd9810edd6535f0aa7624ce7341dc3e4c2358 Mon Sep 17 00:00:00 2001 From: Ward Vandewege Date: Thu, 10 Mar 2022 13:11:26 -0500 Subject: [PATCH] A few bugfixes in the redmine library: fix the version filter for issues, handle pagination in the FilteredIssues function. refs #18813 Arvados-DCO-1.1-Signed-off-by: Ward Vandewege --- lib/redmine/issues.go | 45 ++++++++++++++++++++++++++---------------- lib/redmine/redmine.go | 1 + 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/lib/redmine/issues.go b/lib/redmine/issues.go index 90c8c42..7b6e5fe 100644 --- a/lib/redmine/issues.go +++ b/lib/redmine/issues.go @@ -86,32 +86,43 @@ func issueFilters(issueFilter *IssueFilter) []string { filterParameters = append(filterParameters, fmt.Sprintf("subject=~%v", issueFilter.Subject)) } if len(issueFilter.VersionID) > 0 { - filterParameters = append(filterParameters, fmt.Sprintf("fixed_version=~%v", issueFilter.VersionID)) - } - - if len(filterParameters) > 0 { - return filterParameters[1:] + filterParameters = append(filterParameters, fmt.Sprintf("fixed_version_id=%v", issueFilter.VersionID)) } return filterParameters } // FilteredIssues returns a slice of issues that matches the f criteria +// This function handles pagination internally, so it could return a lot +// of results at once. func (c *Client) FilteredIssues(f *IssueFilter) ([]Issue, error) { s := issueFilters(f) - res, err := c.Get("/issues.json?" + strings.Join(s, "&")) - if err != nil { - return nil, err - } - defer res.Body.Close() - - var r issuesResult - err = responseHelper(res, &r, 200) - if err != nil { - return nil, err - } - return r.Issues, nil + var issues []Issue + var offset int + // Get 100 results at once (the default is 25) + limit := 100 + for { + parameters := append(s, fmt.Sprintf("offset=%d", offset), fmt.Sprintf("limit=%d", limit)) + res, err := c.Get("/issues.json?" + strings.Join(parameters, "&")) + if err != nil { + return nil, err + } + defer res.Body.Close() + + var r issuesResult + err = responseHelper(res, &r, 200) + if err != nil { + return nil, err + } + issues = append(issues, r.Issues...) + if r.Offset+uint(len(r.Issues)) >= r.TotalCount { + break + } + offset += limit + } + + return issues, nil } // CreateIssue creates a redmine issue diff --git a/lib/redmine/redmine.go b/lib/redmine/redmine.go index 70a93f4..b5f981f 100644 --- a/lib/redmine/redmine.go +++ b/lib/redmine/redmine.go @@ -95,5 +95,6 @@ func responseHelper(res *http.Response, r interface{}, okCode int) error { // When r is nil, the API call is not expected to return a result (empty res.Body) err = decoder.Decode(&r) } + //fmt.Printf("***\nRAW RESPONSE: %+v\n***\n", r) return err } -- 2.30.2