NewBranch.bjs
[gitlive] / GitRepo.vala
index 06b6ddb..91feb4c 100644 (file)
@@ -18,6 +18,10 @@ public class GitRepo : Object
     public string gitdir;
     public string git_working_dir;
     public bool debug = false;
+    public bool has_local_changes = false;
+    public string git_status;    
+    public string git_diff;        
+    public string ahead_or_behind = "";
     
     public Gee.HashMap<string,bool> ignore_files;
     public GitBranch currentBranch;
@@ -127,9 +131,7 @@ public class GitRepo : Object
         }
     
         return list_cache;
-        
          
-          
        }
        
        public static GitRepo get(string path) 
@@ -180,6 +182,20 @@ public class GitRepo : Object
                
     }
     
+    public bool is_managed()
+    {
+       // is it a roojs origin?
+       var r = this.git({ "remote" , "get-url" , "--push" , "origin"});
+       var uri = new Soup.URI(r);
+       if (uri.get_host() != "git.roojs.com") { // we can only push to this url. -- unless we have forced it to be managed.
+               return FileUtils.test(this.gitdir + "/.gitlive-managed" , FileTest.EXISTS);
+       }
+       // otherwise see if unmanaged is set to disable it..
+       return !FileUtils.test(this.gitdir + "/.gitlive-unmanaged" , FileTest.EXISTS);  
+
+    }
+    
+    
     public bool is_autocommit ()
     {
        return !FileUtils.test(this.gitdir + "/.gitlive-disable-autocommit" , FileTest.EXISTS);
@@ -245,11 +261,24 @@ public class GitRepo : Object
     }
     
     
-    
+       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);
     }
      
@@ -681,7 +710,7 @@ public class GitRepo : Object
     public void pull_async(GitAsyncCallback cb) 
     {
     
-        string[] cmd = { "pull" , "--no-edit" };
+         string[] cmd = { "pull" , "--no-edit" };
          this.git_async( cmd , cb);
          
     
@@ -742,16 +771,17 @@ 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);
+       // 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;
     }
@@ -812,4 +842,56 @@ public class GitRepo : Object
     
     }
     
+        
+    
+    public void update_async(GitAsyncCallback cb) 
+    {
+         string[] cmd = { "fetch" , "--all" };
+         this.git_async( cmd , cb);
+         
+    }
+    
+    
+    static uint update_all_total = 0;
+    static string update_all_after = "";
+     
+    public static void updateAll(string after)
+    {
+               update_all_after = after;
+               var tr =  GitRepo.singleton().cache;
+            
+        
+       update_all_total = tr.size;
+       foreach(var repo  in tr.values) {
+                       if (!repo.is_managed()) {
+                       update_all_total--;                     
+                               continue;
+                       }
+           repo.update_async(updateAllCallback); 
+        } 
+
+    }
+    public static void  updateAllCallback(GitRepo repo, int err, string res)
+    {
+       repo.loadBranches();
+       repo.loadStatus();
+       
+       update_all_total--;
+       if (update_all_total > 0 ) {
+               return;
+               }
+               switch (update_all_after) {
+                       case "show_clones":
+                               Clones.singleton().show();
+                               break;
+                       default:
+                               break;
+               }
+               return;
+    }
+    
+    
+    
 }