@ -0,0 +1,8 @@ | |||
DOCKSAL_STACK=default | |||
DOCROOT=docroot | |||
XDEBUG_ENABLED=1 | |||
DATABASE_NAME=default | |||
DATABASE_USERNAME=user | |||
DATABASE_PASSWORD=user | |||
DATABASE_HOST=db | |||
SITE_ENV=local |
@ -0,0 +1,72 @@ | |||
# Basic LAMP stack | |||
version: "2.1" | |||
services: | |||
# Web | |||
web: | |||
hostname: web | |||
image: docksal/web:2.1-apache2.4 | |||
volumes: | |||
- project_root:/var/www:ro,nocopy # Project root volume | |||
labels: | |||
- io.docksal.virtual-host=${VIRTUAL_HOST},*.${VIRTUAL_HOST} | |||
- io.docksal.project-root=${PROJECT_ROOT} | |||
environment: | |||
- APACHE_DOCUMENTROOT=/var/www/${DOCROOT:-docroot} | |||
- APACHE_BASIC_AUTH_USER | |||
- APACHE_BASIC_AUTH_PASS | |||
depends_on: | |||
- cli | |||
dns: | |||
- ${DOCKSAL_DNS1} | |||
- ${DOCKSAL_DNS2} | |||
# DB | |||
db: | |||
hostname: db | |||
image: docksal/db:1.1-mysql-5.6 | |||
ports: | |||
- "${MYSQL_PORT_MAPPING:-3306}" | |||
volumes: | |||
- project_root:/var/www:ro,nocopy # Project root volume | |||
- ${PROJECT_ROOT}/db:/docker-entrypoint-initdb.d:ro | |||
environment: | |||
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root} | |||
- MYSQL_USER=${MYSQL_USER:-user} | |||
- MYSQL_PASSWORD=${MYSQL_PASSWORD:-user} | |||
- MYSQL_DATABASE=${MYSQL_DATABASE:-default} | |||
dns: | |||
- ${DOCKSAL_DNS1} | |||
- ${DOCKSAL_DNS2} | |||
# CLI - Used for all console commands and tools. | |||
cli: | |||
hostname: cli | |||
image: docksal/cli:2.4-php7.2 | |||
volumes: | |||
- project_root:/var/www:rw,nocopy # Project root volume | |||
- docksal_ssh_agent:/.ssh-agent:ro # Shared ssh-agent socket | |||
environment: | |||
- HOST_UID | |||
- HOST_GID | |||
- DOCROOT | |||
- XDEBUG_ENABLED=${XDEBUG_ENABLED:-0} | |||
- XDEBUG_CONFIG=remote_connect_back=0 remote_host=${DOCKSAL_HOST_IP} # Point xdebug to the host IP | |||
- DATABASE_NAME | |||
- DATABASE_USERNAME | |||
- DATABASE_PASSWORD | |||
- DATABASE_HOST | |||
- DRUPAL_TRUSTED_HOSTS=${VIRTUAL_HOST} | |||
- SITE_ENV | |||
dns: | |||
- ${DOCKSAL_DNS1} | |||
- ${DOCKSAL_DNS2} | |||
# | |||
# solr: | |||
# extends: | |||
# file: ${HOME}/.docksal/stacks/services.yml | |||
# service: solr | |||
# image: docksal/solr:7.5 | |||
# environment: | |||
# SOLR_DEFAULT_CONFIG_SET: search_api_solr_8.x-2.1 |
@ -0,0 +1,17 @@ | |||
# Drupal editor configuration normalization | |||
# @see http://editorconfig.org/ | |||
# This is the top-most .editorconfig file; do not search in parent directories. | |||
root = true | |||
# All files. | |||
[*] | |||
end_of_line = LF | |||
indent_style = space | |||
indent_size = 2 | |||
charset = utf-8 | |||
trim_trailing_whitespace = true | |||
insert_final_newline = true | |||
[composer.{json,lock}] | |||
indent_size = 4 |
@ -0,0 +1,61 @@ | |||
# Drupal git normalization | |||
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html | |||
# @see https://www.drupal.org/node/1542048 | |||
# Normally these settings would be done with macro attributes for improved | |||
# readability and easier maintenance. However macros can only be defined at the | |||
# repository root directory. Drupal avoids making any assumptions about where it | |||
# is installed. | |||
# Define text file attributes. | |||
# - Treat them as text. | |||
# - Ensure no CRLF line-endings, neither on checkout nor on checkin. | |||
# - Detect whitespace errors. | |||
# - Exposed by default in `git diff --color` on the CLI. | |||
# - Validate with `git diff --check`. | |||
# - Deny applying with `git apply --whitespace=error-all`. | |||
# - Fix automatically with `git apply --whitespace=fix`. | |||
*.config text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.css text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.dist text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.engine text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.html text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html | |||
*.inc text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.js text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.json text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.lock text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.map text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.md text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.module text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.php text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.po text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.script text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.sh text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.sql text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.svg text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.theme text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.twig text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.txt text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.xml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.yml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
# Define binary file attributes. | |||
# - Do not treat them as text. | |||
# - Include binary diff in patches instead of "binary files differ." | |||
*.eot -text diff | |||
*.exe -text diff | |||
*.gif -text diff | |||
*.gz -text diff | |||
*.ico -text diff | |||
*.jpeg -text diff | |||
*.jpg -text diff | |||
*.otf -text diff | |||
*.phar -text diff | |||
*.png -text diff | |||
*.svgz -text diff | |||
*.ttf -text diff | |||
*.woff -text diff | |||
*.woff2 -text diff |
@ -0,0 +1,22 @@ | |||
# Ignore directories generated by Composer | |||
/drush/contrib/ | |||
/vendor/ | |||
/docroot/core/ | |||
/docroot/modules/contrib/ | |||
/docroot/themes/contrib/ | |||
/docroot/profiles/contrib/ | |||
/docroot/libraries/ | |||
# Ignore sensitive information | |||
docroot/sites/*/settings.php | |||
docroot/sites/*/settings.local.php | |||
# Ignore Drupal's file directory | |||
/docroot/sites/*/files/ | |||
# Ignore SimpleTest multi-site environment. | |||
docroot/sites/simpletest | |||
# Ignore files generated by PhpStorm | |||
/.idea/ | |||
.tags |
@ -0,0 +1,57 @@ | |||
variables: | |||
IMAGE_TAG_RELEASE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME | |||
stages: | |||
- lint | |||
- deploy | |||
lint: | |||
stage: lint | |||
image: donniewest/drupal-node-container:latest | |||
only: | |||
- dev | |||
script: | |||
- cd docroot/themes/custom/THEMENAME && npm install && npm run lint | |||
build-dev: | |||
image: docker:latest | |||
services: | |||
- docker:18-dind | |||
stage: deploy | |||
only: | |||
- master | |||
script: | |||
- docker run -v $PWD:/var/www/html donniewest/drupal-node-container:latest /bin/bash -c "composer install && cd ./docroot/themes/custom/THEMENAME/ && npm install && npm run build && npm run compile" | |||
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY | |||
- docker build -t $IMAGE_TAG_RELEASE ./ | |||
- docker push $IMAGE_TAG_RELEASE | |||
build-staging: | |||
image: docker:latest | |||
services: | |||
- docker:18-dind | |||
stage: deploy | |||
only: | |||
- /^RC-[\.\d]*/ | |||
except: | |||
- branches | |||
script: | |||
- docker run -v $PWD:/var/www/html donniewest/drupal-node-container:latest /bin/bash -c "composer install && cd ./docroot/themes/custom/THEMENAME/ && npm install && npm run build && npm run compile" | |||
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY | |||
- docker build -t $CI_REGISTRY_IMAGE:staging ./ | |||
- docker push $CI_REGISTRY_IMAGE:staging | |||
build-production: | |||
image: docker:latest | |||
services: | |||
- docker:18-dind | |||
stage: deploy | |||
only: | |||
- /^RELEASE-[\.\d]*/ | |||
except: | |||
- branches | |||
script: | |||
- docker run -v $PWD:/var/www/html donniewest/drupal-node-container:latest /bin/bash -c "composer install && cd ./docroot/themes/custom/THEMENAME/ && npm install && npm run build && npm run compile" | |||
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY | |||
- docker build -t $CI_REGISTRY_IMAGE:production ./ | |||
- docker push $CI_REGISTRY_IMAGE:production |
@ -0,0 +1,40 @@ | |||
language: php | |||
dist: trusty | |||
sudo: false | |||
php: | |||
- 5.6 | |||
- 7.0 | |||
- 7.1 | |||
env: | |||
global: | |||
- SIMPLETEST_DB=sqlite://tmp/site.sqlite | |||
- SIMPLETEST_BASE_URL="http://127.0.0.1:8080" | |||
matrix: | |||
- RELEASE=stable COMPOSER_CHANNEL=stable | |||
- RELEASE=dev COMPOSER_CHANNEL=stable | |||
- RELEASE=stable COMPOSER_CHANNEL=snapshot | |||
before_install: | |||
- echo 'sendmail_path = /bin/true' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini | |||
- phpenv config-rm xdebug.ini | |||
- composer --verbose self-update --$COMPOSER_CHANNEL | |||
- composer --version | |||
install: | |||
- composer --verbose install | |||
script: | |||
- if [[ $RELEASE = dev ]]; then composer --verbose remove --no-update drupal/console; fi; | |||
- if [[ $RELEASE = dev ]]; then composer --verbose require --no-update drupal/core:8.4.x-dev drush/drush:9.0.x-dev; fi; | |||
- if [[ $RELEASE = dev ]]; then composer --verbose update; fi; | |||
- cd $TRAVIS_BUILD_DIR/web | |||
- ./../vendor/bin/drush site-install --verbose --yes --db-url=sqlite://tmp/site.sqlite | |||
- ./../vendor/bin/drush runserver $SIMPLETEST_BASE_URL & | |||
- until curl -s $SIMPLETEST_BASE_URL; do true; done > /dev/null | |||
# Skip core/tests/Drupal/Tests/ComposerIntegrationTest.php because web/ has no composer.json | |||
# Ignore PageCache group temporarily, @see https://www.drupal.org/node/2770673 | |||
- ./../vendor/bin/phpunit -c core --testsuite unit --exclude-group Composer,DependencyInjection,PageCache | |||
- ./../vendor/bin/drush | |||
- if [[ $RELEASE = stable ]]; then ./../vendor/bin/drupal; fi; |
@ -0,0 +1,38 @@ | |||
FROM drupal:8.6 | |||
# Set the Drush version. | |||
ENV DRUSH_VERSION 8.1.18 | |||
# Install Drush 8 with the phar file. | |||
RUN curl -fsSL -o /usr/local/bin/drush "https://github.com/drush-ops/drush/releases/download/$DRUSH_VERSION/drush.phar" && \ | |||
chmod +x /usr/local/bin/drush | |||
RUN apt-get update && apt-get install -y libxml2-dev imagemagick mysql-client ssmtp --no-install-recommends | |||
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli | |||
ADD https://drupalconsole.com/installer /usr/local/bin/drupal | |||
RUN chmod +x /usr/local/bin/drupal | |||
RUN { \ | |||
echo 'memory_limit = 196M'; \ | |||
echo 'display_errors = Off'; \ | |||
echo 'post_max_size = 512M'; \ | |||
echo 'file_uploads = On'; \ | |||
echo 'upload_max_filesize = 512M'; \ | |||
echo 'max_file_uploads = 20'; \ | |||
} > /usr/local/etc/php/conf.d/codekoalas-settings.ini | |||
RUN echo 'sendmail_path = "/usr/sbin/ssmtp -t -i"' > /usr/local/etc/php/conf.d/mail.ini | |||
RUN sed -i 's/\/var\/www\/html/\/var\/www\/html\/docroot/g' /etc/apache2/sites-available/000-default.conf | |||
RUN rm -rf /var/www/html/* | |||
COPY ./ /var/www/html | |||
RUN chmod a+x ./run.sh | |||
ENTRYPOINT ["/bin/sh", "-c"] | |||
CMD ["./run.sh"] |
@ -0,0 +1,339 @@ | |||
GNU GENERAL PUBLIC LICENSE | |||
Version 2, June 1991 | |||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/> | |||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
Everyone is permitted to copy and distribute verbatim copies | |||
of this license document, but changing it is not allowed. | |||
Preamble | |||
The licenses for most software are designed to take away your | |||
freedom to share and change it. By contrast, the GNU General Public | |||
License is intended to guarantee your freedom to share and change free | |||
software--to make sure the software is free for all its users. This | |||
General Public License applies to most of the Free Software | |||
Foundation's software and to any other program whose authors commit to | |||
using it. (Some other Free Software Foundation software is covered by | |||
the GNU Lesser General Public License instead.) You can apply it to | |||
your programs, too. | |||
When we speak of free software, we are referring to freedom, not | |||
price. Our General Public Licenses are designed to make sure that you | |||
have the freedom to distribute copies of free software (and charge for | |||
this service if you wish), that you receive source code or can get it | |||
if you want it, that you can change the software or use pieces of it | |||
in new free programs; and that you know you can do these things. | |||
To protect your rights, we need to make restrictions that forbid | |||
anyone to deny you these rights or to ask you to surrender the rights. | |||
These restrictions translate to certain responsibilities for you if you | |||
distribute copies of the software, or if you modify it. | |||
For example, if you distribute copies of such a program, whether | |||
gratis or for a fee, you must give the recipients all the rights that | |||
you have. You must make sure that they, too, receive or can get the | |||
source code. And you must show them these terms so they know their | |||
rights. | |||
We protect your rights with two steps: (1) copyright the software, and | |||
(2) offer you this license which gives you legal permission to copy, | |||
distribute and/or modify the software. | |||
Also, for each author's protection and ours, we want to make certain | |||
that everyone understands that there is no warranty for this free | |||
software. If the software is modified by someone else and passed on, we | |||
want its recipients to know that what they have is not the original, so | |||
that any problems introduced by others will not reflect on the original | |||
authors' reputations. | |||
Finally, any free program is threatened constantly by software | |||
patents. We wish to avoid the danger that redistributors of a free | |||
program will individually obtain patent licenses, in effect making the | |||
program proprietary. To prevent this, we have made it clear that any | |||
patent must be licensed for everyone's free use or not licensed at all. | |||
The precise terms and conditions for copying, distribution and | |||
modification follow. | |||
GNU GENERAL PUBLIC LICENSE | |||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |||
0. This License applies to any program or other work which contains | |||
a notice placed by the copyright holder saying it may be distributed | |||
under the terms of this General Public License. The "Program", below, | |||
refers to any such program or work, and a "work based on the Program" | |||
means either the Program or any derivative work under copyright law: | |||
that is to say, a work containing the Program or a portion of it, | |||
either verbatim or with modifications and/or translated into another | |||
language. (Hereinafter, translation is included without limitation in | |||
the term "modification".) Each licensee is addressed as "you". | |||
Activities other than copying, distribution and modification are not | |||
covered by this License; they are outside its scope. The act of | |||
running the Program is not restricted, and the output from the Program | |||
is covered only if its contents constitute a work based on the | |||
Program (independent of having been made by running the Program). | |||
Whether that is true depends on what the Program does. | |||
1. You may copy and distribute verbatim copies of the Program's | |||
source code as you receive it, in any medium, provided that you | |||
conspicuously and appropriately publish on each copy an appropriate | |||
copyright notice and disclaimer of warranty; keep intact all the | |||
notices that refer to this License and to the absence of any warranty; | |||
and give any other recipients of the Program a copy of this License | |||
along with the Program. | |||
You may charge a fee for the physical act of transferring a copy, and | |||
you may at your option offer warranty protection in exchange for a fee. | |||
2. You may modify your copy or copies of the Program or any portion | |||
of it, thus forming a work based on the Program, and copy and | |||
distribute such modifications or work under the terms of Section 1 | |||
above, provided that you also meet all of these conditions: | |||
a) You must cause the modified files to carry prominent notices | |||
stating that you changed the files and the date of any change. | |||
b) You must cause any work that you distribute or publish, that in | |||
whole or in part contains or is derived from the Program or any | |||
part thereof, to be licensed as a whole at no charge to all third | |||
parties under the terms of this License. | |||
c) If the modified program normally reads commands interactively | |||
when run, you must cause it, when started running for such | |||
interactive use in the most ordinary way, to print or display an | |||
announcement including an appropriate copyright notice and a | |||
notice that there is no warranty (or else, saying that you provide | |||
a warranty) and that users may redistribute the program under | |||
these conditions, and telling the user how to view a copy of this | |||
License. (Exception: if the Program itself is interactive but | |||
does not normally print such an announcement, your work based on | |||
the Program is not required to print an announcement.) | |||
These requirements apply to the modified work as a whole. If | |||
identifiable sections of that work are not derived from the Program, | |||
and can be reasonably considered independent and separate works in | |||
themselves, then this License, and its terms, do not apply to those | |||
sections when you distribute them as separate works. But when you | |||
distribute the same sections as part of a whole which is a work based | |||
on the Program, the distribution of the whole must be on the terms of | |||
this License, whose permissions for other licensees extend to the | |||
entire whole, and thus to each and every part regardless of who wrote it. | |||
Thus, it is not the intent of this section to claim rights or contest | |||
your rights to work written entirely by you; rather, the intent is to | |||
exercise the right to control the distribution of derivative or | |||
collective works based on the Program. | |||
In addition, mere aggregation of another work not based on the Program | |||
with the Program (or with a work based on the Program) on a volume of | |||
a storage or distribution medium does not bring the other work under | |||
the scope of this License. | |||
3. You may copy and distribute the Program (or a work based on it, | |||
under Section 2) in object code or executable form under the terms of | |||
Sections 1 and 2 above provided that you also do one of the following: | |||
a) Accompany it with the complete corresponding machine-readable | |||
source code, which must be distributed under the terms of Sections | |||
1 and 2 above on a medium customarily used for software interchange; or, | |||
b) Accompany it with a written offer, valid for at least three | |||
years, to give any third party, for a charge no more than your | |||
cost of physically performing source distribution, a complete | |||
machine-readable copy of the corresponding source code, to be | |||
distributed under the terms of Sections 1 and 2 above on a medium | |||
customarily used for software interchange; or, | |||
c) Accompany it with the information you received as to the offer | |||
to distribute corresponding source code. (This alternative is | |||
allowed only for noncommercial distribution and only if you | |||
received the program in object code or executable form with such | |||
an offer, in accord with Subsection b above.) | |||
The source code for a work means the preferred form of the work for | |||
making modifications to it. For an executable work, complete source | |||
code means all the source code for all modules it contains, plus any | |||
associated interface definition files, plus the scripts used to | |||
control compilation and installation of the executable. However, as a | |||
special exception, the source code distributed need not include | |||
anything that is normally distributed (in either source or binary | |||
form) with the major components (compiler, kernel, and so on) of the | |||
operating system on which the executable runs, unless that component | |||
itself accompanies the executable. | |||
If distribution of executable or object code is made by offering | |||
access to copy from a designated place, then offering equivalent | |||
access to copy the source code from the same place counts as | |||
distribution of the source code, even though third parties are not | |||
compelled to copy the source along with the object code. | |||
4. You may not copy, modify, sublicense, or distribute the Program | |||
except as expressly provided under this License. Any attempt | |||
otherwise to copy, modify, sublicense or distribute the Program is | |||
void, and will automatically terminate your rights under this License. | |||
However, parties who have received copies, or rights, from you under | |||
this License will not have their licenses terminated so long as such | |||
parties remain in full compliance. | |||
5. You are not required to accept this License, since you have not | |||
signed it. However, nothing else grants you permission to modify or | |||
distribute the Program or its derivative works. These actions are | |||
prohibited by law if you do not accept this License. Therefore, by | |||
modifying or distributing the Program (or any work based on the | |||
Program), you indicate your acceptance of this License to do so, and | |||
all its terms and conditions for copying, distributing or modifying | |||
the Program or works based on it. | |||
6. Each time you redistribute the Program (or any work based on the | |||
Program), the recipient automatically receives a license from the | |||
original licensor to copy, distribute or modify the Program subject to | |||
these terms and conditions. You may not impose any further | |||
restrictions on the recipients' exercise of the rights granted herein. | |||
You are not responsible for enforcing compliance by third parties to | |||
this License. | |||
7. If, as a consequence of a court judgment or allegation of patent | |||
infringement or for any other reason (not limited to patent issues), | |||
conditions are imposed on you (whether by court order, agreement or | |||
otherwise) that contradict the conditions of this License, they do not | |||
excuse you from the conditions of this License. If you cannot | |||
distribute so as to satisfy simultaneously your obligations under this | |||
License and any other pertinent obligations, then as a consequence you | |||
may not distribute the Program at all. For example, if a patent | |||
license would not permit royalty-free redistribution of the Program by | |||
all those who receive copies directly or indirectly through you, then | |||
the only way you could satisfy both it and this License would be to | |||
refrain entirely from distribution of the Program. | |||
If any portion of this section is held invalid or unenforceable under | |||
any particular circumstance, the balance of the section is intended to | |||
apply and the section as a whole is intended to apply in other | |||
circumstances. | |||
It is not the purpose of this section to induce you to infringe any | |||
patents or other property right claims or to contest validity of any | |||
such claims; this section has the sole purpose of protecting the | |||
integrity of the free software distribution system, which is | |||
implemented by public license practices. Many people have made | |||
generous contributions to the wide range of software distributed | |||
through that system in reliance on consistent application of that | |||
system; it is up to the author/donor to decide if he or she is willing | |||
to distribute software through any other system and a licensee cannot | |||
impose that choice. | |||
This section is intended to make thoroughly clear what is believed to | |||
be a consequence of the rest of this License. | |||
8. If the distribution and/or use of the Program is restricted in | |||
certain countries either by patents or by copyrighted interfaces, the | |||
original copyright holder who places the Program under this License | |||
may add an explicit geographical distribution limitation excluding | |||
those countries, so that distribution is permitted only in or among | |||
countries not thus excluded. In such case, this License incorporates | |||
the limitation as if written in the body of this License. | |||
9. The Free Software Foundation may publish revised and/or new versions | |||
of the General Public License from time to time. Such new versions will | |||
be similar in spirit to the present version, but may differ in detail to | |||
address new problems or concerns. | |||
Each version is given a distinguishing version number. If the Program | |||
specifies a version number of this License which applies to it and "any | |||
later version", you have the option of following the terms and conditions | |||
either of that version or of any later version published by the Free | |||
Software Foundation. If the Program does not specify a version number of | |||
this License, you may choose any version ever published by the Free Software | |||
Foundation. | |||
10. If you wish to incorporate parts of the Program into other free | |||
programs whose distribution conditions are different, write to the author | |||
to ask for permission. For software which is copyrighted by the Free | |||
Software Foundation, write to the Free Software Foundation; we sometimes | |||
make exceptions for this. Our decision will be guided by the two goals | |||
of preserving the free status of all derivatives of our free software and | |||
of promoting the sharing and reuse of software generally. | |||
NO WARRANTY | |||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | |||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | |||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | |||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | |||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | |||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | |||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | |||
REPAIR OR CORRECTION. | |||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | |||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | |||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | |||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | |||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | |||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | |||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | |||
POSSIBILITY OF SUCH DAMAGES. | |||
END OF TERMS AND CONDITIONS | |||
How to Apply These Terms to Your New Programs | |||
If you develop a new program, and you want it to be of the greatest | |||
possible use to the public, the best way to achieve this is to make it | |||
free software which everyone can redistribute and change under these terms. | |||
To do so, attach the following notices to the program. It is safest | |||
to attach them to the start of each source file to most effectively | |||
convey the exclusion of warranty; and each file should have at least | |||
the "copyright" line and a pointer to where the full notice is found. | |||
{description} | |||
Copyright (C) {year} {fullname} | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License along | |||
with this program; if not, write to the Free Software Foundation, Inc., | |||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |||
Also add information on how to contact you by electronic and paper mail. | |||
If the program is interactive, make it output a short notice like this | |||
when it starts in an interactive mode: | |||
Gnomovision version 69, Copyright (C) year name of author | |||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |||
This is free software, and you are welcome to redistribute it | |||
under certain conditions; type `show c' for details. | |||
The hypothetical commands `show w' and `show c' should show the appropriate | |||
parts of the General Public License. Of course, the commands you use may | |||
be called something other than `show w' and `show c'; they could even be | |||
mouse-clicks or menu items--whatever suits your program. | |||
You should also get your employer (if you work as a programmer) or your | |||
school, if any, to sign a "copyright disclaimer" for the program, if | |||
necessary. Here is a sample; alter the names: | |||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program | |||
`Gnomovision' (which makes passes at compilers) written by James Hacker. | |||
{signature of Ty Coon}, 1 April 1989 | |||
Ty Coon, President of Vice | |||
This General Public License does not permit incorporating your program into | |||
proprietary programs. If your program is a subroutine library, you may | |||
consider it more useful to permit linking proprietary applications with the | |||
library. If this is what you want to do, use the GNU Lesser General | |||
Public License instead of this License. |
@ -0,0 +1,13 @@ | |||
# Composer template for Drupal projects | |||
Code Koalas Edition | |||
## How to use | |||
1. `composer create-project codekoalas/koality-drupal:8.x-dev some-dir --stability dev --no-interaction` | |||
2. `fin up` | |||
3. `cp sample.settings.php docroot/sites/default/settings.php` | |||
4. Go to your new local site. | |||
# Previous Readme | |||
Since this is a fork the previous README can be viewed back on the main project: | |||
https://github.com/drupal-composer/drupal-project | |||
@ -0,0 +1,113 @@ | |||
{ | |||
"name": "codekoalas/koality-drupal", | |||
"description": "Project template for Drupal 8 projects with composer: with some pre-installed things needed on every site", | |||
"type": "project", | |||
"license": "GPL-2.0+", | |||
"authors": [ | |||
{ | |||
"name": "", | |||
"role": "" | |||
} | |||
], | |||
"repositories": [ | |||
{ | |||
"type": "composer", | |||
"url": "https://packages.drupal.org/8" | |||
} | |||
], | |||
"require": { | |||
"php": ">=5.6", | |||
"composer/installers": "^1.2", | |||
"cweagans/composer-patches": "^1.6.5", | |||
"drupal-composer/drupal-scaffold": "^2.5", | |||
"drupal/admin_toolbar": "~1.0", | |||
"drupal/advagg": "^3.5", | |||
"drupal/backup_migrate": "^4.0", | |||
"drupal/blazy": "~1.0", | |||
"drupal/block_blacklist": "^1.0", | |||
"drupal/claro": "^1.0", | |||
"drupal/components": "^1.1", | |||
"drupal/config_export_ignore": "^1.0@RC", | |||
"drupal/config_ignore": "^2.1", | |||
"drupal/config_split": "^1.3", | |||
"drupal/config_update": "^1.5", | |||
"drupal/console": "^1.0.2", | |||
"drupal/core": "~8.0", | |||
"drupal/ctools": "~3.0", | |||
"drupal/devel": "^1.2", | |||
"drush/drush": "^9.0.0", | |||
"drupal/field_group": "^1.0", | |||
"drupal/focal_point": "^1.0", | |||
"drupal/imageapi_optimize": "^2.0@alpha", | |||
"drupal/inline_entity_form": "^1.0@RC", | |||
"drupal/layout_builder_restrictions": "^2.2", | |||
"drupal/layout_builder_st": "^1.0@alpha", | |||
"drupal/linkit": "~4.0", | |||
"drupal/masquerade": "^2.0@beta", | |||
"drupal/menu_link_attributes": "^1.0", | |||
"drupal/metatag": "^1.9", | |||
"drupal/module_filter": "~3.0", | |||
"drupal/paragraphs": "^1.2", | |||
"drupal/pathauto": "~1.0", | |||
"drupal/prlp": "^1.2", | |||
"drupal/token": "~1.0", | |||
"drupal/twig_tweak": "^2.0", | |||
"drupal/ui_patterns": "^1.1", | |||
"drupal/webform": "^5.3", | |||
"vlucas/phpdotenv": "^2.4", | |||
"webflo/drupal-finder": "^1.0.0", | |||
"webmozart/path-util": "^2.3", | |||
"zaporylie/composer-drupal-optimizations": "^1.0" | |||
}, | |||
"require-dev": { | |||
"webflo/drupal-core-require-dev": "^8.7.0" | |||
}, | |||
"conflict": { | |||
"drupal/drupal": "*" | |||
}, | |||
"minimum-stability": "dev", | |||
"prefer-stable": true, | |||
"config": { | |||
"sort-packages": true | |||
}, | |||
"autoload": { | |||
"classmap": [ | |||
"scripts/composer/ScriptHandler.php" | |||
], | |||
"files": ["load.environment.php"] | |||
}, | |||
"scripts": { | |||
"pre-install-cmd": [ | |||
"DrupalProject\\composer\\ScriptHandler::checkComposerVersion" | |||
], | |||
"pre-update-cmd": [ | |||
"DrupalProject\\composer\\ScriptHandler::checkComposerVersion" | |||
], | |||
"post-install-cmd": [ | |||
"DrupalProject\\composer\\ScriptHandler::createRequiredFiles" | |||
], | |||
"post-update-cmd": [ | |||
"DrupalProject\\composer\\ScriptHandler::createRequiredFiles" | |||
] | |||
}, | |||
"extra": { | |||
"composer-exit-on-patch-failure": true, | |||
"patchLevel": { | |||
"drupal/core": "-p2" | |||
}, | |||
"installer-paths": { | |||
"docroot/core": ["type:drupal-core"], | |||
"docroot/libraries/{$name}": ["type:drupal-library"], | |||
"docroot/modules/contrib/{$name}": ["type:drupal-module"], | |||
"docroot/profiles/contrib/{$name}": ["type:drupal-profile"], | |||
"docroot/themes/contrib/{$name}": ["type:drupal-theme"], | |||
"drush/contrib/{$name}": ["type:drupal-drush"] | |||
}, | |||
"drupal-scaffold": { | |||
"initial": { | |||
".editorconfig": "../.editorconfig", | |||
".gitattributes": "../.gitattributes" | |||
} | |||
} | |||
} | |||
} |
@ -0,0 +1,3 @@ | |||
ignored_config_entities: { } | |||
_core: | |||
default_config_hash: UVH1aJ4b44UM-VdPVN7hNNuuVqfReJxwfVeDQH1Hvsk |
@ -0,0 +1,13 @@ | |||
langcode: en | |||
status: true | |||
dependencies: { } | |||
id: default | |||
label: Default | |||
folder: ../config/default/default | |||
module: { } | |||
theme: { } | |||
blacklist: { } | |||
graylist: { } | |||
graylist_dependents: true | |||
graylist_skip_equal: true | |||
weight: 0 |
@ -0,0 +1,13 @@ | |||
langcode: en | |||
status: true | |||
dependencies: { } | |||
id: local | |||
label: Local | |||
folder: ../config/default/local | |||
module: { } | |||
theme: { } | |||
blacklist: { } | |||
graylist: { } | |||
graylist_dependents: true | |||
graylist_skip_equal: true | |||
weight: 1 |
@ -0,0 +1,13 @@ | |||
langcode: en | |||
status: true | |||
dependencies: { } | |||
id: production | |||
label: Production | |||
folder: ../config/default/production | |||
module: { } | |||
theme: { } | |||
blacklist: { } | |||
graylist: { } | |||
graylist_dependents: true | |||
graylist_skip_equal: true | |||
weight: 2 |
@ -0,0 +1,40 @@ | |||
--errors=box-model, | |||
display-property-grouping, | |||
duplicate-background-images, | |||
duplicate-properties, | |||
empty-rules, | |||
ids, | |||
import, | |||
important, | |||
known-properties, | |||
outline-none, | |||
overqualified-elements, | |||
qualified-headings, | |||
shorthand, | |||
star-property-hack, | |||
text-indent, | |||
underscore-property-hack, | |||
unique-headings, | |||
unqualified-attributes, | |||
vendor-prefix, | |||
zero-units | |||
--ignore=adjoining-classes, | |||
box-sizing, | |||
bulletproof-font-face, | |||
compatible-vendor-prefixes, | |||
errors, | |||
fallback-colors, | |||
floats, | |||
font-faces, | |||
font-sizes, | |||
gradients, | |||
import-ie-limit, | |||
order-alphabetical, | |||
regex-selectors, | |||
rules-count, | |||
selector-max, | |||
selector-max-approaching, | |||
selector-newline, | |||
universal-selector | |||
--exclude-list=core/assets, | |||
vendor |
@ -0,0 +1,17 @@ | |||
# Drupal editor configuration normalization | |||
# @see http://editorconfig.org/ | |||
# This is the top-most .editorconfig file; do not search in parent directories. | |||
root = true | |||
# All files. | |||
[*] | |||
end_of_line = LF | |||
indent_style = space | |||
indent_size = 2 | |||
charset = utf-8 | |||
trim_trailing_whitespace = true | |||
insert_final_newline = true | |||
[composer.{json,lock}] | |||
indent_size = 4 |
@ -0,0 +1,8 @@ | |||
core/**/* | |||
vendor/**/* | |||
sites/**/files/**/* | |||
libraries/**/* | |||
sites/**/libraries/**/* | |||
profiles/**/libraries/**/* | |||
**/js_test_files/**/* | |||
**/node_modules/**/* |
@ -0,0 +1,3 @@ | |||
{ | |||
"extends": "./core/.eslintrc.json" | |||
} |
@ -0,0 +1,61 @@ | |||
# Drupal git normalization | |||
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html | |||
# @see https://www.drupal.org/node/1542048 | |||
# Normally these settings would be done with macro attributes for improved | |||
# readability and easier maintenance. However macros can only be defined at the | |||
# repository root directory. Drupal avoids making any assumptions about where it | |||
# is installed. | |||
# Define text file attributes. | |||
# - Treat them as text. | |||
# - Ensure no CRLF line-endings, neither on checkout nor on checkin. | |||
# - Detect whitespace errors. | |||
# - Exposed by default in `git diff --color` on the CLI. | |||
# - Validate with `git diff --check`. | |||
# - Deny applying with `git apply --whitespace=error-all`. | |||
# - Fix automatically with `git apply --whitespace=fix`. | |||
*.config text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.css text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.dist text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.engine text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.html text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html | |||
*.inc text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.js text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.json text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.lock text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.map text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.md text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.module text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.php text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.po text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.script text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.sh text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.sql text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.svg text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.theme text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||
*.twig text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.txt text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.xml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
*.yml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||
# Define binary file attributes. | |||
# - Do not treat them as text. | |||
# - Include binary diff in patches instead of "binary files differ." | |||
*.eot -text diff | |||
*.exe -text diff | |||
*.gif -text diff | |||
*.gz -text diff | |||
*.ico -text diff | |||
*.jpeg -text diff | |||
*.jpg -text diff | |||
*.otf -text diff | |||
*.phar -text diff | |||
*.png -text diff | |||
*.svgz -text diff | |||
*.ttf -text diff | |||
*.woff -text diff | |||
*.woff2 -text diff |
@ -0,0 +1,65 @@ | |||
<?php | |||
/** | |||
* @file | |||
* Router script for the built-in PHP web server. | |||
* | |||
* The built-in web server should only be used for development and testing as it | |||
* has a number of limitations that makes running Drupal on it highly insecure | |||
* and somewhat limited. | |||
* | |||
* Note that: | |||
* - The server is single-threaded, any requests made during the execution of | |||
* the main request will hang until the main request has been completed. | |||
* - The web server does not enforce any of the settings in .htaccess in | |||
* particular a remote user will be able to download files that normally would | |||
* be protected from direct access such as .module files. | |||
* | |||
* The router script is needed to work around a bug in PHP, see | |||
* https://bugs.php.net/bug.php?id=61286. | |||
* | |||
* Usage: | |||
* php -S localhost:8888 .ht.router.php | |||
* | |||
* @see http://php.net/manual/en/features.commandline.webserver.php | |||
*/ | |||
$url = parse_url($_SERVER['REQUEST_URI']); | |||
if (file_exists(__DIR__ . $url['path'])) { | |||
// Serve the requested resource as-is. | |||
return FALSE; | |||
} | |||
// Work around the PHP bug. | |||
$path = $url['path']; | |||
$script = 'index.php'; | |||
if (strpos($path, '.php') !== FALSE) { | |||
// Work backwards through the path to check if a script exists. Otherwise | |||
// fallback to index.php. | |||
do { | |||
$path = dirname($path); | |||
if (preg_match('/\.php$/', $path) && is_file(__DIR__ . $path)) { | |||
// Discovered that the path contains an existing PHP file. Use that as the | |||
// script to include. | |||
$script = ltrim($path, '/'); | |||
break; | |||
} | |||
} while ($path !== '/' && $path !== '.'); | |||
} | |||
// Update $_SERVER variables to point to the correct index-file. | |||
$index_file_absolute = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $script; | |||
$index_file_relative = DIRECTORY_SEPARATOR . $script; | |||
// SCRIPT_FILENAME will point to the router script itself, it should point to | |||
// the full path of index.php. | |||
$_SERVER['SCRIPT_FILENAME'] = $index_file_absolute; | |||
// SCRIPT_NAME and PHP_SELF will either point to index.php or contain the full | |||
// virtual path being requested depending on the URL being requested. They | |||
// should always point to index.php relative to document root. | |||
$_SERVER['SCRIPT_NAME'] = $index_file_relative; | |||
$_SERVER['PHP_SELF'] = $index_file_relative; | |||
// Require the script and let core take over. | |||
require $_SERVER['SCRIPT_FILENAME']; |
@ -0,0 +1,189 @@ | |||
# | |||
# Apache/PHP/Drupal settings: | |||
# | |||
# Protect files and directories from prying eyes. | |||
<FilesMatch "\.(engine|inc|install|make|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\.(?!well-known).*|Entries.*|Repository|Root|Tag|Template|composer\.(json|lock))$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig|\.save)$"> | |||
<IfModule mod_authz_core.c> | |||
Require all denied | |||
</IfModule> | |||
<IfModule !mod_authz_core.c> | |||
Order allow,deny | |||
</IfModule> | |||
</FilesMatch> | |||
# Don't show directory listings for URLs which map to a directory. | |||
Options -Indexes | |||
# Set the default handler. | |||
DirectoryIndex index.php index.html index.htm | |||
# Add correct encoding for SVGZ. | |||
AddType image/svg+xml svg svgz | |||
AddEncoding gzip svgz | |||
# Most of the following PHP settings cannot be changed at runtime. See | |||
# sites/default/default.settings.php and | |||
# Drupal\Core\DrupalKernel::bootEnvironment() for settings that can be | |||
# changed at runtime. | |||
# PHP 5, Apache 1 and 2. | |||
<IfModule mod_php5.c> | |||
php_value assert.active 0 | |||
php_flag session.auto_start off | |||
php_value mbstring.http_input pass | |||
php_value mbstring.http_output pass | |||
php_flag mbstring.encoding_translation off | |||
# PHP 5.6 has deprecated $HTTP_RAW_POST_DATA and produces warnings if this is | |||
# not set. | |||
php_value always_populate_raw_post_data -1 | |||
</IfModule> | |||
# Requires mod_expires to be enabled. | |||
<IfModule mod_expires.c> | |||
# Enable expirations. | |||
ExpiresActive On | |||
# Cache all files for 2 weeks after access (A). | |||
ExpiresDefault A1209600 | |||
<FilesMatch \.php$> | |||
# Do not allow PHP scripts to be cached unless they explicitly send cache | |||
# headers themselves. Otherwise all scripts would have to overwrite the | |||
# headers set by mod_expires if they want another caching behavior. This may | |||
# fail if an error occurs early in the bootstrap process, and it may cause | |||
# problems if a non-Drupal PHP file is installed in a subdirectory. | |||
ExpiresActive Off | |||
</FilesMatch> | |||
</IfModule> | |||
# Set a fallback resource if mod_rewrite is not enabled. This allows Drupal to | |||
# work without clean URLs. This requires Apache version >= 2.2.16. If Drupal is | |||
# not accessed by the top level URL (i.e.: http://example.com/drupal/ instead of | |||
# http://example.com/), the path to index.php will need to be adjusted. | |||
<IfModule !mod_rewrite.c> | |||
FallbackResource /index.php | |||
</IfModule> | |||
# Various rewrite rules. | |||
<IfModule mod_rewrite.c> | |||
RewriteEngine on | |||
# Set "protossl" to "s" if we were accessed via https://. This is used later | |||
# if you enable "www." stripping or enforcement, in order to ensure that | |||
# you don't bounce between http and https. | |||
RewriteRule ^ - [E=protossl] | |||
RewriteCond %{HTTPS} on | |||
RewriteRule ^ - [E=protossl:s] | |||
# Make sure Authorization HTTP header is available to PHP | |||
# even when running as CGI or FastCGI. | |||
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] | |||
# Block access to "hidden" directories whose names begin with a period. This | |||
# includes directories used by version control systems such as Subversion or | |||
# Git to store control files. Files whose names begin with a period, as well | |||
# as the control files used by CVS, are protected by the FilesMatch directive | |||
# above. | |||
# | |||
# NOTE: This only works when mod_rewrite is loaded. Without mod_rewrite, it is | |||
# not possible to block access to entire directories from .htaccess because | |||
# <DirectoryMatch> is not allowed here. | |||
# | |||
# If you do not have mod_rewrite installed, you should remove these | |||
# directories from your webroot or otherwise protect them from being | |||
# downloaded. | |||
RewriteRule "/\.|^\.(?!well-known/)" - [F] | |||
# If your site can be accessed both with and without the 'www.' prefix, you | |||
# can use one of the following settings to redirect users to your preferred | |||
# URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option: | |||
# | |||
# To redirect all users to access the site WITH the 'www.' prefix, | |||
# (http://example.com/foo will be redirected to http://www.example.com/foo) | |||
# uncomment the following: | |||
# RewriteCond %{HTTP_HOST} . | |||
# RewriteCond %{HTTP_HOST} !^www\. [NC] | |||
# RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] | |||
# | |||
# To redirect all users to access the site WITHOUT the 'www.' prefix, | |||
# (http://www.example.com/foo will be redirected to http://example.com/foo) | |||
# uncomment the following: | |||
# RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] | |||
# RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301] | |||
# Modify the RewriteBase if you are using Drupal in a subdirectory or in a | |||
# VirtualDocumentRoot and the rewrite rules are not working properly. | |||
# For example if your site is at http://example.com/drupal uncomment and | |||
# modify the following line: | |||
# RewriteBase /drupal | |||
# | |||
# If your site is running in a VirtualDocumentRoot at http://example.com/, | |||
# uncomment the following line: | |||
# RewriteBase / | |||
# Redirect common PHP files to their new locations. | |||
RewriteCond %{REQUEST_URI} ^(.*)?/(install.php) [OR] | |||
RewriteCond %{REQUEST_URI} ^(.*)?/(rebuild.php) | |||
RewriteCond %{REQUEST_URI} !core | |||
RewriteRule ^ %1/core/%2 [L,QSA,R=301] | |||
# Rewrite install.php during installation to see if mod_rewrite is working | |||
RewriteRule ^core/install.php core/install.php?rewrite=ok [QSA,L] | |||
# Pass all requests not referring directly to files in the filesystem to | |||
# index.php. | |||
RewriteCond %{REQUEST_FILENAME} !-f | |||
RewriteCond %{REQUEST_FILENAME} !-d | |||
RewriteCond %{REQUEST_URI} !=/favicon.ico | |||
RewriteRule ^ index.php [L] | |||
# For security reasons, deny access to other PHP files on public sites. | |||
# Note: The following URI conditions are not anchored at the start (^), | |||
# because Drupal may be located in a subdirectory. To further improve | |||
# security, you can replace '!/' with '!^/'. | |||
# Allow access to PHP files in /core (like authorize.php or install.php): | |||
RewriteCond %{REQUEST_URI} !/core/[^/]*\.php$ | |||
# Allow access to test-specific PHP files: | |||
RewriteCond %{REQUEST_URI} !/core/modules/system/tests/https?.php | |||
# Allow access to Statistics module's custom front controller. | |||
# Copy and adapt this rule to directly execute PHP files in contributed or | |||
# custom modules or to run another PHP application in the same directory. | |||
RewriteCond %{REQUEST_URI} !/core/modules/statistics/statistics.php$ | |||
# Deny access to any other PHP files that do not match the rules above. | |||
# Specifically, disallow autoload.php from being served directly. | |||
RewriteRule "^(.+/.*|autoload)\.php($|/)" - [F] | |||
# Rules to correctly serve gzip compressed CSS and JS files. | |||
# Requires both mod_rewrite and mod_headers to be enabled. | |||
<IfModule mod_headers.c> | |||
# Serve gzip compressed CSS files if they exist and the client accepts gzip. | |||
RewriteCond %{HTTP:Accept-encoding} gzip | |||
RewriteCond %{REQUEST_FILENAME}\.gz -s | |||
RewriteRule ^(.*)\.css $1\.css\.gz [QSA] | |||
# Serve gzip compressed JS files if they exist and the client accepts gzip. | |||
RewriteCond %{HTTP:Accept-encoding} gzip | |||
RewriteCond %{REQUEST_FILENAME}\.gz -s | |||
RewriteRule ^(.*)\.js $1\.js\.gz [QSA] | |||
# Serve correct content types, and prevent mod_deflate double gzip. | |||
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1] | |||
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1] | |||
<FilesMatch "(\.js\.gz|\.css\.gz)$"> | |||
# Serve correct encoding type. | |||
Header set Content-Encoding gzip | |||
# Force proxies to cache gzipped & non-gzipped css/js files separately. | |||
Header append Vary Accept-Encoding | |||
</FilesMatch> | |||
</IfModule> | |||
</IfModule> | |||
# Various header fixes. | |||
<IfModule mod_headers.c> | |||
# Disable content sniffing, since it's an attack vector. | |||
Header always set X-Content-Type-Options nosniff | |||
# Disable Proxy header, since it's an attack vector. | |||
RequestHeader unset Proxy | |||
</IfModule> |
@ -0,0 +1,17 @@ | |||
<?php | |||
/** | |||
* @file | |||
* Includes the autoloader created by Composer. | |||
* | |||
* This file was generated by drupal-composer/drupal-scaffold. | |||
* https://github.com/drupal-composer/drupal-scaffold | |||
* | |||
* @see composer.json | |||
* @see index.php | |||
* @see core/install.php | |||
* @see core/rebuild.php | |||
* @see core/modules/statistics/statistics.php | |||
*/ | |||
return require __DIR__ . '/../vendor/autoload.php'; |
@ -0,0 +1,22 @@ | |||
<?php | |||
/** | |||
* @file | |||
* The PHP page that serves all page requests on a Drupal installation. | |||
* | |||
* All Drupal code is released under the GNU General Public License. | |||
* See COPYRIGHT.txt and LICENSE.txt files in the "core" directory. | |||
*/ | |||
use Drupal\Core\DrupalKernel; | |||
use Symfony\Component\HttpFoundation\Request; | |||
$autoloader = require_once 'autoload.php'; | |||
$kernel = new DrupalKernel('prod', $autoloader); | |||
$request = Request::createFromGlobals(); | |||
$response = $kernel->handle($request); | |||
$response->send(); | |||
$kernel->terminate($request, $response); |
@ -0,0 +1,61 @@ | |||
# | |||
# robots.txt | |||
# | |||
# This file is to prevent the crawling and indexing of certain parts | |||
# of your site by web crawlers and spiders run by sites like Yahoo! | |||
# and Google. By telling these "robots" where not to go on your site, | |||
# you save bandwidth and server resources. | |||
# | |||
# This file will be ignored unless it is at the root of your host: | |||
# Used: http://example.com/robots.txt | |||
# Ignored: http://example.com/site/robots.txt | |||
# | |||
# For more information about the robots.txt standard, see: | |||
# http://www.robotstxt.org/robotstxt.html | |||
User-agent: * | |||
# CSS, JS, Images | |||
Allow: /core/*.css$ | |||
Allow: /core/*.css? | |||
Allow: /core/*.js$ | |||
Allow: /core/*.js? | |||
Allow: /core/*.gif | |||
Allow: /core/*.jpg | |||
Allow: /core/*.jpeg | |||
Allow: /core/*.png | |||
Allow: /core/*.svg | |||
Allow: /profiles/*.css$ | |||
Allow: /profiles/*.css? | |||
Allow: /profiles/*.js$ | |||
Allow: /profiles/*.js? | |||
Allow: /profiles/*.gif | |||
Allow: /profiles/*.jpg | |||
Allow: /profiles/*.jpeg | |||
Allow: /profiles/*.png | |||
Allow: /profiles/*.svg | |||
# Directories | |||
Disallow: /core/ | |||
Disallow: /profiles/ | |||
# Files | |||
Disallow: /README.txt | |||
Disallow: /web.config | |||
# Paths (clean URLs) | |||
Disallow: /admin/ | |||
Disallow: /comment/reply/ | |||
Disallow: /filter/tips | |||
Disallow: /node/add/ | |||
Disallow: /search/ | |||
Disallow: /user/register/ | |||
Disallow: /user/password/ | |||
Disallow: /user/login/ | |||
Disallow: /user/logout/ | |||
# Paths (no clean URLs) | |||
Disallow: /index.php/admin/ | |||
Disallow: /index.php/comment/reply/ | |||
Disallow: /index.php/filter/tips | |||
Disallow: /index.php/node/add/ | |||
Disallow: /index.php/search/ | |||
Disallow: /index.php/user/password/ | |||
Disallow: /index.php/user/register/ | |||
Disallow: /index.php/user/login/ | |||
Disallow: /index.php/user/logout/ |
@ -0,0 +1,174 @@ | |||
parameters: | |||
session.storage.options: | |||
# Default ini options for sessions. | |||
# | |||
# Some distributions of Linux (most notably Debian) ship their PHP | |||
# installations with garbage collection (gc) disabled. Since Drupal depends | |||
# on PHP's garbage collection for clearing sessions, ensure that garbage | |||
# collection occurs by using the most common settings. | |||
# @default 1 | |||
gc_probability: 1 | |||
# @default 100 | |||
gc_divisor: 100 | |||
# | |||
# Set session lifetime (in seconds), i.e. the time from the user's last | |||
# visit to the active session may be deleted by the session garbage | |||
# collector. When a session is deleted, authenticated users are logged out, | |||
# and the contents of the user's $_SESSION variable is discarded. | |||
# @default 200000 | |||
gc_maxlifetime: 200000 | |||
# | |||
# Set session cookie lifetime (in seconds), i.e. the time from the session | |||
# is created to the cookie expires, i.e. when the browser is expected to | |||
# discard the cookie. The value 0 means "until the browser is closed". | |||
# @default 2000000 | |||
cookie_lifetime: 2000000 | |||
# | |||
# Drupal automatically generates a unique session cookie name based on the | |||
# full domain name used to access the site. This mechanism is sufficient | |||
# for most use-cases, including multi-site deployments. However, if it is | |||
# desired that a session can be reused across different subdomains, the | |||
# cookie domain needs to be set to the shared base domain. Doing so assures | |||
# that users remain logged in as they cross between various subdomains. | |||
# To maximize compatibility and normalize the behavior across user agents, | |||
# the cookie domain should start with a dot. | |||
# | |||
# @default none | |||
# cookie_domain: '.example.com' | |||
# | |||
twig.config: | |||
# Twig debugging: | |||
# | |||
# When debugging is enabled: | |||
# - The markup of each Twig template is surrounded by HTML comments that | |||
# contain theming information, such as template file name suggestions. | |||
# - Note that this debugging markup will cause automated tests that directly | |||
# check rendered HTML to fail. When running automated tests, 'debug' | |||
# should be set to FALSE. | |||
# - The dump() function can be used in Twig templates to output information | |||
# about template variables. | |||
# - Twig templates are automatically recompiled whenever the source code | |||
# changes (see auto_reload below). | |||
# | |||
# For more information about debugging Twig templates, see | |||
# https://www.drupal.org/node/1906392. | |||
# | |||
# Not recommended in production environments | |||
# @default false | |||
debug: false | |||
# Twig auto-reload: | |||
# | |||
# Automatically recompile Twig templates whenever the source code changes. | |||
# If you don't provide a value for auto_reload, it will be determined | |||
# based on the value of debug. | |||
# | |||
# Not recommended in production environments | |||
# @default null | |||
auto_reload: null | |||
# Twig cache: | |||
# | |||
# By default, Twig templates will be compiled and stored in the filesystem | |||
# to increase performance. Disabling the Twig cache will recompile the | |||
# templates from source each time they are used. In most cases the | |||
# auto_reload setting above should be enabled rather than disabling the | |||
# Twig cache. | |||
# | |||
# Not recommended in production environments | |||
# @default true | |||
cache: true | |||
renderer.config: | |||
# Renderer required cache contexts: | |||
# | |||
# The Renderer will automatically associate these cache contexts with every | |||
# render array, hence varying every render array by these cache contexts. | |||
# | |||
# @default ['languages:language_interface', 'theme', 'user.permissions'] | |||
required_cache_contexts: ['languages:language_interface', 'theme', 'user.permissions'] | |||
# Renderer automatic placeholdering conditions: | |||
# | |||
# Drupal allows portions of the page to be automatically deferred when | |||
# rendering to improve cache performance. That is especially helpful for | |||
# cache contexts that vary widely, such as the active user. On some sites | |||
# those may be different, however, such as sites with only a handful of | |||
# users. If you know what the high-cardinality cache contexts are for your | |||
# site, specify those here. If you're not sure, the defaults are fairly safe | |||
# in general. | |||
# | |||
# For more information about rendering optimizations see | |||
# https://www.drupal.org/developing/api/8/render/arrays/cacheability#optimizing | |||
auto_placeholder_conditions: | |||
# Max-age at or below which caching is not considered worthwhile. | |||
# | |||
# Disable by setting to -1. | |||
# | |||
# @default 0 | |||
max-age: 0 | |||
# Cache contexts with a high cardinality. | |||
# | |||
# Disable by setting to []. | |||
# | |||
# @default ['session', 'user'] | |||
contexts: ['session', 'user'] | |||
# Tags with a high invalidation frequency. | |||
# | |||
# Disable by setting to []. | |||
# | |||
# @default [] | |||
tags: [] | |||
# Cacheability debugging: | |||
# | |||
# Responses with cacheability metadata (CacheableResponseInterface instances) | |||
# get X-Drupal-Cache-Tags and X-Drupal-Cache-Contexts headers. | |||
# | |||
# For more information about debugging cacheable responses, see | |||
# https://www.drupal.org/developing/api/8/response/cacheable-response-interface | |||
# | |||
# Not recommended in production environments | |||
# @default false | |||
http.response.debug_cacheability_headers: false | |||
factory.keyvalue: | |||
{} | |||
# Default key/value storage service to use. | |||
# @default keyvalue.database | |||
# default: keyvalue.database | |||
# Collection-specific overrides. | |||
# state: keyvalue.database | |||
factory.keyvalue.expirable: | |||
{} | |||
# Default key/value expirable storage service to use. | |||
# @default keyvalue.database.expirable | |||
# default: keyvalue.database.expirable | |||
# Allowed protocols for URL generation. | |||
filter_protocols: | |||
- http | |||
- https | |||
- ftp | |||
- news | |||
- nntp | |||
- tel | |||
- telnet | |||
- mailto | |||
- irc | |||
- ssh | |||
- sftp | |||
- webcal | |||
- rtsp | |||
# Configure Cross-Site HTTP requests (CORS). | |||
# Read https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS | |||
# for more information about the topic in general. | |||
# Note: By default the configuration is disabled. | |||
cors.config: | |||
enabled: false | |||
# Specify allowed headers, like 'x-allowed-header'. | |||
allowedHeaders: [] | |||
# Specify allowed request methods, specify ['*'] to allow all possible ones. | |||
allowedMethods: [] | |||
# Configure requests allowed from specific origins. | |||
allowedOrigins: ['*'] | |||
# Sets the Access-Control-Expose-Headers header. | |||
exposedHeaders: false | |||
# Sets the Access-Control-Max-Age header. | |||
maxAge: false | |||
# Sets the Access-Control-Allow-Credentials header. | |||
supportsCredentials: false |
@ -0,0 +1,779 @@ | |||
<?php | |||
// @codingStandardsIgnoreFile | |||
/** | |||
* @file | |||
* Drupal site-specific configuration file. | |||
* | |||
* IMPORTANT NOTE: | |||
* This file may have been set to read-only by the Drupal installation program. | |||
* If you make changes to this file, be sure to protect it again after making | |||
* your modifications. Failure to remove write permissions to this file is a | |||
* security risk. | |||
* | |||
* In order to use the selection rules below the multisite aliasing file named | |||
* sites/sites.php must be present. Its optional settings will be loaded, and | |||
* the aliases in the array $sites will override the default directory rules | |||
* below. See sites/example.sites.php for more information about aliases. | |||
* | |||
* The configuration directory will be discovered by stripping the website's | |||
* hostname from left to right and pathname from right to left. The first | |||
* configuration file found will be used and any others will be ignored. If no | |||
* other configuration file is found then the default configuration file at | |||
* 'sites/default' will be used. | |||
* | |||
* For example, for a fictitious site installed at | |||
* https://www.drupal.org:8080/mysite/test/, the 'settings.php' file is searched | |||
* for in the following directories: | |||
* | |||
* - sites/8080.www.drupal.org.mysite.test | |||
* - sites/www.drupal.org.mysite.test | |||
* - sites/drupal.org.mysite.test | |||
* - sites/org.mysite.test | |||
* | |||
* - sites/8080.www.drupal.org.mysite | |||
* - sites/www.drupal.org.mysite | |||
* - sites/drupal.org.mysite | |||
* - sites/org.mysite | |||
* | |||
* - sites/8080.www.drupal.org | |||
* - sites/www.drupal.org | |||
* - sites/drupal.org | |||
* - sites/org | |||
* | |||
* - sites/default | |||
* | |||
* Note that if you are installing on a non-standard port number, prefix the | |||
* hostname with that number. For example, | |||
* https://www.drupal.org:8080/mysite/test/ could be loaded from | |||
* sites/8080.www.drupal.org.mysite.test/. | |||
* | |||
* @see example.sites.php | |||
* @see \Drupal\Core\DrupalKernel::getSitePath() | |||
* | |||
* In addition to customizing application settings through variables in | |||
* settings.php, you can create a services.yml file in the same directory to | |||
* register custom, site-specific service definitions and/or swap out default | |||
* implementations with custom ones. | |||
*/ | |||
/** | |||
* Database settings: | |||
* | |||
* The $databases array specifies the database connection or | |||
* connections that Drupal may use. Drupal is able to connect | |||
* to multiple databases, including multiple types of databases, | |||
* during the same request. | |||
* | |||
* One example of the simplest connection array is shown below. To use the | |||
* sample settings, copy and uncomment the code below between the @code and | |||
* @endcode lines and paste it after the $databases declaration. You will need | |||
* to replace the database username and password and possibly the host and port | |||
* with the appropriate credentials for your database system. | |||
* | |||
* The next section describes how to customize the $databases array for more | |||
* specific needs. | |||
* | |||
* @code | |||
* $databases['default']['default'] = [ | |||
* 'database' => 'databasename', | |||
* 'username' => 'sqlusername', | |||
* 'password' => 'sqlpassword', | |||
* 'host' => 'localhost', | |||
* 'port' => '3306', | |||
* 'driver' => 'mysql', | |||
* 'prefix' => '', | |||
* 'collation' => 'utf8mb4_general_ci', | |||
* ]; | |||
* @endcode | |||
*/ | |||
$databases = []; | |||
/** | |||
* Customizing database settings. | |||
* | |||
* Many of the values of the $databases array can be customized for your | |||
* particular database system. Refer to the sample in the section above as a | |||
* starting point. | |||
* | |||
* The "driver" property indicates what Drupal database driver the | |||
* connection should use. This is usually the same as the name of the | |||
* database type, such as mysql or sqlite, but not always. The other | |||
* properties will vary depending on the driver. For SQLite, you must | |||
* specify a database file name in a directory that is writable by the | |||
* webserver. For most other drivers, you must specify a | |||
* username, password, host, and database name. | |||
* | |||
* Transaction support is enabled by default for all drivers that support it, | |||
* including MySQL. To explicitly disable it, set the 'transactions' key to | |||
* FALSE. | |||
* Note that some configurations of MySQL, such as the MyISAM engine, don't | |||
* support it and will proceed silently even if enabled. If you experience | |||
* transaction related crashes with such configuration, set the 'transactions' | |||
* key to FALSE. | |||
* | |||
* For each database, you may optionally specify multiple "target" databases. | |||
* A target database allows Drupal to try to send certain queries to a | |||
* different database if it can but fall back to the default connection if not. | |||
* That is useful for primary/replica replication, as Drupal may try to connect | |||
* to a replica server when appropriate and if one is not available will simply | |||
* fall back to the single primary server (The terms primary/replica are | |||
* traditionally referred to as master/slave in database server documentation). | |||
* | |||
* The general format for the $databases array is as follows: | |||
* @code | |||
* $databases['default']['default'] = $info_array; | |||
* $databases['default']['replica'][] = $info_array; | |||
* $databases['default']['replica'][] = $info_array; | |||
* $databases['extra']['default'] = $info_array; | |||
* @endcode | |||
* | |||
* In the above example, $info_array is an array of settings described above. | |||
* The first line sets a "default" database that has one primary database | |||
* (the second level default). The second and third lines create an array | |||
* of potential replica databases. Drupal will select one at random for a given | |||
* request as needed. The fourth line creates a new database with a name of | |||
* "extra". | |||
* | |||
* You can optionally set prefixes for some or all database table names | |||
* by using the 'prefix' setting. If a prefix is specified, the table | |||
* name will be prepended with its value. Be sure to use valid database | |||
* characters only, usually alphanumeric and underscore. If no prefixes | |||
* are desired, leave it as an empty string ''. | |||
* | |||
* To have all database names prefixed, set 'prefix' as a string: | |||
* @code | |||
* 'prefix' => 'main_', | |||
* @endcode | |||
* | |||
* Per-table prefixes are deprecated as of Drupal 8.2, and will be removed in | |||
* Drupal 9.0. After that, only a single prefix for all tables will be | |||
* supported. | |||
* | |||
* To provide prefixes for specific tables, set 'prefix' as an array. | |||
* The array's keys are the table names and the values are the prefixes. | |||
* The 'default' element is mandatory and holds the prefix for any tables | |||
* not specified elsewhere in the array. Example: | |||
* @code | |||
* 'prefix' => [ | |||
* 'default' => 'main_', | |||
* 'users' => 'shared_', | |||
* 'sessions' => 'shared_', | |||
* 'role' => 'shared_', | |||
* 'authmap' => 'shared_', | |||
* ], | |||
* @endcode | |||
* You can also use a reference to a schema/database as a prefix. This may be | |||
* useful if your Drupal installation exists in a schema that is not the default | |||
* or you want to access several databases from the same code base at the same | |||
* time. | |||
* Example: | |||
* @code | |||
* 'prefix' => [ | |||
* 'default' => 'main.', | |||
* 'users' => 'shared.', | |||
* 'sessions' => 'shared.', | |||
* 'role' => 'shared.', | |||
* 'authmap' => 'shared.', | |||
* ]; | |||
* @endcode | |||
* NOTE: MySQL and SQLite's definition of a schema is a database. | |||
* | |||
* Advanced users can add or override initial commands to execute when | |||
* connecting to the database server, as well as PDO connection settings. For | |||
* example, to enable MySQL SELECT queries to exceed the max_join_size system | |||
* variable, and to reduce the database connection timeout to 5 seconds: | |||
* @code | |||
* $databases['default']['default'] = [ | |||
* 'init_commands' => [ | |||
* 'big_selects' => 'SET SQL_BIG_SELECTS=1', | |||
* ], | |||
* 'pdo' => [ | |||
* PDO::ATTR_TIMEOUT => 5, | |||
* ], | |||
* ]; | |||
* @endcode | |||
* | |||
* WARNING: The above defaults are designed for database portability. Changing | |||
* them may cause unexpected behavior, including potential data loss. See | |||
* https://www.drupal.org/developing/api/database/configuration for more | |||
* information on these defaults and the potential issues. | |||
* | |||
* More details can be found in the constructor methods for each driver: | |||
* - \Drupal\Core\Database\Driver\mysql\Connection::__construct() | |||
* - \Drupal\Core\Database\Driver\pgsql\Connection::__construct() | |||
* - \Drupal\Core\Database\Driver\sqlite\Connection::__construct() | |||
* | |||
* Sample Database configuration format for PostgreSQL (pgsql): | |||
* @code | |||
* $databases['default']['default'] = [ | |||
* 'driver' => 'pgsql', | |||
* 'database' => 'databasename', | |||
* 'username' => 'sqlusername', | |||
* 'password' => 'sqlpassword', | |||
* 'host' => 'localhost', | |||
* 'prefix' => '', | |||
* ]; | |||
* @endcode | |||
* | |||
* Sample Database configuration format for SQLite (sqlite): | |||
* @code | |||
* $databases['default']['default'] = [ | |||
* 'driver' => 'sqlite', | |||
* 'database' => '/path/to/databasefilename', | |||
* ]; | |||
* @endcode | |||
*/ | |||
/** | |||
* Location of the site configuration files. | |||
* | |||
* The $config_directories array specifies the location of file system | |||
* directories used for configuration data. On install, the "sync" directory is | |||
* created. This is used for configuration imports. The "active" directory is | |||
* not created by default since the default storage for active configuration is | |||
* the database rather than the file system. (This can be changed. See "Active | |||
* configuration settings" below). | |||
* | |||
* The default location for the "sync" directory is inside a randomly-named | |||
* directory in the public files path. The setting below allows you to override | |||
* the "sync" location. | |||
* | |||
* If you use files for the "active" configuration, you can tell the | |||
* Configuration system where this directory is located by adding an entry with | |||
* array key CONFIG_ACTIVE_DIRECTORY. | |||
* | |||
* Example: | |||
* @code | |||
* $config_directories = [ | |||
* CONFIG_SYNC_DIRECTORY => '/directory/outside/webroot', | |||
* ]; | |||
* @endcode | |||
*/ | |||
$config_directories = []; | |||
/** | |||
* Settings: | |||
* | |||
* $settings contains environment-specific configuration, such as the files | |||
* directory and reverse proxy address, and temporary configuration, such as | |||
* security overrides. | |||
* | |||
* @see \Drupal\Core\Site\Settings::get() | |||
*/ | |||
/** | |||
* Salt for one-time login links, cancel links, form tokens, etc. | |||
* | |||
* This variable will be set to a random value by the installer. All one-time | |||
* login links will be invalidated if the value is changed. Note that if your | |||
* site is deployed on a cluster of web servers, you must ensure that this | |||
* variable has the same value on each server. | |||
* | |||
* For enhanced security, you may set this variable to the contents of a file | |||
* outside your document root; you should also ensure that this file is not | |||
* stored with backups of your database. | |||
* | |||
* Example: | |||
* @code | |||
* $settings['hash_salt'] = file_get_contents('/home/example/salt.txt'); | |||
* @endcode | |||
*/ | |||
$settings['hash_salt'] = ''; | |||
/** | |||
* Deployment identifier. | |||
* | |||
* Drupal's dependency injection container will be automatically invalidated and | |||
* rebuilt when the Drupal core version changes. When updating contributed or | |||
* custom code that changes the container, changing this identifier will also | |||
* allow the container to be invalidated as soon as code is deployed. | |||
*/ | |||
# $settings['deployment_identifier'] = \Drupal::VERSION; | |||
/** | |||
* Access control for update.php script. | |||
* | |||
* If you are updating your Drupal installation using the update.php script but | |||
* are not logged in using either an account with the "Administer software | |||
* updates" permission or the site maintenance account (the account that was | |||
* created during installation), you will need to modify the access check | |||
* statement below. Change the FALSE to a TRUE to disable the access check. | |||
* After finishing the upgrade, be sure to open this file again and change the | |||
* TRUE back to a FALSE! | |||
*/ | |||
$settings['update_free_access'] = FALSE; | |||
/** | |||
* External access proxy settings: | |||
* | |||
* If your site must access the Internet via a web proxy then you can enter the | |||
* proxy settings here. Set the full URL of the proxy, including the port, in | |||
* variables: | |||
* - $settings['http_client_config']['proxy']['http']: The proxy URL for HTTP | |||
* requests. | |||
* - $settings['http_client_config']['proxy']['https']: The proxy URL for HTTPS | |||
* requests. | |||
* You can pass in the user name and password for basic authentication in the | |||
* URLs in these settings. | |||
* | |||
* You can also define an array of host names that can be accessed directly, | |||
* bypassing the proxy, in $settings['http_client_config']['proxy']['no']. | |||
*/ | |||
# $settings['http_client_config']['proxy']['http'] = 'http://proxy_user:proxy_pass@example.com:8080'; | |||
# $settings['http_client_config']['proxy']['https'] = 'http://proxy_user:proxy_pass@example.com:8080'; | |||
# $settings['http_client_config']['proxy']['no'] = ['127.0.0.1', 'localhost']; | |||
/** | |||
* Reverse Proxy Configuration: | |||
* | |||
* Reverse proxy servers are often used to enhance the performance | |||
* of heavily visited sites and may also provide other site caching, | |||
* security, or encryption benefits. In an environment where Drupal | |||
* is behind a reverse proxy, the real IP address of the client should | |||
* be determined such that the correct client IP address is available | |||
* to Drupal's logging, statistics, and access management systems. In | |||
* the most simple scenario, the proxy server will add an | |||
* X-Forwarded-For header to the request that contains the client IP | |||
* address. However, HTTP headers are vulnerable to spoofing, where a | |||
* malicious client could bypass restrictions by setting the | |||
* X-Forwarded-For header directly. Therefore, Drupal's proxy | |||
* configuration requires the IP addresses of all remote proxies to be | |||
* specified in $settings['reverse_proxy_addresses'] to work correctly. | |||
* | |||
* Enable this setting to get Drupal to determine the client IP from the | |||
* X-Forwarded-For header. If you are unsure about this setting, do not have a | |||
* reverse proxy, or Drupal operates in a shared hosting environment, this | |||
* setting should remain commented out. | |||
* | |||
* In order for this setting to be used you must specify every possible | |||
* reverse proxy IP address in $settings['reverse_proxy_addresses']. | |||
* If a complete list of reverse proxies is not available in your | |||
* environment (for example, if you use a CDN) you may set the | |||
* $_SERVER['REMOTE_ADDR'] variable directly in settings.php. | |||
* Be aware, however, that it is likely that this would allow IP | |||
* address spoofing unless more advanced precautions are taken. | |||
*/ | |||
# $settings['reverse_proxy'] = TRUE; | |||
/** | |||
* Specify every reverse proxy IP address in your environment. | |||
* This setting is required if $settings['reverse_proxy'] is TRUE. | |||
*/ | |||
# $settings['reverse_proxy_addresses'] = ['a.b.c.d', ...]; | |||
/** | |||
* Reverse proxy trusted headers. | |||
* | |||
* Sets which headers to trust from your reverse proxy. | |||
* | |||
* Common values are: | |||
* - \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | |||
* - \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED | |||
* | |||
* Note the default value of | |||
* @code | |||
* \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED | |||
* @endcode | |||
* is not secure by default. The value should be set to only the specific | |||
* headers the reverse proxy uses. For example: | |||
* @code | |||
* \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | |||
* @endcode | |||
* This would trust the following headers: | |||
* - X_FORWARDED_FOR | |||
* - X_FORWARDED_HOST | |||
* - X_FORWARDED_PROTO | |||
* - X_FORWARDED_PORT | |||
* | |||
* @see \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | |||
* @see \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED | |||
* @see \Symfony\Component\HttpFoundation\Request::setTrustedProxies | |||
*/ | |||
# $settings['reverse_proxy_trusted_headers'] = \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED; | |||
/** | |||
* Page caching: | |||
* | |||
* By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page | |||
* views. This tells a HTTP proxy that it may return a page from its local | |||
* cache without contacting the web server, if the user sends the same Cookie | |||
* header as the user who originally requested the cached page. Without "Vary: | |||
* Cookie", authenticated users would also be served the anonymous page from | |||
* the cache. If the site has mostly anonymous users except a few known | |||
* editors/administrators, the Vary header can be omitted. This allows for | |||
* better caching in HTTP proxies (including reverse proxies), i.e. even if | |||
* clients send different cookies, they still get content served from the cache. | |||
* However, authenticated users should access the site directly (i.e. not use an | |||
* HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid | |||
* getting cached pages from the proxy. | |||
*/ | |||
# $settings['omit_vary_cookie'] = TRUE; | |||
/** | |||
* Cache TTL for client error (4xx) responses. | |||
* | |||
* Items cached per-URL tend to result in a large number of cache items, and | |||
* this can be problematic on 404 pages which by their nature are unbounded. A | |||
* fixed TTL can be set for these items, defaulting to one hour, so that cache | |||
* backends which do not support LRU can purge older entries. To disable caching | |||
* of client error responses set the value to 0. Currently applies only to | |||
* page_cache module. | |||
*/ | |||
# $settings['cache_ttl_4xx'] = 3600; | |||
/** | |||
* Expiration of cached forms. | |||
* | |||
* Drupal's Form API stores details of forms in a cache and these entries are | |||
* kept for at least 6 hours by default. Expired entries are cleared by cron. | |||
* | |||
* @see \Drupal\Core\Form\FormCache::setCache() | |||
*/ | |||
# $settings['form_cache_expiration'] = 21600; | |||
/** | |||
* Class Loader. | |||
* | |||
* If the APC extension is detected, the Symfony APC class loader is used for | |||
* performance reasons. Detection can be prevented by setting | |||
* class_loader_auto_detect to false, as in the example below. | |||
*/ | |||
# $settings['class_loader_auto_detect'] = FALSE; | |||
/* | |||
* If the APC extension is not detected, either because APC is missing or | |||
* because auto-detection has been disabled, auto-loading falls back to | |||
* Composer's ClassLoader, which is good for development as it does not break | |||
* when code is moved in the file system. You can also decorate the base class | |||
* loader with another cached solution than the Symfony APC class loader, as | |||
* all production sites should have a cached class loader of some sort enabled. | |||
* | |||
* To do so, you may decorate and replace the local $class_loader variable. For | |||
* example, to use Symfony's APC class loader without automatic detection, | |||
* uncomment the code below. | |||
*/ | |||
/* | |||
if ($settings['hash_salt']) { | |||
$prefix = 'drupal.' . hash('sha256', 'drupal.' . $settings['hash_salt']); | |||
$apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader($prefix, $class_loader); | |||
unset($prefix); | |||
$class_loader->unregister(); | |||
$apc_loader->register(); | |||
$class_loader = $apc_loader; | |||
} | |||
*/ | |||
/** | |||
* Authorized file system operations: | |||
* | |||
* The Update Manager module included with Drupal provides a mechanism for | |||
* site administrators to securely install missing updates for the site | |||
* directly through the web user interface. On securely-configured servers, | |||
* the Update manager will require the administrator to provide SSH or FTP | |||
* credentials before allowing the installation to proceed; this allows the | |||
* site to update the new files as the user who owns all the Drupal files, | |||
* instead of as the user the webserver is running as. On servers where the | |||
* webserver user is itself the owner of the Drupal files, the administrator | |||
* will not be prompted for SSH or FTP credentials (note that these server | |||
* setups are common on shared hosting, but are inherently insecure). | |||
* | |||
* Some sites might wish to disable the above functionality, and only update | |||
* the code directly via SSH or FTP themselves. This setting completely | |||
* disables all functionality related to these authorized file operations. | |||
* | |||
* @see https://www.drupal.org/node/244924 | |||
* | |||
* Remove the leading hash signs to disable. | |||
*/ | |||
# $settings['allow_authorize_operations'] = FALSE; | |||
/** | |||
* Default mode for directories and files written by Drupal. | |||
* | |||
* Value should be in PHP Octal Notation, with leading zero. | |||
*/ | |||
# $settings['file_chmod_directory'] = 0775; | |||
# $settings['file_chmod_file'] = 0664; | |||
/** | |||
* Public file base URL: | |||
* | |||
* An alternative base URL to be used for serving public files. This must | |||
* include any leading directory path. | |||
* | |||
* A different value from the domain used by Drupal to be used for accessing | |||
* public files. This can be used for a simple CDN integration, or to improve | |||
* security by serving user-uploaded files from a different domain or subdomain | |||
* pointing to the same server. Do not include a trailing slash. | |||
*/ | |||
# $settings['file_public_base_url'] = 'http://downloads.example.com/files'; | |||
/** | |||
* Public file path: | |||
* | |||
* A local file system path where public files will be stored. This directory | |||
* must exist and be writable by Drupal. This directory must be relative to | |||
* the Drupal installation directory and be accessible over the web. | |||
*/ | |||
# $settings['file_public_path'] = 'sites/default/files'; | |||
/** | |||
* Private file path: | |||
* | |||
* A local file system path where private files will be stored. This directory | |||
* must be absolute, outside of the Drupal installation directory and not | |||
* accessible over the web. | |||
* | |||
* Note: Caches need to be cleared when this value is changed to make the | |||
* private:// stream wrapper available to the system. | |||
* | |||
* See https://www.drupal.org/documentation/modules/file for more information | |||
* about securing private files. | |||
*/ | |||
# $settings['file_private_path'] = ''; | |||
/** | |||
* Session write interval: | |||
* | |||
* Set the minimum interval between each session write to database. | |||
* For performance reasons it defaults to 180. | |||
*/ | |||
# $settings['session_write_interval'] = 180; | |||
/** | |||
* String overrides: | |||
* | |||
* To override specific strings on your site with or without enabling the Locale | |||
* module, add an entry to this list. This functionality allows you to change | |||
* a small number of your site's default English language interface strings. | |||
* | |||
* Remove the leading hash signs to enable. | |||
* | |||
* The "en" part of the variable name, is dynamic and can be any langcode of | |||
* any added language. (eg locale_custom_strings_de for german). | |||
*/ | |||
# $settings['locale_custom_strings_en'][''] = [ | |||
# 'forum' => 'Discussion board', | |||
# '@count min' => '@count minutes', | |||
# ]; | |||
/** | |||
* A custom theme for the offline page: | |||
* | |||
* This applies when the site is explicitly set to maintenance mode through the | |||
* administration page or when the database is inactive due to an error. | |||
* The template file should also be copied into the theme. It is located inside | |||
* 'core/modules/system/templates/maintenance-page.html.twig'. | |||
* | |||
* Note: This setting does not apply to installation and update pages. | |||
*/ | |||
# $settings['maintenance_theme'] = 'bartik'; | |||
/** | |||
* PHP settings: | |||
* | |||
* To see what PHP settings are possible, including whether they can be set at | |||
* runtime (by using ini_set()), read the PHP documentation: | |||
* http://php.net/manual/ini.list.php | |||
* See \Drupal\Core\DrupalKernel::bootEnvironment() for required runtime | |||
* settings and the .htaccess file for non-runtime settings. | |||
* Settings defined there should not be duplicated here so as to avoid conflict | |||
* issues. | |||
*/ | |||
/** | |||
* If you encounter a situation where users post a large amount of text, and | |||
* the result is stripped out upon viewing but can still be edited, Drupal's | |||
* output filter may not have sufficient memory to process it. If you | |||
* experience this issue, you may wish to uncomment the following two lines | |||
* and increase the limits of these variables. For more information, see | |||
* http://php.net/manual/pcre.configuration.php. | |||
*/ | |||
# ini_set('pcre.backtrack_limit', 200000); | |||
# ini_set('pcre.recursion_limit', 200000); | |||
/** | |||
* Active configuration settings. | |||
* | |||
* By default, the active configuration is stored in the database in the | |||
* {config} table. To use a different storage mechanism for the active | |||
* configuration, do the following prior to installing: | |||
* - Create an "active" directory and declare its path in $config_directories | |||
* as explained under the 'Location of the site configuration files' section | |||
* above in this file. To enhance security, you can declare a path that is | |||
* outside your document root. | |||
* - Override the 'bootstrap_config_storage' setting here. It must be set to a | |||
* callable that returns an object that implements | |||
* \Drupal\Core\Config\StorageInterface. | |||
* - Override the service definition 'config.storage.active'. Put this | |||
* override in a services.yml file in the same directory as settings.php | |||
* (definitions in this file will override service definition defaults). | |||
*/ | |||
# $settings['bootstrap_config_storage'] = ['Drupal\Core\Config\BootstrapConfigStorageFactory', 'getFileStorage']; | |||
/** | |||
* Configuration overrides. | |||
* | |||
* To globally override specific configuration values for this site, | |||
* set them here. You usually don't need to use this feature. This is | |||
* useful in a configuration file for a vhost or directory, rather than | |||
* the default settings.php. | |||
* | |||
* Note that any values you provide in these variable overrides will not be | |||
* viewable from the Drupal administration interface. The administration | |||
* interface displays the values stored in configuration so that you can stage | |||
* changes to other environments that don't have the overrides. | |||
* | |||
* There are particular configuration values that are risky to override. For | |||
* example, overriding the list of installed modules in 'core.extension' is not | |||
* supported as module install or uninstall has not occurred. Other examples | |||
* include field storage configuration, because it has effects on database | |||
* structure, and 'core.menu.static_menu_link_overrides' since this is cached in | |||
* a way that is not config override aware. Also, note that changing | |||
* configuration values in settings.php will not fire any of the configuration | |||
* change events. | |||
*/ | |||
# $config['system.file']['path']['temporary'] = '/tmp'; | |||
# $config['system.site']['name'] = 'My Drupal site'; | |||
# $config['system.theme']['default'] = 'stark'; | |||
# $config['user.settings']['anonymous'] = 'Visitor'; | |||
/** | |||
* Fast 404 pages: | |||
* | |||
* Drupal can generate fully themed 404 pages. However, some of these responses | |||
* are for images or other resource files that are not displayed to the user. | |||
* This can waste bandwidth, and also generate server load. | |||
* | |||
* The options below return a simple, fast 404 page for URLs matching a | |||
* specific pattern: | |||
* - $config['system.performance']['fast_404']['exclude_paths']: A regular | |||
* expression to match paths to exclude, such as images generated by image | |||
* styles, or dynamically-resized images. The default pattern provided below | |||
* also excludes the private file system. If you need to add more paths, you | |||
* can add '|path' to the expression. | |||
* - $config['system.performance']['fast_404']['paths']: A regular expression to | |||
* match paths that should return a simple 404 page, rather than the fully | |||
* themed 404 page. If you don't have any aliases ending in htm or html you | |||
* can add '|s?html?' to the expression. | |||
* - $config['system.performance']['fast_404']['html']: The html to return for | |||
* simple 404 pages. | |||
* | |||
* Remove the leading hash signs if you would like to alter this functionality. | |||
*/ | |||
# $config['system.performance']['fast_404']['exclude_paths'] = '/\/(?:styles)|(?:system\/files)\//'; | |||
# $config['system.performance']['fast_404']['paths'] = '/\.(?:txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i'; | |||
# $config['system.performance']['fast_404']['html'] = '<!DOCTYPE html><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>'; | |||
/** | |||
* Load services definition file. | |||
*/ | |||
$settings['container_yamls'][] = $app_root . '/' . $site_path . '/services.yml'; | |||
/** | |||
* Override the default service container class. | |||
* | |||
* This is useful for example to trace the service container for performance | |||
* tracking purposes, for testing a service container with an error condition or | |||
* to test a service container that throws an exception. | |||
*/ | |||
# $settings['container_base_class'] = '\Drupal\Core\DependencyInjection\Container'; | |||
/** | |||
* Override the default yaml parser class. | |||
* | |||
* Provide a fully qualified class name here if you would like to provide an | |||
* alternate implementation YAML parser. The class must implement the | |||
* \Drupal\Component\Serialization\SerializationInterface interface. | |||
*/ | |||
# $settings['yaml_parser_class'] = NULL; | |||
/** | |||
* Trusted host configuration. | |||
* | |||
* Drupal core can use the Symfony trusted host mechanism to prevent HTTP Host | |||
* header spoofing. | |||
* | |||
* To enable the trusted host mechanism, you enable your allowable hosts | |||
* in $settings['trusted_host_patterns']. This should be an array of regular | |||
* expression patterns, without delimiters, representing the hosts you would | |||
* like to allow. | |||
* | |||
* For example: | |||
* @code | |||
* $settings['trusted_host_patterns'] = [ | |||
* '^www\.example\.com$', | |||
* ]; | |||
* @endcode | |||
* will allow the site to only run from www.example.com. | |||
* | |||
* If you are running multisite, or if you are running your site from | |||
* different domain names (eg, you don't redirect http://www.example.com to | |||
* http://example.com), you should specify all of the host patterns that are | |||
* allowed by your site. | |||
* | |||
* For example: | |||
* @code | |||
* $settings['trusted_host_patterns'] = [ | |||
* '^example\.com$', | |||
* '^.+\.example\.com$', | |||
* '^example\.org$', | |||
* '^.+\.example\.org$', | |||
* ]; | |||
* @endcode | |||
* will allow the site to run off of all variants of example.com and | |||
* example.org, with all subdomains included. | |||
*/ | |||
/** | |||
* The default list of directories that will be ignored by Drupal's file API. | |||
* | |||
* By default ignore node_modules and bower_components folders to avoid issues | |||
* with common frontend tools and recursive scanning of directories looking for | |||
* extensions. | |||
* | |||
* @see file_scan_directory() | |||
* @see \Drupal\Core\Extension\ExtensionDiscovery::scanDirectory() | |||
*/ | |||
$settings['file_scan_ignore_directories'] = [ | |||
'node_modules', | |||
'bower_components', | |||
]; | |||
/** | |||
* The default number of entities to update in a batch process. | |||
* | |||
* This is used by update and post-update functions that need to go through and | |||
* change all the entities on a site, so it is useful to increase this number | |||
* if your hosting configuration (i.e. RAM allocation, CPU speed) allows for a | |||
* larger number of entities to be processed in a single batch run. | |||
*/ | |||
$settings['entity_update_batch_size'] = 50; | |||
/** | |||
* Entity update backup. | |||
* | |||
* This is used to inform the entity storage handler that the backup tables as | |||
* well as the original entity type and field storage definitions should be | |||
* retained after a successful entity update process. | |||
*/ | |||
$settings['entity_update_backup'] = TRUE; | |||
/** | |||
* Load local development override configuration, if available. | |||
* | |||
* Use settings.local.php to override variables on secondary (staging, | |||
* development, etc) installations of this site. Typically used to disable | |||
* caching, JavaScript/CSS compression, re-routing of outgoing emails, and | |||
* other things that should not happen on development and testing sites. | |||
* | |||
* Keep this code block at the end of this file to take full effect. | |||
*/ | |||
# | |||
# if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) { | |||
# include $app_root . '/' . $site_path . '/settings.local.php'; | |||
# } |
@ -0,0 +1,9 @@ | |||
# Local development services. | |||
# | |||
# To activate this feature, follow the instructions at the top of the | |||
# 'example.settings.local.php' file, which sits next to this file. | |||
parameters: | |||
http.response.debug_cacheability_headers: true | |||
services: | |||
cache.backend.null: | |||
class: Drupal\Core\Cache\NullBackendFactory |
@ -0,0 +1,131 @@ | |||
<?php | |||
// @codingStandardsIgnoreFile | |||
/** | |||
* @file | |||
* Local development override configuration feature. | |||
* | |||
* To activate this feature, copy and rename it such that its path plus | |||
* filename is 'sites/default/settings.local.php'. Then, go to the bottom of | |||
* 'sites/default/settings.php' and uncomment the commented lines that mention | |||
* 'settings.local.php'. | |||
* | |||
* If you are using a site name in the path, such as 'sites/example.com', copy | |||
* this file to 'sites/example.com/settings.local.php', and uncomment the lines | |||
* at the bottom of 'sites/example.com/settings.php'. | |||
*/ | |||
/** | |||
* Assertions. | |||
* | |||
* The Drupal project primarily uses runtime assertions to enforce the | |||
* expectations of the API by failing when incorrect calls are made by code | |||
* under development. | |||
* | |||
* @see http://php.net/assert | |||
* @see https://www.drupal.org/node/2492225 | |||
* | |||
* If you are using PHP 7.0 it is strongly recommended that you set | |||
* zend.assertions=1 in the PHP.ini file (It cannot be changed from .htaccess | |||
* or runtime) on development machines and to 0 in production. | |||
* | |||
* @see https://wiki.php.net/rfc/expectations | |||
*/ | |||
assert_options(ASSERT_ACTIVE, TRUE); | |||
\Drupal\Component\Assertion\Handle::register(); | |||
/** | |||
* Enable local development services. | |||
*/ | |||
$settings['container_yamls'][] = DRUPAL_ROOT . '/sites/development.services.yml'; | |||
/** | |||
* Show all error messages, with backtrace information. | |||
* | |||
* In case the error level could not be fetched from the database, as for | |||
* example the database connection failed, we rely only on this value. | |||
*/ | |||
$config['system.logging']['error_level'] = 'verbose'; | |||
/** | |||
* Disable CSS and JS aggregation. | |||
*/ | |||
$config['system.performance']['css']['preprocess'] = FALSE; | |||
$config['system.performance']['js']['preprocess'] = FALSE; | |||
/** | |||
* Disable the render cache. | |||
* | |||
* Note: you should test with the render cache enabled, to ensure the correct | |||
* cacheability metadata is present. However, in the early stages of | |||
* development, you may want to disable it. | |||
* | |||
* This setting disables the render cache by using the Null cache back-end | |||
* defined by the development.services.yml file above. | |||
* | |||
* Only use this setting once the site has been installed. | |||
*/ | |||
# $settings['cache']['bins']['render'] = 'cache.backend.null'; | |||
/** | |||
* Disable caching for migrations. | |||
* | |||
* Uncomment the code below to only store migrations in memory and not in the | |||
* database. This makes it easier to develop custom migrations. | |||
*/ | |||
# $settings['cache']['bins']['discovery_migration'] = 'cache.backend.memory'; | |||
/** | |||
* Disable Internal Page Cache. | |||
* | |||
* Note: you should test with Internal Page Cache enabled, to ensure the correct | |||
* cacheability metadata is present. However, in the early stages of | |||
* development, you may want to disable it. | |||
* | |||
* This setting disables the page cache by using the Null cache back-end | |||
* defined by the development.services.yml file above. | |||
* | |||
* Only use this setting once the site has been installed. | |||
*/ | |||
# $settings['cache']['bins']['page'] = 'cache.backend.null'; | |||
/** | |||
* Disable Dynamic Page Cache. | |||
* | |||
* Note: you should test with Dynamic Page Cache enabled, to ensure the correct | |||
* cacheability metadata is present (and hence the expected behavior). However, | |||
* in the early stages of development, you may want to disable it. | |||
*/ | |||
# $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.null'; | |||
/** | |||
* Allow test modules and themes to be installed. | |||
* | |||
* Drupal ignores test modules and themes by default for performance reasons. | |||
* During development it can be useful to install test extensions for debugging | |||
* purposes. | |||
*/ | |||
# $settings['extension_discovery_scan_tests'] = TRUE; | |||
/** | |||
* Enable access to rebuild.php. | |||
* | |||
* This setting can be enabled to allow Drupal's php and database cached | |||
* storage to be cleared via the rebuild.php page. Access to this page can also | |||
* be gained by generating a query string from rebuild_token_calculator.sh and | |||
* using these parameters in a request to rebuild.php. | |||
*/ | |||
$settings['rebuild_access'] = TRUE; | |||
/** | |||
* Skip file system permissions hardening. | |||
* | |||
* The system module will periodically check the permissions of your site's | |||
* site directory to ensure that it is not writable by the website user. For | |||
* sites that are managed with a version control system, this can cause problems | |||
* when files in that directory such as settings.php are updated, because the | |||
* user pulling in the changes won't have permissions to modify files in the | |||
* directory. | |||
*/ | |||
$settings['skip_permissions_hardening'] = TRUE; |
@ -0,0 +1,57 @@ | |||
<?php | |||
// @codingStandardsIgnoreFile | |||
/** | |||
* @file | |||
* Configuration file for multi-site support and directory aliasing feature. | |||
* | |||
* This file is required for multi-site support and also allows you to define a | |||
* set of aliases that map hostnames, ports, and pathnames to configuration | |||
* directories in the sites directory. These aliases are loaded prior to | |||
* scanning for directories, and they are exempt from the normal discovery | |||
* rules. See default.settings.php to view how Drupal discovers the | |||
* configuration directory when no alias is found. | |||
* | |||
* Aliases are useful on development servers, where the domain name may not be | |||
* the same as the domain of the live server. Since Drupal stores file paths in | |||
* the database (files, system table, etc.) this will ensure the paths are | |||
* correct when the site is deployed to a live server. | |||
* | |||
* To activate this feature, copy and rename it such that its path plus | |||
* filename is 'sites/sites.php'. | |||
* | |||
* Aliases are defined in an associative array named $sites. The array is | |||
* written in the format: '<port>.<domain>.<path>' => 'directory'. As an | |||
* example, to map https://www.drupal.org:8080/mysite/test to the configuration | |||
* directory sites/example.com, the array should be defined as: | |||
* @code | |||
* $sites = [ | |||
* '8080.www.drupal.org.mysite.test' => 'example.com', | |||
* ]; | |||
* @endcode | |||
* The URL, https://www.drupal.org:8080/mysite/test/, could be a symbolic link | |||
* or an Apache Alias directive that points to the Drupal root containing | |||
* index.php. An alias could also be created for a subdomain. See the | |||
* @link https://www.drupal.org/documentation/install online Drupal installation guide @endlink | |||
* for more information on setting up domains, subdomains, and subdirectories. | |||
* | |||
* The following examples look for a site configuration in sites/example.com: | |||
* @code | |||
* URL: http://dev.drupal.org | |||
* $sites['dev.drupal.org'] = 'example.com'; | |||
* | |||
* URL: http://localhost/example | |||
* $sites['localhost.example'] = 'example.com'; | |||
* | |||
* URL: http://localhost:8080/example | |||
* $sites['8080.localhost.example'] = 'example.com'; | |||
* | |||
* URL: https://www.drupal.org:8080/mysite/test/ | |||
* $sites['8080.www.drupal.org.mysite.test'] = 'example.com'; | |||
* @endcode | |||
* | |||
* @see default.settings.php | |||
* @see \Drupal\Core\DrupalKernel::getSitePath() | |||
* @see https://www.drupal.org/documentation/install/multi-site | |||
*/ |
@ -0,0 +1,31 @@ | |||
<?php | |||
/** | |||
* @file | |||
* The PHP page that handles updating the Drupal installation. | |||
* | |||
* All Drupal code is released under the GNU General Public License. | |||
* See COPYRIGHT.txt and LICENSE.txt files in the "core" directory. | |||
*/ | |||
use Drupal\Core\Update\UpdateKernel; | |||
use Symfony\Component\HttpFoundation\Request; | |||
$autoloader = require_once 'autoload.php'; | |||
// Disable garbage collection during test runs. Under certain circumstances the | |||
// update path will create so many objects that garbage collection causes | |||
// segmentation faults. | |||
require_once 'core/includes/bootstrap.inc'; | |||
if (drupal_valid_test_ua()) { | |||
gc_collect_cycles(); | |||
gc_disable(); | |||
} | |||
$kernel = new UpdateKernel('prod', $autoloader, FALSE); | |||
$request = Request::createFromGlobals(); | |||
$response = $kernel->handle($request); | |||
$response->send(); | |||
$kernel->terminate($request, $response); |
@ -0,0 +1,103 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<configuration> | |||
<system.webServer> | |||
<!-- Don't show directory listings for URLs which map to a directory. --> | |||
<directoryBrowse enabled="false" /> | |||
<!-- | |||
Caching configuration was not delegated by default. Some hosters may not | |||
delegate the caching configuration to site owners by default and that | |||
may cause errors when users install. Uncomment this if you want to and | |||
are allowed to enable caching. | |||
--> | |||
<!-- | |||
<caching> | |||
<profiles> | |||
<add extension=".php" policy="DisableCache" kernelCachePolicy="DisableCache" /> | |||
<add extension=".html" policy="CacheForTimePeriod" kernelCachePolicy="CacheForTimePeriod" duration="14:00:00" /> | |||
</profiles> | |||
</caching> | |||
--> | |||
<rewrite> | |||
<rules> | |||
<rule name="Protect files and directories from prying eyes" stopProcessing="true"> | |||
<match url="\.(engine|inc|install|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml|svn-base)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template|all-wcprops|entries|format|composer\.(json|lock))$" /> | |||
<action type="CustomResponse" statusCode="403" subStatusCode="0" statusReason="Forbidden" statusDescription="Access is forbidden." /> | |||
</rule> | |||
<rule name="Force simple error message for requests for non-existent favicon.ico" stopProcessing="true"> | |||
<match url="favicon\.ico" /> | |||
<action type="CustomResponse" statusCode="404" subStatusCode="1" statusReason="File Not Found" statusDescription="The requested file favicon.ico was not found" /> | |||
<conditions> | |||
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> | |||
</conditions> | |||
</rule> | |||
<!-- If running on a PHP version affected by httpoxy vulnerability | |||
uncomment the following rule to mitigate it's impact. To make this | |||
rule work, you will also need to add HTTP_PROXY to the allowed server | |||
variables manually in IIS. See https://www.drupal.org/node/2783079. | |||
<rule name="Erase HTTP_PROXY" patternSyntax="Wildcard"> | |||
<match url="*.*" /> | |||
<serverVariables> | |||
<set name="HTTP_PROXY" value="" /> | |||
</serverVariables> | |||
<action type="None" /> | |||
</rule> | |||
--> | |||
<!-- To redirect all users to access the site WITH the 'www.' prefix, | |||
http://example.com/foo will be redirected to http://www.example.com/foo) | |||
adapt and uncomment the following: --> | |||
<!-- | |||
<rule name="Redirect to add www" stopProcessing="true"> | |||
<match url="^(.*)$" ignoreCase="false" /> | |||
<conditions> | |||
<add input="{HTTP_HOST}" pattern="^example\.com$" /> | |||
</conditions> | |||
<action type="Redirect" redirectType="Permanent" url="http://www.example.com/{R:1}" /> | |||
</rule> | |||
--> | |||
<!-- To redirect all users to access the site WITHOUT the 'www.' prefix, | |||
http://www.example.com/foo will be redirected to http://example.com/foo) | |||
adapt and uncomment the following: --> | |||
<!-- | |||
<rule name="Redirect to remove www" stopProcessing="true"> | |||
<match url="^(.*)$" ignoreCase="false" /> | |||
<conditions> | |||
<add input="{HTTP_HOST}" pattern="^www\.example\.com$" /> | |||
</conditions> | |||
<action type="Redirect" redirectType="Permanent" url="http://example.com/{R:1}" /> | |||
</rule> | |||
--> | |||
<!-- Pass all requests not referring directly to files in the filesystem | |||
to index.php. --> | |||
<rule name="Short URLS" stopProcessing="true"> | |||
<match url="^(.*)$" ignoreCase="false" /> | |||
<conditions> | |||
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" /> | |||
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" /> | |||
<add input="{URL}" pattern="^/favicon.ico$" ignoreCase="false" negate="true" /> | |||
</conditions> | |||
<action type="Rewrite" url="index.php" /> | |||
</rule> | |||
</rules> | |||
</rewrite> | |||
<!-- If running Windows Server 2008 R2 this can be commented out --> | |||
<!-- httpErrors> | |||
<remove statusCode="404" subStatusCode="-1" /> | |||
<error statusCode="404" prefixLanguageFilePath="" path="/index.php" responseMode="ExecuteURL" /> | |||
</httpErrors --> | |||
<defaultDocument> | |||
<!-- Set the default document --> | |||
<files> | |||
<clear /> | |||
<add value="index.php" /> | |||
</files> | |||
</defaultDocument> | |||
</system.webServer> | |||
</configuration> |
@ -0,0 +1 @@ | |||
This directory contains commands, configuration and site aliases for Drush. See https://packagist.org/search/?type=drupal-drush for a directory of Drush commands installable via Composer. |
@ -0,0 +1,38 @@ | |||
<?php | |||
/* | |||
* Customize this file as desired. See https://github.com/drush-ops/drush/blob/8.x/examples/policy.drush.inc for documentation. | |||
*/ | |||
/** | |||
* Implements drush_hook_COMMAND_validate(). | |||
* | |||
* Encourage folks to use `composer` instead of Drush pm commands | |||
*/ | |||
function drush_policy_pm_updatecode_validate() { | |||
return _deny_message(); | |||
} | |||
function drush_policy_pm_update_validate() { | |||
return _deny_message(); | |||
} | |||
function drush_policy_pm_download_validate() { | |||
return _deny_message(); | |||
} | |||
function _deny_message() { | |||
if (!drush_get_option('pm-force')) { | |||
$msg = 'This codebase is assembled with Composer instead of Drush. Use `composer update` and `composer require` instead of `drush pm-updatecode` and `drush pm-download`. You may override this error by using the --pm-force option.'; | |||
return drush_set_error('POLICY_PM_DENY', dt($msg)); | |||
} | |||
} | |||
/** | |||
* Implements hook_drush_help_alter(). | |||
*/ | |||
function policy_drush_help_alter(&$command) { | |||
if (in_array($command['command'], array('pm-updatecode', 'pm-update', 'pm-download'))) { | |||
$command['options']['pm-force'] = 'Override site policy and allow Drush codebase management (pm-* commands)'; | |||
} | |||
} |
@ -0,0 +1,20 @@ | |||
<?php | |||
/** | |||
* This file is included very early. See autoload.files in composer.json and | |||
* https://getcomposer.org/doc/04-schema.md#files | |||
*/ | |||
use Dotenv\Dotenv; | |||
use Dotenv\Exception\InvalidPathException; | |||
/** | |||
* Load any .env file. See /.env.example. | |||
*/ | |||
$dotenv = new Dotenv(__DIR__); | |||
try { | |||
$dotenv->load(); | |||
} | |||
catch (InvalidPathException $e) { | |||
// Do nothing. Production environments rarely use .env files. | |||
} |
@ -0,0 +1,68 @@ | |||
# Useful things for Drupal projects | |||
default: up | |||
DRUPAL_ROOT ?= /var/www/site/docroot | |||
PROJECT_ROOT ?= /var/www/site | |||
IMAGE_NAME = drupal-project | |||
# Spin up the docker container as defined in the docker-compose.yaml | |||
up: | |||
docker-compose up -d | |||
# Spin down the docker container when you're no longer needing this as a local site | |||
down: | |||
docker-compose down | |||
# This will do everything that is needed to get your site up and running for the first time | |||
# Right now spins up container, then makes sure all composer dependencies are downloaded | |||
first-launch: | |||
make up | |||
make install-dependencies | |||
# Rebuilds the Drupal cache, useful anytime you make template changes or edit module files | |||
cache-rebuild: | |||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "drupal cr all" | |||
# Install all dependencies defined in the composer.json | |||
install-dependencies: | |||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "composer install" | |||
# Example command looks like "make require-module module=recaptcha" | |||
require-module: | |||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "composer require drupal/$(module)" | |||
# Example command looks like "make remove-module module=recaptcha" | |||
remove-module: | |||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "drupal module:uninstall $(module)" | |||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "composer remove drupal/$(module)" | |||
# Example command looks like "make install-module module=recaptcha" | |||
install-module: | |||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "drupal module:install $(module)" | |||
# If you put the db you want in the root of the project and run this command it will import that database | |||
# the database filename must be starter.sql and in the root of this repo | |||
# WARNING: You will lose any local changes you have made | |||
import-db: | |||
docker-compose down | |||
sudo rm -Rf ../sites-databases/$(IMAGE_NAME) | |||
docker-compose up -d | |||
# See all the logs of the docker container, useful for finding PHP errors | |||
logs: | |||
docker logs $(IMAGE_NAME) -f | |||
login: | |||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash | |||
# Export the config from the DB into config files | |||
config-export: | |||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "drupal config:export" | |||
# import the config from config files into the DB | |||
config-import: | |||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "drupal config:import" | |||
setup-config: | |||
docker exec -ti -w $(DRUPAL_ROOT) $(IMAGE_NAME) /bin/bash -ci "cp -R config_split/* config/default/default/. && drush config-import" |
@ -0,0 +1,15 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd" | |||
backupGlobals="false" | |||
colors="true" | |||
bootstrap="vendor/autoload.php" | |||
verbose="true" | |||
> | |||
<testsuites> | |||
<testsuite name="drupal-composer-project tests"> | |||
<directory>./test/</directory> | |||
</testsuite> | |||
</testsuites> | |||
</phpunit> |
@ -0,0 +1,29 @@ | |||
#!/bin/bash | |||
# set up ssmtp | |||
if [[ $SESmailhub ]]; then | |||
cat << EOF > /etc/ssmtp/ssmtp.conf | |||
debug=yes | |||
mailhub=$SESmailhub | |||
Hostname=$HOSTNAME | |||
FromLineOverride=yes | |||
UseSTARTTLS=yes | |||
EOF | |||
fi | |||
if [[ $SESAuthUser ]]; then | |||
cat << EOF >> /etc/ssmtp/ssmtp.conf | |||
$SESAuthUser | |||
EOF | |||
fi | |||
if [[ $SESAuthPass ]]; then | |||
cat << EOF >> /etc/ssmtp/ssmtp.conf | |||
$SESAuthPass | |||
EOF | |||
fi | |||
apache2-foreground |
@ -0,0 +1,60 @@ | |||
<?php | |||
$settings['update_free_access'] = FALSE; | |||
$settings['file_private_path'] = '../private'; | |||
$settings['container_yamls'][] = $app_root . '/' . $site_path . '/services.yml'; | |||
$settings['file_scan_ignore_directories'] = [ | |||
'node_modules', | |||
'bower_components', | |||
]; | |||
$settings['entity_update_batch_size'] = 50; | |||
$settings['hash_salt'] = 'asotenuarchqewsmaoeuSNTH56654+'; | |||
$settings['trusted_host_patterns'] = [ | |||
getenv('DRUPAL_TRUSTED_HOSTS'), | |||
'nazarene-org\.docksal$', | |||
]; | |||
$databases = []; | |||
$databases['default']['default'] = [ | |||
'database' => getenv('DATABASE_NAME'), | |||
'username' => getenv('DATABASE_USERNAME'), | |||
'password' => getenv('DATABASE_PASSWORD'), | |||
'prefix' => '', | |||
'host' => getenv('DATABASE_HOST'), | |||
'port' => '3306', | |||
'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql', | |||
'driver' => 'mysql', | |||
]; | |||
$config_directories = []; | |||
$config_directories[CONFIG_SYNC_DIRECTORY] = '../config/default/default'; | |||
$site_environment = getenv('SITE_ENV'); | |||
$config['config_split.config_split.local']['status'] = FALSE; | |||
$config['config_split.config_split.dev']['status'] = FALSE; | |||
$config['config_split.config_split.stage']['status'] = FALSE; | |||
$config['config_split.config_split.prod']['status'] = FALSE; | |||
switch ($site_environment) { | |||
case 'local': | |||
$config['config_split.config_split.local']['status'] = TRUE; | |||
break; | |||
case 'dev': | |||
$config['config_split.config_split.dev']['status'] = TRUE; | |||
break; | |||
case 'stage': | |||
$config['config_split.config_split.stage']['status'] = TRUE; | |||
break; | |||
case 'prod': | |||
$config['config_split.config_split.prod']['status'] = TRUE; | |||
break; | |||
} | |||
/** | |||
* Include a custom settings file if it exists. | |||
*/ | |||
$custom_settings = DRUPAL_ROOT . '/sites/default/custom.settings.php'; | |||
if (file_exists($custom_settings)) { | |||
include $custom_settings; | |||
} | |||
@ -0,0 +1,84 @@ | |||
<?php | |||
/** | |||
* @file | |||
* Contains \DrupalProject\composer\ScriptHandler. | |||
*/ | |||
namespace DrupalProject\composer; | |||
use Composer\Script\Event; | |||
use Composer\Semver\Comparator; | |||
use DrupalFinder\DrupalFinder; | |||
use Symfony\Component\Filesystem\Filesystem; | |||
use Webmozart\PathUtil\Path; | |||
class ScriptHandler { | |||
public static function createRequiredFiles(Event $event) { | |||
$fs = new Filesystem(); | |||
$drupalFinder = new DrupalFinder(); | |||
$drupalFinder->locateRoot(getcwd()); | |||
$drupalRoot = $drupalFinder->getDrupalRoot(); | |||
$dirs = [ | |||
'modules', | |||
'profiles', | |||
'themes', | |||
]; | |||
// Required for unit testing | |||
foreach ($dirs as $dir) { | |||
if (!$fs->exists($drupalRoot . '/'. $dir)) { | |||
$fs->mkdir($drupalRoot . '/'. $dir); | |||
$fs->touch($drupalRoot . '/'. $dir . '/.gitkeep'); | |||
} | |||
} | |||
// Create the files directory with chmod 0777 | |||
if (!$fs->exists($drupalRoot . '/sites/default/files')) { | |||
$oldmask = umask(0); | |||
$fs->mkdir($drupalRoot . '/sites/default/files', 0777); | |||
umask($oldmask); | |||
$event->getIO()->write("Created a sites/default/files directory with chmod 0777"); | |||
} | |||
} | |||
/** | |||
* Checks if the installed version of Composer is compatible. | |||
* | |||
* Composer 1.0.0 and higher consider a `composer install` without having a | |||
* lock file present as equal to `composer update`. We do not ship with a lock | |||
* file to avoid merge conflicts downstream, meaning that if a project is | |||
* installed with an older version of Composer the scaffolding of Drupal will | |||
* not be triggered. We check this here instead of in drupal-scaffold to be | |||
* able to give immediate feedback to the end user, rather than failing the | |||
* installation after going through the lengthy process of compiling and | |||
* downloading the Composer dependencies. | |||
* | |||
* @see https://github.com/composer/composer/pull/5035 | |||
*/ | |||
public static function checkComposerVersion(Event $event) { | |||
$composer = $event->getComposer(); | |||
$io = $event->getIO(); | |||
$version = $composer::VERSION; | |||
// The dev-channel of composer uses the git revision as version number, | |||
// try to the branch alias instead. | |||
if (preg_match('/^[0-9a-f]{40}$/i', $version)) { | |||
$version = $composer::BRANCH_ALIAS_VERSION; | |||
} | |||
// If Composer is installed through git we have no easy way to determine if | |||
// it is new enough, just display a warning. | |||
if ($version === '@package_version@' || $version === '@package_branch_alias_version@') { | |||
$io->writeError('<warning>You are running a development version of Composer. If you experience problems, please update Composer to the latest stable version.</warning>'); | |||
} | |||
elseif (Comparator::lessThan($version, '1.0.0')) { | |||
$io->writeError('<error>Drupal-project requires Composer version 1.0.0 or higher. Please update your Composer before continuing</error>.'); | |||
exit(1); | |||
} | |||
} | |||
} |