예제 #1
0
 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;
     }
 }
예제 #2
0
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));
    }
}