Skip to content

Commit 610bc1e

Browse files
authored
Merge pull request git-lfs#2077 from git-lfs/track-escape-patterns
commands/{,un}track: extract {,un}EscapeTrackPattern()
2 parents fbef61c + 0d1a920 commit 610bc1e

26 files changed

+154
-89
lines changed

commands/command_track.go

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ ArgsLoop:
7171
((trackLockableFlag && known.Lockable) || // enabling lockable & already lockable (no change)
7272
(trackNotLockableFlag && !known.Lockable) || // disabling lockable & not lockable (no change)
7373
(!trackLockableFlag && !trackNotLockableFlag)) { // leave lockable as-is in all cases
74-
Print("%s already supported", pattern)
74+
Print("%q already supported", pattern)
7575
continue ArgsLoop
7676
}
7777
}
7878

7979
// Generate the new / changed attrib line for merging
80-
encodedArg := strings.Replace(pattern, " ", "[[:space:]]", -1)
80+
encodedArg := escapeTrackPattern(pattern)
8181
lockableArg := ""
8282
if trackLockableFlag { // no need to test trackNotLockableFlag, if we got here we're disabling
8383
lockableArg = " " + git.LockableAttrib
@@ -91,7 +91,7 @@ ArgsLoop:
9191
writeablePatterns = append(writeablePatterns, pattern)
9292
}
9393

94-
Print("Tracking %s", pattern)
94+
Print("Tracking %q", pattern)
9595
}
9696

9797
// Now read the whole local attributes file and iterate over the contents,
@@ -178,7 +178,7 @@ ArgsLoop:
178178

