Merge pull request #20802 from civicrm/5.39
[civicrm-core.git] / distmaker / dists / common.sh
1 #!/bin/bash
2
3 ## Delete/create a dir
4 ## usage: dm_reset_dirs <path1> <path2> ...
5 function dm_reset_dirs() {
6 for d in "$@" ; do
7 [ -d "$d" ] && rm -rf "$d"
8 done
9
10 mkdir -p "$@"
11 }
12
13 ## Assert that a folder contains no symlinks
14 ##
15 ## ex: dev/core#1393, dev/core#1990
16 ## usage: dm_assert_no_symlinks <basedir>
17 function dm_assert_no_symlinks() {
18 local SYMLINKS=$( find "$1" -type l )
19 if [ -n "$SYMLINKS" ]; then
20 echo "ERROR: Folder $1 contains unexpected symlink(s): $SYMLINKS"
21 exit 10
22 fi
23 }
24
25 ## Copy files from one dir into another dir
26 ## usage: dm_install_dir <from-dir> <to-dir>
27 function dm_install_dir() {
28 local from="$1"
29 local to="$2"
30
31 if [ ! -d "$to" ]; then
32 mkdir -p "$to"
33 fi
34 ${DM_RSYNC:-rsync} -avC --exclude=.git --exclude=.svn "$from/./" "$to/./"
35 }
36
37 ## Copy listed files
38 ## usage: dm_install_files <from-dir> <to-dir> <file1> <file2>...
39 function dm_install_files() {
40 local from="$1"
41 shift
42 local to="$1"
43 shift
44
45 for file in "$@" ; do
46 [ -f "$from/$file" ] && cp -f "$from/$file" "$to/$file"
47 done
48 }
49
50 ## usage: dm_remove_files <directory> <file1> <file2>...
51 function dm_remove_files() {
52 local tgt="$1"
53 shift
54
55 for file in "$@" ; do
56 [ -f "$tgt/$file" -o -L "$tgt/$file" ] && rm -f "$tgt/$file"
57 done
58 }
59
60 ## Copy all bower dependencies
61 function dm_install_bower() {
62 local repo="$1"
63 local to="$2"
64
65 local excludes_rsync=""
66 for exclude in .git .svn {T,t}est{,s} {D,d}oc{,s} {E,e}xample{,s} ; do
67 excludes_rsync="--exclude=${exclude} ${excludes_rsync}"
68 done
69
70 [ ! -d "$to" ] && mkdir "$to"
71 ${DM_RSYNC:-rsync} -avC $excludes_rsync "$repo/./" "$to/./"
72 }
73
74 ## Copy all core files
75 ## usage: dm_install_core <core_repo_path> <to_path>
76 function dm_install_core() {
77 local repo="$1"
78 local to="$2"
79
80 for dir in ang css i js PEAR templates bin CRM api extern Reports install settings Civi partials release-notes xml setup ; do
81 [ -d "$repo/$dir" ] && dm_install_dir "$repo/$dir" "$to/$dir"
82 done
83
84 dm_install_files "$repo" "$to" {agpl-3.0,agpl-3.0.exception,gpl,CONTRIBUTORS}.txt
85 dm_install_files "$repo" "$to" composer.json composer.lock package.json Civi.php README.md release-notes.md extension-compatibility.json
86
87 mkdir -p "$to/sql"
88 pushd "$repo" >> /dev/null
89 dm_install_files "$repo" "$to" sql/civicrm*.mysql sql/case_sample*.mysql
90 ## TODO: for master, remove counties.US.SQL.gz
91 popd >> /dev/null
92
93 if [ -d $to/bin ] ; then
94 rm -f $to/bin/setup.sh
95 rm -f $to/bin/setup.php4.sh
96 rm -f $to/bin/setup.bat
97 fi
98
99 set +e
100 rm -rf $to/sql/civicrm_*.??_??.mysql
101 set -e
102 }
103
104 ## Copy built-in extensions
105 ## usage: dm_install_core <core_repo_path> <to_path> <ext-dirs...>
106 function dm_install_coreext() {
107 local repo="$1"
108 local to="$2"
109 shift
110 shift
111
112 for relext in "$@" ; do
113 [ ! -d "$to/ext/$relext" ] && mkdir -p "$to/ext/$relext"
114 ${DM_RSYNC:-rsync} -avC $excludes_rsync --include=core "$repo/ext/$relext/./" "$to/ext/$relext/./"
115 done
116 }
117
118 ## Get a list of default/core extension directories (space-delimited)
119 ## reldirs=$(dm_core_exts)
120 function dm_core_exts() {
121 ## grep to exclude comments and blank lines
122 grep '^[a-zA-Z]' "$DM_SOURCEDIR"/distmaker/core-ext.txt
123 }
124
125 ## Copy all packages
126 ## usage: dm_install_packages <packages_repo_path> <to_path>
127 function dm_install_packages() {
128 local repo="$1"
129 local to="$2"
130
131 local excludes_rsync=""
132 for exclude in .git .svn _ORIGINAL_ SeleniumRC PHPUnit PhpDocumentor SymfonyComponents git-footnote PHP/CodeCoverage ; do
133 excludes_rsync="--exclude=${exclude} ${excludes_rsync}"
134 done
135
136 ## Note: These small folders have items that previously were not published,
137 ## but there's no real cost to including them, and excluding them seems
138 ## likely to cause confusion as the codebase evolves:
139 ## packages/Files packages/PHP packages/Text
140
141 [ ! -d "$to" ] && mkdir "$to"
142 ${DM_RSYNC:-rsync} -avC $excludes_rsync --include=core "$repo/./" "$to/./"
143 }
144
145 ## Copy Drupal-integration module
146 ## usage: dm_install_drupal <drupal_repo_path> <to_path>
147 function dm_install_drupal() {
148 local repo="$1"
149 local to="$2"
150 dm_install_dir "$repo" "$to"
151
152 # Set full version in .info files. See CRM-15768.
153 local MODULE_DIRS=`find "$to" -type f -name "*.info"`
154 for INFO in $MODULE_DIRS; do
155 dm_preg_edit '/version = ([0-9]*\.x)-[1-9.]*/m' "version = \$1-$DM_VERSION" "$INFO"
156 done
157
158 for f in "$to/.gitignore" "$to/.toxic.json" ; do
159 if [ -f "$f" ]; then
160 rm -f "$f"
161 fi
162 done
163 }
164
165 ## Copy Joomla-integration module
166 ## usage: dm_install_joomla <joomla_repo_path> <to_path>
167 function dm_install_joomla() {
168 local repo="$1"
169 local to="$2"
170 dm_install_dir "$repo" "$to"
171
172 ## Before this change, the zip file included the joomla-integration
173 ## modules twice. The two were basically identical -- except that
174 ## one included .gitignore and the omitted it. We'll now omit it
175 ## consistently.
176
177 for f in "$to/.gitignore" "$to/.toxic.json" ; do
178 if [ -f "$f" ]; then
179 rm -f "$f"
180 fi
181 done
182 }
183
184 ## usage: dm_install_l10n <l10n_repo_path> <to_path>
185 function dm_install_l10n() {
186 local repo="$1"
187 local to="$2"
188 dm_install_dir "$repo" "$to"
189 }
190
191 ## Copy composer's "vendor" folder
192 ## usage: dm_install_vendor <from_path> <to_path>
193 function dm_install_vendor() {
194 local repo="$1"
195 local to="$2"
196
197 local excludes_rsync=""
198 ## CRM-21729 - .idea test-cases unit-test come from phpquery package.
199 for exclude in .git .svn {T,t}est{,s} {D,d}oc{,s} {E,e}xample{,s} .idea test-cases unit-test README.rst; do
200 excludes_rsync="--exclude=${exclude} ${excludes_rsync}"
201 done
202
203 [ ! -d "$to" ] && mkdir "$to"
204 ${DM_RSYNC:-rsync} -avC $excludes_rsync "$repo/./" "$to/./"
205 ## We don't this use CLI script in production, and the symlink breaks D7/BD URL installs
206 dm_remove_files "$to" "bin/pscss" "bin/cssmin"
207 }
208
209 ## usage: dm_install_wordpress <wp_repo_path> <to_path>
210 function dm_install_wordpress() {
211 local repo="$1"
212 local to="$2"
213
214 if [ ! -d "$to" ]; then
215 mkdir -p "$to"
216 fi
217 ${DM_RSYNC:-rsync} -avC \
218 --exclude=.git \
219 --exclude=.svn \
220 --exclude=civicrm.config.php.wordpress \
221 --exclude=.toxic.json \
222 --exclude=.gitignore \
223 --exclude=civicrm \
224 "$repo/./" "$to/./"
225 ## Need --exclude=civicrm for self-building on WP site
226
227 dm_preg_edit '/^([ \*]*)Version: [0-9\.]+/m' "\1Version: $DM_VERSION" "$to/civicrm.php"
228 dm_preg_edit "/^define\( *\'CIVICRM_PLUGIN_VERSION\', *'[0-9\.]+/m" "define('CIVICRM_PLUGIN_VERSION', '$DM_VERSION" "$to/civicrm.php"
229 }
230
231 ## Generate the composer "vendor" folder
232 ## usage: dm_generate_vendor <repo_path>
233 function dm_generate_vendor() {
234 local repo="$1"
235 pushd "$repo"
236 ${DM_COMPOSER:-composer} install
237 popd
238 }
239
240 ## Generate civicrm-version.php
241 ## usage: dm_generate_version <file> <ufname>
242 function dm_generate_version() {
243 local to="$1"
244 local ufname="$2"
245
246 # final touch
247 echo "<?php
248 /** @deprecated */
249 function civicrmVersion( ) {
250 return array( 'version' => '$DM_VERSION',
251 'cms' => '$ufname',
252 'revision' => '$DM_REVISION' );
253 }
254 " > "$to"
255 }
256
257 ## Perform a hard checkout on a given report
258 ## usage: dm_git_checkout <repo_path> <tree-ish>
259 function dm_git_checkout() {
260 pushd "$1"
261 git checkout .
262 git checkout "$2"
263 popd
264 }
265
266 ## Download a Civi extension
267 ## usage: dm_install_cvext <full-ext-key> <target-path>
268 function dm_install_cvext() {
269 # cv dl -b '@https://civicrm.org/extdir/ver=4.7.25|cms=Drupal/com.iatspayments.civicrm.xml' --destination=$PWD/iatspayments
270 cv dl -b "@https://civicrm.org/extdir/ver=$DM_VERSION|cms=Drupal/$1.xml" --to="$2"
271 }
272
273 ## Export a list of patch files from a git repo
274 ## usage: dm_export_patches <src-repo> <out-dir> <range>
275 ## ex: dm_export_patches "$HOME/src/somerepo" "/tmp/export" 5.1.2..5.1.6
276 function dm_export_patches() {
277 if [ ! -d "$1" ]; then
278 echo "ignore: $1"
279 return
280 fi
281 echo "Export \"$1\" ($3) to \"$2\""
282 pushd "$1" >> /dev/null
283 git format-patch "$3" -o "$2"
284 popd >> /dev/null
285 }
286
287
288 ## Edit a file by applying a regular expression.
289 ## Note: We'd rather just call "sed", but it differs on GNU+BSD.
290 ## usage: dm_preg_edit <search-pattern> <replacement-pattern> <file>
291 ## example: '/version = \([0-9]*\.x-\)[1-9.]*/' 'version = \1$DM_VERSION'
292 function dm_preg_edit() {
293 env RPAT="$1" RREPL="$2" RFILE="$3" \
294 php -r '$c = file_get_contents(getenv("RFILE")); $c = preg_replace(getenv("RPAT"), getenv("RREPL"), $c); file_put_contents(getenv("RFILE"), $c);'
295 }