git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v6 21/21] ci: parallelize testing on Windows

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Jan 29, 2019, 14:19 UTC
Message-ID
<1572444361982199fdab9c6f6b7e94383717b6c9.1548771561.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.31.v6.git.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

The fact that Git's test suite is implemented in Unix shell script that is as portable as we can muster, combined with the fact that Unix shell scripting is foreign to Windows (and therefore has to be emulated), results in pretty abysmal speed of the test suite on that platform, for pretty much no other reason than that language choice.

For comparison: while the Linux build & test is typically done within about 8 minutes, the Windows build & test typically lasts about 80 minutes in Azure Pipelines.

To help with that, let's use the Azure Pipeline feature where you can parallelize jobs, make jobs depend on each other, and pass artifacts between them.

The tests are distributed using the following heuristic: listing all test scripts ordered by size in descending order (as a cheap way to estimate the overall run time), every Nth script is run (where N is the total number of parallel jobs), starting at the index corresponding to the parallel job. This slicing is performed by a new function that is added to the `test-tool`.

To optimize the overall runtime of the entire Pipeline, we need to move the Windows jobs to the beginning (otherwise there would be a very decent chance for the Pipeline to be run only the Windows build, while all the parallel Windows test jobs wait for this single one).

We use Azure Pipelines Artifacts for both the minimal Git for Windows SDK as well as the built executables, as deduplication and caching close to the agents makes that really fast. For comparison: while downloading and unpacking the minimal Git for Windows SDK via PowerShell takes only one minute (down from anywhere between 2.5 to 7 when using a shallow clone), uploading it as Pipeline Artifact takes less than 30s and downloading and unpacking less than 20s (sometimes even as little as only twelve seconds).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 Makefile                   | 10 +++++
 azure-pipelines.yml        | 79 ++++++++++++++++++++++++++++++++++----
 ci/make-test-artifacts.sh  | 12 ++++++
 ci/run-test-slice.sh       | 17 ++++++++
 t/helper/test-path-utils.c | 31 +++++++++++++++
 5 files changed, 141 insertions(+), 8 deletions(-)
 create mode 100755 ci/make-test-artifacts.sh
 create mode 100755 ci/run-test-slice.sh
diff --git a/Makefile b/Makefile
index 044b4f77bd..daa318fe17 100644
--- a/Makefile
+++ b/Makefile
@@ -2927,6 +2927,16 @@ rpm::
 	@false
 .PHONY: rpm
 
+artifacts-tar:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) \
+		GIT-BUILD-OPTIONS $(TEST_PROGRAMS) $(test_bindir_programs) \
+		$(NO_INSTALL) $(MOFILES)
+	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) \
+		SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
+	test -n "$(ARTIFACTS_DIRECTORY)"
+	mkdir -p "$(ARTIFACTS_DIRECTORY)"
+	$(TAR) czf "$(ARTIFACTS_DIRECTORY)/artifacts.tar.gz" $^ templates/blt/
+.PHONY: artifacts-tar
+
 htmldocs = git-htmldocs-$(GIT_VERSION)
 manpages = git-manpages-$(GIT_VERSION)
 .PHONY: dist-doc distclean
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 480e841a85..c329b7218b 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -3,8 +3,8 @@ resources:
   fetchDepth: 1
 
 jobs:
-- job: windows
-  displayName: Windows
+- job: windows_build
+  displayName: Windows Build
   condition: succeeded()
   pool: Hosted
   timeoutInMinutes: 240
@@ -30,21 +30,84 @@ jobs:
     displayName: 'Download git-sdk-64-minimal'
   - powershell: |
       & git-sdk-64-minimal\usr\bin\bash.exe -lc @"
