diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4fff34487453d9..f9085773f47de4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -413,9 +413,9 @@ jobs: # A RHEL 8 compatible distro. Supported until 2029-05-31. - jobname: almalinux-8 image: almalinux:8 - # Supported until 2026-08-31. - - jobname: debian-11 - image: debian:11 + # Supported until 2028-06-30. + - jobname: debian-12 + image: debian:12 env: jobname: ${{matrix.vector.jobname}} CC: ${{matrix.vector.cc}} diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0242283c3c5571..cd6fd4a5047e87 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -71,9 +71,9 @@ test:linux: # A RHEL 8 compatible distro. Supported until 2029-05-31. - jobname: almalinux-8 image: almalinux:8 - # Supported until 2026-08-31. - - jobname: debian-11 - image: debian:11 + # Supported until 2028-06-30. + - jobname: debian-12 + image: debian:12 artifacts: paths: - t/failed-test-artifacts diff --git a/Documentation/RelNotes/2.56.0.adoc b/Documentation/RelNotes/2.56.0.adoc index c72c2ddac6ff86..28f555da03abf7 100644 --- a/Documentation/RelNotes/2.56.0.adoc +++ b/Documentation/RelNotes/2.56.0.adoc @@ -512,6 +512,12 @@ Performance, Internal Implementation, Development Support etc. during a concurrent geometric repack, and 'git replay' has been fixed to not segfault when reading such missing objects. + * A collection of patches from Git for Windows has been upstreamed, + mostly focusing on simplifying and robustifying build configurations + for MinGW/MSYS2, dropping obsolete compatibility options, and allowing + the main 'git.exe' to be used directly without the extra wrapper + process on Windows. + Fixes since v2.55 ----------------- @@ -804,6 +810,17 @@ Fixes since v2.55 trailing slashes. (merge 2e8a9d94b0 rs/worktree-add-basename-fixes later to maint). + * The CI job for Debian 11 has been updated to use Debian 12, as the + former is now out of the LTS period. + (merge 00fa850235 jk/ci-bump-debian-to-12 later to maint). + + * The CI script to install dependencies for the documentation build + has been updated to install asciidoctor directly via the system + package manager instead of pinning to an older version via gem. + Additionally, an obsolete variable used for retired Azure Pipelines + environments has been removed. + (merge 1c1eed13bd jk/ci-use-system-asciidoctor later to maint). + * Other code cleanup, docfix, build fix, etc. (merge 026636128f ss/submittingpatches-typofix later to maint). (merge d2af22cc21 jc/rerere-doc-typofix later to maint). diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh index 10c3530d1aacdd..2f61fbb07c577d 100755 --- a/ci/install-dependencies.sh +++ b/ci/install-dependencies.sh @@ -164,9 +164,8 @@ sparse) libexpat-dev gettext zlib1g-dev sparse ;; Documentation) - sudo apt-get -q -y install asciidoc xmlto docbook-xsl-ns make + sudo apt-get -q -y install asciidoc xmlto docbook-xsl-ns make ruby - test -n "$ALREADY_HAVE_ASCIIDOCTOR" || sudo gem install --version 1.5.8 asciidoctor sudo gem install concurrent-ruby ;; diff --git a/compat/mingw.c b/compat/mingw.c index 4c2f26d4548147..0c8179f3458bb8 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -3157,6 +3157,45 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen) return -1; } +#ifdef ENSURE_MSYSTEM_IS_SET +#if !defined(RUNTIME_PREFIX) || !defined(HAVE_WPGMPTR) || !defined(MINGW_PREFIX) +static size_t append_system_bin_dirs(char *path UNUSED, size_t size UNUSED) +{ + return 0; +} +#else +static size_t append_system_bin_dirs(char *path, size_t size) +{ + char prefix[32768]; + const char *slash; + size_t len = xwcstoutf(prefix, _wpgmptr, sizeof(prefix)), off = 0; + + if (len == 0 || len >= sizeof(prefix) || + !(slash = find_last_dir_sep(prefix))) + return 0; + /* strip trailing `git.exe` */ + len = slash - prefix; + + /* strip trailing `cmd` or `\bin` or `bin` or `libexec\git-core` */ + if (strip_suffix_mem(prefix, &len, "\\" MINGW_PREFIX "\\libexec\\git-core") || + strip_suffix_mem(prefix, &len, "\\" MINGW_PREFIX "\\bin")) + off += xsnprintf(path + off, size - off, + "%.*s\\" MINGW_PREFIX "\\bin;", (int)len, prefix); + else if (strip_suffix_mem(prefix, &len, "\\cmd") || + strip_suffix_mem(prefix, &len, "\\bin") || + strip_suffix_mem(prefix, &len, "\\libexec\\git-core")) + off += xsnprintf(path + off, size - off, + "%.*s\\" MINGW_PREFIX "\\bin;", (int)len, prefix); + else + return 0; + + off += xsnprintf(path + off, size - off, + "%.*s\\usr\\bin;", (int)len, prefix); + return off; +} +#endif +#endif + static void setup_windows_environment(void) { char *tmp = getenv("TMPDIR"); @@ -3208,6 +3247,35 @@ static void setup_windows_environment(void) if (!tmp && (tmp = getenv("USERPROFILE"))) setenv("HOME", tmp, 1); } + + if (!getenv("PLINK_PROTOCOL")) + setenv("PLINK_PROTOCOL", "ssh", 0); + +#ifdef ENSURE_MSYSTEM_IS_SET + if (!(tmp = getenv("MSYSTEM")) || !tmp[0]) { + const char *home = getenv("HOME"), *path = getenv("PATH"); + char buf[32768]; + size_t off = 0; + + setenv("MSYSTEM", ENSURE_MSYSTEM_IS_SET, 1); + + if (home) + off += xsnprintf(buf + off, sizeof(buf) - off, + "%s\\bin;", home); + off += append_system_bin_dirs(buf + off, sizeof(buf) - off); + if (path) + off += xsnprintf(buf + off, sizeof(buf) - off, + "%s", path); + else if (off > 0) + buf[off - 1] = '\0'; + else + buf[0] = '\0'; + setenv("PATH", buf, 1); + } +#endif + + if (!getenv("LC_ALL") && !getenv("LC_CTYPE") && !getenv("LANG")) + setenv("LC_CTYPE", "C.UTF-8", 1); } int mingw_platform_has_symlinks(void) diff --git a/config.mak.uname b/config.mak.uname index 95ef6e64dcabff..e28870434d9232 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -465,14 +465,8 @@ ifeq ($(uname_S),Windows) GIT_VERSION := $(GIT_VERSION).MSVC pathsep = ; # Assume that this is built in Git for Windows' SDK - ifeq (MINGW32,$(MSYSTEM)) - prefix = /mingw32 - else - ifeq (CLANGARM64,$(MSYSTEM)) - prefix = /clangarm64 - else - prefix = /mingw64 - endif + ifneq (,$(MSYSTEM)) + prefix = $(MINGW_PREFIX) endif # Prepend MSVC 64-bit tool-chain to PATH. # @@ -525,7 +519,8 @@ ifeq ($(uname_S),Windows) NO_POSIX_GOODIES = UnfortunatelyYes NATIVE_CRLF = YesPlease DEFAULT_HELP_FORMAT = html -ifeq (/mingw64,$(subst 32,64,$(subst clangarm,mingw,$(prefix)))) + SKIP_DASHED_BUILT_INS = YabbaDabbaDoo +ifneq (,$(MINGW_PREFIX)) # Move system config into top-level /etc/ ETC_GITCONFIG = ../etc/gitconfig ETC_GITATTRIBUTES = ../etc/gitattributes @@ -541,7 +536,9 @@ endif compat/win32/pthread.o compat/win32/syslog.o \ compat/win32/trace2_win32_process_info.o \ compat/win32/dirent.o - COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DDETECT_MSYS_TTY -DNOGDI -DHAVE_STRING_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\" + COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DDETECT_MSYS_TTY \ + -DENSURE_MSYSTEM_IS_SET="\"$(MSYSTEM)\"" -DMINGW_PREFIX="\"$(patsubst /%,%,$(MINGW_PREFIX))\"" \ + -DNOGDI -DHAVE_STRING_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\" BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -ENTRY:wmainCRTStartup -SUBSYSTEM:CONSOLE # invalidcontinue.obj allows Git's source code to close the same file # handle twice, or to access the osfhandle of an already-closed stdout @@ -718,6 +715,7 @@ ifeq ($(uname_S),MINGW) FSMONITOR_DAEMON_BACKEND = win32 FSMONITOR_OS_SETTINGS = win32 + SKIP_DASHED_BUILT_INS = YabbaDabbaDoo RUNTIME_PREFIX = YesPlease HAVE_WPGMPTR = YesWeDo NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease @@ -756,26 +754,25 @@ ifeq ($(uname_S),MINGW) ifneq (,$(findstring -O,$(filter-out -O0 -Og,$(CFLAGS)))) BASIC_LDFLAGS += -Wl,--dynamicbase endif - ifeq (MINGW32,$(MSYSTEM)) - prefix = /mingw32 - HOST_CPU = i686 - BASIC_LDFLAGS += -Wl,--pic-executable,-e,_mainCRTStartup - endif - ifeq (MINGW64,$(MSYSTEM)) - prefix = /mingw64 - HOST_CPU = x86_64 - BASIC_LDFLAGS += -Wl,--pic-executable,-e,mainCRTStartup - else ifeq (CLANGARM64,$(MSYSTEM)) - prefix = /clangarm64 - HOST_CPU = aarch64 - BASIC_LDFLAGS += -Wl,--pic-executable,-e,mainCRTStartup - else - COMPAT_CFLAGS += -D_USE_32BIT_TIME_T - BASIC_LDFLAGS += -Wl,--large-address-aware + ifneq (,$(MSYSTEM)) + ifeq ($(MINGW_PREFIX),$(filter-out /%,$(MINGW_PREFIX))) + # Override if empty or does not start with a slash + MINGW_PREFIX := /$(shell echo '$(MSYSTEM)' | tr A-Z a-z) + endif + prefix = $(MINGW_PREFIX) + HOST_CPU = $(patsubst %-w64-mingw32,%,$(MINGW_CHOST)) + BASIC_LDFLAGS += -Wl,--pic-executable + COMPAT_CFLAGS += -DDETECT_MSYS_TTY \ + -DENSURE_MSYSTEM_IS_SET="\"$(MSYSTEM)\"" \ + -DMINGW_PREFIX="\"$(patsubst /%,%,$(MINGW_PREFIX))\"" + ifeq (MINGW32,$(MSYSTEM)) + BASIC_LDFLAGS += -Wl,--large-address-aware + endif + # Move system config into top-level /etc/ + ETC_GITCONFIG = ../etc/gitconfig + ETC_GITATTRIBUTES = ../etc/gitattributes endif - CC = gcc - COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 -DDETECT_MSYS_TTY \ - -fstack-protector-strong + COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 -fstack-protector-strong EXTLIBS += -lntdll EXTRA_PROGRAMS += headless-git$X INSTALL = /bin/install @@ -783,11 +780,7 @@ ifeq ($(uname_S),MINGW) HAVE_LIBCHARSET_H = YesPlease USE_GETTEXT_SCHEME = fallthrough USE_LIBPCRE = YesPlease - ifeq (/mingw64,$(subst 32,64,$(subst clangarm,mingw,$(prefix)))) - # Move system config into top-level /etc/ - ETC_GITCONFIG = ../etc/gitconfig - ETC_GITATTRIBUTES = ../etc/gitattributes - endif + NO_PYTHON = endif ifeq ($(uname_S),QNX) COMPAT_CFLAGS += -DSA_RESTART=0 diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt index 8f56203f34d9bc..e76bd19b65642b 100644 --- a/contrib/buildsystems/CMakeLists.txt +++ b/contrib/buildsystems/CMakeLists.txt @@ -256,7 +256,14 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Windows") _CONSOLE DETECT_MSYS_TTY STRIP_EXTENSION=".exe" NO_SYMLINK_HEAD UNRELIABLE_FSTAT NOGDI OBJECT_CREATION_MODE=1 __USE_MINGW_ANSI_STDIO=0 OVERRIDE_STRDUP MMAP_PREVENTS_DELETE USE_WIN32_MMAP - HAVE_WPGMPTR ENSURE_MSYSTEM_IS_SET HAVE_RTLGENRANDOM) + HAVE_WPGMPTR HAVE_RTLGENRANDOM) + if(CMAKE_GENERATOR_PLATFORM STREQUAL "x64") + add_compile_definitions(ENSURE_MSYSTEM_IS_SET="MINGW64" MINGW_PREFIX="mingw64") + elseif(CMAKE_GENERATOR_PLATFORM STREQUAL "arm64") + add_compile_definitions(ENSURE_MSYSTEM_IS_SET="CLANGARM64" MINGW_PREFIX="clangarm64") + elseif(CMAKE_GENERATOR_PLATFORM STREQUAL "x86") + add_compile_definitions(ENSURE_MSYSTEM_IS_SET="MINGW32" MINGW_PREFIX="mingw32") + endif() list(APPEND compat_SOURCES compat/mingw.c compat/winansi.c diff --git a/gitk-git/README.md b/gitk-git/README.md index 2e307463c61d63..c4027882aeba19 100644 --- a/gitk-git/README.md +++ b/gitk-git/README.md @@ -79,13 +79,14 @@ are also accepted. All commits must be signed off (use `git commit --signoff`) and should have commit messages prefixed with `gitk:`. -Email Patches -------------- - Send patches to git@vger.kernel.org and CC j6t@kdbg.org. See the Git project's [patch submission guidelines](https://git-scm.com/docs/SubmittingPatches) for detailed instructions on creating and sending patches. +Please do not submit work that originated from AI, because this project +is down-streamed to the Git project, which has a rather +[strict AI guideline](https://git-scm.com/docs/SubmittingPatches#ai). + License ======= diff --git a/gitk-git/gitk b/gitk-git/gitk index 0f3571050bef1c..9506739c503b1a 100755 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -11801,8 +11801,6 @@ proc prefspage_general {notebook} { } proc prefspage_colors {notebook} { - global bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor - global diffbgcolors linkfgcolor global themeloader set page [create_prefs_page $notebook.colors] @@ -11834,75 +11832,72 @@ proc prefspage_colors {notebook} { ttk::label $page.cdisp -text [mc "Colors: press to choose"] -font mainfontbold grid $page.cdisp - -sticky w -pady 10 - label $page.bg -padx 40 -relief sunk -background $bgcolor - ttk::button $page.bgbut -text [mc "Background"] \ - -command [list choosecolor bgcolor {} $page [mc "background"]] - grid x $page.bgbut $page.bg -sticky w - - label $page.fg -padx 40 -relief sunk -background $fgcolor - ttk::button $page.fgbut -text [mc "Foreground"] \ - -command [list choosecolor fgcolor {} $page [mc "foreground"]] - grid x $page.fgbut $page.fg -sticky w - - label $page.diffold -padx 40 -relief sunk -background [lindex $diffcolors 0] - ttk::button $page.diffoldbut -text [mc "Diff: old lines"] \ - -command [list choosecolor diffcolors 0 $page [mc "diff old lines"]] - grid x $page.diffoldbut $page.diffold -sticky w - - label $page.diffoldbg -padx 40 -relief sunk -background [lindex $diffbgcolors 0] - ttk::button $page.diffoldbgbut -text [mc "Diff: old lines bg"] \ - -command [list choosecolor diffbgcolors 0 $page [mc "diff old lines bg"]] - grid x $page.diffoldbgbut $page.diffoldbg -sticky w - - label $page.diffnew -padx 40 -relief sunk -background [lindex $diffcolors 1] - ttk::button $page.diffnewbut -text [mc "Diff: new lines"] \ - -command [list choosecolor diffcolors 1 $page [mc "diff new lines"]] - grid x $page.diffnewbut $page.diffnew -sticky w - - label $page.diffnewbg -padx 40 -relief sunk -background [lindex $diffbgcolors 1] - ttk::button $page.diffnewbgbut -text [mc "Diff: new lines bg"] \ - -command [list choosecolor diffbgcolors 1 $page [mc "diff new lines bg"]] - grid x $page.diffnewbgbut $page.diffnewbg -sticky w - - label $page.hunksep -padx 40 -relief sunk -background [lindex $diffcolors 2] - ttk::button $page.hunksepbut -text [mc "Diff: hunk header"] \ - -command [list choosecolor diffcolors 2 $page [mc "diff hunk header"]] - grid x $page.hunksepbut $page.hunksep -sticky w - - label $page.markbgsep -padx 40 -relief sunk -background $markbgcolor - ttk::button $page.markbgbut -text [mc "Marked line bg"] \ - -command [list choosecolor markbgcolor {} $page [mc "marked line background"]] - grid x $page.markbgbut $page.markbgsep -sticky w - - label $page.selbgsep -padx 40 -relief sunk -background $selectbgcolor - ttk::button $page.selbgbut -text [mc "Select bg"] \ - -command [list choosecolor selectbgcolor {} $page [mc "background"]] - grid x $page.selbgbut $page.selbgsep -sticky w - - label $page.linkfg -padx 40 -relief sunk -background $linkfgcolor - ttk::button $page.linkfgbut -text [mc "Link"] \ - -command [list choosecolor linkfgcolor {} $page [mc "link"]] - grid x $page.linkfgbut $page.linkfg -sticky w + + set coloruielems [list \ + bg bgcolor {} \ + [mc "Background"] \ + [mc "choose background color"] \ + fg fgcolor {} \ + [mc "Main text"] \ + [mc "choose main text color"] \ + selbg selectbgcolor {} \ + [mc "Selected text background"] \ + [mc "choose background color of selected text"] \ + linkfg linkfgcolor {} \ + [mc "Link text"] \ + [mc "choose color of link text"] \ + diffold diffcolors 0 \ + [mc "Old line text"] \ + [mc "choose text color of old lines"] \ + diffoldbg diffbgcolors 0 \ + [mc "Old line background"] \ + [mc "choose background color of old lines"] \ + diffnew diffcolors 1 \ + [mc "New line text"] \ + [mc "choose text color of new lines"] \ + diffnewbg diffbgcolors 1 \ + [mc "New line background"] \ + [mc "choose background color of new lines"] \ + hunksep diffcolors 2 \ + [mc "Hunk header text"] \ + [mc "choose text color of hunk headers"] \ + markbg markbgcolor {} \ + [mc "Marked line background"] \ + [mc "choose background color of marked lines"] \ + ] + + foreach {uielem colorvar idx label title} $coloruielems { + ttk::label $page.$uielem -text $label + button $page.${uielem}btn -padx 40 -pady 0 -borderwidth 2 \ + -command [list choosecolor $colorvar $idx $page $title] + grid x $page.$uielem $page.${uielem}btn -sticky w -pady 1 + } grid columnconfigure $page 2 -weight 1 + prefspage_set_colorswatches $page return $page } proc prefspage_set_colorswatches {page} { - global bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor + global bgcolor fgcolor diffcolors selectbgcolor markbgcolor global diffbgcolors linkfgcolor - $page.bg configure -background $bgcolor - $page.fg configure -background $fgcolor - $page.diffold configure -background [lindex $diffcolors 0] - $page.diffoldbg configure -background [lindex $diffbgcolors 0] - $page.diffnew configure -background [lindex $diffcolors 1] - $page.diffnewbg configure -background [lindex $diffbgcolors 1] - $page.hunksep configure -background [lindex $diffcolors 2] - $page.markbgsep configure -background $markbgcolor - $page.selbgsep configure -background $selectbgcolor - $page.linkfg configure -background $linkfgcolor + set coloruielems [list \ + bg $bgcolor \ + fg $fgcolor \ + diffold [lindex $diffcolors 0] \ + diffoldbg [lindex $diffbgcolors 0] \ + diffnew [lindex $diffcolors 1] \ + diffnewbg [lindex $diffbgcolors 1] \ + hunksep [lindex $diffcolors 2] \ + markbg $markbgcolor \ + selbg $selectbgcolor \ + linkfg $linkfgcolor \ + ] + foreach {uielem color} $coloruielems { + $page.${uielem}btn configure -background $color -activebackground $color + } } proc prefspage_fonts {notebook} { @@ -12019,11 +12014,11 @@ proc choose_themeloader {prefspage} { } } -proc choosecolor {v vi prefspage x} { +proc choosecolor {v vi prefspage title} { global $v set c [tk_chooseColor -initialcolor [lindex [set $v] $vi] \ - -title [mc "Gitk: choose color for %s" $x]] + -title "Gitk: $title"] if {$c eq {}} return lset $v $vi $c set_gui_colors diff --git a/meson.build b/meson.build index d86f2acd2b2a46..0a95d90d211fd6 100644 --- a/meson.build +++ b/meson.build @@ -1318,7 +1318,6 @@ elif host_machine.system() == 'windows' libgit_c_args += [ '-DDETECT_MSYS_TTY', - '-DENSURE_MSYSTEM_IS_SET', '-DNATIVE_CRLF', '-DNOGDI', '-DNO_POSIX_GOODIES', @@ -1328,6 +1327,20 @@ elif host_machine.system() == 'windows' '-D__USE_MINGW_ANSI_STDIO=0', ] + msystem = get_option('msystem') + if msystem != '' + mingw_prefix = get_option('mingw_prefix') + if mingw_prefix == '' + mingw_prefix = msystem.to_lower() + elif mingw_prefix.startswith('/') + mingw_prefix = mingw_prefix.substring(1) + endif + libgit_c_args += [ + '-DENSURE_MSYSTEM_IS_SET="' + msystem + '"', + '-DMINGW_PREFIX="' + mingw_prefix + '"' + ] + endif + libgit_dependencies += compiler.find_library('ntdll') libgit_include_directories += 'compat/win32' if compiler.get_id() == 'msvc' diff --git a/meson_options.txt b/meson_options.txt index dc88f130d754a1..becf4689bf63b1 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -21,6 +21,10 @@ option('runtime_prefix', type: 'boolean', value: false, description: 'Resolve ancillary tooling and support files relative to the location of the runtime binary instead of hard-coding them into the binary.') option('sane_tool_path', type: 'array', value: [], description: 'An array of paths to pick up tools from in case the normal tools are broken or lacking.') +option('msystem', type: 'string', value: '', + description: 'Fall-back on Windows when MSYSTEM is not set.') +option('mingw_prefix', type: 'string', value: '', + description: 'Fall-back on Windows when MINGW_PREFIX is not set.') # Build information compiled into Git and other parts like documentation. option('build_date', type: 'string', value: '', diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh index 8545cdfab559b4..56faf5fe732ee0 100755 --- a/t/t0060-path-utils.sh +++ b/t/t0060-path-utils.sh @@ -602,7 +602,8 @@ test_expect_success !VALGRIND,RUNTIME_PREFIX,CAN_EXEC_IN_PWD 'RUNTIME_PREFIX wor echo "echo HERE" | write_script pretend/libexec/git-core/git-here && GIT_EXEC_PATH= ./pretend/bin/git here >actual && echo HERE >expect && - test_cmp expect actual' + test_cmp expect actual +' test_expect_success !VALGRIND,RUNTIME_PREFIX,CAN_EXEC_IN_PWD '%(prefix)/ works' ' git config yes.path "%(prefix)/yes" && @@ -611,4 +612,34 @@ test_expect_success !VALGRIND,RUNTIME_PREFIX,CAN_EXEC_IN_PWD '%(prefix)/ works' test_cmp expect actual ' +test_expect_success MINGW,RUNTIME_PREFIX 'MSYSTEM/PATH is adjusted if necessary' ' + if test -z "$MINGW_PREFIX" + then + MINGW_PREFIX="/$(echo "${MSYSTEM:-MINGW64}" | tr A-Z a-z)" + fi && + mkdir -p "$HOME"/bin pretend"$MINGW_PREFIX"/bin \ + pretend"$MINGW_PREFIX"/libexec/git-core pretend/usr/bin && + cp "$GIT_EXEC_PATH"/git.exe pretend"$MINGW_PREFIX"/bin/ && + cp "$GIT_EXEC_PATH"/git.exe pretend"$MINGW_PREFIX"/libexec/git-core/ && + # copy the .dll files, if any (happens when building via CMake) + if test -n "$(ls "$GIT_EXEC_PATH"/*.dll 2>/dev/null)" + then + cp "$GIT_EXEC_PATH"/*.dll pretend"$MINGW_PREFIX"/bin/ && + cp "$GIT_EXEC_PATH"/*.dll pretend"$MINGW_PREFIX"/libexec/git-core/ + fi && + echo "env | grep MSYSTEM=" | write_script "$HOME"/bin/git-test-home && + echo "echo ${MINGW_PREFIX#/}" | write_script pretend"$MINGW_PREFIX"/bin/git-test-bin && + echo "echo usr" | write_script pretend/usr/bin/git-test-bin2 && + + ( + MSYSTEM= && + GIT_EXEC_PATH= && + pretend"$MINGW_PREFIX"/libexec/git-core/git.exe test-home >actual && + pretend"$MINGW_PREFIX"/libexec/git-core/git.exe test-bin >>actual && + pretend"$MINGW_PREFIX"/bin/git.exe test-bin2 >>actual + ) && + test_write_lines MSYSTEM=$MSYSTEM "${MINGW_PREFIX#/}" usr >expect && + test_cmp expect actual +' + test_done