NewBranch.bjs
[gitlive] / GitRepo.vala
index e18872b..21cf4de 100644 (file)
@@ -25,7 +25,9 @@ public class GitRepo : Object
     public string ahead_or_behind = "";
     
     public Gee.HashMap<string,bool> ignore_files;
-    public GitBranch currentBranch;
+     
+    public GitBranch  currentBranch;
+    
     public Gee.HashMap<string,GitBranch> branches; // accessed in GitBranch..
        public RooTicket? activeTicket;
     public Gee.HashMap<string,GitRepo> cache;
@@ -48,7 +50,7 @@ public class GitRepo : Object
     */
     public static int indexOf( Array<GitRepo> repos, string gitpath) {
         // make a fake object to compare against..
-        var test_repo = GitRepo.get(gitpath);
+        var test_repo = GitRepo.get_sync(gitpath);
         
         for(var i =0; i < repos.length; i++) {
             if (repos.index(i).gitdir == test_repo.gitdir) {
@@ -128,7 +130,7 @@ public class GitRepo : Object
                 continue;
             }
             
-               var rep =  GitRepo.get(  sp );
+               var rep =  GitRepo.get_sync(  sp );
                list_cache.append_val(rep);             
             
         }
@@ -137,13 +139,39 @@ public class GitRepo : Object
          
        }
        
-       public static GitRepo get(string path) 
+       public  static GitRepo get_sync(string path) 
        {
+               GitRepo ret;
                var cache = GitRepo.singleton().cache;
                if (cache.has_key(path)) {
-                       return cache.get(path);
+                       ret =  cache.get(path);
+               } else {
+                       ret =  new GitRepo(path);
                }
-               return new GitRepo(path);
+               return ret;
+       }
+        
+       public static  async  GitRepo? get(string path) 
+       {
+               
+               SourceFunc callback = GitRepo.get.callback;
+               GitRepo ret = null;
+               ThreadFunc<bool> run = () => {
+                       
+                       var cache = GitRepo.singleton().cache;
+                       if (cache.has_key(path)) {
+                               ret =  cache.get(path);
+                       } else {
+                               ret =  new GitRepo(path);
+                       }
+                       Idle.add((owned) callback);
+               return true;
+                       
+               };
+               new Thread<bool>("thread-new-gitrepo-" + path, run);
+               yield;
+               return ret;
+               
        }
        
     private GitRepo.single() {
@@ -927,7 +955,88 @@ public class GitRepo : Object
     
     }
     
+    
+    public async void doUpdate()
+    {
+       SourceFunc callback = this.doUpdate.callback;
+               GitRepo ret = null;
+               ThreadFunc<bool> run = () => {
+                       
+                       
+               // update the branches..
+                       this.loadBranches();
+
+                       //GLib.debug("connecting '%s'", r.get_url());
+                       string[] far = {};
+                       foreach(var br in this.branches.values) {
+                               if (br.remote == "" || br.remoterev == br.lastrev) {
+                                       continue;
+                               }
+                               far +=  ("+refs/heads/" + br.name + ":refs/remotes/" + br.remote);
+                       }
+                       if (far.length > 0) {
+                               GLib.debug("PUlling %s", this.name);
+                               var r = this.repo.lookup_remote("origin");
+                               r.connect(Ggit.Direction.FETCH, new GitCallbacks(this), null, null);
+                               var options = new Ggit.FetchOptions();
+                               options.set_remote_callbacks( new GitCallbacks(this));
+                               r.download(far, options);
+                       }
+                       this.loadStatus();
+                        
+               
+                       Idle.add((owned) callback);
+               return true;
+                       
+               };
+               new Thread<bool>("thread-new-gitpull-" + this.name, run);
+               yield;
+                  
+       
+    }
+    
+       
+       public static void updateAllAsync(string after)
+       {
  
+               
+               var doing = new  Gee.HashMap<string,bool>();;
+               
+               var tr =  GitRepo.singleton().cache;
+        
+       var update_all_total = tr.size;
+       foreach(var repo  in tr.values) {
+               if (!repo.is_managed()) {
+                       update_all_total--;                     
+                               continue;
+                       }
+                       doing.set(repo.name, true);
+                       repo.doUpdate.begin((obj, res) => {
+                               repo.doUpdate.end(res);
+                               doing.set(repo.name, false);
+                                
+                               foreach(var b in doing.keys) {
+                                       if (doing.get(b)) {
+                                               GLib.debug("pending: %s", b);
+                                               return;
+                                       }
+                               }
+                       
+                               
+                               switch (after) {
+                                       case "show_clones":
+                                               Clones.singleton().show();
+                                               break;
+                                       default:
+                                               GLib.debug("Unkown call after load = %s", update_all_after);            
+                                               break;
+                               }
+                       });
+               }
+
+       
+       }
+       
         
     
  
@@ -958,6 +1067,9 @@ public class GitRepo : Object
         } 
                GLib.debug("calls total = %d", (int) update_all_total);
     }
+    
+    
+    
     public static void  updateAllCallback(GitRepo repo, int err, string res)
     {
        repo.loadBranches();