summaryrefslogtreecommitdiff
path: root/modules/system/system.updater.inc
blob: 2d373d1e5878afc88ceb470ca54243cbee16abc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
// $Id$

/**
 * @file
 * Subclasses of the Updater class to update Drupal core knows how to update.
 * At this time, only modules and themes are supported.
 */
 
/**
 * Class for updating modules using FileTransfer classes via authorize.php.
 */
class ModuleUpdater extends Updater implements DrupalUpdaterInterface {

  public function getInstallDirectory() {
    // If the module is installed in the configuration path (conf_path())
    // we should install it there.  If it is located elsewhere, such as
    // sites/all/modules we should install it in the conf_path/modules directory.
    if ($this->isInstalled()) {
      $installed_path = drupal_get_path('module', $this->name);
      if (substr($installed_path, 0, strlen(conf_path())) === conf_path()) {
        return dirname(DRUPAL_ROOT . '/' . $installed_path);
      }
    }
    return DRUPAL_ROOT . '/' . conf_path() . '/modules';
  }

  public function isInstalled() {
    return (bool) drupal_get_path('module', $this->name);
  }

  public static function canUpdateDirectory($directory) {
    if (file_scan_directory($directory, '/.*\.module/')) {
      return TRUE;
    }
    return FALSE;
  }

  public static function canUpdate($project_name) {
    return (bool) drupal_get_path('module', $project_name);
  }

  /**
   * Return available database schema updates one a new version is installed.
   */
  public function getSchemaUpdates() {
    require_once './includes/install.inc';
    require_once './includes/update.inc';

    if (_update_get_project_type($project) != 'module') {
      return array();
    }
    module_load_include('install', $project);

    if (!$updates = drupal_get_schema_versions($project)) {
      return array();
    }
    $updates_to_run = array();
    $modules_with_updates = update_get_update_list();
    if ($updates = $modules_with_updates[$project]) {
      if ($updates['start']) {
        return $updates['pending'];
      }
    }
    return array();
  }

  public function postInstallTasks() {
    return array(
      l(t('Enable newly added modules in !project', array('!project' => $this->title)), 'admin/config/modules'),
    );
  }

  public function postUpdateTasks() {
    // @todo: If there are schema updates.
    return array(
      l(t('Run database updates for !project', array('!project' => $this->title)), 'update.php'),
    );
  }

}

/**
 * Class for updating themes using FileTransfer classes via authorize.php.
 */
class ThemeUpdater extends Updater implements DrupalUpdaterInterface {

  public function getInstallDirectory() {
    // If the theme is installed in the configuration path (conf_path())
    // we should install it there.  If it is located elsewhere, such as
    // sites/all/themes we should install it in the conf_path/themes directory.
    if ($this->isInstalled()) {
      $installed_path = drupal_get_path('theme', $this->name);
      if (substr($installed_path, 0, strlen(conf_path())) === conf_path()) {
        return dirname(DRUPAL_ROOT . '/' . $installed_path);
      }
    }
    return DRUPAL_ROOT . '/' . conf_path() . '/themes';
  }

  public function isInstalled() {
    return (bool) drupal_get_path('theme', $this->name);
  }

  static function canUpdateDirectory($directory) {
    // This is a lousy test, but don't know how else to confirm it is a theme.
    if (file_scan_directory($directory, '/.*\.module/')) {
      return FALSE;
    }
    return TRUE;
  }

  public static function canUpdate($project_name) {
    return (bool) drupal_get_path('theme', $project_name);
  }

  public function postInstall() {
    // Update the system table.
    clearstatcache();
    drupal_static_reset('_system_get_theme_data');
    _system_rebuild_theme_data();

    // Active the theme
    db_update('system')
      ->fields(array('status' => 1))
      ->condition('type', 'theme')
      ->condition('name', $this->name)
      ->execute();
  }
  
  public function postInstallTasks() {
    return array(
      l(t('Set the !project theme as default', array('!project' => $this->title)), 'admin/appearance'),
    );
  }
}