# Query the Github PR API to perform a merge
module github_merge
-import github_api
+import github::github_curl
import template
redef class Object
# Factorize cast
- fun json_as_a: Array[nullable Object] do return self.as(Array[nullable Object])
+ fun json_as_a: JsonArray do return self.as(JsonArray)
# Factorize cast
- fun json_as_map: Map[String, nullable Object] do return self.as(Map[String, nullable Object])
+ fun json_as_map: JsonObject do return self.as(JsonObject)
end
redef class GithubCurl
# Get a given pull request (PR)
- fun getpr(number: Int): Map[String, nullable Object]
+ fun getpr(number: Int): JsonObject
do
var pr = get_and_check("https://api.github.com/repos/privat/nit/pulls/{number}")
var prm = pr.json_as_map
- var sha = prm["head"].json_as_map["sha"]
+ var sha = prm["head"].json_as_map["sha"].to_s
var statuses = get_and_check("https://api.github.com/repos/privat/nit/statuses/{sha}")
prm["statuses"] = statuses
- print "{prm["title"]}: by {prm["user"].json_as_map["login"]} (# {prm["number"]})"
- print "\tmergable: {prm["mergeable"]}"
- print "\tstatus: {prm["statuses"].json_as_a[0].json_as_map["state"]}"
+ print "{prm["title"].to_s}: by {prm["user"].json_as_map["login"].to_s} (# {prm["number"].to_s})"
+ print "\tmergable: {prm["mergeable"].to_s}"
+ var st = prm["statuses"].json_as_a
+ if not st.is_empty then
+ print "\tstatus: {st[0].json_as_map["state"].to_s}"
+ else
+ print "\tstatus: not tested"
+ end
return prm
end
# Get reviewers of a PR
- fun getrev(pr: Map[String, nullable Object]): Array[String]
+ fun getrev(pr: JsonObject): Array[String]
do
var number = pr["number"].as(Int)
var user = pr["user"].json_as_map["login"].as(String)
var res = new Array[String]
for l in logins do
var u = get_and_check("https://api.github.com/users/{l}").json_as_map
- var r = "{u["name"]} <{u["email"]}>"
+ if not u.has_key("name") then
+ print "No public name for user {l}"
+ continue
+ end
+ var r = "{u["name"].to_s} <{u["email"].to_s}>"
res.add r
end
var x = curl.get_and_check("https://api.github.com/repos/privat/nit/issues?labels=ok_will_merge")
for y in x.json_as_a do
var number = y.json_as_map["number"].as(Int)
- var pr = curl.getpr(number)
+ curl.getpr(number)
end
else
# With a arg, merge the PR
var revs = curl.getrev(pr)
var mergemsg = new Template
- mergemsg.add "Merge: {pr["title"]}\n\n"
- mergemsg.add "{pr["body"]}\n\n"
- mergemsg.add "Pull-Request: #{pr["number"]}\n"
+ mergemsg.add "Merge: {pr["title"].to_s}\n\n"
+ mergemsg.add "{pr["body"].to_s}\n\n"
+ mergemsg.add "Pull-Request: #{pr["number"].to_s}\n"
for r in revs do
mergemsg.add "Reviewed-by: {r}\n"
end
return
end
if system("git merge --no-commit {sha}") != 0 then
+ system("cp mergemsg `git rev-parse --git-dir`/MERGE_MSG")
print "Problem during merge... Let's do the commit manually."
return
end