179179
for _, f := range gittracked {
180180
if trackVerboseLoggingFlag || trackDryRunFlag {
181-
Print("Git LFS: touching %s", f)
181+
Print("Git LFS: touching %q", f)
182182
}
183183

184184
if !trackDryRunFlag {
@@ -239,6 +239,33 @@ func blocklistItem(name string) string {
239239
return ""
240240
}
241241

242+
var (
243+
trackEscapePatterns = map[string]string{
244+
" ": "[[:space:]]",
245+
"#": "\\#",
246+
}
247+
)
248+
249+
func escapeTrackPattern(unescaped string) string {
250+
var escaped string = unescaped
251+
252+
for from, to := range trackEscapePatterns {
253+
escaped = strings.Replace(escaped, from, to, -1)
254+
}
255+
256+
return escaped
257+
}
258+
259+
func unescapeTrackPattern(escaped string) string {
260+
var unescaped string = escaped
261+
262+
for to, from := range trackEscapePatterns {
263+
unescaped = strings.Replace(unescaped, from, to, -1)
264+
}
265+
266+
return unescaped
267+
}
268+
242269
func init() {
243270
RegisterCommand("track", trackCommand, func(cmd *cobra.Command) {
244271
cmd.Flags().BoolVarP(&trackLockableFlag, "lockable", "l", false, "make pattern lockable, i.e. read-only unless locked")

commands/command_untrack.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func untrackCommand(cmd *cobra.Command, args []string) {
5757

5858
path := strings.Fields(line)[0]
5959
if removePath(path, args) {
60-
Print("Untracking %s", path)
60+
Print("Untracking %q", unescapeTrackPattern(path))
6161
} else {
6262
attributesFile.WriteString(line + "\n")
6363
}
@@ -66,7 +66,7 @@ func untrackCommand(cmd *cobra.Command, args []string) {
6666

6767
func removePath(path string, args []string) bool {
6868
for _, t := range args {
69-
if path == t {
69+
if path == escapeTrackPattern(t) {
7070
return true
7171
}
7272
}

test/test-batch-error-handling.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ begin_test "batch error handling"
2424

2525
# This executes Git LFS from the local repo that was just cloned.
2626
git lfs track "*.dat" 2>&1 | tee track.log
27-
grep "Tracking \*.dat" track.log
27+
grep "Tracking \"\*.dat\"" track.log
2828

2929
contents="a"
3030
contents_oid=$(calc_oid "$contents")

test/test-batch-transfer.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ begin_test "batch transfer"
2626

2727
# This executes Git LFS from the local repo that was just cloned.
2828
git lfs track "*.dat" 2>&1 | tee track.log
29-
grep "Tracking \*.dat" track.log
29+
grep "Tracking \"\*.dat\"" track.log
3030

3131
contents="a"
3232
contents_oid=$(calc_oid "$contents")

test/test-checkout.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ begin_test "checkout"
1212
clone_repo "$reponame" repo
1313

1414
git lfs track "*.dat" 2>&1 | tee track.log
15-
grep "Tracking \*.dat" track.log
15+
grep "Tracking \"\*.dat\"" track.log
1616

1717
contents="something something"
1818
contentsize=19

test/test-chunked-transfer-encoding.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ begin_test "chunked transfer encoding"
2424

2525
# This executes Git LFS from the local repo that was just cloned.
2626
git lfs track "*.dat" 2>&1 | tee track.log
27-
grep "Tracking \*.dat" track.log
27+
grep "Tracking \"\*.dat\"" track.log
2828

2929
contents="a"
3030
contents_oid=$(calc_oid "$contents")

test/test-clone.sh

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ begin_test "clone"
1313
clone_repo "$reponame" repo
1414

1515
git lfs track "*.dat" 2>&1 | tee track.log
16-
grep "Tracking \*.dat" track.log
16+
grep "Tracking \"\*.dat\"" track.log
1717

1818
# generate some test data & commits with random LFS data
1919
echo "[
@@ -95,7 +95,7 @@ begin_test "cloneSSL"
9595
clone_repo_ssl "$reponame" "$reponame"
9696

9797
git lfs track "*.dat" 2>&1 | tee track.log
98-
grep "Tracking \*.dat" track.log
98+
grep "Tracking \"\*.dat\"" track.log
9999

100100
# generate some test data & commits with random LFS data
101101
echo "[
@@ -154,7 +154,7 @@ begin_test "clone ClientCert"
154154
fi
155155

156156
git lfs track "*.dat" 2>&1 | tee track.log
157-
grep "Tracking \*.dat" track.log
157+
grep "Tracking \"\*.dat\"" track.log
158158

159159
# generate some test data & commits with random LFS data
160160
echo "[
@@ -211,7 +211,7 @@ begin_test "clone with flags"
211211
clone_repo "$reponame" "$reponame"
212212

213213
git lfs track "*.dat" 2>&1 | tee track.log
214-
grep "Tracking \*.dat" track.log
214+
grep "Tracking \"\*.dat\"" track.log
215215

216216
# generate some test data & commits with random LFS data
217217
echo "[
@@ -298,7 +298,7 @@ begin_test "clone (with include/exclude args)"
298298
clone_repo "$reponame" "$reponame"
299299

300300
git lfs track "*.dat" 2>&1 | tee track.log
301-
grep "Tracking \*.dat" track.log
301+
grep "Tracking \"\*.dat\"" track.log
302302

303303
contents_a="a"
304304
contents_a_oid=$(calc_oid "$contents_a")
@@ -359,7 +359,7 @@ begin_test "clone (with .lfsconfig)"
359359
clone_repo "$reponame" "$reponame"
360360

361361
git lfs track "*.dat" 2>&1 | tee track.log
362-
grep "Tracking \*.dat" track.log
362+
grep "Tracking \"\*.dat\"" track.log
363363

364364
contents_a="a"
365365
contents_a_oid=$(calc_oid "$contents_a")
@@ -472,7 +472,7 @@ begin_test "clone with submodules"
472472

473473
clone_repo "$submodname2" submod2
474474
git lfs track "*.dat" 2>&1 | tee track.log
475-
grep "Tracking \*.dat" track.log
475+
grep "Tracking \"\*.dat\"" track.log
476476

477477
contents_sub2="Inception. Now, before you bother telling me it's impossible..."
478478
contents_sub2_oid=$(calc_oid "$contents_sub2")
@@ -484,7 +484,7 @@ begin_test "clone with submodules"
484484

485485
clone_repo "$submodname1" submod1
486486
git lfs track "*.dat" 2>&1 | tee track.log
487-
grep "Tracking \*.dat" track.log
487+
grep "Tracking \"\*.dat\"" track.log
488488

489489
contents_sub1="We're dreaming?"
490490
contents_sub1_oid=$(calc_oid "$contents_sub1")
@@ -499,7 +499,7 @@ begin_test "clone with submodules"
499499

500500
clone_repo "$reponame" rootrepo
501501
git lfs track "*.dat" 2>&1 | tee track.log
502-
grep "Tracking \*.dat" track.log
502+
grep "Tracking \"\*.dat\"" track.log
503503

504504
contents_root="Downwards is the only way forwards."
505505
contents_root_oid=$(calc_oid "$contents_root")
@@ -546,7 +546,7 @@ begin_test "clone in current directory"
546546
clone_repo "$reponame" $reponame
547547

548548
git lfs track "*.dat" 2>&1 | tee track.log
549-
grep "Tracking \*.dat" track.log
549+
grep "Tracking \"\*.dat\"" track.log
550550

551551
contents="contents"
552552
contents_oid="$(calc_oid "$contents")"

test/test-credentials.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ begin_test "credentials without useHttpPath, with bad path password"
1818
git checkout -b without-path
1919

2020
git lfs track "*.dat" 2>&1 | tee track.log
21-
grep "Tracking \*.dat" track.log
21+
grep "Tracking \"\*.dat\"" track.log
2222

2323
contents="a"
2424
contents_oid=$(calc_oid "$contents")
@@ -46,7 +46,7 @@ begin_test "credentials with useHttpPath, with wrong password"
4646
git checkout -b with-path-wrong-pass
4747

4848
git lfs track "*.dat" 2>&1 | tee track.log
49-
grep "Tracking \*.dat" track.log
49+
grep "Tracking \"\*.dat\"" track.log
5050

5151
contents="a"
5252
contents_oid=$(calc_oid "$contents")
@@ -74,7 +74,7 @@ begin_test "credentials with useHttpPath, with correct password"
7474
git checkout -b with-path-correct-pass
7575

7676
git lfs track "*.dat" 2>&1 | tee track.log
77-
grep "Tracking \*.dat" track.log
77+
grep "Tracking \"\*.dat\"" track.log
7878

7979
# creating new branch does not re-send any objects existing on other
8080
# remote branches anymore, generate new object, different from prev tests

test/test-custom-transfers.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ begin_test "custom-transfer-wrong-path"
1616
git config lfs.customtransfer.testcustom.path path-to-nothing
1717

1818
git lfs track "*.dat" 2>&1 | tee track.log
19-
grep "Tracking \*.dat" track.log
19+
grep "Tracking \"\*.dat\"" track.log
2020

2121
contents="jksgdfljkgsdlkjafg lsjdgf alkjgsd lkfjag sldjkgf alkjsgdflkjagsd kljfg asdjgf kalsd"
2222
contents_oid=$(calc_oid "$contents")
@@ -52,7 +52,7 @@ begin_test "custom-transfer-upload-download"
5252
git config lfs.customtransfer.testcustom.path lfstest-customadapter
5353

5454
git lfs track "*.dat" 2>&1 | tee track.log
55-
grep "Tracking \*.dat" track.log
55+
grep "Tracking \"\*.dat\"" track.log
5656
git add .gitattributes
5757
git commit -m "Tracking"
5858

test/test-fetch-paths.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ begin_test "init fetch unclean paths"
1414
clone_repo $reponame repo
1515

1616
git lfs track "*.dat" 2>&1 | tee track.log
17-
grep "Tracking \*.dat" track.log
17+
grep "Tracking \"\*.dat\"" track.log
1818

1919
mkdir dir
2020
printf "$contents" > dir/a.dat

test/test-fetch-recent.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ begin_test "init fetch-recent"
2626
clone_repo "$reponame" "$reponame"
2727

2828
git lfs track "*.dat" 2>&1 | tee track.log
29-
grep "Tracking \*.dat" track.log
29+
grep "Tracking \"\*.dat\"" track.log
3030

3131
echo "[
3232
{

test/test-fetch.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ begin_test "init for fetch tests"
1717
clone_repo "$reponame" repo
1818

1919
git lfs track "*.dat" 2>&1 | tee track.log
20-
grep "Tracking \*.dat" track.log
20+
grep "Tracking \"\*.dat\"" track.log
2121

2222

2323
printf "$contents" > a.dat
@@ -254,7 +254,7 @@ begin_test "fetch-all"
254254
clone_repo "$reponame" "$reponame"
255255

256256
git lfs track "*.dat" 2>&1 | tee track.log
257-
grep "Tracking \*.dat" track.log
257+
grep "Tracking \"\*.dat\"" track.log
258258

259259
NUMFILES=12
260260
# generate content we'll use
@@ -395,7 +395,7 @@ begin_test "fetch with no origin remote"
395395
clone_repo "$reponame" no-remote-repo
396396

397397
git lfs track "*.dat" 2>&1 | tee track.log
398-
grep "Tracking \*.dat" track.log
398+
grep "Tracking \"\*.dat\"" track.log
399399

400400
contents="a"
401401
contents_oid=$(calc_oid "$contents")
@@ -459,7 +459,7 @@ begin_test "fetch --prune"
459459
clone_repo "remote_$reponame" "clone_$reponame"
460460

461461
git lfs track "*.dat" 2>&1 | tee track.log
462-
grep "Tracking \*.dat" track.log
462+
grep "Tracking \"\*.dat\"" track.log
463463

464464
content_head="HEAD content"
465465
content_commit2="Content for commit 2 (prune)"

test/test-happy-path.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ begin_test "happy path"
2424

2525
# This executes Git LFS from the local repo that was just cloned.
2626
git lfs track "*.dat" 2>&1 | tee track.log
27-
grep "Tracking \*.dat" track.log
27+
grep "Tracking \"\*.dat\"" track.log
2828

2929
contents="a"
3030
contents_oid=$(calc_oid "$contents")

test/test-ls-files.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ begin_test "ls-files"
99
mkdir repo
1010
cd repo
1111
git init
12-
git lfs track "*.dat" | grep "Tracking \*.dat"
12+
git lfs track "*.dat" | grep "Tracking \"\*.dat\""
1313
echo "some data" > some.dat
1414
echo "some text" > some.txt
1515
echo "missing" > missing.dat
@@ -74,7 +74,7 @@ begin_test "ls-files: show duplicate files"
7474
cd dupRepoShort
7575
git init
7676

77-
git lfs track "*.tgz" | grep "Tracking \*.tgz"
77+
git lfs track "*.tgz" | grep "Tracking \"\*.tgz\""
7878
echo "test content" > one.tgz
7979
echo "test content" > two.tgz
8080
git add one.tgz
@@ -96,7 +96,7 @@ begin_test "ls-files: show duplicate files with long OID"
9696
cd dupRepoLong
9797
git init
9898

99-
git lfs track "*.tgz" | grep "Tracking \*.tgz"
99+
git lfs track "*.tgz" | grep "Tracking \"\*.tgz\""
100100
echo "test content" > one.tgz
101101
echo "test content" > two.tgz
102102
git add one.tgz

test/test-pre-push.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ begin_test "pre-push multiple branches"
248248

249249

250250
git lfs track "*.dat" 2>&1 | tee track.log
251-
grep "Tracking \*.dat" track.log
251+
grep "Tracking \"\*.dat\"" track.log
252252

253253
NUMFILES=6
254254
# generate content we'll use
@@ -334,7 +334,7 @@ begin_test "pre-push unfetched deleted remote branch & server GC"
334334

335335

336336
git lfs track "*.dat" 2>&1 | tee track.log
337-
grep "Tracking \*.dat" track.log
337+
grep "Tracking \"\*.dat\"" track.log
338338

339339
NUMFILES=4
340340
# generate content we'll use
@@ -407,7 +407,7 @@ begin_test "pre-push delete branch"
407407

408408

409409
git lfs track "*.dat" 2>&1 | tee track.log
410-
grep "Tracking \*.dat" track.log
410+
grep "Tracking \"\*.dat\"" track.log
411411

412412
NUMFILES=4
413413
# generate content we'll use

0 commit comments

Comments
 (0)