nitdoc: Replace old nitdoc by nitdoc_ni
[nit.git] / share / nitdoc / scripts / Nitdoc.GitHub.js
similarity index 90%
rename from share/ni_nitdoc/scripts/Nitdoc.GitHub.js
rename to share/nitdoc/scripts/Nitdoc.GitHub.js
index 542011b..37f4104 100644 (file)
@@ -29,9 +29,10 @@ Nitdoc.GitHub = {}; // Declare Nitdoc.GitHub submodule
 // Load GitHub UI\r
 $(document).ready(function() {\r
        //FIXME base should be choosen by user\r
-       var origin = $("body").attr("data-github-origin");\r
-       if(origin) {\r
-               Nitdoc.GitHub.UI.init(origin);\r
+       var upstream = $("body").attr("data-github-upstream");\r
+       var basesha1 = $("body").attr("data-github-base-sha1");\r
+       if(upstream && basesha1) {\r
+               Nitdoc.GitHub.UI.init(upstream, basesha1);\r
        }\r
 });\r
 \r
@@ -43,22 +44,23 @@ Nitdoc.GitHub.UI = function() {
        var user = false; // logged user\r
        var origin;\r
 \r
-       var init = function(originStr) {\r
-               console.log("init GitHub module (origin: "+ originStr +")");\r
+       var init = function(upstream, basesha1) {\r
+               console.log("init GitHub module (upstream: "+ upstream +", base: " + basesha1 + ")");\r
 \r
                // parse origin\r
-               var parts = originStr.split(":");\r
+               var parts = upstream.split(":");\r
                origin = {\r
                        user: parts[0],\r
                        repo: parts[1],\r
-                       branch: parts[2]\r
+                       branch: parts[2],\r
+                       sha: basesha1\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, session.branch);\r
-                       if(!user) {\r
+                       if(!user.login) {\r
                                console.log("Session found but authentification failed");\r
                                localStorage.clear();\r
                        }\r
@@ -68,7 +70,7 @@ Nitdoc.GitHub.UI = function() {
 \r
                // activate ui\r
                Nitdoc.GitHub.LoginBox.init("nav.main ul");\r
-               if(user) {\r
+               if(user && user.login) {\r
                        Nitdoc.GitHub.LoginBox.displayLogout(origin, user);\r
                        activate(user);\r
                } else {\r
@@ -90,12 +92,11 @@ Nitdoc.GitHub.UI = function() {
                saveSession(user);\r
                \r
                // check local storage synchro with branch\r
-               if(localStorage.latestCommit != user.latest.sha) {\r
-                       console.log("Latest commit changed: cleaned cache");\r
+               if(localStorage.base != origin.sha) {\r
+                       console.log("Base changed: cleaned cache");\r
                        localStorage.requests = "[]";\r
-                       localStorage.latestCommit = user.latest.sha;\r
+                       localStorage.base = origin.sha;\r
                }\r
-               console.log("Latest commit sha: " + localStorage.latestCommit);\r
 \r
                attachCommentEvents();\r
                reloadComments();\r
@@ -118,14 +119,17 @@ Nitdoc.GitHub.UI = function() {
        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
+                       return "error:login";\r
                }\r
-               // get lastest commit\r
-               var latest = Nitdoc.GitHub.API.getLastCommit(user);\r
-               if(!latest || !latest.sha) {\r
-                       return false;\r
+               // check github profile fields\r
+               if(!user.infos.name || !user.infos.email) {\r
+                       return "error:profile";\r
+               }\r
+               // check correct base commit\r
+               var commit = Nitdoc.GitHub.API.getCommit(user, origin.sha);\r
+               if(!commit || !commit.sha) {\r
+                       return "error:sha";\r
                }\r
-               user.latest = latest;\r
                return user;\r
        }\r
 \r
@@ -136,7 +140,7 @@ Nitdoc.GitHub.UI = function() {
                        //FIXME this should be done by nitdoc\r
                        var baseComment = $(this).parent().prev();\r
                        var location = Nitdoc.GitHub.Utils.parseLocation(baseComment.attr("data-comment-location"));\r
-                       var locString = "../" + location.path + ":" + location.lstart + "," + location.tabpos + "--" + location.lstart + ",0";\r
+                       var locString = location.path + ":" + location.lstart + "," + location.tabpos + "--" + location.lstart + ",0";\r
                        baseComment.attr("data-comment-location", locString);\r
                        $(this).html("<a class='nitdoc-github-editComment noComment'>add comment</a> for ");\r
                        $(this).addClass("nitdoc-github-editComment");\r
@@ -291,7 +295,7 @@ Nitdoc.GitHub.UI = function() {
                5. create the pull request\r
        */\r
        var pushChanges = function(infos) {\r
-               var baseTree = Nitdoc.GitHub.API.getTree(user, localStorage.latestCommit);\r
+               var baseTree = Nitdoc.GitHub.API.getTree(user, origin.sha);\r
                if(!baseTree.sha) {\r
                        Nitdoc.GitHub.ModalBox.open("Unable to locate base tree!", baseTree.status + ": " + baseTree.statusText, true);\r
                        return false;\r
@@ -309,13 +313,13 @@ Nitdoc.GitHub.UI = function() {
                        return false;\r
                }\r
                console.log("New tree: " + newTree.url);\r
-               var newCommit = Nitdoc.GitHub.API.createCommit(user, infos.message, localStorage.latestCommit, newTree);\r
+               var newCommit = Nitdoc.GitHub.API.createCommit(user, infos.message, baseTree.sha, newTree);\r
                if(!newCommit.sha) {\r
                        Nitdoc.GitHub.ModalBox.open("Unable to create new commit!", newCommit.status + ": " + newCommit.statusText, true);\r
                        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, origin, newCommit.sha);\r
+               var pullRequest = Nitdoc.GitHub.API.createPullRequest(user, infos.message.split("\n\n")[0], "Pull request from Nitdoc", 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
@@ -462,7 +466,7 @@ Nitdoc.GitHub.API = function() {
 \r
        // build signedoff user default signature\r
        var getSignedOff = function(user) {\r
-               return user.infos.name + " &lt;" + user.infos.email + "&gt;";\r
+               return user.infos.name + " <" + user.infos.email + ">";\r
        }\r
 \r
        // get the branches list from a repo\r
@@ -489,18 +493,18 @@ Nitdoc.GitHub.API = function() {
        /* GitHub commits */\r
 \r
        // get the latest commit on `branchName`\r
-       var getLastCommit = function(user) {\r
+       var getCommit = function(user, sha) {\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/" + user.branch,\r
+                       url: "https://api.github.com/repos/" + user.login + "/" + user.repo + "/git/commits/" + sha,\r
                        async: false,\r
                        dataType: 'json',\r
                        success: function(response) {\r
-                               res = response.object;\r
+                               res = response;\r
                        },\r
                        error: function(response) {\r
                                res = response;\r
@@ -688,7 +692,7 @@ Nitdoc.GitHub.API = function() {
 \r
        var api = {\r
                login: login,\r
-               getLastCommit: getLastCommit,\r
+               getCommit: getCommit,\r
                getBranches: getBranches,\r
                getTree: getTree,\r
                createBlob: createBlob,\r
@@ -871,8 +875,12 @@ Nitdoc.GitHub.LoginBox = function() {
                                        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, branch);\r
-                                       if(!user) {\r
+                                       if(user == "error:login") {\r
                                                Nitdoc.GitHub.ModalBox.open("Sign in error", "The username, password, repo or branch you entered is incorrect.", true);\r
+                                       } else if(user == "error:sha") {\r
+                                               Nitdoc.GitHub.ModalBox.open("Base commit not found", "The provided GitHub repository must contains the base commit '" + Nitdoc.GitHub.UI.getOrigin().sha + "'", true);\r
+                                       } else if(user == "error:profile") {\r
+                                               Nitdoc.GitHub.ModalBox.open("Incomplete GitHub profile", "Please set your public name and email in your <a href='https://github.com/settings/profile'>GitHub profile</a>.<br/><br/>Your public profile informations are used to sign-off your commits.", true);\r
                                        } else {\r
                                                Nitdoc.GitHub.UI.activate(user);\r
                                                var origin = Nitdoc.GitHub.UI.getOrigin();\r
@@ -1043,12 +1051,14 @@ Nitdoc.GitHub.ModalBox = function() {
                        $("#nitdoc-github-modal").addClass("nitdoc-github-error");\r
                }\r
 \r
-               $("#nitdoc-github-modal").css({\r
+               $("#nitdoc-github-modal")\r
+               .css({\r
                        top: "50%",\r
                        marginTop: -($("#nitdoc-github-modal").outerHeight() / 2) + "px",\r
                        left: "50%",\r
                        marginLeft: -($("#nitdoc-github-modal").outerWidth() / 2) + "px"\r
-               });\r
+               })\r
+               .find("button.nitdoc-github-button").focus();\r
        }\r
 \r
        // Close modal box instance\r
@@ -1123,7 +1133,7 @@ Nitdoc.GitHub.CommitBox = function() {
                                .append(\r
                                        $(document.createElement("label"))\r
                                        .attr("for", "nitdoc-github-commit-signedoff")\r
-                                       .append("Signed-off-by: " + infos.user.signedOff)\r
+                                       .text("Signed-off-by: " + infos.user.signedOff)\r
                                )\r
                        ).append(\r
                                $(document.createElement("div"))\r
@@ -1151,12 +1161,14 @@ Nitdoc.GitHub.CommitBox = function() {
                        )\r
                );\r
 \r
-               $("#nitdoc-github-commitBox").css({\r
+               $("#nitdoc-github-commitBox")\r
+               .css({\r
                        top: "50%",\r
                        marginTop: -($("#nitdoc-github-commitBox").outerHeight() / 2) + "px",\r
                        left: "50%",\r
                        marginLeft: -($("#nitdoc-github-commitBox").outerWidth() / 2) + "px"\r
-               });\r
+               })\r
+               .find("#nitdoc-github-commit-message").focus();\r
        }\r
 \r
        // Close commit box instance\r
@@ -1178,20 +1190,19 @@ Nitdoc.GitHub.CommitBox = function() {
  */\r
 \r
 Nitdoc.GitHub.Utils = function() {\r
-       // Extract infos from string location "../lib/standard/collection/array.nit:457,1--458,0"\r
-       //FIXME this should be done by nitdoc\r
+       // Extract infos from string location "lib/standard/collection/array.nit:457,1--458,0"\r
        var parseLocation = function(location) {\r
                var parts = location.split(":");\r
                var loc = new Object();\r
                loc.origin = location;\r
-               loc.path = parts[0].substr(3, parts[0].length);\r
+               loc.path = parts[0];\r
                loc.lstart = parseInt(parts[1].split("--")[0].split(",")[0]);\r
                loc.tabpos = parseInt(parts[1].split("--")[0].split(",")[1]);\r
                loc.lend = parseInt(parts[1].split("--")[1].split(",")[0]);\r
                return loc;\r
        }\r
 \r
-       // Meld modified comment into file content\r
+       // Meld modified comment into file conten\r
        var mergeComment = function(fileContent, comment, location) {\r
                // replace comment in file content\r
                var res = new String();\r