Пример #1
0
/**
 * Fetch tags data, newest first.
 *
 * @param limit maximum number of tags to return
 */
function handle_tags($project, $limit = 0)
{
    global $conf;
    $tags = git_get_tags($project);
    $result = array();
    foreach ($tags as $tag) {
        $info = git_get_commit_info($project, $tag['h']);
        $result[] = array('stamp' => $info['author_utcstamp'], 'date' => strftime($conf['datetime'], $info['author_utcstamp']), 'h' => $tag['h'], 'fullname' => $tag['fullname'], 'name' => $tag['name']);
    }
    // sort tags newest first
    // aka. two more reasons to hate PHP (figuring those out is your homework:)
    usort($result, create_function('$x, $y', '$a = $x["stamp"]; $b = $y["stamp"]; return ($a == $b ? 0 : ($a > $b ? -1 : 1));'));
    // TODO optimize this some way, currently all tags are fetched when only a
    // few are shown. The problem is that without fetching the commit info
    // above, we can't sort using dates, only by tag name...
    if ($limit > 0) {
        $result = array_splice($result, 0, $limit);
    }
    return $result;
}
function project_synchronize_repositories($project)
{
    git_log('Synchronizing project ' . $project->short_name);
    $releases = project_releases($project);
    if (empty($releases)) {
        git_log('Project has no releases, nothing to do.');
        return;
    }
    // Create a temporary directory.
    $temporary_dir = _create_temporary_directory();
    chdir($temporary_dir);
    // Checkout the repository.
    $repository = $project->repository;
    if (!file_exists($repository)) {
        mkdir('repo');
        chdir('repo');
        git_invoke('git init');
        git_invoke('git remote add origin ' . escapeshellarg($repository));
    } else {
        git_invoke('git clone ' . escapeshellarg($repository) . ' repo');
        chdir('repo');
    }
    $new_releases = FALSE;
    $tags = git_get_tags('.git');
    foreach ($releases as $release) {
        if (isset($tags[$release['version']]) || empty($release['download_link'])) {
            continue;
        }
        $new_releases |= git_import_release($project, $release, $release['branch']);
    }
    if ($new_releases) {
        git_log('Pushing releases for project ' . $project->short_name);
        if (!file_exists($repository)) {
            mkdir($repository, 0777, TRUE);
            git_invoke('git init', FALSE, $repository);
        }
        // Push the resulting repository.
        git_invoke('git push --all origin');
        git_invoke('git push --tags origin');
        // Update the HEAD branch of the repository.
        git_update_head($project, $releases);
    }
    git_invoke('rm -Rf ' . escapeshellarg($temporary_dir));
}