php warnings
[Pman.MTrack] / Merger.php
index 589842a..3a7c864 100644 (file)
@@ -18,6 +18,9 @@ require_once 'Pman.php';
 
 class Pman_MTrack_Merger extends Pman {
     
+    var $live = 'master';
+    var $release = 'github';
+    
     
     // function getAuth() - from log..
     function getAuth()
@@ -32,7 +35,7 @@ class Pman_MTrack_Merger extends Pman {
     }
     
     
-    function get($pi)
+    function get($pi, $opts= array())
     {
         
         $this->pi = 'default/roojs1'; // fixme..
@@ -47,13 +50,28 @@ class Pman_MTrack_Merger extends Pman {
         //if (!$this->projectPerm($this->repo->project_id, 'MTrack.Repos', 'S')) {
         //    $this->err("no perm for this repo ");
         //}
-          
-        $this->tree();
-        
+        if (isset($_REQUEST['_tree'])) {
+            $this->tree();
+        }
         
+        if (isset($_REQUEST['_changedFiles'])) {
+            $this->changedFiles($_REQUEST['_changedFiles']);
+        }
+        if (isset($_REQUEST['_preview'])) {
+            $this->preview($_REQUEST['_preview']);
+        }
+        if (isset($_REQUEST['_merge'])) {
+            $this->merge($_REQUEST['_merge']);
+        }
+        $this->jerr("invalid url");
         exit;
         
     }
+    
+    function post($pi) {
+        return $this->get($pi);
+    }
+    
     function tree()
     {
         
@@ -61,7 +79,7 @@ class Pman_MTrack_Merger extends Pman {
         $release = 'github';
          
         $this->repo->debug = 1;
-        $ar = $this->repo->history("/", null, "rev",  "$release..$live");
+        $ar = $this->repo->history("/", null, "rev",  "{$this->release}..{$this->live}");
         
         // the point of this is to extract all the revisions, and group them.
         
@@ -93,9 +111,9 @@ class Pman_MTrack_Merger extends Pman {
                 );
             }
             $days[$day]['children'][$time]['children'][] = array(
-                'title'=> $commit->changelog,
-                'text' => $commit->rev,
-                'left' => true
+                'text'=> $commit->changelog,
+                'rev' => $commit->rev,
+                'leaf' => true
             );
         }
         $out = array();
@@ -104,13 +122,148 @@ class Pman_MTrack_Merger extends Pman {
             $dcn = $do['children'];
             $do['children'] = array();
             foreach($dcn as $t=>$to) {
+                $to['rev']  = $to['children'][0]['rev'];
                 $do['children'][] = $to;
             }
+            $do['rev'] = $do['children'][0]['rev'];
             $out[] = $do;
         }
         
         $this->jdata($out);
         
+         
+        
+    }
+    
+    
+
+
+
+    function changedFiles($rev)
+    {
+        // list the files that have changed..
+        // in theory you could click a number of them and only merge those changes..
+        // need to do a git diff.. and just get a list of files..
+        
+        $rev = preg_replace('/[^a-z0-9]+/', '',$rev);
+        //$this->repo->impl()->debug = 1;
+        $fh = $this->repo->impl()->git('diff', '--numstat' ,  "{$this->release}..{$rev}", '--', "");
+        // returns ADDED \t REMOVED \t NAME (might include rename/etc. info)
+        $rows = array();
+        
+        while (false !== ($line = fgets($fh))) {
+            //var_Dump($line);
+            $ar = explode("\t", trim($line));
+            $rows[] = array(
+                'added' => $ar[0],
+                'removed' => $ar[1],
+                'filename' => $ar[2],
+            );
+            
+            
+        }
+        fclose($fh);
+        $this->jdata($rows);
+         
+
+    }
+    
+    
+
+    function preview($rev)
+    {
+        // list the files that have changed..
+        // in theory you could click a number of them and only merge those changes..
+        // need to do a git diff.. and just get a list of files..
+        
+        $rev = preg_replace('/[^a-z0-9]+/', '',$rev);
+        //$this->repo->impl()->debug = 1;
+        $files = '';
+        if (!empty($_POST['files'])) {
+            $files = json_decode($_POST['files']);
+        }
+        
+        
+        $fh = $this->repo->impl()->git('diff', "-w", "{$this->release}..{$rev}", '--', $files);
+        echo "<PRE> Commit: " . $rev ."</PRE>";
+        echo '<PRE>' . htmlspecialchars(stream_get_contents($fh)) . '</PRE>';
+        fclose($fh);
+        exit;
+         
+
+    }
+    
+    
+    function merge($rev)
+    {
+        
+        $mi = $this->repo->history("/", 1, "rev", $rev);
+       // echo '<PRE>';print_R($mi);exit;
+        
+
+        
+        
+        $wd = $this->repo->getWorkingCopy();
+        $wd->git('checkout', '-b', $this->release, 'remotes/origin/'. $this->release);
+        
+        
+        
+        $patchfile = $this->tempName('txt');
+        
+        $files = '';
+        if (!empty($_POST['files'])) {
+            
+           
+            // if we select all the files, we should do a merge, rather than a commit..
+            $files = $_POST['files'] == '_all_' ? '_all_' : json_decode($_POST['files']);
+        }
+        
+        
+        if (is_array($files)) { 
+            
+            $fh = $this->repo->impl()->git('diff',   "{$this->release}..{$rev}", '--', $files);
+            $of = fopen($patchfile, 'w');
+            stream_copy_to_stream($fh, $of);
+            fclose($of); fclose($fh);
+            //var_dump($patch);
+            $patch = System::which('patch');
+            chdir($wd->dir);
+            $cmd = "$patch -p1 < " . $patchfile;
+            `$cmd`;  //eg . patch -p1 < /var/lib/php5/MTrackTMPgZFeAN.txt
+        } else { 
+            $wd->git('merge', '--squash' , $rev);
+        }
+          
+        //echo $cmd;
+        
+        $commit = (object) array(
+            'when' =>  $mi[0]->ctime,
+            'reason' => $_REQUEST['message'],
+            'name'  => $this->authUser->name,
+            'email' => $this->authUser->email,
+        );
+        
+        $res = $wd->commit($commit);
+        if (!is_array($files)) {
+            // we do an actually merge commit seperatly from the merge diff, so that
+            // our logs show a nice history in each of those commits.
+            // not sure if this is a good idea or not..
+            $wd->git('merge', '-m', "Merge Commit with working branch (no code changed)" , $rev);
+        }
+        
+        
+        $res .= $wd->push();
+        $this->jok($res);
+        
+       // $wd->checkout($this->release);
+        // generate the patch
+        // apply the patch
+        // commit with message..
+        // push
+        
+        
+        
+        
         
         
         
@@ -119,4 +272,6 @@ class Pman_MTrack_Merger extends Pman {
     }
     
     
+    
+    
 }