All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names
@ 2017-04-09 19:11 Ævar Arnfjörð Bjarmason
  2017-04-09 19:11 ` [PATCH 1/2] tests: mark tests that fail when the TEST_DIRECTORY is unusual Ævar Arnfjörð Bjarmason
                   ` (2 more replies)
  0 siblings, 3 replies; 25+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2017-04-09 19:11 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Brandon Williams, Jeff King, Joachim Durchholz,
	Stefan Beller, Ævar Arnfjörð Bjarmason

There's a patch now on the ML for an issue with read v.s. read -r in
submodule revealed when the submodule name contains a \.

That fix is fine, but we should do better and structurally arrange our
tests to detect these sorts of issues before they're reported.

This series changes the test library so that we interpolate the result
of:

    perl -e 'print join q[], grep { /[^[:alnum:]]/ and !m<[./]> } map chr, 0x01..0x7f'

Into the trash directory name we generate. Doing this makes 30% of the
test suite fail. Most of the diffstat below is just adding:

    test_fails_on_unusual_directory_names=1

To those tests that failed, which makes them not use these garbage
trash directory names.

Some of those failures are legitimate bugs, some are an artifact of us
using shellscripting as our test language (namely interpolating ' and
" somewhere).

It might make sense to mark these tests more granularly, e.g.:

    test_fails_on_unusual_directory_name_types=quotes

etc., if the test fails just because of " or ', but I think as it is
this makes sense for inclusion, it makes sure we don't regress on the
remaining 70% of our test suite.

Ævar Arnfjörð Bjarmason (2):
  tests: mark tests that fail when the TEST_DIRECTORY is unusual
  test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY
    name

 t/README                                         | 12 ++++++++++++
 t/t0000-basic.sh                                 |  2 ++
 t/t0003-attributes.sh                            |  1 +
 t/t0021-conversion.sh                            |  1 +
 t/t0060-path-utils.sh                            |  1 +
 t/t0300-credentials.sh                           |  1 +
 t/t0302-credential-store.sh                      |  1 +
 t/t1006-cat-file.sh                              |  1 +
 t/t1013-read-tree-submodule.sh                   |  1 +
 t/t1020-subdirectory.sh                          |  1 +
 t/t1050-large.sh                                 |  1 +
 t/t1060-object-corruption.sh                     |  1 +
 t/t1300-repo-config.sh                           |  1 +
 t/t1305-config-include.sh                        |  1 +
 t/t1308-config-set.sh                            |  1 +
 t/t1309-early-config.sh                          |  1 +
 t/t1500-rev-parse.sh                             |  1 +
 t/t1504-ceiling-dirs.sh                          |  1 +
 t/t1507-rev-parse-upstream.sh                    |  1 +
 t/t1510-repo-setup.sh                            |  1 +
 t/t1515-rev-parse-outside-repo.sh                |  1 +
 t/t2013-checkout-submodule.sh                    |  1 +
 t/t2025-worktree-add.sh                          |  1 +
 t/t2027-worktree-list.sh                         |  1 +
 t/t2028-worktree-move.sh                         |  1 +
 t/t3040-subprojects-basic.sh                     |  1 +
 t/t3050-subprojects-fetch.sh                     |  1 +
 t/t3409-rebase-preserve-merges.sh                |  1 +
 t/t3426-rebase-submodule.sh                      |  1 +
 t/t3501-revert-cherry-pick.sh                    |  1 +
 t/t3512-cherry-pick-submodule.sh                 |  1 +
 t/t3513-revert-submodule.sh                      |  1 +
 t/t3600-rm.sh                                    |  1 +
 t/t3900-i18n-commit.sh                           |  1 +
 t/t3906-stash-submodule.sh                       |  1 +
 t/t4027-diff-submodule.sh                        |  1 +
 t/t4030-diff-textconv.sh                         |  1 +
 t/t4031-diff-rewrite-binary.sh                   |  1 +
 t/t4035-diff-quiet.sh                            |  1 +
 t/t4041-diff-submodule-option.sh                 |  1 +
 t/t4059-diff-submodule-not-initialized.sh        |  1 +
 t/t4060-diff-submodule-option-diff-format.sh     |  1 +
 t/t4137-apply-submodule.sh                       |  1 +
 t/t4203-mailmap.sh                               |  1 +
 t/t4207-log-decoration-colors.sh                 |  1 +
 t/t4255-am-submodule.sh                          |  1 +
 t/t5000-tar-tree.sh                              |  1 +
 t/t5001-archive-attr.sh                          |  1 +
 t/t5002-archive-attr-pattern.sh                  |  1 +
 t/t5003-archive-zip.sh                           |  1 +
 t/t5150-request-pull.sh                          |  1 +
 t/t5300-pack-object.sh                           |  1 +
 t/t5304-prune.sh                                 |  1 +
 t/t5305-include-tag.sh                           |  1 +
 t/t5306-pack-nobase.sh                           |  1 +
 t/t5310-pack-bitmaps.sh                          |  1 +
 t/t5311-pack-bitmaps-shallow.sh                  |  1 +
 t/t5400-send-pack.sh                             |  1 +
 t/t5401-update-hooks.sh                          |  1 +
 t/t5402-post-merge-hook.sh                       |  1 +
 t/t5403-post-checkout-hook.sh                    |  1 +
 t/t5404-tracking-branches.sh                     |  1 +
 t/t5406-remote-rejects.sh                        |  1 +
 t/t5407-post-rewrite-hook.sh                     |  1 +
 t/t5500-fetch-pack.sh                            |  1 +
 t/t5501-fetch-push-alternates.sh                 |  1 +
 t/t5502-quickfetch.sh                            |  1 +
 t/t5505-remote.sh                                |  1 +
 t/t5509-fetch-push-namespaces.sh                 |  1 +
 t/t5510-fetch.sh                                 |  1 +
 t/t5512-ls-remote.sh                             |  1 +
 t/t5514-fetch-multiple.sh                        |  1 +
 t/t5515-fetch-merge-logic.sh                     |  1 +
 t/t5516-fetch-push.sh                            |  1 +
 t/t5519-push-alternates.sh                       |  1 +
 t/t5520-pull.sh                                  |  1 +
 t/t5521-pull-options.sh                          |  1 +
 t/t5522-pull-symlink.sh                          |  1 +
 t/t5524-pull-msg.sh                              |  1 +
 t/t5525-fetch-tagopt.sh                          |  1 +
 t/t5526-fetch-submodules.sh                      |  1 +
 t/t5527-fetch-odd-refs.sh                        |  1 +
 t/t5531-deep-submodule-push.sh                   |  1 +
 t/t5533-push-cas.sh                              |  1 +
 t/t5535-fetch-push-symref.sh                     |  1 +
 t/t5536-fetch-conflicts.sh                       |  1 +
 t/t5537-fetch-shallow.sh                         |  1 +
 t/t5538-push-shallow.sh                          |  1 +
 t/t5539-fetch-http-shallow.sh                    |  1 +
 t/t5540-http-push-webdav.sh                      |  1 +
 t/t5541-http-push-smart.sh                       |  1 +
 t/t5542-push-http-shallow.sh                     |  1 +
 t/t5544-pack-objects-hook.sh                     |  1 +
 t/t5545-push-options.sh                          |  1 +
 t/t5547-push-quarantine.sh                       |  1 +
 t/t5550-http-fetch-dumb.sh                       |  1 +
 t/t5551-http-fetch-smart.sh                      |  1 +
 t/t5560-http-backend-noserver.sh                 |  1 +
 t/t5561-http-backend.sh                          |  1 +
 t/t5570-git-daemon.sh                            |  1 +
 t/t5572-pull-submodule.sh                        |  1 +
 t/t5600-clone-fail-cleanup.sh                    |  1 +
 t/t5601-clone.sh                                 |  1 +
 t/t5604-clone-reference.sh                       |  1 +
 t/t5605-clone-local.sh                           |  1 +
 t/t5606-clone-options.sh                         |  1 +
 t/t5609-clone-branch.sh                          |  1 +
 t/t5610-clone-detached.sh                        |  1 +
 t/t5611-clone-config.sh                          |  1 +
 t/t5612-clone-refspec.sh                         |  1 +
 t/t5613-info-alternate.sh                        |  1 +
 t/t5614-clone-submodules.sh                      |  1 +
 t/t5615-alternate-env.sh                         |  1 +
 t/t5801-remote-helpers.sh                        |  1 +
 t/t5802-connect-helper.sh                        |  1 +
 t/t5810-proto-disable-local.sh                   |  1 +
 t/t5812-proto-disable-http.sh                    |  1 +
 t/t5813-proto-disable-ssh.sh                     |  1 +
 t/t5814-proto-disable-ext.sh                     |  1 +
 t/t5815-submodule-protos.sh                      |  1 +
 t/t5900-repo-selection.sh                        |  1 +
 t/t6008-rev-list-submodule.sh                    |  1 +
 t/t6030-bisect-porcelain.sh                      |  1 +
 t/t6040-tracking-info.sh                         |  1 +
 t/t6041-bisect-submodule.sh                      |  1 +
 t/t6050-replace.sh                               |  1 +
 t/t6060-merge-index.sh                           |  1 +
 t/t6134-pathspec-in-submodule.sh                 |  1 +
 t/t6200-fmt-merge-msg.sh                         |  1 +
 t/t6500-gc.sh                                    |  1 +
 t/t7001-mv.sh                                    |  1 +
 t/t7003-filter-branch.sh                         |  1 +
 t/t7005-editor.sh                                |  1 +
 t/t7006-pager.sh                                 |  1 +
 t/t7008-grep-binary.sh                           |  1 +
 t/t7010-setup.sh                                 |  1 +
 t/t7064-wtstatus-pv2.sh                          |  1 +
 t/t7103-reset-bare.sh                            |  1 +
 t/t7112-reset-submodule.sh                       |  1 +
 t/t7300-clean.sh                                 |  1 +
 t/t7400-submodule-basic.sh                       |  1 +
 t/t7402-submodule-rebase.sh                      |  1 +
 t/t7403-submodule-sync.sh                        |  1 +
 t/t7405-submodule-merge.sh                       |  1 +
 t/t7406-submodule-update.sh                      |  1 +
 t/t7407-submodule-foreach.sh                     |  1 +
 t/t7408-submodule-reference.sh                   |  1 +
 t/t7409-submodule-detached-work-tree.sh          |  1 +
 t/t7410-submodule-checkout-to.sh                 |  1 +
 t/t7411-submodule-config.sh                      |  1 +
 t/t7413-submodule-is-active.sh                   |  1 +
 t/t7504-commit-msg-hook.sh                       |  1 +
 t/t7506-status-submodule.sh                      |  1 +
 t/t7507-commit-verbose.sh                        |  1 +
 t/t7517-per-repo-email.sh                        |  1 +
 t/t7613-merge-submodule.sh                       |  1 +
 t/t7700-repack.sh                                |  1 +
 t/t7800-difftool.sh                              |  1 +
 t/t7810-grep.sh                                  |  1 +
 t/t7814-grep-recurse-submodules.sh               |  1 +
 t/t9001-send-email.sh                            |  1 +
 t/t9020-remote-svn.sh                            |  1 +
 t/t9100-git-svn-basic.sh                         |  1 +
 t/t9101-git-svn-props.sh                         |  1 +
 t/t9102-git-svn-deep-rmdir.sh                    |  1 +
 t/t9103-git-svn-tracked-directory-removed.sh     |  1 +
 t/t9104-git-svn-follow-parent.sh                 |  1 +
 t/t9105-git-svn-commit-diff.sh                   |  1 +
 t/t9106-git-svn-commit-diff-clobber.sh           |  1 +
 t/t9107-git-svn-migrate.sh                       |  1 +
 t/t9108-git-svn-glob.sh                          |  1 +
 t/t9109-git-svn-multi-glob.sh                    |  1 +
 t/t9110-git-svn-use-svm-props.sh                 |  1 +
 t/t9114-git-svn-dcommit-merge.sh                 |  1 +
 t/t9115-git-svn-dcommit-funky-renames.sh         |  1 +
 t/t9116-git-svn-log.sh                           |  1 +
 t/t9117-git-svn-init-clone.sh                    |  1 +
 t/t9118-git-svn-funky-branch-names.sh            |  1 +
 t/t9120-git-svn-clone-with-percent-escapes.sh    |  1 +
 t/t9122-git-svn-author.sh                        |  1 +
 t/t9123-git-svn-rebuild-with-rewriteroot.sh      |  1 +
 t/t9124-git-svn-dcommit-auto-props.sh            |  1 +
 t/t9125-git-svn-multi-glob-branch-names.sh       |  1 +
 t/t9127-git-svn-partial-rebuild.sh               |  1 +
 t/t9128-git-svn-cmd-branch.sh                    |  1 +
 t/t9129-git-svn-i18n-commitencoding.sh           |  1 +
 t/t9131-git-svn-empty-symlink.sh                 |  1 +
 t/t9132-git-svn-broken-symlink.sh                |  1 +
 t/t9133-git-svn-nested-git-repo.sh               |  1 +
 t/t9134-git-svn-ignore-paths.sh                  |  1 +
 t/t9137-git-svn-dcommit-clobber-series.sh        |  1 +
 t/t9138-git-svn-authors-prog.sh                  |  1 +
 t/t9140-git-svn-reset.sh                         |  1 +
 t/t9141-git-svn-multiple-branches.sh             |  1 +
 t/t9142-git-svn-shallow-clone.sh                 |  1 +
 t/t9143-git-svn-gc.sh                            |  1 +
 t/t9144-git-svn-old-rev_map.sh                   |  1 +
 t/t9145-git-svn-master-branch.sh                 |  1 +
 t/t9146-git-svn-empty-dirs.sh                    |  1 +
 t/t9147-git-svn-include-paths.sh                 |  1 +
 t/t9148-git-svn-propset.sh                       |  1 +
 t/t9150-svk-mergetickets.sh                      |  1 +
 t/t9151-svn-mergeinfo.sh                         |  1 +
 t/t9153-git-svn-rewrite-uuid.sh                  |  1 +
 t/t9154-git-svn-fancy-glob.sh                    |  1 +
 t/t9155-git-svn-fetch-deleted-tag.sh             |  1 +
 t/t9156-git-svn-fetch-deleted-tag-2.sh           |  1 +
 t/t9157-git-svn-fetch-merge.sh                   |  1 +
 t/t9158-git-svn-mergeinfo.sh                     |  1 +
 t/t9159-git-svn-no-parent-mergeinfo.sh           |  1 +
 t/t9160-git-svn-preserve-empty-dirs.sh           |  1 +
 t/t9161-git-svn-mergeinfo-push.sh                |  1 +
 t/t9162-git-svn-dcommit-interactive.sh           |  1 +
 t/t9163-git-svn-reset-clears-caches.sh           |  1 +
 t/t9164-git-svn-dcommit-concurrent.sh            |  1 +
 t/t9165-git-svn-fetch-merge-branch-of-branch.sh  |  1 +
 t/t9166-git-svn-fetch-merge-branch-of-branch2.sh |  1 +
 t/t9167-git-svn-cmd-branch-subproject.sh         |  1 +
 t/t9168-git-svn-partially-globbed-names.sh       |  1 +
 t/t9200-git-cvsexportcommit.sh                   |  1 +
 t/t9300-fast-import.sh                           |  1 +
 t/t9350-fast-export.sh                           |  1 +
 t/t9400-git-cvsserver-server.sh                  |  1 +
 t/t9401-git-cvsserver-crlf.sh                    |  1 +
 t/t9402-git-cvsserver-refs.sh                    |  1 +
 t/t9500-gitweb-standalone-no-errors.sh           |  1 +
 t/t9502-gitweb-standalone-parse-output.sh        |  1 +
 t/t9600-cvsimport.sh                             |  1 +
 t/t9601-cvsimport-vendor-branch.sh               |  1 +
 t/t9602-cvsimport-branches-tags.sh               |  1 +
 t/t9604-cvsimport-timestamps.sh                  |  1 +
 t/t9700-perl-git.sh                              |  1 +
 t/t9902-completion.sh                            |  1 +
 t/test-lib.sh                                    |  4 ++++
 234 files changed, 249 insertions(+)

-- 
2.11.0


^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH 1/2] tests: mark tests that fail when the TEST_DIRECTORY is unusual
  2017-04-09 19:11 [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names Ævar Arnfjörð Bjarmason
@ 2017-04-09 19:11 ` Ævar Arnfjörð Bjarmason
  2017-04-09 19:11 ` [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name Ævar Arnfjörð Bjarmason
  2017-04-09 20:37 ` [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names Joachim Durchholz
  2 siblings, 0 replies; 25+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2017-04-09 19:11 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Brandon Williams, Jeff King, Joachim Durchholz,
	Stefan Beller, Ævar Arnfjörð Bjarmason

Mark tests that fail when the TEST_DIRECTORY has a name that's
unusual, i.e. contains control characters, various punctuation etc.

This change is followed by a change that adds the code that picks up
test_fails_on_unusual_directory_names to test-lib.sh, but comes before
that change to not break most of the test suite during bisecting.

This change is the result of:

    for f in $(grep -B3 last_fail_time .prove |grep sh | perl -pe 's/^  (.*?):/$1/');
        do perl -0666 -pi -e 's/^(test_description)/test_fails_on_unusual_directory_names=1\n$1/m' $f
    done

After running the test suite with the aforementioned change to
test-lib.sh. The only exception is t0000-basic.sh, since its testing
the test suite itself its failing 'test --verbose' test needs a change
to the test suite wrapper code to be excluded.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 t/t0000-basic.sh                                 | 2 ++
 t/t0003-attributes.sh                            | 1 +
 t/t0021-conversion.sh                            | 1 +
 t/t0060-path-utils.sh                            | 1 +
 t/t0300-credentials.sh                           | 1 +
 t/t0302-credential-store.sh                      | 1 +
 t/t1006-cat-file.sh                              | 1 +
 t/t1013-read-tree-submodule.sh                   | 1 +
 t/t1020-subdirectory.sh                          | 1 +
 t/t1050-large.sh                                 | 1 +
 t/t1060-object-corruption.sh                     | 1 +
 t/t1300-repo-config.sh                           | 1 +
 t/t1305-config-include.sh                        | 1 +
 t/t1308-config-set.sh                            | 1 +
 t/t1309-early-config.sh                          | 1 +
 t/t1500-rev-parse.sh                             | 1 +
 t/t1504-ceiling-dirs.sh                          | 1 +
 t/t1507-rev-parse-upstream.sh                    | 1 +
 t/t1510-repo-setup.sh                            | 1 +
 t/t1515-rev-parse-outside-repo.sh                | 1 +
 t/t2013-checkout-submodule.sh                    | 1 +
 t/t2025-worktree-add.sh                          | 1 +
 t/t2027-worktree-list.sh                         | 1 +
 t/t2028-worktree-move.sh                         | 1 +
 t/t3040-subprojects-basic.sh                     | 1 +
 t/t3050-subprojects-fetch.sh                     | 1 +
 t/t3409-rebase-preserve-merges.sh                | 1 +
 t/t3426-rebase-submodule.sh                      | 1 +
 t/t3501-revert-cherry-pick.sh                    | 1 +
 t/t3512-cherry-pick-submodule.sh                 | 1 +
 t/t3513-revert-submodule.sh                      | 1 +
 t/t3600-rm.sh                                    | 1 +
 t/t3900-i18n-commit.sh                           | 1 +
 t/t3906-stash-submodule.sh                       | 1 +
 t/t4027-diff-submodule.sh                        | 1 +
 t/t4030-diff-textconv.sh                         | 1 +
 t/t4031-diff-rewrite-binary.sh                   | 1 +
 t/t4035-diff-quiet.sh                            | 1 +
 t/t4041-diff-submodule-option.sh                 | 1 +
 t/t4059-diff-submodule-not-initialized.sh        | 1 +
 t/t4060-diff-submodule-option-diff-format.sh     | 1 +
 t/t4137-apply-submodule.sh                       | 1 +
 t/t4203-mailmap.sh                               | 1 +
 t/t4207-log-decoration-colors.sh                 | 1 +
 t/t4255-am-submodule.sh                          | 1 +
 t/t5000-tar-tree.sh                              | 1 +
 t/t5001-archive-attr.sh                          | 1 +
 t/t5002-archive-attr-pattern.sh                  | 1 +
 t/t5003-archive-zip.sh                           | 1 +
 t/t5150-request-pull.sh                          | 1 +
 t/t5300-pack-object.sh                           | 1 +
 t/t5304-prune.sh                                 | 1 +
 t/t5305-include-tag.sh                           | 1 +
 t/t5306-pack-nobase.sh                           | 1 +
 t/t5310-pack-bitmaps.sh                          | 1 +
 t/t5311-pack-bitmaps-shallow.sh                  | 1 +
 t/t5400-send-pack.sh                             | 1 +
 t/t5401-update-hooks.sh                          | 1 +
 t/t5402-post-merge-hook.sh                       | 1 +
 t/t5403-post-checkout-hook.sh                    | 1 +
 t/t5404-tracking-branches.sh                     | 1 +
 t/t5406-remote-rejects.sh                        | 1 +
 t/t5407-post-rewrite-hook.sh                     | 1 +
 t/t5500-fetch-pack.sh                            | 1 +
 t/t5501-fetch-push-alternates.sh                 | 1 +
 t/t5502-quickfetch.sh                            | 1 +
 t/t5505-remote.sh                                | 1 +
 t/t5509-fetch-push-namespaces.sh                 | 1 +
 t/t5510-fetch.sh                                 | 1 +
 t/t5512-ls-remote.sh                             | 1 +
 t/t5514-fetch-multiple.sh                        | 1 +
 t/t5515-fetch-merge-logic.sh                     | 1 +
 t/t5516-fetch-push.sh                            | 1 +
 t/t5519-push-alternates.sh                       | 1 +
 t/t5520-pull.sh                                  | 1 +
 t/t5521-pull-options.sh                          | 1 +
 t/t5522-pull-symlink.sh                          | 1 +
 t/t5524-pull-msg.sh                              | 1 +
 t/t5525-fetch-tagopt.sh                          | 1 +
 t/t5526-fetch-submodules.sh                      | 1 +
 t/t5527-fetch-odd-refs.sh                        | 1 +
 t/t5531-deep-submodule-push.sh                   | 1 +
 t/t5533-push-cas.sh                              | 1 +
 t/t5535-fetch-push-symref.sh                     | 1 +
 t/t5536-fetch-conflicts.sh                       | 1 +
 t/t5537-fetch-shallow.sh                         | 1 +
 t/t5538-push-shallow.sh                          | 1 +
 t/t5539-fetch-http-shallow.sh                    | 1 +
 t/t5540-http-push-webdav.sh                      | 1 +
 t/t5541-http-push-smart.sh                       | 1 +
 t/t5542-push-http-shallow.sh                     | 1 +
 t/t5544-pack-objects-hook.sh                     | 1 +
 t/t5545-push-options.sh                          | 1 +
 t/t5547-push-quarantine.sh                       | 1 +
 t/t5550-http-fetch-dumb.sh                       | 1 +
 t/t5551-http-fetch-smart.sh                      | 1 +
 t/t5560-http-backend-noserver.sh                 | 1 +
 t/t5561-http-backend.sh                          | 1 +
 t/t5570-git-daemon.sh                            | 1 +
 t/t5572-pull-submodule.sh                        | 1 +
 t/t5600-clone-fail-cleanup.sh                    | 1 +
 t/t5601-clone.sh                                 | 1 +
 t/t5604-clone-reference.sh                       | 1 +
 t/t5605-clone-local.sh                           | 1 +
 t/t5606-clone-options.sh                         | 1 +
 t/t5609-clone-branch.sh                          | 1 +
 t/t5610-clone-detached.sh                        | 1 +
 t/t5611-clone-config.sh                          | 1 +
 t/t5612-clone-refspec.sh                         | 1 +
 t/t5613-info-alternate.sh                        | 1 +
 t/t5614-clone-submodules.sh                      | 1 +
 t/t5615-alternate-env.sh                         | 1 +
 t/t5801-remote-helpers.sh                        | 1 +
 t/t5802-connect-helper.sh                        | 1 +
 t/t5810-proto-disable-local.sh                   | 1 +
 t/t5812-proto-disable-http.sh                    | 1 +
 t/t5813-proto-disable-ssh.sh                     | 1 +
 t/t5814-proto-disable-ext.sh                     | 1 +
 t/t5815-submodule-protos.sh                      | 1 +
 t/t5900-repo-selection.sh                        | 1 +
 t/t6008-rev-list-submodule.sh                    | 1 +
 t/t6030-bisect-porcelain.sh                      | 1 +
 t/t6040-tracking-info.sh                         | 1 +
 t/t6041-bisect-submodule.sh                      | 1 +
 t/t6050-replace.sh                               | 1 +
 t/t6060-merge-index.sh                           | 1 +
 t/t6134-pathspec-in-submodule.sh                 | 1 +
 t/t6200-fmt-merge-msg.sh                         | 1 +
 t/t6500-gc.sh                                    | 1 +
 t/t7001-mv.sh                                    | 1 +
 t/t7003-filter-branch.sh                         | 1 +
 t/t7005-editor.sh                                | 1 +
 t/t7006-pager.sh                                 | 1 +
 t/t7008-grep-binary.sh                           | 1 +
 t/t7010-setup.sh                                 | 1 +
 t/t7064-wtstatus-pv2.sh                          | 1 +
 t/t7103-reset-bare.sh                            | 1 +
 t/t7112-reset-submodule.sh                       | 1 +
 t/t7300-clean.sh                                 | 1 +
 t/t7400-submodule-basic.sh                       | 1 +
 t/t7402-submodule-rebase.sh                      | 1 +
 t/t7403-submodule-sync.sh                        | 1 +
 t/t7405-submodule-merge.sh                       | 1 +
 t/t7406-submodule-update.sh                      | 1 +
 t/t7407-submodule-foreach.sh                     | 1 +
 t/t7408-submodule-reference.sh                   | 1 +
 t/t7409-submodule-detached-work-tree.sh          | 1 +
 t/t7410-submodule-checkout-to.sh                 | 1 +
 t/t7411-submodule-config.sh                      | 1 +
 t/t7413-submodule-is-active.sh                   | 1 +
 t/t7504-commit-msg-hook.sh                       | 1 +
 t/t7506-status-submodule.sh                      | 1 +
 t/t7507-commit-verbose.sh                        | 1 +
 t/t7517-per-repo-email.sh                        | 1 +
 t/t7613-merge-submodule.sh                       | 1 +
 t/t7700-repack.sh                                | 1 +
 t/t7800-difftool.sh                              | 1 +
 t/t7810-grep.sh                                  | 1 +
 t/t7814-grep-recurse-submodules.sh               | 1 +
 t/t9001-send-email.sh                            | 1 +
 t/t9020-remote-svn.sh                            | 1 +
 t/t9100-git-svn-basic.sh                         | 1 +
 t/t9101-git-svn-props.sh                         | 1 +
 t/t9102-git-svn-deep-rmdir.sh                    | 1 +
 t/t9103-git-svn-tracked-directory-removed.sh     | 1 +
 t/t9104-git-svn-follow-parent.sh                 | 1 +
 t/t9105-git-svn-commit-diff.sh                   | 1 +
 t/t9106-git-svn-commit-diff-clobber.sh           | 1 +
 t/t9107-git-svn-migrate.sh                       | 1 +
 t/t9108-git-svn-glob.sh                          | 1 +
 t/t9109-git-svn-multi-glob.sh                    | 1 +
 t/t9110-git-svn-use-svm-props.sh                 | 1 +
 t/t9114-git-svn-dcommit-merge.sh                 | 1 +
 t/t9115-git-svn-dcommit-funky-renames.sh         | 1 +
 t/t9116-git-svn-log.sh                           | 1 +
 t/t9117-git-svn-init-clone.sh                    | 1 +
 t/t9118-git-svn-funky-branch-names.sh            | 1 +
 t/t9120-git-svn-clone-with-percent-escapes.sh    | 1 +
 t/t9122-git-svn-author.sh                        | 1 +
 t/t9123-git-svn-rebuild-with-rewriteroot.sh      | 1 +
 t/t9124-git-svn-dcommit-auto-props.sh            | 1 +
 t/t9125-git-svn-multi-glob-branch-names.sh       | 1 +
 t/t9127-git-svn-partial-rebuild.sh               | 1 +
 t/t9128-git-svn-cmd-branch.sh                    | 1 +
 t/t9129-git-svn-i18n-commitencoding.sh           | 1 +
 t/t9131-git-svn-empty-symlink.sh                 | 1 +
 t/t9132-git-svn-broken-symlink.sh                | 1 +
 t/t9133-git-svn-nested-git-repo.sh               | 1 +
 t/t9134-git-svn-ignore-paths.sh                  | 1 +
 t/t9137-git-svn-dcommit-clobber-series.sh        | 1 +
 t/t9138-git-svn-authors-prog.sh                  | 1 +
 t/t9140-git-svn-reset.sh                         | 1 +
 t/t9141-git-svn-multiple-branches.sh             | 1 +
 t/t9142-git-svn-shallow-clone.sh                 | 1 +
 t/t9143-git-svn-gc.sh                            | 1 +
 t/t9144-git-svn-old-rev_map.sh                   | 1 +
 t/t9145-git-svn-master-branch.sh                 | 1 +
 t/t9146-git-svn-empty-dirs.sh                    | 1 +
 t/t9147-git-svn-include-paths.sh                 | 1 +
 t/t9148-git-svn-propset.sh                       | 1 +
 t/t9150-svk-mergetickets.sh                      | 1 +
 t/t9151-svn-mergeinfo.sh                         | 1 +
 t/t9153-git-svn-rewrite-uuid.sh                  | 1 +
 t/t9154-git-svn-fancy-glob.sh                    | 1 +
 t/t9155-git-svn-fetch-deleted-tag.sh             | 1 +
 t/t9156-git-svn-fetch-deleted-tag-2.sh           | 1 +
 t/t9157-git-svn-fetch-merge.sh                   | 1 +
 t/t9158-git-svn-mergeinfo.sh                     | 1 +
 t/t9159-git-svn-no-parent-mergeinfo.sh           | 1 +
 t/t9160-git-svn-preserve-empty-dirs.sh           | 1 +
 t/t9161-git-svn-mergeinfo-push.sh                | 1 +
 t/t9162-git-svn-dcommit-interactive.sh           | 1 +
 t/t9163-git-svn-reset-clears-caches.sh           | 1 +
 t/t9164-git-svn-dcommit-concurrent.sh            | 1 +
 t/t9165-git-svn-fetch-merge-branch-of-branch.sh  | 1 +
 t/t9166-git-svn-fetch-merge-branch-of-branch2.sh | 1 +
 t/t9167-git-svn-cmd-branch-subproject.sh         | 1 +
 t/t9168-git-svn-partially-globbed-names.sh       | 1 +
 t/t9200-git-cvsexportcommit.sh                   | 1 +
 t/t9300-fast-import.sh                           | 1 +
 t/t9350-fast-export.sh                           | 1 +
 t/t9400-git-cvsserver-server.sh                  | 1 +
 t/t9401-git-cvsserver-crlf.sh                    | 1 +
 t/t9402-git-cvsserver-refs.sh                    | 1 +
 t/t9500-gitweb-standalone-no-errors.sh           | 1 +
 t/t9502-gitweb-standalone-parse-output.sh        | 1 +
 t/t9600-cvsimport.sh                             | 1 +
 t/t9601-cvsimport-vendor-branch.sh               | 1 +
 t/t9602-cvsimport-branches-tags.sh               | 1 +
 t/t9604-cvsimport-timestamps.sh                  | 1 +
 t/t9700-perl-git.sh                              | 1 +
 t/t9902-completion.sh                            | 1 +
 232 files changed, 233 insertions(+)

diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh
index 1aa5093f36..8afda030a5 100755
--- a/t/t0000-basic.sh
+++ b/t/t0000-basic.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test the very basics part #1.
 
 The rest of the test suite does not check the basic operation of git
@@ -56,6 +57,7 @@ _run_sub_test_lib_test_common () {
 		cat >"$name.sh" <<-EOF &&
 		#!$SHELL_PATH
 
+		test_fails_on_unusual_directory_names=1
 		test_description='$descr (run in sub test-lib)
 
 		This is run in a sub test-lib so that we do not get incorrect
diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh
index f19ae4f8cc..812f25f8e9 100755
--- a/t/t0003-attributes.sh
+++ b/t/t0003-attributes.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description=gitattributes
 
 . ./test-lib.sh
diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh
index 161f560446..c1db6d6136 100755
--- a/t/t0021-conversion.sh
+++ b/t/t0021-conversion.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='blob conversion via gitattributes'
 
 . ./test-lib.sh
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 444b5a4df8..a53195102f 100755
--- a/t/t0060-path-utils.sh
+++ b/t/t0060-path-utils.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 David Reiss
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test various path utilities'
 
 . ./test-lib.sh
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
index 03bd31e9f2..f4814096a5 100755
--- a/t/t0300-credentials.sh
+++ b/t/t0300-credentials.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='basic credential helper tests'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-credential.sh
diff --git a/t/t0302-credential-store.sh b/t/t0302-credential-store.sh
index 1d8d1f210b..d066f4cb1a 100755
--- a/t/t0302-credential-store.sh
+++ b/t/t0302-credential-store.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='credential-store tests'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-credential.sh
diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh
index b19f332694..2e7bb356ac 100755
--- a/t/t1006-cat-file.sh
+++ b/t/t1006-cat-file.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git cat-file'
 
 . ./test-lib.sh
diff --git a/t/t1013-read-tree-submodule.sh b/t/t1013-read-tree-submodule.sh
index de1ba02dc5..8228c05775 100755
--- a/t/t1013-read-tree-submodule.sh
+++ b/t/t1013-read-tree-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='read-tree can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t1020-subdirectory.sh b/t/t1020-subdirectory.sh
index df3183ea1a..b9c5513f8a 100755
--- a/t/t1020-subdirectory.sh
+++ b/t/t1020-subdirectory.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Try various core-level commands in subdirectory.
 '
 
diff --git a/t/t1050-large.sh b/t/t1050-large.sh
index 6fd264cff0..7b058a3941 100755
--- a/t/t1050-large.sh
+++ b/t/t1050-large.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 # Copyright (c) 2011, Google Inc.
 
+test_fails_on_unusual_directory_names=1
 test_description='adding and checking out large blobs'
 
 . ./test-lib.sh
diff --git a/t/t1060-object-corruption.sh b/t/t1060-object-corruption.sh
index 3f8705139d..ab53e96d5c 100755
--- a/t/t1060-object-corruption.sh
+++ b/t/t1060-object-corruption.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='see how we handle various forms of corruption'
 . ./test-lib.sh
 
diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
index afcca0d52c..2a4ca101a9 100755
--- a/t/t1300-repo-config.sh
+++ b/t/t1300-repo-config.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2005 Johannes Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test git config in different settings'
 
 . ./test-lib.sh
diff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh
index e833939320..f03fda78f0 100755
--- a/t/t1305-config-include.sh
+++ b/t/t1305-config-include.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test config file include directives'
 . ./test-lib.sh
 
diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh
index ff50960cca..449a0e3440 100755
--- a/t/t1308-config-set.sh
+++ b/t/t1308-config-set.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test git config-set API in different settings'
 
 . ./test-lib.sh
diff --git a/t/t1309-early-config.sh b/t/t1309-early-config.sh
index b97357b8ab..99267db020 100755
--- a/t/t1309-early-config.sh
+++ b/t/t1309-early-config.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test read_early_config()'
 
 . ./test-lib.sh
diff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh
index 03d3c7f6d6..50c4a6edf5 100755
--- a/t/t1500-rev-parse.sh
+++ b/t/t1500-rev-parse.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git rev-parse'
 . ./test-lib.sh
 
diff --git a/t/t1504-ceiling-dirs.sh b/t/t1504-ceiling-dirs.sh
index 3d51615e42..fc20a947ed 100755
--- a/t/t1504-ceiling-dirs.sh
+++ b/t/t1504-ceiling-dirs.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test GIT_CEILING_DIRECTORIES'
 . ./test-lib.sh
 
diff --git a/t/t1507-rev-parse-upstream.sh b/t/t1507-rev-parse-upstream.sh
index b23c4e3fab..dd08e4d251 100755
--- a/t/t1507-rev-parse-upstream.sh
+++ b/t/t1507-rev-parse-upstream.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test <branch>@{upstream} syntax'
 
 . ./test-lib.sh
diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh
index 13ae12dfa7..192bd3d822 100755
--- a/t/t1510-repo-setup.sh
+++ b/t/t1510-repo-setup.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description="Tests of cwd/prefix/worktree/gitdir setup in all cases
 
 A few rules for repo setup:
diff --git a/t/t1515-rev-parse-outside-repo.sh b/t/t1515-rev-parse-outside-repo.sh
index 3ec2971ee5..0641651612 100755
--- a/t/t1515-rev-parse-outside-repo.sh
+++ b/t/t1515-rev-parse-outside-repo.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='check that certain rev-parse options work outside repo'
 . ./test-lib.sh
 
diff --git a/t/t2013-checkout-submodule.sh b/t/t2013-checkout-submodule.sh
index e8f70b806f..94d7033009 100755
--- a/t/t2013-checkout-submodule.sh
+++ b/t/t2013-checkout-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='checkout can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t2025-worktree-add.sh b/t/t2025-worktree-add.sh
index b618d6be21..bd0d4633cc 100755
--- a/t/t2025-worktree-add.sh
+++ b/t/t2025-worktree-add.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git worktree add'
 
 . ./test-lib.sh
diff --git a/t/t2027-worktree-list.sh b/t/t2027-worktree-list.sh
index 848da5f368..7b5e802f71 100755
--- a/t/t2027-worktree-list.sh
+++ b/t/t2027-worktree-list.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git worktree list'
 
 . ./test-lib.sh
diff --git a/t/t2028-worktree-move.sh b/t/t2028-worktree-move.sh
index 8298aaf97f..4577add799 100755
--- a/t/t2028-worktree-move.sh
+++ b/t/t2028-worktree-move.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git worktree move, remove, lock and unlock'
 
 . ./test-lib.sh
diff --git a/t/t3040-subprojects-basic.sh b/t/t3040-subprojects-basic.sh
index 0a4ff6d824..0acf434539 100755
--- a/t/t3040-subprojects-basic.sh
+++ b/t/t3040-subprojects-basic.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Basic subproject functionality'
 . ./test-lib.sh
 
diff --git a/t/t3050-subprojects-fetch.sh b/t/t3050-subprojects-fetch.sh
index 2f5f41a012..452c5fb615 100755
--- a/t/t3050-subprojects-fetch.sh
+++ b/t/t3050-subprojects-fetch.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetching and pushing project with subproject'
 
 . ./test-lib.sh
diff --git a/t/t3409-rebase-preserve-merges.sh b/t/t3409-rebase-preserve-merges.sh
index 8c251c57a6..9ce4749fe6 100755
--- a/t/t3409-rebase-preserve-merges.sh
+++ b/t/t3409-rebase-preserve-merges.sh
@@ -2,6 +2,7 @@
 #
 # Copyright(C) 2008 Stephen Habermann & Andreas Ericsson
 #
+test_fails_on_unusual_directory_names=1
 test_description='git rebase -p should preserve merges
 
 Run "git rebase -p" and check that merges are properly carried along
diff --git a/t/t3426-rebase-submodule.sh b/t/t3426-rebase-submodule.sh
index ebf4f5e4b2..3c39d4cdf0 100755
--- a/t/t3426-rebase-submodule.sh
+++ b/t/t3426-rebase-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='rebase can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh
index 4f2a263b63..b8547afe5e 100755
--- a/t/t3501-revert-cherry-pick.sh
+++ b/t/t3501-revert-cherry-pick.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test cherry-pick and revert with renames
 
   --
diff --git a/t/t3512-cherry-pick-submodule.sh b/t/t3512-cherry-pick-submodule.sh
index 6863b7bb6f..37929530a9 100755
--- a/t/t3512-cherry-pick-submodule.sh
+++ b/t/t3512-cherry-pick-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='cherry-pick can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t3513-revert-submodule.sh b/t/t3513-revert-submodule.sh
index db9378142a..980ce5233d 100755
--- a/t/t3513-revert-submodule.sh
+++ b/t/t3513-revert-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='revert can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 3c63455729..1df9b1b5f5 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Carl D. Worth
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test of the various options to git rm.'
 
 . ./test-lib.sh
diff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh
index 3b94283e35..f3af7bd2db 100755
--- a/t/t3900-i18n-commit.sh
+++ b/t/t3900-i18n-commit.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='commit and log output encodings'
 
 . ./test-lib.sh
diff --git a/t/t3906-stash-submodule.sh b/t/t3906-stash-submodule.sh
index d7219d6f8f..4d4d386342 100755
--- a/t/t3906-stash-submodule.sh
+++ b/t/t3906-stash-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='stash apply can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t4027-diff-submodule.sh b/t/t4027-diff-submodule.sh
index 518bf9524e..f7c146b125 100755
--- a/t/t4027-diff-submodule.sh
+++ b/t/t4027-diff-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='difference in submodules'
 
 . ./test-lib.sh
diff --git a/t/t4030-diff-textconv.sh b/t/t4030-diff-textconv.sh
index aad6c7f78d..74ba69efe4 100755
--- a/t/t4030-diff-textconv.sh
+++ b/t/t4030-diff-textconv.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='diff.*.textconv tests'
 . ./test-lib.sh
 
diff --git a/t/t4031-diff-rewrite-binary.sh b/t/t4031-diff-rewrite-binary.sh
index eacc6694f7..01f37948ae 100755
--- a/t/t4031-diff-rewrite-binary.sh
+++ b/t/t4031-diff-rewrite-binary.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='rewrite diff on binary file'
 
 . ./test-lib.sh
diff --git a/t/t4035-diff-quiet.sh b/t/t4035-diff-quiet.sh
index 2f1737fcef..8353b05934 100755
--- a/t/t4035-diff-quiet.sh
+++ b/t/t4035-diff-quiet.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Return value of diffs'
 
 . ./test-lib.sh
diff --git a/t/t4041-diff-submodule-option.sh b/t/t4041-diff-submodule-option.sh
index 2d9731b52d..48163e8736 100755
--- a/t/t4041-diff-submodule-option.sh
+++ b/t/t4041-diff-submodule-option.sh
@@ -4,6 +4,7 @@
 # Copyright (c) 2011 Alexey Shumkin (+ non-UTF-8 commit encoding tests)
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Support for verbose submodule differences in git diff
 
 This test tries to verify the sanity of the --submodule option of git diff.
diff --git a/t/t4059-diff-submodule-not-initialized.sh b/t/t4059-diff-submodule-not-initialized.sh
index cd70fd5192..42d846a40f 100755
--- a/t/t4059-diff-submodule-not-initialized.sh
+++ b/t/t4059-diff-submodule-not-initialized.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2016 Jacob Keller, based on t4041 by Jens Lehmann
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test for submodule diff on non-checked out submodule
 
 This test tries to verify that add_submodule_odb works when the submodule was
diff --git a/t/t4060-diff-submodule-option-diff-format.sh b/t/t4060-diff-submodule-option-diff-format.sh
index 7e23b55ea4..dd3a932816 100755
--- a/t/t4060-diff-submodule-option-diff-format.sh
+++ b/t/t4060-diff-submodule-option-diff-format.sh
@@ -5,6 +5,7 @@
 # Copyright (c) 2016 Jacob Keller (copy + convert to --submodule=diff)
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Support for diff format verbose submodule difference in git diff
 
 This test tries to verify the sanity of --submodule=diff option of git diff.
diff --git a/t/t4137-apply-submodule.sh b/t/t4137-apply-submodule.sh
index a9bd40a6d0..f9943ff9a9 100755
--- a/t/t4137-apply-submodule.sh
+++ b/t/t4137-apply-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git apply handling submodules'
 
 . ./test-lib.sh
diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh
index 0dd8b65d7c..7a7ee7127c 100755
--- a/t/t4203-mailmap.sh
+++ b/t/t4203-mailmap.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='.mailmap configurations'
 
 . ./test-lib.sh
diff --git a/t/t4207-log-decoration-colors.sh b/t/t4207-log-decoration-colors.sh
index b972296f06..fb504b2c72 100755
--- a/t/t4207-log-decoration-colors.sh
+++ b/t/t4207-log-decoration-colors.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Nazri Ramliy
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test for "git log --decorate" colors'
 
 . ./test-lib.sh
diff --git a/t/t4255-am-submodule.sh b/t/t4255-am-submodule.sh
index 0ba8194403..da8c9a7ae5 100755
--- a/t/t4255-am-submodule.sh
+++ b/t/t4255-am-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git am handling submodules'
 
 . ./test-lib.sh
diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh
index 886b6953e4..abe58c54f8 100755
--- a/t/t5000-tar-tree.sh
+++ b/t/t5000-tar-tree.sh
@@ -3,6 +3,7 @@
 # Copyright (C) 2005 Rene Scharfe
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git archive and git get-tar-commit-id test
 
 This test covers the topics of file contents, commit date handling and
diff --git a/t/t5001-archive-attr.sh b/t/t5001-archive-attr.sh
index b04d955bfa..ba7de4e9b0 100755
--- a/t/t5001-archive-attr.sh
+++ b/t/t5001-archive-attr.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git archive attribute tests'
 
 . ./test-lib.sh
diff --git a/t/t5002-archive-attr-pattern.sh b/t/t5002-archive-attr-pattern.sh
index 6667d159ab..acf6937e0f 100755
--- a/t/t5002-archive-attr-pattern.sh
+++ b/t/t5002-archive-attr-pattern.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git archive attribute pattern tests'
 
 . ./test-lib.sh
diff --git a/t/t5003-archive-zip.sh b/t/t5003-archive-zip.sh
index 55c7870997..19d58df57e 100755
--- a/t/t5003-archive-zip.sh
+++ b/t/t5003-archive-zip.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git archive --format=zip test'
 
 . ./test-lib.sh
diff --git a/t/t5150-request-pull.sh b/t/t5150-request-pull.sh
index 82c33b88e7..581c65dc95 100755
--- a/t/t5150-request-pull.sh
+++ b/t/t5150-request-pull.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test workflows involving pull request.'
 
 . ./test-lib.sh
diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index 43a672c345..9e473489b7 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git pack-object
 
 '
diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh
index 133b5842b1..5b5242977b 100755
--- a/t/t5304-prune.sh
+++ b/t/t5304-prune.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Johannes E. Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='prune'
 . ./test-lib.sh
 
diff --git a/t/t5305-include-tag.sh b/t/t5305-include-tag.sh
index a5eca210b8..d4ada345ee 100755
--- a/t/t5305-include-tag.sh
+++ b/t/t5305-include-tag.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git pack-object --include-tag'
 . ./test-lib.sh
 
diff --git a/t/t5306-pack-nobase.sh b/t/t5306-pack-nobase.sh
index f4931c0c2a..6fcb7ab75d 100755
--- a/t/t5306-pack-nobase.sh
+++ b/t/t5306-pack-nobase.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Google Inc.
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-pack-object with missing base
 
 '
diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh
index 424bec7d77..dca58299e1 100755
--- a/t/t5310-pack-bitmaps.sh
+++ b/t/t5310-pack-bitmaps.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='exercise basic bitmap functionality'
 . ./test-lib.sh
 
diff --git a/t/t5311-pack-bitmaps-shallow.sh b/t/t5311-pack-bitmaps-shallow.sh
index 872a95df33..33d724fd52 100755
--- a/t/t5311-pack-bitmaps-shallow.sh
+++ b/t/t5311-pack-bitmaps-shallow.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='check bitmap operation with shallow repositories'
 . ./test-lib.sh
 
diff --git a/t/t5400-send-pack.sh b/t/t5400-send-pack.sh
index 3331e0f534..12cb482300 100755
--- a/t/t5400-send-pack.sh
+++ b/t/t5400-send-pack.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='See why rewinding head breaks send-pack
 
 '
diff --git a/t/t5401-update-hooks.sh b/t/t5401-update-hooks.sh
index 7f278d8ce9..eba223cbfe 100755
--- a/t/t5401-update-hooks.sh
+++ b/t/t5401-update-hooks.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Shawn O. Pearce
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test the update hook infrastructure.'
 . ./test-lib.sh
 
diff --git a/t/t5402-post-merge-hook.sh b/t/t5402-post-merge-hook.sh
index 6eb2ffd6ec..993db78d1f 100755
--- a/t/t5402-post-merge-hook.sh
+++ b/t/t5402-post-merge-hook.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Josh England
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test the post-merge hook.'
 . ./test-lib.sh
 
diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
index fc898c9eac..e925973651 100755
--- a/t/t5403-post-checkout-hook.sh
+++ b/t/t5403-post-checkout-hook.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Josh England
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test the post-checkout hook.'
 . ./test-lib.sh
 
diff --git a/t/t5404-tracking-branches.sh b/t/t5404-tracking-branches.sh
index 2b8c0bac7d..4174d6d5a3 100755
--- a/t/t5404-tracking-branches.sh
+++ b/t/t5404-tracking-branches.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='tracking branch update checks for git push'
 
 . ./test-lib.sh
diff --git a/t/t5406-remote-rejects.sh b/t/t5406-remote-rejects.sh
index 59e80a5ea2..1ac17e8dad 100755
--- a/t/t5406-remote-rejects.sh
+++ b/t/t5406-remote-rejects.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='remote push rejects are reported by client'
 
 . ./test-lib.sh
diff --git a/t/t5407-post-rewrite-hook.sh b/t/t5407-post-rewrite-hook.sh
index 7a48236e87..9458295279 100755
--- a/t/t5407-post-rewrite-hook.sh
+++ b/t/t5407-post-rewrite-hook.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Thomas Rast
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test the post-rewrite hook.'
 . ./test-lib.sh
 
diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh
index b5865b385d..29233cae2a 100755
--- a/t/t5500-fetch-pack.sh
+++ b/t/t5500-fetch-pack.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2005 Johannes Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Testing multi_ack pack fetching'
 
 . ./test-lib.sh
diff --git a/t/t5501-fetch-push-alternates.sh b/t/t5501-fetch-push-alternates.sh
index 1bc57ac03f..01d121b8d7 100755
--- a/t/t5501-fetch-push-alternates.sh
+++ b/t/t5501-fetch-push-alternates.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch/push involving alternates'
 . ./test-lib.sh
 
diff --git a/t/t5502-quickfetch.sh b/t/t5502-quickfetch.sh
index 7a46cbdbe6..44ec47cc4a 100755
--- a/t/t5502-quickfetch.sh
+++ b/t/t5502-quickfetch.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test quickfetch from local'
 
 . ./test-lib.sh
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index a6c0178f3a..3019f37519 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git remote porcelain-ish'
 
 . ./test-lib.sh
diff --git a/t/t5509-fetch-push-namespaces.sh b/t/t5509-fetch-push-namespaces.sh
index 75c570adca..556d3f3dc9 100755
--- a/t/t5509-fetch-push-namespaces.sh
+++ b/t/t5509-fetch-push-namespaces.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch/push involving ref namespaces'
 . ./test-lib.sh
 
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 668c54be41..c0d632361e 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 # Copyright (c) 2006, Junio C Hamano.
 
+test_fails_on_unusual_directory_names=1
 test_description='Per branch config variables affects "git fetch".
 
 '
diff --git a/t/t5512-ls-remote.sh b/t/t5512-ls-remote.sh
index 94fc9be9ce..b69c0314c5 100755
--- a/t/t5512-ls-remote.sh
+++ b/t/t5512-ls-remote.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git ls-remote'
 
 . ./test-lib.sh
diff --git a/t/t5514-fetch-multiple.sh b/t/t5514-fetch-multiple.sh
index 4b4b6673b8..6e14245225 100755
--- a/t/t5514-fetch-multiple.sh
+++ b/t/t5514-fetch-multiple.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch --all works correctly'
 
 . ./test-lib.sh
diff --git a/t/t5515-fetch-merge-logic.sh b/t/t5515-fetch-merge-logic.sh
index 36b0dbc01c..c388a08312 100755
--- a/t/t5515-fetch-merge-logic.sh
+++ b/t/t5515-fetch-merge-logic.sh
@@ -4,6 +4,7 @@
 #
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Merge logic in fetch'
 
 . ./test-lib.sh
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index 177897ea0b..0c251b8f86 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Basic fetch/push functionality.
 
 This test checks the following functionality:
diff --git a/t/t5519-push-alternates.sh b/t/t5519-push-alternates.sh
index 11fcd37700..6ff22e245b 100755
--- a/t/t5519-push-alternates.sh
+++ b/t/t5519-push-alternates.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='push to a repository that borrows from elsewhere'
 
 . ./test-lib.sh
diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh
index 17f4d0fe4e..04b7c5281d 100755
--- a/t/t5520-pull.sh
+++ b/t/t5520-pull.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='pulling into void'
 
 . ./test-lib.sh
diff --git a/t/t5521-pull-options.sh b/t/t5521-pull-options.sh
index ded8f98dbe..dd6b7675b8 100755
--- a/t/t5521-pull-options.sh
+++ b/t/t5521-pull-options.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='pull options'
 
 . ./test-lib.sh
diff --git a/t/t5522-pull-symlink.sh b/t/t5522-pull-symlink.sh
index bcff460d0a..d84115b081 100755
--- a/t/t5522-pull-symlink.sh
+++ b/t/t5522-pull-symlink.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='pulling from symlinked subdir'
 
 . ./test-lib.sh
diff --git a/t/t5524-pull-msg.sh b/t/t5524-pull-msg.sh
index c278adaa5a..b86b431205 100755
--- a/t/t5524-pull-msg.sh
+++ b/t/t5524-pull-msg.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git pull message generation'
 
 . ./test-lib.sh
diff --git a/t/t5525-fetch-tagopt.sh b/t/t5525-fetch-tagopt.sh
index 45815f7378..85d387a9e5 100755
--- a/t/t5525-fetch-tagopt.sh
+++ b/t/t5525-fetch-tagopt.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='tagopt variable affects "git fetch" and is overridden by commandline.'
 
 . ./test-lib.sh
diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh
index f3b0a8d30a..fe48eee142 100755
--- a/t/t5526-fetch-submodules.sh
+++ b/t/t5526-fetch-submodules.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 # Copyright (c) 2010, Jens Lehmann
 
+test_fails_on_unusual_directory_names=1
 test_description='Recursive "git fetch" for submodules'
 
 . ./test-lib.sh
diff --git a/t/t5527-fetch-odd-refs.sh b/t/t5527-fetch-odd-refs.sh
index 207899a99f..cc61c6e66a 100755
--- a/t/t5527-fetch-odd-refs.sh
+++ b/t/t5527-fetch-odd-refs.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test fetching of oddly-named refs'
 . ./test-lib.sh
 
diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh
index f55137f76f..8a9f17ce6f 100755
--- a/t/t5531-deep-submodule-push.sh
+++ b/t/t5531-deep-submodule-push.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='unpack-objects'
 
 . ./test-lib.sh
diff --git a/t/t5533-push-cas.sh b/t/t5533-push-cas.sh
index a2c9e7439f..9490b77c7d 100755
--- a/t/t5533-push-cas.sh
+++ b/t/t5533-push-cas.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='compare & swap push force/delete safety'
 
 . ./test-lib.sh
diff --git a/t/t5535-fetch-push-symref.sh b/t/t5535-fetch-push-symref.sh
index 8ed58d27f2..2542b20cfd 100755
--- a/t/t5535-fetch-push-symref.sh
+++ b/t/t5535-fetch-push-symref.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='avoiding conflicting update thru symref aliasing'
 
 . ./test-lib.sh
diff --git a/t/t5536-fetch-conflicts.sh b/t/t5536-fetch-conflicts.sh
index 2e42cf3316..806dce27a0 100755
--- a/t/t5536-fetch-conflicts.sh
+++ b/t/t5536-fetch-conflicts.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch handles conflicting refspecs correctly'
 
 . ./test-lib.sh
diff --git a/t/t5537-fetch-shallow.sh b/t/t5537-fetch-shallow.sh
index df8d2f095a..d7c7110dab 100755
--- a/t/t5537-fetch-shallow.sh
+++ b/t/t5537-fetch-shallow.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch/clone from a shallow clone'
 
 . ./test-lib.sh
diff --git a/t/t5538-push-shallow.sh b/t/t5538-push-shallow.sh
index ecbf84d21c..452be015b6 100755
--- a/t/t5538-push-shallow.sh
+++ b/t/t5538-push-shallow.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='push from/to a shallow clone'
 
 . ./test-lib.sh
diff --git a/t/t5539-fetch-http-shallow.sh b/t/t5539-fetch-http-shallow.sh
index 5fbf67c446..5d325c1cd9 100755
--- a/t/t5539-fetch-http-shallow.sh
+++ b/t/t5539-fetch-http-shallow.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch/clone from a shallow clone over http'
 
 . ./test-lib.sh
diff --git a/t/t5540-http-push-webdav.sh b/t/t5540-http-push-webdav.sh
index 88ff5a49e4..3815ce69d6 100755
--- a/t/t5540-http-push-webdav.sh
+++ b/t/t5540-http-push-webdav.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test WebDAV http-push
 
 This test runs various sanity checks on http-push.'
diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh
index d38bf32470..6420c7aacb 100755
--- a/t/t5541-http-push-smart.sh
+++ b/t/t5541-http-push-smart.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test smart pushing over http via http-backend'
 . ./test-lib.sh
 
diff --git a/t/t5542-push-http-shallow.sh b/t/t5542-push-http-shallow.sh
index 5165833157..9aa0935f2b 100755
--- a/t/t5542-push-http-shallow.sh
+++ b/t/t5542-push-http-shallow.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='push from/to a shallow clone over http'
 
 . ./test-lib.sh
diff --git a/t/t5544-pack-objects-hook.sh b/t/t5544-pack-objects-hook.sh
index 4357af1525..f18b35a15d 100755
--- a/t/t5544-pack-objects-hook.sh
+++ b/t/t5544-pack-objects-hook.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test custom script in place of pack-objects'
 . ./test-lib.sh
 
diff --git a/t/t5545-push-options.sh b/t/t5545-push-options.sh
index 97065e62b8..cd6786b6a8 100755
--- a/t/t5545-push-options.sh
+++ b/t/t5545-push-options.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='pushing to a repository using push options'
 
 . ./test-lib.sh
diff --git a/t/t5547-push-quarantine.sh b/t/t5547-push-quarantine.sh
index af9fcd833a..6acbcac2dc 100755
--- a/t/t5547-push-quarantine.sh
+++ b/t/t5547-push-quarantine.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='check quarantine of objects during push'
 . ./test-lib.sh
 
diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh
index 87308cdced..94e7ca60bc 100755
--- a/t/t5550-http-fetch-dumb.sh
+++ b/t/t5550-http-fetch-dumb.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test dumb fetching over http via static file'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-httpd.sh
diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh
index a51b7e20d3..205aa47852 100755
--- a/t/t5551-http-fetch-smart.sh
+++ b/t/t5551-http-fetch-smart.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test smart fetching over http via http-backend'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-httpd.sh
diff --git a/t/t5560-http-backend-noserver.sh b/t/t5560-http-backend-noserver.sh
index 9fafcf1945..8b7f814aa9 100755
--- a/t/t5560-http-backend-noserver.sh
+++ b/t/t5560-http-backend-noserver.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git-http-backend-noserver'
 . ./test-lib.sh
 
diff --git a/t/t5561-http-backend.sh b/t/t5561-http-backend.sh
index 90e0d6f0fe..756ccd604b 100755
--- a/t/t5561-http-backend.sh
+++ b/t/t5561-http-backend.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git-http-backend'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-httpd.sh
diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh
index 225a022e8a..1827225e93 100755
--- a/t/t5570-git-daemon.sh
+++ b/t/t5570-git-daemon.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test fetching over git protocol'
 . ./test-lib.sh
 
diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh
index accfa5cc0c..c7fdce9666 100755
--- a/t/t5572-pull-submodule.sh
+++ b/t/t5572-pull-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='pull can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t5600-clone-fail-cleanup.sh b/t/t5600-clone-fail-cleanup.sh
index 4435693bb2..e280c1e6bf 100755
--- a/t/t5600-clone-fail-cleanup.sh
+++ b/t/t5600-clone-fail-cleanup.sh
@@ -3,6 +3,7 @@
 # Copyright (C) 2006 Carl D. Worth <cworth@cworth.org>
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test git clone to cleanup after failure
 
 This test covers the fact that if git clone fails, it should remove
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index b52b8acf98..964cb16a5a 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description=clone
 
 . ./test-lib.sh
diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh
index 4320082b1b..46703dea21 100755
--- a/t/t5604-clone-reference.sh
+++ b/t/t5604-clone-reference.sh
@@ -3,6 +3,7 @@
 # Copyright (C) 2006 Martin Waitz <tali@admingilde.org>
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test clone --reference'
 . ./test-lib.sh
 
diff --git a/t/t5605-clone-local.sh b/t/t5605-clone-local.sh
index 3c087e907c..be9a3e7116 100755
--- a/t/t5605-clone-local.sh
+++ b/t/t5605-clone-local.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test local clone'
 . ./test-lib.sh
 
diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh
index 9e24ec88e6..f282998797 100755
--- a/t/t5606-clone-options.sh
+++ b/t/t5606-clone-options.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='basic clone options'
 . ./test-lib.sh
 
diff --git a/t/t5609-clone-branch.sh b/t/t5609-clone-branch.sh
index 6e7a7be052..34401ad97e 100755
--- a/t/t5609-clone-branch.sh
+++ b/t/t5609-clone-branch.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='clone --branch option'
 . ./test-lib.sh
 
diff --git a/t/t5610-clone-detached.sh b/t/t5610-clone-detached.sh
index 8b0d607df1..b5a5013375 100755
--- a/t/t5610-clone-detached.sh
+++ b/t/t5610-clone-detached.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test cloning a repository with detached HEAD'
 . ./test-lib.sh
 
diff --git a/t/t5611-clone-config.sh b/t/t5611-clone-config.sh
index e4850b778c..d6a1e34a9a 100755
--- a/t/t5611-clone-config.sh
+++ b/t/t5611-clone-config.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='tests for git clone -c key=value'
 . ./test-lib.sh
 
diff --git a/t/t5612-clone-refspec.sh b/t/t5612-clone-refspec.sh
index 7ace2535c8..ab65f48f72 100755
--- a/t/t5612-clone-refspec.sh
+++ b/t/t5612-clone-refspec.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test refspec written by clone-command'
 . ./test-lib.sh
 
diff --git a/t/t5613-info-alternate.sh b/t/t5613-info-alternate.sh
index 895f46bb91..a2beae244c 100755
--- a/t/t5613-info-alternate.sh
+++ b/t/t5613-info-alternate.sh
@@ -3,6 +3,7 @@
 # Copyright (C) 2006 Martin Waitz <tali@admingilde.org>
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test transitive info/alternate entries'
 . ./test-lib.sh
 
diff --git a/t/t5614-clone-submodules.sh b/t/t5614-clone-submodules.sh
index a87d329656..2255124518 100755
--- a/t/t5614-clone-submodules.sh
+++ b/t/t5614-clone-submodules.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test shallow cloning of repos with submodules'
 
 . ./test-lib.sh
diff --git a/t/t5615-alternate-env.sh b/t/t5615-alternate-env.sh
index d2d883f3a1..16d5ae8058 100755
--- a/t/t5615-alternate-env.sh
+++ b/t/t5615-alternate-env.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='handling of alternates in environment variables'
 . ./test-lib.sh
 
diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
index 362b1581e0..a13e116325 100755
--- a/t/t5801-remote-helpers.sh
+++ b/t/t5801-remote-helpers.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Sverre Rabbelier
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test remote-helper import and export commands'
 
 . ./test-lib.sh
diff --git a/t/t5802-connect-helper.sh b/t/t5802-connect-helper.sh
index c6c2661878..9987253240 100755
--- a/t/t5802-connect-helper.sh
+++ b/t/t5802-connect-helper.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='ext::cmd remote "connect" helper'
 . ./test-lib.sh
 
diff --git a/t/t5810-proto-disable-local.sh b/t/t5810-proto-disable-local.sh
index 563592d8a8..7bd038bf1e 100755
--- a/t/t5810-proto-disable-local.sh
+++ b/t/t5810-proto-disable-local.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test disabling of local paths in clone/fetch'
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-proto-disable.sh"
diff --git a/t/t5812-proto-disable-http.sh b/t/t5812-proto-disable-http.sh
index d911afd24c..83e854627c 100755
--- a/t/t5812-proto-disable-http.sh
+++ b/t/t5812-proto-disable-http.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test disabling of git-over-http in clone/fetch'
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-proto-disable.sh"
diff --git a/t/t5813-proto-disable-ssh.sh b/t/t5813-proto-disable-ssh.sh
index a954ead8af..f54d817a64 100755
--- a/t/t5813-proto-disable-ssh.sh
+++ b/t/t5813-proto-disable-ssh.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test disabling of git-over-ssh in clone/fetch'
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-proto-disable.sh"
diff --git a/t/t5814-proto-disable-ext.sh b/t/t5814-proto-disable-ext.sh
index 9d6f7dfa2c..bf3c61a9b4 100755
--- a/t/t5814-proto-disable-ext.sh
+++ b/t/t5814-proto-disable-ext.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test disabling of remote-helper paths in clone/fetch'
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-proto-disable.sh"
diff --git a/t/t5815-submodule-protos.sh b/t/t5815-submodule-protos.sh
index 06f55a1b8a..b0429d0141 100755
--- a/t/t5815-submodule-protos.sh
+++ b/t/t5815-submodule-protos.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test protocol whitelisting with submodules'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-proto-disable.sh
diff --git a/t/t5900-repo-selection.sh b/t/t5900-repo-selection.sh
index 14e59c5b3e..84bdbdf469 100755
--- a/t/t5900-repo-selection.sh
+++ b/t/t5900-repo-selection.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='selecting remote repo in ambiguous cases'
 . ./test-lib.sh
 
diff --git a/t/t6008-rev-list-submodule.sh b/t/t6008-rev-list-submodule.sh
index c4af9ca0a7..ebf5c70f14 100755
--- a/t/t6008-rev-list-submodule.sh
+++ b/t/t6008-rev-list-submodule.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Johannes E. Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git rev-list involving submodules that this repo has'
 
 . ./test-lib.sh
diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh
index 8c2c6eaef8..8d43131265 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/t/t6030-bisect-porcelain.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2007 Christian Couder
 #
+test_fails_on_unusual_directory_names=1
 test_description='Tests git bisect functionality'
 
 exec </dev/null
diff --git a/t/t6040-tracking-info.sh b/t/t6040-tracking-info.sh
index 97a07655a0..54919d1920 100755
--- a/t/t6040-tracking-info.sh
+++ b/t/t6040-tracking-info.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='remote tracking stats'
 
 . ./test-lib.sh
diff --git a/t/t6041-bisect-submodule.sh b/t/t6041-bisect-submodule.sh
index 62b8a2e7bb..bb3c04bd25 100755
--- a/t/t6041-bisect-submodule.sh
+++ b/t/t6041-bisect-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='bisect can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh
index c630aba657..561d021080 100755
--- a/t/t6050-replace.sh
+++ b/t/t6050-replace.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2008 Christian Couder
 #
+test_fails_on_unusual_directory_names=1
 test_description='Tests replace refs functionality'
 
 exec </dev/null
diff --git a/t/t6060-merge-index.sh b/t/t6060-merge-index.sh
index debadbd299..12a646e848 100755
--- a/t/t6060-merge-index.sh
+++ b/t/t6060-merge-index.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='basic git merge-index / git-merge-one-file tests'
 . ./test-lib.sh
 
diff --git a/t/t6134-pathspec-in-submodule.sh b/t/t6134-pathspec-in-submodule.sh
index fd401ca605..4ee5520a31 100755
--- a/t/t6134-pathspec-in-submodule.sh
+++ b/t/t6134-pathspec-in-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test case exclude pathspec'
 
 . ./test-lib.sh
diff --git a/t/t6200-fmt-merge-msg.sh b/t/t6200-fmt-merge-msg.sh
index 2e2fb0e957..5735cdbf3d 100755
--- a/t/t6200-fmt-merge-msg.sh
+++ b/t/t6200-fmt-merge-msg.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006, Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='fmt-merge-msg test'
 
 . ./test-lib.sh
diff --git a/t/t6500-gc.sh b/t/t6500-gc.sh
index 08de2e8ab0..56d3c42bac 100755
--- a/t/t6500-gc.sh
+++ b/t/t6500-gc.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='basic git gc tests
 '
 
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e365d1ff77..64a08d9966 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git mv in subdirs'
 . ./test-lib.sh
 
diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
index 7cb60799be..a1722c3239 100755
--- a/t/t7003-filter-branch.sh
+++ b/t/t7003-filter-branch.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git filter-branch'
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-gpg.sh"
diff --git a/t/t7005-editor.sh b/t/t7005-editor.sh
index 1b530b5022..75e2f4d0ce 100755
--- a/t/t7005-editor.sh
+++ b/t/t7005-editor.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='GIT_EDITOR, core.editor, and stuff'
 
 . ./test-lib.sh
diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh
index 4f3794d415..69ff4884ef 100755
--- a/t/t7006-pager.sh
+++ b/t/t7006-pager.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test automatic use of a pager.'
 
 . ./test-lib.sh
diff --git a/t/t7008-grep-binary.sh b/t/t7008-grep-binary.sh
index 9c9c378119..c49966f1f1 100755
--- a/t/t7008-grep-binary.sh
+++ b/t/t7008-grep-binary.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git grep in binary files'
 
 . ./test-lib.sh
diff --git a/t/t7010-setup.sh b/t/t7010-setup.sh
index 0335a9a158..2e7bae4667 100755
--- a/t/t7010-setup.sh
+++ b/t/t7010-setup.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='setup taking and sanitizing funny paths'
 
 . ./test-lib.sh
diff --git a/t/t7064-wtstatus-pv2.sh b/t/t7064-wtstatus-pv2.sh
index e319fa2e84..195bfbb519 100755
--- a/t/t7064-wtstatus-pv2.sh
+++ b/t/t7064-wtstatus-pv2.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git status --porcelain=v2
 
 This test exercises porcelain V2 output for git status.'
diff --git a/t/t7103-reset-bare.sh b/t/t7103-reset-bare.sh
index afe36a533c..091c88a572 100755
--- a/t/t7103-reset-bare.sh
+++ b/t/t7103-reset-bare.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git reset in a bare repository'
 . ./test-lib.sh
 
diff --git a/t/t7112-reset-submodule.sh b/t/t7112-reset-submodule.sh
index 2eda6adeb1..478ff8550b 100755
--- a/t/t7112-reset-submodule.sh
+++ b/t/t7112-reset-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='reset can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh
index b89fd2a6ad..9d662c857d 100755
--- a/t/t7300-clean.sh
+++ b/t/t7300-clean.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Michael Spang
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git clean basic tests'
 
 . ./test-lib.sh
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index cf77a3a357..1164142b11 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Lars Hjemli
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Basic porcelain support for submodules
 
 This test tries to verify basic sanity of the init, update and status
diff --git a/t/t7402-submodule-rebase.sh b/t/t7402-submodule-rebase.sh
index 8e32f19007..ca289daf05 100755
--- a/t/t7402-submodule-rebase.sh
+++ b/t/t7402-submodule-rebase.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Johannes Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test rebasing, stashing, etc. with submodules'
 
 . ./test-lib.sh
diff --git a/t/t7403-submodule-sync.sh b/t/t7403-submodule-sync.sh
index 0726799e74..be64ff14c3 100755
--- a/t/t7403-submodule-sync.sh
+++ b/t/t7403-submodule-sync.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 David Aguilar
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git submodule sync
 
 These tests exercise the "git submodule sync" subcommand.
diff --git a/t/t7405-submodule-merge.sh b/t/t7405-submodule-merge.sh
index 0d5b42a25b..4b136950f4 100755
--- a/t/t7405-submodule-merge.sh
+++ b/t/t7405-submodule-merge.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='merging with submodules'
 
 . ./test-lib.sh
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index 4ac386d98b..511d2d9c8b 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Red Hat, Inc.
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test updating submodules
 
 This test verifies that "git submodule update" detaches the HEAD of the
diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh
index 6ba5daf42e..d60f4d6078 100755
--- a/t/t7407-submodule-foreach.sh
+++ b/t/t7407-submodule-foreach.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Johan Herland
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test "git submodule foreach"
 
 This test verifies that "git submodule foreach" correctly visits all submodules
diff --git a/t/t7408-submodule-reference.sh b/t/t7408-submodule-reference.sh
index e159fc5035..f8105ebda1 100755
--- a/t/t7408-submodule-reference.sh
+++ b/t/t7408-submodule-reference.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009, Red Hat Inc, Author: Michael S. Tsirkin (mst@redhat.com)
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test clone --reference'
 . ./test-lib.sh
 
diff --git a/t/t7409-submodule-detached-work-tree.sh b/t/t7409-submodule-detached-work-tree.sh
index c20717181e..df6fc441ce 100755
--- a/t/t7409-submodule-detached-work-tree.sh
+++ b/t/t7409-submodule-detached-work-tree.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Daniel Graña
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test submodules on detached working tree
 
 This test verifies that "git submodule" initialization, update and addition works
diff --git a/t/t7410-submodule-checkout-to.sh b/t/t7410-submodule-checkout-to.sh
index 1acef32647..d0f8362477 100755
--- a/t/t7410-submodule-checkout-to.sh
+++ b/t/t7410-submodule-checkout-to.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Combination of submodules and multiple workdirs'
 
 . ./test-lib.sh
diff --git a/t/t7411-submodule-config.sh b/t/t7411-submodule-config.sh
index eea36f1dbe..7befe7748b 100755
--- a/t/t7411-submodule-config.sh
+++ b/t/t7411-submodule-config.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2014 Heiko Voigt
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test submodules config cache infrastructure
 
 This test verifies that parsing .gitmodules configurations directly
diff --git a/t/t7413-submodule-is-active.sh b/t/t7413-submodule-is-active.sh
index 9c785b07ec..e441f5de3c 100755
--- a/t/t7413-submodule-is-active.sh
+++ b/t/t7413-submodule-is-active.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test submodule--helper is-active
 
 This test verifies that `git submodue--helper is-active` correclty identifies
diff --git a/t/t7504-commit-msg-hook.sh b/t/t7504-commit-msg-hook.sh
index 88d4cda299..2f820804e1 100755
--- a/t/t7504-commit-msg-hook.sh
+++ b/t/t7504-commit-msg-hook.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='commit-msg hook'
 
 . ./test-lib.sh
diff --git a/t/t7506-status-submodule.sh b/t/t7506-status-submodule.sh
index d31b34da83..e8ef49f1ec 100755
--- a/t/t7506-status-submodule.sh
+++ b/t/t7506-status-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git status for submodule'
 
 . ./test-lib.sh
diff --git a/t/t7507-commit-verbose.sh b/t/t7507-commit-verbose.sh
index ed2653d46f..35a31a71fe 100755
--- a/t/t7507-commit-verbose.sh
+++ b/t/t7507-commit-verbose.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='verbose commit template'
 . ./test-lib.sh
 
diff --git a/t/t7517-per-repo-email.sh b/t/t7517-per-repo-email.sh
index 2a22fa7588..5306df95d6 100755
--- a/t/t7517-per-repo-email.sh
+++ b/t/t7517-per-repo-email.sh
@@ -4,6 +4,7 @@
 # Copyright (c) 2016 Jeff King
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='per-repo forced setting of email address'
 
 . ./test-lib.sh
diff --git a/t/t7613-merge-submodule.sh b/t/t7613-merge-submodule.sh
index d1e9fcc781..35ca51108c 100755
--- a/t/t7613-merge-submodule.sh
+++ b/t/t7613-merge-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='merge can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index 6061a04147..b4b55d9f3b 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git repack works correctly'
 
 . ./test-lib.sh
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index 0e7f30db2d..4c07fb8692 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009, 2010, 2012, 2013 David Aguilar
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-difftool
 
 Testing basic diff tool invocation
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index cee42097b0..7e6c16ea8c 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git grep various.
 '
 
diff --git a/t/t7814-grep-recurse-submodules.sh b/t/t7814-grep-recurse-submodules.sh
index 5b6eb3a65e..af092b345e 100755
--- a/t/t7814-grep-recurse-submodules.sh
+++ b/t/t7814-grep-recurse-submodules.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test grep recurse-submodules feature
 
 This test verifies the recurse-submodules feature correctly greps across
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index 60a80f60b2..c1d262bd2f 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git send-email'
 . ./test-lib.sh
 
diff --git a/t/t9020-remote-svn.sh b/t/t9020-remote-svn.sh
index 4d81ba1c2c..b853b99ff5 100755
--- a/t/t9020-remote-svn.sh
+++ b/t/t9020-remote-svn.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='tests remote-svn'
 
 . ./test-lib.sh
diff --git a/t/t9100-git-svn-basic.sh b/t/t9100-git-svn-basic.sh
index 8a8ba65a2a..7682c0dc65 100755
--- a/t/t9100-git-svn-basic.sh
+++ b/t/t9100-git-svn-basic.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn basic tests'
 GIT_SVN_LC_ALL=${LC_ALL:-$LANG}
 
diff --git a/t/t9101-git-svn-props.sh b/t/t9101-git-svn-props.sh
index 07bfb63777..9f469b67fd 100755
--- a/t/t9101-git-svn-props.sh
+++ b/t/t9101-git-svn-props.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn property tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9102-git-svn-deep-rmdir.sh b/t/t9102-git-svn-deep-rmdir.sh
index 66cd51102c..c665b32005 100755
--- a/t/t9102-git-svn-deep-rmdir.sh
+++ b/t/t9102-git-svn-deep-rmdir.sh
@@ -1,4 +1,5 @@
 #!/bin/sh
+test_fails_on_unusual_directory_names=1
 test_description='git svn rmdir'
 . ./lib-git-svn.sh
 
diff --git a/t/t9103-git-svn-tracked-directory-removed.sh b/t/t9103-git-svn-tracked-directory-removed.sh
index b28271345c..15d7174226 100755
--- a/t/t9103-git-svn-tracked-directory-removed.sh
+++ b/t/t9103-git-svn-tracked-directory-removed.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn tracking removed top-level path'
 . ./lib-git-svn.sh
 
diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
index cd480edf16..d7eb9c4c5c 100755
--- a/t/t9104-git-svn-follow-parent.sh
+++ b/t/t9104-git-svn-follow-parent.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn fetching'
 . ./lib-git-svn.sh
 
diff --git a/t/t9105-git-svn-commit-diff.sh b/t/t9105-git-svn-commit-diff.sh
index 6ed5f74e25..6e1e4e463c 100755
--- a/t/t9105-git-svn-commit-diff.sh
+++ b/t/t9105-git-svn-commit-diff.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 #
 # Copyright (c) 2006 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn commit-diff'
 . ./lib-git-svn.sh
 
diff --git a/t/t9106-git-svn-commit-diff-clobber.sh b/t/t9106-git-svn-commit-diff-clobber.sh
index dbe8deac0d..c72f70119f 100755
--- a/t/t9106-git-svn-commit-diff-clobber.sh
+++ b/t/t9106-git-svn-commit-diff-clobber.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 #
 # Copyright (c) 2006 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn commit-diff clobber'
 . ./lib-git-svn.sh
 
diff --git a/t/t9107-git-svn-migrate.sh b/t/t9107-git-svn-migrate.sh
index 9f3ef8f2ef..c911dea1a7 100755
--- a/t/t9107-git-svn-migrate.sh
+++ b/t/t9107-git-svn-migrate.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 # Copyright (c) 2006 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn metadata migrations from previous versions'
 . ./lib-git-svn.sh
 
diff --git a/t/t9108-git-svn-glob.sh b/t/t9108-git-svn-glob.sh
index a94286c8ec..190f5c4767 100755
--- a/t/t9108-git-svn-glob.sh
+++ b/t/t9108-git-svn-glob.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 # Copyright (c) 2007 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn globbing refspecs'
 . ./lib-git-svn.sh
 
diff --git a/t/t9109-git-svn-multi-glob.sh b/t/t9109-git-svn-multi-glob.sh
index 8d99e848d4..2a3106739b 100755
--- a/t/t9109-git-svn-multi-glob.sh
+++ b/t/t9109-git-svn-multi-glob.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 # Copyright (c) 2007 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn globbing refspecs'
 . ./lib-git-svn.sh
 
diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.sh
index dde0a3c222..86e570289f 100755
--- a/t/t9110-git-svn-use-svm-props.sh
+++ b/t/t9110-git-svn-use-svm-props.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn useSvmProps test'
 
 . ./lib-git-svn.sh
diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh
index a3d388228a..68f70b70f3 100755
--- a/t/t9114-git-svn-dcommit-merge.sh
+++ b/t/t9114-git-svn-dcommit-merge.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 # Based on a script by Joakim Tjernlund <joakim.tjernlund@transmode.se>
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn dcommit handles merges'
 
 . ./lib-git-svn.sh
diff --git a/t/t9115-git-svn-dcommit-funky-renames.sh b/t/t9115-git-svn-dcommit-funky-renames.sh
index 64bb495834..bd6c519e3e 100755
--- a/t/t9115-git-svn-dcommit-funky-renames.sh
+++ b/t/t9115-git-svn-dcommit-funky-renames.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn dcommit can commit renames of files with ugly names'
 
 . ./lib-git-svn.sh
diff --git a/t/t9116-git-svn-log.sh b/t/t9116-git-svn-log.sh
index 45773ee560..d04c9b05d0 100755
--- a/t/t9116-git-svn-log.sh
+++ b/t/t9116-git-svn-log.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn log tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9117-git-svn-init-clone.sh b/t/t9117-git-svn-init-clone.sh
index 044f65e916..f476f04e0e 100755
--- a/t/t9117-git-svn-init-clone.sh
+++ b/t/t9117-git-svn-init-clone.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn init/clone tests'
 
 . ./lib-git-svn.sh
diff --git a/t/t9118-git-svn-funky-branch-names.sh b/t/t9118-git-svn-funky-branch-names.sh
index 41a026637f..1c43a15c67 100755
--- a/t/t9118-git-svn-funky-branch-names.sh
+++ b/t/t9118-git-svn-funky-branch-names.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn funky branch names'
 . ./lib-git-svn.sh
 
diff --git a/t/t9120-git-svn-clone-with-percent-escapes.sh b/t/t9120-git-svn-clone-with-percent-escapes.sh
index b28a1741e3..307c4d8811 100755
--- a/t/t9120-git-svn-clone-with-percent-escapes.sh
+++ b/t/t9120-git-svn-clone-with-percent-escapes.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Kevin Ballard
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn clone with percent escapes'
 . ./lib-git-svn.sh
 
diff --git a/t/t9122-git-svn-author.sh b/t/t9122-git-svn-author.sh
index 30013b7bb9..260b245cc2 100755
--- a/t/t9122-git-svn-author.sh
+++ b/t/t9122-git-svn-author.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn authorship'
 . ./lib-git-svn.sh
 
diff --git a/t/t9123-git-svn-rebuild-with-rewriteroot.sh b/t/t9123-git-svn-rebuild-with-rewriteroot.sh
index ead404589e..d2c21a8d78 100755
--- a/t/t9123-git-svn-rebuild-with-rewriteroot.sh
+++ b/t/t9123-git-svn-rebuild-with-rewriteroot.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Jan Krüger
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn respects rewriteRoot during rebuild'
 
 . ./lib-git-svn.sh
diff --git a/t/t9124-git-svn-dcommit-auto-props.sh b/t/t9124-git-svn-dcommit-auto-props.sh
index 9f7231d5b7..3109c579b7 100755
--- a/t/t9124-git-svn-dcommit-auto-props.sh
+++ b/t/t9124-git-svn-dcommit-auto-props.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2008 Brad King
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn dcommit honors auto-props'
 
 . ./lib-git-svn.sh
diff --git a/t/t9125-git-svn-multi-glob-branch-names.sh b/t/t9125-git-svn-multi-glob-branch-names.sh
index 0d53fc9014..51bc8f0e6b 100755
--- a/t/t9125-git-svn-multi-glob-branch-names.sh
+++ b/t/t9125-git-svn-multi-glob-branch-names.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 # Copyright (c) 2008 Marcus Griep
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn multi-glob branch names'
 . ./lib-git-svn.sh
 
diff --git a/t/t9127-git-svn-partial-rebuild.sh b/t/t9127-git-svn-partial-rebuild.sh
index 2e4789d061..00edd18c06 100755
--- a/t/t9127-git-svn-partial-rebuild.sh
+++ b/t/t9127-git-svn-partial-rebuild.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Deskin Miller
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn partial-rebuild tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9128-git-svn-cmd-branch.sh b/t/t9128-git-svn-cmd-branch.sh
index 4e95f791db..c887dae35d 100755
--- a/t/t9128-git-svn-cmd-branch.sh
+++ b/t/t9128-git-svn-cmd-branch.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Deskin Miller
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn partial-rebuild tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9129-git-svn-i18n-commitencoding.sh b/t/t9129-git-svn-i18n-commitencoding.sh
index 8dbd6476fa..8a093590cb 100755
--- a/t/t9129-git-svn-i18n-commitencoding.sh
+++ b/t/t9129-git-svn-i18n-commitencoding.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2008 Eric Wong
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn honors i18n.commitEncoding in config'
 
 . ./lib-git-svn.sh
diff --git a/t/t9131-git-svn-empty-symlink.sh b/t/t9131-git-svn-empty-symlink.sh
index f762038f0e..adce5d2adf 100755
--- a/t/t9131-git-svn-empty-symlink.sh
+++ b/t/t9131-git-svn-empty-symlink.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test that git handles an svn repository with empty symlinks'
 
 . ./lib-git-svn.sh
diff --git a/t/t9132-git-svn-broken-symlink.sh b/t/t9132-git-svn-broken-symlink.sh
index aeceffaf7b..9d74572cd3 100755
--- a/t/t9132-git-svn-broken-symlink.sh
+++ b/t/t9132-git-svn-broken-symlink.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test that git handles an svn repository with empty symlinks'
 
 . ./lib-git-svn.sh
diff --git a/t/t9133-git-svn-nested-git-repo.sh b/t/t9133-git-svn-nested-git-repo.sh
index f3c30e63b7..bbdf011514 100755
--- a/t/t9133-git-svn-nested-git-repo.sh
+++ b/t/t9133-git-svn-nested-git-repo.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn property tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9134-git-svn-ignore-paths.sh b/t/t9134-git-svn-ignore-paths.sh
index 09ff10cd9b..cf4240f366 100755
--- a/t/t9134-git-svn-ignore-paths.sh
+++ b/t/t9134-git-svn-ignore-paths.sh
@@ -4,6 +4,7 @@
 # Copyright (c) 2009 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn property tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9137-git-svn-dcommit-clobber-series.sh b/t/t9137-git-svn-dcommit-clobber-series.sh
index 5fa07a369f..cc5814b85f 100755
--- a/t/t9137-git-svn-dcommit-clobber-series.sh
+++ b/t/t9137-git-svn-dcommit-clobber-series.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 #
 # Copyright (c) 2007 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn dcommit clobber series'
 . ./lib-git-svn.sh
 
diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh
index 7d7e9d46bc..72377845e2 100755
--- a/t/t9138-git-svn-authors-prog.sh
+++ b/t/t9138-git-svn-authors-prog.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Eric Wong, Mark Lodato
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn authors prog tests'
 
 . ./lib-git-svn.sh
diff --git a/t/t9140-git-svn-reset.sh b/t/t9140-git-svn-reset.sh
index e855904629..11dad1fa84 100755
--- a/t/t9140-git-svn-reset.sh
+++ b/t/t9140-git-svn-reset.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Ben Jackson
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn reset'
 . ./lib-git-svn.sh
 
diff --git a/t/t9141-git-svn-multiple-branches.sh b/t/t9141-git-svn-multiple-branches.sh
index 8e7f7d68b7..76ed3475aa 100755
--- a/t/t9141-git-svn-multiple-branches.sh
+++ b/t/t9141-git-svn-multiple-branches.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Marc Branchaud
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn multiple branch and tag paths in the svn repo'
 . ./lib-git-svn.sh
 
diff --git a/t/t9142-git-svn-shallow-clone.sh b/t/t9142-git-svn-shallow-clone.sh
index 9ee23be640..d116d0a9e8 100755
--- a/t/t9142-git-svn-shallow-clone.sh
+++ b/t/t9142-git-svn-shallow-clone.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn shallow clone'
 . ./lib-git-svn.sh
 
diff --git a/t/t9143-git-svn-gc.sh b/t/t9143-git-svn-gc.sh
index 4594e1ae2f..452c73ba5f 100755
--- a/t/t9143-git-svn-gc.sh
+++ b/t/t9143-git-svn-gc.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2009 Robert Allan Zeh
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn gc basic tests'
 
 . ./lib-git-svn.sh
diff --git a/t/t9144-git-svn-old-rev_map.sh b/t/t9144-git-svn-old-rev_map.sh
index 7600a35cd4..12351951d6 100755
--- a/t/t9144-git-svn-old-rev_map.sh
+++ b/t/t9144-git-svn-old-rev_map.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2009 Eric Wong
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn old rev_map preservd'
 . ./lib-git-svn.sh
 
diff --git a/t/t9145-git-svn-master-branch.sh b/t/t9145-git-svn-master-branch.sh
index 3bbf341f6a..44f40db9bd 100755
--- a/t/t9145-git-svn-master-branch.sh
+++ b/t/t9145-git-svn-master-branch.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2009 Eric Wong
 #
+test_fails_on_unusual_directory_names=1
 test_description='git svn initial master branch is "trunk" if possible'
 . ./lib-git-svn.sh
 
diff --git a/t/t9146-git-svn-empty-dirs.sh b/t/t9146-git-svn-empty-dirs.sh
index 6d3130e618..25aadc3986 100755
--- a/t/t9146-git-svn-empty-dirs.sh
+++ b/t/t9146-git-svn-empty-dirs.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2009 Eric Wong
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn creates empty directories'
 . ./lib-git-svn.sh
 
diff --git a/t/t9147-git-svn-include-paths.sh b/t/t9147-git-svn-include-paths.sh
index a90ff58629..8233aca9cd 100755
--- a/t/t9147-git-svn-include-paths.sh
+++ b/t/t9147-git-svn-include-paths.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2013 Paul Walmsley - based on t9134 by Vitaly Shukela
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn property tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9148-git-svn-propset.sh b/t/t9148-git-svn-propset.sh
index 102639090c..92aa6e2427 100755
--- a/t/t9148-git-svn-propset.sh
+++ b/t/t9148-git-svn-propset.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2014 Alfred Perlstein
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn propset tests'
 
 . ./lib-git-svn.sh
diff --git a/t/t9150-svk-mergetickets.sh b/t/t9150-svk-mergetickets.sh
index 1bb676bede..ac6678e92c 100755
--- a/t/t9150-svk-mergetickets.sh
+++ b/t/t9150-svk-mergetickets.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Sam Vilain
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-svn svk merge tickets'
 
 . ./lib-git-svn.sh
diff --git a/t/t9151-svn-mergeinfo.sh b/t/t9151-svn-mergeinfo.sh
index 4f6c06ecb2..4028619246 100755
--- a/t/t9151-svn-mergeinfo.sh
+++ b/t/t9151-svn-mergeinfo.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007, 2009 Sam Vilain
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-svn svn mergeinfo properties'
 
 . ./lib-git-svn.sh
diff --git a/t/t9153-git-svn-rewrite-uuid.sh b/t/t9153-git-svn-rewrite-uuid.sh
index 372ef15685..5895175ce6 100755
--- a/t/t9153-git-svn-rewrite-uuid.sh
+++ b/t/t9153-git-svn-rewrite-uuid.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Jay Soffian
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn --rewrite-uuid test'
 
 . ./lib-git-svn.sh
diff --git a/t/t9154-git-svn-fancy-glob.sh b/t/t9154-git-svn-fancy-glob.sh
index a0150f057d..1318b9a865 100755
--- a/t/t9154-git-svn-fancy-glob.sh
+++ b/t/t9154-git-svn-fancy-glob.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Jay Soffian
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn fancy glob test'
 
 . ./lib-git-svn.sh
diff --git a/t/t9155-git-svn-fetch-deleted-tag.sh b/t/t9155-git-svn-fetch-deleted-tag.sh
index 184336f346..b36f10f818 100755
--- a/t/t9155-git-svn-fetch-deleted-tag.sh
+++ b/t/t9155-git-svn-fetch-deleted-tag.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn fetch deleted tag'
 
 . ./lib-git-svn.sh
diff --git a/t/t9156-git-svn-fetch-deleted-tag-2.sh b/t/t9156-git-svn-fetch-deleted-tag-2.sh
index 7a6e33ba3c..9a7b721809 100755
--- a/t/t9156-git-svn-fetch-deleted-tag-2.sh
+++ b/t/t9156-git-svn-fetch-deleted-tag-2.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn fetch deleted tag 2'
 
 . ./lib-git-svn.sh
diff --git a/t/t9157-git-svn-fetch-merge.sh b/t/t9157-git-svn-fetch-merge.sh
index 991d2aa1be..cd0d534deb 100755
--- a/t/t9157-git-svn-fetch-merge.sh
+++ b/t/t9157-git-svn-fetch-merge.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Steven Walter
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn merge detection'
 . ./lib-git-svn.sh
 
diff --git a/t/t9158-git-svn-mergeinfo.sh b/t/t9158-git-svn-mergeinfo.sh
index a875b45102..5feb615447 100755
--- a/t/t9158-git-svn-mergeinfo.sh
+++ b/t/t9158-git-svn-mergeinfo.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Steven Walter
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn mergeinfo propagation'
 
 . ./lib-git-svn.sh
diff --git a/t/t9159-git-svn-no-parent-mergeinfo.sh b/t/t9159-git-svn-no-parent-mergeinfo.sh
index 69e4815781..ac8a201ff4 100755
--- a/t/t9159-git-svn-no-parent-mergeinfo.sh
+++ b/t/t9159-git-svn-no-parent-mergeinfo.sh
@@ -1,4 +1,5 @@
 #!/bin/sh
+test_fails_on_unusual_directory_names=1
 test_description='git svn handling of root commits in merge ranges'
 . ./lib-git-svn.sh
 
diff --git a/t/t9160-git-svn-preserve-empty-dirs.sh b/t/t9160-git-svn-preserve-empty-dirs.sh
index 0ede3cfedb..7db7ac485d 100755
--- a/t/t9160-git-svn-preserve-empty-dirs.sh
+++ b/t/t9160-git-svn-preserve-empty-dirs.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2011 Ray Chen
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn test (option --preserve-empty-dirs)
 
 This test uses git to clone a Subversion repository that contains empty
diff --git a/t/t9161-git-svn-mergeinfo-push.sh b/t/t9161-git-svn-mergeinfo-push.sh
index f113acaa6c..c216273eb3 100755
--- a/t/t9161-git-svn-mergeinfo-push.sh
+++ b/t/t9161-git-svn-mergeinfo-push.sh
@@ -4,6 +4,7 @@
 # Portions copyright (c) 2011 Bryan Jacobs
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-svn svn mergeinfo propagation'
 
 . ./lib-git-svn.sh
diff --git a/t/t9162-git-svn-dcommit-interactive.sh b/t/t9162-git-svn-dcommit-interactive.sh
index e38d9fa37b..5ab85c210a 100755
--- a/t/t9162-git-svn-dcommit-interactive.sh
+++ b/t/t9162-git-svn-dcommit-interactive.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2011 Frédéric Heitzmann
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn dcommit --interactive series'
 . ./lib-git-svn.sh
 
diff --git a/t/t9163-git-svn-reset-clears-caches.sh b/t/t9163-git-svn-reset-clears-caches.sh
index d6245cee08..54111aa873 100755
--- a/t/t9163-git-svn-reset-clears-caches.sh
+++ b/t/t9163-git-svn-reset-clears-caches.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Peter Baumann
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn reset clears memoized caches'
 . ./lib-git-svn.sh
 
diff --git a/t/t9164-git-svn-dcommit-concurrent.sh b/t/t9164-git-svn-dcommit-concurrent.sh
index d8464d4218..af33c9ab92 100755
--- a/t/t9164-git-svn-dcommit-concurrent.sh
+++ b/t/t9164-git-svn-dcommit-concurrent.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Robert Luberda
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='concurrent git svn dcommit'
 . ./lib-git-svn.sh
 
diff --git a/t/t9165-git-svn-fetch-merge-branch-of-branch.sh b/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
index fa3ef3b1f7..eae3144c37 100755
--- a/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
+++ b/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Steven Walter
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn merge detection'
 . ./lib-git-svn.sh
 
diff --git a/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh b/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
index 52f2e46a5b..a48d18ce94 100755
--- a/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
+++ b/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Steven Walter
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn merge detection'
 . ./lib-git-svn.sh
 
diff --git a/t/t9167-git-svn-cmd-branch-subproject.sh b/t/t9167-git-svn-cmd-branch-subproject.sh
index ba35fc06fc..112a8bf51f 100755
--- a/t/t9167-git-svn-cmd-branch-subproject.sh
+++ b/t/t9167-git-svn-cmd-branch-subproject.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2013 Tobias Schulte
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn branch for subproject clones'
 . ./lib-git-svn.sh
 
diff --git a/t/t9168-git-svn-partially-globbed-names.sh b/t/t9168-git-svn-partially-globbed-names.sh
index 8b22f2272c..7283cb282a 100755
--- a/t/t9168-git-svn-partially-globbed-names.sh
+++ b/t/t9168-git-svn-partially-globbed-names.sh
@@ -1,4 +1,5 @@
 #!/bin/sh
+test_fails_on_unusual_directory_names=1
 test_description='git svn globbing refspecs with prefixed globs'
 . ./lib-git-svn.sh
 
diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
index 1319415ba8..7efd2c48c9 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) Robin Rosenberg
 #
+test_fails_on_unusual_directory_names=1
 test_description='Test export of commits to CVS'
 
 . ./test-lib.sh
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index 2e0ba3ebd8..c596269e0e 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Shawn Pearce
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test git fast-import utility'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index b5149fde6e..805fecf89d 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Johannes E. Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git fast-export'
 . ./test-lib.sh
 
diff --git a/t/t9400-git-cvsserver-server.sh b/t/t9400-git-cvsserver-server.sh
index 432c61d246..3a8109d42d 100755
--- a/t/t9400-git-cvsserver-server.sh
+++ b/t/t9400-git-cvsserver-server.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Frank Lichtenheld
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-cvsserver access
 
 tests read access to a git repository with the
diff --git a/t/t9401-git-cvsserver-crlf.sh b/t/t9401-git-cvsserver-crlf.sh
index 84787eee9a..2771407f74 100755
--- a/t/t9401-git-cvsserver-crlf.sh
+++ b/t/t9401-git-cvsserver-crlf.sh
@@ -4,6 +4,7 @@
 # Parts adapted from other tests.
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-cvsserver -kb modes
 
 tests -kb mode for binary files when accessing a git
diff --git a/t/t9402-git-cvsserver-refs.sh b/t/t9402-git-cvsserver-refs.sh
index 6d2d3c8739..643fcfbad0 100755
--- a/t/t9402-git-cvsserver-refs.sh
+++ b/t/t9402-git-cvsserver-refs.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git-cvsserver and git refspecs
 
 tests ability for git-cvsserver to switch between and compare
diff --git a/t/t9500-gitweb-standalone-no-errors.sh b/t/t9500-gitweb-standalone-no-errors.sh
index 6d06ed96cb..0845149409 100755
--- a/t/t9500-gitweb-standalone-no-errors.sh
+++ b/t/t9500-gitweb-standalone-no-errors.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Jakub Narebski
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='gitweb as standalone script (basic tests).
 
 This test runs gitweb (git web interface) as CGI script from
diff --git a/t/t9502-gitweb-standalone-parse-output.sh b/t/t9502-gitweb-standalone-parse-output.sh
index 0796a438bc..bf6352b084 100755
--- a/t/t9502-gitweb-standalone-parse-output.sh
+++ b/t/t9502-gitweb-standalone-parse-output.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Mark Rada
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='gitweb as standalone script (parsing script output).
 
 This test runs gitweb (git web interface) as a CGI script from the
diff --git a/t/t9600-cvsimport.sh b/t/t9600-cvsimport.sh
index 804ce3850f..678dd8236a 100755
--- a/t/t9600-cvsimport.sh
+++ b/t/t9600-cvsimport.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git cvsimport basic tests'
 . ./lib-cvs.sh
 
diff --git a/t/t9601-cvsimport-vendor-branch.sh b/t/t9601-cvsimport-vendor-branch.sh
index 827d39f5bf..25f971c7b2 100755
--- a/t/t9601-cvsimport-vendor-branch.sh
+++ b/t/t9601-cvsimport-vendor-branch.sh
@@ -31,6 +31,7 @@
 #       Like imported-twice.txt, but with a vendor branch whose branch
 #       tag has been removed.
 
+test_fails_on_unusual_directory_names=1
 test_description='git cvsimport handling of vendor branches'
 . ./lib-cvs.sh
 
diff --git a/t/t9602-cvsimport-branches-tags.sh b/t/t9602-cvsimport-branches-tags.sh
index e1db323f54..6ffcb139e4 100755
--- a/t/t9602-cvsimport-branches-tags.sh
+++ b/t/t9602-cvsimport-branches-tags.sh
@@ -3,6 +3,7 @@
 # A description of the repository used for this test can be found in
 # t9602/README.
 
+test_fails_on_unusual_directory_names=1
 test_description='git cvsimport handling of branches and tags'
 . ./lib-cvs.sh
 
diff --git a/t/t9604-cvsimport-timestamps.sh b/t/t9604-cvsimport-timestamps.sh
index a4b3db24bd..32119a5294 100755
--- a/t/t9604-cvsimport-timestamps.sh
+++ b/t/t9604-cvsimport-timestamps.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git cvsimport timestamps'
 . ./lib-cvs.sh
 
diff --git a/t/t9700-perl-git.sh b/t/t9700-perl-git.sh
index 102c133112..54ea4990c2 100755
--- a/t/t9700-perl-git.sh
+++ b/t/t9700-perl-git.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Lea Wiemann
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='perl interface (Git.pm)'
 . ./test-lib.sh
 
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 5ed28135be..0231e9692a 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Felipe Contreras
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test bash completion'
 
 . ./lib-bash.sh
-- 
2.11.0


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-09 19:11 [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names Ævar Arnfjörð Bjarmason
  2017-04-09 19:11 ` [PATCH 1/2] tests: mark tests that fail when the TEST_DIRECTORY is unusual Ævar Arnfjörð Bjarmason
@ 2017-04-09 19:11 ` Ævar Arnfjörð Bjarmason
  2017-04-10  1:47   ` SZEDER Gábor
  2017-04-10 23:23   ` Ævar Arnfjörð Bjarmason
  2017-04-09 20:37 ` [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names Joachim Durchholz
  2 siblings, 2 replies; 25+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2017-04-09 19:11 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Brandon Williams, Jeff King, Joachim Durchholz,
	Stefan Beller, Ævar Arnfjörð Bjarmason

Change the test library to insert non-alphanumeric ASCII characters
into the TRASH_DIRECTORY name, that's the directory the test library
creates, chdirs to and runs each individual test from.

Unless test_fails_on_unusual_directory_names=1 is declared before
importing test-lib.sh (and if perl isn't available on the system), the
trash directory will contain every non-alphanumeric character in
ASCII, in order.

This includes all the control characters, !, [], {} etc. the "."
character isn't included because it's already in the directory name,
and nor is "/" for obvious reasons, although that would actually work,
we'd just create a subdirectory, which would make the tests harder to
inspect when they fail.i

This change is inspired by the "submodule: prevent backslash expantion
in submodule names" patch[1]. If we'd had backslashes in the
TRASH_DIRECTORY all along that bug would have been fixed a long time
ago. This will flag such issues by marking tests that currently fail
with "test_fails_on_unusual_directory_names=1", ensure that new tests
aren't added unless a discussion is had about why the code can't
handle unusual pathnames, and prevent future regressions.

1. <20170407172306.172673-1-bmwill@google.com>
---
 t/README      | 12 ++++++++++++
 t/test-lib.sh |  4 ++++
 2 files changed, 16 insertions(+)

diff --git a/t/README b/t/README
index ab386c3681..314dd40221 100644
--- a/t/README
+++ b/t/README
@@ -345,6 +345,18 @@ assignment to variable 'test_description', like this:
 	This test registers the following structure in the cache
 	and tries to run git-ls-files with option --frotz.'
 
+By default the tests will be run from a directory with a highly
+unusual filename that includes control characters, a newline, various
+punctuation etc., this is done to smoke out any bugs related to path
+handling. If for whatever reason the tests can't deal with such
+unusual path names, set:
+
+    test_fails_on_unusual_directory_names=1
+
+Before sourcing 'test-lib.sh' as described below. This option is
+mainly intended to grandfather in existing broken tests & code, and
+should usually not be used in new code, instead your tests or code
+probably need fixing.
 
 Source 'test-lib.sh'
 --------------------
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 13b5696822..089ff5ac7d 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -914,6 +914,10 @@ fi
 
 # Test repository
 TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)"
+if test -z "$test_fails_on_unusual_directory_names" -a "$(perl -e 'print 1+1' 2>/dev/null)" = "2"
+then
+   TRASH_DIRECTORY="$TRASH_DIRECTORY.$(perl -e 'print join q[], grep { /[^[:alnum:]]/ and !m<[./]> } map chr, 0x01..0x7f')"
+fi
 test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY"
 case "$TRASH_DIRECTORY" in
 /*) ;; # absolute path is good
-- 
2.11.0


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names
  2017-04-09 19:11 [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names Ævar Arnfjörð Bjarmason
  2017-04-09 19:11 ` [PATCH 1/2] tests: mark tests that fail when the TEST_DIRECTORY is unusual Ævar Arnfjörð Bjarmason
  2017-04-09 19:11 ` [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name Ævar Arnfjörð Bjarmason
@ 2017-04-09 20:37 ` Joachim Durchholz
  2 siblings, 0 replies; 25+ messages in thread
From: Joachim Durchholz @ 2017-04-09 20:37 UTC (permalink / raw)
  To: git

Am 09.04.2017 um 21:11 schrieb Ævar Arnfjörð Bjarmason:
> This series changes the test library so that we interpolate the result
> of:
>
>     perl -e 'print join q[], grep { /[^[:alnum:]]/ and !m<[./]> } map chr, 0x01..0x7f'
>
> Into the trash directory name we generate. Doing this makes 30% of the
> test suite fail.

Wow.
I know that I tend to bring out weird errors in systems, but this is 
much deeper than I could have ever expected.

You might want to additionally test directory names like "asdf" and 
'asdf' - some shell might try to be smart about such names and 
automatically unquote them. This would probably mean running the test 
suite multiple times, which some people find offensive (myself included).

There's also high-bit characters that might cause oddness. 0x80 and 0xff 
look like interesting edge cases to me.
Note that just appending these bytes is going to cause failures with 
filesystems that expect UTF-8 file names, you'd want to use a Unicode 
code point that gets encoded using a 0x80 resp. 0xff byte (I suspect 
0xff is actually not a valid UTF-8 encoding at all but I'd have to 
double-check that).

Is git supposed to run fine under Windows, or under Linux with an ntfs 
filesystem driver?
If yes, then I'd expect this patch to cause the other 70% of tests to 
crash, because NTFS forbids several non-alnum printable characters, 
among them <=>\

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-09 19:11 ` [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name Ævar Arnfjörð Bjarmason
@ 2017-04-10  1:47   ` SZEDER Gábor
  2017-04-10  8:02     ` Ævar Arnfjörð Bjarmason
  2017-04-10 23:23   ` Ævar Arnfjörð Bjarmason
  1 sibling, 1 reply; 25+ messages in thread
From: SZEDER Gábor @ 2017-04-10  1:47 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: SZEDER Gábor, Junio C Hamano, Brandon Williams, Jeff King,
	Joachim Durchholz, Stefan Beller, git

> Change the test library to insert non-alphanumeric ASCII characters
> into the TRASH_DIRECTORY name, that's the directory the test library
> creates, chdirs to and runs each individual test from.
> 
> Unless test_fails_on_unusual_directory_names=1 is declared before
> importing test-lib.sh (and if perl isn't available on the system), the
> trash directory will contain every non-alphanumeric character in
> ASCII, in order.

At the very least there must be an easier way to disable this, e.g. a
command line option.

This change is sure effective in smoking out bugs, but it's a major
annoyance during development when it comes to debugging a test.  At
first I could not even cd into the trash directory, because TAB
completing the directory name with all those non-printable characters
didn't work (this may be a bug in the bash-completion package).  And
simply copy-pasting the dirname didn't work either, because 'ls'
displayed it as

  trash directory.t9902-completion.??????????????????????????????? !"#$%&'()*+,-:;<=>?@[\]^_`{|}~?

After some headscratching, Sunday night may be my excuse, I figured
out that 'cd tr*' works...  only to be greeted with the ugliest-ever
three-line(!) shell prompt.

Therefore I would say that this should not even be enabled by default
in test-lib.sh, so at least running a test directly from the command
line as ./t1234-foo.sh would considerately give us an easily
accessible trash directory even without any command line options.  We
could enable it for 'make test' by default via GIT_TEST_OPTS in
t/Makefile, though.


> This includes all the control characters, !, [], {} etc. the "."
> character isn't included because it's already in the directory name,
> and nor is "/" for obvious reasons, although that would actually work,
> we'd just create a subdirectory, which would make the tests harder to
> inspect when they fail.i

1. Heh.  How an additional subdirectory would make the tests harder to
   inspect is nothing compared to the effect of all the other
   characters.

2. s/i$//

> This change is inspired by the "submodule: prevent backslash expantion
> in submodule names" patch[1]. If we'd had backslashes in the
> TRASH_DIRECTORY all along that bug would have been fixed a long time
> ago. This will flag such issues by marking tests that currently fail
> with "test_fails_on_unusual_directory_names=1", ensure that new tests
> aren't added unless a discussion is had about why the code can't
> handle unusual pathnames, and prevent future regressions.
> 
> 1. <20170407172306.172673-1-bmwill@google.com>
> ---
>  t/README      | 12 ++++++++++++
>  t/test-lib.sh |  4 ++++
>  2 files changed, 16 insertions(+)
> 
> diff --git a/t/README b/t/README
> index ab386c3681..314dd40221 100644
> --- a/t/README
> +++ b/t/README
> @@ -345,6 +345,18 @@ assignment to variable 'test_description', like this:
>  	This test registers the following structure in the cache
>  	and tries to run git-ls-files with option --frotz.'
>  
> +By default the tests will be run from a directory with a highly
> +unusual filename that includes control characters, a newline, various
> +punctuation etc., this is done to smoke out any bugs related to path
> +handling. If for whatever reason the tests can't deal with such
> +unusual path names, set:
> +
> +    test_fails_on_unusual_directory_names=1
> +
> +Before sourcing 'test-lib.sh' as described below. This option is
> +mainly intended to grandfather in existing broken tests & code, and
> +should usually not be used in new code, instead your tests or code
> +probably need fixing.
> 
>  Source 'test-lib.sh'
>  --------------------
> diff --git a/t/test-lib.sh b/t/test-lib.sh
> index 13b5696822..089ff5ac7d 100644
> --- a/t/test-lib.sh
> +++ b/t/test-lib.sh
> @@ -914,6 +914,10 @@ fi
>  
>  # Test repository
>  TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)"
> +if test -z "$test_fails_on_unusual_directory_names" -a "$(perl -e 'print 1+1' 2>/dev/null)" = "2"
> +then
> +   TRASH_DIRECTORY="$TRASH_DIRECTORY.$(perl -e 'print join q[], grep { /[^[:alnum:]]/ and !m<[./]> } map chr, 0x01..0x7f')"
> +fi
>  test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY"
>  case "$TRASH_DIRECTORY" in
>  /*) ;; # absolute path is good
> -- 
> 2.11.0



^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10  1:47   ` SZEDER Gábor
@ 2017-04-10  8:02     ` Ævar Arnfjörð Bjarmason
  2017-04-10 11:19       ` SZEDER Gábor
  0 siblings, 1 reply; 25+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2017-04-10  8:02 UTC (permalink / raw)
  To: SZEDER Gábor
  Cc: Junio C Hamano, Brandon Williams, Jeff King, Joachim Durchholz,
	Stefan Beller, Git Mailing List

On Mon, Apr 10, 2017 at 3:47 AM, SZEDER Gábor <szeder.dev@gmail.com> wrote:
>> Change the test library to insert non-alphanumeric ASCII characters
>> into the TRASH_DIRECTORY name, that's the directory the test library
>> creates, chdirs to and runs each individual test from.
>>
>> Unless test_fails_on_unusual_directory_names=1 is declared before
>> importing test-lib.sh (and if perl isn't available on the system), the
>> trash directory will contain every non-alphanumeric character in
>> ASCII, in order.
>
> At the very least there must be an easier way to disable this, e.g. a
> command line option.
>
> This change is sure effective in smoking out bugs, but it's a major
> annoyance during development when it comes to debugging a test.  At
> first I could not even cd into the trash directory, because TAB
> completing the directory name with all those non-printable characters
> didn't work (this may be a bug in the bash-completion package).  And
> simply copy-pasting the dirname didn't work either, because 'ls'
>
>   trash directory.t9902-completion.??????????????????????????????? !"#$%&'()*+,-:;<=>?@[\]^_`{|}~?
>
> After some headscratching, Sunday night may be my excuse, I figured
> out that 'cd tr*' works...  only to be greeted with the ugliest-ever
> three-line(!) shell prompt.
>
> Therefore I would say that this should not even be enabled by default
> in test-lib.sh, so at least running a test directly from the command
> line as ./t1234-foo.sh would considerately give us an easily
> accessible trash directory even without any command line options.  We
> could enable it for 'make test' by default via GIT_TEST_OPTS in
> t/Makefile, though.

This definitely needs some tweaking as you and Joachim point out. E.g.
some capabilities check in the test suite to check if we can even
create these sorts of paths on the local filesystem.

A couple of comments on the above though:

a) If we have something that's a more strict mode that makes tests
fail due to buggy code in various scenarios, we gain the most from
having it on by default, and having some optional mode to have devs
e.g. disable it for manual inspection of the test directories.

Most of the running of the test suite that really matters, i.e. just
before the software is delivered to end users, is going to be running
in some non-interactive build system preparing a package.

b) I think any sort of magic like using it with 'make test', but not
when the *.sh is manually run, will just lead to frustrating seemingly
heisenbugs from people trying to debug the test suite when things do
fail, i.e. you run 'make test' on some obscure platform we haven't
fixed path bugs on, 10 fail, you manually inspect them and every one
of them succeeds, because some --use-garbage-dirs option wasn't
passed.

>> This includes all the control characters, !, [], {} etc. the "."
>> character isn't included because it's already in the directory name,
>> and nor is "/" for obvious reasons, although that would actually work,
>> we'd just create a subdirectory, which would make the tests harder to
>> inspect when they fail.i
>
> 1. Heh.  How an additional subdirectory would make the tests harder to
>    inspect is nothing compared to the effect of all the other
>    characters.
>
> 2. s/i$//
>
>> This change is inspired by the "submodule: prevent backslash expantion
>> in submodule names" patch[1]. If we'd had backslashes in the
>> TRASH_DIRECTORY all along that bug would have been fixed a long time
>> ago. This will flag such issues by marking tests that currently fail
>> with "test_fails_on_unusual_directory_names=1", ensure that new tests
>> aren't added unless a discussion is had about why the code can't
>> handle unusual pathnames, and prevent future regressions.
>>
>> 1. <20170407172306.172673-1-bmwill@google.com>
>> ---
>>  t/README      | 12 ++++++++++++
>>  t/test-lib.sh |  4 ++++
>>  2 files changed, 16 insertions(+)
>>
>> diff --git a/t/README b/t/README
>> index ab386c3681..314dd40221 100644
>> --- a/t/README
>> +++ b/t/README
>> @@ -345,6 +345,18 @@ assignment to variable 'test_description', like this:
>>       This test registers the following structure in the cache
>>       and tries to run git-ls-files with option --frotz.'
>>
>> +By default the tests will be run from a directory with a highly
>> +unusual filename that includes control characters, a newline, various
>> +punctuation etc., this is done to smoke out any bugs related to path
>> +handling. If for whatever reason the tests can't deal with such
>> +unusual path names, set:
>> +
>> +    test_fails_on_unusual_directory_names=1
>> +
>> +Before sourcing 'test-lib.sh' as described below. This option is
>> +mainly intended to grandfather in existing broken tests & code, and
>> +should usually not be used in new code, instead your tests or code
>> +probably need fixing.
>>
>>  Source 'test-lib.sh'
>>  --------------------
>> diff --git a/t/test-lib.sh b/t/test-lib.sh
>> index 13b5696822..089ff5ac7d 100644
>> --- a/t/test-lib.sh
>> +++ b/t/test-lib.sh
>> @@ -914,6 +914,10 @@ fi
>>
>>  # Test repository
>>  TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)"
>> +if test -z "$test_fails_on_unusual_directory_names" -a "$(perl -e 'print 1+1' 2>/dev/null)" = "2"
>> +then
>> +   TRASH_DIRECTORY="$TRASH_DIRECTORY.$(perl -e 'print join q[], grep { /[^[:alnum:]]/ and !m<[./]> } map chr, 0x01..0x7f')"
>> +fi
>>  test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY"
>>  case "$TRASH_DIRECTORY" in
>>  /*) ;; # absolute path is good
>> --
>> 2.11.0
>
>

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10  8:02     ` Ævar Arnfjörð Bjarmason
@ 2017-04-10 11:19       ` SZEDER Gábor
  2017-04-10 11:40         ` Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 25+ messages in thread
From: SZEDER Gábor @ 2017-04-10 11:19 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Junio C Hamano, Brandon Williams, Jeff King, Joachim Durchholz,
	Stefan Beller, Git Mailing List

On Mon, Apr 10, 2017 at 10:02 AM, Ævar Arnfjörð Bjarmason
<avarab@gmail.com> wrote:
> On Mon, Apr 10, 2017 at 3:47 AM, SZEDER Gábor <szeder.dev@gmail.com> wrote:
>>> Change the test library to insert non-alphanumeric ASCII characters
>>> into the TRASH_DIRECTORY name, that's the directory the test library
>>> creates, chdirs to and runs each individual test from.
>>>
>>> Unless test_fails_on_unusual_directory_names=1 is declared before
>>> importing test-lib.sh (and if perl isn't available on the system), the
>>> trash directory will contain every non-alphanumeric character in
>>> ASCII, in order.
>>
>> At the very least there must be an easier way to disable this, e.g. a
>> command line option.
>>
>> This change is sure effective in smoking out bugs, but it's a major
>> annoyance during development when it comes to debugging a test.  At
>> first I could not even cd into the trash directory, because TAB
>> completing the directory name with all those non-printable characters
>> didn't work (this may be a bug in the bash-completion package).  And
>> simply copy-pasting the dirname didn't work either, because 'ls'
>>
>>   trash directory.t9902-completion.??????????????????????????????? !"#$%&'()*+,-:;<=>?@[\]^_`{|}~?

Btw, it seems most of the failures in t9902-completion are triggered
by remote URL parsing.  The trash directory's new name contains '[',
']' and even "@[", all of which are treated special by
connect.c:host_end(), a helper function of parse_connect_url(),
basically breaking anything trying to e.g.:

  git fetch "$(pwd)/other"

What puzzles me most is that parse_connect_url() recognizes right at
its beginning that a remote URL like this is not actually an URL, so
why does it continue parsing it as if it were one?

A few other failures are triggered by the ':' in the trash directory's
name, breaking the following commonly used pattern:

  export GIT_CEILING_DIRECTORIES="$TRASH_DIRECTORY" &&
  cd subdir &&
  test-git-pretending-it's-run-outside-of-a-repository

I think ':' should therefore be excluded from the trash directory, too.

>> After some headscratching, Sunday night may be my excuse, I figured
>> out that 'cd tr*' works...  only to be greeted with the ugliest-ever
>> three-line(!) shell prompt.
>>
>> Therefore I would say that this should not even be enabled by default
>> in test-lib.sh, so at least running a test directly from the command
>> line as ./t1234-foo.sh would considerately give us an easily
>> accessible trash directory even without any command line options.  We
>> could enable it for 'make test' by default via GIT_TEST_OPTS in
>> t/Makefile, though.
>
> This definitely needs some tweaking as you and Joachim point out. E.g.
> some capabilities check in the test suite to check if we can even
> create these sorts of paths on the local filesystem.
>
> A couple of comments on the above though:
>
> a) If we have something that's a more strict mode that makes tests
> fail due to buggy code in various scenarios, we gain the most from
> having it on by default

I know, and I basically agree...

> and having some optional mode to have devs
> e.g. disable it for manual inspection of the test directories.

... but this is just too gross to live as default outside of a CI
environment.

> Most of the running of the test suite that really matters, i.e. just
> before the software is delivered to end users, is going to be running
> in some non-interactive build system preparing a package.
>
> b) I think any sort of magic like using it with 'make test', but not
> when the *.sh is manually run, will just lead to frustrating seemingly
> heisenbugs from people trying to debug the test suite when things do
> fail, i.e. you run 'make test' on some obscure platform we haven't
> fixed path bugs on, 10 fail, you manually inspect them and every one
> of them succeeds, because some --use-garbage-dirs option wasn't
> passed.

That's not really an issue.  When a test fails during 'make test' with
garbage in trash dir names, the dev comes and attempts to cd into the
trash dir, and will be instantly reminded that non-printable
characters might play a role in the failure when he can't do so with
ordinary means.

>>> This includes all the control characters, !, [], {} etc. the "."
>>> character isn't included because it's already in the directory name,
>>> and nor is "/" for obvious reasons, although that would actually work,
>>> we'd just create a subdirectory, which would make the tests harder to
>>> inspect when they fail.i
>>
>> 1. Heh.  How an additional subdirectory would make the tests harder to
>>    inspect is nothing compared to the effect of all the other
>>    characters.
>>
>> 2. s/i$//
>>
>>> This change is inspired by the "submodule: prevent backslash expantion
>>> in submodule names" patch[1]. If we'd had backslashes in the
>>> TRASH_DIRECTORY all along that bug would have been fixed a long time
>>> ago. This will flag such issues by marking tests that currently fail
>>> with "test_fails_on_unusual_directory_names=1", ensure that new tests
>>> aren't added unless a discussion is had about why the code can't
>>> handle unusual pathnames, and prevent future regressions.
>>>
>>> 1. <20170407172306.172673-1-bmwill@google.com>
>>> ---
>>>  t/README      | 12 ++++++++++++
>>>  t/test-lib.sh |  4 ++++
>>>  2 files changed, 16 insertions(+)
>>>
>>> diff --git a/t/README b/t/README
>>> index ab386c3681..314dd40221 100644
>>> --- a/t/README
>>> +++ b/t/README
>>> @@ -345,6 +345,18 @@ assignment to variable 'test_description', like this:
>>>       This test registers the following structure in the cache
>>>       and tries to run git-ls-files with option --frotz.'
>>>
>>> +By default the tests will be run from a directory with a highly
>>> +unusual filename that includes control characters, a newline, various
>>> +punctuation etc., this is done to smoke out any bugs related to path
>>> +handling. If for whatever reason the tests can't deal with such
>>> +unusual path names, set:
>>> +
>>> +    test_fails_on_unusual_directory_names=1
>>> +
>>> +Before sourcing 'test-lib.sh' as described below. This option is
>>> +mainly intended to grandfather in existing broken tests & code, and
>>> +should usually not be used in new code, instead your tests or code
>>> +probably need fixing.
>>>
>>>  Source 'test-lib.sh'
>>>  --------------------
>>> diff --git a/t/test-lib.sh b/t/test-lib.sh
>>> index 13b5696822..089ff5ac7d 100644
>>> --- a/t/test-lib.sh
>>> +++ b/t/test-lib.sh
>>> @@ -914,6 +914,10 @@ fi
>>>
>>>  # Test repository
>>>  TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)"
>>> +if test -z "$test_fails_on_unusual_directory_names" -a "$(perl -e 'print 1+1' 2>/dev/null)" = "2"
>>> +then
>>> +   TRASH_DIRECTORY="$TRASH_DIRECTORY.$(perl -e 'print join q[], grep { /[^[:alnum:]]/ and !m<[./]> } map chr, 0x01..0x7f')"
>>> +fi
>>>  test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY"
>>>  case "$TRASH_DIRECTORY" in
>>>  /*) ;; # absolute path is good
>>> --
>>> 2.11.0
>>
>>

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10 11:19       ` SZEDER Gábor
@ 2017-04-10 11:40         ` Ævar Arnfjörð Bjarmason
  2017-04-10 13:38           ` Jeff King
  2017-04-10 13:43           ` SZEDER Gábor
  0 siblings, 2 replies; 25+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2017-04-10 11:40 UTC (permalink / raw)
  To: SZEDER Gábor
  Cc: Junio C Hamano, Brandon Williams, Jeff King, Joachim Durchholz,
	Stefan Beller, Git Mailing List

On Mon, Apr 10, 2017 at 1:19 PM, SZEDER Gábor <szeder.dev@gmail.com> wrote:
> On Mon, Apr 10, 2017 at 10:02 AM, Ævar Arnfjörð Bjarmason
> <avarab@gmail.com> wrote:
>> On Mon, Apr 10, 2017 at 3:47 AM, SZEDER Gábor <szeder.dev@gmail.com> wrote:
>>>> Change the test library to insert non-alphanumeric ASCII characters
>>>> into the TRASH_DIRECTORY name, that's the directory the test library
>>>> creates, chdirs to and runs each individual test from.
>>>>
>>>> Unless test_fails_on_unusual_directory_names=1 is declared before
>>>> importing test-lib.sh (and if perl isn't available on the system), the
>>>> trash directory will contain every non-alphanumeric character in
>>>> ASCII, in order.
>>>
>>> At the very least there must be an easier way to disable this, e.g. a
>>> command line option.
>>>
>>> This change is sure effective in smoking out bugs, but it's a major
>>> annoyance during development when it comes to debugging a test.  At
>>> first I could not even cd into the trash directory, because TAB
>>> completing the directory name with all those non-printable characters
>>> didn't work (this may be a bug in the bash-completion package).  And
>>> simply copy-pasting the dirname didn't work either, because 'ls'
>>>
>>>   trash directory.t9902-completion.??????????????????????????????? !"#$%&'()*+,-:;<=>?@[\]^_`{|}~?
>
> Btw, it seems most of the failures in t9902-completion are triggered
> by remote URL parsing.  The trash directory's new name contains '[',
> ']' and even "@[", all of which are treated special by
> connect.c:host_end(), a helper function of parse_connect_url(),
> basically breaking anything trying to e.g.:
>
>   git fetch "$(pwd)/other"

I'm going to work on this patch so that I can report on tests by type
of character that triggers a failure.

> What puzzles me most is that parse_connect_url() recognizes right at
> its beginning that a remote URL like this is not actually an URL, so
> why does it continue parsing it as if it were one?
>
> A few other failures are triggered by the ':' in the trash directory's
> name, breaking the following commonly used pattern:
>
>   export GIT_CEILING_DIRECTORIES="$TRASH_DIRECTORY" &&
>   cd subdir &&
>   test-git-pretending-it's-run-outside-of-a-repository

Does GIT_CEILING_DIRECTORIES support escaping somehow? E.g.
"foo\:bar". If so maybe we could use a wrapper to set it, if not
that's a bug in the ceiling dir feature, surely.

> I think ':' should therefore be excluded from the trash directory, too.

I think it's preferable to have some mode to use : in dirnames for
those tests that don't fail already, to protect them against future
regressions. Disabling the use of a tricky character like ":" invites
future bugs & regressions.

>>> After some headscratching, Sunday night may be my excuse, I figured
>>> out that 'cd tr*' works...  only to be greeted with the ugliest-ever
>>> three-line(!) shell prompt.
>>>
>>> Therefore I would say that this should not even be enabled by default
>>> in test-lib.sh, so at least running a test directly from the command
>>> line as ./t1234-foo.sh would considerately give us an easily
>>> accessible trash directory even without any command line options.  We
>>> could enable it for 'make test' by default via GIT_TEST_OPTS in
>>> t/Makefile, though.
>>
>> This definitely needs some tweaking as you and Joachim point out. E.g.
>> some capabilities check in the test suite to check if we can even
>> create these sorts of paths on the local filesystem.
>>
>> A couple of comments on the above though:
>>
>> a) If we have something that's a more strict mode that makes tests
>> fail due to buggy code in various scenarios, we gain the most from
>> having it on by default
>
> I know, and I basically agree...
>
>> and having some optional mode to have devs
>> e.g. disable it for manual inspection of the test directories.
>
> ... but this is just too gross to live as default outside of a CI
> environment.
>
>> Most of the running of the test suite that really matters, i.e. just
>> before the software is delivered to end users, is going to be running
>> in some non-interactive build system preparing a package.
>>
>> b) I think any sort of magic like using it with 'make test', but not
>> when the *.sh is manually run, will just lead to frustrating seemingly
>> heisenbugs from people trying to debug the test suite when things do
>> fail, i.e. you run 'make test' on some obscure platform we haven't
>> fixed path bugs on, 10 fail, you manually inspect them and every one
>> of them succeeds, because some --use-garbage-dirs option wasn't
>> passed.
>
> That's not really an issue.  When a test fails during 'make test' with
> garbage in trash dir names, the dev comes and attempts to cd into the
> trash dir, and will be instantly reminded that non-printable
> characters might play a role in the failure when he can't do so with
> ordinary means.

When a test fails for me I cd to t/ and re-run the test *.sh manually.
I don't go straight to inspecting the existing trash.

If those manual invocations were running in some different mode &
succeeded that would be very confusing.

In any case, I'll try to come up with something more granular, e.g. to
categorize tests by failure type.



>>>> This includes all the control characters, !, [], {} etc. the "."
>>>> character isn't included because it's already in the directory name,
>>>> and nor is "/" for obvious reasons, although that would actually work,
>>>> we'd just create a subdirectory, which would make the tests harder to
>>>> inspect when they fail.i
>>>
>>> 1. Heh.  How an additional subdirectory would make the tests harder to
>>>    inspect is nothing compared to the effect of all the other
>>>    characters.
>>>
>>> 2. s/i$//
>>>
>>>> This change is inspired by the "submodule: prevent backslash expantion
>>>> in submodule names" patch[1]. If we'd had backslashes in the
>>>> TRASH_DIRECTORY all along that bug would have been fixed a long time
>>>> ago. This will flag such issues by marking tests that currently fail
>>>> with "test_fails_on_unusual_directory_names=1", ensure that new tests
>>>> aren't added unless a discussion is had about why the code can't
>>>> handle unusual pathnames, and prevent future regressions.
>>>>
>>>> 1. <20170407172306.172673-1-bmwill@google.com>
>>>> ---
>>>>  t/README      | 12 ++++++++++++
>>>>  t/test-lib.sh |  4 ++++
>>>>  2 files changed, 16 insertions(+)
>>>>
>>>> diff --git a/t/README b/t/README
>>>> index ab386c3681..314dd40221 100644
>>>> --- a/t/README
>>>> +++ b/t/README
>>>> @@ -345,6 +345,18 @@ assignment to variable 'test_description', like this:
>>>>       This test registers the following structure in the cache
>>>>       and tries to run git-ls-files with option --frotz.'
>>>>
>>>> +By default the tests will be run from a directory with a highly
>>>> +unusual filename that includes control characters, a newline, various
>>>> +punctuation etc., this is done to smoke out any bugs related to path
>>>> +handling. If for whatever reason the tests can't deal with such
>>>> +unusual path names, set:
>>>> +
>>>> +    test_fails_on_unusual_directory_names=1
>>>> +
>>>> +Before sourcing 'test-lib.sh' as described below. This option is
>>>> +mainly intended to grandfather in existing broken tests & code, and
>>>> +should usually not be used in new code, instead your tests or code
>>>> +probably need fixing.
>>>>
>>>>  Source 'test-lib.sh'
>>>>  --------------------
>>>> diff --git a/t/test-lib.sh b/t/test-lib.sh
>>>> index 13b5696822..089ff5ac7d 100644
>>>> --- a/t/test-lib.sh
>>>> +++ b/t/test-lib.sh
>>>> @@ -914,6 +914,10 @@ fi
>>>>
>>>>  # Test repository
>>>>  TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)"
>>>> +if test -z "$test_fails_on_unusual_directory_names" -a "$(perl -e 'print 1+1' 2>/dev/null)" = "2"
>>>> +then
>>>> +   TRASH_DIRECTORY="$TRASH_DIRECTORY.$(perl -e 'print join q[], grep { /[^[:alnum:]]/ and !m<[./]> } map chr, 0x01..0x7f')"
>>>> +fi
>>>>  test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY"
>>>>  case "$TRASH_DIRECTORY" in
>>>>  /*) ;; # absolute path is good
>>>> --
>>>> 2.11.0
>>>
>>>

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10 11:40         ` Ævar Arnfjörð Bjarmason
@ 2017-04-10 13:38           ` Jeff King
  2017-04-10 14:59             ` Joachim Durchholz
  2017-04-10 13:43           ` SZEDER Gábor
  1 sibling, 1 reply; 25+ messages in thread
From: Jeff King @ 2017-04-10 13:38 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: SZEDER Gábor, Junio C Hamano, Brandon Williams,
	Joachim Durchholz, Stefan Beller, Git Mailing List

On Mon, Apr 10, 2017 at 01:40:13PM +0200, Ævar Arnfjörð Bjarmason wrote:

> > A few other failures are triggered by the ':' in the trash directory's
> > name, breaking the following commonly used pattern:
> >
> >   export GIT_CEILING_DIRECTORIES="$TRASH_DIRECTORY" &&
> >   cd subdir &&
> >   test-git-pretending-it's-run-outside-of-a-repository
> 
> Does GIT_CEILING_DIRECTORIES support escaping somehow? E.g.
> "foo\:bar". If so maybe we could use a wrapper to set it, if not
> that's a bug in the ceiling dir feature, surely.

I don't think it does. But nor does $PATH (which is almost certainly
another source of breakage). And neither does info/alternates allow
pathnames with newline in them (that is the likely cause of a large
number of failures, as it hits anywhere we use "clone -s").

Are those bugs? Maybe. Certainly they are limitations. But are they ones
anybody _cares_ about?  I think this may fall under "if it hurts, don't
do it". If there are security bugs where a malicious input can cause us
to do something bad, that's something to care about. But that's very
different than asking "do these tests run to completion with a funny
input".

  As an aside, I'd also question whether your patch might actually
  _hide_ bugs. It's applying a blanket change to the on-disk state that
  is obviously breaking some features. How many of those breakages are
  things that show up as a test failure, and how many of them quietly
  cause a test to do something else entirely, like failing its setup in
  a way that makes the rest of the test a noop?

So given the pain this will cause to people actually looking at tests,
and given that it's not clear to me if it has or will find any actual
bugs, it seems premature to flip it on by default. If somebody wants to
actually dig into these cases and look for actual bugs, I'm all for it.

But flipping the default and marking a bunch of tests blindly as "well,
this fails" hasn't made the world a better place. It's made it slightly
worse.

-Peff

PS If you want to test various characters, I think the simplest way is
   just:

     make GIT_TEST_OPTS=--root=/tmp/look-a-col:on test

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10 11:40         ` Ævar Arnfjörð Bjarmason
  2017-04-10 13:38           ` Jeff King
@ 2017-04-10 13:43           ` SZEDER Gábor
  1 sibling, 0 replies; 25+ messages in thread
From: SZEDER Gábor @ 2017-04-10 13:43 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Junio C Hamano, Brandon Williams, Jeff King, Joachim Durchholz,
	Stefan Beller, Git Mailing List

On Mon, Apr 10, 2017 at 1:40 PM, Ævar Arnfjörð Bjarmason
<avarab@gmail.com> wrote:
> On Mon, Apr 10, 2017 at 1:19 PM, SZEDER Gábor <szeder.dev@gmail.com> wrote:

>> A few other failures are triggered by the ':' in the trash directory's
>> name, breaking the following commonly used pattern:
>>
>>   export GIT_CEILING_DIRECTORIES="$TRASH_DIRECTORY" &&
>>   cd subdir &&
>>   test-git-pretending-it's-run-outside-of-a-repository
>
> Does GIT_CEILING_DIRECTORIES support escaping somehow? E.g.
> "foo\:bar". If so maybe we could use a wrapper to set it, if not
> that's a bug in the ceiling dir feature, surely.

It doesn't, these $PATH-style variables in git, in the shell or
elsewhere tend not to.


>>> b) I think any sort of magic like using it with 'make test', but not
>>> when the *.sh is manually run, will just lead to frustrating seemingly
>>> heisenbugs from people trying to debug the test suite when things do
>>> fail, i.e. you run 'make test' on some obscure platform we haven't
>>> fixed path bugs on, 10 fail, you manually inspect them and every one
>>> of them succeeds, because some --use-garbage-dirs option wasn't
>>> passed.
>>
>> That's not really an issue.  When a test fails during 'make test' with
>> garbage in trash dir names, the dev comes and attempts to cd into the
>> trash dir, and will be instantly reminded that non-printable
>> characters might play a role in the failure when he can't do so with
>> ordinary means.
>
> When a test fails for me I cd to t/ and re-run the test *.sh manually.
> I don't go straight to inspecting the existing trash.
>
> If those manual invocations were running in some different mode &
> succeeded that would be very confusing.

On the contrary, that's a clue to where you might want to look.
Besides, this is already the case when someone sets some options in
GIT_TEST_OPTS in his config.mak.

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10 13:38           ` Jeff King
@ 2017-04-10 14:59             ` Joachim Durchholz
  2017-04-10 16:57               ` Jeff King
  0 siblings, 1 reply; 25+ messages in thread
From: Joachim Durchholz @ 2017-04-10 14:59 UTC (permalink / raw)
  To: Git Mailing List

Am 10.04.2017 um 15:38 schrieb Jeff King:
> Are those bugs? Maybe. Certainly they are limitations. But are they ones
> anybody _cares_ about?  I think this may fall under "if it hurts, don't
> do it".

It's not always possible to avoid that.

URLs, for example, may contain "funny characters", including multi-byte 
characters of which the second byte is 0x0a. If they are guaranteed to 
always be URL-encoded this isn't a problem, but then we still need to 
make sure that URL-encoding does happen.

Next source of funny characters that comes to my mind is submodules. 
They derive their name from the URL by default, and the subdirectory 
name as well. Again, consider the multibyte name where the second 
character is 0x0a. Or 0x80: À (uppercase A with accent grave) happens to 
have that byte in UTF-8 encoding, Ẁ is U+1E80 which would be encoded as 
0x80 0x1e on an NTFS filesystem (barring additional coding steps in APIs 
or webservices, which further complicate the situation but don't usually 
eliminate the problem, they just shift it around).

 > If there are security bugs where a malicious input can cause us
> to do something bad, that's something to care about. But that's very
> different than asking "do these tests run to completion with a funny
> input".

If the tests do not complete, git is doing something unexpected.
That in itself is not a security hole, but there's a pretty good chance 
that at least one of these ~230 unexpected things can be turned into 
one, given enough time and motivation. The risk multiplies as this is 
shell scripting, where the path from "string is misinterpreted" to 
"string is run as a command" is considerably shorter than in other 
languages.

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10 14:59             ` Joachim Durchholz
@ 2017-04-10 16:57               ` Jeff King
  2017-04-10 18:19                 ` Joachim Durchholz
  0 siblings, 1 reply; 25+ messages in thread
From: Jeff King @ 2017-04-10 16:57 UTC (permalink / raw)
  To: Joachim Durchholz; +Cc: Git Mailing List

On Mon, Apr 10, 2017 at 04:59:57PM +0200, Joachim Durchholz wrote:

> Am 10.04.2017 um 15:38 schrieb Jeff King:
> > Are those bugs? Maybe. Certainly they are limitations. But are they ones
> > anybody _cares_ about?  I think this may fall under "if it hurts, don't
> > do it".
> 
> It's not always possible to avoid that.

Sort of. I don't find anything wrong with saying "your local filesystem
path for a repository cannot contain newlines; if it does, some features
may be unavailable".

> URLs, for example, may contain "funny characters", including multi-byte
> characters of which the second byte is 0x0a. If they are guaranteed to
> always be URL-encoded this isn't a problem, but then we still need to make
> sure that URL-encoding does happen.

Sure, but URLs have a way of encoding. And if we're not encoding when we
should, then that's a bug. But the arguments that are fed to things like
git-clone _aren't_ URLs. They're a specifier that uses some heuristics
to decide between the various cases (URLs, host:path specifiers, local
paths). If you feed syntactic garbage, aborting the operation (and
failing the test!) may be the right thing for git to do.

> > If there are security bugs where a malicious input can cause us
> > to do something bad, that's something to care about. But that's very
> > different than asking "do these tests run to completion with a funny
> > input".
> 
> If the tests do not complete, git is doing something unexpected.

I very much disagree with that. Git's test operate under a set of
assumptions, and if you violate those assumptions, then the failures are
not meaningful.

Take alternates, for instance. The on-disk storage format cannot
represent paths with newlines in them. If a test does:

  git clone -s "$(pwd)" parent.git child &&
  test -d child

then that test is going to fail if the test directory has a newline in
it. But that doesn't tell us anything meaningful. Maybe there is a bug
and maybe there isn't, but we cannot know because the thing being tested
cannot possibly work under the test environment given.

You can rewrite all the tests to say "skip this test if there's a
newline in the test directory". But to what end? It's work to write and
to maintain, and we haven't gained new information.

> That in itself is not a security hole, but there's a pretty good chance that
> at least one of these ~230 unexpected things can be turned into one, given
> enough time and motivation. The risk multiplies as this is shell scripting,
> where the path from "string is misinterpreted" to "string is run as a
> command" is considerably shorter than in other languages.

Sure, and I'd encourage people who are interested to dig through the
results and see if they can find a real problem. I looked at several and
didn't find anything that wasn't an example of the "test assumptions"
thing above.

I'll actually be surprised if there are shell injection problems in Git,
because our scripts are usually pretty meticulous about quoting
variables and not doing crazy things with eval. I think the issues are
much more likely to be like the "submodule--helper --list" thing I
pointed out, where we get phantom records in lists.

But again, I'm happy to be proven wrong. If there's a shell injection in
Git it's clearly a bug and should be fixed. I just don't think
plastering control characters into the test directory names all the time
is a good way of finding those problems (and doesn't balance out the
cost). Fuzzing the directory names and digging into specific cases _is_
a reasonable way to do it.

-Peff

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10 16:57               ` Jeff King
@ 2017-04-10 18:19                 ` Joachim Durchholz
  2017-04-10 19:22                   ` Jeff King
  0 siblings, 1 reply; 25+ messages in thread
From: Joachim Durchholz @ 2017-04-10 18:19 UTC (permalink / raw)
  To: Git Mailing List

Am 10.04.2017 um 18:57 schrieb Jeff King:
>>> If there are security bugs where a malicious input can cause us
>>> to do something bad, that's something to care about. But that's very
>>> different than asking "do these tests run to completion with a funny
>>> input".
>>
>> If the tests do not complete, git is doing something unexpected.
>
> I very much disagree with that. Git's test operate under a set of
> assumptions, and if you violate those assumptions, then the failures are
> not meaningful.

In that case the tests do not validate that git can properly work with 
special characters.
That's a pretty big coverage gap.

> Take alternates, for instance. The on-disk storage format cannot
> represent paths with newlines in them. If a test does:
>
>   git clone -s "$(pwd)" parent.git child &&
>   test -d child
>
> then that test is going to fail if the test directory has a newline in
> it. But that doesn't tell us anything meaningful. Maybe there is a bug
> and maybe there isn't, but we cannot know because the thing being tested
> cannot possibly work under the test environment given.

Sure. Not all tests are meaningful in all environments.
That doesn't mean that the tests are generally meaningless.

Also, we're talking about two pretty different things here: gits 
interaction with the file system, and git's interaction with whatever 
shell its scripts are using.
In an ideal world, these two aspects would be orthogonal and could be 
tested independently of each other. Since in practice we do have 
correlations and dependencies, this isn't always possible, but it's what 
we should aim for.

> You can rewrite all the tests to say "skip this test if there's a
> newline in the test directory". But to what end? It's work to write and
> to maintain, and we haven't gained new information.

Not on that "alternates" thing (whatever that is), but we have a test 
that will work and provide information on systems that do allow newlines.

>> That in itself is not a security hole, but there's a pretty good chance that
>> at least one of these ~230 unexpected things can be turned into one, given
>> enough time and motivation. The risk multiplies as this is shell scripting,
>> where the path from "string is misinterpreted" to "string is run as a
>> command" is considerably shorter than in other languages.
>
> Sure, and I'd encourage people who are interested to dig through the
> results and see if they can find a real problem. I looked at several and
> didn't find anything that wasn't an example of the "test assumptions"
> thing above.

Don't assume that there's no risk just because you didn't find anything.

Also, git might not be the actual hole, but other software that relies 
on git not doing anything awkward might fail that assumption and expose 
the actual breach of security.
You could argue that it's not a problem in git, but it is. Unless and 
until the git docs clearly state that things may break if "funny 
characters" are being used, and where.

> But again, I'm happy to be proven wrong.

With security, you need to be confident about the absence of /any/ type 
of hole, not the absence of a /specific/ type of hole such as a shell 
injection.
So the way forward isn't proving you wrong by providing a specific 
exploit, it's making sure that no exploit with URLs and file names can 
possibly exist.

Now if I'm reading things like "heuristics" and "git uses URL-specific 
code even after it has determined it's not a URL"... well, that's the 
exact opposite of reassuring messages.

 > I just don't think
> plastering control characters into the test directory names all the time
> is a good way of finding those problems (and doesn't balance out the
> cost).

Fair enough.

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10 18:19                 ` Joachim Durchholz
@ 2017-04-10 19:22                   ` Jeff King
  0 siblings, 0 replies; 25+ messages in thread
From: Jeff King @ 2017-04-10 19:22 UTC (permalink / raw)
  To: Joachim Durchholz; +Cc: Git Mailing List

On Mon, Apr 10, 2017 at 08:19:40PM +0200, Joachim Durchholz wrote:

> > I very much disagree with that. Git's test operate under a set of
> > assumptions, and if you violate those assumptions, then the failures are
> > not meaningful.
> 
> In that case the tests do not validate that git can properly work with
> special characters.
> That's a pretty big coverage gap.

That's not necessarily true either; there may be specific tests that
create exotic paths and check them. My point is that the outcome depends
on that paths. So you cannot just take a test which runs "git clone -s"
and expect it to work both with and without paths with newlines. You
need two tests, because there are two different outcomes, depending on
the test environment.

So if you're proposing to write a bunch of new tests that check the
proper behavior under various conditions, go for it. But I don't think
running the entire existing test suite with exotic paths tells you much.
A failure might be a bug, or it might be that the thing is untestable
given the environment.

> > Sure, and I'd encourage people who are interested to dig through the
> > results and see if they can find a real problem. I looked at several and
> > didn't find anything that wasn't an example of the "test assumptions"
> > thing above.
> 
> Don't assume that there's no risk just because you didn't find anything.

I'm not assuming that at all. Didn't I say somebody would need to dig
into all of these to find out the real answer? I'm only arguing that
blindly adding this feature to the test suite has no value. It's the
digging that has value, and you do not even need to modify the test
suite to do it (you can just use --root).

I've been trying to invite you to do that digging, if it's something you
care about.

-Peff

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-09 19:11 ` [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name Ævar Arnfjörð Bjarmason
  2017-04-10  1:47   ` SZEDER Gábor
@ 2017-04-10 23:23   ` Ævar Arnfjörð Bjarmason
  2017-04-11  0:30     ` [PATCH] connect.c: handle errors from split_cmdline Jeff King
                       ` (2 more replies)
  1 sibling, 3 replies; 25+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2017-04-10 23:23 UTC (permalink / raw)
  To: Git Mailing List
  Cc: Junio C Hamano, Brandon Williams, Jeff King, Joachim Durchholz,
	Stefan Beller, Ævar Arnfjörð Bjarmason

On Sun, Apr 9, 2017 at 9:11 PM, Ævar Arnfjörð Bjarmason
<avarab@gmail.com> wrote:
> Change the test library to insert non-alphanumeric ASCII characters
> into the TRASH_DIRECTORY name, that's the directory the test library
> creates, chdirs to and runs each individual test from.

I did a bit more work on getting more granularity on why things were
failing. I wrote a script[1] that runs each of the failing tests once
with each individual character in the non-alphanumeric ASCII range to
narrow down issues.

I skipped the svn tests, and something went wrong in the middle of my
run to make the http tests fail on everything, but the gist of it is:

* Most of the tests fail because git clone can't deal with cloning a
repo with a \r in the path. The error we produce when we try is quite
bad and doesn't indicate what went wrong:

$ rm -rf /tmp/git.*; mkdir /tmp/git.$(perl -e 'print chr 13') && cd
/tmp/git.* && git init --bare b && file b && git clone b c
/b/tialized empty Git repository in /tmp/git.
b: directory
Cloning into 'c'...
fatal: '/tmp/git. /b' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

So file(1) shows it exists, a strace shows that git knows it exists at
some point, but something gets lost along the way.

* Much of it fails due to GIT_CEILING_DIRECTORIES not working with
dirs with ":" in the name.

* That leaves the rest at:

$ grep FAIL results | grep -v -e svn -e svk  | awk '{print $1 " "
$2}'|perl -nE 'chomp;my ($f, $c) = split / /, $_; push @{$f{$f}} =>
$c; END { for my $k (sort keys %f) { say "$k = " . join ", ", map { $_
< 32 ? $_ : "$_(" . chr($_) . ")" } @{$f{$k}} } }'|grep -E -v
'^.{150,}$'|grep -E -v -e '= 13$' -e '= 58\(:\)$' -e '= 13, 58\(:\)$'
t0021-conversion.sh = 37(%), 58(:)
t0060-path-utils.sh = 39(')
t0302-credential-store.sh = 9, 32( ), 34("), 40((), 39('), 38(&),
41()), 59(;), 60(<), 62(>), 96(`), 124(|)
t1305-config-include.sh = 9, 13, 34("), 35(#), 59(;), 92(\), 91([)
t1500-rev-parse.sh = 9, 13
t1510-repo-setup.sh = 13, 92(\)
t3900-i18n-commit.sh = 9, 32( ), 40((), 41()), 38(&), 59(;), 60(<),
62(>), 124(|)
t4030-diff-textconv.sh = 13, 34("), 96(`)
t4031-diff-rewrite-binary.sh = 13, 34("), 96(`)
t5150-request-pull.sh = 13, 92(\)
t5310-pack-bitmaps.sh = 9, 13
t5407-post-rewrite-hook.sh = 34("), 96(`)
t5505-remote.sh = 13, 35(#)
t5516-fetch-push.sh = 13, 39(')
t5601-clone.sh = 13, 34("), 39('), 96(`)
t7003-filter-branch.sh = 34("), 96(`)
t7008-grep-binary.sh = 13, 34("), 96(`)
t7402-submodule-rebase.sh = 13, 34("), 96(`)
t7405-submodule-merge.sh = 34("), 92(\)
t7406-submodule-update.sh = 13, 9, 34("), 35(#), 38(&), 59(;), 92(\)
t7407-submodule-foreach.sh = 13, 9, 42(*)
t7504-commit-msg-hook.sh = 34("), 96(`)
t7700-repack.sh = 9, 42(*)
t9001-send-email.sh = 13, 34("), 96(`)
t9200-git-cvsexportcommit.sh = 42(*), 63(?)
t9300-fast-import.sh = 34("), 92(\)
t9400-git-cvsserver-server.sh = 13, 59(;)
t9401-git-cvsserver-crlf.sh = 13, 59(;)
t9402-git-cvsserver-refs.sh = 13, 59(;)
t9600-cvsimport.sh = 42(*), 58(:), 63(?)
t9601-cvsimport-vendor-branch.sh = 42(*), 58(:), 63(?)
t9602-cvsimport-branches-tags.sh = 42(*), 63(?), 58(:)
t9604-cvsimport-timestamps.sh = 42(*), 58(:), 63(?)
t9700-perl-git.sh = 13, 92(\)

I've fixed a few in https://github.com/avar/git/commit/55395613fe

There's one segfault in there:

$ ./t5601-clone.sh --root="xtmp.$(perl -e 'print chr 39')" -v -i -d
[...]
Cloning into 'ssh-bracket-clone-plink-4'...
Segmentation fault
not ok 45 - single quoted plink.exe in GIT_SSH_COMMAND

1. https://github.com/avar/git/commit/edc439c462

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH] connect.c: handle errors from split_cmdline
  2017-04-10 23:23   ` Ævar Arnfjörð Bjarmason
@ 2017-04-11  0:30     ` Jeff King
  2017-04-11  0:35       ` Jeff King
  2017-04-11  1:14     ` [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name Jeff King
  2017-04-11  6:28     ` Joachim Durchholz
  2 siblings, 1 reply; 25+ messages in thread
From: Jeff King @ 2017-04-11  0:30 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Git Mailing List, Junio C Hamano, Brandon Williams,
	Joachim Durchholz, Stefan Beller

On Tue, Apr 11, 2017 at 01:23:32AM +0200, Ævar Arnfjörð Bjarmason wrote:

> There's one segfault in there:
> 
> $ ./t5601-clone.sh --root="xtmp.$(perl -e 'print chr 39')" -v -i -d
> [...]
> Cloning into 'ssh-bracket-clone-plink-4'...
> Segmentation fault
> not ok 45 - single quoted plink.exe in GIT_SSH_COMMAND

Here's a fix for that one. I think there are a few other memory
irregularities in that function, too. I'll send another patch in a
minute, but I wanted to get this out in case you were working on it,
too.

-- >8 --
Subject: [PATCH] connect.c: handle errors from split_cmdline

Commit e9d9a8a4d (connect: handle putty/plink also in
GIT_SSH_COMMAND, 2017-01-02) added a call to
split_cmdline(), but checks only for a non-zero return to
see if we got any output. Since the function returns
negative values (and a NULL argv) on error, we end up
dereferencing NULL and segfaulting.

Arguably we could report on the parsing error here, but it's
probably not worth it. This is a best-effort attempt to see
if we are using plink. So we can simply return here with
"no, it wasn't plink" and let the shell actually complain
about the bogus quoting.

Reported-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
---
 connect.c        | 2 +-
 t/t5601-clone.sh | 6 ++++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/connect.c b/connect.c
index 7d65c1c73..6f2281ab0 100644
--- a/connect.c
+++ b/connect.c
@@ -730,7 +730,7 @@ static void handle_ssh_variant(const char *ssh_command, int is_cmdline,
 		const char **ssh_argv;
 
 		p = xstrdup(ssh_command);
-		if (split_cmdline(p, &ssh_argv)) {
+		if (split_cmdline(p, &ssh_argv) > 0) {
 			variant = basename((char *)ssh_argv[0]);
 			/*
 			 * At this point, variant points into the buffer
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index b52b8acf9..9c56f771b 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -427,6 +427,12 @@ test_expect_success 'GIT_SSH_VARIANT overrides plink to tortoiseplink' '
 	expect_ssh "-batch -P 123" myhost src
 '
 
+test_expect_success 'clean failure on broken quoting' '
+	test_must_fail \
+		env GIT_SSH_COMMAND="${SQ}plink.exe -v" \
+		git clone "[myhost:123]:src" sq-failure
+'
+
 # Reset the GIT_SSH environment variable for clone tests.
 setup_ssh_wrapper
 
-- 
2.12.2.952.g759391acc


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* Re: [PATCH] connect.c: handle errors from split_cmdline
  2017-04-11  0:30     ` [PATCH] connect.c: handle errors from split_cmdline Jeff King
@ 2017-04-11  0:35       ` Jeff King
  2017-04-11  9:27         ` Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 25+ messages in thread
From: Jeff King @ 2017-04-11  0:35 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Git Mailing List, Junio C Hamano, Brandon Williams,
	Joachim Durchholz, Stefan Beller

On Mon, Apr 10, 2017 at 08:30:23PM -0400, Jeff King wrote:

> On Tue, Apr 11, 2017 at 01:23:32AM +0200, Ævar Arnfjörð Bjarmason wrote:
> 
> > There's one segfault in there:
> > 
> > $ ./t5601-clone.sh --root="xtmp.$(perl -e 'print chr 39')" -v -i -d
> > [...]
> > Cloning into 'ssh-bracket-clone-plink-4'...
> > Segmentation fault
> > not ok 45 - single quoted plink.exe in GIT_SSH_COMMAND
> 
> Here's a fix for that one. I think there are a few other memory
> irregularities in that function, too. I'll send another patch in a
> minute, but I wanted to get this out in case you were working on it,
> too.

Actually, nevermind. I thought there was an issue with freeing via the
results of basename(), but there isn't. There is a minor memory leak,
but it's best squashed into my original patch, like so:

-- >8 --
Subject: [PATCH] connect.c: handle errors from split_cmdline

Commit e9d9a8a4d (connect: handle putty/plink also in
GIT_SSH_COMMAND, 2017-01-02) added a call to
split_cmdline(), but checks only for a non-zero return to
see if we got any output. Since the function returns
negative values (and a NULL argv) on error, we end up
dereferencing NULL and segfaulting.

Arguably we could report on the parsing error here, but it's
probably not worth it. This is a best-effort attempt to see
if we are using plink. So we can simply return here with
"no, it wasn't plink" and let the shell actually complain
about the bogus quoting.

While we're here, let's also fix the leak when our split
fails (as it turns out, split_cmdline can never return 0, so
this leak wasn't actually triggerable before).

Reported-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
---
 connect.c        | 6 ++++--
 t/t5601-clone.sh | 6 ++++++
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/connect.c b/connect.c
index 7d65c1c73..380997afd 100644
--- a/connect.c
+++ b/connect.c
@@ -729,18 +729,20 @@ static void handle_ssh_variant(const char *ssh_command, int is_cmdline,
 	} else {
 		const char **ssh_argv;
 
 		p = xstrdup(ssh_command);
-		if (split_cmdline(p, &ssh_argv)) {
+		if (split_cmdline(p, &ssh_argv) > 0) {
 			variant = basename((char *)ssh_argv[0]);
 			/*
 			 * At this point, variant points into the buffer
 			 * referenced by p, hence we do not need ssh_argv
 			 * any longer.
 			 */
 			free(ssh_argv);
-		} else
+		} else {
+			free(p);
 			return;
+		}
 	}
 
 	if (!strcasecmp(variant, "plink") ||
 	    !strcasecmp(variant, "plink.exe"))
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index b52b8acf9..9c56f771b 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -426,8 +426,14 @@ test_expect_success 'GIT_SSH_VARIANT overrides plink to tortoiseplink' '
 	git clone "[myhost:123]:src" ssh-bracket-clone-variant-4 &&
 	expect_ssh "-batch -P 123" myhost src
 '
 
