[PATCH] cogito: allow filenames with spaces in cg-commit
From: Jan Veldeman <hidden>
Date: 2016-06-15 22:41:56
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 <redacted>
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