#! /bin/sh
#
# import-gnulib.sh -- imports a copy of gnulib into findutils
# Copyright (C) 2003,2004,2005,2006,2007 Free Software Foundation, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
##########################################################################
#
# This script is intended to populate the "gnulib" directory
# with a subset of the gnulib code, as provided by "gnulib-tool".
#
# To use it, just run this script with the top-level sourec directory
# as your working directory.
# If CDPATH is set, it will sometimes print the name of the directory
# to which you have moved. Unsetting CDPATH prevents this, as does
# prefixing it with ".".
unset CDPATH
## Defaults
# cvsdir=/doesnotexist
git_repo="git://git.savannah.gnu.org/gnulib.git"
configfile="./import-gnulib.config"
need_checkout=yes
# Remember arguments for comments we inject into output files
original_cmd_line_args="$@"
usage() {
cat >&2 <&2
exit 1
fi
if ! [ -d "$gitdir" ] ; then
if mkdir "$gitdir" ; then
echo "Created $gitdir"
else
echo "Failed to create $gitdir" >&2
exit 1
fi
fi
(
# Change directory unconditionally. We used to do this to avoid
# the cvs client picking up defaults from findutils' ./CVS/*, but
# now we just do it for the sake of a minimum change.
cd $gitdir
if test -d gnulib/.git ; then
echo "Git repository was already initialised."
else
echo "Cloning the git repository..."
# In the future we may use a shallow clone to
# save bandwidth.
git clone "$git_repo"
fi
cd gnulib
set -x
git fetch origin
git checkout "$gnulib_version"
set +x
)
}
run_gnulib_tool() {
local tool="$1"
if test -f "$tool"
then
true
else
echo "$tool does not exist, did you specify the right directory?" >&2
exit 1
fi
if test -x "$tool"
then
true
else
echo "$tool is not executable" >&2
exit 1
fi
if [ -d gnulib ]
then
echo "Warning: directory gnulib already exists." >&2
else
mkdir gnulib
fi
set -x
if "$tool" --import --symlink --with-tests --dir=. --lib=libgnulib --source-base=gnulib/lib --m4-base=gnulib/m4 $modules
then
set +x
else
set +x
echo "$tool failed, exiting." >&2
exit 1
fi
# gnulib-tool does not remove broken symlinks leftover from previous runs;
# this assumes GNU find, but should be a safe no-op if it is not
find -L gnulib -lname '*' -delete 2>/dev/null || :
}
rehack() {
echo "Updating the license of $1"
# Use cp to get the permissions right first
cp -fp "$1" "$1".new
sed -e \
's/Free Software Foundation\([;,]\) either version [2]/Free Software Foundation\1 either version 3/' < "$1" > "$1".new
if cmp "$1" "$1".new >/dev/null
then
rm -f "$1".new
else
rm -f "$1" && mv "$1".new "$1"
fi
}
copyhack() {
src="$1"
dst="$2"
shift 2
if test -d "$dst"
then
dst="$dst"/"$(basename $src)"
fi
cp -fp "$src" "$dst" && rehack "$dst"
}
update_licenses() {
for f in $gpl3_update_files
do
rehack "$f" || exit
done
}
hack_gnulib_tool_output() {
local gnulibdir="${1}"
for file in $extra_files; do
case $file in
*/mdate-sh | */texinfo.tex) dest=doc;;
*) dest=build-aux;;
esac
copyhack "${gnulibdir}"/"$file" "$dest" || exit
done
cat > gnulib/Makefile.am < "${outfile}".new < /dev/null ; then
rm "${outfile}".new
return 0
fi
fi
mv "${outfile}".new "${outfile}"
}
move_cvsdir() {
local cvs_git_root=":pserver:anonymous@pserver.git.sv.gnu.org:/gnulib.git"
if test -d gnulib-cvs/gnulib/CVS
then
if test x"$(cat gnulib-cvs/gnulib/CVS/Root)" == x"$cvs_git_root"; then
# We cannot use the git-cvspserver interface because
# "update -D" doesn't work.
echo "WARNING: Migrating from git-cvs-pserver to native git..." >&2
savedir=gnulib-cvs.before-nativegit-migration
else
# The old CVS repository is not updated any more.
echo "WARNING: Migrating from old CVS repository to native git" >&2
savedir=gnulib-cvs.before-git-migration
fi
mv gnulib-cvs $savedir || exit 1
echo "Please delete $savedir eventually"
fi
}
main() {
## Option parsing
local gnulibdir=/doesnotexist
while getopts "d:a" opt
do
case "$opt" in
d) gnulibdir="$OPTARG" ; need_checkout=no ;;
a) refresh_output_files && update_licenses ; exit $? ;;
**) usage; exit 1;;
esac
done
# We need the config file to tell us which modules
# to use, even if we don't want to know the CVS version.
. $configfile || exit 1
## If -d was not given, do update
if [ $need_checkout = yes ] ; then
if ! git version > /dev/null; then
cat >&2 <&2
fi
## Invoke gnulib-tool to import the code.
local tool="${gnulibdir}"/gnulib-tool
if run_gnulib_tool "${tool}" &&
hack_gnulib_tool_output "${gnulibdir}" &&
refresh_output_files &&
update_licenses &&
update_version_file ; then
echo Done.
else
echo FAILED >&2
exit 1
fi
}
main "$@"