nitdoc: Add an action on "Commit" button
authorStefan Lage <lagestfan@gmail.com>
Thu, 23 May 2013 21:11:12 +0000 (17:11 -0400)
committerStefan Lage <lagestfan@gmail.com>
Fri, 24 May 2013 02:26:49 +0000 (22:26 -0400)
This function start the commit process and return a message to inform
the user if the commit ended successfully or if there was an error during
commit

signed-off by: Stefan Lage <lagestfan@gmail.com>

share/nitdoc/scripts/js-facilities.js

index 75f618b..d2d331a 100644 (file)
@@ -2,6 +2,15 @@
 var userB64 = null;\r
 var sessionStarted = false;\r
 var editComment = 0;\r
+var currentfileContent = '';\r
+\r
+// SHA GitHub\r
+var shaLastCommit = "";\r
+var shaBaseTree;\r
+var shaNewTree;\r
+var shaNewCommit;\r
+var shaBlob;\r
+var shaMaster;\r
 \r
 /*\r
 * JQuery Case Insensitive :icontains selector\r
@@ -483,6 +492,34 @@ $(document).ready(function() {
                $('#modalQuestion').hide();\r
        });\r
 \r
+       $('#loginAction').click(function(){\r
+               var text;\r
+               var url;\r
+               var line;\r
+               // Look if the customer is logged\r
+               if(!sessionStarted){\r
+                       displayMessage("You need to be loggued before commit something", 100, 40);\r
+                       $('.popover').show();\r
+                       return;\r
+               }               \r
+               else{ userB64 = "Basic " + getUserPass("logginNitdoc"); }\r
+               githubRepo = repoName;\r
+               editComment -= 1;\r
+               commitMessage = $('#commitMessage').val();\r
+               if(commitMessage == ""){ commitMessage = "New commit";}\r
+               if(sessionStarted){\r
+                       if ($.trim(updateComment) == ''){ this.value = (this.defaultValue ? this.defaultValue : ''); }\r
+                       else{ startCommitProcess(); }\r
+           }   \r
+           $('#modal, #modalQuestion').fadeOut(function() {\r
+               $('#login').val("");\r
+                       $('#password').val("");\r
+                       $('textarea').hide();\r
+                       $('textarea').prev().show();\r
+               });\r
+           $('a[id=cancelBtn]').hide();\r
+               $('a[id=commitBtn]').hide();\r
+       });\r
 });\r
 \r
 /* Parse current URL and return anchor name */\r
@@ -532,6 +569,19 @@ function highlightBlock(a) {
        target.show();\r
 }\r
 \r
+// Init process to commit the new comment\r
+function startCommitProcess()\r
+{\r
+       var numL = preElement.attr("title");\r
+       commentLineStart = numL.split('-')[0] - 1;      \r
+       commentLineEnd = (commentLineStart + preElement.text().split('\n').length) - 1;\r
+       state = true;   \r
+       replaceComment(updateComment, currentfileContent);\r
+       getLastCommit();        \r
+       getBaseTree();  \r
+       editComment = false;\r
+}\r
+\r
 function displayLogginModal(){\r
        if ($('.popover').is(':hidden')) { $('.popover').show(); }\r
        else { $('.popover').hide(); }  \r
@@ -759,3 +809,209 @@ $.fn.spin = function(opts) {
   });\r
   return this;\r
 };\r
