[PATCH UPDATED] cg-commit chokes when given a very large list of files
From: Bryan Larsen <hidden>
Date: 2016-06-15 22:42:02
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted> --- cg-Xlib | 18 ++++++++++++++++++ cg-commit | 6 +++--- 2 files changed, 21 insertions(+), 3 deletions(-)
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 }