ni_nitdoc: simplified github option
authorAlexandre Terrasa <alexandre@moz-code.org>
Fri, 11 Oct 2013 05:40:29 +0000 (01:40 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Fri, 11 Oct 2013 05:40:29 +0000 (01:40 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

Makefile
share/ni_nitdoc/scripts/Nitdoc.GitHub.js
src/ni_nitdoc.nit
tests/sav/ni_nitdoc.res

index 2ae1f34..53f4cba 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -54,6 +54,7 @@ doc/newmodel/index.html: bin/nitdoc
                --custom-menu-items "<li><a href=\"http://nitlanguage.org/\">Nitlanguage.org</a></li>" \
                --custom-overview-text "<p>Documentation for the Nit tools based on the new metamodel<br/>Version $$(git describe)<br/>Date: $$(git show --format="%cd" | head -1)</p>" \
                --custom-footer-text "Nit new metamodel. Version $$(git describe)." \
+               --github-origin "privat:nit:master" \
                --source "https://github.com/privat/nit/blob/$$(git show --format="%H" | head -1)/%f#L%l-%L"
 
 clean:
index 7568e41..094af99 100644 (file)
@@ -29,32 +29,35 @@ Nitdoc.GitHub = {}; // Declare Nitdoc.GitHub submodule
 // Load GitHub UI\r
 $(document).ready(function() {\r
        //FIXME base should be choosen by user\r
-       var base = $("body").attr("data-github-base");\r
-       var head = $("body").attr("data-github-head");\r
-       if(base && head) {\r
-               Nitdoc.GitHub.UI.init(base, head);\r
+       var origin = $("body").attr("data-github-origin");\r
+       if(origin) {\r
+               Nitdoc.GitHub.UI.init(origin);\r
        }\r
 });\r
 \r
 /*\r
  * Nitdoc.Github.UI for comment edition module\r
  */\r
-Nitdoc.GitHub.UI = function(base, head) {\r
-       var base;\r
-       var head;\r
-\r
+Nitdoc.GitHub.UI = function() {\r
        var openedComments = 0; // currently edited comments count\r
        var user = false; // logged user\r
+       var origin;\r
+\r
+       var init = function(originStr) {\r
+               console.log("init GitHub module (origin: "+ originStr +")");\r
 \r
-       var init = function(baseStr, headStr) {\r
-               base = baseStr;\r
-               head = headStr;\r
-               console.log("init GitHub module (base: "+ base +", head: "+ head +")");\r
+               // parse origin\r
+               var parts = originStr.split(":");\r
+               origin = {\r
+                       user: parts[0],\r
+                       repo: parts[1],\r
+                       branch: parts[2]\r
+               };\r
 \r
                // check local session\r
                if(localStorage.user) {\r
                        var session = JSON.parse(localStorage.user);\r
-                       var user = tryLogin(session.login, Base64.decode(session.password), session.repo);\r
+                       var user = tryLogin(session.login, Base64.decode(session.password), session.repo, session.branch);\r
                        if(!user) {\r
                                console.log("Session found but authentification failed");\r
                                localStorage.clear();\r
@@ -66,7 +69,7 @@ Nitdoc.GitHub.UI = function(base, head) {
                // activate ui\r
                Nitdoc.GitHub.LoginBox.init("nav.main ul");\r
                if(user) {\r
-                       Nitdoc.GitHub.LoginBox.displayLogout(base, head, user);\r
+                       Nitdoc.GitHub.LoginBox.displayLogout(origin, user);\r
                        activate(user);\r
                } else {\r
                        Nitdoc.GitHub.LoginBox.displayLogin();\r
@@ -86,16 +89,11 @@ Nitdoc.GitHub.UI = function(base, head) {
                user = loggedUser;\r
                saveSession(user);\r
                \r
-               // get lastest commit\r
-               var latest = Nitdoc.GitHub.API.getLastCommit(user, head);\r
-               if(!latest || !latest.sha) {\r
-                       Nitdoc.GitHub.ModalBox.open("Head branch not found!", latest.status + ": " + latest.statusText, true);\r
-                       return;\r
-               }\r
-               if(localStorage.latestCommit != latest.sha) {\r
+               // check local storage synchro with branch\r
+               if(localStorage.latestCommit != user.latest.sha) {\r
                        console.log("Latest commit changed: cleaned cache");\r
                        localStorage.requests = "[]";\r
-                       localStorage.latestCommit = latest.sha;\r
+                       localStorage.latestCommit = user.latest.sha;\r
                }\r
                console.log("Latest commit sha: " + localStorage.latestCommit);\r
 \r
@@ -117,11 +115,17 @@ Nitdoc.GitHub.UI = function(base, head) {
        }\r
 \r
        // Attempt login through GitHub API\r
-       var tryLogin = function(login, password, repo) {\r
-               var user = new Nitdoc.GitHub.User(login, password, repo);\r
+       var tryLogin = function(login, password, repo, branch) {\r
+               var user = new Nitdoc.GitHub.User(login, password, repo, branch);\r
                if(!Nitdoc.GitHub.API.login(user)) {\r
                        return false;\r
                }\r
+               // get lastest commit\r
+               var latest = Nitdoc.GitHub.API.getLastCommit(user);\r
+               if(!latest || !latest.sha) {\r
+                       return false;\r
+               }\r
+               user.latest = latest;\r
                return user;\r
        }\r
 \r
@@ -311,7 +315,7 @@ Nitdoc.GitHub.UI = function(base, head) {
                        return false;\r
                }\r
                console.log("New commit: " + newCommit.url);\r
-               var pullRequest = Nitdoc.GitHub.API.createPullRequest(user, infos.message.split("\n\n")[0], infos.message, base, newCommit.sha);\r
+               var pullRequest = Nitdoc.GitHub.API.createPullRequest(user, infos.message.split("\n\n")[0], infos.message, origin, newCommit.sha);\r
                if(!pullRequest.number) {\r
                        Nitdoc.GitHub.ModalBox.open("Unable to create pull request!", pullRequest.status + ": " + pullRequest.statusText, true);\r
                        return false;\r
@@ -322,23 +326,25 @@ Nitdoc.GitHub.UI = function(base, head) {
 \r
        // close previously opened pull request\r
        var closePullRequest = function(number) {\r
+               var requests = JSON.parse(localStorage.requests);\r
+               if(!requests[number]) {\r
+                       Nitdoc.GitHub.ModalBox.open("Unable to close pull request!", "Pull request " + number + "not found", true);\r
+                       return false;\r
+               }\r
                // close pull request\r
-               var res = Nitdoc.GitHub.API.updatePullRequest(user, "Canceled from Wikidoc", "", "closed", number);\r
+               var res = Nitdoc.GitHub.API.updatePullRequest(user, "Canceled from Nitdoc", "", "closed", requests[number].request);\r
                if(!res.id) {\r
                        Nitdoc.GitHub.ModalBox.open("Unable to close pull request!", res.status + ": " + res.statusText, true);\r
                        return false;\r
                }\r
                // update in localstorage\r
-               var requests = JSON.parse(localStorage.requests);\r
-               if(!!requests[number]) {\r
-                       requests[number].isClosed = true;\r
-               }\r
+               requests[number].isClosed = true;\r
                localStorage.requests = JSON.stringify(requests);\r
        }\r
 \r
        // Get file content from github\r
        var getFileContent = function(githubUrl) {\r
-               var origFile = Nitdoc.GitHub.API.getFile(user, githubUrl, head);\r
+               var origFile = Nitdoc.GitHub.API.getFile(user, githubUrl);\r
                if(!origFile.content) {\r
                        Nitdoc.GitHub.ModalBox.open("Unable to locate source file!", origFile.status + ": " + origFile.statusText, true);\r
                        return;\r
@@ -364,7 +370,8 @@ Nitdoc.GitHub.UI = function(base, head) {
                var session = {\r
                        login: user.login,\r
                        password: Base64.encode(user.password),\r
-                       repo: user.repo\r
+                       repo: user.repo,\r
+                       branch: user.branch,\r
                };\r
                localStorage.user = JSON.stringify(session);\r
        }\r
@@ -372,8 +379,7 @@ Nitdoc.GitHub.UI = function(base, head) {
        // accessors\r
 \r
        var getUser = function() { return user; }\r
-       var getBase = function() { return base; }\r
-       var getHead = function() { return head; }\r
+       var getOrigin = function() { return origin; }\r
        var getOpenedComments = function() { return openedComments; }\r
        var addOpenedComments = function() { openedComments += 1; }\r
        var remOpenedComments = function() { openedComments -= 1; }\r
@@ -385,8 +391,7 @@ Nitdoc.GitHub.UI = function(base, head) {
                activate: activate,\r
                disactivate: disactivate,\r
                getUser: getUser,\r
-               getBase: getBase,\r
-               getHead: getHead,\r
+               getOrigin: getOrigin,\r
                getOpenedComments: getOpenedComments,\r
                addOpenedComments: addOpenedComments,\r
                remOpenedComments: remOpenedComments,\r
@@ -401,11 +406,12 @@ Nitdoc.GitHub.UI = function(base, head) {
 /*\r
  * GitHub API user object\r
  */\r
-Nitdoc.GitHub.User = function(login, password, repo) {\r
+Nitdoc.GitHub.User = function(login, password, repo, branch) {\r
        this.login = login;\r
        this.password = password;\r
        this.repo = repo;\r
        this.auth = "Basic " +  Base64.encode(login + ':' + password);\r
+       this.branch = branch;\r
 };\r
 \r
 /* \r
@@ -459,17 +465,38 @@ Nitdoc.GitHub.API = function() {
                return user.infos.name + " &lt;" + user.infos.email + "&gt;";\r
        }\r
 \r
+       // get the branches list from a repo\r
+       var getBranches = function(user) {\r
+               var res = false;\r
+               $.ajax({\r
+                       beforeSend: function (xhr) {\r
+                               xhr.setRequestHeader ("Authorization", user.auth);\r
+                       },\r
+                       type: "GET",\r
+                       url: "https://api.github.com/repos/" + user.login + "/" + user.repo + "/branches",\r
+                       async: false,\r
+                       dataType: 'json',\r
+                       success: function(response) {\r
+                               res = response;\r
+                       },\r
+                       error: function(response) {\r
+                               res = response;\r
+                       }\r
+               });\r
+               return res;\r
+    }\r
+\r
        /* GitHub commits */\r
 \r
        // get the latest commit on `branchName`\r
-       var getLastCommit = function(user, branchName) {\r
+       var getLastCommit = function(user) {\r
                var res = false;\r
                $.ajax({\r
                        beforeSend: function (xhr) {\r
                                xhr.setRequestHeader ("Authorization", user.auth);\r
                        },\r
                        type: "GET",\r
-                       url: "https://api.github.com/repos/" + user.login + "/" + user.repo + "/git/refs/heads/" + branchName,\r
+                       url: "https://api.github.com/repos/" + user.login + "/" + user.repo + "/git/refs/heads/" + user.branch,\r
                        async: false,\r
                        dataType: 'json',\r
                        success: function(response) {\r
@@ -585,19 +612,19 @@ Nitdoc.GitHub.API = function() {
        }\r
 \r
        // create a pull request\r
-       var createPullRequest = function(user, title, body, base, head) {\r
+       var createPullRequest = function(user, title, body, origin, head) {\r
                var res = false;\r
                $.ajax({\r
                        beforeSend: function (xhr) {\r
                                xhr.setRequestHeader ("Authorization", user.auth);\r
                        },\r
                        type: "POST",\r
-                       url: "https://api.github.com/repos/" + user.login + "/" + user.repo + "/pulls",\r
+                       url: "https://api.github.com/repos/" + origin.user + "/" + origin.repo + "/pulls",\r
                        data: JSON.stringify({\r
                                title: title,\r
                                body: body,\r
-                               base: base,\r
-                               head: head\r
+                               base: origin.branch,\r
+                               head: user.login + ":" + head\r
                        }),\r
                        async: false,\r
                        dataType: 'json',\r
@@ -612,14 +639,14 @@ Nitdoc.GitHub.API = function() {
        }\r
 \r
        // update a pull request\r
-       var updatePullRequest = function(user, title, body, state, number) {\r
+       var updatePullRequest = function(user, title, body, state, request) {\r
                var res = false;\r
                        $.ajax({\r
                        beforeSend: function (xhr) {\r
                                        xhr.setRequestHeader ("Authorization", user.auth);\r
                        },\r
                        type: "PATCH",\r
-                       url: "https://api.github.com/repos/" + user.login + "/" + user.repo + "/pulls/" + number,\r
+                       url: request.url,\r
                        data: JSON.stringify({\r
                                title: title,\r
                                body: body,\r
@@ -662,6 +689,7 @@ Nitdoc.GitHub.API = function() {
        var api = {\r
                login: login,\r
                getLastCommit: getLastCommit,\r
+               getBranches: getBranches,\r
                getTree: getTree,\r
                createBlob: createBlob,\r
                createTree: createTree,\r
@@ -719,7 +747,7 @@ Nitdoc.GitHub.LoginBox = function() {
        }\r
 \r
        // Panel of login box to display when the user is logged in\r
-       var displayLogout = function(base, head, user) {\r
+       var displayLogout = function(origin, user) {\r
                var panel = $(document.createElement("div"))\r
                .append(\r
                        $(document.createElement("h4"))\r
@@ -732,30 +760,16 @@ Nitdoc.GitHub.LoginBox = function() {
                )\r
                .append(\r
                        $(document.createElement("label"))\r
-                       .attr("for", "github-repo")\r
-                       .append("Repo")\r
-               )\r
-               .append(\r
-                       $(document.createElement("input"))\r
-                       .attr({\r
-                               id: "github-repo",\r
-                               type: "text",\r
-                               disabled: "disabled",\r
-                               value: user.repo\r
-                       })\r
-               )\r
-               .append(\r
-                       $(document.createElement("label"))\r
-                       .attr("for", "github-head")\r
-                       .append("Head")\r
+                       .attr("for", "github-origin")\r
+                       .append("Origin")\r
                )\r
                .append(\r
                        $(document.createElement("input"))\r
                        .attr({\r
-                               id: "github-head",\r
+                               id: "github-origin",\r
                                type: "text",\r
                                disabled: "disabled",\r
-                               value: head\r
+                               value: origin.user + ":" + origin.repo + ":" + origin.branch\r
                        })\r
                )\r
                .append(\r
@@ -769,7 +783,7 @@ Nitdoc.GitHub.LoginBox = function() {
                                id: "github-base",\r
                                type: "text",\r
                                disabled: "disabled",\r
-                               value: base\r
+                               value: user.login + ":" + user.repo + ":" + user.branch\r
                        })\r
                )\r
                .append(\r
@@ -829,6 +843,18 @@ Nitdoc.GitHub.LoginBox = function() {
                        })\r
                )\r
                .append(\r
+                       $(document.createElement("label"))\r
+                       .attr("for", "nitdoc-github-branch-field")\r
+                       .append("Branch")\r
+               )\r
+               .append(\r
+                       $(document.createElement("input"))\r
+                       .attr({\r
+                               id: "nitdoc-github-branch-field",\r
+                               type: "text"\r
+                       })\r
+               )\r
+               .append(\r
                        $(document.createElement("button"))\r
                        .addClass("nitdoc-github-button")\r
                        .append(\r
@@ -839,17 +865,17 @@ Nitdoc.GitHub.LoginBox = function() {
                                var login = $('#nitdoc-github-login-field').val();\r
                                var password = $('#nitdoc-github-password-field').val();\r
                                var repo = $('#nitdoc-github-repo-field').val();\r
-                               if(!login || !password || !repo) {\r
-                                       Nitdoc.GitHub.ModalBox.open("Sign in error", "Please enter your GitHub username, password and repository.", true);\r
+                               var branch = $('#nitdoc-github-branch-field').val();\r
+                               if(!login || !password || !repo || !branch) {\r
+                                       Nitdoc.GitHub.ModalBox.open("Sign in error", "Please enter your GitHub username, password, repository and branch.", true);\r
                                } else {\r
-                                       var user = Nitdoc.GitHub.UI.tryLogin(login, password, repo);\r
+                                       var user = Nitdoc.GitHub.UI.tryLogin(login, password, repo, branch);\r
                                        if(!user) {\r
-                                               Nitdoc.GitHub.ModalBox.open("Sign in error", "The username, password or repo you entered is incorrect.", true);\r
+                                               Nitdoc.GitHub.ModalBox.open("Sign in error", "The username, password, repo or branch you entered is incorrect.", true);\r
                                        } else {\r
                                                Nitdoc.GitHub.UI.activate(user);\r
-                                               var base = Nitdoc.GitHub.UI.getBase();\r
-                                               var head = Nitdoc.GitHub.UI.getHead();\r
-                                               Nitdoc.GitHub.LoginBox.displayLogout(base, head, user);\r
+                                               var origin = Nitdoc.GitHub.UI.getOrigin();\r
+                                               Nitdoc.GitHub.LoginBox.displayLogout(origin, user);\r
                                        }\r
                                }\r
                                return false;\r
index 26ad41d..7f2e529 100644 (file)
@@ -46,8 +46,7 @@ class NitdocContext
        private var opt_custom_overview_text: OptionString = new OptionString("Text displayed as introduction of Overview page before the modules list", "--custom-overview-text")
        private var opt_custom_footer_text: OptionString = new OptionString("Text displayed as footer of all pages", "--custom-footer-text")
 
-       private var opt_github_base: OptionString = new OptionString("The branch (or git ref) edited commits will be pulled into (ex: octocat:master)", "--github-base")
-       private var opt_github_head: OptionString = new OptionString("The reference branch name used to create pull requests (ex: master)", "--github-head")
+       private var opt_github_origin: OptionString = new OptionString("The branch where edited commits will be pulled into (ex: user:repo:branch)", "--github-origin")
 
        init do
                toolcontext.option_context.add_option(opt_dir)
@@ -59,8 +58,7 @@ class NitdocContext
                toolcontext.option_context.add_option(opt_custom_footer_text)
                toolcontext.option_context.add_option(opt_custom_overview_text)
                toolcontext.option_context.add_option(opt_custom_menu_items)
-               toolcontext.option_context.add_option(opt_github_base)
-               toolcontext.option_context.add_option(opt_github_head)
+               toolcontext.option_context.add_option(opt_github_origin)
                toolcontext.process_options
                self.arguments = toolcontext.option_context.rest
 
@@ -293,9 +291,8 @@ abstract class NitdocPage
                head
                append("</head>")
                append("<body")
-               if not ctx.opt_github_base.value == null and not ctx.opt_github_head.value == null then
-                       append(" data-github-base='{ctx.opt_github_base.value.as(not null)}'")
-                       append(" data-github-head='{ctx.opt_github_head.value.as(not null)}'")
+               if not ctx.opt_github_origin.value == null then
+                       append(" data-github-origin='{ctx.opt_github_origin.value.as(not null)}'")
                end
                append(">")
                header
index be07828..0a917d7 100644 (file)
@@ -20,5 +20,4 @@ usage: nitdoc [options] file...
   --custom-footer-text     Text displayed as footer of all pages
   --custom-overview-text   Text displayed as introduction of Overview page before the modules list
   --custom-menu-items      Items displayed in menu before the 'Overview' item (Each item must be enclosed in 'li' tags)
-  --github-base            The branch (or git ref) edited commits will be pulled into (ex: octocat:master)
-  --github-head            The reference branch name used to create pull requests (ex: master)
+  --github-origin          The branch where edited commits will be pulled into (ex: user:repo:branch)