X-Git-Url: http://git.roojs.org/?p=gitlive;a=blobdiff_plain;f=Monitor.vala;h=5b12963d5972dd94f8f87a77fa2f0f8bf7d3d1fb;hp=d708684473046fc4a51acef4af77c675b4ab146c;hb=refs%2Fheads%2Fwip_alan_T5632_cache_project_listing;hpb=05bc7d52bb58833f1a0da0d253846b3775e92a84 diff --git a/Monitor.vala b/Monitor.vala index d7086844..5b12963d 100644 --- a/Monitor.vala +++ b/Monitor.vala @@ -68,7 +68,12 @@ public delegate void onEventHander (FileMonitor fm, File f_orig, File of_orig, F * */ -public class Monitor : Object +public abstract class gitMonitorBase : Object +{ + public abstract void monitor(string path, int depth = 0); +} + +public class Monitor : gitMonitorBase { @@ -90,6 +95,8 @@ public class Monitor : Object */ public void add (string add) { + + print("Monitor.add: " + add); this.top.append_val(add); } /** @@ -134,10 +141,10 @@ public class Monitor : Object * * */ - public void monitor(string path, int depth = 0) + public override void monitor(string path, int depth = 0) { - print("ADD: " + path + "\n"); + //GLib.debug("ADD: (%d): %s\n", depth, path); //depth = typeof(depth) == 'number' ? depth *1 : 0; depth = depth > 0 ? depth *1 : 0; @@ -146,26 +153,21 @@ public class Monitor : Object //fn = fn || function (fm, f, of, event_type, uh) { // _this.onEvent(fm, f, of, event_type, uh); //} - - + var f = File.new_for_path(path); //var cancel = new Gio.Cancellable (); if (depth > 0) { try { - - var fm = f.monitor(FileMonitorFlags.SEND_MOVED,null); //Gio.FileMonitorFlags.SEND_MOVED + var fm = f.monitor(FileMonitorFlags.SEND_MOVED + FileMonitorFlags.WATCH_MOVES,null); + //var fm = f.monitor(FileMonitorFlags.WATCH_MOVES,null); - fm.changed.connect( ( fm, f_orig, of_orig, event_type) => { - //if (fn) { - this.onEvent (fm, f_orig, of_orig, event_type ) ; - // return; - //} - //this.onEvent (fm, f_orig, of_orig, event_type ) ; - }); + fm.changed.connect( this.onEvent ); this.monitors.append_val(fm); } catch (Error e) { + GLib.debug("Error adding monitor: %s\n", e.message); + GLib.debug("Try: \n\nsudo su\necho 512 > /proc/sys/fs/inotify/max_user_instances\n"); // FIXME -- show error? do nothing.. } // print("ADD path " + depth + ' ' + path); @@ -177,34 +179,43 @@ public class Monitor : Object // this.initRepo(path); //} FileEnumerator file_enum; + var cancellable = new Cancellable (); try { file_enum = f.enumerate_children( FileAttribute.STANDARD_DISPLAY_NAME + "," + FileAttribute.STANDARD_TYPE, - 0, // FileQueryInfoFlags.NONE, - null); + FileQueryInfoFlags.NOFOLLOW_SYMLINKS, // FileQueryInfoFlags.NONE, + cancellable); } catch (Error e) { // FIXME - show error.. return; } FileInfo next_file; - while (true) { - try { - next_file = file_enum.next_file(null); - } catch (Error e) { + while (cancellable.is_cancelled () == false ) { + try { + next_file = file_enum .next_file (cancellable); + } catch(Error e) { + print(e.message); break; } + if (next_file == null) { break; } + //print("got a file " + next_file.sudo () + '?=' + Gio.FileType.DIRECTORY); - + if (next_file.get_file_type() != FileType.DIRECTORY) { next_file = null; continue; } - - if (next_file.get_file_type() ==FileType.SYMBOLIC_LINK) { + + + //stdout.printf("Monitor.monitor: got file %s : type :%u\n", + // next_file.get_display_name(), next_file.get_file_type()); + + + if (next_file.get_is_symlink()) { next_file = null; continue; } @@ -260,25 +271,19 @@ public class Monitor : Object - public void onEvent(FileMonitor fm, File f_orig, File of_orig, FileMonitorEvent event_type) + public void onEvent(File f_orig, File? of_orig, FileMonitorEvent event_type) { if (this.paused) { return; } - print("onEvent"); + // print("onEvent\n"); var f = this.realpath(f_orig); - var of = this.realpath(of_orig); - - MonitorNamePathDir src = new MonitorNamePathDir( f.get_basename(), f.get_path() , Path.get_dirname(f.get_path())); - MonitorNamePathDir dest = null; + - if (of != null) { - dest = new MonitorNamePathDir( of.get_basename(), of.get_path(), Path.get_dirname(of.get_path())); - - } + //string event_name = "UKNOWN"; @@ -297,6 +302,7 @@ public class Monitor : Object //print ("got event: " + src.toString()); try { + switch(event_type) { case FileMonitorEvent.CHANGED: src.action = "changed"; @@ -324,11 +330,26 @@ public class Monitor : Object return; case FileMonitorEvent.MOVED: // eg. chmod/chatt + case FileMonitorEvent.MOVED_IN: // eg. chmod/chatt + case FileMonitorEvent.MOVED_OUT: // eg. chmod/chatt + case FileMonitorEvent.RENAMED: // eg. chmod/chatt + + var of = this.realpath(of_orig); + var dest = new MonitorNamePathDir( + of.get_basename(), + of.get_path(), + Path.get_dirname(of.get_path()) + ); + src.action = "moved"; dest.action = "moved"; this.onMoved(src,dest); return; - + + + default: + stdout.printf("event type not handled %u", event_type); + break; // rest are mount related - not really relivant.. maybe add later.. } } catch(Error e) { @@ -337,14 +358,15 @@ public class Monitor : Object } + /** override these to do stuff.. */ - public void initRepo(MonitorNamePathDir src) { } // called on startup at the top level repo dir. - public void onChanged(MonitorNamePathDir src) { } - public void onChangesDoneHint(MonitorNamePathDir src) { } - public void onDeleted(MonitorNamePathDir src) { } - public void onCreated(MonitorNamePathDir src) { } - public void onAttributeChanged(MonitorNamePathDir src) { } - public void onMoved(MonitorNamePathDir src,MonitorNamePathDir dest) { } + //public void initRepo(MonitorNamePathDir src) { } // called on startup at the top level repo dir. + public virtual void onChanged(MonitorNamePathDir src) { } + public virtual void onChangesDoneHint(MonitorNamePathDir src) { } + public virtual void onDeleted(MonitorNamePathDir src) { } + public virtual void onCreated(MonitorNamePathDir src) { } + public virtual void onAttributeChanged(MonitorNamePathDir src) { } + public virtual void onMoved(MonitorNamePathDir src,MonitorNamePathDir dest) { } }