From 147a7b66554b2b13bcbf6fec1204e0cc0a1790bf Mon Sep 17 00:00:00 2001 From: Mike Burns and Eric Collins Date: Fri, 23 Dec 2016 16:18:40 -0500 Subject: Handle spaces in dotfile name In mkrc, separate the list of files with newlines instead of spaces. Change the `$IFS` when iterating to handle this. We hand the file off to rcup, which encodes the file name by replacing spaces with the bell character (`\a`). rcup then sends the file name off to lsrc, which decodes the bell back into a space. The test makes sure an `a` character is in the filename, in case some encoding goes wrong. We use tr(1) instead of sed(1) because tr(1) handles `\a`. Shoutout to Sublime Text 3 for forcing this issue. --- bin/lsrc.in | 9 ++++++--- bin/mkrc.in | 9 ++++++++- bin/rcup.in | 5 ++++- 3 files changed, 18 insertions(+), 5 deletions(-) (limited to 'bin') diff --git a/bin/lsrc.in b/bin/lsrc.in index 8fb1fcd..b0dc30a 100755 --- a/bin/lsrc.in +++ b/bin/lsrc.in @@ -347,7 +347,8 @@ for DOTFILES_DIR in $DOTFILES_DIRS; do host_files="$DOTFILES_DIR/host-$HOSTNAME" if [ -d "$host_files" ]; then pushdir "$(basename "$host_files")" - for file in ${FILES:-*}; do + for escaped_file in ${FILES:-*}; do + file="$(decode "$escaped_file")" dotted=0 if is_excluded "$file" "$undotted_file_globs" "$never_undotted_file_globs"; then dotted=1 @@ -363,7 +364,8 @@ for DOTFILES_DIR in $DOTFILES_DIRS; do for tag in $TAGS; do if [ -d "tag-$tag" ]; then pushdir "$(basename "tag-$tag")" - for file in ${FILES:-*}; do + for escaped_file in ${FILES:-*}; do + file="$(decode "$escaped_file")" $DEBUG "TAG: $tag, exclude_file_globs: $exclude_file_globs" dotted=0 if is_excluded "$file" "$undotted_file_globs" "$never_undotted_file_globs"; then @@ -377,7 +379,8 @@ for DOTFILES_DIR in $DOTFILES_DIRS; do cd "$DOTFILES_DIR" - for file in ${FILES:-*}; do + for escaped_file in ${FILES:-*}; do + file="$(decode "$escaped_file")" dotted=0 if is_metafile "$file"; then continue diff --git a/bin/mkrc.in b/bin/mkrc.in index da22a63..5b2dea5 100755 --- a/bin/mkrc.in +++ b/bin/mkrc.in @@ -82,7 +82,10 @@ if [ $always_copy -eq 1 ]; then INSTALL="$INSTALL -C" fi -files=$@ +files="" +for i; do + files="$(printf "$files\n$i")" +done if [ $force_symlink -eq 1 ]; then for file in $files; do @@ -108,7 +111,11 @@ elif [ $undotted -eq 0 ]; then done fi +saved_IFS="$IFS" +IFS=' +' for file in $files; do + IFS="$saved_IFS" case "$file" in /*) : ;; *) [ -e "$PWD/$file" ] && file="$PWD/$file" ;; diff --git a/bin/rcup.in b/bin/rcup.in index de11751..932ac56 100755 --- a/bin/rcup.in +++ b/bin/rcup.in @@ -260,7 +260,10 @@ handle_command_line() { tags="${arg_tags:-$TAGS}" DOTFILES_DIRS="${dotfiles_dirs:-$DOTFILES_DIRS}" RUN_HOOKS=$run_hooks - files="$@" + files= + for file; do + files="$files $(encode "$file")" + done for tag in $tags; do LS_ARGS="$LS_ARGS -t $tag" -- cgit v1.2.3