sync
[gitlive] / GitRepo.vala
index 2bfa2a1..ec10a01 100644 (file)
@@ -32,7 +32,7 @@ public class GitRepo : Object
         }
         return _GitRepo;
     }
-
     /**
     * index of.. matching gitpath..
     */
@@ -167,6 +167,7 @@ public class GitRepo : Object
                        cache.set( path, this);
        }
        this.loadBranches();
+       this.loadActiveTicket();
     } 
     
     public bool is_wip_branch()
@@ -179,6 +180,11 @@ public class GitRepo : Object
     {
        return !FileUtils.test(this.gitdir + "/.gitlive-disable-autocommit" , FileTest.EXISTS);
     }
+    
+    public bool is_auto_branch ()
+    {
+       return FileUtils.test(this.gitdir + "/.gitlive-enable-auto-branch" , FileTest.EXISTS);
+    }
     public bool is_autopush ()
     {
        return !FileUtils.test(this.gitdir + "/.gitlive-disable-autopush" , FileTest.EXISTS);
@@ -247,46 +253,44 @@ public class GitRepo : Object
        }
        GitMonitor.gitmonitor.start();
     }
-    
-
-
+     
 
     public bool doMerge(string action, string ticket_id, string commit_message)
     {
        // 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 ret = "";
-       if (action == "CLOSE" || action == "LEAVE") {
-                       
-                       try {
-                               var oldbranch = this.currentBranch.name;
-                               this.setActiveTicket(null, "master");
-                       string [] cmd = { "merge",   "--squash",  oldbranch };
-                       this.git( cmd );
-                        cmd = { "commit",   "--m",  commit_message };
-                       this.git( cmd );
-                       this.loadBranches(); // updates lastrev..
-                       
-                       var notification = new Notify.Notification(
-                                       "Merged branch %s to master".printf(oldbranch),
-                                       "",
-                                        "dialog-information"
-                                       
-                               );
-       
-                               notification.set_timeout(5);
-                               notification.show();   
-                       
-                       // close ticket..
-                       return true; 
-                       
-                   } catch (Error e) {
+                  var ret = "";
+                  if (action == "CLOSE" || action == "LEAVE") {
+                                  
+               try {
+                   var oldbranch = this.currentBranch.name;
+                   this.setActiveTicket(null, "master");
+                          string [] cmd = { "merge",   "--squash",  oldbranch };
+                          this.git( cmd );
+                          cmd = { "commit",   "-a" , "-m",  commit_message };
+                          this.git( cmd );
+                          this.push();
+                          this.loadBranches(); // updates lastrev..
+               
+                      var notification = new Notify.Notification(
+                               "Merged branch %s to master".printf(oldbranch),
+                               "",
+                                "dialog-information"
+                               
+                       );
 
-                       GitMonitor.gitmonitor.pauseError(e.message);
-                       return false;
-                   }
-                   // error~?? -- show the error dialog...
+                       notification.set_timeout(5);
+                       notification.show();   
+               
+               // close ticket..
+               return true; 
+               
+           } catch (Error e) {
+
+               GitMonitor.gitmonitor.pauseError(e.message);
+               return false;
+           }
+           // error~?? -- show the error dialog...
                    return false;
        }
        if (action == "MASTER") {
@@ -334,28 +338,103 @@ public class GitRepo : Object
        }
        return false;
     }
+        
+    public void loadActiveTicket()
+    {
+       this.activeTicket = null;
+       if (!FileUtils.test(this.gitdir + "/.gitlive-active-ticket" , FileTest.EXISTS)) {
+               return;
+       }
+       string ticket_id;
+       FileUtils.get_contents(this.gitdir + "/.gitlive-active-ticket" , out ticket_id);  
+       if (ticket_id.length < 1) {
+               return;
+               }
+               this.activeTicket = RooTicket.singleton().getById(ticket_id.strip());
+       
+       
+    }
+    
     
     
-   public bool setActiveTicket(RooTicket ticket, string branchname)
+    public bool setActiveTicket(RooTicket? ticket, string branchname)
     {
        if (!this.createBranchNamed(branchname)) {
                return false;
                }
-       FileUtils.set_contents(this.gitdir + "/.gitlive-active-ticket" , ticket.id);
+               if (ticket != null) {
+               FileUtils.set_contents(this.gitdir + "/.gitlive-active-ticket" , ticket.id);
+       } else {
+               FileUtils.remove(this.gitdir + "/.gitlive-active-ticket" );
+       }
        this.activeTicket = ticket;
        return true;
     }
     
     public bool createBranchNamed(string branchname)
-    {
-               
-               try {
+    {  
+               
+                       var stash = false;
                     if (this.branches.has_key(branchname)) {
-                           string[] cmd = { "checkout", branchname  };
-                           this.git(cmd);         
+                       // this is where it get's tricky...
+                               try {                   
+                                               string[] cmd = { "ls-files" ,  "-m" };                   // list the modified files..
+                                           var ret = this.git(cmd);
+                                           stash = ret.length> 1 ;
+                                           
+                                               
+                                           cmd = { "stash" };                  
+                                           if (stash) { this.git(cmd); }
+                                           
+                                           cmd = { "checkout", branchname  };
+                                           this.git(cmd);
+                                 } catch(Error e) {
+                                               GitMonitor.gitmonitor.pauseError(e.message);
+                                               return false;           
+                                 }
+                                 try {
+                                          if (branchname != "master") {
+                                              string[] cmd = { "merge", "master"  };
+                                                   this.git(cmd);
+                                                   this.push();
+                                              //cmd = { "commit",   "-a" , "-m",  "merge master changes" };
+                                      //git chethis.git( cmd );
+                                           }
+                                           
+                                  } catch(Error e) {
+                                           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(
+                                                               branchname)
+                                                        + e.message
+                                               );
+                                               return false;           
+                                        
+                                       }
+                                  try {                                        
+                                          string[]  cmd = { "stash", "pop"  };
+                                           if (stash) { this.git(cmd); }
+                                       } catch(Error ee) {
+                                               GitMonitor.gitmonitor.pauseError(ee.message);
+                                               return false;           
+                                       }
+                   this.push();
+                   
                    } else {
-                           string[] cmd = { "checkout", "-b" , branchname  };
-                           this.git(cmd);
+                                   try {                                       
+                                          
+                                       string[] cmd = { "checkout", "-b" , branchname  };
+                                       this.git(cmd);
+                       this.push();    
+                       cmd = { "branch", "--set-upstream-to=origin/"+branchname , branchname  };
+                                       this.git(cmd);
+                       
+                                       } catch(Error ee) {
+                                               GitMonitor.gitmonitor.pauseError(ee.message);
+                                               return false;           
+                                       }
+                           
                    }
                       var notification = new Notify.Notification(
                        "Changed to branch %s".printf(branchname),
@@ -367,14 +446,9 @@ public class GitRepo : Object
                notification.set_timeout(5);
                notification.show();   
        
-                   
-           } catch(Error e) {
-               GitMonitor.gitmonitor.pauseError(e.message);
-        return false;          
-           
-           }
+        
         this.loadBranches(); // update branch list...
-        GitMonitor.gitmonitor.runQueue(); // commit any outstanding...
+        //GitMonitor.gitmonitor.runQueue(); // no point - we have hidden the queue..
         return true;
     }
     
@@ -538,7 +612,7 @@ public class GitRepo : Object
     public string push () throws Error, SpawnError
     {
         // should 
-        return this.git({ "push", "origin", "HEAD" });
+        return this.git({ "push"  });
         
     }