diff options
-rw-r--r-- | Zotlabs/Module/Admin.php | 63 | ||||
-rw-r--r-- | Zotlabs/Storage/Git.php | 106 | ||||
-rw-r--r-- | Zotlabs/Storage/GitRepo.php | 127 | ||||
-rwxr-xr-x | view/tpl/admin_plugins.tpl | 19 | ||||
-rw-r--r-- | view/tpl/generic_modal.tpl | 15 |
5 files changed, 170 insertions, 160 deletions
diff --git a/Zotlabs/Module/Admin.php b/Zotlabs/Module/Admin.php index ddec02916..68508fdb0 100644 --- a/Zotlabs/Module/Admin.php +++ b/Zotlabs/Module/Admin.php @@ -1,7 +1,7 @@ <?php namespace Zotlabs\Module; -use PHPGit\Git as Git; +use \Zotlabs\Storage\GitRepo as GitRepo; /** * @file mod/admin.php @@ -1359,6 +1359,15 @@ class Admin extends \Zotlabs\Web\Controller { '$submit' => t('Download Plugin Repo') ) ); + $newRepoModalID = random_string(3); + $newRepoModal = replace_macros( + get_markup_template('generic_modal.tpl'), array( + '$id' => $newRepoModalID, + '$title' => t('Install new repo'), + '$ok' => t('OK'), + '$cancel' => t('Cancel') + ) + ); $t = get_markup_template('admin_plugins.tpl'); return replace_macros($t, array( @@ -1372,7 +1381,9 @@ class Admin extends \Zotlabs\Web\Controller { '$form_security_token' => get_form_security_token('admin_plugins'), '$addrepo' => t('Add Plugin Repo'), '$expandform' => false, - '$form' => $admin_plugins_add_repo_form + '$form' => $admin_plugins_add_repo_form, + '$newRepoModal' => $newRepoModal, + '$newRepoModalID' => $newRepoModalID )); } @@ -1669,57 +1680,23 @@ class Admin extends \Zotlabs\Web\Controller { function admin_page_plugins_post($action) { switch($action) { - case 'addrepo': - + case 'addrepo': require_once('library/markdown.php'); if(array_key_exists('repoURL',$_REQUEST)) { require __DIR__ . '/../../library/PHPGit.autoload.php'; // Load PHPGit dependencies logger('Repo URL submitted: ' . $_REQUEST['repoURL']); $repoURL = $_REQUEST['repoURL']; - $urlpath = parse_url($repoURL, PHP_URL_PATH); - $lastslash = strrpos($urlpath, '/') + 1; - $gitext = strrpos($urlpath, '.'); - if ($gitext) { - $reponame = substr($urlpath, $lastslash, $gitext - $lastslash); - } else { - logger('invalid git repo URL'); - notice('Invalid git repo URL'); - break; - } - $storepath = realpath(__DIR__ . '/../../store/'); - //logger('storepath: ' . $storepath); - $repopath = $storepath . '/pluginrepos/' . $reponame; - $git = new Git(); - if (!file_exists($repopath)) { - //logger('repopath does not exist'); - if (mkdir($repopath, 0770, true)) { - $cloned = $git->clone($repoURL, $repopath); - if (!$cloned) { - logger('git clone failed'); - notice('Repo coule not be cloned. Filesystem path error.'); - json_return_and_die(array('message' => 'Repo could not be cloned. Filesystem path error.', 'success' => false)); - } - //json_return_and_die(array('repo'=> $repo, 'message' => 'Successfully cloned to: ' . $repopath , 'success' => true)); - } else { - logger('repopath could not be created'); - notice('Repo coule not be cloned. Filesystem path error.'); - json_return_and_die(array('message' => 'Repo could not be cloned. Filesystem path error', 'success' => false)); - } - } - $git->setRepository($repopath); - $repo = array(); - $repo['url'] = $repoURL; - $repo['branches'] = $git->branch(['all' => true]); - $repo['objects'] = array(); + $git = new GitRepo('sys', $repoURL, true); + + $repo = $git->probeRepo($git->path); $repo['readme'] = $repo['manifest'] = null; - foreach ($git->tree('master') as $object) { + foreach ($git->git->tree('master') as $object) { if ($object['type'] == 'blob' && (strtolower($object['file']) === 'readme.md' || strtolower($object['file']) === 'readme')) { - $repo['readme'] = Markdown($git->cat->blob($object['hash'])); + $repo['readme'] = Markdown($git->git->cat->blob($object['hash'])); } else if ($object['type'] == 'blob' && strtolower($object['file']) === 'manifest.json') { - $repo['manifest'] = $git->cat->blob($object['hash']); + $repo['manifest'] = $git->git->cat->blob($object['hash']); } } - //logger('repo: ' . json_encode($repo)); json_return_and_die(array('repo'=> $repo, 'message' => '', 'success' => true)); } else { diff --git a/Zotlabs/Storage/Git.php b/Zotlabs/Storage/Git.php deleted file mode 100644 index 5721d0e4a..000000000 --- a/Zotlabs/Storage/Git.php +++ /dev/null @@ -1,106 +0,0 @@ -<?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; - 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; - } - -} diff --git a/Zotlabs/Storage/GitRepo.php b/Zotlabs/Storage/GitRepo.php new file mode 100644 index 000000000..de5dd3b19 --- /dev/null +++ b/Zotlabs/Storage/GitRepo.php @@ -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; + } + } +} diff --git a/view/tpl/admin_plugins.tpl b/view/tpl/admin_plugins.tpl index 97759f817..3ba83986f 100755 --- a/view/tpl/admin_plugins.tpl +++ b/view/tpl/admin_plugins.tpl @@ -34,7 +34,7 @@ </div> </div> - +{{$newRepoModal}} <script> function adminPluginsAddRepo() { var repoURL = $('#id_repoURL').val(); @@ -44,16 +44,13 @@ function(response) { $('#chat-rotator').spin(false); if (response.success) { - $('#new-repo-info').html('<h3>Repo Info</h3><p>' + response.message + '</p>'); - - $('#new-repo-info').append('<h4>Branches</h4><p>'+JSON.stringify(response.repo.branches)+'</p>'); - $('#new-repo-info').append('<h4>URL</h4><p>'+response.repo.url+'</p>'); - $('#new-repo-info').append('<h4>Objects</h4><ul>'); - for(var i = 0; i<response.repo.objects.length; i++) { - $('#new-repo-info').append('<li>'+response.repo.objects[i]+'</li>'); - } - $('#new-repo-info').append('</ul>'); - $('#new-repo-info').append('<h4>Readme</h4><p>'+response.repo.readme+'</p>'); + var modalBody = $('#generic-modal-body-{{$newRepoModalID}}'); + modalBody.html('<div>'+response.repo.readme+'</div>'); + modalBody.append('<h2>Repo Info</h2><p>Message: ' + response.message + '</p>'); + modalBody.append('<h4>Branches</h4><p>'+JSON.stringify(response.repo.branches)+'</p>'); + modalBody.append('<h4>Remotes</h4><p>'+JSON.stringify(response.repo.remote)+'</p>'); + $('.modal-dialog').width('80%'); + $('#generic-modal-{{$newRepoModalID}}').modal(); } else { window.console.log('Error adding repo :' + response['message']); } diff --git a/view/tpl/generic_modal.tpl b/view/tpl/generic_modal.tpl new file mode 100644 index 000000000..3f7326e71 --- /dev/null +++ b/view/tpl/generic_modal.tpl @@ -0,0 +1,15 @@ +<div class="modal" id="generic-modal-{{$id}}" tabindex="-1" role="dialog" aria-labelledby="generic-modal-{{$id}}" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 class="modal-title" id="generic-modal-title-{{$id}}">{{$title}}</h4> + </div> + <div class="modal-body" id="generic-modal-body-{{$id}}"></div> + <div class="modal-footer"> + <button id="generic-modal-cancel-{{$id}}" type="button" class="btn btn-default" data-dismiss="modal">{{$cancel}}</button> + <button id="generic-modal-ok-{{$id}}" type="button" class="btn btn-primary">{{$ok}}</button> + </div> + </div><!-- /.modal-content --> + </div><!-- /.modal-dialog --> +</div><!-- /.modal -->
\ No newline at end of file |