diff options
| author | Christian Weiske <cweiske@cweiske.de> | 2012-04-17 09:37:39 +0200 |
|---|---|---|
| committer | Christian Weiske <cweiske@cweiske.de> | 2012-04-17 09:37:39 +0200 |
| commit | a4a47e2f9bd26259f0f6256a9652a39836c56a4d (patch) | |
| tree | 61203155fdb54f3ea9392a7558a3033d1ca2dd61 /src/phorkie/Repository.php | |
| parent | cc15ad10baad6a6f217dfe42673f28c6d0a4dff9 (diff) | |
| download | phorkie-a4a47e2f9bd26259f0f6256a9652a39836c56a4d.tar.gz phorkie-a4a47e2f9bd26259f0f6256a9652a39836c56a4d.zip | |
show history in sidebar
Diffstat (limited to 'src/phorkie/Repository.php')
| -rw-r--r-- | src/phorkie/Repository.php | 83 |
1 files changed, 82 insertions, 1 deletions
diff --git a/src/phorkie/Repository.php b/src/phorkie/Repository.php index 1a55af8..aa1ea4c 100644 --- a/src/phorkie/Repository.php +++ b/src/phorkie/Repository.php @@ -26,6 +26,15 @@ class Repository public $workDir; /** + * Revision of the repository that shall be shown + * + * @var string + */ + public $hash; + + + + /** * Load Repository data from GET-Request * * @return void @@ -42,6 +51,7 @@ class Repository } $this->id = (int)$_GET['id']; $this->loadDirs(); + $this->loadHash(); } protected function loadDirs() @@ -63,6 +73,25 @@ class Repository $this->workDir = $workDir; } + public function loadHash() + { + if ($this->hash !== null) { + return; + } + + $output = $this->getVc()->getCommand('log') + ->setOption('pretty', 'format:%H') + ->setOption('max-count', 1) + ->execute(); + $output = trim($output); + if (strlen($output) !== 40) { + throw new Exception( + 'Loading commit hash failed: ' . $output + ); + } + $this->hash = $output; + } + public function loadById($id) { if (!is_numeric($id)) { @@ -70,6 +99,7 @@ class Repository } $this->id = (int)$id; $this->loadDirs(); + $this->loadHash(); } public function getVc() @@ -147,13 +177,17 @@ class Repository * Get a link to the repository * * @param string $type Link type. Supported are: + * - "commit" * - "edit" + * - "delete" + * - "delete-confirm" * - "display" * - "fork" + * @param string $option * * @return string */ - public function getLink($type) + public function getLink($type, $option = null) { if ($type == 'edit') { return '/' . $this->id . '/edit'; @@ -165,6 +199,8 @@ class Repository return '/' . $this->id . '/delete'; } else if ($type == 'delete-confirm') { return '/' . $this->id . '/delete/confirm'; + } else if ($type == 'commit') { + return '/' . $this->id . '/' . $option; } throw new Exception('Unknown link type'); } @@ -177,6 +213,51 @@ class Repository } return null; } + + /** + * Returns the history of the repository. + * We don't use VersionControl_Git's rev list fetcher since it does not + * give us separate email addresses and names, and it does not give us + * the amount of changed (added/deleted) lines. + * + * @return array Array of history objects + */ + public function getHistory() + { + $output = $this->getVc()->getCommand('log') + ->setOption('pretty', 'format:commit %H%n%at%n%an%n%ae') + ->setOption('max-count', 10) + ->setOption('shortstat') + ->execute(); + + $arCommits = array(); + $arOutput = explode("\n", $output); + $lines = count($arOutput); + $current = 0; + while ($current < $lines) { + $commit = new Repository_Commit(); + list($name,$commit->hash) = explode(' ', $arOutput[$current]); + if ($name !== 'commit') { + throw new Exception( + 'Git log output format not as expected: ' . $arOutput[$current] + ); + } + $commit->committerTime = $arOutput[$current + 1]; + $commit->committerName = $arOutput[$current + 2]; + $commit->committerEmail = $arOutput[$current + 3]; + + $arLineParts = explode(' ', trim($arOutput[$current + 4])); + $commit->filesChanged = $arLineParts[0]; + $commit->linesAdded = $arLineParts[3]; + $commit->linesDeleted = $arLineParts[5]; + + $current += 6; + + $arCommits[] = $commit; + } + + return $arCommits; + } } ?> |
