X-Git-Url: http://nitlanguage.org diff --git a/contrib/github_merge.nit b/contrib/github_merge.nit index f3c2da6..c85f4af 100644 --- a/contrib/github_merge.nit +++ b/contrib/github_merge.nit @@ -15,33 +15,38 @@ # 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) @@ -58,7 +63,11 @@ redef class GithubCurl 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 @@ -84,7 +93,7 @@ if args.length != 1 then 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 @@ -93,9 +102,9 @@ else 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 @@ -107,6 +116,7 @@ else 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