test_parser: add option `-x` to output XML
[nit.git] / contrib / github_merge.nit
index c30732f..8a2c545 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 prm = pr.json_as_map
@@ -35,7 +35,12 @@ redef class GithubCurl
                var statuses = get_and_check("https://api.github.com/repos/privat/nit/statuses/{sha}")
                prm["statuses"] = statuses
                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 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}"
@@ -46,7 +51,7 @@ redef class GithubCurl
        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)
@@ -93,7 +98,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
@@ -115,12 +120,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