├── fserver.context.inc ├── fserver.css ├── fserver.drush.inc ├── fserver.features.content.inc ├── fserver.features.inc ├── fserver.features.menu_links.inc ├── fserver.info ├── fserver.js ├── fserver.module ├── fserver.strongarm.inc ├── fserver.views.inc ├── fserver.views_default.inc └── views ├── fserver-updatexml.tpl.php ├── fserver_handler_field_mdhash.inc ├── fserver_handler_field_release_tag.inc ├── fserver_handler_sort_release_tag.inc ├── fserver_plugin_style_updatexml.inc └── theme.inc /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.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.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.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.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.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.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 | -------------------------------------------------------------------------------- /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.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'] = '
'. implode('
', explode("\r\n", $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.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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /views/fserver-updatexml.tpl.php: -------------------------------------------------------------------------------- 1 | " ?> 2 | 3 | 4 | 5 | <?php print $project['title'] ?> 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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /views/theme.inc: -------------------------------------------------------------------------------- 1 | style_plugin->preprocess($vars); 8 | } 9 | --------------------------------------------------------------------------------