Index: modules/project/project.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/project/project.module,v retrieving revision 1.239.2.13.2.15 diff -u -p -r1.239.2.13.2.15 project.module --- modules/project/project.module 5 Dec 2006 11:38:16 -0000 1.239.2.13.2.15 +++ modules/project/project.module 5 Dec 2006 12:08:29 -0000 @@ -544,7 +544,7 @@ function project_page_overview($termname $release_settings['parameters'][] = $version; } else { - $release_settings['joins'] = array('INNER JOIN {project_release_nodes} prn ON p.version = prn.nid'); + $release_settings['joins'] = array('INNER JOIN {project_release_nodes} prn ON n.nid = prn.pid'); } $sql_settings = array_merge_recursive($sql_settings, $release_settings); } @@ -608,6 +608,16 @@ function project_page_overview($termname $result = db_query(db_rewrite_sql("SELECT n.nid, n.title, nr.teaser, nr.format$ISSUES FROM {node} n INNER JOIN {node_revisions} nr ON n.vid = nr.vid $ISSUE_JOIN WHERE n.status = 1 AND n.type = 'project_project' ORDER BY n.title ASC")); } $class = 'even'; + if ($version != -1) { + $joins = 'INNER JOIN {term_node} t ON p.nid = t.nid LEFT JOIN {project_release_default_versions} prdv ON p.pid = prdv.nid AND prdv.tid = t.tid AND prdv.major = p.version_major'; + $wheres = 'AND t.tid = %d'; + $order_bys = 'ORDER BY prdv.nid DESC, p.rebuild ASC, p.version_major ASC, p.version_minor DESC, p.version_patch DESC, p.file_date DESC'; + } + else { + $joins = ''; + $wheres = ''; + $order_bys = 'ORDER BY p.file_date DESC'; + } while ($project = db_fetch_object($result)) { $project->body = check_markup($project->teaser, $project->format, FALSE); if (project_use_taxonomy()) { @@ -627,11 +637,9 @@ function project_page_overview($termname unset($values); $values[] = $project->nid; if ($version != -1) { - $VERSION_JOIN = 'INNER JOIN {term_node} t ON p.nid = t.nid'; - $VERSION_WHERE = 'AND t.tid = %d'; $values[] = $version; } - $latest = db_fetch_object(db_query_range("SELECT file_path, version, file_date FROM {project_release_nodes} p $VERSION_JOIN WHERE p.pid = %d $VERSION_WHERE ORDER BY file_date DESC", $values, 0, 1)); + $latest = db_fetch_object(db_query_range("SELECT file_path, version, file_date FROM {project_release_nodes} p $joins WHERE p.pid = %d $wheres $order_bys", $values, 0, 1)); $project->file_path = $latest->file_path; $project->version = $latest->version; } Index: modules/project/release/project_release.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.module,v retrieving revision 1.1.2.44 diff -u -p -r1.1.2.44 project_release.module --- modules/project/release/project_release.module 5 Dec 2006 11:38:16 -0000 1.1.2.44 +++ modules/project/release/project_release.module 5 Dec 2006 12:08:30 -0000 @@ -554,6 +554,19 @@ function project_release_db_save($node, } $values['nid'] = $node->nid; db_query($sql, $values); + + // If this is the first release for a given compatibility term, add + // a record into the {project_release_default_versions} table. + if ($is_new && module_exist('taxonomy')) { + $vid = _project_release_get_api_vid(); + if (isset($node->taxonomy[$vid])) { + $tid = $node->taxonomy[$vid]; + $has_default = db_result(db_query("SELECT COUNT(*) FROM {project_release_default_versions} WHERE nid = %d AND tid = %d", $node->pid, $tid)); + if (!$has_default) { + db_query("INSERT INTO {project_release_default_versions} (nid, tid, major) VALUES (%d, %d, %d)", $node->pid, $tid, $node->version_major); + } + } + } } /** @@ -834,7 +847,15 @@ function project_release_project_edit_re project_project_set_breadcrumb($node); drupal_set_title(check_plain($node->title)); - $form['releases'] = array( + $form['advanced'] = array( + '#type' => 'fieldset', + '#title' => t('Advanced options'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#weight' => 5, + ); + + $form['advanced']['releases'] = array( '#type' => 'checkbox', '#title' => t('Enable releases'), '#return_value' => 1, @@ -843,18 +864,60 @@ function project_release_project_edit_re '#description' => t('Allow releases of this project with specific versions.'), ); if ($node->releases) { - if ($releases = project_release_get_releases($node, false, 'version', 'files')) { - $form['version'] = array( - '#type' => 'select', - '#title' => t('Default version'), - '#default_value' => $node->version, - '#options' => $releases, - '#description' => t('Default version for downloading.'), - ); + $releases = array(); + if ($tree = project_release_get_api_taxonomy()) { + $query = db_query('SELECT tid, major FROM {project_release_default_versions} WHERE nid = %d', $node->nid); + $node->default_versions = array(); + while ($version = db_fetch_object($query)) { + $tid = $version->tid; + $major = $version->major; + $node->default_versions[$tid] = $major; + } + $result = db_query(db_rewrite_sql("SELECT n.nid, tn.tid, td.name, r.* FROM {node} n INNER JOIN {project_release_nodes} r ON r.nid = n.nid INNER JOIN {term_node} tn ON tn.nid = r.nid INNER JOIN {term_data} td ON tn.tid = td.tid WHERE (r.pid = %d) AND (n.status = 1) AND (r.file_path <> '') ORDER BY tn.tid, r.rebuild, r.version_major DESC, r.version_minor DESC, r.version_patch DESC, r.file_date DESC"), $node->nid); + while ($rel = db_fetch_object($result)) { + $tid = $rel->tid; + $major = $rel->version_major; + if (isset($major)) { + $releases[$tid]['majors'][$major] = $major; + } + $releases[$tid]['name'] = $rel->name; + if (!isset($releases[$tid]['current']) && $node->default_versions[$tid] == $major) { + $releases[$tid]['current'] = $rel->version; + } + } + $form['default_versions'] = array('#tree' => TRUE); + foreach ($tree as $term) { + $tid = $term->tid; + if (isset($releases[$tid])) { + $form['default_versions'][$tid] = array(); + if (count($releases[$tid]['majors']) > 1) { + $form['default_versions'][$tid]['major'] = array( + '#title' => t('Major version'), + '#type' => 'select', + '#options' => $releases[$tid]['majors'], + '#default_value' => isset($node->default_versions[$tid]) ? $node->default_versions[$tid] : 1, + ); + } + else { + $form['default_versions'][$tid]['major'] = array( + '#type' => 'value', + '#value' => current($releases[$tid]['majors']), + ); + } + $form['default_versions'][$tid]['current_release'] = array( + '#type' => 'value', + '#value' => $releases[$tid]['current'], + ); + $form['default_versions'][$tid]['name'] = array( + '#type' => 'value', + '#value' => $releases[$tid]['name'], + ); + } + } } if (user_access('administer projects')) { - $form['version_format'] = array( + $form['advanced']['version_format'] = array( '#type' => 'textfield', '#title' => t('Version format string'), '#default_value' => $node->version_format, @@ -876,6 +939,39 @@ function project_release_project_edit_re return drupal_get_form('project_release_project_edit_form', $form); } +function theme_project_release_project_edit_form($form) { + $output = ''; + $rows = array(); + if ($vocab = taxonomy_get_vocabulary(_project_release_get_api_vid())) { + $header = array( + check_plain($vocab->name), + t('Major version'), + t('Current release'), + ); + } + foreach (element_children($form['default_versions']) as $tid) { + $row = array(); + $row[] = check_plain($form['default_versions'][$tid]['name']['#value']); + unset($form['default_versions'][$tid]['major']['#title']); + if ($form['default_versions'][$tid]['major']['#type'] == 'select') { + $row[] = form_render($form['default_versions'][$tid]['major']); + } + else { + $row[] = check_plain($form['default_versions'][$tid]['major']['#value']); + } + $row[] = check_plain($form['default_versions'][$tid]['current_release']['#value']); + $rows[] = $row; + } + if (count($rows)) { + $output .= '

'. t('Default versions') .'

'; + $output .= theme('table', $header, $rows); + $output .= '
'. t('This table allows you to specify the default version for any given %vocabulary_name. For both the release series (major version) and release type, if there are more than option, you can select which one should be used. For each series, the current default release based on the saved filters is shown.', array('%vocabulary_name' => theme('placeholder', $vocab->name))) ."
\n"; + } + $output .= form_render($form['advanced']); + $output .= form_render($form); + return $output; +} + /** * Validates the project form regarding release-specific fields. * Ensures that the version format string doesn't contain bad characters. @@ -894,13 +990,17 @@ function project_release_project_edit_fo * @see project_release_project_edit_releases */ function project_release_project_edit_form_submit($form_id, $form_values) { - if (!empty($form_values['releases'])) { - db_query("UPDATE {project_release_projects} SET releases = %d, version_format = '%s' WHERE nid = %d", $form_values['releases'], $form_values['version_format'], $form_values['nid']); - db_query("UPDATE {project_projects} SET version = %d WHERE nid = %d", $form_values['version'], $form_values['nid']); - } - else { - db_query("UPDATE {project_release_projects} SET releases = 0, version_format = '' WHERE nid = %d", $form_values['nid']); - db_query("UPDATE {project_projects} SET version = 0 WHERE nid = %d", $form_values['nid']); + db_query("UPDATE {project_release_projects} SET releases = %d, version_format = '%s' WHERE nid = %d", $form_values['releases'], $form_values['version_format'], $form_values['nid']); + + foreach ($form_values['default_versions'] as $tid => $values) { + if ($obj = db_fetch_object(db_query("SELECT * FROM {project_release_default_versions} WHERE nid = %d AND tid = %d", $form_values['nid'], $tid))) { + if ($obj->major != $values['major']) { + db_query("UPDATE {project_release_default_versions} SET major = %d WHERE nid = %d AND tid = %d", $values['major'], $form_values['nid'], $tid); + } + } + else { + db_query("INSERT INTO {project_release_default_versions} (nid, tid, major) VALUES (%d, %d, %d)", $form_values['nid'], $tid, $values['major']); + } } } @@ -936,9 +1036,9 @@ function project_release_alter_release_f $options[$tid] = $form['taxonomy'][$vid]['#options'][$tid]; $form['taxonomy'][$vid]['#default_value'] = $tid; } - elseif ($tids = variable_get('project_release_active_compatibility_tids', '')) { + elseif ($tids = variable_get('project_release_active_compatibility_tids', '')) { // We don't have the term since we're adding a new release. - // Restrict to the active terms (if any). + // Restrict to the active terms (if any). foreach ($form['taxonomy'][$vid]['#options'] as $tid => $name) { if ($tid && $tids[$tid]) { $options[$tid] = check_plain($name); @@ -947,11 +1047,11 @@ function project_release_alter_release_f if (!empty($options)) { $options = array(0 => $form['taxonomy'][$vid]['#options'][0]) + $options; } - } + } if (!empty($options)) { $form['taxonomy'][$vid]['#options'] = $options; } - else { + else { unset($form['taxonomy'][$vid]); } } Index: modules/project/release/project_release.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.install,v retrieving revision 1.1.2.10 diff -u -p -r1.1.2.10 project_release.install --- modules/project/release/project_release.install 12 Nov 2006 13:52:35 -0000 1.1.2.10 +++ modules/project/release/project_release.install 5 Dec 2006 12:08:30 -0000 @@ -7,28 +7,35 @@ function project_release_install() { case 'mysql': case 'mysqli': db_query("CREATE TABLE IF NOT EXISTS {project_release_nodes} ( - nid int unsigned NOT NULL default 0, - pid int unsigned NOT NULL default 0, + nid int unsigned NOT NULL default '0', + pid int unsigned NOT NULL default '0', version varchar(255) NOT NULL default '', tag varchar(255) NOT NULL default '', file_path varchar(255) NOT NULL default '', - file_date int unsigned NOT NULL default 0, + file_date int unsigned NOT NULL default '0', file_hash varchar(32) NOT NULL default '', rebuild tinyint default '0', version_major int default NULL, version_minor int default NULL, version_patch int default NULL, version_extra varchar(255) default NULL, - PRIMARY KEY (`nid`), + PRIMARY KEY (nid), KEY project_releases_pid (pid) ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;"); db_query("CREATE TABLE IF NOT EXISTS {project_release_projects} ( - nid int unsigned NOT NULL default 0, + nid int unsigned NOT NULL default '0', releases tinyint NOT NULL default '1', version_format varchar(255) NOT NULL default '', - PRIMARY KEY (`nid`), - KEY project_release_projects_releases (`releases`) + PRIMARY KEY (nid), + KEY project_release_projects_releases (releases) + ) TYPE=MyISAM + /*!40100 DEFAULT CHARACTER SET utf8 */;"); + db_query("CREATE TABLE IF NOT EXISTS {project_release_default_versions} ( + nid int unsigned NOT NULL default '0', + tid int unsigned NOT NULL default '0', + major int unsigned NOT NULL default '0', + PRIMARY KEY (nid, tid) ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;"); break; @@ -58,15 +65,70 @@ function project_release_install() { releases smallint NOT NULL default '1', version_format varchar(255) NOT NULL default '', PRIMARY KEY (nid), - KEY project_release_projects_releases (releases), + KEY project_release_projects_releases (releases) );"); } + if (!project_release_db_table_exists('project_release_default_versions')) { + db_query("CREATE TABLE {project_release_default_versions} ( + nid int NOT NULL default '0', + tid int NOT NULL default '0', + major int NOT NULL default '0', + PRIMARY KEY (nid, tid) + );"); + } break; } db_query("UPDATE {system} SET weight = 2 WHERE name = 'project_release'"); db_query("DELETE FROM {variable} WHERE name = 'project_browse_releases'"); } +/** + * Adds the {project_release_default_versions} table for branch-aware + * default versions and populates it the best it can. + */ +function project_release_update_1() { + $ret = array(); + + switch ($GLOBALS['db_type']) { + case 'mysql': + case 'mysqli': + $ret[] = update_sql( + "CREATE TABLE IF NOT EXISTS {project_release_default_versions} ( + nid int unsigned NOT NULL default '0', + tid int unsigned NOT NULL default '0', + major int unsigned NOT NULL default '0', + PRIMARY KEY (nid, tid) + ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;"); + break; + case 'pgsql': + if (!project_release_db_table_exists('project_release_default_versions')) { + $ret[] = update_sql( + "CREATE TABLE {project_release_default_versions} ( + nid int NOT NULL default '0', + tid int NOT NULL default '0', + major int NOT NULL default '0', + PRIMARY KEY (nid, tid) + );"); + } + break; + } + + // Initially populate based on the existing default release, if that + // release is a real release with a valid compatibility taxonomy. + $ret[] = update_sql("INSERT INTO {project_release_default_versions} (nid, tid, major) SELECT pp.nid, tn.tid, prn.version_major FROM {project_projects} pp INNER JOIN {project_release_nodes} prn ON pp.version = prn.nid INNER JOIN {term_node} tn ON tn.nid = prn.nid"); + + // Now, add in values for any other distinct branches we know about + // for each project, for all active compatibility terms. + $tids = variable_get('project_release_active_compatibility_tids', ''); + if (!empty($tids)) { + $where_tid = 'AND tn.tid IN (' . implode(',', array_filter($tids)) . ') '; + } + $ret[] = update_sql("INSERT INTO {project_release_default_versions} (nid, tid, major) SELECT prn.pid, tn.tid, MIN(prn.version_major) FROM {project_release_nodes} prn INNER JOIN {term_node} tn ON prn.nid = tn.nid LEFT JOIN {project_release_default_versions} prdv ON prdv.nid = prn.pid AND prdv.tid = tn.tid WHERE prn.version_major IS NOT NULL AND prdv.nid IS NULL AND prdv.tid IS NULL $where_tid GROUP BY prn.pid, tn.tid"); + + return $ret; +} + + function project_release_db_table_exists($table) { switch ($GLOBALS['db_type']) { case 'mysql':