Fixes the filename handling in cg-commit.
To allow spaces in the filenames, the filenames are kept in an array. (The trick with zero bytes is harder to do when storing the filenames in a variable). "${commitfiles[@]}" is used where the filenames are needed as separate arguments, this expands into "file 1" "file 2" ... "${commitfiles[*]}" is used when a check is made for the existence of the parameter, this expands into "file1 file 2 ..."
The eval changedfiles=($(... | sed ...)) is used to place the result of git-diff-cache into the array. (I couldn't find a cleaner solution to do this)
Signed-off-by: Jan Veldeman <Jan.Veldeman@advalvas.be>
Show changes to diff +9 −8
Index: cogito/cg-commit =================================================================== --- cogito.orig/cg-commit 2005-05-05 17:13:44.000000000 +0200 +++ cogito/cg-commit 2005-05-05 17:34:37.000000000 +0200 @@ -22,8 +22,8 @@ fi if [ "$1" ]; then - commitfiles="$@" - customfiles=$commitfiles + commitfiles=("$@") + customfiles="${commitfiles[*]}" [ "$ignorecache" ] && die "-C and listing files to commit does not make sense" [ -s .git/merging ] && die "cannot commit individual files when merging" @@ -37,8 +37,9 @@ # be committed along automagically as well. if [ ! "$ignorecache" ]; then - changedfiles=$(git-diff-cache $(tree-id) | cut -f 4-) - commitfiles="$addedfiles $remfiles $changedfiles" + eval changedfiles=($(git-diff-cache $(tree-id) | cut -f 4- | \ + sed -e 's/^/"/' -e 's/$/"/')) + commitfiles=($addedfiles $remfiles "${changedfiles[@]}") fi merging= @@ -46,11 +47,11 @@ fi if [ ! "$ignorecache" ]; then - if [ ! "$commitfiles" ]; then + if [ ! "${commitfiles[*]}" ]; then echo 'Nothing to commit.' >&2 exit 2 fi - for file in $commitfiles; do + for file in "${commitfiles[@]}"; do # Prepend a letter describing whether it's addition, # removal or update. Or call git status on those files. echo $file; @@ -76,13 +77,13 @@ if [ ! "$ignorecache" ]; then if [ "$customfiles" ]; then - echo $commitfiles | xargs git-update-cache --add --remove \ + git-update-cache --add --remove "${commitfiles[@]}" \ || die "update-cache failed" export GIT_INDEX_FILE=$(mktemp -t gitci.XXXXXX) git-read-tree $(tree-id) fi # TODO: Do the proper separation of adds, removes, and changes. - echo $commitfiles | xargs git-update-cache --add --remove \ + git-update-cache --add --remove "${commitfiles[@]}" \ || die "update-cache failed" fi