+test_expect_success 'clean failure on broken quoting' '
+	test_must_fail \
+		env GIT_SSH_COMMAND="${SQ}plink.exe -v" \
+		git clone "[myhost:123]:src" sq-failure
+'
+
 # Reset the GIT_SSH environment variable for clone tests.
 setup_ssh_wrapper
 
 counter=0
-- 
2.12.2.952.g759391acc


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10 23:23   ` Ævar Arnfjörð Bjarmason
  2017-04-11  0:30     ` [PATCH] connect.c: handle errors from split_cmdline Jeff King
@ 2017-04-11  1:14     ` Jeff King
  2017-04-11  6:28     ` Joachim Durchholz
  2 siblings, 0 replies; 25+ messages in thread
From: Jeff King @ 2017-04-11  1:14 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Git Mailing List, Junio C Hamano, Brandon Williams,
	Joachim Durchholz, Stefan Beller

On Tue, Apr 11, 2017 at 01:23:32AM +0200, Ævar Arnfjörð Bjarmason wrote:

> * Most of the tests fail because git clone can't deal with cloning a
> repo with a \r in the path. The error we produce when we try is quite
> bad and doesn't indicate what went wrong:
> 
> $ rm -rf /tmp/git.*; mkdir /tmp/git.$(perl -e 'print chr 13') && cd
> /tmp/git.* && git init --bare b && file b && git clone b c
> /b/tialized empty Git repository in /tmp/git.
> b: directory
> Cloning into 'c'...
> fatal: '/tmp/git. /b' does not appear to be a git repository
> fatal: Could not read from remote repository.
> 
> Please make sure you have the correct access rights
> and the repository exists.
> 
> So file(1) shows it exists, a strace shows that git knows it exists at
> some point, but something gets lost along the way.

