README: document nit_env.sh
[nit.git] / contrib / github_merge.nit
index 2d8b039..52afa49 100644 (file)
 # 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 pr = get_and_check("https://api.github.com/repos/nitlang/nit/pulls/{number}")
                var prm = pr.json_as_map
-               var sha = prm["head"].json_as_map["sha"]
-               var statuses = get_and_check("https://api.github.com/repos/privat/nit/statuses/{sha}")
+               var sha = prm["head"].json_as_map["sha"].to_s
+               var statuses = get_and_check("https://api.github.com/repos/nitlang/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})"
+               var mergeable = prm["mergeable"]
+               if mergeable != null then
+                       print "\tmergeable: {mergeable.to_s}"
+               else
+                       print "\tmergeable: unknown"
+               end
+               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 comments = new Array[nullable Object]
-               comments.add_all(get_and_check("https://api.github.com/repos/privat/nit/issues/{number}/comments").json_as_a)
-               comments.add_all(get_and_check("https://api.github.com/repos/privat/nit/pulls/{number}/comments").json_as_a)
+               comments.add_all(get_and_check("https://api.github.com/repos/nitlang/nit/issues/{number}/comments").json_as_a)
+               comments.add_all(get_and_check("https://api.github.com/repos/nitlang/nit/pulls/{number}/comments").json_as_a)
                var logins = new Array[String]
                for c in comments do
                        var cm = c.json_as_map
@@ -58,11 +68,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
-                       if not u.has_key("name") then
-                               print "No public name for user {l}"
+                       if not u.has_key("name") or u["name"] == null or not u.has_key("email")or u["email"] == null then
+                               print "No public name/email for user {l}"
                                continue
                        end
-                       var r = "{u["name"]} <{u["email"]}>"
+                       var r = "{u["name"].to_s} <{u["email"].to_s}>"
                        res.add r
 
                end
@@ -76,19 +86,18 @@ if "NIT_TESTING".environ == "true" then exit 0
 var auth = get_github_oauth
 
 if auth == "" then
-       print "Not github token, please configure one with"
+       print "Warning: no github oauth token, you can configure one with"
        print "    git config --add github.oauthtoken MYOAUTHTOKEN"
-       return
 end
 
-var curl = new GithubCurl(auth, "Merge-o-matic (privat/nit)")
+var curl = new GithubCurl(auth, "Merge-o-matic (nitlang/nit)")
 
 if args.length != 1 then
        # Without args, list `ok_will_merge`
-       var x = curl.get_and_check("https://api.github.com/repos/privat/nit/issues?labels=ok_will_merge")
+       var x = curl.get_and_check("https://api.github.com/repos/nitlang/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
@@ -97,9 +106,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
@@ -110,12 +119,13 @@ else
                print "Commit {sha} not in local repository; did you fetch github?"
                return
        end
-       if system("git merge --no-commit {sha}") != 0 then
+       if system("git merge --no-ff --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
        system("git commit -F mergemsg")
        print "The merge is made"
+       mergemsg.write_to(stdout)
 end