-        export DEVELOPER=1
-        export NO_PERL=1
-        export NO_SVN_TESTS=1
-        export GIT_TEST_SKIP_REBASE_P=1
+        ci/make-test-artifacts.sh artifacts
+      "@
+      if (!$?) { exit(1) }
+    displayName: Build
+    env:
+      HOME: $(Build.SourcesDirectory)
+      MSYSTEM: MINGW64
+      DEVELOPER: 1
+      NO_PERL: 1
+  - task: PublishPipelineArtifact@0
+    displayName: 'Publish Pipeline Artifact: test artifacts'
+    inputs:
+      artifactName: 'windows-artifacts'
+      targetPath: '$(Build.SourcesDirectory)\artifacts'
+  - task: PublishPipelineArtifact@0
+    displayName: 'Publish Pipeline Artifact: git-sdk-64-minimal'
+    inputs:
+      artifactName: 'git-sdk-64-minimal'
+      targetPath: '$(Build.SourcesDirectory)\git-sdk-64-minimal'
+  - powershell: |
+      if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
+        cmd /c rmdir "$(Build.SourcesDirectory)\test-cache"
+      }
+    displayName: 'Unmount test-cache'
+    condition: true
+    env:
+      GITFILESHAREPWD: $(gitfileshare.pwd)
+
+- job: windows_test
+  displayName: Windows Test
+  dependsOn: windows_build
+  condition: succeeded()
+  pool: Hosted
+  timeoutInMinutes: 240
+  strategy:
+    parallel: 10
+  steps:
+  - powershell: |
+      if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
+        net use s: \\gitfileshare.file.core.windows.net\test-cache "$GITFILESHAREPWD" /user:AZURE\gitfileshare /persistent:no
+        cmd /c mklink /d "$(Build.SourcesDirectory)\test-cache" S:\
+      }
+    displayName: 'Mount test-cache'
+    env:
+      GITFILESHAREPWD: $(gitfileshare.pwd)
+  - task: DownloadPipelineArtifact@0
+    displayName: 'Download Pipeline Artifact: test artifacts'
+    inputs:
+      artifactName: 'windows-artifacts'
+      targetPath: '$(Build.SourcesDirectory)'
+  - task: DownloadPipelineArtifact@0
+    displayName: 'Download Pipeline Artifact: git-sdk-64-minimal'
+    inputs:
+      artifactName: 'git-sdk-64-minimal'
+      targetPath: '$(Build.SourcesDirectory)\git-sdk-64-minimal'
+  - powershell: |
+      & git-sdk-64-minimal\usr\bin\bash.exe -lc @"
+        test -f artifacts.tar.gz || {
+          echo No test artifacts found\; skipping >&2
+          exit 0
+        }
+        tar xf artifacts.tar.gz || exit 1
+
+        # Let Git ignore the SDK and the test-cache
+        printf '%s\n' /git-sdk-64-minimal/ /test-cache/ >>.git/info/exclude
 
