GitMonitor.vala
[gitlive] / GitRepo.vala
index 014114f..e51d150 100644 (file)
@@ -7,9 +7,11 @@
  *
  *
  */
+static GitRepo  _GitRepo; 
 public class GitRepo : Object
 {
-    
+     
     public Array<GitMonitorQueue> cmds;
 
     public string name;
@@ -18,13 +20,25 @@ public class GitRepo : Object
     public bool debug = false;
     
     public Gee.HashMap<string,bool> ignore_files;
+    public GitBranch currentBranch;
+
+       public RooTicket? activeTicket;
+
+       public static GitRepo singleton()
+    {
+        if (_GitRepo == null) {
+            _GitRepo = new GitRepo.single();
+            _GitRepo.cache = new Gee.HashMap<string,GitRepo>();
+        }
+        return _GitRepo;
+    }
 
     /**
     * index of.. matching gitpath..
     */
     public static int indexOf( Array<GitRepo> repos, string gitpath) {
         // make a fake object to compare against..
-        var test_repo = new GitRepo(gitpath);
+        var test_repo = GitRepo.get(gitpath);
         
         for(var i =0; i < repos.length; i++) {
             if (repos.index(i).gitdir == test_repo.gitdir) {
@@ -35,15 +49,18 @@ public class GitRepo : Object
     
     }
     
+    public  Gee.HashMap<string,GitRepo> cache;
+    
+    
     
     public static   Array<GitRepo> list()
     {
-        
+
         //if (GitRepo.list_cache !=  null) {
         //    unowned  Array<GitRepo>    ret = GitRepo.list_cache;
          //   return ret;
         //}
-        
+        var cache = GitRepo.singleton().cache;
         var list_cache = new Array<GitRepo>();
         
         var dir = Environment.get_home_dir() + "/gitlive";
@@ -73,7 +90,7 @@ public class GitRepo : Object
                 }
                 
             } catch (Error e) {
-                print("Error: %s\n",e.message);
+                GLib.debug("Error: %s",e.message);
                 break;
             }
          
@@ -101,8 +118,8 @@ public class GitRepo : Object
                 continue;
             }
             
-             list_cache.append_val(new GitRepo(  sp )) ;
-             
+               var rep =  GitRepo.get(  sp );
+               list_cache.append_val(rep);             
             
         }
     
@@ -110,10 +127,20 @@ public class GitRepo : Object
         
          
           
-}
-    
-   
+       }
+       
+       public static GitRepo get(string path) 
+       {
+               var cache = GitRepo.singleton().cache;
+               if (cache.has_key(path)) {
+                       return cache.get(path);
+               }
+               return new GitRepo(path);
+       }
+       
+    private GitRepo.single() {
+               // used to create the signleton
+       }
     /**
      * constructor:
      * 
@@ -122,7 +149,7 @@ public class GitRepo : Object
      *
      */
      
-    public GitRepo(string path) {
+    private GitRepo(string path) {
         // cal parent?
         this.name =   File.new_for_path(path).get_basename();
         this.ignore_files = new Gee.HashMap<string,bool>();
@@ -133,9 +160,88 @@ public class GitRepo : Object
             this.gitdir = path; // naked...
         }
         this.cmds = new  Array<GitMonitorQueue> ();
-        //Repo.superclass.constructor.call(this,cfg);
         
+               var cache = GitRepo.singleton().cache;
+        //Repo.superclass.constructor.call(this,cfg);
+               if ( !cache.has_key(path) ) {
+                       cache.set( path, this);
+       }
+       this.loadBranches();
     } 
