A few bugfixes in the redmine library: fix the version filter for
authorWard Vandewege <ward@curii.com>
Thu, 10 Mar 2022 18:11:26 +0000 (13:11 -0500)
committerWard Vandewege <ward@curii.com>
Thu, 10 Mar 2022 18:11:26 +0000 (13:11 -0500)
issues, handle pagination in the FilteredIssues function.

refs #18813

Arvados-DCO-1.1-Signed-off-by: Ward Vandewege <ward@curii.com>

lib/redmine/issues.go
lib/redmine/redmine.go

index 90c8c422fb78f45ee40ba8bcd55d08d81574d7e0..7b6e5fed53b918545da3b53cd06656eab572ab15 100644 (file)
@@ -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
index 70a93f4a89a9aaa6fabb727ba68957c3ded29604..b5f981f150418993bfbcfafc2f8d55af707492c0 100644 (file)
@@ -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
 }