2010-11-16 08:00:48 -06:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
#
|
|
|
|
# Wrapper for git to handle more subdirs at the same time
|
|
|
|
#
|
2010-11-22 03:11:56 -06:00
|
|
|
|
2010-11-16 08:00:48 -06:00
|
|
|
# no params, no action
|
|
|
|
if [ "$#" -eq "0" ] ; then
|
|
|
|
git
|
|
|
|
echo
|
|
|
|
echo "Additional options available only in this 'g' wrapper:"
|
|
|
|
echo
|
|
|
|
echo "Usage: g [options] [git commands]"
|
|
|
|
echo " -f Force - act on all the repos, not only the changed ones"
|
|
|
|
echo " -s Silent - do not report the repo names."
|
2011-05-01 03:26:45 -05:00
|
|
|
echo " -1 report the repos name on the first line of the output as <repo>:"
|
2011-08-27 23:41:47 -05:00
|
|
|
echo " -z just to some house cleaning (hooks mostly). this is a stand-alone option as in ./g -z"
|
2011-02-10 10:28:03 -06:00
|
|
|
echo " --set-push-user [username] re-write an existing tree's config with an fd.o commit account name"
|
2010-11-16 08:00:48 -06:00
|
|
|
exit $?
|
|
|
|
fi
|
|
|
|
|
2011-09-05 13:45:43 -05:00
|
|
|
if [ ! "`type -p git`" ]; then
|
|
|
|
echo "Cannot find the git binary! Is git installed and is in PATH?"
|
|
|
|
exit 1
|
|
|
|
fi
|
2010-11-16 08:00:48 -06:00
|
|
|
|
2011-08-27 23:41:18 -05:00
|
|
|
pushd $(dirname $0) > /dev/null
|
|
|
|
COREDIR=$(pwd)
|
|
|
|
popd > /dev/null
|
|
|
|
|
|
|
|
refresh_hooks()
|
2010-11-24 17:13:14 -06:00
|
|
|
{
|
2011-08-27 23:41:18 -05:00
|
|
|
repo=$1
|
|
|
|
case "$repo" in
|
|
|
|
core)
|
|
|
|
pushd $COREDIR > /dev/null
|
|
|
|
for hook_name in $(ls -1 $COREDIR/git-hooks) ; do
|
|
|
|
hook=".git/hooks/$hook_name"
|
|
|
|
if [ ! -x "$hook" -a ! -L "$hook" ] ; then
|
|
|
|
rm -f "$hook"
|
|
|
|
ln -s "git-hooks/$hook_name" "$hook"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
popd > /dev/null
|
|
|
|
;;
|
|
|
|
translations)
|
|
|
|
if [ -d $COREDIR/clone/translations ] ; then
|
|
|
|
pushd $COREDIR/clone/translations > /dev/null
|
|
|
|
for hook_name in $(ls -1 $COREDIR/clone/translations/git-hooks) ; do
|
|
|
|
hook=".git/hooks/$hook_name"
|
|
|
|
rm -f "$hook"
|
|
|
|
ln -sf "git-hooks/$hook_name" "$hook"
|
|
|
|
done
|
|
|
|
# .gitattribute should be per-repo, avoid entangling repos
|
|
|
|
if [ -L .gitattributes ] ; then
|
|
|
|
rm -f .gitattributes
|
|
|
|
fi
|
|
|
|
popd > /dev/null
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
help|dictionaries)
|
2011-08-28 11:21:34 -05:00
|
|
|
if [ -d $COREDIR/clone/$repo ] ; then
|
|
|
|
pushd $COREDIR/clone/$repo > /dev/null
|
2011-08-27 23:41:18 -05:00
|
|
|
# fixme: we should really keep these per-repo to
|
|
|
|
# keep the repos independant. since these two
|
|
|
|
# are realy not independant yet, we keep using core's hooks
|
|
|
|
for hook_name in $(ls -1 $COREDIR/git-hooks) ; do
|
|
|
|
hook=".git/hooks/$hook_name"
|
|
|
|
rm -f "$hook"
|
|
|
|
ln -sf "$COREDIR/git-hooks/$hook_name" "$hook"
|
|
|
|
done
|
|
|
|
# .gitattribute should be per-repo, avoid entangling repos
|
|
|
|
if [ -L .gitattributes ] ; then
|
|
|
|
rm -f .gitattributes
|
|
|
|
fi
|
|
|
|
popd > /dev/null
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
refresh_all_hooks()
|
|
|
|
{
|
|
|
|
repos="core $(cat "$COREDIR/bin/repo-list")"
|
|
|
|
for repo in $repos ; do
|
|
|
|
refresh_hooks $repo
|
2010-11-24 17:13:14 -06:00
|
|
|
done
|
2011-08-27 23:41:18 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
postprocess()
|
|
|
|
{
|
|
|
|
rc=$1
|
|
|
|
if $DO_HOOK_REFRESH ; then
|
|
|
|
refresh_all_hooks
|
2011-03-12 16:37:38 -06:00
|
|
|
fi
|
2011-08-27 23:41:18 -05:00
|
|
|
|
|
|
|
exit $rc;
|
2010-11-24 17:13:14 -06:00
|
|
|
}
|
|
|
|
|
2011-08-27 23:41:18 -05:00
|
|
|
CLONEDIR="$COREDIR/clone"
|
|
|
|
if [ ! -e ${CLONEDIR} ]; then mkdir -p "$CLONEDIR"; fi
|
|
|
|
|
2010-11-16 08:00:48 -06:00
|
|
|
# extra params for some commands, like log
|
|
|
|
EXTRA=
|
|
|
|
COMMAND="$1"
|
|
|
|
PAGER=
|
|
|
|
RELATIVIZE=1
|
|
|
|
PUSH_ALL=
|
|
|
|
ALLOW_EMPTY=
|
|
|
|
KEEP_GOING=0
|
|
|
|
REPORT_REPOS=1
|
2011-05-01 03:26:45 -05:00
|
|
|
REPORT_COMPACT=0
|
2011-08-27 23:41:18 -05:00
|
|
|
DO_HOOK_REFRESH=false
|
2010-11-16 08:00:48 -06:00
|
|
|
|
|
|
|
while [ "${COMMAND:0:1}" = "-" ] ; do
|
|
|
|
case "$COMMAND" in
|
|
|
|
-f) KEEP_GOING=1
|
|
|
|
;;
|
|
|
|
-s) REPORT_REPOS=0
|
|
|
|
;;
|
2011-08-27 23:41:47 -05:00
|
|
|
-1) REPORT_COMPACT=1
|
2011-05-01 03:26:45 -05:00
|
|
|
;;
|
2011-08-27 23:41:47 -05:00
|
|
|
--set-push-user)
|
|
|
|
shift
|
|
|
|
PUSH_USER="$1"
|
|
|
|
;;
|
|
|
|
-z)
|
|
|
|
DO_HOOK_REFRESH=true
|
|
|
|
postprocess 0
|
|
|
|
;;
|
2010-11-16 08:00:48 -06:00
|
|
|
esac
|
|
|
|
shift
|
|
|
|
COMMAND="$1"
|
|
|
|
done
|
|
|
|
|
|
|
|
case "$COMMAND" in
|
|
|
|
apply)
|
|
|
|
EXTRA="-p0 --stat --apply --index --ignore-space-change --whitespace=error"
|
|
|
|
RELATIVIZE=0
|
|
|
|
;;
|
2011-08-27 23:41:18 -05:00
|
|
|
clone|fetch|pull)
|
|
|
|
DO_HOOK_REFRESH=true
|
|
|
|
;;
|
2010-11-16 08:00:48 -06:00
|
|
|
diff)
|
|
|
|
PAGER='--no-pager'
|
|
|
|
REPORT_REPOS=0
|
|
|
|
;;
|
|
|
|
log)
|
|
|
|
if [ "$#" = "1" ] ; then
|
|
|
|
EXTRA='-1'
|
|
|
|
fi
|
|
|
|
PAGER='--no-pager'
|
|
|
|
;;
|
|
|
|
push)
|
|
|
|
if [ "$#" != "1" ] ; then
|
|
|
|
PUSH_ALL=1
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
# absolutize the parameters first
|
|
|
|
unset FILES
|
|
|
|
FILESNUM=0
|
|
|
|
while shift ; do
|
|
|
|
PARAM="$1"
|
|
|
|
if [ -z "$PARAM" ] ; then
|
|
|
|
continue
|
|
|
|
elif [ "${PARAM:0:1}" = "-" ] ; then
|
|
|
|
if [ \( "$COMMAND" = "checkout" -a "$PARAM" = "-b" \) -o \
|
|
|
|
\( "$COMMAND" = "clone" -a "$PARAM" = "--reference" \) -o \
|
|
|
|
\( "$COMMAND" = "commit" -a "$PARAM" = "-m" \) -o \
|
|
|
|
\( "$COMMAND" = "commit" -a "$PARAM" = "-am" \) -o \
|
|
|
|
\( "$COMMAND" = "tag" -a "$PARAM" = "-m" \) ]
|
|
|
|
then
|
|
|
|
# params that take an argument
|
|
|
|
FILES[$FILESNUM]="$PARAM"
|
|
|
|
FILESNUM=$(($FILESNUM+1))
|
|
|
|
shift
|
|
|
|
FILES[$FILESNUM]="$1"
|
|
|
|
FILESNUM=$(($FILESNUM+1))
|
|
|
|
else
|
2011-03-07 07:53:08 -06:00
|
|
|
if [ "$COMMAND" = "commit" -a "$PARAM" = "-F" ]
|
|
|
|
then
|
|
|
|
shift
|
|
|
|
# this still needs some magic to handle relative paths
|
|
|
|
EXTRA="${EXTRA} -F ${1}"
|
|
|
|
else
|
|
|
|
[ "$COMMAND" = "commit" -a "$PARAM" = "--allow-empty" ] && ALLOW_EMPTY=1
|
|
|
|
FILES[$FILESNUM]="$PARAM"
|
|
|
|
FILESNUM=$(($FILESNUM+1))
|
|
|
|
fi
|
2010-11-16 08:00:48 -06:00
|
|
|
fi
|
|
|
|
else
|
|
|
|
if [ "$COMMAND" = "apply" ] ; then
|
|
|
|
grep -qs $'^+ *\t' "$PARAM" && {
|
|
|
|
echo "Patch '$PARAM' introduces tabs in indentation, aborting."
|
|
|
|
echo
|
|
|
|
echo "Please fix the patch (something like s/^\(+ *\)\t/\1 /) and try again."
|
|
|
|
echo
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
fi
|
|
|
|
|
|
|
|
# make the paths absolute
|
2010-12-03 04:16:47 -06:00
|
|
|
FILES[$FILESNUM]=$(perl -e 'use Cwd "abs_path"; print abs_path(shift);' "$PARAM")
|
2010-11-16 08:00:48 -06:00
|
|
|
if [ -z "${FILES[$FILESNUM]}" -o ! -e "${FILES[$FILESNUM]}" ] ; then
|
|
|
|
# it is probably not a file, but a tag name, or something
|
|
|
|
FILES[$FILESNUM]="$PARAM"
|
|
|
|
fi
|
|
|
|
FILESNUM=$(($FILESNUM+1))
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
# do it!
|
2011-07-21 10:18:13 -05:00
|
|
|
DIRS="core $(cd $CLONEDIR ; ls)"
|
2010-11-16 08:00:48 -06:00
|
|
|
if [ "$COMMAND" = "clone" ] ; then
|
2011-08-27 23:41:18 -05:00
|
|
|
DIRS=$(cat "$COREDIR/bin/repo-list")
|
2010-11-16 08:00:48 -06:00
|
|
|
fi
|
2010-11-19 04:20:18 -06:00
|
|
|
for REPO in $DIRS ; do
|
|
|
|
DIR="$CLONEDIR/$REPO"
|
|
|
|
NAME="$REPO"
|
2011-07-21 10:18:13 -05:00
|
|
|
if [ "$REPO" = "core" ] ; then
|
2011-08-27 23:41:18 -05:00
|
|
|
DIR="$COREDIR"
|
2010-11-16 08:16:36 -06:00
|
|
|
NAME="main repo"
|
|
|
|
fi
|
|
|
|
|
2011-02-10 10:28:03 -06:00
|
|
|
if [ -d "$DIR" -a "z$PUSH_USER" != "z" ]; then
|
|
|
|
echo "setting up push url for $DIR"
|
|
|
|
(cd $DIR && git config remote.origin.pushurl "ssh://${PUSH_USER}@git.freedesktop.org/git/libreoffice/${REPO}")
|
2011-01-20 10:03:48 -06:00
|
|
|
elif [ \( -d "$DIR" -a -d "$DIR"/.git \) -o \( "$COMMAND" = "clone" \) ] ; then
|
2010-11-16 08:00:48 -06:00
|
|
|
(
|
|
|
|
# executed in a subshell
|
2010-11-19 04:20:18 -06:00
|
|
|
if [ "$COMMAND" != "clone" ] ; then
|
|
|
|
cd "$DIR"
|
|
|
|
else
|
|
|
|
cd "$CLONEDIR"
|
|
|
|
fi
|
2010-11-16 08:00:48 -06:00
|
|
|
|
|
|
|
# relativize the absolutized params again if we want to operate
|
|
|
|
# only on the files belonging to this exact repo
|
|
|
|
if [ "$RELATIVIZE" = "1" -a -n "$FILES" ] ; then
|
|
|
|
FILESNUM=0
|
|
|
|
INSERTNUM=0
|
2010-12-03 04:16:47 -06:00
|
|
|
PWD=$(pwd)
|
|
|
|
PWDLEN=$(pwd | wc -c)
|
2010-11-16 08:00:48 -06:00
|
|
|
for I in "${FILES[@]}" ; do
|
2010-11-19 04:20:18 -06:00
|
|
|
I="${I//@REPO@/${REPO}}"
|
2010-11-16 08:00:48 -06:00
|
|
|
unset FILES[$FILESNUM]
|
|
|
|
FILESNUM=$(($FILESNUM+1))
|
|
|
|
# filter out files that don't belong to this repo
|
|
|
|
if [ \( "${I:0:1}" = "/" \) -a \( "$COMMAND" != "clone" \) ] ; then
|
|
|
|
if [ "${I:0:$PWDLEN}" = "$PWD/" ] ; then
|
|
|
|
FILES[$INSERTNUM]="${I:$PWDLEN}"
|
|
|
|
INSERTNUM=$(($INSERTNUM+1))
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
FILES[$INSERTNUM]="$I"
|
|
|
|
INSERTNUM=$(($INSERTNUM+1))
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
[ "$INSERTNUM" = "0" ] && exit 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
# some extra params
|
|
|
|
case "$COMMAND" in
|
|
|
|
apply)
|
|
|
|
for I in * ; do
|
|
|
|
if [ -d "$I" ] ; then
|
|
|
|
EXTRA="$EXTRA --include=$I/*"
|
|
|
|
else
|
|
|
|
EXTRA="$EXTRA --include=$I"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
;;
|
|
|
|
commit)
|
|
|
|
if [ "$ALLOW_EMPTY" != "1" ] ; then
|
2010-12-03 04:16:47 -06:00
|
|
|
[ -z "$(git diff-index --name-only HEAD --)" ] && exit 0
|
2010-11-16 08:00:48 -06:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
push)
|
|
|
|
if [ "$PUSH_ALL" != "1" ] ; then
|
2010-12-03 04:16:47 -06:00
|
|
|
[ -n "$(git rev-list origin..HEAD)" ] || exit 0
|
2010-11-16 08:00:48 -06:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
status)
|
2010-12-03 04:16:47 -06:00
|
|
|
LOCALCOMMITS="$(git rev-list origin..HEAD)"
|
2010-11-16 08:00:48 -06:00
|
|
|
if [ -z "$LOCALCOMMITS" ] ; then
|
2010-12-03 04:16:47 -06:00
|
|
|
[ -z "$(git diff-index --name-only HEAD --)" ] && exit 0
|
2010-11-16 08:00:48 -06:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
clone)
|
2010-11-20 23:00:47 -06:00
|
|
|
EXTRA="$(git config remote.origin.url)"
|
2011-07-21 10:18:13 -05:00
|
|
|
EXTRA=${EXTRA/core/${REPO}}
|
2010-11-16 08:00:48 -06:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
# do it!
|
2011-05-01 03:26:45 -05:00
|
|
|
if [ "$COMMAND" != "clone" -o ! -d $DIR ] ; then
|
2011-05-18 09:37:05 -05:00
|
|
|
if [ "$REPORT_REPOS" = "1" -a "$COMMAND" != "grep" ] ; then
|
2011-05-01 03:26:45 -05:00
|
|
|
if [ "$REPORT_COMPACT" = "1" ] ; then
|
|
|
|
echo -n "${REPO}:"
|
|
|
|
else
|
|
|
|
echo "===== $NAME ====="
|
|
|
|
fi
|
|
|
|
fi
|
2010-12-05 00:44:39 -06:00
|
|
|
git $PAGER "$COMMAND" $EXTRA "${FILES[@]}"
|
|
|
|
RETURN=$?
|
2011-05-01 03:26:45 -05:00
|
|
|
fi
|
2010-11-16 08:00:48 -06:00
|
|
|
|
|
|
|
# now we can change the dir in case of clone as well
|
2010-11-24 17:13:14 -06:00
|
|
|
if [ "$COMMAND" = "clone" ] ; then
|
|
|
|
cd $DIR
|
|
|
|
fi
|
2010-11-16 08:00:48 -06:00
|
|
|
|
|
|
|
case "$COMMAND" in
|
|
|
|
pull|clone)
|
|
|
|
# update links
|
2011-08-27 23:41:18 -05:00
|
|
|
if [ "$DIR" != "$COREDIR" ]; then
|
2011-01-20 09:44:25 -06:00
|
|
|
for link in $(ls) ; do
|
2011-08-27 23:41:18 -05:00
|
|
|
if [ ! -e "$COREDIR/$link" ] ; then
|
|
|
|
if test -h "$COREDIR/$link"; then
|
|
|
|
rm "$COREDIR/$link"
|
2011-01-20 09:44:25 -06:00
|
|
|
echo -n "re-"
|
|
|
|
fi
|
2011-05-06 08:37:19 -05:00
|
|
|
echo "creating missing link $link"
|
2011-08-27 23:41:18 -05:00
|
|
|
ln -s "$DIR/$link" "$COREDIR/$link"
|
2011-01-20 09:44:25 -06:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
fi
|
2010-11-16 08:00:48 -06:00
|
|
|
;;
|
|
|
|
status)
|
|
|
|
# git status returns error in some versions, clear that
|
|
|
|
RETURN=0
|
|
|
|
;;
|
|
|
|
grep)
|
|
|
|
# git grep return an 'error' if nothing is found
|
|
|
|
# still we should continue grepping the other repos
|
|
|
|
RETURN=0
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
if [ "$KEEP_GOING" = "1" ] ; then
|
|
|
|
RETURN=0
|
|
|
|
fi
|
|
|
|
|
|
|
|
exit $RETURN
|
2011-08-27 23:41:18 -05:00
|
|
|
) || postprocess $?
|
2010-11-16 08:00:48 -06:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
# Cleanup the broken links
|
|
|
|
if [ "$COMMAND" = "pull" ] ; then
|
2011-08-27 23:41:18 -05:00
|
|
|
for link in $(ls $COREDIR) ; do
|
|
|
|
if [ -h "$COREDIR/$link" -a ! -e "$COREDIR/$link" ]; then
|
2010-11-16 08:00:48 -06:00
|
|
|
echo "Removing broken link $link"
|
2011-08-27 23:41:18 -05:00
|
|
|
rm $COREDIR/$link
|
2010-11-16 08:00:48 -06:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
|
|
|
|
# warn
|
|
|
|
if [ "$COMMAND" = "apply" ] ; then
|
|
|
|
echo
|
|
|
|
echo "Don't forget to check the status & commit now ;-)"
|
|
|
|
echo
|
|
|
|
fi
|
|
|
|
|
2011-08-27 23:41:18 -05:00
|
|
|
postprocess $?
|
|
|
|
|
2010-11-16 08:00:48 -06:00
|
|
|
# vi:set shiftwidth=4 expandtab:
|