It's the round-trip through the config. It writes:

  [remote "origin"]
  url = /tmp/git.^M/b

into the config (where ^M is a literal CR). And then on reading it back,
unquoted whitespace in config values is converted to spaces, which is
why you see "git. /b" in the error message (the other ones are ugly
because it's writing the raw CR in via printf, and your terminal
respects it. Try "2>&1 | cat -A" when debugging this sort of thing (our
error and warning messages clean up cruft like this already, but
informational messages don't always go through vreportf()).

Anyway, something like this would fix it (it actually adds "\r" to the
config format, which is how we handle \n and \t; we could do it without
touching the parsing side if we taught store_write_pair() to recognize
that \r needs to go in double-quotes).

diff --git a/config.c b/config.c
index 1a4d85537..4a36a37ba 100644
--- a/config.c
+++ b/config.c
@@ -526,6 +526,9 @@ static char *parse_value(void)
 			case 'n':
 				c = '\n';
 				break;
+			case 'r':
+				c = '\r';
+				break;
 			/* Some characters escape as themselves */
 			case '\\': case '"':
 				break;
@@ -2172,6 +2175,9 @@ static int store_write_pair(int fd, const char *key, const char *value)
 		case '\t':
 			strbuf_addstr(&sb, "\\t");
 			break;
+		case '\r':
+			strbuf_addstr(&sb, "\\r");
+			break;
 		case '"':
 		case '\\':
 			strbuf_addch(&sb, '\\');

-Peff

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* Re: [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name
  2017-04-10 23:23   ` Ævar Arnfjörð Bjarmason
  2017-04-11  0:30     ` [PATCH] connect.c: handle errors from split_cmdline Jeff King
  2017-04-11  1:14     ` [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name Jeff King
@ 2017-04-11  6:28     ` Joachim Durchholz
  2 siblings, 0 replies; 25+ messages in thread
From: Joachim Durchholz @ 2017-04-11  6:28 UTC (permalink / raw)
  To: Git Mailing List

Am 11.04.2017 um 01:23 schrieb Ævar Arnfjörð Bjarmason:
 > * Much of it fails due to GIT_CEILING_DIRECTORIES not working with
 > dirs with ":" in the name.

Oh. That might hit me: I'm using URLs for parent directory names in a 
cache directory.

urlencode may or may not work:

 > t0021-conversion.sh = 37(%), 58(:)

Even if it works, I'll have a cache directory with pretty unreadable 
names. I had hoped I could avoid this kind of ugliness.

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH] connect.c: handle errors from split_cmdline
  2017-04-11  0:35       ` Jeff King
@ 2017-04-11  9:27         ` Ævar Arnfjörð Bjarmason
  2017-04-11 10:54           ` Jeff King
  0 siblings, 1 reply; 25+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2017-04-11  9:27 UTC (permalink / raw)
  To: Jeff King
  Cc: Git Mailing List, Junio C Hamano, Brandon Williams,
	Joachim Durchholz, Stefan Beller

On Tue, Apr 11, 2017 at 2:35 AM, Jeff King <peff@peff.net> wrote:
> On Mon, Apr 10, 2017 at 08:30:23PM -0400, Jeff King wrote:
>
>> On Tue, Apr 11, 2017 at 01:23:32AM +0200, Ævar Arnfjörð Bjarmason wrote:
>>
>> > There's one segfault in there:
>> >
>> > $ ./t5601-clone.sh --root="xtmp.$(perl -e 'print chr 39')" -v -i -d
>> > [...]
>> > Cloning into 'ssh-bracket-clone-plink-4'...
>> > Segmentation fault
>> > not ok 45 - single quoted plink.exe in GIT_SSH_COMMAND
>>
>> Here's a fix for that one. I think there are a few other memory
>> irregularities in that function, too. I'll send another patch in a
>> minute, but I wanted to get this out in case you were working on it,
>> too.
>
> Actually, nevermind. I thought there was an issue with freeing via the
> results of basename(), but there isn't. There is a minor memory leak,
> but it's best squashed into my original patch, like so:
>
> -- >8 --
> Subject: [PATCH] connect.c: handle errors from split_cmdline
>
> Commit e9d9a8a4d (connect: handle putty/plink also in
> GIT_SSH_COMMAND, 2017-01-02) added a call to
> split_cmdline(), but checks only for a non-zero return to
> see if we got any output. Since the function returns
> negative values (and a NULL argv) on error, we end up
> dereferencing NULL and segfaulting.
>
> Arguably we could report on the parsing error here, but it's
> probably not worth it. This is a best-effort attempt to see
> if we are using plink. So we can simply return here with
> "no, it wasn't plink" and let the shell actually complain
> about the bogus quoting.
>
> While we're here, let's also fix the leak when our split
> fails (as it turns out, split_cmdline can never return 0, so
> this leak wasn't actually triggerable before).
>
> Reported-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
>  connect.c        | 6 ++++--
>  t/t5601-clone.sh | 6 ++++++
>  2 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/connect.c b/connect.c
> index 7d65c1c73..380997afd 100644
> --- a/connect.c
> +++ b/connect.c
> @@ -729,18 +729,20 @@ static void handle_ssh_variant(const char *ssh_command, int is_cmdline,
>         } else {
>                 const char **ssh_argv;
>
>                 p = xstrdup(ssh_command);
> -               if (split_cmdline(p, &ssh_argv)) {
> +               if (split_cmdline(p, &ssh_argv) > 0) {
>                         variant = basename((char *)ssh_argv[0]);
>                         /*
>                          * At this point, variant points into the buffer
>                          * referenced by p, hence we do not need ssh_argv
>                          * any longer.
>                          */
>                         free(ssh_argv);
> -               } else
> +               } else {
> +                       free(p);
>                         return;
> +               }
>         }
>
>         if (!strcasecmp(variant, "plink") ||
>             !strcasecmp(variant, "plink.exe"))
> diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
> index b52b8acf9..9c56f771b 100755
> --- a/t/t5601-clone.sh
> +++ b/t/t5601-clone.sh
> @@ -426,8 +426,14 @@ test_expect_success 'GIT_SSH_VARIANT overrides plink to tortoiseplink' '
>         git clone "[myhost:123]:src" ssh-bracket-clone-variant-4 &&
>         expect_ssh "-batch -P 123" myhost src
>  '
>
> +test_expect_success 'clean failure on broken quoting' '
> +       test_must_fail \
> +               env GIT_SSH_COMMAND="${SQ}plink.exe -v" \
> +               git clone "[myhost:123]:src" sq-failure
> +'
> +
>  # Reset the GIT_SSH environment variable for clone tests.
>  setup_ssh_wrapper

Thanks. That makes it work.

Junio: If you're not in some rush to pick this up I'll take this, fix
up a bunch of other bugs & tests failures on odd --root directories
and submit this and Jeff's \r patch (after adding tests etc) along
with it.

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH] connect.c: handle errors from split_cmdline
  2017-04-11  9:27         ` Ævar Arnfjörð Bjarmason
@ 2017-04-11 10:54           ` Jeff King
  2017-04-11 11:06             ` Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 25+ messages in thread
From: Jeff King @ 2017-04-11 10:54 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Git Mailing List, Junio C Hamano, Brandon Williams,
	Joachim Durchholz, Stefan Beller

On Tue, Apr 11, 2017 at 11:27:57AM +0200, Ævar Arnfjörð Bjarmason wrote:

> Junio: If you're not in some rush to pick this up I'll take this, fix
> up a bunch of other bugs & tests failures on odd --root directories
> and submit this and Jeff's \r patch (after adding tests etc) along
> with it.

That's fine by me. We may want to pick up the segfault one separately
(though I don't think it's security-interesting).

-Peff

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH] connect.c: handle errors from split_cmdline
  2017-04-11 10:54           ` Jeff King
@ 2017-04-11 11:06             ` Ævar Arnfjörð Bjarmason
  2017-04-17  0:51               ` Junio C Hamano
  2017-04-17  0:54               ` Junio C Hamano
  0 siblings, 2 replies; 25+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2017-04-11 11:06 UTC (permalink / raw)
  To: Jeff King
  Cc: Git Mailing List, Junio C Hamano, Brandon Williams,
	Joachim Durchholz, Stefan Beller

On Tue, Apr 11, 2017 at 12:54 PM, Jeff King <peff@peff.net> wrote:
> On Tue, Apr 11, 2017 at 11:27:57AM +0200, Ævar Arnfjörð Bjarmason wrote:
>
>> Junio: If you're not in some rush to pick this up I'll take this, fix
>> up a bunch of other bugs & tests failures on odd --root directories
>> and submit this and Jeff's \r patch (after adding tests etc) along
>> with it.
>
> That's fine by me. We may want to pick up the segfault one separately
> (though I don't think it's security-interesting).

Up to you, but in case it's less work for you & Junio I already have
it in my branch of fallout from this series/discussion, so if it's
easier for you/Junio I can submit it, and it would save my a tiny bit
of work since I could just base on master instead of some other
in-flight patch.

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH] connect.c: handle errors from split_cmdline
  2017-04-11 11:06             ` Ævar Arnfjörð Bjarmason
@ 2017-04-17  0:51               ` Junio C Hamano
  2017-04-17  0:54               ` Junio C Hamano
  1 sibling, 0 replies; 25+ messages in thread
From: Junio C Hamano @ 2017-04-17  0:51 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Jeff King, Git Mailing List, Brandon Williams, Joachim Durchholz,
	Stefan Beller

Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:

>> That's fine by me. We may want to pick up the segfault one separately
>> (though I don't think it's security-interesting).
>
> Up to you, but in case it's less work for you & Junio I already have
> it in my branch of fallout from this series/discussion, so if it's
> easier for you/Junio I can submit it, and it would save my a tiny bit
> of work since I could just base on master instead of some other
> in-flight patch.

Sure, with existing backlog I probably won't get around to it before
you have a clean series anyway.  It may not be a bad idea to base
the patches on 'maint', though, if possible.

Thanks.

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH] connect.c: handle errors from split_cmdline
  2017-04-11 11:06             ` Ævar Arnfjörð Bjarmason
  2017-04-17  0:51               ` Junio C Hamano
@ 2017-04-17  0:54               ` Junio C Hamano
  2017-04-19 10:59                 ` Ævar Arnfjörð Bjarmason
  1 sibling, 1 reply; 25+ messages in thread
From: Junio C Hamano @ 2017-04-17  0:54 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason
  Cc: Jeff King, Git Mailing List, Brandon Williams, Joachim Durchholz,
	Stefan Beller

Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:

> On Tue, Apr 11, 2017 at 12:54 PM, Jeff King <peff@peff.net> wrote:
>> On Tue, Apr 11, 2017 at 11:27:57AM +0200, Ævar Arnfjörð Bjarmason wrote:
>>
>>> Junio: If you're not in some rush to pick this up I'll take this, fix
>>> up a bunch of other bugs & tests failures on odd --root directories
>>> and submit this and Jeff's \r patch (after adding tests etc) along
>>> with it.
>>
>> That's fine by me. We may want to pick up the segfault one separately
>> (though I don't think it's security-interesting).

This one cleanly applied on top of sf/putty-w-args, so I'll queue it
there without introducing a new "jk/fix-something" topic.  That way,
even when sf/putty-w-args were to be merged to older maintenance
track, this fix will also be there as well.

Thanks.

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH] connect.c: handle errors from split_cmdline
  2017-04-17  0:54               ` Junio C Hamano
