4 # This file and its contents are supplied under the terms of the
5 # Common Development and Distribution License ("CDDL"), version 1.0.
6 # You may only use this file in accordance with the terms of version
9 # A full copy of the text of the CDDL should have accompanied this
10 # source. A copy of the CDDL is also available via the Internet at
11 # http://www.illumos.org/license/CDDL.
15 # Copyright 2022 Marcel Telka
19 THIS
="perl-integrate-module"
21 SNIPPET
="$THIS.snippet"
22 APIURL
="https://fastapi.metacpan.org/v1"
23 CURL
="/usr/bin/curl -s"
28 [[ -n "$1" ]] && printf "ERROR: %s\n\n" "$1" >&2
29 printf "Usage: %s [-d DIR] [-f] [-l VERSION] [-o OBSOLETE].. [-u] MODULE\n" "$THIS" >&2
30 [[ -n "$1" ]] && exit 1
40 while getopts ":hd:fl:o:u" OPT
; do
43 "d") DIRECTORY
="$OPTARG" ;;
45 "l") OPT_VERSION
="$OPTARG" ;;
46 "o") OBSOLETE
="$OBSOLETE $OPTARG" ;;
47 "u") UPGRADE_ONLY
=1 ;;
53 (($# > 1)) && usage
"Too many arguments"
58 # Prevent user's environment to affect the integration.
59 # Allow one exception only: USERLAND_ARCHIVES
61 [[ -n "$USERLAND_ARCHIVES" ]] && GMAKE
="$GMAKE USERLAND_ARCHIVES=$USERLAND_ARCHIVES"
65 WS_TOP
=$
(git rev-parse
--show-toplevel 2>/dev
/null
)
66 [[ -z "$WS_TOP" ]] && usage
"The script must be run in git repo"
68 BASE_DIR
="$WS_TOP/components"
69 [[ -d "$BASE_DIR" ]] || usage
"Directory $BASE_DIR not found"
72 # Get data from metacpan
73 METACPAN_MODULE
=$
($CURL "$APIURL/module/$MODULE")
74 if (($?
!= 0)) ||
[[ -z "$METACPAN_MODULE" ]] ; then
75 printf "FATAL: Failed to get data from metacpan\n" >&2
79 # Detect distribution for module
80 DISTRIBUTION
=$
(printf "%s" "$METACPAN_MODULE" |
/usr
/bin
/jq
-r '.distribution')
81 if (($?
!= 0)) ||
[[ -z "$DISTRIBUTION" ||
"$DISTRIBUTION" == "null" ]] ; then
82 printf "FATAL: Failed to get distribution for module %s from metacpan\n" "$MODULE" >&2
85 if [[ "$DISTRIBUTION" != "${MODULE//::/-}" ]] then
86 NEW_MODULE
="${DISTRIBUTION//-/::}"
87 NEW_METACPAN_MODULE
=$
($CURL "$APIURL/module/$NEW_MODULE")
88 NEW_DISTRIBUTION
=$
(printf "%s" "$NEW_METACPAN_MODULE" |
/usr
/bin
/jq
-r '.distribution')
89 if [[ "$NEW_DISTRIBUTION" == "$DISTRIBUTION" ]] ; then
90 printf "WARNING: Module %s does not match distribution %s\n" "$MODULE" "$DISTRIBUTION" >&2
91 printf "WARNING: Continue with module %s instead of %s\n" "$NEW_MODULE" "$MODULE" >&2
93 METACPAN_MODULE
="$NEW_METACPAN_MODULE"
98 # Prepare the directory
99 [[ -z "$DIRECTORY" ]] && DIRECTORY
="perl/$DISTRIBUTION"
100 DIR
="$BASE_DIR/$DIRECTORY"
103 git restore
--staged .
> /dev
/null
2>&1
104 git checkout .
> /dev
/null
2>&1
107 # Following variables could be set by the hook-begin snippet
113 # Execute hook-begin snippet
114 if [[ -f "$CONF" ]] ; then
115 gsed
-e '0,/^%hook-begin%/d' -e '/^%/,$d' < "$CONF" > "$SNIPPET"
120 # Version specified as option takes precedence
121 [[ -n "$OPT_VERSION" ]] && VERSION
="$OPT_VERSION"
123 # Find the latest version if not already provided
124 if [[ -z "$VERSION" ]] ; then
125 VERSION
=$
(printf "%s" "$METACPAN_MODULE" |
/usr
/bin
/jq
-r '.version')
126 if (($?
!= 0)) ||
[[ -z "$VERSION" ||
"$VERSION" == "null" ]] ; then
127 printf "FATAL: Failed to get version for module %s from metacpan\n" "$MODULE" >&2
134 # Is this new module, or just a rebuild?
139 if git ls-files
--error-unmatch Makefile
> /dev
/null
2>&1 ; then
141 PREV_VER
=$
($GMAKE print-value-COMPONENT_VERSION
2>/dev
/null
)
142 (($?
!= 0)) && printf "FATAL: 'gmake print-value-COMPONENT_VERSION' failed!\n" >&2 && exit 1
143 PREV_REV
=$
($GMAKE print-value-COMPONENT_REVISION
2>/dev
/null
)
145 # If we were asked to do version upgrade, but we do not have new
146 # version, then we are done.
147 PREV_HVER
=$
($GMAKE print-value-HUMAN_VERSION
2>/dev
/null
)
148 ((UPGRADE_ONLY
)) && [[ "$PREV_HVER" == "$VERSION" ]] && exit 0
150 # Pre-flight environment checks
151 if ((FORCE
== 0)) ; then
152 ! $GMAKE env-check
> /dev
/null
2>&1 && printf "FATAL: Pre-flight 'gmake env-check' failed!\n" >&2 && exit 1
153 if [[ "$($GMAKE print-value-PERL_TEST_BOOTSTRAP)" != "yes" ]] ; then
154 ! $GMAKE test-env-check
> /dev
/null
2>&1 && printf "FATAL: Pre-flight 'gmake test-env-check' failed!\n" >&2 && exit 1
158 $GMAKE clobber
> /dev
/null
2>&1
162 # Get download_url if not already provided
163 if [[ -z "$DOWNLOAD_URL" ]] ; then
165 # TODO: here we get author of the latest version, not the specified version
166 AUTHOR
=$
(printf "%s" "$METACPAN_MODULE" |
/usr
/bin
/jq
-r '.author')
167 if (($?
!= 0)) ||
[[ -z "$AUTHOR" ||
"$AUTHOR" == "null" ]] ; then
168 printf "FATAL: Failed to get author for module %s from metacpan\n" "$MODULE" >&2
173 DOWNLOAD_URL
=$
($CURL "$APIURL/download_url/$MODULE?version===$VERSION" |
/usr
/bin
/jq
-r '.download_url')
174 if (($?
!= 0)) ||
[[ -z "$DOWNLOAD_URL" ||
"$DOWNLOAD_URL" == "null" ]] ; then
175 printf "WARNING: Failed to get download_url for module %s, version %s from metacpan\n" "$MODULE" "$VERSION" >&2
181 # Remove everything that is not in git
183 git checkout .
> /dev
/null
2>&1
184 # Remove everything from git (except known patches, files, history, and $CONF)
185 [[ -f "$CONF" ]] && grep "^%patch%" "$CONF" |
while read TAG PATCH
; do rm -f "patches/$PATCH" ; done
186 [[ -f "$CONF" ]] && grep "^%file%" "$CONF" |
while read TAG FILE
; do rm -f "files/$FILE" ; done
187 rm -f history "$CONF"
188 find .
-type f |
while read f
; do git
rm "$f" > /dev
/null
2>&1 ; done
189 rm -rf "$DIR" 2>/dev
/null
190 git checkout
history > /dev
/null
2>&1
191 git checkout
"$CONF" > /dev
/null
2>&1
192 [[ -f "$CONF" ]] && grep "^%patch%" "$CONF" |
while read TAG PATCH
; do
193 git checkout
"patches/$PATCH" > /dev
/null
2>&1
194 [[ -f "patches/$PATCH" ]] ||
printf "WARNING: Patch %s not found\n" "$PATCH" >&2
196 [[ -f "$CONF" ]] && grep "^%file%" "$CONF" |
while read TAG FILE
; do
197 git checkout
"files/$FILE" > /dev
/null
2>&1
198 [[ -f "files/$FILE" ]] ||
printf "WARNING: File %s not found\n" "$FILE" >&2
203 GENERATE_CMD
="\$WS_TOOLS/$THIS"
204 [[ "$DIRECTORY" != "perl/$DISTRIBUTION" ]] && GENERATE_CMD
="$GENERATE_CMD -d $DIRECTORY"
205 GENERATE_CMD
="$GENERATE_CMD $MODULE"
207 cat $WS_TOP/transforms
/copyright-template |
sed -e '/^$/,$d'
211 # This file was automatically generated using the following command:
215 BUILD_STYLE = makemaker
216 USE_COMMON_TEST_MASTER = no
218 [[ -f "$CONF" ]] && gsed
-e '0,/^%include-1%/d' -e '/^%/,$d' < "$CONF"
221 include ../../../make-rules/shared-macros.mk
223 COMPONENT_PERL_MODULE = $MODULE
225 [[ "$DISTRIBUTION" != "${MODULE//::/-}" ]] && printf "COMPONENT_PERL_DISTRIBUTION =\t%s\n" "$DISTRIBUTION"
227 HUMAN_VERSION = $VERSION
228 COMPONENT_REVISION = $((PREV_REV + 1))
229 COMPONENT_SUMMARY = $MODULE - TODO
230 COMPONENT_CPAN_AUTHOR = $AUTHOR
231 COMPONENT_ARCHIVE_HASH = \\
233 COMPONENT_LICENSE = license:TODO
234 COMPONENT_LICENSE_FILE = licfile:TODO
236 [[ -f "$CONF" ]] && cat "$CONF" | gsed
-e '0,/^%include-2%/d' -e '/^%/,$d' | gsed
-e '1s/^./\n&/'
237 printf "\ninclude \$(WS_MAKE_RULES)/common.mk\n"
238 [[ -f "$CONF" ]] && cat "$CONF" | gsed
-e '0,/^%include-3%/d' -e '/^%/,$d' | gsed
-e '1s/^./\n&/'
242 # If the automatically constructed COMPONENT_ARCHIVE_URL is not correct then we
243 # do not need COMPONENT_CPAN_AUTHOR. We need COMPONENT_ARCHIVE_URL instead.
244 if [[ -n "$DOWNLOAD_URL" ]] ; then
245 COMPONENT_ARCHIVE_URL
=$
($GMAKE print-value-COMPONENT_ARCHIVE_URL
)
246 [[ "$COMPONENT_ARCHIVE_URL" == "$DOWNLOAD_URL" ]] && DOWNLOAD_URL
=
248 [[ -n "$DOWNLOAD_URL" ]] && sed -i -e $
's|^COMPONENT_CPAN_AUTHOR.*|COMPONENT_ARCHIVE_URL =\t\t\\\\\\\n\t'"$DOWNLOAD_URL"'|' Makefile
250 # Remove COMPONENT_REVISION if not needed
251 COMPONENT_VERSION
=$
($GMAKE print-value-COMPONENT_VERSION
)
252 [[ "$PREV_VER" != "$COMPONENT_VERSION" ]] && sed -i -e '/^COMPONENT_REVISION/d' Makefile
255 # Calculate sham256 sum for source package
256 $GMAKE fetch
> /dev
/null
2>&1
257 USERLAND_ARCHIVES
=$
($GMAKE print-value-USERLAND_ARCHIVES
)
258 COMPONENT_ARCHIVE
=$
($GMAKE print-value-COMPONENT_ARCHIVE
)
259 [[ ! -f "$USERLAND_ARCHIVES$COMPONENT_ARCHIVE" ]] && printf "FATAL: 'gmake fetch' failed!\n" >&2 && exit 1
260 SHA256
=$
(digest
-a sha256
"$USERLAND_ARCHIVES$COMPONENT_ARCHIVE")
261 sed -i -e 's/sha256:TODO/sha256:'"$SHA256"'/g' Makefile
264 # Unpack sources and apply patches
265 ! $GMAKE patch > /dev
/null
2>&1 && printf "FATAL: 'gmake patch' failed!\n" >&2 && exit 1
268 if $GMAKE refresh-patches
> /dev
/null
2>&1 ; then
269 git add patches
2>/dev
/null
271 printf "ERROR: 'gmake refresh-patches' failed!\n" >&2
272 git checkout patches
2>/dev
/null
275 # Cleanup after patch refresh
276 $GMAKE clobber
> /dev
/null
2>&1
279 ! $GMAKE prep
> /dev
/null
2>&1 && printf "FATAL: 'gmake prep' failed!\n" >&2 && exit 1
280 SOURCE_DIR
=$
($GMAKE print-value-SOURCE_DIR
)
281 COMPONENT_SUBDIR
=$
($GMAKE print-value-COMPONENT_SUBDIR
)
282 [[ -n "$COMPONENT_SUBDIR" ]] && COMPONENT_SUBDIR
="/$COMPONENT_SUBDIR"
284 # Switch to modulebuild if possible
285 [[ -f "$SOURCE_DIR$COMPONENT_SUBDIR/Build.PL" ]] && sed -i -e 's/makemaker/modulebuild/g' Makefile
287 # Get summary if not already provided
288 if [[ -z "$SUMMARY" ]] ; then
289 # Get abstract and use it as summary. Either from metacpan, or directly from sources.
290 ABSTRACT
=$
(printf "%s" "$METACPAN_MODULE" |
/usr
/bin
/jq
-r '.abstract')
291 if (($?
!= 0)) ||
[[ -z "$ABSTRACT" ||
"$ABSTRACT" == "null" ]] ; then
292 printf "WARNING: Failed to get abstract for module %s from metacpan\n" "$MODULE" >&2
295 if [[ "$ABSTRACT" == "TODO" ]] ; then
296 if [[ ! -f "$SOURCE_DIR$COMPONENT_SUBDIR/META.json" ]] ; then
297 printf "WARNING: META.json missing\n" >&2
299 ABSTRACT
=$
(cat "$SOURCE_DIR$COMPONENT_SUBDIR/META.json" |
/usr
/bin
/jq
-r '.abstract')
300 if (($?
!= 0)) ||
[[ -z "$ABSTRACT" ||
"$ABSTRACT" == "null" ]] ; then
301 printf "WARNING: Failed to get abstract from META.json\n" >&2
306 if [[ "$ABSTRACT" == "TODO" ]] ; then
307 if [[ ! -f "$SOURCE_DIR$COMPONENT_SUBDIR/META.yml" ]] ; then
308 printf "WARNING: META.yml missing\n" >&2
310 ABSTRACT
=$
(cat "$SOURCE_DIR$COMPONENT_SUBDIR/META.yml" | python
-c 'import sys, yaml, json; y=yaml.safe_load(sys.stdin.read()); print(json.dumps(y))' |
/usr
/bin
/jq
-r '.abstract')
311 if (($?
!= 0)) ||
[[ -z "$ABSTRACT" ||
"$ABSTRACT" == "null" ]] ; then
312 printf "WARNING: Failed to get abstract from META.yml\n" >&2
319 # Summary needs to be sanitized
320 SUMMARY
="${SUMMARY//\`/\\\\\`}"
321 SUMMARY
="${SUMMARY//\"/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"}"
322 SUMMARY
="${SUMMARY//\//\/}"
323 SUMMARY
="${SUMMARY//\$/\\\\\$\$}"
324 SUMMARY
="${SUMMARY//\&/\\&}"
325 sed -i -e 's/\(COMPONENT_SUMMARY.*\)TODO$/\1'"$SUMMARY"'/g' Makefile
328 # Try to detect license type(s)
329 function detect_license
335 D
=$
("$WS_TOP/tools/license-detector" "$F")
336 [[ -n "$L" ]] && L
="$L OR " ; L
="$L$D"
342 for f
in $LICENSE_FILE LICENSE LICENCE COPYING COPYRIGHT
; do
343 [[ -f "$SOURCE_DIR$COMPONENT_SUBDIR/$f" ]] ||
continue
344 LICFILE
="$SOURCE_DIR$COMPONENT_SUBDIR/$f"
346 detect_license LICENSE
"$LICFILE"
348 if [[ -n "$LICENSE" ]] ; then
349 sed -i -e 's|licfile:TODO|'"$f"'|g' Makefile
353 printf "WARNING: Failed to detect license type in %s file\n" "$f" >&2
355 # Since the license file does not contain any known license we will use
356 # its content as Copyright notice only
357 COPYRIGHT
=$
(<"$LICFILE")
359 if [[ -z "$LICFILE" ]] ; then
360 printf "WARNING: No license file found\n" >&2
363 if [[ -z "$LICENSE" ]] ; then
364 # Since the distibution does not provide own license file (or we failed
365 # to find it) we will use default Perl license with added Copyright
366 # notice from this distribution
368 sed -i -e '/^COMPONENT_LICENSE_FILE/d' Makefile
370 # Try to find Copyright notice if we do not have one yet
371 [[ -z "$COPYRIGHT" ]] && for f
in README README.md
; do
372 f
="$SOURCE_DIR$COMPONENT_SUBDIR/$f"
373 [[ -f "$f" ]] ||
continue
375 COPYRIGHT
=$
(gsed
-e '0,/^# LICENSE/d' -e '/^#/,$d' -e '/./,$!d' "$f" 2>/dev
/null
)
376 [[ -n "$COPYRIGHT" ]] && break
377 COPYRIGHT
=$
(gsed
-e '0,/^# COPYRIGHT/d' -e '/^#/,$d' -e '/./,$!d' "$f" 2>/dev
/null
)
378 [[ -n "$COPYRIGHT" ]] && break
379 COPYRIGHT
=$
(gsed
-e '0,/LICENSE/d' -e '/^REPOSITORY/,$d' -e '/^SEE/,$d' -e '/./,$!d' "$f" 2>/dev
/null
)
380 [[ -n "$COPYRIGHT" ]] && break
381 COPYRIGHT
=$
(gsed
-e '0,/COPYING/d' -e '/^BUGS/,$d' -e '/^SEE/,$d' -e '/./,$!d' "$f" 2>/dev
/null
)
382 [[ -n "$COPYRIGHT" ]] && break
383 COPYRIGHT
=$
(gsed
-e '0,/COPYRIGHT/d' -e '/^AUTHOR/,$d' -e '/^SEE/,$d' -e '/./,$!d' "$f" 2>/dev
/null
)
384 [[ -n "$COPYRIGHT" ]] && break
385 COPYRIGHT
=$
(gsed
-e '0,/^## Copyright/d' -e '/./,$!d' "$f" 2>/dev
/null
)
386 [[ -n "$COPYRIGHT" ]] && break
388 if [[ -z "$COPYRIGHT" ]] ; then
389 printf "WARNING: No copyright notice found at standard locations\n" >&2
390 for f
in $
(find "$SOURCE_DIR$COMPONENT_SUBDIR" -type f
-name "*.pm" | LC_ALL
=C
sort |
while read f
; do egrep -q "^=head1 (LICENSE|LICENCE|COPYRIGHT)" "$f" && echo "$f" ; done) ; do
391 COPYRIGHT
=$
(sed -e '1,/^=head1 LICENSE/d' -e '/^=/,$d' "$f" 2>/dev
/null
)
392 if [[ -n "$COPYRIGHT" ]] ; then
393 printf "WARNING: Using copyright notice from %s\n" "$f" >&2
396 COPYRIGHT
=$
(sed -e '1,/^=head1 LICENCE/d' -e '/^=/,$d' "$f" 2>/dev
/null
)
397 if [[ -n "$COPYRIGHT" ]] ; then
398 printf "WARNING: Using copyright notice from %s\n" "$f" >&2
401 COPYRIGHT
=$
(sed -e '1,/^=head1 COPYRIGHT/d' -e '/^=/,$d' "$f" 2>/dev
/null
)
402 if [[ -n "$COPYRIGHT" ]] ; then
403 printf "WARNING: Using copyright notice from %s\n" "$f" >&2
408 if [[ -z "$COPYRIGHT" ]] ; then
409 printf "WARNING: No copyright notice found\n" >&2
410 > "$DISTRIBUTION.license"
412 (printf "%s\n\n" "$COPYRIGHT" | dos2unix
-ascii
413 i
=75 ; while ((i
)) ; do printf "=" ; i
=$
((i-1
)) ; done
414 printf "\n\n") > "$DISTRIBUTION.license"
417 USE_DEFAULT_PERL_LICENSE
=1
419 # Execute hook-no-license snippet
420 if [[ -f "$CONF" ]] ; then
421 gsed
-e '0,/^%hook-no-license%/d' -e '/^%/,$d' < "$CONF" > "$SNIPPET"
427 if ((USE_DEFAULT_PERL_LICENSE
)) ; then
428 # Confirm the package is distributed under the same terms as Perl itself
430 ((D
)) && (printf "%s\n" "$COPYRIGHT" |
grep -q -i "under the same terms as Perl itself") && D
=0
431 ((D
)) && grep -q "license *=> *'http://dev\.perl\.org/licenses/'" "$SOURCE_DIR$COMPONENT_SUBDIR/Makefile.PL" 2>/dev
/null
&& D
=0
432 ((D
)) && grep -q "LICENSE *=> *'perl'" "$SOURCE_DIR$COMPONENT_SUBDIR/Makefile.PL" 2>/dev
/null
&& D
=0
433 ((D
)) && [[ -f "$SOURCE_DIR$COMPONENT_SUBDIR/META.json" && "$(/usr/bin/jq -r '.license[]' < "$SOURCE_DIR$COMPONENT_SUBDIR/META.json
" 2>/dev/null)" == "perl_5" ]] && D
=0
434 ((D
)) && [[ -f "$SOURCE_DIR$COMPONENT_SUBDIR/META.yml" && "$(cat "$SOURCE_DIR$COMPONENT_SUBDIR/META.yml
" \
435 | python -c 'import sys, yaml, json; y=yaml.safe_load(sys.stdin.read()); print(json.dumps(y))' \
436 | /usr/bin/jq -r '.license' 2>/dev/null)" == "perl" ]] && D
=0
438 ((D
)) && printf "ERROR: Heuristics failed to detect license type, using default Perl license\n" >&2
440 # Make a copy of license so we can use it during publish
441 cat "$WS_TOP/tools/perl-license" |
grep -v "^#" >> "$DISTRIBUTION.license"
443 git add
"$DISTRIBUTION.license"
445 [[ -z "$LICENSE" ]] && detect_license LICENSE
"$DISTRIBUTION.license"
446 [[ -z "$LICENSE" ]] && LICENSE
="TODO"
449 # Store the detected license into the Makefile
450 sed -i -e 's/license:TODO/'"$LICENSE"'/g' Makefile
454 if ! $GMAKE sample-manifest
> /dev
/null
2>&1 ; then
455 printf "ERROR: 'gmake sample-manifest' failed!\n" >&2
457 MANIFEST
="$DISTRIBUTION-PERLVER.p5m"
458 [[ "$($GMAKE print-value-SINGLE_PERL_VERSION)" == "yes" ]] && MANIFEST
="$DISTRIBUTION.p5m"
459 cat manifests
/sample-manifest.p5m \
460 |
sed -e 's/^#.*Copyright.*<contributor>.*$/# This file was automatically generated using '"$THIS"'/g' \
463 # Execute hook-manifest snippet
464 if [[ -f "$CONF" ]] ; then
465 gsed
-e '0,/^%hook-manifest%/d' -e '/^%/,$d' < "$CONF" > "$SNIPPET"
470 git add manifests
/sample-manifest.p5m
$MANIFEST
474 # Generate REQUIRED_PACKAGES
475 $GMAKE REQUIRED_PACKAGES
> /dev
/null
2>&1 ||
printf "ERROR: 'gmake REQUIRED_PACKAGES' failed!\n" >&2
479 # Check for Makefile completeness
480 grep -q "TODO" Makefile
&& printf "ERROR: Makefile is not complete (TODO found)\n" >&2
483 # Make sure the build environment is setup properly and we do have all
484 # requirements installed. Otherwise we cannot continue.
485 ! $GMAKE env-check
> /dev
/null
2>&1 && printf "FATAL: 'gmake env-check' failed!\n" >&2 && exit 1
489 COMPONENT_FMRI
=$
($GMAKE print-value-COMPONENT_FMRI
)
490 PERL_VERSIONS_OBSOLETING
=$
($GMAKE print-value-PERL_VERSIONS_OBSOLETING
)
493 for o
in $
(echo $OBSOLETE $PERL_VERSIONS_OBSOLETING | LC_ALL
=C
sort -u) ; do
495 FMRI
=$
(pkg list
-nvH "$COMPONENT_FMRI-$PLV" 2>/dev
/null |
egrep -v '(o|r)$' |
sed -e 's|^.*\('"$COMPONENT_FMRI"'\)|\1|g' -e 's/:[^:]*$//g' -e 's/\(-[^-]*\)$/,5.11\1/g')
496 [[ -n "$FMRI" ]] ||
continue
499 if [[ "$FMRI_H" == "$FMRI" ]] ; then
500 printf "WARNING: Wrong fmri format: %s\n" "$FMRI" >&2
503 FMRI_T
=$
((FMRI_T
+ 1))
504 printf "%s.%s noincorporate\n" "$FMRI_H" "$FMRI_T" >> history
506 [[ -n "$OV" ]] && OV
="${OV/ and /, } and " && OV_PLURAL
="s"
509 if [[ -f history ]] ; then
510 LC_ALL
=C
sort -u history > history.new
511 mv history.new
history
514 awk '$NF == "noincorporate" {printf("WARNING: Unincorporated package: %s\n", $1)}' < history >&2
518 # Cleanup before we try to publish to make sure there are no leftovers from
520 $GMAKE clobber
> /dev
/null
2>&1
522 # Publish packages and create pkg5 file
523 $GMAKE publish
> /dev
/null
2>&1 ||
printf "ERROR: 'gmake publish' failed!\n" >&2
524 git add pkg5
2>/dev
/null
527 PERL_VERSIONS
=$
($GMAKE print-value-PERL_VERSIONS
)
528 PERL_TEST_BOOTSTRAP
=$
($GMAKE print-value-PERL_TEST_BOOTSTRAP
)
531 # Run tests to make sure they pass and to create result snapshots
533 for v
in $PERL_VERSIONS ; do
534 # Check the test environment
535 if ! $GMAKE PERL_VERSIONS
=$v test-env-check
> /dev
/null
2>&1 ; then
536 if [[ "$PERL_TEST_BOOTSTRAP" == "yes" ]] ; then
537 printf "WARNING: Test environment for %s is not ready yet (bootstrap)\n" "$v" >&2
539 printf "ERROR: 'gmake test-env-check' failed for %s!\n" "$v" >&2
545 ! $GMAKE PERL_VERSIONS
=$v test > /dev
/null
2>&1 && printf "ERROR: Testing failed for %s!\n" "$v" >&2 && continue
547 # If there is no snapshot produced the component likely does not support tests
548 COMPONENT_TEST_SNAPSHOT
=$
($GMAKE PERL_VERSION
=$v print-value-COMPONENT_TEST_SNAPSHOT
)
549 [[ ! -f "$COMPONENT_TEST_SNAPSHOT" ]] && printf "WARNING: Testing unsupported for %s\n" "$v" >&2 && continue
551 # Empty result snapshot is suspicious
552 [[ -s "$COMPONENT_TEST_SNAPSHOT" ]] ||
printf "WARNING: Empty test results for %s\n" "$v" >&2
554 TESTED_VERSIONS
="$TESTED_VERSIONS $v"
557 # Save result snapshots and detect USE_COMMON_TEST_MASTER value
559 for common_results
in yes no
; do
560 for v
in $TESTED_VERSIONS ; do
561 COMPONENT_TEST_SNAPSHOT
=$
($GMAKE PERL_VERSION
=$v print-value-COMPONENT_TEST_SNAPSHOT
)
562 COMPONENT_TEST_MASTER
=$
($GMAKE PERL_VERSION
=$v USE_COMMON_TEST_MASTER
=$common_results print-value-COMPONENT_TEST_MASTER
)
564 if [[ -f "$COMPONENT_TEST_MASTER" ]] ; then
565 # Switch to 'USE_COMMON_TEST_MASTER = no' if test results differ
566 if ! diff "$COMPONENT_TEST_SNAPSHOT" "$COMPONENT_TEST_MASTER" > /dev
/null
; then
567 printf "WARNING: Test results differ so switch to 'USE_COMMON_TEST_MASTER = no'\n" >&2
573 mkdir
-p $
(dirname "$COMPONENT_TEST_MASTER")
574 cp -p "$COMPONENT_TEST_SNAPSHOT" "$COMPONENT_TEST_MASTER"
575 TEST_MASTERS
="$TEST_MASTERS $COMPONENT_TEST_MASTER"
580 [[ -n "$TEST_MASTERS" ]] && git add
$TEST_MASTERS
582 # Run tests again to confirm the results are reproducible
583 for v
in $TESTED_VERSIONS ; do
584 $GMAKE PERL_VERSIONS
=$v USE_COMMON_TEST_MASTER
=$common_results test > /dev
/null
2>&1 ||
printf "ERROR: Testing for %s is not reproducible!\n" "$v" >&2
587 # Remove USE_COMMON_TEST_MASTER from Makefile if it should be set to (default) 'yes'
588 if [[ "$common_results" == "yes" ]] ; then
589 sed -i -e '/^USE_COMMON_TEST_MASTER/d' Makefile
595 COMPONENT_SRC
=$
($GMAKE print-value-COMPONENT_SRC
)
596 printf '/%s/\n' "$COMPONENT_SRC" > .gitignore
600 # Construct the commit message
603 MSG
="Add $MODULE Perl module"
605 [[ "$PREV_VER" != "$COMPONENT_VERSION" ]] && MSG
="change version format"
606 [[ "$PREV_HVER" != "$VERSION" ]] && MSG
="update to $VERSION"
610 if [[ "$($GMAKE print-value-SINGLE_PERL_VERSION)" == "no" ]] ; then
612 for v
in $PERL_VERSIONS ; do
614 pkg list
-avH "$COMPONENT_FMRI-$PLV" 2>/dev
/null |
egrep -q -v '(o|r)$' && continue
615 [[ -n "$NV" ]] && NV
="$NV and "
618 [[ -n "$NV" ]] && REBUILDMSG
="rebuild for Perl $NV"
621 if [[ -n "$OV" ]] ; then
622 [[ -n "$REBUILDMSG" ]] && REBUILDMSG
="$REBUILDMSG and "
623 REBUILDMSG
="${REBUILDMSG}obsolete package$OV_PLURAL for Perl $OV"
626 if [[ -n "$REBUILDMSG" ]] ; then
627 [[ -n "$MSG" ]] && MSG
="$MSG; "
628 MSG
="$MSG$REBUILDMSG"
630 [[ -z "$MSG" ]] && MSG
="rebuild"
632 MSG
="$DIRECTORY: $MSG"
636 ! git commit
-m "$MSG" > /dev
/null
2>&1 && printf "FATAL: 'git commit' failed!\n" >&2 && exit 1