diff --git a/versioncontrol_project_issue/versioncontrol_project_issue.module b/versioncontrol_project_issue/versioncontrol_project_issue.module index 0a02149..98280e6 100644 --- a/versioncontrol_project_issue/versioncontrol_project_issue.module +++ b/versioncontrol_project_issue/versioncontrol_project_issue.module @@ -2,9 +2,6 @@ /** * @file * Version Control / Project issue integration - * - * @todo React on hook_versioncontrol_repository_post_resync(). - * @todo React on hook_versioncontrol_repository_bypassing_purge(). */ /** @@ -84,7 +81,7 @@ function versioncontrol_project_issue_versioncontrol_entity_commit_delete(Versio /** * Implements hook_versioncontrol_repository_pre_resync(). * - * @fixme Move to ans specific git module. + * @fixme Move to an specific git module. * Best effort to preserve existing mappings. * A full review will be too costly, specially if there are a lot of associated * issues. @@ -100,7 +97,7 @@ function versioncontrol_project_issue_versioncontrol_repository_pre_resync(Versi $query = new EntityFieldQuery(); $query->entityCondition('entity_type', 'node') ->entityCondition('bundle', project_issue_issue_node_types()) - ->fieldCondition('field_release_project', 'target_id', $repository->project_nid); + ->fieldCondition('field_project', 'target_id', $repository->project_nid); $result = $query->execute(); if (empty($result['node'])) { // No issues associated. @@ -119,54 +116,63 @@ function versioncontrol_project_issue_versioncontrol_repository_pre_resync(Versi // Only set the cache if there were results that'll need refreshing later if (!empty($commit_hashes_by_issue_nid)) { - ctools_static('versioncontrol_project_issue_git_resync_recover_' . $repository->repo_id, $commit_hashes_by_issue_nid); + drupal_static('versioncontrol_project_issue_git_resync_recover_' . $repository->repo_id, $commit_hashes_by_issue_nid); + // @fixme Convert to simple query. to avoid passing possible large amount of nodes. + db_delete('versioncontrol_project_issue_operations')->condition('nid', $issue_nids, 'IN')->execute(); } } /** * Implements hook_versioncontrol_repository_post_resync(). * - * @fixme Implement! - * - * Re-associate release nodes with newly generated label ids as needed. + * @fixme Move to an specific git module. */ -function versioncontrol_release_versioncontrol_repository_post_resync(VersioncontrolRepository $repository, $bypass) { - $labels = ctools_static('versioncontrol_release_resync_recover_' . $repository->repo_id); - if (!empty($labels)) { - $release_nids = $names = array(); - foreach ($labels as $label) { - $names[] = $label->name; - $release_nids[$label->name] = $label->release_nid; - } - - $results = db_select('versioncontrol_labels', 'vl') - ->fields('vl', array('label_id', 'name')) - ->condition('repo_id', $repository->repo_id) - ->condition('name', $names) - ->execute()->fetchAllKeyed(0, 1); - - $found_names = array(); - foreach ($results as $label_id => $name) { - db_update('versioncontrol_release_labels') - ->fields(array('label_id' => $label_id)) - ->condition('release_nid', $release_nids[$name]) - ->execute(); - - $found_names[] = $name; - } - - foreach (array_diff($names, $found_names) as $missing_name) { - $vars = array( - '%label' => $missing_name, - '%repo_id' => $repository->repo_id, - '%repo_name' => $repository->name, - ); - $str = 'Release-attached label "%label" was missing after from-scratch resynchronization of repository "%repo_name" (id: %repo_id).'; - watchdog('vc_project', $str, $vars, WATCHDOG_CRITICAL); +function versioncontrol_project_issue_versioncontrol_repository_post_resync(VersioncontrolRepository $repository, $bypass) { + $commit_hashes_by_issue_nid = &drupal_static('versioncontrol_project_issue_git_resync_recover_' . $repository->repo_id); + if (empty($commit_hashes_by_issue_nid)) { + // Nothing to do. + return; + } + $data_to_insert = FALSE; + $insert_query = db_insert('versioncontrol_project_issue_operations')->fields(array('nid', 'vc_op_id')); + foreach ($commit_hashes_by_issue_nid as $issue_nid => $commit_hashes) { + // Add data only if the commits are still there. + foreach ($repository->loadCommits(array(), array('revision' => $commit_hashes)) as $vc_op_id => $operation) { + $data_to_insert = TRUE; + $insert_query->values(array('nid' => $issue_nid, 'vc_op_id' => $operation->vc_op_id)); } } + if ($data_to_insert) { + $insert_query->execute(); + } + drupal_static_reset('versioncontrol_project_issue_git_resync_recover_' . $repository->repo_id); +} - ctools_static_reset('versioncontrol_release_resync_recover_' . $repository->repo_id); +/** + * Implements hook_versioncontrol_repository_bypassing_purge(). + * + * @fixme db_delete seems to not support joins, is that possible to use for the + * generic case? i.e. no mysql(should be more efficient, in case a lot of + * issues are associated). + */ +function versioncontrol_project_issue_versioncontrol_repository_bypassing_purge(VersioncontrolRepository $repository) { + if (empty($repository->project_nid)) { + // No project associated. + return; + } + // Load all associated project issue nids. + $query = new EntityFieldQuery(); + $query->entityCondition('entity_type', 'node') + ->entityCondition('bundle', project_issue_issue_node_types()) + ->fieldCondition('field_project', 'target_id', $repository->project_nid); + $result = $query->execute(); + if (empty($result['node'])) { + // No issues associated. + return; + } + // Remove related rows from versioncontrol_project_issue_operations table. + $issue_nids = array_keys($result['node']); + db_delete('versioncontrol_project_issue_operations')->condition('nid', $issue_nids, 'IN')->execute(); } /**