// 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
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
\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
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
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
//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
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
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
\r
// build signedoff user default signature\r
var getSignedOff = function(user) {\r
- return user.infos.name + " <" + user.infos.email + ">";\r
+ return user.infos.name + " <" + user.infos.email + ">";\r
}\r
\r
// get the branches list from a repo\r
/* 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
\r
var api = {\r
login: login,\r
- getLastCommit: getLastCommit,\r
+ getCommit: getCommit,\r
getBranches: getBranches,\r
getTree: getTree,\r
createBlob: createBlob,\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, 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
$("#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
.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
)\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
*/\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