-        ci/run-build-and-tests.sh || {
+        ci/run-test-slice.sh `$SYSTEM_JOBPOSITIONINPHASE `$SYSTEM_TOTALJOBSINPHASE || {
           ci/print-test-failures.sh
           exit 1
         }
       "@
       if (!$?) { exit(1) }
-    displayName: 'Build & Test'
+    displayName: 'Test (parallel)'
     env:
       HOME: $(Build.SourcesDirectory)
       MSYSTEM: MINGW64
+      NO_SVN_TESTS: 1
+      GIT_TEST_SKIP_REBASE_P: 1
   - powershell: |
       if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
         cmd /c rmdir "$(Build.SourcesDirectory)\test-cache"
diff --git a/ci/make-test-artifacts.sh b/ci/make-test-artifacts.sh
new file mode 100755
index 0000000000..646967481f
--- /dev/null
+++ b/ci/make-test-artifacts.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+#
+# Build Git and store artifacts for testing
+#
+
+mkdir -p "$1" # in case ci/lib.sh decides to quit early
+
+. ${0%/*}/lib.sh
+
+make artifacts-tar ARTIFACTS_DIRECTORY="$1"
+
+check_unignored_build_artifacts
diff --git a/ci/run-test-slice.sh b/ci/run-test-slice.sh
new file mode 100755
index 0000000000..f8c2c3106a
--- /dev/null
+++ b/ci/run-test-slice.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+#
+# Test Git in parallel
+#
+
+. ${0%/*}/lib.sh
+
+case "$CI_OS_NAME" in
+windows*) cmd //c mklink //j t\\.prove "$(cygpath -aw "$cache_dir/.prove")";;
+*) ln -s "$cache_dir/.prove" t/.prove;;
+esac
+
+make --quiet -C t T="$(cd t &&
+	./helper/test-tool path-utils slice-tests "$1" "$2" t[0-9]*.sh |
+	tr '\n' ' ')"
+
+check_unignored_build_artifacts
diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c
index 6efde6f5ba..5d543ad21f 100644
--- a/t/helper/test-path-utils.c
+++ b/t/helper/test-path-utils.c
@@ -177,6 +177,14 @@ static int is_dotgitmodules(const char *path)
 	return is_hfs_dotgitmodules(path) || is_ntfs_dotgitmodules(path);
 }
 
+static int cmp_by_st_size(const void *a, const void *b)
+{
+	intptr_t x = (intptr_t)((struct string_list_item *)a)->util;
+	intptr_t y = (intptr_t)((struct string_list_item *)b)->util;
+
+	return x > y ? -1 : (x < y ? +1 : 0);
+}
+
 int cmd__path_utils(int argc, const char **argv)
 {
 	if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) {
@@ -324,6 +332,29 @@ int cmd__path_utils(int argc, const char **argv)
 		return 0;
 	}
 
+	if (argc > 5 && !strcmp(argv[1], "slice-tests")) {
+		int res = 0;
+		long offset, stride, i;
+		struct string_list list = STRING_LIST_INIT_NODUP;
+		struct stat st;
+
+		offset = strtol(argv[2], NULL, 10);
+		stride = strtol(argv[3], NULL, 10);
+		if (stride < 1)
+			stride = 1;
+		for (i = 4; i < argc; i++)
+			if (stat(argv[i], &st))
+				res = error_errno("Cannot stat '%s'", argv[i]);
+			else
+				string_list_append(&list, argv[i])->util =
+					(void *)(intptr_t)st.st_size;
+		QSORT(list.items, list.nr, cmp_by_st_size);
+		for (i = offset; i < list.nr; i+= stride)
+			printf("%s\n", list.items[i].string);
+
+		return !!res;
+	}
+
 	fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
 		argv[1] ? argv[1] : "(there was none)");
 	return 1;
-- 
gitgitgadget
Previous: Johannes Schindelin via GitGitGadgetNext: Johannes Schindelin via GitGitGadget
Message 206 of 225 in “Offer to run CI/PR builds in Visual Studio Team Services”
  1. 0/9 Offer to run CI/PR builds in Visual Studio Team ServicesJohannes Schindelin via GitGitGadget, Sep 3, 2018
  2. 1/9 ci: rename the library of common functionsJohannes Schindelin via GitGitGadget, Sep 3, 2018
  3. 3/9 test-date: add a subcommand to measure times in shell scriptsJohannes Schindelin via GitGitGadget, Sep 3, 2018
  4. 2/9 ci/lib.sh: encapsulate Travis-specific thingsJohannes Schindelin via GitGitGadget, Sep 3, 2018
  5. Eric SunshineSep 3, 2018
  6. Johannes SchindelinSep 4, 2018
  7. Sebastian SchuberthSep 5, 2018
  8. Johannes SchindelinSep 14, 2018
  9. 4/9 tests: optionally write results as JUnit-style .xmlJohannes Schindelin via GitGitGadget, Sep 3, 2018
  10. Eric SunshineSep 4, 2018
  11. Johannes SchindelinSep 4, 2018
  12. 5/9 ci/lib.sh: add support for VSTS CIJohannes Schindelin via GitGitGadget, Sep 3, 2018
  13. 6/9 Add a build definition for VSTSJohannes Schindelin via GitGitGadget, Sep 3, 2018
  14. 7/9 tests: include detailed trace logs with --write-junit-xml upon failureJohannes Schindelin via GitGitGadget, Sep 3, 2018
  15. Eric SunshineSep 4, 2018
  16. Johannes SchindelinSep 4, 2018
  17. Luke DiamandSep 5, 2018
  18. Johannes SchindelinSep 5, 2018
  19. Luke DiamandSep 5, 2018
  20. Johannes SchindelinSep 14, 2018
  21. Eric SunshineSep 5, 2018
  22. Jeff KingSep 5, 2018
  23. Johannes SchindelinSep 14, 2018
  24. Johannes SchindelinSep 14, 2018
  25. 9/9 README: add a build badge (status of the VSTS build)Johannes Schindelin via GitGitGadget, Sep 3, 2018
  26. 8/9 tests: record more stderr with --write-junit-xml in case of failureJohannes Schindelin via GitGitGadget, Sep 3, 2018
  27. Sebastian SchuberthSep 5, 2018
  28. Stefan BellerSep 5, 2018
  29. 00/13 Offer to run CI/PR builds in Azure PipelinesJohannes Schindelin via GitGitGadget, Oct 15, 2018
  30. 01/13 ci: rename the library of common functionsJohannes Schindelin via GitGitGadget, Oct 15, 2018
  31. Junio C HamanoOct 16, 2018
  32. 02/13 ci/lib.sh: encapsulate Travis-specific thingsJohannes Schindelin via GitGitGadget, Oct 15, 2018
  33. SZEDER GáborOct 18, 2018
  34. Junio C HamanoOct 19, 2018
  35. SZEDER GáborOct 19, 2018
  36. Junio C HamanoOct 19, 2018
  37. 03/13 test-date: add a subcommand to measure times in shell scriptsJohannes Schindelin via GitGitGadget, Oct 15, 2018
  38. 04/13 tests: optionally write results as JUnit-style .xmlJohannes Schindelin via GitGitGadget, Oct 15, 2018
  39. 05/13 ci/lib.sh: add support for Azure PipelinesJohannes Schindelin via GitGitGadget, Oct 15, 2018
  40. SZEDER GáborOct 16, 2018
  41. Johannes SchindelinOct 16, 2018
  42. 06/13 Add a build definition for Azure DevOpsJohannes Schindelin via GitGitGadget, Oct 15, 2018
  43. Junio C HamanoOct 16, 2018
  44. Johannes SchindelinOct 16, 2018
  45. SZEDER GáborOct 16, 2018
  46. Johannes SchindelinOct 17, 2018
  47. 07/13 tests: introduce `test_atexit`Johannes Schindelin via GitGitGadget, Oct 15, 2018
  48. SZEDER GáborOct 21, 2018
  49. 08/13 git-daemon: use `test_atexit` in the testsJohannes Schindelin via GitGitGadget, Oct 15, 2018
  50. 09/13 git-p4: use `test_atexit` to kill the daemonJohannes Schindelin via GitGitGadget, Oct 15, 2018
  51. Luke DiamandOct 15, 2018
  52. Johannes SchindelinOct 15, 2018
  53. Luke DiamandOct 15, 2018
  54. Johannes SchindelinOct 16, 2018
  55. Eric SunshineOct 16, 2018
  56. Johannes SchindelinOct 16, 2018
  57. SZEDER GáborOct 17, 2018
  58. 10/13 tests: include detailed trace logs with --write-junit-xml upon failureJohannes Schindelin via GitGitGadget, Oct 15, 2018
  59. SZEDER GáborOct 16, 2018
  60. Johannes SchindelinOct 16, 2018
  61. SZEDER GáborOct 16, 2018
  62. Johannes SchindelinOct 16, 2018
  63. 11/13 tests: record more stderr with --write-junit-xml in case of failureJohannes Schindelin via GitGitGadget, Oct 15, 2018
  64. 12/13 README: add a build badge (status of the Azure Pipelines build)Johannes Schindelin via GitGitGadget, Oct 15, 2018
  65. Eric SunshineOct 16, 2018
  66. Johannes SchindelinOct 16, 2018
  67. 13/13 travis: fix skipping tagged releasesJohannes Schindelin via GitGitGadget, Oct 15, 2018
  68. SZEDER GáborOct 16, 2018
  69. Johannes SchindelinOct 16, 2018
  70. Taylor BlauOct 15, 2018
  71. Johannes SchindelinOct 15, 2018
  72. Taylor BlauOct 16, 2018
  73. Ævar Arnfjörð BjarmasonOct 16, 2018
  74. SZEDER GáborOct 16, 2018
  75. Junio C HamanoOct 25, 2018
  76. Johannes SchindelinOct 26, 2018
  77. Johannes SchindelinJan 16, 2019
  78. Junio C HamanoJan 17, 2019
  79. Johannes SchindelinJan 18, 2019
  80. 00/21 Offer to run CI/PR builds in Azure PipelinesJohannes Schindelin via GitGitGadget, Jan 16, 2019
  81. 01/21 travis: fix skipping tagged releasesJohannes Schindelin via GitGitGadget, Jan 16, 2019
  82. Junio C HamanoJan 17, 2019
  83. Johannes SchindelinJan 18, 2019
  84. 02/21 ci: rename the library of common functionsJohannes Schindelin via GitGitGadget, Jan 16, 2019
  85. 03/21 ci/lib.sh: encapsulate Travis-specific thingsJohannes Schindelin via GitGitGadget, Jan 16, 2019
  86. 04/21 ci: inherit --jobs via MAKEFLAGS in run-build-and-testsJohannes Schindelin via GitGitGadget, Jan 16, 2019
  87. 06/21 test-date: add a subcommand to measure times in shell scriptsJohannes Schindelin via GitGitGadget, Jan 16, 2019
  88. 10/21 ci: move the Windows job to the topJohannes Schindelin via GitGitGadget, Jan 16, 2019
  89. 09/21 Add a build definition for Azure DevOpsJohannes Schindelin via GitGitGadget, Jan 16, 2019
  90. 11/21 ci: use git-sdk-64-minimal build artifactJohannes Schindelin via GitGitGadget, Jan 16, 2019
  91. 13/21 README: add a build badge (status of the Azure Pipelines build)Johannes Schindelin via GitGitGadget, Jan 16, 2019
  92. 12/21 mingw: be more generous when wrapping up the setitimer() emulationJohannes Schindelin via GitGitGadget, Jan 16, 2019
  93. 19/21 tests: optionally skip bin-wrappers/Johannes Schindelin via GitGitGadget, Jan 16, 2019
  94. 17/21 tests: add t/helper/ to the PATH with --with-dashesJohannes Schindelin via GitGitGadget, Jan 16, 2019
  95. 20/21 ci: speed up Windows phaseJohannes Schindelin via GitGitGadget, Jan 16, 2019
  96. 21/21 ci: parallelize testing on WindowsJohannes Schindelin via GitGitGadget, Jan 16, 2019
  97. 18/21 t0061: fix with --with-dashes and RUNTIME_PREFIXJohannes Schindelin via GitGitGadget, Jan 16, 2019
  98. 07/21 tests: optionally write results as JUnit-style .xmlJohannes Schindelin via GitGitGadget, Jan 16, 2019
  99. 14/21 tests: avoid calling Perl just to determine file sizesJohannes Schindelin via GitGitGadget, Jan 16, 2019
  100. 15/21 tests: include detailed trace logs with --write-junit-xml upon failureJohannes Schindelin via GitGitGadget, Jan 16, 2019
  101. Johannes SchindelinJan 17, 2019
  102. 16/21 mingw: try to work around issues with the test cleanupJohannes Schindelin via GitGitGadget, Jan 16, 2019
  103. 08/21 ci/lib.sh: add support for Azure PipelinesJohannes Schindelin via GitGitGadget, Jan 16, 2019
  104. 05/21 ci: use a junction on Windows instead of a symlinkJohannes Schindelin via GitGitGadget, Jan 16, 2019
  105. 00/21 Offer to run CI/PR builds in Azure PipelinesJohannes Schindelin via GitGitGadget, Jan 23, 2019
  106. 02/21 ci: rename the library of common functionsJohannes Schindelin via GitGitGadget, Jan 23, 2019
  107. Junio C HamanoJan 23, 2019
  108. 03/21 ci/lib.sh: encapsulate Travis-specific thingsJohannes Schindelin via GitGitGadget, Jan 23, 2019
  109. Junio C HamanoJan 23, 2019
  110. Johannes SchindelinJan 26, 2019
  111. Junio C HamanoJan 27, 2019
  112. Johannes SchindelinJan 28, 2019
  113. Junio C HamanoJan 28, 2019
  114. Johannes SchindelinJan 29, 2019
  115. SZEDER GáborJan 25, 2019
  116. Johannes SchindelinJan 27, 2019
  117. 05/21 ci: use a junction on Windows instead of a symlinkJohannes Schindelin via GitGitGadget, Jan 23, 2019
  118. 04/21 ci: inherit --jobs via MAKEFLAGS in run-build-and-testsJohannes Schindelin via GitGitGadget, Jan 23, 2019
  119. Junio C HamanoJan 23, 2019
  120. SZEDER GáborJan 25, 2019
  121. Johannes SchindelinJan 28, 2019
  122. Johannes SchindelinJan 26, 2019
  123. 06/21 test-date: add a subcommand to measure times in shell scriptsJohannes Schindelin via GitGitGadget, Jan 23, 2019
  124. Junio C HamanoJan 23, 2019
  125. Johannes SchindelinJan 27, 2019
  126. Junio C HamanoJan 27, 2019
  127. Junio C HamanoJan 28, 2019
  128. 09/21 Add a build definition for Azure DevOpsJohannes Schindelin via GitGitGadget, Jan 23, 2019
  129. Junio C HamanoJan 23, 2019
  130. Johannes SchindelinJan 27, 2019
  131. 11/21 ci: use git-sdk-64-minimal build artifactJohannes Schindelin via GitGitGadget, Jan 23, 2019
  132. 14/21 tests: avoid calling Perl just to determine file sizesJohannes Schindelin via GitGitGadget, Jan 23, 2019
  133. 15/21 tests: include detailed trace logs with --write-junit-xml upon failureJohannes Schindelin via GitGitGadget, Jan 23, 2019
  134. 19/21 tests: optionally skip bin-wrappers/Johannes Schindelin via GitGitGadget, Jan 23, 2019
  135. 18/21 t0061: fix with --with-dashes and RUNTIME_PREFIXJohannes Schindelin via GitGitGadget, Jan 23, 2019
  136. Junio C HamanoJan 28, 2019
  137. Johannes SchindelinJan 28, 2019
  138. Junio C HamanoJan 28, 2019
  139. Johannes SchindelinJan 29, 2019
  140. 16/21 mingw: try to work around issues with the test cleanupJohannes Schindelin via GitGitGadget, Jan 23, 2019
  141. 17/21 tests: add t/helper/ to the PATH with --with-dashesJohannes Schindelin via GitGitGadget, Jan 23, 2019
  142. Junio C HamanoJan 23, 2019
  143. Johannes SchindelinJan 27, 2019
  144. 20/21 ci: speed up Windows phaseJohannes Schindelin via GitGitGadget, Jan 23, 2019
  145. Junio C HamanoJan 23, 2019
  146. 21/21 ci: parallelize testing on WindowsJohannes Schindelin via GitGitGadget, Jan 23, 2019
  147. 12/21 mingw: be more generous when wrapping up the setitimer() emulationJohannes Schindelin via GitGitGadget, Jan 23, 2019
  148. 07/21 tests: optionally write results as JUnit-style .xmlJohannes Schindelin via GitGitGadget, Jan 23, 2019
  149. 13/21 README: add a build badge (status of the Azure Pipelines build)Johannes Schindelin via GitGitGadget, Jan 23, 2019
  150. 10/21 ci: move the Windows job to the topJohannes Schindelin via GitGitGadget, Jan 23, 2019
  151. Junio C HamanoJan 23, 2019
  152. Johannes SchindelinJan 27, 2019
  153. Junio C HamanoJan 23, 2019
  154. Johannes SchindelinJan 27, 2019
  155. 08/21 ci/lib.sh: add support for Azure PipelinesJohannes Schindelin via GitGitGadget, Jan 23, 2019
  156. Junio C HamanoJan 23, 2019
  157. Johannes SchindelinJan 27, 2019
  158. 01/21 travis: fix skipping tagged releasesJohannes Schindelin via GitGitGadget, Jan 23, 2019
  159. Junio C HamanoJan 23, 2019
  160. Fast CI for all branches in gitster/git, was Re: [PATCH v4 00/21] Offer to run CI/PR builds in Azure PipelinesJohannes Schindelin, Jan 23, 2019
  161. Junio C HamanoJan 23, 2019
  162. 00/21 Offer to run CI/PR builds in Azure PipelinesJohannes Schindelin via GitGitGadget, Jan 27, 2019
  163. 01/21 travis: fix skipping tagged releasesJohannes Schindelin via GitGitGadget, Jan 27, 2019
  164. 02/21 ci: rename the library of common functionsJohannes Schindelin via GitGitGadget, Jan 27, 2019
  165. 03/21 ci/lib.sh: encapsulate Travis-specific thingsJohannes Schindelin via GitGitGadget, Jan 27, 2019
  166. 07/21 tests: optionally write results as JUnit-style .xmlJohannes Schindelin via GitGitGadget, Jan 27, 2019
  167. 04/21 ci: inherit --jobs via MAKEFLAGS in run-build-and-testsJohannes Schindelin via GitGitGadget, Jan 27, 2019
  168. 08/21 ci/lib.sh: add support for Azure PipelinesJohannes Schindelin via GitGitGadget, Jan 27, 2019
  169. 06/21 test-date: add a subcommand to measure times in shell scriptsJohannes Schindelin via GitGitGadget, Jan 27, 2019
  170. 05/21 ci: use a junction on Windows instead of a symlinkJohannes Schindelin via GitGitGadget, Jan 27, 2019
  171. 18/21 t0061: fix with --with-dashes and RUNTIME_PREFIXJohannes Schindelin via GitGitGadget, Jan 27, 2019
  172. 19/21 tests: optionally skip bin-wrappers/Johannes Schindelin via GitGitGadget, Jan 27, 2019
  173. 16/21 mingw: try to work around issues with the test cleanupJohannes Schindelin via GitGitGadget, Jan 27, 2019
  174. 15/21 tests: include detailed trace logs with --write-junit-xml upon failureJohannes Schindelin via GitGitGadget, Jan 27, 2019
  175. 14/21 tests: avoid calling Perl just to determine file sizesJohannes Schindelin via GitGitGadget, Jan 27, 2019
  176. 13/21 README: add a build badge (status of the Azure Pipelines build)Johannes Schindelin via GitGitGadget, Jan 27, 2019
  177. 12/21 mingw: be more generous when wrapping up the setitimer() emulationJohannes Schindelin via GitGitGadget, Jan 27, 2019
  178. 11/21 ci: use git-sdk-64-minimal build artifactJohannes Schindelin via GitGitGadget, Jan 27, 2019
  179. 09/21 Add a build definition for Azure DevOpsJohannes Schindelin via GitGitGadget, Jan 27, 2019
  180. 21/21 ci: parallelize testing on WindowsJohannes Schindelin via GitGitGadget, Jan 27, 2019
  181. 17/21 tests: add t/helper/ to the PATH with --with-dashesJohannes Schindelin via GitGitGadget, Jan 27, 2019
  182. 20/21 ci: speed up Windows phaseJohannes Schindelin via GitGitGadget, Jan 27, 2019
  183. 10/21 ci: add a Windows job to the Azure Pipelines definitionJohannes Schindelin via GitGitGadget, Jan 27, 2019
  184. 00/21 Offer to run CI/PR builds in Azure PipelinesJohannes Schindelin via GitGitGadget, Jan 29, 2019
  185. 02/21 ci: rename the library of common functionsJohannes Schindelin via GitGitGadget, Jan 29, 2019
  186. 01/21 travis: fix skipping tagged releasesJohannes Schindelin via GitGitGadget, Jan 29, 2019
  187. 04/21 ci: inherit --jobs via MAKEFLAGS in run-build-and-testsJohannes Schindelin via GitGitGadget, Jan 29, 2019
  188. 03/21 ci/lib.sh: encapsulate Travis-specific thingsJohannes Schindelin via GitGitGadget, Jan 29, 2019
  189. 06/21 test-date: add a subcommand to measure times in shell scriptsJohannes Schindelin via GitGitGadget, Jan 29, 2019
  190. 09/21 Add a build definition for Azure DevOpsJohannes Schindelin via GitGitGadget, Jan 29, 2019
  191. 12/21 mingw: be more generous when wrapping up the setitimer() emulationJohannes Schindelin via GitGitGadget, Jan 29, 2019
  192. 14/21 tests: avoid calling Perl just to determine file sizesJohannes Schindelin via GitGitGadget, Jan 29, 2019
  193. 15/21 tests: include detailed trace logs with --write-junit-xml upon failureJohannes Schindelin via GitGitGadget, Jan 29, 2019
  194. 16/21 mingw: try to work around issues with the test cleanupJohannes Schindelin via GitGitGadget, Jan 29, 2019
  195. Ævar Arnfjörð BjarmasonMar 10, 2021
  196. Johannes SchindelinMar 19, 2021
  197. Ævar Arnfjörð BjarmasonMar 20, 2021
  198. Junio C HamanoMar 20, 2021
  199. Johannes SchindelinMar 24, 2021
  200. SZEDER GáborMar 24, 2021
  201. Ævar Arnfjörð BjarmasonMar 24, 2021
  202. SZEDER GáborMar 26, 2021
  203. 20/21 ci: speed up Windows phaseJohannes Schindelin via GitGitGadget, Jan 29, 2019
  204. 17/21 tests: add t/helper/ to the PATH with --with-dashesJohannes Schindelin via GitGitGadget, Jan 29, 2019
  205. 19/21 tests: optionally skip bin-wrappers/Johannes Schindelin via GitGitGadget, Jan 29, 2019
  206. 21/21 ci: parallelize testing on WindowsJohannes Schindelin via GitGitGadget, Jan 29, 2019
  207. 18/21 t0061: workaround issues with --with-dashes and RUNTIME_PREFIXJohannes Schindelin via GitGitGadget, Jan 29, 2019
  208. 13/21 README: add a build badge (status of the Azure Pipelines build)Johannes Schindelin via GitGitGadget, Jan 29, 2019
  209. 11/21 ci: use git-sdk-64-minimal build artifactJohannes Schindelin via GitGitGadget, Jan 29, 2019
  210. 08/21 ci/lib.sh: add support for Azure PipelinesJohannes Schindelin via GitGitGadget, Jan 29, 2019
  211. 07/21 tests: optionally write results as JUnit-style .xmlJohannes Schindelin via GitGitGadget, Jan 29, 2019
  212. 10/21 ci: add a Windows job to the Azure Pipelines definitionJohannes Schindelin via GitGitGadget, Jan 29, 2019
  213. 05/21 ci: use a junction on Windows instead of a symlinkJohannes Schindelin via GitGitGadget, Jan 29, 2019
  214. Ævar Arnfjörð BjarmasonOct 15, 2018
  215. Duy NguyenOct 15, 2018
  216. Christian CouderOct 15, 2018
  217. Johannes SchindelinOct 15, 2018
  218. Christian CouderOct 16, 2018
  219. Junio C HamanoOct 16, 2018
  220. Ævar Arnfjörð BjarmasonOct 16, 2018
  221. Junio C HamanoOct 18, 2018
  222. Mirror of git.git on gitlab.comÆvar Arnfjörð Bjarmason, Oct 19, 2018
  223. Junio C HamanoOct 22, 2018
  224. Jeff KingOct 25, 2018
  225. Junio C HamanoOct 16, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.