@ 2017-04-19 10:59                 ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 25+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2017-04-19 10:59 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Jeff King, Git Mailing List, Brandon Williams, Joachim Durchholz,
	Stefan Beller

On Mon, Apr 17, 2017 at 2:54 AM, Junio C Hamano <gitster@pobox.com> wrote:
> Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:
>
>> On Tue, Apr 11, 2017 at 12:54 PM, Jeff King <peff@peff.net> wrote:
>>> On Tue, Apr 11, 2017 at 11:27:57AM +0200, Ævar Arnfjörð Bjarmason wrote:
>>>
>>>> Junio: If you're not in some rush to pick this up I'll take this, fix
>>>> up a bunch of other bugs & tests failures on odd --root directories
>>>> and submit this and Jeff's \r patch (after adding tests etc) along
>>>> with it.
>>>
>>> That's fine by me. We may want to pick up the segfault one separately
>>> (though I don't think it's security-interesting).
>
> This one cleanly applied on top of sf/putty-w-args, so I'll queue it
> there without introducing a new "jk/fix-something" topic.  That way,
> even when sf/putty-w-args were to be merged to older maintenance
> track, this fix will also be there as well.

Thanks. That resubmission is going to take me longer than I expected,
so it makes sense to have that branch applied independently.

^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2017-04-19 10:59 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-09 19:11 [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names Ævar Arnfjörð Bjarmason
2017-04-09 19:11 ` [PATCH 1/2] tests: mark tests that fail when the TEST_DIRECTORY is unusual Ævar Arnfjörð Bjarmason
2017-04-09 19:11 ` [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name Ævar Arnfjörð Bjarmason
2017-04-10  1:47   ` SZEDER Gábor
2017-04-10  8:02     ` Ævar Arnfjörð Bjarmason
2017-04-10 11:19       ` SZEDER Gábor
2017-04-10 11:40         ` Ævar Arnfjörð Bjarmason
2017-04-10 13:38           ` Jeff King
2017-04-10 14:59             ` Joachim Durchholz
2017-04-10 16:57               ` Jeff King
2017-04-10 18:19                 ` Joachim Durchholz
2017-04-10 19:22                   ` Jeff King
2017-04-10 13:43           ` SZEDER Gábor
2017-04-10 23:23   ` Ævar Arnfjörð Bjarmason
2017-04-11  0:30     ` [PATCH] connect.c: handle errors from split_cmdline Jeff King
2017-04-11  0:35       ` Jeff King
2017-04-11  9:27         ` Ævar Arnfjörð Bjarmason
2017-04-11 10:54           ` Jeff King
2017-04-11 11:06             ` Ævar Arnfjörð Bjarmason
2017-04-17  0:51               ` Junio C Hamano
2017-04-17  0:54               ` Junio C Hamano
2017-04-19 10:59                 ` Ævar Arnfjörð Bjarmason
2017-04-11  1:14     ` [PATCH 2/2] test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY name Jeff King
2017-04-11  6:28     ` Joachim Durchholz
2017-04-09 20:37 ` [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names Joachim Durchholz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.