#! /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 "$@"