From ec9d7b3e66f9428c77a811ccec0c54586e8b232a Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Fri, 23 Dec 2016 12:12:50 +0100 Subject: [PATCH 1/2] mingw: demonstrate a regression pushing to UNC paths On Windows, there are "UNC paths" to access network (AKA shared) folders, of the form \\server\sharename\directory. This provides a convenient way for Windows developers to share their Git repositories without having to have a dedicated server. Git for Windows v2.11.0 introduced a regression where pushing to said UNC paths no longer works, although fetching and cloning still does. Demonstrate what is the problem, using so-called "administrative shares": disk volumes are automatically shared under certain circumstances, e.g. the C: drive is shared as \\localhost\c$. The test needs to be skipped if the current directory is inaccessible via said administrative share, of course. Original-report: https://github.com/git-for-windows/git/issues/979 Signed-off-by: Johannes Schindelin --- t/t5580-clone-push-unc.sh | 46 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100755 t/t5580-clone-push-unc.sh diff --git a/t/t5580-clone-push-unc.sh b/t/t5580-clone-push-unc.sh new file mode 100755 index 0000000000..77abeaf4bd --- /dev/null +++ b/t/t5580-clone-push-unc.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +test_description='various UNC path tests (Windows-only)' +. ./test-lib.sh + +if ! test_have_prereq MINGW; then + skip_all='skipping UNC path tests, requires Windows' + test_done +fi + +UNCPATH="$(pwd)" +case "$UNCPATH" in +[A-Z]:*) + # Use administrative share e.g. \\localhost\C$\git-sdk-64\usr\src\git + # (we use forward slashes here because MSYS2 and Git accept them, and + # they are easier on the eyes) + UNCPATH="//localhost/${UNCPATH%%:*}\$/${UNCPATH#?:}" + test -d "$UNCPATH" || { + skip_all='could not access administrative share; skipping' + test_done + } + ;; +*) + skip_all='skipping UNC path tests, cannot determine current path as UNC' + test_done + ;; +esac + +test_expect_success setup ' + test_commit initial +' + +test_expect_success clone ' + git clone "file://$UNCPATH" clone +' + +test_expect_failure push ' + ( + cd clone && + git checkout -b to-push && + test_commit to-push && + git push origin HEAD + ) +' + +test_done From 216bdc0ac074e4daaac6be246f2a78f4a778b2ba Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Wed, 14 Dec 2016 20:37:38 +0100 Subject: [PATCH 2/2] fix pushing to //server/share/dir on Windows normalize_path_copy() is not prepared to keep the double-slash of a //server/share/dir kind of path, but treats it like a regular POSIX style path and transforms it to /server/share/dir. The bug manifests when 'git push //server/share/dir master' is run, because tmp_objdir_add_as_alternate() uses the path in normalized form when it registers the quarantine object database via link_alt_odb_entries(). Needless to say that the directory cannot be accessed using the wrongly normalized path. Fix it by skipping all of the root part, not just a potential drive prefix. offset_1st_component takes care of this, see the implementation in compat/mingw.c::mingw_offset_1st_component(). This fixes https://github.com/git-for-windows/git/issues/979 Signed-off-by: Johannes Sixt Signed-off-by: Johannes Schindelin --- t/t5580-clone-push-unc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/t5580-clone-push-unc.sh b/t/t5580-clone-push-unc.sh index 77abeaf4bd..e06d230724 100755 --- a/t/t5580-clone-push-unc.sh +++ b/t/t5580-clone-push-unc.sh @@ -34,7 +34,7 @@ test_expect_success clone ' git clone "file://$UNCPATH" clone ' -test_expect_failure push ' +test_expect_success push ' ( cd clone && git checkout -b to-push &&