commit d548dabd2d9fe44efa211960e9d52c582d185c4e
Author: Randy Fay <randy@randyfay.com>
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 @@
+<?php
+/**
+ * @file
+ * Provide Drush integration for release building and dependency building
+ */
+
+/**
+ * Implements hook_drush_command().
+ */
+function project_release_drush_command() {
+  $items = array();
+
+  $items['project-release-dependencies'] = array(
+    'description' => '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) {