+    
+    public bool is_wip_branch()
+    {
+       return this.currentBranch.name.has_prefix("wip_")
+               
+    }
+    
+    public bool is_autocommit ()
+    {
+       return !FileUtils.test(this.gitdir + "/.gitlive-disable-autocommit" , FileTest.EXISTS);
+    }
+    public bool is_autopush ()
+    {
+       return !FileUtils.test(this.gitdir + "/.gitlive-disable-autopush" , FileTest.EXISTS);
+    }
+    
+    Gee.HashMap<string,GitBranch> branches;
+    
+    public void loadBranches()
+    {
+       this.branches = new Gee.HashMap<string,GitBranch>();
+       
+       string[] cmd = { "branch",   "--no-color", "--verbose", "--no-abbrev" , "-a"  };
+        var res = this.git( cmd );
+        var lines = res.split("\n");
+        for (var i = 0; i < lines.length ; i++) {
+               var br = new GitBranch(this);
+               if (!br.parseBranchListItem(lines[i])) {
+                       continue;
+               }
+               GLib.debug("add branch %s", br.realName());
+                
+               branches.set(br.realName(), br);
+               if (br.active) {
+                       this.currentBranch = br;
+               }
+        }
+    
+    }
+     
+    
+    
+    
+    public string branchesToString()
+    {
+       var ret = "";
+               foreach( var br in this.branches.values) {
+                       if (br.name == "") {
+                               continue; 
+                       }
+                       ret += ret.length > 0 ? ","  : "";
+                       ret += br.name;
+               
+               }
+               return ret;
+       
+    }
+    RooTicket? ticket = null;
+    
+    public void setActiveTicket(RooTicket ticket, string branchname)
+    {
+       this.createBranchNamed(branchname);
+       FileUtils.set_contents(this.gitdir + "/.gitlive-active-ticket" , ticket.id);
+       this.activeTicket = ticket;
+    }
+    
+    public void createBranchNamed(string branchname)
+    {
+        string[] cmd = { "checkout", "-b" , branchname  };
+        this.git(cmd);
+        this.loadBranches(); // update branch list...
+    }
+    
+    
     /**
      * add:
      * add files to track.
@@ -274,12 +380,13 @@ public class GitRepo : Object
         
     }
     
-    public delegate void GitAsyncCallback (string str);
-    public string pull_async(GitAsyncCallback cb) 
+    public delegate void GitAsyncCallback (GitRepo repo, int err, string str);
+    public void pull_async(GitAsyncCallback cb) 
     {
     
         string[] cmd = { "pull" , "--no-edit" };
-        return this.git_async( cmd , cb);
+         this.git_async( cmd , cb);
+         
     
     }
     
@@ -327,8 +434,8 @@ public class GitRepo : Object
 
         //this.lastCmd = args.join(" ");
         //if(this.debug) {
-            stdout.printf( "CWD=%s\n",  this.git_working_dir ); 
-            print( "cmd: %s\n", string.joinv (" ", args)); 
+            GLib.debug( "CWD=%s",  this.git_working_dir ); 
+            GLib.debug( "cmd: %s", string.joinv (" ", args)); 
         //}
 
         string[]   env = {};
@@ -347,16 +454,16 @@ public class GitRepo : Object
         var sp = new Spawn(cfg);
       
 
-        stdout.printf( "GOT: %s\n" , sp.output);
+        GLib.debug( "GOT: %s" , sp.output);
         // parse output for some commands ?
         return sp.output;
     }
        
-       
-       public string git_async( string[] args_in, unowned GitAsyncCallback cb ) throws Error, SpawnError
+   unowned GitAsyncCallback git_async_on_callback;
+       public void  git_async( string[] args_in,   GitAsyncCallback cb ) throws Error, SpawnError
     {
         // convert arguments.
-        
+       this.git_async_on_callback = cb;
         string[]  args = { "git" };
         //args +=  "--git-dir";
         //args +=  this.gitdir;
@@ -373,8 +480,8 @@ public class GitRepo : Object
 
         //this.lastCmd = args.join(" ");
         //if(this.debug) {
-            stdout.printf( "CWD=%s\n",  this.git_working_dir ); 
-            print( "cmd: %s\n", string.joinv (" ", args)); 
+            GLib.debug( "CWD=%s",  this.git_working_dir ); 
+            //print( "cmd: %s\n", string.joinv (" ", args)); 
         //}
 
         string[]   env = {};
@@ -392,11 +499,20 @@ public class GitRepo : Object
 
        // may throw error...
         var sp = new Spawn(cfg);
-        sp.run(((err) => {
-               cb(sp.output);
-        });
-        stdout.printf( "GOT: %s\n" , sp.output);
-        // parse output for some commands ?
-        return sp.output;
+               //sp.ref();
+        //this.ref();
+        sp.run(this.git_async_on_complete); 
+         
     }
+    
+    void git_async_on_complete(int err, string output)
+    {
+               GLib.debug("GOT %d : %s", err, output);
+               this.git_async_on_callback(this, err, output);
+//             this.unref();   
+       //      sp.unref();             
+    
+    
+    }
+    
 }