release.sh: Fix extracting the section for xorg modules
[xorg-util-modular.git] / release.sh
blobaa38d29bdc4280f2d950181faa0868a99d8012a1
1 #!/bin/bash
3 # Creates and upload a git module tarball
5 # Note on portability:
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=C
13 #------------------------------------------------------------------------------
14 # Function: check_local_changes
15 #------------------------------------------------------------------------------
17 check_local_changes() {
18 git diff --quiet HEAD > /dev/null 2>&1
19 if [ $? -ne 0 ]; then
20 echo ""
21 echo "Uncommitted changes found. Did you forget to commit? Aborting."
22 echo ""
23 echo "You can perform a 'git stash' to save your local changes and"
24 echo "a 'git stash apply' to recover them after the tarball release."
25 echo "Make sure to rebuild and run 'make distcheck' again."
26 echo ""
27 echo "Alternatively, you can clone the module in another directory"
28 echo "and run ./configure. No need to build if testing was finished."
29 echo ""
30 return 1
32 return 0
35 #------------------------------------------------------------------------------
36 # Function: check_option_args
37 #------------------------------------------------------------------------------
39 # perform sanity checks on cmdline args which require arguments
40 # arguments:
41 # $1 - the option being examined
42 # $2 - the argument to the option
43 # returns:
44 # if it returns, everything is good
45 # otherwise it exit's
46 check_option_args() {
47 option=$1
48 arg=$2
50 # check for an argument
51 if [ x"$arg" = x ]; then
52 echo ""
53 echo "Error: the '$option' option is missing its required argument."
54 echo ""
55 usage
56 exit 1
59 # does the argument look like an option?
60 echo $arg | $GREP "^-" > /dev/null
61 if [ $? -eq 0 ]; then
62 echo ""
63 echo "Error: the argument '$arg' of option '$option' looks like an option itself."
64 echo ""
65 usage
66 exit 1
70 #------------------------------------------------------------------------------
71 # Function: check_gpgkey
72 #------------------------------------------------------------------------------
74 # check if the gpg key provided is known/available
75 # arguments:
76 # $1 - the gpg key
77 # returns:
78 # if it returns, everything is good
79 # otherwise it exit's
80 check_gpgkey() {
81 arg=$1
83 $GPG --list-keys "$arg" &>/dev/null
84 if [ $? -ne 0 ]; then
85 echo ""
86 echo "Error: the argument '$arg' is not a known gpg key."
87 echo ""
88 usage
89 exit 1
93 #------------------------------------------------------------------------------
94 # Function: check_modules_specification
95 #------------------------------------------------------------------------------
97 check_modules_specification() {
99 if [ x"$MODFILE" = x ]; then
100 if [ x"${INPUT_MODULES}" = x ]; then
101 echo ""
102 echo "Error: no modules specified (blank command line)."
103 usage
104 exit 1
110 #------------------------------------------------------------------------------
111 # Function: generate_announce
112 #------------------------------------------------------------------------------
114 generate_announce()
116 cat <<RELEASE
117 Subject: [ANNOUNCE] $pkg_name $pkg_version
118 To: $list_to
119 Cc: $list_cc
121 `git log --no-merges "$tag_range" | git shortlog`
123 git tag: $tag_name
125 RELEASE
127 for tarball in $tarbz2 $targz $tarxz; do
128 cat <<RELEASE
129 https://$host_current/$section_path/$tarball
130 MD5: `$MD5SUM $tarball`
131 SHA1: `$SHA1SUM $tarball`
132 SHA256: `$SHA256SUM $tarball`
133 SHA512: `$SHA512SUM $tarball`
134 PGP: https://${host_current}/${section_path}/${tarball}.sig
136 RELEASE
137 done
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
147 read_modfile() {
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."
153 exit 1
155 # read from input file, skipping blank and comment lines
156 while read line; do
157 # skip blank lines
158 if [ x"$line" = x ]; then
159 continue
161 # skip comment lines
162 if echo "$line" | $GREP -q "^#" ; then
163 continue;
165 INPUT_MODULES="$INPUT_MODULES $line"
166 done <"$MODFILE"
168 return 0
171 #------------------------------------------------------------------------------
172 # Function: print_epilog
173 #------------------------------------------------------------------------------
175 print_epilog() {
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"
186 echo ""
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
193 echo " $mod"
194 done
195 echo "========"
196 echo ""
200 #------------------------------------------------------------------------------
201 # Function: process_modules
202 #------------------------------------------------------------------------------
204 # Loop through each module to release
205 # Exit on error if --no-quit was not specified
207 process_modules() {
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
213 print_epilog
214 exit 1
217 done
220 #------------------------------------------------------------------------------
221 # Function: get_section
222 #------------------------------------------------------------------------------
223 # Code 'return 0' on success
224 # Code 'return 1' on error
225 # Sets global variable $section
226 get_section() {
227 local module_url
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\"."
234 return 1
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`
241 else
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"`
244 if [ $? -eq 0 ]; then
245 module_url=`echo $module_url | cut -d'/' -f2,3`
246 else
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"
249 cd $top_src
250 return 1
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."
259 return 1
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."
266 return 1
267 elif [ x"$section" != xdrm ] &&
268 [ x"$section" != xmesa ] &&
269 [ x"$section" != xdemos ]; then
270 echo "Error: section $section is not supported, only libdrm, mesa and demos are."
271 return 1
275 if [ x"$section" = xwayland -o x"$section" = xxorg ]; then
276 section=`echo $module_url | cut -d'/' -f2`
277 if [ $? -ne 0 ]; then
278 echo "Error: unable to extract section from $module_url second field."
279 return 1
283 return 0
286 # Function: sign_or_fail
287 #------------------------------------------------------------------------------
289 # Sign the given file, if any
290 # Output the name of the signature generated to stdout (all other output to
291 # stderr)
292 # Return 0 on success, 1 on fail
294 sign_or_fail() {
295 if [ -n "$1" ]; then
296 sig=$1.sig
297 rm -f $sig
298 $GPG -b $GPGKEY $1 1>&2
299 if [ $? -ne 0 ]; then
300 echo "Error: failed to sign $1." >&2
301 return 1
303 echo $sig
305 return 0
308 #------------------------------------------------------------------------------
309 # Function: process_module
310 #------------------------------------------------------------------------------
311 # Code 'return 0' on success to process the next module
312 # Code 'return 1' on error to process next module if invoked with --no-quit
314 process_module() {
316 top_src=`pwd`
317 echo ""
318 echo "======== Processing \"$top_src/$MODULE_RPATH\""
320 # This is the location where the script has been invoked
321 if [ ! -d $MODULE_RPATH ] ; then
322 echo "Error: $MODULE_RPATH cannot be found under $top_src."
323 return 1
326 # Change directory to be in the git module
327 cd $MODULE_RPATH
328 if [ $? -ne 0 ]; then
329 echo "Error: failed to cd to $MODULE_RPATH."
330 return 1
333 # ----- Now in the git module *root* directory ----- #
335 # Check that this is indeed a git module
336 # Don't assume that $(top_srcdir)/.git is a directory. It may be
337 # a gitlink file if $(top_srcdir) is a submodule checkout or a linked
338 # worktree.
339 if [ ! -e .git ]; then
340 echo "Error: there is no git module here: `pwd`"
341 return 1
344 # Determine what is the current branch and the remote name
345 current_branch=`git branch | $GREP "\*" | sed -e "s/\* //"`
346 remote_name=`git config --get branch.$current_branch.remote`
347 remote_branch=`git config --get branch.$current_branch.merge | cut -d'/' -f3,4`
348 echo "Info: working off the \"$current_branch\" branch tracking the remote \"$remote_name/$remote_branch\"."
350 # Obtain the section
351 get_section
352 if [ $? -ne 0 ]; then
353 cd $top_src
354 return 1
357 # Check for uncommitted/queued changes.
358 check_local_changes
359 if [ $? -ne 0 ]; then
360 return 1
363 # If AC_CONFIG_AUX_DIR isn't set, libtool will search down to ../.. for
364 # install-sh and then just guesses that's the aux dir, dumping
365 # config.sub and other files into that directory. make distclean then
366 # complains about leftover files. So let's put our real module dir out
367 # of reach of libtool.
369 # We use release/$section/$build_dir because git worktree will pick the
370 # last part as branch identifier, so it needs to be random to avoid
371 # conflicts.
372 build_dir="release/$section"
373 mkdir -p "$build_dir"
375 # Create tmpdir for the release
376 build_dir=`mktemp -d -p "$build_dir" build.XXXXXXXXXX`
377 if [ $? -ne 0 ]; then
378 echo "Error: could not create a temporary directory for the release"
379 echo "Do you have coreutils' mktemp ?"
380 return 1
383 # Worktree removal is intentionally left to the user, due to:
384 # - currently we cannot select only one worktree to prune
385 # - requires to removal of $build_dir which might contradict with the
386 # user decision to keep some artefacts like tarballs or other
387 echo "Info: creating new git worktree."
388 git worktree add $build_dir
389 if [ $? -ne 0 ]; then
390 echo "Error: failed to create a git worktree."
391 cd $top_src
392 return 1
395 cd $build_dir
396 if [ $? -ne 0 ]; then
397 echo "Error: failed to cd to $MODULE_RPATH/$build_dir."
398 cd $top_src
399 return 1
402 echo "Info: running autogen.sh"
403 ./autogen.sh >/dev/null
404 if [ $? -ne 0 ]; then
405 echo "Error: failed to configure module."
406 cd $top_src
407 return 1
410 # Run 'make dist/distcheck' to ensure the tarball matches the git module content
411 # Important to run make dist/distcheck before looking in Makefile, may need to reconfigure
412 echo "Info: running \"make $MAKE_DIST_CMD\" to create tarballs:"
413 ${MAKE} $MAKEFLAGS $MAKE_DIST_CMD > /dev/null
414 if [ $? -ne 0 ]; then
415 echo "Error: \"$MAKE $MAKEFLAGS $MAKE_DIST_CMD\" failed."
416 cd $top_src
417 return 1
420 # Find out the tarname from the makefile
421 pkg_name=`$GREP '^PACKAGE = ' Makefile | sed 's|PACKAGE = ||'`
422 pkg_version=`$GREP '^VERSION = ' Makefile | sed 's|VERSION = ||'`
423 tar_name="$pkg_name-$pkg_version"
424 targz=$tar_name.tar.gz
425 tarbz2=$tar_name.tar.bz2
426 tarxz=$tar_name.tar.xz
428 [ -e $targz ] && ls -l $targz || unset targz
429 [ -e $tarbz2 ] && ls -l $tarbz2 || unset tarbz2
430 [ -e $tarxz ] && ls -l $tarxz || unset tarxz
432 if [ -z "$targz" -a -z "$tarbz2" -a -z "$tarxz" ]; then
433 echo "Error: no compatible tarballs found."
434 cd $top_src
435 return 1
438 # wayland/weston/libinput tag with the version number only
439 tag_name="$tar_name"
440 if [ x"$section" = xwayland ] ||
441 [ x"$section" = xweston ] ||
442 [ x"$section" = xlibinput ]; then
443 tag_name="$pkg_version"
446 # evemu tag with the version number prefixed by 'v'
447 if [ x"$section" = xevemu ]; then
448 tag_name="v$pkg_version"
451 gpgsignerr=0
452 siggz="$(sign_or_fail ${targz})"
453 gpgsignerr=$((${gpgsignerr} + $?))
454 sigbz2="$(sign_or_fail ${tarbz2})"
455 gpgsignerr=$((${gpgsignerr} + $?))
456 sigxz="$(sign_or_fail ${tarxz})"
457 gpgsignerr=$((${gpgsignerr} + $?))
458 if [ ${gpgsignerr} -ne 0 ]; then
459 echo "Error: unable to sign at least one of the tarballs."
460 cd $top_src
461 return 1
464 # Obtain the top commit SHA which should be the version bump
465 # It should not have been tagged yet (the script will do it later)
466 local_top_commit_sha=`git rev-list --max-count=1 HEAD`
467 if [ $? -ne 0 ]; then
468 echo "Error: unable to obtain the local top commit id."
469 cd $top_src
470 return 1
473 # Check that the top commit looks like a version bump
474 git diff --unified=0 HEAD^ | $GREP -F $pkg_version >/dev/null 2>&1
475 if [ $? -ne 0 ]; then
476 # Wayland repos use m4_define([wayland_major_version], [0])
477 git diff --unified=0 HEAD^ | $GREP -E "(major|minor|micro)_version" >/dev/null 2>&1
478 if [ $? -ne 0 ]; then
479 echo "Error: the local top commit does not look like a version bump."
480 echo " the diff does not contain the string \"$pkg_version\"."
481 local_top_commit_descr=`git log --oneline --max-count=1 $local_top_commit_sha`
482 echo " the local top commit is: \"$local_top_commit_descr\""
483 cd $top_src
484 return 1
488 # Check that the top commit has been pushed to remote
489 remote_top_commit_sha=`git rev-list --max-count=1 $remote_name/$remote_branch`
490 if [ $? -ne 0 ]; then
491 echo "Error: unable to obtain top commit from the remote repository."
492 cd $top_src
493 return 1
495 if [ x"$remote_top_commit_sha" != x"$local_top_commit_sha" ]; then
496 echo "Error: the local top commit has not been pushed to the remote."
497 local_top_commit_descr=`git log --oneline --max-count=1 $local_top_commit_sha`
498 echo " the local top commit is: \"$local_top_commit_descr\""
499 cd $top_src
500 return 1
503 # If a tag exists with the tar name, ensure it is tagging the top commit
504 # It may happen if the version set in configure.ac has been previously released
505 tagged_commit_sha=`git rev-list --max-count=1 $tag_name 2>/dev/null`
506 if [ $? -eq 0 ]; then
507 # Check if the tag is pointing to the top commit
508 if [ x"$tagged_commit_sha" != x"$remote_top_commit_sha" ]; then
509 echo "Error: the \"$tag_name\" already exists."
510 echo " this tag is not tagging the top commit."
511 remote_top_commit_descr=`git log --oneline --max-count=1 $remote_top_commit_sha`
512 echo " the top commit is: \"$remote_top_commit_descr\""
513 local_tag_commit_descr=`git log --oneline --max-count=1 $tagged_commit_sha`
514 echo " tag \"$tag_name\" is tagging some other commit: \"$local_tag_commit_descr\""
515 cd $top_src
516 return 1
517 else
518 echo "Info: module already tagged with \"$tag_name\"."
520 else
521 # Tag the top commit with the tar name
522 if [ x"$DRY_RUN" = x ]; then
523 git tag $GPGKEY -s -m $tag_name $tag_name
524 if [ $? -ne 0 ]; then
525 echo "Error: unable to tag module with \"$tag_name\"."
526 cd $top_src
527 return 1
528 else
529 echo "Info: module tagged with \"$tag_name\"."
531 else
532 echo "Info: skipping the commit tagging in dry-run mode."
536 # --------- Now the tarballs are ready to upload ----------
538 # The hostname which is used to connect to the development resources
539 hostname="annarchy.freedesktop.org"
541 # Some hostnames are also used as /srv subdirs
542 host_fdo="www.freedesktop.org"
543 host_xorg="xorg.freedesktop.org"
544 host_dri="dri.freedesktop.org"
545 host_mesa="mesa.freedesktop.org"
546 host_wayland="wayland.freedesktop.org"
548 # Mailing lists where to post the all [Announce] e-mails
549 list_to="xorg-announce@lists.x.org"
551 # Mailing lists to be CC according to the project (xorg|dri|xkb)
552 list_xorg_user="xorg@lists.x.org"
553 list_dri_devel="dri-devel@lists.freedesktop.org"
554 list_mesa_announce="mesa-announce@lists.freedesktop.org"
555 list_mesa_devel="mesa-dev@lists.freedesktop.org"
557 list_xkb="xkb@listserv.bat.ru"
558 list_xcb="xcb@lists.freedesktop.org"
559 list_nouveau="nouveau@lists.freedesktop.org"
560 list_wayland="wayland-devel@lists.freedesktop.org"
561 list_input="input-tools@lists.freedesktop.org"
563 host_current=$host_xorg
564 section_path=archive/individual/$section
565 srv_path="/srv/$host_current/$section_path"
566 list_cc=$list_xorg_user
568 # Handle special cases such as non xorg projects or migrated xorg projects
569 # Nouveau has its own list and section, but goes with the other drivers
570 if [ x"$section" = xnouveau ]; then
571 section_path=archive/individual/driver
572 srv_path="/srv/$host_current/$section_path"
573 list_cc=$list_nouveau
576 # Xcb has a separate mailing list
577 if [ x"$section" = xxcb ]; then
578 list_cc=$list_xcb
581 # Module mesa/drm goes in the dri "libdrm" section
582 if [ x"$section" = xdrm ]; then
583 host_current=$host_dri
584 section_path=libdrm
585 srv_path="/srv/$host_current/www/$section_path"
586 list_cc=$list_dri_devel
587 elif [ x"$section" = xmesa ]; then
588 host_current=$host_mesa
589 section_path=archive
590 srv_path="/srv/$host_current/www/$section_path"
591 list_to=$list_mesa_announce
592 list_cc=$list_mesa_devel
593 elif [ x"$section" = xdemos ]; then
594 host_current=$host_mesa
595 section_path=archive/$section
596 srv_path="/srv/$host_current/www/$section_path"
597 list_to=$list_mesa_announce
598 list_cc=$list_mesa_devel
601 # Module xkeyboard-config goes in a subdir of the xorg "data" section
602 if [ x"$section" = xxkeyboard-config ]; then
603 host_current=$host_xorg
604 section_path=archive/individual/data/$section
605 srv_path="/srv/$host_current/$section_path"
606 list_cc=$list_xkb
609 if [ x"$section" = xlibevdev ]; then
610 host_current=$host_fdo
611 section_path="software/$section"
612 srv_path="/srv/$host_current/www/$section_path"
613 list_to=$list_input
614 unset list_cc
617 if [ x"$section" = xwayland ] ||
618 [ x"$section" = xweston ]; then
619 host_current=$host_wayland
620 section_path="releases"
621 srv_path="/srv/$host_current/www/$section_path"
622 list_to=$list_wayland
623 unset list_cc
624 elif [ x"$section" = xlibinput ]; then
625 host_current=$host_fdo
626 section_path="software/libinput"
627 srv_path="/srv/$host_current/www/$section_path"
628 list_to=$list_wayland
629 unset list_cc
630 elif [ x"$section" = xevemu ]; then
631 host_current=$host_fdo
632 section_path="software/evemu"
633 srv_path="/srv/$host_current/www/$section_path"
634 list_to=$list_input
635 unset list_cc
638 # Use personal web space on the host for unit testing (leave commented out)
639 # srv_path="~/public_html$srv_path"
641 # Check that the server path actually does exist
642 echo "Info: checking if path exists on web server:"
643 ssh $USER_NAME$hostname ls $srv_path >/dev/null 2>&1
644 if [ $? -ne 0 ]; then
645 echo "Error: the path \"$srv_path\" on the web server does not exist."
646 cd $top_src
647 return 1
650 # Check for already existing tarballs
651 for tarball in $targz $tarbz2 $tarxz; do
652 echo "Info: checking if tarball $tarball already exists on web server:"
653 ssh $USER_NAME$hostname ls $srv_path/$tarball >/dev/null 2>&1
654 if [ $? -eq 0 ]; then
655 if [ "x$FORCE" = "xyes" ]; then
656 echo "Warning: overwriting released tarballs due to --force option."
657 else
658 echo "Error: tarball $tar_name already exists. Use --force to overwrite."
659 cd $top_src
660 return 1
663 done
665 # Upload to host using the 'scp' remote file copy program
666 if [ x"$DRY_RUN" = x ]; then
667 echo "Info: uploading tarballs to web server:"
668 scp $targz $tarbz2 $tarxz $siggz $sigbz2 $sigxz $USER_NAME$hostname:$srv_path
669 if [ $? -ne 0 ]; then
670 echo "Error: the tarballs uploading failed."
671 cd $top_src
672 return 1
674 else
675 echo "Info: skipping tarballs uploading in dry-run mode."
676 echo " \"$srv_path\"."
679 # Pushing the top commit tag to the remote repository
680 if [ x$DRY_RUN = x ]; then
681 echo "Info: pushing tag \"$tag_name\" to remote \"$remote_name\":"
682 git push $remote_name $tag_name
683 if [ $? -ne 0 ]; then
684 echo "Error: unable to push tag \"$tag_name\" to the remote repository."
685 echo " it is recommended you fix this manually and not run the script again"
686 cd $top_src
687 return 1
689 else
690 echo "Info: skipped pushing tag \"$tag_name\" to the remote repository in dry-run mode."
693 MD5SUM=`which md5sum || which gmd5sum`
694 SHA1SUM=`which sha1sum || which gsha1sum`
695 SHA256SUM=`which sha256sum || which gsha256sum`
696 SHA512SUM=`which sha512sum || which gsha512sum`
698 # --------- Generate the announce e-mail ------------------
699 # Failing to generate the announce is not considered a fatal error
701 # Git-describe returns only "the most recent tag", it may not be the expected one
702 # However, we only use it for the commit history which will be the same anyway.
703 tag_previous=`git describe --abbrev=0 HEAD^ 2>/dev/null`
704 # Git fails with rc=128 if no tags can be found prior to HEAD^
705 if [ $? -ne 0 ]; then
706 if [ $? -ne 0 ]; then
707 echo "Warning: unable to find a previous tag."
708 echo " perhaps a first release on this branch."
709 echo " Please check the commit history in the announce."
712 if [ x"$tag_previous" != x ]; then
713 # The top commit may not have been tagged in dry-run mode. Use commit.
714 tag_range=$tag_previous..$local_top_commit_sha
715 else
716 tag_range=$tag_name
718 generate_announce > "$tar_name.announce"
719 echo "Info: [ANNOUNCE] template generated in \"$build_dir/$tar_name.announce\" file."
720 echo " Please pgp sign and send it."
722 # --------- Update the JH Build moduleset -----------------
723 # Failing to update the jh moduleset is not considered a fatal error
724 if [ x"$JH_MODULESET" != x ]; then
725 for tarball in $targz $tarbz2 $tarxz; do
726 if [ x$DRY_RUN = x ]; then
727 sha1sum=`$SHA1SUM $tarball | cut -d' ' -f1`
728 $top_src/util/modular/update-moduleset.sh $JH_MODULESET $sha1sum $tarball
729 echo "Info: updated jh moduleset: \"$JH_MODULESET\""
730 else
731 echo "Info: skipping jh moduleset \"$JH_MODULESET\" update in dry-run mode."
734 # $tar* may be unset, so simply loop through all of them and the
735 # first one that is set updates the module file
736 break
737 done
741 # --------- Successful completion --------------------------
742 cd $top_src
743 return 0
747 #------------------------------------------------------------------------------
748 # Function: usage
749 #------------------------------------------------------------------------------
750 # Displays the script usage and exits successfully
752 usage() {
753 basename="`expr "//$0" : '.*/\([^/]*\)'`"
754 cat <<HELP
756 Usage: $basename [options] path...
758 Where "path" is a relative path to a git module, including '.'.
760 Options:
761 --dist make 'dist' instead of 'distcheck'; use with caution
762 --distcheck Default, ignored for compatibility
763 --dry-run Does everything except tagging and uploading tarballs
764 --force Force overwriting an existing release
765 --gpgkey <key> Specify the key used to sign the git tag/release tarballs
766 --help Display this help and exit successfully
767 --modfile <file> Release the git modules specified in <file>
768 --moduleset <file> The jhbuild moduleset full pathname to be updated
769 --no-quit Do not quit after error; just print error message
770 --user <name>@ Username of your fdo account if not configured in ssh
772 Environment variables defined by the "make" program and used by release.sh:
773 MAKE The name of the make command [make]
774 MAKEFLAGS: Options to pass to all \$(MAKE) invocations
776 HELP
779 #------------------------------------------------------------------------------
780 # Script main line
781 #------------------------------------------------------------------------------
784 # Choose which make program to use (could be gmake)
785 MAKE=${MAKE:="make"}
787 # Choose which grep program to use (on Solaris, must be gnu grep)
788 if [ "x$GREP" = "x" ] ; then
789 if [ -x /usr/gnu/bin/grep ] ; then
790 GREP=/usr/gnu/bin/grep
791 else
792 GREP=grep
796 # Find path for GnuPG v2
797 if [ "x$GPG" = "x" ] ; then
798 if [ -x /usr/bin/gpg2 ] ; then
799 GPG=/usr/bin/gpg2
800 else
801 GPG=gpg
805 # Avoid problems if GPGKEY is already set in the environment
806 unset GPGKEY
808 # Set the default make tarball creation command
809 MAKE_DIST_CMD=distcheck
811 # Process command line args
812 while [ $# != 0 ]
814 case $1 in
815 # Use 'dist' rather than 'distcheck' to create tarballs
816 # You really only want to do this if you're releasing a module you can't
817 # possibly build-test. Please consider carefully the wisdom of doing so.
818 --dist)
819 MAKE_DIST_CMD=dist
821 # Use 'distcheck' to create tarballs
822 --distcheck)
823 MAKE_DIST_CMD=distcheck
825 # Does everything except uploading tarball
826 --dry-run)
827 DRY_RUN=yes
829 # Force overwriting an existing release
830 # Use only if nothing changed in the git repo
831 --force)
832 FORCE=yes
834 # Allow user specified GPG key
835 --gpgkey)
836 check_option_args $1 $2
837 shift
838 check_gpgkey $1
839 GPGKEY="-u $1"
841 # Display this help and exit successfully
842 --help)
843 usage
844 exit 0
846 # Release the git modules specified in <file>
847 --modfile)
848 check_option_args $1 $2
849 shift
850 MODFILE=$1
852 # The jhbuild moduleset to update with relase info
853 --moduleset)
854 check_option_args $1 $2
855 shift
856 JH_MODULESET=$1
858 # Do not quit after error; just print error message
859 --no-quit)
860 NO_QUIT=yes
862 # Username of your fdo account if not configured in ssh
863 --user)
864 check_option_args $1 $2
865 shift
866 USER_NAME=$1
868 --*)
869 echo ""
870 echo "Error: unknown option: $1"
871 echo ""
872 usage
873 exit 1
876 echo ""
877 echo "Error: unknown option: $1"
878 echo ""
879 usage
880 exit 1
883 if [ x"${MODFILE}" != x ]; then
884 echo ""
885 echo "Error: specifying both modules and --modfile is not permitted"
886 echo ""
887 usage
888 exit 1
890 INPUT_MODULES="${INPUT_MODULES} $1"
892 esac
894 shift
895 done
897 # If no modules specified (blank cmd line) display help
898 check_modules_specification
900 # Read the module file and normalize input in INPUT_MODULES
901 read_modfile
903 # Loop through each module to release
904 # Exit on error if --no-quit no specified
905 process_modules
907 # Print the epilog with final status
908 print_epilog