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