cg-commit currently chokes when passed a very large list of files. Fix it.
Resent again. This time we completely avoid messing with IFS, resulting in support for filenames with line feeds.
Signed-off-by: Bryan Larsen <bryan.larsen@gmail.com> ---
cg-Xlib | 18 ++++++++++++++++++ cg-commit | 6 +++--- 2 files changed, 21 insertions(+), 3 deletions(-)
Show changes to 2 files +21 −3
cg-Xlib, cg-commit
diff --git a/cg-Xlib b/cg-Xlib --- a/cg-Xlib +++ b/cg-Xlib @@ -49,6 +49,24 @@ mktemp () { $(which mktemp) $dirarg $prefix"$1" } + +# this function is useful when you want to execute a command that's bigger +# than the system's limit. +# +# this is similar to piping output to xargs -0r +# +# example usage: eval_via_xargs "git-update-cache --add --" "$@" +eval_via_xargs () { + local cmd=$1 + shift + if [ "$1" ] ; then + ( for f in "$@" ; do + echo -ne ${f}\\000 + done ) | xargs -0 $cmd + fi +} + + stat () { if [ "$1" != "-c" ] || [ "$2" != "%s" ]; then echo "INTERNAL ERROR: Unsupported stat call $@" >&2 diff --git a/cg-commit b/cg-commit --- a/cg-commit +++ b/cg-commit @@ -289,9 +289,9 @@ precommit_update () { eval "queue$op[\${#queue$op[@]}]=\"\$fname\"" done # XXX: Do we even need to do the --add and --remove update-caches? - [ "$queueN" ] && { git-update-cache --add ${infoonly} -- "${queueN[@]}" || return 1; } - [ "$queueD" ] && { git-update-cache --force-remove -- "${queueD[@]}" || return 1; } - [ "$queueM" ] && { git-update-cache ${infoonly} -- "${queueM[@]}" || return 1; } + eval_via_xargs "git-update-cache --add ${infoonly} --" "${queueN[@]}" || return 1 + eval_via_xargs "git-update-cache --force-remove --" "${queueD[@]}" || return 1 + eval_via_xargs "git-update-cache ${infoonly} --" "${queueM[@]}" || return 1 return 0 }