build: Add the 'g' wrapper to the bootstrap repo.

This is the first step in removing the need for the 'build' repository, and
its 'rawbuild' hack.
This commit is contained in:
Jan Holesovsky 2010-11-16 15:00:48 +01:00 committed by Norbert Thiebaud
parent 4c8c8751e5
commit a694de19b4
2 changed files with 461 additions and 6 deletions

219
.gitignore vendored
View file

@ -2,6 +2,9 @@
*~
.*.sw[op]
# where the 'subrepos' are located
/clone
# the build directories
/*/unxlng??
/*/unxlng??.pro
@ -9,13 +12,217 @@
/*/wntmsci??.pro
# autoconf generated stuff
/ChangeLog
/configure
/aclocal.m4
/autom4te.cache
/bootstrap
/ChangeLog
/config.log
/config.parms
/config.status
/configure
/Makefile
/makefile.mk
/set_soenv
/visibility.cxx
/*.Set.sh
/*/*.exe
instsetoo_native/util/LibreOffice*
instsetoo_native/util/tmon.out
/*/unxmac??
/*/unxmac??.pro
# links to the other repositories
MathMLDTD
Mesa
UnoControls
accessibility
afms
animations
apache-commons
apple_remote
autodoc
automation
avmedia
basctl
basebmp
basegfx
basic
bean
beanshell
berkeleydb
binfilter
boost
bridges
cairo
canvas
chart2
cli_ure
codemaker
comphelper
configmgr
connectivity
cosv
cppcanvas
cppu
cppuhelper
cppunit
cpputools
crashrep
cui
curl
dbaccess
default_images
desktop
dictionaries
drawinglayer
dtrans
editeng
embeddedobj
embedserv
epm
eventattacher
expat
extensions
external
external_images
extras
fileaccess
filter
forms
formula
fpicker
framework
graphite
helpcontent2
hsqldb
hunspell
hwpfilter
hyphen
i18npool
i18nutil
icc
icu
idl
idlc
io
javainstaller2
javaunohelper
jfreereport
jpeg
jurt
jvmaccess
jvmfwk
l10ntools
languagetool
libegg
libtextcat
libwpd
libwpg
libwps
libxml2
libxmlsec
libxslt
lingucomponent
linguistic
lotuswordpro
lpsolve
lucene
mdds
migrationanalysis
more_fonts
moz
mysqlc
mysqlcppconn
mythes
neon
nlpsolver
np_sdk
nss
o3tl
odk
offapi
officecfg
offuh
ooo_custom_images
oovbaapi
oox
openssl
package
packimages
padmin
postprocess
psprint_config
python
pyuno
qadevOOo
rdbmaker
readlicense_oo
redland
regexp
registry
remotebridges
reportbuilder
reportdesign
rhino
ridljar
rsc
sal
salhelper
sane
sax
saxon
sc
scaddins
sccomp
scripting
sd
sdext
setup_native
sfx2
shell
slideshow
smoketestoo_native
sot
starmath
stax
stoc
store
svl
svtools
svx
sw
swext
sysui
test
testautomation
testgraphical
testtools
tomcat
toolkit
tools
twain
ucb
ucbhelper
udkapi
udm
unixODBC
unodevtools
unoil
unotools
unoxml
ure
uui
vbahelper
vcl
vigra
wizards
writerfilter
writerperfect
x11_extensions
xmerge
xml2cmp
xmlhelp
xmloff
xmlscript
xmlsecurity
xpdf
xsltml
zlib

248
g Executable file
View file

