X-Git-Url: http://git.roojs.org/?p=gitlive;a=blobdiff_plain;f=GitMonitor.vala;h=1b11558f03dba3a900904694d23f1078d44e3f51;hp=20311eb9dde85eb0270f294ff1c41f946c1a2224;hb=62bcbeee7e77f9f8774f13569dc9fb5cc25666d6;hpb=cbcc5524f405d60b7b6e4d20b26b05aef2f045f1 diff --git a/GitMonitor.vala b/GitMonitor.vala index 20311eb9..1b11558f 100644 --- a/GitMonitor.vala +++ b/GitMonitor.vala @@ -1,153 +1,24 @@ +/** - +The monitor suffers from various issues - basically event flows while it's running... -public class GitMonitorQueue : MonitorNamePathDir { - // name = basename - // path = full path.. - // dir = dir path - - public string gitpath; - public string vdir; // relative path (within git) - public string vname; // relative filename (within git) - public string message ; // for commit - public bool commit_all; - - public GitMonitorQueue(MonitorNamePathDir f) { +normall operations - base(f.name, f.path, f.dir); +- monitors for file changes + -- adds to QUEUE when occurs. - this.message = ""; - this.commit_all = false; - - var vpath_ar = this.dir.substring(GitMonitor.gitlive.length +1).split("/", 0); - - if (vpath_ar[0].length < 1) { - - this.gitpath = ""; - this.vdir = ""; - this.vname = ""; - } - +- queue runs in background. + - if it's got stuff in it.. + - COMMIT (normally) + - now?? - if on master - try and branch + == do user selection, until we have branched + == then start monitoring again.. + - this.gitpath = GitMonitor.gitlive + "/" + vpath_ar[0]; - - string[] vpath = {}; - for (var i = 1; i< vpath_ar.length; i++) { - vpath += vpath_ar[i]; - } - this.vdir = string.joinv("/", vpath); - this.vname = this.vdir + (this.vdir.length > 0 ? "/" : "") + this.name; -/* - stdout.printf( - "NEW GitMonitorQueue\nname: %s\npath: %s\ndir: %s\n" + - "gitpath: %s\nvdir: %s\nvname: %s\n", - this.name, this.path, this.dir, - this.gitpath, this.vdir, this.vname - ); */ - //f.repo = new imports.Scm.Git.Repo({ repopath: f.gitpath }) - - - } - - public bool shouldIgnore() - { - - - // vim.. what a seriously brain dead program.. - if (this.name == "4913") { - return true; - } - - if (this.name[0] == '.') { - // except! - if (this.name == ".htaccess") { - return false; - } - - return true; - } - if (this.name[this.name.length -1] == '~') { - return true; - } - - //if (f.name.match(/~$/)) { - // return true; - //} - //if (f.name.match(/^nbproject/)) { - // return true; - //} - // ignore anything in top level!!!! - if (this.gitpath.length < 1) { - return true; - } - - return false; - } - - /** -- statics --*/ - - public static int indexOfAdd( Array add_files, string add) - { - for(var i =0; i < add_files.length; i++) { - if (add_files.index(i).vname == add) { - return i; - } - } - return -1; - } - public static int indexOfMessage(Array messages, string message) { - for(var i =0; i < messages.length; i++) { - if (messages.index(i).message == message) { - return i; - } - } - return -1; - } - public static string messageToString(Array messages ) { - string[] ret = {}; - for(var i =0; i < messages.length; i++) { - ret+= messages.index(i).message; - } - return string.joinv("\n",ret); - } - public static string queueArrayToString(Array list) { - var ret = ""; - for(var i =0; i < list.length; i++) { - - ret += (ret.length > 0 ? ", " : "") + list.index(i).vname; - } - return ret; - - } - - public static bool queueHas(Array list , GitMonitorQueue cmd_s, string action) { - for(var i =0; i < list.length; i++) { - var test = list.index(i); - if (list.index(i).gitpath != cmd_s.gitpath) { - continue; - } - if (list.index(i).vname != cmd_s.vname) { - continue; - } - if (list.index(i).action != action) { - continue; - } - return true; - } - return false; - } - public string fullpath() - { - return this.gitpath + "/" + this.vname; - } - - - -} @@ -163,42 +34,132 @@ public class GitMonitor : Monitor public static string gitlive; - public Array queue ; + private Gee.ArrayList queue ; public bool queueRunning = false; public DateTime lastAdd; - + + + + public GitMonitor () + { - public GitMonitor () { - this.queue = new Array(); + this.queue = new Gee.ArrayList(); GitMonitor.gitmonitor = this; + Timeout.add_full(Priority.LOW, 500, () => { + + //GLib.debug("TIMEOUT queue length = %d, is_runing = %s\n", (int)this.queue.length , this.queueRunning ? "Y" : "N"); + + //stdout.printf("QL %u: QR: %d\n", this.queue.length, this.queueRunning ? 1 : 0); + if (this.queue.size < 1 || this.queueRunning) { + return true; + } + var first = this.queue.get(0); + var delay = true; + + // eg. on master.... and is_auto branch + if (first.repo.is_master_branch() && first.repo.is_auto_branch()) { + delay = false; + } + + + var last = -1 * this.lastAdd.difference(new DateTime.now(new TimeZone.local())); + + // stdout.printf("LAST RUN: %s (expect %s) \n" , + // last.to_string(), (5 * TimeSpan.SECOND).to_string() ); + + if (delay && last < 5 * TimeSpan.SECOND) { // wait 5 seconds before running. ???? + return true; + } + //_this.lastAdd = new Date(); + //return 1; + + this.runQueue(); + return true; // + }); + } + public new void pauseError(string failure) + { + + var notification = new Notify.Notification( + "Git Live ERROR!!", + failure, + "dialog-information" + + ); + + notification.set_timeout(60); // show errros for longer + notification.show(); + + Canberra.Context context; + Canberra.Proplist props; + + Canberra.Context.create (out context); + Canberra.Proplist.create (out props); + + props.sets (Canberra.PROP_EVENT_ID, "phone-outgoing-busy"); + props.sets (Canberra.PROP_EVENT_DESCRIPTION, "Gitlive stopped on error"); + + + context.play_full (0, props, null); + + + this.paused = true; + this.queueRunning = false; + // what does this do to the old one... + //this.queue = new Gee.ArrayList (); + this.stop(); + StatusIconA.statusicon.pauseError(); + + var m = new Gtk.MessageDialog(null, Gtk.DialogFlags.MODAL,Gtk.MessageType.ERROR,Gtk.ButtonsType.CLOSE, + "A Serious problem occured running git, you will probably have to resolve this manually\n" + + "Committing is paused now, so fix the problem, close this window, then press start again\n\n\n" + + failure + ); + m.set_keep_above(true); + m.show(); + m.set_position(Gtk.WindowPosition.CENTER); + m.response.connect( (id_pressed) => { + m.hide(); + }); + + } public new void pause() { this.paused = true; // what does this do to the old one... - this.queue = new Array (); - StatusIconA.statusicon.set_from_stock( Gtk.Stock.MEDIA_PAUSE ); + //this.queue = new Gee.ArrayList (); + StatusIconA.statusicon.pause(); } + public void restoreQueue( Gee.ArrayList queue) + { + //used to restore teh queue after switch branches?/ - breaks our privte queue idea.. + this.queue = queue; + } + + /* public new void resume () { this.paused = false; this.queue = new Array (); - StatusIconA.statusicon.set_from_stock( Gtk.Stock.MEDIA_PLAY ); + StatusIconA.statusicon.resume(); } + */ /** * Start the monitoring * and run the queue every 500 milliseconds.. * */ - public new void start() { - StatusIconA.statusicon.set_from_stock( Gtk.Stock.REFRESH ); + public new void start() + { + StatusIconA.statusicon.refreshing(); this.lastAdd = new DateTime.now(new TimeZone.local()); @@ -210,8 +171,8 @@ public class GitMonitor : Monitor this.monitor(this.top.index(i) ); } - StatusIconA.statusicon.set_from_stock( Gtk.Stock.MEDIA_PLAY ); - + StatusIconA.statusicon.resume(); + this.paused = false; try { @@ -226,48 +187,28 @@ public class GitMonitor : Monitor notification.set_timeout(5); notification.show(); } catch(Error e) { - print(e.message); + GLib.debug("Error sending notification to screen: %s",e.message); } return false; // do not keep doing this.. }); - Timeout.add_full(Priority.LOW, 1000, () => { - //TIMEOUT", _this.queue.length , _this.queueRunning].join(', ')); - - //stdout.printf("QL %u: QR: %d\n", this.queue.length, this.queueRunning ? 1 : 0); - if (this.queue.length < 1 || this.queueRunning) { - return true; - } - - var last = -1 * this.lastAdd.difference(new DateTime.now(new TimeZone.local())); - - // stdout.printf("LAST RUN: %s (expect %s) \n" , - // last.to_string(), (5 * TimeSpan.SECOND).to_string() ); - - if (last < 5 * TimeSpan.SECOND) { // wait 5 seconds before running. ???? - return true; - } - //_this.lastAdd = new Date(); - //return 1; - this.runQueue(); - return true; // - }); } public new void stop() { - StatusIconA.statusicon.set_from_stock( Gtk.Stock.MEDIA_PAUSE );; + StatusIconA.statusicon.pause(); base.stop(); } - public new void monitor (string path, int depth = 0) + public override void monitor (string path, int depth = 0) { + //GLib.debug("GitMonitor : monitor %d %s", depth, path); //var depth = typeof(depth) == 'number' ? depth *1 : 0; @@ -277,6 +218,13 @@ public class GitMonitor : Monitor } if (depth == 1) { + + if (!FileUtils.test(path + "/.git" , FileTest.IS_DIR)) { + return; // skip non-git directories.. + } + + GitRepo.get(path); + // FIXME - check if repo is flagged as not autocommit.. //var repo = imports.Scm.Repo.Repo.get(path); //if (!repo || !repo.autocommit()) { @@ -305,22 +253,35 @@ public class GitMonitor : Monitor public void runQueue() { - if (this.paused) { + if (this.paused || this.queue.size < 1 ) { return; } - print("GitMonitor.runQueue\n"); + + foreach(var q in this.queue) { + if (!q.shouldIgnore() && q.repo.is_master_branch() && q.repo.is_auto_branch()) { + var oldq = this.queue; + this.queue = new Gee.ArrayList(); + NewBranch.singleton().show(q.repo, oldq); + + return; + } + + } + + + + GLib.debug("GitMonitor.runQueue size =%d\n", this.queue.size); this.queueRunning = true; - var cmds = new Array(); + var cmds = new Gee.ArrayList(); - for(var i = 0; i < this.queue.length; i++) { - cmds.append_val(this.queue.index(i)); + for(var i = 0; i < this.queue.size; i++) { + cmds.add(this.queue.get(i)); } - this.queue = new Array();// empty queue! - - + this.queue = new Gee.ArrayList();// empty queue! + string[] success = {}; string[] failure = {}; //var repos = new Array(); //?? @@ -336,47 +297,61 @@ public class GitMonitor : Monitor this.paused = true; - print("GitMonitor.runQueue - creating repos\n"); + var leave_queued = new Gee.ArrayList(); + GLib.debug("GitMonitor.runQueue - creating repos"); - for(var i = 0; i < cmds.length; i++) { + for(var i = 0; i < cmds.size; i++) { - var cmd = cmds.index(i); + var cmd = cmds.get(i); var gitpath = cmd.gitpath; - stdout.printf("GitMonitor.runQueue - finding %s\n", cmd.gitpath); + + var repo = GitRepo.get( gitpath ); + if ( repo.is_master_branch() && repo.is_auto_branch()) { + leave_queued.add(cmd); + continue; + } + + GLib.debug("GitMonitor.runQueue - finding %s", cmd.gitpath); - var ix = GitRepo.indexOf(repo_list, cmd.gitpath); + var ix = GitRepo.indexOf(repo_list, gitpath); if (ix < 0) { - repo_list.append_val(new GitRepo( gitpath )); + repo_list.append_val( GitRepo.get( gitpath )); ix = GitRepo.indexOf(repo_list, cmd.gitpath); } - stdout.printf("GitMonitor.runQueue - adding to repolist %d\n", ix); + GLib.debug("GitMonitor.runQueue - adding to repolist %d", ix); //if (typeof(repo_list[gitpath]) == 'undefined') { // repo_list[gitpath] = new imports.Scm.Git.Repo.Repo( { repopath : gitpath }); // repo_list[gitpath].cmds = []; // repo_list[gitpath].pull(); //} - repo_list.index(ix).cmds.append_val(cmd); + repo_list.index(ix).cmds.add(cmd); } + this.queue = leave_queued; + this.paused = false; // build add, remove and commit message list.. - print("GitMonitor.runQueue - creating actions\n"); + GLib.debug("GitMonitor.runQueue - creating actions"); for(var i = 0;i < repo_list.length;i++) { var repo = repo_list.index(i); - var add_files = new Array(); - var add_files_f = new Array(); - var remove_files = new Array(); - var messages = new Array(); + var add_files = new Gee.ArrayList(); + var add_files_f = new Gee.ArrayList(); + var remove_files = new Gee.ArrayList(); + var messages = new Gee.ArrayList(); //print(JSON.stringify(repo.cmds,null,4)); - for(var ii = 0;ii < repo.cmds.length;ii++) { - var cmd = repo.cmds.index(ii); + for(var ii = 0;ii < repo.cmds.size;ii++) { + var cmd = repo.cmds.get(ii); + + if (repo.is_ignore(cmd.vname)) { + continue; + } switch(cmd.action) { @@ -386,7 +361,7 @@ public class GitMonitor : Monitor break; } - add_files.append_val(cmd); + add_files.add(cmd); break; case "rm": @@ -399,14 +374,14 @@ public class GitMonitor : Monitor break; } - remove_files.append_val(cmd); + remove_files.add(cmd); break; case "commit" : if (GitMonitorQueue.indexOfMessage(messages, cmd.message) > -1 ) { break; } - messages.append_val(cmd); + messages.add(cmd); break; default: @@ -414,8 +389,12 @@ public class GitMonitor : Monitor break; } } - print( "ADD : %s\n", GitMonitorQueue.queueArrayToString(add_files)); - print( "REMOVE FILES: %s\n", GitMonitorQueue.queueArrayToString(remove_files)); + + repo.cmds.clear(); // reset the repo's command list.. + + GLib.debug( "ADD : %s", GitMonitorQueue.queueArrayToString(add_files)); + GLib.debug( "REMOVE FILES: %s", GitMonitorQueue.queueArrayToString(remove_files)); + //repo.debug = 1; // these can fail... at present... as we wildcard stuff. @@ -432,61 +411,71 @@ public class GitMonitor : Monitor */ // if file was added, then removed, - var remove_files_f = new Array(); - for(var ii = 0;ii < remove_files.length;ii++) { + var remove_files_f = new Gee.ArrayList(); + for(var ii = 0;ii < remove_files.size;ii++) { - if (GitMonitorQueue.indexOfAdd(add_files, remove_files.index(ii).vname) > -1 ) { + if (GitMonitorQueue.indexOfAdd(add_files, remove_files.get(ii).vname) > -1 ) { // in add and remove - do not remvove continue; } - remove_files_f.append_val(remove_files.index(ii)); + remove_files_f.add(remove_files.get(ii)); }; - for(var ii = 0;ii < add_files.length;ii++) { - if (GitMonitorQueue.indexOfAdd(remove_files, add_files.index(ii).vname) > -1 ) { + for(var ii = 0;ii < add_files.size;ii++) { + if (GitMonitorQueue.indexOfAdd(remove_files, add_files.get(ii).vname) > -1 ) { // the add file is in the remove list, and it does not exist - do not add it.. - print("check exists ? %s\n",add_files.index(ii).fullpath()); + print("check exists ? %s\n",add_files.get(ii).fullpath()); - if (!FileUtils.test(add_files.index(ii).fullpath(), FileTest.EXISTS)) { + if (!FileUtils.test(add_files.get(ii).fullpath(), FileTest.EXISTS)) { continue; } - } - - + } - add_files_f.append_val(add_files.index(ii)); + add_files_f.add(add_files.get(ii)); }; - print( "ADD : %s\n", GitMonitorQueue.queueArrayToString(add_files_f)); - print( "REMOVE FILES: %s\n", GitMonitorQueue.queueArrayToString(remove_files_f)); - - + GLib.debug( "ADD : %s", GitMonitorQueue.queueArrayToString(add_files_f)); + GLib.debug( "REMOVE FILES: %s", GitMonitorQueue.queueArrayToString(remove_files_f)); + + if (add_files_f.size < 1 && remove_files_f.size < 1) { + continue; + } + // make sure monitoring is paused so it does not recursively pick up // deletions + this.paused = true; + + try { + repo.pull(); } catch(Error e) { - failure += e.message; + this.pauseError(e.message); + //failure += e.message; + //print("Pull failed:\n"); + return; } - - + // -- DO STUFF.. try { repo.add(add_files_f); } catch(Error e) { + this.pauseError(e.message); + return; failure += e.message; + GLib.debug("Add failed:"); } try { repo.remove(remove_files_f); } catch(Error e) { + this.pauseError(e.message); + return; failure += e.message; + GLib.debug("Remove failed:"); } - - this.paused = false; - - + try { success += repo.commit( GitMonitorQueue.messageToString(messages), @@ -494,12 +483,32 @@ public class GitMonitor : Monitor ); success += repo.push(); + } catch(Error e) { - failure += e.message; + + // if the error is 'nothing to commit, working tree clean' + // then it's not an error, - just continue; + if (/nothing to commit, working tree clean/.match(e.message)) { + GLib.debug("%s",e.message); + success += e.message; + this.paused = false; + continue; + } + + + + this.paused = false; + this.pauseError(e.message); + + return; + //failure += e.message; + //print("Push failed:\n"); } + this.paused = false; } + // finally merge all the commit messages. try { @@ -518,20 +527,13 @@ public class GitMonitor : Monitor notification.show(); } - if (failure.length > 0) { + //if (failure.length > 0) { - var notification = new Notify.Notification( - "Git Live ERROR!!", - string.joinv("\n",failure), - "dialog-information" - - ); - - notification.set_timeout(5); // show errros for longer - notification.show(); - } + // should never get this far... + // this.pauseError(); + //} } catch(Error e) { - print(e.message); + GLib.debug(e.message); } this.queueRunning = false; @@ -552,7 +554,7 @@ public class GitMonitor : Monitor public override void onChanged(MonitorNamePathDir src) { - print("GitMonitor.onChanged\n"); + //print("GitMonitor.onChanged\n"); return; // always ignore this..? //this.parsePath(src); } @@ -565,19 +567,19 @@ public class GitMonitor : Monitor */ public override void onChangesDoneHint(MonitorNamePathDir src) { - print("GitMonitor.onChangedHint\n"); + if (this.paused) { return; } - + GLib.debug("GitMonitor.onChangedHint"); this.lastAdd = new DateTime.now(new TimeZone.local()); var cmd = new GitMonitorQueue(src); if (cmd.shouldIgnore()) { + GLib.debug("GitMonitor.onChangedHint - ignored"); return; } - //var add_it = false; /* if (this.is_just_created(cmd.path)) { @@ -595,21 +597,22 @@ public class GitMonitor : Monitor } */ cmd.action = "add"; - this.queue.append_val(cmd); + this.queue.add(cmd); cmd = new GitMonitorQueue(src); cmd.action = "commit"; cmd.message = cmd.vname; - this.queue.append_val(cmd); + this.queue.add(cmd); } public override void onDeleted(MonitorNamePathDir src) { - print("GitMonitor.onDeleted\n"); + if (this.paused) { return; } + GLib.debug("GitMonitor.onDeleted"); this.lastAdd = new DateTime.now(new TimeZone.local()); var cmd = new GitMonitorQueue(src); if (cmd.shouldIgnore()) { @@ -618,21 +621,22 @@ public class GitMonitor : Monitor // should check if monitor needs removing.. // it should also check if it was a directory.. - so we dont have to commit all.. cmd.action = "rm"; - this.queue.append_val(cmd); + this.queue.add(cmd); cmd = new GitMonitorQueue(src); cmd.action = "commit"; cmd.message = cmd.vname; cmd.commit_all = true; - this.queue.append_val(cmd); + this.queue.add(cmd); } public override void onCreated(MonitorNamePathDir src) { - print("GitMonitor.onCreated\n"); + if (this.paused) { return; } + GLib.debug("GitMonitor.onCreated"); this.lastAdd = new DateTime.now(new TimeZone.local()); var cmd = new GitMonitorQueue(src); if (cmd.shouldIgnore()) { @@ -658,11 +662,13 @@ public class GitMonitor : Monitor } - public override void onAttributeChanged(MonitorNamePathDir src) { - print("GitMonitor.onAttributeChanged\n"); + public override void onAttributeChanged(MonitorNamePathDir src) + { + if (this.paused) { return; } + GLib.debug("GitMonitor.onAttributeChanged %s", src.name); if (src.dir == GitMonitor.gitlive) { return; // attribute on top level.. } @@ -673,20 +679,21 @@ public class GitMonitor : Monitor return; } cmd.action = "add"; - this.queue.append_val(cmd); + this.queue.add(cmd); cmd = new GitMonitorQueue(src); cmd.action = "commit"; cmd.message = "Attribute changed " + cmd.vname; - this.queue.append_val(cmd); + this.queue.add(cmd); } public override void onMoved(MonitorNamePathDir src,MonitorNamePathDir dest) { - print("GitMonitor.onMoved\n"); + if (this.paused) { return; } + GLib.debug("GitMonitor.onMoved"); this.lastAdd = new DateTime.now(new TimeZone.local()); var cmd_s = new GitMonitorQueue(src); @@ -710,21 +717,18 @@ public class GitMonitor : Monitor if (cmd_d.shouldIgnore()) { this.onDeleted(src); - - return; } - - - print("RM: %s\n", cmd_s.vname); + + GLib.debug("RM: %s", cmd_s.vname); cmd_s.action = "rm"; - this.queue.append_val(cmd_s); + this.queue.add(cmd_s); - print("ADD: %s\n", cmd_d.vname); + GLib.debug("ADD: %s", cmd_d.vname); cmd_d.action = "add"; - this.queue.append_val(cmd_d); + this.queue.add(cmd_d); var cmd = new GitMonitorQueue(dest); @@ -734,7 +738,7 @@ public class GitMonitor : Monitor cmd.message = cmd_d.vname; } - this.queue.append_val(cmd); + this.queue.add(cmd);