Commit | Line | Data |
---|---|---|
66b87493 GM |
1 | #!/bin/bash |
2 | ### update_autogen - update the generated files in Emacs autogen/ directory | |
3 | ||
4 | ## Copyright (C) 2011 Free Software Foundation, Inc. | |
5 | ||
6 | ## Author: Glenn Morris <rgm@gnu.org> | |
7 | ||
8 | ## This file is part of GNU Emacs. | |
9 | ||
10 | ## GNU Emacs is free software: you can redistribute it and/or modify | |
11 | ## it under the terms of the GNU General Public License as published by | |
12 | ## the Free Software Foundation, either version 3 of the License, or | |
13 | ## (at your option) any later version. | |
14 | ||
15 | ## GNU Emacs is distributed in the hope that it will be useful, | |
16 | ## but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 | ## GNU General Public License for more details. | |
19 | ||
20 | ## You should have received a copy of the GNU General Public License | |
21 | ## along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. | |
22 | ||
23 | ### Commentary: | |
24 | ||
25 | ## This is a helper script to update the pre-built generated files in | |
26 | ## the autogen/ directory. This is suitable for running from cron. | |
27 | ## Only Emacs maintainers need use this, so it uses bash features. | |
28 | ||
29 | ### Code: | |
30 | ||
31 | function die () # write error to stderr and exit | |
32 | { | |
33 | [ $# -gt 0 ] && echo "$PN: $@" >&2 | |
34 | exit 1 | |
35 | } | |
36 | ||
37 | PN=${0##*/} # basename of script | |
38 | PD=${0%/*} | |
39 | ||
40 | [ "$PD" = "$0" ] && PD=. # if PATH includes PWD | |
41 | ||
42 | ## This should be the autogen directory. | |
43 | cd $PD | |
44 | cd ../ | |
45 | [ -d autogen ] || die "Could not locate autogen directory" | |
46 | ||
47 | ||
48 | function usage () | |
49 | { | |
50 | cat 1>&2 <<EOF | |
51 | Usage: ${PN} [-f] [-c] [-q] | |
52 | Update the generated files in the Emacs autogen/ directory. | |
53 | Options: | |
54 | -f: force an update even if the source files are locally modified. | |
55 | -c: if the update succeeds and the generated files are modified, | |
56 | commit them (caution). | |
57 | -q: be quiet; only give error messages, not status messages. | |
58 | EOF | |
59 | exit 1 | |
60 | } | |
61 | ||
62 | ||
63 | ## Defaults. | |
64 | ||
65 | force= | |
66 | commit= | |
67 | quiet= | |
68 | ||
69 | ## Parameters. | |
70 | sources="configure.in lib/Makefile.am" | |
f6ca84c0 | 71 | genfiles="configure aclocal.m4 src/config.in lib/Makefile.in compile config.guess config.sub depcomp install-sh missing" |
66b87493 GM |
72 | |
73 | for g in $genfiles; do | |
74 | basegen="$basegen ${g##*/}" | |
75 | done | |
76 | ||
77 | [ "$basegen" ] || die "internal error" | |
78 | ||
79 | tempfile=/tmp/$PN.$$ | |
80 | ||
81 | trap "rm -f $tempfile 2> /dev/null" EXIT | |
82 | ||
83 | ||
84 | while getopts ":hcfq" option ; do | |
85 | case $option in | |
86 | (h) usage ;; | |
87 | ||
88 | (c) commit=1 ;; | |
89 | ||
90 | (f) force=1 ;; | |
91 | ||
92 | (q) quiet=1 ;; | |
93 | ||
94 | (\?) die "Bad option -$OPTARG" ;; | |
95 | ||
96 | (:) die "Option -$OPTARG requires an argument" ;; | |
97 | ||
98 | (*) die "getopts error" ;; | |
99 | esac | |
100 | done | |
101 | shift $(( --OPTIND )) | |
102 | OPTIND=1 | |
103 | ||
104 | [ $# -eq 0 ] || die "Wrong number of arguments" | |
105 | ||
106 | ||
904a432c | 107 | [ "$quiet" ] && exec 1> /dev/null |
66b87493 GM |
108 | |
109 | ||
904a432c | 110 | echo "Running bzr status..." |
66b87493 GM |
111 | |
112 | bzr status -S $sources >| $tempfile || die "bzr status error for sources" | |
113 | ||
114 | while read stat file; do | |
115 | ||
116 | case $stat in | |
117 | M) | |
904a432c | 118 | echo "Locally modified: $file" |
66b87493 GM |
119 | [ "$force" ] || die "There are local modifications" |
120 | ;; | |
121 | ||
122 | *) die "Unexpected status ($stat) for $file" ;; | |
123 | esac | |
124 | done < $tempfile | |
125 | ||
126 | ||
904a432c | 127 | echo "Running autoreconf..." |
66b87493 | 128 | |
f6ca84c0 GM |
129 | autoreconf -i -I m4 2>| $tempfile |
130 | ||
131 | retval=$? | |
132 | ||
133 | ## Annoyingly, autoreconf puts the "installing `./foo' messages on stderr. | |
134 | if [ "$quiet" ]; then | |
135 | grep -v 'installing `\.' $tempfile 1>&2 | |
136 | else | |
137 | cat "$tempfile" 1>&2 | |
138 | fi | |
139 | ||
140 | [ $retval -ne 0 ] && die "autoreconf error" | |
66b87493 GM |
141 | |
142 | ||
143 | cp $genfiles autogen/ | |
144 | ||
145 | ||
146 | cd autogen | |
147 | ||
904a432c | 148 | echo "Checking status of generated files..." |
66b87493 GM |
149 | |
150 | bzr status -S $basegen >| $tempfile || \ | |
151 | die "bzr status error for generated files" | |
152 | ||
153 | ||
154 | modified= | |
155 | ||
156 | while read stat file; do | |
157 | ||
158 | [ "$stat" != "M" ] && die "Unexpected status ($stat) for generated $file" | |
159 | ||
160 | modified="$modified $file" | |
161 | ||
162 | done < $tempfile | |
163 | ||
164 | ||
165 | [ "$modified" ] || { | |
904a432c | 166 | echo "No files were modified" |
66b87493 GM |
167 | exit 0 |
168 | } | |
169 | ||
904a432c | 170 | echo "Modified file(s): $modified" |
66b87493 GM |
171 | |
172 | [ "$commit" ] || exit 0 | |
173 | ||
174 | ||
904a432c | 175 | echo "Committing..." |
66b87493 GM |
176 | |
177 | ## bzr status output is annoyingly always relative to top-level, not PWD. | |
178 | cd ../ | |
179 | ||
904a432c | 180 | bzr commit -m "Auto-commit of generated files." $modified || \ |
66b87493 GM |
181 | die "bzr commit error" |
182 | ||
183 | ||
904a432c | 184 | echo "Committed files: $modified" |
66b87493 GM |
185 | |
186 | exit | |
187 | ||
188 | ### update_autogen ends here |