Fix up Git_Repo->log() to actually work.
authorEdward Z. Yang <edwardzyang@thewritingpot.com>
Sat, 19 Jul 2008 03:15:55 +0000 (18 23:15 -0400)
committerEdward Z. Yang <edwardzyang@thewritingpot.com>
Sat, 19 Jul 2008 03:15:55 +0000 (18 23:15 -0400)
Fix some minor code bugs. Also fix up logic errors in commit log parsing.
Finally, setup sample script.

Signed-off-by: Edward Z. Yang <edwardzyang@thewritingpot.com>
.gitignore [new file with mode: 0644]
library/Git.php
library/Git/Commit.php
library/Git/Repo.php
sample.php [new file with mode: 0644]
test-settings.sample.php [new file with mode: 0644]
tests/GitTest.php

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..bd8ce44
--- /dev/null
@@ -0,0 +1 @@
+test-settings.php
index 5571f2e..4e3cdcd 100644 (file)
@@ -73,8 +73,12 @@ class Git
     public function __call($method, $raw_args) {
         // split out "kwargs" (to be converted to options) from regular
         // "args" (which get inserted normally)
-        $kwargs = $raw_args[0];
         $args = array();
+        $kwargs = array();
+        foreach ($raw_args as $raw) {
+            if (is_array($raw)) $kwargs = $raw;
+            else $args[] = $raw;
+        }
         for ($i = 0; isset($kwargs[$i]); $i++) {
             $args[] = $kwargs[$i];
             unset($kwargs[$i]);
index 1bd8fcf..967feb6 100644 (file)
@@ -59,20 +59,23 @@ class Git_Commit {
      */
     public static function listFromString($repo, $text) {
         $lines = explode("\n", $text);
-        for ($i = 0, $c = count($lines); $i < $c; $i++) {
+        foreach ($lines as $k => $v) if (trim($v) === '') unset($lines[$k]);
+        $lines = array_values($lines);
+
+        for ($i = 0, $c = count($lines); $i < $c;) {
 
             $id   = self::_l($lines, $i, true);
             $tree = self::_l($lines, $i, true);
 
             $parents = array();
-            while ($lines && strncmp($lines[$i], 'parent', 6) === 0) {
+            while ($i < $c && strncmp($lines[$i], 'parent', 6) === 0) {
                 $parents[] = self::_l($lines, $i, true);
             }
             list($author, $authoredDate) = self::actor(self::_l($lines, $i));
             list($committer, $committedDate) = self::actor(self::_l($lines, $i));
 
             $messages = array();
-            while ($lines && strncmp($lines[$i], '    ', 4) === 0) {
+            while ($i < $c && strncmp($lines[$i], '    ', 4) === 0) {
                 $messages[] = trim(self::_l($lines, $i));
             }
 
index 9f60088..8c380dc 100644 (file)
@@ -69,7 +69,7 @@ class Git_Repo {
             $arg = array($commit);
         }
         $commits = $this->git->log($path, $options);
-        return Commit::listFromString($commits);
+        return Git_Commit::listFromString($this, $commits);
     }
 
     // public function diff($a, $b, $paths = array()) {
diff --git a/sample.php b/sample.php
new file mode 100644 (file)
index 0000000..9b834e0
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * @file
+ * Sample script. Assumes that this directory is a Git checkout.
+ */
+
+require_once 'library/Git.php';
+
+$repo = new Git_Repo('.');
+var_dump($repo->log());
diff --git a/test-settings.sample.php b/test-settings.sample.php
new file mode 100644 (file)
index 0000000..ba19ae5
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+/**
+ * @file
+ * Sample test settings file. Copy to 'test-settings.php' and customize as
+ * necessary.
+ */
+
+$simpletest = '/path/to/simpletest';
index a6a0cc1..605a157 100644 (file)
@@ -31,9 +31,9 @@ class GitTest extends UnitTestCase
     function testCall() {
         $git = new GitPartialMock();
         $git->__construct('dir');
-        $git->expectOnce('execute', array('git --git-dir=dir cherry-pick -s --no-commit f533ebca'));
+        $git->expectOnce('execute', array('git --git-dir=dir cherry-pick -s f533ebca --no-commit'));
         $git->setReturnValue('execute', $expect = 'Result');
-        $result = $git->cherryPick(array('--no-commit', 's' => true, 'f533ebca'));
+        $result = $git->cherryPick('f533ebca', array('--no-commit', 's' => true));
         $this->assertIdentical($result, $expect);
     }