+
+ public bool is_master_branch()
+ {
+ // special branches that do not allow autopushing now...
+ return this.currentBranch.name == "master" || this.currentBranch.name == "roojs";
+
+ }
+ public void init_config()
+ {
+ this.config_cache = new Gee.HashMap<string,string>();
+ // managed =
+ if (this.get_config("managed") == "") {
+ this.set_config("managed", this.host == "git.roojs.com" ? "1" : "0");
+ }
+ if (this.get_config("autocommit") == "") {
+ this.set_config("autocommit", this.host == "git.roojs.com" ? "1" : "0");
+ }
+ if (this.get_config("autopush") == "") {
+ this.set_config("autopush", this.host == "git.roojs.com" ? "1" : "0");
+ }
+
+ }
+
+
+
+ public string get_config(string key) {
+
+ if (this.config_cache.has_key(key)) {
+ //GLib.debug("get_config %s = '%s'", key, this.config_cache.get(key));
+ return this.config_cache.get(key);
+ }
+ try {
+ var ret = this.git({ "config" , "gitlive." + key }).strip();
+ this.config_cache.set(key, ret);
+ //GLib.debug("get_config %s = '%s'", key, ret);
+ return ret;
+ } catch (Error e) {
+ this.config_cache.set(key, "");
+ //GLib.debug("get_config (fail) %s = '%s'", key, "");
+ return ""; // happens when there is nothing set...
+ }
+
+ }
+ public void set_config(string key, string value) {
+ this.git({ "config" , "gitlive." + key, value });
+ this.config_cache.set(key,value);
+ }
+
+ public bool is_managed()
+ {
+ return this.get_config("managed") == "1";
+ }
+
+
+ public bool is_autocommit ()
+ {
+ return this.get_config("autocommit") == "1";
+ }
+
+ public void set_autocommit(bool val)
+ {
+ this.set_config("autocommit", val ? "1" : "0");
+
+ }
+
+ public bool is_auto_branch ()
+ {
+ if (this.name == "gitlog") {
+ return false;
+ }
+ // check remote...
+ if (this.is_managed()) {
+ return true;
+ }
+ return false;
+
+
+ }
+
+ public void set_auto_branch(bool val)
+ {
+ if (this.name == "gitlog") {
+ return;
+ }
+ this.set_config("managed", val ? "1" : "0");
+
+ }
+ public bool is_autopush ()
+ {
+ return this.get_config("autopush") == "1";
+ }
+ public void set_autopush(bool val)
+ {
+ this.set_config("autopush", val ? "1" : "0");
+ }
+
+
+ public void loadStatus()
+ {
+ var r = this.git({ "status" , "--porcelain" });
+ this.git_status = r;
+ this.has_local_changes = r.length > 0;
+
+ var rs = this.git({ "status" , "-sb" });
+
+ this.ahead_or_behind = rs.contains("[ahead") ? "A" : (rs.contains("[behind") ? "B" : "");
+
+
+ this.git_diff = this.git({ "diff" , "HEAD", "--no-color" });
+ }
+
+
+ public void loadBranches()
+ {
+
+ GitBranch.loadBranches(this);
+ }
+
+
+
+
+ public string branchesToString()
+ {
+ var ret = "";
+ foreach( var br in this.branches.values) {
+ if (br.name == "") {
+ continue;
+ }
+ ret += ret.length > 0 ? "\n" : "";
+ ret += br.name;
+
+ }
+ return ret;
+
+ }
+ 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;
+ var ticket_id = this.get_config("ticket");
+
+ if (ticket_id.length < 1) {
+ return;
+ }
+ this.activeTicket = RooTicket.singleton().getById(ticket_id.strip());
+
+
+ }
+
+
+
+ public bool setActiveTicket(RooTicket? ticket, string branchname)
+ {
+ this.set_config("ticket", "");
+ if (!this.createBranchNamed(branchname)) {
+ return false;
+ }
+ this.set_config("ticket", ticket == null ? "": ticket.id);
+ this.activeTicket = ticket;
+ return true;
+ }
+
+ public bool createBranchNamed(string branchname)
+ {
+
+
+ if (this.branches.has_key(branchname)) {
+ this.switchToExistingBranchNamed(branchname);
+
+ } else {
+ this.createNewBranchNamed(branchname);
+
+ }
+ 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;
+ }
+ bool switchToExistingBranchNamed(string branchname)
+ {
+ var stash = false;
+ // this is where it get's tricky...
+ string files = "";
+ try {
+ string[] cmd = { "ls-files" , "-m" }; // list the modified files..
+ files = this.git(cmd);
+ stash = files.length> 1 ;
+
+
+ cmd = { "stash" };
+ if (stash) { this.git(cmd); }
+
+ this.pull();
+
+ 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();
+
+ }
+
+ } 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);
+ var fl = files.split("\n");
+ cmd = { "commit", "-m" , "Changed " + string.joinv("",fl) };
+ foreach(var f in fl) {
+ if (f.length < 1) continue;
+ cmd += f;
+ }
+ this.git(cmd);
+ }
+
+
+
+ } catch(Error ee) {
+ GitMonitor.gitmonitor.pauseError(ee.message);
+ return false;
+ }
+ this.push();
+ return true;
+
+ }
+
+
+
+ bool createNewBranchNamed(string branchname)
+ {
+ var stash = false;
+ try {
+ string[] cmd = { "ls-files" , "-m" }; // list the modified files..
+ var files = this.git(cmd);
+ stash = files.length> 1 ;
+
+ cmd = { "checkout", "-b" , branchname };
+ this.git(cmd);
+
+ cmd = { "push", "-u" , "origin" ,"HEAD" };
+ this.git(cmd);
+ if (stash) {
+
+ var fl = files.split("\n");
+ cmd = { "commit", "-m" , "Changed " + string.joinv("",fl) };
+ foreach(var f in fl) {
+ if (f.length < 1) continue;
+ cmd += f;
+ }
+ this.git(cmd);
+ this.push();
+ }
+
+
+ } catch(Error ee) {
+ GitMonitor.gitmonitor.pauseError(ee.message);
+ return false;
+ }
+ return true;
+
+ }
+
+
+