X-Git-Url: http://git.roojs.org/?p=gitlive;a=blobdiff_plain;f=GitRepo.vala;h=ec10a014251de51ad6245dceb1b9b621b406da0b;hp=e51d150385e785aff1147aaf85f43718688eed04;hb=2a6a46caf4f1d149a8e72cb0fb0c90f9923a27bb;hpb=163700078c6ada686a42eabdef5527286daad90c diff --git a/GitRepo.vala b/GitRepo.vala index e51d1503..ec10a014 100644 --- a/GitRepo.vala +++ b/GitRepo.vala @@ -12,7 +12,7 @@ static GitRepo _GitRepo; public class GitRepo : Object { - public Array cmds; + public Gee.ArrayList cmds; public string name; public string gitdir; @@ -32,7 +32,7 @@ public class GitRepo : Object } return _GitRepo; } - + /** * index of.. matching gitpath.. */ @@ -159,7 +159,7 @@ public class GitRepo : Object if (!FileUtils.test(this.gitdir , FileTest.IS_DIR)) { this.gitdir = path; // naked... } - this.cmds = new Array (); + this.cmds = new Gee.ArrayList (); var cache = GitRepo.singleton().cache; //Repo.superclass.constructor.call(this,cfg); @@ -167,11 +167,12 @@ public class GitRepo : Object cache.set( path, this); } this.loadBranches(); + this.loadActiveTicket(); } public bool is_wip_branch() { - return this.currentBranch.name.has_prefix("wip_") + return this.currentBranch.name.has_prefix("wip_"); } @@ -179,6 +180,11 @@ public class GitRepo : Object { return !FileUtils.test(this.gitdir + "/.gitlive-disable-autocommit" , FileTest.EXISTS); } + + public bool is_auto_branch () + { + return FileUtils.test(this.gitdir + "/.gitlive-enable-auto-branch" , FileTest.EXISTS); + } public bool is_autopush () { return !FileUtils.test(this.gitdir + "/.gitlive-disable-autopush" , FileTest.EXISTS); @@ -225,20 +231,225 @@ public class GitRepo : Object return ret; } - RooTicket? ticket = null; + public static void doMerges(string action, string ticket_id, string commit_message) + { + GitMonitor.gitmonitor.stop(); + + var commitrevs = ""; + var sucess = true; + foreach(var repo in GitRepo.singleton().cache.values) { + if (repo.activeTicket != null && repo.activeTicket.id == ticket_id) { + var res = repo.doMerge(action,ticket_id, commit_message); + if (!res) { + sucess = false; + continue; + } + commitrevs += commitrevs.length > 0 ? " " : ""; + commitrevs += repo.currentBranch.lastrev; + } + } + if (sucess && action == "CLOSE") { + RooTicket.singleton().getById(ticket_id).close(commitrevs); + } + GitMonitor.gitmonitor.start(); + } + + + public bool doMerge(string action, string ticket_id, string commit_message) + { + // in theory we should check to see if other repo's have got the same branch and merge all them at the same time. + // also need to decide which branch we will merge into? + var ret = ""; + if (action == "CLOSE" || action == "LEAVE") { + + try { + var oldbranch = this.currentBranch.name; + this.setActiveTicket(null, "master"); + string [] cmd = { "merge", "--squash", oldbranch }; + this.git( cmd ); + cmd = { "commit", "-a" , "-m", commit_message }; + this.git( cmd ); + this.push(); + this.loadBranches(); // updates lastrev.. + + var notification = new Notify.Notification( + "Merged branch %s to master".printf(oldbranch), + "", + "dialog-information" + + ); + + notification.set_timeout(5); + notification.show(); + + // close ticket.. + return true; + + } catch (Error e) { + + GitMonitor.gitmonitor.pauseError(e.message); + return false; + } + // error~?? -- show the error dialog... + return false; + } + if (action == "MASTER") { + // merge master into ours.. + try { + string[] cmd = { "merge", "master" }; + this.git( cmd ); + var notification = new Notify.Notification( + "Merged code from master to %s".printf(this.currentBranch.name), + "", + "dialog-information" + + ); + notification.set_timeout(5); + notification.show(); + + return true; + } catch (Error e) { + GitMonitor.gitmonitor.pauseError(e.message); + return false; + } + } + if (action == "EXIT") { + try { + var oldbranch = this.currentBranch.name; + this.setActiveTicket(null, "master"); + this.loadBranches(); + var notification = new Notify.Notification( + "Left branch %s".printf(oldbranch), + "", + "dialog-information" + + ); + notification.set_timeout(5); + notification.show(); + + return true; + } catch (Error e) { + GitMonitor.gitmonitor.pauseError(e.message); + + return false; + } + // error~?? -- show the error dialog... + + } + return false; + } + + public void loadActiveTicket() + { + this.activeTicket = null; + if (!FileUtils.test(this.gitdir + "/.gitlive-active-ticket" , FileTest.EXISTS)) { + return; + } + string ticket_id; + FileUtils.get_contents(this.gitdir + "/.gitlive-active-ticket" , out ticket_id); + if (ticket_id.length < 1) { + return; + } + this.activeTicket = RooTicket.singleton().getById(ticket_id.strip()); + + + } + - public void setActiveTicket(RooTicket ticket, string branchname) + + public bool setActiveTicket(RooTicket? ticket, string branchname) { - this.createBranchNamed(branchname); - FileUtils.set_contents(this.gitdir + "/.gitlive-active-ticket" , ticket.id); + if (!this.createBranchNamed(branchname)) { + return false; + } + if (ticket != null) { + FileUtils.set_contents(this.gitdir + "/.gitlive-active-ticket" , ticket.id); + } else { + FileUtils.remove(this.gitdir + "/.gitlive-active-ticket" ); + } this.activeTicket = ticket; + return true; } - public void createBranchNamed(string branchname) - { - string[] cmd = { "checkout", "-b" , branchname }; - this.git(cmd); + public bool createBranchNamed(string branchname) + { + + var stash = false; + if (this.branches.has_key(branchname)) { + // this is where it get's tricky... + try { + string[] cmd = { "ls-files" , "-m" }; // list the modified files.. + var ret = this.git(cmd); + stash = ret.length> 1 ; + + + cmd = { "stash" }; + if (stash) { this.git(cmd); } + + cmd = { "checkout", branchname }; + this.git(cmd); + } catch(Error e) { + GitMonitor.gitmonitor.pauseError(e.message); + return false; + } + try { + if (branchname != "master") { + string[] cmd = { "merge", "master" }; + this.git(cmd); + this.push(); + //cmd = { "commit", "-a" , "-m", "merge master changes" }; + //git chethis.git( cmd ); + } + + } catch(Error e) { + string[] cmd = { "checkout", "master" }; + this.git(cmd); + GitMonitor.gitmonitor.pauseError( + "Use\n\na) git checkout %s\nb) git mergetool\nc) git commit\nd) git push\n d) stash pop \ne) start gitlive again\n".printf( + branchname) + + e.message + ); + return false; + + } + try { + string[] cmd = { "stash", "pop" }; + if (stash) { this.git(cmd); } + } catch(Error ee) { + GitMonitor.gitmonitor.pauseError(ee.message); + return false; + } + this.push(); + + } else { + try { + + string[] cmd = { "checkout", "-b" , branchname }; + this.git(cmd); + this.push(); + cmd = { "branch", "--set-upstream-to=origin/"+branchname , branchname }; + this.git(cmd); + + } catch(Error ee) { + GitMonitor.gitmonitor.pauseError(ee.message); + return false; + } + + } + var notification = new Notify.Notification( + "Changed to branch %s".printf(branchname), + "", + "dialog-information" + + ); + + notification.set_timeout(5); + notification.show(); + + this.loadBranches(); // update branch list... + //GitMonitor.gitmonitor.runQueue(); // no point - we have hidden the queue.. + return true; } @@ -248,14 +459,14 @@ public class GitRepo : Object * * @argument {Array} files the files to add. */ - public string add ( Array files ) throws Error, SpawnError + public string add ( Gee.ArrayList files ) throws Error, SpawnError { // should really find out if these are untracked files each.. // we run multiple versions to make sure that if one failes, it does not ignore the whole lot.. // not sure if that is how git works.. but just be certian. var ret = ""; - for (var i = 0; i < files.length;i++) { - var f = files.index(i).vname; + for (var i = 0; i < files.size;i++) { + var f = files.get(i).vname; try { string[] cmd = { "add", f }; this.git( cmd ); @@ -295,7 +506,7 @@ public class GitRepo : Object * * @argument {Array} files the files to add. */ - public string remove ( Array files ) throws Error, SpawnError + public string remove ( Gee.ArrayList files ) throws Error, SpawnError { // this may fail if files do not exist.. // should really find out if these are untracked files each.. @@ -303,8 +514,8 @@ public class GitRepo : Object // not sure if that is how git works.. but just be certian. var ret = ""; - for (var i = 0; i < files.length;i++) { - var f = files.index(i).vname; + for (var i = 0; i < files.size;i++) { + var f = files.get(i).vname; try { string[] cmd = { "rm", "-f" , f }; this.git( cmd ); @@ -332,7 +543,7 @@ public class GitRepo : Object * */ - public string commit ( string message, Array files ) throws Error, SpawnError + public string commit ( string message, Gee.ArrayList files ) throws Error, SpawnError { @@ -356,8 +567,8 @@ public class GitRepo : Object */ string[] args = { "commit", "-m" }; args += (message.length > 0 ? message : "Changed" ); - for (var i = 0; i< files.length ; i++ ) { - args += files.index(i).vname; // full path? + for (var i = 0; i< files.size ; i++ ) { + args += files.get(i).vname; // full path? } return this.git(args); @@ -401,7 +612,7 @@ public class GitRepo : Object public string push () throws Error, SpawnError { // should - return this.git({ "push", "origin", "HEAD" }); + return this.git({ "push" }); }