New plugin repo cloned using new GitRepo class. Readme and info displayed in wide modal dialog.
This commit is contained in:
127
Zotlabs/Storage/GitRepo.php
Normal file
127
Zotlabs/Storage/GitRepo.php
Normal file
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
|
||||
namespace Zotlabs\Storage;
|
||||
|
||||
use PHPGit\Git as PHPGit;
|
||||
|
||||
require __DIR__ . '/../../library/PHPGit.autoload.php'; // Load PHPGit dependencies
|
||||
|
||||
/**
|
||||
* Description of Git
|
||||
*
|
||||
* @author Andrew Manning <andrewmanning@grid.reticu.li>
|
||||
*/
|
||||
class GitRepo {
|
||||
|
||||
public $url = null;
|
||||
public $name = null;
|
||||
public $path = null;
|
||||
private $repoID = null;
|
||||
private $channel = null;
|
||||
public $git = null;
|
||||
private $repoBasePath = null;
|
||||
|
||||
function __construct($channel = 'sys', $url = null, $clone = false, $name = null) {
|
||||
$this->repoBasePath = __DIR__ . '/../../store/git';
|
||||
$this->channel = $channel;
|
||||
$this->git = new PHPGit();
|
||||
if ($name) {
|
||||
$this->name = $name;
|
||||
} else {
|
||||
$this->name = $this->getRepoNameFromURL($url);
|
||||
}
|
||||
if (!$this->name) {
|
||||
logger('Error creating GitRepo. No repo name found.');
|
||||
return null;
|
||||
}
|
||||
$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->isValidGitRepoURL($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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) && $this->isValidGitRepoURL($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;
|
||||
}
|
||||
|
||||
public static function isValidGitRepoURL($url) {
|
||||
if (strrpos(parse_url($url, PHP_URL_PATH), '.')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static function getRepoNameFromURL($url) {
|
||||
$urlpath = parse_url($url, PHP_URL_PATH);
|
||||
$lastslash = strrpos($urlpath, '/') + 1;
|
||||
$gitext = strrpos($urlpath, '.');
|
||||
if ($gitext) {
|
||||
return substr($urlpath, $lastslash, $gitext - $lastslash);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user