#!/bin/bash
### update_autogen - update some auto-generated files in the Emacs tree
-## Copyright (C) 2011-2013 Free Software Foundation, Inc.
+## Copyright (C) 2011-2014 Free Software Foundation, Inc.
## Author: Glenn Morris <rgm@gnu.org>
cd ../
[ -d admin ] || die "Could not locate admin directory"
+if [ -d .bzr ]; then
+ vcs=bzr
+elif [ -d .git ]; then
+ vcs=git
+else
+ die "Cannot determine vcs"
+fi
+
usage ()
{
cat 1>&2 <<EOF
-Usage: ${PN} [-f] [-c] [-q] [-A dir] [-L] [-C] [-- make-flags]
+Usage: ${PN} [-f] [-c] [-q] [-A dir] [-I] [-L] [-C] [-- make-flags]
Update some auto-generated files in the Emacs tree.
By default, only does the versioned loaddefs-like files in lisp/.
This requires a build. Passes any non-option args to make (eg -- -j2).
commit them (caution).
-q: be quiet; only give error messages, not status messages.
-A: only update autotools files, copying into specified dir.
+-I: also update info/dir.
-L: also update ldefs-boot.el.
-C: start from a clean state. Slower, but more correct.
EOF
autogendir= # was "autogen"
ldefs_flag=1
lboot_flag=
+info_flag=
## Parameters.
ldefs_in=lisp/loaddefs.el
trap "rm -f $tempfile 2> /dev/null" EXIT
-while getopts ":hcfqA:CL" option ; do
+while getopts ":hcfqA:CIL" option ; do
case $option in
(h) usage ;;
(C) clean=1 ;;
+ (I) info_flag=1 ;;
+
(L) lboot_flag=1 ;;
(\?) die "Bad option -$OPTARG" ;;
[ "$quiet" ] && exec 1> /dev/null
-echo "Running bzr status..."
+## Run status on inputs, list modified files on stdout.
+status ()
+{
+ local statflag="-S"
+ [ "$vcs" = "git" ] && statflag="-s"
-bzr status -S ${autogendir:+$sources} ${ldefs_flag:+lisp} >| $tempfile || \
- die "bzr status error for input files"
+ $vcs status $statflag "$@" >| $tempfile || die "$vcs status error for $@"
-## The lisp portion could be more permissive, eg only care about .el files.
-while read stat file; do
+ local stat file modified
- case $stat in
- M)
- echo "Locally modified: $file"
- [ "$force" ] || die "There are local modifications"
- ;;
+ while read stat file; do
- *) die "Unexpected status ($stat) for $file" ;;
- esac
-done < $tempfile
+ [ "$stat" != "M" ] && \
+ die "Unexpected status ($stat) for generated $file"
+ modified="$modified $file"
+
+ done < $tempfile
+
+ echo "$modified"
+
+ return 0
+} # function status
+
+
+echo "Checking input file status..."
+
+## The lisp portion could be more permissive, eg only care about .el files.
+modified=$(status ${autogendir:+$sources} ${ldefs_flag:+lisp} ${info_flag:+doc}) || die
+
+[ "$modified" ] && {
+ echo "Locally modified: $modified"
+ [ "$force" ] || die "There are local modifications"
+}
## Probably this is overkill, and there's no need to "bootstrap" just
echo "Committing..."
- ## bzr status output is always relative to top-level, not PWD.
- bzr commit -m "Auto-commit of $type files." "$@" || return $?
+ $vcs commit -m "Auto-commit of $type files." "$@" || return $?
+
+ [ "$vcs" = "git" ] && {
+ $vcs push || return $?
+ }
echo "Committed files: $@"
} # function commit
-[ "$autogendir" ] && {
+## No longer used since info/dir is now generated at install time if needed,
+## and is not in the repository any more.
+info_dir ()
+{
+ local basefile=build-aux/dir_top outfile=info/dir
- oldpwd=$PWD
+ echo "Regenerating info/dir..."
- cp $genfiles $autogendir/
+ ## Header contains non-printing characters, so this is more
+ ## reliable than using echo.
+ rm -f $outfile
+ cp $basefile $outfile
- cd $autogendir || die "cd error for $autogendir"
+ local topic file dircat dirent
- echo "Checking status of generated files..."
+ ## FIXME inefficient looping.
+ for topic in "Texinfo documentation system" "Emacs" "GNU Emacs Lisp" \
+ "Emacs editing modes" "Emacs network features" "Emacs misc features" \
+ "Emacs lisp libraries"; do
- bzr status -S $basegen >| $tempfile || \
- die "bzr status error for generated files"
+ cat - <<EOF >> $outfile
- modified=
+$topic
+EOF
+ ## Bit faster than doc/*/*.texi.
+ for file in doc/emacs/emacs.texi doc/lispintro/*.texi \
+ doc/lispref/elisp.texi doc/misc/*.texi; do
- while read stat file; do
+ ## FIXME do not ignore w32 if OS is w32.
+ case $file in
+ *-xtra.texi|*efaq-w32.texi) continue ;;
+ esac
- [ "$stat" != "M" ] && \
- die "Unexpected status ($stat) for generated $file"
+ dircat=$(sed -n -e 's/@value{emacsname}/Emacs/' -e 's/^@dircategory //p' $file)
- modified="$modified $file"
+ ## TODO warn about unknown topics (check-info in top-level
+ ## Makefile does this).
+ [ "$dircat" = "$topic" ] || continue
- done < $tempfile
+ sed -n -e 's/@value{emacsname}/Emacs/' \
+ -e 's/@acronym{\([A-Z]*\)}/\1/' \
+ -e '/^@direntry/,/^@end direntry/ s/^\([^@]\)/\1/p' \
+ $file >> $outfile
+
+ done
+ done
+
+ local modified
+
+ modified=$(status $outfile) || die
+
+ commit "info/dir" $modified || die "commit error"
+} # function info_dir
+
+
+[ "$autogendir" ] && {
+
+ oldpwd=$PWD
+
+ cp $genfiles $autogendir/
+
+ cd $autogendir || die "cd error for $autogendir"
+
+ echo "Checking status of generated files..."
+
+ modified=$(status $basegen) || die
- cd $oldpwd
+ ## bzr status output is always relative to top-level, not PWD.
+ [ "$vcs" = "bzr" ] && cd $oldpwd
- commit "generated" $modified || die "bzr commit error"
+ commit "generated" $modified || die "commit error"
exit 0
} # $autogendir
+[ "$info_flag" ] && info_dir
+
+
[ "$ldefs_flag" ] || exit 0
echo "Finding loaddef targets..."
-sed -n -e '/^AUTOGEN_VCS/,/^$/ s/\\//p' lisp/Makefile.in | \
- sed '/AUTOGEN_VCS/d' >| $tempfile || die "sed error"
+sed -n -e '/^AUTOGEN_VCS/,/^$/p' lisp/Makefile.in | \
+ sed -e '/AUTOGEN_VCS/d' -e '/^$/d' -e 's/\\//' \
+ >| $tempfile || die "sed error"
genfiles=
## It probably would be fine to just check+commit lisp/, since
## making autoloads should not effect any other files. But better
## safe than sorry.
-bzr status -S $genfiles ${ldefs_out#lisp/} >| $tempfile || \
- die "bzr status error for generated files"
-
-
-modified=
-
-while read stat file; do
+modified=$(status $genfiles ${ldefs_out#lisp/}) || die
- [ "$stat" != "M" ] && die "Unexpected status ($stat) for generated $file"
- modified="$modified $file"
-done < $tempfile
-
-
-cd ../
+## bzr status output is always relative to top-level, not PWD.
+[ "$vcs" = "bzr" ] && cd ../
-commit "loaddefs" $modified || die "bzr commit error"
+commit "loaddefs" $modified || die "commit error"
exit 0