NewBranch.bjs
[gitlive] / GitRepo.vala
index 42202d3..6664fdd 100644 (file)
@@ -18,6 +18,7 @@ public class GitRepo : Object
     public bool debug = false;
     
     public Gee.HashMap<string,bool> ignore_files;
+    public GitBranch currentBranch;
 
     /**
     * index of.. matching gitpath..
@@ -73,7 +74,7 @@ public class GitRepo : Object
                 }
                 
             } catch (Error e) {
-                print("Error: %s\n",e.message);
+                GLib.debug("Error: %s",e.message);
                 break;
             }
          
@@ -136,6 +137,69 @@ public class GitRepo : Object
         //Repo.superclass.constructor.call(this,cfg);
         
     } 
+    
+    
+    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;
+       
+    }
+    
+    public void setActiveTicket(RooTicket ticket)
+    {
+    
+    
+    }
+    
+    public void createBranchNamed(string branchname)
+    {
+        string[] cmd = { "checkout", "-b" , branchname  };
+        this.git(cmd);
+        
+    }
+    
+    
     /**
      * add:
      * add files to track.
@@ -163,14 +227,18 @@ public class GitRepo : Object
         
     public bool is_ignore(string fname) throws Error, SpawnError
     {
+               if (fname == ".gitignore") {
+                       this.ignore_files.clear();
+               }
+               
                if (this.ignore_files.has_key(fname)) {
                        return this.ignore_files.get(fname);
                }
                
                try {
                        var ret = this.git( { "check-ignore" , fname } );
-                       this.ignore_files.set(fname, ret == fname);
-                       return ret == fname;
+                       this.ignore_files.set(fname, ret.length >  0);
+                       return ret.length > 0;
                } catch (SpawnError e) {
                        this.ignore_files.set(fname, false);
                        return false;
@@ -207,6 +275,7 @@ public class GitRepo : Object
 
     }
     
+    
     /**
      * commit:
      * perform a commit.
@@ -267,8 +336,18 @@ public class GitRepo : Object
         return this.git( cmd );
 
         
-        
     }
+    
+    public delegate void GitAsyncCallback (GitRepo repo, int err, string str);
+    public void pull_async(GitAsyncCallback cb) 
+    {
+    
+        string[] cmd = { "pull" , "--no-edit" };
+         this.git_async( cmd , cb);
+         
+    
+    }
+    
     /**
      * push:
      * Send local changes to remote repo(s)
@@ -313,8 +392,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 = {};
@@ -333,9 +412,65 @@ 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;
     }
+       
+   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;
+        args +=  "--no-pager";
+        //if (this.gitdir != this.repopath) {
+        //    args +=   "--work-tree";
+         //   args += this.repopath; 
+        //}
+        for (var i = 0; i < args_in.length;i++) {
+            args += args_in[i];
+        }            
+
+        //this.lastCmd = args.join(" ");
+        //if(this.debug) {
+            GLib.debug( "CWD=%s",  this.git_working_dir ); 
+            //print( "cmd: %s\n", string.joinv (" ", args)); 
+        //}
 
+        string[]   env = {};
+        string  home = "HOME=" + Environment.get_home_dir() ;
+        env +=  home ;
+        // do not need to set gitpath..
+        //if (File.exists(this.repo + '/.git/config')) {
+            //env.push("GITPATH=" + this.repo );
+        //}
+        
+
+        var cfg = new SpawnConfig(this.git_working_dir , args , env);
+        cfg.async = true;
+       
+
+       // may throw error...
+        var sp = new Spawn(cfg);
+               //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();             
+    
+    
+    }
+    
 }