Commit 0883beab authored by Dries's avatar Dries
Browse files

Merge branch '8.x' of git.drupal.org:project/drupal into 8.x

parents 6ee939ee af7a3a8d
......@@ -38,8 +38,7 @@ More about configuration:
See INSTALL.txt and UPGRADE.txt in the "core" directory.
* Learn about how to use Drupal to create your site:
http://drupal.org/documentation
* Download contributed modules to sites/all/modules to extend Drupal's
functionality:
* Download contributed modules to /modules to extend Drupal's functionality:
http://drupal.org/project/modules
* See also: "Developing for Drupal" for writing your own modules, below.
......@@ -52,8 +51,7 @@ themes. More themes are available for download, and you can also create your own
custom theme.
More about themes:
* Download contributed themes to sites/all/themes to modify Drupal's
appearance:
* Download contributed themes to /themes to modify Drupal's appearance:
http://drupal.org/project/themes
* Develop your own theme:
http://drupal.org/documentation/theme
......
......@@ -312,9 +312,9 @@ more at http://drupal.org/project/modules and http://drupal.org/project/themes
Do not mix downloaded or custom modules and themes with Drupal's core modules
and themes. Drupal's modules and themes are located in the top-level modules and
themes directories, while the modules and themes you add to Drupal are normally
placed in the sites/all/modules and sites/all/themes directories. If you run a
multisite installation, you can also place modules and themes in the
site-specific directories -- see the Multisite Configuration section, below.
placed in the /modules and /themes directories. If you run a multisite
installation, you can also place modules and themes in the site-specific
directories -- see the Multisite Configuration section, below.
Never edit Drupal's core modules and themes; instead, use the hooks available in
the Drupal API. To modify the behavior of Drupal, develop a module as described
......
......@@ -172,9 +172,9 @@ following the instructions in the INTRODUCTION section at the top of this file:
If you made modifications to files like .htaccess or robots.txt, you will
need to re-apply them from your backup, after the new files are in place.
10. If you uninstalled any modules, remove them from the sites/all/modules and
other sites/*/modules directories. Leave other modules in place, even though
they are incompatible with Drupal 8.x.
10. If you uninstalled any modules, remove them from the /modules and other
sites/*/modules directories. Leave other modules in place, even though they
are incompatible with Drupal 8.x.
11. Download the latest Drupal 8.x release from http://drupal.org to a
directory outside of your web root. Extract the archive and copy the files
......
......@@ -812,8 +812,8 @@ function drupal_settings_initialize() {
* configuration. For example, a module 'foo' may legally be be located
* in any of these three places:
*
* core/modules/foo/foo.module
* modules/foo/foo.module
* sites/all/modules/foo/foo.module
* sites/example.com/modules/foo/foo.module
*
* Calling drupal_get_filename('module', 'foo') will give you one of
......
......@@ -5130,7 +5130,7 @@ function drupal_cron_cleanup() {
* this function will search the site-wide modules directory (i.e., /modules/),
* your install profile's directory (i.e.,
* /profiles/your_site_profile/modules/), the all-sites directory (i.e.,
* /sites/all/modules/), and your site-specific directory (i.e.,
* /modules/), and your site-specific directory (i.e.,
* /sites/your_site_dir/modules/), in that order, and return information about
* all of the files ending in .module in those directories.
*
......@@ -5147,7 +5147,7 @@ function drupal_cron_cleanup() {
* @param string $directory
* The subdirectory name in which the files are found. For example,
* 'core/modules' will search in sub-directories of the /core/modules
* directory, sub-directories of /sites/all/modules/, etc.
* directory, sub-directories of /modules/, etc.
* @param string $key
* The key to be used for the associative array returned. Possible values are
* 'uri', for the file's URI; 'filename', for the basename of the file; and
......@@ -5173,10 +5173,10 @@ function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1)
// Search for the directory in core.
$searchdir = array('core/' . $directory);
// The 'profiles' directory contains pristine collections of modules and
// The 'core/profiles' directory contains pristine collections of modules and
// themes as provided by a distribution. It is pristine in the same way that
// the 'core/modules' directory is pristine for core; users should avoid
// any modification by using the sites/all or sites/<domain> directories.
// any modification by using the top-level or sites/<domain> directories.
$profile = drupal_get_profile();
// For SimpleTest to be able to test modules packaged together with a
// distribution we need to include the profile of the parent site (in which
......@@ -5191,11 +5191,11 @@ function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1)
// profile always has precedence.
$searchdir[] = drupal_get_path('profile', $profile) . '/' . $directory;
// For the case of searching for profiles, scan top-level directories.
// @todo Replace entire sites/all/$directory with this.
// Always search for contributed and custom extensions in top-level
// directories as well as sites/all/* directories. If the same extension is
// located in both directories, then the latter wins for legacy/historical
// reasons.
$searchdir[] = $directory;
// Always search sites/all/* as well as the global directories.
$searchdir[] = 'sites/all/' . $directory;
if (file_exists("$config/$directory")) {
......@@ -5215,7 +5215,7 @@ function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1)
// The exception to this is if the later file is from a module or theme not
// compatible with Drupal core. This may occur during upgrades of Drupal
// core when new modules exist in core while older contrib modules with the
// same name exist in a directory such as sites/all/modules/.
// same name exist in a directory such as /modules.
foreach (array_intersect_key($files_to_add, $files) as $file_key => $file) {
// If it has no info file, then we just behave liberally and accept the
// new resource on the list for merging.
......
......@@ -1895,7 +1895,7 @@ function install_configure_form_submit($form, &$form_state) {
// Enable update.module if this option was selected.
if ($form_state['values']['update_status_module'][1]) {
module_enable(array('update'), FALSE);
module_enable(array('file', 'update'), FALSE);
// Add the site maintenance account's email address to the list of
// addresses to be notified when updates are available, if selected.
......
......@@ -389,7 +389,7 @@ function drupal_verify_profile($install_state) {
'title' => st('Required modules'),
'value' => st('Required modules not found.'),
'severity' => REQUIREMENT_ERROR,
'description' => st('The following modules are required but were not found. Move them into the appropriate modules subdirectory, such as <em>sites/all/modules</em>. Missing modules: !modules', array('!modules' => implode(', ', $modules))),
'description' => st('The following modules are required but were not found. Move them into the appropriate modules subdirectory, such as <em>/modules</em>. Missing modules: !modules', array('!modules' => implode(', ', $modules))),
);
}
return $requirements;
......
......@@ -122,7 +122,7 @@ function theme_task_list($variables) {
}
else {
$class = $done ? 'done' : '';
$status = $done ? '(' . t('done') . ')' : '';
$status = $done ? '(' . $t('done') . ')' : '';
}
$output .= '<li';
$output .= ($class ? ' class="' . $class . '"' : '') . '>';
......
......@@ -19,11 +19,11 @@ class Module extends Updater implements UpdaterInterface {
* If the module is already installed, drupal_get_path() will return
* a valid path and we should install it there (although we need to use an
* absolute path, so we prepend DRUPAL_ROOT). If we're installing a new
* module, we always want it to go into sites/all/modules, since that's
* module, we always want it to go into /modules, since that's
* where all the documentation recommends users install their modules, and
* there's no way that can conflict on a multi-site installation, since
* the Update manager won't let you install a new module if it's already
* found on your system, and if there was a copy in sites/all, we'd see it.
* found on your system, and if there was a copy in the top-level we'd see it.
*
* @return string
* A directory path.
......@@ -33,7 +33,7 @@ public function getInstallDirectory() {
$relative_path = dirname($relative_path);
}
else {
$relative_path = 'sites/all/modules';
$relative_path = 'modules';
}
return DRUPAL_ROOT . '/' . $relative_path;
}
......
......@@ -19,11 +19,11 @@ class Theme extends Updater implements UpdaterInterface {
* If the theme is already installed, drupal_get_path() will return
* a valid path and we should install it there (although we need to use an
* absolute path, so we prepend DRUPAL_ROOT). If we're installing a new
* theme, we always want it to go into sites/all/themes, since that's
* theme, we always want it to go into /themes, since that's
* where all the documentation recommends users install their themes, and
* there's no way that can conflict on a multi-site installation, since
* the Update manager won't let you install a new theme if it's already
* found on your system, and if there was a copy in sites/all, we'd see it.
* found on your system, and if there was a copy in the top-level we'd see it.
*
* @return string
* A directory path.
......@@ -33,7 +33,7 @@ public function getInstallDirectory() {
$relative_path = dirname($relative_path);
}
else {
$relative_path = 'sites/all/themes';
$relative_path = 'themes';
}
return DRUPAL_ROOT . '/' . $relative_path;
}
......
......@@ -198,9 +198,9 @@ public function update(&$filetransfer, $overrides = array()) {
// Make sure the installation parent directory exists and is writable.
$this->prepareInstallDirectory($filetransfer, $args['install_dir']);
// Note: If the project is installed in sites/all, it will not be
// Note: If the project is installed in the top-level, it will not be
// deleted. It will be installed in sites/default as that will override
// the sites/all reference and not break other sites which are using it.
// the top-level reference and not break other sites which are using it.
if (is_dir($args['install_dir'] . '/' . $this->name)) {
// Remove the existing installed file.
$filetransfer->removeDirectory($args['install_dir'] . '/' . $this->name);
......
......@@ -21,12 +21,18 @@ var showWeight = JSON.parse(localStorage.getItem('Drupal.tableDrag.showWeight'))
*/
Drupal.behaviors.tableDrag = {
attach: function (context, settings) {
for (var base in settings.tableDrag) {
$(context).find('#' + base).once('tabledrag', function () {
function initTableDrag(table, base) {
if (table.length) {
// Create the new tableDrag instance. Save in the Drupal variable
// to allow other scripts access to the object.
Drupal.tableDrag[base] = new Drupal.tableDrag(this, settings.tableDrag[base]);
});
Drupal.tableDrag[base] = new Drupal.tableDrag(table[0], settings.tableDrag[base]);
}
}
for (var base in settings.tableDrag) {
if (settings.tableDrag.hasOwnProperty(base)) {
initTableDrag($(context).find('#' + base).once('tabledrag'), base);
}
}
}
};
......@@ -65,12 +71,16 @@ Drupal.tableDrag = function (table, tableSettings) {
// don't need to track horizontal movement and indentations.
this.indentEnabled = false;
for (var group in tableSettings) {
for (var n in tableSettings[group]) {
if (tableSettings[group][n].relationship === 'parent') {
this.indentEnabled = true;
}
if (tableSettings[group][n].limit > 0) {
this.maxDepth = tableSettings[group][n].limit;
if (tableSettings.hasOwnProperty(group)) {
for (var n in tableSettings[group]) {
if (tableSettings[group].hasOwnProperty(n)) {
if (tableSettings[group][n].relationship === 'parent') {
this.indentEnabled = true;
}
if (tableSettings[group][n].limit > 0) {
this.maxDepth = tableSettings[group][n].limit;
}
}
}
}
}
......@@ -133,49 +143,62 @@ Drupal.tableDrag = function (table, tableSettings) {
* 'Drupal.tableDrag.showWeight' localStorage value.
*/
Drupal.tableDrag.prototype.initColumns = function () {
var $table = $(this.table);
var $table = $(this.table), hidden, cell, columnIndex;
for (var group in this.tableSettings) {
// Find the first field in this group.
for (var d in this.tableSettings[group]) {
var field = $table.find('.' + this.tableSettings[group][d].target + ':first');
if (field.length && this.tableSettings[group][d].hidden) {
var hidden = this.tableSettings[group][d].hidden;
var cell = field.closest('td');
break;
}
}
// Mark the column containing this field so it can be hidden.
if (hidden && cell[0]) {
// Add 1 to our indexes. The nth-child selector is 1 based, not 0 based.
// Match immediate children of the parent element to allow nesting.
var columnIndex = cell.parent().find('> td').index(cell.get(0)) + 1;
$table.find('> thead > tr, > tbody > tr, > tr').each(function () {
// Get the columnIndex and adjust for any colspans in this row.
var index = columnIndex;
var cells = $(this).children();
cells.each(function (n) {
if (n < index && this.colSpan && this.colSpan > 1) {
index -= this.colSpan - 1;
}
});
if (index > 0) {
cell = cells.filter(':nth-child(' + index + ')');
if (cell[0].colSpan && cell[0].colSpan > 1) {
// If this cell has a colspan, mark it so we can reduce the colspan.
cell.addClass('tabledrag-has-colspan');
}
else {
// Mark this cell so we can hide it.
cell.addClass('tabledrag-hide');
if (this.tableSettings.hasOwnProperty(group)) { // Find the first field in this group.
for (var d in this.tableSettings[group]) {
if (this.tableSettings[group].hasOwnProperty(d)) {
var field = $table.find('.' + this.tableSettings[group][d].target + ':first');
if (field.length && this.tableSettings[group][d].hidden) {
hidden = this.tableSettings[group][d].hidden;
cell = field.closest('td');
break;
}
}
});
}
// Mark the column containing this field so it can be hidden.
if (hidden && cell[0]) {
// Add 1 to our indexes. The nth-child selector is 1 based, not 0 based.
// Match immediate children of the parent element to allow nesting.
columnIndex = cell.parent().find('> td').index(cell.get(0)) + 1;
$table.find('> thead > tr, > tbody > tr, > tr').each(this.addColspanClass(columnIndex));
}
}
}
this.displayColumns(showWeight);
};
/**
* Mark cells that have colspan so we can adjust the colspan
* instead of hiding them altogether.
*/
Drupal.tableDrag.prototype.addColspanClass = function(columnIndex) {
return function () {
// Get the columnIndex and adjust for any colspans in this row.
var $row = $(this);
var index = columnIndex;
var cells = $row.children();
var cell;
cells.each(function (n) {
if (n < index && this.colSpan && this.colSpan > 1) {
index -= this.colSpan - 1;
}
});
if (index > 0) {
cell = cells.filter(':nth-child(' + index + ')');
if (cell[0].colSpan && cell[0].colSpan > 1) {
// If this cell has a colspan, mark it so we can reduce the colspan.
cell.addClass('tabledrag-has-colspan');
}
else {
// Mark this cell so we can hide it.
cell.addClass('tabledrag-hide');
}
}
};
};
/**
* Hide or display weight columns. Triggers an event on change.
*
......@@ -253,15 +276,20 @@ Drupal.tableDrag.prototype.showColumns = function () {
*/
Drupal.tableDrag.prototype.rowSettings = function (group, row) {
var field = $(row).find('.' + group);
for (var delta in this.tableSettings[group]) {
var targetClass = this.tableSettings[group][delta].target;
if (field.is('.' + targetClass)) {
// Return a copy of the row settings.
var rowSettings = {};
for (var n in this.tableSettings[group][delta]) {
rowSettings[n] = this.tableSettings[group][delta][n];
var tableSettingsGroup = this.tableSettings[group];
for (var delta in tableSettingsGroup) {
if (tableSettingsGroup.hasOwnProperty(delta)) {
var targetClass = tableSettingsGroup[delta].target;
if (field.is('.' + targetClass)) {
// Return a copy of the row settings.
var rowSettings = {};
for (var n in tableSettingsGroup[delta]) {
if (tableSettingsGroup[delta].hasOwnProperty(n)) {
rowSettings[n] = tableSettingsGroup[delta][n];
}
}
return rowSettings;
}
return rowSettings;
}
}
};
......@@ -361,6 +389,7 @@ Drupal.tableDrag.prototype.makeDraggable = function (item) {
}
var keyChange = false;
var groupHeight;
switch (event.keyCode) {
case 37: // Left arrow.
case 63234: // Safari left arrow.
......@@ -382,7 +411,7 @@ Drupal.tableDrag.prototype.makeDraggable = function (item) {
if ($(item).is('.tabledrag-root')) {
// Swap with the previous top-level row.
var groupHeight = 0;
groupHeight = 0;
while (previousRow && $previousRow.find('.indentation').length) {
$previousRow = $(previousRow).prev('tr').eq(0);
previousRow = $previousRow.get(0);
......@@ -425,7 +454,7 @@ Drupal.tableDrag.prototype.makeDraggable = function (item) {
if ($(item).is('.tabledrag-root')) {
// Swap with the next group (necessarily a top-level one).
var groupHeight = 0;
groupHeight = 0;
var nextGroup = new self.row(nextRow, 'keyboard', self.indentEnabled, self.maxDepth, false);
if (nextGroup) {
$(nextGroup.group).each(function () {
......@@ -538,10 +567,12 @@ Drupal.tableDrag.prototype.dragRow = function (event, self) {
* Blur event handler, bound to drag handle for keyboard support.
*/
Drupal.tableDrag.prototype.dropRow = function (event, self) {
var droppedRow, $droppedRow;
// Drop row functionality shared between mouseup and blur events.
if (self.rowObject !== null) {
var droppedRow = self.rowObject.element;
var $droppedRow = $(droppedRow);
droppedRow = self.rowObject.element;
$droppedRow = $(droppedRow);
// The row is already in the right place so we just release it.
if (self.rowObject.changed === true) {
// Update the fields in the dropped row.
......@@ -550,10 +581,14 @@ Drupal.tableDrag.prototype.dropRow = function (event, self) {
// If a setting exists for affecting the entire group, update all the
// fields in the entire dragged group.
for (var group in self.tableSettings) {
var rowSettings = self.rowSettings(group, droppedRow);
if (rowSettings.relationship === 'group') {
for (var n in self.rowObject.children) {
self.updateField(self.rowObject.children[n], group);
if (self.tableSettings.hasOwnProperty(group)) {
var rowSettings = self.rowSettings(group, droppedRow);
if (rowSettings.relationship === 'group') {
for (var n in self.rowObject.children) {
if (self.rowObject.children.hasOwnProperty(n)) {
self.updateField(self.rowObject.children[n], group);
}
}
}
}
}
......@@ -626,22 +661,23 @@ Drupal.tableDrag.prototype.findDropTargetRow = function (x, y) {
var $row = $(row);
var indentDiff = 0;
var rowY = $row.offset().top;
var rowHeight;
// Because Safari does not report offsetHeight on table rows, but does on
// table cells, grab the firstChild of the row and use that instead.
// http://jacob.peargrove.com/blog/2006/technical/table-row-offsettop-bug-in-safari.
if (row.offsetHeight === 0) {
var rowHeight = parseInt(row.firstChild.offsetHeight, 10) / 2;
rowHeight = parseInt(row.firstChild.offsetHeight, 10) / 2;
}
// Other browsers.
else {
var rowHeight = parseInt(row.offsetHeight, 10) / 2;
rowHeight = parseInt(row.offsetHeight, 10) / 2;
}
// Because we always insert before, we need to offset the height a bit.
if ((y > (rowY - rowHeight)) && (y < (rowY + rowHeight))) {
if (this.indentEnabled) {
// Check that this row is not a child of the row being dragged.
for (var n in this.rowObject.group) {
for (n in this.rowObject.group) {
if (this.rowObject.group[n] === row) {
return null;
}
......@@ -681,9 +717,11 @@ Drupal.tableDrag.prototype.findDropTargetRow = function (x, y) {
*/
Drupal.tableDrag.prototype.updateFields = function (changedRow) {
for (var group in this.tableSettings) {
// Each group may have a different setting for relationship, so we find
// the source rows for each separately.
this.updateField(changedRow, group);
if (this.tableSettings.hasOwnProperty(group)) {
// Each group may have a different setting for relationship, so we find
// the source rows for each separately.
this.updateField(changedRow, group);
}
}
};
......@@ -699,18 +737,21 @@ Drupal.tableDrag.prototype.updateFields = function (changedRow) {
Drupal.tableDrag.prototype.updateField = function (changedRow, group) {
var rowSettings = this.rowSettings(group, changedRow);
var $changedRow = $(changedRow);
var sourceRow;
var $previousRow;
var previousRow;
var useSibling;
// Set the row as its own target.
if (rowSettings.relationship === 'self' || rowSettings.relationship === 'group') {
var sourceRow = changedRow;
sourceRow = changedRow;
}
// Siblings are easy, check previous and next rows.
else if (rowSettings.relationship === 'sibling') {
var $previousRow = $changedRow.prev('tr').eq(0);
var previousRow = $previousRow.get(0);
$previousRow = $changedRow.prev('tr').eq(0);
previousRow = $previousRow.get(0);
var $nextRow = $changedRow.next('tr').eq(0);
var nextRow = $nextRow.get(0);
var sourceRow = changedRow;
sourceRow = changedRow;
if ($previousRow.is('.draggable') && $previousRow.find('.' + group).length) {
if (this.indentEnabled) {
if ($previousRow.find('.indentations').length === $changedRow.find('.indentations').length) {
......@@ -735,8 +776,8 @@ Drupal.tableDrag.prototype.updateField = function (changedRow, group) {
// Parents, look up the tree until we find a field not in this group.
// Go up as many parents as indentations in the changed row.
else if (rowSettings.relationship === 'parent') {
var $previousRow = $changedRow.prev('tr');
var previousRow = $previousRow;
$previousRow = $changedRow.prev('tr');
previousRow = $previousRow;
while ($previousRow.length && $previousRow.find('.indentation').length >= this.rowObject.indents) {
$previousRow = $previousRow.prev('tr');
previousRow = $previousRow;
......@@ -755,7 +796,7 @@ Drupal.tableDrag.prototype.updateField = function (changedRow, group) {
if (sourceRow === this.rowObject.element) {
sourceRow = $(this.rowObject.group[this.rowObject.group.length - 1]).next('tr.draggable').get(0);
}
var useSibling = true;
useSibling = true;
}
}
......@@ -915,7 +956,7 @@ Drupal.tableDrag.prototype.row = function (tableRow, method, indentEnabled, maxD
this.group = [tableRow];
this.groupDepth = $tableRow.find('.indentation').length;
this.changed = false;
this.table = $tableRow.closest('table').get(0);
this.table = $tableRow.closest('table')[0];
this.indentEnabled = indentEnabled;
this.maxDepth = maxDepth;
this.direction = ''; // Direction the row is being moved.
......@@ -942,24 +983,25 @@ Drupal.tableDrag.prototype.row.prototype.findChildren = function (addClasses) {
var currentRow = $(this.element, this.table).next('tr.draggable');
var rows = [];
var child = 0;
function rowIndentation(el, indentNum) {
var self = $(el);
if (child === 1 && (indentNum === parentIndentation)) {
self.addClass('tree-child-first');
}
if (indentNum === parentIndentation) {
self.addClass('tree-child');
}
else if (indentNum > parentIndentation) {
self.addClass('tree-child-horizontal');
}
}
while (currentRow.length) {
var rowIndentation = currentRow.find('.indentation').length;
// A greater indentation indicates this is a child.
if (rowIndentation > parentIndentation) {
if (currentRow.find('.indentation').length > parentIndentation) {
child++;
rows.push(currentRow[0]);
if (addClasses) {
currentRow.find('.indentation').each(function (indentNum) {
if (child === 1 && (indentNum === parentIndentation)) {
$(this).addClass('tree-child-first');
}
if (indentNum === parentIndentation) {
$(this).addClass('tree-child');
}
else if (indentNum > parentIndentation) {
$(this).addClass('tree-child-horizontal');
}
});
currentRow.find('.indentation').each(rowIndentation);
}
}
else {
......@@ -1117,6 +1159,7 @@ Drupal.tableDrag.prototype.row.prototype.findSiblings = function (rowSettings) {
var siblings = [];
var directions = ['prev', 'next'];
var rowIndentation = this.indents;
var checkRowIndentation;
for (var d = 0; d < directions.length; d++) {
var checkRow = $(this.element)[directions[d]]();
while (checkRow.length) {
......@@ -1125,7 +1168,7 @@ Drupal.tableDrag.prototype.row.prototype.findSiblings = function (rowSettings) {
// Either add immediately if this is a flat table, or check to ensure
// that this row has the same level of indentation.
if (this.indentEnabled) {
var checkRowIndentation = checkRow.find('.indentation').length;
checkRowIndentation = checkRow.find('.indentation').length;
}
if (!(this.indentEnabled) || (checkRowIndentation === rowIndentation)) {
......@@ -1156,11 +1199,13 @@ Drupal.tableDrag.prototype.row.prototype.findSiblings = function (rowSettings) {
*/
Drupal.tableDrag.prototype.row.prototype.removeIndentClasses = function () {
for (var n in this.children) {
$(this.children[n]).find('.indentation')
.removeClass('tree-child')
.removeClass('tree-child-first')
.removeClass('tree-child-last')
.removeClass('tree-child-horizontal');
if (this.children.hasOwnProperty(n)) {
$(this.children[n]).find('.indentation')
.removeClass('tree-child')
.removeClass('tree-child-first')
.removeClass('tree-child-last')
.removeClass('tree-child-horizontal');
}
}
};
......
This directory is reserved for core module files. Custom or contributed modules
should be placed in their own subdirectory of the sites/all/modules directory.
For multisite installations, they can also be placed in a subdirectory under
/sites/{sitename}/modules/, where {sitename} is the name of your site (e.g.,
www.example.com). This will allow you to more easily update Drupal core files.