X-Git-Url: http://git.roojs.org/?p=gitlive;a=blobdiff_plain;f=GitRepo.vala;h=d1ee64539b2eb9d7c225a1f32ee43ad34e18fa3e;hp=a072592724890adc74579337dd4b5b9c8d71607d;hb=1b65514c93e260c86b738acbb13cf8ec2a39d596;hpb=9e641e366549656621a3e4fc4950b62c4b395650 diff --git a/GitRepo.vala b/GitRepo.vala index a0725927..d1ee6453 100644 --- a/GitRepo.vala +++ b/GitRepo.vala @@ -19,14 +19,17 @@ public class GitRepo : Object public string git_working_dir; public bool debug = false; public bool has_local_changes = false; + public string host = ""; public string git_status; public string git_diff; + public string ahead_or_behind = ""; public Gee.HashMap ignore_files; public GitBranch currentBranch; public Gee.HashMap branches; // accessed in GitBranch.. public RooTicket? activeTicket; public Gee.HashMap cache; + public Gee.HashMap config_cache; @@ -130,9 +133,7 @@ public class GitRepo : Object } return list_cache; - - } public static GitRepo get(string path) @@ -155,7 +156,8 @@ public class GitRepo : Object * */ - private GitRepo(string path) { + private GitRepo(string path) + { // cal parent? this.name = File.new_for_path(path).get_basename(); this.ignore_files = new Gee.HashMap(); @@ -172,79 +174,110 @@ public class GitRepo : Object if ( !cache.has_key(path) ) { cache.set( path, this); } + + var r = this.git({ "remote" , "get-url" , "--push" , "origin"}); + var uri = new Soup.URI(r); + this.host = uri.get_host(); + this.init_config(); + this.loadBranches(); this.loadActiveTicket(); this.loadStatus(); } - public bool is_wip_branch() + public bool is_master_branch() { - return this.currentBranch.name.has_prefix("wip_"); + // 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(); + // 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 bool is_autocommit () + + + 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 !FileUtils.test(this.gitdir + "/.gitlive-disable-autocommit" , FileTest.EXISTS); + return this.get_config("managed") == "1"; + } + + + public bool is_autocommit () + { + return this.get_config("autocommit") == "1"; } + public void set_autocommit(bool val) { - - var cur = this.is_autocommit(); - GLib.debug("SET auto commit : %s <= %s", val ? "ON" : "OFF", cur ? "ON" : "OFF"); - if (cur == val) { - return; // no change.. - } - if (!val) { - FileUtils.set_contents(this.gitdir + "/.gitlive-disable-autocommit" , "x"); - } else { - // it exists... - FileUtils.remove(this.gitdir + "/.gitlive-disable-autocommit" ); - } + this.set_config("autocommit", val ? "1" : "0"); } public bool is_auto_branch () { - return FileUtils.test(this.gitdir + "/.gitlive-enable-auto-branch" , FileTest.EXISTS); + if (this.name == "gitlog") { + return false; + } + // check remote... + if (this.is_managed()) { + return true; + } + return false; + + } public void set_auto_branch(bool val) { - - var cur = this.is_auto_branch(); - GLib.debug("SET auto branch : %s <= %s", val ? "ON" : "OFF", cur ? "ON" : "OFF"); - - if (cur == val) { - return; // no change.. - } - if (val) { - FileUtils.set_contents(this.gitdir + "/.gitlive-enable-auto-branch" , "x"); - } else { - // it exists... - FileUtils.remove(this.gitdir + "/.gitlive-enable-auto-branch" ); + if (this.name == "gitlog") { + return; } + this.set_config("managed", val ? "1" : "0"); } public bool is_autopush () { - return !FileUtils.test(this.gitdir + "/.gitlive-disable-autopush" , FileTest.EXISTS); + return this.get_config("autopush") == "1"; } public void set_autopush(bool val) { - - var cur = this.is_autopush(); - GLib.debug("SET auto push : %s <= %s", val ? "ON" : "OFF", cur ? "ON" : "OFF"); - if (cur == val) { - return; // no change.. - } - if (!val) { - FileUtils.set_contents(this.gitdir + "/.gitlive-disable-autopush" , ""); - } else { - // it exists... - FileUtils.remove(this.gitdir + "/.gitlive-disable-autopush" ); - } - + this.set_config("autopush", val ? "1" : "0"); } @@ -253,17 +286,33 @@ public class GitRepo : Object 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 bool hasBranchCalled(string name) + { + foreach( var br in this.branches.values) { + if (br.name == name) { + return true; + } + + } + return false; + } public string branchesToString() { @@ -272,8 +321,9 @@ public class GitRepo : Object if (br.name == "") { continue; } + var col = /hours/.match(br.age) ? "#ff851b" : "#ffdc00"; // orange or yellow ret += ret.length > 0 ? "\n" : ""; - ret += br.name; + ret += br.name + " " + br.age + ""; } return ret; @@ -301,18 +351,20 @@ public class GitRepo : Object } 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 master = this.hasBranchCalled("roojs") ? "roojs" : "master"; + var ret = ""; if (action == "CLOSE" || action == "LEAVE") { try { var oldbranch = this.currentBranch.name; - this.setActiveTicket(null, "master"); + this.setActiveTicket(null, master); string [] cmd = { "merge", "--squash", oldbranch }; this.git( cmd ); cmd = { "commit", "-a" , "-m", commit_message }; @@ -321,7 +373,7 @@ public class GitRepo : Object this.loadBranches(); // updates lastrev.. var notification = new Notify.Notification( - "Merged branch %s to master".printf(oldbranch), + "Merged branch %s to %s".printf(oldbranch, master), "", "dialog-information" @@ -344,10 +396,10 @@ public class GitRepo : Object if (action == "MASTER") { // merge master into ours.. try { - string[] cmd = { "merge", "master" }; + string[] cmd = { "merge", master}; this.git( cmd ); var notification = new Notify.Notification( - "Merged code from master to %s".printf(this.currentBranch.name), + "Merged code from %s to %s".printf(master,this.currentBranch.name), "", "dialog-information" @@ -364,7 +416,7 @@ public class GitRepo : Object if (action == "EXIT") { try { var oldbranch = this.currentBranch.name; - this.setActiveTicket(null, "master"); + this.setActiveTicket(null, master); this.loadBranches(); var notification = new Notify.Notification( "Left branch %s".printf(oldbranch), @@ -390,11 +442,8 @@ public class GitRepo : Object 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); + var ticket_id = this.get_config("ticket"); + if (ticket_id.length < 1) { return; } @@ -407,14 +456,11 @@ public class GitRepo : Object public bool setActiveTicket(RooTicket? ticket, string branchname) { + this.set_config("ticket", ""); 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.set_config("ticket", ticket == null ? "": ticket.id); this.activeTicket = ticket; return true; } @@ -447,8 +493,9 @@ public class GitRepo : Object } bool switchToExistingBranchNamed(string branchname) { + var master = this.hasBranchCalled("roojs") ? "roojs" : "master"; var stash = false; - // this is where it get's tricky... + // this is where it get's tricky... string files = ""; try { string[] cmd = { "ls-files" , "-m" }; // list the modified files.. @@ -468,15 +515,15 @@ public class GitRepo : Object return false; } try { - if (branchname != "master") { - string[] cmd = { "merge", "master" }; + if (branchname != master) { + string[] cmd = { "merge", master }; this.git(cmd); this.push(); } } catch(Error e) { - string[] cmd = { "checkout", "master" }; + 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( @@ -545,6 +592,51 @@ public class GitRepo : Object return true; } + + public static string previewMerges(string ticket_id) + { + var ret = ""; + foreach(var repo in GitRepo.singleton().cache.values) { + if (repo.activeTicket == null || repo.activeTicket.id != ticket_id) { + continue; + } + ret += repo.previewMerge() + "\n\n"; + + } + return ret; + + } + + + + public string previewMerge() + { + try { + var master = this.hasBranchCalled("roojs") ? "roojs" : "master"; + var lines = this.git({"log", master + "...", "--pretty=format:%H %P" }).split("\n");; + var head = this.git({"log", "-1", "--pretty=format:%H %P" }); + var start = head.split(" ")[0]; + var end = ""; + for (var i = 0; i < lines.length; i++) { + var cols = lines[i].split(" "); + if (cols.length > 2) { + end = cols[0]; + break; + } + } + if (end == "") { + var last = lines[lines.length-1]; + end = last.split(" ")[1]; + } + + return this.git({ "diff" , (end+".."+start), "--no-color" }); + } catch(Error ee) { + GitMonitor.gitmonitor.pauseError(ee.message); + return "Error getting diff"; + } + + + } @@ -751,16 +843,19 @@ public class GitRepo : Object //if (File.exists(this.repo + '/.git/config')) { //env.push("GITPATH=" + this.repo ); //} - - + var cfg = new SpawnConfig(this.git_working_dir , args , env); //cfg.debug = true; // may throw error... var sp = new Spawn(cfg); - - GLib.debug( "GOT: %s" , sp.output); + //GLib.debug( "GOT result: %d" , sp.result); + + // diff output is a bit big.. + if (args_in[0] != "diff") { + GLib.debug( "GOT: %s" , sp.output); + } // parse output for some commands ? return sp.output; } @@ -838,15 +933,19 @@ public class GitRepo : Object public static void updateAll(string after) { - update_all_after = after; - var tr = GitRepo.singleton().cache; - + update_all_after = after; + var tr = GitRepo.singleton().cache; - update_all_total = tr.size; - foreach(var repo in tr.values) { - repo.update_async(updateAllCallback); - } - + + update_all_total = tr.size; + foreach(var repo in tr.values) { + if (!repo.is_managed()) { + update_all_total--; + continue; + } + repo.update_async(updateAllCallback); + } + GLib.debug("calls total = %d", (int) update_all_total); } public static void updateAllCallback(GitRepo repo, int err, string res) { @@ -854,14 +953,19 @@ public class GitRepo : Object repo.loadStatus(); update_all_total--; + GLib.debug("calls remaining = %d", (int)update_all_total); if (update_all_total > 0 ) { + return; } + GLib.debug("call after load = %s", update_all_after); + switch (update_all_after) { case "show_clones": Clones.singleton().show(); break; default: + GLib.debug("Unkown call after load = %s", update_all_after); break; } return;