+ return load_from_github("/repos/{full_name}").as(nullable Repo)
+ end
+
+ # List of branches associated with their names.
+ fun load_repo_branches(repo: Repo): Array[Branch] do
+ message(1, "Get branches for {repo.full_name}")
+ var array = get("/repos/{repo.full_name}/branches")
+ var res = new Array[Branch]
+ if not array isa JsonArray then return res
+ var deser = deserialize(array.to_json)
+ if not deser isa Array[Object] then return res # empty array
+ for branch in deser do
+ if not branch isa Branch then continue
+ res.add branch
+ end
+ return res
+ end
+
+ # List of issues associated with their ids.
+ fun load_repo_issues(repo: Repo): Array[Issue] do
+ message(1, "Get issues for {repo.full_name}")
+ var res = new Array[Issue]
+ var issue = load_repo_last_issue(repo)
+ if issue == null then return res
+ res.add issue
+ while issue != null and issue.number > 1 do
+ issue = load_issue(repo, issue.number - 1)
+ if issue == null then continue
+ res.add issue
+ end
+ return res
+ end
+
+ # Search issues in this repo form an advanced query.
+ #
+ # Example:
+ #
+ # ~~~nitish
+ # var issues = repo.search_issues("is:open label:need_review")
+ # ~~~
+ #
+ # See <https://developer.github.com/v3/search/#search-issues>.
+ fun search_repo_issues(repo: Repo, query: String): Array[Issue] do
+ query = "/search/issues?q={query} repo:{repo.full_name}"
+ var res = new Array[Issue]
+ var response = get(query)
+ if was_error then return res
+ var arr = response.as(JsonObject)["items"].as(JsonArray)
+ return deserialize(arr.to_json).as(Array[Issue])
+ end
+
+ # Get the last published issue.
+ fun load_repo_last_issue(repo: Repo): nullable Issue do
+ var array = get("/repos/{repo.full_name}/issues")
+ if not array isa JsonArray then return null
+ if array.is_empty then return null
+ var obj = array.first
+ if not obj isa JsonObject then return null
+ return deserialize(obj.to_json).as(nullable Issue)
+ end
+
+ # List of labels associated with their names.
+ fun load_repo_labels(repo: Repo): Array[Label] do
+ message(1, "Get labels for {repo.full_name}")
+ var array = get("repos/{repo.full_name}/labels")
+ if not array isa JsonArray then return new Array[Label]
+ return deserialize(array.to_json).as(Array[Label])
+ end
+
+ # List of milestones associated with their ids.
+ fun load_repo_milestones(repo: Repo): Array[Milestone] do
+ message(1, "Get milestones for {repo.full_name}")
+ var array = get("/repos/{repo.full_name}/milestones")
+ if not array isa JsonArray then return new Array[Milestone]
+ return deserialize(array.to_json).as(Array[Milestone])
+ end
+
+ # List of pull-requests associated with their ids.
+ #
+ # Implementation notes: because PR numbers are not consecutive,
+ # PR are loaded from pages.
+ # See: https://developer.github.com/v3/pulls/#list-pull-requests
+ fun load_repo_pulls(repo: Repo): Array[PullRequest] do
+ message(1, "Get pulls for {repo.full_name}")
+ var key = "/repos/{repo.full_name}"
+ var res = new Array[PullRequest]
+ var page = 1
+ loop
+ var array = get("{key}/pulls?page={page}").as(JsonArray)
+ if array.is_empty then break
+ for obj in array do
+ if not obj isa JsonObject then continue
+ var pr = deserialize(array.to_json).as(nullable PullRequest)
+ if pr == null then continue
+ res.add pr
+ end
+ page += 1
+ end
+ return res
+ end
+
+ # List of contributor related statistics.
+ fun load_repo_contrib_stats(repo: Repo): Array[ContributorStats] do
+ message(1, "Get contributor stats for {repo.full_name}")
+ var res = new Array[ContributorStats]
+ var array = get("/repos/{repo.full_name}/stats/contributors")
+ if not array isa JsonArray then return res
+ return deserialize(array.to_json).as(Array[ContributorStats])