function admin_page_plugins_post($action) { switch ($action) { case 'updaterepo': if (array_key_exists('repoName', $_REQUEST)) { $repoName = $_REQUEST['repoName']; } else { json_return_and_die(array('message' => 'No repo name provided.', 'success' => false)); } $repoDir = __DIR__ . '/../../store/git/sys/extend/addon/' . $repoName; if (!is_dir($repoDir)) { logger('Repo directory does not exist: ' . $repoDir); json_return_and_die(array('message' => 'Invalid addon repo.', 'success' => false)); } if (!is_writable($repoDir)) { logger('Repo directory not writable to web server: ' . $repoDir); json_return_and_die(array('message' => 'Repo directory not writable to web server.', 'success' => false)); } $git = new GitRepo('sys', null, false, $repoName, $repoDir); try { if ($git->pull()) { json_return_and_die(array('message' => 'Repo updated.', 'success' => true)); } else { json_return_and_die(array('message' => 'Error updating addon repo.', 'success' => false)); } } catch (\PHPGit\Exception\GitException $e) { json_return_and_die(array('message' => 'Error updating addon repo.', 'success' => false)); } case 'removerepo': if (array_key_exists('repoName', $_REQUEST)) { $repoName = $_REQUEST['repoName']; } else { json_return_and_die(array('message' => 'No repo name provided.', 'success' => false)); } $repoDir = __DIR__ . '/../../store/git/sys/extend/addon/' . $repoName; if (!is_dir($repoDir)) { logger('Repo directory does not exist: ' . $repoDir); json_return_and_die(array('message' => 'Invalid addon repo.', 'success' => false)); } if (!is_writable($repoDir)) { logger('Repo directory not writable to web server: ' . $repoDir); json_return_and_die(array('message' => 'Repo directory not writable to web server.', 'success' => false)); } // TODO: remove directory and unlink /addon/files if (rrmdir($repoDir)) { json_return_and_die(array('message' => 'Repo deleted.', 'success' => true)); } else { json_return_and_die(array('message' => 'Error deleting addon repo.', 'success' => false)); } case 'installrepo': require_once 'library/markdown.php'; if (array_key_exists('repoURL', $_REQUEST)) { require __DIR__ . '/../../library/PHPGit.autoload.php'; // Load PHPGit dependencies $repoURL = $_REQUEST['repoURL']; $extendDir = __DIR__ . '/../../store/git/sys/extend'; $addonDir = $extendDir . '/addon'; if (!file_exists($extendDir)) { if (!mkdir($extendDir, 0770, true)) { logger('Error creating extend folder: ' . $extendDir); json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false)); } else { if (!symlink(__DIR__ . '/../../extend/addon', $addonDir)) { logger('Error creating symlink to addon folder: ' . $addonDir); json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false)); } } } if (!is_writable($extendDir)) { logger('Directory not writable to web server: ' . $extendDir); json_return_and_die(array('message' => 'Directory not writable to web server.', 'success' => false)); } $repoName = null; if (array_key_exists('repoName', $_REQUEST) && $_REQUEST['repoName'] !== '') { $repoName = $_REQUEST['repoName']; } else { $repoName = GitRepo::getRepoNameFromURL($repoURL); } if (!$repoName) { logger('Invalid git repo'); json_return_and_die(array('message' => 'Invalid git repo', 'success' => false)); } $repoDir = $addonDir . '/' . $repoName; $tempRepoBaseDir = __DIR__ . '/../../store/git/sys/temp/'; $tempAddonDir = $tempRepoBaseDir . $repoName; if (!is_writable($addonDir) || !is_writable($tempAddonDir)) { logger('Temp repo directory or /extend/addon not writable to web server: ' . $tempAddonDir); json_return_and_die(array('message' => 'Temp repo directory not writable to web server.', 'success' => false)); } rename($tempAddonDir, $repoDir); if (!is_writable(realpath(__DIR__ . '/../../addon/'))) { logger('/addon directory not writable to web server: ' . $tempAddonDir); json_return_and_die(array('message' => '/addon directory not writable to web server.', 'success' => false)); } $files = array_diff(scandir($repoDir), array('.', '..')); foreach ($files as $file) { if (is_dir($repoDir . '/' . $file) && $file !== '.git') { $source = '../extend/addon/' . $repoName . '/' . $file; $target = realpath(__DIR__ . '/../../addon/') . '/' . $file; unlink($target); if (!symlink($source, $target)) { logger('Error linking addons to /addon'); json_return_and_die(array('message' => 'Error linking addons to /addon', 'success' => false)); } } } $git = new GitRepo('sys', $repoURL, false, $repoName, $repoDir); $repo = $git->probeRepo(); json_return_and_die(array('repo' => $repo, 'message' => '', 'success' => true)); } case 'addrepo': require_once 'library/markdown.php'; if (array_key_exists('repoURL', $_REQUEST)) { require __DIR__ . '/../../library/PHPGit.autoload.php'; // Load PHPGit dependencies $repoURL = $_REQUEST['repoURL']; $extendDir = __DIR__ . '/../../store/git/sys/extend'; $addonDir = $extendDir . '/addon'; $tempAddonDir = __DIR__ . '/../../store/git/sys/temp'; if (!file_exists($extendDir)) { if (!mkdir($extendDir, 0770, true)) { logger('Error creating extend folder: ' . $extendDir); json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false)); } else { if (!symlink(__DIR__ . '/../../extend/addon', $addonDir)) { logger('Error creating symlink to addon folder: ' . $addonDir); json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false)); } } } $repoName = null; if (array_key_exists('repoName', $_REQUEST) && $_REQUEST['repoName'] !== '') { $repoName = $_REQUEST['repoName']; } else { $repoName = GitRepo::getRepoNameFromURL($repoURL); } if (!$repoName) { logger('Invalid git repo'); json_return_and_die(array('message' => 'Invalid git repo: ' . $repoName, 'success' => false)); } $repoDir = $tempAddonDir . '/' . $repoName; if (!is_writable($tempAddonDir)) { logger('Temporary directory for new addon repo is not writable to web server: ' . $tempAddonDir); json_return_and_die(array('message' => 'Temporary directory for new addon repo is not writable to web server.', 'success' => false)); } // clone the repo if new automatically $git = new GitRepo('sys', $repoURL, true, $repoName, $repoDir); $remotes = $git->git->remote(); $fetchURL = $remotes['origin']['fetch']; if ($fetchURL !== $git->url) { if (rrmdir($repoDir)) { $git = new GitRepo('sys', $repoURL, true, $repoName, $repoDir); } else { json_return_and_die(array('message' => 'Error deleting existing addon repo.', 'success' => false)); } } $repo = $git->probeRepo(); $repo['readme'] = $repo['manifest'] = null; foreach ($git->git->tree('master') as $object) { if ($object['type'] == 'blob' && (strtolower($object['file']) === 'readme.md' || strtolower($object['file']) === 'readme')) { $repo['readme'] = Markdown($git->git->cat->blob($object['hash'])); } else { if ($object['type'] == 'blob' && strtolower($object['file']) === 'manifest.json') { $repo['manifest'] = $git->git->cat->blob($object['hash']); } } } json_return_and_die(array('repo' => $repo, 'message' => '', 'success' => true)); } else { json_return_and_die(array('message' => 'No repo URL provided', 'success' => false)); } break; default: break; } }
function wiki_git_commit($arr) { $files = array_key_exists('files', $arr) ? $arr['files'] : null; $commit_msg = array_key_exists('commit_msg', $arr) ? $arr['commit_msg'] : 'Repo updated'; $resource_id = array_key_exists('resource_id', $arr) ? $arr['resource_id'] : json_return_and_die(array('message' => 'Wiki resource_id required for git commit', 'success' => false)); $observer = array_key_exists('observer', $arr) ? $arr['observer'] : json_return_and_die(array('message' => 'Observer required for git commit', 'success' => false)); $w = wiki_get_wiki($resource_id); if (!$w['path']) { return array('message' => 'Error reading wiki', 'success' => false); } $reponame = array_key_exists('title', $w['wiki']) ? urlencode($w['wiki']['title']) : 'repo'; if ($reponame === '') { $reponame = 'repo'; } $git = new GitRepo($observer['xchan_addr'], null, false, $w['wiki']['title'], $w['path']); try { $git->setIdentity($observer['xchan_name'], $observer['xchan_addr']); if ($files === null) { $options = array('all' => true); // git commit option to include all changes } else { $options = array(); // git commit options foreach ($files as $file) { if (!$git->git->add($file)) { // add specified files to the git repo stage if (!$git->git->reset->hard()) { json_return_and_die(array('message' => 'Error adding file to git stage: ' . $file . '. Error resetting git repo.', 'success' => false)); } json_return_and_die(array('message' => 'Error adding file to git stage: ' . $file, 'success' => false)); } } } if ($git->commit($commit_msg, $options)) { json_return_and_die(array('message' => 'Wiki repo commit succeeded', 'success' => true)); } else { json_return_and_die(array('message' => 'Wiki repo commit failed', 'success' => false)); } } catch (\PHPGit\Exception\GitException $e) { json_return_and_die(array('message' => 'GitRepo error thrown', 'success' => false)); } }