3 # Creates and upload a git module tarball
6 # This script is intended to run on any platform supported by X.Org.
7 # Basically, it should be able to run in a Bourne shell.
11 export LC_ALL
=en_US.UTF-8
14 #------------------------------------------------------------------------------
15 # Function: check_local_changes
16 #------------------------------------------------------------------------------
18 check_local_changes
() {
19 git
diff --quiet HEAD
> /dev
/null
2>&1
22 echo "Uncommitted changes found. Did you forget to commit? Aborting."
24 echo "You can perform a 'git stash' to save your local changes and"
25 echo "a 'git stash apply' to recover them after the tarball release."
26 echo "Make sure to rebuild and run 'make distcheck' again."
28 echo "Alternatively, you can clone the module in another directory"
29 echo "and run ./configure. No need to build if testing was finished."
36 #------------------------------------------------------------------------------
37 # Function: check_option_args
38 #------------------------------------------------------------------------------
40 # perform sanity checks on cmdline args which require arguments
42 # $1 - the option being examined
43 # $2 - the argument to the option
45 # if it returns, everything is good
51 # check for an argument
52 if [ x
"$arg" = x
]; then
54 echo "Error: the '$option' option is missing its required argument."
60 # does the argument look like an option?
61 echo $arg |
$GREP "^-" > /dev
/null
64 echo "Error: the argument '$arg' of option '$option' looks like an option itself."
71 #------------------------------------------------------------------------------
72 # Function: check_gpgkey
73 #------------------------------------------------------------------------------
75 # check if the gpg key provided is known/available
79 # if it returns, everything is good
84 $GPG --list-keys "$arg" &>/dev
/null
87 echo "Error: the argument '$arg' is not a known gpg key."
94 #------------------------------------------------------------------------------
95 # Function: check_modules_specification
96 #------------------------------------------------------------------------------
98 check_modules_specification
() {
100 if [ x
"$MODFILE" = x
]; then
101 if [ x
"${INPUT_MODULES}" = x
]; then
103 echo "Error: no modules specified (blank command line)."
111 #------------------------------------------------------------------------------
112 # Function: generate_announce
113 #------------------------------------------------------------------------------
118 Subject: [ANNOUNCE] $pkg_name $pkg_version
122 `git log --no-merges "$tag_range" | git shortlog`
128 for tarball
in $tarbz2 $targz $tarxz; do
129 tarball
=`basename $tarball`
131 https://$host_current/$section_path/$tarball
132 SHA256: `$SHA256SUM $tarball`
133 SHA512: `$SHA512SUM $tarball`
134 PGP: https://${host_current}/${section_path}/${tarball}.sig
140 #------------------------------------------------------------------------------
141 # Function: read_modfile
142 #------------------------------------------------------------------------------
144 # Read the module names from the file and set a variable to hold them
145 # This will be the same interface as cmd line supplied modules
149 if [ x
"$MODFILE" != x
]; then
150 # Make sure the file is sane
151 if [ ! -r "$MODFILE" ]; then
152 echo "Error: module file '$MODFILE' is not readable or does not exist."
155 # read from input file, skipping blank and comment lines
158 if [ x
"$line" = x
]; then
162 if echo "$line" |
$GREP -q "^#" ; then
165 INPUT_MODULES
="$INPUT_MODULES $line"
171 #------------------------------------------------------------------------------
172 # Function: print_epilog
173 #------------------------------------------------------------------------------
177 epilog
="======== Successful Completion"
178 if [ x
"$NO_QUIT" != x
]; then
179 if [ x
"$failed_modules" != x
]; then
180 epilog
="======== Partial Completion"
182 elif [ x
"$failed_modules" != x
]; then
183 epilog
="======== Stopped on Error"
187 echo "$epilog `date`"
189 # Report about modules that failed for one reason or another
190 if [ x
"$failed_modules" != x
]; then
191 echo " List of failed modules:"
192 for mod
in $failed_modules; do
200 #------------------------------------------------------------------------------
201 # Function: process_modules
202 #------------------------------------------------------------------------------
204 # Loop through each module to release
205 # Exit on error if --no-quit was not specified
208 for MODULE_RPATH
in ${INPUT_MODULES}; do
209 if ! process_module
; then
210 echo "Error: processing module \"$MODULE_RPATH\" failed."
211 failed_modules
="$failed_modules $MODULE_RPATH"
212 if [ x
"$NO_QUIT" = x
]; then
220 #------------------------------------------------------------------------------
221 # Function: get_section
222 #------------------------------------------------------------------------------
223 # Code 'return 0' on success
224 # Code 'return 1' on error
225 # Sets global variable $section
228 local full_module_url
230 # Obtain the git url in order to find the section to which this module belongs
231 full_module_url
=`git config --get remote.$remote_name.url | sed 's:\.git$::'`
232 if [ $?
-ne 0 ]; then
233 echo "Error: unable to obtain git url for remote \"$remote_name\"."
237 # The last part of the git url will tell us the section. Look for xorg first
238 module_url
=`echo "$full_module_url" | $GREP -o "xorg/.*"`
239 if [ $?
-eq 0 ]; then
240 module_url
=`echo $module_url | rev | cut -d'/' -f1,2 | rev`
242 # The look for mesa, xcb, etc...
243 module_url
=`echo "$full_module_url" | $GREP -o -e "mesa/.*" -e "/xcb/.*" -e "/xkeyboard-config" -e "/nouveau/xf86-video-nouveau" -e "/libevdev" -e "wayland/.*" -e "/evemu" -e "/libinput"`
244 if [ $?
-eq 0 ]; then
245 module_url
=`echo $module_url | cut -d'/' -f2,3`
247 echo "Error: unable to locate a valid project url from \"$full_module_url\"."
248 echo "Cannot establish url as one of xorg, mesa, xcb, xf86-video-nouveau, xkeyboard-config or wayland"
254 # Find the section (subdirs) where the tarballs are to be uploaded
255 # The module relative path can be app/xfs, xserver, or mesa/drm for example
256 section
=`echo $module_url | cut -d'/' -f1`
257 if [ $?
-ne 0 ]; then
258 echo "Error: unable to extract section from $module_url first field."
262 if [ x
"$section" = xmesa
]; then
263 section
=`echo $module_url | cut -d'/' -f2`
264 if [ $?
-ne 0 ]; then
265 echo "Error: unable to extract section from $module_url second field."
267 elif [ x
"$section" != xdrm
] &&
268 [ x
"$section" != xmesa
] &&
269 [ x
"$section" != xglu
] &&
270 [ x
"$section" != xdemos
]; then
271 echo "Error: section $section is not supported, only libdrm, mesa, glu and demos are."
276 if [ x
"$section" = xwayland
-o x
"$section" = xxorg
]; then
277 section
=`echo $module_url | cut -d'/' -f2`
278 if [ $?
-ne 0 ]; then
279 echo "Error: unable to extract section from $module_url second field."
287 # Function: sign_or_fail
288 #------------------------------------------------------------------------------
290 # Sign the given file, if any
291 # Output the name of the signature generated to stdout (all other output to
293 # Return 0 on success, 1 on fail
299 $GPG -b $GPGKEY $1 1>&2
300 if [ $?
-ne 0 ]; then
301 echo "Error: failed to sign $1." >&2
309 #------------------------------------------------------------------------------
310 # Function: process_module
311 #------------------------------------------------------------------------------
312 # Code 'return 0' on success to process the next module
313 # Code 'return 1' on error to process next module if invoked with --no-quit
322 echo "======== Processing \"$top_src/$MODULE_RPATH\""
324 # This is the location where the script has been invoked
325 if [ ! -d $MODULE_RPATH ] ; then
326 echo "Error: $MODULE_RPATH cannot be found under $top_src."
330 # Change directory to be in the git module
332 if [ $?
-ne 0 ]; then
333 echo "Error: failed to cd to $MODULE_RPATH."
337 # ----- Now in the git module *root* directory ----- #
339 # Check that this is indeed a git module
340 # Don't assume that $(top_srcdir)/.git is a directory. It may be
341 # a gitlink file if $(top_srcdir) is a submodule checkout or a linked
343 if [ ! -e .git
]; then
344 echo "Error: there is no git module here: `pwd`"
348 # Determine what is the current branch and the remote name
349 current_branch
=`git branch | $GREP "\*" | sed -e "s/\* //"`
350 remote_name
=`git config --get branch.$current_branch.remote`
351 remote_branch
=`git config --get branch.$current_branch.merge | cut -d'/' -f3,4`
352 echo "Info: working off the \"$current_branch\" branch tracking the remote \"$remote_name/$remote_branch\"."
356 if [ $?
-ne 0 ]; then
361 # Check for uncommitted/queued changes.
363 if [ $?
-ne 0 ]; then
367 if [ -f autogen.sh
]; then
369 elif [ -f meson.build
]; then
371 which jq
>& /dev
/null
372 if [ $?
-ne 0 ]; then
373 echo "Cannot find required jq(1) to parse project metadata"
377 echo "Cannot find autogen.sh or meson.build"
381 if [ $use_autogen != 0 ]; then
382 # If AC_CONFIG_AUX_DIR isn't set, libtool will search down to ../.. for
383 # install-sh and then just guesses that's the aux dir, dumping
384 # config.sub and other files into that directory. make distclean then
385 # complains about leftover files. So let's put our real module dir out
386 # of reach of libtool.
388 # We use release/$section/$build_dir because git worktree will pick the
389 # last part as branch identifier, so it needs to be random to avoid
391 build_dir
="release/$section"
392 mkdir
-p "$build_dir"
394 # Create tmpdir for the release
395 build_dir
=`mktemp -d -p "$build_dir" build.XXXXXXXXXX`
396 if [ $?
-ne 0 ]; then
397 echo "Error: could not create a temporary directory for the release"
398 echo "Do you have coreutils' mktemp ?"
402 # Worktree removal is intentionally left to the user, due to:
403 # - currently we cannot select only one worktree to prune
404 # - requires to removal of $build_dir which might contradict with the
405 # user decision to keep some artefacts like tarballs or other
406 echo "Info: creating new git worktree."
407 git worktree add
$build_dir
408 if [ $?
-ne 0 ]; then
409 echo "Error: failed to create a git worktree."
415 if [ $?
-ne 0 ]; then
416 echo "Error: failed to cd to $MODULE_RPATH/$build_dir."
421 echo "Info: running autogen.sh"
422 .
/autogen.sh
>/dev
/null
424 if [ $?
-ne 0 ]; then
425 echo "Error: failed to configure module."
430 # Run 'make dist/distcheck' to ensure the tarball matches the git module content
431 # Important to run make dist/distcheck before looking in Makefile, may need to reconfigure
432 echo "Info: running \"make $MAKE_DIST_CMD\" to create tarballs:"
433 ${MAKE} $MAKEFLAGS $MAKE_DIST_CMD > /dev
/null
434 if [ $?
-ne 0 ]; then
435 echo "Error: \"$MAKE $MAKEFLAGS $MAKE_DIST_CMD\" failed."
440 # Find out the tarname from the makefile
441 pkg_name
=`$GREP '^PACKAGE = ' Makefile | sed 's|PACKAGE = ||'`
442 pkg_version
=`$GREP '^VERSION = ' Makefile | sed 's|VERSION = ||'`
444 announce_dir
=$tar_root
446 # meson sets up ninja dist so we don't have to do worktrees and it
447 # has the builddir enabled by default
449 if [ -e "$build_dir" ]; then
450 meson
$build_dir --wipe
454 if [ $?
-ne 0 ]; then
455 echo "Error: failed to configure module."
460 echo "Info: running \"ninja dist\" to create tarball:"
461 ninja
-C $build_dir dist
462 if [ $?
-ne 0 ]; then
463 echo "Error: ninja dist failed"
468 # Find out the package name from the meson.build file
469 pkg_name
=$
(meson introspect
$build_dir --projectinfo | jq
-r .descriptive_name
)
470 pkg_version
=$
(meson introspect
$build_dir --projectinfo | jq
-r .version
)
471 tar_root
="$build_dir/meson-dist"
472 announce_dir
=$tar_root
475 tar_name
="$pkg_name-$pkg_version"
476 targz
="$tar_root/$tar_name.tar.gz"
477 tarbz2
="$tar_root/$tar_name.tar.bz2"
478 tarxz
="$tar_root/$tar_name.tar.xz"
480 [ -e $targz ] && ls -l $targz ||
unset targz
481 [ -e $tarbz2 ] && ls -l $tarbz2 ||
unset tarbz2
482 [ -e $tarxz ] && ls -l $tarxz ||
unset tarxz
484 if [ -z "$targz" -a -z "$tarbz2" -a -z "$tarxz" ]; then
485 echo "Error: no compatible tarballs found."
490 # wayland/weston/libinput tag with the version number only
492 if [ x
"$section" = xwayland
] ||
493 [ x
"$section" = xweston
] ||
494 [ x
"$section" = xlibinput
]; then
495 tag_name
="$pkg_version"
498 # evemu tag with the version number prefixed by 'v'
499 if [ x
"$section" = xevemu
]; then
500 tag_name
="v$pkg_version"
504 siggz
="$(sign_or_fail ${targz})"
505 gpgsignerr
=$
((${gpgsignerr} + $?
))
506 sigbz2
="$(sign_or_fail ${tarbz2})"
507 gpgsignerr
=$
((${gpgsignerr} + $?
))
508 sigxz
="$(sign_or_fail ${tarxz})"
509 gpgsignerr
=$
((${gpgsignerr} + $?
))
510 if [ ${gpgsignerr} -ne 0 ]; then
511 echo "Error: unable to sign at least one of the tarballs."
516 # Obtain the top commit SHA which should be the version bump
517 # It should not have been tagged yet (the script will do it later)
518 local_top_commit_sha
=`git rev-list --max-count=1 HEAD`
519 if [ $?
-ne 0 ]; then
520 echo "Error: unable to obtain the local top commit id."
525 # Check that the top commit looks like a version bump
526 git
diff --unified=0 HEAD^ |
$GREP -F $pkg_version >/dev
/null
2>&1
527 if [ $?
-ne 0 ]; then
528 # Wayland repos use m4_define([wayland_major_version], [0])
529 git
diff --unified=0 HEAD^ |
$GREP -E "(major|minor|micro)_version" >/dev
/null
2>&1
530 if [ $?
-ne 0 ]; then
531 echo "Error: the local top commit does not look like a version bump."
532 echo " the diff does not contain the string \"$pkg_version\"."
533 local_top_commit_descr
=`git log --oneline --max-count=1 $local_top_commit_sha`
534 echo " the local top commit is: \"$local_top_commit_descr\""
540 # Check that the top commit has been pushed to remote
541 remote_top_commit_sha
=`git rev-list --max-count=1 $remote_name/$remote_branch`
542 if [ $?
-ne 0 ]; then
543 echo "Error: unable to obtain top commit from the remote repository."
547 if [ x
"$remote_top_commit_sha" != x
"$local_top_commit_sha" ]; then
548 echo "Error: the local top commit has not been pushed to the remote."
549 local_top_commit_descr
=`git log --oneline --max-count=1 $local_top_commit_sha`
550 echo " the local top commit is: \"$local_top_commit_descr\""
555 # If a tag exists with the tar name, ensure it is tagging the top commit
556 # It may happen if the version set in configure.ac has been previously released
557 tagged_commit_sha
=`git rev-list --max-count=1 $tag_name 2>/dev/null`
558 if [ $?
-eq 0 ]; then
559 # Check if the tag is pointing to the top commit
560 if [ x
"$tagged_commit_sha" != x
"$remote_top_commit_sha" ]; then
561 echo "Error: the \"$tag_name\" already exists."
562 echo " this tag is not tagging the top commit."
563 remote_top_commit_descr
=`git log --oneline --max-count=1 $remote_top_commit_sha`
564 echo " the top commit is: \"$remote_top_commit_descr\""
565 local_tag_commit_descr
=`git log --oneline --max-count=1 $tagged_commit_sha`
566 echo " tag \"$tag_name\" is tagging some other commit: \"$local_tag_commit_descr\""
570 echo "Info: module already tagged with \"$tag_name\"."
573 # Tag the top commit with the tar name
574 if [ x
"$DRY_RUN" = x
]; then
575 git tag
$GPGKEY -s -m $tag_name $tag_name
576 if [ $?
-ne 0 ]; then
577 echo "Error: unable to tag module with \"$tag_name\"."
581 echo "Info: module tagged with \"$tag_name\"."
584 echo "Info: skipping the commit tagging in dry-run mode."
588 # --------- Now the tarballs are ready to upload ----------
590 # The hostname which is used to connect to the development resources
591 hostname
="annarchy.freedesktop.org"
593 # Some hostnames are also used as /srv subdirs
594 host_fdo
="www.freedesktop.org"
595 host_xorg
="xorg.freedesktop.org"
596 host_dri
="dri.freedesktop.org"
597 host_mesa
="mesa.freedesktop.org"
598 host_wayland
="wayland.freedesktop.org"
600 # Mailing lists where to post the all [Announce] e-mails
601 list_to
="xorg-announce@lists.x.org"
603 # Mailing lists to be CC according to the project (xorg|dri|xkb)
604 list_xorg_user
="xorg@lists.x.org"
605 list_dri_devel
="dri-devel@lists.freedesktop.org"
606 list_mesa_announce
="mesa-announce@lists.freedesktop.org"
607 list_mesa_devel
="mesa-dev@lists.freedesktop.org"
609 list_xkb
="xkb@listserv.bat.ru"
610 list_xcb
="xcb@lists.freedesktop.org"
611 list_nouveau
="nouveau@lists.freedesktop.org"
612 list_wayland
="wayland-devel@lists.freedesktop.org"
613 list_input
="input-tools@lists.freedesktop.org"
615 host_current
=$host_xorg
616 section_path
=archive
/individual
/$section
617 srv_path
="/srv/$host_current/$section_path"
618 list_cc
=$list_xorg_user
620 # Handle special cases such as non xorg projects or migrated xorg projects
621 # Nouveau has its own list and section, but goes with the other drivers
622 if [ x
"$section" = xnouveau
]; then
623 section_path
=archive
/individual
/driver
624 srv_path
="/srv/$host_current/$section_path"
625 list_cc
=$list_nouveau
628 # Xcb has a separate mailing list
629 if [ x
"$section" = xxcb
]; then
633 # Module mesa/drm goes in the dri "libdrm" section
634 if [ x
"$section" = xdrm
]; then
635 host_current
=$host_dri
637 srv_path
="/srv/$host_current/www/$section_path"
638 list_cc
=$list_dri_devel
639 elif [ x
"$section" = xmesa
]; then
640 host_current
=$host_mesa
642 srv_path
="/srv/$host_current/www/$section_path"
643 list_to
=$list_mesa_announce
644 list_cc
=$list_mesa_devel
645 elif [ x
"$section" = xdemos
] ||
[ x
"$section" = xglu
]; then
646 host_current
=$host_mesa
647 section_path
=archive
/$section
648 srv_path
="/srv/$host_current/www/$section_path"
649 list_to
=$list_mesa_announce
650 list_cc
=$list_mesa_devel
653 # Module xkeyboard-config goes in a subdir of the xorg "data" section
654 if [ x
"$section" = xxkeyboard-config
]; then
655 host_current
=$host_xorg
656 section_path
=archive
/individual
/data
/$section
657 srv_path
="/srv/$host_current/$section_path"
661 if [ x
"$section" = xlibevdev
]; then
662 host_current
=$host_fdo
663 section_path
="software/$section"
664 srv_path
="/srv/$host_current/www/$section_path"
669 if [ x
"$section" = xwayland
] ||
670 [ x
"$section" = xweston
]; then
671 host_current
=$host_wayland
672 section_path
="releases"
673 srv_path
="/srv/$host_current/www/$section_path"
674 list_to
=$list_wayland
676 elif [ x
"$section" = xlibinput
]; then
677 host_current
=$host_fdo
678 section_path
="software/libinput"
679 srv_path
="/srv/$host_current/www/$section_path"
680 list_to
=$list_wayland
682 elif [ x
"$section" = xevemu
]; then
683 host_current
=$host_fdo
684 section_path
="software/evemu"
685 srv_path
="/srv/$host_current/www/$section_path"
690 # Use personal web space on the host for unit testing (leave commented out)
691 # srv_path="~/public_html$srv_path"
693 # Check that the server path actually does exist
694 echo "Info: checking if path exists on web server:"
695 ssh $USER_NAME$hostname ls $srv_path >/dev
/null
2>&1
696 if [ $?
-ne 0 ]; then
697 echo "Error: the path \"$srv_path\" on the web server does not exist."
702 # Check for already existing tarballs
703 for tarball
in $targz $tarbz2 $tarxz; do
704 echo "Info: checking if tarball $tarball already exists on web server:"
705 ssh $USER_NAME$hostname ls $srv_path/$tarball >/dev
/null
2>&1
706 if [ $?
-eq 0 ]; then
707 if [ "x$FORCE" = "xyes" ]; then
708 echo "Warning: overwriting released tarballs due to --force option."
710 echo "Error: tarball $tar_name already exists. Use --force to overwrite."
717 # Upload to host using the 'scp' remote file copy program
718 if [ x
"$DRY_RUN" = x
]; then
719 echo "Info: uploading tarballs to web server:"
720 scp
$targz $tarbz2 $tarxz $siggz $sigbz2 $sigxz $USER_NAME$hostname:$srv_path
721 if [ $?
-ne 0 ]; then
722 echo "Error: the tarballs uploading failed."
727 echo "Info: skipping tarballs uploading in dry-run mode."
728 echo " \"$srv_path\"."
731 # Pushing the top commit tag to the remote repository
732 if [ x
$DRY_RUN = x
]; then
733 echo "Info: pushing tag \"$tag_name\" to remote \"$remote_name\":"
734 git push
$remote_name $tag_name
735 if [ $?
-ne 0 ]; then
736 echo "Error: unable to push tag \"$tag_name\" to the remote repository."
737 echo " it is recommended you fix this manually and not run the script again"
742 echo "Info: skipped pushing tag \"$tag_name\" to the remote repository in dry-run mode."
745 SHA1SUM
=`which sha1sum || which gsha1sum`
746 SHA256SUM
=`which sha256sum || which gsha256sum`
747 SHA512SUM
=`which sha512sum || which gsha512sum`
749 # --------- Generate the announce e-mail ------------------
750 # Failing to generate the announce is not considered a fatal error
752 # Git-describe returns only "the most recent tag", it may not be the expected one
753 # However, we only use it for the commit history which will be the same anyway.
754 tag_previous
=`git describe --abbrev=0 HEAD^ 2>/dev/null`
755 # Git fails with rc=128 if no tags can be found prior to HEAD^
756 if [ $?
-ne 0 ]; then
757 if [ $?
-ne 0 ]; then
758 echo "Warning: unable to find a previous tag."
759 echo " perhaps a first release on this branch."
760 echo " Please check the commit history in the announce."
763 if [ x
"$tag_previous" != x
]; then
764 # The top commit may not have been tagged in dry-run mode. Use commit.
765 tag_range
=$tag_previous..
$local_top_commit_sha
770 generate_announce
> "$tar_name.announce"
773 echo "Info: [ANNOUNCE] template generated in \"$announce_dir/$tar_name.announce\" file."
774 echo " Please pgp sign and send it."
776 # --------- Update the JH Build moduleset -----------------
777 # Failing to update the jh moduleset is not considered a fatal error
778 if [ x
"$JH_MODULESET" != x
]; then
779 for tarball
in $targz $tarbz2 $tarxz; do
780 if [ x
$DRY_RUN = x
]; then
781 sha1sum=`$SHA1SUM $tarball | cut -d' ' -f1`
782 $top_src/util
/modular
/update-moduleset.sh
$JH_MODULESET $sha1sum $tarball
783 echo "Info: updated jh moduleset: \"$JH_MODULESET\""
785 echo "Info: skipping jh moduleset \"$JH_MODULESET\" update in dry-run mode."
788 # $tar* may be unset, so simply loop through all of them and the
789 # first one that is set updates the module file
795 # --------- Successful completion --------------------------
801 #------------------------------------------------------------------------------
803 #------------------------------------------------------------------------------
804 # Displays the script usage and exits successfully
807 basename="`expr "//$0" : '.*/\([^/]*\)'`"
810 Usage: $basename [options] path...
812 Where "path" is a relative path to a git module, including '.'.
815 --dist make 'dist' instead of 'distcheck'; use with caution
816 --distcheck Default, ignored for compatibility
817 --dry-run Does everything except tagging and uploading tarballs
818 --force Force overwriting an existing release
819 --gpgkey <key> Specify the key used to sign the git tag/release tarballs
820 --help Display this help and exit successfully
821 --modfile <file> Release the git modules specified in <file>
822 --moduleset <file> The jhbuild moduleset full pathname to be updated
823 --no-quit Do not quit after error; just print error message
824 --user <name>@ Username of your fdo account if not configured in ssh
826 Environment variables defined by the "make" program and used by release.sh:
827 MAKE The name of the make command [make]
828 MAKEFLAGS: Options to pass to all \$(MAKE) invocations
833 #------------------------------------------------------------------------------
835 #------------------------------------------------------------------------------
838 # Choose which make program to use (could be gmake)
841 # Choose which grep program to use (on Solaris, must be gnu grep)
842 if [ "x$GREP" = "x" ] ; then
843 if [ -x /usr
/gnu
/bin
/grep ] ; then
844 GREP
=/usr
/gnu
/bin
/grep
850 # Find path for GnuPG v2
851 if [ "x$GPG" = "x" ] ; then
852 if [ -x /usr
/bin
/gpg2
] ; then
859 # Avoid problems if GPGKEY is already set in the environment
862 # Set the default make tarball creation command
863 MAKE_DIST_CMD
=distcheck
865 # Process command line args
869 # Use 'dist' rather than 'distcheck' to create tarballs
870 # You really only want to do this if you're releasing a module you can't
871 # possibly build-test. Please consider carefully the wisdom of doing so.
875 # Use 'distcheck' to create tarballs
877 MAKE_DIST_CMD
=distcheck
879 # Does everything except uploading tarball
883 # Force overwriting an existing release
884 # Use only if nothing changed in the git repo
888 # Allow user specified GPG key
890 check_option_args
$1 $2
895 # Display this help and exit successfully
900 # Release the git modules specified in <file>
902 check_option_args
$1 $2
906 # The jhbuild moduleset to update with relase info
908 check_option_args
$1 $2
912 # Do not quit after error; just print error message
916 # Username of your fdo account if not configured in ssh
918 check_option_args
$1 $2
924 echo "Error: unknown option: $1"
931 echo "Error: unknown option: $1"
937 if [ x
"${MODFILE}" != x
]; then
939 echo "Error: specifying both modules and --modfile is not permitted"
944 INPUT_MODULES
="${INPUT_MODULES} $1"
952 if [ "${umask}" != "022" -a "${umask}" != "0022" ]; then
954 echo "Error: umask is not 022"
959 # If no modules specified (blank cmd line) display help
960 check_modules_specification
962 # Read the module file and normalize input in INPUT_MODULES
965 # Loop through each module to release
966 # Exit on error if --no-quit no specified
969 # Print the epilog with final status