├── views
├── theme.inc
├── fserver_handler_field_mdhash.inc
├── fserver_handler_field_release_tag.inc
├── fserver_handler_sort_release_tag.inc
├── fserver-updatexml.tpl.php
└── fserver_plugin_style_updatexml.inc
├── fserver.css
├── fserver.js
├── fserver.features.menu_links.inc
├── fserver.context.inc
├── fserver.strongarm.inc
├── fserver.features.inc
├── fserver.info
├── fserver.views.inc
├── fserver.module
├── fserver.features.content.inc
├── fserver.drush.inc
└── fserver.views_default.inc
/views/theme.inc:
--------------------------------------------------------------------------------
1 | style_plugin->preprocess($vars);
8 | }
9 |
--------------------------------------------------------------------------------
/views/fserver_handler_field_mdhash.inc:
--------------------------------------------------------------------------------
1 | {$this->field_alias};
8 | if (file_exists($filepath)) {
9 | $contents = file_get_contents($filepath);
10 | return md5($contents);
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/fserver.css:
--------------------------------------------------------------------------------
1 | div#edit-field-fserver-api-value-wrapper,
2 | div#edit-field-fserver-versionmajor-value-wrapper,
3 | div#edit-field-fserver-versionpatch-value-wrapper,
4 | div#edit-field-fserver-versionextra-0-value-wrapper {
5 | float: left;
6 | margin-right: 1em;
7 | }
8 | div#edit-field-fserver-recommended-value-wrapper {
9 | clear: both;
10 | }
11 | ul#fserver-release-info,
12 | ul#fserver-release-info li {
13 | list-style: none;
14 | background: 0;
15 | margin: 0;
16 | padding: 0;
17 | }
--------------------------------------------------------------------------------
/fserver.js:
--------------------------------------------------------------------------------
1 | // $Id$
2 |
3 | /**
4 | * JS behaviors for fserver.
5 | */
6 | Drupal.behaviors.fserver = function() {
7 | $('#edit-field-fserver-method-value:not(.processed)').each(function() {
8 | $(this).addClass('processed');
9 | $(this).change(function() {
10 | switch ($(this).val()) {
11 | case '0':
12 | $('#edit-field-fserver-repository-0-value-wrapper').hide();
13 | break;
14 | default:
15 | $('#edit-field-fserver-repository-0-value-wrapper').show();
16 | break;
17 | }
18 | });
19 | $(this).change();
20 | });
21 | };
22 |
--------------------------------------------------------------------------------
/fserver.features.menu_links.inc:
--------------------------------------------------------------------------------
1 | 'features',
12 | 'link_path' => 'fserver',
13 | 'router_path' => 'fserver',
14 | 'link_title' => 'Projects',
15 | 'options' => array(),
16 | 'module' => 'system',
17 | 'hidden' => '0',
18 | 'external' => '0',
19 | 'has_children' => '0',
20 | 'expanded' => '0',
21 | 'weight' => '0',
22 | );
23 | // Translatables
24 | // Included for use with string extractors like potx.
25 | t('Projects');
26 |
27 |
28 | return $menu_links;
29 | }
30 |
--------------------------------------------------------------------------------
/fserver.context.inc:
--------------------------------------------------------------------------------
1 | disabled = FALSE; /* Edit this to true to make a default context disabled initially */
10 | $context->api_version = 3;
11 | $context->name = 'fserver-section-project';
12 | $context->description = '';
13 | $context->tag = '';
14 | $context->conditions = array(
15 | 'node' => array(
16 | 'values' => array(
17 | 'fserver_project' => 'fserver_project',
18 | 'fserver_distro' => 'fserver_distro',
19 | ),
20 | 'options' => array(
21 | 'node_form' => 0,
22 | ),
23 | ),
24 | );
25 | $context->reactions = array(
26 | 'block' => array(
27 | 'blocks' => array(
28 | 'views-fserver_releases-block_1' => array(
29 | 'module' => 'views',
30 | 'delta' => 'fserver_releases-block_1',
31 | 'region' => 'content',
32 | 'weight' => 0,
33 | ),
34 | ),
35 | ),
36 | );
37 | $context->condition_mode = 0;
38 |
39 | $export['fserver-section-project'] = $context;
40 | return $export;
41 | }
42 |
--------------------------------------------------------------------------------
/fserver.strongarm.inc:
--------------------------------------------------------------------------------
1 | disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
10 | $strongarm->api_version = 1;
11 | $strongarm->name = 'content_extra_weights_fserver_project';
12 | $strongarm->value = array(
13 | 'title' => '-5',
14 | 'body_field' => '8',
15 | 'revision_information' => '10',
16 | 'menu' => '0',
17 | 'book' => '9',
18 | 'attachments' => '13',
19 | );
20 |
21 | $export['content_extra_weights_fserver_project'] = $strongarm;
22 | $strongarm = new stdClass;
23 | $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
24 | $strongarm->api_version = 1;
25 | $strongarm->name = 'content_extra_weights_fserver_release';
26 | $strongarm->value = array(
27 | 'title' => '-5',
28 | 'body_field' => '0',
29 | 'revision_information' => '20',
30 | 'menu' => '-2',
31 | 'book' => '10',
32 | 'attachments' => '30',
33 | );
34 |
35 | $export['content_extra_weights_fserver_release'] = $strongarm;
36 | return $export;
37 | }
38 |
--------------------------------------------------------------------------------
/views/fserver_handler_field_release_tag.inc:
--------------------------------------------------------------------------------
1 | add_additional_fields();
11 | }
12 |
13 | function construct() {
14 | parent::construct();
15 | $fields = array(
16 | 0 => array('alias'=> 'core', 'field_name' => 'field_fserver_api'),
17 | 1 => array('alias'=> 'major', 'field_name' => 'field_fserver_versionmajor'),
18 | 2 => array('alias'=> 'patch', 'field_name' => 'field_fserver_versionpatch'),
19 | 3 => array('alias'=> 'extra', 'field_name' => 'field_fserver_versionextra'),
20 | );
21 |
22 | foreach ($fields as $field) {
23 | $alias = $field['alias'];
24 | $table = content_views_tablename($field);
25 | $column = $field['field_name'] .'_value';
26 |
27 | $this->additional_fields[$alias] = array('table' => $table, 'field' => $column);
28 | }
29 | }
30 |
31 | function render($values) {
32 | $core = check_plain($values->{$this->aliases['core']});
33 | $major = check_plain($values->{$this->aliases['major']});
34 | $patch = check_plain($values->{$this->aliases['patch']});
35 | $extra = check_plain($values->{$this->aliases['extra']});
36 |
37 | $release = "$core-$major.$patch" . (!empty($extra) ? "-$extra" : '');
38 | return $release;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/views/fserver_handler_sort_release_tag.inc:
--------------------------------------------------------------------------------
1 | query->ensure_table($table, $this->relationship);
14 |
15 | // Order by:
16 | // 1. API version (e.g. 6.x before 5.x).
17 | // 2. no_extra pseudo-field (e.g. 2.0 before 2.0-beta1).
18 | // 3. versionmajor (2.x before 1.x).
19 | // 4. versionpatch (2.1 before 2.0).
20 | // 5. versionextra (2.1-beta1 before 2.1-alpha1).
21 |
22 | // 1. API.
23 | $this->query->add_orderby($table_alias, 'field_fserver_api_value', $this->options['order']);
24 |
25 | // 2.
26 | $this->query->add_field(NULL, "IF ({$table}.field_fserver_versionextra_value IS NULL, 1, 0)", "{$table}_no_extra");
27 | $this->query->add_orderby(NULL, NULL, $this->options['order'], "{$table}_no_extra");
28 |
29 | // 3-5.
30 | $fields = array(
31 | array('field_name' => 'field_fserver_versionmajor'),
32 | array('field_name' => 'field_fserver_versionpatch'),
33 | array('field_name' => 'field_fserver_versionextra'),
34 | );
35 | foreach ($fields as $field) {
36 | $column = $field['field_name'] .'_value';
37 | $this->query->add_orderby($table_alias, $column, $this->options['order']);
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/fserver.features.inc:
--------------------------------------------------------------------------------
1 | 3);
10 | }
11 | elseif ($module == "strongarm" && $api == "strongarm") {
12 | return array("version" => 1);
13 | }
14 | }
15 |
16 | /**
17 | * Implementation of hook_node_info().
18 | */
19 | function fserver_node_info() {
20 | $items = array(
21 | 'fserver_distro' => array(
22 | 'name' => t('Distribution'),
23 | 'module' => 'features',
24 | 'description' => t('A feature distribution page. Provides the drush make commands and releases for download.'),
25 | 'has_title' => '1',
26 | 'title_label' => t('Distribution'),
27 | 'has_body' => '1',
28 | 'body_label' => t('Body'),
29 | 'min_word_count' => '0',
30 | 'help' => '',
31 | ),
32 | 'fserver_project' => array(
33 | 'name' => t('Project'),
34 | 'module' => 'features',
35 | 'description' => t('A feature project page. Provides a summary of project information and releases for download.'),
36 | 'has_title' => '1',
37 | 'title_label' => t('Project'),
38 | 'has_body' => '1',
39 | 'body_label' => t('Description'),
40 | 'min_word_count' => '0',
41 | 'help' => '',
42 | ),
43 | 'fserver_release' => array(
44 | 'name' => t('Release'),
45 | 'module' => 'features',
46 | 'description' => t('A single release package for a feature.'),
47 | 'has_title' => '1',
48 | 'title_label' => t('Release'),
49 | 'has_body' => '1',
50 | 'body_label' => t('Notes'),
51 | 'min_word_count' => '0',
52 | 'help' => '',
53 | ),
54 | );
55 | return $items;
56 | }
57 |
58 | /**
59 | * Implementation of hook_views_api().
60 | */
61 | function fserver_views_api() {
62 | return array(
63 | 'api' => '2',
64 | );
65 | }
66 |
--------------------------------------------------------------------------------
/fserver.info:
--------------------------------------------------------------------------------
1 | core = "6.x"
2 | dependencies[] = "context"
3 | dependencies[] = "features"
4 | dependencies[] = "filefield"
5 | dependencies[] = "menu"
6 | dependencies[] = "node"
7 | dependencies[] = "nodereference"
8 | dependencies[] = "number"
9 | dependencies[] = "strongarm"
10 | dependencies[] = "views"
11 | description = "Provides feature projects and releases."
12 | features[content][] = "fserver_distro-field_fserver_drushmake"
13 | features[content][] = "fserver_distro-field_fserver_name"
14 | features[content][] = "fserver_project-field_fserver_method"
15 | features[content][] = "fserver_project-field_fserver_name"
16 | features[content][] = "fserver_project-field_fserver_redirect"
17 | features[content][] = "fserver_project-field_fserver_repository"
18 | features[content][] = "fserver_project-field_fserver_type"
19 | features[content][] = "fserver_release-field_fserver_api"
20 | features[content][] = "fserver_release-field_fserver_file"
21 | features[content][] = "fserver_release-field_fserver_project"
22 | features[content][] = "fserver_release-field_fserver_recommended"
23 | features[content][] = "fserver_release-field_fserver_security"
24 | features[content][] = "fserver_release-field_fserver_versionextra"
25 | features[content][] = "fserver_release-field_fserver_versionmajor"
26 | features[content][] = "fserver_release-field_fserver_versionpatch"
27 | features[context][] = "fserver-section-project"
28 | features[ctools][] = "context:context:3"
29 | features[ctools][] = "strongarm:strongarm:1"
30 | features[menu_links][] = "features:fserver"
31 | features[node][] = "fserver_distro"
32 | features[node][] = "fserver_project"
33 | features[node][] = "fserver_release"
34 | features[variable][] = "content_extra_weights_fserver_project"
35 | features[variable][] = "content_extra_weights_fserver_release"
36 | features[views][] = "fserver_projects"
37 | features[views][] = "fserver_release_lookup"
38 | features[views][] = "fserver_releases"
39 | features[views][] = "fserver_updates"
40 | features[views_api][] = "api:3.0-alpha1"
41 | name = "Feature Server"
42 | package = "Features"
43 |
--------------------------------------------------------------------------------
/views/fserver-updatexml.tpl.php:
--------------------------------------------------------------------------------
1 | " ?>
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | 1
14 |
15 |
16 |
17 |
18 |
19 | Projects
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | published
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | Release type
46 | Security update
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/fserver.views.inc:
--------------------------------------------------------------------------------
1 | 'views',
9 | 'style' => array(
10 | 'updatexml' => array(
11 | 'title' => t('Update XML'),
12 | 'help' => t('Generates a project XML feed compatible with the update module.'),
13 | 'handler' => 'fserver_plugin_style_updatexml',
14 | 'theme' => 'fserver_updatexml',
15 | 'theme path' => drupal_get_path('module', 'fserver') .'/views',
16 | 'path' => drupal_get_path('module', 'fserver') .'/views',
17 | 'uses row plugin' => FALSE,
18 | 'uses fields' => TRUE,
19 | 'uses options' => TRUE,
20 | 'type' => 'feed',
21 | ),
22 | ),
23 | );
24 | }
25 |
26 | /**
27 | * Implementation of hook_views_plugins().
28 | */
29 | function fserver_views_data() {
30 | $data = array();
31 |
32 | // MD5 hash
33 | $data['files']['mdhash'] = array(
34 | 'real field' => 'filepath',
35 | 'title' => t('MD5 hash'),
36 | 'help' => t('Provides an MD5 hash of the file.'),
37 | 'field' => array(
38 | 'handler' => 'fserver_handler_field_mdhash',
39 | ),
40 | );
41 |
42 | // Release tag (Content group)
43 | $data['views']['release_tag'] = array(
44 | 'group' => t('Content'),
45 | 'title' => t('Release tag'),
46 | 'help' => t('Formatted release tag [Core].x-[Major].[Patch][-Extra]'),
47 | 'field' => array(
48 | 'handler' => 'fserver_handler_field_release_tag',
49 | 'click sortable' => TRUE,
50 | 'title' => t('Release'),
51 | ),
52 | 'sort' => array(
53 | 'handler' => 'fserver_handler_sort_release_tag',
54 | ),
55 | );
56 |
57 | return $data;
58 | }
59 |
60 | /**
61 | * Implementation of hook_views_handlers().
62 | */
63 | function fserver_views_handlers() {
64 | return array(
65 | 'info' => array(
66 | 'path' => drupal_get_path('module', 'fserver') .'/views',
67 | ),
68 | 'handlers' => array(
69 | 'fserver_handler_field_mdhash' => array(
70 | 'parent' => 'views_handler_field',
71 | ),
72 | 'fserver_handler_field_release_tag' => array(
73 | 'parent' => 'views_handler_field',
74 | ),
75 | 'fserver_handler_sort_release_tag' => array(
76 | 'parent' => 'views_handler_sort',
77 | ),
78 | ),
79 | );
80 | }
81 |
--------------------------------------------------------------------------------
/views/fserver_plugin_style_updatexml.inc:
--------------------------------------------------------------------------------
1 | project_elements() as $element) {
26 | $project_defaults[$element] = '';
27 | }
28 | $options['project'] = array('default' => $project_defaults);
29 |
30 | $release_defaults = array();
31 | foreach ($this->release_elements() as $element) {
32 | $release_defaults[$element] = '';
33 | }
34 | $options['release'] = array('default' => $release_defaults);
35 |
36 | return $options;
37 | }
38 |
39 | /**
40 | * Render the given style.
41 | */
42 | function options_form(&$form, &$form_state) {
43 | // Build list of valid fields
44 | $options = array();
45 | $handlers = $this->display->handler->get_handlers('field');
46 | foreach ($handlers as $field => $handler) {
47 | if (empty($handler->options['exclude'])) {
48 | $options[$field] = $handler->label();
49 | }
50 | }
51 |
52 | $form['project'] = array(
53 | '#tree' => TRUE,
54 | '#type' => 'fieldset',
55 | '#title' => t('Project fields'),
56 | );
57 | foreach ($this->project_elements() as $element) {
58 | $form['project'][$element] = array(
59 | '#title' => $element,
60 | '#type' => 'select',
61 | '#options' => $options,
62 | '#default_value' => $this->options['project'][$element],
63 | );
64 | }
65 |
66 | $form['release'] = array(
67 | '#tree' => TRUE,
68 | '#type' => 'fieldset',
69 | '#title' => t('Release fields'),
70 | );
71 | foreach ($this->release_elements() as $element) {
72 | $form['release'][$element] = array(
73 | '#title' => $element,
74 | '#type' => 'select',
75 | '#options' => $options,
76 | '#default_value' => $this->options['release'][$element],
77 | );
78 | }
79 | }
80 |
81 | /**
82 | * Theme preprocessor.
83 | */
84 | function preprocess(&$vars) {
85 | $fields = $vars['view']->field;
86 |
87 | // Build project XML values
88 | $project = array();
89 | foreach ($vars['options']['project'] as $element => $field) {
90 | $alias = $fields[$field]->field_alias;
91 | foreach ($vars['rows'] as $row) {
92 | if (isset($row->{$alias})) {
93 | $project[$element] = $fields[$field]->theme($row);
94 | continue;
95 | }
96 | }
97 | }
98 |
99 | // If this is a legacy project and has a redirect URL use it immediately.
100 | if (!empty($project['redirect'])) {
101 | $redirect = $project['redirect'];
102 | $redirect .= !empty($vars['view']->args) ? '/'. implode('/', $vars['view']->args) : '';
103 | drupal_goto($redirect);
104 | }
105 |
106 | // Additional formatting for some values
107 | if (isset($project['link'])) {
108 | $project['link'] = url($project['link'], array('absolute' => TRUE));
109 | }
110 |
111 | // Build release XML values
112 | $releases = array();
113 | $project['recommended_major'] = '';
114 | $project['supported_majors'] = array();
115 | foreach ($vars['rows'] as $num => $row) {
116 | foreach ($vars['options']['release'] as $element => $field) {
117 | $alias = $fields[$field]->field_alias;
118 | if (isset($row->{$alias})) {
119 | switch ($element) {
120 | // Don't mess with certain fields, period.
121 | case 'recommended':
122 | case 'security':
123 | case 'version_major':
124 | case 'version_patch':
125 | case 'version_extra':
126 | $releases[$num][$element] = check_plain($row->{$alias});
127 | break;
128 | default:
129 | $releases[$num][$element] = $fields[$field]->theme($row);
130 | break;
131 | }
132 | }
133 | }
134 |
135 | if ($releases[$num]['recommended']) {
136 | // Use the first major version for the project major.
137 | // The list is sorted by "major desc", this way the latest branch will be
138 | // recommended and all other branches (which have a recommended release)
139 | // will be tagged as supported.
140 | if (empty($project['recommended_major'])) {
141 | $project['recommended_major'] = $releases[$num]['version_major'];
142 | }
143 | $project['supported_majors'][$releases[$num]['version_major']] = $releases[$num]['version_major'];
144 | }
145 |
146 | // Version
147 | $releases[$num]['version'] = "{$project['api_version']}-{$releases[$num]['version_major']}.{$releases[$num]['version_patch']}";
148 | if (!empty($releases[$num]['version_extra'])) {
149 | $releases[$num]['version'] .= "-{$releases[$num]['version_extra']}";
150 | }
151 |
152 | // Name
153 | $releases[$num]['name'] = "{$project['short_name']} {$releases[$num]['version']}";
154 |
155 | // Release link
156 | $releases[$num]['release_link'] = url($releases[$num]['release_link'], array('absolute' => TRUE));
157 |
158 | // Download link
159 | $releases[$num]['download_link'] = file_create_url($releases[$num]['download_link']);
160 | }
161 | sort($project['supported_majors']);
162 | $project['supported_majors'] = implode(",", $project['supported_majors']);
163 |
164 | // Finalize
165 | $vars['project'] = $project;
166 | $vars['releases'] = $releases;
167 | drupal_set_header('Content-Type: application/xml; charset=utf-8');
168 | }
169 | }
170 |
--------------------------------------------------------------------------------
/fserver.module:
--------------------------------------------------------------------------------
1 | 'Manual'.
10 | $links = array();
11 | if ($type == 'node' && $object->type == 'fserver_project' && empty($object->field_fserver_method[0]['value'])) {
12 | $item = menu_get_item('node/add/fserver-release');
13 | if ($item && $item['access']) {
14 | $links['fserver-add-release'] = array(
15 | 'title' => t('Add new @release', array('@release' => strtolower($item['title']))),
16 | 'href' => 'node/add/fserver-release',
17 | );
18 | }
19 | }
20 | return $links;
21 | }
22 |
23 | /**
24 | * Implementation of hook_nodeapi().
25 | */
26 | function fserver_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
27 | if ($op == 'view' && $node->type == 'fserver_distro' && menu_get_object()->nid === $node->nid) {
28 | //$node->content['field_fserver_drushmake'][0]['value'] = ''. $node->field_fserver_drushmake[0]['value'] .'';
29 | $node->content['field_fserver_drushmake']['field']['items'][0]['#item']['safe'] = '
';
30 |
31 | }
32 | if ($op == 'view' && $node->type == 'fserver_project' && menu_get_object()->nid === $node->nid) {
33 | $url = url("fserver", array('purl' => array('disabled' => TRUE), 'absolute' => TRUE));
34 | $project = check_plain($node->field_fserver_name[0]['value']);
35 | $node->content['project_info'] = array(
36 | '#type' => 'fieldset',
37 | 'info' => array(
38 | '#access' => node_access('update', $node),
39 | '#title' => t("For @project.info", array('@project' => $project)),
40 | '#type' => 'item',
41 | '#value' => "project status url = {$url}",
42 | ),
43 | 'drush_make' => array(
44 | '#title' => t("For drush make makefiles"),
45 | '#type' => 'item',
46 | '#value' => "projects[{$project}][location] = {$url}",
47 | ),
48 | '#weight' => -10,
49 | );
50 | }
51 | else if ($op == 'presave' && $node->type == 'fserver_project') {
52 | if (empty($node->field_fserver_method[0]['value'])) {
53 | $node->field_fserver_repository[0]['value'] = '';
54 | }
55 | }
56 | else if ($op == 'presave' && $node->type == 'fserver_release') {
57 | $node->title = fserver_generate_version($node);
58 |
59 | // If this release is recommended, set all other ones to not recommended.
60 | if ($node->field_fserver_recommended[0]['value'] == 1) {
61 | $view = views_get_view('fserver_releases');
62 | $view->set_arguments(array($node->field_fserver_project[0]['nid'], $node->field_fserver_api[0]['value']));
63 | $view->execute('block_1');
64 | foreach ($view->result as $data) {
65 | if (!isset($node->nid) || $data->nid != $node->nid) {
66 | $release = node_load($data->nid);
67 | $release->field_fserver_recommended[0]['value'] = 0;
68 | node_save($release);
69 | }
70 | }
71 | }
72 | }
73 | else if ($op == 'view' && $node->type == 'fserver_release') {
74 | drupal_add_css(drupal_get_path('module', 'fserver') . '/fserver.css');
75 | $download_url = url($node->field_fserver_file[0]['filepath'], array('purl' => array('disabled' => TRUE), 'absolute' => TRUE));
76 | $contents = file_exists($node->field_fserver_file[0]['filepath']) ? file_get_contents($node->field_fserver_file[0]['filepath']) : '';
77 | $info = array();
78 | $info[] = t('Download: !url', array('!url' => l($download_url, $download_url, array('absolute' => TRUE))));
79 | $info[] = t('md5 hash: !md5', array('!md5' => md5($contents)));
80 | $info[] = t('Size: !size', array('!size' => format_size($node->field_fserver_file[0]['filesize'])));
81 | $node->content['fserver_info'] = array(
82 | '#type' => 'fieldset',
83 | 'content' => array(
84 | '#type' => 'markup',
85 | '#value' => theme('item_list', $info, NULL, 'ul', array('id' => 'fserver-release-info')),
86 | ),
87 | '#weight' => -10,
88 | );
89 | $project = node_load($node->field_fserver_project[0]['nid']);
90 | drupal_set_breadcrumb(array(l(t('Home'), NULL), l($project->title, 'node/' . $project->nid)));
91 | }
92 | }
93 |
94 | /**
95 | * Option field callback for version options.
96 | */
97 | function fserver_cck_options($type = 'core') {
98 | switch ($type) {
99 | case 'core':
100 | return drupal_map_assoc(array('5.x', '6.x', '7.x'));
101 |
102 | case 'major':
103 | $major = range(0, 50);
104 | unset($major[0]);
105 | return $major;
106 |
107 | case 'method':
108 | return array(
109 | 0 => t('Manual upload'),
110 | 'git' => t('GIT repository tags'),
111 | 'svn' => t('SVN repository tags folder'),
112 | );
113 |
114 | case 'patch':
115 | return range(0, 50);
116 |
117 | case 'recommended':
118 | return array(t('Not recommended'), t('Recommended'));
119 |
120 | case 'security':
121 | return array(t('Not a security release'), t('Security release'));
122 |
123 | case 'type':
124 | // We don't use t() here as the update XML requires these strings to be uniform.
125 | return array(
126 | // 'core' => 'Drupal project',
127 | 'profile' => 'Installation profiles',
128 | 'module' => 'Modules',
129 | 'theme' => 'Themes',
130 | // 'theme engine' => 'Theme engines',
131 | // 'translation' => 'Translations',
132 | );
133 | }
134 | }
135 |
136 | /**
137 | * Parse a package name into values: core, major, patch and extra.
138 | */
139 | function fserver_parse_package_name($package_filename) {
140 | // example: fserver-6.x-2.0-rc3.tar.gz
141 | if (preg_match('/^(?\w+)-(?\d+\.x)-(?\d+)\.(?\d+)-?(?\w+)?\.(tar\.gz|tgz)$/', $package_filename, $matches)) {
142 | return $matches;
143 | };
144 | return array();
145 | }
146 |
147 | /**
148 | * Parse a package name into values: core, major, patch and extra.
149 | */
150 | function fserver_parse_tag_name($tag) {
151 | // example: drupal-6--1-0-alpha1
152 | if (preg_match('/^(?P\w+)-(?P\d+)--(?P\d+)-(?P\d+)-?(?P\w+)?$/', $tag, $matches)) {
153 | $parsed = array_intersect_key($matches, array('core' => '', 'major' => '', 'patch' => '', 'extra' => ''));
154 | if (!empty($parsed)) {
155 | $parsed['core'] = "{$parsed['core']}.x";
156 | $parsed['original'] = $tag;
157 | $parsed['version'] = "{$parsed['core']}-{$parsed['major']}.{$parsed['patch']}" . (!empty($parsed['extra']) ? "-{$parsed['extra']}" : '');
158 | return $parsed;
159 | }
160 | }
161 | return array();
162 | }
163 |
164 | /**
165 | * Implementation of hook_form_alter() for fserver_project_node_form.
166 | */
167 | function fserver_form_fserver_project_node_form_alter(&$form, $form_state) {
168 | drupal_add_js(drupal_get_path('module', 'fserver') . '/fserver.js');
169 | $form['#validate'][] = 'fserver_project_node_form_validate';
170 | }
171 |
172 | /**
173 | * Validate handler for fserver_project_node_form.
174 | */
175 | function fserver_project_node_form_validate($form, &$form_state) {
176 | // Ensure repository URL is set if using a non-manual method.
177 | if (!empty($form_state['values']['field_fserver_method'][0]['value']) && empty($form_state['values']['field_fserver_repository'][0]['value'])) {
178 | form_set_error($form_state['values']['field_fserver_repository'][0]['_error_element'], t('Please provide a valid repository URL for this project.'));
179 | }
180 | }
181 |
182 | /**
183 | * Implementation of hook_form_alter() for fserver_release_node_form.
184 | */
185 | function fserver_form_fserver_release_node_form_alter(&$form, $form_state) {
186 | drupal_add_css(drupal_get_path('module', 'fserver') . '/fserver.css');
187 | $form['title'] = array(
188 | '#type' => 'value',
189 | '#value' => 'VOID',
190 | );
191 | $form['#submit'][] = 'fserver_release_node_form_submit';
192 | }
193 |
194 | /**
195 | * Submit handler for fserver_release_node_form.
196 | */
197 | function fserver_release_node_form_submit($form, &$form_state) {
198 | // Only do something, if the user clicked the preview button.
199 | if (isset($form_state['clicked_button']['#submit']) && in_array('node_form_build_preview', $form_state['clicked_button']['#submit'])) {
200 | $node = node_submit($form_state['values']);
201 | $node->title = fserver_generate_version($node);
202 | $form_state['values'] = (array) $node;
203 | }
204 | }
205 |
206 | /**
207 | * Generate a standard version string from a node object.
208 | * @TODO: Merge this or make use of it in fserver_handler_field_release_tag::render().
209 | */
210 | function fserver_generate_version($node, $raw = FALSE) {
211 | $project = node_load($node->field_fserver_project[0]['nid']);
212 | $core = $node->field_fserver_api[0]['value'];
213 | $major = $node->field_fserver_versionmajor[0]['value'];
214 | $patch = $node->field_fserver_versionpatch[0]['value'];
215 | $extra = $node->field_fserver_versionextra[0]['value'];
216 | $version = "{$core}-{$major}.{$patch}" . (!empty($extra) ? "-{$extra}" : '');
217 | return $raw ? $version : "{$project->title} $version";
218 | }
219 |
--------------------------------------------------------------------------------
/fserver.features.content.inc:
--------------------------------------------------------------------------------
1 | 'field_fserver_drushmake',
12 | 'type_name' => 'fserver_distro',
13 | 'display_settings' => array(
14 | 'label' => array(
15 | 'format' => 'above',
16 | 'exclude' => 0,
17 | ),
18 | 'teaser' => array(
19 | 'format' => 'default',
20 | 'exclude' => 0,
21 | ),
22 | 'full' => array(
23 | 'format' => 'default',
24 | 'exclude' => 0,
25 | ),
26 | '4' => array(
27 | 'format' => 'default',
28 | 'exclude' => 0,
29 | ),
30 | ),
31 | 'widget_active' => '1',
32 | 'type' => 'text',
33 | 'required' => '1',
34 | 'multiple' => '0',
35 | 'module' => 'text',
36 | 'active' => '1',
37 | 'text_processing' => '0',
38 | 'max_length' => '',
39 | 'allowed_values' => '',
40 | 'allowed_values_php' => '',
41 | 'widget' => array(
42 | 'rows' => '5',
43 | 'size' => 60,
44 | 'default_value' => array(
45 | '0' => array(
46 | 'value' => '',
47 | '_error_element' => 'default_value_widget][field_fserver_drushmake][0][value',
48 | ),
49 | ),
50 | 'default_value_php' => NULL,
51 | 'label' => 'Drush Make Script',
52 | 'weight' => '-3',
53 | 'description' => '',
54 | 'type' => 'text_textarea',
55 | 'module' => 'text',
56 | ),
57 | );
58 |
59 | // Exported field: field_fserver_name
60 | $fields['fserver_distro-field_fserver_name'] = array(
61 | 'field_name' => 'field_fserver_name',
62 | 'type_name' => 'fserver_distro',
63 | 'display_settings' => array(
64 | 'weight' => '-4',
65 | 'parent' => '',
66 | 'label' => array(
67 | 'format' => 'hidden',
68 | ),
69 | 'teaser' => array(
70 | 'format' => 'hidden',
71 | 'exclude' => 0,
72 | ),
73 | 'full' => array(
74 | 'format' => 'hidden',
75 | 'exclude' => 0,
76 | ),
77 | '4' => array(
78 | 'format' => 'default',
79 | 'exclude' => 0,
80 | ),
81 | ),
82 | 'widget_active' => '1',
83 | 'type' => 'text',
84 | 'required' => '1',
85 | 'multiple' => '0',
86 | 'module' => 'text',
87 | 'active' => '1',
88 | 'text_processing' => '0',
89 | 'max_length' => '',
90 | 'allowed_values' => '',
91 | 'allowed_values_php' => '',
92 | 'widget' => array(
93 | 'rows' => 5,
94 | 'size' => '30',
95 | 'default_value' => array(
96 | '0' => array(
97 | 'value' => '',
98 | '_error_element' => 'default_value_widget][field_fserver_name][0][value',
99 | ),
100 | ),
101 | 'default_value_php' => NULL,
102 | 'label' => 'Machine name',
103 | 'weight' => '-4',
104 | 'description' => 'The machine-readable name for your project. This name must contain only lowercase letters, numbers, and underscores. Example: cooking_recipes.',
105 | 'type' => 'text_textfield',
106 | 'module' => 'text',
107 | ),
108 | );
109 |
110 | // Exported field: field_fserver_method
111 | $fields['fserver_project-field_fserver_method'] = array(
112 | 'field_name' => 'field_fserver_method',
113 | 'type_name' => 'fserver_project',
114 | 'display_settings' => array(
115 | 'weight' => '-2',
116 | 'parent' => '',
117 | 'label' => array(
118 | 'format' => 'hidden',
119 | ),
120 | 'teaser' => array(
121 | 'format' => 'hidden',
122 | 'exclude' => 0,
123 | ),
124 | 'full' => array(
125 | 'format' => 'hidden',
126 | 'exclude' => 0,
127 | ),
128 | '4' => array(
129 | 'format' => 'default',
130 | 'exclude' => 0,
131 | ),
132 | ),
133 | 'widget_active' => '1',
134 | 'type' => 'text',
135 | 'required' => '1',
136 | 'multiple' => '0',
137 | 'module' => 'text',
138 | 'active' => '1',
139 | 'text_processing' => '0',
140 | 'max_length' => '',
141 | 'allowed_values' => '',
142 | 'allowed_values_php' => 'return fserver_cck_options("method");',
143 | 'widget' => array(
144 | 'default_value' => array(
145 | '0' => array(
146 | 'value' => '',
147 | ),
148 | ),
149 | 'default_value_php' => NULL,
150 | 'label' => 'Packaging method',
151 | 'weight' => '1',
152 | 'description' => 'Choose the packaging method to use for this project.',
153 | 'type' => 'optionwidgets_select',
154 | 'module' => 'optionwidgets',
155 | ),
156 | );
157 |
158 | // Exported field: field_fserver_name
159 | $fields['fserver_project-field_fserver_name'] = array(
160 | 'field_name' => 'field_fserver_name',
161 | 'type_name' => 'fserver_project',
162 | 'display_settings' => array(
163 | 'weight' => '-4',
164 | 'parent' => '',
165 | 'label' => array(
166 | 'format' => 'hidden',
167 | ),
168 | 'teaser' => array(
169 | 'format' => 'hidden',
170 | 'exclude' => 0,
171 | ),
172 | 'full' => array(
173 | 'format' => 'hidden',
174 | 'exclude' => 0,
175 | ),
176 | '4' => array(
177 | 'format' => 'default',
178 | 'exclude' => 0,
179 | ),
180 | ),
181 | 'widget_active' => '1',
182 | 'type' => 'text',
183 | 'required' => '1',
184 | 'multiple' => '0',
185 | 'module' => 'text',
186 | 'active' => '1',
187 | 'text_processing' => '0',
188 | 'max_length' => '',
189 | 'allowed_values' => '',
190 | 'allowed_values_php' => '',
191 | 'widget' => array(
192 | 'rows' => 5,
193 | 'size' => '30',
194 | 'default_value' => array(
195 | '0' => array(
196 | 'value' => '',
197 | '_error_element' => 'default_value_widget][field_fserver_name][0][value',
198 | ),
199 | ),
200 | 'default_value_php' => NULL,
201 | 'label' => 'Machine name',
202 | 'weight' => '-4',
203 | 'description' => 'The machine-readable name for your project. This name must contain only lowercase letters, numbers, and underscores. Example: cooking_recipes.',
204 | 'type' => 'text_textfield',
205 | 'module' => 'text',
206 | ),
207 | );
208 |
209 | // Exported field: field_fserver_redirect
210 | $fields['fserver_project-field_fserver_redirect'] = array(
211 | 'field_name' => 'field_fserver_redirect',
212 | 'type_name' => 'fserver_project',
213 | 'display_settings' => array(
214 | 'label' => array(
215 | 'format' => 'above',
216 | 'exclude' => 0,
217 | ),
218 | '5' => array(
219 | 'format' => 'default',
220 | 'exclude' => 0,
221 | ),
222 | 'teaser' => array(
223 | 'format' => 'default',
224 | 'exclude' => 0,
225 | ),
226 | 'full' => array(
227 | 'format' => 'default',
228 | 'exclude' => 0,
229 | ),
230 | '4' => array(
231 | 'format' => 'default',
232 | 'exclude' => 0,
233 | ),
234 | '2' => array(
235 | 'format' => 'default',
236 | 'exclude' => 0,
237 | ),
238 | '3' => array(
239 | 'format' => 'default',
240 | 'exclude' => 0,
241 | ),
242 | ),
243 | 'widget_active' => '1',
244 | 'type' => 'text',
245 | 'required' => '0',
246 | 'multiple' => '0',
247 | 'module' => 'text',
248 | 'active' => '1',
249 | 'text_processing' => '0',
250 | 'max_length' => '',
251 | 'allowed_values' => '',
252 | 'allowed_values_php' => '',
253 | 'widget' => array(
254 | 'rows' => 5,
255 | 'size' => '60',
256 | 'default_value' => array(
257 | '0' => array(
258 | 'value' => '',
259 | '_error_element' => 'default_value_widget][field_fserver_redirect][0][value',
260 | ),
261 | ),
262 | 'default_value_php' => NULL,
263 | 'label' => 'Redirect URL (for legacy projects)',
264 | 'weight' => '3',
265 | 'description' => 'Enter a redirect URL to use for this project\'s update XML feed if this project has moved.',
266 | 'type' => 'text_textfield',
267 | 'module' => 'text',
268 | ),
269 | );
270 |
271 | // Exported field: field_fserver_repository
272 | $fields['fserver_project-field_fserver_repository'] = array(
273 | 'field_name' => 'field_fserver_repository',
274 | 'type_name' => 'fserver_project',
275 | 'display_settings' => array(
276 | 'weight' => '-1',
277 | 'parent' => '',
278 | 'label' => array(
279 | 'format' => 'inline',
280 | ),
281 | 'teaser' => array(
282 | 'format' => 'default',
283 | 'exclude' => 0,
284 | ),
285 | 'full' => array(
286 | 'format' => 'default',
287 | 'exclude' => 0,
288 | ),
289 | '4' => array(
290 | 'format' => 'default',
291 | 'exclude' => 0,
292 | ),
293 | ),
294 | 'widget_active' => '1',
295 | 'type' => 'text',
296 | 'required' => '0',
297 | 'multiple' => '0',
298 | 'module' => 'text',
299 | 'active' => '1',
300 | 'text_processing' => '0',
301 | 'max_length' => '',
302 | 'allowed_values' => '',
303 | 'allowed_values_php' => '',
304 | 'widget' => array(
305 | 'rows' => 5,
306 | 'size' => '60',
307 | 'default_value' => array(
308 | '0' => array(
309 | 'value' => '',
310 | '_error_element' => 'default_value_widget][field_fserver_repository][0][value',
311 | ),
312 | ),
313 | 'default_value_php' => NULL,
314 | 'label' => 'Repository URL',
315 | 'weight' => '2',
316 | 'description' => 'Example: git://github.com/myname/myproject.git',
317 | 'type' => 'text_textfield',
318 | 'module' => 'text',
319 | ),
320 | );
321 |
322 | // Exported field: field_fserver_type
323 | $fields['fserver_project-field_fserver_type'] = array(
324 | 'field_name' => 'field_fserver_type',
325 | 'type_name' => 'fserver_project',
326 | 'display_settings' => array(
327 | 'weight' => '-3',
328 | 'parent' => '',
329 | 'label' => array(
330 | 'format' => 'hidden',
331 | ),
332 | 'teaser' => array(
333 | 'format' => 'hidden',
334 | 'exclude' => 0,
335 | ),
336 | 'full' => array(
337 | 'format' => 'hidden',
338 | 'exclude' => 0,
339 | ),
340 | '4' => array(
341 | 'format' => 'default',
342 | 'exclude' => 0,
343 | ),
344 | ),
345 | 'widget_active' => '1',
346 | 'type' => 'text',
347 | 'required' => '1',
348 | 'multiple' => '0',
349 | 'module' => 'text',
350 | 'active' => '1',
351 | 'text_processing' => '0',
352 | 'max_length' => '',
353 | 'allowed_values' => '',
354 | 'allowed_values_php' => 'return fserver_cck_options(\'type\');',
355 | 'widget' => array(
356 | 'default_value' => array(
357 | '0' => array(
358 | 'value' => '',
359 | ),
360 | ),
361 | 'default_value_php' => NULL,
362 | 'label' => 'Type',
363 | 'weight' => '-2',
364 | 'description' => '',
365 | 'type' => 'optionwidgets_select',
366 | 'module' => 'optionwidgets',
367 | ),
368 | );
369 |
370 | // Exported field: field_fserver_api
371 | $fields['fserver_release-field_fserver_api'] = array(
372 | 'field_name' => 'field_fserver_api',
373 | 'type_name' => 'fserver_release',
374 | 'display_settings' => array(
375 | 'weight' => '-10',
376 | 'parent' => '',
377 | 'label' => array(
378 | 'format' => 'hidden',
379 | ),
380 | 'teaser' => array(
381 | 'format' => 'hidden',
382 | 'exclude' => 1,
383 | ),
384 | 'full' => array(
385 | 'format' => 'hidden',
386 | 'exclude' => 1,
387 | ),
388 | '4' => array(
389 | 'format' => 'default',
390 | 'exclude' => 0,
391 | ),
392 | ),
393 | 'widget_active' => '1',
394 | 'type' => 'text',
395 | 'required' => '1',
396 | 'multiple' => '0',
397 | 'module' => 'text',
398 | 'active' => '1',
399 | 'text_processing' => '0',
400 | 'max_length' => '',
401 | 'allowed_values' => '',
402 | 'allowed_values_php' => 'return fserver_cck_options(\'core\');',
403 | 'widget' => array(
404 | 'default_value' => array(
405 | '0' => array(
406 | 'value' => '6.x',
407 | ),
408 | ),
409 | 'default_value_php' => NULL,
410 | 'label' => 'Core compatibility',
411 | 'weight' => '-10',
412 | 'description' => '',
413 | 'type' => 'optionwidgets_select',
414 | 'module' => 'optionwidgets',
415 | ),
416 | );
417 |
418 | // Exported field: field_fserver_file
419 | $fields['fserver_release-field_fserver_file'] = array(
420 | 'field_name' => 'field_fserver_file',
421 | 'type_name' => 'fserver_release',
422 | 'display_settings' => array(
423 | 'weight' => '-13',
424 | 'parent' => '',
425 | 'label' => array(
426 | 'format' => 'hidden',
427 | ),
428 | 'teaser' => array(
429 | 'format' => 'hidden',
430 | 'exclude' => 1,
431 | ),
432 | 'full' => array(
433 | 'format' => 'hidden',
434 | 'exclude' => 1,
435 | ),
436 | '4' => array(
437 | 'format' => 'default',
438 | 'exclude' => 0,
439 | ),
440 | ),
441 | 'widget_active' => '1',
442 | 'type' => 'filefield',
443 | 'required' => '1',
444 | 'multiple' => '0',
445 | 'module' => 'filefield',
446 | 'active' => '1',
447 | 'list_field' => '0',
448 | 'list_default' => 1,
449 | 'description_field' => '0',
450 | 'widget' => array(
451 | 'file_extensions' => 'tgz tar gz',
452 | 'file_path' => 'fserver',
453 | 'progress_indicator' => 'bar',
454 | 'max_filesize_per_file' => '',
455 | 'max_filesize_per_node' => '',
456 | 'label' => 'Package',
457 | 'weight' => '-13',
458 | 'description' => '',
459 | 'type' => 'filefield_widget',
460 | 'module' => 'filefield',
461 | ),
462 | );
463 |
464 | // Exported field: field_fserver_project
465 | $fields['fserver_release-field_fserver_project'] = array(
466 | 'field_name' => 'field_fserver_project',
467 | 'type_name' => 'fserver_release',
468 | 'display_settings' => array(
469 | 'weight' => '-11',
470 | 'parent' => '',
471 | 'label' => array(
472 | 'format' => 'hidden',
473 | ),
474 | 'teaser' => array(
475 | 'format' => 'hidden',
476 | 'exclude' => 1,
477 | ),
478 | 'full' => array(
479 | 'format' => 'hidden',
480 | 'exclude' => 1,
481 | ),
482 | '4' => array(
483 | 'format' => 'default',
484 | 'exclude' => 0,
485 | ),
486 | ),
487 | 'widget_active' => '1',
488 | 'type' => 'nodereference',
489 | 'required' => '1',
490 | 'multiple' => '0',
491 | 'module' => 'nodereference',
492 | 'active' => '1',
493 | 'referenceable_types' => array(
494 | 'fserver_distro' => 'fserver_distro',
495 | 'fserver_project' => 'fserver_project',
496 | 'page' => 0,
497 | 'fserver_release' => 0,
498 | 'story' => 0,
499 | ),
500 | 'advanced_view' => '--',
501 | 'advanced_view_args' => '',
502 | 'widget' => array(
503 | 'autocomplete_match' => 'contains',
504 | 'size' => 60,
505 | 'default_value' => array(
506 | '0' => array(
507 | 'nid' => '',
508 | ),
509 | ),
510 | 'default_value_php' => NULL,
511 | 'label' => 'Project',
512 | 'weight' => '-11',
513 | 'description' => '',
514 | 'type' => 'nodereference_select',
515 | 'module' => 'nodereference',
516 | ),
517 | );
518 |
519 | // Exported field: field_fserver_recommended
520 | $fields['fserver_release-field_fserver_recommended'] = array(
521 | 'field_name' => 'field_fserver_recommended',
522 | 'type_name' => 'fserver_release',
523 | 'display_settings' => array(
524 | 'weight' => '-6',
525 | 'parent' => '',
526 | 'label' => array(
527 | 'format' => 'hidden',
528 | ),
529 | 'teaser' => array(
530 | 'format' => 'hidden',
531 | 'exclude' => 1,
532 | ),
533 | 'full' => array(
534 | 'format' => 'hidden',
535 | 'exclude' => 1,
536 | ),
537 | '4' => array(
538 | 'format' => 'default',
539 | 'exclude' => 0,
540 | ),
541 | ),
542 | 'widget_active' => '1',
543 | 'type' => 'text',
544 | 'required' => '1',
545 | 'multiple' => '0',
546 | 'module' => 'text',
547 | 'active' => '1',
548 | 'text_processing' => '0',
549 | 'max_length' => '',
550 | 'allowed_values' => '',
551 | 'allowed_values_php' => 'return fserver_cck_options(\'recommended\');',
552 | 'widget' => array(
553 | 'default_value' => array(
554 | '0' => array(
555 | 'value' => 0,
556 | ),
557 | ),
558 | 'default_value_php' => NULL,
559 | 'label' => 'Recommended',
560 | 'weight' => '-6',
561 | 'description' => 'The recommended releases will be displayed on the project page. The latest recommended release per major version will be offered for update status.',
562 | 'type' => 'optionwidgets_onoff',
563 | 'module' => 'optionwidgets',
564 | ),
565 | );
566 |
567 | // Exported field: field_fserver_security
568 | $fields['fserver_release-field_fserver_security'] = array(
569 | 'field_name' => 'field_fserver_security',
570 | 'type_name' => 'fserver_release',
571 | 'display_settings' => array(
572 | 'weight' => '-5',
573 | 'parent' => '',
574 | 'label' => array(
575 | 'format' => 'hidden',
576 | ),
577 | 'teaser' => array(
578 | 'format' => 'hidden',
579 | 'exclude' => 1,
580 | ),
581 | 'full' => array(
582 | 'format' => 'hidden',
583 | 'exclude' => 1,
584 | ),
585 | '4' => array(
586 | 'format' => 'default',
587 | 'exclude' => 0,
588 | ),
589 | ),
590 | 'widget_active' => '1',
591 | 'type' => 'text',
592 | 'required' => '0',
593 | 'multiple' => '0',
594 | 'module' => 'text',
595 | 'active' => '1',
596 | 'text_processing' => '0',
597 | 'max_length' => '',
598 | 'allowed_values' => '',
599 | 'allowed_values_php' => 'return fserver_cck_options(\'security\');',
600 | 'widget' => array(
601 | 'default_value' => array(
602 | '0' => array(
603 | 'value' => 'Not a security release',
604 | ),
605 | ),
606 | 'default_value_php' => NULL,
607 | 'label' => 'Security release',
608 | 'weight' => '-5',
609 | 'description' => '',
610 | 'type' => 'optionwidgets_onoff',
611 | 'module' => 'optionwidgets',
612 | ),
613 | );
614 |
615 | // Exported field: field_fserver_versionextra
616 | $fields['fserver_release-field_fserver_versionextra'] = array(
617 | 'field_name' => 'field_fserver_versionextra',
618 | 'type_name' => 'fserver_release',
619 | 'display_settings' => array(
620 | 'weight' => '-7',
621 | 'parent' => '',
622 | 'label' => array(
623 | 'format' => 'hidden',
624 | ),
625 | 'teaser' => array(
626 | 'format' => 'hidden',
627 | 'exclude' => 1,
628 | ),
629 | 'full' => array(
630 | 'format' => 'hidden',
631 | 'exclude' => 1,
632 | ),
633 | '4' => array(
634 | 'format' => 'default',
635 | 'exclude' => 0,
636 | ),
637 | ),
638 | 'widget_active' => '1',
639 | 'type' => 'text',
640 | 'required' => '0',
641 | 'multiple' => '0',
642 | 'module' => 'text',
643 | 'active' => '1',
644 | 'text_processing' => '0',
645 | 'max_length' => '',
646 | 'allowed_values' => '',
647 | 'allowed_values_php' => '',
648 | 'widget' => array(
649 | 'rows' => 5,
650 | 'size' => '20',
651 | 'default_value' => array(
652 | '0' => array(
653 | 'value' => '',
654 | '_error_element' => 'default_value_widget][field_fserver_versionextra][0][value',
655 | ),
656 | ),
657 | 'default_value_php' => NULL,
658 | 'label' => 'Extra version',
659 | 'weight' => '-7',
660 | 'description' => '',
661 | 'type' => 'text_textfield',
662 | 'module' => 'text',
663 | ),
664 | );
665 |
666 | // Exported field: field_fserver_versionmajor
667 | $fields['fserver_release-field_fserver_versionmajor'] = array(
668 | 'field_name' => 'field_fserver_versionmajor',
669 | 'type_name' => 'fserver_release',
670 | 'display_settings' => array(
671 | 'weight' => '-9',
672 | 'parent' => '',
673 | 'label' => array(
674 | 'format' => 'hidden',
675 | ),
676 | 'teaser' => array(
677 | 'format' => 'hidden',
678 | 'exclude' => 1,
679 | ),
680 | 'full' => array(
681 | 'format' => 'hidden',
682 | 'exclude' => 1,
683 | ),
684 | '4' => array(
685 | 'format' => 'default',
686 | 'exclude' => 0,
687 | ),
688 | ),
689 | 'widget_active' => '1',
690 | 'type' => 'number_integer',
691 | 'required' => '1',
692 | 'multiple' => '0',
693 | 'module' => 'number',
694 | 'active' => '1',
695 | 'prefix' => '',
696 | 'suffix' => '',
697 | 'min' => '0',
698 | 'max' => '50',
699 | 'allowed_values' => '',
700 | 'allowed_values_php' => 'return fserver_cck_options(\'major\');',
701 | 'widget' => array(
702 | 'default_value' => array(
703 | '0' => array(
704 | 'value' => '',
705 | ),
706 | ),
707 | 'default_value_php' => NULL,
708 | 'label' => 'Major version',
709 | 'weight' => '-9',
710 | 'description' => '',
711 | 'type' => 'optionwidgets_select',
712 | 'module' => 'optionwidgets',
713 | ),
714 | );
715 |
716 | // Exported field: field_fserver_versionpatch
717 | $fields['fserver_release-field_fserver_versionpatch'] = array(
718 | 'field_name' => 'field_fserver_versionpatch',
719 | 'type_name' => 'fserver_release',
720 | 'display_settings' => array(
721 | 'weight' => '-8',
722 | 'parent' => '',
723 | 'label' => array(
724 | 'format' => 'hidden',
725 | ),
726 | 'teaser' => array(
727 | 'format' => 'hidden',
728 | 'exclude' => 1,
729 | ),
730 | 'full' => array(
731 | 'format' => 'hidden',
732 | 'exclude' => 1,
733 | ),
734 | '4' => array(
735 | 'format' => 'default',
736 | 'exclude' => 0,
737 | ),
738 | ),
739 | 'widget_active' => '1',
740 | 'type' => 'number_integer',
741 | 'required' => '1',
742 | 'multiple' => '0',
743 | 'module' => 'number',
744 | 'active' => '1',
745 | 'prefix' => '',
746 | 'suffix' => '',
747 | 'min' => '0',
748 | 'max' => '50',
749 | 'allowed_values' => '',
750 | 'allowed_values_php' => 'return fserver_cck_options(\'patch\');',
751 | 'widget' => array(
752 | 'default_value' => array(
753 | '0' => array(
754 | 'value' => '',
755 | ),
756 | ),
757 | 'default_value_php' => NULL,
758 | 'label' => 'Patch version',
759 | 'weight' => '-8',
760 | 'description' => '',
761 | 'type' => 'optionwidgets_select',
762 | 'module' => 'optionwidgets',
763 | ),
764 | );
765 |
766 | // Translatables
767 | // Included for use with string extractors like potx.
768 | t('Core compatibility');
769 | t('Drush Make Script');
770 | t('Extra version');
771 | t('Machine name');
772 | t('Major version');
773 | t('Package');
774 | t('Packaging method');
775 | t('Patch version');
776 | t('Project');
777 | t('Recommended');
778 | t('Redirect URL (for legacy projects)');
779 | t('Repository URL');
780 | t('Security release');
781 | t('Type');
782 |
783 | return $fields;
784 | }
785 |
--------------------------------------------------------------------------------
/fserver.drush.inc:
--------------------------------------------------------------------------------
1 | 'fserver_drush_status',
26 | 'description' => 'Determine the packaging status of a project.',
27 | );
28 | $items['fserver-package'] = array(
29 | 'callback' => 'fserver_drush_package',
30 | 'description' => 'Update packaging for a project.',
31 | );
32 | $items['fserver-distro'] = array(
33 | 'callback' => 'fserver_drush_distro',
34 | 'description' => 'Update packaging for a distribution.',
35 | );
36 | return $items;
37 | }
38 |
39 | /**
40 | * Implementation of hook_drush_help().
41 | */
42 | function fserver_drush_help($section) {
43 | switch ($section) {
44 | case 'drush:fserver-status':
45 | return dt("Determine the packaging status of a project.");
46 | case 'drush:fserver-package':
47 | return dt("Update packaging for a project.");
48 | case 'drush:fserver-distro':
49 | return dt("Package a new Drupal distribution from a distribution node.");
50 | }
51 | }
52 |
53 | /**
54 | * Package new releases for a specified project or all.
55 | */
56 | function fserver_drush_package() {
57 | if (!drush_get_option('uri') && !drush_get_option('l')) {
58 | drush_die('You must use the --uri option to specify the location of this site.');
59 | }
60 |
61 | $projects = _fserver_drush_get_projects();
62 |
63 | // Filter the project list by the argument.
64 | $args = func_get_args();
65 | $arg = array_shift($args);
66 | if (!empty($arg)) {
67 | if (isset($projects[$arg])) {
68 | $projects = array($arg => $projects[$arg]);
69 | }
70 | else {
71 | drush_die('The project '. $arg .' could not be found.');
72 | }
73 | }
74 |
75 | $rows = array();
76 | foreach ($projects as $project) {
77 | $new_tags = $project->get_new_tags();
78 | if (!empty($new_tags)) {
79 | foreach ($new_tags as $tag_id => $tag) {
80 | $release = $project->create_release($tag_id);
81 | $rows[] = array($project->node->title, $tag_id, $release->field_fserver_file[0]['filename']);
82 | }
83 | }
84 | }
85 | if (!empty($rows)) {
86 | array_unshift($rows, array(dt('Project'), dt('Release'), dt('Filename')));
87 | drush_print_table($rows, TRUE);
88 | }
89 | else {
90 | drush_print(dt('All projects are up to date. No packages were created.'));
91 | }
92 | }
93 |
94 | /**
95 | * Display project packaging status.
96 | */
97 | function fserver_drush_status() {
98 | $projects = _fserver_drush_get_projects();
99 |
100 | // Filter the project list by the argument.
101 | $args = func_get_args();
102 | $arg = array_shift($args);
103 | if (!empty($arg)) {
104 | if (isset($projects[$arg])) {
105 | $projects = array($arg => $projects[$arg]);
106 | }
107 | else {
108 | drush_die('The project '. $arg .' could not be found.');
109 | }
110 | }
111 |
112 | $rows = array(array(dt('Method'), dt('Project'), dt('New tags')));
113 | foreach ($projects as $project) {
114 | $new_tags = $project->get_new_tags();
115 | $rows[] = array(
116 | $project->method,
117 | $project->node->title,
118 | !empty($new_tags) ? implode(', ',array_keys($new_tags)) : dt("Up to date"),
119 | );
120 | }
121 | drush_print_table($rows, TRUE);
122 | }
123 |
124 | /**
125 | * Retrieve all fserver projects from the DB.
126 | */
127 | function _fserver_drush_get_projects() {
128 | static $projects;
129 | if (!isset($projects)) {
130 | $projects = array();
131 | $result = db_query("SELECT nid, title FROM {node} WHERE type = 'fserver_project' AND status = 1");
132 | while ($row = db_fetch_object($result)) {
133 | $node = node_load($row->nid);
134 | $project = new FserverProject($node, $node->field_fserver_name[0]['value'], $node->field_fserver_method[0]['value'], $node->field_fserver_repository[0]['value']);
135 | $projects[$project->name] = $project;
136 | }
137 | }
138 | return $projects;
139 | }
140 |
141 | /**
142 | * Project class. Contains helpful methods for detecting tags, packaging, etc.
143 | */
144 | class FserverProject {
145 | var $node, $name, $method, $repository;
146 |
147 | /**
148 | * We will store the backend object here.
149 | */
150 | var $backend;
151 |
152 | /**
153 | * Constructor.
154 | */
155 | function __construct($node, $name, $method, $repository) {
156 | $this->node = $node;
157 | $this->name = $name;
158 | $this->method = $method;
159 | $this->repository = $repository;
160 |
161 | // We try to create a backend for us to user later:
162 | $method_class = 'FserverProject_' . $this->method;
163 | if (class_exists($method_class)) {
164 | $this->backend = new $method_class($this);
165 | }
166 | }
167 |
168 | /**
169 | * Initialize a working copy for this project.
170 | */
171 | function init_wc() {
172 | if (isset($this->backend)) {
173 | $this->backend->init_wc();
174 | }
175 | }
176 |
177 | /**
178 | * Get new tags that have no corresponding release nodes.
179 | */
180 | function get_new_tags() {
181 | $new_tags = array();
182 | $releases = $this->get_releases();
183 | foreach ($this->get_tags() as $tag_id => $tag) {
184 | if (!isset($releases[$tag_id])) {
185 | $new_tags[$tag_id] = $tag;
186 | }
187 | }
188 | return $new_tags;
189 | }
190 |
191 | /**
192 | * Get release nodes for this project.
193 | */
194 | function get_releases() {
195 | if (!isset($this->releases)) {
196 | $this->releases = array();
197 | $result = db_query("SELECT nid FROM {node} WHERE type = 'fserver_release' AND status = 1");
198 | while ($row = db_fetch_object($result)) {
199 | $node = node_load($row->nid);
200 | if ($node && isset($node->field_fserver_project[0]['nid']) && $node->field_fserver_project[0]['nid'] == $this->node->nid) {
201 | $this->releases[fserver_generate_version($node, TRUE)] = $node;
202 | }
203 | }
204 | }
205 | return $this->releases;
206 | }
207 |
208 | function get_tag($tag_id) {
209 | if (isset($this->backend)) {
210 | return $this->backend->get_tag($tag_id);
211 | }
212 | }
213 |
214 | /**
215 | * Get tags for this project.
216 | */
217 | function get_tags() {
218 | if (isset($this->backend)) {
219 | return $this->backend->get_tags();
220 | }
221 | return array();
222 | }
223 |
224 | /**
225 | * Create a release node for the given tag.
226 | */
227 | function create_release($tag_id) {
228 | $tag = $this->get_tag($tag_id);
229 | if ($tag && $file = $this->create_package($tag_id)) {
230 | $node = new stdClass();
231 | $node->type = 'fserver_release';
232 | $node->status = 1;
233 | $node->created = !empty($tag['timestamp']) ? $tag['timestamp'] : time();
234 | $node->uid = $this->node->uid;
235 | $node->title = "{$this->name} {$tag_id}";
236 | $node->body = !empty($tag['message']) ? $tag['message'] : '';
237 |
238 | $node->field_fserver_file = array(0 => (array) $file);
239 | $node->field_fserver_project = array(0 => array('nid' => $this->node->nid));
240 | $node->field_fserver_api = array(0 => array('value' => $tag['core']));
241 | $node->field_fserver_versionmajor = array(0 => array('value' => $tag['major']));
242 | $node->field_fserver_versionpatch = array(0 => array('value' => $tag['patch']));
243 | $node->field_fserver_versionextra = array(0 => array('value' => $tag['extra']));
244 |
245 | // @TODO
246 | $node->field_fserver_recommended = array(0 => array('value' => 1));
247 | $node->field_fserver_security = array(0 => array('value' => 0));
248 | node_save($node);
249 | }
250 | return $node;
251 | }
252 |
253 | /**
254 | * Create an archive package for the given tag.
255 | */
256 | function create_package($tag_id) {
257 | if (isset($this->backend)) {
258 | return $this->backend->create_package($tag_id);
259 | }
260 | return FALSE;
261 | }
262 |
263 | /**
264 | * Write packaging information for a release.
265 | */
266 | function write_package_info($tag, $exclude_mask = array('.', '..', 'CVS')) {
267 | if (isset($this->backend)) {
268 | $fserver_url = url("fserver", array('purl' => array('disabled' => TRUE), 'absolute' => TRUE));
269 |
270 | $packaging = array();
271 | $packaging[] = "; Information added by fserver";
272 | $packaging[] = "core = \"{$tag['core']}\"";
273 | $packaging[] = "datestamp = \"{$tag['timestamp']}\"";
274 | $packaging[] = "project = \"{$this->name}\"";
275 | $packaging[] = "project status url = \"{$fserver_url}\"";
276 | $packaging[] = "version = \"{$tag['version']}\"";
277 | $packaging = "\n" . implode("\n", $packaging);
278 |
279 | $files = file_scan_directory($this->backend->path, '.info', $exclude_mask);
280 | foreach ($files as $path => $file) {
281 | // @TODO: Parse the info file or not?
282 | $info_file = file_get_contents($file->filename);
283 | $info_file .= $packaging;
284 | file_put_contents($file->filename, $info_file);
285 | }
286 | }
287 | }
288 | }
289 |
290 | class FserverProject_git {
291 |
292 | /**
293 | * We store the parent FserverProject object here.
294 | */
295 | var $FserverProject;
296 |
297 | /**
298 | * Constructor.
299 | */
300 | function __construct(&$FserverProject) {
301 | $this->FserverProject = $FserverProject;
302 | }
303 |
304 | /**
305 | * Destructor.
306 | */
307 | function __destruct() {
308 | if (isset($this->path)) {
309 | drush_op('drush_shell_exec', "rm -rf {$this->path}");
310 | }
311 | }
312 |
313 | /**
314 | * Initialize a working copy for this project.
315 | */
316 | function init_wc() {
317 | if (!isset($this->path)) {
318 | $this->path = file_directory_temp() . '/fserver_git_'. $this->FserverProject->name .'_'. time();
319 | drush_op('drush_shell_exec', "git clone {$this->FserverProject->repository} {$this->path}");
320 | }
321 | }
322 |
323 | /**
324 | * Get tags for this project.
325 | */
326 | function get_tags() {
327 | if (!isset($this->tags)) {
328 | $this->tags = array();
329 | _drush_shell_exec_output_set(' '); // Clear output cache.
330 | drush_op('drush_shell_exec', "git ls-remote --tags {$this->FserverProject->repository} | awk '{print $2;}'");
331 | $lines = drush_shell_exec_output();
332 | while ($line = array_shift($lines)) {
333 | $vc = array_pop(explode('/', $line));
334 | $parsed = fserver_parse_tag_name($vc);
335 | if (!empty($parsed)) {
336 | $this->tags[$parsed['version']] = $vc;
337 | }
338 | }
339 | }
340 | return $this->tags;
341 | }
342 |
343 | function get_tag($tag_id) {
344 | $tags = $this->get_tags();
345 | if (isset($tags[$tag_id])) {
346 | $vc = $tags[$tag_id];
347 | $tag = fserver_parse_tag_name($vc);
348 | $this->init_wc();
349 |
350 | // Retrieve tag info
351 | _drush_shell_exec_output_set(' '); // Clear output cache.
352 | drush_op('drush_shell_exec', "git --git-dir={$this->path}/.git show {$vc}");
353 | $info = drush_shell_exec_output();
354 | if ($info[0] == "tag {$vc}") {
355 | $info = implode("\n", $info);
356 | $info = explode("\n\n", $info);
357 | list($basic, $commit, $message) = $info;
358 |
359 | $basic = explode("\n", $basic);
360 | array_shift($basic); // Removes tag line
361 | array_shift($basic); // Removes author line
362 |
363 | // Set timestamp on the tag
364 | $date = array_shift($basic);
365 | $date = strtotime(trim(substr($date, strpos($date, ':') + 1)));
366 | $tag['timestamp'] = is_numeric($date) ? $date : time();
367 | }
368 | return $tag;
369 | }
370 | }
371 |
372 | /**
373 | * Create an archive package for the given tag.
374 | */
375 | function create_package($tag_id) {
376 | $this->init_wc();
377 | $tag = $this->get_tag($tag_id);
378 | if ($tag) {
379 | $base = "{$this->FserverProject->name}-{$tag_id}";
380 | $file_path = file_directory_path() .'/fserver';
381 | // Create the directory if it doesn't exist.
382 | if (file_check_directory($file_path, TRUE)) {
383 | $vc = $tag['original'];
384 | drush_op('drush_shell_exec', "git --git-dir={$this->path}/.git checkout {$vc}");
385 | $this->FserverProject->write_package_info($tag, array('.git'));
386 | drush_op('drush_shell_exec', "tar -Pcf - --exclude='.git' --transform='s,{$this->path},{$this->FserverProject->name},' {$this->path} | gzip > {$file_path}/{$base}.tgz");
387 |
388 | // @TODO
389 | // We need to properly chown and permission these directories.
390 | // Is it possible for drush to know the web server user?
391 | drush_op('chmod', $file_path, 0775);
392 | drush_op('chgrp', $file_path, fserver_posix_groupname());
393 | drush_op('chmod', "{$file_path}/{$base}.tgz", 0775);
394 | drush_op('chgrp', "{$file_path}/{$base}.tgz", fserver_posix_groupname());
395 |
396 | $file = new stdClass();
397 | $file->uid = $this->node->uid;
398 | $file->filename = "{$base}.tgz";
399 | $file->filepath = "{$file_path}/{$base}.tgz";
400 | $file->filemime = file_get_mimetype($file->filename);
401 | $file->filesize = filesize($file->filepath);
402 | $file->status = FILE_STATUS_PERMANENT;
403 | $file->timestamp = time();
404 | drupal_write_record('files', $file);
405 |
406 | return $file;
407 | }
408 | }
409 | return FALSE;
410 | }
411 |
412 | }
413 |
414 | class FserverProject_svn {
415 | /**
416 | * We store the parent FserverProject object here.
417 | */
418 | var $FserverProject;
419 |
420 | /**
421 | * Constructor.
422 | */
423 | function __construct(&$FserverProject) {
424 | $this->FserverProject = $FserverProject;
425 | }
426 |
427 | /**
428 | * Destructor.
429 | */
430 | function __destruct() {
431 | if (isset($this->path)) {
432 | drush_op('drush_shell_exec', "rm -rf {$this->path}");
433 | }
434 | }
435 |
436 | /**
437 | * Initialize a working copy for this project.
438 | */
439 | function init_wc() {
440 | if (!isset($this->path)) {
441 | $this->path = file_directory_temp() . '/fserver_svn_'. $this->FserverProject->name .'_'. time();
442 | //drush_op('drush_shell_exec', "git clone {$this->FserverProject->repository} {$this->path}");
443 | }
444 | }
445 |
446 | /**
447 | * Get tags for this project.
448 | */
449 | function get_tags() {
450 | if (!isset($this->tags)) {
451 | $this->tags = array();
452 | _drush_shell_exec_output_set(' '); // Clear output cache.
453 | drush_op('drush_shell_exec', "svn ls {$this->FserverProject->repository}/tags | awk '{print $1;}'");
454 | $lines = drush_shell_exec_output();
455 | while ($line = array_shift($lines)) {
456 | $vc = array_shift(explode('/', $line));
457 | $parsed = fserver_parse_tag_name($vc);
458 | if (!empty($parsed)) {
459 | $this->tags[$parsed['version']] = $vc;
460 | }
461 | }
462 | }
463 | return $this->tags;
464 | }
465 |
466 | function get_tag($tag_id) {
467 | $tags = $this->get_tags();
468 | if (isset($tags[$tag_id])) {
469 | $vc = $tags[$tag_id];
470 | $tag = fserver_parse_tag_name($vc);
471 | $this->init_wc();
472 |
473 | // Retrieve tag info
474 | _drush_shell_exec_output_set(' '); // Clear output cache.
475 | drush_op('drush_shell_exec', "svn info --non-interactive --xml {$this->FserverProject->repository}/tags/{$vc}");
476 | $info = drush_shell_exec_output();
477 | if (!empty($info)) {
478 | $info = implode("\n", $info);
479 | // $info is now an xml string:
480 | $info_xml = simplexml_load_string($info);
481 | foreach ($info_xml->xpath('//commit/date') as $date_element) {
482 | $date = strtotime((string)$date_element);
483 | }
484 | }
485 |
486 |
487 | $tag['timestamp'] = is_numeric($date) ? $date : time();
488 | return $tag;
489 | }
490 | }
491 |
492 | /**
493 | * Create an archive package for the given tag.
494 | */
495 | function create_package($tag_id) {
496 | $this->init_wc();
497 | $tag = $this->get_tag($tag_id);
498 | if ($tag) {
499 | $base = "{$this->FserverProject->name}-{$tag_id}";
500 | $file_path = file_directory_path() .'/fserver';
501 | // Create the directory if it doesn't exist.
502 | if (file_check_directory($file_path, TRUE)) {
503 | $vc = $tag['original'];
504 | if (is_dir($this->path)) {
505 | // I'd quite like to do a switch here, but couldn't get it to work reliably.
506 | drush_op('drush_shell_exec', "rm -rf {$this->path}");
507 | }
508 | drush_op('drush_shell_exec', "svn checkout --non-interactive {$this->FserverProject->repository}/tags/{$vc} {$this->path}");
509 | $this->FserverProject->write_package_info($tag, array('.svn'));
510 | drush_op('drush_shell_exec', "tar -Pcf - --exclude='.svn' --transform='s,{$this->path},{$this->FserverProject->name},' {$this->path} | gzip > {$file_path}/{$base}.tgz");
511 |
512 | // @TODO
513 | // We need to properly chown and permission these directories.
514 | // Is it possible for drush to know the web server user?
515 | drush_op('chmod', $file_path, 0775);
516 | drush_op('chgrp', $file_path, fserver_posix_groupname());
517 | drush_op('chmod', "{$file_path}/{$base}.tgz", 0775);
518 | drush_op('chgrp', "{$file_path}/{$base}.tgz", fserver_posix_groupname());
519 |
520 | $file = new stdClass();
521 | $file->uid = $this->node->uid;
522 | $file->filename = "{$base}.tgz";
523 | $file->filepath = "{$file_path}/{$base}.tgz";
524 | $file->filemime = file_get_mimetype($file->filename);
525 | $file->filesize = filesize($file->filepath);
526 | $file->status = FILE_STATUS_PERMANENT;
527 | $file->timestamp = time();
528 | drupal_write_record('files', $file);
529 |
530 | return $file;
531 | }
532 | }
533 | return FALSE;
534 | }
535 | }
536 |
537 | /**
538 | * Discover the web server group. Taken from provision.
539 | */
540 | function fserver_posix_groupname() {
541 | $info = posix_getgrgid(posix_getgid());
542 | $common_groups = array(
543 | 'httpd',
544 | 'www-data',
545 | 'apache',
546 | 'nogroup',
547 | 'nobody',
548 | $info['name']);
549 | foreach ($common_groups as $group) {
550 | $groupname = '';
551 | if (is_numeric($group)) {
552 | $info = posix_getgrgid($group);
553 | $groupname = $info['name'];
554 | }
555 | else {
556 | $info = posix_getgrnam($group);
557 | $groupname = $info['name'];
558 | }
559 | if ($groupname) {
560 | return $groupname;
561 | break;
562 | }
563 | }
564 | return NULL;
565 | }
566 |
567 | function fserver_drush_distro() {
568 | if (!drush_get_option('version')) {
569 | drush_die('No version supplied, please use --version to specify a version for your release.');
570 | }
571 | $distros = _fserver_drush_get_distros();
572 |
573 | // Filter the project list by the argument.
574 | $args = func_get_args();
575 | $arg = array_shift($args);
576 | $version = drush_get_option('version');
577 | if (!empty($arg)) {
578 | if (isset($distros[$arg])) {
579 | $distros = array($arg => $distros[$arg]);
580 | }
581 | else {
582 | drush_die('The distribution '. $arg .' could not be found.');
583 | }
584 | }
585 |
586 | $rows = array();
587 | foreach ($distros as $distro) {
588 | $release = $distro->create_release($version);
589 | $rows[] = array($distro->node->title, $release->field_fserver_file[0]['filename']);
590 | }
591 | if (!empty($rows)) {
592 | array_unshift($rows, array(dt('Project'), dt('Filename')));
593 | drush_print_table($rows, TRUE);
594 | }
595 | else {
596 | drush_print(dt('No distributions to update.'));
597 | }
598 | }
599 |
600 | function _fserver_drush_get_distros() {
601 | static $distros;
602 | if (!isset($distros)) {
603 | $projects = array();
604 | $result = db_query("SELECT nid, title FROM {node} WHERE type = 'fserver_distro' AND status = 1");
605 | while ($row = db_fetch_object($result)) {
606 | $node = node_load($row->nid);
607 | $distro = new FserverDistro($node, $node->field_fserver_name[0]['value']);
608 | $distros[$distro->name] = $distro;
609 | }
610 | }
611 | return $distros;
612 | }
613 |
614 | /**
615 | * Project class. Contains helpful methods for detecting tags, packaging, etc.
616 | */
617 | class FserverDistro {
618 | var $node, $name;
619 |
620 | /**
621 | * Constructor.
622 | */
623 | function __construct($node, $name, $version = NULL) {
624 | $this->node = $node;
625 | $this->name = $name;
626 | //$this->version = $version;
627 | }
628 |
629 | /**
630 | * Destructor.
631 | */
632 | function __destruct() {
633 | if (isset($this->path)) {
634 | drush_op('drush_shell_exec', "rm -rf {$this->path}");
635 | }
636 | }
637 |
638 | /**
639 | * Initialize a working copy for this project.
640 | */
641 | function init_wc() {
642 | if (!isset($this->raw_version)) {
643 | drush_die('Version was not parsed properly. Please supply versions in the drupal-6--1-0-alpha1 format.');
644 | }
645 | if (!isset($this->path)) {
646 | $this->path = file_directory_temp() . '/fserver_'. $this->name .'_'. time();
647 | if (file_check_directory($this->path, TRUE)) {
648 | if(!file_save_data($this->node->field_fserver_drushmake[0]['value'], $this->path .'/'. $this->name .'-'. $this->raw_version .'.make', FILE_EXISTS_REPLACE)) {
649 | return FALSE;
650 | }
651 | // @TODO
652 | // We need to properly chown and permission these directories.
653 | // Is it possible for drush to know the web server user?
654 | drush_op('chmod', $this->path, 0775);
655 | drush_op('chgrp', $this->path, fserver_posix_groupname());
656 | drush_op('chmod', "{$this->path}/{$this->name}-{$this->raw_version}.make", 0775);
657 | drush_op('chgrp', "{$this->path}/{$this->name}-{$this->raw_version}.make", fserver_posix_groupname());
658 | }
659 | }
660 | return TRUE;
661 | }
662 |
663 | /**
664 | * Get release nodes for this project.
665 | */
666 | function get_releases() {
667 | if (!isset($this->releases)) {
668 | $this->releases = array();
669 | $result = db_query("SELECT nid FROM {node} WHERE type = 'fserver_release' AND status = 1");
670 | while ($row = db_fetch_object($result)) {
671 | $node = node_load($row->nid);
672 | if ($node && isset($node->field_fserver_project[0]['nid']) && $node->field_fserver_project[0]['nid'] == $this->node->nid) {
673 | $this->releases[fserver_generate_version($node, TRUE)] = $node;
674 | }
675 | }
676 | }
677 | return $this->releases;
678 | }
679 |
680 | function parse_version($version) {
681 | if (isset($version)) {
682 | $this->version = array();
683 | $parsed = fserver_parse_tag_name($version);
684 | if (!empty($parsed)) {
685 | $extra = $parsed['extra'] ? $parsed['extra'] : 0;
686 | $view = views_get_view('fserver_release_lookup');
687 | $view->set_display('default');
688 | $args = array();
689 | $args[] = $this->node->nid;
690 | $args[] = $parsed['core'];
691 | $args[] = $extra;
692 | $view->set_arguments($args);
693 | $preview = $view->preview($form_state['display_id'], $args);
694 | $query = db_prefix_tables($view->build_info['query']);
695 | _db_query_callback($view->build_info['query_args'], TRUE);
696 | $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
697 | // Next line required because views passes 0 as "IS NULL" to the query, and we actually want 0, so it's been hacked in manually
698 | $query .= " AND (node_data_field_fserver_project.field_fserver_versionmajor_value = %d) AND (node_data_field_fserver_api.field_fserver_versionpatch_value = %d)";
699 | $items = db_query($query, $parsed['major'], $parsed['patch']);
700 | while ($result = db_fetch_object($items)) {
701 | $results[] = $result->nid;
702 | }
703 | if (!$results[0]) {
704 | $this->version = $parsed;
705 | $this->raw_version = $parsed['version'];
706 | }
707 | else {
708 | return FALSE;
709 | }
710 | }
711 | else {
712 | return FALSE;
713 | }
714 | }
715 | return $this->version;
716 | }
717 |
718 | /**
719 | * Create a release node for the given tag.
720 | */
721 | function create_release($version = NULL) {
722 | $version = $this->parse_version($version);
723 | if ($file = $this->create_package()) {
724 | //if ($version) {
725 | $node = new stdClass();
726 | $node->type = 'fserver_release';
727 | $node->status = 1;
728 | $node->created = !empty($tag['timestamp']) ? $tag['timestamp'] : time();
729 | $node->uid = $this->node->uid;
730 | $node->title = "{$this->name} {$tag_id}";
731 | $node->body = !empty($tag['message']) ? $tag['message'] : '';
732 |
733 | $node->field_fserver_file = array(0 => (array) $file);
734 | $node->field_fserver_project = array(0 => array('nid' => $this->node->nid));
735 | $node->field_fserver_api = array(0 => array('value' => $version['core']));
736 | $node->field_fserver_versionmajor = array(0 => array('value' => $version['major']));
737 | $node->field_fserver_versionpatch = array(0 => array('value' => $version['patch']));
738 | $node->field_fserver_versionextra = array(0 => array('value' => $version['extra']));
739 |
740 | // @TODO
741 | $node->field_fserver_recommended = array(0 => array('value' => 1));
742 | $node->field_fserver_security = array(0 => array('value' => 0));
743 | node_save($node);
744 | }
745 | return $node;
746 | }
747 |
748 | /**
749 | * Create an archive package for the given tag.
750 | */
751 | function create_package() {
752 | if (!$this->init_wc()) {
753 | return FALSE;
754 | }
755 | $base = "{$this->name}-{$this->raw_version}";
756 | $file_path = file_directory_path() .'/fserver';
757 | // Create the directory if it doesn't exist.
758 | if (file_check_directory($file_path, TRUE)) {
759 | drush_backend_invoke('make', array("{$this->path}/{$base}.make", "{$file_path}/{$base}", "--tar"));
760 | drush_op('drush_shell_exec', "mv {$file_path}/{$base}.tar.gz {$file_path}/{$base}.tgz");
761 |
762 | // @TODO
763 | // We need to properly chown and permission these directories.
764 | // Is it possible for drush to know the web server user?
765 | drush_op('chmod', $file_path, 0775);
766 | drush_op('chgrp', $file_path, fserver_posix_groupname());
767 | drush_op('chmod', "{$file_path}/{$base}.tgz", 0775);
768 | drush_op('chgrp', "{$file_path}/{$base}.tgz", fserver_posix_groupname());
769 |
770 | $file = new stdClass();
771 | $file->uid = $this->node->uid;
772 | $file->filename = "{$base}.tgz";
773 | $file->filepath = "{$file_path}/{$base}.tgz";
774 | $file->filemime = file_get_mimetype($file->filename);
775 | $file->filesize = filesize($file->filepath);
776 | $file->status = FILE_STATUS_PERMANENT;
777 | $file->timestamp = time();
778 | drupal_write_record('files', $file);
779 |
780 | return $file;
781 | }
782 | return FALSE;
783 | }
784 | }
785 |
--------------------------------------------------------------------------------
/fserver.views_default.inc:
--------------------------------------------------------------------------------
1 | name = 'fserver_projects';
12 | $view->description = 'Feature Server > Projects';
13 | $view->tag = 'fserver';
14 | $view->view_php = '';
15 | $view->base_table = 'node';
16 | $view->is_cacheable = FALSE;
17 | $view->api_version = 2;
18 | $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
19 | $handler = $view->new_display('default', 'Defaults', 'default');
20 | $handler->override_option('fields', array(
21 | 'title' => array(
22 | 'label' => '',
23 | 'alter' => array(
24 | 'alter_text' => 0,
25 | 'text' => '',
26 | 'make_link' => 0,
27 | 'path' => '',
28 | 'link_class' => '',
29 | 'alt' => '',
30 | 'prefix' => '',
31 | 'suffix' => '',
32 | 'help' => '',
33 | 'trim' => 0,
34 | 'max_length' => '',
35 | 'word_boundary' => 1,
36 | 'ellipsis' => 1,
37 | 'strip_tags' => 0,
38 | 'html' => 0,
39 | ),
40 | 'link_to_node' => 1,
41 | 'exclude' => 0,
42 | 'id' => 'title',
43 | 'table' => 'node',
44 | 'field' => 'title',
45 | 'relationship' => 'none',
46 | ),
47 | 'teaser' => array(
48 | 'label' => '',
49 | 'alter' => array(
50 | 'alter_text' => 0,
51 | 'text' => '',
52 | 'make_link' => 0,
53 | 'path' => '',
54 | 'link_class' => '',
55 | 'alt' => '',
56 | 'prefix' => '',
57 | 'suffix' => '',
58 | 'help' => '',
59 | 'trim' => 1,
60 | 'max_length' => '100',
61 | 'word_boundary' => 1,
62 | 'ellipsis' => 1,
63 | 'strip_tags' => 1,
64 | 'html' => 0,
65 | ),
66 | 'exclude' => 0,
67 | 'id' => 'teaser',
68 | 'table' => 'node_revisions',
69 | 'field' => 'teaser',
70 | 'relationship' => 'none',
71 | ),
72 | ));
73 | $handler->override_option('sorts', array(
74 | 'title' => array(
75 | 'order' => 'ASC',
76 | 'id' => 'title',
77 | 'table' => 'node',
78 | 'field' => 'title',
79 | 'relationship' => 'none',
80 | ),
81 | ));
82 | $handler->override_option('filters', array(
83 | 'status' => array(
84 | 'operator' => '=',
85 | 'value' => '1',
86 | 'group' => '0',
87 | 'exposed' => FALSE,
88 | 'expose' => array(
89 | 'operator' => FALSE,
90 | 'label' => '',
91 | ),
92 | 'id' => 'status',
93 | 'table' => 'node',
94 | 'field' => 'status',
95 | 'relationship' => 'none',
96 | ),
97 | 'type' => array(
98 | 'operator' => 'in',
99 | 'value' => array(
100 | 'fserver_distro' => 'fserver_distro',
101 | 'fserver_project' => 'fserver_project',
102 | ),
103 | 'group' => '0',
104 | 'exposed' => FALSE,
105 | 'expose' => array(
106 | 'operator' => FALSE,
107 | 'label' => '',
108 | ),
109 | 'id' => 'type',
110 | 'table' => 'node',
111 | 'field' => 'type',
112 | 'relationship' => 'none',
113 | ),
114 | ));
115 | $handler->override_option('access', array(
116 | 'type' => 'none',
117 | ));
118 | $handler->override_option('cache', array(
119 | 'type' => 'none',
120 | ));
121 | $handler->override_option('title', 'Projects and distributions');
122 | $handler->override_option('empty', 'There are currently no projects or distributions available.');
123 | $handler->override_option('items_per_page', 20);
124 | $handler->override_option('use_pager', '1');
125 | $handler->override_option('style_plugin', 'grid');
126 | $handler->override_option('style_options', array(
127 | 'grouping' => '',
128 | 'columns' => '2',
129 | 'alignment' => 'vertical',
130 | ));
131 | $handler = $view->new_display('page', 'Page', 'page_1');
132 | $handler->override_option('path', 'fserver');
133 | $handler->override_option('menu', array(
134 | 'type' => 'normal',
135 | 'title' => 'Projects',
136 | 'description' => '',
137 | 'weight' => '0',
138 | 'name' => 'features',
139 | ));
140 | $handler->override_option('tab_options', array(
141 | 'type' => 'none',
142 | 'title' => '',
143 | 'description' => '',
144 | 'weight' => 0,
145 | ));
146 |
147 | $views[$view->name] = $view;
148 |
149 | // Exported view: fserver_release_lookup
150 | $view = new view;
151 | $view->name = 'fserver_release_lookup';
152 | $view->description = '';
153 | $view->tag = 'fserver';
154 | $view->view_php = '';
155 | $view->base_table = 'node';
156 | $view->is_cacheable = FALSE;
157 | $view->api_version = 2;
158 | $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
159 | $handler = $view->new_display('default', 'Defaults', 'default');
160 | $handler->override_option('fields', array(
161 | 'nid' => array(
162 | 'label' => '',
163 | 'alter' => array(
164 | 'alter_text' => 0,
165 | 'text' => '',
166 | 'make_link' => 0,
167 | 'path' => '',
168 | 'link_class' => '',
169 | 'alt' => '',
170 | 'prefix' => '',
171 | 'suffix' => '',
172 | 'target' => '',
173 | 'help' => '',
174 | 'trim' => 0,
175 | 'max_length' => '',
176 | 'word_boundary' => 1,
177 | 'ellipsis' => 1,
178 | 'strip_tags' => 0,
179 | 'html' => 0,
180 | ),
181 | 'empty' => '',
182 | 'hide_empty' => 0,
183 | 'empty_zero' => 0,
184 | 'link_to_node' => 0,
185 | 'exclude' => 0,
186 | 'id' => 'nid',
187 | 'table' => 'node',
188 | 'field' => 'nid',
189 | 'relationship' => 'none',
190 | ),
191 | ));
192 | $handler->override_option('arguments', array(
193 | 'field_fserver_project_nid' => array(
194 | 'default_action' => 'not found',
195 | 'style_plugin' => 'default_summary',
196 | 'style_options' => array(),
197 | 'wildcard' => 'all',
198 | 'wildcard_substitution' => 'All',
199 | 'title' => '',
200 | 'breadcrumb' => '',
201 | 'default_argument_type' => 'fixed',
202 | 'default_argument' => '',
203 | 'validate_type' => 'none',
204 | 'validate_fail' => 'not found',
205 | 'break_phrase' => 0,
206 | 'not' => 0,
207 | 'id' => 'field_fserver_project_nid',
208 | 'table' => 'node_data_field_fserver_project',
209 | 'field' => 'field_fserver_project_nid',
210 | 'validate_user_argument_type' => 'uid',
211 | 'validate_user_roles' => array(
212 | '2' => 0,
213 | ),
214 | 'relationship' => 'none',
215 | 'default_options_div_prefix' => '',
216 | 'default_argument_user' => 0,
217 | 'default_argument_fixed' => '',
218 | 'default_argument_php' => '',
219 | 'validate_argument_node_type' => array(
220 | 'feed' => 0,
221 | 'feed_item' => 0,
222 | 'fserver_project' => 0,
223 | 'fserver_release' => 0,
224 | 'fserver_distro' => 0,
225 | 'page' => 0,
226 | 'story' => 0,
227 | ),
228 | 'validate_argument_node_access' => 0,
229 | 'validate_argument_nid_type' => 'nid',
230 | 'validate_argument_vocabulary' => array(),
231 | 'validate_argument_type' => 'tid',
232 | 'validate_argument_transform' => 0,
233 | 'validate_user_restrict_roles' => 0,
234 | 'validate_argument_php' => '',
235 | ),
236 | 'field_fserver_api_value' => array(
237 | 'default_action' => 'ignore',
238 | 'style_plugin' => 'default_summary',
239 | 'style_options' => array(),
240 | 'wildcard' => 'all',
241 | 'wildcard_substitution' => 'All',
242 | 'title' => '',
243 | 'breadcrumb' => '',
244 | 'default_argument_type' => 'fixed',
245 | 'default_argument' => '',
246 | 'validate_type' => 'none',
247 | 'validate_fail' => 'not found',
248 | 'add_table' => 0,
249 | 'require_value' => 0,
250 | 'reduce_duplicates' => 0,
251 | 'id' => 'field_fserver_api_value',
252 | 'table' => 'node_data_field_fserver_api',
253 | 'field' => 'field_fserver_api_value',
254 | 'validate_user_argument_type' => 'uid',
255 | 'validate_user_roles' => array(
256 | '2' => 0,
257 | ),
258 | 'relationship' => 'none',
259 | 'default_options_div_prefix' => '',
260 | 'default_argument_user' => 0,
261 | 'default_argument_fixed' => '',
262 | 'default_argument_php' => '',
263 | 'validate_argument_node_type' => array(
264 | 'fserver_project' => 0,
265 | 'fserver_release' => 0,
266 | 'fserver_distro' => 0,
267 | 'page' => 0,
268 | 'story' => 0,
269 | ),
270 | 'validate_argument_node_access' => 0,
271 | 'validate_argument_nid_type' => 'nid',
272 | 'validate_argument_vocabulary' => array(),
273 | 'validate_argument_type' => 'tid',
274 | 'validate_argument_transform' => 0,
275 | 'validate_user_restrict_roles' => 0,
276 | 'validate_argument_php' => '',
277 | ),
278 | 'field_fserver_versionextra_value' => array(
279 | 'default_action' => 'ignore',
280 | 'style_plugin' => 'default_summary',
281 | 'style_options' => array(),
282 | 'wildcard' => 'all',
283 | 'wildcard_substitution' => 'All',
284 | 'title' => '',
285 | 'breadcrumb' => '',
286 | 'default_argument_type' => 'fixed',
287 | 'default_argument' => '',
288 | 'validate_type' => 'none',
289 | 'validate_fail' => 'not found',
290 | 'glossary' => 0,
291 | 'limit' => '0',
292 | 'case' => 'none',
293 | 'path_case' => 'none',
294 | 'transform_dash' => 0,
295 | 'id' => 'field_fserver_versionextra_value',
296 | 'table' => 'node_data_field_fserver_versionextra',
297 | 'field' => 'field_fserver_versionextra_value',
298 | 'validate_user_argument_type' => 'uid',
299 | 'validate_user_roles' => array(
300 | '2' => 0,
301 | ),
302 | 'relationship' => 'none',
303 | 'default_options_div_prefix' => '',
304 | 'default_argument_user' => 0,
305 | 'default_argument_fixed' => '',
306 | 'default_argument_php' => '',
307 | 'validate_argument_node_type' => array(
308 | 'fserver_project' => 0,
309 | 'fserver_release' => 0,
310 | 'fserver_distro' => 0,
311 | 'page' => 0,
312 | 'story' => 0,
313 | ),
314 | 'validate_argument_node_access' => 0,
315 | 'validate_argument_nid_type' => 'nid',
316 | 'validate_argument_vocabulary' => array(),
317 | 'validate_argument_type' => 'tid',
318 | 'validate_argument_transform' => 0,
319 | 'validate_user_restrict_roles' => 0,
320 | 'validate_argument_php' => '',
321 | ),
322 | ));
323 | $handler->override_option('filters', array(
324 | 'status' => array(
325 | 'operator' => '=',
326 | 'value' => '1',
327 | 'group' => '0',
328 | 'exposed' => FALSE,
329 | 'expose' => array(
330 | 'operator' => FALSE,
331 | 'label' => '',
332 | ),
333 | 'id' => 'status',
334 | 'table' => 'node',
335 | 'field' => 'status',
336 | 'relationship' => 'none',
337 | ),
338 | 'type' => array(
339 | 'operator' => 'in',
340 | 'value' => array(
341 | 'fserver_release' => 'fserver_release',
342 | ),
343 | 'group' => '0',
344 | 'exposed' => FALSE,
345 | 'expose' => array(
346 | 'operator' => FALSE,
347 | 'label' => '',
348 | ),
349 | 'id' => 'type',
350 | 'table' => 'node',
351 | 'field' => 'type',
352 | 'relationship' => 'none',
353 | ),
354 | ));
355 | $handler->override_option('access', array(
356 | 'type' => 'none',
357 | ));
358 | $handler->override_option('cache', array(
359 | 'type' => 'none',
360 | ));
361 | $handler->override_option('items_per_page', 0);
362 |
363 | $views[$view->name] = $view;
364 |
365 | // Exported view: fserver_releases
366 | $view = new view;
367 | $view->name = 'fserver_releases';
368 | $view->description = 'Feature Server > Releases';
369 | $view->tag = 'fserver';
370 | $view->view_php = '';
371 | $view->base_table = 'node';
372 | $view->is_cacheable = FALSE;
373 | $view->api_version = 2;
374 | $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
375 | $handler = $view->new_display('default', 'Defaults', 'default');
376 | $handler->override_option('relationships', array(
377 | 'field_fserver_file_fid' => array(
378 | 'label' => 'Package',
379 | 'required' => 1,
380 | 'delta' => -1,
381 | 'id' => 'field_fserver_file_fid',
382 | 'table' => 'node_data_field_fserver_file',
383 | 'field' => 'field_fserver_file_fid',
384 | 'relationship' => 'none',
385 | ),
386 | ));
387 | $handler->override_option('fields', array(
388 | 'nid' => array(
389 | 'label' => 'Nid',
390 | 'alter' => array(
391 | 'alter_text' => 0,
392 | 'text' => '',
393 | 'make_link' => 0,
394 | 'path' => '',
395 | 'link_class' => '',
396 | 'alt' => '',
397 | 'prefix' => '',
398 | 'suffix' => '',
399 | 'help' => '',
400 | 'trim' => 0,
401 | 'max_length' => '',
402 | 'word_boundary' => 1,
403 | 'ellipsis' => 1,
404 | 'strip_tags' => 0,
405 | 'html' => 0,
406 | ),
407 | 'link_to_node' => 0,
408 | 'exclude' => 1,
409 | 'id' => 'nid',
410 | 'table' => 'node',
411 | 'field' => 'nid',
412 | 'override' => array(
413 | 'button' => 'Override',
414 | ),
415 | 'relationship' => 'none',
416 | ),
417 | 'release_tag' => array(
418 | 'label' => 'Release',
419 | 'alter' => array(
420 | 'alter_text' => 0,
421 | 'text' => '',
422 | 'make_link' => 1,
423 | 'path' => 'node/[nid]',
424 | 'link_class' => '',
425 | 'alt' => '',
426 | 'prefix' => '',
427 | 'suffix' => '',
428 | 'help' => '',
429 | 'trim' => 0,
430 | 'max_length' => '',
431 | 'word_boundary' => 1,
432 | 'ellipsis' => 1,
433 | 'strip_tags' => 0,
434 | 'html' => 0,
435 | ),
436 | 'exclude' => 0,
437 | 'id' => 'release_tag',
438 | 'table' => 'views',
439 | 'field' => 'release_tag',
440 | 'override' => array(
441 | 'button' => 'Override',
442 | ),
443 | 'relationship' => 'none',
444 | ),
445 | 'filesize' => array(
446 | 'label' => '',
447 | 'alter' => array(
448 | 'alter_text' => 0,
449 | 'text' => '',
450 | 'make_link' => 0,
451 | 'path' => '',
452 | 'link_class' => '',
453 | 'alt' => '',
454 | 'prefix' => '',
455 | 'suffix' => '',
456 | 'help' => '',
457 | 'trim' => 0,
458 | 'max_length' => '',
459 | 'word_boundary' => 1,
460 | 'ellipsis' => 1,
461 | 'strip_tags' => 0,
462 | 'html' => 0,
463 | ),
464 | 'file_size_display' => 'formatted',
465 | 'exclude' => 1,
466 | 'id' => 'filesize',
467 | 'table' => 'files',
468 | 'field' => 'filesize',
469 | 'relationship' => 'field_fserver_file_fid',
470 | ),
471 | 'field_fserver_file_fid' => array(
472 | 'label' => 'Package',
473 | 'alter' => array(
474 | 'alter_text' => 1,
475 | 'text' => 'Download ([filesize])',
476 | 'make_link' => 0,
477 | 'path' => '',
478 | 'link_class' => '',
479 | 'alt' => '',
480 | 'prefix' => '',
481 | 'suffix' => '',
482 | 'help' => '',
483 | 'trim' => 0,
484 | 'max_length' => '',
485 | 'word_boundary' => 1,
486 | 'ellipsis' => 1,
487 | 'strip_tags' => 0,
488 | 'html' => 0,
489 | ),
490 | 'link_to_node' => 0,
491 | 'label_type' => 'widget',
492 | 'format' => 'url_plain',
493 | 'multiple' => array(
494 | 'group' => TRUE,
495 | 'multiple_number' => '',
496 | 'multiple_from' => '',
497 | 'multiple_reversed' => FALSE,
498 | ),
499 | 'exclude' => 0,
500 | 'id' => 'field_fserver_file_fid',
501 | 'table' => 'node_data_field_fserver_file',
502 | 'field' => 'field_fserver_file_fid',
503 | 'relationship' => 'none',
504 | 'override' => array(
505 | 'button' => 'Override',
506 | ),
507 | ),
508 | 'view_node' => array(
509 | 'label' => '',
510 | 'alter' => array(
511 | 'alter_text' => 0,
512 | 'text' => '',
513 | 'make_link' => 0,
514 | 'path' => '',
515 | 'link_class' => '',
516 | 'alt' => '',
517 | 'prefix' => '',
518 | 'suffix' => '',
519 | 'help' => '',
520 | 'trim' => 0,
521 | 'max_length' => '',
522 | 'word_boundary' => 1,
523 | 'ellipsis' => 1,
524 | 'strip_tags' => 0,
525 | 'html' => 0,
526 | ),
527 | 'text' => 'Release notes',
528 | 'exclude' => 0,
529 | 'id' => 'view_node',
530 | 'table' => 'node',
531 | 'field' => 'view_node',
532 | 'relationship' => 'none',
533 | 'override' => array(
534 | 'button' => 'Override',
535 | ),
536 | ),
537 | 'created' => array(
538 | 'label' => 'Date',
539 | 'alter' => array(
540 | 'alter_text' => 0,
541 | 'text' => '',
542 | 'make_link' => 0,
543 | 'path' => '',
544 | 'link_class' => '',
545 | 'alt' => '',
546 | 'prefix' => '',
547 | 'suffix' => '',
548 | 'help' => '',
549 | 'trim' => 0,
550 | 'max_length' => '',
551 | 'word_boundary' => 1,
552 | 'ellipsis' => 1,
553 | 'strip_tags' => 0,
554 | 'html' => 0,
555 | ),
556 | 'date_format' => 'custom',
557 | 'custom_date_format' => 'M j Y',
558 | 'exclude' => 0,
559 | 'id' => 'created',
560 | 'table' => 'node',
561 | 'field' => 'created',
562 | 'relationship' => 'none',
563 | ),
564 | 'field_fserver_api_value' => array(
565 | 'label' => 'Core compatibility',
566 | 'alter' => array(
567 | 'alter_text' => 0,
568 | 'text' => '',
569 | 'make_link' => 0,
570 | 'path' => '',
571 | 'link_class' => '',
572 | 'alt' => '',
573 | 'prefix' => '',
574 | 'suffix' => '',
575 | 'help' => '',
576 | 'trim' => 0,
577 | 'max_length' => '',
578 | 'word_boundary' => 1,
579 | 'ellipsis' => 1,
580 | 'strip_tags' => 0,
581 | 'html' => 0,
582 | ),
583 | 'link_to_node' => 0,
584 | 'label_type' => 'widget',
585 | 'format' => 'default',
586 | 'multiple' => array(
587 | 'group' => TRUE,
588 | 'multiple_number' => '',
589 | 'multiple_from' => '',
590 | 'multiple_reversed' => FALSE,
591 | ),
592 | 'exclude' => 1,
593 | 'id' => 'field_fserver_api_value',
594 | 'table' => 'node_data_field_fserver_api',
595 | 'field' => 'field_fserver_api_value',
596 | 'relationship' => 'none',
597 | ),
598 | ));
599 | $handler->override_option('sorts', array(
600 | 'release_tag' => array(
601 | 'order' => 'DESC',
602 | 'id' => 'release_tag',
603 | 'table' => 'views',
604 | 'field' => 'release_tag',
605 | 'relationship' => 'none',
606 | 'override' => array(
607 | 'button' => 'Override',
608 | ),
609 | ),
610 | ));
611 | $handler->override_option('arguments', array(
612 | 'field_fserver_project_nid' => array(
613 | 'default_action' => 'default',
614 | 'style_plugin' => 'default_summary',
615 | 'style_options' => array(),
616 | 'wildcard' => 'all',
617 | 'wildcard_substitution' => 'All',
618 | 'title' => '',
619 | 'breadcrumb' => '',
620 | 'default_argument_type' => 'node',
621 | 'default_argument' => '',
622 | 'validate_type' => 'none',
623 | 'validate_fail' => 'not found',
624 | 'break_phrase' => 0,
625 | 'not' => 0,
626 | 'id' => 'field_fserver_project_nid',
627 | 'table' => 'node_data_field_fserver_project',
628 | 'field' => 'field_fserver_project_nid',
629 | 'validate_user_argument_type' => 'uid',
630 | 'validate_user_roles' => array(
631 | '2' => 0,
632 | ),
633 | 'relationship' => 'none',
634 | 'default_options_div_prefix' => '',
635 | 'default_argument_user' => 0,
636 | 'default_argument_fixed' => '',
637 | 'default_argument_php' => '',
638 | 'validate_argument_node_type' => array(
639 | 'fserver_project' => 0,
640 | 'fserver_release' => 0,
641 | 'page' => 0,
642 | 'story' => 0,
643 | ),
644 | 'validate_argument_node_access' => 0,
645 | 'validate_argument_nid_type' => 'nid',
646 | 'validate_argument_vocabulary' => array(),
647 | 'validate_argument_type' => 'tid',
648 | 'validate_argument_transform' => 0,
649 | 'validate_user_restrict_roles' => 0,
650 | 'validate_argument_php' => '',
651 | 'override' => array(
652 | 'button' => 'Override',
653 | ),
654 | ),
655 | 'field_fserver_api_value' => array(
656 | 'default_action' => 'ignore',
657 | 'style_plugin' => 'default_summary',
658 | 'style_options' => array(),
659 | 'wildcard' => 'all',
660 | 'wildcard_substitution' => 'All',
661 | 'title' => '',
662 | 'breadcrumb' => '',
663 | 'default_argument_type' => 'fixed',
664 | 'default_argument' => '',
665 | 'validate_type' => 'none',
666 | 'validate_fail' => 'not found',
667 | 'add_table' => 0,
668 | 'require_value' => 0,
669 | 'reduce_duplicates' => 0,
670 | 'id' => 'field_fserver_api_value',
671 | 'table' => 'node_data_field_fserver_api',
672 | 'field' => 'field_fserver_api_value',
673 | 'validate_user_argument_type' => 'uid',
674 | 'validate_user_roles' => array(
675 | '2' => 0,
676 | ),
677 | 'override' => array(
678 | 'button' => 'Override',
679 | ),
680 | 'relationship' => 'none',
681 | 'default_options_div_prefix' => '',
682 | 'default_argument_user' => 0,
683 | 'default_argument_fixed' => '',
684 | 'default_argument_php' => '',
685 | 'validate_argument_node_type' => array(
686 | 'fserver_project' => 0,
687 | 'fserver_release' => 0,
688 | 'page' => 0,
689 | 'story' => 0,
690 | ),
691 | 'validate_argument_node_access' => 0,
692 | 'validate_argument_nid_type' => 'nid',
693 | 'validate_argument_vocabulary' => array(),
694 | 'validate_argument_type' => 'tid',
695 | 'validate_argument_transform' => 0,
696 | 'validate_user_restrict_roles' => 0,
697 | 'validate_argument_php' => '',
698 | ),
699 | ));
700 | $handler->override_option('filters', array(
701 | 'status' => array(
702 | 'operator' => '=',
703 | 'value' => '1',
704 | 'group' => '0',
705 | 'exposed' => FALSE,
706 | 'expose' => array(
707 | 'operator' => FALSE,
708 | 'label' => '',
709 | ),
710 | 'id' => 'status',
711 | 'table' => 'node',
712 | 'field' => 'status',
713 | 'relationship' => 'none',
714 | ),
715 | 'type' => array(
716 | 'operator' => 'in',
717 | 'value' => array(
718 | 'fserver_release' => 'fserver_release',
719 | ),
720 | 'group' => '0',
721 | 'exposed' => FALSE,
722 | 'expose' => array(
723 | 'operator' => FALSE,
724 | 'label' => '',
725 | ),
726 | 'id' => 'type',
727 | 'table' => 'node',
728 | 'field' => 'type',
729 | 'relationship' => 'none',
730 | ),
731 | ));
732 | $handler->override_option('access', array(
733 | 'type' => 'none',
734 | ));
735 | $handler->override_option('cache', array(
736 | 'type' => 'none',
737 | ));
738 | $handler->override_option('items_per_page', 25);
739 | $handler->override_option('use_pager', '1');
740 | $handler->override_option('style_plugin', 'table');
741 | $handler->override_option('style_options', array(
742 | 'grouping' => '',
743 | 'override' => 1,
744 | 'sticky' => 0,
745 | 'order' => 'asc',
746 | 'columns' => array(
747 | 'title' => 'title',
748 | 'filesize' => 'field_fserver_file_fid',
749 | 'field_fserver_file_fid' => 'field_fserver_file_fid',
750 | 'view_node' => 'view_node',
751 | 'created' => 'created',
752 | 'field_fserver_api_value' => 'field_fserver_api_value',
753 | ),
754 | 'info' => array(
755 | 'title' => array(
756 | 'sortable' => 0,
757 | 'separator' => '',
758 | ),
759 | 'filesize' => array(
760 | 'sortable' => 0,
761 | 'separator' => '',
762 | ),
763 | 'field_fserver_file_fid' => array(
764 | 'separator' => '',
765 | ),
766 | 'view_node' => array(
767 | 'separator' => '',
768 | ),
769 | 'created' => array(
770 | 'sortable' => 0,
771 | 'separator' => '',
772 | ),
773 | 'field_fserver_api_value' => array(
774 | 'sortable' => 0,
775 | 'separator' => '',
776 | ),
777 | ),
778 | 'default' => '-1',
779 | ));
780 | $handler = $view->new_display('block', 'Recommended releases', 'block_1');
781 | $handler->override_option('filters', array(
782 | 'status' => array(
783 | 'operator' => '=',
784 | 'value' => '1',
785 | 'group' => '0',
786 | 'exposed' => FALSE,
787 | 'expose' => array(
788 | 'operator' => FALSE,
789 | 'label' => '',
790 | ),
791 | 'id' => 'status',
792 | 'table' => 'node',
793 | 'field' => 'status',
794 | 'relationship' => 'none',
795 | ),
796 | 'type' => array(
797 | 'operator' => 'in',
798 | 'value' => array(
799 | 'fserver_release' => 'fserver_release',
800 | ),
801 | 'group' => '0',
802 | 'exposed' => FALSE,
803 | 'expose' => array(
804 | 'operator' => FALSE,
805 | 'label' => '',
806 | ),
807 | 'id' => 'type',
808 | 'table' => 'node',
809 | 'field' => 'type',
810 | 'relationship' => 'none',
811 | ),
812 | 'field_fserver_recommended_value_many_to_one' => array(
813 | 'operator' => 'or',
814 | 'value' => array(
815 | '1' => '1',
816 | ),
817 | 'group' => '0',
818 | 'exposed' => FALSE,
819 | 'expose' => array(
820 | 'operator' => FALSE,
821 | 'label' => '',
822 | ),
823 | 'id' => 'field_fserver_recommended_value_many_to_one',
824 | 'table' => 'node_data_field_fserver_recommended',
825 | 'field' => 'field_fserver_recommended_value_many_to_one',
826 | 'override' => array(
827 | 'button' => 'Use default',
828 | ),
829 | 'relationship' => 'none',
830 | 'reduce_duplicates' => 0,
831 | ),
832 | ));
833 | $handler->override_option('title', 'Releases');
834 | $handler->override_option('items_per_page', 0);
835 | $handler->override_option('use_pager', '0');
836 | $handler->override_option('block_description', '');
837 | $handler->override_option('block_caching', -1);
838 | $handler = $view->new_display('page', 'All releases', 'page_1');
839 | $handler->override_option('arguments', array(
840 | 'field_fserver_project_nid' => array(
841 | 'default_action' => 'default',
842 | 'style_plugin' => 'default_summary',
843 | 'style_options' => array(),
844 | 'wildcard' => 'all',
845 | 'wildcard_substitution' => 'All',
846 | 'title' => '%1',
847 | 'breadcrumb' => '',
848 | 'default_argument_type' => 'node',
849 | 'default_argument' => '',
850 | 'validate_type' => 'node',
851 | 'validate_fail' => 'not found',
852 | 'break_phrase' => 0,
853 | 'not' => 0,
854 | 'id' => 'field_fserver_project_nid',
855 | 'table' => 'node_data_field_fserver_project',
856 | 'field' => 'field_fserver_project_nid',
857 | 'validate_user_argument_type' => 'uid',
858 | 'validate_user_roles' => array(
859 | '2' => 0,
860 | ),
861 | 'relationship' => 'none',
862 | 'default_options_div_prefix' => '',
863 | 'default_argument_user' => 0,
864 | 'default_argument_fixed' => '',
865 | 'default_argument_php' => '',
866 | 'validate_argument_node_type' => array(
867 | 'fserver_distro' => 'fserver_distro',
868 | 'fserver_project' => 'fserver_project',
869 | 'fserver_release' => 0,
870 | 'page' => 0,
871 | 'story' => 0,
872 | ),
873 | 'validate_argument_node_access' => 0,
874 | 'validate_argument_nid_type' => 'nid',
875 | 'validate_argument_vocabulary' => array(),
876 | 'validate_argument_type' => 'tid',
877 | 'validate_argument_transform' => 0,
878 | 'validate_user_restrict_roles' => 0,
879 | 'validate_argument_php' => '',
880 | 'override' => array(
881 | 'button' => 'Use default',
882 | ),
883 | ),
884 | ));
885 | $handler->override_option('path', 'node/%/releases');
886 | $handler->override_option('menu', array(
887 | 'type' => 'tab',
888 | 'title' => 'All releases',
889 | 'description' => '',
890 | 'weight' => '0',
891 | 'name' => 'navigation',
892 | ));
893 | $handler->override_option('tab_options', array(
894 | 'type' => 'none',
895 | 'title' => '',
896 | 'description' => '',
897 | 'weight' => 0,
898 | ));
899 |
900 | $views[$view->name] = $view;
901 |
902 | // Exported view: fserver_updates
903 | $view = new view;
904 | $view->name = 'fserver_updates';
905 | $view->description = 'Feature Server > Update feed';
906 | $view->tag = 'fserver';
907 | $view->view_php = '';
908 | $view->base_table = 'node';
909 | $view->is_cacheable = FALSE;
910 | $view->api_version = 2;
911 | $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
912 | $handler = $view->new_display('default', 'Defaults', 'default');
913 | $handler->override_option('relationships', array(
914 | 'field_fserver_project_nid' => array(
915 | 'label' => 'Project',
916 | 'required' => 1,
917 | 'delta' => -1,
918 | 'id' => 'field_fserver_project_nid',
919 | 'table' => 'node_data_field_fserver_project',
920 | 'field' => 'field_fserver_project_nid',
921 | 'relationship' => 'none',
922 | ),
923 | 'field_fserver_file_fid' => array(
924 | 'label' => 'Package',
925 | 'required' => 1,
926 | 'delta' => -1,
927 | 'id' => 'field_fserver_file_fid',
928 | 'table' => 'node_data_field_fserver_file',
929 | 'field' => 'field_fserver_file_fid',
930 | 'relationship' => 'none',
931 | ),
932 | ));
933 | $handler->override_option('fields', array(
934 | 'field_fserver_api_value' => array(
935 | 'label' => 'API version',
936 | 'alter' => array(
937 | 'alter_text' => 0,
938 | 'text' => '',
939 | 'make_link' => 0,
940 | 'path' => '',
941 | 'link_class' => '',
942 | 'alt' => '',
943 | 'prefix' => '',
944 | 'suffix' => '',
945 | 'help' => '',
946 | 'trim' => 0,
947 | 'max_length' => '',
948 | 'word_boundary' => 1,
949 | 'ellipsis' => 1,
950 | 'strip_tags' => 0,
951 | 'html' => 0,
952 | ),
953 | 'link_to_node' => 0,
954 | 'label_type' => 'custom',
955 | 'format' => 'default',
956 | 'multiple' => array(
957 | 'group' => TRUE,
958 | 'multiple_number' => '',
959 | 'multiple_from' => '',
960 | 'multiple_reversed' => FALSE,
961 | ),
962 | 'exclude' => 0,
963 | 'id' => 'field_fserver_api_value',
964 | 'table' => 'node_data_field_fserver_api',
965 | 'field' => 'field_fserver_api_value',
966 | 'relationship' => 'none',
967 | ),
968 | 'field_fserver_versionextra_value' => array(
969 | 'label' => 'Extra version',
970 | 'alter' => array(
971 | 'alter_text' => 0,
972 | 'text' => '',
973 | 'make_link' => 0,
974 | 'path' => '',
975 | 'link_class' => '',
976 | 'alt' => '',
977 | 'prefix' => '',
978 | 'suffix' => '',
979 | 'help' => '',
980 | 'trim' => 0,
981 | 'max_length' => '',
982 | 'word_boundary' => 1,
983 | 'ellipsis' => 1,
984 | 'strip_tags' => 0,
985 | 'html' => 0,
986 | ),
987 | 'link_to_node' => 0,
988 | 'label_type' => 'widget',
989 | 'format' => 'default',
990 | 'multiple' => array(
991 | 'group' => TRUE,
992 | 'multiple_number' => '',
993 | 'multiple_from' => '',
994 | 'multiple_reversed' => FALSE,
995 | ),
996 | 'exclude' => 0,
997 | 'id' => 'field_fserver_versionextra_value',
998 | 'table' => 'node_data_field_fserver_versionextra',
999 | 'field' => 'field_fserver_versionextra_value',
1000 | 'relationship' => 'none',
1001 | ),
1002 | 'field_fserver_versionmajor_value' => array(
1003 | 'label' => 'Major version',
1004 | 'alter' => array(
1005 | 'alter_text' => 0,
1006 | 'text' => '',
1007 | 'make_link' => 0,
1008 | 'path' => '',
1009 | 'link_class' => '',
1010 | 'alt' => '',
1011 | 'prefix' => '',
1012 | 'suffix' => '',
1013 | 'help' => '',
1014 | 'trim' => 0,
1015 | 'max_length' => '',
1016 | 'word_boundary' => 1,
1017 | 'ellipsis' => 1,
1018 | 'strip_tags' => 0,
1019 | 'html' => 0,
1020 | ),
1021 | 'link_to_node' => 0,
1022 | 'label_type' => 'widget',
1023 | 'format' => 'default',
1024 | 'multiple' => array(
1025 | 'group' => TRUE,
1026 | 'multiple_number' => '',
1027 | 'multiple_from' => '',
1028 | 'multiple_reversed' => FALSE,
1029 | ),
1030 | 'exclude' => 0,
1031 | 'id' => 'field_fserver_versionmajor_value',
1032 | 'table' => 'node_data_field_fserver_versionmajor',
1033 | 'field' => 'field_fserver_versionmajor_value',
1034 | 'relationship' => 'none',
1035 | ),
1036 | 'field_fserver_versionpatch_value' => array(
1037 | 'label' => 'Patch version',
1038 | 'alter' => array(
1039 | 'alter_text' => 0,
1040 | 'text' => '',
1041 | 'make_link' => 0,
1042 | 'path' => '',
1043 | 'link_class' => '',
1044 | 'alt' => '',
1045 | 'prefix' => '',
1046 | 'suffix' => '',
1047 | 'help' => '',
1048 | 'trim' => 0,
1049 | 'max_length' => '',
1050 | 'word_boundary' => 1,
1051 | 'ellipsis' => 1,
1052 | 'strip_tags' => 0,
1053 | 'html' => 0,
1054 | ),
1055 | 'link_to_node' => 0,
1056 | 'label_type' => 'widget',
1057 | 'format' => 'default',
1058 | 'multiple' => array(
1059 | 'group' => TRUE,
1060 | 'multiple_number' => '',
1061 | 'multiple_from' => '',
1062 | 'multiple_reversed' => FALSE,
1063 | ),
1064 | 'exclude' => 0,
1065 | 'id' => 'field_fserver_versionpatch_value',
1066 | 'table' => 'node_data_field_fserver_versionpatch',
1067 | 'field' => 'field_fserver_versionpatch_value',
1068 | 'relationship' => 'none',
1069 | ),
1070 | 'created' => array(
1071 | 'label' => 'Post date',
1072 | 'alter' => array(
1073 | 'alter_text' => 0,
1074 | 'text' => '',
1075 | 'make_link' => 0,
1076 | 'path' => '',
1077 | 'link_class' => '',
1078 | 'alt' => '',
1079 | 'prefix' => '',
1080 | 'suffix' => '',
1081 | 'help' => '',
1082 | 'trim' => 0,
1083 | 'max_length' => '',
1084 | 'word_boundary' => 1,
1085 | 'ellipsis' => 1,
1086 | 'strip_tags' => 0,
1087 | 'html' => 0,
1088 | ),
1089 | 'date_format' => 'custom',
1090 | 'custom_date_format' => 'U',
1091 | 'exclude' => 0,
1092 | 'id' => 'created',
1093 | 'table' => 'node',
1094 | 'field' => 'created',
1095 | 'relationship' => 'none',
1096 | ),
1097 | 'title' => array(
1098 | 'label' => 'Project title',
1099 | 'alter' => array(
1100 | 'alter_text' => 0,
1101 | 'text' => '',
1102 | 'make_link' => 0,
1103 | 'path' => '',
1104 | 'link_class' => '',
1105 | 'alt' => '',
1106 | 'prefix' => '',
1107 | 'suffix' => '',
1108 | 'help' => '',
1109 | 'trim' => 0,
1110 | 'max_length' => '',
1111 | 'word_boundary' => 1,
1112 | 'ellipsis' => 1,
1113 | 'strip_tags' => 0,
1114 | 'html' => 0,
1115 | ),
1116 | 'link_to_node' => 0,
1117 | 'exclude' => 0,
1118 | 'id' => 'title',
1119 | 'table' => 'node',
1120 | 'field' => 'title',
1121 | 'relationship' => 'field_fserver_project_nid',
1122 | ),
1123 | 'field_fserver_name_value' => array(
1124 | 'label' => 'Project name',
1125 | 'alter' => array(
1126 | 'alter_text' => 0,
1127 | 'text' => '',
1128 | 'make_link' => 0,
1129 | 'path' => '',
1130 | 'link_class' => '',
1131 | 'alt' => '',
1132 | 'prefix' => '',
1133 | 'suffix' => '',
1134 | 'help' => '',
1135 | 'trim' => 0,
1136 | 'max_length' => '',
1137 | 'word_boundary' => 1,
1138 | 'ellipsis' => 1,
1139 | 'strip_tags' => 0,
1140 | 'html' => 0,
1141 | ),
1142 | 'link_to_node' => 0,
1143 | 'label_type' => 'widget',
1144 | 'format' => 'default',
1145 | 'multiple' => array(
1146 | 'group' => TRUE,
1147 | 'multiple_number' => '',
1148 | 'multiple_from' => '',
1149 | 'multiple_reversed' => FALSE,
1150 | ),
1151 | 'exclude' => 0,
1152 | 'id' => 'field_fserver_name_value',
1153 | 'table' => 'node_data_field_fserver_name',
1154 | 'field' => 'field_fserver_name_value',
1155 | 'relationship' => 'field_fserver_project_nid',
1156 | ),
1157 | 'nid' => array(
1158 | 'label' => 'Project URL',
1159 | 'alter' => array(
1160 | 'alter_text' => 1,
1161 | 'text' => 'node/[nid]',
1162 | 'make_link' => 0,
1163 | 'path' => '',
1164 | 'link_class' => '',
1165 | 'alt' => '',
1166 | 'prefix' => '',
1167 | 'suffix' => '',
1168 | 'help' => '',
1169 | 'trim' => 0,
1170 | 'max_length' => '',
1171 | 'word_boundary' => 1,
1172 | 'ellipsis' => 1,
1173 | 'strip_tags' => 0,
1174 | 'html' => 0,
1175 | ),
1176 | 'link_to_node' => 0,
1177 | 'exclude' => 0,
1178 | 'id' => 'nid',
1179 | 'table' => 'node',
1180 | 'field' => 'nid',
1181 | 'relationship' => 'field_fserver_project_nid',
1182 | ),
1183 | 'filepath' => array(
1184 | 'label' => 'File path',
1185 | 'alter' => array(
1186 | 'alter_text' => 0,
1187 | 'text' => '',
1188 | 'make_link' => 0,
1189 | 'path' => '',
1190 | 'link_class' => '',
1191 | 'alt' => '',
1192 | 'prefix' => '',
1193 | 'suffix' => '',
1194 | 'help' => '',
1195 | 'trim' => 0,
1196 | 'max_length' => '',
1197 | 'word_boundary' => 1,
1198 | 'ellipsis' => 1,
1199 | 'strip_tags' => 0,
1200 | 'html' => 0,
1201 | ),
1202 | 'link_to_file' => 0,
1203 | 'exclude' => 0,
1204 | 'id' => 'filepath',
1205 | 'table' => 'files',
1206 | 'field' => 'filepath',
1207 | 'relationship' => 'field_fserver_file_fid',
1208 | ),
1209 | 'filesize' => array(
1210 | 'label' => 'Filesize',
1211 | 'alter' => array(
1212 | 'alter_text' => 0,
1213 | 'text' => '',
1214 | 'make_link' => 0,
1215 | 'path' => '',
1216 | 'link_class' => '',
1217 | 'alt' => '',
1218 | 'prefix' => '',
1219 | 'suffix' => '',
1220 | 'help' => '',
1221 | 'trim' => 0,
1222 | 'max_length' => '',
1223 | 'word_boundary' => 1,
1224 | 'ellipsis' => 1,
1225 | 'strip_tags' => 0,
1226 | 'html' => 0,
1227 | ),
1228 | 'file_size_display' => 'bytes',
1229 | 'exclude' => 0,
1230 | 'id' => 'filesize',
1231 | 'table' => 'files',
1232 | 'field' => 'filesize',
1233 | 'relationship' => 'field_fserver_file_fid',
1234 | ),
1235 | 'nid_1' => array(
1236 | 'label' => 'Release URL',
1237 | 'alter' => array(
1238 | 'alter_text' => 1,
1239 | 'text' => 'node/[nid_1]',
1240 | 'make_link' => 0,
1241 | 'path' => '',
1242 | 'link_class' => '',
1243 | 'alt' => '',
1244 | 'prefix' => '',
1245 | 'suffix' => '',
1246 | 'help' => '',
1247 | 'trim' => 0,
1248 | 'max_length' => '',
1249 | 'word_boundary' => 1,
1250 | 'ellipsis' => 1,
1251 | 'strip_tags' => 0,
1252 | 'html' => 0,
1253 | ),
1254 | 'link_to_node' => 0,
1255 | 'exclude' => 0,
1256 | 'id' => 'nid_1',
1257 | 'table' => 'node',
1258 | 'field' => 'nid',
1259 | 'relationship' => 'none',
1260 | ),
1261 | 'mdhash' => array(
1262 | 'label' => 'MD5 hash',
1263 | 'alter' => array(
1264 | 'alter_text' => FALSE,
1265 | 'text' => '',
1266 | 'make_link' => FALSE,
1267 | 'path' => '',
1268 | 'alt' => '',
1269 | 'link_class' => '',
1270 | 'prefix' => '',
1271 | 'suffix' => '',
1272 | 'trim' => FALSE,
1273 | 'max_length' => '',
1274 | 'word_boundary' => TRUE,
1275 | 'ellipsis' => TRUE,
1276 | 'strip_tags' => FALSE,
1277 | 'html' => FALSE,
1278 | ),
1279 | 'exclude' => 0,
1280 | 'id' => 'mdhash',
1281 | 'table' => 'files',
1282 | 'field' => 'mdhash',
1283 | 'relationship' => 'field_fserver_file_fid',
1284 | ),
1285 | 'field_fserver_security_value' => array(
1286 | 'label' => 'Security release',
1287 | 'alter' => array(
1288 | 'alter_text' => 0,
1289 | 'text' => '',
1290 | 'make_link' => 0,
1291 | 'path' => '',
1292 | 'link_class' => '',
1293 | 'alt' => '',
1294 | 'prefix' => '',
1295 | 'suffix' => '',
1296 | 'help' => '',
1297 | 'trim' => 0,
1298 | 'max_length' => '',
1299 | 'word_boundary' => 1,
1300 | 'ellipsis' => 1,
1301 | 'strip_tags' => 0,
1302 | 'html' => 0,
1303 | ),
1304 | 'link_to_node' => 0,
1305 | 'label_type' => 'widget',
1306 | 'format' => 'default',
1307 | 'multiple' => array(
1308 | 'group' => TRUE,
1309 | 'multiple_number' => '',
1310 | 'multiple_from' => '',
1311 | 'multiple_reversed' => FALSE,
1312 | ),
1313 | 'exclude' => 0,
1314 | 'id' => 'field_fserver_security_value',
1315 | 'table' => 'node_data_field_fserver_security',
1316 | 'field' => 'field_fserver_security_value',
1317 | 'relationship' => 'none',
1318 | ),
1319 | 'field_fserver_recommended_value' => array(
1320 | 'label' => 'Recommended',
1321 | 'alter' => array(
1322 | 'alter_text' => 0,
1323 | 'text' => '',
1324 | 'make_link' => 0,
1325 | 'path' => '',
1326 | 'link_class' => '',
1327 | 'alt' => '',
1328 | 'prefix' => '',
1329 | 'suffix' => '',
1330 | 'help' => '',
1331 | 'trim' => 0,
1332 | 'max_length' => '',
1333 | 'word_boundary' => 1,
1334 | 'ellipsis' => 1,
1335 | 'strip_tags' => 0,
1336 | 'html' => 0,
1337 | ),
1338 | 'link_to_node' => 0,
1339 | 'label_type' => 'widget',
1340 | 'format' => 'default',
1341 | 'multiple' => array(
1342 | 'group' => TRUE,
1343 | 'multiple_number' => '',
1344 | 'multiple_from' => '',
1345 | 'multiple_reversed' => FALSE,
1346 | ),
1347 | 'exclude' => 0,
1348 | 'id' => 'field_fserver_recommended_value',
1349 | 'table' => 'node_data_field_fserver_recommended',
1350 | 'field' => 'field_fserver_recommended_value',
1351 | 'relationship' => 'none',
1352 | ),
1353 | 'field_fserver_type_value' => array(
1354 | 'label' => 'Type',
1355 | 'alter' => array(
1356 | 'alter_text' => 0,
1357 | 'text' => '',
1358 | 'make_link' => 0,
1359 | 'path' => '',
1360 | 'link_class' => '',
1361 | 'alt' => '',
1362 | 'prefix' => '',
1363 | 'suffix' => '',
1364 | 'help' => '',
1365 | 'trim' => 0,
1366 | 'max_length' => '',
1367 | 'word_boundary' => 1,
1368 | 'ellipsis' => 1,
1369 | 'strip_tags' => 0,
1370 | 'html' => 0,
1371 | ),
1372 | 'link_to_node' => 0,
1373 | 'label_type' => 'widget',
1374 | 'format' => 'plain',
1375 | 'multiple' => array(
1376 | 'group' => TRUE,
1377 | 'multiple_number' => '',
1378 | 'multiple_from' => '',
1379 | 'multiple_reversed' => FALSE,
1380 | ),
1381 | 'exclude' => 0,
1382 | 'id' => 'field_fserver_type_value',
1383 | 'table' => 'node_data_field_fserver_type',
1384 | 'field' => 'field_fserver_type_value',
1385 | 'relationship' => 'field_fserver_project_nid',
1386 | ),
1387 | 'field_fserver_redirect_value' => array(
1388 | 'label' => 'Type',
1389 | 'alter' => array(
1390 | 'alter_text' => 0,
1391 | 'text' => '',
1392 | 'make_link' => 0,
1393 | 'path' => '',
1394 | 'link_class' => '',
1395 | 'alt' => '',
1396 | 'prefix' => '',
1397 | 'suffix' => '',
1398 | 'help' => '',
1399 | 'trim' => 0,
1400 | 'max_length' => '',
1401 | 'word_boundary' => 1,
1402 | 'ellipsis' => 1,
1403 | 'strip_tags' => 0,
1404 | 'html' => 0,
1405 | ),
1406 | 'link_to_node' => 0,
1407 | 'label_type' => 'widget',
1408 | 'format' => 'plain',
1409 | 'multiple' => array(
1410 | 'group' => TRUE,
1411 | 'multiple_number' => '',
1412 | 'multiple_from' => '',
1413 | 'multiple_reversed' => FALSE,
1414 | ),
1415 | 'exclude' => 0,
1416 | 'id' => 'field_fserver_redirect_value',
1417 | 'table' => 'node_data_field_fserver_redirect',
1418 | 'field' => 'field_fserver_redirect_value',
1419 | 'relationship' => 'field_fserver_project_nid',
1420 | ),
1421 | ));
1422 | $handler->override_option('sorts', array(
1423 | 'release_tag' => array(
1424 | 'order' => 'DESC',
1425 | 'id' => 'release_tag',
1426 | 'table' => 'views',
1427 | 'field' => 'release_tag',
1428 | 'relationship' => 'none',
1429 | ),
1430 | 'status' => array(
1431 | 'order' => 'DESC',
1432 | 'id' => 'status',
1433 | 'table' => 'node',
1434 | 'field' => 'status',
1435 | 'override' => array(
1436 | 'button' => 'Override',
1437 | ),
1438 | 'relationship' => 'none',
1439 | ),
1440 | ));
1441 | $handler->override_option('arguments', array(
1442 | 'field_fserver_name_value' => array(
1443 | 'default_action' => 'not found',
1444 | 'style_plugin' => 'default_summary',
1445 | 'style_options' => array(),
1446 | 'wildcard' => 'all',
1447 | 'wildcard_substitution' => 'All',
1448 | 'title' => '',
1449 | 'breadcrumb' => '',
1450 | 'default_argument_type' => 'fixed',
1451 | 'default_argument' => '',
1452 | 'validate_type' => 'none',
1453 | 'validate_fail' => 'not found',
1454 | 'glossary' => 0,
1455 | 'limit' => '0',
1456 | 'case' => 'none',
1457 | 'path_case' => 'none',
1458 | 'transform_dash' => 0,
1459 | 'id' => 'field_fserver_name_value',
1460 | 'table' => 'node_data_field_fserver_name',
1461 | 'field' => 'field_fserver_name_value',
1462 | 'validate_user_argument_type' => 'uid',
1463 | 'validate_user_roles' => array(
1464 | '2' => 0,
1465 | ),
1466 | 'relationship' => 'field_fserver_project_nid',
1467 | 'default_options_div_prefix' => '',
1468 | 'default_argument_user' => 0,
1469 | 'default_argument_fixed' => '',
1470 | 'default_argument_php' => '',
1471 | 'validate_argument_node_type' => array(
1472 | 'fserver_project' => 0,
1473 | 'fserver_release' => 0,
1474 | 'image' => 0,
1475 | ),
1476 | 'validate_argument_node_access' => 0,
1477 | 'validate_argument_nid_type' => 'nid',
1478 | 'validate_argument_vocabulary' => array(),
1479 | 'validate_argument_type' => 'tid',
1480 | 'validate_argument_transform' => 0,
1481 | 'validate_user_restrict_roles' => 0,
1482 | 'validate_argument_php' => '',
1483 | ),
1484 | 'field_fserver_api_value' => array(
1485 | 'default_action' => 'not found',
1486 | 'style_plugin' => 'default_summary',
1487 | 'style_options' => array(),
1488 | 'wildcard' => 'all',
1489 | 'wildcard_substitution' => 'All',
1490 | 'title' => '',
1491 | 'breadcrumb' => '',
1492 | 'default_argument_type' => 'fixed',
1493 | 'default_argument' => '',
1494 | 'validate_type' => 'none',
1495 | 'validate_fail' => 'not found',
1496 | 'add_table' => 0,
1497 | 'require_value' => 0,
1498 | 'reduce_duplicates' => 0,
1499 | 'id' => 'field_fserver_api_value',
1500 | 'table' => 'node_data_field_fserver_api',
1501 | 'field' => 'field_fserver_api_value',
1502 | 'validate_user_argument_type' => 'uid',
1503 | 'validate_user_roles' => array(
1504 | '2' => 0,
1505 | ),
1506 | 'relationship' => 'none',
1507 | 'default_options_div_prefix' => '',
1508 | 'default_argument_user' => 0,
1509 | 'default_argument_fixed' => '',
1510 | 'default_argument_php' => '',
1511 | 'validate_argument_node_type' => array(
1512 | 'fserver_project' => 0,
1513 | 'fserver_release' => 0,
1514 | 'image' => 0,
1515 | ),
1516 | 'validate_argument_node_access' => 0,
1517 | 'validate_argument_nid_type' => 'nid',
1518 | 'validate_argument_vocabulary' => array(),
1519 | 'validate_argument_type' => 'tid',
1520 | 'validate_argument_transform' => 0,
1521 | 'validate_user_restrict_roles' => 0,
1522 | 'validate_argument_php' => '',
1523 | ),
1524 | ));
1525 | $handler->override_option('filters', array(
1526 | 'status' => array(
1527 | 'operator' => '=',
1528 | 'value' => '1',
1529 | 'group' => '0',
1530 | 'exposed' => FALSE,
1531 | 'expose' => array(
1532 | 'operator' => FALSE,
1533 | 'label' => '',
1534 | ),
1535 | 'id' => 'status',
1536 | 'table' => 'node',
1537 | 'field' => 'status',
1538 | 'relationship' => 'none',
1539 | ),
1540 | 'type' => array(
1541 | 'operator' => 'in',
1542 | 'value' => array(
1543 | 'fserver_release' => 'fserver_release',
1544 | ),
1545 | 'group' => '0',
1546 | 'exposed' => FALSE,
1547 | 'expose' => array(
1548 | 'operator' => FALSE,
1549 | 'label' => '',
1550 | ),
1551 | 'id' => 'type',
1552 | 'table' => 'node',
1553 | 'field' => 'type',
1554 | 'relationship' => 'none',
1555 | ),
1556 | ));
1557 | $handler->override_option('access', array(
1558 | 'type' => 'none',
1559 | ));
1560 | $handler->override_option('cache', array(
1561 | 'type' => 'none',
1562 | ));
1563 | $handler->override_option('items_per_page', 0);
1564 | $handler->override_option('style_options', array(
1565 | 'grouping' => '',
1566 | ));
1567 | $handler = $view->new_display('feed', 'Update XML feed', 'feed_1');
1568 | $handler->override_option('style_plugin', 'updatexml');
1569 | $handler->override_option('style_options', array(
1570 | 'mission_description' => FALSE,
1571 | 'description' => '',
1572 | 'project' => array(
1573 | 'title' => 'title',
1574 | 'short_name' => 'field_fserver_name_value',
1575 | 'api_version' => 'field_fserver_api_value',
1576 | 'link' => 'nid',
1577 | 'type' => 'field_fserver_type_value',
1578 | 'redirect' => 'field_fserver_redirect_value',
1579 | ),
1580 | 'release' => array(
1581 | 'version_major' => 'field_fserver_versionmajor_value',
1582 | 'version_patch' => 'field_fserver_versionpatch_value',
1583 | 'version_extra' => 'field_fserver_versionextra_value',
1584 | 'release_link' => 'nid_1',
1585 | 'download_link' => 'filepath',
1586 | 'date' => 'created',
1587 | 'mdhash' => 'mdhash',
1588 | 'filesize' => 'filesize',
1589 | 'security' => 'field_fserver_security_value',
1590 | 'recommended' => 'field_fserver_recommended_value',
1591 | ),
1592 | ));
1593 | $handler->override_option('row_plugin', '');
1594 | $handler->override_option('path', 'fserver/%/%');
1595 | $handler->override_option('menu', array(
1596 | 'type' => 'none',
1597 | 'title' => '',
1598 | 'description' => '',
1599 | 'weight' => 0,
1600 | 'name' => 'navigation',
1601 | ));
1602 | $handler->override_option('tab_options', array(
1603 | 'type' => 'none',
1604 | 'title' => '',
1605 | 'description' => '',
1606 | 'weight' => 0,
1607 | ));
1608 | $handler->override_option('displays', array());
1609 | $handler->override_option('sitename_title', FALSE);
1610 |
1611 | $views[$view->name] = $view;
1612 |
1613 | return $views;
1614 | }
1615 |
--------------------------------------------------------------------------------