@ -0,0 +1,248 @@
#!/usr/bin/env bash
#
# Wrapper for git to handle more subdirs at the same time
#
# 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."
exit $?
fi
CLONEDIR=`perl -e 'use Cwd "abs_path"; print abs_path(shift);' $0 | sed -e ' s/\/g$/\/clone/'`
if [ ! -e ${CLONEDIR} ]; then mkdir -p $CLONEDIR; fi
RAWBUILDDIR=`perl -e 'use Cwd "abs_path"; print abs_path(shift);' $0 | sed -e ' s/\/g$//'`
if [ ! -e ${RAWBUILDDIR} ]; then mkdir -p $RAWBUILDDIR; fi
# extra params for some commands, like log
EXTRA=
COMMAND="$1"
PAGER=
RELATIVIZE=1
PUSH_ALL=
ALLOW_EMPTY=
KEEP_GOING=0
REPORT_REPOS=1
while [ "${COMMAND:0:1}" = "-" ] ; do
case "$COMMAND" in
-f) KEEP_GOING=1
;;
-s) REPORT_REPOS=0
;;
esac
shift
COMMAND="$1"
done
case "$COMMAND" in
apply)
EXTRA="-p0 --stat --apply --index --ignore-space-change --whitespace=error"
RELATIVIZE=0
;;
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
[ "$COMMAND" = "commit" -a "$PARAM" = "--allow-empty" ] && ALLOW_EMPTY=1
FILES[$FILESNUM]="$PARAM"
FILESNUM=$(($FILESNUM+1))
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
FILES[$FILESNUM]=`perl -e 'use Cwd "abs_path"; print abs_path(shift);' "$PARAM"`
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!
cd "$CLONEDIR"
DIRS=". `ls`"
if [ "$COMMAND" = "clone" ] ; then
DIRS="artwork base calc components extensions extras filters
help impress libs-core libs-extern libs-extern-sys libs-gui
postprocess sdk testing ure writer"
fi
for DIR in $DIRS ; do
if [ \( -d "$DIR" -a -d "$DIR"/.git \) -o \( "$COMMAND" = "clone" \) ] ; then
(
# executed in a subshell
[ "$COMMAND" != "clone" ] && cd $DIR
# 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
PWD=`pwd`
PWDLEN=`pwd | wc -c`
for I in "${FILES[@]}" ; do
I="${I//@REPO@/${DIR}}"
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
[ -z "`git diff-index --name-only HEAD --`" ] && exit 0
fi
;;
push)
if [ "$PUSH_ALL" != "1" ] ; then
[ -n "`git rev-list origin..HEAD`" ] || exit 0
fi
;;
status)
LOCALCOMMITS="`git rev-list origin..HEAD`"
if [ -z "$LOCALCOMMITS" ] ; then
[ -z "`git diff-index --name-only HEAD --`" ] && exit 0
fi
;;
clone)
if [ -z "$FILES" ]; then
EXTRA="$(git config remote.origin.url|sed 's|/[^/]\+$||')/${DIR}"
fi
;;
esac
[ "$REPORT_REPOS" = "1" ] && echo "===== $DIR ====="
# check for changes
HEADREF=`git show-ref --head HEAD`
# do it!
git $PAGER "$COMMAND" $EXTRA "${FILES[@]}"
RETURN=$?
# now we can change the dir in case of clone as well
[ "$COMMAND" = "clone" ] && cd $DIR
# update stamp if the repo changed
NEWHEADREF=`git show-ref --head HEAD`
[ "$HEADREF" != "$NEWHEADREF" ] && touch $CLONEDIR/repos_changed
case "$COMMAND" in
pull|clone)
# update links
for link in `ls` ; do
if [ ! -e "$RAWBUILDDIR/$link" ] ; then
echo "Creating missing link $link"
ln -s "$CLONEDIR/$DIR/$link" "$RAWBUILDDIR/$link"
fi
done
;;
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
) || exit $?
fi
done
# Cleanup the broken links
if [ "$COMMAND" = "pull" ] ; then
for link in `ls $RAWBUILDDIR` ; do
if [ -h "$RAWBUILDDIR/$link" -a ! -e "$RAWBUILDDIR/$link" ]; then
echo "Removing broken link $link"
rm $RAWBUILDDIR/$link
fi
done
fi
# warn
if [ "$COMMAND" = "apply" ] ; then
echo
echo "Don't forget to check the status & commit now ;-)"
echo
fi
# vi:set shiftwidth=4 expandtab: