Uncommited changes synced
[gitlive] / GitRepo.vala
index 21cf4de..9cb29f6 100644 (file)
@@ -26,7 +26,17 @@ public class GitRepo : Object
     
     public Gee.HashMap<string,bool> ignore_files;
      
-    public GitBranch  currentBranch;
+    public GitBranch  _currentBranch;
+    public GitBranch  getCurrentBranch() {
+       if (this._currentBranch == null) {
+               this.loadBranches();
+       }
+       if (this._currentBranch == null) {      
+               GLib.error("could not work out current branch?");
+               }
+               return this._currentBranch;
+    }
+    
     
     public Gee.HashMap<string,GitBranch> branches; // accessed in GitBranch..
        public RooTicket? activeTicket;
@@ -222,7 +232,7 @@ public class GitRepo : Object
     public bool is_master_branch()
     {
        // special branches that do not allow autopushing now...
-       return this.currentBranch.name == "master" || this.currentBranch.name == "roojs";
+       return this.getCurrentBranch().name == "master" || this.getCurrentBranch().name == "roojs";
                
     }
     public void init_config()
@@ -325,13 +335,13 @@ public class GitRepo : Object
                this.git_status = r;
                this.has_local_changes = r.length > 0;
                
-               var rs = this.git({ "status" , "-sb" });
-               
+               //var rs = this.git({ "status" , "-sb" });
+               var cb = this.getCurrentBranch();
                  
-               this.ahead_or_behind = rs.contains("[ahead") ? "A" : (rs.contains("[behind") ? "B" : "");
+               this.ahead_or_behind = cb.ahead > 0 ?  "A" : (cb.behind > 0  ? "B" : "");
                
                
-               this.git_diff  = this.git({ "diff" , "HEAD", "--no-color" });
+               this.git_diff  = this.diffWorking();
        }    
 
     
@@ -382,7 +392,7 @@ public class GitRepo : Object
                                continue;
                        }
                        commitrevs += commitrevs.length > 0 ? " " : "";
-                       commitrevs += repo.currentBranch.lastrev;
+                       commitrevs += repo.getCurrentBranch().lastrev;
                }
        }
        if (sucess && action == "CLOSE") {
@@ -402,7 +412,7 @@ public class GitRepo : Object
                   if (action == "CLOSE" || action == "LEAVE") {
                                   
                try {
-                   var oldbranch = this.currentBranch.name;
+                   var oldbranch = this.getCurrentBranch().name;
                    this.setActiveTicket(null, master);
                           string [] cmd = { "merge",   "--squash",  oldbranch };
                           this.git( cmd );
@@ -438,7 +448,7 @@ public class GitRepo : Object
                        string[] cmd = { "merge", master};
                        this.git( cmd );
                        var notification = new Notify.Notification(
-                                       "Merged code from %s to %s".printf(master,this.currentBranch.name),
+                                       "Merged code from %s to %s".printf(master,this.getCurrentBranch().name),
                                        "",
                                         "dialog-information"
                                        
@@ -454,7 +464,7 @@ public class GitRepo : Object
            }
        if (action == "EXIT") {
                        try {
-                       var oldbranch  = this.currentBranch.name;
+                       var oldbranch  = this.getCurrentBranch().name;
                          this.setActiveTicket(null, master);
                        this.loadBranches();
                        var notification = new Notify.Notification(
@@ -673,11 +683,32 @@ public class GitRepo : Object
                        GitMonitor.gitmonitor.pauseError(ee.message);
                        return "Error getting diff";            
                }
-        
-     
+         
      }
     
     
+    public string diffWorking()
+    {
+       var cb = this.getCurrentBranch();
+       GLib.debug("Calling diff working");
+       var diff = new Ggit.Diff.tree_to_workdir(this.repo, cb.getTree(), new Ggit.DiffOptions());
+       var ret = "";
+       diff.print(Ggit.DiffFormatType.PATCH, (delta, hunk, line) => {
+               switch(line.get_origin()) {
+                       case Ggit.DiffLineType.ADDITION: ret+="+"; break;
+                               case Ggit.DiffLineType.DELETION: ret+="-";break;
+                               case Ggit.DiffLineType.CONTEXT:  ret+=" ";break;
+                               case Ggit.DiffLineType.HUNK_HDR: break;                                 
+                               case Ggit.DiffLineType.FILE_HDR: break;
+                               default: ret+=" ";break;
+                       }
+               ret += " " + line.get_text() ;
+               return 0;
+       });
+       //GLib.debug("returning %s", ret);
+       return ret;
+    }    
+    
     
     /**
      * add: