Fix #5633 - preview diffs before merge
[gitlive] / GitRepo.vala
index 6954437..08b3824 100644 (file)
@@ -303,7 +303,16 @@ public class GitRepo : Object
     }
      
     
-    
+    public bool hasBranchCalled(string name)
+    {
+       foreach( var br in this.branches.values) {
+                       if (br.name == name) {
+                               return true;
+                       }
+
+               }
+               return false;
+    }
     
     public string branchesToString()
     {
@@ -347,12 +356,14 @@ public class GitRepo : Object
     {
        // in theory we should check to see if other repo's have got the same branch and merge all them at the same time.
        // also need to decide which branch we will merge into?
+                       var master = this.hasBranchCalled("roojs") ? "roojs" : "master";
+       
                   var ret = "";
                   if (action == "CLOSE" || action == "LEAVE") {
                                   
                try {
                    var oldbranch = this.currentBranch.name;
-                   this.setActiveTicket(null, "master");
+                   this.setActiveTicket(null, master);
                           string [] cmd = { "merge",   "--squash",  oldbranch };
                           this.git( cmd );
                           cmd = { "commit",   "-a" , "-m",  commit_message };
@@ -361,7 +372,7 @@ public class GitRepo : Object
                           this.loadBranches(); // updates lastrev..
                
                       var notification = new Notify.Notification(
-                               "Merged branch %s to master".printf(oldbranch),
+                               "Merged branch %s to %s".printf(oldbranch, master),
                                "",
                                 "dialog-information"
                                
@@ -384,10 +395,10 @@ public class GitRepo : Object
        if (action == "MASTER") {
                // merge master into ours..
                        try {
-                       string[] cmd = { "merge",  "master" };
+                       string[] cmd = { "merge", master};
                        this.git( cmd );
                        var notification = new Notify.Notification(
-                                       "Merged code from master to %s".printf(this.currentBranch.name),
+                                       "Merged code from %s to %s".printf(master,this.currentBranch.name),
                                        "",
                                         "dialog-information"
                                        
@@ -404,7 +415,7 @@ public class GitRepo : Object
        if (action == "EXIT") {
                        try {
                        var oldbranch  = this.currentBranch.name;
-                         this.setActiveTicket(null, "master");
+                         this.setActiveTicket(null, master);
                        this.loadBranches();
                        var notification = new Notify.Notification(
                                        "Left branch %s".printf(oldbranch),
@@ -481,8 +492,9 @@ public class GitRepo : Object
     }
      bool switchToExistingBranchNamed(string branchname)
      {
+               var master = this.hasBranchCalled("roojs") ? "roojs" : "master";
                var stash = false;
-                                        // this is where it get's tricky...
+               // this is where it get's tricky...
                string files = "";
                try {                   
                                string[] cmd = { "ls-files" ,  "-m" };                   // list the modified files..
@@ -502,15 +514,15 @@ public class GitRepo : Object
                                return false;           
                  }
                try {
-                  if (branchname != "master") {
-                      string[] cmd = { "merge", "master"  };
+                  if (branchname != master) {
+                      string[] cmd = { "merge", master };
                            this.git(cmd);
                            this.push();
                       
                    }
                    
                } catch(Error e) {
-                   string[] cmd = { "checkout", "master"  };
+                   string[] cmd = { "checkout", master  };
                    this.git(cmd);
                        GitMonitor.gitmonitor.pauseError(
                                "Use\n\na) git checkout %s\nb) git mergetool\nc) git commit\nd) git push\n d) stash pop \ne) start gitlive again\n".printf(
@@ -579,6 +591,51 @@ public class GitRepo : Object
                        return true;
      
      }
+     
+     public static string previewMerges(string ticket_id)
+    {
+       var ret = "";
+       foreach(var  repo in GitRepo.singleton().cache.values) {
+           if (repo.activeTicket == null || repo.activeTicket.id != ticket_id) {
+                       continue;
+               }
+                       ret += repo.previewMerge() + "\n\n";
+
+       }
+       return ret;
+
+    }
+     
+     
+     
+     public string previewMerge()
+     {
+        try {                                  
+                       var master = this.hasBranchCalled("roojs") ? "roojs" : "master";
+                       var lines = this.git({"log", master + "...",  "--pretty=format:%H %P" }).split("\n");;
+                       var head = this.git({"log", "-1",  "--pretty=format:%H %P" });
+                       var start = head.split(" ")[0];
+                       var end = "";
+                       for (var i = 0; i < lines.length; i++) {
+                               var cols = lines[i].split(" ");
+                               if (cols.length > 2) {
+                                       end = cols[0];
+                                       break;
+                               }
+                       }
+                       if (end == "") {
+                               var last = lines[lines.length-1];
+                               end = last.split(" ")[1];                               
+                       }
+
+                       return this.git({ "diff" , (end+".."+start), "--no-color" });
+               }  catch(Error ee) {
+                       GitMonitor.gitmonitor.pauseError(ee.message);
+                       return "Error getting diff";            
+               }
+        
+     
+     }