commit d548dabd2d9fe44efa211960e9d52c582d185c4e Author: Randy Fay Date: Fri Apr 22 20:00:36 2011 -0600 Initial work to convert from CVS to git and fix bugs and fix naming diff --git a/release/package-release-nodes.php b/release/package-release-nodes.php index ceb2b51..e9b1d4f 100755 --- a/release/package-release-nodes.php +++ b/release/package-release-nodes.php @@ -229,8 +229,8 @@ function package_releases($type, $project_id = 0) { } // Process the module .info files. - // @todo: Fix me. - //package_release_info_process_all($release_node->nid, $info_files, $project_short_name, $version); + // @todo: Fix me. This requires us to *gather* the required $info_files. + //project_release_info_process_all($release_node->nid, $info_files, $project_short_name, $version); $packager = project_release_get_packager_plugin($release_node, $dest_root, $dest_rel, $tmp_dir); if (empty($packager)) { diff --git a/release/project_release.batch.inc b/release/project_release.batch.inc index 354357a..5ace726 100644 --- a/release/project_release.batch.inc +++ b/release/project_release.batch.inc @@ -12,7 +12,7 @@ * * The directory should be empty since it will be cleared before each checkout. */ -define('PROJECT_RELEASE_INFO_BATCH_DIRECTORY', '/tmp/project-info'); +define('PROJECT_RELEASE_INFO_BATCH_DIRECTORY', '/tmp/project-release-info'); /** * Load Drupal implementation by default. @@ -27,7 +27,7 @@ module_load_include('drupal.inc', 'project_release'); */ function project_release_info_batch_form(&$form_state) { // Ensure that the directory constant has been set. - if (empty(PROJECT_RELEASE_INFO_BATCH_DIRECTORY)) { + if (!defined('PROJECT_RELEASE_INFO_BATCH_DIRECTORY')) { form_set_error('', t('The constant PROJECT_RELEASE_INFO_BATCH_DIRECTORY must be set.')); } @@ -130,7 +130,7 @@ function project_release_info_batch_batch_operation_dependencies(&$context) { foreach ($context['results']['dependencies'] as $rid => $modules_dependencies) { $modules = project_release_info_module_list_get($rid); foreach ($modules_dependencies as $module => $dependencies) { - package_release_info_process_dependencies($rid, $modules[$module], $dependencies); + project_release_info_process_dependencies($rid, $modules[$module], $dependencies); } // Remove already processed releases. @@ -176,6 +176,8 @@ function project_release_info_batch_batch_finished($success, $results, $operatio * List of release information: rid, project uri, and cvs directory. */ function project_release_info_batch_releases(array $tids, $release_id, $count = FALSE) { + dd($tids, 'project_release_info_batch_releases $tids'); + dd("project_release_info_batch_releases release_id=$release_id, count=$count"); $fields = ($count ? 'COUNT(r.nid)' : 'r.nid, r.tag, p.uri, cp.directory'); $placeholders = db_placeholders($tids, 'int'); $sql = "SELECT $fields diff --git a/release/project_release.drupal.inc b/release/project_release.drupal.inc index ab693f8..64473cb 100644 --- a/release/project_release.drupal.inc +++ b/release/project_release.drupal.inc @@ -33,20 +33,20 @@ define('PROJECT_RELEASE_INFO_MINIMUM_API', 6); * @param $version * The version of the release being processed. */ -function package_release_info_process_all($release_nid, array $info_files, $uri, $version) { +function project_release_info_process_all($release_nid, array $info_files, $uri, $version) { // Only process .info file for modules that meet the minimum API requirement. if (($major = array_shift(explode('.', $version, 2))) && $major >= PROJECT_RELEASE_INFO_MINIMUM_API) { // Clear previous records for the release. project_release_info_package_clear($release_nid); - $info = package_release_info_parse($info_files); + $info = project_release_info_parse($info_files); // Store list of components. $records = project_release_info_package_list_store($release_nid, $info); // Process list of dependencies to determine the release related to each // dependency. - package_release_info_process($release_nid, $records, $info); + project_release_info_process($release_nid, $records, $info); } } @@ -60,7 +60,7 @@ function package_release_info_process_all($release_nid, array $info_files, $uri, * Associative array of component information keyed by component name and * merged with an array of defaults. */ -function package_release_info_parse(array $info_files) { +function project_release_info_parse(array $info_files) { $defaults = array( 'name' => 'Unknown', 'description' => '', @@ -90,15 +90,15 @@ function package_release_info_parse(array $info_files) { * project_release_info_package_list_store(). * @param $info * Associative array of information from component .info files keyed by component - * name and merged with a set of detaults from package_release_info_parse(). + * name and merged with a set of defaults from project_release_info_parse(). */ -function package_release_info_process($release_nid, array $records, array $info) { +function project_release_info_process($release_nid, array $records, array $info) { foreach ($info as $component => $component_info) { if ($component_info['dependencies']) { - package_release_info_process_dependencies($release_nid, $records[$component], PROJECT_RELEASE_DEPENDENCY_REQUIRED, $component_info['dependencies']); + project_release_info_process_dependencies($release_nid, $records[$component], PROJECT_RELEASE_DEPENDENCY_REQUIRED, $component_info['dependencies']); } if ($component_info['test_dependencies']) { - package_release_info_process_dependencies($release_nid, $records[$component], PROJECT_RELEASE_DEPENDENCY_RECOMMENDED, $component_info['test_dependencies']); + project_release_info_process_dependencies($release_nid, $records[$component], PROJECT_RELEASE_DEPENDENCY_RECOMMENDED, $component_info['test_dependencies']); } } } @@ -115,10 +115,10 @@ function package_release_info_process($release_nid, array $records, array $info) * @param $dependencies * List of dependency component names. */ -function package_release_info_process_dependencies($release_nid, array $component, $dependency_type, array $dependencies) { +function project_release_info_process_dependencies($release_nid, array $component, $dependency_type, array $dependencies) { // Load the release and determine is core API version. $release = node_load($release_nid); - if (!($api_term = package_release_info_core_api($release))) { + if (!($api_term = project_release_info_core_api($release))) { wd_err('ERROR: No core release API term found.'); return; } @@ -137,7 +137,7 @@ function package_release_info_process_dependencies($release_nid, array $componen $dependency_components = array(); foreach ($dependency_info as $dependency => $info) { - $releases = package_release_info_releases_get($dependency, $api_term->tid); + $releases = project_release_info_releases_get($dependency, $api_term->tid); // Check for dependency version restriction information. if (empty($info['versions'])) { @@ -217,7 +217,7 @@ function package_release_info_process_dependencies($release_nid, array $componen * @return * List of releases with keys: 'component_id', 'release_nid'. */ -function package_release_info_releases_get($component, $api_tid) { +function project_release_info_releases_get($component, $api_tid) { $result = db_query("SELECT DISTINCT p.component_id, p.release_nid FROM {project_release_component} p INNER JOIN {project_release_nodes} r ON p.release_nid = r.nid @@ -242,7 +242,7 @@ function package_release_info_releases_get($component, $api_tid) { * @return * Core API term to which the node belongs, otherwise FALSE. */ -function package_release_info_core_api($node) { +function project_release_info_core_api($node) { static $api_terms = array(); if (!isset($api_terms[$node->nid])) { @@ -331,45 +331,58 @@ function project_release_info_batch_process_release(array $release) { $directory_original = getcwd(); // Use batch directory. + if (!is_dir(PROJECT_RELEASE_INFO_BATCH_DIRECTORY)) { + mkdir(PROJECT_RELEASE_INFO_BATCH_DIRECTORY); + } chdir(PROJECT_RELEASE_INFO_BATCH_DIRECTORY); - // Clean directory. - exec('rm -r *'); - // Checkout release. $release['tag'] = escapeshellcmd($release['tag']); $release['uri'] = escapeshellcmd($release['uri']); - if ($release['uri'] == 'drupal') { - $url = ':pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal'; - $branch = $release['tag']; - $module = $release['uri']; - $directory = $release['uri']; + $url = 'git://git.drupal.org/project/' . $release['uri'] . '.git'; + $tag = $release['tag']; + $module = $release['uri']; + $directory = $release['uri']; + // @todo: If the directory exists, just do a pull? + // @todo: We will have to handle both branches and tags! + // There's no reason to clone for each branch/tag. Do we just have to figure + // out which is which by the format? + if (!is_dir("$directory/.git")) { + exec("git clone $url $directory", $output, $status); + if ($status) { + return FALSE; + } } - else { - $url = ':pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal-contrib'; - $branch = $release['tag']; - $module = 'contributions/modules/' . $release['uri']; - $directory = $release['uri']; + chdir($directory); + exec("git fetch", $output, $status); + if ($status) { + return FALSE; + } + + exec("git checkout $tag", $output, $status); + if ($status) { + return FALSE; } - exec("cvs -z6 -Q -d$url checkout -d$directory -r $branch $module", $output, $status); // Return to original directory. chdir($directory_original); - // Check for CVS checkout failure. + // Check for checkout failure. if ($status != 0) { return FALSE; } // Scan checkout for .info files and create a list in the same format that // project release uses, so that standard API functions can be used. - $files = file_scan_directory(PROJECT_RELEASE_INFO_BATCH_DIRECTORY . '/' . $directory, '/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info$/'); + $function_pattern = DRUPAL_PHP_FUNCTION_PATTERN; + $function_pattern = '[a-zA-Z][a-zA-Z0-9_]*'; + $files = file_scan_directory(PROJECT_RELEASE_INFO_BATCH_DIRECTORY . '/' . $directory, '^' . $function_pattern . '\.info$'); $info_files = array(); foreach ($files as $file) { $info_files[] = $file->filename; } - $info = project_release_info_package_parse($info_files); + $info = project_release_info_parse($info_files); $dependencies = array(); foreach ($info as $module => $module_info) { @@ -384,3 +397,20 @@ function project_release_info_batch_process_release(array $release) { return $dependencies; } + + + +if (!function_exists('wd_err')) { + /** + * Wrapper function for watchdog() to log error messages. + */ + function wd_err($msg, $variables = array(), $link = NULL) { + global $wd_err_msg; + if (!isset($wd_err_msg)) { + $wd_err_msg = array(); + } + watchdog('package_error', $msg, $variables, WATCHDOG_ERROR, $link); + fwrite(STDERR, strtr($msg, $variables) ."\n"); + $wd_err_msg[] = strtr($msg, $variables); + } +} diff --git a/release/project_release.drush.inc b/release/project_release.drush.inc new file mode 100644 index 0000000..2538102 --- /dev/null +++ b/release/project_release.drush.inc @@ -0,0 +1,76 @@ + 'Build dependencies for a given release node.', + 'callback' => 'drush_project_release_dependencies', + 'arguments' => array( + 'nid' => 'The release nid for which dependencies should be built', + 'version' => 'The version (like 7.x-1.x) of the release to be processed', + ), + 'aliases' => array('prd'), + 'options' => array( + 'basedir' => 'The directory in which unpacked releases will be found', + ), + ); + + $items['process-dependencies'] = array( + // 'description' => 'Build dependencies for a given release node.', + 'callback' => 'drush_project_release_process_release', + 'arguments' => array( + 'shortname' => 'Project shortname/uri', + 'version' => 'The version (like 7.x-1.x-dev) of the release to be processed', + ), + 'aliases' => array('pd'), + ); + + + return $items; +} + +function drush_project_release_dependencies($nid, $version) { + $basedir = drush_get_option('basedir', 'sites/all/modules'); + $release_node = node_load($nid); + $project_node = node_load($release_node->project_release['pid']); + if (empty($release_node) || empty($project_node)) { + drush_set_error("Failed to load the project release node with nid = " . $nid); + return; + } + drush_print('Nid is ' . $nid . ' and basedir is ' . $basedir); + $module_location = "$basedir/{$project_node->project['uri']}"; + if (!drush_shell_exec("find $module_location -name '*.info'")) { + drush_set_error("Failed to execute find command for info files"); + return; + } + $files = drush_shell_exec_output(); + + module_load_include('inc', 'project_release', 'project_release.drupal'); + // module_load_include('php', 'project_release', 'package-release-nodes'); + project_release_info_process_all($nid, $files, $project_node->project['uri'], $version); +} + +function drush_project_release_process_release($shortname, $version) { + module_load_include('inc', 'project_release', 'project_release.drupal'); + module_load_include('inc', 'project_release', 'project_release.batch'); + + // Load the project. + $pid = project_get_nid_from_uri($shortname); + $query = 'SELECT nid,tag FROM {project_release_nodes} WHERE pid = %d AND version = "%s"'; + $release = db_fetch_array(db_query($query, $pid, $version)); + $release['uri'] = $shortname; + $dependencies = project_release_info_batch_process_release($release); + if ($dependencies === FALSE) { + drush_set_error('Failed to parse release'); + return; + } + drush_print_r($dependencies); +} \ No newline at end of file diff --git a/release/project_release.package.inc b/release/project_release.package.inc index cdae51a..ecb70ae 100644 --- a/release/project_release.package.inc +++ b/release/project_release.package.inc @@ -36,14 +36,14 @@ function project_release_info_package_clear($release_nid) { function project_release_info_package_list_store($release_nid, array $info) { $records = array(); foreach ($info as $component => $component_info) { - $info = array( + $project_release_component_info = array( 'release_nid' => $release_nid, 'name' => $component_info['name'], 'title' => $component_info['title'], 'description' => $component_info['description'], ); - drupal_write_record('project_release_component', $info); - $records[$component] = $info; + drupal_write_record('project_release_component', $project_release_component_info); + $records[$component] = $project_release_component_info; } return $records; } diff --git a/release/project_release.test b/release/project_release.test index 0c6a79c..d9c4bc8 100644 --- a/release/project_release.test +++ b/release/project_release.test @@ -190,13 +190,13 @@ class ProjectReleaseComponentDrupalTestCase extends ProjectDrupalOrgWebTestCase $info_files = array( drupal_get_path('module', 'project_release_foo') . '/project_release_foo.info', ); - package_release_info_process_all($this->releases['foo']->nid, $info_files, 'foo', '7.x-1.0'); + project_release_info_process_all($this->releases['foo']->nid, $info_files, 'foo', '7.x-1.0'); $info_files = array( drupal_get_path('module', 'project_release_bar') . '/project_release_bar.info', drupal_get_path('module', 'project_release_baz') . '/project_release_baz.info', ); - package_release_info_process_all($this->releases['bar']->nid, $info_files, 'bar', '7.x-1.2'); + project_release_info_process_all($this->releases['bar']->nid, $info_files, 'bar', '7.x-1.2'); } protected function createTag($project, $tag, $branch = FALSE) {