cvsimport
[findutils.git] / import-gnulib.sh
Commit [+]AuthorDateLineData
09ef63fd jay2007-11-25 11:36:10 +00001#! /bin/sh
2#
3# import-gnulib.sh -- imports a copy of gnulib into findutils
4# Copyright (C) 2003,2004,2005,2006,2007 Free Software Foundation, Inc.
5#
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation, either version 3 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
19##########################################################################
20#
21# This script is intended to populate the "gnulib" directory
22# with a subset of the gnulib code, as provided by "gnulib-tool".
23#
24# To use it, just run this script with the top-level sourec directory
25# as your working directory.
26
27# If CDPATH is set, it will sometimes print the name of the directory
28# to which you have moved. Unsetting CDPATH prevents this, as does
29# prefixing it with ".".
30unset CDPATH
31
32## Defaults
33# cvsdir=/doesnotexist
f619bdc3 jay2007-11-29 11:07:18 +000034git_repo="git://git.savannah.gnu.org/gnulib.git"
09ef63fd jay2007-11-25 11:36:10 +000035configfile="./import-gnulib.config"
36need_checkout=yes
37
38
39# Remember arguments for comments we inject into output files
40original_cmd_line_args="$@"
41
42usage() {
43 cat >&2 <<EOF
44usage: $0 [-d gnulib-directory]
45
46The default behaviour is to check out the Gnulib code via anonymous
47CVS (or update it if there is a version already checked out). The
48checkout or update is performed to the gnulib version indicated in
49the configuration file $configfile.
50
51If you wish to work with a different version of gnulib, use the -d option
52to specify the directory containing the gnulib code.
53EOF
54}
55
56
57do_checkout () {
f619bdc3 jay2007-11-29 11:07:18 +000058 local gitdir="$1"
59 echo checking out gnulib from GIT in $gitdir
09ef63fd jay2007-11-25 11:36:10 +000060
61 if [ -z "$gnulib_version" ] ; then
62 echo "Error: There should be a gnulib_version setting in $configfile, but there is not." >&2
63 exit 1
64 fi
65
66
f619bdc3 jay2007-11-29 11:07:18 +000067 if ! [ -d "$gitdir" ] ; then
68 if mkdir "$gitdir" ; then
69 echo "Created $gitdir"
09ef63fd jay2007-11-25 11:36:10 +000070 else
f619bdc3 jay2007-11-29 11:07:18 +000071 echo "Failed to create $gitdir" >&2
09ef63fd jay2007-11-25 11:36:10 +000072 exit 1
73 fi
74 fi
75
09ef63fd jay2007-11-25 11:36:10 +000076 (
f619bdc3 jay2007-11-29 11:07:18 +000077 # Change directory unconditionally. We used to do this to avoid
78 # the cvs client picking up defaults from findutils' ./CVS/*, but
79 # now we just do it for the sake of a minimum change.
80 cd $gitdir
09ef63fd jay2007-11-25 11:36:10 +000081
f619bdc3 jay2007-11-29 11:07:18 +000082 if test -d gnulib/.git ; then
83 echo "Git repository was already initialised."
09ef63fd jay2007-11-25 11:36:10 +000084 else
f619bdc3 jay2007-11-29 11:07:18 +000085 echo "Cloning the git repository..."
86 # In the future we may use a shallow clone to
87 # save bandwidth.
88 git clone "$git_repo"
09ef63fd jay2007-11-25 11:36:10 +000089 fi
f619bdc3 jay2007-11-29 11:07:18 +000090 cd gnulib
09ef63fd jay2007-11-25 11:36:10 +000091 set -x
f619bdc3 jay2007-11-29 11:07:18 +000092 git fetch origin
93 git checkout "$gnulib_version"
09ef63fd jay2007-11-25 11:36:10 +000094 set +x
95 )
96}
97
98run_gnulib_tool() {
99 local tool="$1"
100 if test -f "$tool"
101 then
102 true
103 else
104 echo "$tool does not exist, did you specify the right directory?" >&2
105 exit 1
106 fi
107
108 if test -x "$tool"
109 then
110 true
111 else
112 echo "$tool is not executable" >&2
113 exit 1
114 fi
115
116
117 if [ -d gnulib ]
118 then
119 echo "Warning: directory gnulib already exists." >&2
120 else
121 mkdir gnulib
122 fi
123
124 set -x
125 if "$tool" --import --symlink --with-tests --dir=. --lib=libgnulib --source-base=gnulib/lib --m4-base=gnulib/m4 $modules
126 then
127 set +x
128 else
129 set +x
130 echo "$tool failed, exiting." >&2
131 exit 1
132 fi
133
134 # gnulib-tool does not remove broken symlinks leftover from previous runs;
135 # this assumes GNU find, but should be a safe no-op if it is not
136 find -L gnulib -lname '*' -delete 2>/dev/null || :
137}
138
139rehack() {
140 echo "Updating the license of $1"
141 # Use cp to get the permissions right first
142 cp -fp "$1" "$1".new
143 sed -e \
144's/Free Software Foundation\([;,]\) either version [2]/Free Software Foundation\1 either version 3/' < "$1" > "$1".new
145 if cmp "$1" "$1".new >/dev/null
146 then
147 rm -f "$1".new
148 else
149 rm -f "$1" && mv "$1".new "$1"
150 fi
151}
152
153
154
155copyhack() {
156 src="$1"
157 dst="$2"
158 shift 2
159 if test -d "$dst"
160 then
161 dst="$dst"/"$(basename $src)"
162 fi
163 cp -fp "$src" "$dst" && rehack "$dst"
164
165}
166
167
168update_licenses() {
169 for f in $gpl3_update_files
170 do
171 rehack "$f" || exit
172 done
173}
174
175
176
177hack_gnulib_tool_output() {
178 local gnulibdir="${1}"
179 for file in $extra_files; do
180 case $file in
181 */mdate-sh | */texinfo.tex) dest=doc;;
182 *) dest=build-aux;;
183 esac
184 copyhack "${gnulibdir}"/"$file" "$dest" || exit
185 done
186
187
188
189
190 cat > gnulib/Makefile.am <<EOF
191# Copyright (C) 2004 Free Software Foundation, Inc.
192#
193# This file is free software, distributed under the terms of the GNU
194# General Public License. As a special exception to the GNU General
195# Public License, this file may be distributed as part of a program
196# that contains a configuration script generated by Automake, under
197# the same distribution terms as the rest of that program.
198#
199# This file was generated by $0 $original_cmd_line_args.
200#
201SUBDIRS = lib
202EOF
203}
204
205
206refresh_output_files() {
207 aclocal -I m4 -I gnulib/m4 &&
208 autoheader &&
209 autoconf &&
210 automake --add-missing --copy
211}
212
213
214update_version_file() {
215 local ver
216 outfile="lib/gnulib-version.c"
217 if [ -z "$gnulib_version" ] ; then
218 ver="unknown (locally modified code; no version number available)"
219 else
220 ver="$gnulib_version"
221 fi
222
223
224 cat > "${outfile}".new <<EOF
225/* This file is automatically generated by $0 and simply records which version of gnulib we used. */
226const char * const gnulib_version = "$ver";
227EOF
228 if test -f "$outfile" ; then
229 if diff "${outfile}".new "${outfile}" > /dev/null ; then
230 rm "${outfile}".new
231 return 0
232 fi
233 fi
234 mv "${outfile}".new "${outfile}"
235}
236
237
f619bdc3 jay2007-11-29 11:07:18 +0000238move_cvsdir() {
239 local cvs_git_root=":pserver:anonymous@pserver.git.sv.gnu.org:/gnulib.git"
240
241 if test -d gnulib-cvs/gnulib/CVS
242 then
243 if test x"$(cat gnulib-cvs/gnulib/CVS/Root)" == x"$cvs_git_root"; then
244 # We cannot use the git-cvspserver interface because
245 # "update -D" doesn't work.
246 echo "WARNING: Migrating from git-cvs-pserver to native git..." >&2
247 savedir=gnulib-cvs.before-nativegit-migration
248 else
249 # The old CVS repository is not updated any more.
250 echo "WARNING: Migrating from old CVS repository to native git" >&2
251 savedir=gnulib-cvs.before-git-migration
252 fi
253 mv gnulib-cvs $savedir || exit 1
254 echo "Please delete $savedir eventually"
255 fi
256}
257
09ef63fd jay2007-11-25 11:36:10 +0000258main() {
259 ## Option parsing
260 local gnulibdir=/doesnotexist
261 while getopts "d:a" opt
262 do
263 case "$opt" in
264 d) gnulibdir="$OPTARG" ; need_checkout=no ;;
265 a) refresh_output_files && update_licenses ; exit $? ;;
266 **) usage; exit 1;;
267 esac
268 done
269
270 # We need the config file to tell us which modules
271 # to use, even if we don't want to know the CVS version.
272 . $configfile || exit 1
273
f619bdc3 jay2007-11-29 11:07:18 +0000274 ## If -d was not given, do update
09ef63fd jay2007-11-25 11:36:10 +0000275 if [ $need_checkout = yes ] ; then
f619bdc3 jay2007-11-29 11:07:18 +0000276 if ! git version > /dev/null; then
277 cat >&2 <<EOF
278You now need the tool 'git' in order to check out the correct version
279of the gnulib code. See http://git.or.cz/ for more information about git.
280EOF
281 exit 1
282 fi
283 move_cvsdir
284 do_checkout gnulib-git
285 gnulibdir=gnulib-git/gnulib
09ef63fd jay2007-11-25 11:36:10 +0000286 else
287 echo "Warning: using gnulib code which already exists in $gnulibdir" >&2
288 fi
289
290 ## Invoke gnulib-tool to import the code.
291 local tool="${gnulibdir}"/gnulib-tool
292
293 if run_gnulib_tool "${tool}" &&
294 hack_gnulib_tool_output "${gnulibdir}" &&
295 refresh_output_files &&
296 update_licenses &&
297 update_version_file ; then
298 echo Done.
299 else
300 echo FAILED >&2
301 exit 1
302 fi
303}
304
305main "$@"