Merge branch 'master' into milestone
[phorkie.git] / src / phorkie / Repository.php
index 6c71b4733006130fa06b915f7ddcec75001c3887..25b049cb1d91a4280ec1def1f770717907612ed6 100644 (file)
@@ -32,6 +32,12 @@ class Repository
      */
     public $hash;
 
+    /**
+     * Commit message of the last (or current) revision
+     *
+     * @var string
+     */
+    public $message;
 
 
     /**
@@ -56,6 +62,7 @@ class Repository
         $this->id = (int)$_GET['id'];
         $this->loadDirs();
         $this->loadHash();
+        $this->loadMessage();
     }
 
     protected function loadDirs()
@@ -97,6 +104,28 @@ class Repository
         $this->hash = $output;
     }
 
+    /**
+     * Populates $this->message
+     *
+     * @return void
+     */
+    public function loadMessage()
+    {
+        $rev = (isset($this->hash)) ? $this->hash : 'HEAD';
+        $output = $this->getVc()->getCommand('log')
+            ->setOption('oneline')
+            ->addArgument('-1')
+            ->addArgument($rev)
+            ->execute();
+        $output = trim($output);
+        if (strpos($output, ' ') > 0) {
+            $output = substr($output, strpos($output, ' '), strlen($output));
+            $this->message = trim($output);
+        } else {
+            $this->message = "This commit message intentionally left blank.";
+        }
+    }
+
     public function loadById($id)
     {
         if (!is_numeric($id)) {
@@ -118,6 +147,16 @@ class Repository
      * @return File[] Array of files
      */
     public function getFiles()
+    {
+        $files = $this->getFilePaths();
+        $arFiles = array();
+        foreach ($files as $name) {
+            $arFiles[] = new File($name, $this);
+        }
+        return $arFiles;
+    }
+
+    protected function getFilePaths()
     {
         if ($this->hash === null) {
             $hash = 'HEAD';
@@ -129,28 +168,23 @@ class Repository
             ->setOption('name-only')
             ->addArgument($hash)
             ->execute();
-        $files = explode("\n", trim($output));
-        $arFiles = array();
-        foreach ($files as $name) {
-            $arFiles[] = new File($name, $this);
-        }
-        return $arFiles;
+        return explode("\n", trim($output));
     }
 
     public function getFileByName($name, $bHasToExist = true)
     {
-        $base = basename($name);
-        if ($base != $name) {
-            throw new Exception('No directories supported for now');
-        }
+        $name = Tools::sanitizeFilename($name);
         if ($name == '') {
             throw new Exception_Input('Empty file name given');
         }
-        $fullpath = $this->workDir . '/' . $base;
-        if ($bHasToExist && !is_readable($fullpath)) {
-            throw new Exception_Input('File does not exist');
+
+        if ($bHasToExist) {
+            $files = $this->getFilePaths();
+            if (array_search($name, $files) === false) {
+                throw new Exception_Input('File does not exist');
+            }
         }
-        return new File($base, $this);
+        return new File($name, $this);
     }
 
     public function hasFile($name)
@@ -171,10 +205,23 @@ class Repository
      */
     public function delete()
     {
+        $db = new Database();
+        $db->getIndexer()->deleteRepo($this);
+
         return Tools::recursiveDelete($this->workDir)
             && Tools::recursiveDelete($this->gitDir);
     }
 
+    public function getTitle()
+    {
+        $desc = $this->getDescription();
+        if (trim($desc) != '') {
+            return $desc;
+        }
+
+        return 'paste #' . $this->id;
+    }
+
     public function getDescription()
     {
         if (!is_readable($this->gitDir . '/description')) {
@@ -210,6 +257,8 @@ class Repository
             return '/' . $this->id;
         } else if ($type == 'fork') {
             return '/' . $this->id . '/fork';
+        } else if ($type == 'doap') {
+            return '/' . $this->id . '/doap';
         } else if ($type == 'delete') {
             return '/' . $this->id . '/delete';
         } else if ($type == 'delete-confirm') {
@@ -261,10 +310,19 @@ class Repository
             $commit->committerName  = $arOutput[$current + 2];
             $commit->committerEmail = $arOutput[$current + 3];
 
+            if (substr($arOutput[$current + 4], 0, 1) != ' ') {
+                //commit without changed lines
+                $arCommits[] = $commit;
+                $current += 4;
+                continue;
+            }
+
             $arLineParts = explode(' ', trim($arOutput[$current + 4]));
             $commit->filesChanged = $arLineParts[0];
             $commit->linesAdded   = $arLineParts[3];
-            $commit->linesDeleted = $arLineParts[5];
+            if (isset($arLineParts[5])) {
+                $commit->linesDeleted = $arLineParts[5];
+            }
 
             $current += 6;