aboutsummaryrefslogtreecommitdiff
path: root/src/phorkie/Repository.php
diff options
context:
space:
mode:
authorChristian Weiske <cweiske@cweiske.de>2012-04-17 09:37:39 +0200
committerChristian Weiske <cweiske@cweiske.de>2012-04-17 09:37:39 +0200
commita4a47e2f9bd26259f0f6256a9652a39836c56a4d (patch)
tree61203155fdb54f3ea9392a7558a3033d1ca2dd61 /src/phorkie/Repository.php
parentcc15ad10baad6a6f217dfe42673f28c6d0a4dff9 (diff)
downloadphorkie-a4a47e2f9bd26259f0f6256a9652a39836c56a4d.tar.gz
phorkie-a4a47e2f9bd26259f0f6256a9652a39836c56a4d.zip
show history in sidebar
Diffstat (limited to 'src/phorkie/Repository.php')
-rw-r--r--src/phorkie/Repository.php83
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;
+ }
}
?>