+\r
+function getLastCommit() \r
+{   \r
+       var urlHead = '';\r
+       if(sessionStarted){ urlHead = "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/refs/heads/"+branchName;}\r
+       else{ \r
+               // TODO: get url of the original repo.\r
+               return;\r
+       }\r
+\r
+    $.ajax({\r
+        beforeSend: function (xhr) { \r
+            if (userB64 != ""){ xhr.setRequestHeader ("Authorization", userB64); }\r
+        },\r
+        type: "GET",\r
+        url: urlHead,\r
+        dataType:"json",\r
+        async: false,\r
+        success: function(success)\r
+        {              \r
+            shaLastCommit = success.object.sha;            \r
+        }\r
+    });\r
+}\r
+\r
+function getBaseTree()\r
+{      \r
+    $.ajax({ \r
+        beforeSend: function (xhr) { \r
+            if (userB64 != ""){ xhr.setRequestHeader ("Authorization", userB64); }\r
+        },\r
+        type: "GET",\r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/commits/" + shaLastCommit,\r
+        dataType:"json",\r
+        async: false,\r
+        success: function(success)\r
+        {   \r
+            shaBaseTree = success.tree.sha;\r
+            if (state){ setBlob(); }\r
+            else{ return; }            \r
+        },\r
+        error: function(){\r
+               return;\r
+        }\r
+    });    \r
+}\r
+\r
+function setNewTree()\r
+{\r
+    $.ajax({ \r
+        beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", userB64); },\r
+        type: "POST",\r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/trees", \r
+        async: false,\r
+        data:'{ "base_tree" : "'+shaBaseTree+'", '+\r
+                '"tree":[{ '+\r
+                    '"path":"'+ pathFile +'",'+\r
+                    '"mode":"100644",'+\r
+                    '"type":"blob",'+\r
+                    '"sha": "'+ shaBlob +'"'+\r
+                '}] '+\r
+            '}',        \r
+        success: function(success)\r
+        { // si l'appel a bien fonctionné\r
+            shaNewTree = JSON.parse(success).sha;\r
+            setNewCommit();            \r
+        },\r
+        error: function(){\r
+               return;\r
+        }\r
+    });\r
+}\r
+\r
+function setNewCommit()\r
+{\r
+    $.ajax({ \r
+        beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", userB64); },\r
+        type: "POST",\r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/commits", \r
+        async: false,\r
+        data:'{ "message" : "'+ commitMessage +'", '+\r
+                '"parents" :"'+shaLastCommit+'",'+ \r
+                '"tree": "'+shaNewTree+'"'+\r
+             '}',        \r
+        success: function(success)\r
+        {\r
+            shaNewCommit = JSON.parse(success).sha;\r
+            commit();          \r
+        },\r
+        error: function(){\r
+               return;\r
+        }\r
+    });\r
+}\r
+\r
+//Create a commit\r
+function commit()\r
+{\r
+    $.ajax({ \r
+        beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", userB64); },\r
+        type: "POST",\r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/refs/heads/"+branchName, \r
+        data:'{ "sha" : "'+shaNewCommit+'", '+\r
+                '"force" :"true"'+\r
+             '}',\r
+        success: function(success) { displayMessage('Commit created successfully', 40, 40); },\r
+        error:function(error){ displayMessage('Error ' + JSON.parse(error).object.message, 40, 40); }\r
+    });\r
+}\r
+\r
+// Create a blob\r
+function setBlob()\r
+{\r
+    $.ajax({\r
+        beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization",  userB64); },\r
+        type: "POST",         \r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/blobs",         \r
+        async: false,\r
+        data:'{ "content" : "'+text.replace(/\r?\n/g, '\\n').replace(/\t/g, '\\t').replace(/\"/g,'\\"')+'", '+\r
+                '"encoding" :"utf-8"'+\r
+            '}',\r
+        success: function(success)\r
+        {            \r
+            shaBlob = JSON.parse(success).sha;\r
+            setNewTree();                  \r
+        },\r
+        error:function(error){ \r
+               displayMessage('Error : Problem parsing JSON', 40, 40); \r
+               return;\r
+       }\r
+    });\r
+}\r
+\r
+// Display file content\r
+function getFileContent(urlFile, newComment)\r
+{\r
+    $.ajax({\r
+        beforeSend: function (xhr) { \r
+            xhr.setRequestHeader ("Accept",  "application/vnd.github-blob.raw");\r
+            if (userB64 != ""){ xhr.setRequestHeader ("Authorization", userB64); }\r
+        },\r
+        type: "GET", \r
+        url: urlFile, \r
+        async:false,\r
+        success: function(success)\r
+        {\r
+            state = true;\r
+            replaceComment(newComment, success);            \r
+        }\r
+    });\r
+}\r
+\r
+function replaceComment(newComment, fileContent){\r
+       var arrayNew = newComment.split('\n');  \r
+       var lNew = arrayNew.length;\r
+       text = "";\r
+       var lines = fileContent.split("\n");\r
+       for (var i = 0; i < lines.length; i++) {\r
+               if(i == commentLineStart){\r
+                       // We change the comment\r
+                       for(var j = 0; j < lNew; j++){\r
+                               if(commentType == 1){ text += "\t# " + arrayNew[j] + "\n"; }\r
+                               else{\r
+                                       if(arrayNew[j] == ""){ text += "#"+"\n"; }\r
+                                       else{ text += "# " + arrayNew[j] + "\n"; }\r
+                               }\r
+                       }\r
+               }\r
+               else if(i < commentLineStart || i >= commentLineEnd){\r
+                       if(i == lines.length-1){ text += lines[i]; }\r
+                       else{ text += lines[i] + "\n"; }\r
+               }\r
+       }\r
+}\r
+\r
+function getCommentLastCommit(path){\r
+       var urlRaw;\r
+       getLastCommit();\r
+       if(shaLastCommit != ""){\r
+               if (checkCookie()) { urlRaw="https://rawgithub.com/"+ userName +"/"+ repoName +"/" + shaLastCommit + "/" + path; }\r
+               else{ urlRaw="https://rawgithub.com/StefanLage/"+ $('#repoName').attr('name') +"/" + shaLastCommit + "/" + path; }\r
+\r
+               $.ajax({  \r
+               type: "GET",                \r
+               url: urlRaw,        \r
+               async: false,\r
+               success: function(success)\r
+               {\r
+                       currentfileContent = success;   \r
+               }\r
+           });\r
+       }\r
+}\r
+\r
+function displayMessage(msg, widthDiv, margModal){\r
+       $('#modal').hide();\r
+       $('#btnCreateBranch').css('margin-left',widthDiv + '%');\r
+       $('#txtQuestion').text(msg);\r
+       $('#btnCreateBranch').text("Ok");\r
+       $('#btnCancelBranch').hide();\r
+       $('#modalQuestion').css({'left' : margModal + '%'})\r
+       $('#modalQuestion').show();\r
+       $('#modalQuestion').show().prepend('<a class="close"><img src="resources/icons/close.png" class="btnCloseQuestion" title="Close" alt="Close" /></a>');\r
+       $('body').append('<div id="fade"></div>');\r
+       $('#fade').css({'filter' : 'alpha(opacity=80)'}).fadeIn();\r
+}\r