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 6 Dec 2006 04:35:24 -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 6 Dec 2006 04:35:25 -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,63 @@ 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' => 'markup',
+ '#input' => TRUE,
+ '#value' => current($releases[$tid]['majors']),
+ );
+ }
+ $form['default_versions'][$tid]['current_release'] = array(
+ '#type' => 'markup',
+ '#input' => TRUE,
+ '#value' => $releases[$tid]['current'],
+ );
+ $form['default_versions'][$tid]['name'] = array(
+ '#type' => 'markup',
+ '#input' => TRUE,
+ '#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 +942,34 @@ 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 default release'),
+ );
+ }
+ foreach (element_children($form['default_versions']) as $tid) {
+ $row = array();
+ $row[] = form_render($form['default_versions'][$tid]['name']);
+ unset($form['default_versions'][$tid]['major']['#title']);
+ $row[] = form_render($form['default_versions'][$tid]['major']);
+ $row[] = form_render($form['default_versions'][$tid]['current_release']);
+ $rows[] = $row;
+ }
+ if (count($rows)) {
+ $output .= '
'. t('Default versions') .'
';
+ $output .= theme('table', $header, $rows);
+ $output .= '\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 +988,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 +1034,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 +1045,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 6 Dec 2006 04:35:25 -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':