From: Brandon Williams <bmwill@google.com>
To: git@vger.kernel.org
Cc: Brandon Williams <bmwill@google.com>,
peff@peff.net, sbeller@google.com, jo@durchholz.org
Subject: [PATCH] submodule: prevent backslash expantion in submodule names
Date: Fri, 7 Apr 2017 10:23:06 -0700 [thread overview]
Message-ID: <20170407172306.172673-1-bmwill@google.com> (raw)
In-Reply-To: <CAGZ79ka7PEWy2iA8V9s11n2kyD=vHyS2y1K3SJzDq-5HsY7how@mail.gmail.com>
When attempting to add a submodule with backslashes in its name 'git
submodule' fails in a funny way. We can see that some of the
backslashes are expanded resulting in a bogus path:
git -C main submodule add ../sub\\with\\backslash
fatal: repository '/tmp/test/sub\witackslash' does not exist
fatal: clone of '/tmp/test/sub\witackslash' into submodule path
To solve this, convert calls to 'read' to 'read -r' in git-submodule.sh
in order to prevent backslash expantion in submodule names.
Reported-by: Joachim Durchholz <jo@durchholz.org>
Signed-off-by: Brandon Williams <bmwill@google.com>
---
git-submodule.sh | 14 +++++++-------
t/t7400-submodule-basic.sh | 14 ++++++++++++++
2 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/git-submodule.sh b/git-submodule.sh
index 6ec35e5fc..c0d0e9a4c 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -332,7 +332,7 @@ cmd_foreach()
git submodule--helper list --prefix "$wt_prefix" ||
echo "#unmatched" $?
} |
- while read mode sha1 stage sm_path
+ while read -r mode sha1 stage sm_path
do
die_if_unmatched "$mode" "$sha1"
if test -e "$sm_path"/.git
@@ -441,7 +441,7 @@ cmd_deinit()
git submodule--helper list --prefix "$wt_prefix" "$@" ||
echo "#unmatched" $?
} |
- while read mode sha1 stage sm_path
+ while read -r mode sha1 stage sm_path
do
die_if_unmatched "$mode" "$sha1"
name=$(git submodule--helper name "$sm_path") || exit
@@ -605,7 +605,7 @@ cmd_update()
"$@" || echo "#unmatched" $?
} | {
err=
- while read mode sha1 stage just_cloned sm_path
+ while read -r mode sha1 stage just_cloned sm_path
do
die_if_unmatched "$mode" "$sha1"
@@ -847,7 +847,7 @@ cmd_summary() {
# Get modified modules cared by user
modules=$(git $diff_cmd $cached --ignore-submodules=dirty --raw $head -- "$@" |
sane_egrep '^:([0-7]* )?160000' |
- while read mod_src mod_dst sha1_src sha1_dst status sm_path
+ while read -r mod_src mod_dst sha1_src sha1_dst status sm_path
do
# Always show modules deleted or type-changed (blob<->module)
if test "$status" = D || test "$status" = T
@@ -873,7 +873,7 @@ cmd_summary() {
git $diff_cmd $cached --ignore-submodules=dirty --raw $head -- $modules |
sane_egrep '^:([0-7]* )?160000' |
cut -c2- |
- while read mod_src mod_dst sha1_src sha1_dst status name
+ while read -r mod_src mod_dst sha1_src sha1_dst status name
do
if test -z "$cached" &&
test $sha1_dst = 0000000000000000000000000000000000000000
@@ -1020,7 +1020,7 @@ cmd_status()
git submodule--helper list --prefix "$wt_prefix" "$@" ||
echo "#unmatched" $?
} |
- while read mode sha1 stage sm_path
+ while read -r mode sha1 stage sm_path
do
die_if_unmatched "$mode" "$sha1"
name=$(git submodule--helper name "$sm_path") || exit
@@ -1100,7 +1100,7 @@ cmd_sync()
git submodule--helper list --prefix "$wt_prefix" "$@" ||
echo "#unmatched" $?
} |
- while read mode sha1 stage sm_path
+ while read -r mode sha1 stage sm_path
do
die_if_unmatched "$mode" "$sha1"
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index cf77a3a35..c2706fe47 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -273,6 +273,20 @@ test_expect_success 'submodule add with ./, /.. and // in path' '
test_cmp empty untracked
'
+test_expect_success 'submodule add with \\ in path' '
+ test_when_finished "rm -rf parent sub\\with\\backslash" &&
+
+ # Initialize a repo with a backslash in its name
+ git init sub\\with\\backslash &&
+ touch sub\\with\\backslash/empty.file &&
+ git -C sub\\with\\backslash add empty.file &&
+ git -C sub\\with\\backslash commit -m "Added empty.file" &&
+
+ # Add that repository as a submodule
+ git init parent &&
+ git -C parent submodule add ../sub\\with\\backslash
+'
+
test_expect_success 'submodule add in subdirectory' '
echo "refs/heads/master" >expect &&
>empty &&
--
2.12.2.715.g7642488e1d-goog
next prev parent reply other threads:[~2017-04-07 17:23 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-07 6:12 problem with backslash in directory name Joachim Durchholz
2017-04-07 6:30 ` Jeff King
2017-04-07 8:24 ` Joachim Durchholz
2017-04-07 8:40 ` Joachim Durchholz
2017-04-07 16:53 ` Brandon Williams
2017-04-07 16:55 ` Stefan Beller
2017-04-07 17:23 ` Brandon Williams [this message]
2017-04-07 17:35 ` [PATCH] submodule: prevent backslash expantion in submodule names Joachim Durchholz
2017-04-08 10:59 ` Jeff King
2017-04-08 20:32 ` Joachim Durchholz
2017-04-17 3:09 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170407172306.172673-1-bmwill@google.com \
--to=bmwill@google.com \
--cc=git@vger.kernel.org \
--cc=jo@durchholz.org \
--cc=peff@peff.net \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).