diff options
Diffstat (limited to '3rdparty/granite/git/repository.php')
-rw-r--r-- | 3rdparty/granite/git/repository.php | 293 |
1 files changed, 0 insertions, 293 deletions
diff --git a/3rdparty/granite/git/repository.php b/3rdparty/granite/git/repository.php deleted file mode 100644 index 30b58a39f5a..00000000000 --- a/3rdparty/granite/git/repository.php +++ /dev/null @@ -1,293 +0,0 @@ -<?php -/** - * Repository - provides a 'repository' object with a set of helper methods - * - * PHP version 5.3 - * - * @category Git - * @package Granite - * @author Craig Roberts <craig0990@googlemail.com> - * @license http://www.opensource.org/licenses/mit-license.php MIT Expat License - * @link http://craig0990.github.com/Granite/ - */ - -namespace Granite\Git; -use \InvalidArgumentException as InvalidArgumentException; -use \UnexpectedValueException as UnexpectedValueException; - -/** - * Repository represents a Git repository, providing a variety of methods for - * fetching objects from SHA-1 ids or the tip of a branch with `head()` - * - * @category Git - * @package Granite - * @author Craig Roberts <craig0990@googlemail.com> - * @license http://www.opensource.org/licenses/mit-license.php MIT Expat License - * @link http://craig0990.github.com/Granite/ - */ -class Repository -{ - - /** - * The path to the repository root - */ - private $_path; - /** - * The indexed version of a commit, ready to write with `commit()` - */ - private $idx_commit; - /** - * The indexed version of a tree, modified to with `add()` and `remove()` - */ - private $idx_tree; - - /** - * Sets the repository path - * - * @param string $path The path to the repository root (i.e. /repo/.git/) - */ - public function __construct($path) - { - if (!is_dir($path)) { - throw new InvalidArgumentException("Unable to find directory $path"); - } elseif (!is_readable($path)) { - throw new InvalidArgumentException("Unable to read directory $path"); - } elseif (!is_dir($path . DIRECTORY_SEPARATOR . 'objects') - || !is_dir($path . DIRECTORY_SEPARATOR . 'refs') - ) { - throw new UnexpectedValueException( - "Invalid directory, could not find 'objects' or 'refs' in $path" - ); - } - - $this->_path = $path; - $this->idx_commit = $this->factory('commit'); - $this->idx_tree = $this->factory('tree'); - } - - /** - * Returns an object from the Repository of the given type, with the given - * SHA-1 id, or false if it cannot be found - * - * @param string $type The type (blob, commit, tag or tree) of object being - * requested - * @param string $sha The SHA-1 id of the object (or the name of a tag) - * - * @return Blob|Commit|Tag|Tree - */ - public function factory($type, $sha = null) - { - if (!in_array($type, array('blob', 'commit', 'tag', 'tree'))) { - throw new InvalidArgumentException("Invalid type: $type"); - } - - if ($type == 'tag') { - $sha = $this->_ref('tags' . DIRECTORY_SEPARATOR . $sha); - } - $type = 'Granite\\Git\\' . ucwords($type); - - return new $type($this->_path, $sha); - } - - /** - * Returns a Commit object representing the HEAD commit - * - * @param string $branch The branch name to lookup, defaults to 'master' - * - * @return Commit An object representing the HEAD commit - */ - public function head($branch = 'master', $value = NULL) - { - if ($value == NULL) - return $this->factory( - 'commit', $this->_ref('heads' . DIRECTORY_SEPARATOR . $branch) - ); - - file_put_contents( - $this->_path . DIRECTORY_SEPARATOR - . 'refs' . DIRECTORY_SEPARATOR - . 'heads' . DIRECTORY_SEPARATOR . 'master', - $value - ); - } - - /** - * Returns a string representing the repository's location, which may or may - * not be initialised - * - * @return string A string representing the repository's location - */ - public function path() - { - return $this->_path; - } - - /** - * Returns an array of the local branches under `refs/heads` - * - * @return array - */ - public function tags() - { - return $this->_refs('tags'); - } - - /** - * Returns an array of the local tags under `refs/tags` - * - * @return array - */ - public function branches() - { - return $this->_refs('heads'); - } - - private function _refs($type) - { - $dir = $this->_path . 'refs' . DIRECTORY_SEPARATOR . $type; - $refs = glob($dir . DIRECTORY_SEPARATOR . '*'); - foreach ($refs as &$ref) { - $ref = basename($ref); - } - return $refs; - } - - /** - * Initialises a Git repository - * - * @return boolean Returns true on success, false on error - */ - public static function init($path) - { - $path .= '/'; - if (!is_dir($path)) { - mkdir($path); - } elseif (is_dir($path . 'objects')) { - return false; - } - - mkdir($path . 'objects'); - mkdir($path . 'objects/info'); - mkdir($path . 'objects/pack'); - mkdir($path . 'refs'); - mkdir($path . 'refs/heads'); - mkdir($path . 'refs/tags'); - - file_put_contents($path . 'HEAD', 'ref: refs/heads/master'); - - return true; - } - - /** - * Writes the indexed commit to disk, with blobs added/removed via `add()` and - * `rm()` - * - * @param string $message The commit message - * @param string $author The author name - * - * @return boolean True on success, or false on failure - */ - public function commit($message, $author) - { - $user_string = $username . ' ' . time() . ' +0000'; - - try { - $parents = array($this->repo->head()->sha()); - } catch (InvalidArgumentException $e) { - $parents = array(); - } - - $this->idx_commit->message($message); - $this->idx_commit->author($user_string); - $this->idx_commit->committer($user_string); - $this->idx_commit->tree($this->idx_tree); - $commit->parents($parents); - - $this->idx_tree->write(); - $this->idx_commit->write(); - - $this->repo->head('master', $this->idx_commit->sha()); - - $this->idx_commit = $this->factory('commit'); - $this->idx_tree = $this->factory('tree'); - } - - /** - * Adds a file to the indexed commit, to be written to disk with `commit()` - * - * @param string $filename The filename to save it under - * @param Granite\Git\Blob $blob The raw blob object to add to the tree - */ - public function add($filename, Granite\Git\Blob $blob) - { - $blob->write(); - $nodes = $this->idx_tree->nodes(); - $nodes[$filename] = new Granite\Git\Tree\Node($filename, '100644', $blob->sha()); - $this->idx_tree->nodes($nodes); - } - - /** - * Removes a file from the indexed commit - */ - public function rm($filename) - { - $nodes = $this->idx_tree->nodes(); - unset($nodes[$filename]); - $this->idx_tree->nodes($nodes); - } - - /** - * Returns an SHA-1 id of the ref resource - * - * @param string $ref The ref name to lookup - * - * @return string An SHA-1 id of the ref resource - */ - private function _ref($ref) - { - // All refs are stored in `.git/refs` - $file = $this->_path . 'refs' . DIRECTORY_SEPARATOR . $ref; - - if (file_exists($file)) { - return trim(file_get_contents($file)); - } - - $sha = $this->_packedRef($ref); - - if ($sha == false) { - throw new InvalidArgumentException("The ref $ref could not be found"); - } - - return $sha; - } - - /** - * Returns an SHA-1 id of the ref resource, or false if it cannot be found - * - * @param string $ref The ref name to lookup - * - * @return string An SHA-1 id of the ref resource - */ - private function _packedRef($ref) - { - $sha = false; - if (file_exists($this->_path . 'packed-refs')) { - $file = fopen($this->_path . 'packed-refs', 'r'); - - while (($line = fgets($file)) !== false) { - $info = explode(' ', $line); - if (count($info) == 2 - && trim($info[1]) == 'refs' . DIRECTORY_SEPARATOR . $ref - ) { - $sha = trim($info[0]); - break; - } - } - - fclose($file); - } - - return $sha; - } - -} |