diff options
Diffstat (limited to 'Zotlabs/Storage')
-rw-r--r-- | Zotlabs/Storage/Git.php | 105 |
1 files changed, 96 insertions, 9 deletions
diff --git a/Zotlabs/Storage/Git.php b/Zotlabs/Storage/Git.php index f9b5a6c79..5721d0e4a 100644 --- a/Zotlabs/Storage/Git.php +++ b/Zotlabs/Storage/Git.php @@ -1,19 +1,106 @@ <?php -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - namespace Zotlabs\Storage; +use PHPGit\Git as PHPGit; -require __DIR__ . '/../../library/PHPGit.autoload.php'; // Load PHPGit dependencies +require __DIR__ . '/../../library/PHPGit.autoload.php'; // Load PHPGit dependencies /** * Description of Git * - * @author andrew + * @author Andrew Manning <andrewmanning@grid.reticu.li> */ -class Git {} +class GitRepo { + + public $url = null; + public $name = null; + public $path = null; + private $repoID = null; + private $channel = null; + private $git = null; + private $repoBasePath = __DIR__ . '/../../store/git'; + + function __construct($channel = 'sys', $name = null, $url = null, $clone = false) { + $this->channel = $channel; + $this->git = new PHPGit(); + if ($name) { + $this->name = $name; + $this->path = $this->repoBasePath . "/" . $this->channel . "/" . $this->name; + if (file_exists($this->path)) { + // ignore the $url input if it exists + $this->git->setRepository($this->path); + // TODO: get repo metadata + } else if ($url && validate_url($url)) { + $this->url = $url; + $this->repoID = random_string(); + // create the folder and clone the repo at url to that folder if $clone is true + if ($clone) { + if (mkdir($this->path, 0770, true)) { + $this->git->setRepository($this->path); + if (!$this->cloneRepo()) { + // TODO: throw error + logger('git clone failed: ' . json_encode($this->git)); + } + } else { + logger('git repo path could not be created: ' . json_encode($this->git)); + } + } + } + } else { + // Construct an empty GitRepo object + //$this->name = random_string(32); + //$this->repoID = random_string(); + } + } + + /** + * delete repository from disk + */ + public function delete() { + return $this->delTree($this->getRepoPath()); + } + + public function getRepoPath() { + return $this->path; + } + + public function setRepoPath($directory) { + if (file_exists($directory)) { + $this->path->$directory; + $this->git->setRepository($directory); + return true; + } + return false; + } + + public function getRepoID() { + return $this->repoID; + } + + public function setIdentity($user_name, $user_email) { + // setup user for commit messages + $this->git->config->set("user.name", $user_name, ['global' => false, 'system' => false]); + $this->git->config->set("user.email", $user_email, ['global' => false, 'system' => false]); + } + + public function cloneRepo() { + if (validate_url($this->url) && file_exists($this->path)) { + return $this->git->clone($this->url, $this->path); + } + } + + public static function probeRepo($dir) { + if (!file_exists($dir)) { + return null; + } + $git = new PHPGit(); + $git->setRepository($dir); + $repo = array(); + $repo['remote'] = $git->remote(); + $repo['branches'] = $git->branch(['all' => true]); + $repo['logs'] = $git->log(array('limit' => 50)); + return $repo; + } + +} |