/** * 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)); }