aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.editorconfig2
-rw-r--r--.gitattributes2
-rw-r--r--.github/workflows/coverity.yml2
-rw-r--r--.github/workflows/main.yml128
-rw-r--r--.gitignore3
-rw-r--r--.gitlab-ci.yml67
-rw-r--r--Documentation/.gitignore8
-rw-r--r--Documentation/BreakingChanges.adoc (renamed from Documentation/BreakingChanges.txt)25
-rw-r--r--Documentation/DecisionMaking.adoc (renamed from Documentation/DecisionMaking.txt)0
-rw-r--r--Documentation/Makefile205
-rw-r--r--Documentation/MyFirstContribution.adoc (renamed from Documentation/MyFirstContribution.txt)0
-rw-r--r--Documentation/MyFirstObjectWalk.adoc (renamed from Documentation/MyFirstObjectWalk.txt)0
-rw-r--r--Documentation/RelNotes/1.5.0.1.adoc (renamed from Documentation/RelNotes/1.5.0.1.txt)0
-rw-r--r--Documentation/RelNotes/1.5.0.2.adoc (renamed from Documentation/RelNotes/1.5.0.2.txt)0
-rw-r--r--Documentation/RelNotes/1.5.0.3.adoc (renamed from Documentation/RelNotes/1.5.0.3.txt)0
-rw-r--r--Documentation/RelNotes/1.5.0.4.adoc (renamed from Documentation/RelNotes/1.5.0.4.txt)0
-rw-r--r--Documentation/RelNotes/1.5.0.5.adoc (renamed from Documentation/RelNotes/1.5.0.5.txt)0
-rw-r--r--Documentation/RelNotes/1.5.0.6.adoc (renamed from Documentation/RelNotes/1.5.0.6.txt)0
-rw-r--r--Documentation/RelNotes/1.5.0.7.adoc (renamed from Documentation/RelNotes/1.5.0.7.txt)0
-rw-r--r--Documentation/RelNotes/1.5.0.adoc (renamed from Documentation/RelNotes/1.5.0.txt)0
-rw-r--r--Documentation/RelNotes/1.5.1.1.adoc (renamed from Documentation/RelNotes/1.5.1.1.txt)0
-rw-r--r--Documentation/RelNotes/1.5.1.2.adoc (renamed from Documentation/RelNotes/1.5.1.2.txt)0
-rw-r--r--Documentation/RelNotes/1.5.1.3.adoc (renamed from Documentation/RelNotes/1.5.1.3.txt)0
-rw-r--r--Documentation/RelNotes/1.5.1.4.adoc (renamed from Documentation/RelNotes/1.5.1.4.txt)0
-rw-r--r--Documentation/RelNotes/1.5.1.5.adoc (renamed from Documentation/RelNotes/1.5.1.5.txt)0
-rw-r--r--Documentation/RelNotes/1.5.1.6.adoc (renamed from Documentation/RelNotes/1.5.1.6.txt)0
-rw-r--r--Documentation/RelNotes/1.5.1.adoc (renamed from Documentation/RelNotes/1.5.1.txt)0
-rw-r--r--Documentation/RelNotes/1.5.2.1.adoc (renamed from Documentation/RelNotes/1.5.2.1.txt)0
-rw-r--r--Documentation/RelNotes/1.5.2.2.adoc (renamed from Documentation/RelNotes/1.5.2.2.txt)0
-rw-r--r--Documentation/RelNotes/1.5.2.3.adoc (renamed from Documentation/RelNotes/1.5.2.3.txt)0
-rw-r--r--Documentation/RelNotes/1.5.2.4.adoc (renamed from Documentation/RelNotes/1.5.2.4.txt)0
-rw-r--r--Documentation/RelNotes/1.5.2.5.adoc (renamed from Documentation/RelNotes/1.5.2.5.txt)0
-rw-r--r--Documentation/RelNotes/1.5.2.adoc (renamed from Documentation/RelNotes/1.5.2.txt)0
-rw-r--r--Documentation/RelNotes/1.5.3.1.adoc (renamed from Documentation/RelNotes/1.5.3.1.txt)0
-rw-r--r--Documentation/RelNotes/1.5.3.2.adoc (renamed from Documentation/RelNotes/1.5.3.2.txt)0
-rw-r--r--Documentation/RelNotes/1.5.3.3.adoc (renamed from Documentation/RelNotes/1.5.3.3.txt)0
-rw-r--r--Documentation/RelNotes/1.5.3.4.adoc (renamed from Documentation/RelNotes/1.5.3.4.txt)0
-rw-r--r--Documentation/RelNotes/1.5.3.5.adoc (renamed from Documentation/RelNotes/1.5.3.5.txt)0
-rw-r--r--Documentation/RelNotes/1.5.3.6.adoc (renamed from Documentation/RelNotes/1.5.3.6.txt)0
-rw-r--r--Documentation/RelNotes/1.5.3.7.adoc (renamed from Documentation/RelNotes/1.5.3.7.txt)0
-rw-r--r--Documentation/RelNotes/1.5.3.8.adoc (renamed from Documentation/RelNotes/1.5.3.8.txt)0
-rw-r--r--Documentation/RelNotes/1.5.3.adoc (renamed from Documentation/RelNotes/1.5.3.txt)0
-rw-r--r--Documentation/RelNotes/1.5.4.1.adoc (renamed from Documentation/RelNotes/1.5.4.1.txt)0
-rw-r--r--Documentation/RelNotes/1.5.4.2.adoc (renamed from Documentation/RelNotes/1.5.4.2.txt)0
-rw-r--r--Documentation/RelNotes/1.5.4.3.adoc (renamed from Documentation/RelNotes/1.5.4.3.txt)0
-rw-r--r--Documentation/RelNotes/1.5.4.4.adoc (renamed from Documentation/RelNotes/1.5.4.4.txt)0
-rw-r--r--Documentation/RelNotes/1.5.4.5.adoc (renamed from Documentation/RelNotes/1.5.4.5.txt)0
-rw-r--r--Documentation/RelNotes/1.5.4.6.adoc (renamed from Documentation/RelNotes/1.5.4.6.txt)0
-rw-r--r--Documentation/RelNotes/1.5.4.7.adoc (renamed from Documentation/RelNotes/1.5.4.7.txt)0
-rw-r--r--Documentation/RelNotes/1.5.4.adoc (renamed from Documentation/RelNotes/1.5.4.txt)0
-rw-r--r--Documentation/RelNotes/1.5.5.1.adoc (renamed from Documentation/RelNotes/1.5.5.1.txt)0
-rw-r--r--Documentation/RelNotes/1.5.5.2.adoc (renamed from Documentation/RelNotes/1.5.5.2.txt)0
-rw-r--r--Documentation/RelNotes/1.5.5.3.adoc (renamed from Documentation/RelNotes/1.5.5.3.txt)0
-rw-r--r--Documentation/RelNotes/1.5.5.4.adoc (renamed from Documentation/RelNotes/1.5.5.4.txt)0
-rw-r--r--Documentation/RelNotes/1.5.5.5.adoc (renamed from Documentation/RelNotes/1.5.5.5.txt)0
-rw-r--r--Documentation/RelNotes/1.5.5.6.adoc (renamed from Documentation/RelNotes/1.5.5.6.txt)0
-rw-r--r--Documentation/RelNotes/1.5.5.adoc (renamed from Documentation/RelNotes/1.5.5.txt)0
-rw-r--r--Documentation/RelNotes/1.5.6.1.adoc (renamed from Documentation/RelNotes/1.5.6.1.txt)0
-rw-r--r--Documentation/RelNotes/1.5.6.2.adoc (renamed from Documentation/RelNotes/1.5.6.2.txt)0
-rw-r--r--Documentation/RelNotes/1.5.6.3.adoc (renamed from Documentation/RelNotes/1.5.6.3.txt)0
-rw-r--r--Documentation/RelNotes/1.5.6.4.adoc (renamed from Documentation/RelNotes/1.5.6.4.txt)0
-rw-r--r--Documentation/RelNotes/1.5.6.5.adoc (renamed from Documentation/RelNotes/1.5.6.5.txt)0
-rw-r--r--Documentation/RelNotes/1.5.6.6.adoc (renamed from Documentation/RelNotes/1.5.6.6.txt)0
-rw-r--r--Documentation/RelNotes/1.5.6.adoc (renamed from Documentation/RelNotes/1.5.6.txt)0
-rw-r--r--Documentation/RelNotes/1.6.0.1.adoc (renamed from Documentation/RelNotes/1.6.0.1.txt)0
-rw-r--r--Documentation/RelNotes/1.6.0.2.adoc (renamed from Documentation/RelNotes/1.6.0.2.txt)0
-rw-r--r--Documentation/RelNotes/1.6.0.3.adoc (renamed from Documentation/RelNotes/1.6.0.3.txt)0
-rw-r--r--Documentation/RelNotes/1.6.0.4.adoc (renamed from Documentation/RelNotes/1.6.0.4.txt)0
-rw-r--r--Documentation/RelNotes/1.6.0.5.adoc (renamed from Documentation/RelNotes/1.6.0.5.txt)0
-rw-r--r--Documentation/RelNotes/1.6.0.6.adoc (renamed from Documentation/RelNotes/1.6.0.6.txt)0
-rw-r--r--Documentation/RelNotes/1.6.0.adoc (renamed from Documentation/RelNotes/1.6.0.txt)0
-rw-r--r--Documentation/RelNotes/1.6.1.1.adoc (renamed from Documentation/RelNotes/1.6.1.1.txt)0
-rw-r--r--Documentation/RelNotes/1.6.1.2.adoc (renamed from Documentation/RelNotes/1.6.1.2.txt)0
-rw-r--r--Documentation/RelNotes/1.6.1.3.adoc (renamed from Documentation/RelNotes/1.6.1.3.txt)0
-rw-r--r--Documentation/RelNotes/1.6.1.4.adoc (renamed from Documentation/RelNotes/1.6.1.4.txt)0
-rw-r--r--Documentation/RelNotes/1.6.1.adoc (renamed from Documentation/RelNotes/1.6.1.txt)0
-rw-r--r--Documentation/RelNotes/1.6.2.1.adoc (renamed from Documentation/RelNotes/1.6.2.1.txt)0
-rw-r--r--Documentation/RelNotes/1.6.2.2.adoc (renamed from Documentation/RelNotes/1.6.2.2.txt)0
-rw-r--r--Documentation/RelNotes/1.6.2.3.adoc (renamed from Documentation/RelNotes/1.6.2.3.txt)0
-rw-r--r--Documentation/RelNotes/1.6.2.4.adoc (renamed from Documentation/RelNotes/1.6.2.4.txt)0
-rw-r--r--Documentation/RelNotes/1.6.2.5.adoc (renamed from Documentation/RelNotes/1.6.2.5.txt)0
-rw-r--r--Documentation/RelNotes/1.6.2.adoc (renamed from Documentation/RelNotes/1.6.2.txt)0
-rw-r--r--Documentation/RelNotes/1.6.3.1.adoc (renamed from Documentation/RelNotes/1.6.3.1.txt)0
-rw-r--r--Documentation/RelNotes/1.6.3.2.adoc (renamed from Documentation/RelNotes/1.6.3.2.txt)0
-rw-r--r--Documentation/RelNotes/1.6.3.3.adoc (renamed from Documentation/RelNotes/1.6.3.3.txt)0
-rw-r--r--Documentation/RelNotes/1.6.3.4.adoc (renamed from Documentation/RelNotes/1.6.3.4.txt)0
-rw-r--r--Documentation/RelNotes/1.6.3.adoc (renamed from Documentation/RelNotes/1.6.3.txt)0
-rw-r--r--Documentation/RelNotes/1.6.4.1.adoc (renamed from Documentation/RelNotes/1.6.4.1.txt)0
-rw-r--r--Documentation/RelNotes/1.6.4.2.adoc (renamed from Documentation/RelNotes/1.6.4.2.txt)0
-rw-r--r--Documentation/RelNotes/1.6.4.3.adoc (renamed from Documentation/RelNotes/1.6.4.3.txt)0
-rw-r--r--Documentation/RelNotes/1.6.4.4.adoc (renamed from Documentation/RelNotes/1.6.4.4.txt)0
-rw-r--r--Documentation/RelNotes/1.6.4.5.adoc (renamed from Documentation/RelNotes/1.6.4.5.txt)0
-rw-r--r--Documentation/RelNotes/1.6.4.adoc (renamed from Documentation/RelNotes/1.6.4.txt)0
-rw-r--r--Documentation/RelNotes/1.6.5.1.adoc (renamed from Documentation/RelNotes/1.6.5.1.txt)0
-rw-r--r--Documentation/RelNotes/1.6.5.2.adoc (renamed from Documentation/RelNotes/1.6.5.2.txt)0
-rw-r--r--Documentation/RelNotes/1.6.5.3.adoc (renamed from Documentation/RelNotes/1.6.5.3.txt)0
-rw-r--r--Documentation/RelNotes/1.6.5.4.adoc (renamed from Documentation/RelNotes/1.6.5.4.txt)0
-rw-r--r--Documentation/RelNotes/1.6.5.5.adoc (renamed from Documentation/RelNotes/1.6.5.5.txt)0
-rw-r--r--Documentation/RelNotes/1.6.5.6.adoc (renamed from Documentation/RelNotes/1.6.5.6.txt)0
-rw-r--r--Documentation/RelNotes/1.6.5.7.adoc (renamed from Documentation/RelNotes/1.6.5.7.txt)0
-rw-r--r--Documentation/RelNotes/1.6.5.8.adoc (renamed from Documentation/RelNotes/1.6.5.8.txt)0
-rw-r--r--Documentation/RelNotes/1.6.5.9.adoc (renamed from Documentation/RelNotes/1.6.5.9.txt)0
-rw-r--r--Documentation/RelNotes/1.6.5.adoc (renamed from Documentation/RelNotes/1.6.5.txt)0
-rw-r--r--Documentation/RelNotes/1.6.6.1.adoc (renamed from Documentation/RelNotes/1.6.6.1.txt)0
-rw-r--r--Documentation/RelNotes/1.6.6.2.adoc (renamed from Documentation/RelNotes/1.6.6.2.txt)0
-rw-r--r--Documentation/RelNotes/1.6.6.3.adoc (renamed from Documentation/RelNotes/1.6.6.3.txt)0
-rw-r--r--Documentation/RelNotes/1.6.6.adoc (renamed from Documentation/RelNotes/1.6.6.txt)0
-rw-r--r--Documentation/RelNotes/1.7.0.1.adoc (renamed from Documentation/RelNotes/1.7.0.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.0.2.adoc (renamed from Documentation/RelNotes/1.7.0.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.0.3.adoc (renamed from Documentation/RelNotes/1.7.0.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.0.4.adoc (renamed from Documentation/RelNotes/1.7.0.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.0.5.adoc (renamed from Documentation/RelNotes/1.7.0.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.0.6.adoc (renamed from Documentation/RelNotes/1.7.0.6.txt)0
-rw-r--r--Documentation/RelNotes/1.7.0.7.adoc (renamed from Documentation/RelNotes/1.7.0.7.txt)0
-rw-r--r--Documentation/RelNotes/1.7.0.8.adoc (renamed from Documentation/RelNotes/1.7.0.8.txt)0
-rw-r--r--Documentation/RelNotes/1.7.0.9.adoc (renamed from Documentation/RelNotes/1.7.0.9.txt)0
-rw-r--r--Documentation/RelNotes/1.7.0.adoc (renamed from Documentation/RelNotes/1.7.0.txt)0
-rw-r--r--Documentation/RelNotes/1.7.1.1.adoc (renamed from Documentation/RelNotes/1.7.1.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.1.2.adoc (renamed from Documentation/RelNotes/1.7.1.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.1.3.adoc (renamed from Documentation/RelNotes/1.7.1.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.1.4.adoc (renamed from Documentation/RelNotes/1.7.1.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.1.adoc (renamed from Documentation/RelNotes/1.7.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.10.1.adoc (renamed from Documentation/RelNotes/1.7.10.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.10.2.adoc (renamed from Documentation/RelNotes/1.7.10.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.10.3.adoc (renamed from Documentation/RelNotes/1.7.10.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.10.4.adoc (renamed from Documentation/RelNotes/1.7.10.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.10.5.adoc (renamed from Documentation/RelNotes/1.7.10.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.10.adoc (renamed from Documentation/RelNotes/1.7.10.txt)0
-rw-r--r--Documentation/RelNotes/1.7.11.1.adoc (renamed from Documentation/RelNotes/1.7.11.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.11.2.adoc (renamed from Documentation/RelNotes/1.7.11.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.11.3.adoc (renamed from Documentation/RelNotes/1.7.11.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.11.4.adoc (renamed from Documentation/RelNotes/1.7.11.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.11.5.adoc (renamed from Documentation/RelNotes/1.7.11.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.11.6.adoc (renamed from Documentation/RelNotes/1.7.11.6.txt)0
-rw-r--r--Documentation/RelNotes/1.7.11.7.adoc (renamed from Documentation/RelNotes/1.7.11.7.txt)0
-rw-r--r--Documentation/RelNotes/1.7.11.adoc (renamed from Documentation/RelNotes/1.7.11.txt)0
-rw-r--r--Documentation/RelNotes/1.7.12.1.adoc (renamed from Documentation/RelNotes/1.7.12.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.12.2.adoc (renamed from Documentation/RelNotes/1.7.12.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.12.3.adoc (renamed from Documentation/RelNotes/1.7.12.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.12.4.adoc (renamed from Documentation/RelNotes/1.7.12.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.12.adoc (renamed from Documentation/RelNotes/1.7.12.txt)0
-rw-r--r--Documentation/RelNotes/1.7.2.1.adoc (renamed from Documentation/RelNotes/1.7.2.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.2.2.adoc (renamed from Documentation/RelNotes/1.7.2.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.2.3.adoc (renamed from Documentation/RelNotes/1.7.2.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.2.4.adoc (renamed from Documentation/RelNotes/1.7.2.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.2.5.adoc (renamed from Documentation/RelNotes/1.7.2.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.2.adoc (renamed from Documentation/RelNotes/1.7.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.3.1.adoc (renamed from Documentation/RelNotes/1.7.3.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.3.2.adoc (renamed from Documentation/RelNotes/1.7.3.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.3.3.adoc (renamed from Documentation/RelNotes/1.7.3.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.3.4.adoc (renamed from Documentation/RelNotes/1.7.3.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.3.5.adoc (renamed from Documentation/RelNotes/1.7.3.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.3.adoc (renamed from Documentation/RelNotes/1.7.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.4.1.adoc (renamed from Documentation/RelNotes/1.7.4.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.4.2.adoc (renamed from Documentation/RelNotes/1.7.4.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.4.3.adoc (renamed from Documentation/RelNotes/1.7.4.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.4.4.adoc (renamed from Documentation/RelNotes/1.7.4.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.4.5.adoc (renamed from Documentation/RelNotes/1.7.4.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.4.adoc (renamed from Documentation/RelNotes/1.7.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.5.1.adoc (renamed from Documentation/RelNotes/1.7.5.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.5.2.adoc (renamed from Documentation/RelNotes/1.7.5.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.5.3.adoc (renamed from Documentation/RelNotes/1.7.5.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.5.4.adoc (renamed from Documentation/RelNotes/1.7.5.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.5.adoc (renamed from Documentation/RelNotes/1.7.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.6.1.adoc (renamed from Documentation/RelNotes/1.7.6.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.6.2.adoc (renamed from Documentation/RelNotes/1.7.6.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.6.3.adoc (renamed from Documentation/RelNotes/1.7.6.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.6.4.adoc (renamed from Documentation/RelNotes/1.7.6.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.6.5.adoc (renamed from Documentation/RelNotes/1.7.6.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.6.6.adoc (renamed from Documentation/RelNotes/1.7.6.6.txt)0
-rw-r--r--Documentation/RelNotes/1.7.6.adoc (renamed from Documentation/RelNotes/1.7.6.txt)0
-rw-r--r--Documentation/RelNotes/1.7.7.1.adoc (renamed from Documentation/RelNotes/1.7.7.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.7.2.adoc (renamed from Documentation/RelNotes/1.7.7.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.7.3.adoc (renamed from Documentation/RelNotes/1.7.7.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.7.4.adoc (renamed from Documentation/RelNotes/1.7.7.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.7.5.adoc (renamed from Documentation/RelNotes/1.7.7.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.7.6.adoc (renamed from Documentation/RelNotes/1.7.7.6.txt)0
-rw-r--r--Documentation/RelNotes/1.7.7.7.adoc (renamed from Documentation/RelNotes/1.7.7.7.txt)0
-rw-r--r--Documentation/RelNotes/1.7.7.adoc (renamed from Documentation/RelNotes/1.7.7.txt)0
-rw-r--r--Documentation/RelNotes/1.7.8.1.adoc (renamed from Documentation/RelNotes/1.7.8.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.8.2.adoc (renamed from Documentation/RelNotes/1.7.8.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.8.3.adoc (renamed from Documentation/RelNotes/1.7.8.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.8.4.adoc (renamed from Documentation/RelNotes/1.7.8.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.8.5.adoc (renamed from Documentation/RelNotes/1.7.8.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.8.6.adoc (renamed from Documentation/RelNotes/1.7.8.6.txt)0
-rw-r--r--Documentation/RelNotes/1.7.8.adoc (renamed from Documentation/RelNotes/1.7.8.txt)0
-rw-r--r--Documentation/RelNotes/1.7.9.1.adoc (renamed from Documentation/RelNotes/1.7.9.1.txt)0
-rw-r--r--Documentation/RelNotes/1.7.9.2.adoc (renamed from Documentation/RelNotes/1.7.9.2.txt)0
-rw-r--r--Documentation/RelNotes/1.7.9.3.adoc (renamed from Documentation/RelNotes/1.7.9.3.txt)0
-rw-r--r--Documentation/RelNotes/1.7.9.4.adoc (renamed from Documentation/RelNotes/1.7.9.4.txt)0
-rw-r--r--Documentation/RelNotes/1.7.9.5.adoc (renamed from Documentation/RelNotes/1.7.9.5.txt)0
-rw-r--r--Documentation/RelNotes/1.7.9.6.adoc (renamed from Documentation/RelNotes/1.7.9.6.txt)0
-rw-r--r--Documentation/RelNotes/1.7.9.7.adoc (renamed from Documentation/RelNotes/1.7.9.7.txt)0
-rw-r--r--Documentation/RelNotes/1.7.9.adoc (renamed from Documentation/RelNotes/1.7.9.txt)0
-rw-r--r--Documentation/RelNotes/1.8.0.1.adoc (renamed from Documentation/RelNotes/1.8.0.1.txt)0
-rw-r--r--Documentation/RelNotes/1.8.0.2.adoc (renamed from Documentation/RelNotes/1.8.0.2.txt)0
-rw-r--r--Documentation/RelNotes/1.8.0.3.adoc (renamed from Documentation/RelNotes/1.8.0.3.txt)0
-rw-r--r--Documentation/RelNotes/1.8.0.adoc (renamed from Documentation/RelNotes/1.8.0.txt)0
-rw-r--r--Documentation/RelNotes/1.8.1.1.adoc (renamed from Documentation/RelNotes/1.8.1.1.txt)0
-rw-r--r--Documentation/RelNotes/1.8.1.2.adoc (renamed from Documentation/RelNotes/1.8.1.2.txt)0
-rw-r--r--Documentation/RelNotes/1.8.1.3.adoc (renamed from Documentation/RelNotes/1.8.1.3.txt)0
-rw-r--r--Documentation/RelNotes/1.8.1.4.adoc (renamed from Documentation/RelNotes/1.8.1.4.txt)0
-rw-r--r--Documentation/RelNotes/1.8.1.5.adoc (renamed from Documentation/RelNotes/1.8.1.5.txt)0
-rw-r--r--Documentation/RelNotes/1.8.1.6.adoc (renamed from Documentation/RelNotes/1.8.1.6.txt)0
-rw-r--r--Documentation/RelNotes/1.8.1.adoc (renamed from Documentation/RelNotes/1.8.1.txt)0
-rw-r--r--Documentation/RelNotes/1.8.2.1.adoc (renamed from Documentation/RelNotes/1.8.2.1.txt)0
-rw-r--r--Documentation/RelNotes/1.8.2.2.adoc (renamed from Documentation/RelNotes/1.8.2.2.txt)0
-rw-r--r--Documentation/RelNotes/1.8.2.3.adoc (renamed from Documentation/RelNotes/1.8.2.3.txt)0
-rw-r--r--Documentation/RelNotes/1.8.2.adoc (renamed from Documentation/RelNotes/1.8.2.txt)0
-rw-r--r--Documentation/RelNotes/1.8.3.1.adoc (renamed from Documentation/RelNotes/1.8.3.1.txt)0
-rw-r--r--Documentation/RelNotes/1.8.3.2.adoc (renamed from Documentation/RelNotes/1.8.3.2.txt)0
-rw-r--r--Documentation/RelNotes/1.8.3.3.adoc (renamed from Documentation/RelNotes/1.8.3.3.txt)0
-rw-r--r--Documentation/RelNotes/1.8.3.4.adoc (renamed from Documentation/RelNotes/1.8.3.4.txt)0
-rw-r--r--Documentation/RelNotes/1.8.3.adoc (renamed from Documentation/RelNotes/1.8.3.txt)0
-rw-r--r--Documentation/RelNotes/1.8.4.1.adoc (renamed from Documentation/RelNotes/1.8.4.1.txt)0
-rw-r--r--Documentation/RelNotes/1.8.4.2.adoc (renamed from Documentation/RelNotes/1.8.4.2.txt)0
-rw-r--r--Documentation/RelNotes/1.8.4.3.adoc (renamed from Documentation/RelNotes/1.8.4.3.txt)0
-rw-r--r--Documentation/RelNotes/1.8.4.4.adoc (renamed from Documentation/RelNotes/1.8.4.4.txt)0
-rw-r--r--Documentation/RelNotes/1.8.4.5.adoc (renamed from Documentation/RelNotes/1.8.4.5.txt)0
-rw-r--r--Documentation/RelNotes/1.8.4.adoc (renamed from Documentation/RelNotes/1.8.4.txt)0
-rw-r--r--Documentation/RelNotes/1.8.5.1.adoc (renamed from Documentation/RelNotes/1.8.5.1.txt)0
-rw-r--r--Documentation/RelNotes/1.8.5.2.adoc (renamed from Documentation/RelNotes/1.8.5.2.txt)0
-rw-r--r--Documentation/RelNotes/1.8.5.3.adoc (renamed from Documentation/RelNotes/1.8.5.3.txt)0
-rw-r--r--Documentation/RelNotes/1.8.5.4.adoc (renamed from Documentation/RelNotes/1.8.5.4.txt)0
-rw-r--r--Documentation/RelNotes/1.8.5.5.adoc (renamed from Documentation/RelNotes/1.8.5.5.txt)0
-rw-r--r--Documentation/RelNotes/1.8.5.6.adoc (renamed from Documentation/RelNotes/1.8.5.6.txt)0
-rw-r--r--Documentation/RelNotes/1.8.5.adoc (renamed from Documentation/RelNotes/1.8.5.txt)0
-rw-r--r--Documentation/RelNotes/1.9.0.adoc (renamed from Documentation/RelNotes/1.9.0.txt)0
-rw-r--r--Documentation/RelNotes/1.9.1.adoc (renamed from Documentation/RelNotes/1.9.1.txt)0
-rw-r--r--Documentation/RelNotes/1.9.2.adoc (renamed from Documentation/RelNotes/1.9.2.txt)0
-rw-r--r--Documentation/RelNotes/1.9.3.adoc (renamed from Documentation/RelNotes/1.9.3.txt)0
-rw-r--r--Documentation/RelNotes/1.9.4.adoc (renamed from Documentation/RelNotes/1.9.4.txt)0
-rw-r--r--Documentation/RelNotes/1.9.5.adoc (renamed from Documentation/RelNotes/1.9.5.txt)0
-rw-r--r--Documentation/RelNotes/2.0.0.adoc (renamed from Documentation/RelNotes/2.0.0.txt)0
-rw-r--r--Documentation/RelNotes/2.0.1.adoc (renamed from Documentation/RelNotes/2.0.1.txt)0
-rw-r--r--Documentation/RelNotes/2.0.2.adoc (renamed from Documentation/RelNotes/2.0.2.txt)0
-rw-r--r--Documentation/RelNotes/2.0.3.adoc (renamed from Documentation/RelNotes/2.0.3.txt)0
-rw-r--r--Documentation/RelNotes/2.0.4.adoc (renamed from Documentation/RelNotes/2.0.4.txt)0
-rw-r--r--Documentation/RelNotes/2.0.5.adoc (renamed from Documentation/RelNotes/2.0.5.txt)0
-rw-r--r--Documentation/RelNotes/2.1.0.adoc (renamed from Documentation/RelNotes/2.1.0.txt)0
-rw-r--r--Documentation/RelNotes/2.1.1.adoc (renamed from Documentation/RelNotes/2.1.1.txt)0
-rw-r--r--Documentation/RelNotes/2.1.2.adoc (renamed from Documentation/RelNotes/2.1.2.txt)0
-rw-r--r--Documentation/RelNotes/2.1.3.adoc (renamed from Documentation/RelNotes/2.1.3.txt)0
-rw-r--r--Documentation/RelNotes/2.1.4.adoc (renamed from Documentation/RelNotes/2.1.4.txt)0
-rw-r--r--Documentation/RelNotes/2.10.0.adoc (renamed from Documentation/RelNotes/2.10.0.txt)0
-rw-r--r--Documentation/RelNotes/2.10.1.adoc (renamed from Documentation/RelNotes/2.10.1.txt)0
-rw-r--r--Documentation/RelNotes/2.10.2.adoc (renamed from Documentation/RelNotes/2.10.2.txt)0
-rw-r--r--Documentation/RelNotes/2.10.3.adoc (renamed from Documentation/RelNotes/2.10.3.txt)0
-rw-r--r--Documentation/RelNotes/2.10.4.adoc (renamed from Documentation/RelNotes/2.10.4.txt)0
-rw-r--r--Documentation/RelNotes/2.10.5.adoc (renamed from Documentation/RelNotes/2.10.5.txt)0
-rw-r--r--Documentation/RelNotes/2.11.0.adoc (renamed from Documentation/RelNotes/2.11.0.txt)0
-rw-r--r--Documentation/RelNotes/2.11.1.adoc (renamed from Documentation/RelNotes/2.11.1.txt)0
-rw-r--r--Documentation/RelNotes/2.11.2.adoc (renamed from Documentation/RelNotes/2.11.2.txt)0
-rw-r--r--Documentation/RelNotes/2.11.3.adoc (renamed from Documentation/RelNotes/2.11.3.txt)0
-rw-r--r--Documentation/RelNotes/2.11.4.adoc (renamed from Documentation/RelNotes/2.11.4.txt)0
-rw-r--r--Documentation/RelNotes/2.12.0.adoc (renamed from Documentation/RelNotes/2.12.0.txt)0
-rw-r--r--Documentation/RelNotes/2.12.1.adoc (renamed from Documentation/RelNotes/2.12.1.txt)0
-rw-r--r--Documentation/RelNotes/2.12.2.adoc (renamed from Documentation/RelNotes/2.12.2.txt)0
-rw-r--r--Documentation/RelNotes/2.12.3.adoc (renamed from Documentation/RelNotes/2.12.3.txt)0
-rw-r--r--Documentation/RelNotes/2.12.4.adoc (renamed from Documentation/RelNotes/2.12.4.txt)0
-rw-r--r--Documentation/RelNotes/2.12.5.adoc (renamed from Documentation/RelNotes/2.12.5.txt)0
-rw-r--r--Documentation/RelNotes/2.13.0.adoc (renamed from Documentation/RelNotes/2.13.0.txt)0
-rw-r--r--Documentation/RelNotes/2.13.1.adoc (renamed from Documentation/RelNotes/2.13.1.txt)0
-rw-r--r--Documentation/RelNotes/2.13.2.adoc (renamed from Documentation/RelNotes/2.13.2.txt)0
-rw-r--r--Documentation/RelNotes/2.13.3.adoc (renamed from Documentation/RelNotes/2.13.3.txt)0
-rw-r--r--Documentation/RelNotes/2.13.4.adoc (renamed from Documentation/RelNotes/2.13.4.txt)0
-rw-r--r--Documentation/RelNotes/2.13.5.adoc (renamed from Documentation/RelNotes/2.13.5.txt)0
-rw-r--r--Documentation/RelNotes/2.13.6.adoc (renamed from Documentation/RelNotes/2.13.6.txt)0
-rw-r--r--Documentation/RelNotes/2.13.7.adoc (renamed from Documentation/RelNotes/2.13.7.txt)0
-rw-r--r--Documentation/RelNotes/2.14.0.adoc (renamed from Documentation/RelNotes/2.14.0.txt)0
-rw-r--r--Documentation/RelNotes/2.14.1.adoc (renamed from Documentation/RelNotes/2.14.1.txt)0
-rw-r--r--Documentation/RelNotes/2.14.2.adoc (renamed from Documentation/RelNotes/2.14.2.txt)0
-rw-r--r--Documentation/RelNotes/2.14.3.adoc (renamed from Documentation/RelNotes/2.14.3.txt)0
-rw-r--r--Documentation/RelNotes/2.14.4.adoc (renamed from Documentation/RelNotes/2.14.4.txt)0
-rw-r--r--Documentation/RelNotes/2.14.5.adoc (renamed from Documentation/RelNotes/2.14.5.txt)0
-rw-r--r--Documentation/RelNotes/2.14.6.adoc (renamed from Documentation/RelNotes/2.14.6.txt)0
-rw-r--r--Documentation/RelNotes/2.15.0.adoc (renamed from Documentation/RelNotes/2.15.0.txt)0
-rw-r--r--Documentation/RelNotes/2.15.1.adoc (renamed from Documentation/RelNotes/2.15.1.txt)0
-rw-r--r--Documentation/RelNotes/2.15.2.adoc (renamed from Documentation/RelNotes/2.15.2.txt)0
-rw-r--r--Documentation/RelNotes/2.15.3.adoc (renamed from Documentation/RelNotes/2.15.3.txt)0
-rw-r--r--Documentation/RelNotes/2.15.4.adoc (renamed from Documentation/RelNotes/2.15.4.txt)0
-rw-r--r--Documentation/RelNotes/2.16.0.adoc (renamed from Documentation/RelNotes/2.16.0.txt)0
-rw-r--r--Documentation/RelNotes/2.16.1.adoc (renamed from Documentation/RelNotes/2.16.1.txt)0
-rw-r--r--Documentation/RelNotes/2.16.2.adoc (renamed from Documentation/RelNotes/2.16.2.txt)0
-rw-r--r--Documentation/RelNotes/2.16.3.adoc (renamed from Documentation/RelNotes/2.16.3.txt)0
-rw-r--r--Documentation/RelNotes/2.16.4.adoc (renamed from Documentation/RelNotes/2.16.4.txt)0
-rw-r--r--Documentation/RelNotes/2.16.5.adoc (renamed from Documentation/RelNotes/2.16.5.txt)0
-rw-r--r--Documentation/RelNotes/2.16.6.adoc (renamed from Documentation/RelNotes/2.16.6.txt)0
-rw-r--r--Documentation/RelNotes/2.17.0.adoc (renamed from Documentation/RelNotes/2.17.0.txt)0
-rw-r--r--Documentation/RelNotes/2.17.1.adoc (renamed from Documentation/RelNotes/2.17.1.txt)0
-rw-r--r--Documentation/RelNotes/2.17.2.adoc (renamed from Documentation/RelNotes/2.17.2.txt)0
-rw-r--r--Documentation/RelNotes/2.17.3.adoc (renamed from Documentation/RelNotes/2.17.3.txt)0
-rw-r--r--Documentation/RelNotes/2.17.4.adoc (renamed from Documentation/RelNotes/2.17.4.txt)0
-rw-r--r--Documentation/RelNotes/2.17.5.adoc (renamed from Documentation/RelNotes/2.17.5.txt)0
-rw-r--r--Documentation/RelNotes/2.17.6.adoc (renamed from Documentation/RelNotes/2.17.6.txt)0
-rw-r--r--Documentation/RelNotes/2.18.0.adoc (renamed from Documentation/RelNotes/2.18.0.txt)0
-rw-r--r--Documentation/RelNotes/2.18.1.adoc (renamed from Documentation/RelNotes/2.18.1.txt)0
-rw-r--r--Documentation/RelNotes/2.18.2.adoc (renamed from Documentation/RelNotes/2.18.2.txt)0
-rw-r--r--Documentation/RelNotes/2.18.3.adoc (renamed from Documentation/RelNotes/2.18.3.txt)0
-rw-r--r--Documentation/RelNotes/2.18.4.adoc (renamed from Documentation/RelNotes/2.18.4.txt)0
-rw-r--r--Documentation/RelNotes/2.18.5.adoc (renamed from Documentation/RelNotes/2.18.5.txt)0
-rw-r--r--Documentation/RelNotes/2.19.0.adoc (renamed from Documentation/RelNotes/2.19.0.txt)0
-rw-r--r--Documentation/RelNotes/2.19.1.adoc (renamed from Documentation/RelNotes/2.19.1.txt)0
-rw-r--r--Documentation/RelNotes/2.19.2.adoc (renamed from Documentation/RelNotes/2.19.2.txt)0
-rw-r--r--Documentation/RelNotes/2.19.3.adoc (renamed from Documentation/RelNotes/2.19.3.txt)0
-rw-r--r--Documentation/RelNotes/2.19.4.adoc (renamed from Documentation/RelNotes/2.19.4.txt)0
-rw-r--r--Documentation/RelNotes/2.19.5.adoc (renamed from Documentation/RelNotes/2.19.5.txt)0
-rw-r--r--Documentation/RelNotes/2.19.6.adoc (renamed from Documentation/RelNotes/2.19.6.txt)0
-rw-r--r--Documentation/RelNotes/2.2.0.adoc (renamed from Documentation/RelNotes/2.2.0.txt)0
-rw-r--r--Documentation/RelNotes/2.2.1.adoc (renamed from Documentation/RelNotes/2.2.1.txt)0
-rw-r--r--Documentation/RelNotes/2.2.2.adoc (renamed from Documentation/RelNotes/2.2.2.txt)0
-rw-r--r--Documentation/RelNotes/2.2.3.adoc (renamed from Documentation/RelNotes/2.2.3.txt)0
-rw-r--r--Documentation/RelNotes/2.20.0.adoc (renamed from Documentation/RelNotes/2.20.0.txt)0
-rw-r--r--Documentation/RelNotes/2.20.1.adoc (renamed from Documentation/RelNotes/2.20.1.txt)0
-rw-r--r--Documentation/RelNotes/2.20.2.adoc (renamed from Documentation/RelNotes/2.20.2.txt)0
-rw-r--r--Documentation/RelNotes/2.20.3.adoc (renamed from Documentation/RelNotes/2.20.3.txt)0
-rw-r--r--Documentation/RelNotes/2.20.4.adoc (renamed from Documentation/RelNotes/2.20.4.txt)0
-rw-r--r--Documentation/RelNotes/2.20.5.adoc (renamed from Documentation/RelNotes/2.20.5.txt)0
-rw-r--r--Documentation/RelNotes/2.21.0.adoc (renamed from Documentation/RelNotes/2.21.0.txt)0
-rw-r--r--Documentation/RelNotes/2.21.1.adoc (renamed from Documentation/RelNotes/2.21.1.txt)0
-rw-r--r--Documentation/RelNotes/2.21.2.adoc (renamed from Documentation/RelNotes/2.21.2.txt)0
-rw-r--r--Documentation/RelNotes/2.21.3.adoc (renamed from Documentation/RelNotes/2.21.3.txt)0
-rw-r--r--Documentation/RelNotes/2.21.4.adoc (renamed from Documentation/RelNotes/2.21.4.txt)0
-rw-r--r--Documentation/RelNotes/2.22.0.adoc (renamed from Documentation/RelNotes/2.22.0.txt)0
-rw-r--r--Documentation/RelNotes/2.22.1.adoc (renamed from Documentation/RelNotes/2.22.1.txt)0
-rw-r--r--Documentation/RelNotes/2.22.2.adoc (renamed from Documentation/RelNotes/2.22.2.txt)0
-rw-r--r--Documentation/RelNotes/2.22.3.adoc (renamed from Documentation/RelNotes/2.22.3.txt)0
-rw-r--r--Documentation/RelNotes/2.22.4.adoc (renamed from Documentation/RelNotes/2.22.4.txt)0
-rw-r--r--Documentation/RelNotes/2.22.5.adoc (renamed from Documentation/RelNotes/2.22.5.txt)0
-rw-r--r--Documentation/RelNotes/2.23.0.adoc (renamed from Documentation/RelNotes/2.23.0.txt)0
-rw-r--r--Documentation/RelNotes/2.23.1.adoc (renamed from Documentation/RelNotes/2.23.1.txt)0
-rw-r--r--Documentation/RelNotes/2.23.2.adoc (renamed from Documentation/RelNotes/2.23.2.txt)0
-rw-r--r--Documentation/RelNotes/2.23.3.adoc (renamed from Documentation/RelNotes/2.23.3.txt)0
-rw-r--r--Documentation/RelNotes/2.23.4.adoc (renamed from Documentation/RelNotes/2.23.4.txt)0
-rw-r--r--Documentation/RelNotes/2.24.0.adoc (renamed from Documentation/RelNotes/2.24.0.txt)0
-rw-r--r--Documentation/RelNotes/2.24.1.adoc (renamed from Documentation/RelNotes/2.24.1.txt)0
-rw-r--r--Documentation/RelNotes/2.24.2.adoc (renamed from Documentation/RelNotes/2.24.2.txt)0
-rw-r--r--Documentation/RelNotes/2.24.3.adoc (renamed from Documentation/RelNotes/2.24.3.txt)0
-rw-r--r--Documentation/RelNotes/2.24.4.adoc (renamed from Documentation/RelNotes/2.24.4.txt)0
-rw-r--r--Documentation/RelNotes/2.25.0.adoc (renamed from Documentation/RelNotes/2.25.0.txt)0
-rw-r--r--Documentation/RelNotes/2.25.1.adoc (renamed from Documentation/RelNotes/2.25.1.txt)0
-rw-r--r--Documentation/RelNotes/2.25.2.adoc (renamed from Documentation/RelNotes/2.25.2.txt)0
-rw-r--r--Documentation/RelNotes/2.25.3.adoc (renamed from Documentation/RelNotes/2.25.3.txt)0
-rw-r--r--Documentation/RelNotes/2.25.4.adoc (renamed from Documentation/RelNotes/2.25.4.txt)0
-rw-r--r--Documentation/RelNotes/2.25.5.adoc (renamed from Documentation/RelNotes/2.25.5.txt)0
-rw-r--r--Documentation/RelNotes/2.26.0.adoc (renamed from Documentation/RelNotes/2.26.0.txt)0
-rw-r--r--Documentation/RelNotes/2.26.1.adoc (renamed from Documentation/RelNotes/2.26.1.txt)0
-rw-r--r--Documentation/RelNotes/2.26.2.adoc (renamed from Documentation/RelNotes/2.26.2.txt)0
-rw-r--r--Documentation/RelNotes/2.26.3.adoc (renamed from Documentation/RelNotes/2.26.3.txt)0
-rw-r--r--Documentation/RelNotes/2.27.0.adoc (renamed from Documentation/RelNotes/2.27.0.txt)0
-rw-r--r--Documentation/RelNotes/2.27.1.adoc (renamed from Documentation/RelNotes/2.27.1.txt)0
-rw-r--r--Documentation/RelNotes/2.28.0.adoc (renamed from Documentation/RelNotes/2.28.0.txt)0
-rw-r--r--Documentation/RelNotes/2.28.1.adoc (renamed from Documentation/RelNotes/2.28.1.txt)0
-rw-r--r--Documentation/RelNotes/2.29.0.adoc (renamed from Documentation/RelNotes/2.29.0.txt)0
-rw-r--r--Documentation/RelNotes/2.29.1.adoc (renamed from Documentation/RelNotes/2.29.1.txt)0
-rw-r--r--Documentation/RelNotes/2.29.2.adoc (renamed from Documentation/RelNotes/2.29.2.txt)0
-rw-r--r--Documentation/RelNotes/2.29.3.adoc (renamed from Documentation/RelNotes/2.29.3.txt)0
-rw-r--r--Documentation/RelNotes/2.3.0.adoc (renamed from Documentation/RelNotes/2.3.0.txt)0
-rw-r--r--Documentation/RelNotes/2.3.1.adoc (renamed from Documentation/RelNotes/2.3.1.txt)0
-rw-r--r--Documentation/RelNotes/2.3.10.adoc (renamed from Documentation/RelNotes/2.3.10.txt)0
-rw-r--r--Documentation/RelNotes/2.3.2.adoc (renamed from Documentation/RelNotes/2.3.2.txt)0
-rw-r--r--Documentation/RelNotes/2.3.3.adoc (renamed from Documentation/RelNotes/2.3.3.txt)0
-rw-r--r--Documentation/RelNotes/2.3.4.adoc (renamed from Documentation/RelNotes/2.3.4.txt)0
-rw-r--r--Documentation/RelNotes/2.3.5.adoc (renamed from Documentation/RelNotes/2.3.5.txt)0
-rw-r--r--Documentation/RelNotes/2.3.6.adoc (renamed from Documentation/RelNotes/2.3.6.txt)0
-rw-r--r--Documentation/RelNotes/2.3.7.adoc (renamed from Documentation/RelNotes/2.3.7.txt)0
-rw-r--r--Documentation/RelNotes/2.3.8.adoc (renamed from Documentation/RelNotes/2.3.8.txt)0
-rw-r--r--Documentation/RelNotes/2.3.9.adoc (renamed from Documentation/RelNotes/2.3.9.txt)0
-rw-r--r--Documentation/RelNotes/2.30.0.adoc (renamed from Documentation/RelNotes/2.30.0.txt)0
-rw-r--r--Documentation/RelNotes/2.30.1.adoc (renamed from Documentation/RelNotes/2.30.1.txt)0
-rw-r--r--Documentation/RelNotes/2.30.2.adoc (renamed from Documentation/RelNotes/2.30.2.txt)0
-rw-r--r--Documentation/RelNotes/2.30.3.adoc (renamed from Documentation/RelNotes/2.30.3.txt)0
-rw-r--r--Documentation/RelNotes/2.30.4.adoc (renamed from Documentation/RelNotes/2.30.4.txt)0
-rw-r--r--Documentation/RelNotes/2.30.5.adoc (renamed from Documentation/RelNotes/2.30.5.txt)0
-rw-r--r--Documentation/RelNotes/2.30.6.adoc (renamed from Documentation/RelNotes/2.30.6.txt)0
-rw-r--r--Documentation/RelNotes/2.30.7.adoc (renamed from Documentation/RelNotes/2.30.7.txt)0
-rw-r--r--Documentation/RelNotes/2.30.8.adoc (renamed from Documentation/RelNotes/2.30.8.txt)0
-rw-r--r--Documentation/RelNotes/2.30.9.adoc (renamed from Documentation/RelNotes/2.30.9.txt)0
-rw-r--r--Documentation/RelNotes/2.31.0.adoc (renamed from Documentation/RelNotes/2.31.0.txt)0
-rw-r--r--Documentation/RelNotes/2.31.1.adoc (renamed from Documentation/RelNotes/2.31.1.txt)0
-rw-r--r--Documentation/RelNotes/2.31.2.adoc (renamed from Documentation/RelNotes/2.31.2.txt)0
-rw-r--r--Documentation/RelNotes/2.31.3.adoc (renamed from Documentation/RelNotes/2.31.3.txt)0
-rw-r--r--Documentation/RelNotes/2.31.4.adoc (renamed from Documentation/RelNotes/2.31.4.txt)0
-rw-r--r--Documentation/RelNotes/2.31.5.adoc (renamed from Documentation/RelNotes/2.31.5.txt)0
-rw-r--r--Documentation/RelNotes/2.31.6.adoc (renamed from Documentation/RelNotes/2.31.6.txt)0
-rw-r--r--Documentation/RelNotes/2.31.7.adoc (renamed from Documentation/RelNotes/2.31.7.txt)0
-rw-r--r--Documentation/RelNotes/2.31.8.adoc (renamed from Documentation/RelNotes/2.31.8.txt)0
-rw-r--r--Documentation/RelNotes/2.32.0.adoc (renamed from Documentation/RelNotes/2.32.0.txt)0
-rw-r--r--Documentation/RelNotes/2.32.1.adoc (renamed from Documentation/RelNotes/2.32.1.txt)0
-rw-r--r--Documentation/RelNotes/2.32.2.adoc (renamed from Documentation/RelNotes/2.32.2.txt)0
-rw-r--r--Documentation/RelNotes/2.32.3.adoc (renamed from Documentation/RelNotes/2.32.3.txt)0
-rw-r--r--Documentation/RelNotes/2.32.4.adoc (renamed from Documentation/RelNotes/2.32.4.txt)0
-rw-r--r--Documentation/RelNotes/2.32.5.adoc (renamed from Documentation/RelNotes/2.32.5.txt)0
-rw-r--r--Documentation/RelNotes/2.32.6.adoc (renamed from Documentation/RelNotes/2.32.6.txt)0
-rw-r--r--Documentation/RelNotes/2.32.7.adoc (renamed from Documentation/RelNotes/2.32.7.txt)0
-rw-r--r--Documentation/RelNotes/2.33.0.adoc (renamed from Documentation/RelNotes/2.33.0.txt)0
-rw-r--r--Documentation/RelNotes/2.33.1.adoc (renamed from Documentation/RelNotes/2.33.1.txt)0
-rw-r--r--Documentation/RelNotes/2.33.2.adoc (renamed from Documentation/RelNotes/2.33.2.txt)0
-rw-r--r--Documentation/RelNotes/2.33.3.adoc (renamed from Documentation/RelNotes/2.33.3.txt)0
-rw-r--r--Documentation/RelNotes/2.33.4.adoc (renamed from Documentation/RelNotes/2.33.4.txt)0
-rw-r--r--Documentation/RelNotes/2.33.5.adoc (renamed from Documentation/RelNotes/2.33.5.txt)0
-rw-r--r--Documentation/RelNotes/2.33.6.adoc (renamed from Documentation/RelNotes/2.33.6.txt)0
-rw-r--r--Documentation/RelNotes/2.33.7.adoc (renamed from Documentation/RelNotes/2.33.7.txt)0
-rw-r--r--Documentation/RelNotes/2.33.8.adoc (renamed from Documentation/RelNotes/2.33.8.txt)0
-rw-r--r--Documentation/RelNotes/2.34.0.adoc (renamed from Documentation/RelNotes/2.34.0.txt)0
-rw-r--r--Documentation/RelNotes/2.34.1.adoc (renamed from Documentation/RelNotes/2.34.1.txt)0
-rw-r--r--Documentation/RelNotes/2.34.2.adoc (renamed from Documentation/RelNotes/2.34.2.txt)0
-rw-r--r--Documentation/RelNotes/2.34.3.adoc (renamed from Documentation/RelNotes/2.34.3.txt)0
-rw-r--r--Documentation/RelNotes/2.34.4.adoc (renamed from Documentation/RelNotes/2.34.4.txt)0
-rw-r--r--Documentation/RelNotes/2.34.5.adoc (renamed from Documentation/RelNotes/2.34.5.txt)0
-rw-r--r--Documentation/RelNotes/2.34.6.adoc (renamed from Documentation/RelNotes/2.34.6.txt)0
-rw-r--r--Documentation/RelNotes/2.34.7.adoc (renamed from Documentation/RelNotes/2.34.7.txt)0
-rw-r--r--Documentation/RelNotes/2.34.8.adoc (renamed from Documentation/RelNotes/2.34.8.txt)0
-rw-r--r--Documentation/RelNotes/2.35.0.adoc (renamed from Documentation/RelNotes/2.35.0.txt)0
-rw-r--r--Documentation/RelNotes/2.35.1.adoc (renamed from Documentation/RelNotes/2.35.1.txt)0
-rw-r--r--Documentation/RelNotes/2.35.2.adoc (renamed from Documentation/RelNotes/2.35.2.txt)0
-rw-r--r--Documentation/RelNotes/2.35.3.adoc (renamed from Documentation/RelNotes/2.35.3.txt)0
-rw-r--r--Documentation/RelNotes/2.35.4.adoc (renamed from Documentation/RelNotes/2.35.4.txt)0
-rw-r--r--Documentation/RelNotes/2.35.5.adoc (renamed from Documentation/RelNotes/2.35.5.txt)0
-rw-r--r--Documentation/RelNotes/2.35.6.adoc (renamed from Documentation/RelNotes/2.35.6.txt)0
-rw-r--r--Documentation/RelNotes/2.35.7.adoc (renamed from Documentation/RelNotes/2.35.7.txt)0
-rw-r--r--Documentation/RelNotes/2.35.8.adoc (renamed from Documentation/RelNotes/2.35.8.txt)0
-rw-r--r--Documentation/RelNotes/2.36.0.adoc (renamed from Documentation/RelNotes/2.36.0.txt)0
-rw-r--r--Documentation/RelNotes/2.36.1.adoc (renamed from Documentation/RelNotes/2.36.1.txt)0
-rw-r--r--Documentation/RelNotes/2.36.2.adoc (renamed from Documentation/RelNotes/2.36.2.txt)0
-rw-r--r--Documentation/RelNotes/2.36.3.adoc (renamed from Documentation/RelNotes/2.36.3.txt)0
-rw-r--r--Documentation/RelNotes/2.36.4.adoc (renamed from Documentation/RelNotes/2.36.4.txt)0
-rw-r--r--Documentation/RelNotes/2.36.5.adoc (renamed from Documentation/RelNotes/2.36.5.txt)0
-rw-r--r--Documentation/RelNotes/2.36.6.adoc (renamed from Documentation/RelNotes/2.36.6.txt)0
-rw-r--r--Documentation/RelNotes/2.37.0.adoc (renamed from Documentation/RelNotes/2.37.0.txt)0
-rw-r--r--Documentation/RelNotes/2.37.1.adoc (renamed from Documentation/RelNotes/2.37.1.txt)0
-rw-r--r--Documentation/RelNotes/2.37.2.adoc (renamed from Documentation/RelNotes/2.37.2.txt)0
-rw-r--r--Documentation/RelNotes/2.37.3.adoc (renamed from Documentation/RelNotes/2.37.3.txt)0
-rw-r--r--Documentation/RelNotes/2.37.4.adoc (renamed from Documentation/RelNotes/2.37.4.txt)0
-rw-r--r--Documentation/RelNotes/2.37.5.adoc (renamed from Documentation/RelNotes/2.37.5.txt)0
-rw-r--r--Documentation/RelNotes/2.37.6.adoc (renamed from Documentation/RelNotes/2.37.6.txt)0
-rw-r--r--Documentation/RelNotes/2.37.7.adoc (renamed from Documentation/RelNotes/2.37.7.txt)0
-rw-r--r--Documentation/RelNotes/2.38.0.adoc (renamed from Documentation/RelNotes/2.38.0.txt)0
-rw-r--r--Documentation/RelNotes/2.38.1.adoc (renamed from Documentation/RelNotes/2.38.1.txt)0
-rw-r--r--Documentation/RelNotes/2.38.2.adoc (renamed from Documentation/RelNotes/2.38.2.txt)0
-rw-r--r--Documentation/RelNotes/2.38.3.adoc (renamed from Documentation/RelNotes/2.38.3.txt)0
-rw-r--r--Documentation/RelNotes/2.38.4.adoc (renamed from Documentation/RelNotes/2.38.4.txt)0
-rw-r--r--Documentation/RelNotes/2.38.5.adoc (renamed from Documentation/RelNotes/2.38.5.txt)0
-rw-r--r--Documentation/RelNotes/2.39.0.adoc (renamed from Documentation/RelNotes/2.39.0.txt)0
-rw-r--r--Documentation/RelNotes/2.39.1.adoc (renamed from Documentation/RelNotes/2.39.1.txt)0
-rw-r--r--Documentation/RelNotes/2.39.2.adoc (renamed from Documentation/RelNotes/2.39.2.txt)0
-rw-r--r--Documentation/RelNotes/2.39.3.adoc (renamed from Documentation/RelNotes/2.39.3.txt)0
-rw-r--r--Documentation/RelNotes/2.39.4.adoc (renamed from Documentation/RelNotes/2.39.4.txt)0
-rw-r--r--Documentation/RelNotes/2.39.5.adoc (renamed from Documentation/RelNotes/2.39.5.txt)0
-rw-r--r--Documentation/RelNotes/2.4.0.adoc (renamed from Documentation/RelNotes/2.4.0.txt)0
-rw-r--r--Documentation/RelNotes/2.4.1.adoc (renamed from Documentation/RelNotes/2.4.1.txt)0
-rw-r--r--Documentation/RelNotes/2.4.10.adoc (renamed from Documentation/RelNotes/2.4.10.txt)0
-rw-r--r--Documentation/RelNotes/2.4.11.adoc (renamed from Documentation/RelNotes/2.4.11.txt)0
-rw-r--r--Documentation/RelNotes/2.4.12.adoc (renamed from Documentation/RelNotes/2.4.12.txt)0
-rw-r--r--Documentation/RelNotes/2.4.2.adoc (renamed from Documentation/RelNotes/2.4.2.txt)0
-rw-r--r--Documentation/RelNotes/2.4.3.adoc (renamed from Documentation/RelNotes/2.4.3.txt)0
-rw-r--r--Documentation/RelNotes/2.4.4.adoc (renamed from Documentation/RelNotes/2.4.4.txt)0
-rw-r--r--Documentation/RelNotes/2.4.5.adoc (renamed from Documentation/RelNotes/2.4.5.txt)0
-rw-r--r--Documentation/RelNotes/2.4.6.adoc (renamed from Documentation/RelNotes/2.4.6.txt)0
-rw-r--r--Documentation/RelNotes/2.4.7.adoc (renamed from Documentation/RelNotes/2.4.7.txt)0
-rw-r--r--Documentation/RelNotes/2.4.8.adoc (renamed from Documentation/RelNotes/2.4.8.txt)0
-rw-r--r--Documentation/RelNotes/2.4.9.adoc (renamed from Documentation/RelNotes/2.4.9.txt)0
-rw-r--r--Documentation/RelNotes/2.40.0.adoc (renamed from Documentation/RelNotes/2.40.0.txt)0
-rw-r--r--Documentation/RelNotes/2.40.1.adoc (renamed from Documentation/RelNotes/2.40.1.txt)0
-rw-r--r--Documentation/RelNotes/2.40.2.adoc (renamed from Documentation/RelNotes/2.40.2.txt)0
-rw-r--r--Documentation/RelNotes/2.40.3.adoc (renamed from Documentation/RelNotes/2.40.3.txt)0
-rw-r--r--Documentation/RelNotes/2.40.4.adoc5
-rw-r--r--Documentation/RelNotes/2.41.0.adoc (renamed from Documentation/RelNotes/2.41.0.txt)0
-rw-r--r--Documentation/RelNotes/2.41.1.adoc (renamed from Documentation/RelNotes/2.41.1.txt)0
-rw-r--r--Documentation/RelNotes/2.41.2.adoc (renamed from Documentation/RelNotes/2.41.2.txt)0
-rw-r--r--Documentation/RelNotes/2.41.3.adoc6
-rw-r--r--Documentation/RelNotes/2.42.0.adoc (renamed from Documentation/RelNotes/2.42.0.txt)0
-rw-r--r--Documentation/RelNotes/2.42.1.adoc (renamed from Documentation/RelNotes/2.42.1.txt)0
-rw-r--r--Documentation/RelNotes/2.42.2.adoc (renamed from Documentation/RelNotes/2.42.2.txt)0
-rw-r--r--Documentation/RelNotes/2.42.3.adoc (renamed from Documentation/RelNotes/2.42.3.txt)0
-rw-r--r--Documentation/RelNotes/2.42.4.adoc6
-rw-r--r--Documentation/RelNotes/2.43.0.adoc (renamed from Documentation/RelNotes/2.43.0.txt)0
-rw-r--r--Documentation/RelNotes/2.43.1.adoc (renamed from Documentation/RelNotes/2.43.1.txt)0
-rw-r--r--Documentation/RelNotes/2.43.2.adoc (renamed from Documentation/RelNotes/2.43.2.txt)0
-rw-r--r--Documentation/RelNotes/2.43.3.adoc (renamed from Documentation/RelNotes/2.43.3.txt)0
-rw-r--r--Documentation/RelNotes/2.43.4.adoc (renamed from Documentation/RelNotes/2.43.4.txt)0
-rw-r--r--Documentation/RelNotes/2.43.5.adoc (renamed from Documentation/RelNotes/2.43.5.txt)0
-rw-r--r--Documentation/RelNotes/2.43.6.adoc7
-rw-r--r--Documentation/RelNotes/2.44.0.adoc (renamed from Documentation/RelNotes/2.44.0.txt)0
-rw-r--r--Documentation/RelNotes/2.44.1.adoc (renamed from Documentation/RelNotes/2.44.1.txt)0
-rw-r--r--Documentation/RelNotes/2.44.2.adoc (renamed from Documentation/RelNotes/2.44.2.txt)0
-rw-r--r--Documentation/RelNotes/2.44.3.adoc7
-rw-r--r--Documentation/RelNotes/2.45.0.adoc (renamed from Documentation/RelNotes/2.45.0.txt)0
-rw-r--r--Documentation/RelNotes/2.45.1.adoc (renamed from Documentation/RelNotes/2.45.1.txt)0
-rw-r--r--Documentation/RelNotes/2.45.2.adoc (renamed from Documentation/RelNotes/2.45.2.txt)0
-rw-r--r--Documentation/RelNotes/2.45.3.adoc (renamed from Documentation/RelNotes/2.45.3.txt)7
-rw-r--r--Documentation/RelNotes/2.46.0.adoc (renamed from Documentation/RelNotes/2.46.0.txt)0
-rw-r--r--Documentation/RelNotes/2.46.1.adoc (renamed from Documentation/RelNotes/2.46.1.txt)0
-rw-r--r--Documentation/RelNotes/2.46.2.adoc (renamed from Documentation/RelNotes/2.46.2.txt)0
-rw-r--r--Documentation/RelNotes/2.46.3.adoc6
-rw-r--r--Documentation/RelNotes/2.47.0.adoc (renamed from Documentation/RelNotes/2.47.0.txt)0
-rw-r--r--Documentation/RelNotes/2.47.1.adoc (renamed from Documentation/RelNotes/2.47.1.txt)0
-rw-r--r--Documentation/RelNotes/2.47.2.adoc7
-rw-r--r--Documentation/RelNotes/2.48.0.adoc (renamed from Documentation/RelNotes/2.48.0.txt)25
-rw-r--r--Documentation/RelNotes/2.48.1.adoc7
-rw-r--r--Documentation/RelNotes/2.49.0.adoc246
-rw-r--r--Documentation/RelNotes/2.5.0.adoc (renamed from Documentation/RelNotes/2.5.0.txt)0
-rw-r--r--Documentation/RelNotes/2.5.1.adoc (renamed from Documentation/RelNotes/2.5.1.txt)0
-rw-r--r--Documentation/RelNotes/2.5.2.adoc (renamed from Documentation/RelNotes/2.5.2.txt)0
-rw-r--r--Documentation/RelNotes/2.5.3.adoc (renamed from Documentation/RelNotes/2.5.3.txt)0
-rw-r--r--Documentation/RelNotes/2.5.4.adoc (renamed from Documentation/RelNotes/2.5.4.txt)0
-rw-r--r--Documentation/RelNotes/2.5.5.adoc (renamed from Documentation/RelNotes/2.5.5.txt)0
-rw-r--r--Documentation/RelNotes/2.5.6.adoc (renamed from Documentation/RelNotes/2.5.6.txt)0
-rw-r--r--Documentation/RelNotes/2.6.0.adoc (renamed from Documentation/RelNotes/2.6.0.txt)0
-rw-r--r--Documentation/RelNotes/2.6.1.adoc (renamed from Documentation/RelNotes/2.6.1.txt)0
-rw-r--r--Documentation/RelNotes/2.6.2.adoc (renamed from Documentation/RelNotes/2.6.2.txt)0
-rw-r--r--Documentation/RelNotes/2.6.3.adoc (renamed from Documentation/RelNotes/2.6.3.txt)0
-rw-r--r--Documentation/RelNotes/2.6.4.adoc (renamed from Documentation/RelNotes/2.6.4.txt)0
-rw-r--r--Documentation/RelNotes/2.6.5.adoc (renamed from Documentation/RelNotes/2.6.5.txt)0
-rw-r--r--Documentation/RelNotes/2.6.6.adoc (renamed from Documentation/RelNotes/2.6.6.txt)0
-rw-r--r--Documentation/RelNotes/2.6.7.adoc (renamed from Documentation/RelNotes/2.6.7.txt)0
-rw-r--r--Documentation/RelNotes/2.7.0.adoc (renamed from Documentation/RelNotes/2.7.0.txt)0
-rw-r--r--Documentation/RelNotes/2.7.1.adoc (renamed from Documentation/RelNotes/2.7.1.txt)0
-rw-r--r--Documentation/RelNotes/2.7.2.adoc (renamed from Documentation/RelNotes/2.7.2.txt)0
-rw-r--r--Documentation/RelNotes/2.7.3.adoc (renamed from Documentation/RelNotes/2.7.3.txt)0
-rw-r--r--Documentation/RelNotes/2.7.4.adoc (renamed from Documentation/RelNotes/2.7.4.txt)0
-rw-r--r--Documentation/RelNotes/2.7.5.adoc (renamed from Documentation/RelNotes/2.7.5.txt)0
-rw-r--r--Documentation/RelNotes/2.7.6.adoc (renamed from Documentation/RelNotes/2.7.6.txt)0
-rw-r--r--Documentation/RelNotes/2.8.0.adoc (renamed from Documentation/RelNotes/2.8.0.txt)0
-rw-r--r--Documentation/RelNotes/2.8.1.adoc (renamed from Documentation/RelNotes/2.8.1.txt)0
-rw-r--r--Documentation/RelNotes/2.8.2.adoc (renamed from Documentation/RelNotes/2.8.2.txt)0
-rw-r--r--Documentation/RelNotes/2.8.3.adoc (renamed from Documentation/RelNotes/2.8.3.txt)0
-rw-r--r--Documentation/RelNotes/2.8.4.adoc (renamed from Documentation/RelNotes/2.8.4.txt)0
-rw-r--r--Documentation/RelNotes/2.8.5.adoc (renamed from Documentation/RelNotes/2.8.5.txt)0
-rw-r--r--Documentation/RelNotes/2.8.6.adoc (renamed from Documentation/RelNotes/2.8.6.txt)0
-rw-r--r--Documentation/RelNotes/2.9.0.adoc (renamed from Documentation/RelNotes/2.9.0.txt)0
-rw-r--r--Documentation/RelNotes/2.9.1.adoc (renamed from Documentation/RelNotes/2.9.1.txt)0
-rw-r--r--Documentation/RelNotes/2.9.2.adoc (renamed from Documentation/RelNotes/2.9.2.txt)0
-rw-r--r--Documentation/RelNotes/2.9.3.adoc (renamed from Documentation/RelNotes/2.9.3.txt)0
-rw-r--r--Documentation/RelNotes/2.9.4.adoc (renamed from Documentation/RelNotes/2.9.4.txt)0
-rw-r--r--Documentation/RelNotes/2.9.5.adoc (renamed from Documentation/RelNotes/2.9.5.txt)0
-rw-r--r--Documentation/ReviewingGuidelines.adoc (renamed from Documentation/ReviewingGuidelines.txt)0
-rw-r--r--Documentation/ToolsForGit.adoc (renamed from Documentation/ToolsForGit.txt)0
-rw-r--r--Documentation/blame-options.adoc (renamed from Documentation/blame-options.txt)2
-rwxr-xr-xDocumentation/cmd-list.perl8
-rw-r--r--Documentation/config.adoc (renamed from Documentation/config.txt)186
-rw-r--r--Documentation/config/add.adoc (renamed from Documentation/config/add.txt)0
-rw-r--r--Documentation/config/advice.adoc (renamed from Documentation/config/advice.txt)0
-rw-r--r--Documentation/config/alias.adoc (renamed from Documentation/config/alias.txt)0
-rw-r--r--Documentation/config/am.adoc (renamed from Documentation/config/am.txt)0
-rw-r--r--Documentation/config/apply.adoc (renamed from Documentation/config/apply.txt)0
-rw-r--r--Documentation/config/attr.adoc (renamed from Documentation/config/attr.txt)0
-rw-r--r--Documentation/config/bitmap-pseudo-merge.adoc (renamed from Documentation/config/bitmap-pseudo-merge.txt)0
-rw-r--r--Documentation/config/blame.adoc (renamed from Documentation/config/blame.txt)0
-rw-r--r--Documentation/config/branch.adoc (renamed from Documentation/config/branch.txt)0
-rw-r--r--Documentation/config/browser.adoc (renamed from Documentation/config/browser.txt)0
-rw-r--r--Documentation/config/bundle.adoc (renamed from Documentation/config/bundle.txt)0
-rw-r--r--Documentation/config/checkout.adoc (renamed from Documentation/config/checkout.txt)0
-rw-r--r--Documentation/config/clean.adoc (renamed from Documentation/config/clean.txt)0
-rw-r--r--Documentation/config/clone.adoc (renamed from Documentation/config/clone.txt)0
-rw-r--r--Documentation/config/color.adoc (renamed from Documentation/config/color.txt)0
-rw-r--r--Documentation/config/column.adoc (renamed from Documentation/config/column.txt)0
-rw-r--r--Documentation/config/commit.adoc (renamed from Documentation/config/commit.txt)25
-rw-r--r--Documentation/config/commitgraph.adoc (renamed from Documentation/config/commitgraph.txt)0
-rw-r--r--Documentation/config/completion.adoc (renamed from Documentation/config/completion.txt)0
-rw-r--r--Documentation/config/core.adoc (renamed from Documentation/config/core.txt)0
-rw-r--r--Documentation/config/credential.adoc (renamed from Documentation/config/credential.txt)11
-rw-r--r--Documentation/config/diff.adoc (renamed from Documentation/config/diff.txt)2
-rw-r--r--Documentation/config/difftool.adoc (renamed from Documentation/config/difftool.txt)2
-rw-r--r--Documentation/config/extensions.adoc (renamed from Documentation/config/extensions.txt)2
-rw-r--r--Documentation/config/fastimport.adoc (renamed from Documentation/config/fastimport.txt)0
-rw-r--r--Documentation/config/feature.adoc (renamed from Documentation/config/feature.txt)0
-rw-r--r--Documentation/config/fetch.adoc (renamed from Documentation/config/fetch.txt)0
-rw-r--r--Documentation/config/filter.adoc (renamed from Documentation/config/filter.txt)0
-rw-r--r--Documentation/config/fmt-merge-msg.adoc (renamed from Documentation/config/fmt-merge-msg.txt)0
-rw-r--r--Documentation/config/format.adoc (renamed from Documentation/config/format.txt)0
-rw-r--r--Documentation/config/fsck.adoc (renamed from Documentation/config/fsck.txt)0
-rw-r--r--Documentation/config/fsmonitor--daemon.adoc (renamed from Documentation/config/fsmonitor--daemon.txt)0
-rw-r--r--Documentation/config/gc.adoc (renamed from Documentation/config/gc.txt)0
-rw-r--r--Documentation/config/gitcvs.adoc (renamed from Documentation/config/gitcvs.txt)0
-rw-r--r--Documentation/config/gitweb.adoc (renamed from Documentation/config/gitweb.txt)0
-rw-r--r--Documentation/config/gpg.adoc (renamed from Documentation/config/gpg.txt)0
-rw-r--r--Documentation/config/grep.adoc (renamed from Documentation/config/grep.txt)0
-rw-r--r--Documentation/config/gui.adoc (renamed from Documentation/config/gui.txt)0
-rw-r--r--Documentation/config/guitool.adoc (renamed from Documentation/config/guitool.txt)0
-rw-r--r--Documentation/config/help.adoc (renamed from Documentation/config/help.txt)9
-rw-r--r--Documentation/config/http.adoc (renamed from Documentation/config/http.txt)15
-rw-r--r--Documentation/config/i18n.adoc (renamed from Documentation/config/i18n.txt)0
-rw-r--r--Documentation/config/imap.adoc (renamed from Documentation/config/imap.txt)0
-rw-r--r--Documentation/config/includeif.adoc (renamed from Documentation/config/includeif.txt)0
-rw-r--r--Documentation/config/index.adoc (renamed from Documentation/config/index.txt)0
-rw-r--r--Documentation/config/init.adoc (renamed from Documentation/config/init.txt)0
-rw-r--r--Documentation/config/instaweb.adoc (renamed from Documentation/config/instaweb.txt)0
-rw-r--r--Documentation/config/interactive.adoc (renamed from Documentation/config/interactive.txt)0
-rw-r--r--Documentation/config/log.adoc (renamed from Documentation/config/log.txt)0
-rw-r--r--Documentation/config/lsrefs.adoc (renamed from Documentation/config/lsrefs.txt)0
-rw-r--r--Documentation/config/mailinfo.adoc (renamed from Documentation/config/mailinfo.txt)0
-rw-r--r--Documentation/config/mailmap.adoc (renamed from Documentation/config/mailmap.txt)0
-rw-r--r--Documentation/config/maintenance.adoc (renamed from Documentation/config/maintenance.txt)0
-rw-r--r--Documentation/config/man.adoc (renamed from Documentation/config/man.txt)0
-rw-r--r--Documentation/config/merge.adoc (renamed from Documentation/config/merge.txt)7
-rw-r--r--Documentation/config/mergetool.adoc (renamed from Documentation/config/mergetool.txt)0
-rw-r--r--Documentation/config/notes.adoc (renamed from Documentation/config/notes.txt)32
-rw-r--r--Documentation/config/pack.adoc (renamed from Documentation/config/pack.txt)0
-rw-r--r--Documentation/config/pager.adoc (renamed from Documentation/config/pager.txt)0
-rw-r--r--Documentation/config/pretty.adoc (renamed from Documentation/config/pretty.txt)0
-rw-r--r--Documentation/config/promisor.adoc (renamed from Documentation/config/promisor.txt)0
-rw-r--r--Documentation/config/protocol.adoc (renamed from Documentation/config/protocol.txt)0
-rw-r--r--Documentation/config/pull.adoc (renamed from Documentation/config/pull.txt)0
-rw-r--r--Documentation/config/push.adoc (renamed from Documentation/config/push.txt)0
-rw-r--r--Documentation/config/rebase.adoc (renamed from Documentation/config/rebase.txt)0
-rw-r--r--Documentation/config/receive.adoc (renamed from Documentation/config/receive.txt)0
-rw-r--r--Documentation/config/reftable.adoc (renamed from Documentation/config/reftable.txt)0
-rw-r--r--Documentation/config/remote.adoc (renamed from Documentation/config/remote.txt)0
-rw-r--r--Documentation/config/remotes.adoc (renamed from Documentation/config/remotes.txt)0
-rw-r--r--Documentation/config/repack.adoc (renamed from Documentation/config/repack.txt)0
-rw-r--r--Documentation/config/rerere.adoc (renamed from Documentation/config/rerere.txt)0
-rw-r--r--Documentation/config/revert.adoc (renamed from Documentation/config/revert.txt)0
-rw-r--r--Documentation/config/safe.adoc (renamed from Documentation/config/safe.txt)0
-rw-r--r--Documentation/config/sendemail.adoc (renamed from Documentation/config/sendemail.txt)0
-rw-r--r--Documentation/config/sequencer.adoc (renamed from Documentation/config/sequencer.txt)0
-rw-r--r--Documentation/config/showbranch.adoc (renamed from Documentation/config/showbranch.txt)0
-rw-r--r--Documentation/config/sparse.adoc (renamed from Documentation/config/sparse.txt)0
-rw-r--r--Documentation/config/splitindex.adoc (renamed from Documentation/config/splitindex.txt)0
-rw-r--r--Documentation/config/ssh.adoc (renamed from Documentation/config/ssh.txt)0
-rw-r--r--Documentation/config/stash.adoc (renamed from Documentation/config/stash.txt)0
-rw-r--r--Documentation/config/status.adoc (renamed from Documentation/config/status.txt)0
-rw-r--r--Documentation/config/submodule.adoc (renamed from Documentation/config/submodule.txt)0
-rw-r--r--Documentation/config/tag.adoc (renamed from Documentation/config/tag.txt)0
-rw-r--r--Documentation/config/tar.adoc (renamed from Documentation/config/tar.txt)0
-rw-r--r--Documentation/config/trace2.adoc (renamed from Documentation/config/trace2.txt)2
-rw-r--r--Documentation/config/trailer.adoc136
-rw-r--r--Documentation/config/transfer.adoc (renamed from Documentation/config/transfer.txt)0
-rw-r--r--Documentation/config/uploadarchive.adoc (renamed from Documentation/config/uploadarchive.txt)0
-rw-r--r--Documentation/config/uploadpack.adoc (renamed from Documentation/config/uploadpack.txt)0
-rw-r--r--Documentation/config/url.adoc (renamed from Documentation/config/url.txt)0
-rw-r--r--Documentation/config/user.adoc (renamed from Documentation/config/user.txt)0
-rw-r--r--Documentation/config/versionsort.adoc (renamed from Documentation/config/versionsort.txt)0
-rw-r--r--Documentation/config/web.adoc (renamed from Documentation/config/web.txt)0
-rw-r--r--Documentation/config/worktree.adoc (renamed from Documentation/config/worktree.txt)0
-rw-r--r--Documentation/date-formats.adoc (renamed from Documentation/date-formats.txt)0
-rw-r--r--Documentation/diff-format.adoc (renamed from Documentation/diff-format.txt)2
-rw-r--r--Documentation/diff-generate-patch.adoc (renamed from Documentation/diff-generate-patch.txt)0
-rw-r--r--Documentation/diff-options.adoc (renamed from Documentation/diff-options.txt)0
-rw-r--r--Documentation/everyday.adoco (renamed from Documentation/everyday.txto)0
-rw-r--r--Documentation/fetch-options.adoc (renamed from Documentation/fetch-options.txt)0
-rw-r--r--Documentation/fsck-msgids.adoc (renamed from Documentation/fsck-msgids.txt)0
-rw-r--r--Documentation/git-add.adoc (renamed from Documentation/git-add.txt)4
-rw-r--r--Documentation/git-am.adoc (renamed from Documentation/git-am.txt)6
-rw-r--r--Documentation/git-annotate.adoc (renamed from Documentation/git-annotate.txt)2
-rw-r--r--Documentation/git-apply.adoc (renamed from Documentation/git-apply.txt)4
-rw-r--r--Documentation/git-archimport.adoc (renamed from Documentation/git-archimport.txt)0
-rw-r--r--Documentation/git-archive.adoc (renamed from Documentation/git-archive.txt)0
-rw-r--r--Documentation/git-backfill.adoc71
-rw-r--r--Documentation/git-bisect-lk2009.adoc (renamed from Documentation/git-bisect-lk2009.txt)0
-rw-r--r--Documentation/git-bisect.adoc (renamed from Documentation/git-bisect.txt)0
-rw-r--r--Documentation/git-blame.adoc (renamed from Documentation/git-blame.txt)6
-rw-r--r--Documentation/git-branch.adoc (renamed from Documentation/git-branch.txt)6
-rw-r--r--Documentation/git-bugreport.adoc (renamed from Documentation/git-bugreport.txt)0
-rw-r--r--Documentation/git-bundle.adoc (renamed from Documentation/git-bundle.txt)0
-rw-r--r--Documentation/git-cat-file.adoc (renamed from Documentation/git-cat-file.txt)0
-rw-r--r--Documentation/git-check-attr.adoc (renamed from Documentation/git-check-attr.txt)0
-rw-r--r--Documentation/git-check-ignore.adoc (renamed from Documentation/git-check-ignore.txt)0
-rw-r--r--Documentation/git-check-mailmap.adoc (renamed from Documentation/git-check-mailmap.txt)0
-rw-r--r--Documentation/git-check-ref-format.adoc (renamed from Documentation/git-check-ref-format.txt)0
-rw-r--r--Documentation/git-checkout-index.adoc (renamed from Documentation/git-checkout-index.txt)0
-rw-r--r--Documentation/git-checkout.adoc (renamed from Documentation/git-checkout.txt)4
-rw-r--r--Documentation/git-cherry-pick.adoc (renamed from Documentation/git-cherry-pick.txt)4
-rw-r--r--Documentation/git-cherry.adoc (renamed from Documentation/git-cherry.txt)0
-rw-r--r--Documentation/git-citool.adoc (renamed from Documentation/git-citool.txt)0
-rw-r--r--Documentation/git-clean.adoc (renamed from Documentation/git-clean.txt)4
-rw-r--r--Documentation/git-clone.adoc (renamed from Documentation/git-clone.txt)36
-rw-r--r--Documentation/git-column.adoc (renamed from Documentation/git-column.txt)4
-rw-r--r--Documentation/git-commit-graph.adoc (renamed from Documentation/git-commit-graph.txt)4
-rw-r--r--Documentation/git-commit-tree.adoc (renamed from Documentation/git-commit-tree.txt)4
-rw-r--r--Documentation/git-commit.adoc (renamed from Documentation/git-commit.txt)297
-rw-r--r--Documentation/git-config.adoc (renamed from Documentation/git-config.txt)6
-rw-r--r--Documentation/git-count-objects.adoc (renamed from Documentation/git-count-objects.txt)0
-rw-r--r--Documentation/git-credential-cache--daemon.adoc (renamed from Documentation/git-credential-cache--daemon.txt)0
-rw-r--r--Documentation/git-credential-cache.adoc (renamed from Documentation/git-credential-cache.txt)17
-rw-r--r--Documentation/git-credential-store.adoc (renamed from Documentation/git-credential-store.txt)0
-rw-r--r--Documentation/git-credential.adoc (renamed from Documentation/git-credential.txt)0
-rw-r--r--Documentation/git-cvsexportcommit.adoc (renamed from Documentation/git-cvsexportcommit.txt)0
-rw-r--r--Documentation/git-cvsimport.adoc (renamed from Documentation/git-cvsimport.txt)0
-rw-r--r--Documentation/git-cvsserver.adoc (renamed from Documentation/git-cvsserver.txt)0
-rw-r--r--Documentation/git-daemon.adoc (renamed from Documentation/git-daemon.txt)0
-rw-r--r--Documentation/git-describe.adoc (renamed from Documentation/git-describe.txt)0
-rw-r--r--Documentation/git-diagnose.adoc (renamed from Documentation/git-diagnose.txt)0
-rw-r--r--Documentation/git-diff-files.adoc (renamed from Documentation/git-diff-files.txt)4
-rw-r--r--Documentation/git-diff-index.adoc (renamed from Documentation/git-diff-index.txt)4
-rw-r--r--Documentation/git-diff-tree.adoc (renamed from Documentation/git-diff-tree.txt)8
-rw-r--r--Documentation/git-diff.adoc (renamed from Documentation/git-diff.txt)8
-rw-r--r--Documentation/git-difftool.adoc (renamed from Documentation/git-difftool.txt)4
-rw-r--r--Documentation/git-fast-export.adoc (renamed from Documentation/git-fast-export.txt)0
-rw-r--r--Documentation/git-fast-import.adoc (renamed from Documentation/git-fast-import.txt)4
-rw-r--r--Documentation/git-fetch-pack.adoc (renamed from Documentation/git-fetch-pack.txt)0
-rw-r--r--Documentation/git-fetch.adoc (renamed from Documentation/git-fetch.txt)12
-rw-r--r--Documentation/git-filter-branch.adoc (renamed from Documentation/git-filter-branch.txt)0
-rw-r--r--Documentation/git-fmt-merge-msg.adoc (renamed from Documentation/git-fmt-merge-msg.txt)2
-rw-r--r--Documentation/git-for-each-ref.adoc (renamed from Documentation/git-for-each-ref.txt)2
-rw-r--r--Documentation/git-for-each-repo.adoc (renamed from Documentation/git-for-each-repo.txt)0
-rw-r--r--Documentation/git-format-patch.adoc (renamed from Documentation/git-format-patch.txt)2
-rw-r--r--Documentation/git-fsck-objects.adoc (renamed from Documentation/git-fsck-objects.txt)0
-rw-r--r--Documentation/git-fsck.adoc (renamed from Documentation/git-fsck.txt)6
-rw-r--r--Documentation/git-fsmonitor--daemon.adoc (renamed from Documentation/git-fsmonitor--daemon.txt)4
-rw-r--r--Documentation/git-gc.adoc (renamed from Documentation/git-gc.txt)11
-rw-r--r--Documentation/git-get-tar-commit-id.adoc (renamed from Documentation/git-get-tar-commit-id.txt)0
-rw-r--r--Documentation/git-grep.adoc (renamed from Documentation/git-grep.txt)4
-rw-r--r--Documentation/git-gui.adoc (renamed from Documentation/git-gui.txt)0
-rw-r--r--Documentation/git-hash-object.adoc (renamed from Documentation/git-hash-object.txt)0
-rw-r--r--Documentation/git-help.adoc (renamed from Documentation/git-help.txt)0
-rw-r--r--Documentation/git-hook.adoc (renamed from Documentation/git-hook.txt)0
-rw-r--r--Documentation/git-http-backend.adoc (renamed from Documentation/git-http-backend.txt)4
-rw-r--r--Documentation/git-http-fetch.adoc (renamed from Documentation/git-http-fetch.txt)0
-rw-r--r--Documentation/git-http-push.adoc (renamed from Documentation/git-http-push.txt)0
-rw-r--r--Documentation/git-imap-send.adoc (renamed from Documentation/git-imap-send.txt)4
-rw-r--r--Documentation/git-index-pack.adoc (renamed from Documentation/git-index-pack.txt)2
-rw-r--r--Documentation/git-init-db.adoc (renamed from Documentation/git-init-db.txt)0
-rw-r--r--Documentation/git-init.adoc (renamed from Documentation/git-init.txt)8
-rw-r--r--Documentation/git-instaweb.adoc (renamed from Documentation/git-instaweb.txt)0
-rw-r--r--Documentation/git-interpret-trailers.adoc (renamed from Documentation/git-interpret-trailers.txt)137
-rw-r--r--Documentation/git-log.adoc (renamed from Documentation/git-log.txt)20
-rw-r--r--Documentation/git-ls-files.adoc (renamed from Documentation/git-ls-files.txt)0
-rw-r--r--Documentation/git-ls-remote.adoc (renamed from Documentation/git-ls-remote.txt)0
-rw-r--r--Documentation/git-ls-tree.adoc (renamed from Documentation/git-ls-tree.txt)0
-rw-r--r--Documentation/git-mailinfo.adoc (renamed from Documentation/git-mailinfo.txt)4
-rw-r--r--Documentation/git-mailsplit.adoc (renamed from Documentation/git-mailsplit.txt)0
-rw-r--r--Documentation/git-maintenance.adoc (renamed from Documentation/git-maintenance.txt)4
-rw-r--r--Documentation/git-merge-base.adoc (renamed from Documentation/git-merge-base.txt)0
-rw-r--r--Documentation/git-merge-file.adoc (renamed from Documentation/git-merge-file.txt)0
-rw-r--r--Documentation/git-merge-index.adoc (renamed from Documentation/git-merge-index.txt)0
-rw-r--r--Documentation/git-merge-one-file.adoc (renamed from Documentation/git-merge-one-file.txt)0
-rw-r--r--Documentation/git-merge-tree.adoc (renamed from Documentation/git-merge-tree.txt)11
-rw-r--r--Documentation/git-merge.adoc (renamed from Documentation/git-merge.txt)10
-rw-r--r--Documentation/git-mergetool--lib.adoc (renamed from Documentation/git-mergetool--lib.txt)0
-rw-r--r--Documentation/git-mergetool.adoc (renamed from Documentation/git-mergetool.txt)6
-rw-r--r--Documentation/git-mktag.adoc (renamed from Documentation/git-mktag.txt)0
-rw-r--r--Documentation/git-mktree.adoc (renamed from Documentation/git-mktree.txt)0
-rw-r--r--Documentation/git-multi-pack-index.adoc (renamed from Documentation/git-multi-pack-index.txt)0
-rw-r--r--Documentation/git-mv.adoc (renamed from Documentation/git-mv.txt)0
-rw-r--r--Documentation/git-name-rev.adoc (renamed from Documentation/git-name-rev.txt)0
-rw-r--r--Documentation/git-notes.adoc (renamed from Documentation/git-notes.txt)195
-rw-r--r--Documentation/git-p4.adoc (renamed from Documentation/git-p4.txt)0
-rw-r--r--Documentation/git-pack-objects.adoc (renamed from Documentation/git-pack-objects.txt)32
-rw-r--r--Documentation/git-pack-redundant.adoc (renamed from Documentation/git-pack-redundant.txt)0
-rw-r--r--Documentation/git-pack-refs.adoc (renamed from Documentation/git-pack-refs.txt)0
-rw-r--r--Documentation/git-patch-id.adoc (renamed from Documentation/git-patch-id.txt)0
-rw-r--r--Documentation/git-prune-packed.adoc (renamed from Documentation/git-prune-packed.txt)0
-rw-r--r--Documentation/git-prune.adoc (renamed from Documentation/git-prune.txt)0
-rw-r--r--Documentation/git-pull.adoc (renamed from Documentation/git-pull.txt)12
-rw-r--r--Documentation/git-push.adoc (renamed from Documentation/git-push.txt)8
-rw-r--r--Documentation/git-quiltimport.adoc (renamed from Documentation/git-quiltimport.txt)0
-rw-r--r--Documentation/git-range-diff.adoc (renamed from Documentation/git-range-diff.txt)0
-rw-r--r--Documentation/git-read-tree.adoc (renamed from Documentation/git-read-tree.txt)0
-rw-r--r--Documentation/git-rebase.adoc (renamed from Documentation/git-rebase.txt)18
-rw-r--r--Documentation/git-receive-pack.adoc (renamed from Documentation/git-receive-pack.txt)0
-rw-r--r--Documentation/git-reflog.adoc (renamed from Documentation/git-reflog.txt)0
-rw-r--r--Documentation/git-refs.adoc (renamed from Documentation/git-refs.txt)2
-rw-r--r--Documentation/git-remote-ext.adoc (renamed from Documentation/git-remote-ext.txt)0
-rw-r--r--Documentation/git-remote-fd.adoc (renamed from Documentation/git-remote-fd.txt)0
-rw-r--r--Documentation/git-remote-helpers.adoco (renamed from Documentation/git-remote-helpers.txto)0
-rw-r--r--Documentation/git-remote.adoc (renamed from Documentation/git-remote.txt)0
-rw-r--r--Documentation/git-repack.adoc (renamed from Documentation/git-repack.txt)9
-rw-r--r--Documentation/git-replace.adoc (renamed from Documentation/git-replace.txt)0
-rw-r--r--Documentation/git-replay.adoc (renamed from Documentation/git-replay.txt)2
-rw-r--r--Documentation/git-request-pull.adoc (renamed from Documentation/git-request-pull.txt)0
-rw-r--r--Documentation/git-rerere.adoc (renamed from Documentation/git-rerere.txt)0
-rw-r--r--Documentation/git-reset.adoc (renamed from Documentation/git-reset.txt)0
-rw-r--r--Documentation/git-restore.adoc (renamed from Documentation/git-restore.txt)110
-rw-r--r--Documentation/git-rev-list.adoc (renamed from Documentation/git-rev-list.txt)6
-rw-r--r--Documentation/git-rev-parse.adoc (renamed from Documentation/git-rev-parse.txt)2
-rw-r--r--Documentation/git-revert.adoc (renamed from Documentation/git-revert.txt)8
-rw-r--r--Documentation/git-rm.adoc (renamed from Documentation/git-rm.txt)0
-rw-r--r--Documentation/git-send-email.adoc (renamed from Documentation/git-send-email.txt)4
-rw-r--r--Documentation/git-send-pack.adoc (renamed from Documentation/git-send-pack.txt)0
-rw-r--r--Documentation/git-sh-i18n--envsubst.adoc (renamed from Documentation/git-sh-i18n--envsubst.txt)0
-rw-r--r--Documentation/git-sh-i18n.adoc (renamed from Documentation/git-sh-i18n.txt)0
-rw-r--r--Documentation/git-sh-setup.adoc (renamed from Documentation/git-sh-setup.txt)0
-rw-r--r--Documentation/git-shell.adoc (renamed from Documentation/git-shell.txt)0
-rw-r--r--Documentation/git-shortlog.adoc (renamed from Documentation/git-shortlog.txt)2
-rw-r--r--Documentation/git-show-branch.adoc (renamed from Documentation/git-show-branch.txt)4
-rw-r--r--Documentation/git-show-index.adoc (renamed from Documentation/git-show-index.txt)4
-rw-r--r--Documentation/git-show-ref.adoc (renamed from Documentation/git-show-ref.txt)0
-rw-r--r--Documentation/git-show.adoc (renamed from Documentation/git-show.txt)10
-rw-r--r--Documentation/git-sparse-checkout.adoc (renamed from Documentation/git-sparse-checkout.txt)0
-rw-r--r--Documentation/git-stage.adoc (renamed from Documentation/git-stage.txt)0
-rw-r--r--Documentation/git-stash.adoc (renamed from Documentation/git-stash.txt)4
-rw-r--r--Documentation/git-status.adoc (renamed from Documentation/git-status.txt)0
-rw-r--r--Documentation/git-stripspace.adoc (renamed from Documentation/git-stripspace.txt)0
-rw-r--r--Documentation/git-submodule.adoc (renamed from Documentation/git-submodule.txt)0
-rw-r--r--Documentation/git-svn.adoc (renamed from Documentation/git-svn.txt)0
-rw-r--r--Documentation/git-switch.adoc (renamed from Documentation/git-switch.txt)4
-rw-r--r--Documentation/git-symbolic-ref.adoc (renamed from Documentation/git-symbolic-ref.txt)0
-rw-r--r--Documentation/git-tag.adoc (renamed from Documentation/git-tag.txt)4
-rw-r--r--Documentation/git-tools.adoc (renamed from Documentation/git-tools.txt)0
-rw-r--r--Documentation/git-unpack-file.adoc (renamed from Documentation/git-unpack-file.txt)0
-rw-r--r--Documentation/git-unpack-objects.adoc (renamed from Documentation/git-unpack-objects.txt)0
-rw-r--r--Documentation/git-update-index.adoc (renamed from Documentation/git-update-index.txt)0
-rw-r--r--Documentation/git-update-ref.adoc (renamed from Documentation/git-update-ref.txt)0
-rw-r--r--Documentation/git-update-server-info.adoc (renamed from Documentation/git-update-server-info.txt)0
-rw-r--r--Documentation/git-upload-archive.adoc (renamed from Documentation/git-upload-archive.txt)0
-rw-r--r--Documentation/git-upload-pack.adoc (renamed from Documentation/git-upload-pack.txt)0
-rw-r--r--Documentation/git-var.adoc (renamed from Documentation/git-var.txt)0
-rw-r--r--Documentation/git-verify-commit.adoc (renamed from Documentation/git-verify-commit.txt)0
-rw-r--r--Documentation/git-verify-pack.adoc (renamed from Documentation/git-verify-pack.txt)0
-rw-r--r--Documentation/git-verify-tag.adoc (renamed from Documentation/git-verify-tag.txt)0
-rw-r--r--Documentation/git-version.adoc (renamed from Documentation/git-version.txt)0
-rw-r--r--Documentation/git-web--browse.adoc (renamed from Documentation/git-web--browse.txt)0
-rw-r--r--Documentation/git-whatchanged.adoc (renamed from Documentation/git-whatchanged.txt)0
-rw-r--r--Documentation/git-worktree.adoc (renamed from Documentation/git-worktree.txt)0
-rw-r--r--Documentation/git-write-tree.adoc (renamed from Documentation/git-write-tree.txt)0
-rw-r--r--Documentation/git.adoc (renamed from Documentation/git.txt)31
-rw-r--r--Documentation/gitattributes.adoc (renamed from Documentation/gitattributes.txt)6
-rw-r--r--Documentation/gitcli.adoc (renamed from Documentation/gitcli.txt)19
-rw-r--r--Documentation/gitcore-tutorial.adoc (renamed from Documentation/gitcore-tutorial.txt)0
-rw-r--r--Documentation/gitcredentials.adoc (renamed from Documentation/gitcredentials.txt)41
-rw-r--r--Documentation/gitcvs-migration.adoc (renamed from Documentation/gitcvs-migration.txt)0
-rw-r--r--Documentation/gitdiffcore.adoc (renamed from Documentation/gitdiffcore.txt)0
-rw-r--r--Documentation/giteveryday.adoc (renamed from Documentation/giteveryday.txt)0
-rw-r--r--Documentation/gitfaq.adoc (renamed from Documentation/gitfaq.txt)0
-rw-r--r--Documentation/gitformat-bundle.adoc (renamed from Documentation/gitformat-bundle.txt)0
-rw-r--r--Documentation/gitformat-chunk.adoc (renamed from Documentation/gitformat-chunk.txt)0
-rw-r--r--Documentation/gitformat-commit-graph.adoc (renamed from Documentation/gitformat-commit-graph.txt)0
-rw-r--r--Documentation/gitformat-index.adoc (renamed from Documentation/gitformat-index.txt)0
-rw-r--r--Documentation/gitformat-pack.adoc (renamed from Documentation/gitformat-pack.txt)0
-rw-r--r--Documentation/gitformat-signature.adoc (renamed from Documentation/gitformat-signature.txt)0
-rw-r--r--Documentation/gitglossary.adoc (renamed from Documentation/gitglossary.txt)2
-rw-r--r--Documentation/githooks.adoc (renamed from Documentation/githooks.txt)0
-rw-r--r--Documentation/gitignore.adoc (renamed from Documentation/gitignore.txt)0
-rw-r--r--Documentation/gitk.adoc (renamed from Documentation/gitk.txt)2
-rw-r--r--Documentation/gitmailmap.adoc (renamed from Documentation/gitmailmap.txt)0
-rw-r--r--Documentation/gitmodules.adoc (renamed from Documentation/gitmodules.txt)0
-rw-r--r--Documentation/gitnamespaces.adoc (renamed from Documentation/gitnamespaces.txt)2
-rw-r--r--Documentation/gitpacking.adoc (renamed from Documentation/gitpacking.txt)2
-rw-r--r--Documentation/gitprotocol-capabilities.adoc (renamed from Documentation/gitprotocol-capabilities.txt)0
-rw-r--r--Documentation/gitprotocol-common.adoc (renamed from Documentation/gitprotocol-common.txt)0
-rw-r--r--Documentation/gitprotocol-http.adoc (renamed from Documentation/gitprotocol-http.txt)0
-rw-r--r--Documentation/gitprotocol-pack.adoc (renamed from Documentation/gitprotocol-pack.txt)0
-rw-r--r--Documentation/gitprotocol-v2.adoc (renamed from Documentation/gitprotocol-v2.txt)0
-rw-r--r--Documentation/gitremote-helpers.adoc (renamed from Documentation/gitremote-helpers.txt)0
-rw-r--r--Documentation/gitrepository-layout.adoc (renamed from Documentation/gitrepository-layout.txt)9
-rw-r--r--Documentation/gitrevisions.adoc (renamed from Documentation/gitrevisions.txt)2
-rw-r--r--Documentation/gitsubmodules.adoc (renamed from Documentation/gitsubmodules.txt)0
-rw-r--r--Documentation/gittutorial-2.adoc (renamed from Documentation/gittutorial-2.txt)0
-rw-r--r--Documentation/gittutorial.adoc (renamed from Documentation/gittutorial.txt)0
-rw-r--r--Documentation/gitweb.adoc (renamed from Documentation/gitweb.txt)0
-rw-r--r--Documentation/gitweb.conf.adoc (renamed from Documentation/gitweb.conf.txt)0
-rw-r--r--Documentation/gitworkflows.adoc (renamed from Documentation/gitworkflows.txt)0
-rw-r--r--Documentation/glossary-content.adoc (renamed from Documentation/glossary-content.txt)0
-rw-r--r--Documentation/howto/coordinate-embargoed-releases.adoc (renamed from Documentation/howto/coordinate-embargoed-releases.txt)0
-rw-r--r--Documentation/howto/keep-canonical-history-correct.adoc (renamed from Documentation/howto/keep-canonical-history-correct.txt)0
-rw-r--r--Documentation/howto/maintain-git.adoc (renamed from Documentation/howto/maintain-git.txt)0
-rw-r--r--Documentation/howto/new-command.adoc (renamed from Documentation/howto/new-command.txt)0
-rw-r--r--Documentation/howto/rebase-from-internal-branch.adoc (renamed from Documentation/howto/rebase-from-internal-branch.txt)0
-rw-r--r--Documentation/howto/rebuild-from-update-hook.adoc (renamed from Documentation/howto/rebuild-from-update-hook.txt)0
-rw-r--r--Documentation/howto/recover-corrupted-blob-object.adoc (renamed from Documentation/howto/recover-corrupted-blob-object.txt)0
-rw-r--r--Documentation/howto/recover-corrupted-object-harder.adoc (renamed from Documentation/howto/recover-corrupted-object-harder.txt)0
-rw-r--r--Documentation/howto/revert-a-faulty-merge.adoc (renamed from Documentation/howto/revert-a-faulty-merge.txt)0
-rw-r--r--Documentation/howto/revert-branch-rebase.adoc (renamed from Documentation/howto/revert-branch-rebase.txt)0
-rw-r--r--Documentation/howto/separating-topic-branches.adoc (renamed from Documentation/howto/separating-topic-branches.txt)0
-rw-r--r--Documentation/howto/setup-git-server-over-http.adoc (renamed from Documentation/howto/setup-git-server-over-http.txt)0
-rw-r--r--Documentation/howto/update-hook-example.adoc (renamed from Documentation/howto/update-hook-example.txt)0
-rw-r--r--Documentation/howto/use-git-daemon.adoc (renamed from Documentation/howto/use-git-daemon.txt)0
-rw-r--r--Documentation/howto/using-merge-subtree.adoc (renamed from Documentation/howto/using-merge-subtree.txt)0
-rw-r--r--Documentation/howto/using-signed-tag-in-pull-request.adoc (renamed from Documentation/howto/using-signed-tag-in-pull-request.txt)0
-rw-r--r--Documentation/i18n.adoc (renamed from Documentation/i18n.txt)4
-rw-r--r--Documentation/includes/cmd-config-section-all.adoc (renamed from Documentation/includes/cmd-config-section-all.txt)0
-rw-r--r--Documentation/includes/cmd-config-section-rest.adoc (renamed from Documentation/includes/cmd-config-section-rest.txt)0
-rwxr-xr-xDocumentation/install-webdoc.sh16
-rw-r--r--Documentation/line-range-format.adoc (renamed from Documentation/line-range-format.txt)0
-rw-r--r--Documentation/line-range-options.adoc (renamed from Documentation/line-range-options.txt)2
-rwxr-xr-xDocumentation/lint-gitlink.perl4
-rwxr-xr-xDocumentation/lint-manpages.sh6
-rw-r--r--Documentation/merge-options.adoc (renamed from Documentation/merge-options.txt)2
-rw-r--r--Documentation/merge-strategies.adoc (renamed from Documentation/merge-strategies.txt)2
-rw-r--r--Documentation/mergetools/vimdiff.adoc (renamed from Documentation/mergetools/vimdiff.txt)0
-rw-r--r--Documentation/meson.build443
-rw-r--r--Documentation/object-format-disclaimer.adoc (renamed from Documentation/object-format-disclaimer.txt)0
-rw-r--r--Documentation/pretty-formats.adoc (renamed from Documentation/pretty-formats.txt)8
-rw-r--r--Documentation/pretty-options.adoc (renamed from Documentation/pretty-options.txt)0
-rw-r--r--Documentation/pull-fetch-param.adoc (renamed from Documentation/pull-fetch-param.txt)0
-rw-r--r--Documentation/ref-reachability-filters.adoc (renamed from Documentation/ref-reachability-filters.txt)0
-rw-r--r--Documentation/ref-storage-format.adoc (renamed from Documentation/ref-storage-format.txt)0
-rw-r--r--Documentation/rerere-options.adoc (renamed from Documentation/rerere-options.txt)0
-rw-r--r--Documentation/rev-list-description.adoc (renamed from Documentation/rev-list-description.txt)0
-rw-r--r--Documentation/rev-list-options.adoc (renamed from Documentation/rev-list-options.txt)21
-rw-r--r--Documentation/revisions.adoc (renamed from Documentation/revisions.txt)0
-rw-r--r--Documentation/scalar.adoc (renamed from Documentation/scalar.txt)0
-rw-r--r--Documentation/sequencer.adoc (renamed from Documentation/sequencer.txt)0
-rw-r--r--Documentation/signoff-option.adoc (renamed from Documentation/signoff-option.txt)8
-rw-r--r--Documentation/technical/.gitignore1
-rw-r--r--Documentation/technical/api-error-handling.adoc (renamed from Documentation/technical/api-error-handling.txt)0
-rw-r--r--Documentation/technical/api-index-skel.adoc (renamed from Documentation/technical/api-index-skel.txt)0
-rwxr-xr-xDocumentation/technical/api-index.sh8
-rw-r--r--Documentation/technical/api-merge.adoc (renamed from Documentation/technical/api-merge.txt)0
-rw-r--r--Documentation/technical/api-parse-options.adoc (renamed from Documentation/technical/api-parse-options.txt)0
-rw-r--r--Documentation/technical/api-path-walk.adoc72
-rw-r--r--Documentation/technical/api-simple-ipc.adoc (renamed from Documentation/technical/api-simple-ipc.txt)0
-rw-r--r--Documentation/technical/api-trace2.adoc (renamed from Documentation/technical/api-trace2.txt)2
-rw-r--r--Documentation/technical/bitmap-format.adoc (renamed from Documentation/technical/bitmap-format.txt)0
-rw-r--r--Documentation/technical/build-systems.adoc (renamed from Documentation/technical/build-systems.txt)0
-rw-r--r--Documentation/technical/bundle-uri.adoc (renamed from Documentation/technical/bundle-uri.txt)0
-rw-r--r--Documentation/technical/commit-graph.adoc (renamed from Documentation/technical/commit-graph.txt)0
-rw-r--r--Documentation/technical/directory-rename-detection.adoc (renamed from Documentation/technical/directory-rename-detection.txt)0
-rw-r--r--Documentation/technical/hash-function-transition.adoc (renamed from Documentation/technical/hash-function-transition.txt)0
-rw-r--r--Documentation/technical/long-running-process-protocol.adoc (renamed from Documentation/technical/long-running-process-protocol.txt)0
-rw-r--r--Documentation/technical/meson.build1
-rw-r--r--Documentation/technical/multi-pack-index.adoc (renamed from Documentation/technical/multi-pack-index.txt)0
-rw-r--r--Documentation/technical/pack-heuristics.adoc (renamed from Documentation/technical/pack-heuristics.txt)0
-rw-r--r--Documentation/technical/packfile-uri.adoc (renamed from Documentation/technical/packfile-uri.txt)0
-rw-r--r--Documentation/technical/parallel-checkout.adoc (renamed from Documentation/technical/parallel-checkout.txt)0
-rw-r--r--Documentation/technical/partial-clone.adoc (renamed from Documentation/technical/partial-clone.txt)0
-rw-r--r--Documentation/technical/platform-support.adoc (renamed from Documentation/technical/platform-support.txt)0
-rw-r--r--Documentation/technical/racy-git.adoc (renamed from Documentation/technical/racy-git.txt)0
-rw-r--r--Documentation/technical/reftable.adoc (renamed from Documentation/technical/reftable.txt)0
-rw-r--r--Documentation/technical/remembering-renames.adoc (renamed from Documentation/technical/remembering-renames.txt)0
-rw-r--r--Documentation/technical/repository-version.adoc (renamed from Documentation/technical/repository-version.txt)0
-rw-r--r--Documentation/technical/rerere.adoc (renamed from Documentation/technical/rerere.txt)0
-rw-r--r--Documentation/technical/scalar.adoc (renamed from Documentation/technical/scalar.txt)0
-rw-r--r--Documentation/technical/send-pack-pipeline.adoc (renamed from Documentation/technical/send-pack-pipeline.txt)0
-rw-r--r--Documentation/technical/shallow.adoc (renamed from Documentation/technical/shallow.txt)0
-rw-r--r--Documentation/technical/sparse-checkout.adoc (renamed from Documentation/technical/sparse-checkout.txt)0
-rw-r--r--Documentation/technical/sparse-index.adoc (renamed from Documentation/technical/sparse-index.txt)0
-rw-r--r--Documentation/technical/trivial-merge.adoc (renamed from Documentation/technical/trivial-merge.txt)0
-rw-r--r--Documentation/technical/unit-tests.adoc (renamed from Documentation/technical/unit-tests.txt)0
-rw-r--r--Documentation/trace2-target-values.adoc (renamed from Documentation/trace2-target-values.txt)0
-rw-r--r--Documentation/transfer-data-leaks.adoc (renamed from Documentation/transfer-data-leaks.txt)0
-rw-r--r--Documentation/urls-remotes.adoc (renamed from Documentation/urls-remotes.txt)2
-rw-r--r--Documentation/urls.adoc (renamed from Documentation/urls.txt)0
-rw-r--r--Documentation/user-manual.adoc (renamed from Documentation/user-manual.txt)2
-rw-r--r--GIT-BUILD-OPTIONS.in1
-rwxr-xr-xGIT-VERSION-GEN52
-rw-r--r--Makefile104
l---------RelNotes2
-rw-r--r--add-interactive.c19
-rw-r--r--add-patch.c2
-rw-r--r--apply.c3
-rw-r--r--archive-tar.c4
-rw-r--r--archive.c1
-rw-r--r--bisect.c11
-rw-r--r--builtin.h1
-rw-r--r--builtin/am.c9
-rw-r--r--builtin/backfill.c147
-rw-r--r--builtin/blame.c15
-rw-r--r--builtin/branch.c7
-rw-r--r--builtin/bugreport.c2
-rw-r--r--builtin/check-mailmap.c2
-rw-r--r--builtin/check-ref-format.c4
-rw-r--r--builtin/checkout--worker.c6
-rw-r--r--builtin/checkout-index.c6
-rw-r--r--builtin/clone.c350
-rw-r--r--builtin/commit-graph.c1
-rw-r--r--builtin/commit-tree.c4
-rw-r--r--builtin/commit.c10
-rw-r--r--builtin/credential-cache--daemon.c4
-rw-r--r--builtin/credential.c9
-rw-r--r--builtin/diagnose.c4
-rw-r--r--builtin/diff-files.c3
-rw-r--r--builtin/diff-index.c3
-rw-r--r--builtin/diff-tree.c3
-rw-r--r--builtin/difftool.c95
-rw-r--r--builtin/fast-import.c32
-rw-r--r--builtin/fetch-pack.c2
-rw-r--r--builtin/fetch.c29
-rw-r--r--builtin/for-each-ref.c1
-rw-r--r--builtin/fsck.c12
-rw-r--r--builtin/fsmonitor--daemon.c4
-rw-r--r--builtin/gc.c15
-rw-r--r--builtin/get-tar-commit-id.c4
-rw-r--r--builtin/grep.c4
-rw-r--r--builtin/help.c4
-rw-r--r--builtin/index-pack.c70
-rw-r--r--builtin/log.c57
-rw-r--r--builtin/ls-files.c4
-rw-r--r--builtin/mailinfo.c2
-rw-r--r--builtin/mailsplit.c4
-rw-r--r--builtin/merge-base.c4
-rw-r--r--builtin/merge-index.c7
-rw-r--r--builtin/merge-ours.c3
-rw-r--r--builtin/merge-recursive.c6
-rw-r--r--builtin/merge-tree.c11
-rw-r--r--builtin/merge.c4
-rw-r--r--builtin/pack-objects.c96
-rw-r--r--builtin/pack-redundant.c3
-rw-r--r--builtin/patch-id.c14
-rw-r--r--builtin/prune.c3
-rw-r--r--builtin/push.c2
-rw-r--r--builtin/rebase.c6
-rw-r--r--builtin/receive-pack.c26
-rw-r--r--builtin/remote-ext.c2
-rw-r--r--builtin/remote-fd.c1
-rw-r--r--builtin/remote.c7
-rw-r--r--builtin/repack.c16
-rw-r--r--builtin/replay.c7
-rw-r--r--builtin/rev-list.c112
-rw-r--r--builtin/rev-parse.c2
-rw-r--r--builtin/send-pack.c2
-rw-r--r--builtin/show-index.c2
-rw-r--r--builtin/tag.c1
-rw-r--r--builtin/unpack-file.c8
-rw-r--r--builtin/unpack-objects.c49
-rw-r--r--builtin/update-index.c4
-rw-r--r--builtin/update-server-info.c8
-rw-r--r--builtin/upload-archive.c6
-rw-r--r--builtin/upload-pack.c6
-rw-r--r--builtin/var.c3
-rw-r--r--builtin/verify-tag.c1
-rw-r--r--bulk-checkin.c28
-rw-r--r--bundle.c4
-rw-r--r--bundle.h2
-rwxr-xr-xci/install-dependencies.sh10
-rwxr-xr-xci/lib.sh44
-rwxr-xr-xci/print-test-failures.sh5
-rwxr-xr-xci/run-build-and-tests.sh8
-rw-r--r--combine-diff.c80
-rw-r--r--command-list.txt1
-rw-r--r--commit-graph.c20
-rw-r--r--commit-reach.c75
-rw-r--r--commit-reach.h10
-rw-r--r--commit.c4
-rw-r--r--commit.h2
-rw-r--r--common-exit.c26
-rw-r--r--common-init.c63
-rw-r--r--common-init.h6
-rw-r--r--common-main.c83
-rw-r--r--compat/bswap.h24
-rw-r--r--compat/mingw.c4
-rw-r--r--compat/zlib-compat.h53
-rw-r--r--compat/zlib-uncompress2.c96
-rw-r--r--config.c1
-rw-r--r--connect.c23
-rw-r--r--contrib/buildsystems/CMakeLists.txt1
-rw-r--r--contrib/completion/git-completion.bash17
-rw-r--r--contrib/credential/libsecret/Makefile3
-rw-r--r--contrib/credential/osxkeychain/Makefile1
-rw-r--r--contrib/credential/wincred/Makefile3
-rw-r--r--contrib/diff-highlight/Makefile3
-rw-r--r--contrib/diff-highlight/t/Makefile5
-rw-r--r--contrib/libgit-rs/Cargo.lock77
-rw-r--r--contrib/libgit-rs/Cargo.toml17
-rw-r--r--contrib/libgit-rs/README.md13
-rw-r--r--contrib/libgit-rs/build.rs4
-rw-r--r--contrib/libgit-rs/src/config.rs106
-rw-r--r--contrib/libgit-rs/src/lib.rs1
-rw-r--r--contrib/libgit-rs/testdata/config12
-rw-r--r--contrib/libgit-rs/testdata/config22
-rw-r--r--contrib/libgit-rs/testdata/config32
-rw-r--r--contrib/libgit-sys/Cargo.lock69
-rw-r--r--contrib/libgit-sys/Cargo.toml19
-rw-r--r--contrib/libgit-sys/README.md4
-rw-r--r--contrib/libgit-sys/build.rs35
-rw-r--r--contrib/libgit-sys/public_symbol_export.c59
-rw-r--r--contrib/libgit-sys/public_symbol_export.h18
-rw-r--r--contrib/libgit-sys/src/lib.rs79
-rw-r--r--contrib/meson.build4
-rw-r--r--contrib/mw-to-git/Makefile5
-rw-r--r--contrib/mw-to-git/t/Makefile3
-rw-r--r--contrib/persistent-https/Makefile5
-rw-r--r--contrib/subtree/.gitignore2
-rw-r--r--contrib/subtree/Makefile23
-rw-r--r--contrib/subtree/meson.build71
-rw-r--r--contrib/subtree/t/Makefile5
-rwxr-xr-xcontrib/thunderbird-patch-inline/appp.sh2
-rw-r--r--credential.c85
-rw-r--r--credential.h17
-rw-r--r--csum-file.c45
-rw-r--r--csum-file.h6
-rw-r--r--date.c6
-rw-r--r--delta-islands.c3
-rw-r--r--diagnose.c15
-rw-r--r--diagnose.h5
-rw-r--r--diff-lib.c36
-rw-r--r--diff.c42
-rw-r--r--diff.h20
-rw-r--r--diffcore-rename.c1
-rw-r--r--dir.c10
-rw-r--r--dir.h3
-rw-r--r--entry.c4
-rw-r--r--environment.c1
-rw-r--r--fetch-pack.c6
-rw-r--r--fsck.c2
-rwxr-xr-xgenerate-cmdlist.sh2
-rwxr-xr-xgenerate-configlist.sh2
-rwxr-xr-xgenerate-hooklist.sh2
-rw-r--r--git-compat-util.h14
-rw-r--r--git-gui/Makefile1
-rw-r--r--git-gui/po/glossary/Makefile3
-rwxr-xr-xgit-instaweb.sh4
-rwxr-xr-xgit-submodule.sh216
-rw-r--r--git-zlib.c7
-rw-r--r--git-zlib.h2
-rw-r--r--git.c13
-rw-r--r--gitk-git/Makefile5
-rwxr-xr-xgitk-git/generate-tcl.sh11
-rwxr-xr-xgitk-git/gitk213
-rw-r--r--gitk-git/meson.build30
-rw-r--r--gitk-git/po/meson.build19
-rw-r--r--graph.c3
-rw-r--r--hash.h71
-rw-r--r--help.c48
-rw-r--r--http-push.c6
-rw-r--r--http.c30
-rw-r--r--http.h2
-rw-r--r--imap-send.c10
-rw-r--r--log-tree.c2
-rw-r--r--mailinfo.c5
-rw-r--r--mailinfo.h4
-rw-r--r--match-trees.c50
-rw-r--r--meson.build198
-rw-r--r--meson_options.txt20
-rw-r--r--midx-write.c15
-rw-r--r--midx.c13
-rw-r--r--object-file.c237
-rw-r--r--object-name.c63
-rw-r--r--oss-fuzz/fuzz-parse-attr-line.c2
-rw-r--r--oss-fuzz/meson.build20
-rw-r--r--pack-bitmap-write.c6
-rw-r--r--pack-bitmap.c4
-rw-r--r--pack-check.c6
-rw-r--r--pack-objects.h28
-rw-r--r--pack-write.c100
-rw-r--r--pack.h33
-rw-r--r--packfile.c20
-rw-r--r--packfile.h6
-rw-r--r--pager.c14
-rw-r--r--pager.h7
-rw-r--r--parse-options.c53
-rw-r--r--parse-options.h13
-rw-r--r--path-walk.c609
-rw-r--r--path-walk.h80
-rw-r--r--perl/FromCPAN/Mail/meson.build1
-rw-r--r--perl/FromCPAN/meson.build1
-rw-r--r--perl/Git/LoadCPAN/Mail/meson.build1
-rw-r--r--perl/Git/LoadCPAN/meson.build1
-rw-r--r--perl/Git/SVN/Memoize/meson.build1
-rw-r--r--perl/Git/SVN/meson.build1
-rw-r--r--perl/Git/meson.build1
-rw-r--r--perl/meson.build1
-rw-r--r--po/bg.po357
-rw-r--r--po/de.po304
-rw-r--r--po/fr.po785
-rw-r--r--po/id.po338
-rw-r--r--po/sv.po413
-rw-r--r--po/tr.po293
-rw-r--r--po/uk.po599
-rw-r--r--po/vi.po336
-rw-r--r--po/zh_CN.po301
-rw-r--r--po/zh_TW.po667
-rw-r--r--preload-index.c4
-rw-r--r--prio-queue.h4
-rw-r--r--progress.c34
-rw-r--r--progress.h13
-rw-r--r--prune-packed.c3
-rw-r--r--pseudo-merge.c3
-rw-r--r--read-cache.c33
-rw-r--r--ref-filter.c119
-rw-r--r--ref-filter.h13
-rw-r--r--refs.c33
-rw-r--r--refs.h14
-rw-r--r--refs/files-backend.c3
-rw-r--r--refs/refs-internal.h3
-rw-r--r--refs/reftable-backend.c38
-rw-r--r--refspec.c213
-rw-r--r--refspec.h39
-rw-r--r--reftable/basics.c10
-rw-r--r--reftable/basics.h4
-rw-r--r--reftable/block.c21
-rw-r--r--reftable/block.h14
-rw-r--r--reftable/blocksource.c8
-rw-r--r--reftable/reader.c32
-rw-r--r--reftable/reader.h6
-rw-r--r--reftable/record.c125
-rw-r--r--reftable/record.h25
-rw-r--r--reftable/reftable-blocksource.h13
-rw-r--r--reftable/reftable-error.h1
-rw-r--r--reftable/reftable-record.h4
-rw-r--r--reftable/reftable-writer.h26
-rw-r--r--reftable/stack.c22
-rw-r--r--reftable/system.h3
-rw-r--r--reftable/writer.c22
-rw-r--r--remote-curl.c4
-rw-r--r--remote.c253
-rw-r--r--remote.h24
-rw-r--r--rerere.c18
-rw-r--r--resolve-undo.c14
-rw-r--r--resolve-undo.h6
-rw-r--r--scalar.c4
-rw-r--r--send-pack.c87
-rw-r--r--send-pack.h16
-rw-r--r--serve.c36
-rw-r--r--serve.h6
-rw-r--r--server-info.c40
-rw-r--r--server-info.h4
-rw-r--r--setup.c8
-rw-r--r--shallow.c40
-rw-r--r--shallow.h6
-rw-r--r--strbuf.c4
-rw-r--r--strbuf.h1
-rw-r--r--t/Makefile15
-rw-r--r--t/README4
-rw-r--r--t/helper/meson.build2
-rw-r--r--t/helper/test-csprng.c2
-rw-r--r--t/helper/test-hash-speed.c8
-rw-r--r--t/helper/test-hash.c10
-rw-r--r--t/helper/test-name-hash.c23
-rw-r--r--t/helper/test-path-walk.c132
-rw-r--r--t/helper/test-progress.c6
-rw-r--r--t/helper/test-reach.c6
-rw-r--r--t/helper/test-serve-v2.c7
-rw-r--r--t/helper/test-sha1.c7
-rwxr-xr-xt/helper/test-sha1.sh38
-rw-r--r--t/helper/test-sha256.c2
-rw-r--r--t/helper/test-simple-ipc.c4
-rw-r--r--t/helper/test-tool.c3
-rw-r--r--t/helper/test-tool.h5
-rw-r--r--t/interop/Makefile5
-rw-r--r--t/lib-credential.sh15
-rw-r--r--t/meson.build19
-rw-r--r--t/perf/Makefile5
-rwxr-xr-xt/perf/p5313-pack-objects.sh70
-rwxr-xr-xt/perf/p5314-name-hash.sh31
-rwxr-xr-xt/t0001-init.sh30
-rwxr-xr-xt/t0012-help.sh3
-rwxr-xr-xt/t0060-path-utils.sh10
-rwxr-xr-xt/t0210-trace2-normal.sh9
-rwxr-xr-xt/t0300-credentials.sh49
-rw-r--r--t/t0450/txt-help-mismatches1
-rwxr-xr-xt/t1006-cat-file.sh31
-rwxr-xr-xt/t1400-update-ref.sh9
-rwxr-xr-xt/t1460-refs-migrate.sh29
-rwxr-xr-xt/t3200-branch.sh14
-rwxr-xr-xt/t3203-branch-output.sh28
-rwxr-xr-xt/t4100-apply-stat.sh13
-rwxr-xr-xt/t4203-mailmap.sh12
-rwxr-xr-xt/t4209-log-pickaxe.sh16
-rwxr-xr-xt/t5300-pack-object.sh34
-rwxr-xr-xt/t5310-pack-bitmaps.sh35
-rwxr-xr-xt/t5323-pack-redundant.sh6
-rwxr-xr-xt/t5333-pseudo-merge-bitmaps.sh3
-rwxr-xr-xt/t5401-update-hooks.sh16
-rwxr-xr-xt/t5504-fetch-receive-strict.sh45
-rwxr-xr-xt/t5505-remote.sh16
-rwxr-xr-xt/t5510-fetch.sh37
-rwxr-xr-xt/t5515-fetch-merge-logic.sh47
-rwxr-xr-xt/t5516-fetch-push.sh14
-rwxr-xr-xt/t5541-http-push-smart.sh6
-rwxr-xr-xt/t5543-atomic-push.sh30
-rwxr-xr-xt/t5548-push-porcelain.sh443
-rwxr-xr-xt/t5550-http-fetch-dumb.sh14
-rwxr-xr-xt/t5551-http-fetch-smart.sh16
-rwxr-xr-xt/t5620-backfill.sh211
-rwxr-xr-xt/t5621-clone-revision.sh122
-rwxr-xr-xt/t6020-bundle-misc.sh6
-rwxr-xr-xt/t6022-rev-list-missing.sh53
-rwxr-xr-xt/t6120-describe.sh24
-rwxr-xr-xt/t6423-merge-rename-directories.sh9
-rwxr-xr-xt/t6500-gc.sh33
-rwxr-xr-xt/t6600-test-reach.sh29
-rwxr-xr-xt/t6601-path-walk.sh400
-rwxr-xr-xt/t7110-reset-merge.sh12
-rwxr-xr-xt/t7406-submodule-update.sh4
-rwxr-xr-xt/t7407-submodule-foreach.sh4
-rwxr-xr-xt/t7422-submodule-output.sh43
-rwxr-xr-xt/t7600-merge.sh2
-rwxr-xr-xt/t7603-merge-reduce-heads.sh24
-rwxr-xr-xt/t7700-repack.sh16
-rwxr-xr-xt/t7701-repack-unpack-unreachable.sh16
-rwxr-xr-xt/t8002-blame.sh26
-rwxr-xr-xt/t9003-help-autocorrect.sh17
-rw-r--r--t/test-lib-functions.sh38
-rw-r--r--t/test-lib.sh24
-rwxr-xr-xt/unit-tests/generate-clar-decls.sh1
-rw-r--r--t/unit-tests/t-example-decorate.c74
-rw-r--r--t/unit-tests/t-mem-pool.c31
-rw-r--r--t/unit-tests/t-prio-queue.c91
-rw-r--r--t/unit-tests/t-reftable-basics.c10
-rw-r--r--t/unit-tests/t-reftable-readwrite.c8
-rw-r--r--t/unit-tests/t-reftable-record.c19
-rw-r--r--t/unit-tests/t-reftable-stack.c54
-rw-r--r--t/unit-tests/t-strbuf.c122
-rw-r--r--t/unit-tests/t-strcmp-offset.c35
-rw-r--r--t/unit-tests/u-example-decorate.c64
-rw-r--r--t/unit-tests/u-hash.c (renamed from t/unit-tests/t-hash.c)77
-rw-r--r--t/unit-tests/u-hashmap.c (renamed from t/unit-tests/t-hashmap.c)226
-rw-r--r--t/unit-tests/u-mem-pool.c25
-rw-r--r--t/unit-tests/u-prio-queue.c94
-rw-r--r--t/unit-tests/u-reftable-tree.c (renamed from t/unit-tests/t-reftable-tree.c)30
-rw-r--r--t/unit-tests/u-strbuf.c119
-rw-r--r--t/unit-tests/u-strcmp-offset.c45
-rw-r--r--templates/Makefile5
-rw-r--r--tmp-objdir.c15
-rw-r--r--tmp-objdir.h5
-rw-r--r--trace.c9
-rw-r--r--trace.h4
-rw-r--r--trace2.c2
-rw-r--r--trace2/tr2_sid.c6
-rw-r--r--trace2/tr2_tgt_event.c3
-rw-r--r--trace2/tr2_tgt_normal.c5
-rw-r--r--trace2/tr2_tgt_perf.c5
-rw-r--r--transport.c20
-rw-r--r--tree-diff.c152
-rw-r--r--unix-socket.c4
-rw-r--r--unpack-trees.c4
-rw-r--r--usage.c27
-rw-r--r--version.c7
-rw-r--r--walker.c3
-rw-r--r--worktree.c41
-rw-r--r--wrapper.c24
-rw-r--r--wrapper.h16
-rw-r--r--xdiff/xdiffi.c3
-rw-r--r--xdiff/xemit.c2
-rw-r--r--xdiff/xhistogram.c8
-rw-r--r--xdiff/xinclude.h2
-rw-r--r--xdiff/xpatience.c3
-rw-r--r--xdiff/xutils.c4
1310 files changed, 12709 insertions, 5867 deletions
diff --git a/.editorconfig b/.editorconfig
index 15d6cbeab1..a3c578a43c 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -4,7 +4,7 @@ insert_final_newline = true
# The settings for C (*.c and *.h) files are mirrored in .clang-format. Keep
# them in sync.
-[{*.{c,h,sh,perl,pl,pm,txt},config.mak.*,Makefile}]
+[{*.{c,h,sh,perl,pl,pm,txt,adoc},config.mak.*,Makefile}]
indent_style = tab
tab_width = 8
diff --git a/.gitattributes b/.gitattributes
index 158c3d45c4..43fa883a84 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -7,7 +7,7 @@
*.py text eol=lf diff=python
*.bat text eol=crlf
CODE_OF_CONDUCT.md -whitespace
-/Documentation/**/*.txt text eol=lf
+/Documentation/**/*.adoc text eol=lf
/command-list.txt text eol=lf
/GIT-VERSION-GEN text eol=lf
/mergetools/* text eol=lf
diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml
index 48341e81f4..124301dbbe 100644
--- a/.github/workflows/coverity.yml
+++ b/.github/workflows/coverity.yml
@@ -45,7 +45,7 @@ jobs:
- run: ci/install-dependencies.sh
if: contains(matrix.os, 'ubuntu') || contains(matrix.os, 'macos')
env:
- distro: ${{ matrix.os }}
+ CI_JOB_IMAGE: ${{ matrix.os }}
# The Coverity site says the tool is usually updated twice yearly, so the
# MD5 of download can be used to determine whether there's been an update.
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 900be9957a..5f756dfc2e 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -248,6 +248,58 @@ jobs:
with:
name: failed-tests-windows-vs-${{ matrix.nr }}
path: ${{env.FAILED_TEST_ARTIFACTS}}
+
+ windows-meson-build:
+ name: win+Meson build
+ needs: ci-config
+ if: needs.ci-config.outputs.enabled == 'yes'
+ runs-on: windows-latest
+ concurrency:
+ group: windows-meson-build-${{ github.ref }}
+ cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v5
+ - name: Set up dependencies
+ shell: pwsh
+ run: pip install meson ninja
+ - name: Setup
+ shell: pwsh
+ run: meson setup build -Dperl=disabled
+ - name: Compile
+ shell: pwsh
+ run: meson compile -C build
+ - name: Upload build artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: windows-meson-artifacts
+ path: build
+ windows-meson-test:
+ name: win+Meson test
+ runs-on: windows-latest
+ needs: [ci-config, windows-meson-build]
+ strategy:
+ fail-fast: false
+ matrix:
+ nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+ concurrency:
+ group: windows-meson-test-${{ matrix.nr }}-${{ github.ref }}
+ cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v5
+ - name: Set up dependencies
+ shell: pwsh
+ run: pip install meson ninja
+ - name: Download build artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: windows-meson-artifacts
+ path: build
+ - name: Test
+ shell: pwsh
+ run: meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % 10 } | Where-Object Name -EQ ${{ matrix.nr }} | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group }
+
regular:
name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}})
needs: ci-config
@@ -259,20 +311,6 @@ jobs:
fail-fast: false
matrix:
vector:
- - jobname: linux-sha256
- cc: clang
- pool: ubuntu-latest
- - jobname: linux-reftable
- cc: clang
- pool: ubuntu-latest
- - jobname: linux-gcc
- cc: gcc
- cc_package: gcc-8
- pool: ubuntu-20.04
- - jobname: linux-TEST-vars
- cc: gcc
- cc_package: gcc-8
- pool: ubuntu-20.04
- jobname: osx-clang
cc: clang
pool: macos-13
@@ -285,26 +323,11 @@ jobs:
- jobname: osx-meson
cc: clang
pool: macos-13
- - jobname: linux-gcc-default
- cc: gcc
- pool: ubuntu-latest
- - jobname: linux-leaks
- cc: gcc
- pool: ubuntu-latest
- - jobname: linux-reftable-leaks
- cc: gcc
- pool: ubuntu-latest
- - jobname: linux-asan-ubsan
- cc: clang
- pool: ubuntu-latest
- - jobname: linux-meson
- cc: gcc
- pool: ubuntu-latest
env:
CC: ${{matrix.vector.cc}}
CC_PACKAGE: ${{matrix.vector.cc_package}}
jobname: ${{matrix.vector.jobname}}
- distro: ${{matrix.vector.pool}}
+ CI_JOB_IMAGE: ${{matrix.vector.pool}}
TEST_OUTPUT_DIRECTORY: ${{github.workspace}}/t
runs-on: ${{matrix.vector.pool}}
steps:
@@ -342,27 +365,48 @@ jobs:
fail-fast: false
matrix:
vector:
- - jobname: linux-musl
- image: alpine
- distro: alpine-latest
+ - jobname: linux-sha256
+ image: ubuntu:rolling
+ cc: clang
+ - jobname: linux-reftable
+ image: ubuntu:rolling
+ cc: clang
+ - jobname: linux-TEST-vars
+ image: ubuntu:20.04
+ cc: gcc
+ cc_package: gcc-8
+ - jobname: linux-breaking-changes
+ cc: gcc
+ image: ubuntu:rolling
+ - jobname: linux-leaks
+ image: ubuntu:rolling
+ cc: gcc
+ - jobname: linux-reftable-leaks
+ image: ubuntu:rolling
+ cc: gcc
+ - jobname: linux-asan-ubsan
+ image: ubuntu:rolling
+ cc: clang
+ - jobname: linux-meson
+ image: ubuntu:rolling
+ cc: gcc
+ - jobname: linux-musl-meson
+ image: alpine:latest
# Supported until 2025-04-02.
- jobname: linux32
image: i386/ubuntu:focal
- distro: ubuntu32-20.04
- jobname: pedantic
- image: fedora
- distro: fedora-latest
+ image: fedora:latest
# A RHEL 8 compatible distro. Supported until 2029-05-31.
- jobname: almalinux-8
image: almalinux:8
- distro: almalinux-8
# Supported until 2026-08-31.
- jobname: debian-11
image: debian:11
- distro: debian-11
env:
jobname: ${{matrix.vector.jobname}}
- distro: ${{matrix.vector.distro}}
+ CC: ${{matrix.vector.cc}}
+ CI_JOB_IMAGE: ${{matrix.vector.image}}
runs-on: ubuntu-latest
container: ${{matrix.vector.image}}
steps:
@@ -371,10 +415,12 @@ jobs:
run: apt -q update && apt -q -y install libc6-amd64 lib64stdc++6
- uses: actions/checkout@v4
- run: ci/install-dependencies.sh
- - run: ci/run-build-and-tests.sh
+ - run: useradd builder --create-home
+ - run: chown -R builder .
+ - run: sudo --preserve-env --set-home --user=builder ci/run-build-and-tests.sh
- name: print test failures
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
- run: ci/print-test-failures.sh
+ run: sudo --preserve-env --set-home --user=builder ci/print-test-failures.sh
- name: Upload failed tests' directories
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
uses: actions/upload-artifact@v4
diff --git a/.gitignore b/.gitignore
index e82aa19df0..08a66ca508 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,7 @@
/git-apply
/git-archimport
/git-archive
+/git-backfill
/git-bisect
/git-blame
/git-branch
@@ -250,3 +251,5 @@ Release/
/git.VC.db
*.dSYM
/contrib/buildsystems/out
+/contrib/libgit-rs/target
+/contrib/libgit-sys/target
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9254e01583..3f29181708 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -36,41 +36,36 @@ test:linux:
fi
parallel:
matrix:
- - jobname: linux-old
- image: ubuntu:20.04
- CC: gcc
- jobname: linux-sha256
- image: ubuntu:latest
+ image: ubuntu:rolling
CC: clang
- jobname: linux-reftable
- image: ubuntu:latest
+ image: ubuntu:rolling
CC: clang
- - jobname: linux-gcc
+ - jobname: linux-breaking-changes
image: ubuntu:20.04
CC: gcc
- CC_PACKAGE: gcc-8
- jobname: linux-TEST-vars
image: ubuntu:20.04
CC: gcc
CC_PACKAGE: gcc-8
- - jobname: linux-gcc-default
- image: ubuntu:latest
- CC: gcc
- jobname: linux-leaks
- image: ubuntu:latest
+ image: ubuntu:rolling
CC: gcc
- jobname: linux-reftable-leaks
- image: ubuntu:latest
+ image: ubuntu:rolling
CC: gcc
- jobname: linux-asan-ubsan
- image: ubuntu:latest
+ image: ubuntu:rolling
CC: clang
- jobname: pedantic
image: fedora:latest
- - jobname: linux-musl
+ - jobname: linux-musl-meson
image: alpine:latest
+ - jobname: linux32
+ image: i386/ubuntu:20.04
- jobname: linux-meson
- image: ubuntu:latest
+ image: ubuntu:rolling
CC: gcc
artifacts:
paths:
@@ -149,6 +144,44 @@ test:mingw64:
- git-sdk/usr/bin/bash.exe -l -c 'ci/print-test-failures.sh'
parallel: 10
+.msvc-meson:
+ tags:
+ - saas-windows-medium-amd64
+ before_script:
+ - choco install -y git meson ninja openssl
+ - Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1
+ - refreshenv
+ # The certificate store for Python on Windows is broken and fails to fetch
+ # certificates, see https://bugs.python.org/issue36011. This seems to
+ # mostly be an issue with how the GitLab image is set up as it is a
+ # non-issue on GitHub Actions. Work around the issue by importing
+ # cetrificates manually.
+ - Invoke-WebRequest https://curl.haxx.se/ca/cacert.pem -OutFile cacert.pem
+ - openssl pkcs12 -export -nokeys -in cacert.pem -out certs.pfx -passout "pass:"
+ - Import-PfxCertificate -CertStoreLocation Cert:\LocalMachine\Root -FilePath certs.pfx
+
+build:msvc-meson:
+ extends: .msvc-meson
+ stage: build
+ script:
+ - meson setup build -Dperl=disabled
+ - meson compile -C build
+ artifacts:
+ paths:
+ - build
+
+test:msvc-meson:
+ extends: .msvc-meson
+ stage: test
+ when: manual
+ timeout: 6h
+ needs:
+ - job: "build:msvc-meson"
+ artifacts: true
+ script:
+ - meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % $Env:CI_NODE_TOTAL + 1 } | Where-Object Name -EQ $Env:CI_NODE_INDEX | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group }
+ parallel: 10
+
test:fuzz-smoke-tests:
image: ubuntu:latest
stage: test
@@ -183,7 +216,7 @@ check-whitespace:
# be defined in all pipelines.
script:
- |
- R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} || exit
+ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA:-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} || exit
./ci/check-whitespace.sh "$R"
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
@@ -203,7 +236,7 @@ check-style:
# be defined in all pipelines.
script:
- |
- R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} || exit
+ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA:-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} || exit
./ci/run-style-check.sh "$R"
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
diff --git a/Documentation/.gitignore b/Documentation/.gitignore
index 9f4bb3c4bf..dd54cc768a 100644
--- a/Documentation/.gitignore
+++ b/Documentation/.gitignore
@@ -6,11 +6,11 @@
*.pdf
git.info
gitman.info
-howto-index.txt
+howto-index.adoc
doc.dep
-cmds-*.txt
-mergetools-*.txt
-SubmittingPatches.txt
+cmds-*.adoc
+mergetools-*.adoc
+SubmittingPatches.adoc
tmp-doc-diff/
tmp-meson-diff/
GIT-ASCIIDOCFLAGS
diff --git a/Documentation/BreakingChanges.txt b/Documentation/BreakingChanges.adoc
index 27acff86db..7c388e56c8 100644
--- a/Documentation/BreakingChanges.txt
+++ b/Documentation/BreakingChanges.adoc
@@ -154,6 +154,31 @@ Cf. <xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com>,
<CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com>,
<20230323204047.GA9290@coredump.intra.peff.net>,
+* Support for storing shorthands for remote URLs in "$GIT_COMMON_DIR/branches/"
+ and "$GIT_COMMON_DIR/remotes/" has been long superseded by storing remotes in
+ the repository configuration.
++
+The mechanism has originally been introduced in f170e4b39d ([PATCH] fetch/pull:
+short-hand notation for remote repositories., 2005-07-16) and was superseded by
+6687f8fea2 ([PATCH] Use .git/remote/origin, not .git/branches/origin.,
+2005-08-20), where we switched from ".git/branches/" to ".git/remotes/". That
+commit already mentions an upcoming deprecation of the ".git/branches/"
+directory, and starting with a1d4aa7424 (Add repository-layout document.,
+2005-09-01) we have also marked this layout as deprecated. Eventually we also
+started to migrate away from ".git/remotes/" in favor of config-based remotes,
+and we have marked the directory as legacy in 3d3d282146 (Documentation:
+Grammar correction, wording fixes and cleanup, 2011-08-23)
++
+As our documentation mentions, these directories are not to be found in modern
+repositories at all and most users aren't even aware of these mechanisms. They
+have been deprecated for almost 20 years and 14 years respectively, and we are
+not aware of any active users that have complained about this deprecation.
+Furthermore, the ".git/branches/" directory is nowadays misleadingly named and
+may cause confusion as "branches" are almost exclusively used in the context of
+references.
++
+These features will be removed.
+
== Superseded features that will not be deprecated
Some features have gained newer replacements that aim to improve the design in
diff --git a/Documentation/DecisionMaking.txt b/Documentation/DecisionMaking.adoc
index b43c472ae5..b43c472ae5 100644
--- a/Documentation/DecisionMaking.txt
+++ b/Documentation/DecisionMaking.adoc
diff --git a/Documentation/Makefile b/Documentation/Makefile
index aedfe99d1d..c9a7cf662f 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -1,3 +1,6 @@
+# The default target of this Makefile is...
+all::
+
# Import tree-wide shared Makefile behavior and libraries
include ../shared.mak
@@ -17,56 +20,56 @@ OBSOLETE_HTML =
-include GIT-EXCLUDED-PROGRAMS
MAN1_TXT += $(filter-out \
- $(patsubst %,%.txt,$(EXCLUDED_PROGRAMS)) \
- $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
- $(wildcard git-*.txt))
-MAN1_TXT += git.txt
-MAN1_TXT += gitk.txt
-MAN1_TXT += gitweb.txt
-MAN1_TXT += scalar.txt
+ $(patsubst %,%.adoc,$(EXCLUDED_PROGRAMS)) \
+ $(addsuffix .adoc, $(ARTICLES) $(SP_ARTICLES)), \
+ $(wildcard git-*.adoc))
+MAN1_TXT += git.adoc
+MAN1_TXT += gitk.adoc
+MAN1_TXT += gitweb.adoc
+MAN1_TXT += scalar.adoc
# man5 / man7 guides (note: new guides should also be added to command-list.txt)
-MAN5_TXT += gitattributes.txt
-MAN5_TXT += gitformat-bundle.txt
-MAN5_TXT += gitformat-chunk.txt
-MAN5_TXT += gitformat-commit-graph.txt
-MAN5_TXT += gitformat-index.txt
-MAN5_TXT += gitformat-pack.txt
-MAN5_TXT += gitformat-signature.txt
-MAN5_TXT += githooks.txt
-MAN5_TXT += gitignore.txt
-MAN5_TXT += gitmailmap.txt
-MAN5_TXT += gitmodules.txt
-MAN5_TXT += gitprotocol-capabilities.txt
-MAN5_TXT += gitprotocol-common.txt
-MAN5_TXT += gitprotocol-http.txt
-MAN5_TXT += gitprotocol-pack.txt
-MAN5_TXT += gitprotocol-v2.txt
-MAN5_TXT += gitrepository-layout.txt
-MAN5_TXT += gitweb.conf.txt
-
-MAN7_TXT += gitcli.txt
-MAN7_TXT += gitcore-tutorial.txt
-MAN7_TXT += gitcredentials.txt
-MAN7_TXT += gitcvs-migration.txt
-MAN7_TXT += gitdiffcore.txt
-MAN7_TXT += giteveryday.txt
-MAN7_TXT += gitfaq.txt
-MAN7_TXT += gitglossary.txt
-MAN7_TXT += gitpacking.txt
-MAN7_TXT += gitnamespaces.txt
-MAN7_TXT += gitremote-helpers.txt
-MAN7_TXT += gitrevisions.txt
-MAN7_TXT += gitsubmodules.txt
-MAN7_TXT += gittutorial-2.txt
-MAN7_TXT += gittutorial.txt
-MAN7_TXT += gitworkflows.txt
-
-HOWTO_TXT += $(wildcard howto/*.txt)
-
-DOC_DEP_TXT += $(wildcard *.txt)
-DOC_DEP_TXT += $(wildcard config/*.txt)
-DOC_DEP_TXT += $(wildcard includes/*.txt)
+MAN5_TXT += gitattributes.adoc
+MAN5_TXT += gitformat-bundle.adoc
+MAN5_TXT += gitformat-chunk.adoc
+MAN5_TXT += gitformat-commit-graph.adoc
+MAN5_TXT += gitformat-index.adoc
+MAN5_TXT += gitformat-pack.adoc
+MAN5_TXT += gitformat-signature.adoc
+MAN5_TXT += githooks.adoc
+MAN5_TXT += gitignore.adoc
+MAN5_TXT += gitmailmap.adoc
+MAN5_TXT += gitmodules.adoc
+MAN5_TXT += gitprotocol-capabilities.adoc
+MAN5_TXT += gitprotocol-common.adoc
+MAN5_TXT += gitprotocol-http.adoc
+MAN5_TXT += gitprotocol-pack.adoc
+MAN5_TXT += gitprotocol-v2.adoc
+MAN5_TXT += gitrepository-layout.adoc
+MAN5_TXT += gitweb.conf.adoc
+
+MAN7_TXT += gitcli.adoc
+MAN7_TXT += gitcore-tutorial.adoc
+MAN7_TXT += gitcredentials.adoc
+MAN7_TXT += gitcvs-migration.adoc
+MAN7_TXT += gitdiffcore.adoc
+MAN7_TXT += giteveryday.adoc
+MAN7_TXT += gitfaq.adoc
+MAN7_TXT += gitglossary.adoc
+MAN7_TXT += gitpacking.adoc
+MAN7_TXT += gitnamespaces.adoc
+MAN7_TXT += gitremote-helpers.adoc
+MAN7_TXT += gitrevisions.adoc
+MAN7_TXT += gitsubmodules.adoc
+MAN7_TXT += gittutorial-2.adoc
+MAN7_TXT += gittutorial.adoc
+MAN7_TXT += gitworkflows.adoc
+
+HOWTO_TXT += $(wildcard howto/*.adoc)
+
+DOC_DEP_TXT += $(wildcard *.adoc)
+DOC_DEP_TXT += $(wildcard config/*.adoc)
+DOC_DEP_TXT += $(wildcard includes/*.adoc)
ifdef MAN_FILTER
MAN_TXT = $(filter $(MAN_FILTER),$(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT))
@@ -75,8 +78,8 @@ MAN_TXT = $(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT)
MAN_FILTER = $(MAN_TXT)
endif
-MAN_XML = $(patsubst %.txt,%.xml,$(MAN_TXT))
-MAN_HTML = $(patsubst %.txt,%.html,$(MAN_TXT))
+MAN_XML = $(patsubst %.adoc,%.xml,$(MAN_TXT))
+MAN_HTML = $(patsubst %.adoc,%.html,$(MAN_TXT))
GIT_MAN_REF = master
OBSOLETE_HTML += everyday.html
@@ -103,7 +106,7 @@ SP_ARTICLES += howto/rebase-from-internal-branch
SP_ARTICLES += howto/keep-canonical-history-correct
SP_ARTICLES += howto/maintain-git
SP_ARTICLES += howto/coordinate-embargoed-releases
-API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt)))
+API_DOCS = $(patsubst %.adoc,%,$(filter-out technical/api-index-skel.adoc technical/api-index.adoc, $(wildcard technical/api-*.adoc)))
SP_ARTICLES += $(API_DOCS)
TECH_DOCS += DecisionMaking
@@ -136,9 +139,9 @@ ARTICLES_HTML += $(patsubst %,%.html,$(ARTICLES) $(SP_ARTICLES))
HTML_FILTER ?= $(ARTICLES_HTML) $(OBSOLETE_HTML)
DOC_HTML = $(MAN_HTML) $(filter $(HTML_FILTER),$(ARTICLES_HTML) $(OBSOLETE_HTML))
-DOC_MAN1 = $(patsubst %.txt,%.1,$(filter $(MAN_FILTER),$(MAN1_TXT)))
-DOC_MAN5 = $(patsubst %.txt,%.5,$(filter $(MAN_FILTER),$(MAN5_TXT)))
-DOC_MAN7 = $(patsubst %.txt,%.7,$(filter $(MAN_FILTER),$(MAN7_TXT)))
+DOC_MAN1 = $(patsubst %.adoc,%.1,$(filter $(MAN_FILTER),$(MAN1_TXT)))
+DOC_MAN5 = $(patsubst %.adoc,%.5,$(filter $(MAN_FILTER),$(MAN5_TXT)))
+DOC_MAN7 = $(patsubst %.adoc,%.7,$(filter $(MAN_FILTER),$(MAN7_TXT)))
prefix ?= $(HOME)
bindir ?= $(prefix)/bin
@@ -238,7 +241,7 @@ DEFAULT_EDITOR_SQ = $(subst ','\'',$(DEFAULT_EDITOR))
ASCIIDOC_EXTRA += -a 'git-default-editor=$(DEFAULT_EDITOR_SQ)'
endif
-all: html man
+all:: html man
html: $(DOC_HTML)
@@ -278,7 +281,7 @@ install-pdf: pdf
install-html: html
'$(SHELL_PATH_SQ)' ./install-webdoc.sh $(DESTDIR)$(htmldir)
-mergetools_txt = mergetools-diff.txt mergetools-merge.txt
+mergetools_txt = mergetools-diff.adoc mergetools-merge.adoc
#
# Determine "include::" file references in asciidoc files.
@@ -294,18 +297,18 @@ ifneq ($(MAKECMDGOALS),clean)
-include doc.dep
endif
-cmds_txt = cmds-ancillaryinterrogators.txt \
- cmds-ancillarymanipulators.txt \
- cmds-mainporcelain.txt \
- cmds-plumbinginterrogators.txt \
- cmds-plumbingmanipulators.txt \
- cmds-synchingrepositories.txt \
- cmds-synchelpers.txt \
- cmds-guide.txt \
- cmds-developerinterfaces.txt \
- cmds-userinterfaces.txt \
- cmds-purehelpers.txt \
- cmds-foreignscminterface.txt
+cmds_txt = cmds-ancillaryinterrogators.adoc \
+ cmds-ancillarymanipulators.adoc \
+ cmds-mainporcelain.adoc \
+ cmds-plumbinginterrogators.adoc \
+ cmds-plumbingmanipulators.adoc \
+ cmds-synchingrepositories.adoc \
+ cmds-synchelpers.adoc \
+ cmds-guide.adoc \
+ cmds-developerinterfaces.adoc \
+ cmds-userinterfaces.adoc \
+ cmds-purehelpers.adoc \
+ cmds-foreignscminterface.adoc
$(cmds_txt): cmd-list.made
@@ -313,10 +316,10 @@ cmd-list.made: cmd-list.perl ../command-list.txt $(MAN1_TXT)
$(QUIET_GEN)$(PERL_PATH) ./cmd-list.perl .. . $(cmds_txt) && \
date >$@
-mergetools-%.txt: generate-mergetool-list.sh ../git-mergetool--lib.sh $(wildcard ../mergetools/*)
-mergetools-diff.txt:
+mergetools-%.adoc: generate-mergetool-list.sh ../git-mergetool--lib.sh $(wildcard ../mergetools/*)
+mergetools-diff.adoc:
$(QUIET_GEN)$(SHELL_PATH) ./generate-mergetool-list.sh .. diff $@
-mergetools-merge.txt:
+mergetools-merge.adoc:
$(QUIET_GEN)$(SHELL_PATH) ./generate-mergetool-list.sh .. merge $@
TRACK_ASCIIDOCFLAGS = $(subst ','\'',$(ASCIIDOC_COMMON):$(ASCIIDOC_HTML):$(ASCIIDOC_DOCBOOK))
@@ -333,9 +336,9 @@ clean:
$(RM) *.xml *.xml+ *.html *.html+ *.1 *.5 *.7
$(RM) *.texi *.texi+ *.texi++ git.info gitman.info
$(RM) *.pdf
- $(RM) howto-index.txt howto/*.html doc.dep
- $(RM) technical/*.html technical/api-index.txt
- $(RM) SubmittingPatches.txt
+ $(RM) howto-index.adoc howto/*.html doc.dep
+ $(RM) technical/*.html technical/api-index.adoc
+ $(RM) SubmittingPatches.adoc
$(RM) $(cmds_txt) $(mergetools_txt) *.made
$(RM) GIT-ASCIIDOCFLAGS
$(RM) asciidoc.conf asciidoctor-extensions.rb
@@ -344,10 +347,10 @@ clean:
docinfo.html: docinfo-html.in
$(QUIET_GEN)$(RM) $@ && cat $< >$@
-$(MAN_HTML): %.html : %.txt $(ASCIIDOC_DEPS)
+$(MAN_HTML): %.html : %.adoc $(ASCIIDOC_DEPS)
$(QUIET_ASCIIDOC)$(TXT_TO_HTML) -d manpage -o $@ $<
-$(OBSOLETE_HTML): %.html : %.txto $(ASCIIDOC_DEPS)
+$(OBSOLETE_HTML): %.html : %.adoco $(ASCIIDOC_DEPS)
$(QUIET_ASCIIDOC)$(TXT_TO_HTML) -o $@ $<
manpage-prereqs := $(wildcard manpage*.xsl)
@@ -360,22 +363,22 @@ manpage-cmd = $(QUIET_XMLTO)$(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
%.7 : %.xml $(manpage-prereqs)
$(manpage-cmd)
-%.xml : %.txt $(ASCIIDOC_DEPS)
+%.xml : %.adoc $(ASCIIDOC_DEPS)
$(QUIET_ASCIIDOC)$(TXT_TO_XML) -d manpage -o $@ $<
-user-manual.xml: user-manual.txt $(ASCIIDOC_DEPS)
+user-manual.xml: user-manual.adoc $(ASCIIDOC_DEPS)
$(QUIET_ASCIIDOC)$(TXT_TO_XML) -d book -o $@ $<
-technical/api-index.txt: technical/api-index-skel.txt \
- technical/api-index.sh $(patsubst %,%.txt,$(API_DOCS))
- $(QUIET_GEN)'$(SHELL_PATH_SQ)' technical/api-index.sh ./technical ./technical/api-index.txt
+technical/api-index.adoc: technical/api-index-skel.adoc \
+ technical/api-index.sh $(patsubst %,%.adoc,$(API_DOCS))
+ $(QUIET_GEN)'$(SHELL_PATH_SQ)' technical/api-index.sh ./technical ./technical/api-index.adoc
technical/%.html: ASCIIDOC_EXTRA += -a git-relative-html-prefix=../
-$(patsubst %,%.html,$(API_DOCS) technical/api-index $(TECH_DOCS)): %.html : %.txt \
+$(patsubst %,%.html,$(API_DOCS) technical/api-index $(TECH_DOCS)): %.html : %.adoc \
$(ASCIIDOC_DEPS)
- $(QUIET_ASCIIDOC)$(TXT_TO_HTML) $*.txt
+ $(QUIET_ASCIIDOC)$(TXT_TO_HTML) $*.adoc
-SubmittingPatches.txt: SubmittingPatches
+SubmittingPatches.adoc: SubmittingPatches
$(QUIET_GEN) cp $< $@
XSLT = docbook.xsl
@@ -409,19 +412,19 @@ gitman.texi: $(MAN_XML) cat-texi.perl texi.xsl
gitman.info: gitman.texi
$(QUIET_MAKEINFO)$(MAKEINFO) --no-split --no-validate $<
-$(patsubst %.txt,%.texi,$(MAN_TXT)): %.texi : %.xml
+$(patsubst %.adoc,%.texi,$(MAN_TXT)): %.texi : %.xml
$(QUIET_DB2TEXI)$(DOCBOOK2X_TEXI) --to-stdout $*.xml >$@
-howto-index.txt: howto/howto-index.sh $(HOWTO_TXT)
+howto-index.adoc: howto/howto-index.sh $(HOWTO_TXT)
$(QUIET_GEN)'$(SHELL_PATH_SQ)' ./howto/howto-index.sh $(sort $(HOWTO_TXT)) >$@
-$(patsubst %,%.html,$(ARTICLES)) : %.html : %.txt $(ASCIIDOC_DEPS)
- $(QUIET_ASCIIDOC)$(TXT_TO_HTML) $*.txt
+$(patsubst %,%.html,$(ARTICLES)) : %.html : %.adoc $(ASCIIDOC_DEPS)
+ $(QUIET_ASCIIDOC)$(TXT_TO_HTML) $*.adoc
WEBDOC_DEST = /pub/software/scm/git/docs
howto/%.html: ASCIIDOC_EXTRA += -a git-relative-html-prefix=../
-$(patsubst %.txt,%.html,$(HOWTO_TXT)): %.html : %.txt $(ASCIIDOC_DEPS)
+$(patsubst %.adoc,%.html,$(HOWTO_TXT)): %.html : %.adoc $(ASCIIDOC_DEPS)
$(QUIET_ASCIIDOC) \
sed -e '1,/^$$/d' $< | \
$(TXT_TO_HTML) - >$@
@@ -452,9 +455,9 @@ print-man1:
@for i in $(MAN1_TXT); do echo $$i; done
## Lint: gitlink
-LINT_DOCS_GITLINK = $(patsubst %.txt,.build/lint-docs/gitlink/%.ok,$(HOWTO_TXT) $(DOC_DEP_TXT))
+LINT_DOCS_GITLINK = $(patsubst %.adoc,.build/lint-docs/gitlink/%.ok,$(HOWTO_TXT) $(DOC_DEP_TXT))
$(LINT_DOCS_GITLINK): lint-gitlink.perl
-$(LINT_DOCS_GITLINK): .build/lint-docs/gitlink/%.ok: %.txt
+$(LINT_DOCS_GITLINK): .build/lint-docs/gitlink/%.ok: %.adoc
$(call mkdir_p_parent_template)
$(QUIET_LINT_GITLINK)$(PERL_PATH) lint-gitlink.perl \
$< \
@@ -466,17 +469,17 @@ $(LINT_DOCS_GITLINK): .build/lint-docs/gitlink/%.ok: %.txt
lint-docs-gitlink: $(LINT_DOCS_GITLINK)
## Lint: man-end-blurb
-LINT_DOCS_MAN_END_BLURB = $(patsubst %.txt,.build/lint-docs/man-end-blurb/%.ok,$(MAN_TXT))
+LINT_DOCS_MAN_END_BLURB = $(patsubst %.adoc,.build/lint-docs/man-end-blurb/%.ok,$(MAN_TXT))
$(LINT_DOCS_MAN_END_BLURB): lint-man-end-blurb.perl
-$(LINT_DOCS_MAN_END_BLURB): .build/lint-docs/man-end-blurb/%.ok: %.txt
+$(LINT_DOCS_MAN_END_BLURB): .build/lint-docs/man-end-blurb/%.ok: %.adoc
$(call mkdir_p_parent_template)
$(QUIET_LINT_MANEND)$(PERL_PATH) lint-man-end-blurb.perl $< >$@
.PHONY: lint-docs-man-end-blurb
## Lint: man-section-order
-LINT_DOCS_MAN_SECTION_ORDER = $(patsubst %.txt,.build/lint-docs/man-section-order/%.ok,$(MAN_TXT))
+LINT_DOCS_MAN_SECTION_ORDER = $(patsubst %.adoc,.build/lint-docs/man-section-order/%.ok,$(MAN_TXT))
$(LINT_DOCS_MAN_SECTION_ORDER): lint-man-section-order.perl
-$(LINT_DOCS_MAN_SECTION_ORDER): .build/lint-docs/man-section-order/%.ok: %.txt
+$(LINT_DOCS_MAN_SECTION_ORDER): .build/lint-docs/man-section-order/%.ok: %.adoc
$(call mkdir_p_parent_template)
$(QUIET_LINT_MANSEC)$(PERL_PATH) lint-man-section-order.perl $< >$@
.PHONY: lint-docs-man-section-order
@@ -485,10 +488,10 @@ lint-docs-man-section-order: $(LINT_DOCS_MAN_SECTION_ORDER)
.PHONY: lint-docs-fsck-msgids
LINT_DOCS_FSCK_MSGIDS = .build/lint-docs/fsck-msgids.ok
$(LINT_DOCS_FSCK_MSGIDS): lint-fsck-msgids.perl
-$(LINT_DOCS_FSCK_MSGIDS): ../fsck.h fsck-msgids.txt
+$(LINT_DOCS_FSCK_MSGIDS): ../fsck.h fsck-msgids.adoc
$(call mkdir_p_parent_template)
$(QUIET_GEN)$(PERL_PATH) lint-fsck-msgids.perl \
- ../fsck.h fsck-msgids.txt $@
+ ../fsck.h fsck-msgids.adoc $@
lint-docs-fsck-msgids: $(LINT_DOCS_FSCK_MSGIDS)
@@ -501,11 +504,11 @@ lint-docs-meson:
@mkdir -p tmp-meson-diff && \
awk "/^manpages = {$$/ {flag=1 ; next } /^}$$/ { flag=0 } flag { gsub(/^ \047/, \"\"); gsub(/\047 : [157],\$$/, \"\"); print }" meson.build | \
grep -v -e '#' -e '^$$' | \
- sort >tmp-meson-diff/meson.txt && \
- ls git*.txt scalar.txt | grep -v -e git-bisect-lk2009.txt -e git-tools.txt >tmp-meson-diff/actual.txt && \
- if ! cmp tmp-meson-diff/meson.txt tmp-meson-diff/actual.txt; then \
+ sort >tmp-meson-diff/meson.adoc && \
+ ls git*.adoc scalar.adoc | grep -v -e git-bisect-lk2009.adoc -e git-tools.adoc >tmp-meson-diff/actual.adoc && \
+ if ! cmp tmp-meson-diff/meson.adoc tmp-meson-diff/actual.adoc; then \
echo "Meson man pages differ from actual man pages:"; \
- diff -u tmp-meson-diff/meson.txt tmp-meson-diff/actual.txt; \
+ diff -u tmp-meson-diff/meson.adoc tmp-meson-diff/actual.adoc; \
exit 1; \
fi
diff --git a/Documentation/MyFirstContribution.txt b/Documentation/MyFirstContribution.adoc
index e41654c00a..e41654c00a 100644
--- a/Documentation/MyFirstContribution.txt
+++ b/Documentation/MyFirstContribution.adoc
diff --git a/Documentation/MyFirstObjectWalk.txt b/Documentation/MyFirstObjectWalk.adoc
index dec8afe5b1..dec8afe5b1 100644
--- a/Documentation/MyFirstObjectWalk.txt
+++ b/Documentation/MyFirstObjectWalk.adoc
diff --git a/Documentation/RelNotes/1.5.0.1.txt b/Documentation/RelNotes/1.5.0.1.adoc
index fea3f9935b..fea3f9935b 100644
--- a/Documentation/RelNotes/1.5.0.1.txt
+++ b/Documentation/RelNotes/1.5.0.1.adoc
diff --git a/Documentation/RelNotes/1.5.0.2.txt b/Documentation/RelNotes/1.5.0.2.adoc
index b061e50ff0..b061e50ff0 100644
--- a/Documentation/RelNotes/1.5.0.2.txt
+++ b/Documentation/RelNotes/1.5.0.2.adoc
diff --git a/Documentation/RelNotes/1.5.0.3.txt b/Documentation/RelNotes/1.5.0.3.adoc
index cd500f96bf..cd500f96bf 100644
--- a/Documentation/RelNotes/1.5.0.3.txt
+++ b/Documentation/RelNotes/1.5.0.3.adoc
diff --git a/Documentation/RelNotes/1.5.0.4.txt b/Documentation/RelNotes/1.5.0.4.adoc
index feefa5dfd4..feefa5dfd4 100644
--- a/Documentation/RelNotes/1.5.0.4.txt
+++ b/Documentation/RelNotes/1.5.0.4.adoc
diff --git a/Documentation/RelNotes/1.5.0.5.txt b/Documentation/RelNotes/1.5.0.5.adoc
index eeec3d73d0..eeec3d73d0 100644
--- a/Documentation/RelNotes/1.5.0.5.txt
+++ b/Documentation/RelNotes/1.5.0.5.adoc
diff --git a/Documentation/RelNotes/1.5.0.6.txt b/Documentation/RelNotes/1.5.0.6.adoc
index c02015ad5f..c02015ad5f 100644
--- a/Documentation/RelNotes/1.5.0.6.txt
+++ b/Documentation/RelNotes/1.5.0.6.adoc
diff --git a/Documentation/RelNotes/1.5.0.7.txt b/Documentation/RelNotes/1.5.0.7.adoc
index 670ad32b85..670ad32b85 100644
--- a/Documentation/RelNotes/1.5.0.7.txt
+++ b/Documentation/RelNotes/1.5.0.7.adoc
diff --git a/Documentation/RelNotes/1.5.0.txt b/Documentation/RelNotes/1.5.0.adoc
index d6d42f3183..d6d42f3183 100644
--- a/Documentation/RelNotes/1.5.0.txt
+++ b/Documentation/RelNotes/1.5.0.adoc
diff --git a/Documentation/RelNotes/1.5.1.1.txt b/Documentation/RelNotes/1.5.1.1.adoc
index 91471213bd..91471213bd 100644
--- a/Documentation/RelNotes/1.5.1.1.txt
+++ b/Documentation/RelNotes/1.5.1.1.adoc
diff --git a/Documentation/RelNotes/1.5.1.2.txt b/Documentation/RelNotes/1.5.1.2.adoc
index d88456306c..d88456306c 100644
--- a/Documentation/RelNotes/1.5.1.2.txt
+++ b/Documentation/RelNotes/1.5.1.2.adoc
diff --git a/Documentation/RelNotes/1.5.1.3.txt b/Documentation/RelNotes/1.5.1.3.adoc
index 876408b65a..876408b65a 100644
--- a/Documentation/RelNotes/1.5.1.3.txt
+++ b/Documentation/RelNotes/1.5.1.3.adoc
diff --git a/Documentation/RelNotes/1.5.1.4.txt b/Documentation/RelNotes/1.5.1.4.adoc
index df2f66ccb5..df2f66ccb5 100644
--- a/Documentation/RelNotes/1.5.1.4.txt
+++ b/Documentation/RelNotes/1.5.1.4.adoc
diff --git a/Documentation/RelNotes/1.5.1.5.txt b/Documentation/RelNotes/1.5.1.5.adoc
index b0ab8eb371..b0ab8eb371 100644
--- a/Documentation/RelNotes/1.5.1.5.txt
+++ b/Documentation/RelNotes/1.5.1.5.adoc
diff --git a/Documentation/RelNotes/1.5.1.6.txt b/Documentation/RelNotes/1.5.1.6.adoc
index 55f3ac13e3..55f3ac13e3 100644
--- a/Documentation/RelNotes/1.5.1.6.txt
+++ b/Documentation/RelNotes/1.5.1.6.adoc
diff --git a/Documentation/RelNotes/1.5.1.txt b/Documentation/RelNotes/1.5.1.adoc
index daed367270..daed367270 100644
--- a/Documentation/RelNotes/1.5.1.txt
+++ b/Documentation/RelNotes/1.5.1.adoc
diff --git a/Documentation/RelNotes/1.5.2.1.txt b/Documentation/RelNotes/1.5.2.1.adoc
index d41984df0b..d41984df0b 100644
--- a/Documentation/RelNotes/1.5.2.1.txt
+++ b/Documentation/RelNotes/1.5.2.1.adoc
diff --git a/Documentation/RelNotes/1.5.2.2.txt b/Documentation/RelNotes/1.5.2.2.adoc
index 7bfa341750..7bfa341750 100644
--- a/Documentation/RelNotes/1.5.2.2.txt
+++ b/Documentation/RelNotes/1.5.2.2.adoc
diff --git a/Documentation/RelNotes/1.5.2.3.txt b/Documentation/RelNotes/1.5.2.3.adoc
index addb22955b..addb22955b 100644
--- a/Documentation/RelNotes/1.5.2.3.txt
+++ b/Documentation/RelNotes/1.5.2.3.adoc
diff --git a/Documentation/RelNotes/1.5.2.4.txt b/Documentation/RelNotes/1.5.2.4.adoc
index 75cff475f6..75cff475f6 100644
--- a/Documentation/RelNotes/1.5.2.4.txt
+++ b/Documentation/RelNotes/1.5.2.4.adoc
diff --git a/Documentation/RelNotes/1.5.2.5.txt b/Documentation/RelNotes/1.5.2.5.adoc
index e8281c72a0..e8281c72a0 100644
--- a/Documentation/RelNotes/1.5.2.5.txt
+++ b/Documentation/RelNotes/1.5.2.5.adoc
diff --git a/Documentation/RelNotes/1.5.2.txt b/Documentation/RelNotes/1.5.2.adoc
index e8328d090a..e8328d090a 100644
--- a/Documentation/RelNotes/1.5.2.txt
+++ b/Documentation/RelNotes/1.5.2.adoc
diff --git a/Documentation/RelNotes/1.5.3.1.txt b/Documentation/RelNotes/1.5.3.1.adoc
index 7ff546c743..7ff546c743 100644
--- a/Documentation/RelNotes/1.5.3.1.txt
+++ b/Documentation/RelNotes/1.5.3.1.adoc
diff --git a/Documentation/RelNotes/1.5.3.2.txt b/Documentation/RelNotes/1.5.3.2.adoc
index 4bbde3cab4..4bbde3cab4 100644
--- a/Documentation/RelNotes/1.5.3.2.txt
+++ b/Documentation/RelNotes/1.5.3.2.adoc
diff --git a/Documentation/RelNotes/1.5.3.3.txt b/Documentation/RelNotes/1.5.3.3.adoc
index d213846951..d213846951 100644
--- a/Documentation/RelNotes/1.5.3.3.txt
+++ b/Documentation/RelNotes/1.5.3.3.adoc
diff --git a/Documentation/RelNotes/1.5.3.4.txt b/Documentation/RelNotes/1.5.3.4.adoc
index b04b3a45a5..b04b3a45a5 100644
--- a/Documentation/RelNotes/1.5.3.4.txt
+++ b/Documentation/RelNotes/1.5.3.4.adoc
diff --git a/Documentation/RelNotes/1.5.3.5.txt b/Documentation/RelNotes/1.5.3.5.adoc
index 7ff1d5d0d1..7ff1d5d0d1 100644
--- a/Documentation/RelNotes/1.5.3.5.txt
+++ b/Documentation/RelNotes/1.5.3.5.adoc
diff --git a/Documentation/RelNotes/1.5.3.6.txt b/Documentation/RelNotes/1.5.3.6.adoc
index 069a2b2cf9..069a2b2cf9 100644
--- a/Documentation/RelNotes/1.5.3.6.txt
+++ b/Documentation/RelNotes/1.5.3.6.adoc
diff --git a/Documentation/RelNotes/1.5.3.7.txt b/Documentation/RelNotes/1.5.3.7.adoc
index 2f690616c8..2f690616c8 100644
--- a/Documentation/RelNotes/1.5.3.7.txt
+++ b/Documentation/RelNotes/1.5.3.7.adoc
diff --git a/Documentation/RelNotes/1.5.3.8.txt b/Documentation/RelNotes/1.5.3.8.adoc
index 0e3ff58a46..0e3ff58a46 100644
--- a/Documentation/RelNotes/1.5.3.8.txt
+++ b/Documentation/RelNotes/1.5.3.8.adoc
diff --git a/Documentation/RelNotes/1.5.3.txt b/Documentation/RelNotes/1.5.3.adoc
index 0668d3c0ca..0668d3c0ca 100644
--- a/Documentation/RelNotes/1.5.3.txt
+++ b/Documentation/RelNotes/1.5.3.adoc
diff --git a/Documentation/RelNotes/1.5.4.1.txt b/Documentation/RelNotes/1.5.4.1.adoc
index d4e44b8b09..d4e44b8b09 100644
--- a/Documentation/RelNotes/1.5.4.1.txt
+++ b/Documentation/RelNotes/1.5.4.1.adoc
diff --git a/Documentation/RelNotes/1.5.4.2.txt b/Documentation/RelNotes/1.5.4.2.adoc
index 21d0df59fb..21d0df59fb 100644
--- a/Documentation/RelNotes/1.5.4.2.txt
+++ b/Documentation/RelNotes/1.5.4.2.adoc
diff --git a/Documentation/RelNotes/1.5.4.3.txt b/Documentation/RelNotes/1.5.4.3.adoc
index b0fc67fb2a..b0fc67fb2a 100644
--- a/Documentation/RelNotes/1.5.4.3.txt
+++ b/Documentation/RelNotes/1.5.4.3.adoc
diff --git a/Documentation/RelNotes/1.5.4.4.txt b/Documentation/RelNotes/1.5.4.4.adoc
index 323c1a88c7..323c1a88c7 100644
--- a/Documentation/RelNotes/1.5.4.4.txt
+++ b/Documentation/RelNotes/1.5.4.4.adoc
diff --git a/Documentation/RelNotes/1.5.4.5.txt b/Documentation/RelNotes/1.5.4.5.adoc
index bbd130e36d..bbd130e36d 100644
--- a/Documentation/RelNotes/1.5.4.5.txt
+++ b/Documentation/RelNotes/1.5.4.5.adoc
diff --git a/Documentation/RelNotes/1.5.4.6.txt b/Documentation/RelNotes/1.5.4.6.adoc
index 3e3c3e55a3..3e3c3e55a3 100644
--- a/Documentation/RelNotes/1.5.4.6.txt
+++ b/Documentation/RelNotes/1.5.4.6.adoc
diff --git a/Documentation/RelNotes/1.5.4.7.txt b/Documentation/RelNotes/1.5.4.7.adoc
index 9065a0e273..9065a0e273 100644
--- a/Documentation/RelNotes/1.5.4.7.txt
+++ b/Documentation/RelNotes/1.5.4.7.adoc
diff --git a/Documentation/RelNotes/1.5.4.txt b/Documentation/RelNotes/1.5.4.adoc
index f1323b6174..f1323b6174 100644
--- a/Documentation/RelNotes/1.5.4.txt
+++ b/Documentation/RelNotes/1.5.4.adoc
diff --git a/Documentation/RelNotes/1.5.5.1.txt b/Documentation/RelNotes/1.5.5.1.adoc
index 7de419708f..7de419708f 100644
--- a/Documentation/RelNotes/1.5.5.1.txt
+++ b/Documentation/RelNotes/1.5.5.1.adoc
diff --git a/Documentation/RelNotes/1.5.5.2.txt b/Documentation/RelNotes/1.5.5.2.adoc
index 391a7b02ea..391a7b02ea 100644
--- a/Documentation/RelNotes/1.5.5.2.txt
+++ b/Documentation/RelNotes/1.5.5.2.adoc
diff --git a/Documentation/RelNotes/1.5.5.3.txt b/Documentation/RelNotes/1.5.5.3.adoc
index f22f98b734..f22f98b734 100644
--- a/Documentation/RelNotes/1.5.5.3.txt
+++ b/Documentation/RelNotes/1.5.5.3.adoc
diff --git a/Documentation/RelNotes/1.5.5.4.txt b/Documentation/RelNotes/1.5.5.4.adoc
index 2d0279ecce..2d0279ecce 100644
--- a/Documentation/RelNotes/1.5.5.4.txt
+++ b/Documentation/RelNotes/1.5.5.4.adoc
diff --git a/Documentation/RelNotes/1.5.5.5.txt b/Documentation/RelNotes/1.5.5.5.adoc
index 30fa3615c7..30fa3615c7 100644
--- a/Documentation/RelNotes/1.5.5.5.txt
+++ b/Documentation/RelNotes/1.5.5.5.adoc
diff --git a/Documentation/RelNotes/1.5.5.6.txt b/Documentation/RelNotes/1.5.5.6.adoc
index d5e85cb70e..d5e85cb70e 100644
--- a/Documentation/RelNotes/1.5.5.6.txt
+++ b/Documentation/RelNotes/1.5.5.6.adoc
diff --git a/Documentation/RelNotes/1.5.5.txt b/Documentation/RelNotes/1.5.5.adoc
index 2932212488..2932212488 100644
--- a/Documentation/RelNotes/1.5.5.txt
+++ b/Documentation/RelNotes/1.5.5.adoc
diff --git a/Documentation/RelNotes/1.5.6.1.txt b/Documentation/RelNotes/1.5.6.1.adoc
index 4864b16445..4864b16445 100644
--- a/Documentation/RelNotes/1.5.6.1.txt
+++ b/Documentation/RelNotes/1.5.6.1.adoc
diff --git a/Documentation/RelNotes/1.5.6.2.txt b/Documentation/RelNotes/1.5.6.2.adoc
index 5902a85a78..5902a85a78 100644
--- a/Documentation/RelNotes/1.5.6.2.txt
+++ b/Documentation/RelNotes/1.5.6.2.adoc
diff --git a/Documentation/RelNotes/1.5.6.3.txt b/Documentation/RelNotes/1.5.6.3.adoc
index f61dd3504a..f61dd3504a 100644
--- a/Documentation/RelNotes/1.5.6.3.txt
+++ b/Documentation/RelNotes/1.5.6.3.adoc
diff --git a/Documentation/RelNotes/1.5.6.4.txt b/Documentation/RelNotes/1.5.6.4.adoc
index d8968f1ecb..d8968f1ecb 100644
--- a/Documentation/RelNotes/1.5.6.4.txt
+++ b/Documentation/RelNotes/1.5.6.4.adoc
diff --git a/Documentation/RelNotes/1.5.6.5.txt b/Documentation/RelNotes/1.5.6.5.adoc
index 47ca172462..47ca172462 100644
--- a/Documentation/RelNotes/1.5.6.5.txt
+++ b/Documentation/RelNotes/1.5.6.5.adoc
diff --git a/Documentation/RelNotes/1.5.6.6.txt b/Documentation/RelNotes/1.5.6.6.adoc
index 79da23db5a..79da23db5a 100644
--- a/Documentation/RelNotes/1.5.6.6.txt
+++ b/Documentation/RelNotes/1.5.6.6.adoc
diff --git a/Documentation/RelNotes/1.5.6.txt b/Documentation/RelNotes/1.5.6.adoc
index e143d8d61b..e143d8d61b 100644
--- a/Documentation/RelNotes/1.5.6.txt
+++ b/Documentation/RelNotes/1.5.6.adoc
diff --git a/Documentation/RelNotes/1.6.0.1.txt b/Documentation/RelNotes/1.6.0.1.adoc
index 49d7a1cafa..49d7a1cafa 100644
--- a/Documentation/RelNotes/1.6.0.1.txt
+++ b/Documentation/RelNotes/1.6.0.1.adoc
diff --git a/Documentation/RelNotes/1.6.0.2.txt b/Documentation/RelNotes/1.6.0.2.adoc
index 7d8fb85e1b..7d8fb85e1b 100644
--- a/Documentation/RelNotes/1.6.0.2.txt
+++ b/Documentation/RelNotes/1.6.0.2.adoc
diff --git a/Documentation/RelNotes/1.6.0.3.txt b/Documentation/RelNotes/1.6.0.3.adoc
index ad36c0f0b7..ad36c0f0b7 100644
--- a/Documentation/RelNotes/1.6.0.3.txt
+++ b/Documentation/RelNotes/1.6.0.3.adoc
diff --git a/Documentation/RelNotes/1.6.0.4.txt b/Documentation/RelNotes/1.6.0.4.adoc
index d522661d31..d522661d31 100644
--- a/Documentation/RelNotes/1.6.0.4.txt
+++ b/Documentation/RelNotes/1.6.0.4.adoc
diff --git a/Documentation/RelNotes/1.6.0.5.txt b/Documentation/RelNotes/1.6.0.5.adoc
index a08bb96738..a08bb96738 100644
--- a/Documentation/RelNotes/1.6.0.5.txt
+++ b/Documentation/RelNotes/1.6.0.5.adoc
diff --git a/Documentation/RelNotes/1.6.0.6.txt b/Documentation/RelNotes/1.6.0.6.adoc
index 64ece1ffd5..64ece1ffd5 100644
--- a/Documentation/RelNotes/1.6.0.6.txt
+++ b/Documentation/RelNotes/1.6.0.6.adoc
diff --git a/Documentation/RelNotes/1.6.0.txt b/Documentation/RelNotes/1.6.0.adoc
index de7ef166b6..de7ef166b6 100644
--- a/Documentation/RelNotes/1.6.0.txt
+++ b/Documentation/RelNotes/1.6.0.adoc
diff --git a/Documentation/RelNotes/1.6.1.1.txt b/Documentation/RelNotes/1.6.1.1.adoc
index 8c594ba02f..8c594ba02f 100644
--- a/Documentation/RelNotes/1.6.1.1.txt
+++ b/Documentation/RelNotes/1.6.1.1.adoc
diff --git a/Documentation/RelNotes/1.6.1.2.txt b/Documentation/RelNotes/1.6.1.2.adoc
index be37cbb858..be37cbb858 100644
--- a/Documentation/RelNotes/1.6.1.2.txt
+++ b/Documentation/RelNotes/1.6.1.2.adoc
diff --git a/Documentation/RelNotes/1.6.1.3.txt b/Documentation/RelNotes/1.6.1.3.adoc
index cd08d8174e..cd08d8174e 100644
--- a/Documentation/RelNotes/1.6.1.3.txt
+++ b/Documentation/RelNotes/1.6.1.3.adoc
diff --git a/Documentation/RelNotes/1.6.1.4.txt b/Documentation/RelNotes/1.6.1.4.adoc
index ccbad794c0..ccbad794c0 100644
--- a/Documentation/RelNotes/1.6.1.4.txt
+++ b/Documentation/RelNotes/1.6.1.4.adoc
diff --git a/Documentation/RelNotes/1.6.1.txt b/Documentation/RelNotes/1.6.1.adoc
index 7b152a6fdc..7b152a6fdc 100644
--- a/Documentation/RelNotes/1.6.1.txt
+++ b/Documentation/RelNotes/1.6.1.adoc
diff --git a/Documentation/RelNotes/1.6.2.1.txt b/Documentation/RelNotes/1.6.2.1.adoc
index dfa36416af..dfa36416af 100644
--- a/Documentation/RelNotes/1.6.2.1.txt
+++ b/Documentation/RelNotes/1.6.2.1.adoc
diff --git a/Documentation/RelNotes/1.6.2.2.txt b/Documentation/RelNotes/1.6.2.2.adoc
index fafa9986b0..fafa9986b0 100644
--- a/Documentation/RelNotes/1.6.2.2.txt
+++ b/Documentation/RelNotes/1.6.2.2.adoc
diff --git a/Documentation/RelNotes/1.6.2.3.txt b/Documentation/RelNotes/1.6.2.3.adoc
index 4d3c1ac91c..4d3c1ac91c 100644
--- a/Documentation/RelNotes/1.6.2.3.txt
+++ b/Documentation/RelNotes/1.6.2.3.adoc
diff --git a/Documentation/RelNotes/1.6.2.4.txt b/Documentation/RelNotes/1.6.2.4.adoc
index f4bf1d0986..f4bf1d0986 100644
--- a/Documentation/RelNotes/1.6.2.4.txt
+++ b/Documentation/RelNotes/1.6.2.4.adoc
diff --git a/Documentation/RelNotes/1.6.2.5.txt b/Documentation/RelNotes/1.6.2.5.adoc
index b23f9e95d1..b23f9e95d1 100644
--- a/Documentation/RelNotes/1.6.2.5.txt
+++ b/Documentation/RelNotes/1.6.2.5.adoc
diff --git a/Documentation/RelNotes/1.6.2.txt b/Documentation/RelNotes/1.6.2.adoc
index 166d73c60f..166d73c60f 100644
--- a/Documentation/RelNotes/1.6.2.txt
+++ b/Documentation/RelNotes/1.6.2.adoc
diff --git a/Documentation/RelNotes/1.6.3.1.txt b/Documentation/RelNotes/1.6.3.1.adoc
index 2400b72ef7..2400b72ef7 100644
--- a/Documentation/RelNotes/1.6.3.1.txt
+++ b/Documentation/RelNotes/1.6.3.1.adoc
diff --git a/Documentation/RelNotes/1.6.3.2.txt b/Documentation/RelNotes/1.6.3.2.adoc
index b2f3f0293c..b2f3f0293c 100644
--- a/Documentation/RelNotes/1.6.3.2.txt
+++ b/Documentation/RelNotes/1.6.3.2.adoc
diff --git a/Documentation/RelNotes/1.6.3.3.txt b/Documentation/RelNotes/1.6.3.3.adoc
index 1c28398bb6..1c28398bb6 100644
--- a/Documentation/RelNotes/1.6.3.3.txt
+++ b/Documentation/RelNotes/1.6.3.3.adoc
diff --git a/Documentation/RelNotes/1.6.3.4.txt b/Documentation/RelNotes/1.6.3.4.adoc
index cad461bc76..cad461bc76 100644
--- a/Documentation/RelNotes/1.6.3.4.txt
+++ b/Documentation/RelNotes/1.6.3.4.adoc
diff --git a/Documentation/RelNotes/1.6.3.txt b/Documentation/RelNotes/1.6.3.adoc
index bbf177fc3c..bbf177fc3c 100644
--- a/Documentation/RelNotes/1.6.3.txt
+++ b/Documentation/RelNotes/1.6.3.adoc
diff --git a/Documentation/RelNotes/1.6.4.1.txt b/Documentation/RelNotes/1.6.4.1.adoc
index e439e45b96..e439e45b96 100644
--- a/Documentation/RelNotes/1.6.4.1.txt
+++ b/Documentation/RelNotes/1.6.4.1.adoc
diff --git a/Documentation/RelNotes/1.6.4.2.txt b/Documentation/RelNotes/1.6.4.2.adoc
index c11ec0115c..c11ec0115c 100644
--- a/Documentation/RelNotes/1.6.4.2.txt
+++ b/Documentation/RelNotes/1.6.4.2.adoc
diff --git a/Documentation/RelNotes/1.6.4.3.txt b/Documentation/RelNotes/1.6.4.3.adoc
index 5643e6537d..5643e6537d 100644
--- a/Documentation/RelNotes/1.6.4.3.txt
+++ b/Documentation/RelNotes/1.6.4.3.adoc
diff --git a/Documentation/RelNotes/1.6.4.4.txt b/Documentation/RelNotes/1.6.4.4.adoc
index 0ead45fc72..0ead45fc72 100644
--- a/Documentation/RelNotes/1.6.4.4.txt
+++ b/Documentation/RelNotes/1.6.4.4.adoc
diff --git a/Documentation/RelNotes/1.6.4.5.txt b/Documentation/RelNotes/1.6.4.5.adoc
index eb6307dcbb..eb6307dcbb 100644
--- a/Documentation/RelNotes/1.6.4.5.txt
+++ b/Documentation/RelNotes/1.6.4.5.adoc
diff --git a/Documentation/RelNotes/1.6.4.txt b/Documentation/RelNotes/1.6.4.adoc
index 0fccfb0bf0..0fccfb0bf0 100644
--- a/Documentation/RelNotes/1.6.4.txt
+++ b/Documentation/RelNotes/1.6.4.adoc
diff --git a/Documentation/RelNotes/1.6.5.1.txt b/Documentation/RelNotes/1.6.5.1.adoc
index 309ba181b2..309ba181b2 100644
--- a/Documentation/RelNotes/1.6.5.1.txt
+++ b/Documentation/RelNotes/1.6.5.1.adoc
diff --git a/Documentation/RelNotes/1.6.5.2.txt b/Documentation/RelNotes/1.6.5.2.adoc
index aa7ccce3a2..aa7ccce3a2 100644
--- a/Documentation/RelNotes/1.6.5.2.txt
+++ b/Documentation/RelNotes/1.6.5.2.adoc
diff --git a/Documentation/RelNotes/1.6.5.3.txt b/Documentation/RelNotes/1.6.5.3.adoc
index b2fad1b22e..b2fad1b22e 100644
--- a/Documentation/RelNotes/1.6.5.3.txt
+++ b/Documentation/RelNotes/1.6.5.3.adoc
diff --git a/Documentation/RelNotes/1.6.5.4.txt b/Documentation/RelNotes/1.6.5.4.adoc
index 344333de66..344333de66 100644
--- a/Documentation/RelNotes/1.6.5.4.txt
+++ b/Documentation/RelNotes/1.6.5.4.adoc
diff --git a/Documentation/RelNotes/1.6.5.5.txt b/Documentation/RelNotes/1.6.5.5.adoc
index ecfc57d875..ecfc57d875 100644
--- a/Documentation/RelNotes/1.6.5.5.txt
+++ b/Documentation/RelNotes/1.6.5.5.adoc
diff --git a/Documentation/RelNotes/1.6.5.6.txt b/Documentation/RelNotes/1.6.5.6.adoc
index a9eaf76f62..a9eaf76f62 100644
--- a/Documentation/RelNotes/1.6.5.6.txt
+++ b/Documentation/RelNotes/1.6.5.6.adoc
diff --git a/Documentation/RelNotes/1.6.5.7.txt b/Documentation/RelNotes/1.6.5.7.adoc
index dc5302c21c..dc5302c21c 100644
--- a/Documentation/RelNotes/1.6.5.7.txt
+++ b/Documentation/RelNotes/1.6.5.7.adoc
diff --git a/Documentation/RelNotes/1.6.5.8.txt b/Documentation/RelNotes/1.6.5.8.adoc
index 8b24bebb96..8b24bebb96 100644
--- a/Documentation/RelNotes/1.6.5.8.txt
+++ b/Documentation/RelNotes/1.6.5.8.adoc
diff --git a/Documentation/RelNotes/1.6.5.9.txt b/Documentation/RelNotes/1.6.5.9.adoc
index bb469dd71e..bb469dd71e 100644
--- a/Documentation/RelNotes/1.6.5.9.txt
+++ b/Documentation/RelNotes/1.6.5.9.adoc
diff --git a/Documentation/RelNotes/1.6.5.txt b/Documentation/RelNotes/1.6.5.adoc
index 79cb1b2b6d..79cb1b2b6d 100644
--- a/Documentation/RelNotes/1.6.5.txt
+++ b/Documentation/RelNotes/1.6.5.adoc
diff --git a/Documentation/RelNotes/1.6.6.1.txt b/Documentation/RelNotes/1.6.6.1.adoc
index f1d0a4ae2d..f1d0a4ae2d 100644
--- a/Documentation/RelNotes/1.6.6.1.txt
+++ b/Documentation/RelNotes/1.6.6.1.adoc
diff --git a/Documentation/RelNotes/1.6.6.2.txt b/Documentation/RelNotes/1.6.6.2.adoc
index 4eaddc0106..4eaddc0106 100644
--- a/Documentation/RelNotes/1.6.6.2.txt
+++ b/Documentation/RelNotes/1.6.6.2.adoc
diff --git a/Documentation/RelNotes/1.6.6.3.txt b/Documentation/RelNotes/1.6.6.3.adoc
index 11483acaec..11483acaec 100644
--- a/Documentation/RelNotes/1.6.6.3.txt
+++ b/Documentation/RelNotes/1.6.6.3.adoc
diff --git a/Documentation/RelNotes/1.6.6.txt b/Documentation/RelNotes/1.6.6.adoc
index 88b86a827e..88b86a827e 100644
--- a/Documentation/RelNotes/1.6.6.txt
+++ b/Documentation/RelNotes/1.6.6.adoc
diff --git a/Documentation/RelNotes/1.7.0.1.txt b/Documentation/RelNotes/1.7.0.1.adoc
index 8ff5bcada8..8ff5bcada8 100644
--- a/Documentation/RelNotes/1.7.0.1.txt
+++ b/Documentation/RelNotes/1.7.0.1.adoc
diff --git a/Documentation/RelNotes/1.7.0.2.txt b/Documentation/RelNotes/1.7.0.2.adoc
index 73ed2b5278..73ed2b5278 100644
--- a/Documentation/RelNotes/1.7.0.2.txt
+++ b/Documentation/RelNotes/1.7.0.2.adoc
diff --git a/Documentation/RelNotes/1.7.0.3.txt b/Documentation/RelNotes/1.7.0.3.adoc
index 3b355737c0..3b355737c0 100644
--- a/Documentation/RelNotes/1.7.0.3.txt
+++ b/Documentation/RelNotes/1.7.0.3.adoc
diff --git a/Documentation/RelNotes/1.7.0.4.txt b/Documentation/RelNotes/1.7.0.4.adoc
index cf7f60e60d..cf7f60e60d 100644
--- a/Documentation/RelNotes/1.7.0.4.txt
+++ b/Documentation/RelNotes/1.7.0.4.adoc
diff --git a/Documentation/RelNotes/1.7.0.5.txt b/Documentation/RelNotes/1.7.0.5.adoc
index 3149c91b7b..3149c91b7b 100644
--- a/Documentation/RelNotes/1.7.0.5.txt
+++ b/Documentation/RelNotes/1.7.0.5.adoc
diff --git a/Documentation/RelNotes/1.7.0.6.txt b/Documentation/RelNotes/1.7.0.6.adoc
index b2852b67d0..b2852b67d0 100644
--- a/Documentation/RelNotes/1.7.0.6.txt
+++ b/Documentation/RelNotes/1.7.0.6.adoc
diff --git a/Documentation/RelNotes/1.7.0.7.txt b/Documentation/RelNotes/1.7.0.7.adoc
index d0cb7ca7e2..d0cb7ca7e2 100644
--- a/Documentation/RelNotes/1.7.0.7.txt
+++ b/Documentation/RelNotes/1.7.0.7.adoc
diff --git a/Documentation/RelNotes/1.7.0.8.txt b/Documentation/RelNotes/1.7.0.8.adoc
index 7f05b48e17..7f05b48e17 100644
--- a/Documentation/RelNotes/1.7.0.8.txt
+++ b/Documentation/RelNotes/1.7.0.8.adoc
diff --git a/Documentation/RelNotes/1.7.0.9.txt b/Documentation/RelNotes/1.7.0.9.adoc
index bfb3166387..bfb3166387 100644
--- a/Documentation/RelNotes/1.7.0.9.txt
+++ b/Documentation/RelNotes/1.7.0.9.adoc
diff --git a/Documentation/RelNotes/1.7.0.txt b/Documentation/RelNotes/1.7.0.adoc
index 0bb8c0b2a2..0bb8c0b2a2 100644
--- a/Documentation/RelNotes/1.7.0.txt
+++ b/Documentation/RelNotes/1.7.0.adoc
diff --git a/Documentation/RelNotes/1.7.1.1.txt b/Documentation/RelNotes/1.7.1.1.adoc
index 3f6b3148a3..3f6b3148a3 100644
--- a/Documentation/RelNotes/1.7.1.1.txt
+++ b/Documentation/RelNotes/1.7.1.1.adoc
diff --git a/Documentation/RelNotes/1.7.1.2.txt b/Documentation/RelNotes/1.7.1.2.adoc
index 61ba14e262..61ba14e262 100644
--- a/Documentation/RelNotes/1.7.1.2.txt
+++ b/Documentation/RelNotes/1.7.1.2.adoc
diff --git a/Documentation/RelNotes/1.7.1.3.txt b/Documentation/RelNotes/1.7.1.3.adoc
index 5b18518449..5b18518449 100644
--- a/Documentation/RelNotes/1.7.1.3.txt
+++ b/Documentation/RelNotes/1.7.1.3.adoc
diff --git a/Documentation/RelNotes/1.7.1.4.txt b/Documentation/RelNotes/1.7.1.4.adoc
index 7c734b4f7b..7c734b4f7b 100644
--- a/Documentation/RelNotes/1.7.1.4.txt
+++ b/Documentation/RelNotes/1.7.1.4.adoc
diff --git a/Documentation/RelNotes/1.7.1.txt b/Documentation/RelNotes/1.7.1.adoc
index 9d89fedb36..9d89fedb36 100644
--- a/Documentation/RelNotes/1.7.1.txt
+++ b/Documentation/RelNotes/1.7.1.adoc
diff --git a/Documentation/RelNotes/1.7.10.1.txt b/Documentation/RelNotes/1.7.10.1.adoc
index 71a86cb7c6..71a86cb7c6 100644
--- a/Documentation/RelNotes/1.7.10.1.txt
+++ b/Documentation/RelNotes/1.7.10.1.adoc
diff --git a/Documentation/RelNotes/1.7.10.2.txt b/Documentation/RelNotes/1.7.10.2.adoc
index 7a7e9d6fd1..7a7e9d6fd1 100644
--- a/Documentation/RelNotes/1.7.10.2.txt
+++ b/Documentation/RelNotes/1.7.10.2.adoc
diff --git a/Documentation/RelNotes/1.7.10.3.txt b/Documentation/RelNotes/1.7.10.3.adoc
index 703fbf1d60..703fbf1d60 100644
--- a/Documentation/RelNotes/1.7.10.3.txt
+++ b/Documentation/RelNotes/1.7.10.3.adoc
diff --git a/Documentation/RelNotes/1.7.10.4.txt b/Documentation/RelNotes/1.7.10.4.adoc
index 57597f2bf3..57597f2bf3 100644
--- a/Documentation/RelNotes/1.7.10.4.txt
+++ b/Documentation/RelNotes/1.7.10.4.adoc
diff --git a/Documentation/RelNotes/1.7.10.5.txt b/Documentation/RelNotes/1.7.10.5.adoc
index 4db1770e38..4db1770e38 100644
--- a/Documentation/RelNotes/1.7.10.5.txt
+++ b/Documentation/RelNotes/1.7.10.5.adoc
diff --git a/Documentation/RelNotes/1.7.10.txt b/Documentation/RelNotes/1.7.10.adoc
index 58100bf04e..58100bf04e 100644
--- a/Documentation/RelNotes/1.7.10.txt
+++ b/Documentation/RelNotes/1.7.10.adoc
diff --git a/Documentation/RelNotes/1.7.11.1.txt b/Documentation/RelNotes/1.7.11.1.adoc
index 577eccaacd..577eccaacd 100644
--- a/Documentation/RelNotes/1.7.11.1.txt
+++ b/Documentation/RelNotes/1.7.11.1.adoc
diff --git a/Documentation/RelNotes/1.7.11.2.txt b/Documentation/RelNotes/1.7.11.2.adoc
index f0cfd02d6f..f0cfd02d6f 100644
--- a/Documentation/RelNotes/1.7.11.2.txt
+++ b/Documentation/RelNotes/1.7.11.2.adoc
diff --git a/Documentation/RelNotes/1.7.11.3.txt b/Documentation/RelNotes/1.7.11.3.adoc
index 64494f89d9..64494f89d9 100644
--- a/Documentation/RelNotes/1.7.11.3.txt
+++ b/Documentation/RelNotes/1.7.11.3.adoc
diff --git a/Documentation/RelNotes/1.7.11.4.txt b/Documentation/RelNotes/1.7.11.4.adoc
index 3a640c2d4d..3a640c2d4d 100644
--- a/Documentation/RelNotes/1.7.11.4.txt
+++ b/Documentation/RelNotes/1.7.11.4.adoc
diff --git a/Documentation/RelNotes/1.7.11.5.txt b/Documentation/RelNotes/1.7.11.5.adoc
index 0a2ed855c5..0a2ed855c5 100644
--- a/Documentation/RelNotes/1.7.11.5.txt
+++ b/Documentation/RelNotes/1.7.11.5.adoc
diff --git a/Documentation/RelNotes/1.7.11.6.txt b/Documentation/RelNotes/1.7.11.6.adoc
index ba7d3c3966..ba7d3c3966 100644
--- a/Documentation/RelNotes/1.7.11.6.txt
+++ b/Documentation/RelNotes/1.7.11.6.adoc
diff --git a/Documentation/RelNotes/1.7.11.7.txt b/Documentation/RelNotes/1.7.11.7.adoc
index e743a2a8e4..e743a2a8e4 100644
--- a/Documentation/RelNotes/1.7.11.7.txt
+++ b/Documentation/RelNotes/1.7.11.7.adoc
diff --git a/Documentation/RelNotes/1.7.11.txt b/Documentation/RelNotes/1.7.11.adoc
index 15b954ca4b..15b954ca4b 100644
--- a/Documentation/RelNotes/1.7.11.txt
+++ b/Documentation/RelNotes/1.7.11.adoc
diff --git a/Documentation/RelNotes/1.7.12.1.txt b/Documentation/RelNotes/1.7.12.1.adoc
index b8f04af19f..b8f04af19f 100644
--- a/Documentation/RelNotes/1.7.12.1.txt
+++ b/Documentation/RelNotes/1.7.12.1.adoc
diff --git a/Documentation/RelNotes/1.7.12.2.txt b/Documentation/RelNotes/1.7.12.2.adoc
index 69255745e6..69255745e6 100644
--- a/Documentation/RelNotes/1.7.12.2.txt
+++ b/Documentation/RelNotes/1.7.12.2.adoc
diff --git a/Documentation/RelNotes/1.7.12.3.txt b/Documentation/RelNotes/1.7.12.3.adoc
index 4b822976b8..4b822976b8 100644
--- a/Documentation/RelNotes/1.7.12.3.txt
+++ b/Documentation/RelNotes/1.7.12.3.adoc
diff --git a/Documentation/RelNotes/1.7.12.4.txt b/Documentation/RelNotes/1.7.12.4.adoc
index c6da3cc939..c6da3cc939 100644
--- a/Documentation/RelNotes/1.7.12.4.txt
+++ b/Documentation/RelNotes/1.7.12.4.adoc
diff --git a/Documentation/RelNotes/1.7.12.txt b/Documentation/RelNotes/1.7.12.adoc
index 010d8c7de4..010d8c7de4 100644
--- a/Documentation/RelNotes/1.7.12.txt
+++ b/Documentation/RelNotes/1.7.12.adoc
diff --git a/Documentation/RelNotes/1.7.2.1.txt b/Documentation/RelNotes/1.7.2.1.adoc
index 1103c47a4f..1103c47a4f 100644
--- a/Documentation/RelNotes/1.7.2.1.txt
+++ b/Documentation/RelNotes/1.7.2.1.adoc
diff --git a/Documentation/RelNotes/1.7.2.2.txt b/Documentation/RelNotes/1.7.2.2.adoc
index 71eb6a8b0a..71eb6a8b0a 100644
--- a/Documentation/RelNotes/1.7.2.2.txt
+++ b/Documentation/RelNotes/1.7.2.2.adoc
diff --git a/Documentation/RelNotes/1.7.2.3.txt b/Documentation/RelNotes/1.7.2.3.adoc
index 610960cfe1..610960cfe1 100644
--- a/Documentation/RelNotes/1.7.2.3.txt
+++ b/Documentation/RelNotes/1.7.2.3.adoc
diff --git a/Documentation/RelNotes/1.7.2.4.txt b/Documentation/RelNotes/1.7.2.4.adoc
index f7950a4c04..f7950a4c04 100644
--- a/Documentation/RelNotes/1.7.2.4.txt
+++ b/Documentation/RelNotes/1.7.2.4.adoc
diff --git a/Documentation/RelNotes/1.7.2.5.txt b/Documentation/RelNotes/1.7.2.5.adoc
index bf976c40db..bf976c40db 100644
--- a/Documentation/RelNotes/1.7.2.5.txt
+++ b/Documentation/RelNotes/1.7.2.5.adoc
diff --git a/Documentation/RelNotes/1.7.2.txt b/Documentation/RelNotes/1.7.2.adoc
index 15cf01178c..15cf01178c 100644
--- a/Documentation/RelNotes/1.7.2.txt
+++ b/Documentation/RelNotes/1.7.2.adoc
diff --git a/Documentation/RelNotes/1.7.3.1.txt b/Documentation/RelNotes/1.7.3.1.adoc
index 002c93b961..002c93b961 100644
--- a/Documentation/RelNotes/1.7.3.1.txt
+++ b/Documentation/RelNotes/1.7.3.1.adoc
diff --git a/Documentation/RelNotes/1.7.3.2.txt b/Documentation/RelNotes/1.7.3.2.adoc
index 5c93b85af4..5c93b85af4 100644
--- a/Documentation/RelNotes/1.7.3.2.txt
+++ b/Documentation/RelNotes/1.7.3.2.adoc
diff --git a/Documentation/RelNotes/1.7.3.3.txt b/Documentation/RelNotes/1.7.3.3.adoc
index 9b2b2448df..9b2b2448df 100644
--- a/Documentation/RelNotes/1.7.3.3.txt
+++ b/Documentation/RelNotes/1.7.3.3.adoc
diff --git a/Documentation/RelNotes/1.7.3.4.txt b/Documentation/RelNotes/1.7.3.4.adoc
index e57f7c176d..e57f7c176d 100644
--- a/Documentation/RelNotes/1.7.3.4.txt
+++ b/Documentation/RelNotes/1.7.3.4.adoc
diff --git a/Documentation/RelNotes/1.7.3.5.txt b/Documentation/RelNotes/1.7.3.5.adoc
index 40f3ba5795..40f3ba5795 100644
--- a/Documentation/RelNotes/1.7.3.5.txt
+++ b/Documentation/RelNotes/1.7.3.5.adoc
diff --git a/Documentation/RelNotes/1.7.3.txt b/Documentation/RelNotes/1.7.3.adoc
index 309c33181f..309c33181f 100644
--- a/Documentation/RelNotes/1.7.3.txt
+++ b/Documentation/RelNotes/1.7.3.adoc
diff --git a/Documentation/RelNotes/1.7.4.1.txt b/Documentation/RelNotes/1.7.4.1.adoc
index 79923a6d2f..79923a6d2f 100644
--- a/Documentation/RelNotes/1.7.4.1.txt
+++ b/Documentation/RelNotes/1.7.4.1.adoc
diff --git a/Documentation/RelNotes/1.7.4.2.txt b/Documentation/RelNotes/1.7.4.2.adoc
index ef4ce1fcd3..ef4ce1fcd3 100644
--- a/Documentation/RelNotes/1.7.4.2.txt
+++ b/Documentation/RelNotes/1.7.4.2.adoc
diff --git a/Documentation/RelNotes/1.7.4.3.txt b/Documentation/RelNotes/1.7.4.3.adoc
index 02a3d5bdf6..02a3d5bdf6 100644
--- a/Documentation/RelNotes/1.7.4.3.txt
+++ b/Documentation/RelNotes/1.7.4.3.adoc
diff --git a/Documentation/RelNotes/1.7.4.4.txt b/Documentation/RelNotes/1.7.4.4.adoc
index ff06e04a58..ff06e04a58 100644
--- a/Documentation/RelNotes/1.7.4.4.txt
+++ b/Documentation/RelNotes/1.7.4.4.adoc
diff --git a/Documentation/RelNotes/1.7.4.5.txt b/Documentation/RelNotes/1.7.4.5.adoc
index b7a0eeb22f..b7a0eeb22f 100644
--- a/Documentation/RelNotes/1.7.4.5.txt
+++ b/Documentation/RelNotes/1.7.4.5.adoc
diff --git a/Documentation/RelNotes/1.7.4.txt b/Documentation/RelNotes/1.7.4.adoc
index d5bca731b5..d5bca731b5 100644
--- a/Documentation/RelNotes/1.7.4.txt
+++ b/Documentation/RelNotes/1.7.4.adoc
diff --git a/Documentation/RelNotes/1.7.5.1.txt b/Documentation/RelNotes/1.7.5.1.adoc
index c6ebd76d19..c6ebd76d19 100644
--- a/Documentation/RelNotes/1.7.5.1.txt
+++ b/Documentation/RelNotes/1.7.5.1.adoc
diff --git a/Documentation/RelNotes/1.7.5.2.txt b/Documentation/RelNotes/1.7.5.2.adoc
index 951eb7cb08..951eb7cb08 100644
--- a/Documentation/RelNotes/1.7.5.2.txt
+++ b/Documentation/RelNotes/1.7.5.2.adoc
diff --git a/Documentation/RelNotes/1.7.5.3.txt b/Documentation/RelNotes/1.7.5.3.adoc
index 1d24edcf2f..1d24edcf2f 100644
--- a/Documentation/RelNotes/1.7.5.3.txt
+++ b/Documentation/RelNotes/1.7.5.3.adoc
diff --git a/Documentation/RelNotes/1.7.5.4.txt b/Documentation/RelNotes/1.7.5.4.adoc
index 7796df3fe4..7796df3fe4 100644
--- a/Documentation/RelNotes/1.7.5.4.txt
+++ b/Documentation/RelNotes/1.7.5.4.adoc
diff --git a/Documentation/RelNotes/1.7.5.txt b/Documentation/RelNotes/1.7.5.adoc
index 987919c321..987919c321 100644
--- a/Documentation/RelNotes/1.7.5.txt
+++ b/Documentation/RelNotes/1.7.5.adoc
diff --git a/Documentation/RelNotes/1.7.6.1.txt b/Documentation/RelNotes/1.7.6.1.adoc
index 42e46ab17f..42e46ab17f 100644
--- a/Documentation/RelNotes/1.7.6.1.txt
+++ b/Documentation/RelNotes/1.7.6.1.adoc
diff --git a/Documentation/RelNotes/1.7.6.2.txt b/Documentation/RelNotes/1.7.6.2.adoc
index 67ae414965..67ae414965 100644
--- a/Documentation/RelNotes/1.7.6.2.txt
+++ b/Documentation/RelNotes/1.7.6.2.adoc
diff --git a/Documentation/RelNotes/1.7.6.3.txt b/Documentation/RelNotes/1.7.6.3.adoc
index 95971831b9..95971831b9 100644
--- a/Documentation/RelNotes/1.7.6.3.txt
+++ b/Documentation/RelNotes/1.7.6.3.adoc
diff --git a/Documentation/RelNotes/1.7.6.4.txt b/Documentation/RelNotes/1.7.6.4.adoc
index e19acac2da..e19acac2da 100644
--- a/Documentation/RelNotes/1.7.6.4.txt
+++ b/Documentation/RelNotes/1.7.6.4.adoc
diff --git a/Documentation/RelNotes/1.7.6.5.txt b/Documentation/RelNotes/1.7.6.5.adoc
index 6713132a9e..6713132a9e 100644
--- a/Documentation/RelNotes/1.7.6.5.txt
+++ b/Documentation/RelNotes/1.7.6.5.adoc
diff --git a/Documentation/RelNotes/1.7.6.6.txt b/Documentation/RelNotes/1.7.6.6.adoc
index 5343e00400..5343e00400 100644
--- a/Documentation/RelNotes/1.7.6.6.txt
+++ b/Documentation/RelNotes/1.7.6.6.adoc
diff --git a/Documentation/RelNotes/1.7.6.txt b/Documentation/RelNotes/1.7.6.adoc
index 9ec498ea39..9ec498ea39 100644
--- a/Documentation/RelNotes/1.7.6.txt
+++ b/Documentation/RelNotes/1.7.6.adoc
diff --git a/Documentation/RelNotes/1.7.7.1.txt b/Documentation/RelNotes/1.7.7.1.adoc
index ac9b838e25..ac9b838e25 100644
--- a/Documentation/RelNotes/1.7.7.1.txt
+++ b/Documentation/RelNotes/1.7.7.1.adoc
diff --git a/Documentation/RelNotes/1.7.7.2.txt b/Documentation/RelNotes/1.7.7.2.adoc
index e6bbef2f01..e6bbef2f01 100644
--- a/Documentation/RelNotes/1.7.7.2.txt
+++ b/Documentation/RelNotes/1.7.7.2.adoc
diff --git a/Documentation/RelNotes/1.7.7.3.txt b/Documentation/RelNotes/1.7.7.3.adoc
index 09301f0957..09301f0957 100644
--- a/Documentation/RelNotes/1.7.7.3.txt
+++ b/Documentation/RelNotes/1.7.7.3.adoc
diff --git a/Documentation/RelNotes/1.7.7.4.txt b/Documentation/RelNotes/1.7.7.4.adoc
index e5234485e7..e5234485e7 100644
--- a/Documentation/RelNotes/1.7.7.4.txt
+++ b/Documentation/RelNotes/1.7.7.4.adoc
diff --git a/Documentation/RelNotes/1.7.7.5.txt b/Documentation/RelNotes/1.7.7.5.adoc
index 7b0931987b..7b0931987b 100644
--- a/Documentation/RelNotes/1.7.7.5.txt
+++ b/Documentation/RelNotes/1.7.7.5.adoc
diff --git a/Documentation/RelNotes/1.7.7.6.txt b/Documentation/RelNotes/1.7.7.6.adoc
index 8df606d452..8df606d452 100644
--- a/Documentation/RelNotes/1.7.7.6.txt
+++ b/Documentation/RelNotes/1.7.7.6.adoc
diff --git a/Documentation/RelNotes/1.7.7.7.txt b/Documentation/RelNotes/1.7.7.7.adoc
index e79118d063..e79118d063 100644
--- a/Documentation/RelNotes/1.7.7.7.txt
+++ b/Documentation/RelNotes/1.7.7.7.adoc
diff --git a/Documentation/RelNotes/1.7.7.txt b/Documentation/RelNotes/1.7.7.adoc
index 6eff128c80..6eff128c80 100644
--- a/Documentation/RelNotes/1.7.7.txt
+++ b/Documentation/RelNotes/1.7.7.adoc
diff --git a/Documentation/RelNotes/1.7.8.1.txt b/Documentation/RelNotes/1.7.8.1.adoc
index 33dc948b94..33dc948b94 100644
--- a/Documentation/RelNotes/1.7.8.1.txt
+++ b/Documentation/RelNotes/1.7.8.1.adoc
diff --git a/Documentation/RelNotes/1.7.8.2.txt b/Documentation/RelNotes/1.7.8.2.adoc
index b9c66aa1b7..b9c66aa1b7 100644
--- a/Documentation/RelNotes/1.7.8.2.txt
+++ b/Documentation/RelNotes/1.7.8.2.adoc
diff --git a/Documentation/RelNotes/1.7.8.3.txt b/Documentation/RelNotes/1.7.8.3.adoc
index a92714c14b..a92714c14b 100644
--- a/Documentation/RelNotes/1.7.8.3.txt
+++ b/Documentation/RelNotes/1.7.8.3.adoc
diff --git a/Documentation/RelNotes/1.7.8.4.txt b/Documentation/RelNotes/1.7.8.4.adoc
index 9bebdbf13d..9bebdbf13d 100644
--- a/Documentation/RelNotes/1.7.8.4.txt
+++ b/Documentation/RelNotes/1.7.8.4.adoc
diff --git a/Documentation/RelNotes/1.7.8.5.txt b/Documentation/RelNotes/1.7.8.5.adoc
index 011fd2a428..011fd2a428 100644
--- a/Documentation/RelNotes/1.7.8.5.txt
+++ b/Documentation/RelNotes/1.7.8.5.adoc
diff --git a/Documentation/RelNotes/1.7.8.6.txt b/Documentation/RelNotes/1.7.8.6.adoc
index d9bf2b741a..d9bf2b741a 100644
--- a/Documentation/RelNotes/1.7.8.6.txt
+++ b/Documentation/RelNotes/1.7.8.6.adoc
diff --git a/Documentation/RelNotes/1.7.8.txt b/Documentation/RelNotes/1.7.8.adoc
index 249311361e..249311361e 100644
--- a/Documentation/RelNotes/1.7.8.txt
+++ b/Documentation/RelNotes/1.7.8.adoc
diff --git a/Documentation/RelNotes/1.7.9.1.txt b/Documentation/RelNotes/1.7.9.1.adoc
index 6957183dbb..6957183dbb 100644
--- a/Documentation/RelNotes/1.7.9.1.txt
+++ b/Documentation/RelNotes/1.7.9.1.adoc
diff --git a/Documentation/RelNotes/1.7.9.2.txt b/Documentation/RelNotes/1.7.9.2.adoc
index e500da75dd..e500da75dd 100644
--- a/Documentation/RelNotes/1.7.9.2.txt
+++ b/Documentation/RelNotes/1.7.9.2.adoc
diff --git a/Documentation/RelNotes/1.7.9.3.txt b/Documentation/RelNotes/1.7.9.3.adoc
index 91c65012f9..91c65012f9 100644
--- a/Documentation/RelNotes/1.7.9.3.txt
+++ b/Documentation/RelNotes/1.7.9.3.adoc
diff --git a/Documentation/RelNotes/1.7.9.4.txt b/Documentation/RelNotes/1.7.9.4.adoc
index e5217a1889..e5217a1889 100644
--- a/Documentation/RelNotes/1.7.9.4.txt
+++ b/Documentation/RelNotes/1.7.9.4.adoc
diff --git a/Documentation/RelNotes/1.7.9.5.txt b/Documentation/RelNotes/1.7.9.5.adoc
index 95cc2bbf2c..95cc2bbf2c 100644
--- a/Documentation/RelNotes/1.7.9.5.txt
+++ b/Documentation/RelNotes/1.7.9.5.adoc
diff --git a/Documentation/RelNotes/1.7.9.6.txt b/Documentation/RelNotes/1.7.9.6.adoc
index 74bf8825e2..74bf8825e2 100644
--- a/Documentation/RelNotes/1.7.9.6.txt
+++ b/Documentation/RelNotes/1.7.9.6.adoc
diff --git a/Documentation/RelNotes/1.7.9.7.txt b/Documentation/RelNotes/1.7.9.7.adoc
index 59667d0f2a..59667d0f2a 100644
--- a/Documentation/RelNotes/1.7.9.7.txt
+++ b/Documentation/RelNotes/1.7.9.7.adoc
diff --git a/Documentation/RelNotes/1.7.9.txt b/Documentation/RelNotes/1.7.9.adoc
index 95320aad5d..95320aad5d 100644
--- a/Documentation/RelNotes/1.7.9.txt
+++ b/Documentation/RelNotes/1.7.9.adoc
diff --git a/Documentation/RelNotes/1.8.0.1.txt b/Documentation/RelNotes/1.8.0.1.adoc
index 1f372fa0b5..1f372fa0b5 100644
--- a/Documentation/RelNotes/1.8.0.1.txt
+++ b/Documentation/RelNotes/1.8.0.1.adoc
diff --git a/Documentation/RelNotes/1.8.0.2.txt b/Documentation/RelNotes/1.8.0.2.adoc
index 8497e051de..8497e051de 100644
--- a/Documentation/RelNotes/1.8.0.2.txt
+++ b/Documentation/RelNotes/1.8.0.2.adoc
diff --git a/Documentation/RelNotes/1.8.0.3.txt b/Documentation/RelNotes/1.8.0.3.adoc
index 92b1e4b363..92b1e4b363 100644
--- a/Documentation/RelNotes/1.8.0.3.txt
+++ b/Documentation/RelNotes/1.8.0.3.adoc
diff --git a/Documentation/RelNotes/1.8.0.txt b/Documentation/RelNotes/1.8.0.adoc
index 63d6e4afa4..63d6e4afa4 100644
--- a/Documentation/RelNotes/1.8.0.txt
+++ b/Documentation/RelNotes/1.8.0.adoc
diff --git a/Documentation/RelNotes/1.8.1.1.txt b/Documentation/RelNotes/1.8.1.1.adoc
index 6cde07ba29..6cde07ba29 100644
--- a/Documentation/RelNotes/1.8.1.1.txt
+++ b/Documentation/RelNotes/1.8.1.1.adoc
diff --git a/Documentation/RelNotes/1.8.1.2.txt b/Documentation/RelNotes/1.8.1.2.adoc
index 5ab7b18906..5ab7b18906 100644
--- a/Documentation/RelNotes/1.8.1.2.txt
+++ b/Documentation/RelNotes/1.8.1.2.adoc
diff --git a/Documentation/RelNotes/1.8.1.3.txt b/Documentation/RelNotes/1.8.1.3.adoc
index 681cb35c0a..681cb35c0a 100644
--- a/Documentation/RelNotes/1.8.1.3.txt
+++ b/Documentation/RelNotes/1.8.1.3.adoc
diff --git a/Documentation/RelNotes/1.8.1.4.txt b/Documentation/RelNotes/1.8.1.4.adoc
index 22af1d1643..22af1d1643 100644
--- a/Documentation/RelNotes/1.8.1.4.txt
+++ b/Documentation/RelNotes/1.8.1.4.adoc
diff --git a/Documentation/RelNotes/1.8.1.5.txt b/Documentation/RelNotes/1.8.1.5.adoc
index efa68aef22..efa68aef22 100644
--- a/Documentation/RelNotes/1.8.1.5.txt
+++ b/Documentation/RelNotes/1.8.1.5.adoc
diff --git a/Documentation/RelNotes/1.8.1.6.txt b/Documentation/RelNotes/1.8.1.6.adoc
index c15cf2e805..c15cf2e805 100644
--- a/Documentation/RelNotes/1.8.1.6.txt
+++ b/Documentation/RelNotes/1.8.1.6.adoc
diff --git a/Documentation/RelNotes/1.8.1.txt b/Documentation/RelNotes/1.8.1.adoc
index d6f9555923..d6f9555923 100644
--- a/Documentation/RelNotes/1.8.1.txt
+++ b/Documentation/RelNotes/1.8.1.adoc
diff --git a/Documentation/RelNotes/1.8.2.1.txt b/Documentation/RelNotes/1.8.2.1.adoc
index 769a6fc06c..769a6fc06c 100644
--- a/Documentation/RelNotes/1.8.2.1.txt
+++ b/Documentation/RelNotes/1.8.2.1.adoc
diff --git a/Documentation/RelNotes/1.8.2.2.txt b/Documentation/RelNotes/1.8.2.2.adoc
index 708df1ae19..708df1ae19 100644
--- a/Documentation/RelNotes/1.8.2.2.txt
+++ b/Documentation/RelNotes/1.8.2.2.adoc
diff --git a/Documentation/RelNotes/1.8.2.3.txt b/Documentation/RelNotes/1.8.2.3.adoc
index 613948251a..613948251a 100644
--- a/Documentation/RelNotes/1.8.2.3.txt
+++ b/Documentation/RelNotes/1.8.2.3.adoc
diff --git a/Documentation/RelNotes/1.8.2.txt b/Documentation/RelNotes/1.8.2.adoc
index fc606ae116..fc606ae116 100644
--- a/Documentation/RelNotes/1.8.2.txt
+++ b/Documentation/RelNotes/1.8.2.adoc
diff --git a/Documentation/RelNotes/1.8.3.1.txt b/Documentation/RelNotes/1.8.3.1.adoc
index 986637b755..986637b755 100644
--- a/Documentation/RelNotes/1.8.3.1.txt
+++ b/Documentation/RelNotes/1.8.3.1.adoc
diff --git a/Documentation/RelNotes/1.8.3.2.txt b/Documentation/RelNotes/1.8.3.2.adoc
index 26ae142c3d..26ae142c3d 100644
--- a/Documentation/RelNotes/1.8.3.2.txt
+++ b/Documentation/RelNotes/1.8.3.2.adoc
diff --git a/Documentation/RelNotes/1.8.3.3.txt b/Documentation/RelNotes/1.8.3.3.adoc
index 9ba4f4da0f..9ba4f4da0f 100644
--- a/Documentation/RelNotes/1.8.3.3.txt
+++ b/Documentation/RelNotes/1.8.3.3.adoc
diff --git a/Documentation/RelNotes/1.8.3.4.txt b/Documentation/RelNotes/1.8.3.4.adoc
index 56f106e262..56f106e262 100644
--- a/Documentation/RelNotes/1.8.3.4.txt
+++ b/Documentation/RelNotes/1.8.3.4.adoc
diff --git a/Documentation/RelNotes/1.8.3.txt b/Documentation/RelNotes/1.8.3.adoc
index ead568e7f1..ead568e7f1 100644
--- a/Documentation/RelNotes/1.8.3.txt
+++ b/Documentation/RelNotes/1.8.3.adoc
diff --git a/Documentation/RelNotes/1.8.4.1.txt b/Documentation/RelNotes/1.8.4.1.adoc
index c257beb114..c257beb114 100644
--- a/Documentation/RelNotes/1.8.4.1.txt
+++ b/Documentation/RelNotes/1.8.4.1.adoc
diff --git a/Documentation/RelNotes/1.8.4.2.txt b/Documentation/RelNotes/1.8.4.2.adoc
index bf6fb1a023..bf6fb1a023 100644
--- a/Documentation/RelNotes/1.8.4.2.txt
+++ b/Documentation/RelNotes/1.8.4.2.adoc
diff --git a/Documentation/RelNotes/1.8.4.3.txt b/Documentation/RelNotes/1.8.4.3.adoc
index 267a1b34b4..267a1b34b4 100644
--- a/Documentation/RelNotes/1.8.4.3.txt
+++ b/Documentation/RelNotes/1.8.4.3.adoc
diff --git a/Documentation/RelNotes/1.8.4.4.txt b/Documentation/RelNotes/1.8.4.4.adoc
index a7c1ce15c0..a7c1ce15c0 100644
--- a/Documentation/RelNotes/1.8.4.4.txt
+++ b/Documentation/RelNotes/1.8.4.4.adoc
diff --git a/Documentation/RelNotes/1.8.4.5.txt b/Documentation/RelNotes/1.8.4.5.adoc
index 215bd1a7a2..215bd1a7a2 100644
--- a/Documentation/RelNotes/1.8.4.5.txt
+++ b/Documentation/RelNotes/1.8.4.5.adoc
diff --git a/Documentation/RelNotes/1.8.4.txt b/Documentation/RelNotes/1.8.4.adoc
index 2e7529928b..2e7529928b 100644
--- a/Documentation/RelNotes/1.8.4.txt
+++ b/Documentation/RelNotes/1.8.4.adoc
diff --git a/Documentation/RelNotes/1.8.5.1.txt b/Documentation/RelNotes/1.8.5.1.adoc
index 7236aaf232..7236aaf232 100644
--- a/Documentation/RelNotes/1.8.5.1.txt
+++ b/Documentation/RelNotes/1.8.5.1.adoc
diff --git a/Documentation/RelNotes/1.8.5.2.txt b/Documentation/RelNotes/1.8.5.2.adoc
index 3ac4984f10..3ac4984f10 100644
--- a/Documentation/RelNotes/1.8.5.2.txt
+++ b/Documentation/RelNotes/1.8.5.2.adoc
diff --git a/Documentation/RelNotes/1.8.5.3.txt b/Documentation/RelNotes/1.8.5.3.adoc
index 3de2dd0f19..3de2dd0f19 100644
--- a/Documentation/RelNotes/1.8.5.3.txt
+++ b/Documentation/RelNotes/1.8.5.3.adoc
diff --git a/Documentation/RelNotes/1.8.5.4.txt b/Documentation/RelNotes/1.8.5.4.adoc
index d18c40389e..d18c40389e 100644
--- a/Documentation/RelNotes/1.8.5.4.txt
+++ b/Documentation/RelNotes/1.8.5.4.adoc
diff --git a/Documentation/RelNotes/1.8.5.5.txt b/Documentation/RelNotes/1.8.5.5.adoc
index 9191ce948f..9191ce948f 100644
--- a/Documentation/RelNotes/1.8.5.5.txt
+++ b/Documentation/RelNotes/1.8.5.5.adoc
diff --git a/Documentation/RelNotes/1.8.5.6.txt b/Documentation/RelNotes/1.8.5.6.adoc
index 92ff92b1e6..92ff92b1e6 100644
--- a/Documentation/RelNotes/1.8.5.6.txt
+++ b/Documentation/RelNotes/1.8.5.6.adoc
diff --git a/Documentation/RelNotes/1.8.5.txt b/Documentation/RelNotes/1.8.5.adoc
index 602df0cac2..602df0cac2 100644
--- a/Documentation/RelNotes/1.8.5.txt
+++ b/Documentation/RelNotes/1.8.5.adoc
diff --git a/Documentation/RelNotes/1.9.0.txt b/Documentation/RelNotes/1.9.0.adoc
index 4e4b88aa5c..4e4b88aa5c 100644
--- a/Documentation/RelNotes/1.9.0.txt
+++ b/Documentation/RelNotes/1.9.0.adoc
diff --git a/Documentation/RelNotes/1.9.1.txt b/Documentation/RelNotes/1.9.1.adoc
index 5b0602053c..5b0602053c 100644
--- a/Documentation/RelNotes/1.9.1.txt
+++ b/Documentation/RelNotes/1.9.1.adoc
diff --git a/Documentation/RelNotes/1.9.2.txt b/Documentation/RelNotes/1.9.2.adoc
index 47a34ca964..47a34ca964 100644
--- a/Documentation/RelNotes/1.9.2.txt
+++ b/Documentation/RelNotes/1.9.2.adoc
diff --git a/Documentation/RelNotes/1.9.3.txt b/Documentation/RelNotes/1.9.3.adoc
index 17b05ca7b5..17b05ca7b5 100644
--- a/Documentation/RelNotes/1.9.3.txt
+++ b/Documentation/RelNotes/1.9.3.adoc
diff --git a/Documentation/RelNotes/1.9.4.txt b/Documentation/RelNotes/1.9.4.adoc
index e1d1835436..e1d1835436 100644
--- a/Documentation/RelNotes/1.9.4.txt
+++ b/Documentation/RelNotes/1.9.4.adoc
diff --git a/Documentation/RelNotes/1.9.5.txt b/Documentation/RelNotes/1.9.5.adoc
index 8d6ac0cf53..8d6ac0cf53 100644
--- a/Documentation/RelNotes/1.9.5.txt
+++ b/Documentation/RelNotes/1.9.5.adoc
diff --git a/Documentation/RelNotes/2.0.0.txt b/Documentation/RelNotes/2.0.0.adoc
index 2617372a0c..2617372a0c 100644
--- a/Documentation/RelNotes/2.0.0.txt
+++ b/Documentation/RelNotes/2.0.0.adoc
diff --git a/Documentation/RelNotes/2.0.1.txt b/Documentation/RelNotes/2.0.1.adoc
index ce5579db3e..ce5579db3e 100644
--- a/Documentation/RelNotes/2.0.1.txt
+++ b/Documentation/RelNotes/2.0.1.adoc
diff --git a/Documentation/RelNotes/2.0.2.txt b/Documentation/RelNotes/2.0.2.adoc
index 8e8321b2ef..8e8321b2ef 100644
--- a/Documentation/RelNotes/2.0.2.txt
+++ b/Documentation/RelNotes/2.0.2.adoc
diff --git a/Documentation/RelNotes/2.0.3.txt b/Documentation/RelNotes/2.0.3.adoc
index 4047b46bbe..4047b46bbe 100644
--- a/Documentation/RelNotes/2.0.3.txt
+++ b/Documentation/RelNotes/2.0.3.adoc
diff --git a/Documentation/RelNotes/2.0.4.txt b/Documentation/RelNotes/2.0.4.adoc
index 7e340921a2..7e340921a2 100644
--- a/Documentation/RelNotes/2.0.4.txt
+++ b/Documentation/RelNotes/2.0.4.adoc
diff --git a/Documentation/RelNotes/2.0.5.txt b/Documentation/RelNotes/2.0.5.adoc
index 3a16f697e8..3a16f697e8 100644
--- a/Documentation/RelNotes/2.0.5.txt
+++ b/Documentation/RelNotes/2.0.5.adoc
diff --git a/Documentation/RelNotes/2.1.0.txt b/Documentation/RelNotes/2.1.0.adoc
index ae4753728e..ae4753728e 100644
--- a/Documentation/RelNotes/2.1.0.txt
+++ b/Documentation/RelNotes/2.1.0.adoc
diff --git a/Documentation/RelNotes/2.1.1.txt b/Documentation/RelNotes/2.1.1.adoc
index 830fc3cc6d..830fc3cc6d 100644
--- a/Documentation/RelNotes/2.1.1.txt
+++ b/Documentation/RelNotes/2.1.1.adoc
diff --git a/Documentation/RelNotes/2.1.2.txt b/Documentation/RelNotes/2.1.2.adoc
index abc3b8928a..abc3b8928a 100644
--- a/Documentation/RelNotes/2.1.2.txt
+++ b/Documentation/RelNotes/2.1.2.adoc
diff --git a/Documentation/RelNotes/2.1.3.txt b/Documentation/RelNotes/2.1.3.adoc
index 0dfb17c4fc..0dfb17c4fc 100644
--- a/Documentation/RelNotes/2.1.3.txt
+++ b/Documentation/RelNotes/2.1.3.adoc
diff --git a/Documentation/RelNotes/2.1.4.txt b/Documentation/RelNotes/2.1.4.adoc
index d16e5f041f..d16e5f041f 100644
--- a/Documentation/RelNotes/2.1.4.txt
+++ b/Documentation/RelNotes/2.1.4.adoc
diff --git a/Documentation/RelNotes/2.10.0.txt b/Documentation/RelNotes/2.10.0.adoc
index 3792b7d03d..3792b7d03d 100644
--- a/Documentation/RelNotes/2.10.0.txt
+++ b/Documentation/RelNotes/2.10.0.adoc
diff --git a/Documentation/RelNotes/2.10.1.txt b/Documentation/RelNotes/2.10.1.adoc
index 70462f7f7e..70462f7f7e 100644
--- a/Documentation/RelNotes/2.10.1.txt
+++ b/Documentation/RelNotes/2.10.1.adoc
diff --git a/Documentation/RelNotes/2.10.2.txt b/Documentation/RelNotes/2.10.2.adoc
index abbd331508..abbd331508 100644
--- a/Documentation/RelNotes/2.10.2.txt
+++ b/Documentation/RelNotes/2.10.2.adoc
diff --git a/Documentation/RelNotes/2.10.3.txt b/Documentation/RelNotes/2.10.3.adoc
index ad6a01bf83..ad6a01bf83 100644
--- a/Documentation/RelNotes/2.10.3.txt
+++ b/Documentation/RelNotes/2.10.3.adoc
diff --git a/Documentation/RelNotes/2.10.4.txt b/Documentation/RelNotes/2.10.4.adoc
index ee8142ad24..ee8142ad24 100644
--- a/Documentation/RelNotes/2.10.4.txt
+++ b/Documentation/RelNotes/2.10.4.adoc
diff --git a/Documentation/RelNotes/2.10.5.txt b/Documentation/RelNotes/2.10.5.adoc
index a498fd6fdc..a498fd6fdc 100644
--- a/Documentation/RelNotes/2.10.5.txt
+++ b/Documentation/RelNotes/2.10.5.adoc
diff --git a/Documentation/RelNotes/2.11.0.txt b/Documentation/RelNotes/2.11.0.adoc
index b7b7dd361e..b7b7dd361e 100644
--- a/Documentation/RelNotes/2.11.0.txt
+++ b/Documentation/RelNotes/2.11.0.adoc
diff --git a/Documentation/RelNotes/2.11.1.txt b/Documentation/RelNotes/2.11.1.adoc
index 7d35cf186d..7d35cf186d 100644
--- a/Documentation/RelNotes/2.11.1.txt
+++ b/Documentation/RelNotes/2.11.1.adoc
diff --git a/Documentation/RelNotes/2.11.2.txt b/Documentation/RelNotes/2.11.2.adoc
index 7428851168..7428851168 100644
--- a/Documentation/RelNotes/2.11.2.txt
+++ b/Documentation/RelNotes/2.11.2.adoc
diff --git a/Documentation/RelNotes/2.11.3.txt b/Documentation/RelNotes/2.11.3.adoc
index 4e3b78d0e8..4e3b78d0e8 100644
--- a/Documentation/RelNotes/2.11.3.txt
+++ b/Documentation/RelNotes/2.11.3.adoc
diff --git a/Documentation/RelNotes/2.11.4.txt b/Documentation/RelNotes/2.11.4.adoc
index ad4da8eb09..ad4da8eb09 100644
--- a/Documentation/RelNotes/2.11.4.txt
+++ b/Documentation/RelNotes/2.11.4.adoc
diff --git a/Documentation/RelNotes/2.12.0.txt b/Documentation/RelNotes/2.12.0.adoc
index d2f6a83614..d2f6a83614 100644
--- a/Documentation/RelNotes/2.12.0.txt
+++ b/Documentation/RelNotes/2.12.0.adoc
diff --git a/Documentation/RelNotes/2.12.1.txt b/Documentation/RelNotes/2.12.1.adoc
index a74f7db747..a74f7db747 100644
--- a/Documentation/RelNotes/2.12.1.txt
+++ b/Documentation/RelNotes/2.12.1.adoc
diff --git a/Documentation/RelNotes/2.12.2.txt b/Documentation/RelNotes/2.12.2.adoc
index 441939709c..441939709c 100644
--- a/Documentation/RelNotes/2.12.2.txt
+++ b/Documentation/RelNotes/2.12.2.adoc
diff --git a/Documentation/RelNotes/2.12.3.txt b/Documentation/RelNotes/2.12.3.adoc
index ebca846d5d..ebca846d5d 100644
--- a/Documentation/RelNotes/2.12.3.txt
+++ b/Documentation/RelNotes/2.12.3.adoc
diff --git a/Documentation/RelNotes/2.12.4.txt b/Documentation/RelNotes/2.12.4.adoc
index 3f56938221..3f56938221 100644
--- a/Documentation/RelNotes/2.12.4.txt
+++ b/Documentation/RelNotes/2.12.4.adoc
diff --git a/Documentation/RelNotes/2.12.5.txt b/Documentation/RelNotes/2.12.5.adoc
index 8fa73cfce7..8fa73cfce7 100644
--- a/Documentation/RelNotes/2.12.5.txt
+++ b/Documentation/RelNotes/2.12.5.adoc
diff --git a/Documentation/RelNotes/2.13.0.txt b/Documentation/RelNotes/2.13.0.adoc
index 2a47b4cb0c..2a47b4cb0c 100644
--- a/Documentation/RelNotes/2.13.0.txt
+++ b/Documentation/RelNotes/2.13.0.adoc
diff --git a/Documentation/RelNotes/2.13.1.txt b/Documentation/RelNotes/2.13.1.adoc
index ed7cd976d9..ed7cd976d9 100644
--- a/Documentation/RelNotes/2.13.1.txt
+++ b/Documentation/RelNotes/2.13.1.adoc
diff --git a/Documentation/RelNotes/2.13.2.txt b/Documentation/RelNotes/2.13.2.adoc
index 8c2b20071e..8c2b20071e 100644
--- a/Documentation/RelNotes/2.13.2.txt
+++ b/Documentation/RelNotes/2.13.2.adoc
diff --git a/Documentation/RelNotes/2.13.3.txt b/Documentation/RelNotes/2.13.3.adoc
index 384e4de265..384e4de265 100644
--- a/Documentation/RelNotes/2.13.3.txt
+++ b/Documentation/RelNotes/2.13.3.adoc
diff --git a/Documentation/RelNotes/2.13.4.txt b/Documentation/RelNotes/2.13.4.adoc
index 9a9f8f9599..9a9f8f9599 100644
--- a/Documentation/RelNotes/2.13.4.txt
+++ b/Documentation/RelNotes/2.13.4.adoc
diff --git a/Documentation/RelNotes/2.13.5.txt b/Documentation/RelNotes/2.13.5.adoc
index 6949fcda78..6949fcda78 100644
--- a/Documentation/RelNotes/2.13.5.txt
+++ b/Documentation/RelNotes/2.13.5.adoc
diff --git a/Documentation/RelNotes/2.13.6.txt b/Documentation/RelNotes/2.13.6.adoc
index afcae9c808..afcae9c808 100644
--- a/Documentation/RelNotes/2.13.6.txt
+++ b/Documentation/RelNotes/2.13.6.adoc
diff --git a/Documentation/RelNotes/2.13.7.txt b/Documentation/RelNotes/2.13.7.adoc
index 09fc01406c..09fc01406c 100644
--- a/Documentation/RelNotes/2.13.7.txt
+++ b/Documentation/RelNotes/2.13.7.adoc
diff --git a/Documentation/RelNotes/2.14.0.txt b/Documentation/RelNotes/2.14.0.adoc
index 2711a2529d..2711a2529d 100644
--- a/Documentation/RelNotes/2.14.0.txt
+++ b/Documentation/RelNotes/2.14.0.adoc
diff --git a/Documentation/RelNotes/2.14.1.txt b/Documentation/RelNotes/2.14.1.adoc
index 9403340f7f..9403340f7f 100644
--- a/Documentation/RelNotes/2.14.1.txt
+++ b/Documentation/RelNotes/2.14.1.adoc
diff --git a/Documentation/RelNotes/2.14.2.txt b/Documentation/RelNotes/2.14.2.adoc
index bec9186ade..bec9186ade 100644
--- a/Documentation/RelNotes/2.14.2.txt
+++ b/Documentation/RelNotes/2.14.2.adoc
diff --git a/Documentation/RelNotes/2.14.3.txt b/Documentation/RelNotes/2.14.3.adoc
index 977c9e857c..977c9e857c 100644
--- a/Documentation/RelNotes/2.14.3.txt
+++ b/Documentation/RelNotes/2.14.3.adoc
diff --git a/Documentation/RelNotes/2.14.4.txt b/Documentation/RelNotes/2.14.4.adoc
index 97755a89d9..97755a89d9 100644
--- a/Documentation/RelNotes/2.14.4.txt
+++ b/Documentation/RelNotes/2.14.4.adoc
diff --git a/Documentation/RelNotes/2.14.5.txt b/Documentation/RelNotes/2.14.5.adoc
index 130645fb29..130645fb29 100644
--- a/Documentation/RelNotes/2.14.5.txt
+++ b/Documentation/RelNotes/2.14.5.adoc
diff --git a/Documentation/RelNotes/2.14.6.txt b/Documentation/RelNotes/2.14.6.adoc
index 72b7af6799..72b7af6799 100644
--- a/Documentation/RelNotes/2.14.6.txt
+++ b/Documentation/RelNotes/2.14.6.adoc
diff --git a/Documentation/RelNotes/2.15.0.txt b/Documentation/RelNotes/2.15.0.adoc
index cdd761bcc2..cdd761bcc2 100644
--- a/Documentation/RelNotes/2.15.0.txt
+++ b/Documentation/RelNotes/2.15.0.adoc
diff --git a/Documentation/RelNotes/2.15.1.txt b/Documentation/RelNotes/2.15.1.adoc
index ec06704e63..ec06704e63 100644
--- a/Documentation/RelNotes/2.15.1.txt
+++ b/Documentation/RelNotes/2.15.1.adoc
diff --git a/Documentation/RelNotes/2.15.2.txt b/Documentation/RelNotes/2.15.2.adoc
index b480e56b68..b480e56b68 100644
--- a/Documentation/RelNotes/2.15.2.txt
+++ b/Documentation/RelNotes/2.15.2.adoc
diff --git a/Documentation/RelNotes/2.15.3.txt b/Documentation/RelNotes/2.15.3.adoc
index fd2e6f8df7..fd2e6f8df7 100644
--- a/Documentation/RelNotes/2.15.3.txt
+++ b/Documentation/RelNotes/2.15.3.adoc
diff --git a/Documentation/RelNotes/2.15.4.txt b/Documentation/RelNotes/2.15.4.adoc
index dc241cba34..dc241cba34 100644
--- a/Documentation/RelNotes/2.15.4.txt
+++ b/Documentation/RelNotes/2.15.4.adoc
diff --git a/Documentation/RelNotes/2.16.0.txt b/Documentation/RelNotes/2.16.0.adoc
index b474781ed8..b474781ed8 100644
--- a/Documentation/RelNotes/2.16.0.txt
+++ b/Documentation/RelNotes/2.16.0.adoc
diff --git a/Documentation/RelNotes/2.16.1.txt b/Documentation/RelNotes/2.16.1.adoc
index 66e64361fd..66e64361fd 100644
--- a/Documentation/RelNotes/2.16.1.txt
+++ b/Documentation/RelNotes/2.16.1.adoc
diff --git a/Documentation/RelNotes/2.16.2.txt b/Documentation/RelNotes/2.16.2.adoc
index a216466d3d..a216466d3d 100644
--- a/Documentation/RelNotes/2.16.2.txt
+++ b/Documentation/RelNotes/2.16.2.adoc
diff --git a/Documentation/RelNotes/2.16.3.txt b/Documentation/RelNotes/2.16.3.adoc
index f0121a8f2d..f0121a8f2d 100644
--- a/Documentation/RelNotes/2.16.3.txt
+++ b/Documentation/RelNotes/2.16.3.adoc
diff --git a/Documentation/RelNotes/2.16.4.txt b/Documentation/RelNotes/2.16.4.adoc
index 6be538ba30..6be538ba30 100644
--- a/Documentation/RelNotes/2.16.4.txt
+++ b/Documentation/RelNotes/2.16.4.adoc
diff --git a/Documentation/RelNotes/2.16.5.txt b/Documentation/RelNotes/2.16.5.adoc
index cb8ee02a9a..cb8ee02a9a 100644
--- a/Documentation/RelNotes/2.16.5.txt
+++ b/Documentation/RelNotes/2.16.5.adoc
diff --git a/Documentation/RelNotes/2.16.6.txt b/Documentation/RelNotes/2.16.6.adoc
index 438306e60b..438306e60b 100644
--- a/Documentation/RelNotes/2.16.6.txt
+++ b/Documentation/RelNotes/2.16.6.adoc
diff --git a/Documentation/RelNotes/2.17.0.txt b/Documentation/RelNotes/2.17.0.adoc
index 8b17c26033..8b17c26033 100644
--- a/Documentation/RelNotes/2.17.0.txt
+++ b/Documentation/RelNotes/2.17.0.adoc
diff --git a/Documentation/RelNotes/2.17.1.txt b/Documentation/RelNotes/2.17.1.adoc
index e01384fe8e..e01384fe8e 100644
--- a/Documentation/RelNotes/2.17.1.txt
+++ b/Documentation/RelNotes/2.17.1.adoc
diff --git a/Documentation/RelNotes/2.17.2.txt b/Documentation/RelNotes/2.17.2.adoc
index ef021be870..ef021be870 100644
--- a/Documentation/RelNotes/2.17.2.txt
+++ b/Documentation/RelNotes/2.17.2.adoc
diff --git a/Documentation/RelNotes/2.17.3.txt b/Documentation/RelNotes/2.17.3.adoc
index 5a46c94271..5a46c94271 100644
--- a/Documentation/RelNotes/2.17.3.txt
+++ b/Documentation/RelNotes/2.17.3.adoc
diff --git a/Documentation/RelNotes/2.17.4.txt b/Documentation/RelNotes/2.17.4.adoc
index 7d794ca01a..7d794ca01a 100644
--- a/Documentation/RelNotes/2.17.4.txt
+++ b/Documentation/RelNotes/2.17.4.adoc
diff --git a/Documentation/RelNotes/2.17.5.txt b/Documentation/RelNotes/2.17.5.adoc
index 2abb821a73..2abb821a73 100644
--- a/Documentation/RelNotes/2.17.5.txt
+++ b/Documentation/RelNotes/2.17.5.adoc
diff --git a/Documentation/RelNotes/2.17.6.txt b/Documentation/RelNotes/2.17.6.adoc
index 2f181e8064..2f181e8064 100644
--- a/Documentation/RelNotes/2.17.6.txt
+++ b/Documentation/RelNotes/2.17.6.adoc
diff --git a/Documentation/RelNotes/2.18.0.txt b/Documentation/RelNotes/2.18.0.adoc
index 6c8a0e97c1..6c8a0e97c1 100644
--- a/Documentation/RelNotes/2.18.0.txt
+++ b/Documentation/RelNotes/2.18.0.adoc
diff --git a/Documentation/RelNotes/2.18.1.txt b/Documentation/RelNotes/2.18.1.adoc
index 2098cdd776..2098cdd776 100644
--- a/Documentation/RelNotes/2.18.1.txt
+++ b/Documentation/RelNotes/2.18.1.adoc
diff --git a/Documentation/RelNotes/2.18.2.txt b/Documentation/RelNotes/2.18.2.adoc
index 98b168aade..98b168aade 100644
--- a/Documentation/RelNotes/2.18.2.txt
+++ b/Documentation/RelNotes/2.18.2.adoc
diff --git a/Documentation/RelNotes/2.18.3.txt b/Documentation/RelNotes/2.18.3.adoc
index 25143f0cec..25143f0cec 100644
--- a/Documentation/RelNotes/2.18.3.txt
+++ b/Documentation/RelNotes/2.18.3.adoc
diff --git a/Documentation/RelNotes/2.18.4.txt b/Documentation/RelNotes/2.18.4.adoc
index e8ef858a00..e8ef858a00 100644
--- a/Documentation/RelNotes/2.18.4.txt
+++ b/Documentation/RelNotes/2.18.4.adoc
diff --git a/Documentation/RelNotes/2.18.5.txt b/Documentation/RelNotes/2.18.5.adoc
index dfb1de4ceb..dfb1de4ceb 100644
--- a/Documentation/RelNotes/2.18.5.txt
+++ b/Documentation/RelNotes/2.18.5.adoc
diff --git a/Documentation/RelNotes/2.19.0.txt b/Documentation/RelNotes/2.19.0.adoc
index 891c79b9cb..891c79b9cb 100644
--- a/Documentation/RelNotes/2.19.0.txt
+++ b/Documentation/RelNotes/2.19.0.adoc
diff --git a/Documentation/RelNotes/2.19.1.txt b/Documentation/RelNotes/2.19.1.adoc
index da7672674e..da7672674e 100644
--- a/Documentation/RelNotes/2.19.1.txt
+++ b/Documentation/RelNotes/2.19.1.adoc
diff --git a/Documentation/RelNotes/2.19.2.txt b/Documentation/RelNotes/2.19.2.adoc
index 759e6ca957..759e6ca957 100644
--- a/Documentation/RelNotes/2.19.2.txt
+++ b/Documentation/RelNotes/2.19.2.adoc
diff --git a/Documentation/RelNotes/2.19.3.txt b/Documentation/RelNotes/2.19.3.adoc
index 92d7f89de6..92d7f89de6 100644
--- a/Documentation/RelNotes/2.19.3.txt
+++ b/Documentation/RelNotes/2.19.3.adoc
diff --git a/Documentation/RelNotes/2.19.4.txt b/Documentation/RelNotes/2.19.4.adoc
index 35d0ae561b..35d0ae561b 100644
--- a/Documentation/RelNotes/2.19.4.txt
+++ b/Documentation/RelNotes/2.19.4.adoc
diff --git a/Documentation/RelNotes/2.19.5.txt b/Documentation/RelNotes/2.19.5.adoc
index 18a4dcbfd6..18a4dcbfd6 100644
--- a/Documentation/RelNotes/2.19.5.txt
+++ b/Documentation/RelNotes/2.19.5.adoc
diff --git a/Documentation/RelNotes/2.19.6.txt b/Documentation/RelNotes/2.19.6.adoc
index bcca6cd258..bcca6cd258 100644
--- a/Documentation/RelNotes/2.19.6.txt
+++ b/Documentation/RelNotes/2.19.6.adoc
diff --git a/Documentation/RelNotes/2.2.0.txt b/Documentation/RelNotes/2.2.0.adoc
index e98ecbcff6..e98ecbcff6 100644
--- a/Documentation/RelNotes/2.2.0.txt
+++ b/Documentation/RelNotes/2.2.0.adoc
diff --git a/Documentation/RelNotes/2.2.1.txt b/Documentation/RelNotes/2.2.1.adoc
index d5a3cd9e73..d5a3cd9e73 100644
--- a/Documentation/RelNotes/2.2.1.txt
+++ b/Documentation/RelNotes/2.2.1.adoc
diff --git a/Documentation/RelNotes/2.2.2.txt b/Documentation/RelNotes/2.2.2.adoc
index b19a35d94f..b19a35d94f 100644
--- a/Documentation/RelNotes/2.2.2.txt
+++ b/Documentation/RelNotes/2.2.2.adoc
diff --git a/Documentation/RelNotes/2.2.3.txt b/Documentation/RelNotes/2.2.3.adoc
index 5bfffa4106..5bfffa4106 100644
--- a/Documentation/RelNotes/2.2.3.txt
+++ b/Documentation/RelNotes/2.2.3.adoc
diff --git a/Documentation/RelNotes/2.20.0.txt b/Documentation/RelNotes/2.20.0.adoc
index 3dd7e6e1fc..3dd7e6e1fc 100644
--- a/Documentation/RelNotes/2.20.0.txt
+++ b/Documentation/RelNotes/2.20.0.adoc
diff --git a/Documentation/RelNotes/2.20.1.txt b/Documentation/RelNotes/2.20.1.adoc
index dcba888dba..dcba888dba 100644
--- a/Documentation/RelNotes/2.20.1.txt
+++ b/Documentation/RelNotes/2.20.1.adoc
diff --git a/Documentation/RelNotes/2.20.2.txt b/Documentation/RelNotes/2.20.2.adoc
index 8e680cb9fb..8e680cb9fb 100644
--- a/Documentation/RelNotes/2.20.2.txt
+++ b/Documentation/RelNotes/2.20.2.adoc
diff --git a/Documentation/RelNotes/2.20.3.txt b/Documentation/RelNotes/2.20.3.adoc
index f6eccd103b..f6eccd103b 100644
--- a/Documentation/RelNotes/2.20.3.txt
+++ b/Documentation/RelNotes/2.20.3.adoc
diff --git a/Documentation/RelNotes/2.20.4.txt b/Documentation/RelNotes/2.20.4.adoc
index 5a9e24e470..5a9e24e470 100644
--- a/Documentation/RelNotes/2.20.4.txt
+++ b/Documentation/RelNotes/2.20.4.adoc
diff --git a/Documentation/RelNotes/2.20.5.txt b/Documentation/RelNotes/2.20.5.adoc
index 1dfb784ded..1dfb784ded 100644
--- a/Documentation/RelNotes/2.20.5.txt
+++ b/Documentation/RelNotes/2.20.5.adoc
diff --git a/Documentation/RelNotes/2.21.0.txt b/Documentation/RelNotes/2.21.0.adoc
index 7a49deddf3..7a49deddf3 100644
--- a/Documentation/RelNotes/2.21.0.txt
+++ b/Documentation/RelNotes/2.21.0.adoc
diff --git a/Documentation/RelNotes/2.21.1.txt b/Documentation/RelNotes/2.21.1.adoc
index b7594151e4..b7594151e4 100644
--- a/Documentation/RelNotes/2.21.1.txt
+++ b/Documentation/RelNotes/2.21.1.adoc
diff --git a/Documentation/RelNotes/2.21.2.txt b/Documentation/RelNotes/2.21.2.adoc
index a0fb83bb53..a0fb83bb53 100644
--- a/Documentation/RelNotes/2.21.2.txt
+++ b/Documentation/RelNotes/2.21.2.adoc
diff --git a/Documentation/RelNotes/2.21.3.txt b/Documentation/RelNotes/2.21.3.adoc
index 2ca0aa5c62..2ca0aa5c62 100644
--- a/Documentation/RelNotes/2.21.3.txt
+++ b/Documentation/RelNotes/2.21.3.adoc
diff --git a/Documentation/RelNotes/2.21.4.txt b/Documentation/RelNotes/2.21.4.adoc
index 0089dd6702..0089dd6702 100644
--- a/Documentation/RelNotes/2.21.4.txt
+++ b/Documentation/RelNotes/2.21.4.adoc
diff --git a/Documentation/RelNotes/2.22.0.txt b/Documentation/RelNotes/2.22.0.adoc
index 91e6ae9887..91e6ae9887 100644
--- a/Documentation/RelNotes/2.22.0.txt
+++ b/Documentation/RelNotes/2.22.0.adoc
diff --git a/Documentation/RelNotes/2.22.1.txt b/Documentation/RelNotes/2.22.1.adoc
index 432762f270..432762f270 100644
--- a/Documentation/RelNotes/2.22.1.txt
+++ b/Documentation/RelNotes/2.22.1.adoc
diff --git a/Documentation/RelNotes/2.22.2.txt b/Documentation/RelNotes/2.22.2.adoc
index 940a23f0d9..940a23f0d9 100644
--- a/Documentation/RelNotes/2.22.2.txt
+++ b/Documentation/RelNotes/2.22.2.adoc
diff --git a/Documentation/RelNotes/2.22.3.txt b/Documentation/RelNotes/2.22.3.adoc
index 57296f6d17..57296f6d17 100644
--- a/Documentation/RelNotes/2.22.3.txt
+++ b/Documentation/RelNotes/2.22.3.adoc
diff --git a/Documentation/RelNotes/2.22.4.txt b/Documentation/RelNotes/2.22.4.adoc
index 8b5f3e3f37..8b5f3e3f37 100644
--- a/Documentation/RelNotes/2.22.4.txt
+++ b/Documentation/RelNotes/2.22.4.adoc
diff --git a/Documentation/RelNotes/2.22.5.txt b/Documentation/RelNotes/2.22.5.adoc
index 6b280d9321..6b280d9321 100644
--- a/Documentation/RelNotes/2.22.5.txt
+++ b/Documentation/RelNotes/2.22.5.adoc
diff --git a/Documentation/RelNotes/2.23.0.txt b/Documentation/RelNotes/2.23.0.adoc
index e3c4e78265..e3c4e78265 100644
--- a/Documentation/RelNotes/2.23.0.txt
+++ b/Documentation/RelNotes/2.23.0.adoc
diff --git a/Documentation/RelNotes/2.23.1.txt b/Documentation/RelNotes/2.23.1.adoc
index 2083b492ce..2083b492ce 100644
--- a/Documentation/RelNotes/2.23.1.txt
+++ b/Documentation/RelNotes/2.23.1.adoc
diff --git a/Documentation/RelNotes/2.23.2.txt b/Documentation/RelNotes/2.23.2.adoc
index b697cbe0e3..b697cbe0e3 100644
--- a/Documentation/RelNotes/2.23.2.txt
+++ b/Documentation/RelNotes/2.23.2.adoc
diff --git a/Documentation/RelNotes/2.23.3.txt b/Documentation/RelNotes/2.23.3.adoc
index 2e35490137..2e35490137 100644
--- a/Documentation/RelNotes/2.23.3.txt
+++ b/Documentation/RelNotes/2.23.3.adoc
diff --git a/Documentation/RelNotes/2.23.4.txt b/Documentation/RelNotes/2.23.4.adoc
index 6e5424d0da..6e5424d0da 100644
--- a/Documentation/RelNotes/2.23.4.txt
+++ b/Documentation/RelNotes/2.23.4.adoc
diff --git a/Documentation/RelNotes/2.24.0.txt b/Documentation/RelNotes/2.24.0.adoc
index bde154124c..bde154124c 100644
--- a/Documentation/RelNotes/2.24.0.txt
+++ b/Documentation/RelNotes/2.24.0.adoc
diff --git a/Documentation/RelNotes/2.24.1.txt b/Documentation/RelNotes/2.24.1.adoc
index 18104850fe..18104850fe 100644
--- a/Documentation/RelNotes/2.24.1.txt
+++ b/Documentation/RelNotes/2.24.1.adoc
diff --git a/Documentation/RelNotes/2.24.2.txt b/Documentation/RelNotes/2.24.2.adoc
index 0049f65503..0049f65503 100644
--- a/Documentation/RelNotes/2.24.2.txt
+++ b/Documentation/RelNotes/2.24.2.adoc
diff --git a/Documentation/RelNotes/2.24.3.txt b/Documentation/RelNotes/2.24.3.adoc
index 5302e0f73b..5302e0f73b 100644
--- a/Documentation/RelNotes/2.24.3.txt
+++ b/Documentation/RelNotes/2.24.3.adoc
diff --git a/Documentation/RelNotes/2.24.4.txt b/Documentation/RelNotes/2.24.4.adoc
index 4e216eec2a..4e216eec2a 100644
--- a/Documentation/RelNotes/2.24.4.txt
+++ b/Documentation/RelNotes/2.24.4.adoc
diff --git a/Documentation/RelNotes/2.25.0.txt b/Documentation/RelNotes/2.25.0.adoc
index 91ceb34927..91ceb34927 100644
--- a/Documentation/RelNotes/2.25.0.txt
+++ b/Documentation/RelNotes/2.25.0.adoc
diff --git a/Documentation/RelNotes/2.25.1.txt b/Documentation/RelNotes/2.25.1.adoc
index cd869b02bb..cd869b02bb 100644
--- a/Documentation/RelNotes/2.25.1.txt
+++ b/Documentation/RelNotes/2.25.1.adoc
diff --git a/Documentation/RelNotes/2.25.2.txt b/Documentation/RelNotes/2.25.2.adoc
index 303c53a17f..303c53a17f 100644
--- a/Documentation/RelNotes/2.25.2.txt
+++ b/Documentation/RelNotes/2.25.2.adoc
diff --git a/Documentation/RelNotes/2.25.3.txt b/Documentation/RelNotes/2.25.3.adoc
index 15f7f21f10..15f7f21f10 100644
--- a/Documentation/RelNotes/2.25.3.txt
+++ b/Documentation/RelNotes/2.25.3.adoc
diff --git a/Documentation/RelNotes/2.25.4.txt b/Documentation/RelNotes/2.25.4.adoc
index 0dbb5daeec..0dbb5daeec 100644
--- a/Documentation/RelNotes/2.25.4.txt
+++ b/Documentation/RelNotes/2.25.4.adoc
diff --git a/Documentation/RelNotes/2.25.5.txt b/Documentation/RelNotes/2.25.5.adoc
index fcb9566b15..fcb9566b15 100644
--- a/Documentation/RelNotes/2.25.5.txt
+++ b/Documentation/RelNotes/2.25.5.adoc
diff --git a/Documentation/RelNotes/2.26.0.txt b/Documentation/RelNotes/2.26.0.adoc
index 3a7a734c26..3a7a734c26 100644
--- a/Documentation/RelNotes/2.26.0.txt
+++ b/Documentation/RelNotes/2.26.0.adoc
diff --git a/Documentation/RelNotes/2.26.1.txt b/Documentation/RelNotes/2.26.1.adoc
index 1b4ecb3fdc..1b4ecb3fdc 100644
--- a/Documentation/RelNotes/2.26.1.txt
+++ b/Documentation/RelNotes/2.26.1.adoc
diff --git a/Documentation/RelNotes/2.26.2.txt b/Documentation/RelNotes/2.26.2.adoc
index d434d0c695..d434d0c695 100644
--- a/Documentation/RelNotes/2.26.2.txt
+++ b/Documentation/RelNotes/2.26.2.adoc
diff --git a/Documentation/RelNotes/2.26.3.txt b/Documentation/RelNotes/2.26.3.adoc
index 4111c38f0a..4111c38f0a 100644
--- a/Documentation/RelNotes/2.26.3.txt
+++ b/Documentation/RelNotes/2.26.3.adoc
diff --git a/Documentation/RelNotes/2.27.0.txt b/Documentation/RelNotes/2.27.0.adoc
index 15518d06c1..15518d06c1 100644
--- a/Documentation/RelNotes/2.27.0.txt
+++ b/Documentation/RelNotes/2.27.0.adoc
diff --git a/Documentation/RelNotes/2.27.1.txt b/Documentation/RelNotes/2.27.1.adoc
index a1e08a9f72..a1e08a9f72 100644
--- a/Documentation/RelNotes/2.27.1.txt
+++ b/Documentation/RelNotes/2.27.1.adoc
diff --git a/Documentation/RelNotes/2.28.0.txt b/Documentation/RelNotes/2.28.0.adoc
index 6baf781380..6baf781380 100644
--- a/Documentation/RelNotes/2.28.0.txt
+++ b/Documentation/RelNotes/2.28.0.adoc
diff --git a/Documentation/RelNotes/2.28.1.txt b/Documentation/RelNotes/2.28.1.adoc
index 8484c8297c..8484c8297c 100644
--- a/Documentation/RelNotes/2.28.1.txt
+++ b/Documentation/RelNotes/2.28.1.adoc
diff --git a/Documentation/RelNotes/2.29.0.txt b/Documentation/RelNotes/2.29.0.adoc
index 1f41302ebb..1f41302ebb 100644
--- a/Documentation/RelNotes/2.29.0.txt
+++ b/Documentation/RelNotes/2.29.0.adoc
diff --git a/Documentation/RelNotes/2.29.1.txt b/Documentation/RelNotes/2.29.1.adoc
index 295ee2135f..295ee2135f 100644
--- a/Documentation/RelNotes/2.29.1.txt
+++ b/Documentation/RelNotes/2.29.1.adoc
diff --git a/Documentation/RelNotes/2.29.2.txt b/Documentation/RelNotes/2.29.2.adoc
index 632b5b580a..632b5b580a 100644
--- a/Documentation/RelNotes/2.29.2.txt
+++ b/Documentation/RelNotes/2.29.2.adoc
diff --git a/Documentation/RelNotes/2.29.3.txt b/Documentation/RelNotes/2.29.3.adoc
index e10eedb35a..e10eedb35a 100644
--- a/Documentation/RelNotes/2.29.3.txt
+++ b/Documentation/RelNotes/2.29.3.adoc
diff --git a/Documentation/RelNotes/2.3.0.txt b/Documentation/RelNotes/2.3.0.adoc
index e3c639c840..e3c639c840 100644
--- a/Documentation/RelNotes/2.3.0.txt
+++ b/Documentation/RelNotes/2.3.0.adoc
diff --git a/Documentation/RelNotes/2.3.1.txt b/Documentation/RelNotes/2.3.1.adoc
index cf96186288..cf96186288 100644
--- a/Documentation/RelNotes/2.3.1.txt
+++ b/Documentation/RelNotes/2.3.1.adoc
diff --git a/Documentation/RelNotes/2.3.10.txt b/Documentation/RelNotes/2.3.10.adoc
index 20c2d2cacc..20c2d2cacc 100644
--- a/Documentation/RelNotes/2.3.10.txt
+++ b/Documentation/RelNotes/2.3.10.adoc
diff --git a/Documentation/RelNotes/2.3.2.txt b/Documentation/RelNotes/2.3.2.adoc
index 93462e45c2..93462e45c2 100644
--- a/Documentation/RelNotes/2.3.2.txt
+++ b/Documentation/RelNotes/2.3.2.adoc
diff --git a/Documentation/RelNotes/2.3.3.txt b/Documentation/RelNotes/2.3.3.adoc
index 850dc68ede..850dc68ede 100644
--- a/Documentation/RelNotes/2.3.3.txt
+++ b/Documentation/RelNotes/2.3.3.adoc
diff --git a/Documentation/RelNotes/2.3.4.txt b/Documentation/RelNotes/2.3.4.adoc
index 094c7b853b..094c7b853b 100644
--- a/Documentation/RelNotes/2.3.4.txt
+++ b/Documentation/RelNotes/2.3.4.adoc
diff --git a/Documentation/RelNotes/2.3.5.txt b/Documentation/RelNotes/2.3.5.adoc
index 5b309db689..5b309db689 100644
--- a/Documentation/RelNotes/2.3.5.txt
+++ b/Documentation/RelNotes/2.3.5.adoc
diff --git a/Documentation/RelNotes/2.3.6.txt b/Documentation/RelNotes/2.3.6.adoc
index 432f770ef3..432f770ef3 100644
--- a/Documentation/RelNotes/2.3.6.txt
+++ b/Documentation/RelNotes/2.3.6.adoc
diff --git a/Documentation/RelNotes/2.3.7.txt b/Documentation/RelNotes/2.3.7.adoc
index 5769184081..5769184081 100644
--- a/Documentation/RelNotes/2.3.7.txt
+++ b/Documentation/RelNotes/2.3.7.adoc
diff --git a/Documentation/RelNotes/2.3.8.txt b/Documentation/RelNotes/2.3.8.adoc
index 0b67268a96..0b67268a96 100644
--- a/Documentation/RelNotes/2.3.8.txt
+++ b/Documentation/RelNotes/2.3.8.adoc
diff --git a/Documentation/RelNotes/2.3.9.txt b/Documentation/RelNotes/2.3.9.adoc
index 1a2ad3235a..1a2ad3235a 100644
--- a/Documentation/RelNotes/2.3.9.txt
+++ b/Documentation/RelNotes/2.3.9.adoc
diff --git a/Documentation/RelNotes/2.30.0.txt b/Documentation/RelNotes/2.30.0.adoc
index c2f1dc7b06..c2f1dc7b06 100644
--- a/Documentation/RelNotes/2.30.0.txt
+++ b/Documentation/RelNotes/2.30.0.adoc
diff --git a/Documentation/RelNotes/2.30.1.txt b/Documentation/RelNotes/2.30.1.adoc
index 249ef1492f..249ef1492f 100644
--- a/Documentation/RelNotes/2.30.1.txt
+++ b/Documentation/RelNotes/2.30.1.adoc
diff --git a/Documentation/RelNotes/2.30.2.txt b/Documentation/RelNotes/2.30.2.adoc
index bada398501..bada398501 100644
--- a/Documentation/RelNotes/2.30.2.txt
+++ b/Documentation/RelNotes/2.30.2.adoc
diff --git a/Documentation/RelNotes/2.30.3.txt b/Documentation/RelNotes/2.30.3.adoc
index 31b2a4daa6..31b2a4daa6 100644
--- a/Documentation/RelNotes/2.30.3.txt
+++ b/Documentation/RelNotes/2.30.3.adoc
diff --git a/Documentation/RelNotes/2.30.4.txt b/Documentation/RelNotes/2.30.4.adoc
index 4eedb74b16..4eedb74b16 100644
--- a/Documentation/RelNotes/2.30.4.txt
+++ b/Documentation/RelNotes/2.30.4.adoc
diff --git a/Documentation/RelNotes/2.30.5.txt b/Documentation/RelNotes/2.30.5.adoc
index 5191cab3ae..5191cab3ae 100644
--- a/Documentation/RelNotes/2.30.5.txt
+++ b/Documentation/RelNotes/2.30.5.adoc
diff --git a/Documentation/RelNotes/2.30.6.txt b/Documentation/RelNotes/2.30.6.adoc
index d649071b79..d649071b79 100644
--- a/Documentation/RelNotes/2.30.6.txt
+++ b/Documentation/RelNotes/2.30.6.adoc
diff --git a/Documentation/RelNotes/2.30.7.txt b/Documentation/RelNotes/2.30.7.adoc
index 285beed232..285beed232 100644
--- a/Documentation/RelNotes/2.30.7.txt
+++ b/Documentation/RelNotes/2.30.7.adoc
diff --git a/Documentation/RelNotes/2.30.8.txt b/Documentation/RelNotes/2.30.8.adoc
index 5ed3efbd6a..5ed3efbd6a 100644
--- a/Documentation/RelNotes/2.30.8.txt
+++ b/Documentation/RelNotes/2.30.8.adoc
diff --git a/Documentation/RelNotes/2.30.9.txt b/Documentation/RelNotes/2.30.9.adoc
index 708d626ce6..708d626ce6 100644
--- a/Documentation/RelNotes/2.30.9.txt
+++ b/Documentation/RelNotes/2.30.9.adoc
diff --git a/Documentation/RelNotes/2.31.0.txt b/Documentation/RelNotes/2.31.0.adoc
index cf0c7d8d40..cf0c7d8d40 100644
--- a/Documentation/RelNotes/2.31.0.txt
+++ b/Documentation/RelNotes/2.31.0.adoc
diff --git a/Documentation/RelNotes/2.31.1.txt b/Documentation/RelNotes/2.31.1.adoc
index f9b06b8e1b..f9b06b8e1b 100644
--- a/Documentation/RelNotes/2.31.1.txt
+++ b/Documentation/RelNotes/2.31.1.adoc
diff --git a/Documentation/RelNotes/2.31.2.txt b/Documentation/RelNotes/2.31.2.adoc
index aa13a5b022..aa13a5b022 100644
--- a/Documentation/RelNotes/2.31.2.txt
+++ b/Documentation/RelNotes/2.31.2.adoc
diff --git a/Documentation/RelNotes/2.31.3.txt b/Documentation/RelNotes/2.31.3.adoc
index ca143abad0..ca143abad0 100644
--- a/Documentation/RelNotes/2.31.3.txt
+++ b/Documentation/RelNotes/2.31.3.adoc
diff --git a/Documentation/RelNotes/2.31.4.txt b/Documentation/RelNotes/2.31.4.adoc
index 97a91fd07a..97a91fd07a 100644
--- a/Documentation/RelNotes/2.31.4.txt
+++ b/Documentation/RelNotes/2.31.4.adoc
diff --git a/Documentation/RelNotes/2.31.5.txt b/Documentation/RelNotes/2.31.5.adoc
index 0d87e6e03f..0d87e6e03f 100644
--- a/Documentation/RelNotes/2.31.5.txt
+++ b/Documentation/RelNotes/2.31.5.adoc
diff --git a/Documentation/RelNotes/2.31.6.txt b/Documentation/RelNotes/2.31.6.adoc
index 425a51875a..425a51875a 100644
--- a/Documentation/RelNotes/2.31.6.txt
+++ b/Documentation/RelNotes/2.31.6.adoc
diff --git a/Documentation/RelNotes/2.31.7.txt b/Documentation/RelNotes/2.31.7.adoc
index dd44d5bc62..dd44d5bc62 100644
--- a/Documentation/RelNotes/2.31.7.txt
+++ b/Documentation/RelNotes/2.31.7.adoc
diff --git a/Documentation/RelNotes/2.31.8.txt b/Documentation/RelNotes/2.31.8.adoc
index 0aa3080780..0aa3080780 100644
--- a/Documentation/RelNotes/2.31.8.txt
+++ b/Documentation/RelNotes/2.31.8.adoc
diff --git a/Documentation/RelNotes/2.32.0.txt b/Documentation/RelNotes/2.32.0.adoc
index 87d56fa1aa..87d56fa1aa 100644
--- a/Documentation/RelNotes/2.32.0.txt
+++ b/Documentation/RelNotes/2.32.0.adoc
diff --git a/Documentation/RelNotes/2.32.1.txt b/Documentation/RelNotes/2.32.1.adoc
index 7dcca13b92..7dcca13b92 100644
--- a/Documentation/RelNotes/2.32.1.txt
+++ b/Documentation/RelNotes/2.32.1.adoc
diff --git a/Documentation/RelNotes/2.32.2.txt b/Documentation/RelNotes/2.32.2.adoc
index cf49695f2f..cf49695f2f 100644
--- a/Documentation/RelNotes/2.32.2.txt
+++ b/Documentation/RelNotes/2.32.2.adoc
diff --git a/Documentation/RelNotes/2.32.3.txt b/Documentation/RelNotes/2.32.3.adoc
index 583fabe684..583fabe684 100644
--- a/Documentation/RelNotes/2.32.3.txt
+++ b/Documentation/RelNotes/2.32.3.adoc
diff --git a/Documentation/RelNotes/2.32.4.txt b/Documentation/RelNotes/2.32.4.adoc
index 76c67b209e..76c67b209e 100644
--- a/Documentation/RelNotes/2.32.4.txt
+++ b/Documentation/RelNotes/2.32.4.adoc
diff --git a/Documentation/RelNotes/2.32.5.txt b/Documentation/RelNotes/2.32.5.adoc
index a8cad1a05b..a8cad1a05b 100644
--- a/Documentation/RelNotes/2.32.5.txt
+++ b/Documentation/RelNotes/2.32.5.adoc
diff --git a/Documentation/RelNotes/2.32.6.txt b/Documentation/RelNotes/2.32.6.adoc
index fd659612e3..fd659612e3 100644
--- a/Documentation/RelNotes/2.32.6.txt
+++ b/Documentation/RelNotes/2.32.6.adoc
diff --git a/Documentation/RelNotes/2.32.7.txt b/Documentation/RelNotes/2.32.7.adoc
index 7bb35388b5..7bb35388b5 100644
--- a/Documentation/RelNotes/2.32.7.txt
+++ b/Documentation/RelNotes/2.32.7.adoc
diff --git a/Documentation/RelNotes/2.33.0.txt b/Documentation/RelNotes/2.33.0.adoc
index 893c18bfdd..893c18bfdd 100644
--- a/Documentation/RelNotes/2.33.0.txt
+++ b/Documentation/RelNotes/2.33.0.adoc
diff --git a/Documentation/RelNotes/2.33.1.txt b/Documentation/RelNotes/2.33.1.adoc
index b71738e654..b71738e654 100644
--- a/Documentation/RelNotes/2.33.1.txt
+++ b/Documentation/RelNotes/2.33.1.adoc
diff --git a/Documentation/RelNotes/2.33.2.txt b/Documentation/RelNotes/2.33.2.adoc
index e504489d61..e504489d61 100644
--- a/Documentation/RelNotes/2.33.2.txt
+++ b/Documentation/RelNotes/2.33.2.adoc
diff --git a/Documentation/RelNotes/2.33.3.txt b/Documentation/RelNotes/2.33.3.adoc
index e2bada12a1..e2bada12a1 100644
--- a/Documentation/RelNotes/2.33.3.txt
+++ b/Documentation/RelNotes/2.33.3.adoc
diff --git a/Documentation/RelNotes/2.33.4.txt b/Documentation/RelNotes/2.33.4.adoc
index a145cc25de..a145cc25de 100644
--- a/Documentation/RelNotes/2.33.4.txt
+++ b/Documentation/RelNotes/2.33.4.adoc
diff --git a/Documentation/RelNotes/2.33.5.txt b/Documentation/RelNotes/2.33.5.adoc
index a63652602b..a63652602b 100644
--- a/Documentation/RelNotes/2.33.5.txt
+++ b/Documentation/RelNotes/2.33.5.adoc
diff --git a/Documentation/RelNotes/2.33.6.txt b/Documentation/RelNotes/2.33.6.adoc
index b63e4e6256..b63e4e6256 100644
--- a/Documentation/RelNotes/2.33.6.txt
+++ b/Documentation/RelNotes/2.33.6.adoc
diff --git a/Documentation/RelNotes/2.33.7.txt b/Documentation/RelNotes/2.33.7.adoc
index 078a837cb4..078a837cb4 100644
--- a/Documentation/RelNotes/2.33.7.txt
+++ b/Documentation/RelNotes/2.33.7.adoc
diff --git a/Documentation/RelNotes/2.33.8.txt b/Documentation/RelNotes/2.33.8.adoc
index d8cf4c7f3a..d8cf4c7f3a 100644
--- a/Documentation/RelNotes/2.33.8.txt
+++ b/Documentation/RelNotes/2.33.8.adoc
diff --git a/Documentation/RelNotes/2.34.0.txt b/Documentation/RelNotes/2.34.0.adoc
index 75d4fdfde7..75d4fdfde7 100644
--- a/Documentation/RelNotes/2.34.0.txt
+++ b/Documentation/RelNotes/2.34.0.adoc
diff --git a/Documentation/RelNotes/2.34.1.txt b/Documentation/RelNotes/2.34.1.adoc
index ad404e9aa0..ad404e9aa0 100644
--- a/Documentation/RelNotes/2.34.1.txt
+++ b/Documentation/RelNotes/2.34.1.adoc
diff --git a/Documentation/RelNotes/2.34.2.txt b/Documentation/RelNotes/2.34.2.adoc
index 0c32cd844b..0c32cd844b 100644
--- a/Documentation/RelNotes/2.34.2.txt
+++ b/Documentation/RelNotes/2.34.2.adoc
diff --git a/Documentation/RelNotes/2.34.3.txt b/Documentation/RelNotes/2.34.3.adoc
index 10f6171ace..10f6171ace 100644
--- a/Documentation/RelNotes/2.34.3.txt
+++ b/Documentation/RelNotes/2.34.3.adoc
diff --git a/Documentation/RelNotes/2.34.4.txt b/Documentation/RelNotes/2.34.4.adoc
index 2a6b223403..2a6b223403 100644
--- a/Documentation/RelNotes/2.34.4.txt
+++ b/Documentation/RelNotes/2.34.4.adoc
diff --git a/Documentation/RelNotes/2.34.5.txt b/Documentation/RelNotes/2.34.5.adoc
index 0e8999204d..0e8999204d 100644
--- a/Documentation/RelNotes/2.34.5.txt
+++ b/Documentation/RelNotes/2.34.5.adoc
diff --git a/Documentation/RelNotes/2.34.6.txt b/Documentation/RelNotes/2.34.6.adoc
index b32080dba8..b32080dba8 100644
--- a/Documentation/RelNotes/2.34.6.txt
+++ b/Documentation/RelNotes/2.34.6.adoc
diff --git a/Documentation/RelNotes/2.34.7.txt b/Documentation/RelNotes/2.34.7.adoc
index 88898adacc..88898adacc 100644
--- a/Documentation/RelNotes/2.34.7.txt
+++ b/Documentation/RelNotes/2.34.7.adoc
diff --git a/Documentation/RelNotes/2.34.8.txt b/Documentation/RelNotes/2.34.8.adoc
index 2b5bd7d9a3..2b5bd7d9a3 100644
--- a/Documentation/RelNotes/2.34.8.txt
+++ b/Documentation/RelNotes/2.34.8.adoc
diff --git a/Documentation/RelNotes/2.35.0.txt b/Documentation/RelNotes/2.35.0.adoc
index d69b50d180..d69b50d180 100644
--- a/Documentation/RelNotes/2.35.0.txt
+++ b/Documentation/RelNotes/2.35.0.adoc
diff --git a/Documentation/RelNotes/2.35.1.txt b/Documentation/RelNotes/2.35.1.adoc
index 726ba250ef..726ba250ef 100644
--- a/Documentation/RelNotes/2.35.1.txt
+++ b/Documentation/RelNotes/2.35.1.adoc
diff --git a/Documentation/RelNotes/2.35.2.txt b/Documentation/RelNotes/2.35.2.adoc
index 290bfa9ea4..290bfa9ea4 100644
--- a/Documentation/RelNotes/2.35.2.txt
+++ b/Documentation/RelNotes/2.35.2.adoc
diff --git a/Documentation/RelNotes/2.35.3.txt b/Documentation/RelNotes/2.35.3.adoc
index 5458ba3441..5458ba3441 100644
--- a/Documentation/RelNotes/2.35.3.txt
+++ b/Documentation/RelNotes/2.35.3.adoc
diff --git a/Documentation/RelNotes/2.35.4.txt b/Documentation/RelNotes/2.35.4.adoc
index 47abd5ad45..47abd5ad45 100644
--- a/Documentation/RelNotes/2.35.4.txt
+++ b/Documentation/RelNotes/2.35.4.adoc
diff --git a/Documentation/RelNotes/2.35.5.txt b/Documentation/RelNotes/2.35.5.adoc
index e19cc48b33..e19cc48b33 100644
--- a/Documentation/RelNotes/2.35.5.txt
+++ b/Documentation/RelNotes/2.35.5.adoc
diff --git a/Documentation/RelNotes/2.35.6.txt b/Documentation/RelNotes/2.35.6.adoc
index e7ca57bb41..e7ca57bb41 100644
--- a/Documentation/RelNotes/2.35.6.txt
+++ b/Documentation/RelNotes/2.35.6.adoc
diff --git a/Documentation/RelNotes/2.35.7.txt b/Documentation/RelNotes/2.35.7.adoc
index 42baabfc3b..42baabfc3b 100644
--- a/Documentation/RelNotes/2.35.7.txt
+++ b/Documentation/RelNotes/2.35.7.adoc
diff --git a/Documentation/RelNotes/2.35.8.txt b/Documentation/RelNotes/2.35.8.adoc
index 3c9c094c2b..3c9c094c2b 100644
--- a/Documentation/RelNotes/2.35.8.txt
+++ b/Documentation/RelNotes/2.35.8.adoc
diff --git a/Documentation/RelNotes/2.36.0.txt b/Documentation/RelNotes/2.36.0.adoc
index e477fba12d..e477fba12d 100644
--- a/Documentation/RelNotes/2.36.0.txt
+++ b/Documentation/RelNotes/2.36.0.adoc
diff --git a/Documentation/RelNotes/2.36.1.txt b/Documentation/RelNotes/2.36.1.adoc
index a9617095db..a9617095db 100644
--- a/Documentation/RelNotes/2.36.1.txt
+++ b/Documentation/RelNotes/2.36.1.adoc
diff --git a/Documentation/RelNotes/2.36.2.txt b/Documentation/RelNotes/2.36.2.adoc
index 958f5b4102..958f5b4102 100644
--- a/Documentation/RelNotes/2.36.2.txt
+++ b/Documentation/RelNotes/2.36.2.adoc
diff --git a/Documentation/RelNotes/2.36.3.txt b/Documentation/RelNotes/2.36.3.adoc
index 56db77b5bd..56db77b5bd 100644
--- a/Documentation/RelNotes/2.36.3.txt
+++ b/Documentation/RelNotes/2.36.3.adoc
diff --git a/Documentation/RelNotes/2.36.4.txt b/Documentation/RelNotes/2.36.4.adoc
index 58fb93a35f..58fb93a35f 100644
--- a/Documentation/RelNotes/2.36.4.txt
+++ b/Documentation/RelNotes/2.36.4.adoc
diff --git a/Documentation/RelNotes/2.36.5.txt b/Documentation/RelNotes/2.36.5.adoc
index 8a098c7916..8a098c7916 100644
--- a/Documentation/RelNotes/2.36.5.txt
+++ b/Documentation/RelNotes/2.36.5.adoc
diff --git a/Documentation/RelNotes/2.36.6.txt b/Documentation/RelNotes/2.36.6.adoc
index e1edebcc43..e1edebcc43 100644
--- a/Documentation/RelNotes/2.36.6.txt
+++ b/Documentation/RelNotes/2.36.6.adoc
diff --git a/Documentation/RelNotes/2.37.0.txt b/Documentation/RelNotes/2.37.0.adoc
index 99dc7e32f8..99dc7e32f8 100644
--- a/Documentation/RelNotes/2.37.0.txt
+++ b/Documentation/RelNotes/2.37.0.adoc
diff --git a/Documentation/RelNotes/2.37.1.txt b/Documentation/RelNotes/2.37.1.adoc
index 84609327d1..84609327d1 100644
--- a/Documentation/RelNotes/2.37.1.txt
+++ b/Documentation/RelNotes/2.37.1.adoc
diff --git a/Documentation/RelNotes/2.37.2.txt b/Documentation/RelNotes/2.37.2.adoc
index d82b29e014..d82b29e014 100644
--- a/Documentation/RelNotes/2.37.2.txt
+++ b/Documentation/RelNotes/2.37.2.adoc
diff --git a/Documentation/RelNotes/2.37.3.txt b/Documentation/RelNotes/2.37.3.adoc
index d66689e598..d66689e598 100644
--- a/Documentation/RelNotes/2.37.3.txt
+++ b/Documentation/RelNotes/2.37.3.adoc
diff --git a/Documentation/RelNotes/2.37.4.txt b/Documentation/RelNotes/2.37.4.adoc
index e42a5c1620..e42a5c1620 100644
--- a/Documentation/RelNotes/2.37.4.txt
+++ b/Documentation/RelNotes/2.37.4.adoc
diff --git a/Documentation/RelNotes/2.37.5.txt b/Documentation/RelNotes/2.37.5.adoc
index faa1447292..faa1447292 100644
--- a/Documentation/RelNotes/2.37.5.txt
+++ b/Documentation/RelNotes/2.37.5.adoc
diff --git a/Documentation/RelNotes/2.37.6.txt b/Documentation/RelNotes/2.37.6.adoc
index 51dc149711..51dc149711 100644
--- a/Documentation/RelNotes/2.37.6.txt
+++ b/Documentation/RelNotes/2.37.6.adoc
diff --git a/Documentation/RelNotes/2.37.7.txt b/Documentation/RelNotes/2.37.7.adoc
index 4b8165f4b5..4b8165f4b5 100644
--- a/Documentation/RelNotes/2.37.7.txt
+++ b/Documentation/RelNotes/2.37.7.adoc
diff --git a/Documentation/RelNotes/2.38.0.txt b/Documentation/RelNotes/2.38.0.adoc
index 870581fc57..870581fc57 100644
--- a/Documentation/RelNotes/2.38.0.txt
+++ b/Documentation/RelNotes/2.38.0.adoc
diff --git a/Documentation/RelNotes/2.38.1.txt b/Documentation/RelNotes/2.38.1.adoc
index b2b5854aac..b2b5854aac 100644
--- a/Documentation/RelNotes/2.38.1.txt
+++ b/Documentation/RelNotes/2.38.1.adoc
diff --git a/Documentation/RelNotes/2.38.2.txt b/Documentation/RelNotes/2.38.2.adoc
index 92acb62bbb..92acb62bbb 100644
--- a/Documentation/RelNotes/2.38.2.txt
+++ b/Documentation/RelNotes/2.38.2.adoc
diff --git a/Documentation/RelNotes/2.38.3.txt b/Documentation/RelNotes/2.38.3.adoc
index 4a46bb4300..4a46bb4300 100644
--- a/Documentation/RelNotes/2.38.3.txt
+++ b/Documentation/RelNotes/2.38.3.adoc
diff --git a/Documentation/RelNotes/2.38.4.txt b/Documentation/RelNotes/2.38.4.adoc
index fdfde22022..fdfde22022 100644
--- a/Documentation/RelNotes/2.38.4.txt
+++ b/Documentation/RelNotes/2.38.4.adoc
diff --git a/Documentation/RelNotes/2.38.5.txt b/Documentation/RelNotes/2.38.5.adoc
index 2d1f3b1249..2d1f3b1249 100644
--- a/Documentation/RelNotes/2.38.5.txt
+++ b/Documentation/RelNotes/2.38.5.adoc
diff --git a/Documentation/RelNotes/2.39.0.txt b/Documentation/RelNotes/2.39.0.adoc
index 9bf00ece53..9bf00ece53 100644
--- a/Documentation/RelNotes/2.39.0.txt
+++ b/Documentation/RelNotes/2.39.0.adoc
diff --git a/Documentation/RelNotes/2.39.1.txt b/Documentation/RelNotes/2.39.1.adoc
index 60c86f4122..60c86f4122 100644
--- a/Documentation/RelNotes/2.39.1.txt
+++ b/Documentation/RelNotes/2.39.1.adoc
diff --git a/Documentation/RelNotes/2.39.2.txt b/Documentation/RelNotes/2.39.2.adoc
index ebb9900bc5..ebb9900bc5 100644
--- a/Documentation/RelNotes/2.39.2.txt
+++ b/Documentation/RelNotes/2.39.2.adoc
diff --git a/Documentation/RelNotes/2.39.3.txt b/Documentation/RelNotes/2.39.3.adoc
index 66351b65c2..66351b65c2 100644
--- a/Documentation/RelNotes/2.39.3.txt
+++ b/Documentation/RelNotes/2.39.3.adoc
diff --git a/Documentation/RelNotes/2.39.4.txt b/Documentation/RelNotes/2.39.4.adoc
index 7f54521fea..7f54521fea 100644
--- a/Documentation/RelNotes/2.39.4.txt
+++ b/Documentation/RelNotes/2.39.4.adoc
diff --git a/Documentation/RelNotes/2.39.5.txt b/Documentation/RelNotes/2.39.5.adoc
index 97c0185de4..97c0185de4 100644
--- a/Documentation/RelNotes/2.39.5.txt
+++ b/Documentation/RelNotes/2.39.5.adoc
diff --git a/Documentation/RelNotes/2.4.0.txt b/Documentation/RelNotes/2.4.0.adoc
index cde64be535..cde64be535 100644
--- a/Documentation/RelNotes/2.4.0.txt
+++ b/Documentation/RelNotes/2.4.0.adoc
diff --git a/Documentation/RelNotes/2.4.1.txt b/Documentation/RelNotes/2.4.1.adoc
index a65a6c5829..a65a6c5829 100644
--- a/Documentation/RelNotes/2.4.1.txt
+++ b/Documentation/RelNotes/2.4.1.adoc
diff --git a/Documentation/RelNotes/2.4.10.txt b/Documentation/RelNotes/2.4.10.adoc
index 702d8d4e22..702d8d4e22 100644
--- a/Documentation/RelNotes/2.4.10.txt
+++ b/Documentation/RelNotes/2.4.10.adoc
diff --git a/Documentation/RelNotes/2.4.11.txt b/Documentation/RelNotes/2.4.11.adoc
index 723360295c..723360295c 100644
--- a/Documentation/RelNotes/2.4.11.txt
+++ b/Documentation/RelNotes/2.4.11.adoc
diff --git a/Documentation/RelNotes/2.4.12.txt b/Documentation/RelNotes/2.4.12.adoc
index 7d15f94725..7d15f94725 100644
--- a/Documentation/RelNotes/2.4.12.txt
+++ b/Documentation/RelNotes/2.4.12.adoc
diff --git a/Documentation/RelNotes/2.4.2.txt b/Documentation/RelNotes/2.4.2.adoc
index 250cdc423c..250cdc423c 100644
--- a/Documentation/RelNotes/2.4.2.txt
+++ b/Documentation/RelNotes/2.4.2.adoc
diff --git a/Documentation/RelNotes/2.4.3.txt b/Documentation/RelNotes/2.4.3.adoc
index 422e930aa2..422e930aa2 100644
--- a/Documentation/RelNotes/2.4.3.txt
+++ b/Documentation/RelNotes/2.4.3.adoc
diff --git a/Documentation/RelNotes/2.4.4.txt b/Documentation/RelNotes/2.4.4.adoc
index f1ccd001be..f1ccd001be 100644
--- a/Documentation/RelNotes/2.4.4.txt
+++ b/Documentation/RelNotes/2.4.4.adoc
diff --git a/Documentation/RelNotes/2.4.5.txt b/Documentation/RelNotes/2.4.5.adoc
index 568297ccb7..568297ccb7 100644
--- a/Documentation/RelNotes/2.4.5.txt
+++ b/Documentation/RelNotes/2.4.5.adoc
diff --git a/Documentation/RelNotes/2.4.6.txt b/Documentation/RelNotes/2.4.6.adoc
index b53f353939..b53f353939 100644
--- a/Documentation/RelNotes/2.4.6.txt
+++ b/Documentation/RelNotes/2.4.6.adoc
diff --git a/Documentation/RelNotes/2.4.7.txt b/Documentation/RelNotes/2.4.7.adoc
index b3ac412b82..b3ac412b82 100644
--- a/Documentation/RelNotes/2.4.7.txt
+++ b/Documentation/RelNotes/2.4.7.adoc
diff --git a/Documentation/RelNotes/2.4.8.txt b/Documentation/RelNotes/2.4.8.adoc
index ad946b2673..ad946b2673 100644
--- a/Documentation/RelNotes/2.4.8.txt
+++ b/Documentation/RelNotes/2.4.8.adoc
diff --git a/Documentation/RelNotes/2.4.9.txt b/Documentation/RelNotes/2.4.9.adoc
index 09af9ddbc7..09af9ddbc7 100644
--- a/Documentation/RelNotes/2.4.9.txt
+++ b/Documentation/RelNotes/2.4.9.adoc
diff --git a/Documentation/RelNotes/2.40.0.txt b/Documentation/RelNotes/2.40.0.adoc
index 3ea445bf20..3ea445bf20 100644
--- a/Documentation/RelNotes/2.40.0.txt
+++ b/Documentation/RelNotes/2.40.0.adoc
diff --git a/Documentation/RelNotes/2.40.1.txt b/Documentation/RelNotes/2.40.1.adoc
index e72f6b1b25..e72f6b1b25 100644
--- a/Documentation/RelNotes/2.40.1.txt
+++ b/Documentation/RelNotes/2.40.1.adoc
diff --git a/Documentation/RelNotes/2.40.2.txt b/Documentation/RelNotes/2.40.2.adoc
index 646a2cc3eb..646a2cc3eb 100644
--- a/Documentation/RelNotes/2.40.2.txt
+++ b/Documentation/RelNotes/2.40.2.adoc
diff --git a/Documentation/RelNotes/2.40.3.txt b/Documentation/RelNotes/2.40.3.adoc
index 6ca088ec86..6ca088ec86 100644
--- a/Documentation/RelNotes/2.40.3.txt
+++ b/Documentation/RelNotes/2.40.3.adoc
diff --git a/Documentation/RelNotes/2.40.4.adoc b/Documentation/RelNotes/2.40.4.adoc
new file mode 100644
index 0000000000..0ff29f3cfc
--- /dev/null
+++ b/Documentation/RelNotes/2.40.4.adoc
@@ -0,0 +1,5 @@
+Git v2.40.4 Release Notes
+=========================
+
+This release lets Git refuse to accept URLs that contain control
+sequences. This addresses CVE-2024-50349 and CVE-2024-52006.
diff --git a/Documentation/RelNotes/2.41.0.txt b/Documentation/RelNotes/2.41.0.adoc
index 8a9e17016e..8a9e17016e 100644
--- a/Documentation/RelNotes/2.41.0.txt
+++ b/Documentation/RelNotes/2.41.0.adoc
diff --git a/Documentation/RelNotes/2.41.1.txt b/Documentation/RelNotes/2.41.1.adoc
index 9fb4c218b2..9fb4c218b2 100644
--- a/Documentation/RelNotes/2.41.1.txt
+++ b/Documentation/RelNotes/2.41.1.adoc
diff --git a/Documentation/RelNotes/2.41.2.txt b/Documentation/RelNotes/2.41.2.adoc
index f94afde8c2..f94afde8c2 100644
--- a/Documentation/RelNotes/2.41.2.txt
+++ b/Documentation/RelNotes/2.41.2.adoc
diff --git a/Documentation/RelNotes/2.41.3.adoc b/Documentation/RelNotes/2.41.3.adoc
new file mode 100644
index 0000000000..b5aba88790
--- /dev/null
+++ b/Documentation/RelNotes/2.41.3.adoc
@@ -0,0 +1,6 @@
+Git v2.41.3 Release Notes
+=========================
+
+This release merges up the fix that appears in v2.40.4 to address
+the security issues CVE-2024-50349 and CVE-2024-52006; see the
+release notes for that version for details.
diff --git a/Documentation/RelNotes/2.42.0.txt b/Documentation/RelNotes/2.42.0.adoc
index 0f1897ad5f..0f1897ad5f 100644
--- a/Documentation/RelNotes/2.42.0.txt
+++ b/Documentation/RelNotes/2.42.0.adoc
diff --git a/Documentation/RelNotes/2.42.1.txt b/Documentation/RelNotes/2.42.1.adoc
index 3d391b7dcd..3d391b7dcd 100644
--- a/Documentation/RelNotes/2.42.1.txt
+++ b/Documentation/RelNotes/2.42.1.adoc
diff --git a/Documentation/RelNotes/2.42.2.txt b/Documentation/RelNotes/2.42.2.adoc
index dbf761a01d..dbf761a01d 100644
--- a/Documentation/RelNotes/2.42.2.txt
+++ b/Documentation/RelNotes/2.42.2.adoc
diff --git a/Documentation/RelNotes/2.42.3.txt b/Documentation/RelNotes/2.42.3.adoc
index bfe3ba5629..bfe3ba5629 100644
--- a/Documentation/RelNotes/2.42.3.txt
+++ b/Documentation/RelNotes/2.42.3.adoc
diff --git a/Documentation/RelNotes/2.42.4.adoc b/Documentation/RelNotes/2.42.4.adoc
new file mode 100644
index 0000000000..3129d76e75
--- /dev/null
+++ b/Documentation/RelNotes/2.42.4.adoc
@@ -0,0 +1,6 @@
+Git v2.42.4 Release Notes
+=========================
+
+This release merges up the fix that appears in v2.40.4 and v2.41.3
+to address the security issues CVE-2024-50349 and CVE-2024-52006;
+see the release notes for these versions for details.
diff --git a/Documentation/RelNotes/2.43.0.txt b/Documentation/RelNotes/2.43.0.adoc
index e0e5b535bb..e0e5b535bb 100644
--- a/Documentation/RelNotes/2.43.0.txt
+++ b/Documentation/RelNotes/2.43.0.adoc
diff --git a/Documentation/RelNotes/2.43.1.txt b/Documentation/RelNotes/2.43.1.adoc
index 20e96f2dfa..20e96f2dfa 100644
--- a/Documentation/RelNotes/2.43.1.txt
+++ b/Documentation/RelNotes/2.43.1.adoc
diff --git a/Documentation/RelNotes/2.43.2.txt b/Documentation/RelNotes/2.43.2.adoc
index 5895e23a54..5895e23a54 100644
--- a/Documentation/RelNotes/2.43.2.txt
+++ b/Documentation/RelNotes/2.43.2.adoc
diff --git a/Documentation/RelNotes/2.43.3.txt b/Documentation/RelNotes/2.43.3.adoc
index 924f20594f..924f20594f 100644
--- a/Documentation/RelNotes/2.43.3.txt
+++ b/Documentation/RelNotes/2.43.3.adoc
diff --git a/Documentation/RelNotes/2.43.4.txt b/Documentation/RelNotes/2.43.4.adoc
index 0a842515ff..0a842515ff 100644
--- a/Documentation/RelNotes/2.43.4.txt
+++ b/Documentation/RelNotes/2.43.4.adoc
diff --git a/Documentation/RelNotes/2.43.5.txt b/Documentation/RelNotes/2.43.5.adoc
index 236b234b06..236b234b06 100644
--- a/Documentation/RelNotes/2.43.5.txt
+++ b/Documentation/RelNotes/2.43.5.adoc
diff --git a/Documentation/RelNotes/2.43.6.adoc b/Documentation/RelNotes/2.43.6.adoc
new file mode 100644
index 0000000000..2114b9f78d
--- /dev/null
+++ b/Documentation/RelNotes/2.43.6.adoc
@@ -0,0 +1,7 @@
+Git v2.43.6 Release Notes
+=========================
+
+This release merges up the fix that appears in v2.40.4, v2.41.3
+and v2.42.4 to address the security issues CVE-2024-50349 and
+CVE-2024-52006; see the release notes for these versions for
+details.
diff --git a/Documentation/RelNotes/2.44.0.txt b/Documentation/RelNotes/2.44.0.adoc
index 14f9ce8226..14f9ce8226 100644
--- a/Documentation/RelNotes/2.44.0.txt
+++ b/Documentation/RelNotes/2.44.0.adoc
diff --git a/Documentation/RelNotes/2.44.1.txt b/Documentation/RelNotes/2.44.1.adoc
index b5135c3281..b5135c3281 100644
--- a/Documentation/RelNotes/2.44.1.txt
+++ b/Documentation/RelNotes/2.44.1.adoc
diff --git a/Documentation/RelNotes/2.44.2.txt b/Documentation/RelNotes/2.44.2.adoc
index 76700f0b73..76700f0b73 100644
--- a/Documentation/RelNotes/2.44.2.txt
+++ b/Documentation/RelNotes/2.44.2.adoc
diff --git a/Documentation/RelNotes/2.44.3.adoc b/Documentation/RelNotes/2.44.3.adoc
new file mode 100644
index 0000000000..5862845458
--- /dev/null
+++ b/Documentation/RelNotes/2.44.3.adoc
@@ -0,0 +1,7 @@
+Git v2.44.3 Release Notes
+=========================
+
+This release merges up the fix that appears in v2.40.4, v2.41.3,
+v2.42.4 and v2.43.6 to address the security issues CVE-2024-50349
+and CVE-2024-52006; see the release notes for these versions
+for details.
diff --git a/Documentation/RelNotes/2.45.0.txt b/Documentation/RelNotes/2.45.0.adoc
index aa0315259b..aa0315259b 100644
--- a/Documentation/RelNotes/2.45.0.txt
+++ b/Documentation/RelNotes/2.45.0.adoc
diff --git a/Documentation/RelNotes/2.45.1.txt b/Documentation/RelNotes/2.45.1.adoc
index 3b0d60cfa3..3b0d60cfa3 100644
--- a/Documentation/RelNotes/2.45.1.txt
+++ b/Documentation/RelNotes/2.45.1.adoc
diff --git a/Documentation/RelNotes/2.45.2.txt b/Documentation/RelNotes/2.45.2.adoc
index 13429e6491..13429e6491 100644
--- a/Documentation/RelNotes/2.45.2.txt
+++ b/Documentation/RelNotes/2.45.2.adoc
diff --git a/Documentation/RelNotes/2.45.3.txt b/Documentation/RelNotes/2.45.3.adoc
index 2a1e9aa608..ddb3cb694b 100644
--- a/Documentation/RelNotes/2.45.3.txt
+++ b/Documentation/RelNotes/2.45.3.adoc
@@ -1,7 +1,12 @@
Git v2.45.3 Release Notes
=========================
-This primarily is to backport various small fixes accumulated on the
+This release merges up the fix that appears in v2.40.4, v2.41.3,
+v2.42.4, v2.43.6 and v2.44.3 to address the security issues
+CVE-2024-50349 and CVE-2024-52006; see the release notes for
+these versions for details.
+
+This version also backports various small fixes accumulated on the
'master' front during the development towards Git 2.46, the next
feature release.
diff --git a/Documentation/RelNotes/2.46.0.txt b/Documentation/RelNotes/2.46.0.adoc
index c06a04a91b..c06a04a91b 100644
--- a/Documentation/RelNotes/2.46.0.txt
+++ b/Documentation/RelNotes/2.46.0.adoc
diff --git a/Documentation/RelNotes/2.46.1.txt b/Documentation/RelNotes/2.46.1.adoc
index e55c2c4a46..e55c2c4a46 100644
--- a/Documentation/RelNotes/2.46.1.txt
+++ b/Documentation/RelNotes/2.46.1.adoc
diff --git a/Documentation/RelNotes/2.46.2.txt b/Documentation/RelNotes/2.46.2.adoc
index 613386878d..613386878d 100644
--- a/Documentation/RelNotes/2.46.2.txt
+++ b/Documentation/RelNotes/2.46.2.adoc
diff --git a/Documentation/RelNotes/2.46.3.adoc b/Documentation/RelNotes/2.46.3.adoc
new file mode 100644
index 0000000000..4af032b63c
--- /dev/null
+++ b/Documentation/RelNotes/2.46.3.adoc
@@ -0,0 +1,6 @@
+Git v2.46.3 Release Notes
+=========================
+
+This release merges up the fix that appears in v2.40.4, v2.41.3, v2.42.4,
+v2.43.6, v2.44.3 and v2.45.3 to address the security issues CVE-2024-50349 and
+CVE-2024-52006; see the release notes for these versions for details.
diff --git a/Documentation/RelNotes/2.47.0.txt b/Documentation/RelNotes/2.47.0.adoc
index b63c3364af..b63c3364af 100644
--- a/Documentation/RelNotes/2.47.0.txt
+++ b/Documentation/RelNotes/2.47.0.adoc
diff --git a/Documentation/RelNotes/2.47.1.txt b/Documentation/RelNotes/2.47.1.adoc
index 39206c09fd..39206c09fd 100644
--- a/Documentation/RelNotes/2.47.1.txt
+++ b/Documentation/RelNotes/2.47.1.adoc
diff --git a/Documentation/RelNotes/2.47.2.adoc b/Documentation/RelNotes/2.47.2.adoc
new file mode 100644
index 0000000000..7a52ad8cb4
--- /dev/null
+++ b/Documentation/RelNotes/2.47.2.adoc
@@ -0,0 +1,7 @@
+Git v2.47.2 Release Notes
+=========================
+
+This release merges up the fix that appears in v2.40.4, v2.41.3,
+v2.42.4, v2.43.6, v2.44.3, v2.45.3 and v2.46.3 to address the
+security issues CVE-2024-50349 and CVE-2024-52006; see the release
+notes for these versions for details.
diff --git a/Documentation/RelNotes/2.48.0.txt b/Documentation/RelNotes/2.48.0.adoc
index d62c62dc17..eff93be37a 100644
--- a/Documentation/RelNotes/2.48.0.txt
+++ b/Documentation/RelNotes/2.48.0.adoc
@@ -47,15 +47,15 @@ Performance, Internal Implementation, Development Support etc.
* The way AsciiDoc is used for SYNOPSIS part of the manual pages has
been revamped. The sources, at least for the simple cases, got
- vastly pleasant to work with.
+ vastly more pleasant to work with.
* The reftable library is now prepared to expect that the memory
allocation function given to it may fail to allocate and to deal
with such an error.
* An extra worktree attached to a repository points at each other to
- allow finding the repository from the worktree and vice versa
- possible. Turn this linkage to relative paths.
+ allow finding the repository from the worktree (and vice versa)
+ possible. Use relative paths for this linkage.
* Enable Windows-based CI in GitLab.
@@ -94,7 +94,7 @@ Performance, Internal Implementation, Development Support etc.
* Update the project's CodingGuidelines to discourage naming functions
with a "_1()" suffix.
- * Updates the '.clang-format' to match project conventions.
+ * Update '.clang-format' to match project conventions.
* Centralize documentation for repository extensions into a single place.
@@ -116,7 +116,7 @@ Performance, Internal Implementation, Development Support etc.
* The migration procedure between two ref backends has been optimized.
* "git fsck" learned to issue warnings on "curiously formatted" ref
- contents that have always been taken valid but something Git
+ contents that have always been treated as valid but that Git
wouldn't have written itself (e.g., missing terminating end-of-line
after the full object name).
@@ -127,13 +127,13 @@ Performance, Internal Implementation, Development Support etc.
* Drop support for ancient environments in various CI jobs.
- * Isolates the reftable subsystem from the rest of Git's codebase by
+ * Isolate the reftable subsystem from the rest of Git's codebase by
using fewer pieces of Git's infrastructure.
* Optimize reading random references out of the reftable backend by
allowing reuse of iterator objects.
- * Backport oss-fuzz tests for us to our codebase.
+ * Backport oss-fuzz tests to our codebase.
* Introduce a new repository extension to prevent older Git versions
from mis-interpreting worktrees created with relative paths.
@@ -173,13 +173,13 @@ Fixes since v2.47
-----------------
* Doc update to clarify how periodical maintenance are scheduled,
- spread across time to avoid thundering hurds.
+ spread across time to avoid thundering herds.
* Use after free and double freeing at the end in "git log -L... -p"
had been identified and fixed.
* On macOS, fsmonitor can fall into a race condition that results in
- a client waiting forever to be notified for an event that have
+ a client waiting forever to be notified about an event that has
already happened. This problem has been corrected.
* "git maintenance start" crashed due to an uninitialized variable
@@ -203,7 +203,7 @@ Fixes since v2.47
* The dumb-http code regressed when the result of re-indexing a pack
yielded an *.idx file that differs in content from the *.idx file
it downloaded from the remote. This has been corrected by no longer
- relying on: the *.idx file we got from the remote.
+ relying on the *.idx file we got from the remote.
* When called with '--left-right' and '--use-bitmap-index', 'rev-list'
will produce output without any left/right markers, which has been
@@ -227,7 +227,7 @@ Fixes since v2.47
* "git gc" discards any objects that are outside promisor packs that
are referred to by an object in a promisor pack, and we do not
refetch them from the promisor at runtime, resulting an unusable
- repository. Work it around by including these objects in the
+ repository. Work around it by including these objects in the
referring promisor pack at the receiving end of the fetch.
* Avoid build/test breakage on a system without working malloc debug
@@ -282,9 +282,8 @@ Fixes since v2.47
on the path, which was not documented, which has been corrected.
(merge bc1a980759 kk/doc-ancestry-path later to maint).
-
* "git tag" has been taught to refuse to create refs/tags/HEAD
- as such a tag will be confusing in the context of UI provided by
+ since such a tag will be confusing in the context of the UI provided by
the Git Porcelain commands.
(merge bbd445d5ef jc/forbid-head-as-tagname later to maint).
diff --git a/Documentation/RelNotes/2.48.1.adoc b/Documentation/RelNotes/2.48.1.adoc
new file mode 100644
index 0000000000..26c59b6e3b
--- /dev/null
+++ b/Documentation/RelNotes/2.48.1.adoc
@@ -0,0 +1,7 @@
+Git v2.48.1 Release Notes
+=========================
+
+This release merges up the fix that appears in v2.40.4, v2.41.3,
+v2.42.4, v2.43.6, v2.44.3, v2.45.3, v2.46.3, and v2.47.2 to address
+the security issues CVE-2024-50349 and CVE-2024-52006; see the release
+notes for these versions for details.
diff --git a/Documentation/RelNotes/2.49.0.adoc b/Documentation/RelNotes/2.49.0.adoc
new file mode 100644
index 0000000000..2e9aa0d69f
--- /dev/null
+++ b/Documentation/RelNotes/2.49.0.adoc
@@ -0,0 +1,246 @@
+Git v2.49 Release Notes
+=======================
+
+UI, Workflows & Features
+------------------------
+
+ * Completion script updates for zsh
+
+ * "git pack-objects" and its wrapper "git repack" learned an option
+ to use an alternative path-hash function to improve delta-base
+ selection to produce a packfile with deeper history than window
+ size.
+
+ * "git gc" learned the "--expire-to" option and passes it down to
+ underlying "git repack".
+
+ * "[help] autocorrect = 1" used to be a way to say "please wait for
+ 0.1 second after suggesting a typofix of the command name before
+ running that command"; now it means "yes, if there is a plausible
+ typofix for the command name, please run it immediately".
+
+ * "git clone" learned to make a shallow clone for a single commit
+ that is not necessarily be at the tip of any branch.
+
+ * Lazy-loading missing files in a blobless clone on demand is costly
+ as it tends to be one-blob-at-a-time. "git backfill" is introduced
+ to help bulk-download necessary files beforehand.
+
+ * "git push --atomic --porcelain" used to ignore failures from the
+ other side, losing the error status from the child process, which
+ has been corrected.
+
+ * "git rev-list --missing=" learned to accept "print-info" that gives
+ known details expected of the missing objects, like path and type.
+
+ * Comes with an updated "gitk".
+
+ * The documentation of "git commit" and "git rebase" now refer to
+ commit titles as such, not "subject".
+
+
+Performance, Internal Implementation, Development Support etc.
+--------------------------------------------------------------
+
+ * More -Wsign-compare fixes.
+
+ * meson-based build now supports the unsafe-sha1 build knob.
+
+ * The code to check LSan results has been simplified and made more
+ robust.
+ (merge 164a2516eb jk/lsan-race-ignore-false-positive later to maint).
+
+ * More code paths have a repository passed through the callchain,
+ instead of assuming the primary the_repository object.
+
+ * Move a few more unit tests to the clar test framework.
+
+ * Introduce a new API to visit objects in batches based on a common
+ path, or by type.
+
+ * Following the procedure we established to introduce breaking
+ changes for Git 3.0, allow an early opt-in for removing support of
+ $GIT_DIR/branches/ and $GIT_DIR/remotes/ directories to configure
+ remotes.
+
+ * The code paths to interact with zlib has been cleaned up in
+ preparation for building with zlib-ng.
+
+ * Foreign language interface for Rust into our code base has been added.
+
+ * All the documentation .txt files have been renamed to .adoc to help
+ content aware editors.
+
+ * "git difftool" code clean-up.
+
+
+Fixes since v2.48
+-----------------
+
+ * "git submodule" learned various ways to spell the same option,
+ e.g. "--branch=B" can be spelled "--branch B" or "-bB".
+ (merge b86f0f9071 re/submodule-parse-opt later to maint).
+
+ * Tweak the help text used for the option value placeholders by
+ parse-options API so that translations can customize the "<>"
+ placeholder signal (e.g. "--option=<value>").
+ (merge 5b34dd08d0 as/long-option-help-i18n later to maint).
+
+ * CI jobs gave sporadic failures, which turns out that that the
+ object finalization code was giving an error when it did not have
+ to.
+ (merge d7fcbe2c56 ps/object-collision-check later to maint).
+
+ * The code to compute "unique" name used git_rand() which can fail or
+ get stuck; the callsite does not require cryptographic security.
+ Introduce the "insecure" mode and use it appropriately.
+ (merge 0b4f8afef6 ps/reftable-get-random-fix later to maint).
+
+ * A misconfigured "fsck.skiplist" configuration variable was not
+ diagnosed as an error, which has been corrected.
+ (merge ca7158076f jt/fsck-skiplist-parse-fix later to maint).
+
+ * Extended SHA-1 expression parser did not work well when a branch
+ with an unusual name (e.g. "foo{bar") is involved.
+ (merge 191f0c8db2 en/object-name-with-funny-refname-fix later to maint).
+
+ * The meson build procedure looked for the 'version-def.h' file in a
+ wrong directory, which has been corrected.
+ (merge 4771501c0a tc/meson-use-our-version-def-h later to maint).
+
+ * The meson build procedure for Documentation/technical/ hierarchy was
+ missing necessary dependencies, which has been corrected.
+ (merge 1dca492edd sj/meson-doc-technical-dependency-fix later to maint).
+
+ * The "instaweb" bound only to local IP address without "--local" and
+ to all addresses with "--local", which was the other way around, when
+ using Python's http.server class, which has been corrected.
+ (merge 76baf97fa1 ak/instaweb-python-port-binding-fix later to maint).
+
+ * Document that it is insecure to use Personal Access Tokens, which
+ some hosting providers take as username/password, embedded in URLs.
+ (merge a90ff409f0 mh/doc-credential-helpers-with-pat later to maint).
+
+ * The help text from "git $cmd -h" appear on the standard output for
+ some $cmd and the standard error for others. The built-in commands
+ have been fixed to show them on the standard output consistently.
+ (merge f66d1423f5 jc/show-usage-help later to maint).
+
+ * The meson-driven build is now aware of "git-subtree" housed in
+ contrib/subtree hierarchy.
+ (merge 8454b42f94 ps/build-meson-subtree later to maint).
+
+ * It was possible for "git unpack-objects" and "git index-pack" to
+ make an unaligned access, which has been corrected.
+ (merge 98046591b9 jk/pack-header-parse-alignment-fix later to maint).
+
+ * The "cache" credential back-end did not handle authtype correctly,
+ which has been corrected.
+ (merge 0b43274850 mh/credential-cache-authtype-request-fix later to maint).
+
+ * "git branch --sort=..." and "git for-each-ref --format=... --sort=..."
+ did not work as expected with some atoms, which has been corrected.
+ (merge c5490ce9d1 rs/ref-fitler-used-atoms-value-fix later to maint).
+
+ * reflog entries for symbolic ref updates were broken, which has been
+ corrected.
+ (merge 3519492430 kn/reflog-symref-fix later to maint).
+
+ * The trace2 code was not prepared to show a configuration variable
+ that is set to true using the valueless true syntax, which has been
+ corrected.
+ (merge 2fd367cf63 am/trace2-with-valueless-true later to maint).
+
+ * The "git refs migrate" command did not migrate the reflog for
+ refs/stash, which is the contents of the stashes, which has been
+ corrected.
+ (merge a0bea0978f ps/reflog-migration-with-logall-fix later to maint).
+
+ * Doc and short-help text for "show-index" has been clarified to
+ stress that the command reads its data from the standard input.
+ (merge 49edce4ff9 jc/show-index-h-update later to maint).
+
+ * The API around choosing to use unsafe variant of SHA-1
+ implementation has been updated in an attempt to make it harder to
+ abuse.
+ (merge 04292c3796 tb/unsafe-hash-cleanup later to maint).
+
+ * Fix bugs in an earlier attempt to fix "git refs migration".
+ (merge f11f0a5a2d kn/reflog-migration-fix-fix later to maint).
+
+ * The code path used when "git fetch" fetches from a bundle file
+ closed the same file descriptor twice, which sometimes broke things
+ unexpectedly when the file descriptor was reused, which has been
+ corrected.
+ (merge 9a84794ad8 js/bundle-unbundle-fd-reuse-fix later to maint).
+
+ * "git init" to reinitialize a repository that already exists cannot
+ change the hash function and ref backends; such a request is
+ silently ignored now.
+ (merge 7e88640cd1 ps/setup-reinit-fixes later to maint).
+
+ * "git apply" internally uses unsigned long for line numbers and uses
+ strtoul() to parse numbers on the hunk headers. It however forgot
+ to check parse errors.
+ (merge a206058fda pw/apply-ulong-overflow-check later to maint).
+
+ * Two CI tasks, whitespace check and style check, work on the
+ difference from the base version and the version being checked, but
+ the base was computed incorrectly in GitLab CI in some cases, which
+ has been corrected.
+ (merge acc4fb302b jt/gitlab-ci-base-fix later to maint).
+
+ * "git repack --keep-unreachable" to send unreachable objects to the
+ main pack "git repack -ad" produces did not work when there is no
+ existing packs, which has been corrected.
+ (merge 414c82300a ps/repack-keep-unreachable-in-unpacked-repo later to maint).
+
+ * Going into a secondary worktree and asking "is the main worktree
+ bare?" did not work correctly when per-worktree configuration
+ option was in use, which has been corrected.
+
+ * Fetching into a bare repository incorrectly assumed it always used
+ a mirror layout when deciding to update remote-tracking HEAD, which
+ has been corrected.
+ (merge 93dc16483a bf/fetch-set-head-fix later to maint).
+
+ * A thunderbird helper script lost its bashism.
+ (merge 59d26bd961 bc/contrib-thunderbird-patch-inline-fix later to maint).
+
+ * The -G/-S options to the "diff" family of commands caused us to hit
+ a BUG() when they get no values; they have been corrected.
+ (merge a620046b29 bc/diff-reject-empty-arg-to-pickaxe later to maint).
+
+ * "git merge-tree --stdin" has been improved (including a workaround
+ for a deadlock).
+ (merge 6a9ae81015 pw/merge-tree-stdin-deadlock-fix later to maint).
+
+ * Correct the default target in Documentation/Makefile, and
+ future-proof all Makefiles from similar breakages by declaring the
+ default target (which happens to be "all") upfront.
+ (merge 5309c1e9fb ad/set-default-target-in-makefiles later to maint).
+
+ * "git check-mailmap" used to segfault when queried without human
+ readable name.
+ (merge bb60c52131 jk/check-mailmap-wo-name-fix later to maint).
+
+ * Support for renaming of symbolic links on Windows has been improved.
+
+ * Other code cleanup, docfix, build fix, etc.
+ (merge ddb5287894 jk/t7407-use-test-grep later to maint).
+ (merge 21e1b44865 aj/difftool-config-doc-fix later to maint).
+ (merge 6a63995335 mh/gitattr-doc-markup-fix later to maint).
+ (merge 43850dcf9c sk/unit-test-hash later to maint).
+ (merge 4ad47d2de3 jc/cli-doc-option-and-config later to maint).
+ (merge 2d0ff147e5 jp/t8002-printf-fix later to maint).
+ (merge 69666e6746 ja/doc-restore-markup-update later to maint).
+ (merge d11d003ba5 sk/strlen-returns-size_t later to maint).
+ (merge 77b2d29e91 ja/doc-notes-markup-updates later to maint).
+ (merge 6979bf6f8f jk/combine-diff-cleanup later to maint).
+ (merge 8705c9bd13 kn/pack-write-with-reduced-globals later to maint).
+ (merge 087740d65a ps/leakfixes-0129 later to maint).
+ (merge 6bba6f604b jp/doc-trailer-config later to maint).
+ (merge f1cc562b77 lo/t7603-path-is-file-update later to maint).
+ (merge 45761988ac en/doc-renormalize later to maint).
+ (merge 832f56f06a jc/doc-boolean-synonyms later to maint).
+ (merge 3eeed876a9 ac/doc-http-ssl-type-config later to maint).
diff --git a/Documentation/RelNotes/2.5.0.txt b/Documentation/RelNotes/2.5.0.adoc
index 84723f912a..84723f912a 100644
--- a/Documentation/RelNotes/2.5.0.txt
+++ b/Documentation/RelNotes/2.5.0.adoc
diff --git a/Documentation/RelNotes/2.5.1.txt b/Documentation/RelNotes/2.5.1.adoc
index b70553308a..b70553308a 100644
--- a/Documentation/RelNotes/2.5.1.txt
+++ b/Documentation/RelNotes/2.5.1.adoc
diff --git a/Documentation/RelNotes/2.5.2.txt b/Documentation/RelNotes/2.5.2.adoc
index 3f749398bb..3f749398bb 100644
--- a/Documentation/RelNotes/2.5.2.txt
+++ b/Documentation/RelNotes/2.5.2.adoc
diff --git a/Documentation/RelNotes/2.5.3.txt b/Documentation/RelNotes/2.5.3.adoc
index d1436857cb..d1436857cb 100644
--- a/Documentation/RelNotes/2.5.3.txt
+++ b/Documentation/RelNotes/2.5.3.adoc
diff --git a/Documentation/RelNotes/2.5.4.txt b/Documentation/RelNotes/2.5.4.adoc
index b8a2f93ee7..b8a2f93ee7 100644
--- a/Documentation/RelNotes/2.5.4.txt
+++ b/Documentation/RelNotes/2.5.4.adoc
diff --git a/Documentation/RelNotes/2.5.5.txt b/Documentation/RelNotes/2.5.5.adoc
index 37eae9a2d9..37eae9a2d9 100644
--- a/Documentation/RelNotes/2.5.5.txt
+++ b/Documentation/RelNotes/2.5.5.adoc
diff --git a/Documentation/RelNotes/2.5.6.txt b/Documentation/RelNotes/2.5.6.adoc
index 9cd025bb1c..9cd025bb1c 100644
--- a/Documentation/RelNotes/2.5.6.txt
+++ b/Documentation/RelNotes/2.5.6.adoc
diff --git a/Documentation/RelNotes/2.6.0.txt b/Documentation/RelNotes/2.6.0.adoc
index 7288aaf716..7288aaf716 100644
--- a/Documentation/RelNotes/2.6.0.txt
+++ b/Documentation/RelNotes/2.6.0.adoc
diff --git a/Documentation/RelNotes/2.6.1.txt b/Documentation/RelNotes/2.6.1.adoc
index f37ea89cda..f37ea89cda 100644
--- a/Documentation/RelNotes/2.6.1.txt
+++ b/Documentation/RelNotes/2.6.1.adoc
diff --git a/Documentation/RelNotes/2.6.2.txt b/Documentation/RelNotes/2.6.2.adoc
index 5b65e35245..5b65e35245 100644
--- a/Documentation/RelNotes/2.6.2.txt
+++ b/Documentation/RelNotes/2.6.2.adoc
diff --git a/Documentation/RelNotes/2.6.3.txt b/Documentation/RelNotes/2.6.3.adoc
index fc6fe1711f..fc6fe1711f 100644
--- a/Documentation/RelNotes/2.6.3.txt
+++ b/Documentation/RelNotes/2.6.3.adoc
diff --git a/Documentation/RelNotes/2.6.4.txt b/Documentation/RelNotes/2.6.4.adoc
index b0256a2dc9..b0256a2dc9 100644
--- a/Documentation/RelNotes/2.6.4.txt
+++ b/Documentation/RelNotes/2.6.4.adoc
diff --git a/Documentation/RelNotes/2.6.5.txt b/Documentation/RelNotes/2.6.5.adoc
index f0924b62e0..f0924b62e0 100644
--- a/Documentation/RelNotes/2.6.5.txt
+++ b/Documentation/RelNotes/2.6.5.adoc
diff --git a/Documentation/RelNotes/2.6.6.txt b/Documentation/RelNotes/2.6.6.adoc
index 023ad85ec6..023ad85ec6 100644
--- a/Documentation/RelNotes/2.6.6.txt
+++ b/Documentation/RelNotes/2.6.6.adoc
diff --git a/Documentation/RelNotes/2.6.7.txt b/Documentation/RelNotes/2.6.7.adoc
index 1335de49a6..1335de49a6 100644
--- a/Documentation/RelNotes/2.6.7.txt
+++ b/Documentation/RelNotes/2.6.7.adoc
diff --git a/Documentation/RelNotes/2.7.0.txt b/Documentation/RelNotes/2.7.0.adoc
index e3cbf3a73c..e3cbf3a73c 100644
--- a/Documentation/RelNotes/2.7.0.txt
+++ b/Documentation/RelNotes/2.7.0.adoc
diff --git a/Documentation/RelNotes/2.7.1.txt b/Documentation/RelNotes/2.7.1.adoc
index 6323feaf64..6323feaf64 100644
--- a/Documentation/RelNotes/2.7.1.txt
+++ b/Documentation/RelNotes/2.7.1.adoc
diff --git a/Documentation/RelNotes/2.7.2.txt b/Documentation/RelNotes/2.7.2.adoc
index 4feef76704..4feef76704 100644
--- a/Documentation/RelNotes/2.7.2.txt
+++ b/Documentation/RelNotes/2.7.2.adoc
diff --git a/Documentation/RelNotes/2.7.3.txt b/Documentation/RelNotes/2.7.3.adoc
index f618d71efd..f618d71efd 100644
--- a/Documentation/RelNotes/2.7.3.txt
+++ b/Documentation/RelNotes/2.7.3.adoc
diff --git a/Documentation/RelNotes/2.7.4.txt b/Documentation/RelNotes/2.7.4.adoc
index 883ae896fe..883ae896fe 100644
--- a/Documentation/RelNotes/2.7.4.txt
+++ b/Documentation/RelNotes/2.7.4.adoc
diff --git a/Documentation/RelNotes/2.7.5.txt b/Documentation/RelNotes/2.7.5.adoc
index 83559ce3b2..83559ce3b2 100644
--- a/Documentation/RelNotes/2.7.5.txt
+++ b/Documentation/RelNotes/2.7.5.adoc
diff --git a/Documentation/RelNotes/2.7.6.txt b/Documentation/RelNotes/2.7.6.adoc
index 4c6d1dcd4a..4c6d1dcd4a 100644
--- a/Documentation/RelNotes/2.7.6.txt
+++ b/Documentation/RelNotes/2.7.6.adoc
diff --git a/Documentation/RelNotes/2.8.0.txt b/Documentation/RelNotes/2.8.0.adoc
index 38453281b8..38453281b8 100644
--- a/Documentation/RelNotes/2.8.0.txt
+++ b/Documentation/RelNotes/2.8.0.adoc
diff --git a/Documentation/RelNotes/2.8.1.txt b/Documentation/RelNotes/2.8.1.adoc
index ef6d80b008..ef6d80b008 100644
--- a/Documentation/RelNotes/2.8.1.txt
+++ b/Documentation/RelNotes/2.8.1.adoc
diff --git a/Documentation/RelNotes/2.8.2.txt b/Documentation/RelNotes/2.8.2.adoc
index 447b1933a8..447b1933a8 100644
--- a/Documentation/RelNotes/2.8.2.txt
+++ b/Documentation/RelNotes/2.8.2.adoc
diff --git a/Documentation/RelNotes/2.8.3.txt b/Documentation/RelNotes/2.8.3.adoc
index a63825ed87..a63825ed87 100644
--- a/Documentation/RelNotes/2.8.3.txt
+++ b/Documentation/RelNotes/2.8.3.adoc
diff --git a/Documentation/RelNotes/2.8.4.txt b/Documentation/RelNotes/2.8.4.adoc
index f4e2552836..f4e2552836 100644
--- a/Documentation/RelNotes/2.8.4.txt
+++ b/Documentation/RelNotes/2.8.4.adoc
diff --git a/Documentation/RelNotes/2.8.5.txt b/Documentation/RelNotes/2.8.5.adoc
index 7bd179fa12..7bd179fa12 100644
--- a/Documentation/RelNotes/2.8.5.txt
+++ b/Documentation/RelNotes/2.8.5.adoc
diff --git a/Documentation/RelNotes/2.8.6.txt b/Documentation/RelNotes/2.8.6.adoc
index d8db55d920..d8db55d920 100644
--- a/Documentation/RelNotes/2.8.6.txt
+++ b/Documentation/RelNotes/2.8.6.adoc
diff --git a/Documentation/RelNotes/2.9.0.txt b/Documentation/RelNotes/2.9.0.adoc
index 991640119a..991640119a 100644
--- a/Documentation/RelNotes/2.9.0.txt
+++ b/Documentation/RelNotes/2.9.0.adoc
diff --git a/Documentation/RelNotes/2.9.1.txt b/Documentation/RelNotes/2.9.1.adoc
index 338394097e..338394097e 100644
--- a/Documentation/RelNotes/2.9.1.txt
+++ b/Documentation/RelNotes/2.9.1.adoc
diff --git a/Documentation/RelNotes/2.9.2.txt b/Documentation/RelNotes/2.9.2.adoc
index 2620003dcf..2620003dcf 100644
--- a/Documentation/RelNotes/2.9.2.txt
+++ b/Documentation/RelNotes/2.9.2.adoc
diff --git a/Documentation/RelNotes/2.9.3.txt b/Documentation/RelNotes/2.9.3.adoc
index 305e08062b..305e08062b 100644
--- a/Documentation/RelNotes/2.9.3.txt
+++ b/Documentation/RelNotes/2.9.3.adoc
diff --git a/Documentation/RelNotes/2.9.4.txt b/Documentation/RelNotes/2.9.4.adoc
index 9768293831..9768293831 100644
--- a/Documentation/RelNotes/2.9.4.txt
+++ b/Documentation/RelNotes/2.9.4.adoc
diff --git a/Documentation/RelNotes/2.9.5.txt b/Documentation/RelNotes/2.9.5.adoc
index 668313ae55..668313ae55 100644
--- a/Documentation/RelNotes/2.9.5.txt
+++ b/Documentation/RelNotes/2.9.5.adoc
diff --git a/Documentation/ReviewingGuidelines.txt b/Documentation/ReviewingGuidelines.adoc
index 6534643cff..6534643cff 100644
--- a/Documentation/ReviewingGuidelines.txt
+++ b/Documentation/ReviewingGuidelines.adoc
diff --git a/Documentation/ToolsForGit.txt b/Documentation/ToolsForGit.adoc
index ae7690b45d..ae7690b45d 100644
--- a/Documentation/ToolsForGit.txt
+++ b/Documentation/ToolsForGit.adoc
diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.adoc
index 552dcc60f2..aa77406d4e 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.adoc
@@ -18,7 +18,7 @@
'<start>' and '<end>' are optional. `-L <start>` or `-L <start>,` spans from
'<start>' to end of file. `-L ,<end>` spans from start of file to '<end>'.
+
-include::line-range-format.txt[]
+include::line-range-format.adoc[]
-l::
Show long rev (Default: off).
diff --git a/Documentation/cmd-list.perl b/Documentation/cmd-list.perl
index e260a98977..0a0c1b3f61 100755
--- a/Documentation/cmd-list.perl
+++ b/Documentation/cmd-list.perl
@@ -5,11 +5,11 @@ use File::Compare qw(compare);
sub format_one {
my ($source_dir, $out, $nameattr) = @_;
my ($name, $attr) = @$nameattr;
- my ($path) = "$source_dir/Documentation/$name.txt";
+ my ($path) = "$source_dir/Documentation/$name.adoc";
my ($state, $description);
my $mansection;
$state = 0;
- open I, '<', "$path" or die "No such file $path.txt";
+ open I, '<', "$path" or die "No such file $path.adoc";
while (<I>) {
if (/^(?:git|scalar)[a-z0-9-]*\(([0-9])\)$/) {
$mansection = $1;
@@ -30,7 +30,7 @@ sub format_one {
}
close I;
if (!defined $description) {
- die "No description found in $path.txt";
+ die "No description found in $path.adoc";
}
if (my ($verify_name, $text) = ($description =~ /^($name) - (.*)/)) {
print $out "linkgit:$name\[$mansection\]::\n\t";
@@ -63,7 +63,7 @@ for (sort <IN>) {
close IN;
for my $out (@categories) {
- my ($cat) = $out =~ /^cmds-(.*)\.txt$/;
+ my ($cat) = $out =~ /^cmds-(.*)\.adoc$/;
my ($path) = "$build_dir/$out";
open O, '>', "$path+" or die "Cannot open output file $out+";
for (@{$cmds{$cat}}) {
diff --git a/Documentation/config.txt b/Documentation/config.adoc
index 8c0b3ed807..cc769251be 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.adoc
@@ -372,186 +372,188 @@ inventing new variables for use in your own tool, make sure their
names do not conflict with those that are used by Git itself and
other popular tools, and describe them in your documentation.
-include::config/add.txt[]
+include::config/add.adoc[]
-include::config/advice.txt[]
+include::config/advice.adoc[]
-include::config/alias.txt[]
+include::config/alias.adoc[]
-include::config/am.txt[]
+include::config/am.adoc[]
-include::config/apply.txt[]
+include::config/apply.adoc[]
-include::config/attr.txt[]
+include::config/attr.adoc[]
-include::config/bitmap-pseudo-merge.txt[]
+include::config/bitmap-pseudo-merge.adoc[]
-include::config/blame.txt[]
+include::config/blame.adoc[]
-include::config/branch.txt[]
+include::config/branch.adoc[]
-include::config/browser.txt[]
+include::config/browser.adoc[]
-include::config/bundle.txt[]
+include::config/bundle.adoc[]
-include::config/checkout.txt[]
+include::config/checkout.adoc[]
-include::config/clean.txt[]
+include::config/clean.adoc[]
-include::config/clone.txt[]
+include::config/clone.adoc[]
-include::config/color.txt[]
+include::config/color.adoc[]
-include::config/column.txt[]
+include::config/column.adoc[]
-include::config/commit.txt[]
+include::config/commit.adoc[]
-include::config/commitgraph.txt[]
+include::config/commitgraph.adoc[]
-include::config/completion.txt[]
+include::config/completion.adoc[]
-include::config/core.txt[]
+include::config/core.adoc[]
-include::config/credential.txt[]
+include::config/credential.adoc[]
-include::config/diff.txt[]
+include::config/diff.adoc[]
-include::config/difftool.txt[]
+include::config/difftool.adoc[]
-include::config/extensions.txt[]
+include::config/extensions.adoc[]
-include::config/fastimport.txt[]
+include::config/fastimport.adoc[]
-include::config/feature.txt[]
+include::config/feature.adoc[]
-include::config/fetch.txt[]
+include::config/fetch.adoc[]
-include::config/filter.txt[]
+include::config/filter.adoc[]
-include::config/format.txt[]
+include::config/format.adoc[]
-include::config/fsck.txt[]
+include::config/fsck.adoc[]
-include::config/fsmonitor--daemon.txt[]
+include::config/fsmonitor--daemon.adoc[]
-include::config/gc.txt[]
+include::config/gc.adoc[]
-include::config/gitcvs.txt[]
+include::config/gitcvs.adoc[]
-include::config/gitweb.txt[]
+include::config/gitweb.adoc[]
-include::config/gpg.txt[]
+include::config/gpg.adoc[]
-include::config/grep.txt[]
+include::config/grep.adoc[]
-include::config/gui.txt[]
+include::config/gui.adoc[]
-include::config/guitool.txt[]
+include::config/guitool.adoc[]
-include::config/help.txt[]
+include::config/help.adoc[]
-include::config/http.txt[]
+include::config/http.adoc[]
-include::config/i18n.txt[]
+include::config/i18n.adoc[]
-include::config/imap.txt[]
+include::config/imap.adoc[]
-include::config/includeif.txt[]
+include::config/includeif.adoc[]
-include::config/index.txt[]
+include::config/index.adoc[]
-include::config/init.txt[]
+include::config/init.adoc[]
-include::config/instaweb.txt[]
+include::config/instaweb.adoc[]
-include::config/interactive.txt[]
+include::config/interactive.adoc[]
-include::config/log.txt[]
+include::config/log.adoc[]
-include::config/lsrefs.txt[]
+include::config/lsrefs.adoc[]
-include::config/mailinfo.txt[]
+include::config/mailinfo.adoc[]
-include::config/mailmap.txt[]
+include::config/mailmap.adoc[]
-include::config/maintenance.txt[]
+include::config/maintenance.adoc[]
-include::config/man.txt[]
+include::config/man.adoc[]
-include::config/merge.txt[]
+include::config/merge.adoc[]
-include::config/mergetool.txt[]
+include::config/mergetool.adoc[]
-include::config/notes.txt[]
+include::config/notes.adoc[]
-include::config/pack.txt[]
+include::config/pack.adoc[]
-include::config/pager.txt[]
+include::config/pager.adoc[]
-include::config/pretty.txt[]
+include::config/pretty.adoc[]
-include::config/promisor.txt[]
+include::config/promisor.adoc[]
-include::config/protocol.txt[]
+include::config/protocol.adoc[]
-include::config/pull.txt[]
+include::config/pull.adoc[]
-include::config/push.txt[]
+include::config/push.adoc[]
-include::config/rebase.txt[]
+include::config/rebase.adoc[]
-include::config/receive.txt[]
+include::config/receive.adoc[]
-include::config/reftable.txt[]
+include::config/reftable.adoc[]
-include::config/remote.txt[]
+include::config/remote.adoc[]
-include::config/remotes.txt[]
+include::config/remotes.adoc[]
-include::config/repack.txt[]
+include::config/repack.adoc[]
-include::config/rerere.txt[]
+include::config/rerere.adoc[]
-include::config/revert.txt[]
+include::config/revert.adoc[]
-include::config/safe.txt[]
+include::config/safe.adoc[]
-include::config/sendemail.txt[]
+include::config/sendemail.adoc[]
-include::config/sequencer.txt[]
+include::config/sequencer.adoc[]
-include::config/showbranch.txt[]
+include::config/showbranch.adoc[]
-include::config/sparse.txt[]
+include::config/sparse.adoc[]
-include::config/splitindex.txt[]
+include::config/splitindex.adoc[]
-include::config/ssh.txt[]
+include::config/ssh.adoc[]
-include::config/stash.txt[]
+include::config/stash.adoc[]
-include::config/status.txt[]
+include::config/status.adoc[]
-include::config/submodule.txt[]
+include::config/submodule.adoc[]
-include::config/tag.txt[]
+include::config/tag.adoc[]
-include::config/tar.txt[]
+include::config/tar.adoc[]
-include::config/trace2.txt[]
+include::config/trace2.adoc[]
-include::config/transfer.txt[]
+include::config/trailer.adoc[]
-include::config/uploadarchive.txt[]
+include::config/transfer.adoc[]
-include::config/uploadpack.txt[]
+include::config/uploadarchive.adoc[]
-include::config/url.txt[]
+include::config/uploadpack.adoc[]
-include::config/user.txt[]
+include::config/url.adoc[]
-include::config/versionsort.txt[]
+include::config/user.adoc[]
-include::config/web.txt[]
+include::config/versionsort.adoc[]
-include::config/worktree.txt[]
+include::config/web.adoc[]
+
+include::config/worktree.adoc[]
diff --git a/Documentation/config/add.txt b/Documentation/config/add.adoc
index 7497533cbc..7497533cbc 100644
--- a/Documentation/config/add.txt
+++ b/Documentation/config/add.adoc
diff --git a/Documentation/config/advice.txt b/Documentation/config/advice.adoc
index 257db58918..257db58918 100644
--- a/Documentation/config/advice.txt
+++ b/Documentation/config/advice.adoc
diff --git a/Documentation/config/alias.txt b/Documentation/config/alias.adoc
index 2c5db0ad84..2c5db0ad84 100644
--- a/Documentation/config/alias.txt
+++ b/Documentation/config/alias.adoc
diff --git a/Documentation/config/am.txt b/Documentation/config/am.adoc
index 5bcad2efb1..5bcad2efb1 100644
--- a/Documentation/config/am.txt
+++ b/Documentation/config/am.adoc
diff --git a/Documentation/config/apply.txt b/Documentation/config/apply.adoc
index f9908e210a..f9908e210a 100644
--- a/Documentation/config/apply.txt
+++ b/Documentation/config/apply.adoc
diff --git a/Documentation/config/attr.txt b/Documentation/config/attr.adoc
index c4a5857993..c4a5857993 100644
--- a/Documentation/config/attr.txt
+++ b/Documentation/config/attr.adoc
diff --git a/Documentation/config/bitmap-pseudo-merge.txt b/Documentation/config/bitmap-pseudo-merge.adoc
index 1f264eca99..1f264eca99 100644
--- a/Documentation/config/bitmap-pseudo-merge.txt
+++ b/Documentation/config/bitmap-pseudo-merge.adoc
diff --git a/Documentation/config/blame.txt b/Documentation/config/blame.adoc
index 4d047c1790..4d047c1790 100644
--- a/Documentation/config/blame.txt
+++ b/Documentation/config/blame.adoc
diff --git a/Documentation/config/branch.txt b/Documentation/config/branch.adoc
index 432b9cd2c0..432b9cd2c0 100644
--- a/Documentation/config/branch.txt
+++ b/Documentation/config/branch.adoc
diff --git a/Documentation/config/browser.txt b/Documentation/config/browser.adoc
index 195df207a6..195df207a6 100644
--- a/Documentation/config/browser.txt
+++ b/Documentation/config/browser.adoc
diff --git a/Documentation/config/bundle.txt b/Documentation/config/bundle.adoc
index 3faae38685..3faae38685 100644
--- a/Documentation/config/bundle.txt
+++ b/Documentation/config/bundle.adoc
diff --git a/Documentation/config/checkout.txt b/Documentation/config/checkout.adoc
index a323022993..a323022993 100644
--- a/Documentation/config/checkout.txt
+++ b/Documentation/config/checkout.adoc
diff --git a/Documentation/config/clean.txt b/Documentation/config/clean.adoc
index c0188ead4e..c0188ead4e 100644
--- a/Documentation/config/clean.txt
+++ b/Documentation/config/clean.adoc
diff --git a/Documentation/config/clone.txt b/Documentation/config/clone.adoc
index 0a10efd174..0a10efd174 100644
--- a/Documentation/config/clone.txt
+++ b/Documentation/config/clone.adoc
diff --git a/Documentation/config/color.txt b/Documentation/config/color.adoc
index 2f2275ac69..2f2275ac69 100644
--- a/Documentation/config/color.txt
+++ b/Documentation/config/color.adoc
diff --git a/Documentation/config/column.txt b/Documentation/config/column.adoc
index 01e4198429..01e4198429 100644
--- a/Documentation/config/column.txt
+++ b/Documentation/config/column.adoc
diff --git a/Documentation/config/commit.txt b/Documentation/config/commit.adoc
index 62f0d92fda..d3f4624fd2 100644
--- a/Documentation/config/commit.txt
+++ b/Documentation/config/commit.adoc
@@ -1,29 +1,34 @@
-commit.cleanup::
+ifdef::git-commit[]
+:see-git-commit:
+endif::git-commit[]
+ifndef::git-commit[]
+:see-git-commit: See linkgit:git-commit[1] for details.
+endif::git-commit[]
+`commit.cleanup`::
This setting overrides the default of the `--cleanup` option in
- `git commit`. See linkgit:git-commit[1] for details. Changing the
- default can be useful when you always want to keep lines that begin
+ `git commit`. {see-git-commit} Changing the default can be useful
+ when you always want to keep lines that begin
with the comment character `#` in your log message, in which case you
would do `git config commit.cleanup whitespace` (note that you will
have to remove the help lines that begin with `#` in the commit log
template yourself, if you do this).
-commit.gpgSign::
-
+`commit.gpgSign`::
A boolean to specify whether all commits should be GPG signed.
Use of this option when doing operations such as rebase can
result in a large number of commits being signed. It may be
convenient to use an agent to avoid typing your GPG passphrase
several times.
-commit.status::
+`commit.status`::
A boolean to enable/disable inclusion of status information in the
commit message template when using an editor to prepare the commit
- message. Defaults to true.
+ message. Defaults to `true`.
-commit.template::
+`commit.template`::
Specify the pathname of a file to use as the template for
new commit messages.
-commit.verbose::
+`commit.verbose`::
A boolean or int to specify the level of verbosity with `git commit`.
- See linkgit:git-commit[1].
+ {see-git-commit}
diff --git a/Documentation/config/commitgraph.txt b/Documentation/config/commitgraph.adoc
index 7f8c9d6638..7f8c9d6638 100644
--- a/Documentation/config/commitgraph.txt
+++ b/Documentation/config/commitgraph.adoc
diff --git a/Documentation/config/completion.txt b/Documentation/config/completion.adoc
index 4d99bf33c9..4d99bf33c9 100644
--- a/Documentation/config/completion.txt
+++ b/Documentation/config/completion.adoc
diff --git a/Documentation/config/core.txt b/Documentation/config/core.adoc
index 8f6d8e7754..8f6d8e7754 100644
--- a/Documentation/config/core.txt
+++ b/Documentation/config/core.adoc
diff --git a/Documentation/config/credential.txt b/Documentation/config/credential.adoc
index 470482ff4c..80a7c77772 100644
--- a/Documentation/config/credential.txt
+++ b/Documentation/config/credential.adoc
@@ -22,6 +22,17 @@ credential.useHttpPath::
or https URL to be important. Defaults to false. See
linkgit:gitcredentials[7] for more information.
+credential.sanitizePrompt::
+ By default, user names and hosts that are shown as part of the
+ password prompt are not allowed to contain control characters (they
+ will be URL-encoded by default). Configure this setting to `false` to
+ override that behavior.
+
+credential.protectProtocol::
+ By default, Carriage Return characters are not allowed in the protocol
+ that is used when Git talks to a credential helper. This setting allows
+ users to override this default.
+
credential.username::
If no username is set for a network authentication, use this username
by default. See credential.<context>.* below, and
diff --git a/Documentation/config/diff.txt b/Documentation/config/diff.adoc
index fdae13a212..1135a62a0a 100644
--- a/Documentation/config/diff.txt
+++ b/Documentation/config/diff.adoc
@@ -218,8 +218,6 @@ endif::git-diff[]
Set this option to `true` to make the diff driver cache the text
conversion outputs. See linkgit:gitattributes[5] for details.
-include::{build_dir}/mergetools-diff.txt[]
-
`diff.indentHeuristic`::
Set this option to `false` to disable the default heuristics
that shift diff hunk boundaries to make patches easier to read.
diff --git a/Documentation/config/difftool.txt b/Documentation/config/difftool.adoc
index 447c40d85a..4f7d40ce24 100644
--- a/Documentation/config/difftool.txt
+++ b/Documentation/config/difftool.adoc
@@ -13,6 +13,8 @@ diff.guitool::
and requires that a corresponding difftool.<guitool>.cmd variable
is defined.
+include::{build_dir}/mergetools-diff.adoc[]
+
difftool.<tool>.cmd::
Specify the command to invoke the specified diff tool.
The specified command is evaluated in shell with the following
diff --git a/Documentation/config/extensions.txt b/Documentation/config/extensions.adoc
index 5cb4721a0e..9e2f321a6d 100644
--- a/Documentation/config/extensions.txt
+++ b/Documentation/config/extensions.adoc
@@ -56,7 +56,7 @@ For historical reasons, this extension is respected regardless of the
refStorage::
Specify the ref storage format to use. The acceptable values are:
+
-include::../ref-storage-format.txt[]
+include::../ref-storage-format.adoc[]
+
Note that this setting should only be set by linkgit:git-init[1] or
diff --git a/Documentation/config/fastimport.txt b/Documentation/config/fastimport.adoc
index 903677d7ef..903677d7ef 100644
--- a/Documentation/config/fastimport.txt
+++ b/Documentation/config/fastimport.adoc
diff --git a/Documentation/config/feature.txt b/Documentation/config/feature.adoc
index f061b64b74..f061b64b74 100644
--- a/Documentation/config/feature.txt
+++ b/Documentation/config/feature.adoc
diff --git a/Documentation/config/fetch.txt b/Documentation/config/fetch.adoc
index d7dc461bd1..d7dc461bd1 100644
--- a/Documentation/config/fetch.txt
+++ b/Documentation/config/fetch.adoc
diff --git a/Documentation/config/filter.txt b/Documentation/config/filter.adoc
index 90dfe0ba5a..90dfe0ba5a 100644
--- a/Documentation/config/filter.txt
+++ b/Documentation/config/filter.adoc
diff --git a/Documentation/config/fmt-merge-msg.txt b/Documentation/config/fmt-merge-msg.adoc
index 3fbf40e24f..3fbf40e24f 100644
--- a/Documentation/config/fmt-merge-msg.txt
+++ b/Documentation/config/fmt-merge-msg.adoc
diff --git a/Documentation/config/format.txt b/Documentation/config/format.adoc
index 7410e930e5..7410e930e5 100644
--- a/Documentation/config/format.txt
+++ b/Documentation/config/format.adoc
diff --git a/Documentation/config/fsck.txt b/Documentation/config/fsck.adoc
index 8e9e508933..8e9e508933 100644
--- a/Documentation/config/fsck.txt
+++ b/Documentation/config/fsck.adoc
diff --git a/Documentation/config/fsmonitor--daemon.txt b/Documentation/config/fsmonitor--daemon.adoc
index 671f9b9462..671f9b9462 100644
--- a/Documentation/config/fsmonitor--daemon.txt
+++ b/Documentation/config/fsmonitor--daemon.adoc
diff --git a/Documentation/config/gc.txt b/Documentation/config/gc.adoc
index 21d56db279..21d56db279 100644
--- a/Documentation/config/gc.txt
+++ b/Documentation/config/gc.adoc
diff --git a/Documentation/config/gitcvs.txt b/Documentation/config/gitcvs.adoc
index 02da427fd9..02da427fd9 100644
--- a/Documentation/config/gitcvs.txt
+++ b/Documentation/config/gitcvs.adoc
diff --git a/Documentation/config/gitweb.txt b/Documentation/config/gitweb.adoc
index 1b51475108..1b51475108 100644
--- a/Documentation/config/gitweb.txt
+++ b/Documentation/config/gitweb.adoc
diff --git a/Documentation/config/gpg.txt b/Documentation/config/gpg.adoc
index 5cf32b179d..5cf32b179d 100644
--- a/Documentation/config/gpg.txt
+++ b/Documentation/config/gpg.adoc
diff --git a/Documentation/config/grep.txt b/Documentation/config/grep.adoc
index 10041f27b0..10041f27b0 100644
--- a/Documentation/config/grep.txt
+++ b/Documentation/config/grep.adoc
diff --git a/Documentation/config/gui.txt b/Documentation/config/gui.adoc
index 171be774d2..171be774d2 100644
--- a/Documentation/config/gui.txt
+++ b/Documentation/config/gui.adoc
diff --git a/Documentation/config/guitool.txt b/Documentation/config/guitool.adoc
index 43fb9466ff..43fb9466ff 100644
--- a/Documentation/config/guitool.txt
+++ b/Documentation/config/guitool.adoc
diff --git a/Documentation/config/help.txt b/Documentation/config/help.adoc
index 610701f9a3..b369589cec 100644
--- a/Documentation/config/help.txt
+++ b/Documentation/config/help.adoc
@@ -11,13 +11,14 @@ help.autoCorrect::
If git detects typos and can identify exactly one valid command similar
to the error, git will try to suggest the correct command or even
run the suggestion automatically. Possible config values are:
- - 0 (default): show the suggested command.
- - positive number: run the suggested command after specified
+ - 0, "false", "off", "no", "show": show the suggested command (default).
+ - 1, "true", "on", "yes", "immediate": run the suggested command
+immediately.
+ - positive number > 1: run the suggested command after specified
deciseconds (0.1 sec).
- - "immediate": run the suggested command immediately.
+ - "never": don't run or show any suggested command.
- "prompt": show the suggestion and prompt for confirmation to run
the command.
- - "never": don't run or show any suggested command.
help.htmlPath::
Specify the path where the HTML documentation resides. File system paths
diff --git a/Documentation/config/http.txt b/Documentation/config/http.adoc
index a14371b5c9..22a8803dea 100644
--- a/Documentation/config/http.txt
+++ b/Documentation/config/http.adoc
@@ -216,6 +216,21 @@ http.sslBackend::
This option is ignored if cURL lacks support for choosing the SSL
backend at runtime.
+http.sslCertType::
+ Type of client certificate used when fetching or pushing over HTTPS.
+ "PEM", "DER" are supported when using openssl or gnutls backends. "P12"
+ is supported on "openssl", "schannel", "securetransport", and gnutls 8.11+.
+ See also libcurl `CURLOPT_SSLCERTTYPE`. Can be overridden by the
+ `GIT_SSL_CERT_TYPE` environment variable.
+
+http.sslKeyType::
+ Type of client private key used when fetching or pushing over HTTPS. (e.g.
+ "PEM", "DER", or "ENG"). Only applicable when using "openssl" backend. "DER"
+ is not supported with openssl. Particularly useful when set to "ENG" for
+ authenticating with PKCS#11 tokens, with a PKCS#11 URL in sslCert option.
+ See also libcurl `CURLOPT_SSLKEYTYPE`. Can be overridden by the
+ `GIT_SSL_KEY_TYPE` environment variable.
+
http.schannelCheckRevoke::
Used to enforce or disable certificate revocation checks in cURL
when http.sslBackend is set to "schannel". Defaults to `true` if
diff --git a/Documentation/config/i18n.txt b/Documentation/config/i18n.adoc
index 6e72fdb45b..6e72fdb45b 100644
--- a/Documentation/config/i18n.txt
+++ b/Documentation/config/i18n.adoc
diff --git a/Documentation/config/imap.txt b/Documentation/config/imap.adoc
index 3d28f72643..3d28f72643 100644
--- a/Documentation/config/imap.txt
+++ b/Documentation/config/imap.adoc
diff --git a/Documentation/config/includeif.txt b/Documentation/config/includeif.adoc
index 82fe431c34..82fe431c34 100644
--- a/Documentation/config/includeif.txt
+++ b/Documentation/config/includeif.adoc
diff --git a/Documentation/config/index.txt b/Documentation/config/index.adoc
index 3eff420360..3eff420360 100644
--- a/Documentation/config/index.txt
+++ b/Documentation/config/index.adoc
diff --git a/Documentation/config/init.txt b/Documentation/config/init.adoc
index e45b2a8121..e45b2a8121 100644
--- a/Documentation/config/init.txt
+++ b/Documentation/config/init.adoc
diff --git a/Documentation/config/instaweb.txt b/Documentation/config/instaweb.adoc
index 50cb2f7d62..50cb2f7d62 100644
--- a/Documentation/config/instaweb.txt
+++ b/Documentation/config/instaweb.adoc
diff --git a/Documentation/config/interactive.txt b/Documentation/config/interactive.adoc
index 8b876cb4eb..8b876cb4eb 100644
--- a/Documentation/config/interactive.txt
+++ b/Documentation/config/interactive.adoc
diff --git a/Documentation/config/log.txt b/Documentation/config/log.adoc
index 9003a82191..9003a82191 100644
--- a/Documentation/config/log.txt
+++ b/Documentation/config/log.adoc
diff --git a/Documentation/config/lsrefs.txt b/Documentation/config/lsrefs.adoc
index 3d88fb0bad..3d88fb0bad 100644
--- a/Documentation/config/lsrefs.txt
+++ b/Documentation/config/lsrefs.adoc
diff --git a/Documentation/config/mailinfo.txt b/Documentation/config/mailinfo.adoc
index ec3a5d81f7..ec3a5d81f7 100644
--- a/Documentation/config/mailinfo.txt
+++ b/Documentation/config/mailinfo.adoc
diff --git a/Documentation/config/mailmap.txt b/Documentation/config/mailmap.adoc
index 48cbc30722..48cbc30722 100644
--- a/Documentation/config/mailmap.txt
+++ b/Documentation/config/mailmap.adoc
diff --git a/Documentation/config/maintenance.txt b/Documentation/config/maintenance.adoc
index 72a9d6cf81..72a9d6cf81 100644
--- a/Documentation/config/maintenance.txt
+++ b/Documentation/config/maintenance.adoc
diff --git a/Documentation/config/man.txt b/Documentation/config/man.adoc
index 5a0f82cc23..5a0f82cc23 100644
--- a/Documentation/config/man.txt
+++ b/Documentation/config/man.adoc
diff --git a/Documentation/config/merge.txt b/Documentation/config/merge.adoc
index 82554d65a0..d2d0f21a71 100644
--- a/Documentation/config/merge.txt
+++ b/Documentation/config/merge.adoc
@@ -37,7 +37,7 @@ merge.verifySignatures::
If true, this is equivalent to the --verify-signatures command
line option. See linkgit:git-merge[1] for details.
-include::fmt-merge-msg.txt[]
+include::fmt-merge-msg.adoc[]
merge.renameLimit::
The number of files to consider in the exhaustive portion of
@@ -69,7 +69,8 @@ merge.renormalize::
Tell Git that canonical representation of files in the
repository has changed over time (e.g. earlier commits record
text files with CRLF line endings, but recent ones use LF line
- endings). In such a repository, Git can convert the data
+ endings). In such a repository, for each file where a
+ three-way content merge is needed, Git can convert the data
recorded in commits to a canonical form before performing a
merge to reduce unnecessary conflicts. For more information,
see section "Merging branches with differing checkin/checkout
@@ -101,7 +102,7 @@ merge.guitool::
Any other value is treated as a custom merge tool and requires that a
corresponding mergetool.<guitool>.cmd variable is defined.
-include::{build_dir}/mergetools-merge.txt[]
+include::{build_dir}/mergetools-merge.adoc[]
merge.verbosity::
Controls the amount of output shown by the recursive merge
diff --git a/Documentation/config/mergetool.txt b/Documentation/config/mergetool.adoc
index 00bf665aa0..00bf665aa0 100644
--- a/Documentation/config/mergetool.txt
+++ b/Documentation/config/mergetool.adoc
diff --git a/Documentation/config/notes.txt b/Documentation/config/notes.adoc
index 43db8e808d..b7e536496f 100644
--- a/Documentation/config/notes.txt
+++ b/Documentation/config/notes.adoc
@@ -1,4 +1,4 @@
-notes.mergeStrategy::
+`notes.mergeStrategy`::
Which merge strategy to choose by default when resolving notes
conflicts. Must be one of `manual`, `ours`, `theirs`, `union`, or
`cat_sort_uniq`. Defaults to `manual`. See the "NOTES MERGE STRATEGIES"
@@ -7,17 +7,17 @@ notes.mergeStrategy::
This setting can be overridden by passing the `--strategy` option to
linkgit:git-notes[1].
-notes.<name>.mergeStrategy::
+`notes.<name>.mergeStrategy`::
Which merge strategy to choose when doing a notes merge into
- refs/notes/<name>. This overrides the more general
- "notes.mergeStrategy". See the "NOTES MERGE STRATEGIES" section in
+ `refs/notes/<name>`. This overrides the more general
+ `notes.mergeStrategy`. See the "NOTES MERGE STRATEGIES" section in
linkgit:git-notes[1] for more information on the available strategies.
-notes.displayRef::
+`notes.displayRef`::
Which ref (or refs, if a glob or specified more than once), in
addition to the default set by `core.notesRef` or
`GIT_NOTES_REF`, to read notes from when showing commit
- messages with the 'git log' family of commands.
+ messages with the `git log` family of commands.
+
This setting can be overridden with the `GIT_NOTES_DISPLAY_REF`
environment variable, which must be a colon separated list of refs or
@@ -26,27 +26,27 @@ globs.
A warning will be issued for refs that do not exist,
but a glob that does not match any refs is silently ignored.
+
-This setting can be disabled by the `--no-notes` option to the 'git
-log' family of commands, or by the `--notes=<ref>` option accepted by
+This setting can be disabled by the `--no-notes` option to the linkgit:git-log[1]
+family of commands, or by the `--notes=<ref>` option accepted by
those commands.
+
-The effective value of "core.notesRef" (possibly overridden by
-GIT_NOTES_REF) is also implicitly added to the list of refs to be
+The effective value of `core.notesRef` (possibly overridden by
+`GIT_NOTES_REF`) is also implicitly added to the list of refs to be
displayed.
-notes.rewrite.<command>::
- When rewriting commits with <command> (currently `amend` or
+`notes.rewrite.<command>`::
+ When rewriting commits with _<command>_ (currently `amend` or
`rebase`), if this variable is `false`, git will not copy
notes from the original to the rewritten commit. Defaults to
- `true`. See also "`notes.rewriteRef`" below.
+ `true`. See also `notes.rewriteRef` below.
+
This setting can be overridden with the `GIT_NOTES_REWRITE_REF`
environment variable, which must be a colon separated list of refs or
globs.
-notes.rewriteMode::
+`notes.rewriteMode`::
When copying notes during a rewrite (see the
- "notes.rewrite.<command>" option), determines what to do if
+ `notes.rewrite.<command>` option), determines what to do if
the target commit already has a note. Must be one of
`overwrite`, `concatenate`, `cat_sort_uniq`, or `ignore`.
Defaults to `concatenate`.
@@ -54,7 +54,7 @@ notes.rewriteMode::
This setting can be overridden with the `GIT_NOTES_REWRITE_MODE`
environment variable.
-notes.rewriteRef::
+`notes.rewriteRef`::
When copying notes during a rewrite, specifies the (fully
qualified) ref whose notes should be copied. May be a glob,
in which case notes in all matching refs will be copied. You
diff --git a/Documentation/config/pack.txt b/Documentation/config/pack.adoc
index da527377fa..da527377fa 100644
--- a/Documentation/config/pack.txt
+++ b/Documentation/config/pack.adoc
diff --git a/Documentation/config/pager.txt b/Documentation/config/pager.adoc
index d3731cf66c..d3731cf66c 100644
--- a/Documentation/config/pager.txt
+++ b/Documentation/config/pager.adoc
diff --git a/Documentation/config/pretty.txt b/Documentation/config/pretty.adoc
index 063c6b63d9..063c6b63d9 100644
--- a/Documentation/config/pretty.txt
+++ b/Documentation/config/pretty.adoc
diff --git a/Documentation/config/promisor.txt b/Documentation/config/promisor.adoc
index 98c5cb2ec2..98c5cb2ec2 100644
--- a/Documentation/config/promisor.txt
+++ b/Documentation/config/promisor.adoc
diff --git a/Documentation/config/protocol.txt b/Documentation/config/protocol.adoc
index a9bf187a93..a9bf187a93 100644
--- a/Documentation/config/protocol.txt
+++ b/Documentation/config/protocol.adoc
diff --git a/Documentation/config/pull.txt b/Documentation/config/pull.adoc
index 9349e09261..9349e09261 100644
--- a/Documentation/config/pull.txt
+++ b/Documentation/config/pull.adoc
diff --git a/Documentation/config/push.txt b/Documentation/config/push.adoc
index 0acbbea18a..0acbbea18a 100644
--- a/Documentation/config/push.txt
+++ b/Documentation/config/push.adoc
diff --git a/Documentation/config/rebase.txt b/Documentation/config/rebase.adoc
index c6187ab28b..c6187ab28b 100644
--- a/Documentation/config/rebase.txt
+++ b/Documentation/config/rebase.adoc
diff --git a/Documentation/config/receive.txt b/Documentation/config/receive.adoc
index 36a1e6f2d2..36a1e6f2d2 100644
--- a/Documentation/config/receive.txt
+++ b/Documentation/config/receive.adoc
diff --git a/Documentation/config/reftable.txt b/Documentation/config/reftable.adoc
index 57087803a5..57087803a5 100644
--- a/Documentation/config/reftable.txt
+++ b/Documentation/config/reftable.adoc
diff --git a/Documentation/config/remote.txt b/Documentation/config/remote.adoc
index 4118c219c1..4118c219c1 100644
--- a/Documentation/config/remote.txt
+++ b/Documentation/config/remote.adoc
diff --git a/Documentation/config/remotes.txt b/Documentation/config/remotes.adoc
index 4cfe03221e..4cfe03221e 100644
--- a/Documentation/config/remotes.txt
+++ b/Documentation/config/remotes.adoc
diff --git a/Documentation/config/repack.txt b/Documentation/config/repack.adoc
index c79af6d7b8..c79af6d7b8 100644
--- a/Documentation/config/repack.txt
+++ b/Documentation/config/repack.adoc
diff --git a/Documentation/config/rerere.txt b/Documentation/config/rerere.adoc
index 3a78b5ebb1..3a78b5ebb1 100644
--- a/Documentation/config/rerere.txt
+++ b/Documentation/config/rerere.adoc
diff --git a/Documentation/config/revert.txt b/Documentation/config/revert.adoc
index 802d6faca2..802d6faca2 100644
--- a/Documentation/config/revert.txt
+++ b/Documentation/config/revert.adoc
diff --git a/Documentation/config/safe.txt b/Documentation/config/safe.adoc
index 2d45c98b12..2d45c98b12 100644
--- a/Documentation/config/safe.txt
+++ b/Documentation/config/safe.adoc
diff --git a/Documentation/config/sendemail.txt b/Documentation/config/sendemail.adoc
index 5ffcfc9f2a..5ffcfc9f2a 100644
--- a/Documentation/config/sendemail.txt
+++ b/Documentation/config/sendemail.adoc
diff --git a/Documentation/config/sequencer.txt b/Documentation/config/sequencer.adoc
index e664eef01d..e664eef01d 100644
--- a/Documentation/config/sequencer.txt
+++ b/Documentation/config/sequencer.adoc
diff --git a/Documentation/config/showbranch.txt b/Documentation/config/showbranch.adoc
index e79ecd9ee9..e79ecd9ee9 100644
--- a/Documentation/config/showbranch.txt
+++ b/Documentation/config/showbranch.adoc
diff --git a/Documentation/config/sparse.txt b/Documentation/config/sparse.adoc
index aff49a8d3a..aff49a8d3a 100644
--- a/Documentation/config/sparse.txt
+++ b/Documentation/config/sparse.adoc
diff --git a/Documentation/config/splitindex.txt b/Documentation/config/splitindex.adoc
index cfaa29610b..cfaa29610b 100644
--- a/Documentation/config/splitindex.txt
+++ b/Documentation/config/splitindex.adoc
diff --git a/Documentation/config/ssh.txt b/Documentation/config/ssh.adoc
index 2ca4bf93e1..2ca4bf93e1 100644
--- a/Documentation/config/ssh.txt
+++ b/Documentation/config/ssh.adoc
diff --git a/Documentation/config/stash.txt b/Documentation/config/stash.adoc
index ec1edaeba6..ec1edaeba6 100644
--- a/Documentation/config/stash.txt
+++ b/Documentation/config/stash.adoc
diff --git a/Documentation/config/status.txt b/Documentation/config/status.adoc
index 8caf90f51c..8caf90f51c 100644
--- a/Documentation/config/status.txt
+++ b/Documentation/config/status.adoc
diff --git a/Documentation/config/submodule.txt b/Documentation/config/submodule.adoc
index 0672d99117..0672d99117 100644
--- a/Documentation/config/submodule.txt
+++ b/Documentation/config/submodule.adoc
diff --git a/Documentation/config/tag.txt b/Documentation/config/tag.adoc
index 5062a057ff..5062a057ff 100644
--- a/Documentation/config/tag.txt
+++ b/Documentation/config/tag.adoc
diff --git a/Documentation/config/tar.txt b/Documentation/config/tar.adoc
index de8ff48ea9..de8ff48ea9 100644
--- a/Documentation/config/tar.txt
+++ b/Documentation/config/tar.adoc
diff --git a/Documentation/config/trace2.txt b/Documentation/config/trace2.adoc
index 3b6bca2b7a..05639ce33f 100644
--- a/Documentation/config/trace2.txt
+++ b/Documentation/config/trace2.adoc
@@ -17,7 +17,7 @@ trace2.eventTarget::
It may be overridden by the `GIT_TRACE2_EVENT` environment variable.
The following table shows possible values.
+
-include::../trace2-target-values.txt[]
+include::../trace2-target-values.adoc[]
trace2.normalBrief::
Boolean. When true `time`, `filename`, and `line` fields are
diff --git a/Documentation/config/trailer.adoc b/Documentation/config/trailer.adoc
new file mode 100644
index 0000000000..60bc221c88
--- /dev/null
+++ b/Documentation/config/trailer.adoc
@@ -0,0 +1,136 @@
+trailer.separators::
+ This option tells which characters are recognized as trailer
+ separators. By default only ':' is recognized as a trailer
+ separator, except that '=' is always accepted on the command
+ line for compatibility with other git commands.
++
+The first character given by this option will be the default character
+used when another separator is not specified in the config for this
+trailer.
++
+For example, if the value for this option is "%=$", then only lines
+using the format '<key><sep><value>' with <sep> containing '%', '='
+or '$' and then spaces will be considered trailers. And '%' will be
+the default separator used, so by default trailers will appear like:
+'<key>% <value>' (one percent sign and one space will appear between
+the key and the value).
+
+trailer.where::
+ This option tells where a new trailer will be added.
++
+This can be `end`, which is the default, `start`, `after` or `before`.
++
+If it is `end`, then each new trailer will appear at the end of the
+existing trailers.
++
+If it is `start`, then each new trailer will appear at the start,
+instead of the end, of the existing trailers.
++
+If it is `after`, then each new trailer will appear just after the
+last trailer with the same <key>.
++
+If it is `before`, then each new trailer will appear just before the
+first trailer with the same <key>.
+
+trailer.ifexists::
+ This option makes it possible to choose what action will be
+ performed when there is already at least one trailer with the
+ same <key> in the input.
++
+The valid values for this option are: `addIfDifferentNeighbor` (this
+is the default), `addIfDifferent`, `add`, `replace` or `doNothing`.
++
+With `addIfDifferentNeighbor`, a new trailer will be added only if no
+trailer with the same (<key>, <value>) pair is above or below the line
+where the new trailer will be added.
++
+With `addIfDifferent`, a new trailer will be added only if no trailer
+with the same (<key>, <value>) pair is already in the input.
++
+With `add`, a new trailer will be added, even if some trailers with
+the same (<key>, <value>) pair are already in the input.
++
+With `replace`, an existing trailer with the same <key> will be
+deleted and the new trailer will be added. The deleted trailer will be
+the closest one (with the same <key>) to the place where the new one
+will be added.
++
+With `doNothing`, nothing will be done; that is no new trailer will be
+added if there is already one with the same <key> in the input.
+
+trailer.ifmissing::
+ This option makes it possible to choose what action will be
+ performed when there is not yet any trailer with the same
+ <key> in the input.
++
+The valid values for this option are: `add` (this is the default) and
+`doNothing`.
++
+With `add`, a new trailer will be added.
++
+With `doNothing`, nothing will be done.
+
+trailer.<keyAlias>.key::
+ Defines a <keyAlias> for the <key>. The <keyAlias> must be a
+ prefix (case does not matter) of the <key>. For example, in `git
+ config trailer.ack.key "Acked-by"` the "Acked-by" is the <key> and
+ the "ack" is the <keyAlias>. This configuration allows the shorter
+ `--trailer "ack:..."` invocation on the command line using the "ack"
+ <keyAlias> instead of the longer `--trailer "Acked-by:..."`.
++
+At the end of the <key>, a separator can appear and then some
+space characters. By default the only valid separator is ':',
+but this can be changed using the `trailer.separators` config
+variable.
++
+If there is a separator in the key, then it overrides the default
+separator when adding the trailer.
+
+trailer.<keyAlias>.where::
+ This option takes the same values as the 'trailer.where'
+ configuration variable and it overrides what is specified by
+ that option for trailers with the specified <keyAlias>.
+
+trailer.<keyAlias>.ifexists::
+ This option takes the same values as the 'trailer.ifexists'
+ configuration variable and it overrides what is specified by
+ that option for trailers with the specified <keyAlias>.
+
+trailer.<keyAlias>.ifmissing::
+ This option takes the same values as the 'trailer.ifmissing'
+ configuration variable and it overrides what is specified by
+ that option for trailers with the specified <keyAlias>.
+
+trailer.<keyAlias>.command::
+ Deprecated in favor of 'trailer.<keyAlias>.cmd'.
+ This option behaves in the same way as 'trailer.<keyAlias>.cmd', except
+ that it doesn't pass anything as argument to the specified command.
+ Instead the first occurrence of substring $ARG is replaced by the
+ <value> that would be passed as argument.
++
+Note that $ARG in the user's command is
+only replaced once and that the original way of replacing $ARG is not safe.
++
+When both 'trailer.<keyAlias>.cmd' and 'trailer.<keyAlias>.command' are given
+for the same <keyAlias>, 'trailer.<keyAlias>.cmd' is used and
+'trailer.<keyAlias>.command' is ignored.
+
+trailer.<keyAlias>.cmd::
+ This option can be used to specify a shell command that will be called
+ once to automatically add a trailer with the specified <keyAlias>, and then
+ called each time a '--trailer <keyAlias>=<value>' argument is specified to
+ modify the <value> of the trailer that this option would produce.
++
+When the specified command is first called to add a trailer
+with the specified <keyAlias>, the behavior is as if a special
+'--trailer <keyAlias>=<value>' argument was added at the beginning
+of the "git interpret-trailers" command, where <value>
+is taken to be the standard output of the command with any
+leading and trailing whitespace trimmed off.
++
+If some '--trailer <keyAlias>=<value>' arguments are also passed
+on the command line, the command is called again once for each
+of these arguments with the same <keyAlias>. And the <value> part
+of these arguments, if any, will be passed to the command as its
+first argument. This way the command can produce a <value> computed
+from the <value> passed in the '--trailer <keyAlias>=<value>' argument.
diff --git a/Documentation/config/transfer.txt b/Documentation/config/transfer.adoc
index f1ce50f4a6..f1ce50f4a6 100644
--- a/Documentation/config/transfer.txt
+++ b/Documentation/config/transfer.adoc
diff --git a/Documentation/config/uploadarchive.txt b/Documentation/config/uploadarchive.adoc
index e0698e8c1d..e0698e8c1d 100644
--- a/Documentation/config/uploadarchive.txt
+++ b/Documentation/config/uploadarchive.adoc
diff --git a/Documentation/config/uploadpack.txt b/Documentation/config/uploadpack.adoc
index 0e1dda944a..0e1dda944a 100644
--- a/Documentation/config/uploadpack.txt
+++ b/Documentation/config/uploadpack.adoc
diff --git a/Documentation/config/url.txt b/Documentation/config/url.adoc
index e5566c371d..e5566c371d 100644
--- a/Documentation/config/url.txt
+++ b/Documentation/config/url.adoc
diff --git a/Documentation/config/user.txt b/Documentation/config/user.adoc
index 2ffc38d164..2ffc38d164 100644
--- a/Documentation/config/user.txt
+++ b/Documentation/config/user.adoc
diff --git a/Documentation/config/versionsort.txt b/Documentation/config/versionsort.adoc
index 0cff090819..0cff090819 100644
--- a/Documentation/config/versionsort.txt
+++ b/Documentation/config/versionsort.adoc
diff --git a/Documentation/config/web.txt b/Documentation/config/web.adoc
index beec8d1303..beec8d1303 100644
--- a/Documentation/config/web.txt
+++ b/Documentation/config/web.adoc
diff --git a/Documentation/config/worktree.txt b/Documentation/config/worktree.adoc
index 5e35c7d018..5e35c7d018 100644
--- a/Documentation/config/worktree.txt
+++ b/Documentation/config/worktree.adoc
diff --git a/Documentation/date-formats.txt b/Documentation/date-formats.adoc
index e24517c496..e24517c496 100644
--- a/Documentation/date-formats.txt
+++ b/Documentation/date-formats.adoc
diff --git a/Documentation/diff-format.txt b/Documentation/diff-format.adoc
index c72fb37986..80e36e153d 100644
--- a/Documentation/diff-format.txt
+++ b/Documentation/diff-format.adoc
@@ -121,7 +121,7 @@ Note that 'combined diff' lists only files which were modified from
all parents.
-include::diff-generate-patch.txt[]
+include::diff-generate-patch.adoc[]
other diff formats
diff --git a/Documentation/diff-generate-patch.txt b/Documentation/diff-generate-patch.adoc
index e5c813c96f..e5c813c96f 100644
--- a/Documentation/diff-generate-patch.txt
+++ b/Documentation/diff-generate-patch.adoc
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.adoc
index 640eb6e7db..640eb6e7db 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.adoc
diff --git a/Documentation/everyday.txto b/Documentation/everyday.adoco
index ae555bd47e..ae555bd47e 100644
--- a/Documentation/everyday.txto
+++ b/Documentation/everyday.adoco
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.adoc
index b01372e4b3..b01372e4b3 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.adoc
diff --git a/Documentation/fsck-msgids.txt b/Documentation/fsck-msgids.adoc
index b14bc44ca4..b14bc44ca4 100644
--- a/Documentation/fsck-msgids.txt
+++ b/Documentation/fsck-msgids.adoc
diff --git a/Documentation/git-add.txt b/Documentation/git-add.adoc
index 5f2c3592b8..eba0b419ce 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.adoc
@@ -437,10 +437,10 @@ they will make the patch impossible to apply:
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
:git-add: 1
-include::config/add.txt[]
+include::config/add.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-am.txt b/Documentation/git-am.adoc
index 69d5cc9f21..221070de48 100644
--- a/Documentation/git-am.txt
+++ b/Documentation/git-am.adoc
@@ -120,7 +120,7 @@ default. You can use `--no-utf8` to override this.
am.threeWay configuration variable. For more information,
see am.threeWay in linkgit:git-config[1].
-include::rerere-options.txt[]
+include::rerere-options.adoc[]
--ignore-space-change::
--ignore-whitespace::
@@ -284,9 +284,9 @@ information.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/am.txt[]
+include::config/am.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-annotate.txt b/Documentation/git-annotate.adoc
index 5ae8aabe0f..965bc676af 100644
--- a/Documentation/git-annotate.txt
+++ b/Documentation/git-annotate.adoc
@@ -22,7 +22,7 @@ familiar command name for people coming from other SCM systems.
OPTIONS
-------
-include::blame-options.txt[]
+include::blame-options.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-apply.txt b/Documentation/git-apply.adoc
index dd4a61ef28..952518b8af 100644
--- a/Documentation/git-apply.txt
+++ b/Documentation/git-apply.adoc
@@ -270,9 +270,9 @@ has no effect when `--index` or `--cached` is in use.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/apply.txt[]
+include::config/apply.adoc[]
SUBMODULES
----------
diff --git a/Documentation/git-archimport.txt b/Documentation/git-archimport.adoc
index 847777fd17..847777fd17 100644
--- a/Documentation/git-archimport.txt
+++ b/Documentation/git-archimport.adoc
diff --git a/Documentation/git-archive.txt b/Documentation/git-archive.adoc
index a0e3fe7996..a0e3fe7996 100644
--- a/Documentation/git-archive.txt
+++ b/Documentation/git-archive.adoc
diff --git a/Documentation/git-backfill.adoc b/Documentation/git-backfill.adoc
new file mode 100644
index 0000000000..95623051f7
--- /dev/null
+++ b/Documentation/git-backfill.adoc
@@ -0,0 +1,71 @@
+git-backfill(1)
+===============
+
+NAME
+----
+git-backfill - Download missing objects in a partial clone
+
+
+SYNOPSIS
+--------
+[synopsis]
+git backfill [--min-batch-size=<n>] [--[no-]sparse]
+
+DESCRIPTION
+-----------
+
+Blobless partial clones are created using `git clone --filter=blob:none`
+and then configure the local repository such that the Git client avoids
+downloading blob objects unless they are required for a local operation.
+This initially means that the clone and later fetches download reachable
+commits and trees but no blobs. Later operations that change the `HEAD`
+pointer, such as `git checkout` or `git merge`, may need to download
+missing blobs in order to complete their operation.
+
+In the worst cases, commands that compute blob diffs, such as `git blame`,
+become very slow as they download the missing blobs in single-blob
+requests to satisfy the missing object as the Git command needs it. This
+leads to multiple download requests and no ability for the Git server to
+provide delta compression across those objects.
+
+The `git backfill` command provides a way for the user to request that
+Git downloads the missing blobs (with optional filters) such that the
+missing blobs representing historical versions of files can be downloaded
+in batches. The `backfill` command attempts to optimize the request by
+grouping blobs that appear at the same path, hopefully leading to good
+delta compression in the packfile sent by the server.
+
+In this way, `git backfill` provides a mechanism to break a large clone
+into smaller chunks. Starting with a blobless partial clone with `git
+clone --filter=blob:none` and then running `git backfill` in the local
+repository provides a way to download all reachable objects in several
+smaller network calls than downloading the entire repository at clone
+time.
+
+By default, `git backfill` downloads all blobs reachable from the `HEAD`
+commit. This set can be restricted or expanded using various options.
+
+THIS COMMAND IS EXPERIMENTAL. ITS BEHAVIOR MAY CHANGE IN THE FUTURE.
+
+
+OPTIONS
+-------
+
+`--min-batch-size=<n>`::
+ Specify a minimum size for a batch of missing objects to request
+ from the server. This size may be exceeded by the last set of
+ blobs seen at a given path. The default minimum batch size is
+ 50,000.
+
+`--[no-]sparse`::
+ Only download objects if they appear at a path that matches the
+ current sparse-checkout. If the sparse-checkout feature is enabled,
+ then `--sparse` is assumed and can be disabled with `--no-sparse`.
+
+SEE ALSO
+--------
+linkgit:git-clone[1].
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Documentation/git-bisect-lk2009.txt b/Documentation/git-bisect-lk2009.adoc
index 0bc165788e..0bc165788e 100644
--- a/Documentation/git-bisect-lk2009.txt
+++ b/Documentation/git-bisect-lk2009.adoc
diff --git a/Documentation/git-bisect.txt b/Documentation/git-bisect.adoc
index 82f944dc03..82f944dc03 100644
--- a/Documentation/git-bisect.txt
+++ b/Documentation/git-bisect.adoc
diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.adoc
index b1d7fb539d..f75ed44790 100644
--- a/Documentation/git-blame.txt
+++ b/Documentation/git-blame.adoc
@@ -48,7 +48,7 @@ ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output
OPTIONS
-------
-include::blame-options.txt[]
+include::blame-options.adoc[]
-c::
Use the same output mode as linkgit:git-annotate[1] (Default: off).
@@ -244,9 +244,9 @@ See linkgit:gitmailmap[5].
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/blame.txt[]
+include::config/blame.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.adoc
index 0b08442932..7a073a36d6 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.adoc
@@ -345,9 +345,9 @@ CONFIGURATION
`--list` is used or implied. The default is to use a pager.
See linkgit:git-config[1].
-include::includes/cmd-config-section-rest.txt[]
+include::includes/cmd-config-section-rest.adoc[]
-include::config/branch.txt[]
+include::config/branch.adoc[]
EXAMPLES
--------
@@ -415,7 +415,7 @@ serve four related but different purposes:
- `--no-merged` is used to find branches which are candidates for merging
into HEAD, since those branches are not fully contained by HEAD.
-include::ref-reachability-filters.txt[]
+include::ref-reachability-filters.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-bugreport.txt b/Documentation/git-bugreport.adoc
index 112658b3c3..112658b3c3 100644
--- a/Documentation/git-bugreport.txt
+++ b/Documentation/git-bugreport.adoc
diff --git a/Documentation/git-bundle.txt b/Documentation/git-bundle.adoc
index 03cd36fe8d..03cd36fe8d 100644
--- a/Documentation/git-bundle.txt
+++ b/Documentation/git-bundle.adoc
diff --git a/Documentation/git-cat-file.txt b/Documentation/git-cat-file.adoc
index d5890ae368..d5890ae368 100644
--- a/Documentation/git-cat-file.txt
+++ b/Documentation/git-cat-file.adoc
diff --git a/Documentation/git-check-attr.txt b/Documentation/git-check-attr.adoc
index cb5a6c8f33..cb5a6c8f33 100644
--- a/Documentation/git-check-attr.txt
+++ b/Documentation/git-check-attr.adoc
diff --git a/Documentation/git-check-ignore.txt b/Documentation/git-check-ignore.adoc
index 3e3b4e3446..3e3b4e3446 100644
--- a/Documentation/git-check-ignore.txt
+++ b/Documentation/git-check-ignore.adoc
diff --git a/Documentation/git-check-mailmap.txt b/Documentation/git-check-mailmap.adoc
index 966c91c46a..966c91c46a 100644
--- a/Documentation/git-check-mailmap.txt
+++ b/Documentation/git-check-mailmap.adoc
diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.adoc
index 2aacfd1808..2aacfd1808 100644
--- a/Documentation/git-check-ref-format.txt
+++ b/Documentation/git-check-ref-format.adoc
diff --git a/Documentation/git-checkout-index.txt b/Documentation/git-checkout-index.adoc
index faf8d6ca36..faf8d6ca36 100644
--- a/Documentation/git-checkout-index.txt
+++ b/Documentation/git-checkout-index.adoc
diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.adoc
index bf26655764..a66c53a5cd 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.adoc
@@ -612,9 +612,9 @@ $ git add frotz
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/checkout.txt[]
+include::config/checkout.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.adoc
index 81ace900fc..42b41923d5 100644
--- a/Documentation/git-cherry-pick.txt
+++ b/Documentation/git-cherry-pick.adoc
@@ -172,11 +172,11 @@ fail unless one of `--empty=keep` or `--allow-empty` are specified.
Pass the merge strategy-specific option through to the
merge strategy. See linkgit:git-merge[1] for details.
-include::rerere-options.txt[]
+include::rerere-options.adoc[]
SEQUENCER SUBCOMMANDS
---------------------
-include::sequencer.txt[]
+include::sequencer.adoc[]
EXAMPLES
--------
diff --git a/Documentation/git-cherry.txt b/Documentation/git-cherry.adoc
index 0ea921a593..0ea921a593 100644
--- a/Documentation/git-cherry.txt
+++ b/Documentation/git-cherry.adoc
diff --git a/Documentation/git-citool.txt b/Documentation/git-citool.adoc
index c7a11c36c1..c7a11c36c1 100644
--- a/Documentation/git-citool.txt
+++ b/Documentation/git-citool.adoc
diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.adoc
index fd17165416..bed52c203b 100644
--- a/Documentation/git-clean.txt
+++ b/Documentation/git-clean.adoc
@@ -140,9 +140,9 @@ help::
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/clean.txt[]
+include::config/clean.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.adoc
index de8d8f5893..510b91b5c0 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.adoc
@@ -13,7 +13,7 @@ git clone [--template=<template-directory>]
[-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
[-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
[--dissociate] [--separate-git-dir <git-dir>]
- [--depth <depth>] [--[no-]single-branch] [--no-tags]
+ [--depth <depth>] [--[no-]single-branch] [--[no-]tags]
[--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules]
[--[no-]remote-submodules] [--jobs <n>] [--sparse] [--[no-]reject-shallow]
[--filter=<filter-spec>] [--also-filter-submodules]] [--] <repository>
@@ -221,6 +221,15 @@ objects from the source repository into a pack in the cloned repository.
`--branch` can also take tags and detaches the `HEAD` at that commit
in the resulting repository.
+`--revision=<rev>`::
+ Create a new repository, and fetch the history leading to the given
+ revision _<rev>_ (and nothing else), without making any remote-tracking
+ branch, and without making any local branch, and detach `HEAD` to
+ _<rev>_. The argument can be a ref name (e.g. `refs/heads/main` or
+ `refs/tags/v1.0`) that peels down to a commit, or a hexadecimal object
+ name.
+ This option is incompatible with `--branch` and `--mirror`.
+
`-u` _<upload-pack>_::
`--upload-pack` _<upload-pack>_::
When given, and the repository to clone from is accessed
@@ -273,12 +282,15 @@ corresponding `--mirror` and `--no-tags` options instead.
branch when `--single-branch` clone was made, no remote-tracking
branch is created.
-`--no-tags`::
- Don't clone any tags, and set
- `remote.<remote>.tagOpt=--no-tags` in the config, ensuring
- that future `git pull` and `git fetch` operations won't follow
- any tags. Subsequent explicit tag fetches will still work,
- (see linkgit:git-fetch[1]).
+`--[no-]tags`::
+ Control whether or not tags will be cloned. When `--no-tags` is
+ given, the option will be become permanent by setting the
+ `remote.<remote>.tagOpt=--no-tags` configuration. This ensures that
+ future `git pull` and `git fetch` won't follow any tags. Subsequent
+ explicit tag fetches will still work (see linkgit:git-fetch[1]).
+
+ By default, tags are cloned and passing `--tags` is thus typically a
+ no-op, unless it cancels out a previous `--no-tags`.
+
Can be used in conjunction with `--single-branch` to clone and
maintain a branch with no references other than a single cloned
@@ -321,7 +333,7 @@ or `--mirror` is given)
Specify the given ref storage format for the repository. The valid values are:
+
-include::ref-storage-format.txt[]
+include::ref-storage-format.adoc[]
`-j` _<n>_::
`--jobs` _<n>_::
@@ -348,7 +360,7 @@ _<directory>_::
`--shallow-since`, and `--shallow-exclude`.
:git-clone: 1
-include::urls.txt[]
+include::urls.adoc[]
EXAMPLES
--------
@@ -396,11 +408,11 @@ $ git clone --no-local /home/otheruser/proj.git /pub/scm/proj.git
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/init.txt[]
+include::config/init.adoc[]
-include::config/clone.txt[]
+include::config/clone.adoc[]
GIT
diff --git a/Documentation/git-column.txt b/Documentation/git-column.adoc
index 18431647a2..85fb87c94a 100644
--- a/Documentation/git-column.txt
+++ b/Documentation/git-column.adoc
@@ -77,9 +77,9 @@ v2.4.8 v2.4.9
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/column.txt[]
+include::config/column.adoc[]
GIT
---
diff --git a/Documentation/git-commit-graph.txt b/Documentation/git-commit-graph.adoc
index 903b16830e..50b5016804 100644
--- a/Documentation/git-commit-graph.txt
+++ b/Documentation/git-commit-graph.adoc
@@ -148,9 +148,9 @@ $ git rev-parse HEAD | git commit-graph write --stdin-commits --append
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/commitgraph.txt[]
+include::config/commitgraph.adoc[]
FILE FORMAT
diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.adoc
index 2e2c581098..6472921e14 100644
--- a/Documentation/git-commit-tree.txt
+++ b/Documentation/git-commit-tree.adoc
@@ -80,12 +80,12 @@ A commit comment is read from stdin. If a changelog
entry is not provided via "<" redirection, 'git commit-tree' will just wait
for one to be entered and terminated with ^D.
-include::date-formats.txt[]
+include::date-formats.adoc[]
Discussion
----------
-include::i18n.txt[]
+include::i18n.adoc[]
FILES
-----
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.adoc
index c822113c11..dc219025f1 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.adoc
@@ -7,8 +7,8 @@ git-commit - Record changes to the repository
SYNOPSIS
--------
-[verse]
-'git commit' [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
+[synopsis]
+git commit [-a | --interactive | --patch] [-s] [-v] [-u[<mode>]] [--amend]
[--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|reword):]<commit>]
[-F <file> | -m <msg>] [--reset-author] [--allow-empty]
[--allow-empty-message] [--no-verify] [-e] [--author=<author>]
@@ -23,31 +23,31 @@ Create a new commit containing the current contents of the index and
the given log message describing the changes. The new commit is a
direct child of HEAD, usually the tip of the current branch, and the
branch is updated to point to it (unless no branch is associated with
-the working tree, in which case HEAD is "detached" as described in
+the working tree, in which case `HEAD` is "detached" as described in
linkgit:git-checkout[1]).
The content to be committed can be specified in several ways:
1. by using linkgit:git-add[1] to incrementally "add" changes to the
- index before using the 'commit' command (Note: even modified files
+ index before using the `commit` command (Note: even modified files
must be "added");
2. by using linkgit:git-rm[1] to remove files from the working tree
- and the index, again before using the 'commit' command;
+ and the index, again before using the `commit` command;
-3. by listing files as arguments to the 'commit' command
- (without --interactive or --patch switch), in which
+3. by listing files as arguments to the `commit` command
+ (without `--interactive` or `--patch` switch), in which
case the commit will ignore changes staged in the index, and instead
record the current content of the listed files (which must already
be known to Git);
-4. by using the -a switch with the 'commit' command to automatically
+4. by using the `-a` switch with the `commit` command to automatically
"add" changes from all known files (i.e. all files that are already
listed in the index) and to automatically "rm" files in the index
that have been removed from the working tree, and then perform the
actual commit;
-5. by using the --interactive or --patch switches with the 'commit' command
+5. by using the `--interactive` or `--patch` switches with the `commit` command
to decide one by one which files or hunks should be part of the commit
in addition to contents in the index,
before finalizing the operation. See the ``Interactive Mode'' section of
@@ -58,139 +58,139 @@ summary of what is included by any of the above for the next
commit by giving the same set of parameters (options and paths).
If you make a commit and then find a mistake immediately after
-that, you can recover from it with 'git reset'.
+that, you can recover from it with `git reset`.
:git-commit: 1
OPTIONS
-------
--a::
---all::
- Tell the command to automatically stage files that have
+`-a`::
+`--all`::
+ Automatically stage files that have
been modified and deleted, but new files you have not
told Git about are not affected.
--p::
---patch::
+`-p`::
+`--patch`::
Use the interactive patch selection interface to choose
which changes to commit. See linkgit:git-add[1] for
details.
--C <commit>::
---reuse-message=<commit>::
- Take an existing commit object, and reuse the log message
+`-C <commit>`::
+`--reuse-message=<commit>`::
+ Take an existing _<commit>_ object, and reuse the log message
and the authorship information (including the timestamp)
when creating the commit.
--c <commit>::
---reedit-message=<commit>::
- Like '-C', but with `-c` the editor is invoked, so that
+`-c <commit>`::
+`--reedit-message=<commit>`::
+ Like `-C`, but with `-c` the editor is invoked, so that
the user can further edit the commit message.
---fixup=[(amend|reword):]<commit>::
- Create a new commit which "fixes up" `<commit>` when applied with
+`--fixup=[(amend|reword):]<commit>`::
+ Create a new commit which "fixes up" _<commit>_ when applied with
`git rebase --autosquash`. Plain `--fixup=<commit>` creates a
- "fixup!" commit which changes the content of `<commit>` but leaves
+ "fixup!" commit which changes the content of _<commit>_ but leaves
its log message untouched. `--fixup=amend:<commit>` is similar but
creates an "amend!" commit which also replaces the log message of
- `<commit>` with the log message of the "amend!" commit.
+ _<commit>_ with the log message of the "amend!" commit.
`--fixup=reword:<commit>` creates an "amend!" commit which
- replaces the log message of `<commit>` with its own log message
- but makes no changes to the content of `<commit>`.
+ replaces the log message of _<commit>_ with its own log message
+ but makes no changes to the content of _<commit>_.
+
-The commit created by plain `--fixup=<commit>` has a subject
-composed of "fixup!" followed by the subject line from <commit>,
+The commit created by plain `--fixup=<commit>` has a title
+composed of "fixup!" followed by the title of _<commit>_,
and is recognized specially by `git rebase --autosquash`. The `-m`
option may be used to supplement the log message of the created
commit, but the additional commentary will be thrown away once the
-"fixup!" commit is squashed into `<commit>` by
+"fixup!" commit is squashed into _<commit>_ by
`git rebase --autosquash`.
+
The commit created by `--fixup=amend:<commit>` is similar but its
-subject is instead prefixed with "amend!". The log message of
-<commit> is copied into the log message of the "amend!" commit and
+title is instead prefixed with "amend!". The log message of
+_<commit>_ is copied into the log message of the "amend!" commit and
opened in an editor so it can be refined. When `git rebase
---autosquash` squashes the "amend!" commit into `<commit>`, the
-log message of `<commit>` is replaced by the refined log message
+--autosquash` squashes the "amend!" commit into _<commit>_, the
+log message of _<commit>_ is replaced by the refined log message
from the "amend!" commit. It is an error for the "amend!" commit's
log message to be empty unless `--allow-empty-message` is
specified.
+
`--fixup=reword:<commit>` is shorthand for `--fixup=amend:<commit>
---only`. It creates an "amend!" commit with only a log message
+ --only`. It creates an "amend!" commit with only a log message
(ignoring any changes staged in the index). When squashed by `git
-rebase --autosquash`, it replaces the log message of `<commit>`
+rebase --autosquash`, it replaces the log message of _<commit>_
without making any other changes.
+
Neither "fixup!" nor "amend!" commits change authorship of
-`<commit>` when applied by `git rebase --autosquash`.
+_<commit>_ when applied by `git rebase --autosquash`.
See linkgit:git-rebase[1] for details.
---squash=<commit>::
- Construct a commit message for use with `rebase --autosquash`.
- The commit message subject line is taken from the specified
+`--squash=<commit>`::
+ Construct a commit message for use with `git rebase --autosquash`.
+ The commit message title is taken from the specified
commit with a prefix of "squash! ". Can be used with additional
commit message options (`-m`/`-c`/`-C`/`-F`). See
linkgit:git-rebase[1] for details.
---reset-author::
- When used with -C/-c/--amend options, or when committing after a
+`--reset-author`::
+ When used with `-C`/`-c`/`--amend` options, or when committing after a
conflicting cherry-pick, declare that the authorship of the
resulting commit now belongs to the committer. This also renews
the author timestamp.
---short::
+`--short`::
When doing a dry-run, give the output in the short-format. See
linkgit:git-status[1] for details. Implies `--dry-run`.
---branch::
+`--branch`::
Show the branch and tracking info even in short-format.
---porcelain::
+`--porcelain`::
When doing a dry-run, give the output in a porcelain-ready
format. See linkgit:git-status[1] for details. Implies
`--dry-run`.
---long::
+`--long`::
When doing a dry-run, give the output in the long-format.
Implies `--dry-run`.
--z::
---null::
+`-z`::
+`--null`::
When showing `short` or `porcelain` status output, print the
- filename verbatim and terminate the entries with NUL, instead of LF.
+ filename verbatim and terminate the entries with _NUL_, instead of _LF_.
If no format is given, implies the `--porcelain` output format.
Without the `-z` option, filenames with "unusual" characters are
quoted as explained for the configuration variable `core.quotePath`
(see linkgit:git-config[1]).
--F <file>::
---file=<file>::
- Take the commit message from the given file. Use '-' to
+`-F <file>`::
+`--file=<file>`::
+ Take the commit message from _<file>_. Use '-' to
read the message from the standard input.
---author=<author>::
+`--author=<author>`::
Override the commit author. Specify an explicit author using the
- standard `A U Thor <author@example.com>` format. Otherwise <author>
+ standard `A U Thor <author@example.com>` format. Otherwise _<author>_
is assumed to be a pattern and is used to search for an existing
- commit by that author (i.e. rev-list --all -i --author=<author>);
+ commit by that author (i.e. `git rev-list --all -i --author=<author>`);
the commit author is then copied from the first such commit found.
---date=<date>::
+`--date=<date>`::
Override the author date used in the commit.
--m <msg>::
---message=<msg>::
- Use the given <msg> as the commit message.
+`-m <msg>`::
+`--message=<msg>`::
+ Use _<msg>_ as the commit message.
If multiple `-m` options are given, their values are
concatenated as separate paragraphs.
+
The `-m` option is mutually exclusive with `-c`, `-C`, and `-F`.
--t <file>::
---template=<file>::
+`-t <file>`::
+`--template=<file>`::
When editing the commit message, start the editor with the
- contents in the given file. The `commit.template` configuration
+ contents in _<file>_. The `commit.template` configuration
variable is often used to give this option implicitly to the
command. This mechanism can be used by projects that want to
guide participants with some hints on what to write in the message
@@ -198,58 +198,56 @@ The `-m` option is mutually exclusive with `-c`, `-C`, and `-F`.
message, the commit is aborted. This has no effect when a message
is given by other means, e.g. with the `-m` or `-F` options.
-include::signoff-option.txt[]
+include::signoff-option.adoc[]
---trailer <token>[(=|:)<value>]::
- Specify a (<token>, <value>) pair that should be applied as a
+`--trailer <token>[(=|:)<value>]`::
+ Specify a (_<token>_, _<value>_) pair that should be applied as a
trailer. (e.g. `git commit --trailer "Signed-off-by:C O Mitter \
<committer@example.com>" --trailer "Helped-by:C O Mitter \
- <committer@example.com>"` will add the "Signed-off-by" trailer
- and the "Helped-by" trailer to the commit message.)
+ <committer@example.com>"` will add the `Signed-off-by` trailer
+ and the `Helped-by` trailer to the commit message.)
The `trailer.*` configuration variables
(linkgit:git-interpret-trailers[1]) can be used to define if
a duplicated trailer is omitted, where in the run of trailers
each trailer would appear, and other details.
--n::
---[no-]verify::
- By default, the pre-commit and commit-msg hooks are run.
- When any of `--no-verify` or `-n` is given, these are bypassed.
+`-n`::
+`--[no-]verify`::
+ Bypass the `pre-commit` and `commit-msg` hooks.
See also linkgit:githooks[5].
---allow-empty::
+`--allow-empty`::
Usually recording a commit that has the exact same tree as its
sole parent commit is a mistake, and the command prevents you
from making such a commit. This option bypasses the safety, and
is primarily for use by foreign SCM interface scripts.
---allow-empty-message::
- Like --allow-empty this command is primarily for use by foreign
- SCM interface scripts. It allows you to create a commit with an
- empty commit message without using plumbing commands like
- linkgit:git-commit-tree[1].
+`--allow-empty-message`::
+ Create a commit with an empty commit message without using plumbing
+ commands like linkgit:git-commit-tree[1]. Like `--allow-empty`, this
+ command is primarily for use by foreign SCM interface scripts.
---cleanup=<mode>::
- This option determines how the supplied commit message should be
+`--cleanup=<mode>`::
+ Determine how the supplied commit message should be
cleaned up before committing. The '<mode>' can be `strip`,
`whitespace`, `verbatim`, `scissors` or `default`.
+
--
-strip::
+`strip`::
Strip leading and trailing empty lines, trailing whitespace,
commentary and collapse consecutive empty lines.
-whitespace::
+`whitespace`::
Same as `strip` except #commentary is not removed.
-verbatim::
+`verbatim`::
Do not change the message at all.
-scissors::
+`scissors`::
Same as `whitespace` except that everything from (and including)
the line found below is truncated, if the message is to be edited.
- "`#`" can be customized with core.commentChar.
+ "`#`" can be customized with `core.commentChar`.
# ------------------------ >8 ------------------------
-default::
+`default`::
Same as `strip` if the message is to be edited.
Otherwise `whitespace`.
--
@@ -257,19 +255,18 @@ default::
The default can be changed by the `commit.cleanup` configuration
variable (see linkgit:git-config[1]).
--e::
---edit::
- The message taken from file with `-F`, command line with
- `-m`, and from commit object with `-C` are usually used as
- the commit log message unmodified. This option lets you
- further edit the message taken from these sources.
+`-e`::
+`--edit`::
+ Let the user further edit the message taken from _<file>_
+ with `-F <file>`, command line with `-m <message>`, and
+ from _<commit>_ with `-C <commit>`.
---no-edit::
+`--no-edit`::
Use the selected commit message without launching an editor.
For example, `git commit --amend --no-edit` amends a commit
without changing its commit message.
---amend::
+`--amend`::
Replace the tip of the current branch by creating a new
commit. The recorded tree is prepared as usual (including
the effect of the `-i` and `-o` options and explicit
@@ -295,23 +292,23 @@ You should understand the implications of rewriting history if you
amend a commit that has already been published. (See the "RECOVERING
FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
---no-post-rewrite::
- Bypass the post-rewrite hook.
+`--no-post-rewrite`::
+ Bypass the `post-rewrite` hook.
--i::
---include::
+`-i`::
+`--include`::
Before making a commit out of staged contents so far,
stage the contents of paths given on the command line
as well. This is usually not what you want unless you
are concluding a conflicted merge.
--o::
---only::
+`-o`::
+`--only`::
Make a commit by taking the updated working tree contents
of the paths specified on the
command line, disregarding any contents that have been
staged for other paths. This is the default mode of operation of
- 'git commit' if any paths are given on the command line,
+ `git commit` if any paths are given on the command line,
in which case this option can be omitted.
If this option is specified together with `--amend`, then
no paths need to be specified, which can be used to amend
@@ -319,48 +316,48 @@ FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
already been staged. If used together with `--allow-empty`
paths are also not required, and an empty commit will be created.
---pathspec-from-file=<file>::
- Pathspec is passed in `<file>` instead of commandline args. If
- `<file>` is exactly `-` then standard input is used. Pathspec
- elements are separated by LF or CR/LF. Pathspec elements can be
+`--pathspec-from-file=<file>`::
+ Pass pathspec in _<file>_ instead of commandline args. If
+ _<file>_ is exactly `-` then standard input is used. Pathspec
+ elements are separated by _LF_ or _CR_/_LF_. Pathspec elements can be
quoted as explained for the configuration variable `core.quotePath`
(see linkgit:git-config[1]). See also `--pathspec-file-nul` and
global `--literal-pathspecs`.
---pathspec-file-nul::
+`--pathspec-file-nul`::
Only meaningful with `--pathspec-from-file`. Pathspec elements are
- separated with NUL character and all other characters are taken
+ separated with _NUL_ character and all other characters are taken
literally (including newlines and quotes).
--u[<mode>]::
---untracked-files[=<mode>]::
+`-u[<mode>]`::
+`--untracked-files[=<mode>]`::
Show untracked files.
+
--
-The mode parameter is optional (defaults to 'all'), and is used to
-specify the handling of untracked files; when -u is not used, the
-default is 'normal', i.e. show untracked files and directories.
+The _<mode>_ parameter is optional (defaults to `all`), and is used to
+specify the handling of untracked files; when `-u` is not used, the
+default is `normal`, i.e. show untracked files and directories.
The possible options are:
- - 'no' - Show no untracked files
- - 'normal' - Shows untracked files and directories
- - 'all' - Also shows individual files in untracked directories.
+`no`:: Show no untracked files
+`normal`:: Shows untracked files and directories
+`all`:: Also shows individual files in untracked directories.
All usual spellings for Boolean value `true` are taken as `normal`
and `false` as `no`.
-The default can be changed using the status.showUntrackedFiles
+The default can be changed using the `status.showUntrackedFiles`
configuration variable documented in linkgit:git-config[1].
--
--v::
---verbose::
- Show unified diff between the HEAD commit and what
+`-v`::
+`--verbose`::
+ Show unified diff between the `HEAD` commit and what
would be committed at the bottom of the commit message
template to help the user describe the commit by reminding
what changes the commit has.
Note that this diff output doesn't have its
- lines prefixed with '#'. This diff will not be a part
+ lines prefixed with `#`. This diff will not be a part
of the commit message. See the `commit.verbose` configuration
variable in linkgit:git-config[1].
+
@@ -368,40 +365,40 @@ If specified twice, show in addition the unified diff between
what would be committed and the worktree files, i.e. the unstaged
changes to tracked files.
--q::
---quiet::
+`-q`::
+`--quiet`::
Suppress commit summary message.
---dry-run::
+`--dry-run`::
Do not create a commit, but show a list of paths that are
to be committed, paths with local changes that will be left
uncommitted and paths that are untracked.
---status::
+`--status`::
Include the output of linkgit:git-status[1] in the commit
message template when using an editor to prepare the commit
message. Defaults to on, but can be used to override
- configuration variable commit.status.
+ configuration variable `commit.status`.
---no-status::
+`--no-status`::
Do not include the output of linkgit:git-status[1] in the
commit message template when using an editor to prepare the
default commit message.
--S[<keyid>]::
---gpg-sign[=<keyid>]::
---no-gpg-sign::
- GPG-sign commits. The `keyid` argument is optional and
+`-S[<key-id>]`::
+`--gpg-sign[=<key-id>]`::
+`--no-gpg-sign`::
+ GPG-sign commits. The _<key-id>_ is optional and
defaults to the committer identity; if specified, it must be
stuck to the option without a space. `--no-gpg-sign` is useful to
countermand both `commit.gpgSign` configuration variable, and
earlier `--gpg-sign`.
-\--::
+`--`::
Do not interpret any more arguments as options.
-<pathspec>...::
- When pathspec is given on the command line, commit the contents of
+`<pathspec>...`::
+ When _<pathspec>_ is given on the command line, commit the contents of
the files that match the pathspec without recording the changes
already added to the index. The contents of these files are also
staged for the next commit on top of what have been staged before.
@@ -412,10 +409,10 @@ EXAMPLES
--------
When recording your own work, the contents of modified files in
your working tree are temporarily stored to a staging area
-called the "index" with 'git add'. A file can be
+called the "index" with `git add`. A file can be
reverted back, only in the index but not in the working tree,
to that of the last commit with `git restore --staged <file>`,
-which effectively reverts 'git add' and prevents the changes to
+which effectively reverts `git add` and prevents the changes to
this file from participating in the next commit. After building
the state to be committed incrementally with these commands,
`git commit` (without any pathname parameter) is used to record what
@@ -443,7 +440,7 @@ $ git commit -a
------------
The command `git commit -a` first looks at your working tree,
-notices that you have modified hello.c and removed goodbye.c,
+notices that you have modified `hello.c` and removed `goodbye.c`,
and performs necessary `git add` and `git rm` for you.
After staging changes to many files, you can alter the order the
@@ -471,13 +468,13 @@ $ git commit
this second commit would record the changes to `hello.c` and
`hello.h` as expected.
-After a merge (initiated by 'git merge' or 'git pull') stops
+After a merge (initiated by `git merge` or `git pull`) stops
because of conflicts, cleanly merged
paths are already staged to be committed for you, and paths that
conflicted are left in unmerged state. You would have to first
-check which paths are conflicting with 'git status'
+check which paths are conflicting with `git status`
and after fixing them manually in your working tree, you would
-stage the result as usual with 'git add':
+stage the result as usual with `git add`:
------------
$ git status | grep unmerged
@@ -507,12 +504,12 @@ COMMIT INFORMATION
Author and committer information is taken from the following environment
variables, if set:
- GIT_AUTHOR_NAME
- GIT_AUTHOR_EMAIL
- GIT_AUTHOR_DATE
- GIT_COMMITTER_NAME
- GIT_COMMITTER_EMAIL
- GIT_COMMITTER_DATE
+ * `GIT_AUTHOR_NAME`
+ * `GIT_AUTHOR_EMAIL`
+ * `GIT_AUTHOR_DATE`
+ * `GIT_COMMITTER_NAME`
+ * `GIT_COMMITTER_EMAIL`
+ * `GIT_COMMITTER_DATE`
(nb "<", ">" and "\n"s are stripped)
@@ -524,7 +521,7 @@ that, see the `credential.username` variable in linkgit:git-config[1].
In case (some of) these environment variables are not set, the information
is taken from the configuration items `user.name` and `user.email`, or, if not
-present, the environment variable EMAIL, or, if that is not set,
+present, the environment variable `EMAIL`, or, if that is not set,
system user name and the hostname used for outgoing mail (taken
from `/etc/mailname` and falling back to the fully qualified hostname when
that file does not exist).
@@ -537,7 +534,7 @@ The typical usage is to set just the `user.name` and `user.email` variables;
the other options are provided for more complex use cases.
:git-commit: 1
-include::date-formats.txt[]
+include::date-formats.adoc[]
DISCUSSION
----------
@@ -550,18 +547,18 @@ as the commit title, and that title is used throughout Git.
For example, linkgit:git-format-patch[1] turns a commit into email, and it uses
the title on the Subject line and the rest of the commit in the body.
-include::i18n.txt[]
+include::i18n.adoc[]
ENVIRONMENT AND CONFIGURATION VARIABLES
---------------------------------------
The editor used to edit the commit log message will be chosen from the
-`GIT_EDITOR` environment variable, the core.editor configuration variable, the
+`GIT_EDITOR` environment variable, the `core.editor` configuration variable, the
`VISUAL` environment variable, or the `EDITOR` environment variable (in that
order). See linkgit:git-var[1] for details.
-include::includes/cmd-config-section-rest.txt[]
+include::includes/cmd-config-section-rest.adoc[]
-include::config/commit.txt[]
+include::config/commit.adoc[]
HOOKS
-----
diff --git a/Documentation/git-config.txt b/Documentation/git-config.adoc
index 3e420177c1..936e0c5130 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.adoc
@@ -213,7 +213,9 @@ See also <<FILES>>.
+
Valid `<type>`'s include:
+
-- 'bool': canonicalize values as either "true" or "false".
+- 'bool': canonicalize values `true`, `yes`,`on`, and positive
+ numbers as "true", and values `false`, `no`, `off` and `0` as
+ "false".
- 'int': canonicalize values as simple decimal numbers. An optional suffix of
'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or
1073741824 upon input.
@@ -610,7 +612,7 @@ http.cookieFile /tmp/cookie.txt
http.sslverify false
------------
-include::config.txt[]
+include::config.adoc[]
BUGS
----
diff --git a/Documentation/git-count-objects.txt b/Documentation/git-count-objects.adoc
index 97f9f12610..97f9f12610 100644
--- a/Documentation/git-count-objects.txt
+++ b/Documentation/git-count-objects.adoc
diff --git a/Documentation/git-credential-cache--daemon.txt b/Documentation/git-credential-cache--daemon.adoc
index 650a15a7ed..650a15a7ed 100644
--- a/Documentation/git-credential-cache--daemon.txt
+++ b/Documentation/git-credential-cache--daemon.adoc
diff --git a/Documentation/git-credential-cache.txt b/Documentation/git-credential-cache.adoc
index 487cc557a8..54fa7a27e1 100644
--- a/Documentation/git-credential-cache.txt
+++ b/Documentation/git-credential-cache.adoc
@@ -78,6 +78,23 @@ variable (this example increases the cache time to 1 hour):
$ git config credential.helper 'cache --timeout=3600'
-------------------------------------------------------
+PERSONAL ACCESS TOKENS
+----------------------
+
+Some remotes accept personal access tokens, which are randomly
+generated and hard to memorise. They typically have a lifetime of weeks
+or months.
+
+git-credential-cache is inherently unsuitable for persistent storage of
+personal access tokens. The credential will be forgotten after the cache
+timeout. Even if you configure a long timeout, credentials will be
+forgotten if the daemon dies.
+
+To avoid frequently regenerating personal access tokens, configure a
+credential helper with persistent storage. Alternatively, configure an
+OAuth credential helper to generate credentials automatically. See
+linkgit:gitcredentials[7], sections "Available helpers" and "OAuth".
+
GIT
---
Part of the linkgit:git[1] suite
diff --git a/Documentation/git-credential-store.txt b/Documentation/git-credential-store.adoc
index 71864a8726..71864a8726 100644
--- a/Documentation/git-credential-store.txt
+++ b/Documentation/git-credential-store.adoc
diff --git a/Documentation/git-credential.txt b/Documentation/git-credential.adoc
index e41493292f..e41493292f 100644
--- a/Documentation/git-credential.txt
+++ b/Documentation/git-credential.adoc
diff --git a/Documentation/git-cvsexportcommit.txt b/Documentation/git-cvsexportcommit.adoc
index 41c8a8a05c..41c8a8a05c 100644
--- a/Documentation/git-cvsexportcommit.txt
+++ b/Documentation/git-cvsexportcommit.adoc
diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.adoc
index 90fdc2551a..90fdc2551a 100644
--- a/Documentation/git-cvsimport.txt
+++ b/Documentation/git-cvsimport.adoc
diff --git a/Documentation/git-cvsserver.txt b/Documentation/git-cvsserver.adoc
index 4c475efeab..4c475efeab 100644
--- a/Documentation/git-cvsserver.txt
+++ b/Documentation/git-cvsserver.adoc
diff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.adoc
index ede7b935d6..ede7b935d6 100644
--- a/Documentation/git-daemon.txt
+++ b/Documentation/git-daemon.adoc
diff --git a/Documentation/git-describe.txt b/Documentation/git-describe.adoc
index 08ff715709..08ff715709 100644
--- a/Documentation/git-describe.txt
+++ b/Documentation/git-describe.adoc
diff --git a/Documentation/git-diagnose.txt b/Documentation/git-diagnose.adoc
index 0711959e6f..0711959e6f 100644
--- a/Documentation/git-diagnose.txt
+++ b/Documentation/git-diagnose.adoc
diff --git a/Documentation/git-diff-files.txt b/Documentation/git-diff-files.adoc
index bf78e31431..2b2358ca1c 100644
--- a/Documentation/git-diff-files.txt
+++ b/Documentation/git-diff-files.adoc
@@ -20,7 +20,7 @@ same as for 'git diff-index' and 'git diff-tree'.
OPTIONS
-------
-include::diff-options.txt[]
+include::diff-options.adoc[]
-1 --base::
-2 --ours::
@@ -45,7 +45,7 @@ omit diff output for unmerged entries and just show "Unmerged".
Remain silent even for nonexistent files
-include::diff-format.txt[]
+include::diff-format.adoc[]
GIT
---
diff --git a/Documentation/git-diff-index.txt b/Documentation/git-diff-index.adoc
index 4de1d4c8f1..911446a296 100644
--- a/Documentation/git-diff-index.txt
+++ b/Documentation/git-diff-index.adoc
@@ -21,7 +21,7 @@ files are compared.
OPTIONS
-------
-include::diff-options.txt[]
+include::diff-options.adoc[]
<tree-ish>::
The id of a tree object to diff against.
@@ -40,7 +40,7 @@ include::diff-options.txt[]
'git diff-index' say that all non-checked-out files are up
to date.
-include::diff-format.txt[]
+include::diff-format.adoc[]
OPERATING MODES
---------------
diff --git a/Documentation/git-diff-tree.txt b/Documentation/git-diff-tree.adoc
index 09286a85eb..f1e3134bde 100644
--- a/Documentation/git-diff-tree.txt
+++ b/Documentation/git-diff-tree.adoc
@@ -24,7 +24,7 @@ Note that 'git diff-tree' can use the tree encapsulated in a commit object.
OPTIONS
-------
-include::diff-options.txt[]
+include::diff-options.adoc[]
<tree-ish>::
The id of a tree object.
@@ -84,7 +84,7 @@ commits (but not trees).
This flag causes 'git diff-tree --stdin' to also show
the commit message before the differences.
-include::pretty-options.txt[]
+include::pretty-options.adoc[]
--no-commit-id::
'git diff-tree' outputs a line with the commit ID when
@@ -122,9 +122,9 @@ include::pretty-options.txt[]
if the diff itself is empty.
-include::pretty-formats.txt[]
+include::pretty-formats.adoc[]
-include::diff-format.txt[]
+include::diff-format.adoc[]
GIT
---
diff --git a/Documentation/git-diff.txt b/Documentation/git-diff.adoc
index e19f31e8b9..dec173a345 100644
--- a/Documentation/git-diff.txt
+++ b/Documentation/git-diff.adoc
@@ -123,7 +123,7 @@ do not mean a range as defined in the
OPTIONS
-------
:git-diff: 1
-include::diff-options.txt[]
+include::diff-options.adoc[]
`-1`::
`--base`::
@@ -154,7 +154,7 @@ section "3-Way Merge" for detailed information.
names and get diff for all files under them).
-include::diff-format.txt[]
+include::diff-format.adoc[]
EXAMPLES
--------
@@ -232,10 +232,10 @@ $ git diff -R <2>
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
:git-diff: 1
-include::config/diff.txt[]
+include::config/diff.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.adoc
index a616f8b2e6..d596205eaf 100644
--- a/Documentation/git-difftool.txt
+++ b/Documentation/git-difftool.adoc
@@ -119,9 +119,9 @@ CONFIGURATION
'git difftool' falls back to 'git mergetool' config variables when the
difftool equivalents have not been defined.
-include::includes/cmd-config-section-rest.txt[]
+include::includes/cmd-config-section-rest.adoc[]
-include::config/difftool.txt[]
+include::config/difftool.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.adoc
index 752e4b9b01..752e4b9b01 100644
--- a/Documentation/git-fast-export.txt
+++ b/Documentation/git-fast-export.adoc
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.adoc
index 3d435157a6..58a2eaa51a 100644
--- a/Documentation/git-fast-import.txt
+++ b/Documentation/git-fast-import.adoc
@@ -1578,9 +1578,9 @@ compression.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/fastimport.txt[]
+include::config/fastimport.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-fetch-pack.txt b/Documentation/git-fetch-pack.adoc
index b5223576a7..b5223576a7 100644
--- a/Documentation/git-fetch-pack.txt
+++ b/Documentation/git-fetch-pack.adoc
diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.adoc
index 50900a50da..16f5d9d69a 100644
--- a/Documentation/git-fetch.txt
+++ b/Documentation/git-fetch.adoc
@@ -44,15 +44,15 @@ may be used by scripts or other git commands, such as linkgit:git-pull[1].
OPTIONS
-------
-include::fetch-options.txt[]
+include::fetch-options.adoc[]
-include::pull-fetch-param.txt[]
+include::pull-fetch-param.adoc[]
--stdin::
Read refspecs, one per line, from stdin in addition to those provided
as arguments. The "tag <name>" format is not supported.
-include::urls-remotes.txt[]
+include::urls-remotes.adoc[]
CONFIGURED REMOTE-TRACKING BRANCHES[[CRTB]]
@@ -292,14 +292,14 @@ The first command fetches the `maint` branch from the repository at
objects will eventually be removed by git's built-in housekeeping (see
linkgit:git-gc[1]).
-include::transfer-data-leaks.txt[]
+include::transfer-data-leaks.adoc[]
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/fetch.txt[]
+include::config/fetch.adoc[]
BUGS
----
diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.adoc
index 5a4f853785..5a4f853785 100644
--- a/Documentation/git-filter-branch.txt
+++ b/Documentation/git-filter-branch.adoc
diff --git a/Documentation/git-fmt-merge-msg.txt b/Documentation/git-fmt-merge-msg.adoc
index 6f28812f38..0f3328956d 100644
--- a/Documentation/git-fmt-merge-msg.txt
+++ b/Documentation/git-fmt-merge-msg.adoc
@@ -55,7 +55,7 @@ OPTIONS
CONFIGURATION
-------------
-include::config/fmt-merge-msg.txt[]
+include::config/fmt-merge-msg.adoc[]
merge.summary::
Synonym to `merge.log`; this is deprecated and will be removed in
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.adoc
index d3764401a2..ffb97e62c2 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.adoc
@@ -538,7 +538,7 @@ will be reported.
NOTES
-----
-include::ref-reachability-filters.txt[]
+include::ref-reachability-filters.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-for-each-repo.txt b/Documentation/git-for-each-repo.adoc
index abe3527aac..abe3527aac 100644
--- a/Documentation/git-for-each-repo.txt
+++ b/Documentation/git-for-each-repo.adoc
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.adoc
index 5dc7bb4cfc..a8b53db9a6 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.adoc
@@ -105,7 +105,7 @@ reference.
OPTIONS
-------
:git-format-patch: 1
-include::diff-options.txt[]
+include::diff-options.adoc[]
-<n>::
Prepare patches from the topmost <n> commits.
diff --git a/Documentation/git-fsck-objects.txt b/Documentation/git-fsck-objects.adoc
index eec4bdb600..eec4bdb600 100644
--- a/Documentation/git-fsck-objects.txt
+++ b/Documentation/git-fsck-objects.adoc
diff --git a/Documentation/git-fsck.txt b/Documentation/git-fsck.adoc
index 5b82e4605c..8f32800a83 100644
--- a/Documentation/git-fsck.txt
+++ b/Documentation/git-fsck.adoc
@@ -107,9 +107,9 @@ care about this output and want to speed it up further.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/fsck.txt[]
+include::config/fsck.adoc[]
DISCUSSION
----------
@@ -161,7 +161,7 @@ each error means, with their default severity. The severity of the
error, other than those that are marked as "(FATAL)", can be tweaked
by setting the corresponding `fsck.<msg-id>` configuration variable.
-include::fsck-msgids.txt[]
+include::fsck-msgids.adoc[]
Environment Variables
diff --git a/Documentation/git-fsmonitor--daemon.txt b/Documentation/git-fsmonitor--daemon.adoc
index 8585d19f4d..8fe5241b08 100644
--- a/Documentation/git-fsmonitor--daemon.txt
+++ b/Documentation/git-fsmonitor--daemon.adoc
@@ -97,9 +97,9 @@ error that will cause the daemon and the currently running command to exit.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/fsmonitor--daemon.txt[]
+include::config/fsmonitor--daemon.adoc[]
GIT
---
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.adoc
index 370e22faae..526ce01463 100644
--- a/Documentation/git-gc.txt
+++ b/Documentation/git-gc.adoc
@@ -69,6 +69,13 @@ be performed as well.
the `--max-cruft-size` option of linkgit:git-repack[1] for
more.
+--expire-to=<dir>::
+ When packing unreachable objects into a cruft pack, write a cruft
+ pack containing pruned objects (if any) to the directory `<dir>`.
+ This option only has an effect when used together with `--cruft`.
+ See the `--expire-to` option of linkgit:git-repack[1] for
+ more information.
+
--prune=<date>::
Prune loose objects older than date (default is 2 weeks ago,
overridable by the config variable `gc.pruneExpire`).
@@ -122,9 +129,9 @@ users and their repositories.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/gc.txt[]
+include::config/gc.adoc[]
NOTES
-----
diff --git a/Documentation/git-get-tar-commit-id.txt b/Documentation/git-get-tar-commit-id.adoc
index b537bb45b1..b537bb45b1 100644
--- a/Documentation/git-get-tar-commit-id.txt
+++ b/Documentation/git-get-tar-commit-id.adoc
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.adoc
index 1e6d7b65c8..a548585d4c 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.adoc
@@ -351,9 +351,9 @@ experienced in this case, it might be desirable to use `--threads=1`.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/grep.txt[]
+include::config/grep.adoc[]
GIT
---
diff --git a/Documentation/git-gui.txt b/Documentation/git-gui.adoc
index f5b02ef114..f5b02ef114 100644
--- a/Documentation/git-gui.txt
+++ b/Documentation/git-gui.adoc
diff --git a/Documentation/git-hash-object.txt b/Documentation/git-hash-object.adoc
index ef4719ae41..ef4719ae41 100644
--- a/Documentation/git-hash-object.txt
+++ b/Documentation/git-hash-object.adoc
diff --git a/Documentation/git-help.txt b/Documentation/git-help.adoc
index f0bedc1f96..f0bedc1f96 100644
--- a/Documentation/git-help.txt
+++ b/Documentation/git-help.adoc
diff --git a/Documentation/git-hook.txt b/Documentation/git-hook.adoc
index f6cc72d2ca..f6cc72d2ca 100644
--- a/Documentation/git-hook.txt
+++ b/Documentation/git-hook.adoc
diff --git a/Documentation/git-http-backend.txt b/Documentation/git-http-backend.adoc
index f37ddaded8..1dea426852 100644
--- a/Documentation/git-http-backend.txt
+++ b/Documentation/git-http-backend.adoc
@@ -56,6 +56,10 @@ http.receivepack::
disabled by setting this item to `false`, or enabled for all
users, including anonymous users, by setting it to `true`.
+http.uploadarchive::
+ This serves 'git archive' clients for remote archive over HTTP/HTTPS
+ protocols. It is disabled by default. It only works in protocol v2.
+
URL TRANSLATION
---------------
To determine the location of the repository on disk, 'git http-backend'
diff --git a/Documentation/git-http-fetch.txt b/Documentation/git-http-fetch.adoc
index 4ec7c68d3b..4ec7c68d3b 100644
--- a/Documentation/git-http-fetch.txt
+++ b/Documentation/git-http-fetch.adoc
diff --git a/Documentation/git-http-push.txt b/Documentation/git-http-push.adoc
index ce0d808212..ce0d808212 100644
--- a/Documentation/git-http-push.txt
+++ b/Documentation/git-http-push.adoc
diff --git a/Documentation/git-imap-send.txt b/Documentation/git-imap-send.adoc
index c8a89d7243..26ccf4e433 100644
--- a/Documentation/git-imap-send.txt
+++ b/Documentation/git-imap-send.adoc
@@ -54,9 +54,9 @@ CONFIGURATION
To use the tool, `imap.folder` and either `imap.tunnel` or `imap.host` must be set
to appropriate values.
-include::includes/cmd-config-section-rest.txt[]
+include::includes/cmd-config-section-rest.adoc[]
-include::config/imap.txt[]
+include::config/imap.adoc[]
EXAMPLES
--------
diff --git a/Documentation/git-index-pack.txt b/Documentation/git-index-pack.adoc
index 58dd5b5f0e..270056cf63 100644
--- a/Documentation/git-index-pack.txt
+++ b/Documentation/git-index-pack.adoc
@@ -130,7 +130,7 @@ information on the possible values of `<msg-id>` and `<severity>`.
+
This option cannot be used with --stdin.
+
-include::object-format-disclaimer.txt[]
+include::object-format-disclaimer.adoc[]
--promisor[=<message>]::
Before committing the pack-index, create a .promisor file for this
diff --git a/Documentation/git-init-db.txt b/Documentation/git-init-db.adoc
index 18bf1a3c8c..18bf1a3c8c 100644
--- a/Documentation/git-init-db.txt
+++ b/Documentation/git-init-db.adoc
diff --git a/Documentation/git-init.txt b/Documentation/git-init.adoc
index 315f7f7530..a0dffba665 100644
--- a/Documentation/git-init.txt
+++ b/Documentation/git-init.adoc
@@ -55,12 +55,12 @@ current working directory.
Specify the given object _<format>_ (hash algorithm) for the repository. The valid
values are `sha1` and (if enabled) `sha256`. `sha1` is the default.
+
-include::object-format-disclaimer.txt[]
+include::object-format-disclaimer.adoc[]
`--ref-format=<format>`::
Specify the given ref storage _<format>_ for the repository. The valid values are:
+
-include::ref-storage-format.txt[]
+include::ref-storage-format.adoc[]
`--template=<template-directory>`::
Specify the directory from which templates will be used. (See the "TEMPLATE
@@ -178,11 +178,11 @@ $ git commit <3>
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
:git-init:
-include::config/init.txt[]
+include::config/init.adoc[]
GIT
---
diff --git a/Documentation/git-instaweb.txt b/Documentation/git-instaweb.adoc
index a54fe4401b..a54fe4401b 100644
--- a/Documentation/git-instaweb.txt
+++ b/Documentation/git-instaweb.adoc
diff --git a/Documentation/git-interpret-trailers.txt b/Documentation/git-interpret-trailers.adoc
index d9dfb75fef..82c8780d93 100644
--- a/Documentation/git-interpret-trailers.txt
+++ b/Documentation/git-interpret-trailers.adoc
@@ -186,142 +186,9 @@ OPTIONS
CONFIGURATION VARIABLES
-----------------------
-trailer.separators::
- This option tells which characters are recognized as trailer
- separators. By default only ':' is recognized as a trailer
- separator, except that '=' is always accepted on the command
- line for compatibility with other git commands.
-+
-The first character given by this option will be the default character
-used when another separator is not specified in the config for this
-trailer.
-+
-For example, if the value for this option is "%=$", then only lines
-using the format '<key><sep><value>' with <sep> containing '%', '='
-or '$' and then spaces will be considered trailers. And '%' will be
-the default separator used, so by default trailers will appear like:
-'<key>% <value>' (one percent sign and one space will appear between
-the key and the value).
-
-trailer.where::
- This option tells where a new trailer will be added.
-+
-This can be `end`, which is the default, `start`, `after` or `before`.
-+
-If it is `end`, then each new trailer will appear at the end of the
-existing trailers.
-+
-If it is `start`, then each new trailer will appear at the start,
-instead of the end, of the existing trailers.
-+
-If it is `after`, then each new trailer will appear just after the
-last trailer with the same <key>.
-+
-If it is `before`, then each new trailer will appear just before the
-first trailer with the same <key>.
+include::includes/cmd-config-section-all.adoc[]
-trailer.ifexists::
- This option makes it possible to choose what action will be
- performed when there is already at least one trailer with the
- same <key> in the input.
-+
-The valid values for this option are: `addIfDifferentNeighbor` (this
-is the default), `addIfDifferent`, `add`, `replace` or `doNothing`.
-+
-With `addIfDifferentNeighbor`, a new trailer will be added only if no
-trailer with the same (<key>, <value>) pair is above or below the line
-where the new trailer will be added.
-+
-With `addIfDifferent`, a new trailer will be added only if no trailer
-with the same (<key>, <value>) pair is already in the input.
-+
-With `add`, a new trailer will be added, even if some trailers with
-the same (<key>, <value>) pair are already in the input.
-+
-With `replace`, an existing trailer with the same <key> will be
-deleted and the new trailer will be added. The deleted trailer will be
-the closest one (with the same <key>) to the place where the new one
-will be added.
-+
-With `doNothing`, nothing will be done; that is no new trailer will be
-added if there is already one with the same <key> in the input.
-
-trailer.ifmissing::
- This option makes it possible to choose what action will be
- performed when there is not yet any trailer with the same
- <key> in the input.
-+
-The valid values for this option are: `add` (this is the default) and
-`doNothing`.
-+
-With `add`, a new trailer will be added.
-+
-With `doNothing`, nothing will be done.
-
-trailer.<keyAlias>.key::
- Defines a <keyAlias> for the <key>. The <keyAlias> must be a
- prefix (case does not matter) of the <key>. For example, in `git
- config trailer.ack.key "Acked-by"` the "Acked-by" is the <key> and
- the "ack" is the <keyAlias>. This configuration allows the shorter
- `--trailer "ack:..."` invocation on the command line using the "ack"
- <keyAlias> instead of the longer `--trailer "Acked-by:..."`.
-+
-At the end of the <key>, a separator can appear and then some
-space characters. By default the only valid separator is ':',
-but this can be changed using the `trailer.separators` config
-variable.
-+
-If there is a separator in the key, then it overrides the default
-separator when adding the trailer.
-
-trailer.<keyAlias>.where::
- This option takes the same values as the 'trailer.where'
- configuration variable and it overrides what is specified by
- that option for trailers with the specified <keyAlias>.
-
-trailer.<keyAlias>.ifexists::
- This option takes the same values as the 'trailer.ifexists'
- configuration variable and it overrides what is specified by
- that option for trailers with the specified <keyAlias>.
-
-trailer.<keyAlias>.ifmissing::
- This option takes the same values as the 'trailer.ifmissing'
- configuration variable and it overrides what is specified by
- that option for trailers with the specified <keyAlias>.
-
-trailer.<keyAlias>.command::
- Deprecated in favor of 'trailer.<keyAlias>.cmd'.
- This option behaves in the same way as 'trailer.<keyAlias>.cmd', except
- that it doesn't pass anything as argument to the specified command.
- Instead the first occurrence of substring $ARG is replaced by the
- <value> that would be passed as argument.
-+
-Note that $ARG in the user's command is
-only replaced once and that the original way of replacing $ARG is not safe.
-+
-When both 'trailer.<keyAlias>.cmd' and 'trailer.<keyAlias>.command' are given
-for the same <keyAlias>, 'trailer.<keyAlias>.cmd' is used and
-'trailer.<keyAlias>.command' is ignored.
-
-trailer.<keyAlias>.cmd::
- This option can be used to specify a shell command that will be called
- once to automatically add a trailer with the specified <keyAlias>, and then
- called each time a '--trailer <keyAlias>=<value>' argument is specified to
- modify the <value> of the trailer that this option would produce.
-+
-When the specified command is first called to add a trailer
-with the specified <keyAlias>, the behavior is as if a special
-'--trailer <keyAlias>=<value>' argument was added at the beginning
-of the "git interpret-trailers" command, where <value>
-is taken to be the standard output of the command with any
-leading and trailing whitespace trimmed off.
-+
-If some '--trailer <keyAlias>=<value>' arguments are also passed
-on the command line, the command is called again once for each
-of these arguments with the same <keyAlias>. And the <value> part
-of these arguments, if any, will be passed to the command as its
-first argument. This way the command can produce a <value> computed
-from the <value> passed in the '--trailer <keyAlias>=<value>' argument.
+include::config/trailer.adoc[]
EXAMPLES
--------
diff --git a/Documentation/git-log.txt b/Documentation/git-log.adoc
index 579682172f..ae8a7e2d63 100644
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.adoc
@@ -16,7 +16,7 @@ DESCRIPTION
Shows the commit logs.
:git-log: 1
-include::rev-list-description.txt[]
+include::rev-list-description.adoc[]
The command takes options applicable to the linkgit:git-rev-list[1]
command to control what is shown and how, and options applicable to
@@ -89,7 +89,7 @@ produced by `--stat`, etc.
Intended to speed up tools that read log messages from `git log`
output by allowing them to allocate space in advance.
-include::line-range-options.txt[]
+include::line-range-options.adoc[]
<revision-range>::
Show only commits in the specified revision range. When no
@@ -109,9 +109,9 @@ include::line-range-options.txt[]
Paths may need to be prefixed with `--` to separate them from
options or the revision range, when confusion arises.
-include::rev-list-options.txt[]
+include::rev-list-options.adoc[]
-include::pretty-formats.txt[]
+include::pretty-formats.adoc[]
DIFF FORMATTING
---------------
@@ -128,9 +128,9 @@ the default format for merge commits.
:git-log: 1
:diff-merges-default: `off`
-include::diff-options.txt[]
+include::diff-options.adoc[]
-include::diff-generate-patch.txt[]
+include::diff-generate-patch.adoc[]
EXAMPLES
--------
@@ -192,7 +192,7 @@ EXAMPLES
DISCUSSION
----------
-include::i18n.txt[]
+include::i18n.adoc[]
CONFIGURATION
-------------
@@ -209,11 +209,11 @@ i18n.logOutputEncoding::
Defaults to the value of `i18n.commitEncoding` if set, and UTF-8
otherwise.
-include::includes/cmd-config-section-rest.txt[]
+include::includes/cmd-config-section-rest.adoc[]
-include::config/log.txt[]
+include::config/log.adoc[]
-include::config/notes.txt[]
+include::config/notes.adoc[]
GIT
---
diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.adoc
index 58c529afbe..58c529afbe 100644
--- a/Documentation/git-ls-files.txt
+++ b/Documentation/git-ls-files.adoc
diff --git a/Documentation/git-ls-remote.txt b/Documentation/git-ls-remote.adoc
index d71c4ab3e2..d71c4ab3e2 100644
--- a/Documentation/git-ls-remote.txt
+++ b/Documentation/git-ls-remote.adoc
diff --git a/Documentation/git-ls-tree.txt b/Documentation/git-ls-tree.adoc
index 6572095d8d..6572095d8d 100644
--- a/Documentation/git-ls-tree.txt
+++ b/Documentation/git-ls-tree.adoc
diff --git a/Documentation/git-mailinfo.txt b/Documentation/git-mailinfo.adoc
index 28060283c7..3b24c9abd9 100644
--- a/Documentation/git-mailinfo.txt
+++ b/Documentation/git-mailinfo.adoc
@@ -118,9 +118,9 @@ If no such configuration option has been set, `warn` will be used.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/mailinfo.txt[]
+include::config/mailinfo.adoc[]
GIT
---
diff --git a/Documentation/git-mailsplit.txt b/Documentation/git-mailsplit.adoc
index 3f0a6662c8..3f0a6662c8 100644
--- a/Documentation/git-mailsplit.txt
+++ b/Documentation/git-mailsplit.adoc
diff --git a/Documentation/git-maintenance.txt b/Documentation/git-maintenance.adoc
index 6e6651309d..0450d74aff 100644
--- a/Documentation/git-maintenance.txt
+++ b/Documentation/git-maintenance.adoc
@@ -409,9 +409,9 @@ custom tasks.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/maintenance.txt[]
+include::config/maintenance.adoc[]
GIT
diff --git a/Documentation/git-merge-base.txt b/Documentation/git-merge-base.adoc
index 5ab957cfbc..5ab957cfbc 100644
--- a/Documentation/git-merge-base.txt
+++ b/Documentation/git-merge-base.adoc
diff --git a/Documentation/git-merge-file.txt b/Documentation/git-merge-file.adoc
index 71915a00fa..71915a00fa 100644
--- a/Documentation/git-merge-file.txt
+++ b/Documentation/git-merge-file.adoc
diff --git a/Documentation/git-merge-index.txt b/Documentation/git-merge-index.adoc
index eea56b3154..eea56b3154 100644
--- a/Documentation/git-merge-index.txt
+++ b/Documentation/git-merge-index.adoc
diff --git a/Documentation/git-merge-one-file.txt b/Documentation/git-merge-one-file.adoc
index 04e803d5d3..04e803d5d3 100644
--- a/Documentation/git-merge-one-file.txt
+++ b/Documentation/git-merge-one-file.adoc
diff --git a/Documentation/git-merge-tree.txt b/Documentation/git-merge-tree.adoc
index 0b6a8a19b1..cf0578f9b5 100644
--- a/Documentation/git-merge-tree.txt
+++ b/Documentation/git-merge-tree.adoc
@@ -40,11 +40,17 @@ After the merge completes, a new toplevel tree object is created. See
OPTIONS
-------
+--stdin::
+ Read the commits to merge from the standard input rather than
+ the command-line. See <<INPUT,INPUT FORMAT>> below for more
+ information. Implies `-z`.
+
-z::
Do not quote filenames in the <Conflicted file info> section,
and end each filename with a NUL character rather than
newline. Also begin the messages section with a NUL character
- instead of a newline. See <<OUTPUT>> below for more information.
+ instead of a newline. See <<OUTPUT,OUTPUT>> below for more
+ information.
--name-only::
In the Conflicted file info section, instead of writing a list
@@ -116,8 +122,6 @@ This is an integer status followed by a NUL character. The integer status is:
0: merge had conflicts
1: merge was clean
- <0: something prevented the merge from running (e.g. access to repository
- objects denied by filesystem)
[[OIDTLT]]
OID of toplevel tree
@@ -235,6 +239,7 @@ with linkgit:git-merge[1]:
* any messages that would have been printed to stdout (the
<<IM,Informational messages>>)
+[[INPUT]]
INPUT FORMAT
------------
'git merge-tree --stdin' input format is fully text based. Each line
diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.adoc
index 1ab69f61f5..64281d6d44 100644
--- a/Documentation/git-merge.txt
+++ b/Documentation/git-merge.adoc
@@ -65,7 +65,7 @@ OPTIONS
-------
:git-merge: 1
-include::merge-options.txt[]
+include::merge-options.adoc[]
-m <msg>::
Set the commit message to be used for the merge commit (in
@@ -91,7 +91,7 @@ invocations. The automated message can include the branch description.
If `--log` is specified, a shortlog of the commits being merged
will be appended to the specified message.
-include::rerere-options.txt[]
+include::rerere-options.adoc[]
--overwrite-ignore::
--no-overwrite-ignore::
@@ -385,7 +385,7 @@ changes into a merge commit. Small fixups like bumping
release/version name would be acceptable.
-include::merge-strategies.txt[]
+include::merge-strategies.adoc[]
CONFIGURATION
-------------
@@ -395,9 +395,9 @@ branch.<name>.mergeOptions::
supported options are the same as those of `git merge`, but option
values containing whitespace characters are currently not supported.
-include::includes/cmd-config-section-rest.txt[]
+include::includes/cmd-config-section-rest.adoc[]
-include::config/merge.txt[]
+include::config/merge.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-mergetool--lib.txt b/Documentation/git-mergetool--lib.adoc
index 0726b560d4..0726b560d4 100644
--- a/Documentation/git-mergetool--lib.txt
+++ b/Documentation/git-mergetool--lib.adoc
diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.adoc
index b9e20c5dcd..046c3258f0 100644
--- a/Documentation/git-mergetool.txt
+++ b/Documentation/git-mergetool.adoc
@@ -104,9 +104,9 @@ CONFIGURATION
-------------
:git-mergetool: 1
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/mergetool.txt[]
+include::config/mergetool.adoc[]
TEMPORARY FILES
---------------
@@ -123,7 +123,7 @@ BACKEND SPECIFIC HINTS
vimdiff
~~~~~~~
-include::mergetools/vimdiff.txt[]
+include::mergetools/vimdiff.adoc[]
GIT
---
diff --git a/Documentation/git-mktag.txt b/Documentation/git-mktag.adoc
index 006d759962..006d759962 100644
--- a/Documentation/git-mktag.txt
+++ b/Documentation/git-mktag.adoc
diff --git a/Documentation/git-mktree.txt b/Documentation/git-mktree.adoc
index 383f09dd33..383f09dd33 100644
--- a/Documentation/git-mktree.txt
+++ b/Documentation/git-mktree.adoc
diff --git a/Documentation/git-multi-pack-index.txt b/Documentation/git-multi-pack-index.adoc
index 631d5c7d15..631d5c7d15 100644
--- a/Documentation/git-multi-pack-index.txt
+++ b/Documentation/git-multi-pack-index.adoc
diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.adoc
index dc1bf61534..dc1bf61534 100644
--- a/Documentation/git-mv.txt
+++ b/Documentation/git-mv.adoc
diff --git a/Documentation/git-name-rev.txt b/Documentation/git-name-rev.adoc
index d4f1c4d594..d4f1c4d594 100644
--- a/Documentation/git-name-rev.txt
+++ b/Documentation/git-name-rev.adoc
diff --git a/Documentation/git-notes.txt b/Documentation/git-notes.adoc
index 84022f99d7..bcfe3dacd3 100644
--- a/Documentation/git-notes.txt
+++ b/Documentation/git-notes.adoc
@@ -7,19 +7,19 @@ git-notes - Add or inspect object notes
SYNOPSIS
--------
-[verse]
-'git notes' [list [<object>]]
-'git notes' add [-f] [--allow-empty] [--[no-]separator | --separator=<paragraph-break>] [--[no-]stripspace] [-F <file> | -m <msg> | (-c | -C) <object>] [-e] [<object>]
-'git notes' copy [-f] ( --stdin | <from-object> [<to-object>] )
-'git notes' append [--allow-empty] [--[no-]separator | --separator=<paragraph-break>] [--[no-]stripspace] [-F <file> | -m <msg> | (-c | -C) <object>] [-e] [<object>]
-'git notes' edit [--allow-empty] [<object>] [--[no-]stripspace]
-'git notes' show [<object>]
-'git notes' merge [-v | -q] [-s <strategy> ] <notes-ref>
-'git notes' merge --commit [-v | -q]
-'git notes' merge --abort [-v | -q]
-'git notes' remove [--ignore-missing] [--stdin] [<object>...]
-'git notes' prune [-n] [-v]
-'git notes' get-ref
+[synopsis]
+git notes [list [<object>]]
+git notes add [-f] [--allow-empty] [--[no-]separator | --separator=<paragraph-break>] [--[no-]stripspace] [-F <file> | -m <msg> | (-c | -C) <object>] [-e] [<object>]
+git notes copy [-f] ( --stdin | <from-object> [<to-object>] )
+git notes append [--allow-empty] [--[no-]separator | --separator=<paragraph-break>] [--[no-]stripspace] [-F <file> | -m <msg> | (-c | -C) <object>] [-e] [<object>]
+git notes edit [--allow-empty] [<object>] [--[no-]stripspace]
+git notes show [<object>]
+git notes merge [-v | -q] [-s <strategy> ] <notes-ref>
+git notes merge --commit [-v | -q]
+git notes merge --abort [-v | -q]
+git notes remove [--ignore-missing] [--stdin] [<object>...]
+git notes prune [-n] [-v]
+git notes get-ref
DESCRIPTION
@@ -33,34 +33,34 @@ ENVIRONMENT sections below. If this ref does not exist, it will be
quietly created when it is first needed to store a note.
A typical use of notes is to supplement a commit message without
-changing the commit itself. Notes can be shown by 'git log' along with
+changing the commit itself. Notes can be shown by `git log` along with
the original commit message. To distinguish these notes from the
message stored in the commit object, the notes are indented like the
-message, after an unindented line saying "Notes (<refname>):" (or
+message, after an unindented line saying "Notes (_<refname>_):" (or
"Notes:" for `refs/notes/commits`).
Notes can also be added to patches prepared with `git format-patch` by
using the `--notes` option. Such notes are added as a patch commentary
after a three dash separator line.
-To change which notes are shown by 'git log', see the
-"notes.displayRef" discussion in <<CONFIGURATION>>.
+To change which notes are shown by `git log`, see the
+`notes.displayRef` discussion in <<CONFIGURATION,CONFIGURATION>>.
-See the "notes.rewrite.<command>" configuration for a way to carry
+See the `notes.rewrite.<command>` configuration for a way to carry
notes across commands that rewrite commits.
SUBCOMMANDS
-----------
-list::
+`list`::
List the notes object for a given object. If no object is
given, show a list of all note objects and the objects they
- annotate (in the format "<note-object> <annotated-object>").
+ annotate (in the format "`<note-object> <annotated-object>`").
This is the default subcommand if no subcommand is given.
-add::
- Add notes for a given object (defaults to HEAD). Abort if the
+`add`::
+ Add notes for a given object (defaults to `HEAD`). Abort if the
object already has notes (use `-f` to overwrite existing notes).
However, if you're using `add` interactively (using an editor
to supply the notes contents), then - instead of aborting -
@@ -71,10 +71,10 @@ add::
fine-tune the message(s) supplied from `-m` and `-F` options
interactively (using an editor) before adding the note.
-copy::
+`copy`::
Copy the notes for the first object onto the second object (defaults to
- HEAD). Abort if the second object already has notes, or if the first
- object has none (use -f to overwrite existing notes to the
+ `HEAD`). Abort if the second object already has notes, or if the first
+ object has none (use `-f` to overwrite existing notes to the
second object). This subcommand is equivalent to:
`git notes add [-f] -C $(git notes list <from-object>) <to-object>`
+
@@ -84,27 +84,27 @@ In `--stdin` mode, take lines in the format
<from-object> SP <to-object> [ SP <rest> ] LF
----------
+
-on standard input, and copy the notes from each <from-object> to its
-corresponding <to-object>. (The optional `<rest>` is ignored so that
+on standard input, and copy the notes from each _<from-object>_ to its
+corresponding _<to-object>_. (The optional _<rest>_ is ignored so that
the command can read the input given to the `post-rewrite` hook.)
-append::
+`append`::
Append new message(s) given by `-m` or `-F` options to an
existing note, or add them as a new note if one does not
- exist, for the object (defaults to HEAD). When appending to
+ exist, for the object (defaults to `HEAD`). When appending to
an existing note, a blank line is added before each new
message as an inter-paragraph separator. The separator can
be customized with the `--separator` option.
Edit the notes to be appended given by `-m` and `-F` options with
`-e` interactively (using an editor) before appending the note.
-edit::
- Edit the notes for a given object (defaults to HEAD).
+`edit`::
+ Edit the notes for a given object (defaults to `HEAD`).
-show::
- Show the notes for a given object (defaults to HEAD).
+`show`::
+ Show the notes for a given object (defaults to `HEAD`).
-merge::
+`merge`::
Merge the given notes ref into the current notes ref.
This will try to merge the changes made by the given
notes ref (called "remote") since the merge-base (if
@@ -112,35 +112,35 @@ merge::
+
If conflicts arise and a strategy for automatically resolving
conflicting notes (see the "NOTES MERGE STRATEGIES" section) is not given,
-the "manual" resolver is used. This resolver checks out the
+the `manual` resolver is used. This resolver checks out the
conflicting notes in a special worktree (`.git/NOTES_MERGE_WORKTREE`),
and instructs the user to manually resolve the conflicts there.
When done, the user can either finalize the merge with
-'git notes merge --commit', or abort the merge with
-'git notes merge --abort'.
+`git notes merge --commit`, or abort the merge with
+`git notes merge --abort`.
-remove::
- Remove the notes for given objects (defaults to HEAD). When
+`remove`::
+ Remove the notes for given objects (defaults to `HEAD`). When
giving zero or one object from the command line, this is
equivalent to specifying an empty note message to
the `edit` subcommand.
-prune::
+`prune`::
Remove all notes for non-existing/unreachable objects.
-get-ref::
+`get-ref`::
Print the current notes ref. This provides an easy way to
retrieve the current notes ref (e.g. from scripts).
OPTIONS
-------
--f::
---force::
+`-f`::
+`--force`::
When adding notes to an object that already has notes,
overwrite the existing notes (instead of aborting).
--m <msg>::
---message=<msg>::
+`-m <msg>`::
+`--message=<msg>`::
Use the given note message (instead of prompting).
If multiple `-m` options are given, their values
are concatenated as separate paragraphs.
@@ -148,95 +148,96 @@ OPTIONS
single line between paragraphs will be stripped out.
If you wish to keep them verbatim, use `--no-stripspace`.
--F <file>::
---file=<file>::
- Take the note message from the given file. Use '-' to
+`-F <file>`::
+`--file=<file>`::
+ Take the note message from the given file. Use `-` to
read the note message from the standard input.
Lines starting with `#` and empty lines other than a
single line between paragraphs will be stripped out.
If you wish to keep them verbatim, use `--no-stripspace`.
--C <object>::
---reuse-message=<object>::
+`-C <object>`::
+`--reuse-message=<object>`::
Take the given blob object (for example, another note) as the
note message. (Use `git notes copy <object>` instead to
copy notes between objects.). By default, message will be
copied verbatim, but if you wish to strip out the lines
starting with `#` and empty lines other than a single line
- between paragraphs, use with`--stripspace` option.
+ between paragraphs, use with `--stripspace` option.
--c <object>::
---reedit-message=<object>::
- Like '-C', but with `-c` the editor is invoked, so that
+`-c <object>`::
+`--reedit-message=<object>`::
+ Like `-C`, but with `-c` the editor is invoked, so that
the user can further edit the note message.
---allow-empty::
+`--allow-empty`::
Allow an empty note object to be stored. The default behavior is
to automatically remove empty notes.
---[no-]separator, --separator=<paragraph-break>::
+`--[no-]separator`::
+`--separator=<paragraph-break>`::
Specify a string used as a custom inter-paragraph separator
(a newline is added at the end as needed). If `--no-separator`, no
separators will be added between paragraphs. Defaults to a blank
line.
---[no-]stripspace::
+`--[no-]stripspace`::
Strip leading and trailing whitespace from the note message.
Also strip out empty lines other than a single line between
paragraphs. Lines starting with `#` will be stripped out
in non-editor cases like `-m`, `-F` and `-C`, but not in
editor case like `git notes edit`, `-c`, etc.
---ref <ref>::
- Manipulate the notes tree in <ref>. This overrides
- `GIT_NOTES_REF` and the "core.notesRef" configuration. The ref
+`--ref <ref>`::
+ Manipulate the notes tree in _<ref>_. This overrides
+ `GIT_NOTES_REF` and the `core.notesRef` configuration. The ref
specifies the full refname when it begins with `refs/notes/`; when it
begins with `notes/`, `refs/` and otherwise `refs/notes/` is prefixed
to form a full name of the ref.
---ignore-missing::
+`--ignore-missing`::
Do not consider it an error to request removing notes from an
object that does not have notes attached to it.
---stdin::
+`--stdin`::
Also read the object names to remove notes from the standard
input (there is no reason you cannot combine this with object
names from the command line).
--n::
---dry-run::
+`-n`::
+`--dry-run`::
Do not remove anything; just report the object names whose notes
would be removed.
--s <strategy>::
---strategy=<strategy>::
+`-s <strategy>`::
+`--strategy=<strategy>`::
When merging notes, resolve notes conflicts using the given
- strategy. The following strategies are recognized: "manual"
- (default), "ours", "theirs", "union" and "cat_sort_uniq".
- This option overrides the "notes.mergeStrategy" configuration setting.
+ strategy. The following strategies are recognized: `manual`
+ (default), `ours`, `theirs`, `union` and `cat_sort_uniq`.
+ This option overrides the `notes.mergeStrategy` configuration setting.
See the "NOTES MERGE STRATEGIES" section below for more
information on each notes merge strategy.
---commit::
- Finalize an in-progress 'git notes merge'. Use this option
- when you have resolved the conflicts that 'git notes merge'
- stored in .git/NOTES_MERGE_WORKTREE. This amends the partial
- merge commit created by 'git notes merge' (stored in
- .git/NOTES_MERGE_PARTIAL) by adding the notes in
- .git/NOTES_MERGE_WORKTREE. The notes ref stored in the
- .git/NOTES_MERGE_REF symref is updated to the resulting commit.
-
---abort::
- Abort/reset an in-progress 'git notes merge', i.e. a notes merge
+`--commit`::
+ Finalize an in-progress `git notes merge`. Use this option
+ when you have resolved the conflicts that `git notes merge`
+ stored in `.git/NOTES_MERGE_WORKTREE`. This amends the partial
+ merge commit created by `git notes merge` (stored in
+ `.git/NOTES_MERGE_PARTIAL`) by adding the notes in
+ `.git/NOTES_MERGE_WORKTREE`. The notes ref stored in the
+ `.git/NOTES_MERGE_REF` symref is updated to the resulting commit.
+
+`--abort`::
+ Abort/reset an in-progress `git notes merge`, i.e. a notes merge
with conflicts. This simply removes all files related to the
notes merge.
--q::
---quiet::
+`-q`::
+`--quiet`::
When merging notes, operate quietly.
--v::
---verbose::
+`-v`::
+`--verbose`::
When merging notes, be more verbose.
When pruning notes, report all object names whose notes are
removed.
@@ -270,28 +271,28 @@ object, in which case the history of the notes can be read with
NOTES MERGE STRATEGIES
----------------------
-The default notes merge strategy is "manual", which checks out
+The default notes merge strategy is `manual`, which checks out
conflicting notes in a special work tree for resolving notes conflicts
(`.git/NOTES_MERGE_WORKTREE`), and instructs the user to resolve the
conflicts in that work tree.
When done, the user can either finalize the merge with
-'git notes merge --commit', or abort the merge with
-'git notes merge --abort'.
+`git notes merge --commit`, or abort the merge with
+`git notes merge --abort`.
Users may select an automated merge strategy from among the following using
-either -s/--strategy option or configuring notes.mergeStrategy accordingly:
+either `-s`/`--strategy` option or configuring `notes.mergeStrategy` accordingly:
-"ours" automatically resolves conflicting notes in favor of the local
+`ours` automatically resolves conflicting notes in favor of the local
version (i.e. the current notes ref).
-"theirs" automatically resolves notes conflicts in favor of the remote
+`theirs` automatically resolves notes conflicts in favor of the remote
version (i.e. the given notes ref being merged into the current notes
ref).
-"union" automatically resolves notes conflicts by concatenating the
+`union` automatically resolves notes conflicts by concatenating the
local and remote versions.
-"cat_sort_uniq" is similar to "union", but in addition to concatenating
+`cat_sort_uniq` is similar to `union`, but in addition to concatenating
the local and remote versions, this strategy also sorts the resulting
lines, and removes duplicate lines from the result. This is equivalent
to applying the "cat | sort | uniq" shell pipeline to the local and
@@ -320,7 +321,7 @@ Notes:
In principle, a note is a regular Git blob, and any kind of
(non-)format is accepted. You can binary-safely create notes from
-arbitrary files using 'git hash-object':
+arbitrary files using `git hash-object`:
------------
$ cc *.c
@@ -331,7 +332,7 @@ $ git notes --ref=built add --allow-empty -C "$blob" HEAD
(You cannot simply use `git notes --ref=built add -F a.out HEAD`
because that is not binary-safe.)
Of course, it doesn't make much sense to display non-text-format notes
-with 'git log', so if you use such notes, you'll probably need to write
+with `git log`, so if you use such notes, you'll probably need to write
some special-purpose tools to do something useful with them.
@@ -339,15 +340,15 @@ some special-purpose tools to do something useful with them.
CONFIGURATION
-------------
-core.notesRef::
+`core.notesRef`::
Notes ref to read and manipulate instead of
`refs/notes/commits`. Must be an unabbreviated ref name.
This setting can be overridden through the environment and
command line.
-include::includes/cmd-config-section-rest.txt[]
+include::includes/cmd-config-section-rest.adoc[]
-include::config/notes.txt[]
+include::config/notes.adoc[]
ENVIRONMENT
diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.adoc
index de5ee6748e..de5ee6748e 100644
--- a/Documentation/git-p4.txt
+++ b/Documentation/git-p4.adoc
diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.adoc
index e32404c6aa..7f69ae4855 100644
--- a/Documentation/git-pack-objects.txt
+++ b/Documentation/git-pack-objects.adoc
@@ -15,7 +15,8 @@ SYNOPSIS
[--revs [--unpacked | --all]] [--keep-pack=<pack-name>]
[--cruft] [--cruft-expiration=<time>]
[--stdout [--filter=<filter-spec>] | <base-name>]
- [--shallow] [--keep-true-parents] [--[no-]sparse] < <object-list>
+ [--shallow] [--keep-true-parents] [--[no-]sparse]
+ [--name-hash-version=<n>] < <object-list>
DESCRIPTION
@@ -345,6 +346,35 @@ raise an error.
Restrict delta matches based on "islands". See DELTA ISLANDS
below.
+--name-hash-version=<n>::
+ While performing delta compression, Git groups objects that may be
+ similar based on heuristics using the path to that object. While
+ grouping objects by an exact path match is good for paths with
+ many versions, there are benefits for finding delta pairs across
+ different full paths. Git collects objects by type and then by a
+ "name hash" of the path and then by size, hoping to group objects
+ that will compress well together.
++
+The default name hash version is `1`, which prioritizes hash locality by
+considering the final bytes of the path as providing the maximum magnitude
+to the hash function. This version excels at distinguishing short paths
+and finding renames across directories. However, the hash function depends
+primarily on the final 16 bytes of the path. If there are many paths in
+the repo that have the same final 16 bytes and differ only by parent
+directory, then this name-hash may lead to too many collisions and cause
+poor results. At the moment, this version is required when writing
+reachability bitmap files with `--write-bitmap-index`.
++
+The name hash version `2` has similar locality features as version `1`,
+except it considers each path component separately and overlays the hashes
+with a shift. This still prioritizes the final bytes of the path, but also
+"salts" the lower bits of the hash using the parent directory names. This
+method allows for some of the locality benefits of version `1` while
+breaking most of the collisions from a similarly-named file appearing in
+many different directories. At the moment, this version is not allowed
+when writing reachability bitmap files with `--write-bitmap-index` and it
+will be automatically changed to version `1`.
+
DELTA ISLANDS
-------------
diff --git a/Documentation/git-pack-redundant.txt b/Documentation/git-pack-redundant.adoc
index 13c3eb5ec9..13c3eb5ec9 100644
--- a/Documentation/git-pack-redundant.txt
+++ b/Documentation/git-pack-redundant.adoc
diff --git a/Documentation/git-pack-refs.txt b/Documentation/git-pack-refs.adoc
index 2dcabaf74c..2dcabaf74c 100644
--- a/Documentation/git-pack-refs.txt
+++ b/Documentation/git-pack-refs.adoc
diff --git a/Documentation/git-patch-id.txt b/Documentation/git-patch-id.adoc
index 1d15fa45d5..1d15fa45d5 100644
--- a/Documentation/git-patch-id.txt
+++ b/Documentation/git-patch-id.adoc
diff --git a/Documentation/git-prune-packed.txt b/Documentation/git-prune-packed.adoc
index db742dcfee..db742dcfee 100644
--- a/Documentation/git-prune-packed.txt
+++ b/Documentation/git-prune-packed.adoc
diff --git a/Documentation/git-prune.txt b/Documentation/git-prune.adoc
index 9a45571b90..9a45571b90 100644
--- a/Documentation/git-prune.txt
+++ b/Documentation/git-prune.adoc
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.adoc
index b2ae496e48..3f4ecc4730 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.adoc
@@ -102,7 +102,7 @@ Options related to merging
:git-pull: 1
-include::merge-options.txt[]
+include::merge-options.adoc[]
-r::
--rebase[=(false|true|merges|interactive)]::
@@ -136,13 +136,13 @@ unless you have read linkgit:git-rebase[1] carefully.
Options related to fetching
~~~~~~~~~~~~~~~~~~~~~~~~~~~
-include::fetch-options.txt[]
+include::fetch-options.adoc[]
-include::pull-fetch-param.txt[]
+include::pull-fetch-param.adoc[]
-include::urls-remotes.txt[]
+include::urls-remotes.adoc[]
-include::merge-strategies.txt[]
+include::merge-strategies.adoc[]
DEFAULT BEHAVIOUR
-----------------
@@ -234,7 +234,7 @@ If you tried a pull which resulted in complex conflicts and
would want to start over, you can recover with 'git reset'.
-include::transfer-data-leaks.txt[]
+include::transfer-data-leaks.adoc[]
BUGS
----
diff --git a/Documentation/git-push.txt b/Documentation/git-push.adoc
index 9b7cfbc5c1..d1978650d6 100644
--- a/Documentation/git-push.txt
+++ b/Documentation/git-push.adoc
@@ -432,7 +432,7 @@ further recursion will occur. In this case, "only" is treated as "on-demand".
--ipv6::
Use IPv6 addresses only, ignoring IPv4 addresses.
-include::urls-remotes.txt[]
+include::urls-remotes.adoc[]
OUTPUT
------
@@ -695,14 +695,14 @@ Commits A and B would no longer belong to a branch with a symbolic name,
and so would be unreachable. As such, these commits would be removed by
a `git gc` command on the origin repository.
-include::transfer-data-leaks.txt[]
+include::transfer-data-leaks.adoc[]
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/push.txt[]
+include::config/push.adoc[]
GIT
---
diff --git a/Documentation/git-quiltimport.txt b/Documentation/git-quiltimport.adoc
index 40e02d92eb..40e02d92eb 100644
--- a/Documentation/git-quiltimport.txt
+++ b/Documentation/git-quiltimport.adoc
diff --git a/Documentation/git-range-diff.txt b/Documentation/git-range-diff.adoc
index db0e4279b5..db0e4279b5 100644
--- a/Documentation/git-range-diff.txt
+++ b/Documentation/git-range-diff.adoc
diff --git a/Documentation/git-read-tree.txt b/Documentation/git-read-tree.adoc
index 1c48c28996..1c48c28996 100644
--- a/Documentation/git-read-tree.txt
+++ b/Documentation/git-read-tree.adoc
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.adoc
index b18cdbc023..153cb69a4f 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.adoc
@@ -401,7 +401,7 @@ See also INCOMPATIBLE OPTIONS below.
+
See also INCOMPATIBLE OPTIONS below.
-include::rerere-options.txt[]
+include::rerere-options.adoc[]
-S[<keyid>]::
--gpg-sign[=<keyid>]::
@@ -599,11 +599,11 @@ See also INCOMPATIBLE OPTIONS below.
--no-autosquash::
Automatically squash commits with specially formatted messages into
previous commits being rebased. If a commit message starts with
- "squash! ", "fixup! " or "amend! ", the remainder of the subject line
+ "squash! ", "fixup! " or "amend! ", the remainder of the title
is taken as a commit specifier, which matches a previous commit if it
- matches the subject line or the hash of that commit. If no commit
+ matches the title or the hash of that commit. If no commit
matches fully, matches of the specifier with the start of commit
- subjects are considered.
+ titles are considered.
+
In the rebase todo list, the actions of squash, fixup and amend commits are
changed from `pick` to `squash`, `fixup` or `fixup -C`, respectively, and they
@@ -613,7 +613,7 @@ be used to review and edit the todo list before proceeding.
The recommended way to create commits with squash markers is by using the
`--squash`, `--fixup`, `--fixup=amend:` or `--fixup=reword:` options of
linkgit:git-commit[1], which take the target commit as an argument and
-automatically fill in the subject line of the new commit from that.
+automatically fill in the title of the new commit from that.
+
Setting configuration variable `rebase.autoSquash` to true enables
auto-squashing by default for interactive rebase. The `--no-autosquash`
@@ -825,7 +825,7 @@ completeness:
* State directories: The two backends keep their state in different
directories under `.git/`
-include::merge-strategies.txt[]
+include::merge-strategies.adoc[]
NOTES
-----
@@ -1294,10 +1294,10 @@ merge cmake
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/rebase.txt[]
-include::config/sequencer.txt[]
+include::config/rebase.adoc[]
+include::config/sequencer.adoc[]
GIT
---
diff --git a/Documentation/git-receive-pack.txt b/Documentation/git-receive-pack.adoc
index 20aca92073..20aca92073 100644
--- a/Documentation/git-receive-pack.txt
+++ b/Documentation/git-receive-pack.adoc
diff --git a/Documentation/git-reflog.txt b/Documentation/git-reflog.adoc
index a929c52982..a929c52982 100644
--- a/Documentation/git-reflog.txt
+++ b/Documentation/git-reflog.adoc
diff --git a/Documentation/git-refs.txt b/Documentation/git-refs.adoc
index 9829984b0a..95f25776aa 100644
--- a/Documentation/git-refs.txt
+++ b/Documentation/git-refs.adoc
@@ -34,7 +34,7 @@ The following options are specific to 'git refs migrate':
--ref-format=<format>::
The ref format to migrate the ref store to. Can be one of:
+
-include::ref-storage-format.txt[]
+include::ref-storage-format.adoc[]
--dry-run::
Perform the migration, but do not modify the repository. The migrated
diff --git a/Documentation/git-remote-ext.txt b/Documentation/git-remote-ext.adoc
index b33ee3c9e8..b33ee3c9e8 100644
--- a/Documentation/git-remote-ext.txt
+++ b/Documentation/git-remote-ext.adoc
diff --git a/Documentation/git-remote-fd.txt b/Documentation/git-remote-fd.adoc
index 1dd2648a79..1dd2648a79 100644
--- a/Documentation/git-remote-fd.txt
+++ b/Documentation/git-remote-fd.adoc
diff --git a/Documentation/git-remote-helpers.txto b/Documentation/git-remote-helpers.adoco
index 6f353ebfd3..6f353ebfd3 100644
--- a/Documentation/git-remote-helpers.txto
+++ b/Documentation/git-remote-helpers.adoco
diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.adoc
index 932a5c3ea4..932a5c3ea4 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.adoc
diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.adoc
index c902512a9e..5852a5c973 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.adoc
@@ -9,7 +9,9 @@ git-repack - Pack unpacked objects in a repository
SYNOPSIS
--------
[verse]
-'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m] [--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>] [--write-midx]
+'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m]
+ [--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>]
+ [--write-midx] [--name-hash-version=<n>]
DESCRIPTION
-----------
@@ -249,6 +251,11 @@ linkgit:git-multi-pack-index[1]).
Write a multi-pack index (see linkgit:git-multi-pack-index[1])
containing the non-redundant packs.
+--name-hash-version=<n>::
+ Provide this argument to the underlying `git pack-objects` process.
+ See linkgit:git-pack-objects[1] for full details.
+
+
CONFIGURATION
-------------
diff --git a/Documentation/git-replace.txt b/Documentation/git-replace.adoc
index 0a65460adb..0a65460adb 100644
--- a/Documentation/git-replace.txt
+++ b/Documentation/git-replace.adoc
diff --git a/Documentation/git-replay.txt b/Documentation/git-replay.adoc
index 8f3300c683..0b12bf8aa4 100644
--- a/Documentation/git-replay.txt
+++ b/Documentation/git-replay.adoc
@@ -49,7 +49,7 @@ the new commits (in other words, this mimics a cherry-pick operation).
to. See "Specifying Ranges" in linkgit:git-rev-parse[1] and the
"Commit Limiting" options below.
-include::rev-list-options.txt[]
+include::rev-list-options.adoc[]
OUTPUT
------
diff --git a/Documentation/git-request-pull.txt b/Documentation/git-request-pull.adoc
index 15dcbb6d91..15dcbb6d91 100644
--- a/Documentation/git-request-pull.txt
+++ b/Documentation/git-request-pull.adoc
diff --git a/Documentation/git-rerere.txt b/Documentation/git-rerere.adoc
index 992b469270..992b469270 100644
--- a/Documentation/git-rerere.txt
+++ b/Documentation/git-rerere.adoc
diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.adoc
index 79ad5643ee..79ad5643ee 100644
--- a/Documentation/git-reset.txt
+++ b/Documentation/git-reset.adoc
diff --git a/Documentation/git-restore.txt b/Documentation/git-restore.adoc
index 975825b44a..751f01b441 100644
--- a/Documentation/git-restore.txt
+++ b/Documentation/git-restore.adoc
@@ -7,10 +7,10 @@ git-restore - Restore working tree files
SYNOPSIS
--------
-[verse]
-'git restore' [<options>] [--source=<tree>] [--staged] [--worktree] [--] <pathspec>...
-'git restore' [<options>] [--source=<tree>] [--staged] [--worktree] --pathspec-from-file=<file> [--pathspec-file-nul]
-'git restore' (-p|--patch) [<options>] [--source=<tree>] [--staged] [--worktree] [--] [<pathspec>...]
+[synopsis]
+git restore [<options>] [--source=<tree>] [--staged] [--worktree] [--] <pathspec>...
+git restore [<options>] [--source=<tree>] [--staged] [--worktree] --pathspec-from-file=<file> [--pathspec-file-nul]
+git restore (-p|--patch) [<options>] [--source=<tree>] [--staged] [--worktree] [--] [<pathspec>...]
DESCRIPTION
-----------
@@ -32,8 +32,8 @@ THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
OPTIONS
-------
--s <tree>::
---source=<tree>::
+`-s <tree>`::
+`--source=<tree>`::
Restore the working tree files with the content from the given
tree. It is common to specify the source tree by naming a
commit, branch or tag associated with it.
@@ -41,79 +41,79 @@ OPTIONS
If not specified, the contents are restored from `HEAD` if `--staged` is
given, otherwise from the index.
+
-As a special case, you may use `"A...B"` as a shortcut for the
-merge base of `A` and `B` if there is exactly one merge base. You can
-leave out at most one of `A` and `B`, in which case it defaults to `HEAD`.
+As a special case, you may use `"<rev-A>...<rev-B>"` as a shortcut for the
+merge base of _<rev-A>_ and _<rev-B>_ if there is exactly one merge base. You can
+leave out at most one of _<rev-A>__ and _<rev-B>_, in which case it defaults to `HEAD`.
--p::
---patch::
+`-p`::
+`--patch`::
Interactively select hunks in the difference between the
- restore source and the restore location. See the ``Interactive
- Mode'' section of linkgit:git-add[1] to learn how to operate
+ restore source and the restore location. See the "Interactive
+ Mode" section of linkgit:git-add[1] to learn how to operate
the `--patch` mode.
+
Note that `--patch` can accept no pathspec and will prompt to restore
all modified paths.
--W::
---worktree::
--S::
---staged::
+`-W`::
+`--worktree`::
+`-S`::
+`--staged`::
Specify the restore location. If neither option is specified,
by default the working tree is restored. Specifying `--staged`
will only restore the index. Specifying both restores both.
--q::
---quiet::
+`-q`::
+`--quiet`::
Quiet, suppress feedback messages. Implies `--no-progress`.
---progress::
---no-progress::
+`--progress`::
+`--no-progress`::
Progress status is reported on the standard error stream
by default when it is attached to a terminal, unless `--quiet`
is specified. This flag enables progress reporting even if not
attached to a terminal, regardless of `--quiet`.
---ours::
---theirs::
+`--ours`::
+`--theirs`::
When restoring files in the working tree from the index, use
- stage #2 ('ours') or #3 ('theirs') for unmerged paths.
+ stage #2 (`ours`) or #3 (`theirs`) for unmerged paths.
This option cannot be used when checking out paths from a
tree-ish (i.e. with the `--source` option).
+
-Note that during `git rebase` and `git pull --rebase`, 'ours' and
-'theirs' may appear swapped. See the explanation of the same options
+Note that during `git rebase` and `git pull --rebase`, `ours` and
+`theirs` may appear swapped. See the explanation of the same options
in linkgit:git-checkout[1] for details.
--m::
---merge::
+`-m`::
+`--merge`::
When restoring files on the working tree from the index,
recreate the conflicted merge in the unmerged paths.
This option cannot be used when checking out paths from a
tree-ish (i.e. with the `--source` option).
---conflict=<style>::
+`--conflict=<style>`::
The same as `--merge` option above, but changes the way the
conflicting hunks are presented, overriding the
`merge.conflictStyle` configuration variable. Possible values
- are "merge" (default), "diff3", and "zdiff3".
+ are `merge` (default), `diff3`, and `zdiff3`.
---ignore-unmerged::
+`--ignore-unmerged`::
When restoring files on the working tree from the index, do
not abort the operation if there are unmerged entries and
neither `--ours`, `--theirs`, `--merge` or `--conflict` is
specified. Unmerged paths on the working tree are left alone.
---ignore-skip-worktree-bits::
+`--ignore-skip-worktree-bits`::
In sparse checkout mode, the default is to only update entries
- matched by `<pathspec>` and sparse patterns in
- $GIT_DIR/info/sparse-checkout. This option ignores the sparse
+ matched by _<pathspec>_ and sparse patterns in
+ `$GIT_DIR/info/sparse-checkout`. This option ignores the sparse
patterns and unconditionally restores any files in
- `<pathspec>`.
+ _<pathspec>_.
---recurse-submodules::
---no-recurse-submodules::
- If `<pathspec>` names an active submodule and the restore location
+`--recurse-submodules`::
+`--no-recurse-submodules`::
+ If _<pathspec>_ names an active submodule and the restore location
includes the working tree, the submodule will only be updated if
this option is given, in which case its working tree will be
restored to the commit recorded in the superproject, and any local
@@ -122,30 +122,30 @@ in linkgit:git-checkout[1] for details.
not be updated. Just like linkgit:git-checkout[1], this will detach
`HEAD` of the submodule.
---overlay::
---no-overlay::
- In overlay mode, the command never removes files when
- restoring. In no-overlay mode, tracked files that do not
- appear in the `--source` tree are removed, to make them match
- `<tree>` exactly. The default is no-overlay mode.
-
---pathspec-from-file=<file>::
- Pathspec is passed in `<file>` instead of commandline args. If
- `<file>` is exactly `-` then standard input is used. Pathspec
- elements are separated by LF or CR/LF. Pathspec elements can be
+`--overlay`::
+`--no-overlay`::
+ In overlay mode, never remove files when restoring. In no-overlay mode,
+ remove tracked files that do not appear in the _<tree>_ of
+ `--source=<tree>`, to make them match _<tree>_ exactly. The default
+ is no-overlay mode.
+
+`--pathspec-from-file=<file>`::
+ Pathspec is passed in _<file>_ instead of commandline args. If
+ _<file>_ is exactly `-` then standard input is used. Pathspec
+ elements are separated by _LF_ or _CR_/_LF_. Pathspec elements can be
quoted as explained for the configuration variable `core.quotePath`
(see linkgit:git-config[1]). See also `--pathspec-file-nul` and
global `--literal-pathspecs`.
---pathspec-file-nul::
+`--pathspec-file-nul`::
Only meaningful with `--pathspec-from-file`. Pathspec elements are
- separated with NUL character and all other characters are taken
+ separated with _NUL_ character and all other characters are taken
literally (including newlines and quotes).
-\--::
+`--`::
Do not interpret any more arguments as options.
-<pathspec>...::
+`<pathspec>...`::
Limits the paths affected by the operation.
+
For more details, see the 'pathspec' entry in linkgit:gitglossary[7].
@@ -154,7 +154,7 @@ EXAMPLES
--------
The following sequence switches to the `master` branch, reverts the
-`Makefile` to two revisions back, deletes hello.c by mistake, and gets
+`Makefile` to two revisions back, deletes `hello.c` by mistake, and gets
it back from the index.
------------
@@ -165,7 +165,7 @@ $ git restore hello.c <2>
------------
<1> take a file out of another commit
-<2> restore hello.c from the index
+<2> restore `hello.c` from the index
If you want to restore _all_ C source files to match the version in
the index, you can say
diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.adoc
index 2e05c4b510..f582491dd4 100644
--- a/Documentation/git-rev-list.txt
+++ b/Documentation/git-rev-list.adoc
@@ -15,7 +15,7 @@ DESCRIPTION
-----------
:git-rev-list: 1
-include::rev-list-description.txt[]
+include::rev-list-description.adoc[]
'rev-list' is an essential Git command, since it
provides the ability to build and traverse commit ancestry graphs. For
@@ -27,9 +27,9 @@ OPTIONS
-------
:git-rev-list: 1
-include::rev-list-options.txt[]
+include::rev-list-options.adoc[]
-include::pretty-formats.txt[]
+include::pretty-formats.adoc[]
EXAMPLES
--------
diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.adoc
index dc12d38534..cc32b4b4f0 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.adoc
@@ -351,7 +351,7 @@ Other Options
Flags and parameters to be parsed.
-include::revisions.txt[]
+include::revisions.adoc[]
PARSEOPT
--------
diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.adoc
index 568925db53..ffba365e63 100644
--- a/Documentation/git-revert.txt
+++ b/Documentation/git-revert.adoc
@@ -112,7 +112,7 @@ effect to your index in a row.
Pass the merge strategy-specific option through to the
merge strategy. See linkgit:git-merge[1] for details.
-include::rerere-options.txt[]
+include::rerere-options.adoc[]
--reference::
Instead of starting the body of the log message with "This
@@ -125,7 +125,7 @@ include::rerere-options.txt[]
SEQUENCER SUBCOMMANDS
---------------------
-include::sequencer.txt[]
+include::sequencer.adoc[]
EXAMPLES
--------
@@ -155,9 +155,9 @@ Please consider rewording these to be shorter and more unique.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/revert.txt[]
+include::config/revert.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-rm.txt b/Documentation/git-rm.adoc
index 363a26934f..363a26934f 100644
--- a/Documentation/git-rm.txt
+++ b/Documentation/git-rm.adoc
diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.adoc
index bc3ef45acb..7f223db42d 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.adoc
@@ -492,9 +492,9 @@ Information
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/sendemail.txt[]
+include::config/sendemail.adoc[]
EXAMPLES
--------
diff --git a/Documentation/git-send-pack.txt b/Documentation/git-send-pack.adoc
index b9e73f2e77..b9e73f2e77 100644
--- a/Documentation/git-send-pack.txt
+++ b/Documentation/git-send-pack.adoc
diff --git a/Documentation/git-sh-i18n--envsubst.txt b/Documentation/git-sh-i18n--envsubst.adoc
index 2ffaf9392e..2ffaf9392e 100644
--- a/Documentation/git-sh-i18n--envsubst.txt
+++ b/Documentation/git-sh-i18n--envsubst.adoc
diff --git a/Documentation/git-sh-i18n.txt b/Documentation/git-sh-i18n.adoc
index 60cf49cb2a..60cf49cb2a 100644
--- a/Documentation/git-sh-i18n.txt
+++ b/Documentation/git-sh-i18n.adoc
diff --git a/Documentation/git-sh-setup.txt b/Documentation/git-sh-setup.adoc
index bdaf6e5fc4..bdaf6e5fc4 100644
--- a/Documentation/git-sh-setup.txt
+++ b/Documentation/git-sh-setup.adoc
diff --git a/Documentation/git-shell.txt b/Documentation/git-shell.adoc
index 11361f33e9..11361f33e9 100644
--- a/Documentation/git-shell.txt
+++ b/Documentation/git-shell.adoc
diff --git a/Documentation/git-shortlog.txt b/Documentation/git-shortlog.adoc
index 7d0277d033..d8ab38dcc1 100644
--- a/Documentation/git-shortlog.txt
+++ b/Documentation/git-shortlog.adoc
@@ -114,7 +114,7 @@ Paths may need to be prefixed with `--` to separate them from
options or the revision range, when confusion arises.
:git-shortlog: 1
-include::rev-list-options.txt[]
+include::rev-list-options.adoc[]
MAPPING AUTHORS
---------------
diff --git a/Documentation/git-show-branch.txt b/Documentation/git-show-branch.adoc
index bc31d8b6d3..7e86d54a24 100644
--- a/Documentation/git-show-branch.txt
+++ b/Documentation/git-show-branch.adoc
@@ -202,9 +202,9 @@ topologically related to each other.
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/showbranch.txt[]
+include::config/showbranch.adoc[]
GIT
---
diff --git a/Documentation/git-show-index.txt b/Documentation/git-show-index.adoc
index e49318a5a0..00b3a908cd 100644
--- a/Documentation/git-show-index.txt
+++ b/Documentation/git-show-index.adoc
@@ -9,7 +9,7 @@ git-show-index - Show packed archive index
SYNOPSIS
--------
[verse]
-'git show-index' [--object-format=<hash-algorithm>]
+'git show-index' [--object-format=<hash-algorithm>] < <pack-idx-file>
DESCRIPTION
@@ -45,7 +45,7 @@ OPTIONS
algorithm for the current repository (set by `extensions.objectFormat`), or
'sha1' if no value is set or outside a repository..
+
-include::object-format-disclaimer.txt[]
+include::object-format-disclaimer.adoc[]
GIT
---
diff --git a/Documentation/git-show-ref.txt b/Documentation/git-show-ref.adoc
index 616d919655..616d919655 100644
--- a/Documentation/git-show-ref.txt
+++ b/Documentation/git-show-ref.adoc
diff --git a/Documentation/git-show.txt b/Documentation/git-show.adoc
index 5eb67439af..51044c814f 100644
--- a/Documentation/git-show.txt
+++ b/Documentation/git-show.adoc
@@ -39,10 +39,10 @@ OPTIONS
For a more complete list of ways to spell object names, see
"SPECIFYING REVISIONS" section in linkgit:gitrevisions[7].
-include::pretty-options.txt[]
+include::pretty-options.adoc[]
-include::pretty-formats.txt[]
+include::pretty-formats.adoc[]
DIFF FORMATTING
@@ -52,9 +52,9 @@ diff output.
:git-log: 1
:diff-merges-default: `dense-combined`
-include::diff-options.txt[]
+include::diff-options.adoc[]
-include::diff-generate-patch.txt[]
+include::diff-generate-patch.adoc[]
EXAMPLES
@@ -83,7 +83,7 @@ EXAMPLES
DISCUSSION
----------
-include::i18n.txt[]
+include::i18n.adoc[]
GIT
---
diff --git a/Documentation/git-sparse-checkout.txt b/Documentation/git-sparse-checkout.adoc
index 529a8edd9c..529a8edd9c 100644
--- a/Documentation/git-sparse-checkout.txt
+++ b/Documentation/git-sparse-checkout.adoc
diff --git a/Documentation/git-stage.txt b/Documentation/git-stage.adoc
index 2f6aaa75b9..2f6aaa75b9 100644
--- a/Documentation/git-stage.txt
+++ b/Documentation/git-stage.adoc
diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.adoc
index 06fb7f1d18..1a5177f498 100644
--- a/Documentation/git-stash.txt
+++ b/Documentation/git-stash.adoc
@@ -388,9 +388,9 @@ xargs git log --merges --no-walk --grep=WIP
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/stash.txt[]
+include::config/stash.adoc[]
SEE ALSO
diff --git a/Documentation/git-status.txt b/Documentation/git-status.adoc
index 9a376886a5..9a376886a5 100644
--- a/Documentation/git-status.txt
+++ b/Documentation/git-status.adoc
diff --git a/Documentation/git-stripspace.txt b/Documentation/git-stripspace.adoc
index a293327581..a293327581 100644
--- a/Documentation/git-stripspace.txt
+++ b/Documentation/git-stripspace.adoc
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.adoc
index 87d8e0f0c5..87d8e0f0c5 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.adoc
diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.adoc
index bcf7d84a87..bcf7d84a87 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.adoc
diff --git a/Documentation/git-switch.txt b/Documentation/git-switch.adoc
index f38e4c8afa..f55315c51e 100644
--- a/Documentation/git-switch.txt
+++ b/Documentation/git-switch.adoc
@@ -273,9 +273,9 @@ $ git switch -c good-surprises
CONFIGURATION
-------------
-include::includes/cmd-config-section-all.txt[]
+include::includes/cmd-config-section-all.adoc[]
-include::config/checkout.txt[]
+include::config/checkout.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-symbolic-ref.txt b/Documentation/git-symbolic-ref.adoc
index 33ca381fde..33ca381fde 100644
--- a/Documentation/git-symbolic-ref.txt
+++ b/Documentation/git-symbolic-ref.adoc
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.adoc
index 4494729f5e..a4b1c0ec05 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.adoc
@@ -391,7 +391,7 @@ For example:
$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1
------------
-include::date-formats.txt[]
+include::date-formats.adoc[]
FILES
-----
@@ -406,7 +406,7 @@ FILES
NOTES
-----
-include::ref-reachability-filters.txt[]
+include::ref-reachability-filters.adoc[]
SEE ALSO
--------
diff --git a/Documentation/git-tools.txt b/Documentation/git-tools.adoc
index d0fec4cddd..d0fec4cddd 100644
--- a/Documentation/git-tools.txt
+++ b/Documentation/git-tools.adoc
diff --git a/Documentation/git-unpack-file.txt b/Documentation/git-unpack-file.adoc
index e9f148a00d..e9f148a00d 100644
--- a/Documentation/git-unpack-file.txt
+++ b/Documentation/git-unpack-file.adoc
diff --git a/Documentation/git-unpack-objects.txt b/Documentation/git-unpack-objects.adoc
index b3de50d710..b3de50d710 100644
--- a/Documentation/git-unpack-objects.txt
+++ b/Documentation/git-unpack-objects.adoc
diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.adoc
index 7128aed540..7128aed540 100644
--- a/Documentation/git-update-index.txt
+++ b/Documentation/git-update-index.adoc
diff --git a/Documentation/git-update-ref.txt b/Documentation/git-update-ref.adoc
index 9e6935d38d..9e6935d38d 100644
--- a/Documentation/git-update-ref.txt
+++ b/Documentation/git-update-ref.adoc
diff --git a/Documentation/git-update-server-info.txt b/Documentation/git-update-server-info.adoc
index 6bc9b50d89..6bc9b50d89 100644
--- a/Documentation/git-update-server-info.txt
+++ b/Documentation/git-update-server-info.adoc
diff --git a/Documentation/git-upload-archive.txt b/Documentation/git-upload-archive.adoc
index e8eb10baad..e8eb10baad 100644
--- a/Documentation/git-upload-archive.txt
+++ b/Documentation/git-upload-archive.adoc
diff --git a/Documentation/git-upload-pack.txt b/Documentation/git-upload-pack.adoc
index 516d1639d9..516d1639d9 100644
--- a/Documentation/git-upload-pack.txt
+++ b/Documentation/git-upload-pack.adoc
diff --git a/Documentation/git-var.txt b/Documentation/git-var.adoc
index 0680568dfd..0680568dfd 100644
--- a/Documentation/git-var.txt
+++ b/Documentation/git-var.adoc
diff --git a/Documentation/git-verify-commit.txt b/Documentation/git-verify-commit.adoc
index aee4c40eac..aee4c40eac 100644
--- a/Documentation/git-verify-commit.txt
+++ b/Documentation/git-verify-commit.adoc
diff --git a/Documentation/git-verify-pack.txt b/Documentation/git-verify-pack.adoc
index d7e886918a..d7e886918a 100644
--- a/Documentation/git-verify-pack.txt
+++ b/Documentation/git-verify-pack.adoc
diff --git a/Documentation/git-verify-tag.txt b/Documentation/git-verify-tag.adoc
index 81d50ecc4c..81d50ecc4c 100644
--- a/Documentation/git-verify-tag.txt
+++ b/Documentation/git-verify-tag.adoc
diff --git a/Documentation/git-version.txt b/Documentation/git-version.adoc
index 80fa7754a6..80fa7754a6 100644
--- a/Documentation/git-version.txt
+++ b/Documentation/git-version.adoc
diff --git a/Documentation/git-web--browse.txt b/Documentation/git-web--browse.adoc
index f2f996cbe1..f2f996cbe1 100644
--- a/Documentation/git-web--browse.txt
+++ b/Documentation/git-web--browse.adoc
diff --git a/Documentation/git-whatchanged.txt b/Documentation/git-whatchanged.adoc
index 8e55e0bb1e..8e55e0bb1e 100644
--- a/Documentation/git-whatchanged.txt
+++ b/Documentation/git-whatchanged.adoc
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.adoc
index 8340b7f028..8340b7f028 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.adoc
diff --git a/Documentation/git-write-tree.txt b/Documentation/git-write-tree.adoc
index f22041a9dc..f22041a9dc 100644
--- a/Documentation/git-write-tree.txt
+++ b/Documentation/git-write-tree.adoc
diff --git a/Documentation/git.txt b/Documentation/git.adoc
index 81498393af..743b7b00e4 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.adoc
@@ -245,17 +245,17 @@ ancillary user utilities.
Main porcelain commands
~~~~~~~~~~~~~~~~~~~~~~~
-include::{build_dir}/cmds-mainporcelain.txt[]
+include::{build_dir}/cmds-mainporcelain.adoc[]
Ancillary Commands
~~~~~~~~~~~~~~~~~~
Manipulators:
-include::{build_dir}/cmds-ancillarymanipulators.txt[]
+include::{build_dir}/cmds-ancillarymanipulators.adoc[]
Interrogators:
-include::{build_dir}/cmds-ancillaryinterrogators.txt[]
+include::{build_dir}/cmds-ancillaryinterrogators.adoc[]
Interacting with Others
@@ -264,7 +264,7 @@ Interacting with Others
These commands are to interact with foreign SCM and with other
people via patch over e-mail.
-include::{build_dir}/cmds-foreignscminterface.txt[]
+include::{build_dir}/cmds-foreignscminterface.adoc[]
Reset, restore and revert
~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -313,13 +313,13 @@ repositories.
Manipulation commands
~~~~~~~~~~~~~~~~~~~~~
-include::{build_dir}/cmds-plumbingmanipulators.txt[]
+include::{build_dir}/cmds-plumbingmanipulators.adoc[]
Interrogation commands
~~~~~~~~~~~~~~~~~~~~~~
-include::{build_dir}/cmds-plumbinginterrogators.txt[]
+include::{build_dir}/cmds-plumbinginterrogators.adoc[]
In general, the interrogate commands do not touch the files in
the working tree.
@@ -328,12 +328,12 @@ the working tree.
Syncing repositories
~~~~~~~~~~~~~~~~~~~~
-include::{build_dir}/cmds-synchingrepositories.txt[]
+include::{build_dir}/cmds-synchingrepositories.adoc[]
The following are helper commands used by the above; end users
typically do not use them directly.
-include::{build_dir}/cmds-synchelpers.txt[]
+include::{build_dir}/cmds-synchelpers.adoc[]
Internal helper commands
@@ -342,14 +342,14 @@ Internal helper commands
These are internal helper commands used by other commands; end
users typically do not use them directly.
-include::{build_dir}/cmds-purehelpers.txt[]
+include::{build_dir}/cmds-purehelpers.adoc[]
Guides
------
The following documentation pages are guides about Git concepts.
-include::{build_dir}/cmds-guide.txt[]
+include::{build_dir}/cmds-guide.adoc[]
Repository, command and file interfaces
---------------------------------------
@@ -358,7 +358,7 @@ This documentation discusses repository and command interfaces which
users are expected to interact with directly. See `--user-formats` in
linkgit:git-help[1] for more details on the criteria.
-include::{build_dir}/cmds-userinterfaces.txt[]
+include::{build_dir}/cmds-userinterfaces.adoc[]
File formats, protocols and other developer interfaces
------------------------------------------------------
@@ -367,7 +367,7 @@ This documentation discusses file formats, over-the-wire protocols and
other git developer interfaces. See `--developer-interfaces` in
linkgit:git-help[1].
-include::{build_dir}/cmds-developerinterfaces.txt[]
+include::{build_dir}/cmds-developerinterfaces.adoc[]
Configuration Mechanism
-----------------------
@@ -472,13 +472,14 @@ Environment Variables
---------------------
Various Git commands pay attention to environment variables and change
their behavior. The environment variables marked as "Boolean" take
-their values the same way as Boolean valued configuration variables, e.g.
-"true", "yes", "on" and positive numbers are taken as "yes".
+their values the same way as Boolean valued configuration variables, i.e.,
+"true", "yes", "on" and positive numbers are taken as "yes", while "false",
+"no", "off", and "0" are taken as "no".
Here are the variables:
System
-~~~~~~~~~~~~~~~~~~
+~~~~~~
`HOME`::
Specifies the path to the user's home directory. On Windows, if
unset, Git will set a process environment variable equal to:
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.adoc
index e6150595af..7eaca89972 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.adoc
@@ -701,8 +701,8 @@ where the attribute is not in place would normally cause merge
conflicts.
To prevent these unnecessary merge conflicts, Git can be told to run a
-virtual check-out and check-in of all three stages of a file when
-resolving a three-way merge by setting the `merge.renormalize`
+virtual check-out and check-in of all three stages of each file that
+needs a three-way content merge, by setting the `merge.renormalize`
configuration variable. This prevents changes caused by check-in
conversion from causing spurious merge conflicts when a converted file
is merged with an unconverted file.
@@ -1166,7 +1166,7 @@ internal merge and the final merge.
The merge driver can learn the pathname in which the merged result
will be stored via placeholder `%P`. The conflict labels to be used
for the common ancestor, local head and other head can be passed by
-using '%S', '%X' and '%Y` respectively.
+using `%S`, `%X` and `%Y` respectively.
`conflict-marker-size`
^^^^^^^^^^^^^^^^^^^^^^
diff --git a/Documentation/gitcli.txt b/Documentation/gitcli.adoc
index bd62cbd043..04193ec907 100644
--- a/Documentation/gitcli.txt
+++ b/Documentation/gitcli.adoc
@@ -91,7 +91,7 @@ scripting Git:
written in the 'stuck' form.
* Despite the above suggestion, when Arg is a path relative to the
- home directory of a user, e.g. ~/directory/file or ~u/d/f, you
+ home directory of a user, e.g. `~/directory/file` or `~u/d/f`, you
may want to use the separate form, e.g. `git foo --file ~/mine`,
not `git foo --file=~/mine`. The shell will expand `~/` in the
former to your home directory, but most shells keep the tilde in
@@ -161,6 +161,23 @@ can use `--no-track` to override that behaviour. The same goes for `--color`
and `--no-color`.
+Options trump configuration and environment
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When there is a configuration variable or an environment variable
+that tweak the behaviour of an aspect of a Git command, and also a
+command line option that tweaks the same, the command line option
+overrides what the configuration and/or environment variable say.
+
+For example, the `user.name` configuration variable is used to
+specify the human-readable name used by the `git commit` command to
+record the author and the committer name in a newly created commit.
+The `GIT_AUTHOR_NAME` environment variable, if set, takes precedence
+when deciding what author name to record. The `--author=<author>`
+command line option of the `git commit` command, when given, takes
+precedence over these two sources of information.
+
+
Aggregating short options
~~~~~~~~~~~~~~~~~~~~~~~~~
Commands that support the enhanced option parser allow you to aggregate short
diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.adoc
index 2122aeb976..2122aeb976 100644
--- a/Documentation/gitcore-tutorial.txt
+++ b/Documentation/gitcore-tutorial.adoc
diff --git a/Documentation/gitcredentials.txt b/Documentation/gitcredentials.adoc
index 35a7452c8f..3337bb475d 100644
--- a/Documentation/gitcredentials.txt
+++ b/Documentation/gitcredentials.adoc
@@ -66,18 +66,7 @@ storage provided by the OS or other programs. Alternatively, a
credential-generating helper might generate credentials for certain servers via
some API.
-To use a helper, you must first select one to use. Git currently
-includes the following helpers:
-
-cache::
-
- Cache credentials in memory for a short period of time. See
- linkgit:git-credential-cache[1] for details.
-
-store::
-
- Store credentials indefinitely on disk. See
- linkgit:git-credential-store[1] for details.
+To use a helper, you must first select one to use (see below for a list).
You may also have third-party helpers installed; search for
`credential-*` in the output of `git help -a`, and consult the
@@ -106,6 +95,28 @@ $ git config --global credential.helper foo
=== Available helpers
+Git currently includes the following helpers:
+
+cache::
+
+ Cache credentials in memory for a short period of time. See
+ linkgit:git-credential-cache[1] for details.
+
+store::
+
+ Store credentials indefinitely on disk. See
+ linkgit:git-credential-store[1] for details.
+
+Popular helpers with secure persistent storage include:
+
+ - git-credential-libsecret (Linux)
+
+ - git-credential-osxkeychain (macOS)
+
+ - git-credential-wincred (Windows)
+
+ - https://github.com/git-ecosystem/git-credential-manager[Git Credential Manager] (cross platform, included in Git for Windows)
+
The community maintains a comprehensive list of Git credential helpers at
https://git-scm.com/doc/credential-helpers.
@@ -116,6 +127,12 @@ OAuth credential helper. Initial authentication opens a browser window to the
host. Subsequent authentication happens in the background. Many popular Git
hosts support OAuth.
+Popular helpers with OAuth support include:
+
+ - https://github.com/git-ecosystem/git-credential-manager[Git Credential Manager] (cross platform, included in Git for Windows)
+
+ - https://github.com/hickford/git-credential-oauth[git-credential-oauth] (cross platform, included in many Linux distributions)
+
CREDENTIAL CONTEXTS
-------------------
diff --git a/Documentation/gitcvs-migration.txt b/Documentation/gitcvs-migration.adoc
index 1cd1283d0f..1cd1283d0f 100644
--- a/Documentation/gitcvs-migration.txt
+++ b/Documentation/gitcvs-migration.adoc
diff --git a/Documentation/gitdiffcore.txt b/Documentation/gitdiffcore.adoc
index 642c51227b..642c51227b 100644
--- a/Documentation/gitdiffcore.txt
+++ b/Documentation/gitdiffcore.adoc
diff --git a/Documentation/giteveryday.txt b/Documentation/giteveryday.adoc
index 6cfdd0e07b..6cfdd0e07b 100644
--- a/Documentation/giteveryday.txt
+++ b/Documentation/giteveryday.adoc
diff --git a/Documentation/gitfaq.txt b/Documentation/gitfaq.adoc
index f2917d142c..f2917d142c 100644
--- a/Documentation/gitfaq.txt
+++ b/Documentation/gitfaq.adoc
diff --git a/Documentation/gitformat-bundle.txt b/Documentation/gitformat-bundle.adoc
index 1b75cf71ce..1b75cf71ce 100644
--- a/Documentation/gitformat-bundle.txt
+++ b/Documentation/gitformat-bundle.adoc
diff --git a/Documentation/gitformat-chunk.txt b/Documentation/gitformat-chunk.adoc
index 3315df6201..3315df6201 100644
--- a/Documentation/gitformat-chunk.txt
+++ b/Documentation/gitformat-chunk.adoc
diff --git a/Documentation/gitformat-commit-graph.txt b/Documentation/gitformat-commit-graph.adoc
index 14d1631234..14d1631234 100644
--- a/Documentation/gitformat-commit-graph.txt
+++ b/Documentation/gitformat-commit-graph.adoc
diff --git a/Documentation/gitformat-index.txt b/Documentation/gitformat-index.adoc
index 145cace1fe..145cace1fe 100644
--- a/Documentation/gitformat-index.txt
+++ b/Documentation/gitformat-index.adoc
diff --git a/Documentation/gitformat-pack.txt b/Documentation/gitformat-pack.adoc
index d6ae229be5..d6ae229be5 100644
--- a/Documentation/gitformat-pack.txt
+++ b/Documentation/gitformat-pack.adoc
diff --git a/Documentation/gitformat-signature.txt b/Documentation/gitformat-signature.adoc
index d4d3a31f03..d4d3a31f03 100644
--- a/Documentation/gitformat-signature.txt
+++ b/Documentation/gitformat-signature.adoc
diff --git a/Documentation/gitglossary.txt b/Documentation/gitglossary.adoc
index 571f640f5c..0e85be4847 100644
--- a/Documentation/gitglossary.txt
+++ b/Documentation/gitglossary.adoc
@@ -12,7 +12,7 @@ SYNOPSIS
DESCRIPTION
-----------
-include::glossary-content.txt[]
+include::glossary-content.adoc[]
SEE ALSO
--------
diff --git a/Documentation/githooks.txt b/Documentation/githooks.adoc
index 0397dec64d..0397dec64d 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.adoc
diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.adoc
index 5e0964ef41..5e0964ef41 100644
--- a/Documentation/gitignore.txt
+++ b/Documentation/gitignore.adoc
diff --git a/Documentation/gitk.txt b/Documentation/gitk.adoc
index 35b3996029..58ce40ddb1 100644
--- a/Documentation/gitk.txt
+++ b/Documentation/gitk.adoc
@@ -98,7 +98,7 @@ linkgit:git-rev-list[1] for a complete list.
(See "History simplification" in linkgit:git-log[1] for a more
detailed explanation.)
-include::line-range-options.txt[]
+include::line-range-options.adoc[]
<revision range>::
diff --git a/Documentation/gitmailmap.txt b/Documentation/gitmailmap.adoc
index 06f4af93fe..06f4af93fe 100644
--- a/Documentation/gitmailmap.txt
+++ b/Documentation/gitmailmap.adoc
diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.adoc
index d9bec8b187..d9bec8b187 100644
--- a/Documentation/gitmodules.txt
+++ b/Documentation/gitmodules.adoc
diff --git a/Documentation/gitnamespaces.txt b/Documentation/gitnamespaces.adoc
index 1c8d2ecc35..06f4d37efa 100644
--- a/Documentation/gitnamespaces.txt
+++ b/Documentation/gitnamespaces.adoc
@@ -61,7 +61,7 @@ For a simple local test, you can use linkgit:git-remote-ext[1]:
git clone ext::'git --namespace=foo %s /tmp/prefixed.git'
----------
-include::transfer-data-leaks.txt[]
+include::transfer-data-leaks.adoc[]
GIT
---
diff --git a/Documentation/gitpacking.txt b/Documentation/gitpacking.adoc
index 321154d4e6..a56596e2d1 100644
--- a/Documentation/gitpacking.txt
+++ b/Documentation/gitpacking.adoc
@@ -136,7 +136,7 @@ chunks of "stableSize" in order of age.
The exact configuration for pseudo-merges is as follows:
-include::config/bitmap-pseudo-merge.txt[]
+include::config/bitmap-pseudo-merge.adoc[]
=== Examples
diff --git a/Documentation/gitprotocol-capabilities.txt b/Documentation/gitprotocol-capabilities.adoc
index 2cf7735be4..2cf7735be4 100644
--- a/Documentation/gitprotocol-capabilities.txt
+++ b/Documentation/gitprotocol-capabilities.adoc
diff --git a/Documentation/gitprotocol-common.txt b/Documentation/gitprotocol-common.adoc
index cdc9d6e707..cdc9d6e707 100644
--- a/Documentation/gitprotocol-common.txt
+++ b/Documentation/gitprotocol-common.adoc
diff --git a/Documentation/gitprotocol-http.txt b/Documentation/gitprotocol-http.adoc
index ec40a550cc..ec40a550cc 100644
--- a/Documentation/gitprotocol-http.txt
+++ b/Documentation/gitprotocol-http.adoc
diff --git a/Documentation/gitprotocol-pack.txt b/Documentation/gitprotocol-pack.adoc
index 837b691c89..837b691c89 100644
--- a/Documentation/gitprotocol-pack.txt
+++ b/Documentation/gitprotocol-pack.adoc
diff --git a/Documentation/gitprotocol-v2.txt b/Documentation/gitprotocol-v2.adoc
index 9f6350bbf2..9f6350bbf2 100644
--- a/Documentation/gitprotocol-v2.txt
+++ b/Documentation/gitprotocol-v2.adoc
diff --git a/Documentation/gitremote-helpers.txt b/Documentation/gitremote-helpers.adoc
index d0be008e5e..d0be008e5e 100644
--- a/Documentation/gitremote-helpers.txt
+++ b/Documentation/gitremote-helpers.adoc
diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.adoc
index fa8b51daf0..6348ef1dcd 100644
--- a/Documentation/gitrepository-layout.txt
+++ b/Documentation/gitrepository-layout.adoc
@@ -153,7 +153,7 @@ config.worktree::
linkgit:git-worktree[1]).
branches::
- A slightly deprecated way to store shorthands to be used
+ A deprecated way to store shorthands to be used
to specify a URL to 'git fetch', 'git pull' and 'git push'.
A file can be stored as `branches/<name>` and then
'name' can be given to these commands in place of
@@ -162,7 +162,8 @@ branches::
and not likely to be found in modern repositories. This
directory is ignored if $GIT_COMMON_DIR is set and
"$GIT_COMMON_DIR/branches" will be used instead.
-
++
+Git will stop reading remotes from this directory in Git 3.0.
hooks::
Hooks are customization scripts used by various Git
@@ -238,6 +239,8 @@ remotes::
and not likely to be found in modern repositories. This
directory is ignored if $GIT_COMMON_DIR is set and
"$GIT_COMMON_DIR/remotes" will be used instead.
++
+Git will stop reading remotes from this directory in Git 3.0.
logs::
Records of changes made to refs are stored in this directory.
@@ -292,7 +295,7 @@ worktrees/<id>/locked::
worktrees/<id>/config.worktree::
Working directory specific configuration file.
-include::technical/repository-version.txt[]
+include::technical/repository-version.adoc[]
SEE ALSO
--------
diff --git a/Documentation/gitrevisions.txt b/Documentation/gitrevisions.adoc
index d407b7dee1..7146117de5 100644
--- a/Documentation/gitrevisions.txt
+++ b/Documentation/gitrevisions.adoc
@@ -24,7 +24,7 @@ linkgit:git-push[1]) can also take revision parameters which denote
other objects than commits, e.g. blobs ("files") or trees
("directories of files").
-include::revisions.txt[]
+include::revisions.adoc[]
SEE ALSO
diff --git a/Documentation/gitsubmodules.txt b/Documentation/gitsubmodules.adoc
index f7b5a25a0c..f7b5a25a0c 100644
--- a/Documentation/gitsubmodules.txt
+++ b/Documentation/gitsubmodules.adoc
diff --git a/Documentation/gittutorial-2.txt b/Documentation/gittutorial-2.adoc
index 8bdb7d0bd3..8bdb7d0bd3 100644
--- a/Documentation/gittutorial-2.txt
+++ b/Documentation/gittutorial-2.adoc
diff --git a/Documentation/gittutorial.txt b/Documentation/gittutorial.adoc
index f89ad30cf6..f89ad30cf6 100644
--- a/Documentation/gittutorial.txt
+++ b/Documentation/gittutorial.adoc
diff --git a/Documentation/gitweb.txt b/Documentation/gitweb.adoc
index 5e2b491ec2..5e2b491ec2 100644
--- a/Documentation/gitweb.txt
+++ b/Documentation/gitweb.adoc
diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.adoc
index 85983587fc..85983587fc 100644
--- a/Documentation/gitweb.conf.txt
+++ b/Documentation/gitweb.conf.adoc
diff --git a/Documentation/gitworkflows.txt b/Documentation/gitworkflows.adoc
index 59305265c5..59305265c5 100644
--- a/Documentation/gitworkflows.txt
+++ b/Documentation/gitworkflows.adoc
diff --git a/Documentation/glossary-content.txt b/Documentation/glossary-content.adoc
index 575c18f776..575c18f776 100644
--- a/Documentation/glossary-content.txt
+++ b/Documentation/glossary-content.adoc
diff --git a/Documentation/howto/coordinate-embargoed-releases.txt b/Documentation/howto/coordinate-embargoed-releases.adoc
index b9cb95e82f..b9cb95e82f 100644
--- a/Documentation/howto/coordinate-embargoed-releases.txt
+++ b/Documentation/howto/coordinate-embargoed-releases.adoc
diff --git a/Documentation/howto/keep-canonical-history-correct.txt b/Documentation/howto/keep-canonical-history-correct.adoc
index e98f03275e..e98f03275e 100644
--- a/Documentation/howto/keep-canonical-history-correct.txt
+++ b/Documentation/howto/keep-canonical-history-correct.adoc
diff --git a/Documentation/howto/maintain-git.txt b/Documentation/howto/maintain-git.adoc
index 45e2599c5d..45e2599c5d 100644
--- a/Documentation/howto/maintain-git.txt
+++ b/Documentation/howto/maintain-git.adoc
diff --git a/Documentation/howto/new-command.txt b/Documentation/howto/new-command.adoc
index 880c51112b..880c51112b 100644
--- a/Documentation/howto/new-command.txt
+++ b/Documentation/howto/new-command.adoc
diff --git a/Documentation/howto/rebase-from-internal-branch.txt b/Documentation/howto/rebase-from-internal-branch.adoc
index f2e10a7ec8..f2e10a7ec8 100644
--- a/Documentation/howto/rebase-from-internal-branch.txt
+++ b/Documentation/howto/rebase-from-internal-branch.adoc
diff --git a/Documentation/howto/rebuild-from-update-hook.txt b/Documentation/howto/rebuild-from-update-hook.adoc
index db219f5c07..db219f5c07 100644
--- a/Documentation/howto/rebuild-from-update-hook.txt
+++ b/Documentation/howto/rebuild-from-update-hook.adoc
diff --git a/Documentation/howto/recover-corrupted-blob-object.txt b/Documentation/howto/recover-corrupted-blob-object.adoc
index 1b3b188d3c..1b3b188d3c 100644
--- a/Documentation/howto/recover-corrupted-blob-object.txt
+++ b/Documentation/howto/recover-corrupted-blob-object.adoc
diff --git a/Documentation/howto/recover-corrupted-object-harder.txt b/Documentation/howto/recover-corrupted-object-harder.adoc
index 5efb4fe81f..5efb4fe81f 100644
--- a/Documentation/howto/recover-corrupted-object-harder.txt
+++ b/Documentation/howto/recover-corrupted-object-harder.adoc
diff --git a/Documentation/howto/revert-a-faulty-merge.txt b/Documentation/howto/revert-a-faulty-merge.adoc
index 19f59cc888..19f59cc888 100644
--- a/Documentation/howto/revert-a-faulty-merge.txt
+++ b/Documentation/howto/revert-a-faulty-merge.adoc
diff --git a/Documentation/howto/revert-branch-rebase.txt b/Documentation/howto/revert-branch-rebase.adoc
index a3e5595a56..a3e5595a56 100644
--- a/Documentation/howto/revert-branch-rebase.txt
+++ b/Documentation/howto/revert-branch-rebase.adoc
diff --git a/Documentation/howto/separating-topic-branches.txt b/Documentation/howto/separating-topic-branches.adoc
index 81be0d6115..81be0d6115 100644
--- a/Documentation/howto/separating-topic-branches.txt
+++ b/Documentation/howto/separating-topic-branches.adoc
diff --git a/Documentation/howto/setup-git-server-over-http.txt b/Documentation/howto/setup-git-server-over-http.adoc
index bfe6f9b500..bfe6f9b500 100644
--- a/Documentation/howto/setup-git-server-over-http.txt
+++ b/Documentation/howto/setup-git-server-over-http.adoc
diff --git a/Documentation/howto/update-hook-example.txt b/Documentation/howto/update-hook-example.adoc
index 4e727deedd..4e727deedd 100644
--- a/Documentation/howto/update-hook-example.txt
+++ b/Documentation/howto/update-hook-example.adoc
diff --git a/Documentation/howto/use-git-daemon.txt b/Documentation/howto/use-git-daemon.adoc
index 2cad9b3ca5..2cad9b3ca5 100644
--- a/Documentation/howto/use-git-daemon.txt
+++ b/Documentation/howto/use-git-daemon.adoc
diff --git a/Documentation/howto/using-merge-subtree.txt b/Documentation/howto/using-merge-subtree.adoc
index 3bd581ac35..3bd581ac35 100644
--- a/Documentation/howto/using-merge-subtree.txt
+++ b/Documentation/howto/using-merge-subtree.adoc
diff --git a/Documentation/howto/using-signed-tag-in-pull-request.txt b/Documentation/howto/using-signed-tag-in-pull-request.adoc
index bbf040eda8..bbf040eda8 100644
--- a/Documentation/howto/using-signed-tag-in-pull-request.txt
+++ b/Documentation/howto/using-signed-tag-in-pull-request.adoc
diff --git a/Documentation/i18n.txt b/Documentation/i18n.adoc
index 3a866af4a4..baff780a7e 100644
--- a/Documentation/i18n.txt
+++ b/Documentation/i18n.adoc
@@ -34,7 +34,7 @@ project find it more convenient to use legacy encodings, Git
does not forbid it. However, there are a few things to keep in
mind.
-. 'git commit' and 'git commit-tree' issue
+. `git commit` and `git commit-tree` issue
a warning if the commit log message given to it does not look
like a valid UTF-8 string, unless you explicitly say your
project uses a legacy encoding. The way to say this is to
@@ -50,7 +50,7 @@ of `i18n.commitEncoding` in their `encoding` header. This is to
help other people who look at them later. Lack of this header
implies that the commit log message is encoded in UTF-8.
-. 'git log', 'git show', 'git blame' and friends look at the
+. `git log`, `git show`, `git blame` and friends look at the
`encoding` header of a commit object, and try to re-code the
log message into UTF-8 unless otherwise specified. You can
specify the desired output encoding with
diff --git a/Documentation/includes/cmd-config-section-all.txt b/Documentation/includes/cmd-config-section-all.adoc
index 296a239f2a..296a239f2a 100644
--- a/Documentation/includes/cmd-config-section-all.txt
+++ b/Documentation/includes/cmd-config-section-all.adoc
diff --git a/Documentation/includes/cmd-config-section-rest.txt b/Documentation/includes/cmd-config-section-rest.adoc
index b1e7682c1d..b1e7682c1d 100644
--- a/Documentation/includes/cmd-config-section-rest.txt
+++ b/Documentation/includes/cmd-config-section-rest.adoc
diff --git a/Documentation/install-webdoc.sh b/Documentation/install-webdoc.sh
index ed8b4ff3e5..b237b311c3 100755
--- a/Documentation/install-webdoc.sh
+++ b/Documentation/install-webdoc.sh
@@ -3,10 +3,10 @@
T="$1"
for h in \
- *.txt *.html \
- howto/*.txt howto/*.html \
- technical/*.txt technical/*.html \
- RelNotes/*.txt *.css
+ *.adoc *.html \
+ howto/*.adoc howto/*.html \
+ technical/*.adoc technical/*.html \
+ RelNotes/*.adoc *.css
do
if test ! -f "$h"
then
@@ -24,13 +24,13 @@ do
done
strip_leading=$(echo "$T/" | sed -e 's|.|.|g')
for th in \
- "$T"/*.html "$T"/*.txt \
- "$T"/howto/*.txt "$T"/howto/*.html \
- "$T"/technical/*.txt "$T"/technical/*.html
+ "$T"/*.html "$T"/*.adoc \
+ "$T"/howto/*.adoc "$T"/howto/*.html \
+ "$T"/technical/*.adoc "$T"/technical/*.html
do
h=$(expr "$th" : "$strip_leading"'\(.*\)')
case "$h" in
- RelNotes-*.txt | index.html) continue ;;
+ RelNotes-*.adoc | index.html) continue ;;
esac
test -f "$h" && continue
echo >&2 "# rm -f $th"
diff --git a/Documentation/line-range-format.txt b/Documentation/line-range-format.adoc
index 9b51e9fb66..9b51e9fb66 100644
--- a/Documentation/line-range-format.txt
+++ b/Documentation/line-range-format.adoc
diff --git a/Documentation/line-range-options.txt b/Documentation/line-range-options.adoc
index 8e295a62b8..f275df3b69 100644
--- a/Documentation/line-range-options.txt
+++ b/Documentation/line-range-options.adoc
@@ -12,4 +12,4 @@
(namely `--raw`, `--numstat`, `--shortstat`, `--dirstat`, `--summary`,
`--name-only`, `--name-status`, `--check`) are not currently implemented.
+
-include::line-range-format.txt[]
+include::line-range-format.adoc[]
diff --git a/Documentation/lint-gitlink.perl b/Documentation/lint-gitlink.perl
index 1c61dd9512..aea564dad7 100755
--- a/Documentation/lint-gitlink.perl
+++ b/Documentation/lint-gitlink.perl
@@ -5,7 +5,7 @@ use warnings;
# Parse arguments, a simple state machine for input like:
#
-# <file-to-check.txt> <valid-files-to-link-to> --section=1 git.txt git-add.txt [...] --to-lint git-add.txt a-file.txt [...]
+# <file-to-check.adoc> <valid-files-to-link-to> --section=1 git.adoc git-add.adoc [...] --to-lint git-add.adoc a-file.adoc [...]
my %TXT;
my %SECTION;
my $section;
@@ -17,7 +17,7 @@ for my $arg (@ARGV) {
next;
}
- my ($name) = $arg =~ /^(.*?)\.txt$/s;
+ my ($name) = $arg =~ /^(.*?)\.adoc$/s;
unless (defined $section) {
$TXT{$name} = $arg;
next;
diff --git a/Documentation/lint-manpages.sh b/Documentation/lint-manpages.sh
index 92cfc0a15a..a0ea572382 100755
--- a/Documentation/lint-manpages.sh
+++ b/Documentation/lint-manpages.sh
@@ -31,7 +31,7 @@ check_missing_docs () (
git-?*--?* ) continue ;;
esac
- if ! test -f "$v.txt"
+ if ! test -f "$v.adoc"
then
echo "no doc: $v"
ret=1
@@ -63,9 +63,9 @@ check_extraneous_docs () {
-e 's/[ ].*//' \
-e 's/^/listed /' ../command-list.txt
make print-man1 |
- grep '\.txt$' |
+ grep '\.adoc$' |
sed -e 's|^|documented |' \
- -e 's/\.txt//'
+ -e 's/\.adoc//'
) | (
all_commands="$(printf "%s " "$ALL_COMMANDS" "$BUILT_INS" "$EXCLUDED_PROGRAMS" | tr '\n' ' ')"
ret=0
diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.adoc
index 3eaefc4e94..0022185201 100644
--- a/Documentation/merge-options.txt
+++ b/Documentation/merge-options.adoc
@@ -102,7 +102,7 @@ endif::git-pull[]
With --no-log do not list one-line descriptions from the
actual commits being merged.
-include::signoff-option.txt[]
+include::signoff-option.adoc[]
--stat::
-n::
diff --git a/Documentation/merge-strategies.txt b/Documentation/merge-strategies.adoc
index 5fc54ec060..a5dc95a378 100644
--- a/Documentation/merge-strategies.txt
+++ b/Documentation/merge-strategies.adoc
@@ -56,7 +56,7 @@ ignore-cr-at-eol;;
renormalize;;
This runs a virtual check-out and check-in of all three stages
- of a file when resolving a three-way merge. This option is
+ of any file which needs a three-way merge. This option is
meant to be used when merging branches with different clean
filters or end-of-line normalization rules. See "Merging
branches with differing checkin/checkout attributes" in
diff --git a/Documentation/mergetools/vimdiff.txt b/Documentation/mergetools/vimdiff.adoc
index befa86d692..befa86d692 100644
--- a/Documentation/mergetools/vimdiff.txt
+++ b/Documentation/mergetools/vimdiff.adoc
diff --git a/Documentation/meson.build b/Documentation/meson.build
index 2a26fa8a5f..1129ce4c85 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -1,207 +1,208 @@
manpages = {
# Category 1.
- 'git-add.txt' : 1,
- 'git-am.txt' : 1,
- 'git-annotate.txt' : 1,
- 'git-apply.txt' : 1,
- 'git-archimport.txt' : 1,
- 'git-archive.txt' : 1,
- 'git-bisect.txt' : 1,
- 'git-blame.txt' : 1,
- 'git-branch.txt' : 1,
- 'git-bugreport.txt' : 1,
- 'git-bundle.txt' : 1,
- 'git-cat-file.txt' : 1,
- 'git-check-attr.txt' : 1,
- 'git-check-ignore.txt' : 1,
- 'git-check-mailmap.txt' : 1,
- 'git-checkout-index.txt' : 1,
- 'git-checkout.txt' : 1,
- 'git-check-ref-format.txt' : 1,
- 'git-cherry-pick.txt' : 1,
- 'git-cherry.txt' : 1,
- 'git-citool.txt' : 1,
- 'git-clean.txt' : 1,
- 'git-clone.txt' : 1,
- 'git-column.txt' : 1,
- 'git-commit-graph.txt' : 1,
- 'git-commit-tree.txt' : 1,
- 'git-commit.txt' : 1,
- 'git-config.txt' : 1,
- 'git-count-objects.txt' : 1,
- 'git-credential-cache--daemon.txt' : 1,
- 'git-credential-cache.txt' : 1,
- 'git-credential-store.txt' : 1,
- 'git-credential.txt' : 1,
- 'git-cvsexportcommit.txt' : 1,
- 'git-cvsimport.txt' : 1,
- 'git-cvsserver.txt' : 1,
- 'git-daemon.txt' : 1,
- 'git-describe.txt' : 1,
- 'git-diagnose.txt' : 1,
- 'git-diff-files.txt' : 1,
- 'git-diff-index.txt' : 1,
- 'git-difftool.txt' : 1,
- 'git-diff-tree.txt' : 1,
- 'git-diff.txt' : 1,
- 'git-fast-export.txt' : 1,
- 'git-fast-import.txt' : 1,
- 'git-fetch-pack.txt' : 1,
- 'git-fetch.txt' : 1,
- 'git-filter-branch.txt' : 1,
- 'git-fmt-merge-msg.txt' : 1,
- 'git-for-each-ref.txt' : 1,
- 'git-for-each-repo.txt' : 1,
- 'git-format-patch.txt' : 1,
- 'git-fsck-objects.txt' : 1,
- 'git-fsck.txt' : 1,
- 'git-fsmonitor--daemon.txt' : 1,
- 'git-gc.txt' : 1,
- 'git-get-tar-commit-id.txt' : 1,
- 'git-grep.txt' : 1,
- 'git-gui.txt' : 1,
- 'git-hash-object.txt' : 1,
- 'git-help.txt' : 1,
- 'git-hook.txt' : 1,
- 'git-http-backend.txt' : 1,
- 'git-http-fetch.txt' : 1,
- 'git-http-push.txt' : 1,
- 'git-imap-send.txt' : 1,
- 'git-index-pack.txt' : 1,
- 'git-init-db.txt' : 1,
- 'git-init.txt' : 1,
- 'git-instaweb.txt' : 1,
- 'git-interpret-trailers.txt' : 1,
- 'git-log.txt' : 1,
- 'git-ls-files.txt' : 1,
- 'git-ls-remote.txt' : 1,
- 'git-ls-tree.txt' : 1,
- 'git-mailinfo.txt' : 1,
- 'git-mailsplit.txt' : 1,
- 'git-maintenance.txt' : 1,
- 'git-merge-base.txt' : 1,
- 'git-merge-file.txt' : 1,
- 'git-merge-index.txt' : 1,
- 'git-merge-one-file.txt' : 1,
- 'git-mergetool--lib.txt' : 1,
- 'git-mergetool.txt' : 1,
- 'git-merge-tree.txt' : 1,
- 'git-merge.txt' : 1,
- 'git-mktag.txt' : 1,
- 'git-mktree.txt' : 1,
- 'git-multi-pack-index.txt' : 1,
- 'git-mv.txt' : 1,
- 'git-name-rev.txt' : 1,
- 'git-notes.txt' : 1,
- 'git-p4.txt' : 1,
- 'git-pack-objects.txt' : 1,
- 'git-pack-redundant.txt' : 1,
- 'git-pack-refs.txt' : 1,
- 'git-patch-id.txt' : 1,
- 'git-prune-packed.txt' : 1,
- 'git-prune.txt' : 1,
- 'git-pull.txt' : 1,
- 'git-push.txt' : 1,
- 'git-quiltimport.txt' : 1,
- 'git-range-diff.txt' : 1,
- 'git-read-tree.txt' : 1,
- 'git-rebase.txt' : 1,
- 'git-receive-pack.txt' : 1,
- 'git-reflog.txt' : 1,
- 'git-refs.txt' : 1,
- 'git-remote-ext.txt' : 1,
- 'git-remote-fd.txt' : 1,
- 'git-remote.txt' : 1,
- 'git-repack.txt' : 1,
- 'git-replace.txt' : 1,
- 'git-replay.txt' : 1,
- 'git-request-pull.txt' : 1,
- 'git-rerere.txt' : 1,
- 'git-reset.txt' : 1,
- 'git-restore.txt' : 1,
- 'git-revert.txt' : 1,
- 'git-rev-list.txt' : 1,
- 'git-rev-parse.txt' : 1,
- 'git-rm.txt' : 1,
- 'git-send-email.txt' : 1,
- 'git-send-pack.txt' : 1,
- 'git-shell.txt' : 1,
- 'git-sh-i18n--envsubst.txt' : 1,
- 'git-sh-i18n.txt' : 1,
- 'git-shortlog.txt' : 1,
- 'git-show-branch.txt' : 1,
- 'git-show-index.txt' : 1,
- 'git-show-ref.txt' : 1,
- 'git-show.txt' : 1,
- 'git-sh-setup.txt' : 1,
- 'git-sparse-checkout.txt' : 1,
- 'git-stage.txt' : 1,
- 'git-stash.txt' : 1,
- 'git-status.txt' : 1,
- 'git-stripspace.txt' : 1,
- 'git-submodule.txt' : 1,
- 'git-svn.txt' : 1,
- 'git-switch.txt' : 1,
- 'git-symbolic-ref.txt' : 1,
- 'git-tag.txt' : 1,
- 'git-unpack-file.txt' : 1,
- 'git-unpack-objects.txt' : 1,
- 'git-update-index.txt' : 1,
- 'git-update-ref.txt' : 1,
- 'git-update-server-info.txt' : 1,
- 'git-upload-archive.txt' : 1,
- 'git-upload-pack.txt' : 1,
- 'git-var.txt' : 1,
- 'git-verify-commit.txt' : 1,
- 'git-verify-pack.txt' : 1,
- 'git-verify-tag.txt' : 1,
- 'git-version.txt' : 1,
- 'git-web--browse.txt' : 1,
- 'git-whatchanged.txt' : 1,
- 'git-worktree.txt' : 1,
- 'git-write-tree.txt' : 1,
- 'git.txt' : 1,
- 'gitk.txt' : 1,
- 'gitweb.txt' : 1,
- 'scalar.txt' : 1,
+ 'git-add.adoc' : 1,
+ 'git-am.adoc' : 1,
+ 'git-annotate.adoc' : 1,
+ 'git-apply.adoc' : 1,
+ 'git-archimport.adoc' : 1,
+ 'git-archive.adoc' : 1,
+ 'git-backfill.adoc' : 1,
+ 'git-bisect.adoc' : 1,
+ 'git-blame.adoc' : 1,
+ 'git-branch.adoc' : 1,
+ 'git-bugreport.adoc' : 1,
+ 'git-bundle.adoc' : 1,
+ 'git-cat-file.adoc' : 1,
+ 'git-check-attr.adoc' : 1,
+ 'git-check-ignore.adoc' : 1,
+ 'git-check-mailmap.adoc' : 1,
+ 'git-checkout-index.adoc' : 1,
+ 'git-checkout.adoc' : 1,
+ 'git-check-ref-format.adoc' : 1,
+ 'git-cherry-pick.adoc' : 1,
+ 'git-cherry.adoc' : 1,
+ 'git-citool.adoc' : 1,
+ 'git-clean.adoc' : 1,
+ 'git-clone.adoc' : 1,
+ 'git-column.adoc' : 1,
+ 'git-commit-graph.adoc' : 1,
+ 'git-commit-tree.adoc' : 1,
+ 'git-commit.adoc' : 1,
+ 'git-config.adoc' : 1,
+ 'git-count-objects.adoc' : 1,
+ 'git-credential-cache--daemon.adoc' : 1,
+ 'git-credential-cache.adoc' : 1,
+ 'git-credential-store.adoc' : 1,
+ 'git-credential.adoc' : 1,
+ 'git-cvsexportcommit.adoc' : 1,
+ 'git-cvsimport.adoc' : 1,
+ 'git-cvsserver.adoc' : 1,
+ 'git-daemon.adoc' : 1,
+ 'git-describe.adoc' : 1,
+ 'git-diagnose.adoc' : 1,
+ 'git-diff-files.adoc' : 1,
+ 'git-diff-index.adoc' : 1,
+ 'git-difftool.adoc' : 1,
+ 'git-diff-tree.adoc' : 1,
+ 'git-diff.adoc' : 1,
+ 'git-fast-export.adoc' : 1,
+ 'git-fast-import.adoc' : 1,
+ 'git-fetch-pack.adoc' : 1,
+ 'git-fetch.adoc' : 1,
+ 'git-filter-branch.adoc' : 1,
+ 'git-fmt-merge-msg.adoc' : 1,
+ 'git-for-each-ref.adoc' : 1,
+ 'git-for-each-repo.adoc' : 1,
+ 'git-format-patch.adoc' : 1,
+ 'git-fsck-objects.adoc' : 1,
+ 'git-fsck.adoc' : 1,
+ 'git-fsmonitor--daemon.adoc' : 1,
+ 'git-gc.adoc' : 1,
+ 'git-get-tar-commit-id.adoc' : 1,
+ 'git-grep.adoc' : 1,
+ 'git-gui.adoc' : 1,
+ 'git-hash-object.adoc' : 1,
+ 'git-help.adoc' : 1,
+ 'git-hook.adoc' : 1,
+ 'git-http-backend.adoc' : 1,
+ 'git-http-fetch.adoc' : 1,
+ 'git-http-push.adoc' : 1,
+ 'git-imap-send.adoc' : 1,
+ 'git-index-pack.adoc' : 1,
+ 'git-init-db.adoc' : 1,
+ 'git-init.adoc' : 1,
+ 'git-instaweb.adoc' : 1,
+ 'git-interpret-trailers.adoc' : 1,
+ 'git-log.adoc' : 1,
+ 'git-ls-files.adoc' : 1,
+ 'git-ls-remote.adoc' : 1,
+ 'git-ls-tree.adoc' : 1,
+ 'git-mailinfo.adoc' : 1,
+ 'git-mailsplit.adoc' : 1,
+ 'git-maintenance.adoc' : 1,
+ 'git-merge-base.adoc' : 1,
+ 'git-merge-file.adoc' : 1,
+ 'git-merge-index.adoc' : 1,
+ 'git-merge-one-file.adoc' : 1,
+ 'git-mergetool--lib.adoc' : 1,
+ 'git-mergetool.adoc' : 1,
+ 'git-merge-tree.adoc' : 1,
+ 'git-merge.adoc' : 1,
+ 'git-mktag.adoc' : 1,
+ 'git-mktree.adoc' : 1,
+ 'git-multi-pack-index.adoc' : 1,
+ 'git-mv.adoc' : 1,
+ 'git-name-rev.adoc' : 1,
+ 'git-notes.adoc' : 1,
+ 'git-p4.adoc' : 1,
+ 'git-pack-objects.adoc' : 1,
+ 'git-pack-redundant.adoc' : 1,
+ 'git-pack-refs.adoc' : 1,
+ 'git-patch-id.adoc' : 1,
+ 'git-prune-packed.adoc' : 1,
+ 'git-prune.adoc' : 1,
+ 'git-pull.adoc' : 1,
+ 'git-push.adoc' : 1,
+ 'git-quiltimport.adoc' : 1,
+ 'git-range-diff.adoc' : 1,
+ 'git-read-tree.adoc' : 1,
+ 'git-rebase.adoc' : 1,
+ 'git-receive-pack.adoc' : 1,
+ 'git-reflog.adoc' : 1,
+ 'git-refs.adoc' : 1,
+ 'git-remote-ext.adoc' : 1,
+ 'git-remote-fd.adoc' : 1,
+ 'git-remote.adoc' : 1,
+ 'git-repack.adoc' : 1,
+ 'git-replace.adoc' : 1,
+ 'git-replay.adoc' : 1,
+ 'git-request-pull.adoc' : 1,
+ 'git-rerere.adoc' : 1,
+ 'git-reset.adoc' : 1,
+ 'git-restore.adoc' : 1,
+ 'git-revert.adoc' : 1,
+ 'git-rev-list.adoc' : 1,
+ 'git-rev-parse.adoc' : 1,
+ 'git-rm.adoc' : 1,
+ 'git-send-email.adoc' : 1,
+ 'git-send-pack.adoc' : 1,
+ 'git-shell.adoc' : 1,
+ 'git-sh-i18n--envsubst.adoc' : 1,
+ 'git-sh-i18n.adoc' : 1,
+ 'git-shortlog.adoc' : 1,
+ 'git-show-branch.adoc' : 1,
+ 'git-show-index.adoc' : 1,
+ 'git-show-ref.adoc' : 1,
+ 'git-show.adoc' : 1,
+ 'git-sh-setup.adoc' : 1,
+ 'git-sparse-checkout.adoc' : 1,
+ 'git-stage.adoc' : 1,
+ 'git-stash.adoc' : 1,
+ 'git-status.adoc' : 1,
+ 'git-stripspace.adoc' : 1,
+ 'git-submodule.adoc' : 1,
+ 'git-svn.adoc' : 1,
+ 'git-switch.adoc' : 1,
+ 'git-symbolic-ref.adoc' : 1,
+ 'git-tag.adoc' : 1,
+ 'git-unpack-file.adoc' : 1,
+ 'git-unpack-objects.adoc' : 1,
+ 'git-update-index.adoc' : 1,
+ 'git-update-ref.adoc' : 1,
+ 'git-update-server-info.adoc' : 1,
+ 'git-upload-archive.adoc' : 1,
+ 'git-upload-pack.adoc' : 1,
+ 'git-var.adoc' : 1,
+ 'git-verify-commit.adoc' : 1,
+ 'git-verify-pack.adoc' : 1,
+ 'git-verify-tag.adoc' : 1,
+ 'git-version.adoc' : 1,
+ 'git-web--browse.adoc' : 1,
+ 'git-whatchanged.adoc' : 1,
+ 'git-worktree.adoc' : 1,
+ 'git-write-tree.adoc' : 1,
+ 'git.adoc' : 1,
+ 'gitk.adoc' : 1,
+ 'gitweb.adoc' : 1,
+ 'scalar.adoc' : 1,
# Category 5.
- 'gitattributes.txt' : 5,
- 'gitformat-bundle.txt' : 5,
- 'gitformat-chunk.txt' : 5,
- 'gitformat-commit-graph.txt' : 5,
- 'gitformat-index.txt' : 5,
- 'gitformat-pack.txt' : 5,
- 'gitformat-signature.txt' : 5,
- 'githooks.txt' : 5,
- 'gitignore.txt' : 5,
- 'gitmailmap.txt' : 5,
- 'gitmodules.txt' : 5,
- 'gitprotocol-capabilities.txt' : 5,
- 'gitprotocol-common.txt' : 5,
- 'gitprotocol-http.txt' : 5,
- 'gitprotocol-pack.txt' : 5,
- 'gitprotocol-v2.txt' : 5,
- 'gitrepository-layout.txt' : 5,
- 'gitweb.conf.txt' : 5,
+ 'gitattributes.adoc' : 5,
+ 'gitformat-bundle.adoc' : 5,
+ 'gitformat-chunk.adoc' : 5,
+ 'gitformat-commit-graph.adoc' : 5,
+ 'gitformat-index.adoc' : 5,
+ 'gitformat-pack.adoc' : 5,
+ 'gitformat-signature.adoc' : 5,
+ 'githooks.adoc' : 5,
+ 'gitignore.adoc' : 5,
+ 'gitmailmap.adoc' : 5,
+ 'gitmodules.adoc' : 5,
+ 'gitprotocol-capabilities.adoc' : 5,
+ 'gitprotocol-common.adoc' : 5,
+ 'gitprotocol-http.adoc' : 5,
+ 'gitprotocol-pack.adoc' : 5,
+ 'gitprotocol-v2.adoc' : 5,
+ 'gitrepository-layout.adoc' : 5,
+ 'gitweb.conf.adoc' : 5,
# Category 7.
- 'gitcli.txt' : 7,
- 'gitcore-tutorial.txt' : 7,
- 'gitcredentials.txt' : 7,
- 'gitcvs-migration.txt' : 7,
- 'gitdiffcore.txt' : 7,
- 'giteveryday.txt' : 7,
- 'gitfaq.txt' : 7,
- 'gitglossary.txt' : 7,
- 'gitpacking.txt' : 7,
- 'gitnamespaces.txt' : 7,
- 'gitremote-helpers.txt' : 7,
- 'gitrevisions.txt' : 7,
- 'gitsubmodules.txt' : 7,
- 'gittutorial-2.txt' : 7,
- 'gittutorial.txt' : 7,
- 'gitworkflows.txt' : 7,
+ 'gitcli.adoc' : 7,
+ 'gitcore-tutorial.adoc' : 7,
+ 'gitcredentials.adoc' : 7,
+ 'gitcvs-migration.adoc' : 7,
+ 'gitdiffcore.adoc' : 7,
+ 'giteveryday.adoc' : 7,
+ 'gitfaq.adoc' : 7,
+ 'gitglossary.adoc' : 7,
+ 'gitpacking.adoc' : 7,
+ 'gitnamespaces.adoc' : 7,
+ 'gitremote-helpers.adoc' : 7,
+ 'gitrevisions.adoc' : 7,
+ 'gitsubmodules.adoc' : 7,
+ 'gittutorial-2.adoc' : 7,
+ 'gittutorial.adoc' : 7,
+ 'gitworkflows.adoc' : 7,
}
docs_backend = get_option('docs_backend')
@@ -287,18 +288,18 @@ git = find_program('git', required: false)
xmlto = find_program('xmlto')
cmd_lists = [
- 'cmds-ancillaryinterrogators.txt',
- 'cmds-ancillarymanipulators.txt',
- 'cmds-mainporcelain.txt',
- 'cmds-plumbinginterrogators.txt',
- 'cmds-plumbingmanipulators.txt',
- 'cmds-synchingrepositories.txt',
- 'cmds-synchelpers.txt',
- 'cmds-guide.txt',
- 'cmds-developerinterfaces.txt',
- 'cmds-userinterfaces.txt',
- 'cmds-purehelpers.txt',
- 'cmds-foreignscminterface.txt',
+ 'cmds-ancillaryinterrogators.adoc',
+ 'cmds-ancillarymanipulators.adoc',
+ 'cmds-mainporcelain.adoc',
+ 'cmds-plumbinginterrogators.adoc',
+ 'cmds-plumbingmanipulators.adoc',
+ 'cmds-synchingrepositories.adoc',
+ 'cmds-synchelpers.adoc',
+ 'cmds-guide.adoc',
+ 'cmds-developerinterfaces.adoc',
+ 'cmds-userinterfaces.adoc',
+ 'cmds-purehelpers.adoc',
+ 'cmds-foreignscminterface.adoc',
]
documentation_deps += custom_target(
@@ -325,7 +326,7 @@ foreach mode : [ 'diff', 'merge' ]
'MERGE_TOOLS_DIR=' + meson.project_source_root() / 'mergetools',
],
input: 'generate-mergetool-list.sh',
- output: 'mergetools-' + mode + '.txt',
+ output: 'mergetools-' + mode + '.adoc',
)
endforeach
@@ -414,7 +415,7 @@ if get_option('docs').contains('html')
'--out-file=@OUTPUT@',
'@INPUT@',
],
- input: 'user-manual.txt',
+ input: 'user-manual.adoc',
output: 'user-manual.xml',
depends: documentation_deps,
)
@@ -436,14 +437,14 @@ if get_option('docs').contains('html')
)
articles = [
- 'DecisionMaking.txt',
- 'MyFirstContribution.txt',
- 'MyFirstObjectWalk.txt',
- 'ReviewingGuidelines.txt',
+ 'DecisionMaking.adoc',
+ 'MyFirstContribution.adoc',
+ 'MyFirstObjectWalk.adoc',
+ 'ReviewingGuidelines.adoc',
'SubmittingPatches',
- 'ToolsForGit.txt',
- 'git-bisect-lk2009.txt',
- 'git-tools.txt',
+ 'ToolsForGit.adoc',
+ 'git-bisect-lk2009.adoc',
+ 'git-tools.adoc',
]
foreach article : articles
@@ -475,8 +476,8 @@ endif
# Sanity check that we are not missing any tests present in 't/'. This check
# only runs once at configure time and is thus best-effort, only. Furthermore,
# it only verifies man pages for the sake of simplicity.
-configured_manpages = manpages.keys() + [ 'git-bisect-lk2009.txt', 'git-tools.txt' ]
-actual_manpages = run_command(shell, '-c', 'ls git*.txt scalar.txt',
+configured_manpages = manpages.keys() + [ 'git-bisect-lk2009.adoc', 'git-tools.adoc' ]
+actual_manpages = run_command(shell, '-c', 'ls git*.adoc scalar.adoc',
check: true,
env: script_environment,
).stdout().strip().split('\n')
diff --git a/Documentation/object-format-disclaimer.txt b/Documentation/object-format-disclaimer.adoc
index e561e6668c..e561e6668c 100644
--- a/Documentation/object-format-disclaimer.txt
+++ b/Documentation/object-format-disclaimer.adoc
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.adoc
index 8ee940b6a4..07475de8c3 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.adoc
@@ -339,10 +339,10 @@ insert an empty string unless we are traversing reflog entries (e.g., by
decoration format if `--decorate` was not already provided on the command
line.
-The boolean options accept an optional value `[=<bool-value>]`. The values
-`true`, `false`, `on`, `off` etc. are all accepted. See the "boolean"
-sub-section in "EXAMPLES" in linkgit:git-config[1]. If a boolean
-option is given with no value, it's enabled.
+The boolean options accept an optional value `[=<bool-value>]`. The
+values taken by `--type=bool` git-config[1], like `yes` and `off`,
+are all accepted. Giving a boolean option without `=<value>` is
+equivalent to giving it with `=true`.
If you add a `+` (plus sign) after '%' of a placeholder, a line-feed
is inserted immediately before the expansion if and only if the
diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.adoc
index 23888cd612..23888cd612 100644
--- a/Documentation/pretty-options.txt
+++ b/Documentation/pretty-options.adoc
diff --git a/Documentation/pull-fetch-param.txt b/Documentation/pull-fetch-param.adoc
index d79d2f6065..d79d2f6065 100644
--- a/Documentation/pull-fetch-param.txt
+++ b/Documentation/pull-fetch-param.adoc
diff --git a/Documentation/ref-reachability-filters.txt b/Documentation/ref-reachability-filters.adoc
index 9bae46d84c..9bae46d84c 100644
--- a/Documentation/ref-reachability-filters.txt
+++ b/Documentation/ref-reachability-filters.adoc
diff --git a/Documentation/ref-storage-format.txt b/Documentation/ref-storage-format.adoc
index 14fff8a9c6..14fff8a9c6 100644
--- a/Documentation/ref-storage-format.txt
+++ b/Documentation/ref-storage-format.adoc
diff --git a/Documentation/rerere-options.txt b/Documentation/rerere-options.adoc
index c3321ddea2..c3321ddea2 100644
--- a/Documentation/rerere-options.txt
+++ b/Documentation/rerere-options.adoc
diff --git a/Documentation/rev-list-description.txt b/Documentation/rev-list-description.adoc
index a9efa7fa27..a9efa7fa27 100644
--- a/Documentation/rev-list-description.txt
+++ b/Documentation/rev-list-description.adoc
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.adoc
index 459e5a02f5..785c0786e0 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.adoc
@@ -1024,6 +1024,25 @@ Unexpected missing objects will raise an error.
The form '--missing=print' is like 'allow-any', but will also print a
list of the missing objects. Object IDs are prefixed with a ``?'' character.
+
+The form '--missing=print-info' is like 'print', but will also print additional
+information about the missing object inferred from its containing object. The
+information is all printed on the same line with the missing object ID in the
+form: `?<oid> [<token>=<value>]...`. The `<token>=<value>` pairs containing
+additional information are separated from each other by a SP. The value is
+encoded in a token specific fashion, but SP or LF contained in value are always
+expected to be represented in such a way that the resulting encoded value does
+not have either of these two problematic bytes. Each `<token>=<value>` may be
+one of the following:
++
+--
+* The `path=<path>` shows the path of the missing object inferred from a
+ containing object. A path containing SP or special characters is enclosed in
+ double-quotes in the C style as needed.
++
+* The `type=<type>` shows the type of the missing object inferred from a
+ containing object.
+--
++
If some tips passed to the traversal are missing, they will be
considered as missing too, and the traversal will ignore them. In case
we cannot get their Object ID though, an error will be raised.
@@ -1059,7 +1078,7 @@ more specialized family of commit log tools: linkgit:git-log[1],
linkgit:git-show[1], and linkgit:git-whatchanged[1]
endif::git-rev-list[]
-include::pretty-options.txt[]
+include::pretty-options.adoc[]
--relative-date::
Synonym for `--date=relative`.
diff --git a/Documentation/revisions.txt b/Documentation/revisions.adoc
index 6ea6c7cead..6ea6c7cead 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.adoc
diff --git a/Documentation/scalar.txt b/Documentation/scalar.adoc
index 7e4259c674..7e4259c674 100644
--- a/Documentation/scalar.txt
+++ b/Documentation/scalar.adoc
diff --git a/Documentation/sequencer.txt b/Documentation/sequencer.adoc
index 3bceb56474..3bceb56474 100644
--- a/Documentation/sequencer.txt
+++ b/Documentation/sequencer.adoc
diff --git a/Documentation/signoff-option.txt b/Documentation/signoff-option.adoc
index d98758f3cb..cddfb225d1 100644
--- a/Documentation/signoff-option.txt
+++ b/Documentation/signoff-option.adoc
@@ -1,8 +1,8 @@
ifdef::git-commit[]
--s::
+`-s`::
endif::git-commit[]
---signoff::
---no-signoff::
+`--signoff`::
+`--no-signoff`::
Add a `Signed-off-by` trailer by the committer at the end of the commit
log message. The meaning of a signoff depends on the project
to which you're committing. For example, it may certify that
@@ -14,5 +14,5 @@ endif::git-commit[]
leadership of the project to which you're contributing to
understand how the signoffs are used in that project.
+
-The --no-signoff option can be used to countermand an earlier --signoff
+The `--no-signoff` option can be used to countermand an earlier `--signoff`
option on the command line.
diff --git a/Documentation/technical/.gitignore b/Documentation/technical/.gitignore
index 8aa891daee..3caef14a93 100644
--- a/Documentation/technical/.gitignore
+++ b/Documentation/technical/.gitignore
@@ -1 +1,2 @@
api-index.txt
+api-index.adoc
diff --git a/Documentation/technical/api-error-handling.txt b/Documentation/technical/api-error-handling.adoc
index 665c4960b4..665c4960b4 100644
--- a/Documentation/technical/api-error-handling.txt
+++ b/Documentation/technical/api-error-handling.adoc
diff --git a/Documentation/technical/api-index-skel.txt b/Documentation/technical/api-index-skel.adoc
index 7780a76b08..7780a76b08 100644
--- a/Documentation/technical/api-index-skel.txt
+++ b/Documentation/technical/api-index-skel.adoc
diff --git a/Documentation/technical/api-index.sh b/Documentation/technical/api-index.sh
index 2964885574..dd206b1ca4 100755
--- a/Documentation/technical/api-index.sh
+++ b/Documentation/technical/api-index.sh
@@ -13,18 +13,18 @@ OUTPUT="$2"
cd "$SOURCE_DIR"
c=////////////////////////////////////////////////////////////////
- skel=api-index-skel.txt
+ skel=api-index-skel.adoc
sed -e '/^\/\/ table of contents begin/q' "$skel"
echo "$c"
- ls api-*.txt |
+ ls api-*.adoc |
while read filename
do
case "$filename" in
- api-index-skel.txt | api-index.txt) continue ;;
+ api-index-skel.adoc | api-index.adoc) continue ;;
esac
title=$(sed -e 1q "$filename")
- html=${filename%.txt}.html
+ html=${filename%.adoc}.html
echo "* link:$html[$title]"
done
echo "$c"
diff --git a/Documentation/technical/api-merge.txt b/Documentation/technical/api-merge.adoc
index c2ba01828c..c2ba01828c 100644
--- a/Documentation/technical/api-merge.txt
+++ b/Documentation/technical/api-merge.adoc
diff --git a/Documentation/technical/api-parse-options.txt b/Documentation/technical/api-parse-options.adoc
index 61fa6ee167..61fa6ee167 100644
--- a/Documentation/technical/api-parse-options.txt
+++ b/Documentation/technical/api-parse-options.adoc
diff --git a/Documentation/technical/api-path-walk.adoc b/Documentation/technical/api-path-walk.adoc
new file mode 100644
index 0000000000..3e089211fb
--- /dev/null
+++ b/Documentation/technical/api-path-walk.adoc
@@ -0,0 +1,72 @@
+Path-Walk API
+=============
+
+The path-walk API is used to walk reachable objects, but to visit objects
+in batches based on a common path they appear in, or by type.
+
+For example, all reachable commits are visited in a group. All tags are
+visited in a group. Then, all root trees are visited. At some point, all
+blobs reachable via a path `my/dir/to/A` are visited. When there are
+multiple paths possible to reach the same object, then only one of those
+paths is used to visit the object.
+
+Basics
+------
+
+To use the path-walk API, include `path-walk.h` and call
+`walk_objects_by_path()` with a customized `path_walk_info` struct. The
+struct is used to set all of the options for how the walk should proceed.
+Let's dig into the different options and their use.
+
+`path_fn` and `path_fn_data`::
+ The most important option is the `path_fn` option, which is a
+ function pointer to the callback that can execute logic on the
+ object IDs for objects grouped by type and path. This function
+ also receives a `data` value that corresponds to the
+ `path_fn_data` member, for providing custom data structures to
+ this callback function.
+
+`revs`::
+ To configure the exact details of the reachable set of objects,
+ use the `revs` member and initialize it using the revision
+ machinery in `revision.h`. Initialize `revs` using calls such as
+ `setup_revisions()` or `parse_revision_opt()`. Do not call
+ `prepare_revision_walk()`, as that will be called within
+ `walk_objects_by_path()`.
++
+It is also important that you do not specify the `--objects` flag for the
+`revs` struct. The revision walk should only be used to walk commits, and
+the objects will be walked in a separate way based on those starting
+commits.
+
+`commits`, `blobs`, `trees`, `tags`::
+ By default, these members are enabled and signal that the path-walk
+ API should call the `path_fn` on objects of these types. Specialized
+ applications could disable some options to make it simpler to walk
+ the objects or to have fewer calls to `path_fn`.
++
+While it is possible to walk only commits in this way, consumers would be
+better off using the revision walk API instead.
+
+`prune_all_uninteresting`::
+ By default, all reachable paths are emitted by the path-walk API.
+ This option allows consumers to declare that they are not
+ interested in paths where all included objects are marked with the
+ `UNINTERESTING` flag. This requires using the `boundary` option in
+ the revision walk so that the walk emits commits marked with the
+ `UNINTERESTING` flag.
+
+`pl`::
+ This pattern list pointer allows focusing the path-walk search to
+ a set of patterns, only emitting paths that match the given
+ patterns. See linkgit:gitignore[5] or
+ linkgit:git-sparse-checkout[1] for details about pattern lists.
+ When the pattern list uses cone-mode patterns, then the path-walk
+ API can prune the set of paths it walks to improve performance.
+
+Examples
+--------
+
+See example usages in:
+ `t/helper/test-path-walk.c`,
+ `builtin/backfill.c`
diff --git a/Documentation/technical/api-simple-ipc.txt b/Documentation/technical/api-simple-ipc.adoc
index c4fb152b23..c4fb152b23 100644
--- a/Documentation/technical/api-simple-ipc.txt
+++ b/Documentation/technical/api-simple-ipc.adoc
diff --git a/Documentation/technical/api-trace2.txt b/Documentation/technical/api-trace2.adoc
index 5817b18310..cf493dae03 100644
--- a/Documentation/technical/api-trace2.txt
+++ b/Documentation/technical/api-trace2.adoc
@@ -140,7 +140,7 @@ $ cat ~/log.event
To enable a target, set the corresponding environment variable or
system or global config value to one of the following:
-include::../trace2-target-values.txt[]
+include::../trace2-target-values.adoc[]
When trace files are written to a target directory, they will be named according
to the last component of the SID (optionally followed by a counter to avoid
diff --git a/Documentation/technical/bitmap-format.txt b/Documentation/technical/bitmap-format.adoc
index bfb0ec7beb..bfb0ec7beb 100644
--- a/Documentation/technical/bitmap-format.txt
+++ b/Documentation/technical/bitmap-format.adoc
diff --git a/Documentation/technical/build-systems.txt b/Documentation/technical/build-systems.adoc
index d9dafb407c..d9dafb407c 100644
--- a/Documentation/technical/build-systems.txt
+++ b/Documentation/technical/build-systems.adoc
diff --git a/Documentation/technical/bundle-uri.txt b/Documentation/technical/bundle-uri.adoc
index 91d3a13e32..91d3a13e32 100644
--- a/Documentation/technical/bundle-uri.txt
+++ b/Documentation/technical/bundle-uri.adoc
diff --git a/Documentation/technical/commit-graph.txt b/Documentation/technical/commit-graph.adoc
index 2c26e95e51..2c26e95e51 100644
--- a/Documentation/technical/commit-graph.txt
+++ b/Documentation/technical/commit-graph.adoc
diff --git a/Documentation/technical/directory-rename-detection.txt b/Documentation/technical/directory-rename-detection.adoc
index 029ee2cedc..029ee2cedc 100644
--- a/Documentation/technical/directory-rename-detection.txt
+++ b/Documentation/technical/directory-rename-detection.adoc
diff --git a/Documentation/technical/hash-function-transition.txt b/Documentation/technical/hash-function-transition.adoc
index 7102c7c8f5..7102c7c8f5 100644
--- a/Documentation/technical/hash-function-transition.txt
+++ b/Documentation/technical/hash-function-transition.adoc
diff --git a/Documentation/technical/long-running-process-protocol.txt b/Documentation/technical/long-running-process-protocol.adoc
index 6f33654b42..6f33654b42 100644
--- a/Documentation/technical/long-running-process-protocol.txt
+++ b/Documentation/technical/long-running-process-protocol.adoc
diff --git a/Documentation/technical/meson.build b/Documentation/technical/meson.build
index 21dfb8b5c9..3a65ee59b3 100644
--- a/Documentation/technical/meson.build
+++ b/Documentation/technical/meson.build
@@ -60,6 +60,7 @@ foreach article : api_docs + articles
command: asciidoc_html_options,
input: article,
output: fs.stem(article) + '.html',
+ depends: documentation_deps,
install: true,
install_dir: get_option('datadir') / 'doc/git-doc/technical',
)
diff --git a/Documentation/technical/multi-pack-index.txt b/Documentation/technical/multi-pack-index.adoc
index cc063b30be..cc063b30be 100644
--- a/Documentation/technical/multi-pack-index.txt
+++ b/Documentation/technical/multi-pack-index.adoc
diff --git a/Documentation/technical/pack-heuristics.txt b/Documentation/technical/pack-heuristics.adoc
index 95a07db6e8..95a07db6e8 100644
--- a/Documentation/technical/pack-heuristics.txt
+++ b/Documentation/technical/pack-heuristics.adoc
diff --git a/Documentation/technical/packfile-uri.txt b/Documentation/technical/packfile-uri.adoc
index 9d453d4765..9d453d4765 100644
--- a/Documentation/technical/packfile-uri.txt
+++ b/Documentation/technical/packfile-uri.adoc
diff --git a/Documentation/technical/parallel-checkout.txt b/Documentation/technical/parallel-checkout.adoc
index b4a144e5f4..b4a144e5f4 100644
--- a/Documentation/technical/parallel-checkout.txt
+++ b/Documentation/technical/parallel-checkout.adoc
diff --git a/Documentation/technical/partial-clone.txt b/Documentation/technical/partial-clone.adoc
index bf5ec5c82d..bf5ec5c82d 100644
--- a/Documentation/technical/partial-clone.txt
+++ b/Documentation/technical/partial-clone.adoc
diff --git a/Documentation/technical/platform-support.txt b/Documentation/technical/platform-support.adoc
index 0a2fb28d62..0a2fb28d62 100644
--- a/Documentation/technical/platform-support.txt
+++ b/Documentation/technical/platform-support.adoc
diff --git a/Documentation/technical/racy-git.txt b/Documentation/technical/racy-git.adoc
index 59bea66c0f..59bea66c0f 100644
--- a/Documentation/technical/racy-git.txt
+++ b/Documentation/technical/racy-git.adoc
diff --git a/Documentation/technical/reftable.txt b/Documentation/technical/reftable.adoc
index dd0b37c4e3..dd0b37c4e3 100644
--- a/Documentation/technical/reftable.txt
+++ b/Documentation/technical/reftable.adoc
diff --git a/Documentation/technical/remembering-renames.txt b/Documentation/technical/remembering-renames.adoc
index 73f41761e2..73f41761e2 100644
--- a/Documentation/technical/remembering-renames.txt
+++ b/Documentation/technical/remembering-renames.adoc
diff --git a/Documentation/technical/repository-version.txt b/Documentation/technical/repository-version.adoc
index b9bb81a81f..b9bb81a81f 100644
--- a/Documentation/technical/repository-version.txt
+++ b/Documentation/technical/repository-version.adoc
diff --git a/Documentation/technical/rerere.txt b/Documentation/technical/rerere.adoc
index 580f23360a..580f23360a 100644
--- a/Documentation/technical/rerere.txt
+++ b/Documentation/technical/rerere.adoc
diff --git a/Documentation/technical/scalar.txt b/Documentation/technical/scalar.adoc
index 921cb104c3..921cb104c3 100644
--- a/Documentation/technical/scalar.txt
+++ b/Documentation/technical/scalar.adoc
diff --git a/Documentation/technical/send-pack-pipeline.txt b/Documentation/technical/send-pack-pipeline.adoc
index 9b5a0bc186..9b5a0bc186 100644
--- a/Documentation/technical/send-pack-pipeline.txt
+++ b/Documentation/technical/send-pack-pipeline.adoc
diff --git a/Documentation/technical/shallow.txt b/Documentation/technical/shallow.adoc
index f3738baa0f..f3738baa0f 100644
--- a/Documentation/technical/shallow.txt
+++ b/Documentation/technical/shallow.adoc
diff --git a/Documentation/technical/sparse-checkout.txt b/Documentation/technical/sparse-checkout.adoc
index d968659354..d968659354 100644
--- a/Documentation/technical/sparse-checkout.txt
+++ b/Documentation/technical/sparse-checkout.adoc
diff --git a/Documentation/technical/sparse-index.txt b/Documentation/technical/sparse-index.adoc
index 3b24c1a219..3b24c1a219 100644
--- a/Documentation/technical/sparse-index.txt
+++ b/Documentation/technical/sparse-index.adoc
diff --git a/Documentation/technical/trivial-merge.txt b/Documentation/technical/trivial-merge.adoc
index 1f1c33d0da..1f1c33d0da 100644
--- a/Documentation/technical/trivial-merge.txt
+++ b/Documentation/technical/trivial-merge.adoc
diff --git a/Documentation/technical/unit-tests.txt b/Documentation/technical/unit-tests.adoc
index 5a432b7b29..5a432b7b29 100644
--- a/Documentation/technical/unit-tests.txt
+++ b/Documentation/technical/unit-tests.adoc
diff --git a/Documentation/trace2-target-values.txt b/Documentation/trace2-target-values.adoc
index 06f1953313..06f1953313 100644
--- a/Documentation/trace2-target-values.txt
+++ b/Documentation/trace2-target-values.adoc
diff --git a/Documentation/transfer-data-leaks.txt b/Documentation/transfer-data-leaks.adoc
index 914bacc39e..914bacc39e 100644
--- a/Documentation/transfer-data-leaks.txt
+++ b/Documentation/transfer-data-leaks.adoc
diff --git a/Documentation/urls-remotes.txt b/Documentation/urls-remotes.adoc
index bf17012241..9b10151198 100644
--- a/Documentation/urls-remotes.txt
+++ b/Documentation/urls-remotes.adoc
@@ -1,4 +1,4 @@
-include::urls.txt[]
+include::urls.adoc[]
REMOTES[[REMOTES]]
------------------
diff --git a/Documentation/urls.txt b/Documentation/urls.adoc
index 9c871e716a..9c871e716a 100644
--- a/Documentation/urls.txt
+++ b/Documentation/urls.adoc
diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.adoc
index 90a4189358..d2b478ad23 100644
--- a/Documentation/user-manual.txt
+++ b/Documentation/user-manual.adoc
@@ -4354,7 +4354,7 @@ itself!
[[git-explained]]
=== Git explained
-include::glossary-content.txt[]
+include::glossary-content.adoc[]
[[git-quick-start]]
[appendix]
diff --git a/GIT-BUILD-OPTIONS.in b/GIT-BUILD-OPTIONS.in
index edff75ae16..ada575fbcb 100644
--- a/GIT-BUILD-OPTIONS.in
+++ b/GIT-BUILD-OPTIONS.in
@@ -45,4 +45,5 @@ TEST_OUTPUT_DIRECTORY=@TEST_OUTPUT_DIRECTORY@
TEST_SHELL_PATH=@TEST_SHELL_PATH@
USE_GETTEXT_SCHEME=@USE_GETTEXT_SCHEME@
USE_LIBPCRE2=@USE_LIBPCRE2@
+WITH_BREAKING_CHANGES=@WITH_BREAKING_CHANGES@
X=@X@
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 194ec0f9ad..67fa0401cf 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,25 +1,33 @@
#!/bin/sh
-DEF_VER=v2.48.0-rc1
+DEF_VER=v2.49.0-rc0
LF='
'
-if test "$#" -ne 3
+if test "$#" -lt 2 || test "$#" -gt 3
then
- echo >&2 "USAGE: $0 <SOURCE_DIR> <INPUT> <OUTPUT>"
+ echo >&2 "USAGE: $0 <SOURCE_DIR> (--format=<STRING>|<INPUT>) [<OUTPUT>]"
exit 1
fi
SOURCE_DIR="$1"
-INPUT="$2"
-OUTPUT="$3"
-if ! test -f "$INPUT"
-then
- echo >&2 "Input is not a file: $INPUT"
- exit 1
-fi
+case "$2" in
+--format=*)
+ INPUT="${2#--format=}"
+ ;;
+*)
+ if ! test -f "$2"
+ then
+ echo >&2 "Input is not a file: $2"
+ exit 1
+ fi
+ INPUT=$(cat "$2")
+ ;;
+esac
+
+OUTPUT="$3"
# Protect us from reading Git version information outside of the Git directory
# in case it is not a repository itself, but embedded in an unrelated
@@ -39,13 +47,9 @@ then
test -d "${GIT_DIR:-.git}" ||
test -f "$SOURCE_DIR"/.git;
} &&
- VN=$(git -C "$SOURCE_DIR" describe --match "v[0-9]*" HEAD 2>/dev/null) &&
+ VN=$(git -C "$SOURCE_DIR" describe --dirty --match="v[0-9]*" 2>/dev/null) &&
case "$VN" in
*$LF*) (exit 1) ;;
- v[0-9]*)
- git -C "$SOURCE_DIR" update-index -q --refresh
- test -z "$(git -C "$SOURCE_DIR" diff-index --name-only HEAD --)" ||
- VN="$VN-dirty" ;;
esac
then
VN=$(echo "$VN" | sed -e 's/-/./g');
@@ -78,19 +82,25 @@ read GIT_MAJOR_VERSION GIT_MINOR_VERSION GIT_MICRO_VERSION GIT_PATCH_LEVEL trail
$(echo "$GIT_VERSION" 0 0 0 0 | tr '.a-zA-Z-' ' ')
EOF
-sed -e "s|@GIT_VERSION@|$GIT_VERSION|" \
+REPLACED=$(printf "%s" "$INPUT" | sed -e "s|@GIT_VERSION@|$GIT_VERSION|" \
-e "s|@GIT_MAJOR_VERSION@|$GIT_MAJOR_VERSION|" \
-e "s|@GIT_MINOR_VERSION@|$GIT_MINOR_VERSION|" \
-e "s|@GIT_MICRO_VERSION@|$GIT_MICRO_VERSION|" \
-e "s|@GIT_PATCH_LEVEL@|$GIT_PATCH_LEVEL|" \
-e "s|@GIT_BUILT_FROM_COMMIT@|$GIT_BUILT_FROM_COMMIT|" \
-e "s|@GIT_USER_AGENT@|$GIT_USER_AGENT|" \
- -e "s|@GIT_DATE@|$GIT_DATE|" \
- "$INPUT" >"$OUTPUT"+
+ -e "s|@GIT_DATE@|$GIT_DATE|"
+)
-if ! test -f "$OUTPUT" || ! cmp "$OUTPUT"+ "$OUTPUT" >/dev/null
+if test -z "$OUTPUT"
then
- mv "$OUTPUT"+ "$OUTPUT"
+ printf "%s\n" "$REPLACED"
else
- rm "$OUTPUT"+
+ printf "%s\n" "$REPLACED" >"$OUTPUT".$$+
+ if ! test -f "$OUTPUT" || ! cmp "$OUTPUT".$$+ "$OUTPUT" >/dev/null
+ then
+ mv "$OUTPUT".$$+ "$OUTPUT"
+ else
+ rm "$OUTPUT".$$+
+ fi
fi
diff --git a/Makefile b/Makefile
index 97e8385b66..6d45093089 100644
--- a/Makefile
+++ b/Makefile
@@ -183,7 +183,8 @@ include shared.mak
# byte-order mark (BOM) when writing UTF-16 or UTF-32 and always writes in
# big-endian format.
#
-# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
+# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound. Define
+# ZLIB_NG if you want to use zlib-ng instead of zlib.
#
# Define NO_NORETURN if using buggy versions of gcc 4.6+ and profile feedback,
# as the compiler can crash (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49299)
@@ -416,6 +417,9 @@ include shared.mak
# Define LINK_FUZZ_PROGRAMS if you want `make all` to also build the fuzz test
# programs in oss-fuzz/.
#
+# Define INCLUDE_LIBGIT_RS if you want `make all` and `make test` to build and
+# test the Rust crates in contrib/libgit-sys and contrib/libgit-rs.
+#
# === Optional library: libintl ===
#
# Define NO_GETTEXT if you don't want Git output to be translated.
@@ -657,6 +661,8 @@ CURL_CONFIG = curl-config
GCOV = gcov
STRIP = strip
SPATCH = spatch
+LD = ld
+OBJCOPY = objcopy
export TCL_PATH TCLTK_PATH
@@ -675,6 +681,7 @@ FUZZ_OBJS =
FUZZ_PROGRAMS =
GIT_OBJS =
LIB_OBJS =
+LIBGIT_PUB_OBJS =
SCALAR_OBJS =
OBJECTS =
OTHER_PROGRAMS =
@@ -812,12 +819,14 @@ TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
TEST_BUILTINS_OBJS += test-match-trees.o
TEST_BUILTINS_OBJS += test-mergesort.o
TEST_BUILTINS_OBJS += test-mktemp.o
+TEST_BUILTINS_OBJS += test-name-hash.o
TEST_BUILTINS_OBJS += test-online-cpus.o
TEST_BUILTINS_OBJS += test-pack-mtimes.o
TEST_BUILTINS_OBJS += test-parse-options.o
TEST_BUILTINS_OBJS += test-parse-pathspec-file.o
TEST_BUILTINS_OBJS += test-partial-clone.o
TEST_BUILTINS_OBJS += test-path-utils.o
+TEST_BUILTINS_OBJS += test-path-walk.o
TEST_BUILTINS_OBJS += test-pcre2-config.o
TEST_BUILTINS_OBJS += test-pkt-line.o
TEST_BUILTINS_OBJS += test-proc-receive.o
@@ -981,10 +990,11 @@ LIB_OBJS += combine-diff.o
LIB_OBJS += commit-graph.o
LIB_OBJS += commit-reach.o
LIB_OBJS += commit.o
+LIB_OBJS += common-exit.o
+LIB_OBJS += common-init.o
LIB_OBJS += compat/nonblock.o
LIB_OBJS += compat/obstack.o
LIB_OBJS += compat/terminal.o
-LIB_OBJS += compat/zlib-uncompress2.o
LIB_OBJS += config.o
LIB_OBJS += connect.o
LIB_OBJS += connected.o
@@ -1094,6 +1104,7 @@ LIB_OBJS += parse-options.o
LIB_OBJS += patch-delta.o
LIB_OBJS += patch-ids.o
LIB_OBJS += path.o
+LIB_OBJS += path-walk.o
LIB_OBJS += pathspec.o
LIB_OBJS += pkt-line.o
LIB_OBJS += preload-index.o
@@ -1201,6 +1212,7 @@ BUILTIN_OBJS += builtin/am.o
BUILTIN_OBJS += builtin/annotate.o
BUILTIN_OBJS += builtin/apply.o
BUILTIN_OBJS += builtin/archive.o
+BUILTIN_OBJS += builtin/backfill.o
BUILTIN_OBJS += builtin/bisect.o
BUILTIN_OBJS += builtin/blame.o
BUILTIN_OBJS += builtin/branch.o
@@ -1271,7 +1283,9 @@ BUILTIN_OBJS += builtin/mv.o
BUILTIN_OBJS += builtin/name-rev.o
BUILTIN_OBJS += builtin/notes.o
BUILTIN_OBJS += builtin/pack-objects.o
+ifndef WITH_BREAKING_CHANGES
BUILTIN_OBJS += builtin/pack-redundant.o
+endif
BUILTIN_OBJS += builtin/pack-refs.o
BUILTIN_OBJS += builtin/patch-id.o
BUILTIN_OBJS += builtin/prune-packed.o
@@ -1338,20 +1352,23 @@ THIRD_PARTY_SOURCES += $(UNIT_TEST_DIR)/clar/%
THIRD_PARTY_SOURCES += $(UNIT_TEST_DIR)/clar/clar/%
CLAR_TEST_SUITES += u-ctype
+CLAR_TEST_SUITES += u-example-decorate
+CLAR_TEST_SUITES += u-hash
+CLAR_TEST_SUITES += u-hashmap
+CLAR_TEST_SUITES += u-mem-pool
+CLAR_TEST_SUITES += u-prio-queue
+CLAR_TEST_SUITES += u-reftable-tree
+CLAR_TEST_SUITES += u-strbuf
+CLAR_TEST_SUITES += u-strcmp-offset
CLAR_TEST_SUITES += u-strvec
CLAR_TEST_PROG = $(UNIT_TEST_BIN)/unit-tests$(X)
CLAR_TEST_OBJS = $(patsubst %,$(UNIT_TEST_DIR)/%.o,$(CLAR_TEST_SUITES))
CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/clar/clar.o
CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/unit-test.o
-UNIT_TEST_PROGRAMS += t-example-decorate
-UNIT_TEST_PROGRAMS += t-hash
-UNIT_TEST_PROGRAMS += t-hashmap
-UNIT_TEST_PROGRAMS += t-mem-pool
UNIT_TEST_PROGRAMS += t-oid-array
UNIT_TEST_PROGRAMS += t-oidmap
UNIT_TEST_PROGRAMS += t-oidtree
-UNIT_TEST_PROGRAMS += t-prio-queue
UNIT_TEST_PROGRAMS += t-reftable-basics
UNIT_TEST_PROGRAMS += t-reftable-block
UNIT_TEST_PROGRAMS += t-reftable-merged
@@ -1360,9 +1377,6 @@ UNIT_TEST_PROGRAMS += t-reftable-reader
UNIT_TEST_PROGRAMS += t-reftable-readwrite
UNIT_TEST_PROGRAMS += t-reftable-record
UNIT_TEST_PROGRAMS += t-reftable-stack
-UNIT_TEST_PROGRAMS += t-reftable-tree
-UNIT_TEST_PROGRAMS += t-strbuf
-UNIT_TEST_PROGRAMS += t-strcmp-offset
UNIT_TEST_PROGRAMS += t-trailer
UNIT_TEST_PROGRAMS += t-urlmatch-normalization
UNIT_TEST_PROGS = $(patsubst %,$(UNIT_TEST_BIN)/%$X,$(UNIT_TEST_PROGRAMS))
@@ -1688,11 +1702,20 @@ else
endif
IMAP_SEND_LDFLAGS += $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
-ifdef ZLIB_PATH
- BASIC_CFLAGS += -I$(ZLIB_PATH)/include
- EXTLIBS += $(call libpath_template,$(ZLIB_PATH)/$(lib))
+ifdef ZLIB_NG
+ BASIC_CFLAGS += -DHAVE_ZLIB_NG
+ ifdef ZLIB_NG_PATH
+ BASIC_CFLAGS += -I$(ZLIB_NG_PATH)/include
+ EXTLIBS += $(call libpath_template,$(ZLIB_NG_PATH)/$(lib))
+ endif
+ EXTLIBS += -lz-ng
+else
+ ifdef ZLIB_PATH
+ BASIC_CFLAGS += -I$(ZLIB_PATH)/include
+ EXTLIBS += $(call libpath_template,$(ZLIB_PATH)/$(lib))
+ endif
+ EXTLIBS += -lz
endif
-EXTLIBS += -lz
ifndef NO_OPENSSL
OPENSSL_LIBSSL = -lssl
@@ -2234,6 +2257,16 @@ ifdef FSMONITOR_OS_SETTINGS
COMPAT_OBJS += compat/fsmonitor/fsm-path-utils-$(FSMONITOR_OS_SETTINGS).o
endif
+ifdef WITH_BREAKING_CHANGES
+ BASIC_CFLAGS += -DWITH_BREAKING_CHANGES
+endif
+
+ifdef INCLUDE_LIBGIT_RS
+ # Enable symbol hiding in contrib/libgit-sys/libgitpub.a without making
+ # us rebuild the whole tree every time we run a Rust build.
+ BASIC_CFLAGS += -fvisibility=hidden
+endif
+
ifeq ($(TCLTK_PATH),)
NO_TCLTK = NoThanks
endif
@@ -2528,17 +2561,17 @@ $(BUILT_INS): git$X
config-list.h: generate-configlist.sh
-config-list.h: Documentation/*config.txt Documentation/config/*.txt
+config-list.h: Documentation/*config.adoc Documentation/config/*.adoc
$(QUIET_GEN)$(SHELL_PATH) ./generate-configlist.sh . $@
command-list.h: generate-cmdlist.sh command-list.txt
-command-list.h: $(wildcard Documentation/git*.txt)
+command-list.h: $(wildcard Documentation/git*.adoc)
$(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh \
$(patsubst %,--exclude-program %,$(EXCLUDED_PROGRAMS)) \
. $@
-hook-list.h: generate-hooklist.sh Documentation/githooks.txt
+hook-list.h: generate-hooklist.sh Documentation/githooks.adoc
$(QUIET_GEN)$(SHELL_PATH) ./generate-hooklist.sh . $@
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):\
@@ -2730,6 +2763,10 @@ OBJECTS += $(UNIT_TEST_OBJS)
OBJECTS += $(CLAR_TEST_OBJS)
OBJECTS += $(patsubst %,$(UNIT_TEST_DIR)/%.o,$(UNIT_TEST_PROGRAMS))
+ifdef INCLUDE_LIBGIT_RS
+ OBJECTS += contrib/libgit-sys/public_symbol_export.o
+endif
+
ifndef NO_CURL
OBJECTS += http.o http-walker.o remote-curl.o
endif
@@ -3192,6 +3229,7 @@ GIT-BUILD-OPTIONS: FORCE
-e "s|@TEST_SHELL_PATH@|\'$(TEST_SHELL_PATH_SQ)\'|" \
-e "s|@USE_GETTEXT_SCHEME@|\'$(USE_GETTEXT_SCHEME)\'|" \
-e "s|@USE_LIBPCRE2@|\'$(USE_LIBPCRE2)\'|" \
+ -e "s|@WITH_BREAKING_CHANGES@|\'$(WITH_BREAKING_CHANGES)\'|" \
-e "s|@X@|\'$(X)\'|" \
GIT-BUILD-OPTIONS.in >$@+
@if grep -q '^[A-Z][A-Z_]*=@.*@$$' $@+; then echo "Unsubstituted build options in $@" >&2 && exit 1; fi
@@ -3724,6 +3762,10 @@ clean: profile-clean coverage-clean cocciclean
$(RM) $(htmldocs).tar.gz $(manpages).tar.gz
$(MAKE) -C Documentation/ clean
$(RM) Documentation/GIT-EXCLUDED-PROGRAMS
+ $(RM) -r contrib/libgit-sys/target contrib/libgit-rs/target
+ $(RM) contrib/libgit-sys/partial_symbol_export.o
+ $(RM) contrib/libgit-sys/hidden_symbol_export.o
+ $(RM) contrib/libgit-sys/libgitpub.a
ifndef NO_PERL
$(RM) -r perl/build/
endif
@@ -3885,3 +3927,31 @@ $(CLAR_TEST_PROG): $(UNIT_TEST_DIR)/clar.suite $(CLAR_TEST_OBJS) $(GITLIBS) GIT-
build-unit-tests: $(UNIT_TEST_PROGS) $(CLAR_TEST_PROG)
unit-tests: $(UNIT_TEST_PROGS) $(CLAR_TEST_PROG) t/helper/test-tool$X
$(MAKE) -C t/ unit-tests
+
+.PHONY: libgit-sys libgit-rs
+libgit-sys libgit-rs:
+ $(QUIET)(\
+ cd contrib/$@ && \
+ cargo build \
+ )
+ifdef INCLUDE_LIBGIT_RS
+all:: libgit-sys libgit-rs
+endif
+
+LIBGIT_PUB_OBJS += contrib/libgit-sys/public_symbol_export.o
+LIBGIT_PUB_OBJS += libgit.a
+LIBGIT_PUB_OBJS += reftable/libreftable.a
+LIBGIT_PUB_OBJS += xdiff/lib.a
+
+LIBGIT_PARTIAL_EXPORT = contrib/libgit-sys/partial_symbol_export.o
+
+LIBGIT_HIDDEN_EXPORT = contrib/libgit-sys/hidden_symbol_export.o
+
+$(LIBGIT_PARTIAL_EXPORT): $(LIBGIT_PUB_OBJS)
+ $(LD) -r $^ -o $@
+
+$(LIBGIT_HIDDEN_EXPORT): $(LIBGIT_PARTIAL_EXPORT)
+ $(OBJCOPY) --localize-hidden $^ $@
+
+contrib/libgit-sys/libgitpub.a: $(LIBGIT_HIDDEN_EXPORT)
+ $(AR) $(ARFLAGS) $@ $^
diff --git a/RelNotes b/RelNotes
index 061d699283..ac72bdf04d 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.48.0.txt \ No newline at end of file
+Documentation/RelNotes/2.49.0.adoc \ No newline at end of file
diff --git a/add-interactive.c b/add-interactive.c
index d0f8c10e6f..97ff35b6f1 100644
--- a/add-interactive.c
+++ b/add-interactive.c
@@ -1,4 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
@@ -72,14 +71,14 @@ void init_add_i_state(struct add_i_state *s, struct repository *r)
s->use_color ? GIT_COLOR_RESET : "", COLOR_MAXLEN);
FREE_AND_NULL(s->interactive_diff_filter);
- git_config_get_string("interactive.difffilter",
- &s->interactive_diff_filter);
+ repo_config_get_string(r, "interactive.difffilter",
+ &s->interactive_diff_filter);
FREE_AND_NULL(s->interactive_diff_algorithm);
- git_config_get_string("diff.algorithm",
- &s->interactive_diff_algorithm);
+ repo_config_get_string(r, "diff.algorithm",
+ &s->interactive_diff_algorithm);
- git_config_get_bool("interactive.singlekey", &s->use_single_key);
+ repo_config_get_bool(r, "interactive.singlekey", &s->use_single_key);
if (s->use_single_key)
setbuf(stdin, NULL);
}
@@ -535,7 +534,7 @@ static int get_modified_files(struct repository *r,
size_t *binary_count)
{
struct object_id head_oid;
- int is_initial = !refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
+ int is_initial = !refs_resolve_ref_unsafe(get_main_ref_store(r),
"HEAD", RESOLVE_REF_READING,
&head_oid, NULL);
struct collection_status s = { 0 };
@@ -560,7 +559,7 @@ static int get_modified_files(struct repository *r,
s.skip_unseen = filter && i;
opt.def = is_initial ?
- empty_tree_oid_hex(the_repository->hash_algo) : oid_to_hex(&head_oid);
+ empty_tree_oid_hex(r->hash_algo) : oid_to_hex(&head_oid);
repo_init_revisions(r, &rev, NULL);
setup_revisions(0, NULL, &rev, &opt);
@@ -765,7 +764,7 @@ static int run_revert(struct add_i_state *s, const struct pathspec *ps,
size_t count, i, j;
struct object_id oid;
- int is_initial = !refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
+ int is_initial = !refs_resolve_ref_unsafe(get_main_ref_store(s->r),
"HEAD", RESOLVE_REF_READING,
&oid,
NULL);
@@ -996,7 +995,7 @@ static int run_diff(struct add_i_state *s, const struct pathspec *ps,
ssize_t count, i;
struct object_id oid;
- int is_initial = !refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
+ int is_initial = !refs_resolve_ref_unsafe(get_main_ref_store(s->r),
"HEAD", RESOLVE_REF_READING,
&oid,
NULL);
diff --git a/add-patch.c b/add-patch.c
index 7b598e14df..95c67d8c80 100644
--- a/add-patch.c
+++ b/add-patch.c
@@ -1464,7 +1464,7 @@ static int patch_update_file(struct add_p_state *s,
if (file_diff->hunk_nr) {
if (rendered_hunk_index != hunk_index) {
if (use_pager) {
- setup_pager();
+ setup_pager(the_repository);
sigchain_push(SIGPIPE, SIG_IGN);
}
render_hunk(s, hunk, 0, colored, &s->buf);
diff --git a/apply.c b/apply.c
index 4a7b6120ac..b124678b93 100644
--- a/apply.c
+++ b/apply.c
@@ -1423,7 +1423,10 @@ static int parse_num(const char *line, unsigned long *p)
if (!isdigit(*line))
return 0;
+ errno = 0;
*p = strtoul(line, &ptr, 10);
+ if (errno)
+ return 0;
return ptr - line;
}
diff --git a/archive-tar.c b/archive-tar.c
index e7b3489e1e..0edf13fba7 100644
--- a/archive-tar.c
+++ b/archive-tar.c
@@ -473,9 +473,7 @@ static const char internal_gzip_command[] = "git archive gzip";
static int write_tar_filter_archive(const struct archiver *ar,
struct archiver_args *args)
{
-#if ZLIB_VERNUM >= 0x1221
struct gz_header_s gzhead = { .os = 3 }; /* Unix, for reproducibility */
-#endif
struct strbuf cmd = STRBUF_INIT;
struct child_process filter = CHILD_PROCESS_INIT;
int r;
@@ -486,10 +484,8 @@ static int write_tar_filter_archive(const struct archiver *ar,
if (!strcmp(ar->filter_command, internal_gzip_command)) {
write_block = tgz_write_block;
git_deflate_init_gzip(&gzstream, args->compression_level);
-#if ZLIB_VERNUM >= 0x1221
if (deflateSetHeader(&gzstream.z, &gzhead) != Z_OK)
BUG("deflateSetHeader() called too late");
-#endif
gzstream.next_out = outbuf;
gzstream.avail_out = sizeof(outbuf);
diff --git a/archive.c b/archive.c
index b9c200cba6..8be4e7ac8d 100644
--- a/archive.c
+++ b/archive.c
@@ -7,6 +7,7 @@
#include "convert.h"
#include "environment.h"
#include "gettext.h"
+#include "git-zlib.h"
#include "hex.h"
#include "object-name.h"
#include "path.h"
diff --git a/bisect.c b/bisect.c
index 1a9069c9ad..7a3c77c6d8 100644
--- a/bisect.c
+++ b/bisect.c
@@ -780,10 +780,10 @@ static struct commit *get_commit_reference(struct repository *r,
}
static struct commit **get_bad_and_good_commits(struct repository *r,
- int *rev_nr)
+ size_t *rev_nr)
{
struct commit **rev;
- int i, n = 0;
+ size_t i, n = 0;
ALLOC_ARRAY(rev, 1 + good_revs.nr);
rev[n++] = get_commit_reference(r, current_bad_oid);
@@ -855,7 +855,7 @@ static void handle_skipped_merge_base(const struct object_id *mb)
* for early success, this will be converted back to 0 in
* check_good_are_ancestors_of_bad().
*/
-static enum bisect_error check_merge_bases(int rev_nr, struct commit **rev, int no_checkout)
+static enum bisect_error check_merge_bases(size_t rev_nr, struct commit **rev, int no_checkout)
{
enum bisect_error res = BISECT_OK;
struct commit_list *result = NULL;
@@ -887,7 +887,7 @@ static enum bisect_error check_merge_bases(int rev_nr, struct commit **rev, int
return res;
}
-static int check_ancestors(struct repository *r, int rev_nr,
+static int check_ancestors(struct repository *r, size_t rev_nr,
struct commit **rev, const char *prefix)
{
struct strvec rev_argv = STRVEC_INIT;
@@ -922,7 +922,8 @@ static enum bisect_error check_good_are_ancestors_of_bad(struct repository *r,
{
char *filename;
struct stat st;
- int fd, rev_nr;
+ int fd;
+ size_t rev_nr;
enum bisect_error res = BISECT_OK;
struct commit **rev;
diff --git a/builtin.h b/builtin.h
index f7b166b334..89928ccf92 100644
--- a/builtin.h
+++ b/builtin.h
@@ -120,6 +120,7 @@ int cmd_am(int argc, const char **argv, const char *prefix, struct repository *r
int cmd_annotate(int argc, const char **argv, const char *prefix, struct repository *repo);
int cmd_apply(int argc, const char **argv, const char *prefix, struct repository *repo);
int cmd_archive(int argc, const char **argv, const char *prefix, struct repository *repo);
+int cmd_backfill(int argc, const char **argv, const char *prefix, struct repository *repo);
int cmd_bisect(int argc, const char **argv, const char *prefix, struct repository *repo);
int cmd_blame(int argc, const char **argv, const char *prefix, struct repository *repo);
int cmd_branch(int argc, const char **argv, const char *prefix, struct repository *repo);
diff --git a/builtin/am.c b/builtin/am.c
index 1338b606fe..390b463144 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -1211,7 +1211,7 @@ static int parse_mail(struct am_state *state, const char *mail)
int ret = 0;
struct mailinfo mi;
- setup_mailinfo(&mi);
+ setup_mailinfo(the_repository, &mi);
if (state->utf8)
mi.metainfo_charset = get_commit_output_encoding();
@@ -1786,7 +1786,7 @@ static int do_interactive(struct am_state *state)
}
strbuf_release(&msg);
} else if (*reply == 'v' || *reply == 'V') {
- const char *pager = git_pager(1);
+ const char *pager = git_pager(the_repository, 1);
struct child_process cp = CHILD_PROCESS_INIT;
if (!pager)
@@ -2246,7 +2246,7 @@ static int show_patch(struct am_state *state, enum resume_type resume_mode)
if (len < 0)
die_errno(_("failed to read '%s'"), patch_path);
- setup_pager();
+ setup_pager(the_repository);
write_in_full(1, sb.buf, sb.len);
strbuf_release(&sb);
return 0;
@@ -2427,8 +2427,7 @@ int cmd_am(int argc,
OPT_END()
};
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(usage, options);
+ show_usage_with_options_if_asked(argc, argv, usage, options);
git_config(git_default_config, NULL);
diff --git a/builtin/backfill.c b/builtin/backfill.c
new file mode 100644
index 0000000000..33e1ea2f84
--- /dev/null
+++ b/builtin/backfill.c
@@ -0,0 +1,147 @@
+/* We need this macro to access core_apply_sparse_checkout */
+#define USE_THE_REPOSITORY_VARIABLE
+
+#include "builtin.h"
+#include "git-compat-util.h"
+#include "config.h"
+#include "parse-options.h"
+#include "repository.h"
+#include "commit.h"
+#include "dir.h"
+#include "environment.h"
+#include "hex.h"
+#include "tree.h"
+#include "tree-walk.h"
+#include "object.h"
+#include "object-store-ll.h"
+#include "oid-array.h"
+#include "oidset.h"
+#include "promisor-remote.h"
+#include "strmap.h"
+#include "string-list.h"
+#include "revision.h"
+#include "trace2.h"
+#include "progress.h"
+#include "packfile.h"
+#include "path-walk.h"
+
+static const char * const builtin_backfill_usage[] = {
+ N_("git backfill [--min-batch-size=<n>] [--[no-]sparse]"),
+ NULL
+};
+
+struct backfill_context {
+ struct repository *repo;
+ struct oid_array current_batch;
+ size_t min_batch_size;
+ int sparse;
+};
+
+static void backfill_context_clear(struct backfill_context *ctx)
+{
+ oid_array_clear(&ctx->current_batch);
+}
+
+static void download_batch(struct backfill_context *ctx)
+{
+ promisor_remote_get_direct(ctx->repo,
+ ctx->current_batch.oid,
+ ctx->current_batch.nr);
+ oid_array_clear(&ctx->current_batch);
+
+ /*
+ * We likely have a new packfile. Add it to the packed list to
+ * avoid possible duplicate downloads of the same objects.
+ */
+ reprepare_packed_git(ctx->repo);
+}
+
+static int fill_missing_blobs(const char *path UNUSED,
+ struct oid_array *list,
+ enum object_type type,
+ void *data)
+{
+ struct backfill_context *ctx = data;
+
+ if (type != OBJ_BLOB)
+ return 0;
+
+ for (size_t i = 0; i < list->nr; i++) {
+ if (!has_object(ctx->repo, &list->oid[i],
+ OBJECT_INFO_FOR_PREFETCH))
+ oid_array_append(&ctx->current_batch, &list->oid[i]);
+ }
+
+ if (ctx->current_batch.nr >= ctx->min_batch_size)
+ download_batch(ctx);
+
+ return 0;
+}
+
+static int do_backfill(struct backfill_context *ctx)
+{
+ struct rev_info revs;
+ struct path_walk_info info = PATH_WALK_INFO_INIT;
+ int ret;
+
+ if (ctx->sparse) {
+ CALLOC_ARRAY(info.pl, 1);
+ if (get_sparse_checkout_patterns(info.pl)) {
+ path_walk_info_clear(&info);
+ return error(_("problem loading sparse-checkout"));
+ }
+ }
+
+ repo_init_revisions(ctx->repo, &revs, "");
+ handle_revision_arg("HEAD", &revs, 0, 0);
+
+ info.blobs = 1;
+ info.tags = info.commits = info.trees = 0;
+
+ info.revs = &revs;
+ info.path_fn = fill_missing_blobs;
+ info.path_fn_data = ctx;
+
+ ret = walk_objects_by_path(&info);
+
+ /* Download the objects that did not fill a batch. */
+ if (!ret)
+ download_batch(ctx);
+
+ path_walk_info_clear(&info);
+ release_revisions(&revs);
+ return ret;
+}
+
+int cmd_backfill(int argc, const char **argv, const char *prefix, struct repository *repo)
+{
+ int result;
+ struct backfill_context ctx = {
+ .repo = repo,
+ .current_batch = OID_ARRAY_INIT,
+ .min_batch_size = 50000,
+ .sparse = 0,
+ };
+ struct option options[] = {
+ OPT_INTEGER(0, "min-batch-size", &ctx.min_batch_size,
+ N_("Minimum number of objects to request at a time")),
+ OPT_BOOL(0, "sparse", &ctx.sparse,
+ N_("Restrict the missing objects to the current sparse-checkout")),
+ OPT_END(),
+ };
+
+ show_usage_with_options_if_asked(argc, argv,
+ builtin_backfill_usage, options);
+
+ argc = parse_options(argc, argv, prefix, options, builtin_backfill_usage,
+ 0);
+
+ repo_config(repo, git_default_config, NULL);
+
+ if (ctx.sparse < 0)
+ ctx.sparse = core_apply_sparse_checkout;
+
+ result = do_backfill(&ctx);
+ backfill_context_clear(&ctx);
+ return result;
+}
diff --git a/builtin/blame.c b/builtin/blame.c
index 867032e4c1..c470654c7e 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -489,9 +489,9 @@ static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int
fputs(color, stdout);
if (suspect->commit->object.flags & UNINTERESTING) {
- if (blank_boundary)
- memset(hex, ' ', length);
- else if (!(opt & OUTPUT_ANNOTATE_COMPAT)) {
+ if (blank_boundary) {
+ memset(hex, ' ', strlen(hex));
+ } else if (!(opt & OUTPUT_ANNOTATE_COMPAT)) {
length--;
putchar('^');
}
@@ -505,7 +505,8 @@ static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int
length--;
putchar('?');
}
- fwrite(hex, 1, length, stdout);
+
+ printf("%.*s", (int)(length < GIT_MAX_HEXSZ ? length : GIT_MAX_HEXSZ), hex);
if (opt & OUTPUT_ANNOTATE_COMPAT) {
const char *name;
if (opt & OUTPUT_SHOW_EMAIL)
@@ -1193,14 +1194,16 @@ parse_done:
sb.found_guilty_entry = &found_guilty_entry;
sb.found_guilty_entry_data = &pi;
if (show_progress)
- pi.progress = start_delayed_progress(_("Blaming lines"), num_lines);
+ pi.progress = start_delayed_progress(the_repository,
+ _("Blaming lines"),
+ num_lines);
assign_blame(&sb, opt);
stop_progress(&pi.progress);
if (!incremental)
- setup_pager();
+ setup_pager(the_repository);
else
goto cleanup;
diff --git a/builtin/branch.c b/builtin/branch.c
index 6e7b0cfddb..c150131bd9 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -473,7 +473,7 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
if (verify_ref_format(format))
die(_("unable to parse format string"));
- filter_ahead_behind(the_repository, format, &array);
+ filter_ahead_behind(the_repository, &array);
ref_array_sort(sorting, &array);
if (column_active(colopts)) {
@@ -784,8 +784,8 @@ int cmd_branch(int argc,
filter.kind = FILTER_REFS_BRANCHES;
filter.abbrev = -1;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(builtin_branch_usage, options);
+ show_usage_with_options_if_asked(argc, argv,
+ builtin_branch_usage, options);
/*
* Try to set sort keys from config. If config does not set any,
@@ -884,7 +884,6 @@ int cmd_branch(int argc,
string_list_clear(&output, 0);
ref_sorting_release(sorting);
ref_filter_clear(&filter);
- ref_format_clear(&format);
ret = 0;
goto out;
diff --git a/builtin/bugreport.c b/builtin/bugreport.c
index e3288a86c8..66d64bfd5a 100644
--- a/builtin/bugreport.c
+++ b/builtin/bugreport.c
@@ -158,7 +158,7 @@ int cmd_bugreport(int argc,
strbuf_addftime(&zip_path, option_suffix, localtime_r(&now, &tm), 0, 0);
strbuf_addstr(&zip_path, ".zip");
- if (create_diagnostics_archive(&zip_path, diagnose))
+ if (create_diagnostics_archive(the_repository, &zip_path, diagnose))
die_errno(_("unable to create diagnostics archive %s"), zip_path.buf);
strbuf_release(&zip_path);
diff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c
index df00b5ee13..be2cebe121 100644
--- a/builtin/check-mailmap.c
+++ b/builtin/check-mailmap.c
@@ -35,7 +35,7 @@ static void check_mailmap(struct string_list *mailmap, const char *contact)
mail = ident.mail_begin;
maillen = ident.mail_end - ident.mail_begin;
} else {
- name = NULL;
+ name = "";
namelen = 0;
mail = contact;
maillen = strlen(contact);
diff --git a/builtin/check-ref-format.c b/builtin/check-ref-format.c
index cef1ffe3ce..5d80afeec0 100644
--- a/builtin/check-ref-format.c
+++ b/builtin/check-ref-format.c
@@ -64,8 +64,8 @@ int cmd_check_ref_format(int argc,
BUG_ON_NON_EMPTY_PREFIX(prefix);
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage(builtin_check_ref_format_usage);
+ show_usage_if_asked(argc, argv,
+ builtin_check_ref_format_usage);
if (argc == 3 && !strcmp(argv[1], "--branch"))
return check_ref_format_branch(argv[2]);
diff --git a/builtin/checkout--worker.c b/builtin/checkout--worker.c
index b81002a1df..da9345a44b 100644
--- a/builtin/checkout--worker.c
+++ b/builtin/checkout--worker.c
@@ -128,9 +128,9 @@ int cmd_checkout__worker(int argc,
OPT_END()
};
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(checkout_worker_usage,
- checkout_worker_options);
+ show_usage_with_options_if_asked(argc, argv,
+ checkout_worker_usage,
+ checkout_worker_options);
git_config(git_default_config, NULL);
argc = parse_options(argc, argv, prefix, checkout_worker_options,
diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c
index a81501098d..e30086c7d4 100644
--- a/builtin/checkout-index.c
+++ b/builtin/checkout-index.c
@@ -250,9 +250,9 @@ int cmd_checkout_index(int argc,
OPT_END()
};
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(builtin_checkout_index_usage,
- builtin_checkout_index_options);
+ show_usage_with_options_if_asked(argc, argv,
+ builtin_checkout_index_usage,
+ builtin_checkout_index_options);
git_config(git_default_config, NULL);
prefix_length = prefix ? strlen(prefix) : 0;
diff --git a/builtin/clone.c b/builtin/clone.c
index fd001d800c..f9a2ecbe9c 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -56,42 +56,30 @@
* - dropping use-separate-remote and no-separate-remote compatibility
*
*/
-static const char * const builtin_clone_usage[] = {
- N_("git clone [<options>] [--] <repo> [<dir>]"),
- NULL
+
+struct clone_opts {
+ int wants_head;
+ int detach;
};
+#define CLONE_OPTS_INIT { \
+ .wants_head = 1 /* default enabled */ \
+}
static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1;
static int option_local = -1, option_no_hardlinks, option_shared;
-static int option_no_tags;
+static int option_tags = 1; /* default enabled */
static int option_shallow_submodules;
-static int option_reject_shallow = -1; /* unspecified */
static int config_reject_shallow = -1; /* unspecified */
-static int deepen;
-static char *option_template, *option_depth, *option_since;
-static char *option_origin = NULL;
static char *remote_name = NULL;
static char *option_branch = NULL;
-static struct string_list option_not = STRING_LIST_INIT_NODUP;
-static const char *real_git_dir;
-static const char *ref_format;
-static const char *option_upload_pack = "git-upload-pack";
static int option_verbosity;
-static int option_progress = -1;
-static int option_sparse_checkout;
-static enum transport_family family;
-static struct string_list option_config = STRING_LIST_INIT_NODUP;
static struct string_list option_required_reference = STRING_LIST_INIT_NODUP;
static struct string_list option_optional_reference = STRING_LIST_INIT_NODUP;
-static int option_dissociate;
static int max_jobs = -1;
static struct string_list option_recurse_submodules = STRING_LIST_INIT_NODUP;
static struct list_objects_filter_options filter_options = LIST_OBJECTS_FILTER_INIT;
-static int option_filter_submodules = -1; /* unspecified */
static int config_filter_submodules = -1; /* unspecified */
-static struct string_list server_options = STRING_LIST_INIT_NODUP;
static int option_remote_submodules;
-static const char *bundle_uri;
static int recurse_submodules_cb(const struct option *opt,
const char *arg, int unset)
@@ -107,78 +95,6 @@ static int recurse_submodules_cb(const struct option *opt,
return 0;
}
-static struct option builtin_clone_options[] = {
- OPT__VERBOSITY(&option_verbosity),
- OPT_BOOL(0, "progress", &option_progress,
- N_("force progress reporting")),
- OPT_BOOL(0, "reject-shallow", &option_reject_shallow,
- N_("don't clone shallow repository")),
- OPT_BOOL('n', "no-checkout", &option_no_checkout,
- N_("don't create a checkout")),
- OPT_BOOL(0, "bare", &option_bare, N_("create a bare repository")),
- OPT_HIDDEN_BOOL(0, "naked", &option_bare,
- N_("create a bare repository")),
- OPT_BOOL(0, "mirror", &option_mirror,
- N_("create a mirror repository (implies --bare)")),
- OPT_BOOL('l', "local", &option_local,
- N_("to clone from a local repository")),
- OPT_BOOL(0, "no-hardlinks", &option_no_hardlinks,
- N_("don't use local hardlinks, always copy")),
- OPT_BOOL('s', "shared", &option_shared,
- N_("setup as shared repository")),
- { OPTION_CALLBACK, 0, "recurse-submodules", &option_recurse_submodules,
- N_("pathspec"), N_("initialize submodules in the clone"),
- PARSE_OPT_OPTARG, recurse_submodules_cb, (intptr_t)"." },
- OPT_ALIAS(0, "recursive", "recurse-submodules"),
- OPT_INTEGER('j', "jobs", &max_jobs,
- N_("number of submodules cloned in parallel")),
- OPT_STRING(0, "template", &option_template, N_("template-directory"),
- N_("directory from which templates will be used")),
- OPT_STRING_LIST(0, "reference", &option_required_reference, N_("repo"),
- N_("reference repository")),
- OPT_STRING_LIST(0, "reference-if-able", &option_optional_reference,
- N_("repo"), N_("reference repository")),
- OPT_BOOL(0, "dissociate", &option_dissociate,
- N_("use --reference only while cloning")),
- OPT_STRING('o', "origin", &option_origin, N_("name"),
- N_("use <name> instead of 'origin' to track upstream")),
- OPT_STRING('b', "branch", &option_branch, N_("branch"),
- N_("checkout <branch> instead of the remote's HEAD")),
- OPT_STRING('u', "upload-pack", &option_upload_pack, N_("path"),
- N_("path to git-upload-pack on the remote")),
- OPT_STRING(0, "depth", &option_depth, N_("depth"),
- N_("create a shallow clone of that depth")),
- OPT_STRING(0, "shallow-since", &option_since, N_("time"),
- N_("create a shallow clone since a specific time")),
- OPT_STRING_LIST(0, "shallow-exclude", &option_not, N_("ref"),
- N_("deepen history of shallow clone, excluding ref")),
- OPT_BOOL(0, "single-branch", &option_single_branch,
- N_("clone only one branch, HEAD or --branch")),
- OPT_BOOL(0, "no-tags", &option_no_tags,
- N_("don't clone any tags, and make later fetches not to follow them")),
- OPT_BOOL(0, "shallow-submodules", &option_shallow_submodules,
- N_("any cloned submodules will be shallow")),
- OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
- N_("separate git dir from working tree")),
- OPT_STRING(0, "ref-format", &ref_format, N_("format"),
- N_("specify the reference format to use")),
- OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
- N_("set config inside the new repository")),
- OPT_STRING_LIST(0, "server-option", &server_options,
- N_("server-specific"), N_("option to transmit")),
- OPT_IPVERSION(&family),
- OPT_PARSE_LIST_OBJECTS_FILTER(&filter_options),
- OPT_BOOL(0, "also-filter-submodules", &option_filter_submodules,
- N_("apply partial clone filters to submodules")),
- OPT_BOOL(0, "remote-submodules", &option_remote_submodules,
- N_("any cloned submodules will use their remote-tracking branch")),
- OPT_BOOL(0, "sparse", &option_sparse_checkout,
- N_("initialize sparse-checkout file to include only files at root")),
- OPT_STRING(0, "bundle-uri", &bundle_uri,
- N_("uri"), N_("a URI for downloading bundles before fetching from origin remote")),
- OPT_END()
-};
-
static const char *get_repo_path_1(struct strbuf *path, int *is_bundle)
{
static const char *suffix[] = { "/.git", "", ".git/.git", ".git" };
@@ -521,51 +437,31 @@ static struct ref *find_remote_branch(const struct ref *refs, const char *branch
return ref;
}
-static struct ref *wanted_peer_refs(const struct ref *refs,
- struct refspec *refspec)
+static struct ref *wanted_peer_refs(struct clone_opts *opts,
+ const struct ref *refs,
+ struct refspec *refspec)
{
- struct ref *head = copy_ref(find_ref_by_name(refs, "HEAD"));
- struct ref *local_refs = head;
- struct ref **tail = head ? &head->next : &local_refs;
- struct refspec_item tag_refspec;
-
- refspec_item_init(&tag_refspec, TAG_REFSPEC, 0);
-
- if (option_single_branch) {
- struct ref *remote_head = NULL;
-
- if (!option_branch)
- remote_head = guess_remote_head(head, refs, 0);
- else {
- free_one_ref(head);
- local_refs = head = NULL;
- tail = &local_refs;
- remote_head = copy_ref(find_remote_branch(refs, option_branch));
- }
-
- if (!remote_head && option_branch)
- warning(_("Could not find remote branch %s to clone."),
- option_branch);
- else {
- int i;
- for (i = 0; i < refspec->nr; i++)
- get_fetch_map(remote_head, &refspec->items[i],
- &tail, 0);
-
- /* if --branch=tag, pull the requested tag explicitly */
- get_fetch_map(remote_head, &tag_refspec, &tail, 0);
- }
- free_refs(remote_head);
- } else {
- int i;
- for (i = 0; i < refspec->nr; i++)
- get_fetch_map(refs, &refspec->items[i], &tail, 0);
+ struct ref *local_refs = NULL;
+ struct ref **tail = &local_refs;
+ struct ref *to_free = NULL;
+
+ if (opts->wants_head) {
+ struct ref *head = copy_ref(find_ref_by_name(refs, "HEAD"));
+ if (head)
+ tail_link_ref(head, &tail);
+ if (option_single_branch)
+ refs = to_free = guess_remote_head(head, refs, 0);
+ } else if (option_single_branch) {
+ local_refs = NULL;
+ tail = &local_refs;
+ refs = to_free = copy_ref(find_remote_branch(refs, option_branch));
}
- if (!option_mirror && !option_single_branch && !option_no_tags)
- get_fetch_map(refs, &tag_refspec, &tail, 0);
+ for (size_t i = 0; i < refspec->nr; i++)
+ get_fetch_map(refs, &refspec->items[i], &tail, 0);
+
+ free_one_ref(to_free);
- refspec_item_clear(&tag_refspec);
return local_refs;
}
@@ -654,7 +550,7 @@ static void update_remote_refs(const struct ref *refs,
if (refs) {
write_remote_refs(mapped_refs);
- if (option_single_branch && !option_no_tags)
+ if (option_single_branch && option_tags)
write_followtags(refs, msg);
}
@@ -670,11 +566,11 @@ static void update_remote_refs(const struct ref *refs,
}
}
-static void update_head(const struct ref *our, const struct ref *remote,
+static void update_head(struct clone_opts *opts, const struct ref *our, const struct ref *remote,
const char *unborn, const char *msg)
{
const char *head;
- if (our && skip_prefix(our->name, "refs/heads/", &head)) {
+ if (our && !opts->detach && skip_prefix(our->name, "refs/heads/", &head)) {
/* Local default branch link */
if (refs_update_symref(get_main_ref_store(the_repository), "HEAD", our->name, NULL) < 0)
die(_("unable to update HEAD"));
@@ -685,8 +581,9 @@ static void update_head(const struct ref *our, const struct ref *remote,
install_branch_config(0, head, remote_name, our->name);
}
} else if (our) {
- struct commit *c = lookup_commit_reference(the_repository,
- &our->old_oid);
+ struct commit *c = lookup_commit_or_die(&our->old_oid,
+ our->name);
+
/* --branch specifies a non-branch (i.e. tags), detach HEAD */
refs_update_ref(get_main_ref_store(the_repository), msg,
"HEAD", &c->object.oid, NULL, REF_NO_DEREF,
@@ -989,10 +886,108 @@ int cmd_clone(int argc,
int hash_algo;
enum ref_storage_format ref_storage_format = REF_STORAGE_FORMAT_UNKNOWN;
const int do_not_override_repo_unix_permissions = -1;
+ int option_reject_shallow = -1; /* unspecified */
+ int deepen = 0;
+ char *option_template = NULL, *option_depth = NULL, *option_since = NULL;
+ char *option_origin = NULL;
+ struct string_list option_not = STRING_LIST_INIT_NODUP;
+ const char *real_git_dir = NULL;
+ const char *ref_format = NULL;
+ const char *option_upload_pack = "git-upload-pack";
+ int option_progress = -1;
+ int option_sparse_checkout = 0;
+ enum transport_family family = TRANSPORT_FAMILY_ALL;
+ struct string_list option_config = STRING_LIST_INIT_DUP;
+ int option_dissociate = 0;
+ int option_filter_submodules = -1; /* unspecified */
+ struct string_list server_options = STRING_LIST_INIT_NODUP;
+ const char *bundle_uri = NULL;
+ char *option_rev = NULL;
+
+ struct clone_opts opts = CLONE_OPTS_INIT;
struct transport_ls_refs_options transport_ls_refs_options =
TRANSPORT_LS_REFS_OPTIONS_INIT;
+ struct option builtin_clone_options[] = {
+ OPT__VERBOSITY(&option_verbosity),
+ OPT_BOOL(0, "progress", &option_progress,
+ N_("force progress reporting")),
+ OPT_BOOL(0, "reject-shallow", &option_reject_shallow,
+ N_("don't clone shallow repository")),
+ OPT_BOOL('n', "no-checkout", &option_no_checkout,
+ N_("don't create a checkout")),
+ OPT_BOOL(0, "bare", &option_bare, N_("create a bare repository")),
+ OPT_HIDDEN_BOOL(0, "naked", &option_bare,
+ N_("create a bare repository")),
+ OPT_BOOL(0, "mirror", &option_mirror,
+ N_("create a mirror repository (implies --bare)")),
+ OPT_BOOL('l', "local", &option_local,
+ N_("to clone from a local repository")),
+ OPT_BOOL(0, "no-hardlinks", &option_no_hardlinks,
+ N_("don't use local hardlinks, always copy")),
+ OPT_BOOL('s', "shared", &option_shared,
+ N_("setup as shared repository")),
+ { OPTION_CALLBACK, 0, "recurse-submodules", &option_recurse_submodules,
+ N_("pathspec"), N_("initialize submodules in the clone"),
+ PARSE_OPT_OPTARG, recurse_submodules_cb, (intptr_t)"." },
+ OPT_ALIAS(0, "recursive", "recurse-submodules"),
+ OPT_INTEGER('j', "jobs", &max_jobs,
+ N_("number of submodules cloned in parallel")),
+ OPT_STRING(0, "template", &option_template, N_("template-directory"),
+ N_("directory from which templates will be used")),
+ OPT_STRING_LIST(0, "reference", &option_required_reference, N_("repo"),
+ N_("reference repository")),
+ OPT_STRING_LIST(0, "reference-if-able", &option_optional_reference,
+ N_("repo"), N_("reference repository")),
+ OPT_BOOL(0, "dissociate", &option_dissociate,
+ N_("use --reference only while cloning")),
+ OPT_STRING('o', "origin", &option_origin, N_("name"),
+ N_("use <name> instead of 'origin' to track upstream")),
+ OPT_STRING('b', "branch", &option_branch, N_("branch"),
+ N_("checkout <branch> instead of the remote's HEAD")),
+ OPT_STRING(0, "revision", &option_rev, N_("rev"),
+ N_("clone single revision <rev> and check out")),
+ OPT_STRING('u', "upload-pack", &option_upload_pack, N_("path"),
+ N_("path to git-upload-pack on the remote")),
+ OPT_STRING(0, "depth", &option_depth, N_("depth"),
+ N_("create a shallow clone of that depth")),
+ OPT_STRING(0, "shallow-since", &option_since, N_("time"),
+ N_("create a shallow clone since a specific time")),
+ OPT_STRING_LIST(0, "shallow-exclude", &option_not, N_("ref"),
+ N_("deepen history of shallow clone, excluding ref")),
+ OPT_BOOL(0, "single-branch", &option_single_branch,
+ N_("clone only one branch, HEAD or --branch")),
+ OPT_BOOL(0, "tags", &option_tags,
+ N_("clone tags, and make later fetches not to follow them")),
+ OPT_BOOL(0, "shallow-submodules", &option_shallow_submodules,
+ N_("any cloned submodules will be shallow")),
+ OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
+ N_("separate git dir from working tree")),
+ OPT_STRING(0, "ref-format", &ref_format, N_("format"),
+ N_("specify the reference format to use")),
+ OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
+ N_("set config inside the new repository")),
+ OPT_STRING_LIST(0, "server-option", &server_options,
+ N_("server-specific"), N_("option to transmit")),
+ OPT_IPVERSION(&family),
+ OPT_PARSE_LIST_OBJECTS_FILTER(&filter_options),
+ OPT_BOOL(0, "also-filter-submodules", &option_filter_submodules,
+ N_("apply partial clone filters to submodules")),
+ OPT_BOOL(0, "remote-submodules", &option_remote_submodules,
+ N_("any cloned submodules will use their remote-tracking branch")),
+ OPT_BOOL(0, "sparse", &option_sparse_checkout,
+ N_("initialize sparse-checkout file to include only files at root")),
+ OPT_STRING(0, "bundle-uri", &bundle_uri,
+ N_("uri"), N_("a URI for downloading bundles before fetching from origin remote")),
+ OPT_END()
+ };
+
+ const char * const builtin_clone_usage[] = {
+ N_("git clone [<options>] [--] <repo> [<dir>]"),
+ NULL
+ };
+
packet_trace_identity("clone");
git_config(git_clone_config, NULL);
@@ -1019,8 +1014,10 @@ int cmd_clone(int argc,
die(_("unknown ref storage format '%s'"), ref_format);
}
- if (option_mirror)
+ if (option_mirror) {
option_bare = 1;
+ option_tags = 0;
+ }
if (option_bare) {
if (real_git_dir)
@@ -1138,8 +1135,8 @@ int cmd_clone(int argc,
for_each_string_list_item(item, &option_recurse_submodules) {
strbuf_addf(&sb, "submodule.active=%s",
item->string);
- string_list_append(&option_config,
- strbuf_detach(&sb, NULL));
+ string_list_append(&option_config, sb.buf);
+ strbuf_reset(&sb);
}
if (!git_config_get_bool("submodule.stickyRecursiveClone", &val) &&
@@ -1161,6 +1158,8 @@ int cmd_clone(int argc,
string_list_append(&option_config,
"submodule.alternateErrorStrategy=info");
}
+
+ strbuf_release(&sb);
}
/*
@@ -1285,7 +1284,7 @@ int cmd_clone(int argc,
strbuf_addstr(&branch_top, src_ref_prefix);
git_config_set("core.bare", "true");
- } else {
+ } else if (!option_rev) {
strbuf_addf(&branch_top, "refs/remotes/%s/", remote_name);
}
@@ -1293,7 +1292,7 @@ int cmd_clone(int argc,
git_config_set(key.buf, repo);
strbuf_reset(&key);
- if (option_no_tags) {
+ if (!option_tags) {
strbuf_addf(&key, "remote.%s.tagOpt", remote_name);
git_config_set(key.buf, "--no-tags");
strbuf_reset(&key);
@@ -1304,8 +1303,9 @@ int cmd_clone(int argc,
remote = remote_get_early(remote_name);
- refspec_appendf(&remote->fetch, "+%s*:%s*", src_ref_prefix,
- branch_top.buf);
+ if (!option_rev)
+ refspec_appendf(&remote->fetch, "+%s*:%s*", src_ref_prefix,
+ branch_top.buf);
path = get_repo_path(remote->url.v[0], &is_bundle);
is_local = option_local != 0 && path && !is_bundle;
@@ -1348,6 +1348,11 @@ int cmd_clone(int argc,
transport_set_option(transport, TRANS_OPT_KEEP, "yes");
+ die_for_incompatible_opt2(!!option_rev, "--revision",
+ !!option_branch, "--branch");
+ die_for_incompatible_opt2(!!option_rev, "--revision",
+ option_mirror, "--mirror");
+
if (reject_shallow)
transport_set_option(transport, TRANS_OPT_REJECT_SHALLOW, "1");
if (option_depth)
@@ -1359,9 +1364,13 @@ int cmd_clone(int argc,
if (option_not.nr)
transport_set_option(transport, TRANS_OPT_DEEPEN_NOT,
(const char *)&option_not);
- if (option_single_branch)
+ if (option_single_branch) {
transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1");
+ if (option_branch)
+ opts.wants_head = 0;
+ }
+
if (option_upload_pack)
transport_set_option(transport, TRANS_OPT_UPLOADPACK,
option_upload_pack);
@@ -1380,15 +1389,38 @@ int cmd_clone(int argc,
if (transport->smart_options && !deepen && !filter_options.choice)
transport->smart_options->check_self_contained_and_connected = 1;
- strvec_push(&transport_ls_refs_options.ref_prefixes, "HEAD");
+ if (option_rev) {
+ option_tags = 0;
+ option_single_branch = 0;
+ opts.wants_head = 0;
+ opts.detach = 1;
+
+ refspec_append(&remote->fetch, option_rev);
+ }
+
+ if (option_tags || option_branch)
+ /*
+ * Add tags refspec when user asked for tags (implicitly) or
+ * specified --branch, whose argument might be a tag.
+ */
+ refspec_append(&remote->fetch, TAG_REFSPEC);
+
refspec_ref_prefixes(&remote->fetch,
&transport_ls_refs_options.ref_prefixes);
if (option_branch)
expand_ref_prefix(&transport_ls_refs_options.ref_prefixes,
option_branch);
- if (!option_no_tags)
- strvec_push(&transport_ls_refs_options.ref_prefixes,
- "refs/tags/");
+
+ /*
+ * As part of transport_get_remote_refs() the server tells us the hash
+ * algorithm, which we require to initialize the repo. But calling that
+ * function without any ref prefix, will cause the server to announce
+ * all known refs. If the argument passed to --revision was a hex oid,
+ * ref_prefixes will be empty so we fall back to asking about HEAD to
+ * reduce traffic from the server.
+ */
+ if (opts.wants_head || transport_ls_refs_options.ref_prefixes.nr == 0)
+ strvec_push(&transport_ls_refs_options.ref_prefixes, "HEAD");
refs = transport_get_remote_refs(transport, &transport_ls_refs_options);
@@ -1465,7 +1497,7 @@ int cmd_clone(int argc,
}
if (refs)
- mapped_refs = wanted_peer_refs(refs, &remote->fetch);
+ mapped_refs = wanted_peer_refs(&opts, refs, &remote->fetch);
if (mapped_refs) {
/*
@@ -1498,6 +1530,11 @@ int cmd_clone(int argc,
if (!our_head_points_at)
die(_("Remote branch %s not found in upstream %s"),
option_branch, remote_name);
+ } else if (option_rev) {
+ our_head_points_at = mapped_refs;
+ if (!our_head_points_at)
+ die(_("Remote revision %s not found in upstream %s"),
+ option_rev, remote_name);
} else if (remote_head_points_at) {
our_head_points_at = remote_head_points_at;
} else if (remote_head) {
@@ -1536,8 +1573,9 @@ int cmd_clone(int argc,
free(to_free);
}
- write_refspec_config(src_ref_prefix, our_head_points_at,
- remote_head_points_at, &branch_top);
+ if (!option_rev)
+ write_refspec_config(src_ref_prefix, our_head_points_at,
+ remote_head_points_at, &branch_top);
if (filter_options.choice)
partial_clone_register(remote_name, &filter_options);
@@ -1553,7 +1591,7 @@ int cmd_clone(int argc,
branch_top.buf, reflog_msg.buf, transport,
!is_local);
- update_head(our_head_points_at, remote_head, unborn_head, reflog_msg.buf);
+ update_head(&opts, our_head_points_at, remote_head, unborn_head, reflog_msg.buf);
/*
* We want to show progress for recursive submodule clones iff
@@ -1578,6 +1616,10 @@ int cmd_clone(int argc,
err = checkout(submodule_progress, filter_submodules,
ref_storage_format);
+ string_list_clear(&option_not, 0);
+ string_list_clear(&option_config, 0);
+ string_list_clear(&server_options, 0);
+
free(remote_name);
strbuf_release(&reflog_msg);
strbuf_release(&branch_top);
diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c
index bd70d052e7..8ca75262c5 100644
--- a/builtin/commit-graph.c
+++ b/builtin/commit-graph.c
@@ -305,6 +305,7 @@ static int graph_write(int argc, const char **argv, const char *prefix,
oidset_init(&commits, 0);
if (opts.progress)
progress = start_delayed_progress(
+ the_repository,
_("Collecting commits from input"), 0);
while (strbuf_getline(&buf, stdin) != EOF) {
diff --git a/builtin/commit-tree.c b/builtin/commit-tree.c
index 2ca1a57ebb..38457600a4 100644
--- a/builtin/commit-tree.c
+++ b/builtin/commit-tree.c
@@ -119,8 +119,8 @@ int cmd_commit_tree(int argc,
git_config(git_default_config, NULL);
- if (argc < 2 || !strcmp(argv[1], "-h"))
- usage_with_options(commit_tree_usage, options);
+ show_usage_with_options_if_asked(argc, argv,
+ commit_tree_usage, options);
argc = parse_options(argc, argv, prefix, options, commit_tree_usage, 0);
diff --git a/builtin/commit.c b/builtin/commit.c
index ef5e622c07..9fb405dd4a 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -44,7 +44,7 @@
#include "trailer.h"
static const char * const builtin_commit_usage[] = {
- N_("git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n"
+ N_("git commit [-a | --interactive | --patch] [-s] [-v] [-u[<mode>]] [--amend]\n"
" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|reword):]<commit>]\n"
" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n"
" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n"
@@ -1559,8 +1559,8 @@ struct repository *repo UNUSED)
OPT_END(),
};
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(builtin_status_usage, builtin_status_options);
+ show_usage_with_options_if_asked(argc, argv,
+ builtin_status_usage, builtin_status_options);
prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;
@@ -1736,8 +1736,8 @@ int cmd_commit(int argc,
struct strbuf err = STRBUF_INIT;
int ret = 0;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(builtin_commit_usage, builtin_commit_options);
+ show_usage_with_options_if_asked(argc, argv,
+ builtin_commit_usage, builtin_commit_options);
prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;
diff --git a/builtin/credential-cache--daemon.c b/builtin/credential-cache--daemon.c
index bc22f5c6d2..e707618e74 100644
--- a/builtin/credential-cache--daemon.c
+++ b/builtin/credential-cache--daemon.c
@@ -142,9 +142,9 @@ static void serve_one_client(FILE *in, FILE *out)
fprintf(out, "username=%s\n", e->item.username);
if (e->item.password)
fprintf(out, "password=%s\n", e->item.password);
- if (credential_has_capability(&c.capa_authtype, CREDENTIAL_OP_HELPER) && e->item.authtype)
+ if (credential_has_capability(&c.capa_authtype, CREDENTIAL_OP_RESPONSE) && e->item.authtype)
fprintf(out, "authtype=%s\n", e->item.authtype);
- if (credential_has_capability(&c.capa_authtype, CREDENTIAL_OP_HELPER) && e->item.credential)
+ if (credential_has_capability(&c.capa_authtype, CREDENTIAL_OP_RESPONSE) && e->item.credential)
fprintf(out, "credential=%s\n", e->item.credential);
if (e->item.password_expiry_utc != TIME_MAX)
fprintf(out, "password_expiry_utc=%"PRItime"\n",
diff --git a/builtin/credential.c b/builtin/credential.c
index 14c8c6608b..2e11b15dde 100644
--- a/builtin/credential.c
+++ b/builtin/credential.c
@@ -18,7 +18,8 @@ int cmd_credential(int argc,
git_config(git_default_config, NULL);
- if (argc != 2 || !strcmp(argv[1], "-h"))
+ show_usage_if_asked(argc, argv, usage_msg);
+ if (argc != 2)
usage(usage_msg);
op = argv[1];
@@ -32,15 +33,15 @@ int cmd_credential(int argc,
die("unable to read credential from stdin");
if (!strcmp(op, "fill")) {
- credential_fill(&c, 0);
+ credential_fill(the_repository, &c, 0);
credential_next_state(&c);
credential_write(&c, stdout, CREDENTIAL_OP_RESPONSE);
} else if (!strcmp(op, "approve")) {
credential_set_all_capabilities(&c, CREDENTIAL_OP_HELPER);
- credential_approve(&c);
+ credential_approve(the_repository, &c);
} else if (!strcmp(op, "reject")) {
credential_set_all_capabilities(&c, CREDENTIAL_OP_HELPER);
- credential_reject(&c);
+ credential_reject(the_repository, &c);
} else {
usage(usage_msg);
}
diff --git a/builtin/diagnose.c b/builtin/diagnose.c
index 66a22d918e..33c39bd598 100644
--- a/builtin/diagnose.c
+++ b/builtin/diagnose.c
@@ -1,3 +1,5 @@
+#define USE_THE_REPOSITORY_VARIABLE
+
#include "builtin.h"
#include "abspath.h"
#include "gettext.h"
@@ -58,7 +60,7 @@ int cmd_diagnose(int argc,
}
/* Prepare diagnostics */
- if (create_diagnostics_archive(&zip_path, mode))
+ if (create_diagnostics_archive(the_repository, &zip_path, mode))
die_errno(_("unable to create diagnostics archive %s"),
zip_path.buf);
diff --git a/builtin/diff-files.c b/builtin/diff-files.c
index 604b04bb2c..99b1749723 100644
--- a/builtin/diff-files.c
+++ b/builtin/diff-files.c
@@ -29,8 +29,7 @@ int cmd_diff_files(int argc,
int result;
unsigned options = 0;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage(diff_files_usage);
+ show_usage_if_asked(argc, argv, diff_files_usage);
git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
diff --git a/builtin/diff-index.c b/builtin/diff-index.c
index ebc824602e..81c0bc8ed7 100644
--- a/builtin/diff-index.c
+++ b/builtin/diff-index.c
@@ -26,8 +26,7 @@ int cmd_diff_index(int argc,
int i;
int result;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage(diff_cache_usage);
+ show_usage_if_asked(argc, argv, diff_cache_usage);
git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c
index 40804e7b48..e31cc797fe 100644
--- a/builtin/diff-tree.c
+++ b/builtin/diff-tree.c
@@ -122,8 +122,7 @@ int cmd_diff_tree(int argc,
int read_stdin = 0;
int merge_base = 0;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage(diff_tree_usage);
+ show_usage_if_asked(argc, argv, diff_tree_usage);
git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
diff --git a/builtin/difftool.c b/builtin/difftool.c
index 03a8bb92a9..41cd00066c 100644
--- a/builtin/difftool.c
+++ b/builtin/difftool.c
@@ -12,8 +12,6 @@
* Copyright (C) 2016 Johannes Schindelin
*/
-#define USE_THE_REPOSITORY_VARIABLE
-
#include "builtin.h"
#include "abspath.h"
@@ -36,18 +34,27 @@
#include "entry.h"
#include "setup.h"
-static int trust_exit_code;
-
static const char *const builtin_difftool_usage[] = {
N_("git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"),
NULL
};
+struct difftool_options {
+ int has_symlinks;
+ int symlinks;
+ int trust_exit_code;
+};
+
static int difftool_config(const char *var, const char *value,
const struct config_context *ctx, void *cb)
{
+ struct difftool_options *dt_options = (struct difftool_options *)cb;
if (!strcmp(var, "difftool.trustexitcode")) {
- trust_exit_code = git_config_bool(var, value);
+ dt_options->trust_exit_code = git_config_bool(var, value);
+ return 0;
+ }
+ if (!strcmp(var, "core.symlinks")) {
+ dt_options->has_symlinks = git_config_bool(var, value);
return 0;
}
@@ -63,7 +70,8 @@ static int print_tool_help(void)
return run_command(&cmd);
}
-static int parse_index_info(char *p, int *mode1, int *mode2,
+static int parse_index_info(struct repository *repo,
+ char *p, int *mode1, int *mode2,
struct object_id *oid1, struct object_id *oid2,
char *status)
{
@@ -75,11 +83,11 @@ static int parse_index_info(char *p, int *mode1, int *mode2,
*mode2 = (int)strtol(p + 1, &p, 8);
if (*p != ' ')
return error("expected ' ', got '%c'", *p);
- if (parse_oid_hex(++p, oid1, (const char **)&p))
+ if (parse_oid_hex_algop(++p, oid1, (const char **)&p, repo->hash_algo))
return error("expected object ID, got '%s'", p);
if (*p != ' ')
return error("expected ' ', got '%c'", *p);
- if (parse_oid_hex(++p, oid2, (const char **)&p))
+ if (parse_oid_hex_algop(++p, oid2, (const char **)&p, repo->hash_algo))
return error("expected object ID, got '%s'", p);
if (*p != ' ')
return error("expected ' ', got '%c'", *p);
@@ -106,7 +114,8 @@ static void add_path(struct strbuf *buf, size_t base_len, const char *path)
/*
* Determine whether we can simply reuse the file in the worktree.
*/
-static int use_wt_file(const char *workdir, const char *name,
+static int use_wt_file(struct repository *repo,
+ const char *workdir, const char *name,
struct object_id *oid)
{
struct strbuf buf = STRBUF_INIT;
@@ -121,7 +130,7 @@ static int use_wt_file(const char *workdir, const char *name,
int fd = open(buf.buf, O_RDONLY);
if (fd >= 0 &&
- !index_fd(the_repository->index, &wt_oid, fd, &st, OBJ_BLOB, name, 0)) {
+ !index_fd(repo->index, &wt_oid, fd, &st, OBJ_BLOB, name, 0)) {
if (is_null_oid(oid)) {
oidcpy(oid, &wt_oid);
use = 1;
@@ -212,13 +221,14 @@ static int path_entry_cmp(const void *cmp_data UNUSED,
return strcmp(a->path, key ? key : b->path);
}
-static void changed_files(struct hashmap *result, const char *index_path,
+static void changed_files(struct repository *repo,
+ struct hashmap *result, const char *index_path,
const char *workdir)
{
struct child_process update_index = CHILD_PROCESS_INIT;
struct child_process diff_files = CHILD_PROCESS_INIT;
struct strbuf buf = STRBUF_INIT;
- const char *git_dir = absolute_path(repo_get_git_dir(the_repository));
+ const char *git_dir = absolute_path(repo_get_git_dir(repo));
FILE *fp;
strvec_pushl(&update_index.args,
@@ -291,13 +301,15 @@ static int ensure_leading_directories(char *path)
* to compare the readlink(2) result as text, even on a filesystem that is
* capable of doing a symbolic link.
*/
-static char *get_symlink(const struct object_id *oid, const char *path)
+static char *get_symlink(struct repository *repo,
+ struct difftool_options *dt_options,
+ const struct object_id *oid, const char *path)
{
char *data;
if (is_null_oid(oid)) {
/* The symlink is unknown to Git so read from the filesystem */
struct strbuf link = STRBUF_INIT;
- if (has_symlinks) {
+ if (dt_options->has_symlinks) {
if (strbuf_readlink(&link, path, strlen(path)))
die(_("could not read symlink %s"), path);
} else if (strbuf_read_file(&link, path, 128))
@@ -307,8 +319,7 @@ static char *get_symlink(const struct object_id *oid, const char *path)
} else {
enum object_type type;
unsigned long size;
- data = repo_read_object_file(the_repository, oid, &type,
- &size);
+ data = repo_read_object_file(repo, oid, &type, &size);
if (!data)
die(_("could not read object %s for symlink %s"),
oid_to_hex(oid), path);
@@ -355,7 +366,9 @@ static void write_standin_files(struct pair_entry *entry,
write_file_in_directory(rdir, rdir_len, entry->path, entry->right);
}
-static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
+static int run_dir_diff(struct repository *repo,
+ struct difftool_options *dt_options,
+ const char *extcmd, const char *prefix,
struct child_process *child)
{
struct strbuf info = STRBUF_INIT, lpath = STRBUF_INIT;
@@ -375,7 +388,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
struct hashmap symlinks2 = HASHMAP_INIT(pair_cmp, NULL);
struct hashmap_iter iter;
struct pair_entry *entry;
- struct index_state wtindex = INDEX_STATE_INIT(the_repository);
+ struct index_state wtindex = INDEX_STATE_INIT(repo);
struct checkout lstate, rstate;
int err = 0;
struct child_process cmd = CHILD_PROCESS_INIT;
@@ -383,7 +396,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
struct hashmap tmp_modified = HASHMAP_INIT(path_entry_cmp, NULL);
int indices_loaded = 0;
- workdir = repo_get_work_tree(the_repository);
+ workdir = repo_get_work_tree(repo);
/* Setup temp directories */
tmp = getenv("TMPDIR");
@@ -438,8 +451,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
"not supported in\n"
"directory diff mode ('-d' and '--dir-diff')."));
- if (parse_index_info(info.buf, &lmode, &rmode, &loid, &roid,
- &status))
+ if (parse_index_info(repo, info.buf, &lmode, &rmode, &loid, &roid, &status))
break;
if (strbuf_getline_nul(&lpath, fp))
break;
@@ -469,13 +481,13 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
}
if (S_ISLNK(lmode)) {
- char *content = get_symlink(&loid, src_path);
+ char *content = get_symlink(repo, dt_options, &loid, src_path);
add_left_or_right(&symlinks2, src_path, content, 0);
free(content);
}
if (S_ISLNK(rmode)) {
- char *content = get_symlink(&roid, dst_path);
+ char *content = get_symlink(repo, dt_options, &roid, dst_path);
add_left_or_right(&symlinks2, dst_path, content, 1);
free(content);
}
@@ -500,7 +512,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
}
hashmap_add(&working_tree_dups, &entry->entry);
- if (!use_wt_file(workdir, dst_path, &roid)) {
+ if (!use_wt_file(repo, workdir, dst_path, &roid)) {
if (checkout_path(rmode, &roid, dst_path,
&rstate)) {
ret = error("could not write '%s'",
@@ -528,7 +540,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
goto finish;
}
add_path(&wtdir, wtdir_len, dst_path);
- if (symlinks) {
+ if (dt_options->symlinks) {
if (symlink(wtdir.buf, rdir.buf)) {
ret = error_errno("could not symlink '%s' to '%s'", wtdir.buf, rdir.buf);
goto finish;
@@ -614,7 +626,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
if (lstat(rdir.buf, &st))
continue;
- if ((symlinks && S_ISLNK(st.st_mode)) || !S_ISREG(st.st_mode))
+ if ((dt_options->symlinks && S_ISLNK(st.st_mode)) || !S_ISREG(st.st_mode))
continue;
if (!indices_loaded) {
@@ -626,9 +638,9 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
ret = error("could not write %s", buf.buf);
goto finish;
}
- changed_files(&wt_modified, buf.buf, workdir);
+ changed_files(repo, &wt_modified, buf.buf, workdir);
strbuf_setlen(&rdir, rdir_len);
- changed_files(&tmp_modified, buf.buf, rdir.buf);
+ changed_files(repo, &tmp_modified, buf.buf, rdir.buf);
add_path(&rdir, rdir_len, name);
indices_loaded = 1;
}
@@ -702,11 +714,15 @@ static int run_file_diff(int prompt, const char *prefix,
int cmd_difftool(int argc,
const char **argv,
const char *prefix,
- struct repository *repo UNUSED)
+ struct repository *repo)
{
- int use_gui_tool = -1, dir_diff = 0, prompt = -1, symlinks = 0,
- tool_help = 0, no_index = 0;
+ int use_gui_tool = -1, dir_diff = 0, prompt = -1, tool_help = 0, no_index = 0;
static char *difftool_cmd = NULL, *extcmd = NULL;
+ struct difftool_options dt_options = {
+ .has_symlinks = 1,
+ .symlinks = 1,
+ .trust_exit_code = 0
+ };
struct option builtin_difftool_options[] = {
OPT_BOOL('g', "gui", &use_gui_tool,
N_("use `diff.guitool` instead of `diff.tool`")),
@@ -717,14 +733,14 @@ int cmd_difftool(int argc,
0, PARSE_OPT_NONEG),
OPT_SET_INT_F(0, "prompt", &prompt, NULL,
1, PARSE_OPT_NONEG | PARSE_OPT_HIDDEN),
- OPT_BOOL(0, "symlinks", &symlinks,
+ OPT_BOOL(0, "symlinks", &dt_options.symlinks,
N_("use symlinks in dir-diff mode")),
OPT_STRING('t', "tool", &difftool_cmd, N_("tool"),
N_("use the specified diff tool")),
OPT_BOOL(0, "tool-help", &tool_help,
N_("print a list of diff tools that may be used with "
"`--tool`")),
- OPT_BOOL(0, "trust-exit-code", &trust_exit_code,
+ OPT_BOOL(0, "trust-exit-code", &dt_options.trust_exit_code,
N_("make 'git-difftool' exit when an invoked diff "
"tool returns a non-zero exit code")),
OPT_STRING('x', "extcmd", &extcmd, N_("command"),
@@ -734,8 +750,9 @@ int cmd_difftool(int argc,
};
struct child_process child = CHILD_PROCESS_INIT;
- git_config(difftool_config, NULL);
- symlinks = has_symlinks;
+ if (repo)
+ repo_config(repo, difftool_config, &dt_options);
+ dt_options.symlinks = dt_options.has_symlinks;
argc = parse_options(argc, argv, prefix, builtin_difftool_options,
builtin_difftool_usage, PARSE_OPT_KEEP_UNKNOWN_OPT |
@@ -749,8 +766,8 @@ int cmd_difftool(int argc,
if (!no_index){
setup_work_tree();
- setenv(GIT_DIR_ENVIRONMENT, absolute_path(repo_get_git_dir(the_repository)), 1);
- setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(repo_get_work_tree(the_repository)), 1);
+ setenv(GIT_DIR_ENVIRONMENT, absolute_path(repo_get_git_dir(repo)), 1);
+ setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(repo_get_work_tree(repo)), 1);
} else if (dir_diff)
die(_("options '%s' and '%s' cannot be used together"), "--dir-diff", "--no-index");
@@ -783,7 +800,7 @@ int cmd_difftool(int argc,
}
setenv("GIT_DIFFTOOL_TRUST_EXIT_CODE",
- trust_exit_code ? "true" : "false", 1);
+ dt_options.trust_exit_code ? "true" : "false", 1);
/*
* In directory diff mode, 'git-difftool--helper' is called once
@@ -799,6 +816,6 @@ int cmd_difftool(int argc,
strvec_pushv(&child.args, argv);
if (dir_diff)
- return run_dir_diff(extcmd, symlinks, prefix, &child);
+ return run_dir_diff(repo, &dt_options, extcmd, prefix, &child);
return run_file_diff(prompt, prefix, &child);
}
diff --git a/builtin/fast-import.c b/builtin/fast-import.c
index 0f86392761..d6a368a566 100644
--- a/builtin/fast-import.c
+++ b/builtin/fast-import.c
@@ -798,8 +798,8 @@ static const char *create_index(void)
if (c != last)
die("internal consistency error creating the index");
- tmpfile = write_idx_file(NULL, idx, object_count, &pack_idx_opts,
- pack_data->hash);
+ tmpfile = write_idx_file(the_hash_algo, NULL, idx, object_count,
+ &pack_idx_opts, pack_data->hash);
free(idx);
return tmpfile;
}
@@ -878,9 +878,10 @@ static void end_packfile(void)
close_pack_windows(pack_data);
finalize_hashfile(pack_file, cur_pack_oid.hash, FSYNC_COMPONENT_PACK, 0);
- fixup_pack_header_footer(pack_data->pack_fd, pack_data->hash,
- pack_data->pack_name, object_count,
- cur_pack_oid.hash, pack_size);
+ fixup_pack_header_footer(the_hash_algo, pack_data->pack_fd,
+ pack_data->hash, pack_data->pack_name,
+ object_count, cur_pack_oid.hash,
+ pack_size);
if (object_count <= unpack_limit) {
if (!loosen_small_pack(pack_data)) {
@@ -953,15 +954,15 @@ static int store_object(
unsigned char hdr[96];
struct object_id oid;
unsigned long hdrlen, deltalen;
- git_hash_ctx c;
+ struct git_hash_ctx c;
git_zstream s;
hdrlen = format_object_header((char *)hdr, sizeof(hdr), type,
dat->len);
the_hash_algo->init_fn(&c);
- the_hash_algo->update_fn(&c, hdr, hdrlen);
- the_hash_algo->update_fn(&c, dat->buf, dat->len);
- the_hash_algo->final_oid_fn(&oid, &c);
+ git_hash_update(&c, hdr, hdrlen);
+ git_hash_update(&c, dat->buf, dat->len);
+ git_hash_final_oid(&oid, &c);
if (oidout)
oidcpy(oidout, &oid);
@@ -1095,7 +1096,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
struct object_id oid;
unsigned long hdrlen;
off_t offset;
- git_hash_ctx c;
+ struct git_hash_ctx c;
git_zstream s;
struct hashfile_checkpoint checkpoint;
int status = Z_OK;
@@ -1106,14 +1107,14 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
|| (pack_size + PACK_SIZE_THRESHOLD + len) < pack_size)
cycle_packfile();
- the_hash_algo->unsafe_init_fn(&checkpoint.ctx);
+ hashfile_checkpoint_init(pack_file, &checkpoint);
hashfile_checkpoint(pack_file, &checkpoint);
offset = checkpoint.offset;
hdrlen = format_object_header((char *)out_buf, out_sz, OBJ_BLOB, len);
the_hash_algo->init_fn(&c);
- the_hash_algo->update_fn(&c, out_buf, hdrlen);
+ git_hash_update(&c, out_buf, hdrlen);
crc32_begin(pack_file);
@@ -1131,7 +1132,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
if (!n && feof(stdin))
die("EOF in data (%" PRIuMAX " bytes remaining)", len);
- the_hash_algo->update_fn(&c, in_buf, n);
+ git_hash_update(&c, in_buf, n);
s.next_in = in_buf;
s.avail_in = n;
len -= n;
@@ -1157,7 +1158,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
}
}
git_deflate_end(&s);
- the_hash_algo->final_oid_fn(&oid, &c);
+ git_hash_final_oid(&oid, &c);
if (oidout)
oidcpy(oidout, &oid);
@@ -3565,8 +3566,7 @@ int cmd_fast_import(int argc,
{
unsigned int i;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage(fast_import_usage);
+ show_usage_if_asked(argc, argv, fast_import_usage);
reset_pack_idx_option(&pack_idx_opts);
git_pack_config();
diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
index bed2816c2d..d07eec9e55 100644
--- a/builtin/fetch-pack.c
+++ b/builtin/fetch-pack.c
@@ -75,6 +75,8 @@ int cmd_fetch_pack(int argc,
list_objects_filter_init(&args.filter_options);
args.uploadpack = "git-upload-pack";
+ show_usage_if_asked(argc, argv, fetch_pack_usage);
+
for (i = 1; i < argc && *argv[i] == '-'; i++) {
const char *arg = argv[i];
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 2d37a378ba..1c740d5aac 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1588,8 +1588,8 @@ static void set_head_advice_msg(const char *remote, const char *head_name)
N_("Run 'git remote set-head %s %s' to follow the change, or set\n"
"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
"if you do not want to see this message. Specifically running\n"
- "'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
- "until the remote changes HEAD to something else.");
+ "'git config set remote.%s.followRemoteHEAD warn-if-not-branch-%s'\n"
+ "will disable the warning until the remote changes HEAD to something else.");
advise_if_enabled(ADVICE_FETCH_SET_HEAD_WARN, _(message_advice_set_head),
remote, head_name, remote, remote, head_name);
@@ -1617,13 +1617,13 @@ static void report_set_head(const char *remote, const char *head_name,
strbuf_release(&buf_prefix);
}
-static int set_head(const struct ref *remote_refs, int follow_remote_head,
- const char *no_warn_branch)
+static int set_head(const struct ref *remote_refs, struct remote *remote)
{
- int result = 0, create_only, is_bare, was_detached;
+ int result = 0, create_only, baremirror, was_detached;
struct strbuf b_head = STRBUF_INIT, b_remote_head = STRBUF_INIT,
b_local_head = STRBUF_INIT;
- const char *remote = gtransport->remote->name;
+ int follow_remote_head = remote->follow_remote_head;
+ const char *no_warn_branch = remote->no_warn_branch;
char *head_name = NULL;
struct ref *ref, *matches;
struct ref *fetch_map = NULL, **fetch_map_tail = &fetch_map;
@@ -1655,17 +1655,17 @@ static int set_head(const struct ref *remote_refs, int follow_remote_head,
if (!head_name)
goto cleanup;
- is_bare = is_bare_repository();
- create_only = follow_remote_head == FOLLOW_REMOTE_ALWAYS ? 0 : !is_bare;
- if (is_bare) {
+ baremirror = is_bare_repository() && remote->mirror;
+ create_only = follow_remote_head == FOLLOW_REMOTE_ALWAYS ? 0 : !baremirror;
+ if (baremirror) {
strbuf_addstr(&b_head, "HEAD");
strbuf_addf(&b_remote_head, "refs/heads/%s", head_name);
} else {
- strbuf_addf(&b_head, "refs/remotes/%s/HEAD", remote);
- strbuf_addf(&b_remote_head, "refs/remotes/%s/%s", remote, head_name);
+ strbuf_addf(&b_head, "refs/remotes/%s/HEAD", remote->name);
+ strbuf_addf(&b_remote_head, "refs/remotes/%s/%s", remote->name, head_name);
}
/* make sure it's valid */
- if (!is_bare && !refs_ref_exists(refs, b_remote_head.buf)) {
+ if (!baremirror && !refs_ref_exists(refs, b_remote_head.buf)) {
result = 1;
goto cleanup;
}
@@ -1678,7 +1678,7 @@ static int set_head(const struct ref *remote_refs, int follow_remote_head,
if (verbosity >= 0 &&
follow_remote_head == FOLLOW_REMOTE_WARN &&
(!no_warn_branch || strcmp(no_warn_branch, head_name)))
- report_set_head(remote, head_name, &b_local_head, was_detached);
+ report_set_head(remote->name, head_name, &b_local_head, was_detached);
cleanup:
free(head_name);
@@ -1924,8 +1924,7 @@ static int do_fetch(struct transport *transport,
"you need to specify exactly one branch with the --set-upstream option"));
}
}
- if (set_head(remote_refs, transport->remote->follow_remote_head,
- transport->remote->no_warn_branch))
+ if (set_head(remote_refs, transport->remote))
;
/*
* Way too many cases where this can go wrong
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 715745a262..8085ebd8fe 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -108,7 +108,6 @@ int cmd_for_each_ref(int argc,
filter_and_format_refs(&filter, flags, sorting, &format);
ref_filter_clear(&filter);
- ref_format_clear(&format);
ref_sorting_release(sorting);
strvec_clear(&vec);
return 0;
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 0196c54eb6..7a4dcb0716 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -197,7 +197,8 @@ static int traverse_reachable(void)
unsigned int nr = 0;
int result = 0;
if (show_progress)
- progress = start_delayed_progress(_("Checking connectivity"), 0);
+ progress = start_delayed_progress(the_repository,
+ _("Checking connectivity"), 0);
while (pending.nr) {
result |= traverse_one_object(object_array_pop(&pending));
display_progress(progress, ++nr);
@@ -703,7 +704,8 @@ static void fsck_object_dir(const char *path)
fprintf_ln(stderr, _("Checking object directory"));
if (show_progress)
- progress = start_progress(_("Checking object directories"), 256);
+ progress = start_progress(the_repository,
+ _("Checking object directories"), 256);
for_each_loose_file_in_objdir(path, fsck_loose, fsck_cruft, fsck_subdir,
&cb_data);
@@ -879,7 +881,8 @@ static int check_pack_rev_indexes(struct repository *r, int show_progress)
if (show_progress) {
for (struct packed_git *p = get_all_packs(r); p; p = p->next)
pack_count++;
- progress = start_delayed_progress("Verifying reverse pack-indexes", pack_count);
+ progress = start_delayed_progress(the_repository,
+ "Verifying reverse pack-indexes", pack_count);
pack_count = 0;
}
@@ -989,7 +992,8 @@ int cmd_fsck(int argc,
total += p->num_objects;
}
- progress = start_progress(_("Checking objects"), total);
+ progress = start_progress(the_repository,
+ _("Checking objects"), total);
}
for (p = get_all_packs(the_repository); p;
p = p->next) {
diff --git a/builtin/fsmonitor--daemon.c b/builtin/fsmonitor--daemon.c
index 029dc64d6c..0820e524f1 100644
--- a/builtin/fsmonitor--daemon.c
+++ b/builtin/fsmonitor--daemon.c
@@ -1598,8 +1598,8 @@ int cmd_fsmonitor__daemon(int argc, const char **argv, const char *prefix UNUSED
OPT_END()
};
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(builtin_fsmonitor__daemon_usage, options);
+ show_usage_with_options_if_asked(argc, argv,
+ builtin_fsmonitor__daemon_usage, options);
die(_("fsmonitor--daemon not supported on this platform"));
}
diff --git a/builtin/gc.c b/builtin/gc.c
index a9b1c36de2..409d454a4b 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -139,6 +139,7 @@ struct gc_config {
char *prune_worktrees_expire;
char *repack_filter;
char *repack_filter_to;
+ char *repack_expire_to;
unsigned long big_pack_threshold;
unsigned long max_delta_cache_size;
/*
@@ -445,7 +446,8 @@ static int keep_one_pack(struct string_list_item *item, void *data UNUSED)
static void add_repack_all_option(struct gc_config *cfg,
struct string_list *keep_pack)
{
- if (cfg->prune_expire && !strcmp(cfg->prune_expire, "now"))
+ if (cfg->prune_expire && !strcmp(cfg->prune_expire, "now")
+ && !(cfg->cruft_packs && cfg->repack_expire_to))
strvec_push(&repack, "-a");
else if (cfg->cruft_packs) {
strvec_push(&repack, "--cruft");
@@ -454,6 +456,8 @@ static void add_repack_all_option(struct gc_config *cfg,
if (cfg->max_cruft_size)
strvec_pushf(&repack, "--max-cruft-size=%lu",
cfg->max_cruft_size);
+ if (cfg->repack_expire_to)
+ strvec_pushf(&repack, "--expire-to=%s", cfg->repack_expire_to);
} else {
strvec_push(&repack, "-A");
if (cfg->prune_expire)
@@ -688,7 +692,6 @@ struct repository *repo UNUSED)
const char *prune_expire_sentinel = "sentinel";
const char *prune_expire_arg = prune_expire_sentinel;
int ret;
-
struct option builtin_gc_options[] = {
OPT__QUIET(&quiet, N_("suppress progress reporting")),
{ OPTION_STRING, 0, "prune", &prune_expire_arg, N_("date"),
@@ -707,11 +710,13 @@ struct repository *repo UNUSED)
PARSE_OPT_NOCOMPLETE),
OPT_BOOL(0, "keep-largest-pack", &keep_largest_pack,
N_("repack all other packs except the largest pack")),
+ OPT_STRING(0, "expire-to", &cfg.repack_expire_to, N_("dir"),
+ N_("pack prefix to store a pack containing pruned objects")),
OPT_END()
};
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(builtin_gc_usage, builtin_gc_options);
+ show_usage_with_options_if_asked(argc, argv,
+ builtin_gc_usage, builtin_gc_options);
strvec_pushl(&reflog, "reflog", "expire", "--all", NULL);
strvec_pushl(&repack, "repack", "-d", "-l", NULL);
@@ -1909,7 +1914,7 @@ static int get_random_minute(void)
if (getenv("GIT_TEST_MAINT_SCHEDULER"))
return 13;
- return git_rand() % 60;
+ return git_rand(0) % 60;
}
static int is_launchctl_available(void)
diff --git a/builtin/get-tar-commit-id.c b/builtin/get-tar-commit-id.c
index 6bec0d1854..e4cd1627b4 100644
--- a/builtin/get-tar-commit-id.c
+++ b/builtin/get-tar-commit-id.c
@@ -13,7 +13,7 @@ static const char builtin_get_tar_commit_id_usage[] =
#define HEADERSIZE (2 * RECORDSIZE)
int cmd_get_tar_commit_id(int argc,
- const char **argv UNUSED,
+ const char **argv,
const char *prefix,
struct repository *repo UNUSED)
{
@@ -27,6 +27,8 @@ int cmd_get_tar_commit_id(int argc,
BUG_ON_NON_EMPTY_PREFIX(prefix);
+ show_usage_if_asked(argc, argv, builtin_get_tar_commit_id_usage);
+
if (argc != 1)
usage(builtin_get_tar_commit_id_usage);
diff --git a/builtin/grep.c b/builtin/grep.c
index d00ee76f24..d1427290f7 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -1084,7 +1084,7 @@ int cmd_grep(int argc,
}
if (show_in_pager == default_pager)
- show_in_pager = git_pager(1);
+ show_in_pager = git_pager(the_repository, 1);
if (show_in_pager) {
opt.color = 0;
opt.name_only = 1;
@@ -1246,7 +1246,7 @@ int cmd_grep(int argc,
}
if (!show_in_pager && !opt.status_only)
- setup_pager();
+ setup_pager(the_repository);
die_for_incompatible_opt3(!use_index, "--no-index",
untracked, "--untracked",
diff --git a/builtin/help.c b/builtin/help.c
index 05136279cf..c257079ceb 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -658,7 +658,7 @@ int cmd_help(int argc,
case HELP_ACTION_ALL:
opt_mode_usage(argc, "--all", help_format);
if (verbose) {
- setup_pager();
+ setup_pager(the_repository);
list_all_cmds_help(show_external_commands,
show_aliases);
return 0;
@@ -692,7 +692,7 @@ int cmd_help(int argc,
return 0;
case HELP_ACTION_CONFIG:
opt_mode_usage(argc, "--config", help_format);
- setup_pager();
+ setup_pager(the_repository);
list_config_help(SHOW_CONFIG_HUMAN);
printf("\n%s\n", _("'git help config' for more information"));
return 0;
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 0b62b2589f..52cc97d52c 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -151,7 +151,7 @@ static unsigned int input_offset, input_len;
static off_t consumed_bytes;
static off_t max_input_size;
static unsigned deepest_delta;
-static git_hash_ctx input_ctx;
+static struct git_hash_ctx input_ctx;
static uint32_t input_crc32;
static int input_fd, output_fd;
static const char *curr_pack;
@@ -282,7 +282,8 @@ static unsigned check_objects(void)
max = get_max_object_index();
if (verbose)
- progress = start_delayed_progress(_("Checking objects"), max);
+ progress = start_delayed_progress(the_repository,
+ _("Checking objects"), max);
for (i = 0; i < max; i++) {
foreign_nr += check_object(get_indexed_object(i));
@@ -300,7 +301,7 @@ static void flush(void)
if (input_offset) {
if (output_fd >= 0)
write_or_die(output_fd, input_buffer, input_offset);
- the_hash_algo->update_fn(&input_ctx, input_buffer, input_offset);
+ git_hash_update(&input_ctx, input_buffer, input_offset);
memmove(input_buffer, input_buffer + input_offset, input_len);
input_offset = 0;
}
@@ -379,16 +380,18 @@ static const char *open_pack_file(const char *pack_name)
static void parse_pack_header(void)
{
- struct pack_header *hdr = fill(sizeof(struct pack_header));
+ unsigned char *hdr = fill(sizeof(struct pack_header));
/* Header consistency check */
- if (hdr->hdr_signature != htonl(PACK_SIGNATURE))
+ if (get_be32(hdr) != PACK_SIGNATURE)
die(_("pack signature mismatch"));
- if (!pack_version_ok(hdr->hdr_version))
+ hdr += 4;
+ if (!pack_version_ok_native(get_be32(hdr)))
die(_("pack version %"PRIu32" unsupported"),
- ntohl(hdr->hdr_version));
+ get_be32(hdr));
+ hdr += 4;
- nr_objects = ntohl(hdr->hdr_entries);
+ nr_objects = get_be32(hdr);
use(sizeof(struct pack_header));
}
@@ -472,14 +475,14 @@ static void *unpack_entry_data(off_t offset, unsigned long size,
int status;
git_zstream stream;
void *buf;
- git_hash_ctx c;
+ struct git_hash_ctx c;
char hdr[32];
int hdrlen;
if (!is_delta_type(type)) {
hdrlen = format_object_header(hdr, sizeof(hdr), type, size);
the_hash_algo->init_fn(&c);
- the_hash_algo->update_fn(&c, hdr, hdrlen);
+ git_hash_update(&c, hdr, hdrlen);
} else
oid = NULL;
if (type == OBJ_BLOB && size > big_file_threshold)
@@ -499,7 +502,7 @@ static void *unpack_entry_data(off_t offset, unsigned long size,
status = git_inflate(&stream, 0);
use(input_len - stream.avail_in);
if (oid)
- the_hash_algo->update_fn(&c, last_out, stream.next_out - last_out);
+ git_hash_update(&c, last_out, stream.next_out - last_out);
if (buf == fixed_buf) {
stream.next_out = buf;
stream.avail_out = sizeof(fixed_buf);
@@ -509,7 +512,7 @@ static void *unpack_entry_data(off_t offset, unsigned long size,
bad_object(offset, _("inflate returned %d"), status);
git_inflate_end(&stream);
if (oid)
- the_hash_algo->final_oid_fn(oid, &c);
+ git_hash_final_oid(oid, &c);
return buf == fixed_buf ? NULL : buf;
}
@@ -1245,10 +1248,11 @@ static void parse_pack_objects(unsigned char *hash)
struct ofs_delta_entry *ofs_delta = ofs_deltas;
struct object_id ref_delta_oid;
struct stat st;
- git_hash_ctx tmp_ctx;
+ struct git_hash_ctx tmp_ctx;
if (verbose)
progress = start_progress(
+ the_repository,
progress_title ? progress_title :
from_stdin ? _("Receiving objects") : _("Indexing objects"),
nr_objects);
@@ -1282,9 +1286,8 @@ static void parse_pack_objects(unsigned char *hash)
/* Check pack integrity */
flush();
- the_hash_algo->init_fn(&tmp_ctx);
- the_hash_algo->clone_fn(&tmp_ctx, &input_ctx);
- the_hash_algo->final_fn(hash, &tmp_ctx);
+ git_hash_clone(&tmp_ctx, &input_ctx);
+ git_hash_final(hash, &tmp_ctx);
if (!hasheq(fill(the_hash_algo->rawsz), hash, the_repository->hash_algo))
die(_("pack is corrupted (SHA1 mismatch)"));
use(the_hash_algo->rawsz);
@@ -1329,7 +1332,8 @@ static void resolve_deltas(struct pack_idx_option *opts)
QSORT(ref_deltas, nr_ref_deltas, compare_ref_delta_entry);
if (verbose || show_resolving_progress)
- progress = start_progress(_("Resolving deltas"),
+ progress = start_progress(the_repository,
+ _("Resolving deltas"),
nr_ref_deltas + nr_ofs_deltas);
nr_dispatched = 0;
@@ -1387,7 +1391,7 @@ static void conclude_pack(int fix_thin_pack, const char *curr_pack, unsigned cha
strbuf_release(&msg);
finalize_hashfile(f, tail_hash, FSYNC_COMPONENT_PACK, 0);
hashcpy(read_hash, pack_hash, the_repository->hash_algo);
- fixup_pack_header_footer(output_fd, pack_hash,
+ fixup_pack_header_footer(the_hash_algo, output_fd, pack_hash,
curr_pack, nr_objects,
read_hash, consumed_bytes-the_hash_algo->rawsz);
if (!hasheq(read_hash, tail_hash, the_repository->hash_algo))
@@ -1897,8 +1901,7 @@ int cmd_index_pack(int argc,
*/
fetch_if_missing = 0;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage(index_pack_usage);
+ show_usage_if_asked(argc, argv, index_pack_usage);
disable_replace_refs();
fsck_options.walk = mark_link;
@@ -1954,19 +1957,11 @@ int cmd_index_pack(int argc,
warning(_("no threads support, ignoring %s"), arg);
nr_threads = 1;
}
- } else if (starts_with(arg, "--pack_header=")) {
- struct pack_header *hdr;
- char *c;
-
- hdr = (struct pack_header *)input_buffer;
- hdr->hdr_signature = htonl(PACK_SIGNATURE);
- hdr->hdr_version = htonl(strtoul(arg + 14, &c, 10));
- if (*c != ',')
- die(_("bad %s"), arg);
- hdr->hdr_entries = htonl(strtoul(c + 1, &c, 10));
- if (*c)
- die(_("bad %s"), arg);
- input_len = sizeof(*hdr);
+ } else if (skip_prefix(arg, "--pack_header=", &arg)) {
+ if (parse_pack_header_option(arg,
+ input_buffer,
+ &input_len) < 0)
+ die(_("bad --pack_header: %s"), arg);
} else if (!strcmp(arg, "-v")) {
verbose = 1;
} else if (!strcmp(arg, "--progress-title")) {
@@ -2093,11 +2088,12 @@ int cmd_index_pack(int argc,
ALLOC_ARRAY(idx_objects, nr_objects);
for (i = 0; i < nr_objects; i++)
idx_objects[i] = &objects[i].idx;
- curr_index = write_idx_file(index_name, idx_objects, nr_objects, &opts, pack_hash);
+ curr_index = write_idx_file(the_hash_algo, index_name, idx_objects,
+ nr_objects, &opts, pack_hash);
if (rev_index)
- curr_rev_index = write_rev_file(rev_index_name, idx_objects,
- nr_objects, pack_hash,
- opts.flags);
+ curr_rev_index = write_rev_file(the_hash_algo, rev_index_name,
+ idx_objects, nr_objects,
+ pack_hash, opts.flags);
free(idx_objects);
if (!verify)
diff --git a/builtin/log.c b/builtin/log.c
index 75e1b34123..e41f88945e 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -6,7 +6,6 @@
*/
#define USE_THE_REPOSITORY_VARIABLE
-#define DISABLE_SIGN_COMPARE_WARNINGS
#include "builtin.h"
#include "abspath.h"
@@ -209,7 +208,6 @@ static void cmd_log_init_defaults(struct rev_info *rev,
static void set_default_decoration_filter(struct decoration_filter *decoration_filter)
{
- int i;
char *value = NULL;
struct string_list *include = decoration_filter->include_ref_pattern;
const struct string_list *config_exclude;
@@ -243,7 +241,7 @@ static void set_default_decoration_filter(struct decoration_filter *decoration_f
* No command-line or config options were given, so
* populate with sensible defaults.
*/
- for (i = 0; i < ARRAY_SIZE(ref_namespace); i++) {
+ for (size_t i = 0; i < ARRAY_SIZE(ref_namespace); i++) {
if (!ref_namespace[i].decoration)
continue;
@@ -369,7 +367,7 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
if (rev->line_level_traverse)
line_log_init(rev, line_cb.prefix, &line_cb.args);
- setup_pager();
+ setup_pager(the_repository);
}
static void cmd_log_init(int argc, const char **argv, const char *prefix,
@@ -717,14 +715,14 @@ static int show_tag_object(const struct object_id *oid, struct rev_info *rev)
unsigned long size;
enum object_type type;
char *buf = repo_read_object_file(the_repository, oid, &type, &size);
- int offset = 0;
+ unsigned long offset = 0;
if (!buf)
return error(_("could not read object %s"), oid_to_hex(oid));
assert(type == OBJ_TAG);
while (offset < size && buf[offset] != '\n') {
- int new_offset = offset + 1;
+ unsigned long new_offset = offset + 1;
const char *ident;
while (new_offset < size && buf[new_offset++] != '\n')
; /* do nothing */
@@ -1316,24 +1314,25 @@ static void print_signature(const char *signature, FILE *file)
static char *find_branch_name(struct rev_info *rev)
{
- int i, positive = -1;
struct object_id branch_oid;
const struct object_id *tip_oid;
const char *ref, *v;
char *full_ref, *branch = NULL;
+ int interesting_found = 0;
+ size_t idx;
- for (i = 0; i < rev->cmdline.nr; i++) {
+ for (size_t i = 0; i < rev->cmdline.nr; i++) {
if (rev->cmdline.rev[i].flags & UNINTERESTING)
continue;
- if (positive < 0)
- positive = i;
- else
+ if (interesting_found)
return NULL;
+ interesting_found = 1;
+ idx = i;
}
- if (positive < 0)
+ if (!interesting_found)
return NULL;
- ref = rev->cmdline.rev[positive].name;
- tip_oid = &rev->cmdline.rev[positive].item->oid;
+ ref = rev->cmdline.rev[idx].name;
+ tip_oid = &rev->cmdline.rev[idx].item->oid;
if (repo_dwim_ref(the_repository, ref, strlen(ref), &branch_oid,
&full_ref, 0) &&
skip_prefix(full_ref, "refs/heads/", &v) &&
@@ -1746,11 +1745,12 @@ struct base_tree_info {
static struct commit *get_base_commit(const struct format_config *cfg,
struct commit **list,
- int total)
+ size_t total)
{
struct commit *base = NULL;
struct commit **rev;
- int i = 0, rev_nr = 0, auto_select, die_on_failure, ret;
+ int auto_select, die_on_failure, ret;
+ size_t i = 0, rev_nr = 0;
switch (cfg->auto_base) {
case AUTO_BASE_NEVER:
@@ -1885,13 +1885,12 @@ define_commit_slab(commit_base, int);
static void prepare_bases(struct base_tree_info *bases,
struct commit *base,
struct commit **list,
- int total)
+ size_t total)
{
struct commit *commit;
struct rev_info revs;
struct diff_options diffopt;
struct commit_base commit_base;
- int i;
if (!base)
return;
@@ -1906,7 +1905,7 @@ static void prepare_bases(struct base_tree_info *bases,
repo_init_revisions(the_repository, &revs, NULL);
revs.max_parents = 1;
revs.topo_order = 1;
- for (i = 0; i < total; i++) {
+ for (size_t i = 0; i < total; i++) {
list[i]->object.flags &= ~UNINTERESTING;
add_pending_object(&revs, &list[i]->object, "rev_list");
*commit_base_at(&commit_base, list[i]) = 1;
@@ -2007,7 +2006,7 @@ int cmd_format_patch(int argc,
struct rev_info rev;
char *to_free = NULL;
struct setup_revision_opt s_r_opt;
- int nr = 0, total, i;
+ size_t nr = 0, total, i;
int use_stdout = 0;
int start_number = -1;
int just_numbers = 0;
@@ -2183,7 +2182,7 @@ int cmd_format_patch(int argc,
fmt_patch_suffix = cfg.fmt_patch_suffix;
/* Make sure "0000-$sub.patch" gives non-negative length for $sub */
- if (cfg.log.fmt_patch_name_max <= strlen("0000-") + strlen(fmt_patch_suffix))
+ if (cfg.log.fmt_patch_name_max <= cast_size_t_to_int(strlen("0000-") + strlen(fmt_patch_suffix)))
cfg.log.fmt_patch_name_max = strlen("0000-") + strlen(fmt_patch_suffix);
if (cover_from_description_arg)
@@ -2296,7 +2295,7 @@ int cmd_format_patch(int argc,
rev.commit_format = CMIT_FMT_MBOXRD;
if (use_stdout) {
- setup_pager();
+ setup_pager(the_repository);
} else if (!rev.diffopt.close_file) {
int saved;
@@ -2499,12 +2498,16 @@ int cmd_format_patch(int argc,
rev.add_signoff = cfg.do_signoff;
if (show_progress)
- progress = start_delayed_progress(_("Generating patches"), total);
- while (0 <= --nr) {
+ progress = start_delayed_progress(the_repository,
+ _("Generating patches"), total);
+ for (i = 0; i < nr; i++) {
+ size_t idx = nr - i - 1;
int shown;
- display_progress(progress, total - nr);
- commit = list[nr];
- rev.nr = total - nr + (start_number - 1);
+
+ display_progress(progress, total - idx);
+ commit = list[idx];
+ rev.nr = total - idx + (start_number - 1);
+
/* Make the second and subsequent mails replies to the first */
if (cfg.thread) {
/* Have we already had a message ID? */
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 15499cd12b..a4431429b7 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -644,8 +644,8 @@ int cmd_ls_files(int argc,
};
int ret = 0;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(ls_files_usage, builtin_ls_files_options);
+ show_usage_with_options_if_asked(argc, argv,
+ ls_files_usage, builtin_ls_files_options);
prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c
index e17dec27b1..8de7ba7de1 100644
--- a/builtin/mailinfo.c
+++ b/builtin/mailinfo.c
@@ -83,7 +83,7 @@ int cmd_mailinfo(int argc,
OPT_END()
};
- setup_mailinfo(&mi);
+ setup_mailinfo(the_repository, &mi);
meta_charset.policy = CHARSET_DEFAULT;
argc = parse_options(argc, argv, prefix, options, mailinfo_usage, 0);
diff --git a/builtin/mailsplit.c b/builtin/mailsplit.c
index 41dd304731..264df6259a 100644
--- a/builtin/mailsplit.c
+++ b/builtin/mailsplit.c
@@ -284,6 +284,8 @@ int cmd_mailsplit(int argc,
BUG_ON_NON_EMPTY_PREFIX(prefix);
+ show_usage_if_asked(argc, argv, git_mailsplit_usage);
+
for (argp = argv+1; *argp; argp++) {
const char *arg = *argp;
@@ -297,8 +299,6 @@ int cmd_mailsplit(int argc,
continue;
} else if ( arg[1] == 'f' ) {
nr = strtol(arg+2, NULL, 10);
- } else if ( arg[1] == 'h' ) {
- usage(git_mailsplit_usage);
} else if ( arg[1] == 'b' && !arg[2] ) {
allow_bare = 1;
} else if (!strcmp(arg, "--keep-cr")) {
diff --git a/builtin/merge-base.c b/builtin/merge-base.c
index a20c93b11a..123c81515e 100644
--- a/builtin/merge-base.c
+++ b/builtin/merge-base.c
@@ -8,7 +8,7 @@
#include "parse-options.h"
#include "commit-reach.h"
-static int show_merge_base(struct commit **rev, int rev_nr, int show_all)
+static int show_merge_base(struct commit **rev, size_t rev_nr, int show_all)
{
struct commit_list *result = NULL, *r;
@@ -149,7 +149,7 @@ int cmd_merge_base(int argc,
struct repository *repo UNUSED)
{
struct commit **rev;
- int rev_nr = 0;
+ size_t rev_nr = 0;
int show_all = 0;
int cmdmode = 0;
int ret;
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index 342699edb7..3314fb1336 100644
--- a/builtin/merge-index.c
+++ b/builtin/merge-index.c
@@ -75,6 +75,9 @@ static void merge_all(void)
}
}
+static const char usage_string[] =
+"git merge-index [-o] [-q] <merge-program> (-a | [--] [<filename>...])";
+
int cmd_merge_index(int argc,
const char **argv,
const char *prefix UNUSED,
@@ -87,8 +90,10 @@ int cmd_merge_index(int argc,
*/
signal(SIGCHLD, SIG_DFL);
+ show_usage_if_asked(argc, argv, usage_string);
+
if (argc < 3)
- usage("git merge-index [-o] [-q] <merge-program> (-a | [--] [<filename>...])");
+ usage(usage_string);
repo_read_index(the_repository);
diff --git a/builtin/merge-ours.c b/builtin/merge-ours.c
index 3ecd9172f1..97b8a792c7 100644
--- a/builtin/merge-ours.c
+++ b/builtin/merge-ours.c
@@ -23,8 +23,7 @@ int cmd_merge_ours(int argc,
const char *prefix UNUSED,
struct repository *repo UNUSED)
{
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage(builtin_merge_ours_usage);
+ show_usage_if_asked(argc, argv, builtin_merge_ours_usage);
/*
* The contents of the current index becomes the tree we
diff --git a/builtin/merge-recursive.c b/builtin/merge-recursive.c
index 1dd295558b..abfc060e28 100644
--- a/builtin/merge-recursive.c
+++ b/builtin/merge-recursive.c
@@ -38,6 +38,12 @@ int cmd_merge_recursive(int argc,
if (argv[0] && ends_with(argv[0], "-subtree"))
o.subtree_shift = "";
+ if (argc == 2 && !strcmp(argv[1], "-h")) {
+ struct strbuf msg = STRBUF_INIT;
+ strbuf_addf(&msg, builtin_merge_recursive_usage, argv[0]);
+ show_usage_if_asked(argc, argv, msg.buf);
+ }
+
if (argc < 4)
usagef(builtin_merge_recursive_usage, argv[0]);
diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
index 9a6c8b4e4c..3ec7127b3a 100644
--- a/builtin/merge-tree.c
+++ b/builtin/merge-tree.c
@@ -18,6 +18,7 @@
#include "tree.h"
#include "config.h"
#include "strvec.h"
+#include "write-or-die.h"
static int line_termination = '\n';
@@ -575,7 +576,7 @@ int cmd_merge_tree(int argc,
};
/* Init merge options */
- init_ui_merge_options(&o.merge_options, the_repository);
+ init_basic_merge_options(&o.merge_options, the_repository);
/* Parse arguments */
original_argc = argc - 1; /* ignoring argv[0] */
@@ -600,7 +601,6 @@ int cmd_merge_tree(int argc,
line_termination = '\0';
while (strbuf_getline_lf(&buf, stdin) != EOF) {
struct strbuf **split;
- int result;
const char *input_merge_base = NULL;
split = strbuf_split(&buf, ' ');
@@ -617,15 +617,14 @@ int cmd_merge_tree(int argc,
if (input_merge_base && split[2] && split[3] && !split[4]) {
strbuf_rtrim(split[2]);
strbuf_rtrim(split[3]);
- result = real_merge(&o, input_merge_base, split[2]->buf, split[3]->buf, prefix);
+ real_merge(&o, input_merge_base, split[2]->buf, split[3]->buf, prefix);
} else if (!input_merge_base && !split[2]) {
- result = real_merge(&o, NULL, split[0]->buf, split[1]->buf, prefix);
+ real_merge(&o, NULL, split[0]->buf, split[1]->buf, prefix);
} else {
die(_("malformed input line: '%s'."), buf.buf);
}
+ maybe_flush_or_die(stdout, "stdout");
- if (result < 0)
- die(_("merging cannot continue; got unclean result of %d"), result);
strbuf_list_free(split);
}
strbuf_release(&buf);
diff --git a/builtin/merge.c b/builtin/merge.c
index 5f67007bba..ba9faf126a 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -1300,8 +1300,8 @@ int cmd_merge(int argc,
void *branch_to_free;
int orig_argc = argc;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(builtin_merge_usage, builtin_merge_options);
+ show_usage_with_options_if_asked(argc, argv,
+ builtin_merge_usage, builtin_merge_options);
prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 1c3b842651..58a9b16126 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -269,6 +269,43 @@ struct configured_exclusion {
static struct oidmap configured_exclusions;
static struct oidset excluded_by_config;
+static int name_hash_version = -1;
+
+/**
+ * Check whether the name_hash_version chosen by user input is appropriate,
+ * and also validate whether it is compatible with other features.
+ */
+static void validate_name_hash_version(void)
+{
+ if (name_hash_version < 1 || name_hash_version > 2)
+ die(_("invalid --name-hash-version option: %d"), name_hash_version);
+ if (write_bitmap_index && name_hash_version != 1) {
+ warning(_("currently, --write-bitmap-index requires --name-hash-version=1"));
+ name_hash_version = 1;
+ }
+}
+
+static inline uint32_t pack_name_hash_fn(const char *name)
+{
+ static int seen_version = -1;
+
+ if (seen_version < 0)
+ seen_version = name_hash_version;
+ else if (seen_version != name_hash_version)
+ BUG("name hash version changed from %d to %d mid-process",
+ seen_version, name_hash_version);
+
+ switch (name_hash_version) {
+ case 1:
+ return pack_name_hash(name);
+
+ case 2:
+ return pack_name_hash_v2((const unsigned char *)name);
+
+ default:
+ BUG("invalid name-hash version: %d", name_hash_version);
+ }
+}
/*
* stats
@@ -1264,7 +1301,8 @@ static void write_pack_file(void)
struct object_entry **write_order;
if (progress > pack_to_stdout)
- progress_state = start_progress(_("Writing objects"), nr_result);
+ progress_state = start_progress(the_repository,
+ _("Writing objects"), nr_result);
ALLOC_ARRAY(written_list, to_pack.nr_objects);
write_order = compute_write_order();
@@ -1318,8 +1356,9 @@ static void write_pack_file(void)
*/
int fd = finalize_hashfile(f, hash, FSYNC_COMPONENT_PACK, 0);
- fixup_pack_header_footer(fd, hash, pack_tmp_name,
- nr_written, hash, offset);
+ fixup_pack_header_footer(the_hash_algo, fd, hash,
+ pack_tmp_name, nr_written,
+ hash, offset);
close(fd);
if (write_bitmap_index) {
if (write_bitmap_index != WRITE_BITMAP_QUIET)
@@ -1367,9 +1406,10 @@ static void write_pack_file(void)
if (cruft)
pack_idx_opts.flags |= WRITE_MTIMES;
- stage_tmp_packfiles(&tmpname, pack_tmp_name,
- written_list, nr_written,
- &to_pack, &pack_idx_opts, hash,
+ stage_tmp_packfiles(the_hash_algo, &tmpname,
+ pack_tmp_name, written_list,
+ nr_written, &to_pack,
+ &pack_idx_opts, hash,
&idx_tmp_name);
if (write_bitmap_index) {
@@ -1686,7 +1726,7 @@ static int add_object_entry(const struct object_id *oid, enum object_type type,
return 0;
}
- create_object_entry(oid, type, pack_name_hash(name),
+ create_object_entry(oid, type, pack_name_hash_fn(name),
exclude, name && no_try_delta(name),
found_pack, found_offset);
return 1;
@@ -1900,7 +1940,7 @@ static void add_preferred_base_object(const char *name)
{
struct pbase_tree *it;
size_t cmplen;
- unsigned hash = pack_name_hash(name);
+ unsigned hash = pack_name_hash_fn(name);
if (!num_preferred_base || check_pbase_path(hash))
return;
@@ -2400,7 +2440,8 @@ static void get_object_details(void)
struct object_entry **sorted_by_offset;
if (progress)
- progress_state = start_progress(_("Counting objects"),
+ progress_state = start_progress(the_repository,
+ _("Counting objects"),
to_pack.nr_objects);
CALLOC_ARRAY(sorted_by_offset, to_pack.nr_objects);
@@ -3220,7 +3261,8 @@ static void prepare_pack(int window, int depth)
unsigned nr_done = 0;
if (progress)
- progress_state = start_progress(_("Compressing objects"),
+ progress_state = start_progress(the_repository,
+ _("Compressing objects"),
nr_deltas);
QSORT(delta_list, n, type_size_sort);
ll_find_deltas(delta_list, n, window+1, depth, &nr_done);
@@ -3410,7 +3452,7 @@ static void show_object_pack_hint(struct object *object, const char *name,
* here using a now in order to perhaps improve the delta selection
* process.
*/
- oe->hash = pack_name_hash(name);
+ oe->hash = pack_name_hash_fn(name);
oe->no_try_delta = name && no_try_delta(name);
stdin_packs_hints_nr++;
@@ -3560,7 +3602,7 @@ static void add_cruft_object_entry(const struct object_id *oid, enum object_type
entry = packlist_find(&to_pack, oid);
if (entry) {
if (name) {
- entry->hash = pack_name_hash(name);
+ entry->hash = pack_name_hash_fn(name);
entry->no_try_delta = no_try_delta(name);
}
} else {
@@ -3583,7 +3625,7 @@ static void add_cruft_object_entry(const struct object_id *oid, enum object_type
return;
}
- entry = create_object_entry(oid, type, pack_name_hash(name),
+ entry = create_object_entry(oid, type, pack_name_hash_fn(name),
0, name && no_try_delta(name),
pack, offset);
}
@@ -3648,7 +3690,8 @@ static void add_objects_in_unpacked_packs(void);
static void enumerate_cruft_objects(void)
{
if (progress)
- progress_state = start_progress(_("Enumerating cruft objects"), 0);
+ progress_state = start_progress(the_repository,
+ _("Enumerating cruft objects"), 0);
add_objects_in_unpacked_packs();
add_unreachable_loose_objects();
@@ -3674,7 +3717,8 @@ static void enumerate_and_traverse_cruft_objects(struct string_list *fresh_packs
revs.ignore_missing_links = 1;
if (progress)
- progress_state = start_progress(_("Enumerating cruft objects"), 0);
+ progress_state = start_progress(the_repository,
+ _("Enumerating cruft objects"), 0);
ret = add_unseen_recent_objects_to_traversal(&revs, cruft_expiration,
set_cruft_mtime, 1);
stop_progress(&progress_state);
@@ -3693,7 +3737,8 @@ static void enumerate_and_traverse_cruft_objects(struct string_list *fresh_packs
if (prepare_revision_walk(&revs))
die(_("revision walk setup failed"));
if (progress)
- progress_state = start_progress(_("Traversing cruft objects"), 0);
+ progress_state = start_progress(the_repository,
+ _("Traversing cruft objects"), 0);
nr_seen = 0;
traverse_commit_list(&revs, show_cruft_commit, show_cruft_object, NULL);
@@ -4060,6 +4105,15 @@ static int get_object_list_from_bitmap(struct rev_info *revs)
if (!(bitmap_git = prepare_bitmap_walk(revs, 0)))
return -1;
+ /*
+ * For now, force the name-hash version to be 1 since that
+ * is the version implied by the bitmap format. Later, the
+ * format can include this version explicitly in its format,
+ * allowing readers to know the version that was used during
+ * the bitmap write.
+ */
+ name_hash_version = 1;
+
if (pack_options_allow_reuse())
reuse_partial_packfile_from_bitmap(bitmap_git,
&reuse_packfiles,
@@ -4435,6 +4489,8 @@ int cmd_pack_objects(int argc,
OPT_STRING_LIST(0, "uri-protocol", &uri_protocols,
N_("protocol"),
N_("exclude any configured uploadpack.blobpackfileuri with this protocol")),
+ OPT_INTEGER(0, "name-hash-version", &name_hash_version,
+ N_("use the specified name-hash function to group similar objects")),
OPT_END(),
};
@@ -4590,6 +4646,11 @@ int cmd_pack_objects(int argc,
if (pack_to_stdout || !rev_list_all)
write_bitmap_index = 0;
+ if (name_hash_version < 0)
+ name_hash_version = (int)git_env_ulong("GIT_TEST_NAME_HASH_VERSION", 1);
+
+ validate_name_hash_version();
+
if (use_delta_islands)
strvec_push(&rp, "--topo-order");
@@ -4625,7 +4686,8 @@ int cmd_pack_objects(int argc,
prepare_packing_data(the_repository, &to_pack);
if (progress && !cruft)
- progress_state = start_progress(_("Enumerating objects"), 0);
+ progress_state = start_progress(the_repository,
+ _("Enumerating objects"), 0);
if (stdin_packs) {
/* avoids adding objects in excluded packs */
ignore_packed_keep_in_core = 1;
diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c
index e046575871..3febe732f8 100644
--- a/builtin/pack-redundant.c
+++ b/builtin/pack-redundant.c
@@ -595,8 +595,7 @@ int cmd_pack_redundant(int argc, const char **argv, const char *prefix UNUSED, s
struct strbuf idx_name = STRBUF_INIT;
char buf[GIT_MAX_HEXSZ + 2]; /* hex hash + \n + \0 */
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage(pack_redundant_usage);
+ show_usage_if_asked(argc, argv, pack_redundant_usage);
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
diff --git a/builtin/patch-id.c b/builtin/patch-id.c
index f540d8daa7..cdef2ec10a 100644
--- a/builtin/patch-id.c
+++ b/builtin/patch-id.c
@@ -70,7 +70,7 @@ static size_t get_one_patchid(struct object_id *next_oid, struct object_id *resu
int before = -1, after = -1;
int diff_is_binary = 0;
char pre_oid_str[GIT_MAX_HEXSZ + 1], post_oid_str[GIT_MAX_HEXSZ + 1];
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
the_hash_algo->init_fn(&ctx);
oidclr(result, the_repository->hash_algo);
@@ -85,7 +85,7 @@ static size_t get_one_patchid(struct object_id *next_oid, struct object_id *resu
!skip_prefix(line, "From ", &p) &&
starts_with(line, "\\ ") && 12 < strlen(line)) {
if (verbatim)
- the_hash_algo->update_fn(&ctx, line, strlen(line));
+ git_hash_update(&ctx, line, strlen(line));
continue;
}
@@ -104,10 +104,10 @@ static size_t get_one_patchid(struct object_id *next_oid, struct object_id *resu
starts_with(line, "Binary files")) {
diff_is_binary = 1;
before = 0;
- the_hash_algo->update_fn(&ctx, pre_oid_str,
- strlen(pre_oid_str));
- the_hash_algo->update_fn(&ctx, post_oid_str,
- strlen(post_oid_str));
+ git_hash_update(&ctx, pre_oid_str,
+ strlen(pre_oid_str));
+ git_hash_update(&ctx, post_oid_str,
+ strlen(post_oid_str));
if (stable)
flush_one_hunk(result, &ctx);
continue;
@@ -165,7 +165,7 @@ static size_t get_one_patchid(struct object_id *next_oid, struct object_id *resu
/* Add line to hash algo (possibly removing whitespace) */
len = verbatim ? strlen(line) : remove_space(line);
patchlen += len;
- the_hash_algo->update_fn(&ctx, line, len);
+ git_hash_update(&ctx, line, len);
}
if (!found_next)
diff --git a/builtin/prune.c b/builtin/prune.c
index aeff9ca1b3..1c357fffd8 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -64,7 +64,8 @@ static void perform_reachability_traversal(struct rev_info *revs)
return;
if (show_progress)
- progress = start_delayed_progress(_("Checking connectivity"), 0);
+ progress = start_delayed_progress(the_repository,
+ _("Checking connectivity"), 0);
mark_reachable_objects(revs, 1, expire, progress);
stop_progress(&progress);
initialized = 1;
diff --git a/builtin/push.c b/builtin/push.c
index 90de3746b5..92d530e5c4 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -78,7 +78,7 @@ static void refspec_append_mapped(struct refspec *refspec, const char *ref,
.src = matched->name,
};
- if (!query_refspecs(&remote->push, &query) && query.dst) {
+ if (!refspec_find_match(&remote->push, &query) && query.dst) {
refspec_appendf(refspec, "%s%s:%s",
query.force ? "+" : "",
query.src, query.dst);
diff --git a/builtin/rebase.c b/builtin/rebase.c
index 0498fff3c9..6c9eaf3788 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -1223,9 +1223,9 @@ int cmd_rebase(int argc,
};
int i;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(builtin_rebase_usage,
- builtin_rebase_options);
+ show_usage_with_options_if_asked(argc, argv,
+ builtin_rebase_usage,
+ builtin_rebase_options);
prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index c2e9103f11..129305700c 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -174,7 +174,7 @@ static int receive_pack_config(const char *var, const char *value,
char *path;
if (git_config_pathname(&path, var, value))
- return 1;
+ return -1;
strbuf_addf(&fsck_msg_types, "%cskiplist=%s",
fsck_msg_types.len ? ',' : '=', path);
free(path);
@@ -566,14 +566,14 @@ static void hmac_hash(unsigned char *out,
unsigned char k_ipad[GIT_MAX_BLKSZ];
unsigned char k_opad[GIT_MAX_BLKSZ];
int i;
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
/* RFC 2104 2. (1) */
memset(key, '\0', GIT_MAX_BLKSZ);
if (the_hash_algo->blksz < key_len) {
the_hash_algo->init_fn(&ctx);
- the_hash_algo->update_fn(&ctx, key_in, key_len);
- the_hash_algo->final_fn(key, &ctx);
+ git_hash_update(&ctx, key_in, key_len);
+ git_hash_final(key, &ctx);
} else {
memcpy(key, key_in, key_len);
}
@@ -586,15 +586,15 @@ static void hmac_hash(unsigned char *out,
/* RFC 2104 2. (3) & (4) */
the_hash_algo->init_fn(&ctx);
- the_hash_algo->update_fn(&ctx, k_ipad, sizeof(k_ipad));
- the_hash_algo->update_fn(&ctx, text, text_len);
- the_hash_algo->final_fn(out, &ctx);
+ git_hash_update(&ctx, k_ipad, sizeof(k_ipad));
+ git_hash_update(&ctx, text, text_len);
+ git_hash_final(out, &ctx);
/* RFC 2104 2. (6) & (7) */
the_hash_algo->init_fn(&ctx);
- the_hash_algo->update_fn(&ctx, k_opad, sizeof(k_opad));
- the_hash_algo->update_fn(&ctx, out, the_hash_algo->rawsz);
- the_hash_algo->final_fn(out, &ctx);
+ git_hash_update(&ctx, k_opad, sizeof(k_opad));
+ git_hash_update(&ctx, out, the_hash_algo->rawsz);
+ git_hash_final(out, &ctx);
}
static char *prepare_push_cert_nonce(const char *path, timestamp_t stamp)
@@ -2239,7 +2239,7 @@ static const char *unpack(int err_fd, struct shallow_info *si)
strvec_push(&child.args, alt_shallow_file);
}
- tmp_objdir = tmp_objdir_create("incoming");
+ tmp_objdir = tmp_objdir_create(the_repository, "incoming");
if (!tmp_objdir) {
if (err_fd > 0)
close(err_fd);
@@ -2304,7 +2304,7 @@ static const char *unpack(int err_fd, struct shallow_info *si)
if (status)
return "index-pack fork failed";
- lockfile = index_pack_lockfile(child.out, NULL);
+ lockfile = index_pack_lockfile(the_repository, child.out, NULL);
if (lockfile) {
pack_lockfile = register_tempfile(lockfile);
free(lockfile);
@@ -2628,7 +2628,7 @@ int cmd_receive_pack(int argc,
}
}
if (auto_update_server_info)
- update_server_info(0);
+ update_server_info(the_repository, 0);
clear_shallow_info(&si);
}
if (use_sideband)
diff --git a/builtin/remote-ext.c b/builtin/remote-ext.c
index 33c8ae0fc7..bd2037f27d 100644
--- a/builtin/remote-ext.c
+++ b/builtin/remote-ext.c
@@ -202,6 +202,8 @@ int cmd_remote_ext(int argc,
{
BUG_ON_NON_EMPTY_PREFIX(prefix);
+ show_usage_if_asked(argc, argv, usage_msg);
+
if (argc != 3)
usage(usage_msg);
diff --git a/builtin/remote-fd.c b/builtin/remote-fd.c
index ae896eda57..39908546ba 100644
--- a/builtin/remote-fd.c
+++ b/builtin/remote-fd.c
@@ -64,6 +64,7 @@ int cmd_remote_fd(int argc,
BUG_ON_NON_EMPTY_PREFIX(prefix);
+ show_usage_if_asked(argc, argv, usage_msg);
if (argc != 3)
usage(usage_msg);
diff --git a/builtin/remote.c b/builtin/remote.c
index 0435963286..816d482340 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -383,7 +383,7 @@ static int get_ref_states(const struct ref *remote_refs, struct ref_states *stat
states->remote->fetch.items[i].raw);
for (ref = fetch_map; ref; ref = ref->next) {
- if (omit_name_by_refspec(ref->name, &states->remote->fetch))
+ if (refname_matches_negative_refspec_item(ref->name, &states->remote->fetch))
string_list_append(&states->skipped, abbrev_branch(ref->name));
else if (!ref->peer_ref || !refs_ref_exists(get_main_ref_store(the_repository), ref->peer_ref->name))
string_list_append(&states->new_refs, abbrev_branch(ref->name));
@@ -642,10 +642,12 @@ static int migrate_file(struct remote *remote)
strbuf_addf(&buf, "remote.%s.fetch", remote->name);
for (i = 0; i < remote->fetch.nr; i++)
git_config_set_multivar(buf.buf, remote->fetch.items[i].raw, "^$", 0);
+#ifndef WITH_BREAKING_CHANGES
if (remote->origin == REMOTE_REMOTES)
unlink_or_warn(git_path("remotes/%s", remote->name));
else if (remote->origin == REMOTE_BRANCHES)
unlink_or_warn(git_path("branches/%s", remote->name));
+#endif /* WITH_BREAKING_CHANGES */
strbuf_release(&buf);
return 0;
@@ -820,7 +822,8 @@ static int mv(int argc, const char **argv, const char *prefix,
* Count symrefs twice, since "renaming" them is done by
* deleting and recreating them in two separate passes.
*/
- progress = start_progress(_("Renaming remote references"),
+ progress = start_progress(the_repository,
+ _("Renaming remote references"),
rename.remote_branches->nr + rename.symrefs_nr);
}
for (i = 0; i < remote_branches.nr; i++) {
diff --git a/builtin/repack.c b/builtin/repack.c
index 0c6dad7df4..75e3752353 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -41,7 +41,9 @@ static int run_update_server_info = 1;
static char *packdir, *packtmp_name, *packtmp;
static const char *const git_repack_usage[] = {
- N_("git repack [<options>]"),
+ N_("git repack [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m]\n"
+ "[--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>]\n"
+ "[--write-midx] [--name-hash-version=<n>]"),
NULL
};
@@ -60,6 +62,7 @@ struct pack_objects_args {
int no_reuse_object;
int quiet;
int local;
+ int name_hash_version;
struct list_objects_filter_options filter_options;
};
@@ -308,6 +311,8 @@ static void prepare_pack_objects(struct child_process *cmd,
strvec_pushf(&cmd->args, "--no-reuse-delta");
if (args->no_reuse_object)
strvec_pushf(&cmd->args, "--no-reuse-object");
+ if (args->name_hash_version)
+ strvec_pushf(&cmd->args, "--name-hash-version=%d", args->name_hash_version);
if (args->local)
strvec_push(&cmd->args, "--local");
if (args->quiet)
@@ -1205,6 +1210,8 @@ int cmd_repack(int argc,
N_("pass --no-reuse-delta to git-pack-objects")),
OPT_BOOL('F', NULL, &po_args.no_reuse_object,
N_("pass --no-reuse-object to git-pack-objects")),
+ OPT_INTEGER(0, "name-hash-version", &po_args.name_hash_version,
+ N_("specify the name hash version to use for grouping similar objects by path")),
OPT_NEGBIT('n', NULL, &run_update_server_info,
N_("do not run git-update-server-info"), 1),
OPT__QUIET(&po_args.quiet, N_("be quiet")),
@@ -1370,9 +1377,12 @@ int cmd_repack(int argc,
"--unpack-unreachable");
} else if (keep_unreachable) {
strvec_push(&cmd.args, "--keep-unreachable");
- strvec_push(&cmd.args, "--pack-loose-unreachable");
}
}
+
+ if (keep_unreachable && delete_redundant &&
+ !(pack_everything & PACK_CRUFT))
+ strvec_push(&cmd.args, "--pack-loose-unreachable");
} else if (geometry.split_factor) {
strvec_push(&cmd.args, "--stdin-packs");
strvec_push(&cmd.args, "--unpacked");
@@ -1565,7 +1575,7 @@ int cmd_repack(int argc,
}
if (run_update_server_info)
- update_server_info(0);
+ update_server_info(the_repository, 0);
if (git_env_bool(GIT_TEST_MULTI_PACK_INDEX, 0)) {
unsigned flags = 0;
diff --git a/builtin/replay.c b/builtin/replay.c
index 1afc6d1ee0..032c172b65 100644
--- a/builtin/replay.c
+++ b/builtin/replay.c
@@ -163,9 +163,10 @@ static void determine_replay_mode(struct rev_cmdline_info *cmd_info,
get_ref_information(cmd_info, &rinfo);
if (!rinfo.positive_refexprs)
die(_("need some commits to replay"));
- if (onto_name && *advance_name)
- die(_("--onto and --advance are incompatible"));
- else if (onto_name) {
+
+ die_for_incompatible_opt2(!!onto_name, "--onto",
+ !!*advance_name, "--advance");
+ if (onto_name) {
*onto = peel_committish(onto_name);
if (rinfo.positive_refexprs <
strset_get_size(&rinfo.positive_refs))
diff --git a/builtin/rev-list.c b/builtin/rev-list.c
index 3196da7b2d..bb26bee0d4 100644
--- a/builtin/rev-list.c
+++ b/builtin/rev-list.c
@@ -22,7 +22,10 @@
#include "progress.h"
#include "reflog-walk.h"
#include "oidset.h"
+#include "oidmap.h"
#include "packfile.h"
+#include "quote.h"
+#include "strbuf.h"
static const char rev_list_usage[] =
"git rev-list [<options>] <commit>... [--] [<path>...]\n"
@@ -73,11 +76,17 @@ static unsigned progress_counter;
static struct oidset omitted_objects;
static int arg_print_omitted; /* print objects omitted by filter */
-static struct oidset missing_objects;
+struct missing_objects_map_entry {
+ struct oidmap_entry entry;
+ const char *path;
+ unsigned type;
+};
+static struct oidmap missing_objects;
enum missing_action {
MA_ERROR = 0, /* fail if any missing objects are encountered */
MA_ALLOW_ANY, /* silently allow ALL missing objects */
MA_PRINT, /* print ALL missing objects in special section */
+ MA_PRINT_INFO, /* same as MA_PRINT but also prints missing object info */
MA_ALLOW_PROMISOR, /* silently allow all missing PROMISOR objects */
};
static enum missing_action arg_missing_action;
@@ -101,7 +110,49 @@ static off_t get_object_disk_usage(struct object *obj)
return size;
}
-static inline void finish_object__ma(struct object *obj)
+static void add_missing_object_entry(struct object_id *oid, const char *path,
+ unsigned type)
+{
+ struct missing_objects_map_entry *entry;
+
+ if (oidmap_get(&missing_objects, oid))
+ return;
+
+ CALLOC_ARRAY(entry, 1);
+ entry->entry.oid = *oid;
+ entry->type = type;
+ if (path)
+ entry->path = xstrdup(path);
+ oidmap_put(&missing_objects, entry);
+}
+
+static void print_missing_object(struct missing_objects_map_entry *entry,
+ int print_missing_info)
+{
+ struct strbuf sb = STRBUF_INIT;
+
+ if (!print_missing_info) {
+ printf("?%s\n", oid_to_hex(&entry->entry.oid));
+ return;
+ }
+
+ if (entry->path && *entry->path) {
+ struct strbuf path = STRBUF_INIT;
+
+ strbuf_addstr(&sb, " path=");
+ quote_path(entry->path, NULL, &path, QUOTE_PATH_QUOTE_SP);
+ strbuf_addbuf(&sb, &path);
+
+ strbuf_release(&path);
+ }
+ if (entry->type)
+ strbuf_addf(&sb, " type=%s", type_name(entry->type));
+
+ printf("?%s%s\n", oid_to_hex(&entry->entry.oid), sb.buf);
+ strbuf_release(&sb);
+}
+
+static inline void finish_object__ma(struct object *obj, const char *name)
{
/*
* Whether or not we try to dynamically fetch missing objects
@@ -119,7 +170,8 @@ static inline void finish_object__ma(struct object *obj)
return;
case MA_PRINT:
- oidset_insert(&missing_objects, &obj->oid);
+ case MA_PRINT_INFO:
+ add_missing_object_entry(&obj->oid, name, obj->type);
return;
case MA_ALLOW_PROMISOR:
@@ -152,7 +204,7 @@ static void show_commit(struct commit *commit, void *data)
if (revs->do_not_die_on_missing_objects &&
oidset_contains(&revs->missing_commits, &commit->object.oid)) {
- finish_object__ma(&commit->object);
+ finish_object__ma(&commit->object, NULL);
return;
}
@@ -268,12 +320,11 @@ static void show_commit(struct commit *commit, void *data)
finish_commit(commit);
}
-static int finish_object(struct object *obj, const char *name UNUSED,
- void *cb_data)
+static int finish_object(struct object *obj, const char *name, void *cb_data)
{
struct rev_list_info *info = cb_data;
if (oid_object_info_extended(the_repository, &obj->oid, NULL, 0) < 0) {
- finish_object__ma(obj);
+ finish_object__ma(obj, name);
return 1;
}
if (info->revs->verify_objects && !obj->parsed && obj->type != OBJ_COMMIT)
@@ -414,6 +465,12 @@ static inline int parse_missing_action_value(const char *value)
return 1;
}
+ if (!strcmp(value, "print-info")) {
+ arg_missing_action = MA_PRINT_INFO;
+ fetch_if_missing = 0;
+ return 1;
+ }
+
if (!strcmp(value, "allow-promisor")) {
arg_missing_action = MA_ALLOW_PROMISOR;
fetch_if_missing = 0;
@@ -542,8 +599,7 @@ int cmd_rev_list(int argc,
const char *show_progress = NULL;
int ret = 0;
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage(rev_list_usage);
+ show_usage_if_asked(argc, argv, rev_list_usage);
git_config(git_default_config, NULL);
repo_init_revisions(the_repository, &revs, prefix);
@@ -735,7 +791,8 @@ int cmd_rev_list(int argc,
revs.limited = 1;
if (show_progress)
- progress = start_delayed_progress(show_progress, 0);
+ progress = start_delayed_progress(the_repository,
+ show_progress, 0);
if (use_bitmap_index) {
if (!try_bitmap_count(&revs, filter_provided_objects))
@@ -781,10 +838,18 @@ int cmd_rev_list(int argc,
if (arg_print_omitted)
oidset_init(&omitted_objects, DEFAULT_OIDSET_SIZE);
- if (arg_missing_action == MA_PRINT) {
- oidset_init(&missing_objects, DEFAULT_OIDSET_SIZE);
+ if (arg_missing_action == MA_PRINT ||
+ arg_missing_action == MA_PRINT_INFO) {
+ struct oidset_iter iter;
+ struct object_id *oid;
+
+ oidmap_init(&missing_objects, DEFAULT_OIDSET_SIZE);
+ oidset_iter_init(&revs.missing_commits, &iter);
+
/* Add missing tips */
- oidset_insert_from_set(&missing_objects, &revs.missing_commits);
+ while ((oid = oidset_iter_next(&iter)))
+ add_missing_object_entry(oid, NULL, 0);
+
oidset_clear(&revs.missing_commits);
}
@@ -800,13 +865,20 @@ int cmd_rev_list(int argc,
printf("~%s\n", oid_to_hex(oid));
oidset_clear(&omitted_objects);
}
- if (arg_missing_action == MA_PRINT) {
- struct oidset_iter iter;
- struct object_id *oid;
- oidset_iter_init(&missing_objects, &iter);
- while ((oid = oidset_iter_next(&iter)))
- printf("?%s\n", oid_to_hex(oid));
- oidset_clear(&missing_objects);
+ if (arg_missing_action == MA_PRINT ||
+ arg_missing_action == MA_PRINT_INFO) {
+ struct missing_objects_map_entry *entry;
+ struct oidmap_iter iter;
+
+ oidmap_iter_init(&missing_objects, &iter);
+
+ while ((entry = oidmap_iter_next(&iter))) {
+ print_missing_object(entry, arg_missing_action ==
+ MA_PRINT_INFO);
+ free((void *)entry->path);
+ }
+
+ oidmap_free(&missing_objects, true);
}
stop_progress(&progress);
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 949747a6b6..428c866c05 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -713,6 +713,8 @@ int cmd_rev_parse(int argc,
int seen_end_of_options = 0;
enum format_type format = FORMAT_DEFAULT;
+ show_usage_if_asked(argc, argv, builtin_rev_parse_usage);
+
if (argc > 1 && !strcmp("--parseopt", argv[1]))
return cmd_parseopt(argc - 1, argv + 1, prefix);
diff --git a/builtin/send-pack.c b/builtin/send-pack.c
index 59b626aae8..8d461008e2 100644
--- a/builtin/send-pack.c
+++ b/builtin/send-pack.c
@@ -317,7 +317,7 @@ int cmd_send_pack(int argc,
set_ref_status_for_push(remote_refs, args.send_mirror,
args.force_update);
- ret = send_pack(&args, fd, conn, remote_refs, &extra_have);
+ ret = send_pack(the_repository, &args, fd, conn, remote_refs, &extra_have);
if (helper_status)
print_helper_status(remote_refs);
diff --git a/builtin/show-index.c b/builtin/show-index.c
index 756d632b51..9d4ecf5e7b 100644
--- a/builtin/show-index.c
+++ b/builtin/show-index.c
@@ -9,7 +9,7 @@
#include "parse-options.h"
static const char *const show_index_usage[] = {
- "git show-index [--object-format=<hash-algorithm>]",
+ "git show-index [--object-format=<hash-algorithm>] < <pack-idx-file>",
NULL
};
diff --git a/builtin/tag.c b/builtin/tag.c
index c4bd145831..e8a344b926 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -698,7 +698,6 @@ int cmd_tag(int argc,
cleanup:
ref_sorting_release(sorting);
ref_filter_clear(&filter);
- ref_format_clear(&format);
strbuf_release(&buf);
strbuf_release(&ref);
strbuf_release(&reflog_msg);
diff --git a/builtin/unpack-file.c b/builtin/unpack-file.c
index 6da2825753..fb5fcbc40a 100644
--- a/builtin/unpack-file.c
+++ b/builtin/unpack-file.c
@@ -26,6 +26,9 @@ static char *create_temp_file(struct object_id *oid)
return path;
}
+static const char usage_msg[] =
+"git unpack-file <blob>";
+
int cmd_unpack_file(int argc,
const char **argv,
const char *prefix UNUSED,
@@ -33,8 +36,9 @@ int cmd_unpack_file(int argc,
{
struct object_id oid;
- if (argc != 2 || !strcmp(argv[1], "-h"))
- usage("git unpack-file <blob>");
+ show_usage_if_asked(argc, argv, usage_msg);
+ if (argc != 2)
+ usage(usage_msg);
if (repo_get_oid(the_repository, argv[1], &oid))
die("Not a valid object name %s", argv[1]);
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index 2197d6d933..8383bcf404 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -18,6 +18,7 @@
#include "progress.h"
#include "decorate.h"
#include "fsck.h"
+#include "packfile.h"
static int dry_run, quiet, recover, has_errors, strict;
static const char unpack_usage[] = "git unpack-objects [-n] [-q] [-r] [--strict]";
@@ -27,7 +28,7 @@ static unsigned char buffer[4096];
static unsigned int offset, len;
static off_t consumed_bytes;
static off_t max_input_size;
-static git_hash_ctx ctx;
+static struct git_hash_ctx ctx;
static struct fsck_options fsck_options = FSCK_OPTIONS_STRICT;
static struct progress *progress;
@@ -69,7 +70,7 @@ static void *fill(int min)
if (min > sizeof(buffer))
die("cannot fill %d bytes", min);
if (offset) {
- the_hash_algo->update_fn(&ctx, buffer, offset);
+ git_hash_update(&ctx, buffer, offset);
memmove(buffer, buffer + offset, len);
offset = 0;
}
@@ -578,19 +579,21 @@ static void unpack_one(unsigned nr)
static void unpack_all(void)
{
int i;
- struct pack_header *hdr = fill(sizeof(struct pack_header));
+ unsigned char *hdr = fill(sizeof(struct pack_header));
- nr_objects = ntohl(hdr->hdr_entries);
-
- if (ntohl(hdr->hdr_signature) != PACK_SIGNATURE)
+ if (get_be32(hdr) != PACK_SIGNATURE)
die("bad pack file");
- if (!pack_version_ok(hdr->hdr_version))
+ hdr += 4;
+ if (!pack_version_ok_native(get_be32(hdr)))
die("unknown pack file version %"PRIu32,
- ntohl(hdr->hdr_version));
+ get_be32(hdr));
+ hdr += 4;
+ nr_objects = get_be32(hdr);
use(sizeof(struct pack_header));
if (!quiet)
- progress = start_progress(_("Unpacking objects"), nr_objects);
+ progress = start_progress(the_repository,
+ _("Unpacking objects"), nr_objects);
CALLOC_ARRAY(obj_list, nr_objects);
begin_odb_transaction();
for (i = 0; i < nr_objects; i++) {
@@ -611,7 +614,7 @@ int cmd_unpack_objects(int argc,
{
int i;
struct object_id oid;
- git_hash_ctx tmp_ctx;
+ struct git_hash_ctx tmp_ctx;
disable_replace_refs();
@@ -619,6 +622,8 @@ int cmd_unpack_objects(int argc,
quiet = !isatty(2);
+ show_usage_if_asked(argc, argv, unpack_usage);
+
for (i = 1 ; i < argc; i++) {
const char *arg = argv[i];
@@ -644,19 +649,10 @@ int cmd_unpack_objects(int argc,
fsck_set_msg_types(&fsck_options, arg);
continue;
}
- if (starts_with(arg, "--pack_header=")) {
- struct pack_header *hdr;
- char *c;
-
- hdr = (struct pack_header *)buffer;
- hdr->hdr_signature = htonl(PACK_SIGNATURE);
- hdr->hdr_version = htonl(strtoul(arg + 14, &c, 10));
- if (*c != ',')
- die("bad %s", arg);
- hdr->hdr_entries = htonl(strtoul(c + 1, &c, 10));
- if (*c)
- die("bad %s", arg);
- len = sizeof(*hdr);
+ if (skip_prefix(arg, "--pack_header=", &arg)) {
+ if (parse_pack_header_option(arg,
+ buffer, &len) < 0)
+ die(_("bad --pack_header: %s"), arg);
continue;
}
if (skip_prefix(arg, "--max-input-size=", &arg)) {
@@ -671,10 +667,9 @@ int cmd_unpack_objects(int argc,
}
the_hash_algo->init_fn(&ctx);
unpack_all();
- the_hash_algo->update_fn(&ctx, buffer, offset);
- the_hash_algo->init_fn(&tmp_ctx);
- the_hash_algo->clone_fn(&tmp_ctx, &ctx);
- the_hash_algo->final_oid_fn(&oid, &tmp_ctx);
+ git_hash_update(&ctx, buffer, offset);
+ git_hash_clone(&tmp_ctx, &ctx);
+ git_hash_final_oid(&oid, &tmp_ctx);
if (strict) {
write_rest();
if (fsck_finish(&fsck_options))
diff --git a/builtin/update-index.c b/builtin/update-index.c
index 74bbad9f87..b2f6b1a3fb 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -1045,8 +1045,8 @@ int cmd_update_index(int argc,
OPT_END()
};
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(update_index_usage, options);
+ show_usage_with_options_if_asked(argc, argv,
+ update_index_usage, options);
git_config(git_default_config, NULL);
diff --git a/builtin/update-server-info.c b/builtin/update-server-info.c
index 6769611a02..d7467290a8 100644
--- a/builtin/update-server-info.c
+++ b/builtin/update-server-info.c
@@ -1,4 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
#include "builtin.h"
#include "config.h"
#include "gettext.h"
@@ -13,7 +12,7 @@ static const char * const update_server_info_usage[] = {
int cmd_update_server_info(int argc,
const char **argv,
const char *prefix,
- struct repository *repo UNUSED)
+ struct repository *repo)
{
int force = 0;
struct option options[] = {
@@ -21,11 +20,12 @@ int cmd_update_server_info(int argc,
OPT_END()
};
- git_config(git_default_config, NULL);
+ if (repo)
+ repo_config(repo, git_default_config, NULL);
argc = parse_options(argc, argv, prefix, options,
update_server_info_usage, 0);
if (argc > 0)
usage_with_options(update_server_info_usage, options);
- return !!update_server_info(force);
+ return !!update_server_info(repo, force);
}
diff --git a/builtin/upload-archive.c b/builtin/upload-archive.c
index 9e9343f121..97d7c9522f 100644
--- a/builtin/upload-archive.c
+++ b/builtin/upload-archive.c
@@ -27,7 +27,8 @@ int cmd_upload_archive_writer(int argc,
const char *arg_cmd = "argument ";
int ret;
- if (argc != 2 || !strcmp(argv[1], "-h"))
+ show_usage_if_asked(argc, argv, upload_archive_usage);
+ if (argc != 2)
usage(upload_archive_usage);
if (!enter_repo(argv[1], 0))
@@ -92,8 +93,7 @@ struct repository *repo UNUSED)
BUG_ON_NON_EMPTY_PREFIX(prefix);
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage(upload_archive_usage);
+ show_usage_if_asked(argc, argv, upload_archive_usage);
/*
* Set up sideband subprocess.
diff --git a/builtin/upload-pack.c b/builtin/upload-pack.c
index dd63d6eadf..c2bbc035ab 100644
--- a/builtin/upload-pack.c
+++ b/builtin/upload-pack.c
@@ -1,3 +1,5 @@
+#define USE_THE_REPOSITORY_VARIABLE
+
#include "builtin.h"
#include "exec-cmd.h"
#include "gettext.h"
@@ -63,9 +65,9 @@ int cmd_upload_pack(int argc,
switch (determine_protocol_version_server()) {
case protocol_v2:
if (advertise_refs)
- protocol_v2_advertise_capabilities();
+ protocol_v2_advertise_capabilities(the_repository);
else
- protocol_v2_serve_loop(stateless_rpc);
+ protocol_v2_serve_loop(the_repository, stateless_rpc);
break;
case protocol_v1:
/*
diff --git a/builtin/var.c b/builtin/var.c
index 1449656cc9..ada642a9fe 100644
--- a/builtin/var.c
+++ b/builtin/var.c
@@ -42,7 +42,7 @@ static char *sequence_editor(int ident_flag UNUSED)
static char *pager(int ident_flag UNUSED)
{
- const char *pgm = git_pager(1);
+ const char *pgm = git_pager(the_repository, 1);
if (!pgm)
pgm = "cat";
@@ -221,6 +221,7 @@ int cmd_var(int argc,
const struct git_var *git_var;
char *val;
+ show_usage_if_asked(argc, argv, var_usage);
if (argc != 2)
usage(var_usage);
diff --git a/builtin/verify-tag.c b/builtin/verify-tag.c
index a7f20618ff..f6b97048a5 100644
--- a/builtin/verify-tag.c
+++ b/builtin/verify-tag.c
@@ -69,6 +69,5 @@ int cmd_verify_tag(int argc,
if (format.format)
pretty_print_ref(name, &oid, &format);
}
- ref_format_clear(&format);
return had_error;
}
diff --git a/bulk-checkin.c b/bulk-checkin.c
index 433070a3bd..20f2da67b9 100644
--- a/bulk-checkin.c
+++ b/bulk-checkin.c
@@ -44,8 +44,9 @@ static void finish_tmp_packfile(struct strbuf *basename,
{
char *idx_tmp_name = NULL;
- stage_tmp_packfiles(basename, pack_tmp_name, written_list, nr_written,
- NULL, pack_idx_opts, hash, &idx_tmp_name);
+ stage_tmp_packfiles(the_hash_algo, basename, pack_tmp_name,
+ written_list, nr_written, NULL, pack_idx_opts, hash,
+ &idx_tmp_name);
rename_tmp_packfile_idx(basename, &idx_tmp_name);
free(idx_tmp_name);
@@ -70,7 +71,7 @@ static void flush_bulk_checkin_packfile(struct bulk_checkin_packfile *state)
CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);
} else {
int fd = finalize_hashfile(state->f, hash, FSYNC_COMPONENT_PACK, 0);
- fixup_pack_header_footer(fd, hash, state->pack_tmp_name,
+ fixup_pack_header_footer(the_hash_algo, fd, hash, state->pack_tmp_name,
state->nr_written, hash,
state->offset);
close(fd);
@@ -161,7 +162,7 @@ static int already_written(struct bulk_checkin_packfile *state, struct object_id
* with a new pack.
*/
static int stream_blob_to_pack(struct bulk_checkin_packfile *state,
- git_hash_ctx *ctx, off_t *already_hashed_to,
+ struct git_hash_ctx *ctx, off_t *already_hashed_to,
int fd, size_t size, const char *path,
unsigned flags)
{
@@ -194,7 +195,7 @@ static int stream_blob_to_pack(struct bulk_checkin_packfile *state,
if (rsize < hsize)
hsize = rsize;
if (hsize)
- the_hash_algo->update_fn(ctx, ibuf, hsize);
+ git_hash_update(ctx, ibuf, hsize);
*already_hashed_to = offset;
}
s.next_in = ibuf;
@@ -258,10 +259,10 @@ static int deflate_blob_to_pack(struct bulk_checkin_packfile *state,
const char *path, unsigned flags)
{
off_t seekback, already_hashed_to;
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
unsigned char obuf[16384];
unsigned header_len;
- struct hashfile_checkpoint checkpoint = {0};
+ struct hashfile_checkpoint checkpoint;
struct pack_idx_entry *idx = NULL;
seekback = lseek(fd, 0, SEEK_CUR);
@@ -271,13 +272,16 @@ static int deflate_blob_to_pack(struct bulk_checkin_packfile *state,
header_len = format_object_header((char *)obuf, sizeof(obuf),
OBJ_BLOB, size);
the_hash_algo->init_fn(&ctx);
- the_hash_algo->update_fn(&ctx, obuf, header_len);
- the_hash_algo->unsafe_init_fn(&checkpoint.ctx);
+ git_hash_update(&ctx, obuf, header_len);
/* Note: idx is non-NULL when we are writing */
- if ((flags & HASH_WRITE_OBJECT) != 0)
+ if ((flags & HASH_WRITE_OBJECT) != 0) {
CALLOC_ARRAY(idx, 1);
+ prepare_to_stream(state, flags);
+ hashfile_checkpoint_init(state->f, &checkpoint);
+ }
+
already_hashed_to = 0;
while (1) {
@@ -303,7 +307,7 @@ static int deflate_blob_to_pack(struct bulk_checkin_packfile *state,
if (lseek(fd, seekback, SEEK_SET) == (off_t) -1)
return error("cannot seek back");
}
- the_hash_algo->final_oid_fn(result_oid, &ctx);
+ git_hash_final_oid(result_oid, &ctx);
if (!idx)
return 0;
@@ -333,7 +337,7 @@ void prepare_loose_object_bulk_checkin(void)
if (!odb_transaction_nesting || bulk_fsync_objdir)
return;
- bulk_fsync_objdir = tmp_objdir_create("bulk-fsync");
+ bulk_fsync_objdir = tmp_objdir_create(the_repository, "bulk-fsync");
if (bulk_fsync_objdir)
tmp_objdir_replace_primary_odb(bulk_fsync_objdir, 0);
}
diff --git a/bundle.c b/bundle.c
index f18f98fec9..d7ad690843 100644
--- a/bundle.c
+++ b/bundle.c
@@ -607,8 +607,10 @@ int unbundle(struct repository *r, struct bundle_header *header,
if (!opts)
opts = &opts_fallback;
- if (verify_bundle(r, header, opts->flags))
+ if (verify_bundle(r, header, opts->flags)) {
+ close(bundle_fd);
return -1;
+ }
strvec_pushl(&ip.args, "index-pack", "--fix-thin", "--stdin", NULL);
diff --git a/bundle.h b/bundle.h
index a80aa8ad9b..d664b2f2d6 100644
--- a/bundle.h
+++ b/bundle.h
@@ -62,6 +62,8 @@ struct unbundle_opts {
*
* Before unbundling, this method will call verify_bundle() with 'flags'
* provided in 'opts'.
+ *
+ * Note that the `bundle_fd` will be closed as part of the operation.
*/
int unbundle(struct repository *r, struct bundle_header *header,
int bundle_fd, struct strvec *extra_index_pack_args,
diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
index d1cb9fa878..332ba96003 100755
--- a/ci/install-dependencies.sh
+++ b/ci/install-dependencies.sh
@@ -24,16 +24,16 @@ fi
case "$distro" in
alpine-*)
- apk add --update shadow sudo build-base curl-dev openssl-dev expat-dev gettext \
- pcre2-dev python3 musl-libintl perl-utils ncurses \
+ apk add --update shadow sudo meson ninja-build gcc libc-dev curl-dev openssl-dev expat-dev gettext \
+ zlib-ng-dev pcre2-dev python3 musl-libintl perl-utils ncurses \
apache2 apache2-http2 apache2-proxy apache2-ssl apache2-webdav apr-util-dbd_sqlite3 \
bash cvs gnupg perl-cgi perl-dbd-sqlite perl-io-tty >/dev/null
;;
fedora-*|almalinux-*)
dnf -yq update >/dev/null &&
- dnf -yq install make gcc findutils diffutils perl python3 gettext zlib-devel expat-devel openssl-devel curl-devel pcre2-devel >/dev/null
+ dnf -yq install shadow-utils sudo make gcc findutils diffutils perl python3 gettext zlib-devel expat-devel openssl-devel curl-devel pcre2-devel >/dev/null
;;
-ubuntu-*|ubuntu32-*|debian-*)
+ubuntu-*|i386/ubuntu-*|debian-*)
# Required so that apt doesn't wait for user input on certain packages.
export DEBIAN_FRONTEND=noninteractive
@@ -42,7 +42,7 @@ ubuntu-*|ubuntu32-*|debian-*)
SVN='libsvn-perl subversion'
LANGUAGES='language-pack-is'
;;
- ubuntu32-*)
+ i386/ubuntu-*)
SVN=
LANGUAGES='language-pack-is'
;;
diff --git a/ci/lib.sh b/ci/lib.sh
index 8885ee3c3f..028fea0e7b 100755
--- a/ci/lib.sh
+++ b/ci/lib.sh
@@ -206,26 +206,7 @@ export TERM=${TERM:-dumb}
# Clear MAKEFLAGS that may come from the outside world.
export MAKEFLAGS=
-if test -n "$SYSTEM_COLLECTIONURI" || test -n "$SYSTEM_TASKDEFINITIONSURI"
-then
- CI_TYPE=azure-pipelines
- # We are running in Azure Pipelines
- CI_BRANCH="$BUILD_SOURCEBRANCH"
- CI_COMMIT="$BUILD_SOURCEVERSION"
- CI_JOB_ID="$BUILD_BUILDID"
- CI_JOB_NUMBER="$BUILD_BUILDNUMBER"
- CI_OS_NAME="$(echo "$AGENT_OS" | tr A-Z a-z)"
- test darwin != "$CI_OS_NAME" || CI_OS_NAME=osx
- CI_REPO_SLUG="$(expr "$BUILD_REPOSITORY_URI" : '.*/\([^/]*/[^/]*\)$')"
- CC="${CC:-gcc}"
-
- # use a subdirectory of the cache dir (because the file share is shared
- # among *all* phases)
- cache_dir="$HOME/test-cache/$SYSTEM_PHASENAME"
-
- GIT_TEST_OPTS="--write-junit-xml"
- JOBS=10
-elif test true = "$GITHUB_ACTIONS"
+if test true = "$GITHUB_ACTIONS"
then
CI_TYPE=github-actions
CI_BRANCH="$GITHUB_REF"
@@ -246,6 +227,8 @@ then
GIT_TEST_OPTS="--github-workflow-markup"
JOBS=10
+
+ distro=$(echo "$CI_JOB_IMAGE" | tr : -)
elif test true = "$GITLAB_CI"
then
CI_TYPE=gitlab-ci
@@ -267,7 +250,7 @@ then
CI_OS_NAME=osx
JOBS=$(nproc)
;;
- *,alpine:*|*,fedora:*|*,ubuntu:*)
+ *,alpine:*|*,fedora:*|*,ubuntu:*|*,i386/ubuntu:*)
CI_OS_NAME=linux
JOBS=$(nproc)
;;
@@ -329,11 +312,6 @@ export SKIP_DASHED_BUILT_INS=YesPlease
case "$distro" in
ubuntu-*)
- if test "$jobname" = "linux-gcc-default"
- then
- break
- fi
-
# Python 2 is end of life, and Ubuntu 23.04 and newer don't actually
# have it anymore. We thus only test with Python 2 on older LTS
# releases.
@@ -345,14 +323,7 @@ ubuntu-*)
fi
MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/$PYTHON_PACKAGE"
- case "$distro" in
- ubuntu-16.04)
- # Apache is too old for HTTP/2.
- ;;
- *)
- export GIT_TEST_HTTPD=true
- ;;
- esac
+ export GIT_TEST_HTTPD=true
# The Linux build installs the defined dependency versions below.
# The OS X build installs much more recent versions, whichever
@@ -378,10 +349,7 @@ linux32)
CC=gcc
;;
linux-musl)
- CC=gcc
- MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/python3 USE_LIBPCRE2=Yes"
- MAKEFLAGS="$MAKEFLAGS NO_REGEX=Yes ICONV_OMITS_BOM=Yes"
- MAKEFLAGS="$MAKEFLAGS GIT_TEST_UTF8_LOCALE=C.UTF-8"
+ MESONFLAGS="$MESONFLAGS -DGIT_TEST_UTF8_LOCALE=C.UTF-8"
;;
linux-leaks|linux-reftable-leaks)
export SANITIZE=leak
diff --git a/ci/print-test-failures.sh b/ci/print-test-failures.sh
index 655687dd82..dc910e5160 100755
--- a/ci/print-test-failures.sh
+++ b/ci/print-test-failures.sh
@@ -39,11 +39,6 @@ do
test_name="${test_name##*/}"
trash_dir="trash directory.$test_name"
case "$CI_TYPE" in
- azure-pipelines)
- mkdir -p failed-test-artifacts
- mv "$trash_dir" failed-test-artifacts
- continue
- ;;
github-actions)
mkdir -p failed-test-artifacts
echo "FAILED_TEST_ARTIFACTS=${TEST_OUTPUT_DIRECTORY:t}/failed-test-artifacts" >>$GITHUB_ENV
diff --git a/ci/run-build-and-tests.sh b/ci/run-build-and-tests.sh
index 76667a1277..1c69846723 100755
--- a/ci/run-build-and-tests.sh
+++ b/ci/run-build-and-tests.sh
@@ -13,8 +13,9 @@ esac
run_tests=t
case "$jobname" in
-linux-gcc)
+linux-breaking-changes)
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
+ export WITH_BREAKING_CHANGES=YesPlease
;;
linux-TEST-vars)
export OPENSSL_SHA1_UNSAFE=YesPlease
@@ -52,8 +53,11 @@ esac
case "$jobname" in
*-meson)
group "Configure" meson setup build . \
+ --fatal-meson-warnings \
--warnlevel 2 --werror \
- --wrap-mode nofallback
+ --wrap-mode nofallback \
+ -Dfuzzers=true \
+ $MESONFLAGS
group "Build" meson compile -C build --
if test -n "$run_tests"
then
diff --git a/combine-diff.c b/combine-diff.c
index 641bc92dbd..9527f3160d 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -47,31 +47,20 @@ static struct combine_diff_path *intersect_paths(
if (!n) {
for (i = 0; i < q->nr; i++) {
- int len;
- const char *path;
if (diff_unmodified_pair(q->queue[i]))
continue;
- path = q->queue[i]->two->path;
- len = strlen(path);
- p = xmalloc(combine_diff_path_size(num_parent, len));
- p->path = (char *) &(p->parent[num_parent]);
- memcpy(p->path, path, len);
- p->path[len] = 0;
- p->next = NULL;
- memset(p->parent, 0,
- sizeof(p->parent[0]) * num_parent);
-
- oidcpy(&p->oid, &q->queue[i]->two->oid);
- p->mode = q->queue[i]->two->mode;
+ p = combine_diff_path_new(q->queue[i]->two->path,
+ strlen(q->queue[i]->two->path),
+ q->queue[i]->two->mode,
+ &q->queue[i]->two->oid,
+ num_parent);
oidcpy(&p->parent[n].oid, &q->queue[i]->one->oid);
p->parent[n].mode = q->queue[i]->one->mode;
p->parent[n].status = q->queue[i]->status;
if (combined_all_paths &&
filename_changed(p->parent[n].status)) {
- strbuf_init(&p->parent[n].path, 0);
- strbuf_addstr(&p->parent[n].path,
- q->queue[i]->one->path);
+ p->parent[n].path = xstrdup(q->queue[i]->one->path);
}
*tail = p;
tail = &p->next;
@@ -92,9 +81,7 @@ static struct combine_diff_path *intersect_paths(
/* p->path not in q->queue[]; drop it */
*tail = p->next;
for (j = 0; j < num_parent; j++)
- if (combined_all_paths &&
- filename_changed(p->parent[j].status))
- strbuf_release(&p->parent[j].path);
+ free(p->parent[j].path);
free(p);
continue;
}
@@ -110,8 +97,7 @@ static struct combine_diff_path *intersect_paths(
p->parent[n].status = q->queue[i]->status;
if (combined_all_paths &&
filename_changed(p->parent[n].status))
- strbuf_addstr(&p->parent[n].path,
- q->queue[i]->one->path);
+ p->parent[n].path = xstrdup(q->queue[i]->one->path);
tail = &p->next;
i++;
@@ -996,8 +982,9 @@ static void show_combined_header(struct combine_diff_path *elem,
if (rev->combined_all_paths) {
for (i = 0; i < num_parent; i++) {
- char *path = filename_changed(elem->parent[i].status)
- ? elem->parent[i].path.buf : elem->path;
+ const char *path = elem->parent[i].path ?
+ elem->parent[i].path :
+ elem->path;
if (elem->parent[i].status == DIFF_STATUS_ADDED)
dump_quoted_path("--- ", "", "/dev/null",
line_prefix, c_meta, c_reset);
@@ -1278,12 +1265,10 @@ static void show_raw_diff(struct combine_diff_path *p, int num_parent, struct re
for (i = 0; i < num_parent; i++)
if (rev->combined_all_paths) {
- if (filename_changed(p->parent[i].status))
- write_name_quoted(p->parent[i].path.buf, stdout,
- inter_name_termination);
- else
- write_name_quoted(p->path, stdout,
- inter_name_termination);
+ const char *path = p->parent[i].path ?
+ p->parent[i].path :
+ p->path;
+ write_name_quoted(path, stdout, inter_name_termination);
}
write_name_quoted(p->path, stdout, line_termination);
}
@@ -1443,22 +1428,19 @@ static struct combine_diff_path *find_paths_multitree(
{
int i, nparent = parents->nr;
const struct object_id **parents_oid;
- struct combine_diff_path paths_head;
+ struct combine_diff_path *paths;
struct strbuf base;
ALLOC_ARRAY(parents_oid, nparent);
for (i = 0; i < nparent; i++)
parents_oid[i] = &parents->oid[i];
- /* fake list head, so worker can assume it is non-NULL */
- paths_head.next = NULL;
-
strbuf_init(&base, PATH_MAX);
- diff_tree_paths(&paths_head, oid, parents_oid, nparent, &base, opt);
+ paths = diff_tree_paths(oid, parents_oid, nparent, &base, opt);
strbuf_release(&base);
free(parents_oid);
- return paths_head.next;
+ return paths;
}
static int match_objfind(struct combine_diff_path *path,
@@ -1645,9 +1627,7 @@ void diff_tree_combined(const struct object_id *oid,
struct combine_diff_path *tmp = paths;
paths = paths->next;
for (i = 0; i < num_parent; i++)
- if (rev->combined_all_paths &&
- filename_changed(tmp->parent[i].status))
- strbuf_release(&tmp->parent[i].path);
+ free(tmp->parent[i].path);
free(tmp);
}
@@ -1667,3 +1647,25 @@ void diff_tree_combined_merge(const struct commit *commit,
diff_tree_combined(&commit->object.oid, &parents, rev);
oid_array_clear(&parents);
}
+
+struct combine_diff_path *combine_diff_path_new(const char *path,
+ size_t path_len,
+ unsigned int mode,
+ const struct object_id *oid,
+ size_t num_parents)
+{
+ struct combine_diff_path *p;
+ size_t parent_len = st_mult(sizeof(p->parent[0]), num_parents);
+
+ p = xmalloc(st_add4(sizeof(*p), path_len, 1, parent_len));
+ p->path = (char *)&(p->parent[num_parents]);
+ memcpy(p->path, path, path_len);
+ p->path[path_len] = 0;
+ p->next = NULL;
+ p->mode = mode;
+ oidcpy(&p->oid, oid);
+
+ memset(p->parent, 0, parent_len);
+
+ return p;
+}
diff --git a/command-list.txt b/command-list.txt
index e0bb87b3b5..c537114b46 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -60,6 +60,7 @@ git-annotate ancillaryinterrogators
git-apply plumbingmanipulators complete
git-archimport foreignscminterface
git-archive mainporcelain
+git-backfill mainporcelain history
git-bisect mainporcelain info
git-blame ancillaryinterrogators complete
git-branch mainporcelain history
diff --git a/commit-graph.c b/commit-graph.c
index 0df66e5a24..2a2999a6b8 100644
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -1534,6 +1534,7 @@ static void close_reachable(struct write_commit_graph_context *ctx)
if (ctx->report_progress)
ctx->progress = start_delayed_progress(
+ the_repository,
_("Loading known commits in commit graph"),
ctx->oids.nr);
for (i = 0; i < ctx->oids.nr; i++) {
@@ -1551,6 +1552,7 @@ static void close_reachable(struct write_commit_graph_context *ctx)
*/
if (ctx->report_progress)
ctx->progress = start_delayed_progress(
+ the_repository,
_("Expanding reachable commits in commit graph"),
0);
for (i = 0; i < ctx->oids.nr; i++) {
@@ -1571,6 +1573,7 @@ static void close_reachable(struct write_commit_graph_context *ctx)
if (ctx->report_progress)
ctx->progress = start_delayed_progress(
+ the_repository,
_("Clearing commit marks in commit graph"),
ctx->oids.nr);
for (i = 0; i < ctx->oids.nr; i++) {
@@ -1688,6 +1691,7 @@ static void compute_topological_levels(struct write_commit_graph_context *ctx)
if (ctx->report_progress)
info.progress = ctx->progress
= start_delayed_progress(
+ the_repository,
_("Computing commit graph topological levels"),
ctx->commits.nr);
@@ -1722,6 +1726,7 @@ static void compute_generation_numbers(struct write_commit_graph_context *ctx)
if (ctx->report_progress)
info.progress = ctx->progress
= start_delayed_progress(
+ the_repository,
_("Computing commit graph generation numbers"),
ctx->commits.nr);
@@ -1798,6 +1803,7 @@ static void compute_bloom_filters(struct write_commit_graph_context *ctx)
if (ctx->report_progress)
progress = start_delayed_progress(
+ the_repository,
_("Computing commit changed paths Bloom filters"),
ctx->commits.nr);
@@ -1877,6 +1883,7 @@ int write_commit_graph_reachable(struct object_directory *odb,
data.commits = &commits;
if (flags & COMMIT_GRAPH_WRITE_PROGRESS)
data.progress = start_delayed_progress(
+ the_repository,
_("Collecting referenced commits"), 0);
refs_for_each_ref(get_main_ref_store(the_repository), add_ref_to_set,
@@ -1908,7 +1915,8 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
"Finding commits for commit graph in %"PRIuMAX" packs",
pack_indexes->nr),
(uintmax_t)pack_indexes->nr);
- ctx->progress = start_delayed_progress(progress_title.buf, 0);
+ ctx->progress = start_delayed_progress(the_repository,
+ progress_title.buf, 0);
ctx->progress_done = 0;
}
for (i = 0; i < pack_indexes->nr; i++) {
@@ -1959,6 +1967,7 @@ static void fill_oids_from_all_packs(struct write_commit_graph_context *ctx)
{
if (ctx->report_progress)
ctx->progress = start_delayed_progress(
+ the_repository,
_("Finding commits for commit graph among packed objects"),
ctx->approx_nr_objects);
for_each_packed_object(ctx->r, add_packed_commits, ctx,
@@ -1977,6 +1986,7 @@ static void copy_oids_to_commits(struct write_commit_graph_context *ctx)
ctx->num_extra_edges = 0;
if (ctx->report_progress)
ctx->progress = start_delayed_progress(
+ the_repository,
_("Finding extra edges in commit graph"),
ctx->oids.nr);
oid_array_sort(&ctx->oids);
@@ -2136,6 +2146,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
get_num_chunks(cf)),
get_num_chunks(cf));
ctx->progress = start_delayed_progress(
+ the_repository,
progress_title.buf,
st_mult(get_num_chunks(cf), ctx->commits.nr));
}
@@ -2348,6 +2359,7 @@ static void sort_and_scan_merged_commits(struct write_commit_graph_context *ctx)
if (ctx->report_progress)
ctx->progress = start_delayed_progress(
+ the_repository,
_("Scanning merged commits"),
ctx->commits.nr);
@@ -2392,7 +2404,8 @@ static void merge_commit_graphs(struct write_commit_graph_context *ctx)
current_graph_number--;
if (ctx->report_progress)
- ctx->progress = start_delayed_progress(_("Merging commit-graph"), 0);
+ ctx->progress = start_delayed_progress(the_repository,
+ _("Merging commit-graph"), 0);
merge_commit_graph(ctx, g);
stop_progress(&ctx->progress);
@@ -2874,7 +2887,8 @@ int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
if (!(flags & COMMIT_GRAPH_VERIFY_SHALLOW))
total += g->num_commits_in_base;
- progress = start_progress(_("Verifying commits in commit graph"),
+ progress = start_progress(the_repository,
+ _("Verifying commits in commit graph"),
total);
}
diff --git a/commit-reach.c b/commit-reach.c
index e3edd11995..a339e41aa4 100644
--- a/commit-reach.c
+++ b/commit-reach.c
@@ -1,5 +1,4 @@
#define USE_THE_REPOSITORY_VARIABLE
-#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
#include "commit.h"
@@ -42,8 +41,7 @@ static int compare_commits_by_gen(const void *_a, const void *_b)
static int queue_has_nonstale(struct prio_queue *queue)
{
- int i;
- for (i = 0; i < queue->nr; i++) {
+ for (size_t i = 0; i < queue->nr; i++) {
struct commit *commit = queue->array[i].data;
if (!(commit->object.flags & STALE))
return 1;
@@ -213,12 +211,13 @@ int get_octopus_merge_bases(struct commit_list *in, struct commit_list **result)
}
static int remove_redundant_no_gen(struct repository *r,
- struct commit **array, int cnt)
+ struct commit **array,
+ size_t cnt, size_t *dedup_cnt)
{
struct commit **work;
unsigned char *redundant;
- int *filled_index;
- int i, j, filled;
+ size_t *filled_index;
+ size_t i, j, filled;
CALLOC_ARRAY(work, cnt);
redundant = xcalloc(cnt, 1);
@@ -268,20 +267,22 @@ static int remove_redundant_no_gen(struct repository *r,
for (i = filled = 0; i < cnt; i++)
if (!redundant[i])
array[filled++] = work[i];
+ *dedup_cnt = filled;
free(work);
free(redundant);
free(filled_index);
- return filled;
+ return 0;
}
static int remove_redundant_with_gen(struct repository *r,
- struct commit **array, int cnt)
+ struct commit **array, size_t cnt,
+ size_t *dedup_cnt)
{
- int i, count_non_stale = 0, count_still_independent = cnt;
+ size_t i, count_non_stale = 0, count_still_independent = cnt;
timestamp_t min_generation = GENERATION_NUMBER_INFINITY;
struct commit **walk_start, **sorted;
size_t walk_start_nr = 0, walk_start_alloc = cnt;
- int min_gen_pos = 0;
+ size_t min_gen_pos = 0;
/*
* Sort the input by generation number, ascending. This allows
@@ -327,12 +328,12 @@ static int remove_redundant_with_gen(struct repository *r,
* terminate early. Otherwise, we will do the same amount of work
* as before.
*/
- for (i = walk_start_nr - 1; i >= 0 && count_still_independent > 1; i--) {
+ for (i = walk_start_nr; i && count_still_independent > 1; i--) {
/* push the STALE bits up to min generation */
struct commit_list *stack = NULL;
- commit_list_insert(walk_start[i], &stack);
- walk_start[i]->object.flags |= STALE;
+ commit_list_insert(walk_start[i - 1], &stack);
+ walk_start[i - 1]->object.flags |= STALE;
while (stack) {
struct commit_list *parents;
@@ -389,10 +390,12 @@ static int remove_redundant_with_gen(struct repository *r,
clear_commit_marks_many(walk_start_nr, walk_start, STALE);
free(walk_start);
- return count_non_stale;
+ *dedup_cnt = count_non_stale;
+ return 0;
}
-static int remove_redundant(struct repository *r, struct commit **array, int cnt)
+static int remove_redundant(struct repository *r, struct commit **array,
+ size_t cnt, size_t *dedup_cnt)
{
/*
* Some commit in the array may be an ancestor of
@@ -402,31 +405,30 @@ static int remove_redundant(struct repository *r, struct commit **array, int cnt
* that number.
*/
if (generation_numbers_enabled(r)) {
- int i;
-
/*
* If we have a single commit with finite generation
* number, then the _with_gen algorithm is preferred.
*/
- for (i = 0; i < cnt; i++) {
+ for (size_t i = 0; i < cnt; i++) {
if (commit_graph_generation(array[i]) < GENERATION_NUMBER_INFINITY)
- return remove_redundant_with_gen(r, array, cnt);
+ return remove_redundant_with_gen(r, array, cnt, dedup_cnt);
}
}
- return remove_redundant_no_gen(r, array, cnt);
+ return remove_redundant_no_gen(r, array, cnt, dedup_cnt);
}
static int get_merge_bases_many_0(struct repository *r,
struct commit *one,
- int n,
+ size_t n,
struct commit **twos,
int cleanup,
struct commit_list **result)
{
struct commit_list *list;
struct commit **rslt;
- int cnt, i;
+ size_t cnt, i;
+ int ret;
if (merge_bases_many(r, one, n, twos, result) < 0)
return -1;
@@ -453,8 +455,8 @@ static int get_merge_bases_many_0(struct repository *r,
clear_commit_marks(one, all_flags);
clear_commit_marks_many(n, twos, all_flags);
- cnt = remove_redundant(r, rslt, cnt);
- if (cnt < 0) {
+ ret = remove_redundant(r, rslt, cnt, &cnt);
+ if (ret < 0) {
free(rslt);
return -1;
}
@@ -466,7 +468,7 @@ static int get_merge_bases_many_0(struct repository *r,
int repo_get_merge_bases_many(struct repository *r,
struct commit *one,
- int n,
+ size_t n,
struct commit **twos,
struct commit_list **result)
{
@@ -475,7 +477,7 @@ int repo_get_merge_bases_many(struct repository *r,
int repo_get_merge_bases_many_dirty(struct repository *r,
struct commit *one,
- int n,
+ size_t n,
struct commit **twos,
struct commit_list **result)
{
@@ -583,7 +585,8 @@ struct commit_list *reduce_heads(struct commit_list *heads)
struct commit_list *p;
struct commit_list *result = NULL, **tail = &result;
struct commit **array;
- int num_head, i;
+ size_t num_head, i;
+ int ret;
if (!heads)
return NULL;
@@ -604,11 +607,13 @@ struct commit_list *reduce_heads(struct commit_list *heads)
p->item->object.flags &= ~STALE;
}
}
- num_head = remove_redundant(the_repository, array, num_head);
- if (num_head < 0) {
+
+ ret = remove_redundant(the_repository, array, num_head, &num_head);
+ if (ret < 0) {
free(array);
return NULL;
}
+
for (i = 0; i < num_head; i++)
tail = &commit_list_insert(array[i], tail)->next;
free(array);
@@ -781,12 +786,12 @@ int commit_contains(struct ref_filter *filter, struct commit *commit,
int can_all_from_reach_with_flag(struct object_array *from,
unsigned int with_flag,
unsigned int assign_flag,
- time_t min_commit_date,
+ timestamp_t min_commit_date,
timestamp_t min_generation)
{
struct commit **list = NULL;
- int i;
- int nr_commits;
+ size_t i;
+ size_t nr_commits;
int result = 1;
ALLOC_ARRAY(list, from->nr);
@@ -884,9 +889,9 @@ int can_all_from_reach(struct commit_list *from, struct commit_list *to,
int cutoff_by_min_date)
{
struct object_array from_objs = OBJECT_ARRAY_INIT;
- time_t min_commit_date = cutoff_by_min_date ? from->item->date : 0;
struct commit_list *from_iter = from, *to_iter = to;
int result;
+ timestamp_t min_commit_date = cutoff_by_min_date ? from->item->date : 0;
timestamp_t min_generation = GENERATION_NUMBER_INFINITY;
while (from_iter) {
@@ -938,8 +943,8 @@ int can_all_from_reach(struct commit_list *from, struct commit_list *to,
return result;
}
-struct commit_list *get_reachable_subset(struct commit **from, int nr_from,
- struct commit **to, int nr_to,
+struct commit_list *get_reachable_subset(struct commit **from, size_t nr_from,
+ struct commit **to, size_t nr_to,
unsigned int reachable_flag)
{
struct commit **item;
diff --git a/commit-reach.h b/commit-reach.h
index 9a745b7e17..6012402dfc 100644
--- a/commit-reach.h
+++ b/commit-reach.h
@@ -14,12 +14,12 @@ int repo_get_merge_bases(struct repository *r,
struct commit *rev2,
struct commit_list **result);
int repo_get_merge_bases_many(struct repository *r,
- struct commit *one, int n,
+ struct commit *one, size_t n,
struct commit **twos,
struct commit_list **result);
/* To be used only when object flags after this call no longer matter */
int repo_get_merge_bases_many_dirty(struct repository *r,
- struct commit *one, int n,
+ struct commit *one, size_t n,
struct commit **twos,
struct commit_list **result);
@@ -81,7 +81,7 @@ int commit_contains(struct ref_filter *filter, struct commit *commit,
int can_all_from_reach_with_flag(struct object_array *from,
unsigned int with_flag,
unsigned int assign_flag,
- time_t min_commit_date,
+ timestamp_t min_commit_date,
timestamp_t min_generation);
int can_all_from_reach(struct commit_list *from, struct commit_list *to,
int commit_date_cutoff);
@@ -95,8 +95,8 @@ int can_all_from_reach(struct commit_list *from, struct commit_list *to,
* This method uses the PARENT1 and PARENT2 flags during its operation,
* so be sure these flags are not set before calling the method.
*/
-struct commit_list *get_reachable_subset(struct commit **from, int nr_from,
- struct commit **to, int nr_to,
+struct commit_list *get_reachable_subset(struct commit **from, size_t nr_from,
+ struct commit **to, size_t nr_to,
unsigned int reachable_flag);
struct ahead_behind_count {
diff --git a/commit.c b/commit.c
index a127fe60c5..540660359d 100644
--- a/commit.c
+++ b/commit.c
@@ -778,11 +778,11 @@ static void clear_commit_marks_1(struct commit_list **plist,
}
}
-void clear_commit_marks_many(int nr, struct commit **commit, unsigned int mark)
+void clear_commit_marks_many(size_t nr, struct commit **commit, unsigned int mark)
{
struct commit_list *list = NULL;
- while (nr--) {
+ for (size_t i = 0; i < nr; i++) {
clear_commit_marks_1(&list, *commit, mark);
commit++;
}
diff --git a/commit.h b/commit.h
index 943e3d74b2..70c870dae4 100644
--- a/commit.h
+++ b/commit.h
@@ -210,7 +210,7 @@ struct commit *pop_most_recent_commit(struct commit_list **list,
struct commit *pop_commit(struct commit_list **stack);
void clear_commit_marks(struct commit *commit, unsigned int mark);
-void clear_commit_marks_many(int nr, struct commit **commit, unsigned int mark);
+void clear_commit_marks_many(size_t nr, struct commit **commit, unsigned int mark);
enum rev_sort_order {
diff --git a/common-exit.c b/common-exit.c
new file mode 100644
index 0000000000..1aaa538be3
--- /dev/null
+++ b/common-exit.c
@@ -0,0 +1,26 @@
+#include "git-compat-util.h"
+#include "trace2.h"
+
+static void check_bug_if_BUG(void)
+{
+ if (!bug_called_must_BUG)
+ return;
+ BUG("on exit(): had bug() call(s) in this process without explicit BUG_if_bug()");
+}
+
+/* We wrap exit() to call common_exit() in git-compat-util.h */
+int common_exit(const char *file, int line, int code)
+{
+ /*
+ * For non-POSIX systems: Take the lowest 8 bits of the "code"
+ * to e.g. turn -1 into 255. On a POSIX system this is
+ * redundant, see exit(3) and wait(2), but as it doesn't harm
+ * anything there we don't need to guard this with an "ifdef".
+ */
+ code &= 0xff;
+
+ check_bug_if_BUG();
+ trace2_cmd_exit_fl(file, line, code);
+
+ return code;
+}
diff --git a/common-init.c b/common-init.c
new file mode 100644
index 0000000000..5cc73f058c
--- /dev/null
+++ b/common-init.c
@@ -0,0 +1,63 @@
+#define USE_THE_REPOSITORY_VARIABLE
+
+#include "git-compat-util.h"
+#include "common-init.h"
+#include "exec-cmd.h"
+#include "gettext.h"
+#include "attr.h"
+#include "repository.h"
+#include "setup.h"
+#include "strbuf.h"
+#include "trace2.h"
+
+/*
+ * Many parts of Git have subprograms communicate via pipe, expect the
+ * upstream of a pipe to die with SIGPIPE when the downstream of a
+ * pipe does not need to read all that is written. Some third-party
+ * programs that ignore or block SIGPIPE for their own reason forget
+ * to restore SIGPIPE handling to the default before spawning Git and
+ * break this carefully orchestrated machinery.
+ *
+ * Restore the way SIGPIPE is handled to default, which is what we
+ * expect.
+ */
+static void restore_sigpipe_to_default(void)
+{
+ sigset_t unblock;
+
+ sigemptyset(&unblock);
+ sigaddset(&unblock, SIGPIPE);
+ sigprocmask(SIG_UNBLOCK, &unblock, NULL);
+ signal(SIGPIPE, SIG_DFL);
+}
+
+void init_git(const char **argv)
+{
+ struct strbuf tmp = STRBUF_INIT;
+
+ trace2_initialize_clock();
+
+ /*
+ * Always open file descriptors 0/1/2 to avoid clobbering files
+ * in die(). It also avoids messing up when the pipes are dup'ed
+ * onto stdin/stdout/stderr in the child processes we spawn.
+ */
+ sanitize_stdfds();
+ restore_sigpipe_to_default();
+
+ git_resolve_executable_dir(argv[0]);
+
+ setlocale(LC_CTYPE, "");
+ git_setup_gettext();
+
+ initialize_repository(the_repository);
+
+ attr_start();
+
+ trace2_initialize();
+ trace2_cmd_start(argv);
+ trace2_collect_process_info(TRACE2_PROCESS_INFO_STARTUP);
+
+ if (!strbuf_getcwd(&tmp))
+ tmp_original_cwd = strbuf_detach(&tmp, NULL);
+}
diff --git a/common-init.h b/common-init.h
new file mode 100644
index 0000000000..3e6db20cae
--- /dev/null
+++ b/common-init.h
@@ -0,0 +1,6 @@
+#ifndef COMMON_INIT_H
+#define COMMON_INIT_H
+
+void init_git(const char **argv);
+
+#endif /* COMMON_INIT_H */
diff --git a/common-main.c b/common-main.c
index 8e68ac9e42..6b7ab077b0 100644
--- a/common-main.c
+++ b/common-main.c
@@ -1,92 +1,13 @@
-#define USE_THE_REPOSITORY_VARIABLE
-
#include "git-compat-util.h"
-#include "exec-cmd.h"
-#include "gettext.h"
-#include "attr.h"
-#include "repository.h"
-#include "setup.h"
-#include "strbuf.h"
-#include "trace2.h"
-
-/*
- * Many parts of Git have subprograms communicate via pipe, expect the
- * upstream of a pipe to die with SIGPIPE when the downstream of a
- * pipe does not need to read all that is written. Some third-party
- * programs that ignore or block SIGPIPE for their own reason forget
- * to restore SIGPIPE handling to the default before spawning Git and
- * break this carefully orchestrated machinery.
- *
- * Restore the way SIGPIPE is handled to default, which is what we
- * expect.
- */
-static void restore_sigpipe_to_default(void)
-{
- sigset_t unblock;
-
- sigemptyset(&unblock);
- sigaddset(&unblock, SIGPIPE);
- sigprocmask(SIG_UNBLOCK, &unblock, NULL);
- signal(SIGPIPE, SIG_DFL);
-}
+#include "common-init.h"
int main(int argc, const char **argv)
{
int result;
- struct strbuf tmp = STRBUF_INIT;
-
- trace2_initialize_clock();
-
- /*
- * Always open file descriptors 0/1/2 to avoid clobbering files
- * in die(). It also avoids messing up when the pipes are dup'ed
- * onto stdin/stdout/stderr in the child processes we spawn.
- */
- sanitize_stdfds();
- restore_sigpipe_to_default();
-
- git_resolve_executable_dir(argv[0]);
-
- setlocale(LC_CTYPE, "");
- git_setup_gettext();
-
- initialize_repository(the_repository);
-
- attr_start();
-
- trace2_initialize();
- trace2_cmd_start(argv);
- trace2_collect_process_info(TRACE2_PROCESS_INFO_STARTUP);
-
- if (!strbuf_getcwd(&tmp))
- tmp_original_cwd = strbuf_detach(&tmp, NULL);
+ init_git(argv);
result = cmd_main(argc, argv);
/* Not exit(3), but a wrapper calling our common_exit() */
exit(result);
}
-
-static void check_bug_if_BUG(void)
-{
- if (!bug_called_must_BUG)
- return;
- BUG("on exit(): had bug() call(s) in this process without explicit BUG_if_bug()");
-}
-
-/* We wrap exit() to call common_exit() in git-compat-util.h */
-int common_exit(const char *file, int line, int code)
-{
- /*
- * For non-POSIX systems: Take the lowest 8 bits of the "code"
- * to e.g. turn -1 into 255. On a POSIX system this is
- * redundant, see exit(3) and wait(2), but as it doesn't harm
- * anything there we don't need to guard this with an "ifdef".
- */
- code &= 0xff;
-
- check_bug_if_BUG();
- trace2_cmd_exit_fl(file, line, code);
-
- return code;
-}
diff --git a/compat/bswap.h b/compat/bswap.h
index 512f6f4b99..b34054f2bd 100644
--- a/compat/bswap.h
+++ b/compat/bswap.h
@@ -171,23 +171,23 @@ static inline uint64_t get_be64(const void *ptr)
static inline void put_be32(void *ptr, uint32_t value)
{
unsigned char *p = ptr;
- p[0] = value >> 24;
- p[1] = value >> 16;
- p[2] = value >> 8;
- p[3] = value >> 0;
+ p[0] = (value >> 24) & 0xff;
+ p[1] = (value >> 16) & 0xff;
+ p[2] = (value >> 8) & 0xff;
+ p[3] = (value >> 0) & 0xff;
}
static inline void put_be64(void *ptr, uint64_t value)
{
unsigned char *p = ptr;
- p[0] = value >> 56;
- p[1] = value >> 48;
- p[2] = value >> 40;
- p[3] = value >> 32;
- p[4] = value >> 24;
- p[5] = value >> 16;
- p[6] = value >> 8;
- p[7] = value >> 0;
+ p[0] = (value >> 56) & 0xff;
+ p[1] = (value >> 48) & 0xff;
+ p[2] = (value >> 40) & 0xff;
+ p[3] = (value >> 32) & 0xff;
+ p[4] = (value >> 24) & 0xff;
+ p[5] = (value >> 16) & 0xff;
+ p[6] = (value >> 8) & 0xff;
+ p[7] = (value >> 0) & 0xff;
}
#endif /* COMPAT_BSWAP_H */
diff --git a/compat/mingw.c b/compat/mingw.c
index 1d5b211b54..f524c54d06 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -2278,7 +2278,9 @@ repeat:
old_handle = CreateFileW(wpold, DELETE,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
- NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ NULL, OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
+ NULL);
if (old_handle == INVALID_HANDLE_VALUE) {
errno = err_win_to_posix(GetLastError());
return -1;
diff --git a/compat/zlib-compat.h b/compat/zlib-compat.h
new file mode 100644
index 0000000000..0c60e3af33
--- /dev/null
+++ b/compat/zlib-compat.h
@@ -0,0 +1,53 @@
+#ifndef COMPAT_ZLIB_H
+#define COMPAT_ZLIB_H
+
+#ifdef HAVE_ZLIB_NG
+# include <zlib-ng.h>
+
+# define z_stream zng_stream
+#define gz_header_s zng_gz_header_s
+
+# define crc32(crc, buf, len) zng_crc32(crc, buf, len)
+
+# define inflate(strm, bits) zng_inflate(strm, bits)
+# define inflateEnd(strm) zng_inflateEnd(strm)
+# define inflateInit(strm) zng_inflateInit(strm)
+# define inflateInit2(strm, bits) zng_inflateInit2(strm, bits)
+# define inflateReset(strm) zng_inflateReset(strm)
+
+# define deflate(strm, flush) zng_deflate(strm, flush)
+# define deflateBound(strm, source_len) zng_deflateBound(strm, source_len)
+# define deflateEnd(strm) zng_deflateEnd(strm)
+# define deflateInit(strm, level) zng_deflateInit(strm, level)
+# define deflateInit2(stream, level, method, window_bits, mem_level, strategy) zng_deflateInit2(stream, level, method, window_bits, mem_level, strategy)
+# define deflateReset(strm) zng_deflateReset(strm)
+# define deflateSetHeader(strm, head) zng_deflateSetHeader(strm, head)
+
+#else
+# include <zlib.h>
+
+# if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200
+# define deflateBound(c,s) ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11)
+# endif
+
+/*
+ * zlib only gained support for setting up the gzip header in v1.2.2.1. In
+ * Git we only set the header to make archives reproducible across different
+ * operating systems, so it's fine to simply make this a no-op when using a
+ * zlib version that doesn't support this yet.
+ */
+# if ZLIB_VERNUM < 0x1221
+struct gz_header_s {
+ int os;
+};
+
+static int deflateSetHeader(z_streamp strm, struct gz_header_s *head)
+{
+ (void)(strm);
+ (void)(head);
+ return Z_OK;
+}
+# endif
+#endif /* HAVE_ZLIB_NG */
+
+#endif /* COMPAT_ZLIB_H */
diff --git a/compat/zlib-uncompress2.c b/compat/zlib-uncompress2.c
deleted file mode 100644
index 77a1b08048..0000000000
--- a/compat/zlib-uncompress2.c
+++ /dev/null
@@ -1,96 +0,0 @@
-#include "git-compat-util.h"
-
-#if ZLIB_VERNUM < 0x1290
-/* taken from zlib's uncompr.c
-
- commit cacf7f1d4e3d44d871b605da3b647f07d718623f
- Author: Mark Adler <madler@alumni.caltech.edu>
- Date: Sun Jan 15 09:18:46 2017 -0800
-
- zlib 1.2.11
-
-*/
-
-/*
- * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* clang-format off */
-
-/* ===========================================================================
- Decompresses the source buffer into the destination buffer. *sourceLen is
- the byte length of the source buffer. Upon entry, *destLen is the total size
- of the destination buffer, which must be large enough to hold the entire
- uncompressed data. (The size of the uncompressed data must have been saved
- previously by the compressor and transmitted to the decompressor by some
- mechanism outside the scope of this compression library.) Upon exit,
- *destLen is the size of the decompressed data and *sourceLen is the number
- of source bytes consumed. Upon return, source + *sourceLen points to the
- first unused input byte.
-
- uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_BUF_ERROR if there was not enough room in the output buffer, or
- Z_DATA_ERROR if the input data was corrupted, including if the input data is
- an incomplete zlib stream.
-*/
-int ZEXPORT uncompress2 (
- Bytef *dest,
- uLongf *destLen,
- const Bytef *source,
- uLong *sourceLen) {
- z_stream stream;
- int err;
- const uInt max = (uInt)-1;
- uLong len, left;
- Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */
-
- len = *sourceLen;
- if (*destLen) {
- left = *destLen;
- *destLen = 0;
- }
- else {
- left = 1;
- dest = buf;
- }
-
- stream.next_in = (z_const Bytef *)source;
- stream.avail_in = 0;
- stream.zalloc = (alloc_func)0;
- stream.zfree = (free_func)0;
- stream.opaque = (voidpf)0;
-
- err = inflateInit(&stream);
- if (err != Z_OK) return err;
-
- stream.next_out = dest;
- stream.avail_out = 0;
-
- do {
- if (stream.avail_out == 0) {
- stream.avail_out = left > (uLong)max ? max : (uInt)left;
- left -= stream.avail_out;
- }
- if (stream.avail_in == 0) {
- stream.avail_in = len > (uLong)max ? max : (uInt)len;
- len -= stream.avail_in;
- }
- err = inflate(&stream, Z_NO_FLUSH);
- } while (err == Z_OK);
-
- *sourceLen -= len + stream.avail_in;
- if (dest != buf)
- *destLen = stream.total_out;
- else if (stream.total_out && err == Z_BUF_ERROR)
- left = 1;
-
- inflateEnd(&stream);
- return err == Z_STREAM_END ? Z_OK :
- err == Z_NEED_DICT ? Z_DATA_ERROR :
- err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR :
- err;
-}
-#else
-static void *dummy_variable = &dummy_variable;
-#endif
diff --git a/config.c b/config.c
index 50f2d17b39..36f76fafe5 100644
--- a/config.c
+++ b/config.c
@@ -19,6 +19,7 @@
#include "convert.h"
#include "environment.h"
#include "gettext.h"
+#include "git-zlib.h"
#include "ident.h"
#include "repository.h"
#include "lockfile.h"
diff --git a/connect.c b/connect.c
index 4d85479075..e6e25a0479 100644
--- a/connect.c
+++ b/connect.c
@@ -1,5 +1,4 @@
#define USE_THE_REPOSITORY_VARIABLE
-#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
#include "config.h"
@@ -77,7 +76,7 @@ static NORETURN void die_initial_contact(int unexpected)
/* Checks if the server supports the capability 'c' */
int server_supports_v2(const char *c)
{
- int i;
+ size_t i;
for (i = 0; i < server_capabilities_v2.nr; i++) {
const char *out;
@@ -96,7 +95,7 @@ void ensure_server_supports_v2(const char *c)
int server_feature_v2(const char *c, const char **v)
{
- int i;
+ size_t i;
for (i = 0; i < server_capabilities_v2.nr; i++) {
const char *out;
@@ -112,7 +111,7 @@ int server_feature_v2(const char *c, const char **v)
int server_supports_feature(const char *c, const char *feature,
int die_on_error)
{
- int i;
+ size_t i;
for (i = 0; i < server_capabilities_v2.nr; i++) {
const char *out;
@@ -232,12 +231,12 @@ static void annotate_refs_with_symref_info(struct ref *ref)
string_list_clear(&symref, 0);
}
-static void process_capabilities(struct packet_reader *reader, int *linelen)
+static void process_capabilities(struct packet_reader *reader, size_t *linelen)
{
const char *feat_val;
size_t feat_len;
const char *line = reader->line;
- int nul_location = strlen(line);
+ size_t nul_location = strlen(line);
if (nul_location == *linelen)
return;
server_capabilities_v1 = xstrdup(line + nul_location + 1);
@@ -271,14 +270,14 @@ static int process_dummy_ref(const struct packet_reader *reader)
!strcmp(name, "capabilities^{}");
}
-static void check_no_capabilities(const char *line, int len)
+static void check_no_capabilities(const char *line, size_t len)
{
if (strlen(line) != len)
warning(_("ignoring capabilities after first line '%s'"),
line + strlen(line));
}
-static int process_ref(const struct packet_reader *reader, int len,
+static int process_ref(const struct packet_reader *reader, size_t len,
struct ref ***list, unsigned int flags,
struct oid_array *extra_have)
{
@@ -306,7 +305,7 @@ static int process_ref(const struct packet_reader *reader, int len,
return 1;
}
-static int process_shallow(const struct packet_reader *reader, int len,
+static int process_shallow(const struct packet_reader *reader, size_t len,
struct oid_array *shallow_points)
{
const char *line = reader->line;
@@ -341,7 +340,7 @@ struct ref **get_remote_heads(struct packet_reader *reader,
struct oid_array *shallow_points)
{
struct ref **orig_list = list;
- int len = 0;
+ size_t len = 0;
enum get_remote_heads_state state = EXPECTING_FIRST_REF;
*list = NULL;
@@ -394,7 +393,7 @@ static int process_ref_v2(struct packet_reader *reader, struct ref ***list,
const char **unborn_head_target)
{
int ret = 1;
- int i = 0;
+ size_t i = 0;
struct object_id old_oid;
struct ref *ref;
struct string_list line_sections = STRING_LIST_INIT_DUP;
@@ -552,7 +551,7 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
const struct string_list *server_options,
int stateless_rpc)
{
- int i;
+ size_t i;
struct strvec *ref_prefixes = transport_options ?
&transport_options->ref_prefixes : NULL;
const char **unborn_head_target = transport_options ?
diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt
index 10dc54fdcb..3179e7ff7a 100644
--- a/contrib/buildsystems/CMakeLists.txt
+++ b/contrib/buildsystems/CMakeLists.txt
@@ -1205,6 +1205,7 @@ string(REPLACE "@TEST_OUTPUT_DIRECTORY@" "" git_build_options "${git_build_optio
string(REPLACE "@TEST_SHELL_PATH@" "'${TEST_SHELL_PATH}'" git_build_options "${git_build_options}")
string(REPLACE "@USE_GETTEXT_SCHEME@" "" git_build_options "${git_build_options}")
string(REPLACE "@USE_LIBPCRE2@" "" git_build_options "${git_build_options}")
+string(REPLACE "@WITH_BREAKING_CHANGES@" "" git_build_options "${git_build_options}")
string(REPLACE "@X@" "${EXE_EXTENSION}" git_build_options "${git_build_options}")
if(USE_VCPKG)
string(APPEND git_build_options "PATH=\"$PATH:$TEST_DIRECTORY/../compat/vcbuild/vcpkg/installed/x64-windows/bin\"\n")
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index b3b6aa3bae..413911be3b 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -2737,12 +2737,17 @@ __git_compute_config_vars_all ()
__git_config_vars_all="$(git --no-pager help --config)"
}
+__git_indirect()
+{
+ eval printf '%s' "\"\$$1\""
+}
+
__git_compute_first_level_config_vars_for_section ()
{
local section="$1"
__git_compute_config_vars
local this_section="__git_first_level_config_vars_for_section_${section}"
- test -n "${!this_section}" ||
+ test -n "$(__git_indirect "${this_section}")" ||
printf -v "__git_first_level_config_vars_for_section_${section}" %s \
"$(echo "$__git_config_vars" | awk -F. "/^${section}\.[a-z]/ { print \$2 }")"
}
@@ -2752,7 +2757,7 @@ __git_compute_second_level_config_vars_for_section ()
local section="$1"
__git_compute_config_vars_all
local this_section="__git_second_level_config_vars_for_section_${section}"
- test -n "${!this_section}" ||
+ test -n "$(__git_indirect "${this_section}")" ||
printf -v "__git_second_level_config_vars_for_section_${section}" %s \
"$(echo "$__git_config_vars_all" | awk -F. "/^${section}\.</ { print \$3 }")"
}
@@ -2907,7 +2912,7 @@ __git_complete_config_variable_name ()
local section="${pfx%.*.}"
__git_compute_second_level_config_vars_for_section "${section}"
local this_section="__git_second_level_config_vars_for_section_${section}"
- __gitcomp "${!this_section}" "$pfx" "$cur_" "$sfx"
+ __gitcomp "$(__git_indirect "${this_section}")" "$pfx" "$cur_" "$sfx"
return
;;
branch.*)
@@ -2917,7 +2922,7 @@ __git_complete_config_variable_name ()
__gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
__git_compute_first_level_config_vars_for_section "${section}"
local this_section="__git_first_level_config_vars_for_section_${section}"
- __gitcomp_nl_append "${!this_section}" "$pfx" "$cur_" "${sfx:- }"
+ __gitcomp_nl_append "$(__git_indirect "${this_section}")" "$pfx" "$cur_" "${sfx:- }"
return
;;
pager.*)
@@ -2934,7 +2939,7 @@ __git_complete_config_variable_name ()
__gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
__git_compute_first_level_config_vars_for_section "${section}"
local this_section="__git_first_level_config_vars_for_section_${section}"
- __gitcomp_nl_append "${!this_section}" "$pfx" "$cur_" "${sfx:- }"
+ __gitcomp_nl_append "$(__git_indirect "${this_section}")" "$pfx" "$cur_" "${sfx:- }"
return
;;
submodule.*)
@@ -2944,7 +2949,7 @@ __git_complete_config_variable_name ()
__gitcomp_nl "$(__git config -f "$(__git rev-parse --show-toplevel)/.gitmodules" --get-regexp 'submodule.*.path' | awk -F. '{print $2}')" "$pfx" "$cur_" "."
__git_compute_first_level_config_vars_for_section "${section}"
local this_section="__git_first_level_config_vars_for_section_${section}"
- __gitcomp_nl_append "${!this_section}" "$pfx" "$cur_" "${sfx:- }"
+ __gitcomp_nl_append "$(__git_indirect "${this_section}")" "$pfx" "$cur_" "${sfx:- }"
return
;;
*.*)
diff --git a/contrib/credential/libsecret/Makefile b/contrib/credential/libsecret/Makefile
index 3e67552cc5..97ce9c92fb 100644
--- a/contrib/credential/libsecret/Makefile
+++ b/contrib/credential/libsecret/Makefile
@@ -1,3 +1,6 @@
+# The default target of this Makefile is...
+all::
+
MAIN:=git-credential-libsecret
all:: $(MAIN)
diff --git a/contrib/credential/osxkeychain/Makefile b/contrib/credential/osxkeychain/Makefile
index 238f5f8c36..0948297e20 100644
--- a/contrib/credential/osxkeychain/Makefile
+++ b/contrib/credential/osxkeychain/Makefile
@@ -1,3 +1,4 @@
+# The default target of this Makefile is...
all:: git-credential-osxkeychain
CC = gcc
diff --git a/contrib/credential/wincred/Makefile b/contrib/credential/wincred/Makefile
index 6e992c0866..5b795fc9fe 100644
--- a/contrib/credential/wincred/Makefile
+++ b/contrib/credential/wincred/Makefile
@@ -1,4 +1,5 @@
-all: git-credential-wincred.exe
+# The default target of this Makefile is...
+all:: git-credential-wincred.exe
-include ../../../config.mak.autogen
-include ../../../config.mak
diff --git a/contrib/diff-highlight/Makefile b/contrib/diff-highlight/Makefile
index f2be7cc924..33c2ccc9f7 100644
--- a/contrib/diff-highlight/Makefile
+++ b/contrib/diff-highlight/Makefile
@@ -1,4 +1,5 @@
-all: diff-highlight
+# The default target of this Makefile is...
+all:: diff-highlight
PERL_PATH = /usr/bin/perl
-include ../../config.mak
diff --git a/contrib/diff-highlight/t/Makefile b/contrib/diff-highlight/t/Makefile
index 5ff5275496..2a98541477 100644
--- a/contrib/diff-highlight/t/Makefile
+++ b/contrib/diff-highlight/t/Makefile
@@ -1,3 +1,6 @@
+# The default target of this Makefile is...
+all::
+
-include ../../../config.mak.autogen
-include ../../../config.mak
@@ -6,7 +9,7 @@ SHELL_PATH ?= $(SHELL)
SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)
-all: test
+all:: test
test: $(T)
.PHONY: help clean all test $(T)
diff --git a/contrib/libgit-rs/Cargo.lock b/contrib/libgit-rs/Cargo.lock
new file mode 100644
index 0000000000..a30c7c8d33
--- /dev/null
+++ b/contrib/libgit-rs/Cargo.lock
@@ -0,0 +1,77 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "autocfg"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+
+[[package]]
+name = "cc"
+version = "1.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6"
+dependencies = [
+ "shlex",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.158"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
+
+[[package]]
+name = "libgit"
+version = "0.1.0"
+dependencies = [
+ "autocfg",
+ "libgit-sys",
+]
+
+[[package]]
+name = "libgit-sys"
+version = "0.1.0"
+dependencies = [
+ "autocfg",
+ "libz-sys",
+ "make-cmd",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "make-cmd"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8ca8afbe8af1785e09636acb5a41e08a765f5f0340568716c18a8700ba3c0d3"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
diff --git a/contrib/libgit-rs/Cargo.toml b/contrib/libgit-rs/Cargo.toml
new file mode 100644
index 0000000000..c3289e69db
--- /dev/null
+++ b/contrib/libgit-rs/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "libgit"
+version = "0.1.0"
+edition = "2021"
+build = "build.rs"
+rust-version = "1.63" # TODO: Once we hit 1.84 or newer, we may want to remove Cargo.lock from
+ # version control. See https://lore.kernel.org/git/Z47jgK-oMjFRSslr@tapette.crustytoothpaste.net/
+
+
+[lib]
+path = "src/lib.rs"
+
+[dependencies]
+libgit-sys = { version = "0.1.0", path = "../libgit-sys" }
+
+[build-dependencies]
+autocfg = "1.4.0"
diff --git a/contrib/libgit-rs/README.md b/contrib/libgit-rs/README.md
new file mode 100644
index 0000000000..ff945e1ce2
--- /dev/null
+++ b/contrib/libgit-rs/README.md
@@ -0,0 +1,13 @@
+# libgit-rs
+
+Proof-of-concept Git bindings for Rust.
+
+```toml
+[dependencies]
+libgit = "0.1.0"
+```
+
+## Rust version requirements
+
+libgit-rs should support Rust versions at least as old as the version included
+in Debian stable (currently 1.63).
diff --git a/contrib/libgit-rs/build.rs b/contrib/libgit-rs/build.rs
new file mode 100644
index 0000000000..f8bd01a690
--- /dev/null
+++ b/contrib/libgit-rs/build.rs
@@ -0,0 +1,4 @@
+pub fn main() {
+ let ac = autocfg::new();
+ ac.emit_has_path("std::ffi::c_char");
+}
diff --git a/contrib/libgit-rs/src/config.rs b/contrib/libgit-rs/src/config.rs
new file mode 100644
index 0000000000..6bf04845c8
--- /dev/null
+++ b/contrib/libgit-rs/src/config.rs
@@ -0,0 +1,106 @@
+use std::ffi::{c_void, CStr, CString};
+use std::path::Path;
+
+#[cfg(has_std__ffi__c_char)]
+use std::ffi::{c_char, c_int};
+
+#[cfg(not(has_std__ffi__c_char))]
+#[allow(non_camel_case_types)]
+type c_char = i8;
+
+#[cfg(not(has_std__ffi__c_char))]
+#[allow(non_camel_case_types)]
+type c_int = i32;
+
+use libgit_sys::*;
+
+/// A ConfigSet is an in-memory cache for config-like files such as `.gitmodules` or `.gitconfig`.
+/// It does not support all config directives; notably, it will not process `include` or
+/// `includeIf` directives (but it will store them so that callers can choose whether and how to
+/// handle them).
+pub struct ConfigSet(*mut libgit_config_set);
+impl ConfigSet {
+ /// Allocate a new ConfigSet
+ pub fn new() -> Self {
+ unsafe { ConfigSet(libgit_configset_alloc()) }
+ }
+
+ /// Load the given files into the ConfigSet; conflicting directives in later files will
+ /// override those given in earlier files.
+ pub fn add_files(&mut self, files: &[&Path]) {
+ for file in files {
+ let pstr = file.to_str().expect("Invalid UTF-8");
+ let rs = CString::new(pstr).expect("Couldn't convert to CString");
+ unsafe {
+ libgit_configset_add_file(self.0, rs.as_ptr());
+ }
+ }
+ }
+
+ /// Load the value for the given key and attempt to parse it as an i32. Dies with a fatal error
+ /// if the value cannot be parsed. Returns None if the key is not present.
+ pub fn get_int(&mut self, key: &str) -> Option<i32> {
+ let key = CString::new(key).expect("Couldn't convert to CString");
+ let mut val: c_int = 0;
+ unsafe {
+ if libgit_configset_get_int(self.0, key.as_ptr(), &mut val as *mut c_int) != 0 {
+ return None;
+ }
+ }
+
+ Some(val.into())
+ }
+
+ /// Clones the value for the given key. Dies with a fatal error if the value cannot be
+ /// converted to a String. Returns None if the key is not present.
+ pub fn get_string(&mut self, key: &str) -> Option<String> {
+ let key = CString::new(key).expect("Couldn't convert key to CString");
+ let mut val: *mut c_char = std::ptr::null_mut();
+ unsafe {
+ if libgit_configset_get_string(self.0, key.as_ptr(), &mut val as *mut *mut c_char) != 0
+ {
+ return None;
+ }
+ let borrowed_str = CStr::from_ptr(val);
+ let owned_str =
+ String::from(borrowed_str.to_str().expect("Couldn't convert val to str"));
+ free(val as *mut c_void); // Free the xstrdup()ed pointer from the C side
+ Some(owned_str)
+ }
+ }
+}
+
+impl Default for ConfigSet {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl Drop for ConfigSet {
+ fn drop(&mut self) {
+ unsafe {
+ libgit_configset_free(self.0);
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn load_configs_via_configset() {
+ let mut cs = ConfigSet::new();
+ cs.add_files(&[
+ Path::new("testdata/config1"),
+ Path::new("testdata/config2"),
+ Path::new("testdata/config3"),
+ ]);
+ // ConfigSet retrieves correct value
+ assert_eq!(cs.get_int("trace2.eventTarget"), Some(1));
+ // ConfigSet respects last config value set
+ assert_eq!(cs.get_int("trace2.eventNesting"), Some(3));
+ // ConfigSet returns None for missing key
+ assert_eq!(cs.get_string("foo.bar"), None);
+ }
+}
diff --git a/contrib/libgit-rs/src/lib.rs b/contrib/libgit-rs/src/lib.rs
new file mode 100644
index 0000000000..ef68c36943
--- /dev/null
+++ b/contrib/libgit-rs/src/lib.rs
@@ -0,0 +1 @@
+pub mod config;
diff --git a/contrib/libgit-rs/testdata/config1 b/contrib/libgit-rs/testdata/config1
new file mode 100644
index 0000000000..4e9a9d25d1
--- /dev/null
+++ b/contrib/libgit-rs/testdata/config1
@@ -0,0 +1,2 @@
+[trace2]
+ eventNesting = 1
diff --git a/contrib/libgit-rs/testdata/config2 b/contrib/libgit-rs/testdata/config2
new file mode 100644
index 0000000000..b8d1eca423
--- /dev/null
+++ b/contrib/libgit-rs/testdata/config2
@@ -0,0 +1,2 @@
+[trace2]
+ eventTarget = 1
diff --git a/contrib/libgit-rs/testdata/config3 b/contrib/libgit-rs/testdata/config3
new file mode 100644
index 0000000000..ca7b9a7c38
--- /dev/null
+++ b/contrib/libgit-rs/testdata/config3
@@ -0,0 +1,2 @@
+[trace2]
+ eventNesting = 3
diff --git a/contrib/libgit-sys/Cargo.lock b/contrib/libgit-sys/Cargo.lock
new file mode 100644
index 0000000000..427a4c66b7
--- /dev/null
+++ b/contrib/libgit-sys/Cargo.lock
@@ -0,0 +1,69 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "autocfg"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+
+[[package]]
+name = "cc"
+version = "1.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6"
+dependencies = [
+ "shlex",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.158"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
+
+[[package]]
+name = "libgit-sys"
+version = "0.1.0"
+dependencies = [
+ "autocfg",
+ "libz-sys",
+ "make-cmd",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "make-cmd"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8ca8afbe8af1785e09636acb5a41e08a765f5f0340568716c18a8700ba3c0d3"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
diff --git a/contrib/libgit-sys/Cargo.toml b/contrib/libgit-sys/Cargo.toml
new file mode 100644
index 0000000000..e0623022c3
--- /dev/null
+++ b/contrib/libgit-sys/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "libgit-sys"
+version = "0.1.0"
+edition = "2021"
+build = "build.rs"
+links = "gitpub"
+rust-version = "1.63" # TODO: Once we hit 1.84 or newer, we may want to remove Cargo.lock from
+ # version control. See https://lore.kernel.org/git/Z47jgK-oMjFRSslr@tapette.crustytoothpaste.net/
+description = "Native bindings to a portion of libgit"
+
+[lib]
+path = "src/lib.rs"
+
+[dependencies]
+libz-sys = "1.1.19"
+
+[build-dependencies]
+autocfg = "1.4.0"
+make-cmd = "0.1.0"
diff --git a/contrib/libgit-sys/README.md b/contrib/libgit-sys/README.md
new file mode 100644
index 0000000000..c061cfcaf5
--- /dev/null
+++ b/contrib/libgit-sys/README.md
@@ -0,0 +1,4 @@
+# libgit-sys
+
+A small proof-of-concept crate showing how to provide a Rust FFI to Git
+internals.
diff --git a/contrib/libgit-sys/build.rs b/contrib/libgit-sys/build.rs
new file mode 100644
index 0000000000..3ffd80ad91
--- /dev/null
+++ b/contrib/libgit-sys/build.rs
@@ -0,0 +1,35 @@
+use std::env;
+use std::path::PathBuf;
+
+pub fn main() -> std::io::Result<()> {
+ let ac = autocfg::new();
+ ac.emit_has_path("std::ffi::c_char");
+
+ let crate_root = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
+ let git_root = crate_root.join("../..");
+ let dst = PathBuf::from(env::var_os("OUT_DIR").unwrap());
+
+ let make_output = make_cmd::gnu_make()
+ .env("DEVELOPER", "1")
+ .env_remove("PROFILE")
+ .current_dir(git_root.clone())
+ .args([
+ "INCLUDE_LIBGIT_RS=YesPlease",
+ "contrib/libgit-sys/libgitpub.a",
+ ])
+ .output()
+ .expect("Make failed to run");
+ if !make_output.status.success() {
+ panic!(
+ "Make failed:\n stdout = {}\n stderr = {}\n",
+ String::from_utf8(make_output.stdout).unwrap(),
+ String::from_utf8(make_output.stderr).unwrap()
+ );
+ }
+ std::fs::copy(crate_root.join("libgitpub.a"), dst.join("libgitpub.a"))?;
+ println!("cargo:rustc-link-search=native={}", dst.display());
+ println!("cargo:rustc-link-lib=gitpub");
+ println!("cargo:rerun-if-changed={}", git_root.display());
+
+ Ok(())
+}
diff --git a/contrib/libgit-sys/public_symbol_export.c b/contrib/libgit-sys/public_symbol_export.c
new file mode 100644
index 0000000000..dfbb257115
--- /dev/null
+++ b/contrib/libgit-sys/public_symbol_export.c
@@ -0,0 +1,59 @@
+/*
+ * Shim to publicly export Git symbols. These must be renamed so that the
+ * original symbols can be hidden. Renaming these with a "libgit_" prefix also
+ * avoids conflicts with other libraries such as libgit2.
+ */
+
+#include "git-compat-util.h"
+#include "config.h"
+#include "contrib/libgit-sys/public_symbol_export.h"
+#include "version.h"
+
+#pragma GCC visibility push(default)
+
+struct libgit_config_set {
+ struct config_set cs;
+};
+
+struct libgit_config_set *libgit_configset_alloc(void)
+{
+ struct libgit_config_set *cs =
+ xmalloc(sizeof(struct libgit_config_set));
+ git_configset_init(&cs->cs);
+ return cs;
+}
+
+void libgit_configset_free(struct libgit_config_set *cs)
+{
+ git_configset_clear(&cs->cs);
+ free(cs);
+}
+
+int libgit_configset_add_file(struct libgit_config_set *cs, const char *filename)
+{
+ return git_configset_add_file(&cs->cs, filename);
+}
+
+int libgit_configset_get_int(struct libgit_config_set *cs, const char *key,
+ int *dest)
+{
+ return git_configset_get_int(&cs->cs, key, dest);
+}
+
+int libgit_configset_get_string(struct libgit_config_set *cs, const char *key,
+ char **dest)
+{
+ return git_configset_get_string(&cs->cs, key, dest);
+}
+
+const char *libgit_user_agent(void)
+{
+ return git_user_agent();
+}
+
+const char *libgit_user_agent_sanitized(void)
+{
+ return git_user_agent_sanitized();
+}
+
+#pragma GCC visibility pop
diff --git a/contrib/libgit-sys/public_symbol_export.h b/contrib/libgit-sys/public_symbol_export.h
new file mode 100644
index 0000000000..701db92d53
--- /dev/null
+++ b/contrib/libgit-sys/public_symbol_export.h
@@ -0,0 +1,18 @@
+#ifndef PUBLIC_SYMBOL_EXPORT_H
+#define PUBLIC_SYMBOL_EXPORT_H
+
+struct libgit_config_set *libgit_configset_alloc(void);
+
+void libgit_configset_free(struct libgit_config_set *cs);
+
+int libgit_configset_add_file(struct libgit_config_set *cs, const char *filename);
+
+int libgit_configset_get_int(struct libgit_config_set *cs, const char *key, int *dest);
+
+int libgit_configset_get_string(struct libgit_config_set *cs, const char *key, char **dest);
+
+const char *libgit_user_agent(void);
+
+const char *libgit_user_agent_sanitized(void);
+
+#endif /* PUBLIC_SYMBOL_EXPORT_H */
diff --git a/contrib/libgit-sys/src/lib.rs b/contrib/libgit-sys/src/lib.rs
new file mode 100644
index 0000000000..4bfc650450
--- /dev/null
+++ b/contrib/libgit-sys/src/lib.rs
@@ -0,0 +1,79 @@
+use std::ffi::c_void;
+
+#[cfg(has_std__ffi__c_char)]
+use std::ffi::{c_char, c_int};
+
+#[cfg(not(has_std__ffi__c_char))]
+#[allow(non_camel_case_types)]
+pub type c_char = i8;
+
+#[cfg(not(has_std__ffi__c_char))]
+#[allow(non_camel_case_types)]
+pub type c_int = i32;
+
+extern crate libz_sys;
+
+#[allow(non_camel_case_types)]
+#[repr(C)]
+pub struct libgit_config_set {
+ _data: [u8; 0],
+ _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
+}
+
+extern "C" {
+ pub fn free(ptr: *mut c_void);
+
+ pub fn libgit_user_agent() -> *const c_char;
+ pub fn libgit_user_agent_sanitized() -> *const c_char;
+
+ pub fn libgit_configset_alloc() -> *mut libgit_config_set;
+ pub fn libgit_configset_free(cs: *mut libgit_config_set);
+
+ pub fn libgit_configset_add_file(cs: *mut libgit_config_set, filename: *const c_char) -> c_int;
+
+ pub fn libgit_configset_get_int(
+ cs: *mut libgit_config_set,
+ key: *const c_char,
+ int: *mut c_int,
+ ) -> c_int;
+
+ pub fn libgit_configset_get_string(
+ cs: *mut libgit_config_set,
+ key: *const c_char,
+ dest: *mut *mut c_char,
+ ) -> c_int;
+
+}
+
+#[cfg(test)]
+mod tests {
+ use std::ffi::CStr;
+
+ use super::*;
+
+ #[test]
+ fn user_agent_starts_with_git() {
+ let c_str = unsafe { CStr::from_ptr(libgit_user_agent()) };
+ let agent = c_str
+ .to_str()
+ .expect("User agent contains invalid UTF-8 data");
+ assert!(
+ agent.starts_with("git/"),
+ r#"Expected user agent to start with "git/", got: {}"#,
+ agent
+ );
+ }
+
+ #[test]
+ fn sanitized_user_agent_starts_with_git() {
+ let c_str = unsafe { CStr::from_ptr(libgit_user_agent_sanitized()) };
+ let agent = c_str
+ .to_str()
+ .expect("Sanitized user agent contains invalid UTF-8 data");
+ assert!(
+ agent.starts_with("git/"),
+ r#"Expected user agent to start with "git/", got: {}"#,
+ agent
+ );
+ }
+}
diff --git a/contrib/meson.build b/contrib/meson.build
index a7b77b87c2..d74b64a518 100644
--- a/contrib/meson.build
+++ b/contrib/meson.build
@@ -1 +1,3 @@
-subdir('completion')
+foreach feature : get_option('contrib')
+ subdir(feature)
+endforeach
diff --git a/contrib/mw-to-git/Makefile b/contrib/mw-to-git/Makefile
index 4e603512a3..497ac434d6 100644
--- a/contrib/mw-to-git/Makefile
+++ b/contrib/mw-to-git/Makefile
@@ -12,6 +12,9 @@
#
# make install
+# The default target of this Makefile is...
+all::
+
GIT_MEDIAWIKI_PM=Git/Mediawiki.pm
SCRIPT_PERL=git-remote-mediawiki.perl
SCRIPT_PERL+=git-mw.perl
@@ -27,7 +30,7 @@ INSTLIBDIR=$(shell $(MAKE) -C $(GIT_ROOT_DIR)/ \
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
INSTLIBDIR_SQ = $(subst ','\'',$(INSTLIBDIR))
-all: build
+all:: build
test: all
$(MAKE) -C t
diff --git a/contrib/mw-to-git/t/Makefile b/contrib/mw-to-git/t/Makefile
index f422203fa0..6c9f377caa 100644
--- a/contrib/mw-to-git/t/Makefile
+++ b/contrib/mw-to-git/t/Makefile
@@ -8,7 +8,8 @@
#
## Test git-remote-mediawiki
-all: test
+# The default target of this Makefile is...
+all:: test
-include ../../../config.mak.autogen
-include ../../../config.mak
diff --git a/contrib/persistent-https/Makefile b/contrib/persistent-https/Makefile
index 52b84ba3d4..691737e76b 100644
--- a/contrib/persistent-https/Makefile
+++ b/contrib/persistent-https/Makefile
@@ -12,10 +12,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+# The default target of this Makefile is...
+all::
+
BUILD_LABEL=$(shell cut -d" " -f3 ../../GIT-VERSION-FILE)
TAR_OUT=$(shell go env GOOS)_$(shell go env GOARCH).tar.gz
-all: git-remote-persistent-https git-remote-persistent-https--proxy \
+all:: git-remote-persistent-https git-remote-persistent-https--proxy \
git-remote-persistent-http
git-remote-persistent-https--proxy: git-remote-persistent-https
diff --git a/contrib/subtree/.gitignore b/contrib/subtree/.gitignore
index 0b9381abca..6deaf177c7 100644
--- a/contrib/subtree/.gitignore
+++ b/contrib/subtree/.gitignore
@@ -1,4 +1,6 @@
*~
+asciidoc.conf
+asciidoctor-extensions.rb
git-subtree
git-subtree.1
git-subtree.html
diff --git a/contrib/subtree/Makefile b/contrib/subtree/Makefile
index 6fa7496bfd..8fe0bfd401 100644
--- a/contrib/subtree/Makefile
+++ b/contrib/subtree/Makefile
@@ -1,6 +1,7 @@
# The default target of this Makefile is...
all::
+-include ../../shared.mak
-include ../../config.mak.autogen
-include ../../config.mak
@@ -13,17 +14,16 @@ htmldir ?= $(prefix)/share/doc/git-doc
../../GIT-VERSION-FILE: FORCE
$(MAKE) -C ../../ GIT-VERSION-FILE
--include ../../GIT-VERSION-FILE
-
# this should be set to a 'standard' bsd-type install program
INSTALL ?= install
RM ?= rm -f
ASCIIDOC = asciidoc
-ASCIIDOC_CONF = -f ../../Documentation/asciidoc.conf
+ASCIIDOC_CONF = -f asciidoc.conf
ASCIIDOC_HTML = xhtml11
ASCIIDOC_DOCBOOK = docbook
ASCIIDOC_EXTRA =
+ASCIIDOC_DEPS = asciidoc.conf
XMLTO = xmlto
XMLTO_EXTRA =
@@ -32,8 +32,9 @@ ASCIIDOC = asciidoctor
ASCIIDOC_CONF =
ASCIIDOC_HTML = xhtml5
ASCIIDOC_DOCBOOK = docbook
-ASCIIDOC_EXTRA += -I../../Documentation -rasciidoctor-extensions
+ASCIIDOC_EXTRA += -I. -rasciidoctor-extensions
ASCIIDOC_EXTRA += -alitdd='&\#x2d;&\#x2d;'
+ASCIIDOC_DEPS = asciidoctor-extensions.rb
XMLTO_EXTRA += --skip-validation
endif
@@ -82,13 +83,13 @@ install-html: $(GIT_SUBTREE_HTML)
$(GIT_SUBTREE_DOC): $(GIT_SUBTREE_XML)
$(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $^
-$(GIT_SUBTREE_XML): $(GIT_SUBTREE_TXT)
+$(GIT_SUBTREE_XML): $(GIT_SUBTREE_TXT) $(ASCIIDOC_DEPS)
$(ASCIIDOC) -b $(ASCIIDOC_DOCBOOK) -d manpage $(ASCIIDOC_CONF) \
- -agit_version=$(GIT_VERSION) $(ASCIIDOC_EXTRA) $^
+ $(ASCIIDOC_EXTRA) $<
-$(GIT_SUBTREE_HTML): $(GIT_SUBTREE_TXT)
+$(GIT_SUBTREE_HTML): $(GIT_SUBTREE_TXT) $(ASCIIDOC_DEPS)
$(ASCIIDOC) -b $(ASCIIDOC_HTML) -d manpage $(ASCIIDOC_CONF) \
- -agit_version=$(GIT_VERSION) $(ASCIIDOC_EXTRA) $^
+ $(ASCIIDOC_EXTRA) $<
$(GIT_SUBTREE_TEST): $(GIT_SUBTREE)
cp $< $@
@@ -98,6 +99,12 @@ test: $(GIT_SUBTREE_TEST)
clean:
$(RM) $(GIT_SUBTREE)
+ $(RM) asciidoc.conf asciidoctor-extensions.rb
$(RM) *.xml *.html *.1
+asciidoc.conf: ../../Documentation/asciidoc.conf.in ../../GIT-VERSION-FILE
+ $(QUIET_GEN)$(call version_gen,"$(shell pwd)/../..",$<,$@)
+asciidoctor-extensions.rb: ../../Documentation/asciidoctor-extensions.rb.in ../../GIT-VERSION-FILE
+ $(QUIET_GEN)$(call version_gen,"$(shell pwd)/../..",$<,$@)
+
.PHONY: FORCE
diff --git a/contrib/subtree/meson.build b/contrib/subtree/meson.build
new file mode 100644
index 0000000000..a752a188df
--- /dev/null
+++ b/contrib/subtree/meson.build
@@ -0,0 +1,71 @@
+git_subtree = custom_target(
+ input: 'git-subtree.sh',
+ output: 'git-subtree',
+ command: [
+ shell,
+ meson.project_source_root() / 'generate-script.sh',
+ '@INPUT@',
+ '@OUTPUT@',
+ meson.project_build_root() / 'GIT-BUILD-OPTIONS',
+ ],
+ install: true,
+ install_dir: get_option('libexecdir') / 'git-core',
+)
+
+subtree_test_environment = test_environment
+subtree_test_environment.prepend('PATH', meson.current_build_dir())
+
+test('t7900-subtree', shell,
+ args: [ 't7900-subtree.sh' ],
+ env: subtree_test_environment,
+ workdir: meson.current_source_dir() / 't',
+ depends: test_dependencies + bin_wrappers + [ git_subtree ],
+ timeout: 0,
+)
+
+if get_option('docs').contains('man')
+ subtree_xml = custom_target(
+ command: asciidoc_common_options + [
+ '--backend=' + asciidoc_docbook,
+ '--doctype=manpage',
+ '--out-file=@OUTPUT@',
+ '@INPUT@',
+ ],
+ depends: documentation_deps,
+ input: 'git-subtree.txt',
+ output: 'git-subtree.xml',
+ )
+
+ custom_target(
+ command: [
+ xmlto,
+ '-m', '@INPUT@',
+ 'man',
+ subtree_xml,
+ '-o',
+ meson.current_build_dir(),
+ ] + xmlto_extra,
+ input: [
+ '../../Documentation/manpage-normal.xsl',
+ ],
+ output: 'git-subtree.1',
+ install: true,
+ install_dir: get_option('mandir') / 'man1',
+ )
+endif
+
+if get_option('docs').contains('html')
+ custom_target(
+ command: asciidoc_common_options + [
+ '--backend=' + asciidoc_html,
+ '--doctype=manpage',
+ '--out-file=@OUTPUT@',
+ '@INPUT@',
+ ],
+ depends: documentation_deps,
+ input: 'git-subtree.txt',
+ output: 'git-subtree.html',
+ install: true,
+ install_dir: get_option('datadir') / 'doc/git-doc',
+ )
+endif
diff --git a/contrib/subtree/t/Makefile b/contrib/subtree/t/Makefile
index 093399c788..2a85f5ee84 100644
--- a/contrib/subtree/t/Makefile
+++ b/contrib/subtree/t/Makefile
@@ -3,6 +3,9 @@
# Copyright (c) 2005 Junio C Hamano
#
+# The default target of this Makefile is...
+all::
+
-include ../../../config.mak.autogen
-include ../../../config.mak
@@ -31,7 +34,7 @@ TSVN = $(sort $(wildcard t91[0-9][0-9]-*.sh))
TGITWEB = $(sort $(wildcard t95[0-9][0-9]-*.sh))
THELPERS = $(sort $(filter-out $(T),$(wildcard *.sh)))
-all: $(DEFAULT_TEST_TARGET)
+all:: $(DEFAULT_TEST_TARGET)
test: pre-clean $(TEST_LINT)
$(MAKE) aggregate-results-and-cleanup
diff --git a/contrib/thunderbird-patch-inline/appp.sh b/contrib/thunderbird-patch-inline/appp.sh
index 1053872eea..fdcc948352 100755
--- a/contrib/thunderbird-patch-inline/appp.sh
+++ b/contrib/thunderbird-patch-inline/appp.sh
@@ -31,7 +31,7 @@ BODY=$(sed -e "1,/${SEP}/d" $1)
CMT_MSG=$(sed -e '1,/^$/d' -e '/^---$/,$d' "${PATCH}")
DIFF=$(sed -e '1,/^---$/d' "${PATCH}")
-CCS=$(echo -e "$CMT_MSG\n$HEADERS" | sed -n -e 's/^Cc: \(.*\)$/\1,/gp' \
+CCS=$(printf '%s\n%s\n' "$CMT_MSG" "$HEADERS" | sed -n -e 's/^Cc: \(.*\)$/\1,/gp' \
-e 's/^Signed-off-by: \(.*\)/\1,/gp')
echo "$SUBJECT" > $1
diff --git a/credential.c b/credential.c
index a995031c5f..2594c0c422 100644
--- a/credential.c
+++ b/credential.c
@@ -1,4 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
@@ -13,7 +12,7 @@
#include "sigchain.h"
#include "strbuf.h"
#include "urlmatch.h"
-#include "git-compat-util.h"
+#include "environment.h"
#include "trace2.h"
#include "repository.h"
@@ -130,6 +129,10 @@ static int credential_config_callback(const char *var, const char *value,
}
else if (!strcmp(key, "usehttppath"))
c->use_http_path = git_config_bool(var, value);
+ else if (!strcmp(key, "sanitizeprompt"))
+ c->sanitize_prompt = git_config_bool(var, value);
+ else if (!strcmp(key, "protectprotocol"))
+ c->protect_protocol = git_config_bool(var, value);
return 0;
}
@@ -166,7 +169,7 @@ static int match_partial_url(const char *url, void *cb)
return matches;
}
-static void credential_apply_config(struct credential *c)
+static void credential_apply_config(struct repository *r, struct credential *c)
{
char *normalized_url;
struct urlmatch_config config = URLMATCH_CONFIG_INIT;
@@ -191,7 +194,7 @@ static void credential_apply_config(struct credential *c)
credential_format(c, &url);
normalized_url = url_normalize(url.buf, &config.url);
- git_config(urlmatch_config_entry, &config);
+ repo_config(r, urlmatch_config_entry, &config);
string_list_clear(&config.vars, 1);
free(normalized_url);
urlmatch_config_release(&config);
@@ -227,7 +230,8 @@ static void credential_format(struct credential *c, struct strbuf *out)
strbuf_addch(out, '@');
}
if (c->host)
- strbuf_addstr(out, c->host);
+ strbuf_add_percentencode(out, c->host,
+ STRBUF_ENCODE_HOST_AND_PORT);
if (c->path) {
strbuf_addch(out, '/');
strbuf_add_percentencode(out, c->path, 0);
@@ -241,7 +245,10 @@ static char *credential_ask_one(const char *what, struct credential *c,
struct strbuf prompt = STRBUF_INIT;
char *r;
- credential_describe(c, &desc);
+ if (c->sanitize_prompt)
+ credential_format(c, &desc);
+ else
+ credential_describe(c, &desc);
if (desc.len)
strbuf_addf(&prompt, "%s for '%s': ", what, desc.buf);
else
@@ -254,34 +261,34 @@ static char *credential_ask_one(const char *what, struct credential *c,
return xstrdup(r);
}
-static int credential_getpass(struct credential *c)
+static int credential_getpass(struct repository *r, struct credential *c)
{
int interactive;
char *value;
- if (!git_config_get_maybe_bool("credential.interactive", &interactive) &&
+ if (!repo_config_get_maybe_bool(r, "credential.interactive", &interactive) &&
!interactive) {
- trace2_data_intmax("credential", the_repository,
+ trace2_data_intmax("credential", r,
"interactive/skipped", 1);
return -1;
}
- if (!git_config_get_string("credential.interactive", &value)) {
+ if (!repo_config_get_string(r, "credential.interactive", &value)) {
int same = !strcmp(value, "never");
free(value);
if (same) {
- trace2_data_intmax("credential", the_repository,
+ trace2_data_intmax("credential", r,
"interactive/skipped", 1);
return -1;
}
}
- trace2_region_enter("credential", "interactive", the_repository);
+ trace2_region_enter("credential", "interactive", r);
if (!c->username)
c->username = credential_ask_one("Username", c,
PROMPT_ASKPASS|PROMPT_ECHO);
if (!c->password)
c->password = credential_ask_one("Password", c,
PROMPT_ASKPASS);
- trace2_region_leave("credential", "interactive", the_repository);
+ trace2_region_leave("credential", "interactive", r);
return 0;
}
@@ -382,7 +389,8 @@ int credential_read(struct credential *c, FILE *fp,
return 0;
}
-static void credential_write_item(FILE *fp, const char *key, const char *value,
+static void credential_write_item(const struct credential *c,
+ FILE *fp, const char *key, const char *value,
int required)
{
if (!value && required)
@@ -391,6 +399,10 @@ static void credential_write_item(FILE *fp, const char *key, const char *value,
return;
if (strchr(value, '\n'))
die("credential value for %s contains newline", key);
+ if (c->protect_protocol && strchr(value, '\r'))
+ die("credential value for %s contains carriage return\n"
+ "If this is intended, set `credential.protectProtocol=false`",
+ key);
fprintf(fp, "%s=%s\n", key, value);
}
@@ -398,34 +410,34 @@ void credential_write(const struct credential *c, FILE *fp,
enum credential_op_type op_type)
{
if (credential_has_capability(&c->capa_authtype, op_type))
- credential_write_item(fp, "capability[]", "authtype", 0);
+ credential_write_item(c, fp, "capability[]", "authtype", 0);
if (credential_has_capability(&c->capa_state, op_type))
- credential_write_item(fp, "capability[]", "state", 0);
+ credential_write_item(c, fp, "capability[]", "state", 0);
if (credential_has_capability(&c->capa_authtype, op_type)) {
- credential_write_item(fp, "authtype", c->authtype, 0);
- credential_write_item(fp, "credential", c->credential, 0);
+ credential_write_item(c, fp, "authtype", c->authtype, 0);
+ credential_write_item(c, fp, "credential", c->credential, 0);
if (c->ephemeral)
- credential_write_item(fp, "ephemeral", "1", 0);
+ credential_write_item(c, fp, "ephemeral", "1", 0);
}
- credential_write_item(fp, "protocol", c->protocol, 1);
- credential_write_item(fp, "host", c->host, 1);
- credential_write_item(fp, "path", c->path, 0);
- credential_write_item(fp, "username", c->username, 0);
- credential_write_item(fp, "password", c->password, 0);
- credential_write_item(fp, "oauth_refresh_token", c->oauth_refresh_token, 0);
+ credential_write_item(c, fp, "protocol", c->protocol, 1);
+ credential_write_item(c, fp, "host", c->host, 1);
+ credential_write_item(c, fp, "path", c->path, 0);
+ credential_write_item(c, fp, "username", c->username, 0);
+ credential_write_item(c, fp, "password", c->password, 0);
+ credential_write_item(c, fp, "oauth_refresh_token", c->oauth_refresh_token, 0);
if (c->password_expiry_utc != TIME_MAX) {
char *s = xstrfmt("%"PRItime, c->password_expiry_utc);
- credential_write_item(fp, "password_expiry_utc", s, 0);
+ credential_write_item(c, fp, "password_expiry_utc", s, 0);
free(s);
}
for (size_t i = 0; i < c->wwwauth_headers.nr; i++)
- credential_write_item(fp, "wwwauth[]", c->wwwauth_headers.v[i], 0);
+ credential_write_item(c, fp, "wwwauth[]", c->wwwauth_headers.v[i], 0);
if (credential_has_capability(&c->capa_state, op_type)) {
if (c->multistage)
- credential_write_item(fp, "continue", "1", 0);
+ credential_write_item(c, fp, "continue", "1", 0);
for (size_t i = 0; i < c->state_headers_to_send.nr; i++)
- credential_write_item(fp, "state[]", c->state_headers_to_send.v[i], 0);
+ credential_write_item(c, fp, "state[]", c->state_headers_to_send.v[i], 0);
}
}
@@ -489,7 +501,8 @@ static int credential_do(struct credential *c, const char *helper,
return r;
}
-void credential_fill(struct credential *c, int all_capabilities)
+void credential_fill(struct repository *r,
+ struct credential *c, int all_capabilities)
{
int i;
@@ -499,7 +512,7 @@ void credential_fill(struct credential *c, int all_capabilities)
credential_next_state(c);
c->multistage = 0;
- credential_apply_config(c);
+ credential_apply_config(r, c);
if (all_capabilities)
credential_set_all_capabilities(c, CREDENTIAL_OP_INITIAL);
@@ -526,12 +539,12 @@ void credential_fill(struct credential *c, int all_capabilities)
c->helpers.items[i].string);
}
- if (credential_getpass(c) ||
+ if (credential_getpass(r, c) ||
(!c->username && !c->password && !c->credential))
die("unable to get password from user");
}
-void credential_approve(struct credential *c)
+void credential_approve(struct repository *r, struct credential *c)
{
int i;
@@ -542,20 +555,20 @@ void credential_approve(struct credential *c)
credential_next_state(c);
- credential_apply_config(c);
+ credential_apply_config(r, c);
for (i = 0; i < c->helpers.nr; i++)
credential_do(c, c->helpers.items[i].string, "store");
c->approved = 1;
}
-void credential_reject(struct credential *c)
+void credential_reject(struct repository *r, struct credential *c)
{
int i;
credential_next_state(c);
- credential_apply_config(c);
+ credential_apply_config(r, c);
for (i = 0; i < c->helpers.nr; i++)
credential_do(c, c->helpers.items[i].string, "erase");
diff --git a/credential.h b/credential.h
index 5f9e6ff2ef..c78b72d110 100644
--- a/credential.h
+++ b/credential.h
@@ -4,6 +4,8 @@
#include "string-list.h"
#include "strvec.h"
+struct repository;
+
/**
* The credentials API provides an abstracted way of gathering
* authentication credentials from the user.
@@ -65,7 +67,7 @@
* // Fill in the username and password fields by contacting
* // helpers and/or asking the user. The function will die if it
* // fails.
- * credential_fill(&c);
+ * credential_fill(repo, &c);
*
* // Otherwise, we have a username and password. Try to use it.
*
@@ -168,7 +170,9 @@ struct credential {
multistage: 1,
quit:1,
use_http_path:1,
- username_from_proto:1;
+ username_from_proto:1,
+ sanitize_prompt:1,
+ protect_protocol:1;
struct credential_capability capa_authtype;
struct credential_capability capa_state;
@@ -195,6 +199,8 @@ struct credential {
.wwwauth_headers = STRVEC_INIT, \
.state_headers = STRVEC_INIT, \
.state_headers_to_send = STRVEC_INIT, \
+ .sanitize_prompt = 1, \
+ .protect_protocol = 1, \
}
/* Initialize a credential structure, setting all fields to empty. */
@@ -218,7 +224,8 @@ void credential_clear(struct credential *);
* If all_capabilities is set, this is an internal user that is prepared
* to deal with all known capabilities, and we should advertise that fact.
*/
-void credential_fill(struct credential *, int all_capabilities);
+void credential_fill(struct repository *, struct credential *,
+ int all_capabilities);
/**
* Inform the credential subsystem that the provided credentials
@@ -227,7 +234,7 @@ void credential_fill(struct credential *, int all_capabilities);
* that they may store the result to be used again. Any errors
* from helpers are ignored.
*/
-void credential_approve(struct credential *);
+void credential_approve(struct repository *, struct credential *);
/**
* Inform the credential subsystem that the provided credentials
@@ -239,7 +246,7 @@ void credential_approve(struct credential *);
* for another call to `credential_fill`). Any errors from helpers
* are ignored.
*/
-void credential_reject(struct credential *);
+void credential_reject(struct repository *, struct credential *);
/**
* Enable all of the supported credential flags in this credential.
diff --git a/csum-file.c b/csum-file.c
index 5716016e12..b58c183a4f 100644
--- a/csum-file.c
+++ b/csum-file.c
@@ -11,9 +11,10 @@
#define USE_THE_REPOSITORY_VARIABLE
#include "git-compat-util.h"
-#include "progress.h"
#include "csum-file.h"
+#include "git-zlib.h"
#include "hash.h"
+#include "progress.h"
static void verify_buffer_or_die(struct hashfile *f,
const void *buf,
@@ -50,7 +51,7 @@ void hashflush(struct hashfile *f)
if (offset) {
if (!f->skip_hash)
- the_hash_algo->unsafe_update_fn(&f->ctx, f->buffer, offset);
+ git_hash_update(&f->ctx, f->buffer, offset);
flush(f, f->buffer, offset);
f->offset = 0;
}
@@ -71,14 +72,14 @@ int finalize_hashfile(struct hashfile *f, unsigned char *result,
hashflush(f);
if (f->skip_hash)
- hashclr(f->buffer, the_repository->hash_algo);
+ hashclr(f->buffer, f->algop);
else
- the_hash_algo->unsafe_final_fn(f->buffer, &f->ctx);
+ git_hash_final(f->buffer, &f->ctx);
if (result)
- hashcpy(result, f->buffer, the_repository->hash_algo);
+ hashcpy(result, f->buffer, f->algop);
if (flags & CSUM_HASH_IN_STREAM)
- flush(f, f->buffer, the_hash_algo->rawsz);
+ flush(f, f->buffer, f->algop->rawsz);
if (flags & CSUM_FSYNC)
fsync_component_or_die(component, f->fd, f->name);
if (flags & CSUM_CLOSE) {
@@ -128,7 +129,7 @@ void hashwrite(struct hashfile *f, const void *buf, unsigned int count)
* f->offset is necessarily zero.
*/
if (!f->skip_hash)
- the_hash_algo->unsafe_update_fn(&f->ctx, buf, nr);
+ git_hash_update(&f->ctx, buf, nr);
flush(f, buf, nr);
} else {
/*
@@ -174,7 +175,9 @@ static struct hashfile *hashfd_internal(int fd, const char *name,
f->name = name;
f->do_crc = 0;
f->skip_hash = 0;
- the_hash_algo->unsafe_init_fn(&f->ctx);
+
+ f->algop = unsafe_hash_algo(the_hash_algo);
+ f->algop->init_fn(&f->ctx);
f->buffer_len = buffer_len;
f->buffer = xmalloc(buffer_len);
@@ -204,11 +207,18 @@ struct hashfile *hashfd_throughput(int fd, const char *name, struct progress *tp
return hashfd_internal(fd, name, tp, 8 * 1024);
}
+void hashfile_checkpoint_init(struct hashfile *f,
+ struct hashfile_checkpoint *checkpoint)
+{
+ memset(checkpoint, 0, sizeof(*checkpoint));
+ f->algop->init_fn(&checkpoint->ctx);
+}
+
void hashfile_checkpoint(struct hashfile *f, struct hashfile_checkpoint *checkpoint)
{
hashflush(f);
checkpoint->offset = f->total;
- the_hash_algo->unsafe_clone_fn(&checkpoint->ctx, &f->ctx);
+ git_hash_clone(&checkpoint->ctx, &f->ctx);
}
int hashfile_truncate(struct hashfile *f, struct hashfile_checkpoint *checkpoint)
@@ -219,7 +229,7 @@ int hashfile_truncate(struct hashfile *f, struct hashfile_checkpoint *checkpoint
lseek(f->fd, offset, SEEK_SET) != offset)
return -1;
f->total = offset;
- the_hash_algo->unsafe_clone_fn(&f->ctx, &checkpoint->ctx);
+ git_hash_clone(&f->ctx, &checkpoint->ctx);
f->offset = 0; /* hashflush() was called in checkpoint */
return 0;
}
@@ -239,15 +249,16 @@ uint32_t crc32_end(struct hashfile *f)
int hashfile_checksum_valid(const unsigned char *data, size_t total_len)
{
unsigned char got[GIT_MAX_RAWSZ];
- git_hash_ctx ctx;
- size_t data_len = total_len - the_hash_algo->rawsz;
+ struct git_hash_ctx ctx;
+ const struct git_hash_algo *algop = unsafe_hash_algo(the_hash_algo);
+ size_t data_len = total_len - algop->rawsz;
- if (total_len < the_hash_algo->rawsz)
+ if (total_len < algop->rawsz)
return 0; /* say "too short"? */
- the_hash_algo->unsafe_init_fn(&ctx);
- the_hash_algo->unsafe_update_fn(&ctx, data, data_len);
- the_hash_algo->unsafe_final_fn(got, &ctx);
+ algop->init_fn(&ctx);
+ git_hash_update(&ctx, data, data_len);
+ git_hash_final(got, &ctx);
- return hasheq(got, data + data_len, the_repository->hash_algo);
+ return hasheq(got, data + data_len, algop);
}
diff --git a/csum-file.h b/csum-file.h
index 7c73da0a40..ffccbf0996 100644
--- a/csum-file.h
+++ b/csum-file.h
@@ -11,7 +11,7 @@ struct hashfile {
int fd;
int check_fd;
unsigned int offset;
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
off_t total;
struct progress *tp;
const char *name;
@@ -20,6 +20,7 @@ struct hashfile {
size_t buffer_len;
unsigned char *buffer;
unsigned char *check_buffer;
+ const struct git_hash_algo *algop;
/**
* If non-zero, skip_hash indicates that we should
@@ -32,9 +33,10 @@ struct hashfile {
/* Checkpoint */
struct hashfile_checkpoint {
off_t offset;
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
};
+void hashfile_checkpoint_init(struct hashfile *, struct hashfile_checkpoint *);
void hashfile_checkpoint(struct hashfile *, struct hashfile_checkpoint *);
int hashfile_truncate(struct hashfile *, struct hashfile_checkpoint *);
diff --git a/date.c b/date.c
index a1b26a8dce..17a95077cf 100644
--- a/date.c
+++ b/date.c
@@ -1244,7 +1244,7 @@ static const char *approxidate_alpha(const char *date, struct tm *tm, struct tm
}
for (s = special; s->name; s++) {
- int len = strlen(s->name);
+ size_t len = strlen(s->name);
if (match_string(date, s->name) == len) {
s->fn(tm, now, num);
*touched = 1;
@@ -1254,7 +1254,7 @@ static const char *approxidate_alpha(const char *date, struct tm *tm, struct tm
if (!*num) {
for (i = 1; i < 11; i++) {
- int len = strlen(number_name[i]);
+ size_t len = strlen(number_name[i]);
if (match_string(date, number_name[i]) == len) {
*num = i;
*touched = 1;
@@ -1270,7 +1270,7 @@ static const char *approxidate_alpha(const char *date, struct tm *tm, struct tm
tl = typelen;
while (tl->type) {
- int len = strlen(tl->type);
+ size_t len = strlen(tl->type);
if (match_string(date, tl->type) >= len-1) {
update_tm(tm, now, tl->length * *num);
*num = 0;
diff --git a/delta-islands.c b/delta-islands.c
index 1c465a6041..3aec43fada 100644
--- a/delta-islands.c
+++ b/delta-islands.c
@@ -267,7 +267,8 @@ void resolve_tree_islands(struct repository *r,
QSORT(todo, nr, tree_depth_compare);
if (progress)
- progress_state = start_progress(_("Propagating island marks"), nr);
+ progress_state = start_progress(the_repository,
+ _("Propagating island marks"), nr);
for (i = 0; i < nr; i++) {
struct object_entry *ent = todo[i].entry;
diff --git a/diagnose.c b/diagnose.c
index b11931df86..bd485effea 100644
--- a/diagnose.c
+++ b/diagnose.c
@@ -1,5 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
-
#include "git-compat-util.h"
#include "diagnose.h"
#include "compat/disk.h"
@@ -12,6 +10,7 @@
#include "object-store-ll.h"
#include "packfile.h"
#include "parse-options.h"
+#include "repository.h"
#include "write-or-die.h"
struct archive_dir {
@@ -179,7 +178,9 @@ static int add_directory_to_archiver(struct strvec *archiver_args,
return res;
}
-int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
+int create_diagnostics_archive(struct repository *r,
+ struct strbuf *zip_path,
+ enum diagnose_mode mode)
{
struct strvec archiver_args = STRVEC_INIT;
char **argv_copy = NULL;
@@ -218,7 +219,7 @@ int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
strbuf_addstr(&buf, "Collecting diagnostic info\n\n");
get_version_info(&buf, 1);
- strbuf_addf(&buf, "Repository root: %s\n", the_repository->worktree);
+ strbuf_addf(&buf, "Repository root: %s\n", r->worktree);
get_disk_info(&buf);
write_or_die(stdout_fd, buf.buf, buf.len);
strvec_pushf(&archiver_args,
@@ -227,7 +228,7 @@ int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
strbuf_reset(&buf);
strbuf_addstr(&buf, "--add-virtual-file=packs-local.txt:");
- dir_file_stats(the_repository->objects->odb, &buf);
+ dir_file_stats(r->objects->odb, &buf);
foreach_alt_odb(dir_file_stats, &buf);
strvec_push(&archiver_args, buf.buf);
@@ -250,13 +251,13 @@ int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
}
strvec_pushl(&archiver_args, "--prefix=",
- oid_to_hex(the_hash_algo->empty_tree), "--", NULL);
+ oid_to_hex(r->hash_algo->empty_tree), "--", NULL);
/* `write_archive()` modifies the `argv` passed to it. Let it. */
argv_copy = xmemdupz(archiver_args.v,
sizeof(char *) * archiver_args.nr);
res = write_archive(archiver_args.nr, (const char **)argv_copy, NULL,
- the_repository, NULL, 0);
+ r, NULL, 0);
if (res) {
error(_("failed to write archive"));
goto diagnose_cleanup;
diff --git a/diagnose.h b/diagnose.h
index f525219ab0..f7b38f49f5 100644
--- a/diagnose.h
+++ b/diagnose.h
@@ -4,6 +4,7 @@
#include "strbuf.h"
struct option;
+struct repository;
enum diagnose_mode {
DIAGNOSE_NONE,
@@ -13,6 +14,8 @@ enum diagnose_mode {
int option_parse_diagnose(const struct option *opt, const char *arg, int unset);
-int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode);
+int create_diagnostics_archive(struct repository *r,
+ struct strbuf *zip_path,
+ enum diagnose_mode mode);
#endif /* DIAGNOSE_H */
diff --git a/diff-lib.c b/diff-lib.c
index c6d3bc4d37..353b473ed5 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -153,21 +153,8 @@ void run_diff_files(struct rev_info *revs, unsigned int option)
struct diff_filepair *pair;
unsigned int wt_mode = 0;
int num_compare_stages = 0;
- size_t path_len;
struct stat st;
- path_len = ce_namelen(ce);
-
- dpath = xmalloc(combine_diff_path_size(5, path_len));
- dpath->path = (char *) &(dpath->parent[5]);
-
- dpath->next = NULL;
- memcpy(dpath->path, ce->name, path_len);
- dpath->path[path_len] = '\0';
- oidclr(&dpath->oid, the_repository->hash_algo);
- memset(&(dpath->parent[0]), 0,
- sizeof(struct combine_diff_parent)*5);
-
changed = check_removed(ce, &st);
if (!changed)
wt_mode = ce_mode_from_stat(ce, st.st_mode);
@@ -178,7 +165,14 @@ void run_diff_files(struct rev_info *revs, unsigned int option)
}
wt_mode = 0;
}
- dpath->mode = wt_mode;
+
+ /*
+ * Allocate space for two parents, which will come from
+ * index stages #2 and #3, if present. Below we'll fill
+ * these from (stage - 2).
+ */
+ dpath = combine_diff_path_new(ce->name, ce_namelen(ce),
+ wt_mode, null_oid(), 2);
while (i < entries) {
struct cache_entry *nce = istate->cache[i];
@@ -405,16 +399,10 @@ static int show_modified(struct rev_info *revs,
if (revs->combine_merges && !cached &&
(!oideq(oid, &old_entry->oid) || !oideq(&old_entry->oid, &new_entry->oid))) {
struct combine_diff_path *p;
- int pathlen = ce_namelen(new_entry);
-
- p = xmalloc(combine_diff_path_size(2, pathlen));
- p->path = (char *) &p->parent[2];
- p->next = NULL;
- memcpy(p->path, new_entry->name, pathlen);
- p->path[pathlen] = 0;
- p->mode = mode;
- oidclr(&p->oid, the_repository->hash_algo);
- memset(p->parent, 0, 2 * sizeof(struct combine_diff_parent));
+
+ p = combine_diff_path_new(new_entry->name,
+ ce_namelen(new_entry),
+ mode, null_oid(), 2);
p->parent[0].status = DIFF_STATUS_MODIFIED;
p->parent[0].mode = new_entry->ce_mode;
oidcpy(&p->parent[0].oid, &new_entry->oid);
diff --git a/diff.c b/diff.c
index d28b4114c8..c89c15d98e 100644
--- a/diff.c
+++ b/diff.c
@@ -5493,6 +5493,8 @@ static int diff_opt_pickaxe_regex(const struct option *opt,
BUG_ON_OPT_NEG(unset);
options->pickaxe = arg;
options->pickaxe_opts |= DIFF_PICKAXE_KIND_G;
+ if (arg && !*arg)
+ return error(_("-G requires a non-empty argument"));
return 0;
}
@@ -5504,6 +5506,8 @@ static int diff_opt_pickaxe_string(const struct option *opt,
BUG_ON_OPT_NEG(unset);
options->pickaxe = arg;
options->pickaxe_opts |= DIFF_PICKAXE_KIND_S;
+ if (arg && !*arg)
+ return error(_("-S requires a non-empty argument"));
return 0;
}
@@ -6392,7 +6396,7 @@ static void diff_summary(struct diff_options *opt, struct diff_filepair *p)
}
struct patch_id_t {
- git_hash_ctx *ctx;
+ struct git_hash_ctx *ctx;
int patchlen;
};
@@ -6409,13 +6413,13 @@ static int remove_space(char *line, int len)
return dst - line;
}
-void flush_one_hunk(struct object_id *result, git_hash_ctx *ctx)
+void flush_one_hunk(struct object_id *result, struct git_hash_ctx *ctx)
{
unsigned char hash[GIT_MAX_RAWSZ];
unsigned short carry = 0;
int i;
- the_hash_algo->final_fn(hash, ctx);
+ git_hash_final(hash, ctx);
the_hash_algo->init_fn(ctx);
/* 20-byte sum, with carry */
for (i = 0; i < the_hash_algo->rawsz; ++i) {
@@ -6434,22 +6438,22 @@ static int patch_id_consume(void *priv, char *line, unsigned long len)
return 0;
new_len = remove_space(line, len);
- the_hash_algo->update_fn(data->ctx, line, new_len);
+ git_hash_update(data->ctx, line, new_len);
data->patchlen += new_len;
return 0;
}
-static void patch_id_add_string(git_hash_ctx *ctx, const char *str)
+static void patch_id_add_string(struct git_hash_ctx *ctx, const char *str)
{
- the_hash_algo->update_fn(ctx, str, strlen(str));
+ git_hash_update(ctx, str, strlen(str));
}
-static void patch_id_add_mode(git_hash_ctx *ctx, unsigned mode)
+static void patch_id_add_mode(struct git_hash_ctx *ctx, unsigned mode)
{
/* large enough for 2^32 in octal */
char buf[12];
int len = xsnprintf(buf, sizeof(buf), "%06o", mode);
- the_hash_algo->update_fn(ctx, buf, len);
+ git_hash_update(ctx, buf, len);
}
/* returns 0 upon success, and writes result into oid */
@@ -6457,7 +6461,7 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oid
{
struct diff_queue_struct *q = &diff_queued_diff;
int i;
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
struct patch_id_t data;
the_hash_algo->init_fn(&ctx);
@@ -6493,9 +6497,9 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oid
len2 = remove_space(p->two->path, strlen(p->two->path));
patch_id_add_string(&ctx, "diff--git");
patch_id_add_string(&ctx, "a/");
- the_hash_algo->update_fn(&ctx, p->one->path, len1);
+ git_hash_update(&ctx, p->one->path, len1);
patch_id_add_string(&ctx, "b/");
- the_hash_algo->update_fn(&ctx, p->two->path, len2);
+ git_hash_update(&ctx, p->two->path, len2);
if (p->one->mode == 0) {
patch_id_add_string(&ctx, "newfilemode");
@@ -6514,24 +6518,24 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oid
/* don't do anything since we're only populating header info */
} else if (diff_filespec_is_binary(options->repo, p->one) ||
diff_filespec_is_binary(options->repo, p->two)) {
- the_hash_algo->update_fn(&ctx, oid_to_hex(&p->one->oid),
+ git_hash_update(&ctx, oid_to_hex(&p->one->oid),
the_hash_algo->hexsz);
- the_hash_algo->update_fn(&ctx, oid_to_hex(&p->two->oid),
+ git_hash_update(&ctx, oid_to_hex(&p->two->oid),
the_hash_algo->hexsz);
} else {
if (p->one->mode == 0) {
patch_id_add_string(&ctx, "---/dev/null");
patch_id_add_string(&ctx, "+++b/");
- the_hash_algo->update_fn(&ctx, p->two->path, len2);
+ git_hash_update(&ctx, p->two->path, len2);
} else if (p->two->mode == 0) {
patch_id_add_string(&ctx, "---a/");
- the_hash_algo->update_fn(&ctx, p->one->path, len1);
+ git_hash_update(&ctx, p->one->path, len1);
patch_id_add_string(&ctx, "+++/dev/null");
} else {
patch_id_add_string(&ctx, "---a/");
- the_hash_algo->update_fn(&ctx, p->one->path, len1);
+ git_hash_update(&ctx, p->one->path, len1);
patch_id_add_string(&ctx, "+++b/");
- the_hash_algo->update_fn(&ctx, p->two->path, len2);
+ git_hash_update(&ctx, p->two->path, len2);
}
if (fill_mmfile(options->repo, &mf1, p->one) < 0 ||
@@ -7386,6 +7390,6 @@ void setup_diff_pager(struct diff_options *opt)
* --exit-code" in hooks and other scripts, we do not do so.
*/
if (!opt->flags.exit_with_status &&
- check_pager_config("diff") != 0)
- setup_pager();
+ check_pager_config(the_repository, "diff") != 0)
+ setup_pager(the_repository);
}
diff --git a/diff.h b/diff.h
index 6e6007c17b..0a566f5531 100644
--- a/diff.h
+++ b/diff.h
@@ -462,7 +462,7 @@ const char *diff_line_prefix(struct diff_options *);
extern const char mime_boundary_leader[];
struct combine_diff_path *diff_tree_paths(
- struct combine_diff_path *p, const struct object_id *oid,
+ const struct object_id *oid,
const struct object_id **parents_oid, int nparent,
struct strbuf *base, struct diff_options *opt);
void diff_tree_oid(const struct object_id *old_oid,
@@ -480,12 +480,20 @@ struct combine_diff_path {
char status;
unsigned int mode;
struct object_id oid;
- struct strbuf path;
+ /*
+ * This per-parent path is filled only when doing a combined
+ * diff with revs.combined_all_paths set, and only if the path
+ * differs from the post-image (e.g., a rename or copy).
+ * Otherwise it is left NULL.
+ */
+ char *path;
} parent[FLEX_ARRAY];
};
-#define combine_diff_path_size(n, l) \
- st_add4(sizeof(struct combine_diff_path), (l), 1, \
- st_mult(sizeof(struct combine_diff_parent), (n)))
+struct combine_diff_path *combine_diff_path_new(const char *path,
+ size_t path_len,
+ unsigned int mode,
+ const struct object_id *oid,
+ size_t num_parents);
void show_combined_diff(struct combine_diff_path *elem, int num_parent,
struct rev_info *);
@@ -644,7 +652,7 @@ void run_diff_index(struct rev_info *revs, unsigned int option);
int do_diff_cache(const struct object_id *, struct diff_options *);
int diff_flush_patch_id(struct diff_options *, struct object_id *, int);
-void flush_one_hunk(struct object_id *result, git_hash_ctx *ctx);
+void flush_one_hunk(struct object_id *result, struct git_hash_ctx *ctx);
int diff_result_code(struct rev_info *);
diff --git a/diffcore-rename.c b/diffcore-rename.c
index 10bb0321b1..91b77993c7 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -1567,6 +1567,7 @@ void diffcore_rename_extended(struct diff_options *options,
trace2_region_enter("diff", "inexact renames", options->repo);
if (options->show_rename_progress) {
progress = start_delayed_progress(
+ the_repository,
_("Performing inexact rename detection"),
(uint64_t)num_destinations * (uint64_t)num_sources);
}
diff --git a/dir.c b/dir.c
index 5b2181e589..16ccfe7e4e 100644
--- a/dir.c
+++ b/dir.c
@@ -1093,10 +1093,6 @@ static void invalidate_directory(struct untracked_cache *uc,
dir->dirs[i]->recurse = 0;
}
-static int add_patterns_from_buffer(char *buf, size_t size,
- const char *base, int baselen,
- struct pattern_list *pl);
-
/* Flags for add_patterns() */
#define PATTERN_NOFOLLOW (1<<0)
@@ -1186,9 +1182,9 @@ static int add_patterns(const char *fname, const char *base, int baselen,
return 0;
}
-static int add_patterns_from_buffer(char *buf, size_t size,
- const char *base, int baselen,
- struct pattern_list *pl)
+int add_patterns_from_buffer(char *buf, size_t size,
+ const char *base, int baselen,
+ struct pattern_list *pl)
{
char *orig = buf;
int i, lineno = 1;
diff --git a/dir.h b/dir.h
index a3a2f00f5d..6cfef5df66 100644
--- a/dir.h
+++ b/dir.h
@@ -467,6 +467,9 @@ void add_patterns_from_file(struct dir_struct *, const char *fname);
int add_patterns_from_blob_to_list(struct object_id *oid,
const char *base, int baselen,
struct pattern_list *pl);
+int add_patterns_from_buffer(char *buf, size_t size,
+ const char *base, int baselen,
+ struct pattern_list *pl);
void parse_path_pattern(const char **string, int *patternlen, unsigned *flags, int *nowildcardlen);
void add_pattern(const char *string, const char *base,
int baselen, struct pattern_list *pl, int srcpos);
diff --git a/entry.c b/entry.c
index 53a1c39358..81b321e53d 100644
--- a/entry.c
+++ b/entry.c
@@ -188,7 +188,9 @@ int finish_delayed_checkout(struct checkout *state, int show_progress)
dco->state = CE_RETRY;
if (show_progress)
- progress = start_delayed_progress(_("Filtering content"), dco->paths.nr);
+ progress = start_delayed_progress(the_repository,
+ _("Filtering content"),
+ dco->paths.nr);
while (dco->filters.nr > 0) {
for_each_string_list_item(filter, &dco->filters) {
struct string_list available_paths = STRING_LIST_INIT_DUP;
diff --git a/environment.c b/environment.c
index 8389a27270..e5b361bb5d 100644
--- a/environment.c
+++ b/environment.c
@@ -16,6 +16,7 @@
#include "convert.h"
#include "environment.h"
#include "gettext.h"
+#include "git-zlib.h"
#include "repository.h"
#include "config.h"
#include "refs.h"
diff --git a/fetch-pack.c b/fetch-pack.c
index 3a227721ed..1ed5e11dd5 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -1036,7 +1036,9 @@ static int get_pack(struct fetch_pack_args *args,
die(_("fetch-pack: unable to fork off %s"), cmd_name);
if (do_keep && (pack_lockfiles || fsck_objects)) {
int is_well_formed;
- char *pack_lockfile = index_pack_lockfile(cmd.out, &is_well_formed);
+ char *pack_lockfile = index_pack_lockfile(the_repository,
+ cmd.out,
+ &is_well_formed);
if (!is_well_formed)
die(_("fetch-pack: invalid index-pack output"));
@@ -1867,7 +1869,7 @@ int fetch_pack_fsck_config(const char *var, const char *value,
char *path ;
if (git_config_pathname(&path, var, value))
- return 0;
+ return -1;
strbuf_addf(msg_types, "%cskiplist=%s",
msg_types->len ? ',' : '=', path);
free(path);
diff --git a/fsck.c b/fsck.c
index 87ce999a49..9fc4c25ffd 100644
--- a/fsck.c
+++ b/fsck.c
@@ -1353,7 +1353,7 @@ int git_fsck_config(const char *var, const char *value,
struct strbuf sb = STRBUF_INIT;
if (git_config_pathname(&path, var, value))
- return 1;
+ return -1;
strbuf_addf(&sb, "skiplist=%s", path);
free(path);
fsck_set_msg_types(options, sb.buf);
diff --git a/generate-cmdlist.sh b/generate-cmdlist.sh
index b923a5aab8..0ed39c4c5d 100755
--- a/generate-cmdlist.sh
+++ b/generate-cmdlist.sh
@@ -76,7 +76,7 @@ print_command_list () {
break
;;
esac
- done <"$1/Documentation/$cmd.txt"
+ done <"$1/Documentation/$cmd.adoc"
printf '\t{ "%s", N_("%s"), 0' "$cmd" "$synopsis"
printf " | CAT_%s" $rest
diff --git a/generate-configlist.sh b/generate-configlist.sh
index 579422619c..dffdaada8b 100755
--- a/generate-configlist.sh
+++ b/generate-configlist.sh
@@ -13,7 +13,7 @@ print_config_list () {
cat <<EOF
static const char *config_name_list[] = {
EOF
- grep -h '^[a-zA-Z].*\..*::$' "$SOURCE_DIR"/Documentation/*config.txt "$SOURCE_DIR"/Documentation/config/*.txt |
+ grep -h '^[a-zA-Z].*\..*::$' "$SOURCE_DIR"/Documentation/*config.adoc "$SOURCE_DIR"/Documentation/config/*.adoc |
sed '/deprecated/d; s/::$//; s/, */\n/g' |
sort |
sed 's/^.*$/ "&",/'
diff --git a/generate-hooklist.sh b/generate-hooklist.sh
index e22068c2fa..e0cdf26944 100755
--- a/generate-hooklist.sh
+++ b/generate-hooklist.sh
@@ -22,7 +22,7 @@ EOF
sed -n \
-e '/^~~~~*$/ {x; s/^.*$/ "&",/; p;}' \
-e 'x' \
- <"$SOURCE_DIR"/Documentation/githooks.txt |
+ <"$SOURCE_DIR"/Documentation/githooks.adoc |
LC_ALL=C sort
cat <<EOF
diff --git a/git-compat-util.h b/git-compat-util.h
index e283c46c6f..e123288e8f 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -701,6 +701,8 @@ int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
void warning_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
+void show_usage_if_asked(int ac, const char **av, const char *err);
+
#ifndef NO_OPENSSL
#ifdef APPLE_COMMON_CRYPTO
#include "compat/apple-common-crypto.h"
@@ -1537,18 +1539,6 @@ int cmd_main(int, const char **);
int common_exit(const char *file, int line, int code);
#define exit(code) exit(common_exit(__FILE__, __LINE__, (code)))
-#define z_const
-#include <zlib.h>
-
-#if ZLIB_VERNUM < 0x1290
-/*
- * This is uncompress2, which is only available in zlib >= 1.2.9
- * (released as of early 2017). See compat/zlib-uncompress2.c.
- */
-int uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
- uLong *sourceLen);
-#endif
-
/*
* This include must come after system headers, since it introduces macros that
* replace system names.
diff --git a/git-gui/Makefile b/git-gui/Makefile
index 667c39ed56..6c5a12bc32 100644
--- a/git-gui/Makefile
+++ b/git-gui/Makefile
@@ -1,3 +1,4 @@
+# The default target of this Makefile is...
all::
# Define V=1 to have a more verbose compile.
diff --git a/git-gui/po/glossary/Makefile b/git-gui/po/glossary/Makefile
index 749aa2e7ec..e656b0d2b0 100644
--- a/git-gui/po/glossary/Makefile
+++ b/git-gui/po/glossary/Makefile
@@ -1,3 +1,6 @@
+# The default target of this Makefile is...
+update-po::
+
PO_TEMPLATE = git-gui-glossary.pot
ALL_POFILES = $(wildcard *.po)
diff --git a/git-instaweb.sh b/git-instaweb.sh
index 5ad50160bb..7b44f70789 100755
--- a/git-instaweb.sh
+++ b/git-instaweb.sh
@@ -694,9 +694,9 @@ class GitWebRequestHandler(CGIHTTPRequestHandler):
return result
-bind = "127.0.0.1"
+bind = "0.0.0.0"
if "$local" == "true":
- bind = "0.0.0.0"
+ bind = "127.0.0.1"
# Set our http root directory
# This is a work around for a missing directory argument in older Python versions
diff --git a/git-submodule.sh b/git-submodule.sh
index 03c5a220a2..2999b31fad 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -40,11 +40,11 @@ init=
require_init=
files=
remote=
-nofetch=
+no_fetch=
rebase=
merge=
checkout=
-custom_name=
+name=
depth=
progress=
dissociate=
@@ -52,11 +52,10 @@ single_branch=
jobs=
recommend_shallow=
filter=
-
-isnumber()
-{
- n=$(($1 + 0)) 2>/dev/null && test "$n" = "$1"
-}
+all=
+default=
+summary_limit=
+for_status=
#
# Add a new submodule to the working tree, .gitmodules and the index
@@ -68,31 +67,33 @@ isnumber()
cmd_add()
{
# parse $args after "submodule ... add".
- reference_path=
while test $# -ne 0
do
case "$1" in
-b | --branch)
case "$2" in '') usage ;; esac
- branch=$2
+ branch="--branch=$2"
shift
;;
+ -b* | --branch=*)
+ branch="$1"
+ ;;
-f | --force)
force=$1
;;
-q|--quiet)
- quiet=1
+ quiet=$1
;;
--progress)
- progress=1
+ progress=$1
;;
--reference)
case "$2" in '') usage ;; esac
- reference_path=$2
+ reference="--reference=$2"
shift
;;
--reference=*)
- reference_path="${1#--reference=}"
+ reference="$1"
;;
--ref-format)
case "$2" in '') usage ;; esac
@@ -103,20 +104,23 @@ cmd_add()
ref_format="$1"
;;
--dissociate)
- dissociate=1
+ dissociate=$1
;;
--name)
case "$2" in '') usage ;; esac
- custom_name=$2
+ name="--name=$2"
shift
;;
+ --name=*)
+ name="$1"
+ ;;
--depth)
case "$2" in '') usage ;; esac
depth="--depth=$2"
shift
;;
--depth=*)
- depth=$1
+ depth="$1"
;;
--)
shift
@@ -138,14 +142,14 @@ cmd_add()
fi
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper add \
- ${quiet:+--quiet} \
- ${force:+--force} \
- ${progress:+"--progress"} \
- ${branch:+--branch "$branch"} \
- ${reference_path:+--reference "$reference_path"} \
+ $quiet \
+ $force \
+ $progress \
+ ${branch:+"$branch"} \
+ ${reference:+"$reference"} \
${ref_format:+"$ref_format"} \
- ${dissociate:+--dissociate} \
- ${custom_name:+--name "$custom_name"} \
+ $dissociate \
+ ${name:+"$name"} \
${depth:+"$depth"} \
-- \
"$@"
@@ -164,10 +168,10 @@ cmd_foreach()
do
case "$1" in
-q|--quiet)
- quiet=1
+ quiet=$1
;;
--recursive)
- recursive=1
+ recursive=$1
;;
-*)
usage
@@ -180,8 +184,8 @@ cmd_foreach()
done
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper foreach \
- ${quiet:+--quiet} \
- ${recursive:+--recursive} \
+ $quiet \
+ $recursive \
-- \
"$@"
}
@@ -198,7 +202,7 @@ cmd_init()
do
case "$1" in
-q|--quiet)
- quiet=1
+ quiet=$1
;;
--)
shift
@@ -215,7 +219,7 @@ cmd_init()
done
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper init \
- ${quiet:+--quiet} \
+ $quiet \
-- \
"$@"
}
@@ -226,7 +230,6 @@ cmd_init()
cmd_deinit()
{
# parse $args after "submodule ... deinit".
- deinit_all=
while test $# -ne 0
do
case "$1" in
@@ -234,10 +237,10 @@ cmd_deinit()
force=$1
;;
-q|--quiet)
- quiet=1
+ quiet=$1
;;
--all)
- deinit_all=t
+ all=$1
;;
--)
shift
@@ -254,9 +257,9 @@ cmd_deinit()
done
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
- ${quiet:+--quiet} \
- ${force:+--force} \
- ${deinit_all:+--all} \
+ $quiet \
+ $force \
+ $all \
-- \
"$@"
}
@@ -273,31 +276,31 @@ cmd_update()
do
case "$1" in
-q|--quiet)
- quiet=1
+ quiet=$1
;;
-v|--verbose)
- quiet=0
+ quiet=
;;
--progress)
- progress=1
+ progress=$1
;;
-i|--init)
- init=1
+ init=$1
;;
--require-init)
- require_init=1
+ require_init=$1
;;
--remote)
- remote=1
+ remote=$1
;;
-N|--no-fetch)
- nofetch=1
+ no_fetch=$1
;;
-f|--force)
force=$1
;;
-r|--rebase)
- rebase=1
+ rebase=$1
;;
--ref-format)
case "$2" in '') usage ;; esac
@@ -316,22 +319,19 @@ cmd_update()
reference="$1"
;;
--dissociate)
- dissociate=1
+ dissociate=$1
;;
-m|--merge)
- merge=1
+ merge=$1
;;
--recursive)
- recursive=1
+ recursive=$1
;;
--checkout)
- checkout=1
- ;;
- --recommend-shallow)
- recommend_shallow="--recommend-shallow"
+ checkout=$1
;;
- --no-recommend-shallow)
- recommend_shallow="--no-recommend-shallow"
+ --recommend-shallow|--no-recommend-shallow)
+ recommend_shallow=$1
;;
--depth)
case "$2" in '') usage ;; esac
@@ -339,21 +339,18 @@ cmd_update()
shift
;;
--depth=*)
- depth=$1
+ depth="$1"
;;
-j|--jobs)
case "$2" in '') usage ;; esac
jobs="--jobs=$2"
shift
;;
- --jobs=*)
- jobs=$1
+ -j*|--jobs=*)
+ jobs="$1"
;;
- --single-branch)
- single_branch="--single-branch"
- ;;
- --no-single-branch)
- single_branch="--no-single-branch"
+ --single-branch|--no-single-branch)
+ single_branch=$1
;;
--filter)
case "$2" in '') usage ;; esac
@@ -378,22 +375,21 @@ cmd_update()
done
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper update \
- ${quiet:+--quiet} \
- ${force:+--force} \
- ${progress:+"--progress"} \
- ${remote:+--remote} \
- ${recursive:+--recursive} \
- ${init:+--init} \
- ${nofetch:+--no-fetch} \
- ${rebase:+--rebase} \
- ${merge:+--merge} \
- ${checkout:+--checkout} \
+ $quiet \
+ $force \
+ $progress \
+ $remote \
+ $recursive \
+ $init \
+ $no_fetch \
+ $rebase \
+ $merge \
+ $checkout \
${ref_format:+"$ref_format"} \
${reference:+"$reference"} \
- ${dissociate:+"--dissociate"} \
+ $dissociate \
${depth:+"$depth"} \
- ${require_init:+--require-init} \
- ${dissociate:+"--dissociate"} \
+ $require_init \
$single_branch \
$recommend_shallow \
$jobs \
@@ -408,9 +404,7 @@ cmd_update()
# $@ = requested path
#
cmd_set_branch() {
- default=
- branch=
-
+ # parse $args after "submodule ... set-branch".
while test $# -ne 0
do
case "$1" in
@@ -418,13 +412,16 @@ cmd_set_branch() {
# we don't do anything with this but we need to accept it
;;
-d|--default)
- default=1
+ default=$1
;;
-b|--branch)
case "$2" in '') usage ;; esac
- branch=$2
+ branch="--branch=$2"
shift
;;
+ -b*|--branch=*)
+ branch="$1"
+ ;;
--)
shift
break
@@ -440,9 +437,9 @@ cmd_set_branch() {
done
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper set-branch \
- ${quiet:+--quiet} \
- ${branch:+--branch "$branch"} \
- ${default:+--default} \
+ $quiet \
+ ${branch:+"$branch"} \
+ $default \
-- \
"$@"
}
@@ -453,11 +450,12 @@ cmd_set_branch() {
# $@ = requested path, requested url
#
cmd_set_url() {
+ # parse $args after "submodule ... set-url".
while test $# -ne 0
do
case "$1" in
-q|--quiet)
- quiet=1
+ quiet=$1
;;
--)
shift
@@ -474,7 +472,7 @@ cmd_set_url() {
done
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper set-url \
- ${quiet:+--quiet} \
+ $quiet \
-- \
"$@"
}
@@ -488,31 +486,26 @@ cmd_set_url() {
# $@ = [commit (default 'HEAD'),] requested paths (default all)
#
cmd_summary() {
- summary_limit=-1
- for_status=
- diff_cmd=diff-index
-
# parse $args after "submodule ... summary".
while test $# -ne 0
do
case "$1" in
--cached)
- cached=1
+ cached=$1
;;
--files)
- files="$1"
+ files=$1
;;
--for-status)
- for_status="$1"
+ for_status=$1
;;
-n|--summary-limit)
- summary_limit="$2"
- isnumber "$summary_limit" || usage
+ case "$2" in '') usage ;; esac
+ summary_limit="--summary-limit=$2"
shift
;;
- --summary-limit=*)
- summary_limit="${1#--summary-limit=}"
- isnumber "$summary_limit" || usage
+ -n*|--summary-limit=*)
+ summary_limit="$1"
;;
--)
shift
@@ -529,10 +522,10 @@ cmd_summary() {
done
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper summary \
- ${files:+--files} \
- ${cached:+--cached} \
- ${for_status:+--for-status} \
- ${summary_limit:+-n $summary_limit} \
+ $files \
+ $cached \
+ $for_status \
+ ${summary_limit:+"$summary_limit"} \
-- \
"$@"
}
@@ -553,13 +546,13 @@ cmd_status()
do
case "$1" in
-q|--quiet)
- quiet=1
+ quiet=$1
;;
--cached)
- cached=1
+ cached=$1
;;
--recursive)
- recursive=1
+ recursive=$1
;;
--)
shift
@@ -576,9 +569,9 @@ cmd_status()
done
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper status \
- ${quiet:+--quiet} \
- ${cached:+--cached} \
- ${recursive:+--recursive} \
+ $quiet \
+ $cached \
+ $recursive \
-- \
"$@"
}
@@ -590,15 +583,16 @@ cmd_status()
#
cmd_sync()
{
+ # parse $args after "submodule ... sync".
while test $# -ne 0
do
case "$1" in
-q|--quiet)
- quiet=1
+ quiet=$1
shift
;;
--recursive)
- recursive=1
+ recursive=$1
shift
;;
--)
@@ -615,8 +609,8 @@ cmd_sync()
done
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper sync \
- ${quiet:+--quiet} \
- ${recursive:+--recursive} \
+ $quiet \
+ $recursive \
-- \
"$@"
}
@@ -639,10 +633,10 @@ do
command=$1
;;
-q|--quiet)
- quiet=1
+ quiet=$1
;;
--cached)
- cached=1
+ cached=$1
;;
--)
break
diff --git a/git-zlib.c b/git-zlib.c
index d43bbeb6da..651dd9e07c 100644
--- a/git-zlib.c
+++ b/git-zlib.c
@@ -59,7 +59,8 @@ static void zlib_post_call(git_zstream *s)
s->total_out = s->z.total_out;
s->total_in = s->z.total_in;
- s->next_in = s->z.next_in;
+ /* zlib-ng marks `next_in` as `const`, so we have to cast it away. */
+ s->next_in = (unsigned char *) s->z.next_in;
s->next_out = s->z.next_out;
s->avail_in -= bytes_consumed;
s->avail_out -= bytes_produced;
@@ -147,10 +148,6 @@ int git_inflate(git_zstream *strm, int flush)
return status;
}
-#if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200
-#define deflateBound(c,s) ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11)
-#endif
-
unsigned long git_deflate_bound(git_zstream *strm, unsigned long size)
{
return deflateBound(&strm->z, size);
diff --git a/git-zlib.h b/git-zlib.h
index d8a670aff9..1e8d9aabcb 100644
--- a/git-zlib.h
+++ b/git-zlib.h
@@ -1,6 +1,8 @@
#ifndef GIT_ZLIB_H
#define GIT_ZLIB_H
+#include "compat/zlib-compat.h"
+
typedef struct git_zstream {
z_stream z;
unsigned long avail_in;
diff --git a/git.c b/git.c
index 71d644dc1c..450d6aaa86 100644
--- a/git.c
+++ b/git.c
@@ -125,7 +125,7 @@ static void commit_pager_choice(void)
setenv("GIT_PAGER", "cat", 1);
break;
case 1:
- setup_pager();
+ setup_pager(the_repository);
break;
default:
break;
@@ -136,7 +136,7 @@ void setup_auto_pager(const char *cmd, int def)
{
if (use_pager != -1 || pager_in_use())
return;
- use_pager = check_pager_config(cmd);
+ use_pager = check_pager_config(the_repository, cmd);
if (use_pager == -1)
use_pager = def;
commit_pager_choice();
@@ -462,12 +462,12 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv, struct
precompose_argv_prefix(argc, argv, NULL);
if (use_pager == -1 && run_setup &&
!(p->option & DELAY_PAGER_CONFIG))
- use_pager = check_pager_config(p->cmd);
+ use_pager = check_pager_config(the_repository, p->cmd);
if (use_pager == -1 && p->option & USE_PAGER)
use_pager = 1;
if (run_setup && startup_info->have_repository)
/* get_git_dir() may set up repo, avoid that */
- trace_repo_setup();
+ trace_repo_setup(the_repository);
commit_pager_choice();
if (!help && p->option & NEED_WORK_TREE)
@@ -506,6 +506,7 @@ static struct cmd_struct commands[] = {
{ "annotate", cmd_annotate, RUN_SETUP },
{ "apply", cmd_apply, RUN_SETUP_GENTLY },
{ "archive", cmd_archive, RUN_SETUP_GENTLY },
+ { "backfill", cmd_backfill, RUN_SETUP },
{ "bisect", cmd_bisect, RUN_SETUP },
{ "blame", cmd_blame, RUN_SETUP },
{ "branch", cmd_branch, RUN_SETUP | DELAY_PAGER_CONFIG },
@@ -587,7 +588,9 @@ static struct cmd_struct commands[] = {
{ "name-rev", cmd_name_rev, RUN_SETUP },
{ "notes", cmd_notes, RUN_SETUP },
{ "pack-objects", cmd_pack_objects, RUN_SETUP },
+#ifndef WITH_BREAKING_CHANGES
{ "pack-redundant", cmd_pack_redundant, RUN_SETUP | NO_PARSEOPT },
+#endif
{ "pack-refs", cmd_pack_refs, RUN_SETUP },
{ "patch-id", cmd_patch_id, RUN_SETUP_GENTLY | NO_PARSEOPT },
{ "pickaxe", cmd_blame, RUN_SETUP },
@@ -750,7 +753,7 @@ static void execv_dashed_external(const char **argv)
int status;
if (use_pager == -1 && !is_builtin(argv[0]))
- use_pager = check_pager_config(argv[0]);
+ use_pager = check_pager_config(the_repository, argv[0]);
commit_pager_choice();
strvec_pushf(&cmd.args, "git-%s", argv[0]);
diff --git a/gitk-git/Makefile b/gitk-git/Makefile
index e1f0aff4a1..3a3c56c318 100644
--- a/gitk-git/Makefile
+++ b/gitk-git/Makefile
@@ -8,6 +8,7 @@ gitk_libdir ?= $(sharedir)/gitk/lib
msgsdir ?= $(gitk_libdir)/msgs
msgsdir_SQ = $(subst ','\'',$(msgsdir))
+SHELL_PATH ?= /bin/sh
TCL_PATH ?= tclsh
TCLTK_PATH ?= wish
INSTALL ?= install
@@ -64,9 +65,7 @@ clean::
gitk-wish: gitk GIT-TCLTK-VARS
$(QUIET_GEN)$(RM) $@ $@+ && \
- sed -e '1,3s|^exec .* "$$0"|exec $(subst |,'\|',$(TCLTK_PATH_SQ)) "$$0"|' <gitk >$@+ && \
- chmod +x $@+ && \
- mv -f $@+ $@
+ $(SHELL_PATH) ./generate-tcl.sh "$(TCLTK_PATH_SQ)" "$<" "$@"
$(PO_TEMPLATE): gitk
$(XGETTEXT) -kmc -LTcl -o $@ gitk
diff --git a/gitk-git/generate-tcl.sh b/gitk-git/generate-tcl.sh
new file mode 100755
index 0000000000..46bba6d246
--- /dev/null
+++ b/gitk-git/generate-tcl.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+set -e
+
+WISH=$(echo "$1" | sed 's/|/\\|/g')
+INPUT="$2"
+OUTPUT="$3"
+
+sed -e "1,3s|^exec .* \"\$0\"|exec $WISH \"\$0\"|" "$INPUT" >"$OUTPUT"+
+chmod a+x "$OUTPUT"+
+mv "$OUTPUT"+ "$OUTPUT"
diff --git a/gitk-git/gitk b/gitk-git/gitk
index 47a7c1d29c..bc9efa1856 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
@@ -9,6 +9,141 @@ exec wish "$0" -- "$@"
package require Tk
+######################################################################
+##
+## Enabling platform-specific code paths
+
+proc is_MacOSX {} {
+ if {[tk windowingsystem] eq {aqua}} {
+ return 1
+ }
+ return 0
+}
+
+proc is_Windows {} {
+ if {$::tcl_platform(platform) eq {windows}} {
+ return 1
+ }
+ return 0
+}
+
+set _iscygwin {}
+proc is_Cygwin {} {
+ global _iscygwin
+ if {$_iscygwin eq {}} {
+ if {[string match "CYGWIN_*" $::tcl_platform(os)]} {
+ set _iscygwin 1
+ } else {
+ set _iscygwin 0
+ }
+ }
+ return $_iscygwin
+}
+
+######################################################################
+##
+## PATH lookup
+
+set _search_path {}
+proc _which {what args} {
+ global env _search_exe _search_path
+
+ if {$_search_path eq {}} {
+ if {[is_Cygwin] && [regexp {^(/|\.:)} $env(PATH)]} {
+ set _search_path [split [exec cygpath \
+ --windows \
+ --path \
+ --absolute \
+ $env(PATH)] {;}]
+ set _search_exe .exe
+ } elseif {[is_Windows]} {
+ set gitguidir [file dirname [info script]]
+ regsub -all ";" $gitguidir "\\;" gitguidir
+ set env(PATH) "$gitguidir;$env(PATH)"
+ set _search_path [split $env(PATH) {;}]
+ # Skip empty `PATH` elements
+ set _search_path [lsearch -all -inline -not -exact \
+ $_search_path ""]
+ set _search_exe .exe
+ } else {
+ set _search_path [split $env(PATH) :]
+ set _search_exe {}
+ }
+ }
+
+ if {[is_Windows] && [lsearch -exact $args -script] >= 0} {
+ set suffix {}
+ } else {
+ set suffix $_search_exe
+ }
+
+ foreach p $_search_path {
+ set p [file join $p $what$suffix]
+ if {[file exists $p]} {
+ return [file normalize $p]
+ }
+ }
+ return {}
+}
+
+proc sanitize_command_line {command_line from_index} {
+ set i $from_index
+ while {$i < [llength $command_line]} {
+ set cmd [lindex $command_line $i]
+ if {[file pathtype $cmd] ne "absolute"} {
+ set fullpath [_which $cmd]
+ if {$fullpath eq ""} {
+ throw {NOT-FOUND} "$cmd not found in PATH"
+ }
+ lset command_line $i $fullpath
+ }
+
+ # handle piped commands, e.g. `exec A | B`
+ for {incr i} {$i < [llength $command_line]} {incr i} {
+ if {[lindex $command_line $i] eq "|"} {
+ incr i
+ break
+ }
+ }
+ }
+ return $command_line
+}
+
+# Override `exec` to avoid unsafe PATH lookup
+
+rename exec real_exec
+
+proc exec {args} {
+ # skip options
+ for {set i 0} {$i < [llength $args]} {incr i} {
+ set arg [lindex $args $i]
+ if {$arg eq "--"} {
+ incr i
+ break
+ }
+ if {[string range $arg 0 0] ne "-"} {
+ break
+ }
+ }
+ set args [sanitize_command_line $args $i]
+ uplevel 1 real_exec $args
+}
+
+# Override `open` to avoid unsafe PATH lookup
+
+rename open real_open
+
+proc open {args} {
+ set arg0 [lindex $args 0]
+ if {[string range $arg0 0 0] eq "|"} {
+ set command_line [string trim [string range $arg0 1 end]]
+ lset args 0 "| [sanitize_command_line $command_line 0]"
+ }
+ uplevel 1 real_open $args
+}
+
+# End of safe PATH lookup stuff
+
proc hasworktree {} {
return [expr {[exec git rev-parse --is-bare-repository] == "false" &&
[exec git rev-parse --is-inside-git-dir] == "false"}]
@@ -2103,7 +2238,7 @@ proc makewindow {} {
global headctxmenu progresscanv progressitem progresscoords statusw
global fprogitem fprogcoord lastprogupdate progupdatepending
global rprogitem rprogcoord rownumsel numcommits
- global have_tk85 use_ttk NS
+ global have_tk85 have_tk86 use_ttk NS
global git_version
global worddiff
@@ -2601,8 +2736,13 @@ proc makewindow {} {
bind . <Key-Down> "selnextline 1"
bind . <Shift-Key-Up> "dofind -1 0"
bind . <Shift-Key-Down> "dofind 1 0"
- bindkey <Key-Right> "goforw"
- bindkey <Key-Left> "goback"
+ if {$have_tk86} {
+ bindkey <<NextChar>> "goforw"
+ bindkey <<PrevChar>> "goback"
+ } else {
+ bindkey <Key-Right> "goforw"
+ bindkey <Key-Left> "goback"
+ }
bind . <Key-Prior> "selnextpage -1"
bind . <Key-Next> "selnextpage 1"
bind . <$M1B-Home> "allcanvs yview moveto 0.0"
@@ -7720,7 +7860,7 @@ proc gettreeline {gtf id} {
if {[string index $fname 0] eq "\""} {
set fname [lindex $fname 0]
}
- set fname [encoding convertfrom $fname]
+ set fname [encoding convertfrom utf-8 $fname]
lappend treefilelist($id) $fname
}
if {![eof $gtf]} {
@@ -7982,7 +8122,7 @@ proc gettreediffline {gdtf ids} {
if {[string index $file 0] eq "\""} {
set file [lindex $file 0]
}
- set file [encoding convertfrom $file]
+ set file [encoding convertfrom utf-8 $file]
if {$file ne [lindex $treediff end]} {
lappend treediff $file
lappend sublist $file
@@ -8127,7 +8267,7 @@ proc makediffhdr {fname ids} {
global ctext curdiffstart treediffs diffencoding
global ctext_file_names jump_to_here targetline diffline
- set fname [encoding convertfrom $fname]
+ set fname [encoding convertfrom utf-8 $fname]
set diffencoding [get_path_encoding $fname]
set i [lsearch -exact $treediffs($ids) $fname]
if {$i >= 0} {
@@ -8189,7 +8329,7 @@ proc parseblobdiffline {ids line} {
if {![string compare -length 5 "diff " $line]} {
if {![regexp {^diff (--cc|--git) } $line m type]} {
- set line [encoding convertfrom $line]
+ set line [encoding convertfrom utf-8 $line]
$ctext insert end "$line\n" hunksep
continue
}
@@ -8238,7 +8378,7 @@ proc parseblobdiffline {ids line} {
makediffhdr $fname $ids
} elseif {![string compare -length 16 "* Unmerged path " $line]} {
- set fname [encoding convertfrom [string range $line 16 end]]
+ set fname [encoding convertfrom utf-8 [string range $line 16 end]]
$ctext insert end "\n"
set curdiffstart [$ctext index "end - 1c"]
lappend ctext_file_names $fname
@@ -8291,7 +8431,7 @@ proc parseblobdiffline {ids line} {
if {[string index $fname 0] eq "\""} {
set fname [lindex $fname 0]
}
- set fname [encoding convertfrom $fname]
+ set fname [encoding convertfrom utf-8 $fname]
set i [lsearch -exact $treediffs($ids) $fname]
if {$i >= 0} {
setinlist difffilestart $i $curdiffstart
@@ -8310,6 +8450,7 @@ proc parseblobdiffline {ids line} {
set diffinhdr 0
return
}
+ set line [encoding convertfrom utf-8 $line]
$ctext insert end "$line\n" filesep
} else {
@@ -10068,7 +10209,7 @@ proc showrefs {} {
text $top.list -background $bgcolor -foreground $fgcolor \
-selectbackground $selectbgcolor -font mainfont \
-xscrollcommand "$top.xsb set" -yscrollcommand "$top.ysb set" \
- -width 30 -height 20 -cursor $maincursor \
+ -width 60 -height 20 -cursor $maincursor \
-spacing1 1 -spacing3 1 -state disabled
$top.list tag configure highlight -background $selectbgcolor
if {![lsearch -exact $bglist $top.list]} {
@@ -12305,7 +12446,7 @@ proc cache_gitattr {attr pathlist} {
foreach row [split $rlist "\n"] {
if {[regexp "(.*): $attr: (.*)" $row m path value]} {
if {[string index $path 0] eq "\""} {
- set path [encoding convertfrom [lindex $path 0]]
+ set path [encoding convertfrom utf-8 [lindex $path 0]]
}
set path_attr_cache($attr,$path) $value
}
@@ -12335,7 +12476,6 @@ if { [info exists ::env(GITK_MSGSDIR)] } {
set gitk_prefix [file dirname [file dirname [file normalize $argv0]]]
set gitk_libdir [file join $gitk_prefix share gitk lib]
set gitk_msgsdir [file join $gitk_libdir msgs]
- unset gitk_prefix
}
## Internationalization (i18n) through msgcat and gettext. See
@@ -12637,6 +12777,7 @@ set nullid2 "0000000000000000000000000000000000000001"
set nullfile "/dev/null"
set have_tk85 [expr {[package vcompare $tk_version "8.5"] >= 0}]
+set have_tk86 [expr {[package vcompare $tk_version "8.6"] >= 0}]
if {![info exists have_ttk]} {
set have_ttk [llength [info commands ::ttk::style]]
}
@@ -12701,28 +12842,32 @@ if {[expr {[exec git rev-parse --is-inside-work-tree] == "true"}]} {
set worktree [gitworktree]
setcoords
makewindow
-catch {
- image create photo gitlogo -width 16 -height 16
-
- image create photo gitlogominus -width 4 -height 2
- gitlogominus put #C00000 -to 0 0 4 2
- gitlogo copy gitlogominus -to 1 5
- gitlogo copy gitlogominus -to 6 5
- gitlogo copy gitlogominus -to 11 5
- image delete gitlogominus
-
- image create photo gitlogoplus -width 4 -height 4
- gitlogoplus put #008000 -to 1 0 3 4
- gitlogoplus put #008000 -to 0 1 4 3
- gitlogo copy gitlogoplus -to 1 9
- gitlogo copy gitlogoplus -to 6 9
- gitlogo copy gitlogoplus -to 11 9
- image delete gitlogoplus
-
- image create photo gitlogo32 -width 32 -height 32
- gitlogo32 copy gitlogo -zoom 2 2
-
- wm iconphoto . -default gitlogo gitlogo32
+if {$::tcl_platform(platform) eq {windows} && [file exists $gitk_prefix/etc/git.ico]} {
+ wm iconbitmap . -default $gitk_prefix/etc/git.ico
+} else {
+ catch {
+ image create photo gitlogo -width 16 -height 16
+
+ image create photo gitlogominus -width 4 -height 2
+ gitlogominus put #C00000 -to 0 0 4 2
+ gitlogo copy gitlogominus -to 1 5
+ gitlogo copy gitlogominus -to 6 5
+ gitlogo copy gitlogominus -to 11 5
+ image delete gitlogominus
+
+ image create photo gitlogoplus -width 4 -height 4
+ gitlogoplus put #008000 -to 1 0 3 4
+ gitlogoplus put #008000 -to 0 1 4 3
+ gitlogo copy gitlogoplus -to 1 9
+ gitlogo copy gitlogoplus -to 6 9
+ gitlogo copy gitlogoplus -to 11 9
+ image delete gitlogoplus
+
+ image create photo gitlogo32 -width 32 -height 32
+ gitlogo32 copy gitlogo -zoom 2 2
+
+ wm iconphoto . -default gitlogo gitlogo32
+ }
}
# wait for the window to become visible
if {![winfo viewable .]} {tkwait visibility .}
diff --git a/gitk-git/meson.build b/gitk-git/meson.build
new file mode 100644
index 0000000000..ca3c0cec58
--- /dev/null
+++ b/gitk-git/meson.build
@@ -0,0 +1,30 @@
+project('gitk')
+
+shell = find_program('sh')
+wish = find_program('wish')
+
+# Verify that dependencies of "generate-tcl.sh" are satisfied.
+foreach dependency : [ 'chmod', 'mv', 'sed' ]
+ find_program(dependency)
+endforeach
+
+custom_target(
+ command: [
+ shell,
+ meson.current_source_dir() / 'generate-tcl.sh',
+ wish.full_path(),
+ '@INPUT@',
+ '@OUTPUT@',
+ ],
+ input: 'gitk',
+ output: 'gitk',
+ depend_files: [
+ 'generate-tcl.sh',
+ ],
+ install: true,
+ install_dir: get_option('bindir'),
+)
+
+if find_program('msgfmt').found()
+ subdir('po')
+endif
diff --git a/gitk-git/po/meson.build b/gitk-git/po/meson.build
new file mode 100644
index 0000000000..b1ed019828
--- /dev/null
+++ b/gitk-git/po/meson.build
@@ -0,0 +1,19 @@
+import('i18n').gettext('gitk',
+ languages: [
+ 'bg',
+ 'ca',
+ 'de',
+ 'es',
+ 'fr',
+ 'hu',
+ 'it',
+ 'ja',
+ 'pt_br',
+ 'pt_pt',
+ 'ru',
+ 'sv',
+ 'vi',
+ 'zh_cn',
+ ],
+ install: true,
+)
diff --git a/graph.c b/graph.c
index 52205f75c3..26f6fbf000 100644
--- a/graph.c
+++ b/graph.c
@@ -1,4 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
@@ -351,7 +350,7 @@ struct git_graph *graph_init(struct rev_info *opt)
if (!column_colors) {
char *string;
- if (git_config_get_string("log.graphcolors", &string)) {
+ if (repo_config_get_string(opt->repo, "log.graphcolors", &string)) {
/* not configured -- use default */
graph_set_column_colors(column_colors_ansi,
column_colors_ansi_max);
diff --git a/hash.h b/hash.h
index 756166ce5e..4367acfec5 100644
--- a/hash.h
+++ b/hash.h
@@ -234,19 +234,20 @@ enum get_oid_result {
#endif
/* A suitably aligned type for stack allocations of hash contexts. */
-union git_hash_ctx {
- git_SHA_CTX sha1;
- git_SHA_CTX_unsafe sha1_unsafe;
-
- git_SHA256_CTX sha256;
+struct git_hash_ctx {
+ const struct git_hash_algo *algop;
+ union {
+ git_SHA_CTX sha1;
+ git_SHA_CTX_unsafe sha1_unsafe;
+ git_SHA256_CTX sha256;
+ } state;
};
-typedef union git_hash_ctx git_hash_ctx;
-typedef void (*git_hash_init_fn)(git_hash_ctx *ctx);
-typedef void (*git_hash_clone_fn)(git_hash_ctx *dst, const git_hash_ctx *src);
-typedef void (*git_hash_update_fn)(git_hash_ctx *ctx, const void *in, size_t len);
-typedef void (*git_hash_final_fn)(unsigned char *hash, git_hash_ctx *ctx);
-typedef void (*git_hash_final_oid_fn)(struct object_id *oid, git_hash_ctx *ctx);
+typedef void (*git_hash_init_fn)(struct git_hash_ctx *ctx);
+typedef void (*git_hash_clone_fn)(struct git_hash_ctx *dst, const struct git_hash_ctx *src);
+typedef void (*git_hash_update_fn)(struct git_hash_ctx *ctx, const void *in, size_t len);
+typedef void (*git_hash_final_fn)(unsigned char *hash, struct git_hash_ctx *ctx);
+typedef void (*git_hash_final_oid_fn)(struct object_id *oid, struct git_hash_ctx *ctx);
struct git_hash_algo {
/*
@@ -282,21 +283,6 @@ struct git_hash_algo {
/* The hash finalization function for object IDs. */
git_hash_final_oid_fn final_oid_fn;
- /* The non-cryptographic hash initialization function. */
- git_hash_init_fn unsafe_init_fn;
-
- /* The non-cryptographic hash context cloning function. */
- git_hash_clone_fn unsafe_clone_fn;
-
- /* The non-cryptographic hash update function. */
- git_hash_update_fn unsafe_update_fn;
-
- /* The non-cryptographic hash finalization function. */
- git_hash_final_fn unsafe_final_fn;
-
- /* The non-cryptographic hash finalization function. */
- git_hash_final_oid_fn unsafe_final_oid_fn;
-
/* The OID of the empty tree. */
const struct object_id *empty_tree;
@@ -305,9 +291,32 @@ struct git_hash_algo {
/* The all-zeros OID. */
const struct object_id *null_oid;
+
+ /* The unsafe variant of this hash function, if one exists. */
+ const struct git_hash_algo *unsafe;
};
extern const struct git_hash_algo hash_algos[GIT_HASH_NALGOS];
+static inline void git_hash_clone(struct git_hash_ctx *dst, const struct git_hash_ctx *src)
+{
+ src->algop->clone_fn(dst, src);
+}
+
+static inline void git_hash_update(struct git_hash_ctx *ctx, const void *in, size_t len)
+{
+ ctx->algop->update_fn(ctx, in, len);
+}
+
+static inline void git_hash_final(unsigned char *hash, struct git_hash_ctx *ctx)
+{
+ ctx->algop->final_fn(hash, ctx);
+}
+
+static inline void git_hash_final_oid(struct object_id *oid, struct git_hash_ctx *ctx)
+{
+ ctx->algop->final_oid_fn(oid, ctx);
+}
+
/*
* Return a GIT_HASH_* constant based on the name. Returns GIT_HASH_UNKNOWN if
* the name doesn't match a known algorithm.
@@ -320,9 +329,17 @@ int hash_algo_by_length(int len);
/* Identical, except for a pointer to struct git_hash_algo. */
static inline int hash_algo_by_ptr(const struct git_hash_algo *p)
{
- return p - hash_algos;
+ size_t i;
+ for (i = 0; i < GIT_HASH_NALGOS; i++) {
+ const struct git_hash_algo *algop = &hash_algos[i];
+ if (p == algop)
+ return i;
+ }
+ return GIT_HASH_UNKNOWN;
}
+const struct git_hash_algo *unsafe_hash_algo(const struct git_hash_algo *algop);
+
const struct object_id *null_oid(void);
static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2, const struct git_hash_algo *algop)
diff --git a/help.c b/help.c
index 5483ea8fd2..8d91afe851 100644
--- a/help.c
+++ b/help.c
@@ -552,10 +552,34 @@ struct help_unknown_cmd_config {
struct cmdnames aliases;
};
+#define AUTOCORRECT_SHOW (-4)
#define AUTOCORRECT_PROMPT (-3)
#define AUTOCORRECT_NEVER (-2)
#define AUTOCORRECT_IMMEDIATELY (-1)
+static int parse_autocorrect(const char *value)
+{
+ switch (git_parse_maybe_bool_text(value)) {
+ case 1:
+ return AUTOCORRECT_IMMEDIATELY;
+ case 0:
+ return AUTOCORRECT_SHOW;
+ default: /* other random text */
+ break;
+ }
+
+ if (!strcmp(value, "prompt"))
+ return AUTOCORRECT_PROMPT;
+ if (!strcmp(value, "never"))
+ return AUTOCORRECT_NEVER;
+ if (!strcmp(value, "immediate"))
+ return AUTOCORRECT_IMMEDIATELY;
+ if (!strcmp(value, "show"))
+ return AUTOCORRECT_SHOW;
+
+ return 0;
+}
+
static int git_unknown_cmd_config(const char *var, const char *value,
const struct config_context *ctx,
void *cb)
@@ -564,20 +588,17 @@ static int git_unknown_cmd_config(const char *var, const char *value,
const char *p;
if (!strcmp(var, "help.autocorrect")) {
- if (!value)
- return config_error_nonbool(var);
- if (!strcmp(value, "never")) {
- cfg->autocorrect = AUTOCORRECT_NEVER;
- } else if (!strcmp(value, "immediate")) {
- cfg->autocorrect = AUTOCORRECT_IMMEDIATELY;
- } else if (!strcmp(value, "prompt")) {
- cfg->autocorrect = AUTOCORRECT_PROMPT;
- } else {
- int v = git_config_int(var, value, ctx->kvi);
- cfg->autocorrect = (v < 0)
- ? AUTOCORRECT_IMMEDIATELY : v;
+ int v = parse_autocorrect(value);
+
+ if (!v) {
+ v = git_config_int(var, value, ctx->kvi);
+ if (v < 0 || v == 1)
+ v = AUTOCORRECT_IMMEDIATELY;
}
+
+ cfg->autocorrect = v;
}
+
/* Also use aliases for command lookup */
if (skip_prefix(var, "alias.", &p))
add_cmdname(&cfg->aliases, p, strlen(p));
@@ -695,7 +716,8 @@ char *help_unknown_cmd(const char *cmd)
n++)
; /* still counting */
}
- if (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {
+ if (cfg.autocorrect && cfg.autocorrect != AUTOCORRECT_SHOW && n == 1 &&
+ SIMILAR_ENOUGH(best_similarity)) {
char *assumed = xstrdup(main_cmds.names[0]->name);
fprintf_ln(stderr,
diff --git a/http-push.c b/http-push.c
index 43da1c7cd3..1b030d96f4 100644
--- a/http-push.c
+++ b/http-push.c
@@ -760,7 +760,7 @@ static void handle_lockprop_ctx(struct xml_ctx *ctx, int tag_closed)
static void handle_new_lock_ctx(struct xml_ctx *ctx, int tag_closed)
{
struct remote_lock *lock = (struct remote_lock *)ctx->userData;
- git_hash_ctx hash_ctx;
+ struct git_hash_ctx hash_ctx;
unsigned char lock_token_hash[GIT_MAX_RAWSZ];
if (tag_closed && ctx->cdata) {
@@ -774,8 +774,8 @@ static void handle_new_lock_ctx(struct xml_ctx *ctx, int tag_closed)
lock->token = xstrdup(ctx->cdata);
the_hash_algo->init_fn(&hash_ctx);
- the_hash_algo->update_fn(&hash_ctx, lock->token, strlen(lock->token));
- the_hash_algo->final_fn(lock_token_hash, &hash_ctx);
+ git_hash_update(&hash_ctx, lock->token, strlen(lock->token));
+ git_hash_final(lock_token_hash, &hash_ctx);
lock->tmpfile_suffix[0] = '_';
memcpy(lock->tmpfile_suffix + 1, hash_to_hex(lock_token_hash), the_hash_algo->hexsz);
diff --git a/http.c b/http.c
index c8fc15aa11..f4504133e8 100644
--- a/http.c
+++ b/http.c
@@ -609,7 +609,7 @@ static void init_curl_http_auth(CURL *result)
}
}
- credential_fill(&http_auth, 1);
+ credential_fill(the_repository, &http_auth, 1);
if (http_auth.password) {
if (always_auth_proactively()) {
@@ -652,7 +652,7 @@ static void init_curl_proxy_auth(CURL *result)
{
if (proxy_auth.username) {
if (!proxy_auth.password && !proxy_auth.credential)
- credential_fill(&proxy_auth, 1);
+ credential_fill(the_repository, &proxy_auth, 1);
set_proxyauth_name_password(result);
}
@@ -686,7 +686,7 @@ static int has_cert_password(void)
cert_auth.host = xstrdup("");
cert_auth.username = xstrdup("");
cert_auth.path = xstrdup(ssl_cert);
- credential_fill(&cert_auth, 0);
+ credential_fill(the_repository, &cert_auth, 0);
}
return 1;
}
@@ -700,7 +700,7 @@ static int has_proxy_cert_password(void)
proxy_cert_auth.host = xstrdup("");
proxy_cert_auth.username = xstrdup("");
proxy_cert_auth.path = xstrdup(http_proxy_ssl_cert);
- credential_fill(&proxy_cert_auth, 0);
+ credential_fill(the_repository, &proxy_cert_auth, 0);
}
return 1;
}
@@ -1784,9 +1784,9 @@ static int handle_curl_result(struct slot_results *results)
curl_errorstr, sizeof(curl_errorstr));
if (results->curl_result == CURLE_OK) {
- credential_approve(&http_auth);
- credential_approve(&proxy_auth);
- credential_approve(&cert_auth);
+ credential_approve(the_repository, &http_auth);
+ credential_approve(the_repository, &proxy_auth);
+ credential_approve(the_repository, &cert_auth);
return HTTP_OK;
} else if (results->curl_result == CURLE_SSL_CERTPROBLEM) {
/*
@@ -1795,7 +1795,7 @@ static int handle_curl_result(struct slot_results *results)
* with the certificate. So we reject the credential to
* avoid caching or saving a bad password.
*/
- credential_reject(&cert_auth);
+ credential_reject(the_repository, &cert_auth);
return HTTP_NOAUTH;
} else if (results->curl_result == CURLE_SSL_PINNEDPUBKEYNOTMATCH) {
return HTTP_NOMATCHPUBLICKEY;
@@ -1808,7 +1808,7 @@ static int handle_curl_result(struct slot_results *results)
credential_clear_secrets(&http_auth);
return HTTP_REAUTH;
}
- credential_reject(&http_auth);
+ credential_reject(the_repository, &http_auth);
if (always_auth_proactively())
http_proactive_auth = PROACTIVE_AUTH_NONE;
return HTTP_NOAUTH;
@@ -1822,7 +1822,7 @@ static int handle_curl_result(struct slot_results *results)
}
} else {
if (results->http_connectcode == 407)
- credential_reject(&proxy_auth);
+ credential_reject(the_repository, &proxy_auth);
if (!curl_errorstr[0])
strlcpy(curl_errorstr,
curl_easy_strerror(results->curl_result),
@@ -2210,7 +2210,7 @@ static int http_request_reauth(const char *url,
int ret;
if (always_auth_proactively())
- credential_fill(&http_auth, 1);
+ credential_fill(the_repository, &http_auth, 1);
ret = http_request(url, result, target, options);
@@ -2251,7 +2251,7 @@ static int http_request_reauth(const char *url,
BUG("Unknown http_request target");
}
- credential_fill(&http_auth, 1);
+ credential_fill(the_repository, &http_auth, 1);
ret = http_request(url, result, target, options);
}
@@ -2597,8 +2597,8 @@ static size_t fwrite_sha1_file(char *ptr, size_t eltsize, size_t nmemb,
freq->stream.next_out = expn;
freq->stream.avail_out = sizeof(expn);
freq->zret = git_inflate(&freq->stream, Z_SYNC_FLUSH);
- the_hash_algo->update_fn(&freq->c, expn,
- sizeof(expn) - freq->stream.avail_out);
+ git_hash_update(&freq->c, expn,
+ sizeof(expn) - freq->stream.avail_out);
} while (freq->stream.avail_in && freq->zret == Z_OK);
return nmemb;
}
@@ -2763,7 +2763,7 @@ int finish_http_object_request(struct http_object_request *freq)
return -1;
}
- the_hash_algo->final_oid_fn(&freq->real_oid, &freq->c);
+ git_hash_final_oid(&freq->real_oid, &freq->c);
if (freq->zret != Z_STREAM_END) {
unlink_or_warn(freq->tmpfile.buf);
return -1;
diff --git a/http.h b/http.h
index 46e334c2c2..36202139f4 100644
--- a/http.h
+++ b/http.h
@@ -228,7 +228,7 @@ struct http_object_request {
long http_code;
struct object_id oid;
struct object_id real_oid;
- git_hash_ctx c;
+ struct git_hash_ctx c;
git_zstream stream;
int zret;
int rename;
diff --git a/imap-send.c b/imap-send.c
index 68ab1aea83..6c8f84e836 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -922,7 +922,7 @@ static void server_fill_credential(struct imap_server_conf *srvc, struct credent
cred->username = xstrdup_or_null(srvc->user);
cred->password = xstrdup_or_null(srvc->pass);
- credential_fill(cred, 1);
+ credential_fill(the_repository, cred, 1);
if (!srvc->user)
srvc->user = xstrdup(cred->username);
@@ -1123,7 +1123,7 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc, const c
} /* !preauth */
if (cred.username)
- credential_approve(&cred);
+ credential_approve(the_repository, &cred);
credential_clear(&cred);
/* check the target mailbox exists */
@@ -1150,7 +1150,7 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc, const c
bail:
if (cred.username)
- credential_reject(&cred);
+ credential_reject(the_repository, &cred);
credential_clear(&cred);
out:
@@ -1492,9 +1492,9 @@ static int curl_append_msgs_to_imap(struct imap_server_conf *server,
if (cred.username) {
if (res == CURLE_OK)
- credential_approve(&cred);
+ credential_approve(the_repository, &cred);
else if (res == CURLE_LOGIN_DENIED)
- credential_reject(&cred);
+ credential_reject(the_repository, &cred);
}
credential_clear(&cred);
diff --git a/log-tree.c b/log-tree.c
index d08eb672a9..8b184d6776 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -1042,7 +1042,7 @@ static int do_remerge_diff(struct rev_info *opt,
* into the alternative object store list as the primary.
*/
if (opt->remerge_diff && !opt->remerge_objdir) {
- opt->remerge_objdir = tmp_objdir_create("remerge-diff");
+ opt->remerge_objdir = tmp_objdir_create(the_repository, "remerge-diff");
if (!opt->remerge_objdir)
return error(_("unable to create temporary object directory"));
tmp_objdir_replace_primary_odb(opt->remerge_objdir, 1);
diff --git a/mailinfo.c b/mailinfo.c
index aa263bf490..7b001fa5db 100644
--- a/mailinfo.c
+++ b/mailinfo.c
@@ -1,4 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
@@ -1269,7 +1268,7 @@ static int git_mailinfo_config(const char *var, const char *value,
return 0;
}
-void setup_mailinfo(struct mailinfo *mi)
+void setup_mailinfo(struct repository *r, struct mailinfo *mi)
{
memset(mi, 0, sizeof(*mi));
strbuf_init(&mi->name, 0);
@@ -1281,7 +1280,7 @@ void setup_mailinfo(struct mailinfo *mi)
mi->header_stage = 1;
mi->use_inbody_headers = 1;
mi->content_top = mi->content;
- git_config(git_mailinfo_config, mi);
+ repo_config(r, git_mailinfo_config, mi);
}
void clear_mailinfo(struct mailinfo *mi)
diff --git a/mailinfo.h b/mailinfo.h
index f2ffd0349e..1f20664165 100644
--- a/mailinfo.h
+++ b/mailinfo.h
@@ -5,6 +5,8 @@
#define MAX_BOUNDARIES 5
+struct repository;
+
enum quoted_cr_action {
quoted_cr_unset = -1,
quoted_cr_nowarn,
@@ -49,7 +51,7 @@ struct mailinfo {
};
int mailinfo_parse_quoted_cr_action(const char *actionstr, int *action);
-void setup_mailinfo(struct mailinfo *);
+void setup_mailinfo(struct repository *r, struct mailinfo *);
int mailinfo(struct mailinfo *, const char *msg, const char *patch);
void clear_mailinfo(struct mailinfo *);
diff --git a/match-trees.c b/match-trees.c
index a1c8b91eae..ef14ceb594 100644
--- a/match-trees.c
+++ b/match-trees.c
@@ -1,4 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
@@ -8,6 +7,7 @@
#include "tree.h"
#include "tree-walk.h"
#include "object-store-ll.h"
+#include "repository.h"
static int score_missing(unsigned mode)
{
@@ -54,14 +54,15 @@ static int score_matches(unsigned mode1, unsigned mode2)
return score;
}
-static void *fill_tree_desc_strict(struct tree_desc *desc,
+static void *fill_tree_desc_strict(struct repository *r,
+ struct tree_desc *desc,
const struct object_id *hash)
{
void *buffer;
enum object_type type;
unsigned long size;
- buffer = repo_read_object_file(the_repository, hash, &type, &size);
+ buffer = repo_read_object_file(r, hash, &type, &size);
if (!buffer)
die("unable to read tree (%s)", oid_to_hex(hash));
if (type != OBJ_TREE)
@@ -80,12 +81,13 @@ static int base_name_entries_compare(const struct name_entry *a,
/*
* Inspect two trees, and give a score that tells how similar they are.
*/
-static int score_trees(const struct object_id *hash1, const struct object_id *hash2)
+static int score_trees(struct repository *r,
+ const struct object_id *hash1, const struct object_id *hash2)
{
struct tree_desc one;
struct tree_desc two;
- void *one_buf = fill_tree_desc_strict(&one, hash1);
- void *two_buf = fill_tree_desc_strict(&two, hash2);
+ void *one_buf = fill_tree_desc_strict(r, &one, hash1);
+ void *two_buf = fill_tree_desc_strict(r, &two, hash2);
int score = 0;
for (;;) {
@@ -133,7 +135,8 @@ static int score_trees(const struct object_id *hash1, const struct object_id *ha
/*
* Match one itself and its subtrees with two and pick the best match.
*/
-static void match_trees(const struct object_id *hash1,
+static void match_trees(struct repository *r,
+ const struct object_id *hash1,
const struct object_id *hash2,
int *best_score,
char **best_match,
@@ -141,7 +144,7 @@ static void match_trees(const struct object_id *hash1,
int recurse_limit)
{
struct tree_desc one;
- void *one_buf = fill_tree_desc_strict(&one, hash1);
+ void *one_buf = fill_tree_desc_strict(r, &one, hash1);
while (one.size) {
const char *path;
@@ -152,7 +155,7 @@ static void match_trees(const struct object_id *hash1,
elem = tree_entry_extract(&one, &path, &mode);
if (!S_ISDIR(mode))
goto next;
- score = score_trees(elem, hash2);
+ score = score_trees(r, elem, hash2);
if (*best_score < score) {
free(*best_match);
*best_match = xstrfmt("%s%s", base, path);
@@ -160,7 +163,7 @@ static void match_trees(const struct object_id *hash1,
}
if (recurse_limit) {
char *newbase = xstrfmt("%s%s/", base, path);
- match_trees(elem, hash2, best_score, best_match,
+ match_trees(r, elem, hash2, best_score, best_match,
newbase, recurse_limit - 1);
free(newbase);
}
@@ -175,7 +178,8 @@ static void match_trees(const struct object_id *hash1,
* A tree "oid1" has a subdirectory at "prefix". Come up with a tree object by
* replacing it with another tree "oid2".
*/
-static int splice_tree(const struct object_id *oid1, const char *prefix,
+static int splice_tree(struct repository *r,
+ const struct object_id *oid1, const char *prefix,
const struct object_id *oid2, struct object_id *result)
{
char *subpath;
@@ -194,7 +198,7 @@ static int splice_tree(const struct object_id *oid1, const char *prefix,
if (*subpath)
subpath++;
- buf = repo_read_object_file(the_repository, oid1, &type, &sz);
+ buf = repo_read_object_file(r, oid1, &type, &sz);
if (!buf)
die("cannot read tree %s", oid_to_hex(oid1));
init_tree_desc(&desc, oid1, buf, sz);
@@ -232,15 +236,15 @@ static int splice_tree(const struct object_id *oid1, const char *prefix,
oid_to_hex(oid1));
if (*subpath) {
struct object_id tree_oid;
- oidread(&tree_oid, rewrite_here, the_repository->hash_algo);
- status = splice_tree(&tree_oid, subpath, oid2, &subtree);
+ oidread(&tree_oid, rewrite_here, r->hash_algo);
+ status = splice_tree(r, &tree_oid, subpath, oid2, &subtree);
if (status)
return status;
rewrite_with = &subtree;
} else {
rewrite_with = oid2;
}
- hashcpy(rewrite_here, rewrite_with->hash, the_repository->hash_algo);
+ hashcpy(rewrite_here, rewrite_with->hash, r->hash_algo);
status = write_object_file(buf, sz, OBJ_TREE, result);
free(buf);
return status;
@@ -271,7 +275,7 @@ void shift_tree(struct repository *r,
if (!depth_limit)
depth_limit = 2;
- add_score = del_score = score_trees(hash1, hash2);
+ add_score = del_score = score_trees(r, hash1, hash2);
add_prefix = xcalloc(1, 1);
del_prefix = xcalloc(1, 1);
@@ -279,13 +283,13 @@ void shift_tree(struct repository *r,
* See if one's subtree resembles two; if so we need to prefix
* two with a few fake trees to match the prefix.
*/
- match_trees(hash1, hash2, &add_score, &add_prefix, "", depth_limit);
+ match_trees(r, hash1, hash2, &add_score, &add_prefix, "", depth_limit);
/*
* See if two's subtree resembles one; if so we need to
* pick only subtree of two.
*/
- match_trees(hash2, hash1, &del_score, &del_prefix, "", depth_limit);
+ match_trees(r, hash2, hash1, &del_score, &del_prefix, "", depth_limit);
/* Assume we do not have to do any shifting */
oidcpy(shifted, hash2);
@@ -306,7 +310,7 @@ void shift_tree(struct repository *r,
if (!*add_prefix)
goto out;
- splice_tree(hash1, add_prefix, hash2, shifted);
+ splice_tree(r, hash1, add_prefix, hash2, shifted);
out:
free(add_prefix);
@@ -340,16 +344,16 @@ void shift_tree_by(struct repository *r,
if (candidate == 3) {
/* Both are plausible -- we need to evaluate the score */
- int best_score = score_trees(hash1, hash2);
+ int best_score = score_trees(r, hash1, hash2);
int score;
candidate = 0;
- score = score_trees(&sub1, hash2);
+ score = score_trees(r, &sub1, hash2);
if (score > best_score) {
candidate = 1;
best_score = score;
}
- score = score_trees(&sub2, hash1);
+ score = score_trees(r, &sub2, hash1);
if (score > best_score)
candidate = 2;
}
@@ -365,7 +369,7 @@ void shift_tree_by(struct repository *r,
* shift tree2 down by adding shift_prefix above it
* to match tree1.
*/
- splice_tree(hash1, shift_prefix, hash2, shifted);
+ splice_tree(r, hash1, shift_prefix, hash2, shifted);
else
/*
* shift tree2 up by removing shift_prefix from it
diff --git a/meson.build b/meson.build
index 0064eb64f5..021a182135 100644
--- a/meson.build
+++ b/meson.build
@@ -170,7 +170,22 @@
project('git', 'c',
meson_version: '>=0.61.0',
- version: 'v2.47.GIT',
+ # The version is only of cosmetic nature, so if we cannot find a shell yet we
+ # simply don't set up a version at all. This may be the case for example on
+ # Windows systems, where we first have to bootstrap the host environment.
+ version: find_program('sh', required: false).found() ? run_command(
+ 'GIT-VERSION-GEN', meson.current_source_dir(), '--format=@GIT_VERSION@',
+ capture: true,
+ check: true,
+ ).stdout().strip() : 'unknown',
+ default_options: [
+ # Git requires C99 with GNU extensions, which of course isn't supported by
+ # MSVC. Funny enough, C99 doesn't work with MSVC either, as it has only
+ # learned to define __STDC_VERSION__ with C11 and later. We thus require
+ # GNU C99 and fall back to C11. Meson only learned to handle the fallback
+ # with version 1.3.0, so on older versions we use GNU C99 unconditionally.
+ 'c_std=' + (meson.version().version_compare('>=1.3.0') ? 'gnu99,c11' : 'gnu99'),
+ ],
)
fs = import('fs')
@@ -245,10 +260,11 @@ libgit_sources = [
'commit-graph.c',
'commit-reach.c',
'commit.c',
+ 'common-exit.c',
+ 'common-init.c',
'compat/nonblock.c',
'compat/obstack.c',
'compat/terminal.c',
- 'compat/zlib-uncompress2.c',
'config.c',
'connect.c',
'connected.c',
@@ -358,6 +374,7 @@ libgit_sources = [
'patch-delta.c',
'patch-ids.c',
'path.c',
+ 'path-walk.c',
'pathspec.c',
'pkt-line.c',
'preload-index.c',
@@ -480,12 +497,20 @@ libgit_sources = [
'xdiff/xutils.c',
]
+libgit_sources += custom_target(
+ input: 'command-list.txt',
+ output: 'command-list.h',
+ command: [shell, meson.current_source_dir() + '/generate-cmdlist.sh', meson.current_source_dir(), '@OUTPUT@'],
+ env: script_environment,
+)
+
builtin_sources = [
'builtin/add.c',
'builtin/am.c',
'builtin/annotate.c',
'builtin/apply.c',
'builtin/archive.c',
+ 'builtin/backfill.c',
'builtin/bisect.c',
'builtin/blame.c',
'builtin/branch.c',
@@ -607,14 +632,7 @@ builtin_sources = [
'builtin/write-tree.c',
]
-libgit_sources += custom_target(
- input: 'command-list.txt',
- output: 'command-list.h',
- command: [shell, meson.current_source_dir() + '/generate-cmdlist.sh', meson.current_source_dir(), '@OUTPUT@'],
- env: script_environment,
-)
-
-libgit_sources += custom_target(
+builtin_sources += custom_target(
output: 'config-list.h',
command: [
shell,
@@ -625,8 +643,8 @@ libgit_sources += custom_target(
env: script_environment,
)
-libgit_sources += custom_target(
- input: 'Documentation/githooks.txt',
+builtin_sources += custom_target(
+ input: 'Documentation/githooks.adoc',
output: 'hook-list.h',
command: [
shell,
@@ -650,10 +668,16 @@ build_options_config.set('GIT_TEST_CMP_USE_COPIED_CONTEXT', '')
build_options_config.set('GIT_TEST_INDEX_VERSION', '')
build_options_config.set('GIT_TEST_OPTS', '')
build_options_config.set('GIT_TEST_PERL_FATAL_WARNINGS', '')
-build_options_config.set('GIT_TEST_UTF8_LOCALE', '')
+build_options_config.set_quoted('GIT_TEST_UTF8_LOCALE', get_option('test_utf8_locale'))
build_options_config.set_quoted('LOCALEDIR', fs.as_posix(get_option('prefix') / get_option('localedir')))
build_options_config.set('GITWEBDIR', fs.as_posix(get_option('prefix') / get_option('datadir') / 'gitweb'))
+if get_option('breaking_changes')
+ build_options_config.set('WITH_BREAKING_CHANGES', 'YesPlease')
+else
+ build_options_config.set('WITH_BREAKING_CHANGES', '')
+endif
+
if get_option('sane_tool_path') != ''
build_options_config.set_quoted('BROKEN_PATH_FIX', 's|^\# @BROKEN_PATH_FIX@$|git_broken_path_fix "' + get_option('sane_tool_path') + '"|')
else
@@ -708,7 +732,6 @@ if get_option('warning_level') in ['2','3', 'everything'] and compiler.get_argum
# These are disabled because we have these all over the place.
'-Wno-empty-body',
'-Wno-missing-field-initializers',
- '-Wno-sign-compare',
]
if compiler.has_argument(cflag)
libgit_c_args += cflag
@@ -755,7 +778,22 @@ endif
# Note that we only set NO_PERL if the Perl features were disabled by the user.
# It may not be set when we have found Perl, but only use it to run tests.
-perl = find_program('perl', version: '>=5.8.1', dirs: program_path, required: perl_required)
+#
+# At the time of writing, executing `perl --version` results in a string
+# similar to the following output:
+#
+# This is perl 5, version 40, subversion 0 (v5.40.0) built for x86_64-linux-thread-multi
+#
+# Meson picks up the "40" as version number instead of using "v5.40.0"
+# due to the regular expression it uses. This got fixed in Meson 1.7.0,
+# but meanwhile we have to either use `-V:version` instead of `--version`,
+# which we can do starting with Meson 1.5.0 and newer, or we have to
+# match against the minor version.
+if meson.version().version_compare('>=1.5.0')
+ perl = find_program('perl', dirs: program_path, required: perl_required, version: '>=5.26.0', version_argument: '-V:version')
+else
+ perl = find_program('perl', dirs: program_path, required: perl_required, version: '>=26')
+endif
perl_features_enabled = perl.found() and get_option('perl').allowed()
if perl_features_enabled
build_options_config.set('NO_PERL', '')
@@ -778,11 +816,23 @@ else
build_options_config.set('NO_PERL_CPAN_FALLBACKS', '')
endif
-zlib = dependency('zlib', default_options: ['default_library=static', 'tests=disabled'])
-if zlib.version().version_compare('<1.2.0')
- libgit_c_args += '-DNO_DEFLATE_BOUND'
+zlib_backend = get_option('zlib_backend')
+if zlib_backend in ['auto', 'zlib-ng']
+ zlib_ng = dependency('zlib-ng', required: zlib_backend == 'zlib-ng')
+ if zlib_ng.found()
+ zlib_backend = 'zlib-ng'
+ libgit_c_args += '-DHAVE_ZLIB_NG'
+ libgit_dependencies += zlib_ng
+ endif
+endif
+if zlib_backend in ['auto', 'zlib']
+ zlib = dependency('zlib', default_options: ['default_library=static', 'tests=disabled'])
+ if zlib.version().version_compare('<1.2.0')
+ libgit_c_args += '-DNO_DEFLATE_BOUND'
+ endif
+ zlib_backend = 'zlib'
+ libgit_dependencies += zlib
endif
-libgit_dependencies += zlib
threads = dependency('threads', required: false)
if threads.found()
@@ -1325,15 +1375,19 @@ if not meson.is_cross_build() and fs.exists('/dev/tty')
libgit_c_args += '-DHAVE_DEV_TTY'
endif
+csprng_backend = get_option('csprng_backend')
https_backend = get_option('https_backend')
+sha1_backend = get_option('sha1_backend')
+sha1_unsafe_backend = get_option('sha1_unsafe_backend')
+sha256_backend = get_option('sha256_backend')
-security_framework = dependency('Security', required: https_backend == 'CommonCrypto')
+security_framework = dependency('Security', required: 'CommonCrypto' in [https_backend, sha1_backend, sha1_unsafe_backend])
core_foundation_framework = dependency('CoreFoundation', required: security_framework.found())
if https_backend == 'auto' and security_framework.found()
https_backend = 'CommonCrypto'
endif
-openssl_required = https_backend == 'openssl' or get_option('sha1_backend') == 'openssl' or get_option('sha256_backend') == 'openssl'
+openssl_required = 'openssl' in [csprng_backend, https_backend, sha1_backend, sha1_unsafe_backend, sha256_backend]
openssl = dependency('openssl', required: openssl_required, default_options: ['default_library=static'])
if https_backend == 'auto' and openssl.found()
https_backend = 'openssl'
@@ -1354,7 +1408,6 @@ if https_backend != 'openssl'
libgit_c_args += '-DNO_OPENSSL'
endif
-sha1_backend = get_option('sha1_backend')
if sha1_backend == 'sha1dc'
libgit_c_args += '-DSHA1_DC'
libgit_c_args += '-DSHA1DC_NO_STANDARD_INCLUDES=1'
@@ -1367,22 +1420,40 @@ if sha1_backend == 'sha1dc'
'sha1dc/sha1.c',
'sha1dc/ubc_check.c',
]
-elif sha1_backend == 'common-crypto'
+endif
+if sha1_backend == 'CommonCrypto' or sha1_unsafe_backend == 'CommonCrypto'
+ if sha1_backend == 'CommonCrypto'
+ libgit_c_args += '-DSHA1_APPLE'
+ endif
+ if sha1_unsafe_backend == 'CommonCrypto'
+ libgit_c_args += '-DSHA1_APPLE_UNSAFE'
+ endif
+
libgit_c_args += '-DCOMMON_DIGEST_FOR_OPENSSL'
- libgit_c_args += '-DSHA1_APPLE'
# Apple CommonCrypto requires chunking
libgit_c_args += '-DSHA1_MAX_BLOCK_SIZE=1024L*1024L*1024L'
-elif sha1_backend == 'openssl'
- libgit_c_args += '-DSHA1_OPENSSL'
+endif
+if sha1_backend == 'openssl' or sha1_unsafe_backend == 'openssl'
+ if sha1_backend == 'openssl'
+ libgit_c_args += '-DSHA1_OPENSSL'
+ endif
+ if sha1_unsafe_backend == 'openssl'
+ libgit_c_args += '-DSHA1_OPENSSL_UNSAFE'
+ endif
+
libgit_dependencies += openssl
-elif sha1_backend == 'block'
- libgit_c_args += '-DSHA1_BLK'
+endif
+if sha1_backend == 'block' or sha1_unsafe_backend == 'block'
+ if sha1_backend == 'block'
+ libgit_c_args += '-DSHA1_BLK'
+ endif
+ if sha1_unsafe_backend == 'block'
+ libgit_c_args += '-DSHA1_BLK_UNSAFE'
+ endif
+
libgit_sources += 'block-sha1/sha1.c'
-else
- error('Unhandled SHA1 backend ' + sha1_backend)
endif
-sha256_backend = get_option('sha256_backend')
if sha256_backend == 'openssl'
libgit_c_args += '-DSHA256_OPENSSL'
libgit_dependencies += openssl
@@ -1401,18 +1472,30 @@ else
error('Unhandled SHA256 backend ' + sha256_backend)
endif
-if compiler.has_header_symbol('stdlib.h', 'arc4random_buf')
+# Backends are ordered to reflect our preference for more secure and faster
+# ones over the ones that are less so.
+if csprng_backend in ['auto', 'arc4random'] and compiler.has_header_symbol('stdlib.h', 'arc4random_buf', required: csprng_backend == 'arc4random')
libgit_c_args += '-DHAVE_ARC4RANDOM'
-elif compiler.has_header_symbol('bsd/stdlib.h', 'arc4random_buf')
+ csprng_backend = 'arc4random'
+elif csprng_backend in ['auto', 'arc4random_bsd'] and compiler.has_header_symbol('bsd/stdlib.h', 'arc4random_buf', required: csprng_backend == 'arc4random_bsd')
libgit_c_args += '-DHAVE_ARC4RANDOM_BSD'
-elif compiler.has_function('getrandom', prefix: '#include <sys/random.h>')
+ csprng_backend = 'arc4random_bsd'
+elif csprng_backend in ['auto', 'getrandom'] and compiler.has_header_symbol('sys/random.h', 'getrandom', required: csprng_backend == 'getrandom')
libgit_c_args += '-DHAVE_GETRANDOM'
-elif compiler.has_function('getentropy', prefix: '#include <unistd.h>')
+ csprng_backend = 'getrandom'
+elif csprng_backend in ['auto', 'getentropy'] and compiler.has_header_symbol('unistd.h', 'getentropy', required: csprng_backend == 'getentropy')
libgit_c_args += '-DHAVE_GETENTROPY'
-elif compiler.has_function('RtlGenRandom', prefix: '#include <windows.h>\n#include <ntsecapi.h>')
+ csprng_backend = 'getentropy'
+elif csprng_backend in ['auto', 'rtlgenrandom'] and compiler.has_header_symbol('ntsecapi.h', 'RtlGenRandom', prefix: '#include <windows.h>', required: csprng_backend == 'rtlgenrandom')
libgit_c_args += '-DHAVE_RTLGENRANDOM'
-elif openssl.found()
+ csprng_backend = 'rtlgenrandom'
+elif csprng_backend in ['auto', 'openssl'] and openssl.found()
libgit_c_args += '-DHAVE_OPENSSL_CSPRNG'
+ csprng_backend = 'openssl'
+elif csprng_backend in ['auto', 'urandom']
+ csprng_backend = 'urandom'
+else
+ error('Unsupported CSPRNG backend: ' + csprng_backend)
endif
if get_option('runtime_prefix')
@@ -1493,7 +1576,9 @@ libgit_version_library = static_library('git-version',
'version.c',
version_def_h,
],
- c_args: libgit_c_args,
+ c_args: libgit_c_args + [
+ '-DGIT_VERSION_H="' + version_def_h.full_path() + '"',
+ ],
dependencies: libgit_dependencies,
include_directories: libgit_include_directories,
)
@@ -1857,7 +1942,6 @@ endforeach
if intl.found()
subdir('po')
endif
-subdir('contrib')
# Gitweb requires Perl, so we disable the auto-feature if Perl was not found.
# We make sure further up that Perl is required in case the gitweb option is
@@ -1879,11 +1963,17 @@ if get_option('tests')
subdir('t')
endif
+if get_option('fuzzers')
+ subdir('oss-fuzz')
+endif
+
subdir('bin-wrappers')
if get_option('docs') != []
subdir('Documentation')
endif
+subdir('contrib')
+
foreach key, value : {
'DIFF': diff.full_path(),
'GIT_TEST_CMP': diff.full_path() + ' -u',
@@ -1912,6 +2002,27 @@ configure_file(
configuration: build_options_config,
)
+# Development environments can be used via `meson devenv -C <builddir>`. This
+# allows you to execute test scripts directly with the built Git version and
+# puts the built version of Git in your PATH.
+devenv = environment()
+devenv.set('GIT_BUILD_DIR', meson.current_build_dir())
+devenv.prepend('PATH', meson.current_build_dir() / 'bin-wrappers')
+meson.add_devenv(devenv)
+
+# Generate the 'version' file in the distribution tarball. This is used via
+# `meson dist -C <builddir>` to populate the source archive with the Git
+# version that the archive is being generated from.
+meson.add_dist_script(
+ shell,
+ '-c',
+ '"$1" "$2" "$3" --format="@GIT_VERSION@" "$MESON_DIST_ROOT/version"',
+ 'GIT-VERSION-GEN',
+ shell,
+ meson.current_source_dir() / 'GIT-VERSION-GEN',
+ meson.current_source_dir(),
+)
+
summary({
'curl': curl.found(),
'expat': expat.found(),
@@ -1923,3 +2034,12 @@ summary({
'perl': perl_features_enabled,
'python': python.found(),
}, section: 'Auto-detected features')
+
+summary({
+ 'csprng': csprng_backend,
+ 'https': https_backend,
+ 'sha1': sha1_backend,
+ 'sha1_unsafe': sha1_unsafe_backend,
+ 'sha256': sha256_backend,
+ 'zlib': zlib_backend,
+}, section: 'Backends')
diff --git a/meson_options.txt b/meson_options.txt
index f50bb40cdf..5c12e9055e 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -27,6 +27,8 @@ option('version', type: 'string', value: '',
description: 'Version string reported by git-version(1) and other tools.')
# Features supported by Git.
+option('contrib', type: 'array', value: [ 'completion' ], choices: [ 'completion', 'subtree' ],
+ description: 'Contributed features to include.')
option('curl', type: 'feature', value: 'enabled',
description: 'Build helpers used to access remotes with the HTTP transport.')
option('expat', type: 'feature', value: 'enabled',
@@ -47,14 +49,22 @@ option('regex', type: 'feature', value: 'auto',
description: 'Use the system-provided regex library instead of the bundled one.')
# Backends.
+option('csprng_backend', type: 'combo', value: 'auto', choices: ['auto', 'arc4random', 'arc4random_bsd', 'getrandom', 'getentropy', 'rtlgenrandom', 'openssl', 'urandom'],
+ description: 'The backend to use for generating cryptographically-secure pseudo-random numbers.')
option('https_backend', type: 'combo', value: 'auto', choices: ['auto', 'openssl', 'CommonCrypto', 'none'],
description: 'The HTTPS backend to use when connecting to remotes.')
-option('sha1_backend', type: 'combo', choices: ['openssl', 'block', 'sha1dc', 'common-crypto'], value: 'sha1dc',
- description: 'The backend used for hashing objects with the SHA1 object format')
+option('sha1_backend', type: 'combo', choices: ['openssl', 'block', 'sha1dc', 'CommonCrypto'], value: 'sha1dc',
+ description: 'The backend used for hashing objects with the SHA1 object format.')
+option('sha1_unsafe_backend', type: 'combo', choices: ['openssl', 'block', 'CommonCrypto', 'none'], value: 'none',
+ description: 'The backend used for hashing data with the SHA1 object format in case no cryptographic security is needed.')
option('sha256_backend', type: 'combo', choices: ['openssl', 'nettle', 'gcrypt', 'block'], value: 'block',
- description: 'The backend used for hashing objects with the SHA256 object format')
+ description: 'The backend used for hashing objects with the SHA256 object format.')
+option('zlib_backend', type: 'combo', choices: ['auto', 'zlib', 'zlib-ng'], value: 'auto',
+ description: 'The backend used for compressing objects and other data.')
# Build tweaks.
+option('breaking_changes', type: 'boolean', value: false,
+ description: 'Enable upcoming breaking changes.')
option('macos_use_homebrew_gettext', type: 'boolean', value: true,
description: 'Use gettext from Homebrew instead of the slightly-broken system-provided one.')
@@ -93,3 +103,7 @@ option('tests', type: 'boolean', value: true,
description: 'Enable building tests. This requires Perl, but is separate from the "perl" option such that you can build tests without Perl features enabled.')
option('test_output_directory', type: 'string',
description: 'Path to the directory used to store test outputs')
+option('test_utf8_locale', type: 'string',
+ description: 'Name of a UTF-8 locale used for testing.')
+option('fuzzers', type: 'boolean', value: false,
+ description: 'Enable building fuzzers.')
diff --git a/midx-write.c b/midx-write.c
index 0066594fa6..61b59d557d 100644
--- a/midx-write.c
+++ b/midx-write.c
@@ -658,8 +658,8 @@ static void write_midx_reverse_index(char *midx_name, unsigned char *midx_hash,
strbuf_addf(&buf, "%s-%s.rev", midx_name, hash_to_hex_algop(midx_hash,
ctx->repo->hash_algo));
- tmp_file = write_rev_file_order(NULL, ctx->pack_order, ctx->entries_nr,
- midx_hash, WRITE_REV);
+ tmp_file = write_rev_file_order(ctx->repo->hash_algo, NULL, ctx->pack_order,
+ ctx->entries_nr, midx_hash, WRITE_REV);
if (finalize_object_file(tmp_file, buf.buf))
die(_("cannot store reverse index file"));
@@ -1131,7 +1131,8 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
ctx.pack_paths_checked = 0;
if (flags & MIDX_PROGRESS)
- ctx.progress = start_delayed_progress(_("Adding packfiles to multi-pack-index"), 0);
+ ctx.progress = start_delayed_progress(r,
+ _("Adding packfiles to multi-pack-index"), 0);
else
ctx.progress = NULL;
@@ -1539,7 +1540,9 @@ int expire_midx_packs(struct repository *r, const char *object_dir, unsigned fla
CALLOC_ARRAY(count, m->num_packs);
if (flags & MIDX_PROGRESS)
- progress = start_delayed_progress(_("Counting referenced objects"),
+ progress = start_delayed_progress(
+ r,
+ _("Counting referenced objects"),
m->num_objects);
for (i = 0; i < m->num_objects; i++) {
int pack_int_id = nth_midxed_pack_int_id(m, i);
@@ -1549,7 +1552,9 @@ int expire_midx_packs(struct repository *r, const char *object_dir, unsigned fla
stop_progress(&progress);
if (flags & MIDX_PROGRESS)
- progress = start_delayed_progress(_("Finding and deleting unreferenced packfiles"),
+ progress = start_delayed_progress(
+ r,
+ _("Finding and deleting unreferenced packfiles"),
m->num_packs);
for (i = 0; i < m->num_packs; i++) {
char *pack_name;
diff --git a/midx.c b/midx.c
index f8a75cafd4..d91088efb8 100644
--- a/midx.c
+++ b/midx.c
@@ -907,7 +907,8 @@ int verify_midx_file(struct repository *r, const char *object_dir, unsigned flag
midx_report(_("incorrect checksum"));
if (flags & MIDX_PROGRESS)
- progress = start_delayed_progress(_("Looking for referenced packfiles"),
+ progress = start_delayed_progress(r,
+ _("Looking for referenced packfiles"),
m->num_packs + m->num_packs_in_base);
for (i = 0; i < m->num_packs + m->num_packs_in_base; i++) {
if (prepare_midx_pack(r, m, i))
@@ -927,7 +928,8 @@ int verify_midx_file(struct repository *r, const char *object_dir, unsigned flag
}
if (flags & MIDX_PROGRESS)
- progress = start_sparse_progress(_("Verifying OID order in multi-pack-index"),
+ progress = start_sparse_progress(r,
+ _("Verifying OID order in multi-pack-index"),
m->num_objects - 1);
for (curr = m; curr; curr = curr->base_midx) {
@@ -959,14 +961,17 @@ int verify_midx_file(struct repository *r, const char *object_dir, unsigned flag
}
if (flags & MIDX_PROGRESS)
- progress = start_sparse_progress(_("Sorting objects by packfile"),
+ progress = start_sparse_progress(r,
+ _("Sorting objects by packfile"),
m->num_objects);
display_progress(progress, 0); /* TODO: Measure QSORT() progress */
QSORT(pairs, m->num_objects, compare_pair_pos_vs_id);
stop_progress(&progress);
if (flags & MIDX_PROGRESS)
- progress = start_sparse_progress(_("Verifying object offsets"), m->num_objects);
+ progress = start_sparse_progress(r,
+ _("Verifying object offsets"),
+ m->num_objects);
for (i = 0; i < m->num_objects + m->num_objects_in_base; i++) {
struct object_id oid;
struct pack_entry e;
diff --git a/object-file.c b/object-file.c
index 5b792b3dd4..00c3a4b910 100644
--- a/object-file.c
+++ b/object-file.c
@@ -86,84 +86,90 @@ static const struct object_id null_oid_sha256 = {
.algo = GIT_HASH_SHA256,
};
-static void git_hash_sha1_init(git_hash_ctx *ctx)
+static void git_hash_sha1_init(struct git_hash_ctx *ctx)
{
- git_SHA1_Init(&ctx->sha1);
+ ctx->algop = &hash_algos[GIT_HASH_SHA1];
+ git_SHA1_Init(&ctx->state.sha1);
}
-static void git_hash_sha1_clone(git_hash_ctx *dst, const git_hash_ctx *src)
+static void git_hash_sha1_clone(struct git_hash_ctx *dst, const struct git_hash_ctx *src)
{
- git_SHA1_Clone(&dst->sha1, &src->sha1);
+ dst->algop = src->algop;
+ git_SHA1_Clone(&dst->state.sha1, &src->state.sha1);
}
-static void git_hash_sha1_update(git_hash_ctx *ctx, const void *data, size_t len)
+static void git_hash_sha1_update(struct git_hash_ctx *ctx, const void *data, size_t len)
{
- git_SHA1_Update(&ctx->sha1, data, len);
+ git_SHA1_Update(&ctx->state.sha1, data, len);
}
-static void git_hash_sha1_final(unsigned char *hash, git_hash_ctx *ctx)
+static void git_hash_sha1_final(unsigned char *hash, struct git_hash_ctx *ctx)
{
- git_SHA1_Final(hash, &ctx->sha1);
+ git_SHA1_Final(hash, &ctx->state.sha1);
}
-static void git_hash_sha1_final_oid(struct object_id *oid, git_hash_ctx *ctx)
+static void git_hash_sha1_final_oid(struct object_id *oid, struct git_hash_ctx *ctx)
{
- git_SHA1_Final(oid->hash, &ctx->sha1);
+ git_SHA1_Final(oid->hash, &ctx->state.sha1);
memset(oid->hash + GIT_SHA1_RAWSZ, 0, GIT_MAX_RAWSZ - GIT_SHA1_RAWSZ);
oid->algo = GIT_HASH_SHA1;
}
-static void git_hash_sha1_init_unsafe(git_hash_ctx *ctx)
+static void git_hash_sha1_init_unsafe(struct git_hash_ctx *ctx)
{
- git_SHA1_Init_unsafe(&ctx->sha1_unsafe);
+ ctx->algop = unsafe_hash_algo(&hash_algos[GIT_HASH_SHA1]);
+ git_SHA1_Init_unsafe(&ctx->state.sha1_unsafe);
}
-static void git_hash_sha1_clone_unsafe(git_hash_ctx *dst, const git_hash_ctx *src)
+static void git_hash_sha1_clone_unsafe(struct git_hash_ctx *dst, const struct git_hash_ctx *src)
{
- git_SHA1_Clone_unsafe(&dst->sha1_unsafe, &src->sha1_unsafe);
+ dst->algop = src->algop;
+ git_SHA1_Clone_unsafe(&dst->state.sha1_unsafe, &src->state.sha1_unsafe);
}
-static void git_hash_sha1_update_unsafe(git_hash_ctx *ctx, const void *data,
+static void git_hash_sha1_update_unsafe(struct git_hash_ctx *ctx, const void *data,
size_t len)
{
- git_SHA1_Update_unsafe(&ctx->sha1_unsafe, data, len);
+ git_SHA1_Update_unsafe(&ctx->state.sha1_unsafe, data, len);
}
-static void git_hash_sha1_final_unsafe(unsigned char *hash, git_hash_ctx *ctx)
+static void git_hash_sha1_final_unsafe(unsigned char *hash, struct git_hash_ctx *ctx)
{
- git_SHA1_Final_unsafe(hash, &ctx->sha1_unsafe);
+ git_SHA1_Final_unsafe(hash, &ctx->state.sha1_unsafe);
}
-static void git_hash_sha1_final_oid_unsafe(struct object_id *oid, git_hash_ctx *ctx)
+static void git_hash_sha1_final_oid_unsafe(struct object_id *oid, struct git_hash_ctx *ctx)
{
- git_SHA1_Final_unsafe(oid->hash, &ctx->sha1_unsafe);
+ git_SHA1_Final_unsafe(oid->hash, &ctx->state.sha1_unsafe);
memset(oid->hash + GIT_SHA1_RAWSZ, 0, GIT_MAX_RAWSZ - GIT_SHA1_RAWSZ);
oid->algo = GIT_HASH_SHA1;
}
-static void git_hash_sha256_init(git_hash_ctx *ctx)
+static void git_hash_sha256_init(struct git_hash_ctx *ctx)
{
- git_SHA256_Init(&ctx->sha256);
+ ctx->algop = unsafe_hash_algo(&hash_algos[GIT_HASH_SHA256]);
+ git_SHA256_Init(&ctx->state.sha256);
}
-static void git_hash_sha256_clone(git_hash_ctx *dst, const git_hash_ctx *src)
+static void git_hash_sha256_clone(struct git_hash_ctx *dst, const struct git_hash_ctx *src)
{
- git_SHA256_Clone(&dst->sha256, &src->sha256);
+ dst->algop = src->algop;
+ git_SHA256_Clone(&dst->state.sha256, &src->state.sha256);
}
-static void git_hash_sha256_update(git_hash_ctx *ctx, const void *data, size_t len)
+static void git_hash_sha256_update(struct git_hash_ctx *ctx, const void *data, size_t len)
{
- git_SHA256_Update(&ctx->sha256, data, len);
+ git_SHA256_Update(&ctx->state.sha256, data, len);
}
-static void git_hash_sha256_final(unsigned char *hash, git_hash_ctx *ctx)
+static void git_hash_sha256_final(unsigned char *hash, struct git_hash_ctx *ctx)
{
- git_SHA256_Final(hash, &ctx->sha256);
+ git_SHA256_Final(hash, &ctx->state.sha256);
}
-static void git_hash_sha256_final_oid(struct object_id *oid, git_hash_ctx *ctx)
+static void git_hash_sha256_final_oid(struct object_id *oid, struct git_hash_ctx *ctx)
{
- git_SHA256_Final(oid->hash, &ctx->sha256);
+ git_SHA256_Final(oid->hash, &ctx->state.sha256);
/*
* This currently does nothing, so the compiler should optimize it out,
* but keep it in case we extend the hash size again.
@@ -172,18 +178,18 @@ static void git_hash_sha256_final_oid(struct object_id *oid, git_hash_ctx *ctx)
oid->algo = GIT_HASH_SHA256;
}
-static void git_hash_unknown_init(git_hash_ctx *ctx UNUSED)
+static void git_hash_unknown_init(struct git_hash_ctx *ctx UNUSED)
{
BUG("trying to init unknown hash");
}
-static void git_hash_unknown_clone(git_hash_ctx *dst UNUSED,
- const git_hash_ctx *src UNUSED)
+static void git_hash_unknown_clone(struct git_hash_ctx *dst UNUSED,
+ const struct git_hash_ctx *src UNUSED)
{
BUG("trying to clone unknown hash");
}
-static void git_hash_unknown_update(git_hash_ctx *ctx UNUSED,
+static void git_hash_unknown_update(struct git_hash_ctx *ctx UNUSED,
const void *data UNUSED,
size_t len UNUSED)
{
@@ -191,17 +197,33 @@ static void git_hash_unknown_update(git_hash_ctx *ctx UNUSED,
}
static void git_hash_unknown_final(unsigned char *hash UNUSED,
- git_hash_ctx *ctx UNUSED)
+ struct git_hash_ctx *ctx UNUSED)
{
BUG("trying to finalize unknown hash");
}
static void git_hash_unknown_final_oid(struct object_id *oid UNUSED,
- git_hash_ctx *ctx UNUSED)
+ struct git_hash_ctx *ctx UNUSED)
{
BUG("trying to finalize unknown hash");
}
+static const struct git_hash_algo sha1_unsafe_algo = {
+ .name = "sha1",
+ .format_id = GIT_SHA1_FORMAT_ID,
+ .rawsz = GIT_SHA1_RAWSZ,
+ .hexsz = GIT_SHA1_HEXSZ,
+ .blksz = GIT_SHA1_BLKSZ,
+ .init_fn = git_hash_sha1_init_unsafe,
+ .clone_fn = git_hash_sha1_clone_unsafe,
+ .update_fn = git_hash_sha1_update_unsafe,
+ .final_fn = git_hash_sha1_final_unsafe,
+ .final_oid_fn = git_hash_sha1_final_oid_unsafe,
+ .empty_tree = &empty_tree_oid,
+ .empty_blob = &empty_blob_oid,
+ .null_oid = &null_oid_sha1,
+};
+
const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
{
.name = NULL,
@@ -214,11 +236,6 @@ const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
.update_fn = git_hash_unknown_update,
.final_fn = git_hash_unknown_final,
.final_oid_fn = git_hash_unknown_final_oid,
- .unsafe_init_fn = git_hash_unknown_init,
- .unsafe_clone_fn = git_hash_unknown_clone,
- .unsafe_update_fn = git_hash_unknown_update,
- .unsafe_final_fn = git_hash_unknown_final,
- .unsafe_final_oid_fn = git_hash_unknown_final_oid,
.empty_tree = NULL,
.empty_blob = NULL,
.null_oid = NULL,
@@ -234,11 +251,7 @@ const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
.update_fn = git_hash_sha1_update,
.final_fn = git_hash_sha1_final,
.final_oid_fn = git_hash_sha1_final_oid,
- .unsafe_init_fn = git_hash_sha1_init_unsafe,
- .unsafe_clone_fn = git_hash_sha1_clone_unsafe,
- .unsafe_update_fn = git_hash_sha1_update_unsafe,
- .unsafe_final_fn = git_hash_sha1_final_unsafe,
- .unsafe_final_oid_fn = git_hash_sha1_final_oid_unsafe,
+ .unsafe = &sha1_unsafe_algo,
.empty_tree = &empty_tree_oid,
.empty_blob = &empty_blob_oid,
.null_oid = &null_oid_sha1,
@@ -254,11 +267,6 @@ const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
.update_fn = git_hash_sha256_update,
.final_fn = git_hash_sha256_final,
.final_oid_fn = git_hash_sha256_final_oid,
- .unsafe_init_fn = git_hash_sha256_init,
- .unsafe_clone_fn = git_hash_sha256_clone,
- .unsafe_update_fn = git_hash_sha256_update,
- .unsafe_final_fn = git_hash_sha256_final,
- .unsafe_final_oid_fn = git_hash_sha256_final_oid,
.empty_tree = &empty_tree_oid_sha256,
.empty_blob = &empty_blob_oid_sha256,
.null_oid = &null_oid_sha256,
@@ -305,6 +313,15 @@ int hash_algo_by_length(int len)
return GIT_HASH_UNKNOWN;
}
+const struct git_hash_algo *unsafe_hash_algo(const struct git_hash_algo *algop)
+{
+ /* If we have a faster "unsafe" implementation, use that. */
+ if (algop->unsafe)
+ return algop->unsafe;
+ /* Otherwise use the default one. */
+ return algop;
+}
+
/*
* This is meant to hold a *small* number of objects that you would
* want repo_read_object_file() to be able to return, but yet you do not want
@@ -1169,7 +1186,7 @@ int stream_object_signature(struct repository *r, const struct object_id *oid)
unsigned long size;
enum object_type obj_type;
struct git_istream *st;
- git_hash_ctx c;
+ struct git_hash_ctx c;
char hdr[MAX_HEADER_LEN];
int hdrlen;
@@ -1182,7 +1199,7 @@ int stream_object_signature(struct repository *r, const struct object_id *oid)
/* Sha1.. */
r->hash_algo->init_fn(&c);
- r->hash_algo->update_fn(&c, hdr, hdrlen);
+ git_hash_update(&c, hdr, hdrlen);
for (;;) {
char buf[1024 * 16];
ssize_t readlen = read_istream(st, buf, sizeof(buf));
@@ -1193,9 +1210,9 @@ int stream_object_signature(struct repository *r, const struct object_id *oid)
}
if (!readlen)
break;
- r->hash_algo->update_fn(&c, buf, readlen);
+ git_hash_update(&c, buf, readlen);
}
- r->hash_algo->final_oid_fn(&real_oid, &c);
+ git_hash_final_oid(&real_oid, &c);
close_istream(st);
return !oideq(oid, &real_oid) ? -1 : 0;
}
@@ -1934,15 +1951,15 @@ void *read_object_with_reference(struct repository *r,
}
}
-static void hash_object_body(const struct git_hash_algo *algo, git_hash_ctx *c,
+static void hash_object_body(const struct git_hash_algo *algo, struct git_hash_ctx *c,
const void *buf, unsigned long len,
struct object_id *oid,
char *hdr, int *hdrlen)
{
algo->init_fn(c);
- algo->update_fn(c, hdr, *hdrlen);
- algo->update_fn(c, buf, len);
- algo->final_oid_fn(oid, c);
+ git_hash_update(c, hdr, *hdrlen);
+ git_hash_update(c, buf, len);
+ git_hash_final_oid(oid, c);
}
static void write_object_file_prepare(const struct git_hash_algo *algo,
@@ -1950,7 +1967,7 @@ static void write_object_file_prepare(const struct git_hash_algo *algo,
enum object_type type, struct object_id *oid,
char *hdr, int *hdrlen)
{
- git_hash_ctx c;
+ struct git_hash_ctx c;
/* Generate the header */
*hdrlen = format_object_header(hdr, *hdrlen, type, len);
@@ -1964,60 +1981,65 @@ static void write_object_file_prepare_literally(const struct git_hash_algo *algo
const char *type, struct object_id *oid,
char *hdr, int *hdrlen)
{
- git_hash_ctx c;
+ struct git_hash_ctx c;
*hdrlen = format_object_header_literally(hdr, *hdrlen, type, len);
hash_object_body(algo, &c, buf, len, oid, hdr, hdrlen);
}
-static int check_collision(const char *filename_a, const char *filename_b)
+#define CHECK_COLLISION_DEST_VANISHED -2
+
+static int check_collision(const char *source, const char *dest)
{
- char buf_a[4096], buf_b[4096];
- int fd_a = -1, fd_b = -1;
+ char buf_source[4096], buf_dest[4096];
+ int fd_source = -1, fd_dest = -1;
int ret = 0;
- fd_a = open(filename_a, O_RDONLY);
- if (fd_a < 0) {
- ret = error_errno(_("unable to open %s"), filename_a);
+ fd_source = open(source, O_RDONLY);
+ if (fd_source < 0) {
+ ret = error_errno(_("unable to open %s"), source);
goto out;
}
- fd_b = open(filename_b, O_RDONLY);
- if (fd_b < 0) {
- ret = error_errno(_("unable to open %s"), filename_b);
+ fd_dest = open(dest, O_RDONLY);
+ if (fd_dest < 0) {
+ if (errno != ENOENT)
+ ret = error_errno(_("unable to open %s"), dest);
+ else
+ ret = CHECK_COLLISION_DEST_VANISHED;
goto out;
}
while (1) {
ssize_t sz_a, sz_b;
- sz_a = read_in_full(fd_a, buf_a, sizeof(buf_a));
+ sz_a = read_in_full(fd_source, buf_source, sizeof(buf_source));
if (sz_a < 0) {
- ret = error_errno(_("unable to read %s"), filename_a);
+ ret = error_errno(_("unable to read %s"), source);
goto out;
}
- sz_b = read_in_full(fd_b, buf_b, sizeof(buf_b));
+ sz_b = read_in_full(fd_dest, buf_dest, sizeof(buf_dest));
if (sz_b < 0) {
- ret = error_errno(_("unable to read %s"), filename_b);
+ ret = error_errno(_("unable to read %s"), dest);
goto out;
}
- if (sz_a != sz_b || memcmp(buf_a, buf_b, sz_a)) {
+ if (sz_a != sz_b || memcmp(buf_source, buf_dest, sz_a)) {
ret = error(_("files '%s' and '%s' differ in contents"),
- filename_a, filename_b);
+ source, dest);
goto out;
}
- if (sz_a < sizeof(buf_a))
+ if (sz_a < sizeof(buf_source))
break;
}
out:
- if (fd_a > -1)
- close(fd_a);
- if (fd_b > -1)
- close(fd_b);
+ if (fd_source > -1)
+ close(fd_source);
+ if (fd_dest > -1)
+ close(fd_dest);
return ret;
}
@@ -2032,8 +2054,11 @@ int finalize_object_file(const char *tmpfile, const char *filename)
int finalize_object_file_flags(const char *tmpfile, const char *filename,
enum finalize_object_file_flags flags)
{
- struct stat st;
- int ret = 0;
+ unsigned retries = 0;
+ int ret;
+
+retry:
+ ret = 0;
if (object_creation_mode == OBJECT_CREATION_USES_RENAMES)
goto try_rename;
@@ -2054,6 +2079,8 @@ int finalize_object_file_flags(const char *tmpfile, const char *filename,
* left to unlink.
*/
if (ret && ret != EEXIST) {
+ struct stat st;
+
try_rename:
if (!stat(filename, &st))
ret = EEXIST;
@@ -2069,9 +2096,17 @@ int finalize_object_file_flags(const char *tmpfile, const char *filename,
errno = saved_errno;
return error_errno(_("unable to write file %s"), filename);
}
- if (!(flags & FOF_SKIP_COLLISION_CHECK) &&
- check_collision(tmpfile, filename))
+ if (!(flags & FOF_SKIP_COLLISION_CHECK)) {
+ ret = check_collision(tmpfile, filename);
+ if (ret == CHECK_COLLISION_DEST_VANISHED) {
+ if (retries++ > 5)
+ return error(_("unable to write repeatedly vanishing file %s"),
+ filename);
+ goto retry;
+ }
+ else if (ret)
return -1;
+ }
unlink_or_warn(tmpfile);
}
@@ -2177,7 +2212,7 @@ static int start_loose_object_common(struct strbuf *tmp_file,
const char *filename, unsigned flags,
git_zstream *stream,
unsigned char *buf, size_t buflen,
- git_hash_ctx *c, git_hash_ctx *compat_c,
+ struct git_hash_ctx *c, struct git_hash_ctx *compat_c,
char *hdr, int hdrlen)
{
struct repository *repo = the_repository;
@@ -2211,9 +2246,9 @@ static int start_loose_object_common(struct strbuf *tmp_file,
stream->avail_in = hdrlen;
while (git_deflate(stream, 0) == Z_OK)
; /* nothing */
- algo->update_fn(c, hdr, hdrlen);
+ git_hash_update(c, hdr, hdrlen);
if (compat && compat_c)
- compat->update_fn(compat_c, hdr, hdrlen);
+ git_hash_update(compat_c, hdr, hdrlen);
return fd;
}
@@ -2222,21 +2257,20 @@ static int start_loose_object_common(struct strbuf *tmp_file,
* Common steps for the inner git_deflate() loop for writing loose
* objects. Returns what git_deflate() returns.
*/
-static int write_loose_object_common(git_hash_ctx *c, git_hash_ctx *compat_c,
+static int write_loose_object_common(struct git_hash_ctx *c, struct git_hash_ctx *compat_c,
git_zstream *stream, const int flush,
unsigned char *in0, const int fd,
unsigned char *compressed,
const size_t compressed_len)
{
struct repository *repo = the_repository;
- const struct git_hash_algo *algo = repo->hash_algo;
const struct git_hash_algo *compat = repo->compat_hash_algo;
int ret;
ret = git_deflate(stream, flush ? Z_FINISH : 0);
- algo->update_fn(c, in0, stream->next_in - in0);
+ git_hash_update(c, in0, stream->next_in - in0);
if (compat && compat_c)
- compat->update_fn(compat_c, in0, stream->next_in - in0);
+ git_hash_update(compat_c, in0, stream->next_in - in0);
if (write_in_full(fd, compressed, stream->next_out - compressed) < 0)
die_errno(_("unable to write loose object file"));
stream->next_out = compressed;
@@ -2251,21 +2285,20 @@ static int write_loose_object_common(git_hash_ctx *c, git_hash_ctx *compat_c,
* - End the compression of zlib stream.
* - Get the calculated oid to "oid".
*/
-static int end_loose_object_common(git_hash_ctx *c, git_hash_ctx *compat_c,
+static int end_loose_object_common(struct git_hash_ctx *c, struct git_hash_ctx *compat_c,
git_zstream *stream, struct object_id *oid,
struct object_id *compat_oid)
{
struct repository *repo = the_repository;
- const struct git_hash_algo *algo = repo->hash_algo;
const struct git_hash_algo *compat = repo->compat_hash_algo;
int ret;
ret = git_deflate_end_gently(stream);
if (ret != Z_OK)
return ret;
- algo->final_oid_fn(oid, c);
+ git_hash_final_oid(oid, c);
if (compat && compat_c)
- compat->final_oid_fn(compat_oid, compat_c);
+ git_hash_final_oid(compat_oid, compat_c);
return Z_OK;
}
@@ -2277,7 +2310,7 @@ static int write_loose_object(const struct object_id *oid, char *hdr,
int fd, ret;
unsigned char compressed[4096];
git_zstream stream;
- git_hash_ctx c;
+ struct git_hash_ctx c;
struct object_id parano_oid;
static struct strbuf tmp_file = STRBUF_INIT;
static struct strbuf filename = STRBUF_INIT;
@@ -2357,7 +2390,7 @@ int stream_loose_object(struct input_stream *in_stream, size_t len,
int fd, ret, err = 0, flush = 0;
unsigned char compressed[4096];
git_zstream stream;
- git_hash_ctx c, compat_c;
+ struct git_hash_ctx c, compat_c;
struct strbuf tmp_file = STRBUF_INIT;
struct strbuf filename = STRBUF_INIT;
int dirlen;
@@ -3017,14 +3050,14 @@ static int check_stream_oid(git_zstream *stream,
const char *path,
const struct object_id *expected_oid)
{
- git_hash_ctx c;
+ struct git_hash_ctx c;
struct object_id real_oid;
unsigned char buf[4096];
unsigned long total_read;
int status = Z_OK;
the_hash_algo->init_fn(&c);
- the_hash_algo->update_fn(&c, hdr, stream->total_out);
+ git_hash_update(&c, hdr, stream->total_out);
/*
* We already read some bytes into hdr, but the ones up to the NUL
@@ -3044,7 +3077,7 @@ static int check_stream_oid(git_zstream *stream,
if (size - total_read < stream->avail_out)
stream->avail_out = size - total_read;
status = git_inflate(stream, Z_FINISH);
- the_hash_algo->update_fn(&c, buf, stream->next_out - buf);
+ git_hash_update(&c, buf, stream->next_out - buf);
total_read += stream->next_out - buf;
}
git_inflate_end(stream);
@@ -3059,7 +3092,7 @@ static int check_stream_oid(git_zstream *stream,
return -1;
}
- the_hash_algo->final_oid_fn(&real_oid, &c);
+ git_hash_final_oid(&real_oid, &c);
if (!oideq(expected_oid, &real_oid)) {
error(_("hash mismatch for %s (expected %s)"), path,
oid_to_hex(expected_oid));
diff --git a/object-name.c b/object-name.c
index 88d1313028..945d5bdef2 100644
--- a/object-name.c
+++ b/object-name.c
@@ -1272,6 +1272,58 @@ static int peel_onion(struct repository *r, const char *name, int len,
return 0;
}
+/*
+ * Documentation/revisions.txt says:
+ * '<describeOutput>', e.g. 'v1.7.4.2-679-g3bee7fb'::
+ * Output from `git describe`; i.e. a closest tag, optionally
+ * followed by a dash and a number of commits, followed by a dash, a
+ * 'g', and an abbreviated object name.
+ *
+ * which means that the stuff before '-g${HASH}' needs to be a valid
+ * refname, a dash, and a non-negative integer. This function verifies
+ * that.
+ *
+ * In particular, we do not want to treat
+ * branchname:path/to/file/named/i-gaffed
+ * as a request for commit affed.
+ *
+ * More generally, we should probably not treat
+ * 'refs/heads/./../.../ ~^:/?*[////\\\&}/busted.lock-g050e0ef6ead'
+ * as a request for object 050e0ef6ead either.
+ *
+ * We are called with name[len] == '-' and name[len+1] == 'g', i.e.
+ * we are verifying ${REFNAME}-{INTEGER} part of the name.
+ */
+static int ref_and_count_parts_valid(const char *name, int len)
+{
+ struct strbuf sb;
+ const char *cp;
+ int flags = REFNAME_ALLOW_ONELEVEL;
+ int ret = 1;
+
+ /* Ensure we have at least one digit */
+ if (!isxdigit(name[len-1]))
+ return 0;
+
+ /* Skip over digits backwards until we get to the dash */
+ for (cp = name + len - 2; name < cp; cp--) {
+ if (*cp == '-')
+ break;
+ if (!isxdigit(*cp))
+ return 0;
+ }
+ /* Ensure we found the leading dash */
+ if (*cp != '-')
+ return 0;
+
+ len = cp - name;
+ strbuf_init(&sb, len);
+ strbuf_add(&sb, name, len);
+ ret = !check_refname_format(sb.buf, flags);
+ strbuf_release(&sb);
+ return ret;
+}
+
static int get_describe_name(struct repository *r,
const char *name, int len,
struct object_id *oid)
@@ -1285,7 +1337,8 @@ static int get_describe_name(struct repository *r,
/* We must be looking at g in "SOMETHING-g"
* for it to be describe output.
*/
- if (ch == 'g' && cp[-1] == '-') {
+ if (ch == 'g' && cp[-1] == '-' &&
+ ref_and_count_parts_valid(name, cp - 1 - name)) {
cp++;
len -= cp - name;
return get_short_oid(r,
@@ -2052,12 +2105,14 @@ static enum get_oid_result get_oid_with_context_1(struct repository *repo,
return -1;
}
for (cp = name, bracket_depth = 0; *cp; cp++) {
- if (*cp == '{')
+ if (strchr("@^", *cp) && cp[1] == '{') {
+ cp++;
bracket_depth++;
- else if (bracket_depth && *cp == '}')
+ } else if (bracket_depth && *cp == '}') {
bracket_depth--;
- else if (!bracket_depth && *cp == ':')
+ } else if (!bracket_depth && *cp == ':') {
break;
+ }
}
if (*cp == ':') {
struct object_id tree_oid;
diff --git a/oss-fuzz/fuzz-parse-attr-line.c b/oss-fuzz/fuzz-parse-attr-line.c
index e0e4bc6358..315198505c 100644
--- a/oss-fuzz/fuzz-parse-attr-line.c
+++ b/oss-fuzz/fuzz-parse-attr-line.c
@@ -24,7 +24,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
res = parse_attr_line(buf, "dummy", 0, 0);
if (res) {
- int j;
+ size_t j;
for (j = 0; j < res->num_attr; j++) {
const char *setto = res->state[j].setto;
if (ATTR_TRUE(setto) || ATTR_FALSE(setto) ||
diff --git a/oss-fuzz/meson.build b/oss-fuzz/meson.build
new file mode 100644
index 0000000000..ed79665501
--- /dev/null
+++ b/oss-fuzz/meson.build
@@ -0,0 +1,20 @@
+fuzz_programs = [
+ 'fuzz-commit-graph.c',
+ 'fuzz-config.c',
+ 'fuzz-credential-from-url-gently.c',
+ 'fuzz-date.c',
+ 'fuzz-pack-headers.c',
+ 'fuzz-pack-idx.c',
+ 'fuzz-parse-attr-line.c',
+ 'fuzz-url-decode-mem.c',
+]
+
+foreach fuzz_program : fuzz_programs
+ executable(fs.stem(fuzz_program),
+ sources: [
+ 'dummy-cmd-main.c',
+ fuzz_program,
+ ],
+ dependencies: [libgit, common_main],
+ )
+endforeach
diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c
index 4f8be53c2b..a06a1f35c6 100644
--- a/pack-bitmap-write.c
+++ b/pack-bitmap-write.c
@@ -590,7 +590,8 @@ int bitmap_writer_build(struct bitmap_writer *writer)
int closed = 1; /* until proven otherwise */
if (writer->show_progress)
- writer->progress = start_progress("Building bitmaps",
+ writer->progress = start_progress(the_repository,
+ "Building bitmaps",
writer->selected_nr);
trace2_region_enter("pack-bitmap-write", "building_bitmaps_total",
the_repository);
@@ -710,7 +711,8 @@ void bitmap_writer_select_commits(struct bitmap_writer *writer,
}
if (writer->show_progress)
- writer->progress = start_progress("Selecting bitmap commits", 0);
+ writer->progress = start_progress(the_repository,
+ "Selecting bitmap commits", 0);
for (;;) {
struct commit *chosen = NULL;
diff --git a/pack-bitmap.c b/pack-bitmap.c
index 60b5da9d0b..6406953d32 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -2573,7 +2573,9 @@ void test_bitmap_walk(struct rev_info *revs)
tdata.trees = ewah_to_bitmap(bitmap_git->trees);
tdata.blobs = ewah_to_bitmap(bitmap_git->blobs);
tdata.tags = ewah_to_bitmap(bitmap_git->tags);
- tdata.prg = start_progress("Verifying bitmap entries", result_popcnt);
+ tdata.prg = start_progress(revs->repo,
+ "Verifying bitmap entries",
+ result_popcnt);
tdata.seen = 0;
traverse_commit_list(revs, &test_show_commit, &test_show_object, &tdata);
diff --git a/pack-check.c b/pack-check.c
index 8d9f6da7ce..d0aeb5ec41 100644
--- a/pack-check.c
+++ b/pack-check.c
@@ -58,7 +58,7 @@ static int verify_packfile(struct repository *r,
{
off_t index_size = p->index_size;
const unsigned char *index_base = p->index_data;
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
unsigned char hash[GIT_MAX_RAWSZ], *pack_sig;
off_t offset = 0, pack_sig_ofs = 0;
uint32_t nr_objects, i;
@@ -77,9 +77,9 @@ static int verify_packfile(struct repository *r,
pack_sig_ofs = p->pack_size - r->hash_algo->rawsz;
if (offset > pack_sig_ofs)
remaining -= (unsigned int)(offset - pack_sig_ofs);
- r->hash_algo->update_fn(&ctx, in, remaining);
+ git_hash_update(&ctx, in, remaining);
} while (offset < pack_sig_ofs);
- r->hash_algo->final_fn(hash, &ctx);
+ git_hash_final(hash, &ctx);
pack_sig = use_pack(p, w_curs, pack_sig_ofs, NULL);
if (!hasheq(hash, pack_sig, the_repository->hash_algo))
err = error("%s pack checksum mismatch",
diff --git a/pack-objects.h b/pack-objects.h
index 3f6f504203..d73e3843c9 100644
--- a/pack-objects.h
+++ b/pack-objects.h
@@ -208,6 +208,34 @@ static inline uint32_t pack_name_hash(const char *name)
return hash;
}
+static inline uint32_t pack_name_hash_v2(const unsigned char *name)
+{
+ uint32_t hash = 0, base = 0, c;
+
+ if (!name)
+ return 0;
+
+ while ((c = *name++)) {
+ if (isspace(c))
+ continue;
+ if (c == '/') {
+ base = (base >> 6) ^ hash;
+ hash = 0;
+ } else {
+ /*
+ * 'c' is only a single byte. Reverse it and move
+ * it to the top of the hash, moving the rest to
+ * less-significant bits.
+ */
+ c = (c & 0xF0) >> 4 | (c & 0x0F) << 4;
+ c = (c & 0xCC) >> 2 | (c & 0x33) << 2;
+ c = (c & 0xAA) >> 1 | (c & 0x55) << 1;
+ hash = (hash >> 2) + (c << 24);
+ }
+ }
+ return (base >> 6) ^ hash;
+}
+
static inline enum object_type oe_type(const struct object_entry *e)
{
return e->type_valid ? e->type_ : OBJ_BAD;
diff --git a/pack-write.c b/pack-write.c
index 98a8c0e785..d61e29ba4e 100644
--- a/pack-write.c
+++ b/pack-write.c
@@ -1,5 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
-
#include "git-compat-util.h"
#include "environment.h"
#include "gettext.h"
@@ -56,7 +54,8 @@ static int need_large_offset(off_t offset, const struct pack_idx_option *opts)
* The *sha1 contains the pack content SHA1 hash.
* The objects array passed in will be sorted by SHA1 on exit.
*/
-const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects,
+const char *write_idx_file(const struct git_hash_algo *hash_algo,
+ const char *index_name, struct pack_idx_entry **objects,
int nr_objects, const struct pack_idx_option *opts,
const unsigned char *sha1)
{
@@ -130,7 +129,7 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
struct pack_idx_entry *obj = *list++;
if (index_version < 2)
hashwrite_be32(f, obj->offset);
- hashwrite(f, obj->oid.hash, the_hash_algo->rawsz);
+ hashwrite(f, obj->oid.hash, hash_algo->rawsz);
if ((opts->flags & WRITE_IDX_STRICT) &&
(i && oideq(&list[-2]->oid, &obj->oid)))
die("The same object %s appears twice in the pack",
@@ -172,7 +171,7 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
}
}
- hashwrite(f, sha1, the_hash_algo->rawsz);
+ hashwrite(f, sha1, hash_algo->rawsz);
finalize_hashfile(f, NULL, FSYNC_COMPONENT_PACK_METADATA,
CSUM_HASH_IN_STREAM | CSUM_CLOSE |
((opts->flags & WRITE_IDX_VERIFY) ? 0 : CSUM_FSYNC));
@@ -193,11 +192,12 @@ static int pack_order_cmp(const void *va, const void *vb, void *ctx)
return 0;
}
-static void write_rev_header(struct hashfile *f)
+static void write_rev_header(const struct git_hash_algo *hash_algo,
+ struct hashfile *f)
{
hashwrite_be32(f, RIDX_SIGNATURE);
hashwrite_be32(f, RIDX_VERSION);
- hashwrite_be32(f, oid_version(the_hash_algo));
+ hashwrite_be32(f, oid_version(hash_algo));
}
static void write_rev_index_positions(struct hashfile *f,
@@ -209,12 +209,14 @@ static void write_rev_index_positions(struct hashfile *f,
hashwrite_be32(f, pack_order[i]);
}
-static void write_rev_trailer(struct hashfile *f, const unsigned char *hash)
+static void write_rev_trailer(const struct git_hash_algo *hash_algo,
+ struct hashfile *f, const unsigned char *hash)
{
- hashwrite(f, hash, the_hash_algo->rawsz);
+ hashwrite(f, hash, hash_algo->rawsz);
}
-char *write_rev_file(const char *rev_name,
+char *write_rev_file(const struct git_hash_algo *hash_algo,
+ const char *rev_name,
struct pack_idx_entry **objects,
uint32_t nr_objects,
const unsigned char *hash,
@@ -232,15 +234,16 @@ char *write_rev_file(const char *rev_name,
pack_order[i] = i;
QSORT_S(pack_order, nr_objects, pack_order_cmp, objects);
- ret = write_rev_file_order(rev_name, pack_order, nr_objects, hash,
- flags);
+ ret = write_rev_file_order(hash_algo, rev_name, pack_order, nr_objects,
+ hash, flags);
free(pack_order);
return ret;
}
-char *write_rev_file_order(const char *rev_name,
+char *write_rev_file_order(const struct git_hash_algo *hash_algo,
+ const char *rev_name,
uint32_t *pack_order,
uint32_t nr_objects,
const unsigned char *hash,
@@ -279,10 +282,10 @@ char *write_rev_file_order(const char *rev_name,
return NULL;
}
- write_rev_header(f);
+ write_rev_header(hash_algo, f);
write_rev_index_positions(f, pack_order, nr_objects);
- write_rev_trailer(f, hash);
+ write_rev_trailer(hash_algo, f, hash);
if (adjust_shared_perm(path) < 0)
die(_("failed to make %s readable"), path);
@@ -294,11 +297,12 @@ char *write_rev_file_order(const char *rev_name,
return path;
}
-static void write_mtimes_header(struct hashfile *f)
+static void write_mtimes_header(const struct git_hash_algo *hash_algo,
+ struct hashfile *f)
{
hashwrite_be32(f, MTIMES_SIGNATURE);
hashwrite_be32(f, MTIMES_VERSION);
- hashwrite_be32(f, oid_version(the_hash_algo));
+ hashwrite_be32(f, oid_version(hash_algo));
}
/*
@@ -318,12 +322,14 @@ static void write_mtimes_objects(struct hashfile *f,
}
}
-static void write_mtimes_trailer(struct hashfile *f, const unsigned char *hash)
+static void write_mtimes_trailer(const struct git_hash_algo *hash_algo,
+ struct hashfile *f, const unsigned char *hash)
{
- hashwrite(f, hash, the_hash_algo->rawsz);
+ hashwrite(f, hash, hash_algo->rawsz);
}
-static char *write_mtimes_file(struct packing_data *to_pack,
+static char *write_mtimes_file(const struct git_hash_algo *hash_algo,
+ struct packing_data *to_pack,
struct pack_idx_entry **objects,
uint32_t nr_objects,
const unsigned char *hash)
@@ -340,9 +346,9 @@ static char *write_mtimes_file(struct packing_data *to_pack,
mtimes_name = strbuf_detach(&tmp_file, NULL);
f = hashfd(fd, mtimes_name);
- write_mtimes_header(f);
+ write_mtimes_header(hash_algo, f);
write_mtimes_objects(f, to_pack, objects, nr_objects);
- write_mtimes_trailer(f, hash);
+ write_mtimes_trailer(hash_algo, f, hash);
if (adjust_shared_perm(mtimes_name) < 0)
die(_("failed to make %s readable"), mtimes_name);
@@ -380,7 +386,8 @@ off_t write_pack_header(struct hashfile *f, uint32_t nr_entries)
* partial_pack_sha1 can refer to the same buffer if the caller is not
* interested in the resulting SHA1 of pack data above partial_pack_offset.
*/
-void fixup_pack_header_footer(int pack_fd,
+void fixup_pack_header_footer(const struct git_hash_algo *hash_algo,
+ int pack_fd,
unsigned char *new_pack_hash,
const char *pack_name,
uint32_t object_count,
@@ -388,13 +395,13 @@ void fixup_pack_header_footer(int pack_fd,
off_t partial_pack_offset)
{
int aligned_sz, buf_sz = 8 * 1024;
- git_hash_ctx old_hash_ctx, new_hash_ctx;
+ struct git_hash_ctx old_hash_ctx, new_hash_ctx;
struct pack_header hdr;
char *buf;
ssize_t read_result;
- the_hash_algo->init_fn(&old_hash_ctx);
- the_hash_algo->init_fn(&new_hash_ctx);
+ hash_algo->init_fn(&old_hash_ctx);
+ hash_algo->init_fn(&new_hash_ctx);
if (lseek(pack_fd, 0, SEEK_SET) != 0)
die_errno("Failed seeking to start of '%s'", pack_name);
@@ -406,9 +413,9 @@ void fixup_pack_header_footer(int pack_fd,
pack_name);
if (lseek(pack_fd, 0, SEEK_SET) != 0)
die_errno("Failed seeking to start of '%s'", pack_name);
- the_hash_algo->update_fn(&old_hash_ctx, &hdr, sizeof(hdr));
+ git_hash_update(&old_hash_ctx, &hdr, sizeof(hdr));
hdr.hdr_entries = htonl(object_count);
- the_hash_algo->update_fn(&new_hash_ctx, &hdr, sizeof(hdr));
+ git_hash_update(&new_hash_ctx, &hdr, sizeof(hdr));
write_or_die(pack_fd, &hdr, sizeof(hdr));
partial_pack_offset -= sizeof(hdr);
@@ -423,7 +430,7 @@ void fixup_pack_header_footer(int pack_fd,
break;
if (n < 0)
die_errno("Failed to checksum '%s'", pack_name);
- the_hash_algo->update_fn(&new_hash_ctx, buf, n);
+ git_hash_update(&new_hash_ctx, buf, n);
aligned_sz -= n;
if (!aligned_sz)
@@ -432,13 +439,13 @@ void fixup_pack_header_footer(int pack_fd,
if (!partial_pack_hash)
continue;
- the_hash_algo->update_fn(&old_hash_ctx, buf, n);
+ git_hash_update(&old_hash_ctx, buf, n);
partial_pack_offset -= n;
if (partial_pack_offset == 0) {
unsigned char hash[GIT_MAX_RAWSZ];
- the_hash_algo->final_fn(hash, &old_hash_ctx);
+ git_hash_final(hash, &old_hash_ctx);
if (!hasheq(hash, partial_pack_hash,
- the_repository->hash_algo))
+ hash_algo))
die("Unexpected checksum for %s "
"(disk corruption?)", pack_name);
/*
@@ -446,7 +453,7 @@ void fixup_pack_header_footer(int pack_fd,
* pack, which also means making partial_pack_offset
* big enough not to matter anymore.
*/
- the_hash_algo->init_fn(&old_hash_ctx);
+ hash_algo->init_fn(&old_hash_ctx);
partial_pack_offset = ~partial_pack_offset;
partial_pack_offset -= MSB(partial_pack_offset, 1);
}
@@ -454,16 +461,16 @@ void fixup_pack_header_footer(int pack_fd,
free(buf);
if (partial_pack_hash)
- the_hash_algo->final_fn(partial_pack_hash, &old_hash_ctx);
- the_hash_algo->final_fn(new_pack_hash, &new_hash_ctx);
- write_or_die(pack_fd, new_pack_hash, the_hash_algo->rawsz);
+ git_hash_final(partial_pack_hash, &old_hash_ctx);
+ git_hash_final(new_pack_hash, &new_hash_ctx);
+ write_or_die(pack_fd, new_pack_hash, hash_algo->rawsz);
fsync_component_or_die(FSYNC_COMPONENT_PACK, pack_fd, pack_name);
}
-char *index_pack_lockfile(int ip_out, int *is_well_formed)
+char *index_pack_lockfile(struct repository *r, int ip_out, int *is_well_formed)
{
char packname[GIT_MAX_HEXSZ + 6];
- const int len = the_hash_algo->hexsz + 6;
+ const int len = r->hash_algo->hexsz + 6;
/*
* The first thing we expect from index-pack's output
@@ -480,7 +487,7 @@ char *index_pack_lockfile(int ip_out, int *is_well_formed)
packname[len-1] = 0;
if (skip_prefix(packname, "keep\t", &name))
return xstrfmt("%s/pack/pack-%s.keep",
- repo_get_object_directory(the_repository), name);
+ repo_get_object_directory(r), name);
return NULL;
}
if (is_well_formed)
@@ -546,7 +553,8 @@ void rename_tmp_packfile_idx(struct strbuf *name_buffer,
rename_tmp_packfile(name_buffer, *idx_tmp_name, "idx");
}
-void stage_tmp_packfiles(struct strbuf *name_buffer,
+void stage_tmp_packfiles(const struct git_hash_algo *hash_algo,
+ struct strbuf *name_buffer,
const char *pack_tmp_name,
struct pack_idx_entry **written_list,
uint32_t nr_written,
@@ -561,17 +569,17 @@ void stage_tmp_packfiles(struct strbuf *name_buffer,
if (adjust_shared_perm(pack_tmp_name))
die_errno("unable to make temporary pack file readable");
- *idx_tmp_name = (char *)write_idx_file(NULL, written_list, nr_written,
- pack_idx_opts, hash);
+ *idx_tmp_name = (char *)write_idx_file(hash_algo, NULL, written_list,
+ nr_written, pack_idx_opts, hash);
if (adjust_shared_perm(*idx_tmp_name))
die_errno("unable to make temporary index file readable");
- rev_tmp_name = write_rev_file(NULL, written_list, nr_written, hash,
- pack_idx_opts->flags);
+ rev_tmp_name = write_rev_file(hash_algo, NULL, written_list, nr_written,
+ hash, pack_idx_opts->flags);
if (pack_idx_opts->flags & WRITE_MTIMES) {
- mtimes_tmp_name = write_mtimes_file(to_pack, written_list,
- nr_written,
+ mtimes_tmp_name = write_mtimes_file(hash_algo, to_pack,
+ written_list, nr_written,
hash);
}
diff --git a/pack.h b/pack.h
index a8da040629..9f1194ac13 100644
--- a/pack.h
+++ b/pack.h
@@ -13,7 +13,8 @@ struct repository;
*/
#define PACK_SIGNATURE 0x5041434b /* "PACK" */
#define PACK_VERSION 2
-#define pack_version_ok(v) ((v) == htonl(2) || (v) == htonl(3))
+#define pack_version_ok(v) pack_version_ok_native(ntohl(v))
+#define pack_version_ok_native(v) ((v) == 2 || (v) == 3)
struct pack_header {
uint32_t hdr_signature;
uint32_t hdr_version;
@@ -86,20 +87,37 @@ struct progress;
/* Note, the data argument could be NULL if object type is blob */
typedef int (*verify_fn)(const struct object_id *, enum object_type, unsigned long, void*, int*);
-const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, int nr_objects, const struct pack_idx_option *, const unsigned char *sha1);
+const char *write_idx_file(const struct git_hash_algo *hash_algo,
+ const char *index_name,
+ struct pack_idx_entry **objects,
+ int nr_objects,
+ const struct pack_idx_option *,
+ const unsigned char *sha1);
int check_pack_crc(struct packed_git *p, struct pack_window **w_curs, off_t offset, off_t len, unsigned int nr);
int verify_pack_index(struct packed_git *);
int verify_pack(struct repository *, struct packed_git *, verify_fn fn, struct progress *, uint32_t);
off_t write_pack_header(struct hashfile *f, uint32_t);
-void fixup_pack_header_footer(int, unsigned char *, const char *, uint32_t, unsigned char *, off_t);
-char *index_pack_lockfile(int fd, int *is_well_formed);
+void fixup_pack_header_footer(const struct git_hash_algo *, int,
+ unsigned char *, const char *, uint32_t,
+ unsigned char *, off_t);
+char *index_pack_lockfile(struct repository *r, int fd, int *is_well_formed);
struct ref;
void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought);
-char *write_rev_file(const char *rev_name, struct pack_idx_entry **objects, uint32_t nr_objects, const unsigned char *hash, unsigned flags);
-char *write_rev_file_order(const char *rev_name, uint32_t *pack_order, uint32_t nr_objects, const unsigned char *hash, unsigned flags);
+char *write_rev_file(const struct git_hash_algo *hash_algo,
+ const char *rev_name,
+ struct pack_idx_entry **objects,
+ uint32_t nr_objects,
+ const unsigned char *hash,
+ unsigned flags);
+char *write_rev_file_order(const struct git_hash_algo *hash_algo,
+ const char *rev_name,
+ uint32_t *pack_order,
+ uint32_t nr_objects,
+ const unsigned char *hash,
+ unsigned flags);
/*
* The "hdr" output buffer should be at least this big, which will handle sizes
@@ -117,7 +135,8 @@ int read_pack_header(int fd, struct pack_header *);
struct packing_data;
struct hashfile *create_tmp_packfile(char **pack_tmp_name);
-void stage_tmp_packfiles(struct strbuf *name_buffer,
+void stage_tmp_packfiles(const struct git_hash_algo *hash_algo,
+ struct strbuf *name_buffer,
const char *pack_tmp_name,
struct pack_idx_entry **written_list,
uint32_t nr_written,
diff --git a/packfile.c b/packfile.c
index cc7ab6403a..2d80d80cb3 100644
--- a/packfile.c
+++ b/packfile.c
@@ -2315,3 +2315,23 @@ int is_promisor_object(struct repository *r, const struct object_id *oid)
}
return oidset_contains(&promisor_objects, oid);
}
+
+int parse_pack_header_option(const char *in, unsigned char *out, unsigned int *len)
+{
+ unsigned char *hdr;
+ char *c;
+
+ hdr = out;
+ put_be32(hdr, PACK_SIGNATURE);
+ hdr += 4;
+ put_be32(hdr, strtoul(in, &c, 10));
+ hdr += 4;
+ if (*c != ',')
+ return -1;
+ put_be32(hdr, strtoul(c + 1, &c, 10));
+ hdr += 4;
+ if (*c)
+ return -1;
+ *len = hdr - out;
+ return 0;
+}
diff --git a/packfile.h b/packfile.h
index 58104fa009..00ada7a938 100644
--- a/packfile.h
+++ b/packfile.h
@@ -216,4 +216,10 @@ int is_promisor_object(struct repository *r, const struct object_id *oid);
int load_idx(const char *path, const unsigned int hashsz, void *idx_map,
size_t idx_size, struct packed_git *p);
+/*
+ * Parse a --pack_header option as accepted by index-pack and unpack-objects,
+ * turning it into the matching bytes we'd find in a pack.
+ */
+int parse_pack_header_option(const char *in, unsigned char *out, unsigned int *len);
+
#endif
diff --git a/pager.c b/pager.c
index 40b664f893..5531fff50e 100644
--- a/pager.c
+++ b/pager.c
@@ -1,5 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
-
#include "git-compat-util.h"
#include "config.h"
#include "editor.h"
@@ -84,7 +82,7 @@ static int core_pager_config(const char *var, const char *value,
return 0;
}
-const char *git_pager(int stdout_is_tty)
+const char *git_pager(struct repository *r, int stdout_is_tty)
{
const char *pager;
@@ -94,7 +92,7 @@ const char *git_pager(int stdout_is_tty)
pager = getenv("GIT_PAGER");
if (!pager) {
if (!pager_program)
- read_early_config(the_repository,
+ read_early_config(r,
core_pager_config, NULL);
pager = pager_program;
}
@@ -143,10 +141,10 @@ void prepare_pager_args(struct child_process *pager_process, const char *pager)
pager_process->trace2_child_class = "pager";
}
-void setup_pager(void)
+void setup_pager(struct repository *r)
{
static int once = 0;
- const char *pager = git_pager(isatty(1));
+ const char *pager = git_pager(r, isatty(1));
if (!pager)
return;
@@ -293,7 +291,7 @@ static int pager_command_config(const char *var, const char *value,
}
/* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */
-int check_pager_config(const char *cmd)
+int check_pager_config(struct repository *r, const char *cmd)
{
struct pager_command_config_data data;
@@ -301,7 +299,7 @@ int check_pager_config(const char *cmd)
data.want = -1;
data.value = NULL;
- read_early_config(the_repository, pager_command_config, &data);
+ read_early_config(r, pager_command_config, &data);
if (data.value)
pager_program = data.value;
diff --git a/pager.h b/pager.h
index 103ecac476..d070be6348 100644
--- a/pager.h
+++ b/pager.h
@@ -2,15 +2,16 @@
#define PAGER_H
struct child_process;
+struct repository;
-const char *git_pager(int stdout_is_tty);
-void setup_pager(void);
+const char *git_pager(struct repository *r, int stdout_is_tty);
+void setup_pager(struct repository *r);
void wait_for_pager(void);
int pager_in_use(void);
int term_columns(void);
void term_clear_line(void);
int decimal_width(uintmax_t);
-int check_pager_config(const char *cmd);
+int check_pager_config(struct repository *r, const char *cmd);
void prepare_pager_args(struct child_process *, const char *pager);
extern int pager_use_color;
diff --git a/parse-options.c b/parse-options.c
index 33bfba0ed4..35fbb3b0d6 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -1076,11 +1076,48 @@ static int usage_argh(const struct option *opts, FILE *outfile)
!opts->argh || !!strpbrk(opts->argh, "()<>[]|");
if (opts->flags & PARSE_OPT_OPTARG)
if (opts->long_name)
- s = literal ? "[=%s]" : "[=<%s>]";
+ /*
+ * TRANSLATORS: The "<%s>" part of this string
+ * stands for an optional value given to a command
+ * line option in the long form, and "<>" is there
+ * as a convention to signal that it is a
+ * placeholder (i.e. the user should substitute it
+ * with the real value). If your language uses a
+ * different convention, you can change "<%s>" part
+ * to match yours, e.g. it might use "|%s|" instead,
+ * or if the alphabet is different enough it may use
+ * "%s" without any placeholder signal. Most
+ * translations leave this message as is.
+ */
+ s = literal ? "[=%s]" : _("[=<%s>]");
else
- s = literal ? "[%s]" : "[<%s>]";
+ /*
+ * TRANSLATORS: The "<%s>" part of this string
+ * stands for an optional value given to a command
+ * line option in the short form, and "<>" is there
+ * as a convention to signal that it is a
+ * placeholder (i.e. the user should substitute it
+ * with the real value). If your language uses a
+ * different convention, you can change "<%s>" part
+ * to match yours, e.g. it might use "|%s|" instead,
+ * or if the alphabet is different enough it may use
+ * "%s" without any placeholder signal. Most
+ * translations leave this message as is.
+ */
+ s = literal ? "[%s]" : _("[<%s>]");
else
- s = literal ? " %s" : " <%s>";
+ /*
+ * TRANSLATORS: The "<%s>" part of this string stands for a
+ * value given to a command line option, and "<>" is there
+ * as a convention to signal that it is a placeholder
+ * (i.e. the user should substitute it with the real value).
+ * If your language uses a different convention, you can
+ * change "<%s>" part to match yours, e.g. it might use
+ * "|%s|" instead, or if the alphabet is different enough it
+ * may use "%s" without any placeholder signal. Most
+ * translations leave this message as is.
+ */
+ s = literal ? " %s" : _(" <%s>");
return utf8_fprintf(outfile, s, opts->argh ? _(opts->argh) : _("..."));
}
@@ -1282,6 +1319,16 @@ void NORETURN usage_with_options(const char * const *usagestr,
exit(129);
}
+void show_usage_with_options_if_asked(int ac, const char **av,
+ const char * const *usagestr,
+ const struct option *opts)
+{
+ if (ac == 2 && !strcmp(av[1], "-h")) {
+ usage_with_options_internal(NULL, usagestr, opts, 0, 0);
+ exit(129);
+ }
+}
+
void NORETURN usage_msg_opt(const char *msg,
const char * const *usagestr,
const struct option *options)
diff --git a/parse-options.h b/parse-options.h
index d01361ca97..fca944d9a9 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -402,6 +402,10 @@ int parse_options(int argc, const char **argv, const char *prefix,
NORETURN void usage_with_options(const char * const *usagestr,
const struct option *options);
+void show_usage_with_options_if_asked(int ac, const char **av,
+ const char * const *usage,
+ const struct option *options);
+
NORETURN void usage_msg_opt(const char *msg,
const char * const *usagestr,
const struct option *options);
@@ -432,6 +436,15 @@ static inline void die_for_incompatible_opt3(int opt1, const char *opt1_name,
0, "");
}
+static inline void die_for_incompatible_opt2(int opt1, const char *opt1_name,
+ int opt2, const char *opt2_name)
+{
+ die_for_incompatible_opt4(opt1, opt1_name,
+ opt2, opt2_name,
+ 0, "",
+ 0, "");
+}
+
/*
* Use these assertions for callbacks that expect to be called with NONEG and
* NOARG respectively, and do not otherwise handle the "unset" and "arg"
diff --git a/path-walk.c b/path-walk.c
new file mode 100644
index 0000000000..341bdd2ba4
--- /dev/null
+++ b/path-walk.c
@@ -0,0 +1,609 @@
+/*
+ * path-walk.c: implementation for path-based walks of the object graph.
+ */
+#include "git-compat-util.h"
+#include "path-walk.h"
+#include "blob.h"
+#include "commit.h"
+#include "dir.h"
+#include "hashmap.h"
+#include "hex.h"
+#include "list-objects.h"
+#include "object.h"
+#include "oid-array.h"
+#include "prio-queue.h"
+#include "repository.h"
+#include "revision.h"
+#include "string-list.h"
+#include "strmap.h"
+#include "tag.h"
+#include "trace2.h"
+#include "tree.h"
+#include "tree-walk.h"
+
+static const char *root_path = "";
+
+struct type_and_oid_list {
+ enum object_type type;
+ struct oid_array oids;
+ int maybe_interesting;
+};
+
+#define TYPE_AND_OID_LIST_INIT { \
+ .type = OBJ_NONE, \
+ .oids = OID_ARRAY_INIT \
+}
+
+struct path_walk_context {
+ /**
+ * Repeats of data in 'struct path_walk_info' for
+ * access with fewer characters.
+ */
+ struct repository *repo;
+ struct rev_info *revs;
+ struct path_walk_info *info;
+
+ /**
+ * Map a path to a 'struct type_and_oid_list'
+ * containing the objects discovered at that
+ * path.
+ */
+ struct strmap paths_to_lists;
+
+ /**
+ * Store the current list of paths in a priority queue,
+ * using object type as a sorting mechanism, mostly to
+ * make sure blobs are popped off the stack first. No
+ * other sort is made, so within each object type it acts
+ * like a stack and performs a DFS within the trees.
+ *
+ * Use path_stack_pushed to indicate whether a path
+ * was previously added to path_stack.
+ */
+ struct prio_queue path_stack;
+ struct strset path_stack_pushed;
+};
+
+static int compare_by_type(const void *one, const void *two, void *cb_data)
+{
+ struct type_and_oid_list *list1, *list2;
+ const char *str1 = one;
+ const char *str2 = two;
+ struct path_walk_context *ctx = cb_data;
+
+ list1 = strmap_get(&ctx->paths_to_lists, str1);
+ list2 = strmap_get(&ctx->paths_to_lists, str2);
+
+ /*
+ * If object types are equal, then use path comparison.
+ */
+ if (!list1 || !list2 || list1->type == list2->type)
+ return strcmp(str1, str2);
+
+ /* Prefer tags to be popped off first. */
+ if (list1->type == OBJ_TAG)
+ return -1;
+ if (list2->type == OBJ_TAG)
+ return 1;
+
+ /* Prefer blobs to be popped off second. */
+ if (list1->type == OBJ_BLOB)
+ return -1;
+ if (list2->type == OBJ_BLOB)
+ return 1;
+
+ return 0;
+}
+
+static void push_to_stack(struct path_walk_context *ctx,
+ const char *path)
+{
+ if (strset_contains(&ctx->path_stack_pushed, path))
+ return;
+
+ strset_add(&ctx->path_stack_pushed, path);
+ prio_queue_put(&ctx->path_stack, xstrdup(path));
+}
+
+static int add_tree_entries(struct path_walk_context *ctx,
+ const char *base_path,
+ struct object_id *oid)
+{
+ struct tree_desc desc;
+ struct name_entry entry;
+ struct strbuf path = STRBUF_INIT;
+ size_t base_len;
+ struct tree *tree = lookup_tree(ctx->repo, oid);
+
+ if (!tree) {
+ error(_("failed to walk children of tree %s: not found"),
+ oid_to_hex(oid));
+ return -1;
+ } else if (parse_tree_gently(tree, 1)) {
+ error("bad tree object %s", oid_to_hex(oid));
+ return -1;
+ }
+
+ strbuf_addstr(&path, base_path);
+ base_len = path.len;
+
+ init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
+ while (tree_entry(&desc, &entry)) {
+ struct type_and_oid_list *list;
+ struct object *o;
+ /* Not actually true, but we will ignore submodules later. */
+ enum object_type type = S_ISDIR(entry.mode) ? OBJ_TREE : OBJ_BLOB;
+
+ /* Skip submodules. */
+ if (S_ISGITLINK(entry.mode))
+ continue;
+
+ /* If the caller doesn't want blobs, then don't bother. */
+ if (!ctx->info->blobs && type == OBJ_BLOB)
+ continue;
+
+ if (type == OBJ_TREE) {
+ struct tree *child = lookup_tree(ctx->repo, &entry.oid);
+ o = child ? &child->object : NULL;
+ } else if (type == OBJ_BLOB) {
+ struct blob *child = lookup_blob(ctx->repo, &entry.oid);
+ o = child ? &child->object : NULL;
+ } else {
+ BUG("invalid type for tree entry: %d", type);
+ }
+
+ if (!o) {
+ error(_("failed to find object %s"),
+ oid_to_hex(&o->oid));
+ return -1;
+ }
+
+ /* Skip this object if already seen. */
+ if (o->flags & SEEN)
+ continue;
+ o->flags |= SEEN;
+
+ strbuf_setlen(&path, base_len);
+ strbuf_add(&path, entry.path, entry.pathlen);
+
+ /*
+ * Trees will end with "/" for concatenation and distinction
+ * from blobs at the same path.
+ */
+ if (type == OBJ_TREE)
+ strbuf_addch(&path, '/');
+
+ if (ctx->info->pl) {
+ int dtype;
+ enum pattern_match_result match;
+ match = path_matches_pattern_list(path.buf, path.len,
+ path.buf + base_len, &dtype,
+ ctx->info->pl,
+ ctx->repo->index);
+
+ if (ctx->info->pl->use_cone_patterns &&
+ match == NOT_MATCHED)
+ continue;
+ else if (!ctx->info->pl->use_cone_patterns &&
+ type == OBJ_BLOB &&
+ match != MATCHED)
+ continue;
+ }
+
+ if (!(list = strmap_get(&ctx->paths_to_lists, path.buf))) {
+ CALLOC_ARRAY(list, 1);
+ list->type = type;
+ strmap_put(&ctx->paths_to_lists, path.buf, list);
+ }
+ push_to_stack(ctx, path.buf);
+
+ if (!(o->flags & UNINTERESTING))
+ list->maybe_interesting = 1;
+
+ oid_array_append(&list->oids, &entry.oid);
+ }
+
+ free_tree_buffer(tree);
+ strbuf_release(&path);
+ return 0;
+}
+
+/*
+ * For each path in paths_to_explore, walk the trees another level
+ * and add any found blobs to the batch (but only if they exist and
+ * haven't been added yet).
+ */
+static int walk_path(struct path_walk_context *ctx,
+ const char *path)
+{
+ struct type_and_oid_list *list;
+ int ret = 0;
+
+ list = strmap_get(&ctx->paths_to_lists, path);
+
+ if (!list)
+ BUG("provided path '%s' that had no associated list", path);
+
+ if (!list->oids.nr)
+ return 0;
+
+ if (ctx->info->prune_all_uninteresting) {
+ /*
+ * This is true if all objects were UNINTERESTING
+ * when added to the list.
+ */
+ if (!list->maybe_interesting)
+ return 0;
+
+ /*
+ * But it's still possible that the objects were set
+ * as UNINTERESTING after being added. Do a quick check.
+ */
+ list->maybe_interesting = 0;
+ for (size_t i = 0;
+ !list->maybe_interesting && i < list->oids.nr;
+ i++) {
+ if (list->type == OBJ_TREE) {
+ struct tree *t = lookup_tree(ctx->repo,
+ &list->oids.oid[i]);
+ if (t && !(t->object.flags & UNINTERESTING))
+ list->maybe_interesting = 1;
+ } else if (list->type == OBJ_BLOB) {
+ struct blob *b = lookup_blob(ctx->repo,
+ &list->oids.oid[i]);
+ if (b && !(b->object.flags & UNINTERESTING))
+ list->maybe_interesting = 1;
+ } else {
+ /* Tags are always interesting if visited. */
+ list->maybe_interesting = 1;
+ }
+ }
+
+ /* We have confirmed that all objects are UNINTERESTING. */
+ if (!list->maybe_interesting)
+ return 0;
+ }
+
+ /* Evaluate function pointer on this data, if requested. */
+ if ((list->type == OBJ_TREE && ctx->info->trees) ||
+ (list->type == OBJ_BLOB && ctx->info->blobs) ||
+ (list->type == OBJ_TAG && ctx->info->tags))
+ ret = ctx->info->path_fn(path, &list->oids, list->type,
+ ctx->info->path_fn_data);
+
+ /* Expand data for children. */
+ if (list->type == OBJ_TREE) {
+ for (size_t i = 0; i < list->oids.nr; i++) {
+ ret |= add_tree_entries(ctx,
+ path,
+ &list->oids.oid[i]);
+ }
+ }
+
+ oid_array_clear(&list->oids);
+ strmap_remove(&ctx->paths_to_lists, path, 1);
+ return ret;
+}
+
+static void clear_paths_to_lists(struct strmap *map)
+{
+ struct hashmap_iter iter;
+ struct strmap_entry *e;
+
+ hashmap_for_each_entry(&map->map, &iter, e, ent) {
+ struct type_and_oid_list *list = e->value;
+ oid_array_clear(&list->oids);
+ }
+ strmap_clear(map, 1);
+ strmap_init(map);
+}
+
+static struct repository *edge_repo;
+static struct type_and_oid_list *edge_tree_list;
+
+static void show_edge(struct commit *commit)
+{
+ struct tree *t = repo_get_commit_tree(edge_repo, commit);
+
+ if (!t)
+ return;
+
+ if (commit->object.flags & UNINTERESTING)
+ t->object.flags |= UNINTERESTING;
+
+ if (t->object.flags & SEEN)
+ return;
+ t->object.flags |= SEEN;
+
+ oid_array_append(&edge_tree_list->oids, &t->object.oid);
+}
+
+static int setup_pending_objects(struct path_walk_info *info,
+ struct path_walk_context *ctx)
+{
+ struct type_and_oid_list *tags = NULL;
+ struct type_and_oid_list *tagged_blobs = NULL;
+ struct type_and_oid_list *root_tree_list = NULL;
+
+ if (info->tags)
+ CALLOC_ARRAY(tags, 1);
+ if (info->blobs)
+ CALLOC_ARRAY(tagged_blobs, 1);
+ if (info->trees)
+ root_tree_list = strmap_get(&ctx->paths_to_lists, root_path);
+
+ /*
+ * Pending objects include:
+ * * Commits at branch tips.
+ * * Annotated tags at tag tips.
+ * * Any kind of object at lightweight tag tips.
+ * * Trees and blobs in the index (with an associated path).
+ */
+ for (size_t i = 0; i < info->revs->pending.nr; i++) {
+ struct object_array_entry *pending = info->revs->pending.objects + i;
+ struct object *obj = pending->item;
+
+ /* Commits will be picked up by revision walk. */
+ if (obj->type == OBJ_COMMIT)
+ continue;
+
+ /* Navigate annotated tag object chains. */
+ while (obj->type == OBJ_TAG) {
+ struct tag *tag = lookup_tag(info->revs->repo, &obj->oid);
+ if (!tag) {
+ error(_("failed to find tag %s"),
+ oid_to_hex(&obj->oid));
+ return -1;
+ }
+ if (tag->object.flags & SEEN)
+ break;
+ tag->object.flags |= SEEN;
+
+ if (tags)
+ oid_array_append(&tags->oids, &obj->oid);
+ obj = tag->tagged;
+ }
+
+ if (obj->type == OBJ_TAG)
+ continue;
+
+ /* We are now at a non-tag object. */
+ if (obj->flags & SEEN)
+ continue;
+ obj->flags |= SEEN;
+
+ switch (obj->type) {
+ case OBJ_TREE:
+ if (!info->trees)
+ continue;
+ if (pending->path) {
+ struct type_and_oid_list *list;
+ char *path = *pending->path ? xstrfmt("%s/", pending->path)
+ : xstrdup("");
+ if (!(list = strmap_get(&ctx->paths_to_lists, path))) {
+ CALLOC_ARRAY(list, 1);
+ list->type = OBJ_TREE;
+ strmap_put(&ctx->paths_to_lists, path, list);
+ }
+ oid_array_append(&list->oids, &obj->oid);
+ free(path);
+ } else {
+ /* assume a root tree, such as a lightweight tag. */
+ oid_array_append(&root_tree_list->oids, &obj->oid);
+ }
+ break;
+
+ case OBJ_BLOB:
+ if (!info->blobs)
+ continue;
+ if (pending->path) {
+ struct type_and_oid_list *list;
+ char *path = pending->path;
+ if (!(list = strmap_get(&ctx->paths_to_lists, path))) {
+ CALLOC_ARRAY(list, 1);
+ list->type = OBJ_BLOB;
+ strmap_put(&ctx->paths_to_lists, path, list);
+ }
+ oid_array_append(&list->oids, &obj->oid);
+ } else {
+ /* assume a root tree, such as a lightweight tag. */
+ oid_array_append(&tagged_blobs->oids, &obj->oid);
+ }
+ break;
+
+ case OBJ_COMMIT:
+ /* Make sure it is in the object walk */
+ if (obj != pending->item)
+ add_pending_object(info->revs, obj, "");
+ break;
+
+ default:
+ BUG("should not see any other type here");
+ }
+ }
+
+ /*
+ * Add tag objects and tagged blobs if they exist.
+ */
+ if (tagged_blobs) {
+ if (tagged_blobs->oids.nr) {
+ const char *tagged_blob_path = "/tagged-blobs";
+ tagged_blobs->type = OBJ_BLOB;
+ tagged_blobs->maybe_interesting = 1;
+ strmap_put(&ctx->paths_to_lists, tagged_blob_path, tagged_blobs);
+ push_to_stack(ctx, tagged_blob_path);
+ } else {
+ oid_array_clear(&tagged_blobs->oids);
+ free(tagged_blobs);
+ }
+ }
+ if (tags) {
+ if (tags->oids.nr) {
+ const char *tag_path = "/tags";
+ tags->type = OBJ_TAG;
+ tags->maybe_interesting = 1;
+ strmap_put(&ctx->paths_to_lists, tag_path, tags);
+ push_to_stack(ctx, tag_path);
+ } else {
+ oid_array_clear(&tags->oids);
+ free(tags);
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * Given the configuration of 'info', walk the commits based on 'info->revs' and
+ * call 'info->path_fn' on each discovered path.
+ *
+ * Returns nonzero on an error.
+ */
+int walk_objects_by_path(struct path_walk_info *info)
+{
+ int ret;
+ size_t commits_nr = 0, paths_nr = 0;
+ struct commit *c;
+ struct type_and_oid_list *root_tree_list;
+ struct type_and_oid_list *commit_list;
+ struct path_walk_context ctx = {
+ .repo = info->revs->repo,
+ .revs = info->revs,
+ .info = info,
+ .path_stack = {
+ .compare = compare_by_type,
+ .cb_data = &ctx
+ },
+ .path_stack_pushed = STRSET_INIT,
+ .paths_to_lists = STRMAP_INIT
+ };
+
+ trace2_region_enter("path-walk", "commit-walk", info->revs->repo);
+
+ CALLOC_ARRAY(commit_list, 1);
+ commit_list->type = OBJ_COMMIT;
+
+ if (info->tags)
+ info->revs->tag_objects = 1;
+
+ /* Insert a single list for the root tree into the paths. */
+ CALLOC_ARRAY(root_tree_list, 1);
+ root_tree_list->type = OBJ_TREE;
+ root_tree_list->maybe_interesting = 1;
+ strmap_put(&ctx.paths_to_lists, root_path, root_tree_list);
+ push_to_stack(&ctx, root_path);
+
+ /*
+ * Set these values before preparing the walk to catch
+ * lightweight tags pointing to non-commits and indexed objects.
+ */
+ info->revs->blob_objects = info->blobs;
+ info->revs->tree_objects = info->trees;
+
+ if (prepare_revision_walk(info->revs))
+ die(_("failed to setup revision walk"));
+
+ /* Walk trees to mark them as UNINTERESTING. */
+ edge_repo = info->revs->repo;
+ edge_tree_list = root_tree_list;
+ mark_edges_uninteresting(info->revs, show_edge,
+ info->prune_all_uninteresting);
+ edge_repo = NULL;
+ edge_tree_list = NULL;
+
+ info->revs->blob_objects = info->revs->tree_objects = 0;
+
+ trace2_region_enter("path-walk", "pending-walk", info->revs->repo);
+ ret = setup_pending_objects(info, &ctx);
+ trace2_region_leave("path-walk", "pending-walk", info->revs->repo);
+
+ if (ret)
+ return ret;
+
+ while ((c = get_revision(info->revs))) {
+ struct object_id *oid;
+ struct tree *t;
+ commits_nr++;
+
+ if (info->commits)
+ oid_array_append(&commit_list->oids,
+ &c->object.oid);
+
+ /* If we only care about commits, then skip trees. */
+ if (!info->trees && !info->blobs)
+ continue;
+
+ oid = get_commit_tree_oid(c);
+ t = lookup_tree(info->revs->repo, oid);
+
+ if (!t) {
+ error("could not find tree %s", oid_to_hex(oid));
+ return -1;
+ }
+
+ if (t->object.flags & SEEN)
+ continue;
+ t->object.flags |= SEEN;
+ oid_array_append(&root_tree_list->oids, oid);
+ }
+
+ trace2_data_intmax("path-walk", ctx.repo, "commits", commits_nr);
+ trace2_region_leave("path-walk", "commit-walk", info->revs->repo);
+
+ /* Track all commits. */
+ if (info->commits && commit_list->oids.nr)
+ ret = info->path_fn("", &commit_list->oids, OBJ_COMMIT,
+ info->path_fn_data);
+ oid_array_clear(&commit_list->oids);
+ free(commit_list);
+
+ trace2_region_enter("path-walk", "path-walk", info->revs->repo);
+ while (!ret && ctx.path_stack.nr) {
+ char *path = prio_queue_get(&ctx.path_stack);
+ paths_nr++;
+
+ ret = walk_path(&ctx, path);
+
+ free(path);
+ }
+
+ /* Are there paths remaining? Likely they are from indexed objects. */
+ if (!strmap_empty(&ctx.paths_to_lists)) {
+ struct hashmap_iter iter;
+ struct strmap_entry *entry;
+
+ strmap_for_each_entry(&ctx.paths_to_lists, &iter, entry)
+ push_to_stack(&ctx, entry->key);
+
+ while (!ret && ctx.path_stack.nr) {
+ char *path = prio_queue_get(&ctx.path_stack);
+ paths_nr++;
+
+ ret = walk_path(&ctx, path);
+
+ free(path);
+ }
+ }
+
+ trace2_data_intmax("path-walk", ctx.repo, "paths", paths_nr);
+ trace2_region_leave("path-walk", "path-walk", info->revs->repo);
+
+ clear_paths_to_lists(&ctx.paths_to_lists);
+ strset_clear(&ctx.path_stack_pushed);
+ clear_prio_queue(&ctx.path_stack);
+ return ret;
+}
+
+void path_walk_info_init(struct path_walk_info *info)
+{
+ struct path_walk_info empty = PATH_WALK_INFO_INIT;
+ memcpy(info, &empty, sizeof(empty));
+}
+
+void path_walk_info_clear(struct path_walk_info *info)
+{
+ if (info->pl) {
+ clear_pattern_list(info->pl);
+ free(info->pl);
+ }
+}
diff --git a/path-walk.h b/path-walk.h
new file mode 100644
index 0000000000..473ee9d361
--- /dev/null
+++ b/path-walk.h
@@ -0,0 +1,80 @@
+/*
+ * path-walk.h : Methods and structures for walking the object graph in batches
+ * by the paths that can reach those objects.
+ */
+#include "object.h" /* Required for 'enum object_type'. */
+
+struct rev_info;
+struct oid_array;
+struct pattern_list;
+
+/**
+ * The type of a function pointer for the method that is called on a list of
+ * objects reachable at a given path.
+ */
+typedef int (*path_fn)(const char *path,
+ struct oid_array *oids,
+ enum object_type type,
+ void *data);
+
+struct path_walk_info {
+ /**
+ * revs provides the definitions for the commit walk, including
+ * which commits are UNINTERESTING or not. This structure is
+ * expected to be owned by the caller.
+ */
+ struct rev_info *revs;
+
+ /**
+ * The caller wishes to execute custom logic on objects reachable at a
+ * given path. Every reachable object will be visited exactly once, and
+ * the first path to see an object wins. This may not be a stable choice.
+ */
+ path_fn path_fn;
+ void *path_fn_data;
+
+ /**
+ * Initialize which object types the path_fn should be called on. This
+ * could also limit the walk to skip blobs if not set.
+ */
+ int commits;
+ int trees;
+ int blobs;
+ int tags;
+
+ /**
+ * When 'prune_all_uninteresting' is set and a path has all objects
+ * marked as UNINTERESTING, then the path-walk will not visit those
+ * objects. It will not call path_fn on those objects and will not
+ * walk the children of such trees.
+ */
+ int prune_all_uninteresting;
+
+ /**
+ * Specify a sparse-checkout definition to match our paths to. Do not
+ * walk outside of this sparse definition. If the patterns are in
+ * cone mode, then the search may prune directories that are outside
+ * of the cone. If not in cone mode, then all tree paths will be
+ * explored but the path_fn will only be called when the path matches
+ * the sparse-checkout patterns.
+ */
+ struct pattern_list *pl;
+};
+
+#define PATH_WALK_INFO_INIT { \
+ .blobs = 1, \
+ .trees = 1, \
+ .commits = 1, \
+ .tags = 1, \
+}
+
+void path_walk_info_init(struct path_walk_info *info);
+void path_walk_info_clear(struct path_walk_info *info);
+
+/**
+ * Given the configuration of 'info', walk the commits based on 'info->revs' and
+ * call 'info->path_fn' on each discovered path.
+ *
+ * Returns nonzero on an error.
+ */
+int walk_objects_by_path(struct path_walk_info *info);
diff --git a/perl/FromCPAN/Mail/meson.build b/perl/FromCPAN/Mail/meson.build
index 129cff161c..b4ff2fc0b2 100644
--- a/perl/FromCPAN/Mail/meson.build
+++ b/perl/FromCPAN/Mail/meson.build
@@ -4,4 +4,5 @@ test_dependencies += custom_target(
command: generate_perl_command,
install: true,
install_dir: get_option('datadir') / 'perl5/FromCPAN/Mail',
+ depends: [git_version_file],
)
diff --git a/perl/FromCPAN/meson.build b/perl/FromCPAN/meson.build
index 4e7ea909df..1f9ea6ce8e 100644
--- a/perl/FromCPAN/meson.build
+++ b/perl/FromCPAN/meson.build
@@ -4,6 +4,7 @@ test_dependencies += custom_target(
command: generate_perl_command,
install: true,
install_dir: get_option('datadir') / 'perl5/FromCPAN',
+ depends: [git_version_file],
)
subdir('Mail')
diff --git a/perl/Git/LoadCPAN/Mail/meson.build b/perl/Git/LoadCPAN/Mail/meson.build
index 7da5b37adb..89cde56be8 100644
--- a/perl/Git/LoadCPAN/Mail/meson.build
+++ b/perl/Git/LoadCPAN/Mail/meson.build
@@ -4,4 +4,5 @@ test_dependencies += custom_target(
command: generate_perl_command,
install: true,
install_dir: get_option('datadir') / 'perl5/Git/LoadCPAN/Mail',
+ depends: [git_version_file],
)
diff --git a/perl/Git/LoadCPAN/meson.build b/perl/Git/LoadCPAN/meson.build
index 9468c073ae..1ee915c650 100644
--- a/perl/Git/LoadCPAN/meson.build
+++ b/perl/Git/LoadCPAN/meson.build
@@ -4,6 +4,7 @@ test_dependencies += custom_target(
command: generate_perl_command,
install: true,
install_dir: get_option('datadir') / 'perl5/Git/LoadCPAN',
+ depends: [git_version_file],
)
subdir('Mail')
diff --git a/perl/Git/SVN/Memoize/meson.build b/perl/Git/SVN/Memoize/meson.build
index 515ab3dd92..233ec670d7 100644
--- a/perl/Git/SVN/Memoize/meson.build
+++ b/perl/Git/SVN/Memoize/meson.build
@@ -4,4 +4,5 @@ test_dependencies += custom_target(
command: generate_perl_command,
install: true,
install_dir: get_option('datadir') / 'perl5/Git/SVN',
+ depends: [git_version_file],
)
diff --git a/perl/Git/SVN/meson.build b/perl/Git/SVN/meson.build
index 8338531041..44abaf42b7 100644
--- a/perl/Git/SVN/meson.build
+++ b/perl/Git/SVN/meson.build
@@ -14,6 +14,7 @@ foreach source : [
command: generate_perl_command,
install: true,
install_dir: get_option('datadir') / 'perl5/Git/SVN',
+ depends: [git_version_file],
)
endforeach
diff --git a/perl/Git/meson.build b/perl/Git/meson.build
index 259209d730..b21fa5591e 100644
--- a/perl/Git/meson.build
+++ b/perl/Git/meson.build
@@ -11,6 +11,7 @@ foreach source : [
command: generate_perl_command,
install: true,
install_dir: get_option('datadir') / 'perl5/Git',
+ depends: [git_version_file],
)
endforeach
diff --git a/perl/meson.build b/perl/meson.build
index c22d6f8a1a..2d4ab1c4a9 100644
--- a/perl/meson.build
+++ b/perl/meson.build
@@ -4,6 +4,7 @@ test_dependencies += custom_target(
command: generate_perl_command,
install: true,
install_dir: get_option('datadir') / 'perl5',
+ depends: [git_version_file],
)
subdir('Git')
diff --git a/po/bg.po b/po/bg.po
index 1f7222dd93..2fc6c2b60c 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -225,6 +225,14 @@
# mailmap файл за съответствията на имената и адресите на е-поща
# unit test поединичен тест
# test suite група тестове
+# object database базата от данни за обектите
+# expecting integer изисква се число
+# timeout максимално изчакване
+# init timeout максимално първоначално изчакване
+# implies option включва опцията
+# cache-tree кеша на обектите-дървета
+# acquire lock придобивам ключалка
+# detached отделѐн, несвързан
#
# ------------------------
# „$var“ - може да не сработва за shell има gettext и eval_gettext - проверка - намират се лесно по „$
@@ -251,10 +259,10 @@
# for i in `sort -u FILES`; do cnt=`grep $i FILES | wc -l`; echo $cnt $i ;done | sort -n
msgid ""
msgstr ""
-"Project-Id-Version: git 2.45\n"
+"Project-Id-Version: git 2.48\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2024-10-05 01:20+0000\n"
-"PO-Revision-Date: 2024-10-05 13:20+0200\n"
+"POT-Creation-Date: 2024-12-27 22:37+0100\n"
+"PO-Revision-Date: 2024-12-27 22:40+0100\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language: bg\n"
@@ -564,8 +572,8 @@ msgstr ""
#, c-format
msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
msgstr ""
-"Премахване на промяната в права̀та за достъп от работното дърво [y,n,q,a,"
-"d%s,?]? "
+"Премахване на промяната в права̀та за достъп от работното дърво "
+"[y,n,q,a,d%s,?]? "
#, c-format
msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
@@ -605,8 +613,8 @@ msgstr ""
#, c-format
msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
msgstr ""
-"Премахване на промяната в права̀та за достъп от индекса и работното дърво [y,"
-"n,q,a,d%s,?]? "
+"Премахване на промяната в права̀та за достъп от индекса и работното дърво "
+"[y,n,q,a,d%s,?]? "
#, c-format
msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
@@ -641,8 +649,8 @@ msgstr ""
#, c-format
msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
msgstr ""
-"Прилагане на промяната в права̀та за достъп от индекса и работното дърво [y,n,"
-"q,a,d%s,?]? "
+"Прилагане на промяната в права̀та за достъп от индекса и работното дърво "
+"[y,n,q,a,d%s,?]? "
#, c-format
msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
@@ -676,8 +684,8 @@ msgstr ""
#, c-format
msgid "Apply mode change to worktree [y,n,q,a,d%s,?]? "
msgstr ""
-"Прилагане на промяната в права̀та за достъп към работното дърво [y,n,q,a,"
-"d%s,?]? "
+"Прилагане на промяната в права̀та за достъп към работното дърво "
+"[y,n,q,a,d%s,?]? "
#, c-format
msgid "Apply deletion to worktree [y,n,q,a,d%s,?]? "
@@ -893,12 +901,12 @@ msgstr "Променени са само двоични файлове."
#, c-format
msgid ""
"\n"
-"Disable this message with \"git config advice.%s false\""
+"Disable this message with \"git config set advice.%s false\""
msgstr ""
"\n"
"За да изключите това предупреждение, изпълнете:\n"
"\n"
-" git config advice.%s false"
+" git config set advice.%s false"
#, c-format
msgid "%shint:%s%.*s%s\n"
@@ -1016,8 +1024,8 @@ msgstr ""
"\n"
" git switch -\n"
"\n"
-"Може да спрете това съобщение със задаване на настройката „advice."
-"detachedHead“\n"
+"Може да спрете това съобщение със задаване на настройката "
+"„advice.detachedHead“\n"
"да е „false“ (лъжа̀).\n"
#, c-format
@@ -1247,7 +1255,7 @@ msgstr "двоичната кръпка не може да се приложи
#, c-format
msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
msgstr ""
-"двоичната кръпка за „%s“ води до неправилни резултати (очакваше се: „%s“, а "
+"двоичната кръпка за „%s“ води до неправилни резултати (изисква се: „%s“, а "
"бе получено: „%s“)"
#, c-format
@@ -2651,9 +2659,9 @@ msgid ""
"git bisect start [--term-(new|bad)=<term> --term-(old|good)=<term>] [--no-"
"checkout] [--first-parent] [<bad> [<good>...]] [--] [<pathspec>...]"
msgstr ""
-"git bisect start [--term-(new,bad)=УПРАВЛЯВАЩА_ДУМА --term-(old,"
-"good)=УПРАВЛЯВАЩА_ДУМА] [--no-checkout] [--first-parent] [ЛОШО [ДОБРО…]] "
-"[--] [ПЪТ…]"
+"git bisect start [--term-(new,bad)=УПРАВЛЯВАЩА_ДУМА --term-"
+"(old,good)=УПРАВЛЯВАЩА_ДУМА] [--no-checkout] [--first-parent] [ЛОШО "
+"[ДОБРО…]] [--] [ПЪТ…]"
msgid "git bisect (good|bad) [<rev>...]"
msgstr "git bisect (good|bad) [ВЕРСИЯ…]"
@@ -2936,7 +2944,7 @@ msgstr "ОПЦИИте_ЗА_ВЕРСИЯТА са документирани в
#, c-format
msgid "expecting a color: %s"
-msgstr "трябва да е цвят: %s"
+msgstr "изисква се цвят: %s"
msgid "must end with a color"
msgstr "трябва да завършва с цвят"
@@ -3349,8 +3357,8 @@ msgid "HEAD not found below refs/heads!"
msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
msgid ""
-"branch with --recurse-submodules can only be used if submodule."
-"propagateBranches is enabled"
+"branch with --recurse-submodules can only be used if "
+"submodule.propagateBranches is enabled"
msgstr ""
"може да се ползва клон с опцията „--recurse-submodules“, само ако "
"настройката „submodule.propagateBranches“ е зададена"
@@ -3653,8 +3661,8 @@ msgstr "позволяване на опциите „-s“ и „-t“ да р
msgid "use mail map file"
msgstr ""
-"използване на файл за съответствията на имената и адресите на е-поща („."
-"mailmap“)"
+"използване на файл за съответствията на имената и адресите на е-поща "
+"(„.mailmap“)"
msgid "Batch objects requested on stdin (or --batch-all-objects)"
msgstr ""
@@ -4206,7 +4214,7 @@ msgstr ""
"„zdiff3“)"
msgid "detach HEAD at named commit"
-msgstr "отделяне на указателя „HEAD“ към указаното подаване"
+msgstr "отделяне на указателя „HEAD“ при указаното подаване"
msgid "force checkout (throw away local modifications)"
msgstr "принудително изтегляне (вашите промѐни ще бъдат занулени)"
@@ -4220,8 +4228,8 @@ msgstr "нов неродѐн клон"
msgid "update ignored files (default)"
msgstr "обновяване на игнорираните файлове (стандартно)"
-msgid "do not check if another worktree is holding the given ref"
-msgstr "без проверка дали друго работно дърво държи указателя"
+msgid "do not check if another worktree is using this branch"
+msgstr "без проверка дали друго работно дърво ползва този клон"
msgid "checkout our version for unmerged files"
msgstr "изтегляне на вашата версия на неслетите файлове"
@@ -4525,10 +4533,10 @@ msgstr "плитко клониране до тази ДЪЛБОЧИНА"
msgid "create a shallow clone since a specific time"
msgstr "плитко клониране до момент във времето"
-msgid "revision"
-msgstr "ВЕРСИЯ"
+msgid "ref"
+msgstr "УКАЗ"
-msgid "deepen history of shallow clone, excluding rev"
+msgid "deepen history of shallow clone, excluding ref"
msgstr "задълбочаване на историята на плитко хранилище до изключващ указател"
msgid "clone only one branch, HEAD or --branch"
@@ -5509,9 +5517,10 @@ msgstr ""
msgid ""
"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
-"<name> <value>"
+"<name>"
msgstr ""
-"git config unset [ОПЦИЯ_ЗА_ФАЙЛ] [--all] [--value=СТОЙНОСТ] [--fixed-value]"
+"git config unset [ОПЦИЯ_ЗА_ФАЙЛ] [--all] [--value=СТОЙНОСТ] [--fixed-value] "
+"ИМЕ"
msgid "git config rename-section [<file-option>] <old-name> <new-name>"
msgstr "git config rename-section [ОПЦИЯ_ЗА_ФАЙЛ] СТАРО_ИМЕ НОВО_ИМЕ"
@@ -5963,12 +5972,8 @@ msgid "traversed %lu commits\n"
msgstr "обходени са %lu подавания\n"
#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"открити са над %i етикета, изведени са последните %i,\n"
-"търсенето бе прекратено при „%s“.\n"
+msgid "found %i tags; gave up search at %s\n"
+msgstr "открити са %i етикета. Търсенето приключи при „%s“\n"
#, c-format
msgid "describe %s\n"
@@ -6414,6 +6419,27 @@ msgstr "„%s“ е неправилен обект"
msgid "the object %s does not exist"
msgstr "обектът „%s“ не съществува"
+#, c-format
+msgid ""
+"Run 'git remote set-head %s %s' to follow the change, or set\n"
+"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
+"if you do not want to see this message. Specifically running\n"
+"'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
+"until the remote changes HEAD to something else."
+msgstr ""
+"Изпълнете\n"
+"\n"
+" git remote set-head %s %s\n"
+"\n"
+"за да следвате промяната или задайте друга стойност на настройката\n"
+"„remote.%s.followRemoteHEAD, ако не искате тези съобщения.\n"
+"Изпълнението на\n"
+"\n"
+" git config set remote.%s.followRemoteHEAD %s\n"
+"\n"
+"ще изключи предупреждението, докато отдалеченият указател HEAD не\n"
+"започне да сочи нещо друго."
+
msgid "multiple branches detected, incompatible with --set-upstream"
msgstr ""
"засечени са множество клони, това е несъвместимо с опцията „--set-upstream“"
@@ -6553,6 +6579,9 @@ msgstr "КАРТА_С_УКАЗАТЕЛИ"
msgid "specify fetch refmap"
msgstr "указване на КАРТАта_С_УКАЗАТЕЛИ за доставяне"
+msgid "revision"
+msgstr "ВЕРСИЯ"
+
msgid "report that we have only objects reachable from this object"
msgstr "докладване, че всички обекти може са достижими при започване от този"
@@ -6608,8 +6637,8 @@ msgid "protocol does not support --negotiate-only, exiting"
msgstr "протоколът не поддържа опцията „--negotiate-only“, изход от програмата"
msgid ""
-"--filter can only be used with the remote configured in extensions."
-"partialclone"
+"--filter can only be used with the remote configured in "
+"extensions.partialclone"
msgstr ""
"опцията „--filter“ може да се ползва само с отдалеченото хранилище указано в "
"настройката „extensions.partialclone“"
@@ -6859,7 +6888,7 @@ msgstr "„%s“ сочи към нещо необичайно (%s)"
#, c-format
msgid "%s: detached HEAD points at nothing"
-msgstr "%s: несвързаният връх „HEAD“ не сочи към нищо"
+msgstr "%s: отделеният връх „HEAD“ не сочи към нищо"
#, c-format
msgid "notice: %s points to an unborn branch (%s)"
@@ -7169,8 +7198,8 @@ msgstr "неуспешно изпълнение на „git multi-pack-index rep
msgid ""
"skipping incremental-repack task because core.multiPackIndex is disabled"
msgstr ""
-"задачата „incremental-repack“ се прескача, защото настройката „core."
-"multiPackIndex“ е изключена"
+"задачата „incremental-repack“ се прескача, защото настройката "
+"„core.multiPackIndex“ е изключена"
#, c-format
msgid "lock file '%s' exists, skipping maintenance"
@@ -7291,8 +7320,25 @@ msgstr "липсват както таймери на systemd, така и cront
msgid "%s scheduler is not available"
msgstr "планиращият модул „%s“ липсва"
-msgid "another process is scheduling background maintenance"
-msgstr "друг процес задава поддръжката на заден фон"
+#, c-format
+msgid ""
+"unable to create '%s.lock': %s.\n"
+"\n"
+"Another scheduled git-maintenance(1) process seems to be running in this\n"
+"repository. Please make sure no other maintenance processes are running and\n"
+"then try again. If it still fails, a git-maintenance(1) process may have\n"
+"crashed in this repository earlier: remove the file manually to continue."
+msgstr ""
+"Файлът-ключалка „%s.lock“ не може да бъде създаден: %s\n"
+"\n"
+"Изглежда, че и друг процес на git-maintenance(1) е пуснат в това\n"
+"хранилище. Уверете се, че всички подобни процеси са спрени и опитайте\n"
+"отново. Ако това не помогне, вероятната причина е, че някой процес на\n"
+"git-maintenance(1) в това хранилище е забил. За да продължите работа,\n"
+"ще трябва ръчно да изтриете файла:"
+
+msgid "cannot acquire lock for scheduled background maintenance"
+msgstr "не може да се придобие ключалката за поддръжката на заден фон"
msgid "git maintenance start [--scheduler=<scheduler>]"
msgstr "git maintenance start [--scheduler=ПЛАНИРАЩ_МОДУЛ]"
@@ -7876,6 +7922,24 @@ msgid_plural "chain length = %d: %lu objects"
msgstr[0] "дължината на веригата е %d: %lu обект"
msgstr[1] "дължината на веригата е %d: %lu обекта"
+msgid "could not start pack-objects to repack local links"
+msgstr ""
+"командата „pack-objects“ не може да се стартира за препакетирането на "
+"локалните връзки"
+
+msgid "failed to feed local object to pack-objects"
+msgstr "локалните обекти не може да се подадат на командата „pack-objects“"
+
+msgid "index-pack: Expecting full hex object ID lines only from pack-objects."
+msgstr ""
+"index-pack: от „pack-objects“ се изискват редове само с пълни шестнайсетични "
+"указатели."
+
+msgid "could not finish pack-objects to repack local links"
+msgstr ""
+"командата „pack-objects“ не може да завърши за препакетирането на локалните "
+"връзки"
+
msgid "Cannot come back to cwd"
msgstr "Процесът не може да се върне към предишната работна директория"
@@ -7887,6 +7951,9 @@ msgstr "неправилна стойност „%s“"
msgid "unknown hash algorithm '%s'"
msgstr "непознат алгоритъм за контролни суми „%s“"
+msgid "--promisor cannot be used with a pack name"
+msgstr "опцията „--promisor“ е несъвместима с име на пакет"
+
msgid "--stdin requires a git repository"
msgstr "„--stdin“ изисква хранилище на git"
@@ -9283,11 +9350,14 @@ msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] [list [ОБЕКТ
msgid ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
+"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
+"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
+"| -C) <object>] [<object>] [-e]\n"
"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] add [-f] [--allow-empty] [--"
"[no-]separator|--separator=<paragraph-break>] [--[no-]stripspace] [-m "
-"СЪОБЩЕНИЕ|-F ФАЙЛ|(-c|-C) ОБЕКТ] [ОБЕКТ]"
+"СЪОБЩЕНИЕ|-F ФАЙЛ|(-c|-C) ОБЕКТ] [ОБЕКТ] [-e]"
msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
msgstr ""
@@ -9296,11 +9366,11 @@ msgstr ""
msgid ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] append [--allow-empty] [--"
"[no-]separator|--separator=КРАЙ_НА_АБЗАЦ] [--[no-]stripspace] [-m СЪОБЩЕНИЕ "
-"| -F ФАЙЛ|(-c|-C) ОБЕКТ] [ОБЕКТ]"
+"| -F ФАЙЛ|(-c|-C) ОБЕКТ] [ОБЕКТ] [-e]"
msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] edit [--allow-empty] [ОБЕКТ]"
@@ -9422,6 +9492,9 @@ msgstr "ФАЙЛ със съдържанието на бележката"
msgid "reuse and edit specified note object"
msgstr "преизползване и редактиране на указания ОБЕКТ-бележка"
+msgid "edit note message in editor"
+msgstr "редактиране на съобщението в редактора"
+
msgid "reuse specified note object"
msgstr "преизползване на указания ОБЕКТ-бележка"
@@ -9660,7 +9733,7 @@ msgstr "неуспешно записване на индекси на база
#, c-format
msgid "wrote %<PRIu32> objects while expecting %<PRIu32>"
-msgstr "бяха записани %<PRIu32> обекти, а се очакваха %<PRIu32>"
+msgstr "бяха записани %<PRIu32> обекти, а се изискват %<PRIu32>"
msgid "disabling bitmap writing, as some objects are not being packed"
msgstr ""
@@ -9940,6 +10013,9 @@ msgstr "как да се обработват липсващите обекти"
msgid "do not pack objects in promisor packfiles"
msgstr "без пакетиране на обекти в гарантиращи пакети"
+msgid "implies --missing=allow-any"
+msgstr "включва опцията „--missing=allow-any“"
+
msgid "respect islands during delta compression"
msgstr "без промяна на групите при делта компресия"
@@ -10315,7 +10391,7 @@ msgid ""
" git push %s HEAD:<name-of-remote-branch>\n"
msgstr ""
"В момента не сте на никой клон. За да изтласкате историята до състоянието,\n"
-"сочено в момента от указателя „HEAD“, използвайте командата:\n"
+"сочено в момента от (несвързания) указател „HEAD“, използвайте командата:\n"
"\n"
" git push %s HEAD:ИМЕ_НА_ОТДАЛЕЧЕНИЯ_КЛОН\n"
@@ -11592,6 +11668,30 @@ msgid_plural " Local refs configured for 'git push'%s:"
msgstr[0] " Локалният указател, настроен за „git push“%s:"
msgstr[1] " Локалните указатели, настроени за „git push“%s:"
+#, c-format
+msgid "'%s/HEAD' is unchanged and points to '%s'\n"
+msgstr "„%s/HEAD“ не е променен и сочи към „%s“\n"
+
+#, c-format
+msgid "'%s/HEAD' has changed from '%s' and now points to '%s'\n"
+msgstr "„%s/HEAD“ е променен от „%s“ и сега сочи към „%s“\n"
+
+#, c-format
+msgid "'%s/HEAD' is now created and points to '%s'\n"
+msgstr "„%s/HEAD“ е създаден и сочи към „%s“\n"
+
+#, c-format
+msgid "'%s/HEAD' was detached at '%s' and now points to '%s'\n"
+msgstr "„%s/HEAD“ е отделѐн при „%s“ и сочи към „%s“\n"
+
+#, c-format
+msgid ""
+"'%s/HEAD' used to point to '%s' (which is not a remote branch), but now "
+"points to '%s'\n"
+msgstr ""
+"„%s/HEAD“ сочеше към „%s“ (което не е отдалечен клон), но сега сочи към "
+"„%s“\n"
+
msgid "set refs/remotes/<name>/HEAD according to remote"
msgstr "задаване на refs/remotes/ИМЕ/HEAD според отдалеченото хранилище"
@@ -11614,7 +11714,7 @@ msgid "Not a valid ref: %s"
msgstr "Неправилен указател: %s"
#, c-format
-msgid "Could not setup %s"
+msgid "Could not set up %s"
msgstr "„%s“ не може да се настрои"
#, c-format
@@ -12287,8 +12387,8 @@ msgstr ""
" или: git rev-parse --sq-quote [АРГУМЕНТ…]\n"
" или: git rev-parse [ОПЦИЯ…] [АРГУМЕНТ…]\n"
"\n"
-"За повече информация за първия вариант изпълнете „git rev-parse --parseopt -"
-"h“"
+"За повече информация за първия вариант изпълнете „git rev-parse --parseopt "
+"-h“"
msgid "--resolve-git-dir requires an argument"
msgstr "опцията „--resolve-git-dir“ изисква аргумент"
@@ -13119,7 +13219,7 @@ msgstr "добавяне на „# “ в началото на всеки ре
#, c-format
msgid "Expecting a full ref name, got %s"
-msgstr "Очаква се пълно име на указател, а не „%s“"
+msgstr "Изисква се пълно име на указател, а не „%s“"
#, c-format
msgid "could not get a repository handle for submodule '%s'"
@@ -13546,7 +13646,8 @@ msgid "don't print cloning progress"
msgstr "без извеждане на напредъка на клонирането"
msgid "disallow cloning into non-empty directory, implies --init"
-msgstr "предотвратяване на клониране в непразна история, включва „--init“"
+msgstr ""
+"предотвратяване на клониране в непразна история, включва опцията „--init“"
msgid ""
"git submodule [--quiet] update [--init [--filter=<filter-spec>]] [--remote] "
@@ -14403,6 +14504,9 @@ msgstr "задаване на режима на следене (виж git-branc
msgid "try to match the new branch name with a remote-tracking branch"
msgstr "опит за напасване на името на новия клон с това на следящ клон"
+msgid "use relative paths for worktrees"
+msgstr "използване на относителни пътища за работните дървета"
+
#, c-format
msgid "options '%s', '%s', and '%s' cannot be used together"
msgstr "опциите „%s“, „%s“ и „%s“ са несъвместими"
@@ -14684,6 +14788,26 @@ msgstr "файлът „%s“ не може да бъде създаден"
msgid "index-pack died"
msgstr "командата „git index-pack“ не завърши успешно"
+#, c-format
+msgid "directory '%s' is present in index, but not sparse"
+msgstr "директорията „%s“ е в индекса, но не е частична"
+
+msgid "corrupted cache-tree has entries not present in index"
+msgstr "повреденият кеш на обектите-дървета съдържа записи извън индекса"
+
+#, c-format
+msgid "%s with flags 0x%x should not be in cache-tree"
+msgstr "„%s“ с флагове 0x%x не трябва да е в кеша на обектите-дървета"
+
+#, c-format
+msgid "bad subtree '%.*s'"
+msgstr "неправилно поддърво „%.*s“"
+
+#, c-format
+msgid "cache-tree for path %.*s does not match. Expected %s got %s"
+msgstr ""
+"кешираният обект-дърво за пътя „%.*s“ не съвпада. Изисква се „%s“, а не „%s“"
+
msgid "terminating chunk id appears earlier than expected"
msgstr "идентификаторът за краен откъс се явява по-рано от очакваното"
@@ -15468,7 +15592,7 @@ msgstr "временният файл на гра̀фа с подаваният
#, c-format
msgid "cannot merge graphs with %<PRIuMAX>, %<PRIuMAX> commits"
msgstr ""
-"не може да се слеят графове с %<PRIuMAX> и %<PRIuMAX> подавания (съответно)"
+"не може да се слеят гра̀фи с %<PRIuMAX> и %<PRIuMAX> подавания (съответно)"
#, c-format
msgid "cannot merge graph %s, too many commits: %<PRIuMAX>"
@@ -15490,8 +15614,8 @@ msgid ""
"attempting to write a commit-graph, but 'commitGraph.changedPathsVersion' "
"(%d) is not supported"
msgstr ""
-"опит за запис на гра̀фа с подаванията, но настройката „commitGraph."
-"changedPathsVersion“ (%d) не се поддържа"
+"опит за запис на гра̀фа с подаванията, но настройката "
+"„commitGraph.changedPathsVersion“ (%d) не се поддържа"
msgid "too many commits to write graph"
msgstr "прекалено много подавания за записване на гра̀фа"
@@ -15578,7 +15702,7 @@ msgid ""
"to convert the grafts into replace refs.\n"
"\n"
"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
msgstr ""
"Поддръжката на „<GIT_DIR>/info/grafts“ е остаряла.\n"
"В бъдеща версия на Git ще бъде премахната.\n"
@@ -15590,7 +15714,7 @@ msgstr ""
"\n"
"За да изключите това съобщение, изпълнете:\n"
"\n"
-" git config advice.graftFileDeprecated false"
+" git config set advice.graftFileDeprecated false"
#, c-format
msgid "commit %s exists in commit-graph but not in the object database"
@@ -16445,6 +16569,24 @@ msgstr "адресът е без схема: %s"
msgid "credential url cannot be parsed: %s"
msgstr "адресът за идентификация не може да се анализира: „%s“"
+#, c-format
+msgid "invalid timeout '%s', expecting a non-negative integer"
+msgstr ""
+"неправилна стойност за „timeout“ (максимално изчакване) „%s“, изисква се "
+"неотрицателно цяло число"
+
+#, c-format
+msgid "invalid init-timeout '%s', expecting a non-negative integer"
+msgstr ""
+"неправилна стойност за „init-timeout“ (максимално първоначално изчакване): "
+"„%s“, изисква се неотрицателно цяло число"
+
+#, c-format
+msgid "invalid max-connections '%s', expecting an integer"
+msgstr ""
+"неправилна стойност за „max-connections“ (максималния брой връзки): „%s“, "
+"изисква се цяло число"
+
msgid "in the future"
msgstr "в бъдещето"
@@ -17170,6 +17312,22 @@ msgstr "неправилен път към пространства от име
msgid "too many args to run %s"
msgstr "прекалено много аргументи за изпълнение „%s“"
+#, c-format
+msgid ""
+"You are attempting to fetch %s, which is in the commit graph file but not in "
+"the object database.\n"
+"This is probably due to repo corruption.\n"
+"If you are attempting to repair this repo corruption by refetching the "
+"missing object, use 'git fetch --refetch' with the missing object."
+msgstr ""
+"Пробвате да доставите „%s“, което е в гра̀фа с подаванията, но не и в базата "
+"от данни за обектите.\n"
+"Най-вероятната причина е повредено хранилище.\n"
+"За да поправите хранилището като изтеглите липсващия обект наново, "
+"изпълнете:\n"
+"\n"
+" git fetch --refetch"
+
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack: очаква се плитък списък"
@@ -17770,11 +17928,12 @@ msgstr[1] ""
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
+"You can disable this warning with `git config set advice.ignoredHook false`."
msgstr ""
"Куката „%s“ се прескача, защото липсват права̀ за изпълнение.\n"
"За да изключите това предупреждение, изпълнете:\n"
-" git config advice.ignoredHook false"
+"\n"
+" git config set advice.ignoredHook false"
msgid "not a git repository"
msgstr "не е хранилище на Git"
@@ -17791,15 +17950,9 @@ msgstr ""
msgid "Delegation control is not supported with cURL < 7.22.0"
msgstr "Управлението на делегирането не се поддържа от cURL < 7.22.0"
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr "Задаването на постоянен публичен ключ не се поддържа от cURL < 7.39.0"
-
msgid "Unknown value for http.proactiveauth"
msgstr "Непозната стойност за „http.proactiveauth“"
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr "„CURLSSLOPT_NO_REVOKE“ не се поддържа от cURL < 7.44.0"
-
#, c-format
msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
msgstr "Неподдържана реализация на SSL „%s“. Поддържат се:"
@@ -17992,6 +18145,10 @@ msgid "unable to format message: %s"
msgstr "съобщението не може да се форматира: %s"
#, c-format
+msgid "invalid marker-size '%s', expecting an integer"
+msgstr "неправилен размер на маркер: „%s“, изисква се цяло число"
+
+#, c-format
msgid "Failed to merge submodule %s (not checked out)"
msgstr "Неуспешно сливане на подмодула „%s“ (не е изтеглен)"
@@ -19147,7 +19304,7 @@ msgid ""
"\n"
"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"running \"git config set advice.objectNameWarning false\""
msgstr ""
"При нормална работа Git никога не създава указатели, които завършват\n"
"с 40 шестнадесетични знака, защото стандартно те ще бъдат прескачани.\n"
@@ -19159,7 +19316,7 @@ msgstr ""
"се създава подобен указател. Прегледайте тези указатели и ги изтрийте.\n"
"За да изключите това съобщение, изпълнете:\n"
"\n"
-" git config advice.objectNameWarning false"
+" config set advice.objectNameWarning false"
#, c-format
msgid "log for '%.*s' only goes back to %s"
@@ -19330,15 +19487,6 @@ msgstr "задължителният обратен индекс липсва в
msgid "could not open pack %s"
msgstr "пакетът „%s“ не може да се отвори"
-msgid "could not determine MIDX preferred pack"
-msgstr ""
-"предпочитаният пакет за файла с индекса за множество пакети не може да се "
-"определи"
-
-#, c-format
-msgid "preferred pack (%s) is invalid"
-msgstr "предпочитаният пакет „%s“ е неправилен"
-
msgid "corrupt bitmap lookup table: triplet position out of index"
msgstr ""
"повредена таблица със съответствия: местоположението на тройката е извън "
@@ -20497,20 +20645,28 @@ msgstr "журналът с подаванията за указателя „%s
msgid "log for %s is empty"
msgstr "журналът с подаванията за указателя „%s“ е празен"
-msgid "refusing to force and skip creation of reflog"
-msgstr ""
-"принудителна операция без създаване на журнал на указателите няма да се "
-"приеме"
-
#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr "указател не може да се обнови с грешно име „%s“"
+msgid "refusing to update reflog for pseudoref '%s'"
+msgstr "журналът на указателите няма да се обнови с псевдо указателя „%s“"
#, c-format
msgid "refusing to update pseudoref '%s'"
msgstr "псевдо указателят „%s“ няма да се обнови"
#, c-format
+msgid "refusing to update reflog with bad name '%s'"
+msgstr "журналът на указателите няма да се обнови с грешно име „%s“"
+
+#, c-format
+msgid "refusing to update ref with bad name '%s'"
+msgstr "указател не може да се обнови с грешно име „%s“"
+
+msgid "refusing to force and skip creation of reflog"
+msgstr ""
+"принудителна операция без създаване на журнал на указателите няма да се "
+"приеме"
+
+#, c-format
msgid "update_ref failed for ref '%s': %s"
msgstr "неуспешно обновяване на указателя (update_ref) „%s“: %s"
@@ -20560,6 +20716,10 @@ msgstr ""
"„%s“, но вместо това е обикновен указател"
#, c-format
+msgid "cannot read ref file '%s'"
+msgstr "файлът с указател „%s“ не може да се прочете"
+
+#, c-format
msgid "cannot open directory %s"
msgstr "директорията „%s“ не може да бъде отворена"
@@ -20781,6 +20941,10 @@ msgid "more than one uploadpack given, using the first"
msgstr "зададен е повече от един пакет за изпращане, ще се ползва първият"
#, c-format
+msgid "unrecognized followRemoteHEAD value '%s' ignored"
+msgstr "непознатата стойност за „followRemoteHEAD“: „%s“, се прескача"
+
+#, c-format
msgid "unrecognized value transfer.credentialsInUrl: '%s'"
msgstr "непозната стойност за „transfer.credentialsInUrl“: „%s“"
@@ -22788,6 +22952,11 @@ msgstr "подаването „%s“ не е отбелязано като до
msgid "too many commits marked reachable"
msgstr "прекалено много подавания са отбелязани като достижими"
+msgid "could not determine MIDX preferred pack"
+msgstr ""
+"предпочитаният пакет за файла с индекса за множество пакети не може да се "
+"определи"
+
msgid "test-tool serve-v2 [<options>]"
msgstr "test-tool serve-v2 [ОПЦИЯ…]"
@@ -23444,6 +23613,9 @@ msgstr "„.git“ е повреден"
msgid ".git file incorrect"
msgstr "„.git“ е неправилен"
+msgid ".git file absolute/relative path mismatch"
+msgstr "несъвпадение на абсолютния/относителния път на „.git“"
+
msgid "not a valid path"
msgstr "неправилен път"
@@ -23459,6 +23631,9 @@ msgstr "не може да се открие хранилище: „.git“ е
msgid "gitdir unreadable"
msgstr "директорията „gitdir“ не може да се прочете"
+msgid "gitdir absolute/relative path mismatch"
+msgstr "„gitdir“ указва несъвпадение на абсолютния/относителния път"
+
msgid "gitdir incorrect"
msgstr "неправилна директория „gitdir“"
@@ -23495,6 +23670,14 @@ msgstr "„%s“ не може да се изчисти в „%s“"
msgid "failed to set extensions.worktreeConfig setting"
msgstr "неуспешно задаване на настройката „extensions.worktreeConfig“"
+msgid "unable to upgrade repository format to support relative worktrees"
+msgstr ""
+"форматът на хранилището не може да се обнови за поддръжката на относителни "
+"работни дървета"
+
+msgid "unable to set extensions.relativeWorktrees setting"
+msgstr "неуспешно задаване на настройката „extensions.relativeWorktrees“"
+
#, c-format
msgid "could not setenv '%s'"
msgstr "променливата на средата „%s“ не може да се зададе чрез „setenv“"
diff --git a/po/de.po b/po/de.po
index 06055e7611..addd5919bd 100644
--- a/po/de.po
+++ b/po/de.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Git\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2024-10-05 16:17+0200\n"
-"PO-Revision-Date: 2024-10-05 16:18+0200\n"
+"POT-Creation-Date: 2024-12-20 17:44+0100\n"
+"PO-Revision-Date: 2024-12-27 16:43+0100\n"
"Last-Translator: Ralf Thielow <ralf.thielow@gmail.com>\n"
"Language-Team: German\n"
"Language: de\n"
@@ -366,11 +366,11 @@ msgstr ""
#, c-format
msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
msgstr ""
-"Modusänderung vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
+"Modusänderung im Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
#, c-format
msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
-msgstr "Löschung vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
+msgstr "Löschung im Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
#, c-format
msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
@@ -379,7 +379,7 @@ msgstr "Ergänzung im Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
#, c-format
msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
msgstr ""
-"Diesen Patch-Block vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a,"
+"Diesen Patch-Block im Index und Arbeitsverzeichnis verwerfen [y,n,q,a,"
"d%s,?]? "
msgid ""
@@ -650,10 +650,10 @@ msgstr "Nur Binärdateien geändert."
#, c-format
msgid ""
"\n"
-"Disable this message with \"git config advice.%s false\""
+"Disable this message with \"git config set advice.%s false\""
msgstr ""
"\n"
-"Deaktivieren Sie diese Nachricht mit \"git config advice.%s false\""
+"Deaktivieren Sie diese Meldung mit \"git config set advice.%s false\""
#, c-format
msgid "%shint:%s%.*s%s\n"
@@ -3962,10 +3962,9 @@ msgstr "neuer ungeborener Branch"
msgid "update ignored files (default)"
msgstr "ignorierte Dateien aktualisieren (Standard)"
-msgid "do not check if another worktree is holding the given ref"
+msgid "do not check if another worktree is using this branch"
msgstr ""
-"Prüfung, ob die Referenz bereits in einem anderen Arbeitsverzeichnis "
-"ausgecheckt wurde, deaktivieren"
+"nicht prüfen, ob ein anderes Arbeitsverzeichnis diesen Branch verwendet"
msgid "checkout our version for unmerged files"
msgstr "unsere Variante für nicht zusammengeführte Dateien auschecken"
@@ -4272,13 +4271,11 @@ msgstr ""
"Zeit\n"
"erstellen"
-msgid "revision"
-msgstr "Commit"
+msgid "ref"
+msgstr "Referenz"
-msgid "deepen history of shallow clone, excluding rev"
-msgstr ""
-"die Historie eines Klons mit unvollständiger Historie (shallow) mittels\n"
-"Ausschluss eines Commits vertiefen"
+msgid "deepen history of shallow clone, excluding ref"
+msgstr "Historie eines flachen Klons vertiefen, Referenz exkludiert"
msgid "clone only one branch, HEAD or --branch"
msgstr "nur einen Branch klonen, HEAD oder --branch"
@@ -5232,8 +5229,7 @@ msgid ""
"regexp] [--value=<value>] [--fixed-value] [--default=<default>] <name>"
msgstr ""
"git config get [<Datei-Option>] [<Anzeige-Option>] [--includes] [--all] [--"
-"regexp] [--value=<Wert>] [--fixed-value] [--default=<Standardwert>] "
-"<Name>"
+"regexp] [--value=<Wert>] [--fixed-value] [--default=<Standardwert>] <Name>"
msgid ""
"git config set [<file-option>] [--type=<type>] [--all] [--value=<value>] [--"
@@ -5244,10 +5240,10 @@ msgstr ""
msgid ""
"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
-"<name> <value>"
+"<name>"
msgstr ""
"git config unset [<Datei-Option>] [--all] [--value=<Wert>] [--fixed-value] "
-"<Name> <Wert>"
+"<Name>"
msgid "git config rename-section [<file-option>] <old-name> <new-name>"
msgstr "git config rename-section [<Datei-Option>] <alter-Name> <neuer-Name>"
@@ -5695,12 +5691,8 @@ msgid "traversed %lu commits\n"
msgstr "%lu Commits durchlaufen\n"
#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"mehr als %i Tags gefunden; führe die ersten %i auf\n"
-"Suche bei %s aufgegeben\n"
+msgid "found %i tags; gave up search at %s\n"
+msgstr "%i Tags gefunden; Suche bei %s aufgegeben\n"
#, c-format
msgid "describe %s\n"
@@ -6142,6 +6134,20 @@ msgstr "%s ist kein gültiges Objekt"
msgid "the object %s does not exist"
msgstr "das Objekt %s ist nicht vorhanden"
+#, c-format
+msgid ""
+"Run 'git remote set-head %s %s' to follow the change, or set\n"
+"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
+"if you do not want to see this message. Specifically running\n"
+"'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
+"until the remote changes HEAD to something else."
+msgstr ""
+"Führen Sie 'git remote set-head %s %s' aus, um der Änderung zu folgen,\n"
+"oder setzen Sie die Konfiguration 'remote.%s.followRemoteHEAD' auf einen\n"
+"anderen Wert, wenn Sie diese Meldung nicht sehen wollen. Konkret wird diese\n"
+"Warnung mit 'git config set remote.%s.followRemoteHEAD %s' deaktiviert\n"
+"bis die Gegenstelle HEAD in etwas anderes ändert."
+
msgid "multiple branches detected, incompatible with --set-upstream"
msgstr "mehrere Branches erkannt, inkompatibel mit --set-upstream"
@@ -6287,6 +6293,9 @@ msgstr "Refmap"
msgid "specify fetch refmap"
msgstr "Refmap für 'fetch' angeben"
+msgid "revision"
+msgstr "Commit"
+
msgid "report that we have only objects reachable from this object"
msgstr ""
"ausgeben, dass wir nur Objekte haben, die von diesem Objekt aus erreichbar "
@@ -7030,8 +7039,26 @@ msgstr "weder Timer von systemd, noch crontab ist verfügbar"
msgid "%s scheduler is not available"
msgstr "%s Scheduler ist nicht verfügbar"
-msgid "another process is scheduling background maintenance"
-msgstr "ein anderer Prozess plant die Hintergrundwartung"
+#, c-format
+msgid ""
+"unable to create '%s.lock': %s.\n"
+"\n"
+"Another scheduled git-maintenance(1) process seems to be running in this\n"
+"repository. Please make sure no other maintenance processes are running and\n"
+"then try again. If it still fails, a git-maintenance(1) process may have\n"
+"crashed in this repository earlier: remove the file manually to continue."
+msgstr ""
+"Konnte '%s.lock' nicht erstellen: %s.\n"
+"\n"
+"Ein weiterer geplanter git-maintenance(1)-Prozess scheint in diesem\n"
+"Repository zu laufen. Bitte stellen Sie sicher, dass keine anderen\n"
+"Wartungsprozesse laufen und versuchen Sie es dann erneut. Wenn es\n"
+"immer noch fehlschlägt, ist möglicherweise ein git-maintenance(1)-Prozess\n"
+"in diesem Repository abgestürzt: Entfernen Sie die Datei manuell, um\n"
+"fortzufahren."
+
+msgid "cannot acquire lock for scheduled background maintenance"
+msgstr "kann keine Sperre für die geplante Hintergrundwartung erhalten"
msgid "git maintenance start [--scheduler=<scheduler>]"
msgstr "git maintenance start [--scheduler=<Scheduler>]"
@@ -7612,6 +7639,22 @@ msgid_plural "chain length = %d: %lu objects"
msgstr[0] "Länge der Objekt-Liste = %d: %lu Objekt"
msgstr[1] "Länge der Objekt-Liste = %d: %lu Objekte"
+msgid "could not start pack-objects to repack local links"
+msgstr ""
+"konnte pack-objects nicht starten, um lokale Verknüpfungen neu zu packen"
+
+msgid "failed to feed local object to pack-objects"
+msgstr "lokales Objekt konnte nicht an pack-objects übergeben werden"
+
+msgid "index-pack: Expecting full hex object ID lines only from pack-objects."
+msgstr ""
+"index-pack: Erwarte vollständige Hex-Objekt-ID-Zeilen nur von pack-objects."
+
+msgid "could not finish pack-objects to repack local links"
+msgstr ""
+"konnte pack-objects nicht vollständig ausführen, um lokale Verknüpfungen neu "
+"zu packen"
+
msgid "Cannot come back to cwd"
msgstr "Kann nicht zurück zum Arbeitsverzeichnis wechseln"
@@ -7623,6 +7666,9 @@ msgstr "%s ist ungültig"
msgid "unknown hash algorithm '%s'"
msgstr "unbekannter Hash-Algorithmus '%s'"
+msgid "--promisor cannot be used with a pack name"
+msgstr "--promisor kann nicht mit einem Paketnamen verwendet werden"
+
msgid "--stdin requires a git repository"
msgstr "--stdin erfordert ein Git-Repository"
@@ -9003,11 +9049,11 @@ msgstr "git notes [--ref <Notiz-Referenz>] [list [<Objekt>]]"
msgid ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <Notiz-Referenz>] add [-f] [--allow-empty] [--"
"[no-]separator|--separator=<Absatz-Unterbrechung>] [--[no-]stripspace] [-m "
-"<Nachricht> | -F <Datei> | (-c | -C) <Objekt>] [<Objekt>]"
+"<Nachricht> | -F <Datei> | (-c | -C) <Objekt>] [<Objekt>] [-e]"
msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
msgstr ""
@@ -9016,11 +9062,11 @@ msgstr ""
msgid ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <Notiz-Referenz>] append [--allow-empty] [--"
"[no-]separator|--separator=<Absatz-Unterbrechnung>] [--[no-]stripspace] [-m "
-"<Nachricht> | -F <Datei> | (-c | -C) <Objekt>] [<Object>]"
+"<Nachricht> | -F <Datei> | (-c | -C) <Objekt>] [<Objekt>] [-e]"
msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
msgstr "git notes [--ref <Notiz-Referenz>] edit [--allow-empty] [<Objekt>]"
@@ -9142,6 +9188,9 @@ msgstr "Notizinhalte in einer Datei"
msgid "reuse and edit specified note object"
msgstr "Wiederverwendung und Bearbeitung des angegebenen Notiz-Objektes"
+msgid "edit note message in editor"
+msgstr "Notizmeldung im Editor bearbeiten"
+
msgid "reuse specified note object"
msgstr "Wiederverwendung des angegebenen Notiz-Objektes"
@@ -9655,6 +9704,9 @@ msgstr ""
"keine Objekte aus Packdateien von partiell geklonten Remote-Repositories "
"packen"
+msgid "implies --missing=allow-any"
+msgstr "impliziert --missing=allow-any"
+
msgid "respect islands during delta compression"
msgstr "Delta-Islands bei Delta-Kompression beachten"
@@ -11317,6 +11369,30 @@ msgid_plural " Local refs configured for 'git push'%s:"
msgstr[0] " Lokale Referenz konfiguriert für 'git push'%s:"
msgstr[1] " Lokale Referenzen konfiguriert für 'git push'%s:"
+#, c-format
+msgid "'%s/HEAD' is unchanged and points to '%s'\n"
+msgstr "'%s/HEAD' ist unverändert und zeigt auf '%s'\n"
+
+#, c-format
+msgid "'%s/HEAD' has changed from '%s' and now points to '%s'\n"
+msgstr "'%s/HEAD' hat sich von '%s' geändert und zeigt jetzt auf '%s'\n"
+
+#, c-format
+msgid "'%s/HEAD' is now created and points to '%s'\n"
+msgstr "'%s/HEAD' ist nun erstellt und zeigt auf '%s'\n"
+
+#, c-format
+msgid "'%s/HEAD' was detached at '%s' and now points to '%s'\n"
+msgstr "'%s/HEAD' war losgelöst bei '%s' und zeigt nun auf '%s'\n"
+
+#, c-format
+msgid ""
+"'%s/HEAD' used to point to '%s' (which is not a remote branch), but now "
+"points to '%s'\n"
+msgstr ""
+"'%s/HEAD' zeigte vorher auf '%s' (was kein Remote-Branch ist), zeigt jetzt "
+"aber auf '%s'\n"
+
msgid "set refs/remotes/<name>/HEAD according to remote"
msgstr "setzt refs/remotes/<Name>/HEAD gemäß dem Remote-Repository"
@@ -11340,7 +11416,7 @@ msgid "Not a valid ref: %s"
msgstr "keine gültige Referenz: %s"
#, c-format
-msgid "Could not setup %s"
+msgid "Could not set up %s"
msgstr "Konnte %s nicht einrichten"
#, c-format
@@ -14142,6 +14218,9 @@ msgstr ""
"versuchen, eine Übereinstimmung des Branchnamens mit einem\n"
"Remote-Tracking-Branch herzustellen"
+msgid "use relative paths for worktrees"
+msgstr "relative Pfade für Arbeitsverzeichnisse verwenden"
+
#, c-format
msgid "options '%s', '%s', and '%s' cannot be used together"
msgstr ""
@@ -14426,6 +14505,28 @@ msgstr "kann '%s' nicht erstellen"
msgid "index-pack died"
msgstr "Erstellung der Paketindexdatei abgebrochen"
+#, c-format
+msgid "directory '%s' is present in index, but not sparse"
+msgstr "Verzeichnis '%s' ist im Index vorhanden, aber nicht partiell"
+
+msgid "corrupted cache-tree has entries not present in index"
+msgstr ""
+"das beschädigte Cache-Verzeichnis enthält Einträge, die nicht im Index "
+"enthalten sind"
+
+#, c-format
+msgid "%s with flags 0x%x should not be in cache-tree"
+msgstr "%s mit Flags 0x%x sollte nicht im Cache-Verzeichnis sein"
+
+#, c-format
+msgid "bad subtree '%.*s'"
+msgstr "ungültiges Unterverzeichnis '%.*s'"
+
+#, c-format
+msgid "cache-tree for path %.*s does not match. Expected %s got %s"
+msgstr ""
+"Cache-Verzeichnis für Pfad %.*s stimmt nicht überein. Erwartete %s bekam %s"
+
msgid "terminating chunk id appears earlier than expected"
msgstr "abschließende Chunk-ID erscheint eher als erwartet"
@@ -15322,17 +15423,18 @@ msgid ""
"to convert the grafts into replace refs.\n"
"\n"
"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
msgstr ""
"Die Unterstützung für <GIT_DIR>/info/grafts ist veraltet\n"
-"und wird in zukünftigen Git Versionen entfernt.\n"
+"und wird in einer zukünftigen Git-Version entfernt.\n"
"\n"
-"Bitte benutzen Sie \"git replace --convert-graft-file\"\n"
-"zum Konvertieren der künstlichen Vorgänger (\"grafts\")\n"
-"in ersetzende Referenzen.<\n"
+"Bitte verwenden Sie \"git replace --convert-graft-file\"\n"
+"um die künstlichen Vorgänger (\"graft\") in ersetzende Referenzen\n"
+"zu konvertieren.\n"
"\n"
-"Sie können diese Meldung unterdrücken, indem Sie\n"
-"\"git config advice.graftFileDeprecated false\" ausführen."
+"Deaktivieren Sie diese Meldung, indem Sie\n"
+"\"git config set advice.graftFileDeprecated false\"\n"
+"ausführen."
#, c-format
msgid "commit %s exists in commit-graph but not in the object database"
@@ -16166,6 +16268,18 @@ msgstr "URL hat kein Schema: %s"
msgid "credential url cannot be parsed: %s"
msgstr "URL mit Zugangsdaten konnte nicht geparst werden: %s"
+#, c-format
+msgid "invalid timeout '%s', expecting a non-negative integer"
+msgstr "ungültiger timeout '%s', nicht-negative ganze Zahl erwartet"
+
+#, c-format
+msgid "invalid init-timeout '%s', expecting a non-negative integer"
+msgstr "ungültiger init-timeout '%s', nicht-negative ganze Zahl erwartet"
+
+#, c-format
+msgid "invalid max-connections '%s', expecting an integer"
+msgstr "ungültiges max-connections '%s', ganze Zahl erwartet"
+
msgid "in the future"
msgstr "in der Zukunft"
@@ -16896,6 +17010,22 @@ msgstr "ungültiger Git-Namespace-Pfad \"%s\""
msgid "too many args to run %s"
msgstr "zu viele Argumente angegeben, um %s auszuführen"
+#, c-format
+msgid ""
+"You are attempting to fetch %s, which is in the commit graph file but not in "
+"the object database.\n"
+"This is probably due to repo corruption.\n"
+"If you are attempting to repair this repo corruption by refetching the "
+"missing object, use 'git fetch --refetch' with the missing object."
+msgstr ""
+"Sie versuchen %s zu holen, welches sich in der Commit-Graph-Datei, aber "
+"nicht in der Objektdatenbank befindet.\n"
+"Dies ist wahrscheinlich auf eine Beschädigung des Repositories "
+"zurückzuführen.\n"
+"Wenn Sie versuchen, die Beschädigung des Repositories zu beheben, indem Sie "
+"das fehlende Objekt erneut holen,\n"
+"verwenden Sie 'git fetch --refetch' mit dem fehlenden Objekt."
+
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack: erwartete shallow-Liste"
@@ -17329,8 +17459,8 @@ msgid ""
"given pattern contains NULL byte (via -f <file>). This is only supported "
"with -P under PCRE v2"
msgstr ""
-"Angegebenes Muster enthält NULL Byte (über -f <Datei>). Das wird nur mit -"
-"Punter PCRE v2 unterstützt."
+"Angegebenes Muster enthält NULL Byte (über -f <Datei>). Das wird nur mit -P "
+"unter PCRE v2 unterstützt."
#, c-format
msgid "'%s': unable to read %s"
@@ -17483,10 +17613,11 @@ msgstr[1] ""
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
+"You can disable this warning with `git config set advice.ignoredHook false`."
msgstr ""
-"Der '%s' Hook wurde ignoriert, weil er nicht als ausführbar markiert ist.\n"
-"Sie können diese Warnung mit `git config advice.ignoredHook false` "
+"Der '%s'-Hook wurde ignoriert, weil er nicht als ausführbar eingestellt "
+"ist.\n"
+"Sie können diese Warnung mit `git config set advice.ignoredHook false` "
"deaktivieren."
msgid "not a git repository"
@@ -17503,17 +17634,9 @@ msgstr "negativer Wert für http.postBuffer; benutze Standardwert %d"
msgid "Delegation control is not supported with cURL < 7.22.0"
msgstr "Kontrolle über Delegation wird mit cURL < 7.22.0 nicht unterstützt"
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr ""
-"Das Anheften des öffentlichen Schlüssels wird mit cURL < 7.39.0 nicht "
-"unterstützt"
-
msgid "Unknown value for http.proactiveauth"
msgstr "Unbekannter Wert für http.proactiveauth"
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr "CURLSSLOPT_NO_REVOKE wird mit cURL < 7.44.0 nicht unterstützt."
-
#, c-format
msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
msgstr "Nicht unterstütztes SSL-Backend '%s'. Unterstützte SSL-Backends:"
@@ -17701,6 +17824,10 @@ msgid "unable to format message: %s"
msgstr "Meldung kann nicht formatiert werden: %s"
#, c-format
+msgid "invalid marker-size '%s', expecting an integer"
+msgstr "ungültige marker-size '%s', ganze Zahl erwartet"
+
+#, c-format
msgid "Failed to merge submodule %s (not checked out)"
msgstr "Fehler beim Merge von Submodul %s (nicht ausgecheckt)."
@@ -18837,19 +18964,18 @@ msgid ""
"\n"
"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"running \"git config set advice.objectNameWarning false\""
msgstr ""
-"Git erzeugt normalerweise keine Referenzen die mit\n"
-"40 Hex-Zeichen enden, da diese ignoriert werden wenn\n"
-"Sie diese angeben. Diese Referenzen könnten aus Versehen\n"
-"erzeugt worden sein. Zum Beispiel,\n"
+"Git erstellt normalerweise nie eine Referenz, die mit 40-Hex-Zeichen endet,\n"
+"weil sie ignoriert wird, wenn Sie nur 40-Hex-Zeichen angeben. Diese\n"
+"Referenzen können aus Versehen erstellt werden. Zum Beispiel,\n"
"\n"
" git switch -c $br $(git rev-parse ...)\n"
"\n"
-"wobei \"$br\" leer ist und eine 40-Hex-Referenz erzeugt\n"
-"wurde. Bitte prüfen Sie diese Referenzen und löschen\n"
-"Sie sie gegebenenfalls. Unterdrücken Sie diese Meldung\n"
-"indem Sie \"git config advice.objectNameWarning false\"\n"
+"wobei \"$br\" irgendwie leer ist und eine 40-Hex-Referenz erstellt wird.\n"
+"Bitte überprüfen Sie die Referenzen und löschen Sie diese gegebenenfalls.\n"
+"Schalten Sie diese Meldung aus, indem Sie\n"
+"\"git config set advice.objectNameWarning false\"\n"
"ausführen."
#, c-format
@@ -19010,13 +19136,6 @@ msgstr "Multi-Pack-Bitmap fehlt erforderlicher Reverse-Index"
msgid "could not open pack %s"
msgstr "konnte Paket '%s' nicht öffnen"
-msgid "could not determine MIDX preferred pack"
-msgstr "konnte das von MIDX bevorzugte Paket nicht ermitteln"
-
-#, c-format
-msgid "preferred pack (%s) is invalid"
-msgstr "bevorzugtes Paket (%s) ist ungültig"
-
msgid "corrupt bitmap lookup table: triplet position out of index"
msgstr "Bitmap-Lookup-Tabelle beschädigt: Triplet-Position außerhalb des Index"
@@ -20151,18 +20270,26 @@ msgstr "Log für Referenz %s unerwartet bei %s beendet."
msgid "log for %s is empty"
msgstr "Log für %s ist leer."
-msgid "refusing to force and skip creation of reflog"
-msgstr "Erzwingen der Aktion verweigert; überspringe Erstellung des Reflogs"
-
#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr "verweigere Aktualisierung einer Referenz mit fehlerhaftem Namen '%s'"
+msgid "refusing to update reflog for pseudoref '%s'"
+msgstr "Aktualisierung des Reflogs für Pseudoreferenz '%s' verweigert"
#, c-format
msgid "refusing to update pseudoref '%s'"
msgstr "Aktualisierung von Pseudoreferenz '%s' verweigert"
#, c-format
+msgid "refusing to update reflog with bad name '%s'"
+msgstr "Aktualisierung des Reflogs mit fehlerhaftem Namen '%s' verweigert"
+
+#, c-format
+msgid "refusing to update ref with bad name '%s'"
+msgstr "verweigere Aktualisierung einer Referenz mit fehlerhaftem Namen '%s'"
+
+msgid "refusing to force and skip creation of reflog"
+msgstr "Erzwingen der Aktion verweigert; überspringe Erstellung des Reflogs"
+
+#, c-format
msgid "update_ref failed for ref '%s': %s"
msgstr "update_ref für Referenz '%s' fehlgeschlagen: %s"
@@ -20216,6 +20343,10 @@ msgstr ""
"'%s': ist aber eine reguläre Referenz"
#, c-format
+msgid "cannot read ref file '%s'"
+msgstr "kann Ref-Datei '%s' nicht lesen"
+
+#, c-format
msgid "cannot open directory %s"
msgstr "Verzeichnis %s kann nicht geöffnet werden"
@@ -20431,6 +20562,10 @@ msgid "more than one uploadpack given, using the first"
msgstr "Mehr als ein uploadpack-Befehl angegeben, benutze den ersten."
#, c-format
+msgid "unrecognized followRemoteHEAD value '%s' ignored"
+msgstr "nicht erkannter followRemoteHEAD-Wert '%s' ignoriert"
+
+#, c-format
msgid "unrecognized value transfer.credentialsInUrl: '%s'"
msgstr "unbekannter Wert transfer.credentialsInUrl: '%s'"
@@ -22391,6 +22526,9 @@ msgstr "Commit %s ist nicht als erreichbar gekennzeichnet."
msgid "too many commits marked reachable"
msgstr "Zu viele Commits als erreichbar gekennzeichnet."
+msgid "could not determine MIDX preferred pack"
+msgstr "konnte das von MIDX bevorzugte Paket nicht ermitteln"
+
msgid "test-tool serve-v2 [<options>]"
msgstr "test-tool serve-v2 [<Optionen>]"
@@ -23061,6 +23199,9 @@ msgstr ".git-Datei kaputt"
msgid ".git file incorrect"
msgstr ".git-Datei fehlerhaft"
+msgid ".git file absolute/relative path mismatch"
+msgstr "absoluter/relativer Pfad der .git-Datei stimmt nicht überein"
+
msgid "not a valid path"
msgstr "kein gültiger Pfad"
@@ -23077,6 +23218,9 @@ msgstr "Konnte Repository nicht finden; .git-Datei ist kaputt"
msgid "gitdir unreadable"
msgstr "gitdir nicht lesbar"
+msgid "gitdir absolute/relative path mismatch"
+msgstr "absolute/relative Pfadabweichung in gitdir"
+
msgid "gitdir incorrect"
msgstr "gitdir fehlerhaft"
@@ -23111,6 +23255,14 @@ msgstr "konnte %s nicht in '%s' aufheben"
msgid "failed to set extensions.worktreeConfig setting"
msgstr "Einstellung für extensions.worktreeConfig konnte nicht gesetzt werden"
+msgid "unable to upgrade repository format to support relative worktrees"
+msgstr ""
+"Repository-Format konnte nicht aktualisiert werden, um relative "
+"Arbeitsverzeichnisse zu unterstützen"
+
+msgid "unable to set extensions.relativeWorktrees setting"
+msgstr "Einstellung extensions.relativeWorktrees kann nicht gesetzt werden"
+
#, c-format
msgid "could not setenv '%s'"
msgstr "konnte '%s' nicht setzen"
@@ -24038,3 +24190,7 @@ msgstr "Lasse %s mit Backup-Suffix '%s' aus.\n"
#, perl-format
msgid "Do you really want to send %s? [y|N]: "
msgstr "Wollen Sie %s wirklich versenden? [y|N]: "
+
+#, c-format
+#~ msgid "preferred pack (%s) is invalid"
+#~ msgstr "bevorzugtes Paket (%s) ist ungültig"
diff --git a/po/fr.po b/po/fr.po
index 481e1bdc1d..64a75aecf5 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -29,6 +29,7 @@
# to debug | déboguer
# debugging | débogage
# to deflate | compresser
+# directory | répertoire
# email | courriel
# enlistment | enrôlement
# entry | élément
@@ -45,18 +46,23 @@
# hunk | section
# to inflate | décompresser
# to list | afficher
+# loose object | objet esseulé
# mapping | mise en correspondance
# merge | fusion
# pack | paquet
-# patches | patchs
+# patch (v) | appliquer une/des rustine(s)
+# patches | rustines
# pattern | motif
# to prune | élaguer
# to push | pousser
# to rebase | rebaser
# scheduler | planificateur
# trailers | lignes terminales
-# repository | dépôt
+# regex | regex
+# regular |
+# expression | expression régulière
# remote | distante (ou serveur distant)
+# repository | dépôt
# revision | révision
# shallow | superficiel
# shell | interpréteur de commandes
@@ -64,6 +70,7 @@
# split (index) | index scindé
# stash | remisage
# to stash | remiser
+# superproject | super-projet
# tag | étiquette
# template | modèle
# thread | fil
@@ -80,8 +87,8 @@ msgid ""
msgstr ""
"Project-Id-Version: git\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2024-10-02 16:57+0000\n"
-"PO-Revision-Date: 2024-10-04 23:03+0200\n"
+"POT-Creation-Date: 2024-12-23 18:57+0000\n"
+"PO-Revision-Date: 2024-12-29 18:26+0100\n"
"Last-Translator: Cédric Malard <c.malard-git@valdun.net>\n"
"Language-Team: Jean-Noël Avila <jn.avila@free.fr>\n"
"Language: fr\n"
@@ -169,7 +176,7 @@ msgid "No changes.\n"
msgstr "Aucune modification.\n"
msgid "Patch update"
-msgstr "Mise à jour par patch"
+msgstr "Mise à jour par rustine"
msgid "Review diff"
msgstr "Réviser la différence"
@@ -267,7 +274,7 @@ msgid ""
"If the patch applies cleanly, the edited hunk will immediately be marked for "
"staging."
msgstr ""
-"Si le patch s'applique proprement, la section éditée sera immédiatement "
+"Si la rustine s'applique proprement, la section éditée sera immédiatement "
"marquée comme indexée."
msgid ""
@@ -303,7 +310,7 @@ msgid ""
"If the patch applies cleanly, the edited hunk will immediately be marked for "
"stashing."
msgstr ""
-"Si le patch s'applique proprement, la section éditée sera immédiatement "
+"Si la rustine s'applique proprement, la section éditée sera immédiatement "
"marquée comme remisée."
msgid ""
@@ -339,7 +346,7 @@ msgid ""
"If the patch applies cleanly, the edited hunk will immediately be marked for "
"unstaging."
msgstr ""
-"Si le patch s'applique proprement, la section éditée sera immédiatement "
+"Si la rustine s'applique proprement, la section éditée sera immédiatement "
"marquée comme desindexée."
msgid ""
@@ -375,7 +382,7 @@ msgid ""
"If the patch applies cleanly, the edited hunk will immediately be marked for "
"applying."
msgstr ""
-"Si le patch s'applique proprement, la section éditée sera immédiatement "
+"Si la rustine s'applique proprement, la section éditée sera immédiatement "
"marquée comme appliquée."
msgid ""
@@ -411,7 +418,7 @@ msgid ""
"If the patch applies cleanly, the edited hunk will immediately be marked for "
"discarding."
msgstr ""
-"Si le patch s'applique proprement, la section éditée sera immédiatement "
+"Si la rustine s'applique proprement, la section éditée sera immédiatement "
"marquée comme éliminée."
msgid ""
@@ -461,14 +468,14 @@ msgstr ""
#, c-format
msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
msgstr ""
-"Appliquer le changement de mode dans l'index et l'arbre de travail [y,n,q,a,"
-"d%s,?] ? "
+"Appliquer le changement de mode dans l'index et l'arbre de travail "
+"[y,n,q,a,d%s,?] ? "
#, c-format
msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
msgstr ""
-"Appliquer la suppression dans l'index et l'arbre de travail [y,n,q,a,"
-"d%s,?] ? "
+"Appliquer la suppression dans l'index et l'arbre de travail "
+"[y,n,q,a,d%s,?] ? "
#, c-format
msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
@@ -710,10 +717,10 @@ msgstr "Seuls des fichiers binaires ont changé."
#, c-format
msgid ""
"\n"
-"Disable this message with \"git config advice.%s false\""
+"Disable this message with \"git config set advice.%s false\""
msgstr ""
"\n"
-"Désactivez ce message avec \"git config advice.%s false\""
+"Désactivez ce message avec \"git config set advice.%s false\""
#, c-format
msgid "%shint:%s%.*s%s\n"
@@ -837,8 +844,8 @@ msgstr ""
"\n"
" git switch -\n"
"\n"
-"Désactivez ce conseil en renseignant la variable de configuration advice."
-"detachedHead à false\n"
+"Désactivez ce conseil en renseignant la variable de configuration "
+"advice.detachedHead à false\n"
"\n"
#, c-format
@@ -893,7 +900,7 @@ msgstr "la rustine est trop grosse"
#, c-format
msgid "Cannot prepare timestamp regexp %s"
-msgstr "Impossible de préparer la regexp d'horodatage %s"
+msgstr "Impossible de préparer la regex d'horodatage %s"
#, c-format
msgid "regexec returned %d for input: %s"
@@ -901,7 +908,7 @@ msgstr "regexec a retourné %d pour l'entrée : %s"
#, c-format
msgid "unable to find filename in patch at line %d"
-msgstr "nom de fichier du patch introuvable à la ligne %d"
+msgstr "nom de fichier de la rustine introuvable à la ligne %d"
#, c-format
msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
@@ -912,14 +919,14 @@ msgstr ""
#, c-format
msgid "git apply: bad git-diff - inconsistent new filename on line %d"
msgstr ""
-"git apply : mauvais format de git-diff - nouveau nom de fichier inconsistant "
-"à la ligne %d"
+"git apply : mauvais format de git-diff - nouveau nom de fichier incohérent à "
+"la ligne %d"
#, c-format
msgid "git apply: bad git-diff - inconsistent old filename on line %d"
msgstr ""
-"git apply : mauvais format de git-diff - ancien nom de fichier inconsistant "
-"à la ligne %d"
+"git apply : mauvais format de git-diff - ancien nom de fichier incohérent à "
+"la ligne %d"
#, c-format
msgid "git apply: bad git-diff - expected /dev/null on line %d"
@@ -959,7 +966,7 @@ msgstr "recomptage : ligne inattendue : %.*s"
#, c-format
msgid "patch fragment without header at line %d: %.*s"
-msgstr "fragment de patch sans en-tête à la ligne %d : %.*s"
+msgstr "fragment de rustine sans en-tête à la ligne %d : %.*s"
msgid "new file depends on old contents"
msgstr "le nouveau fichier dépend de contenus anciens"
@@ -969,7 +976,7 @@ msgstr "le fichier supprimé a encore du contenu"
#, c-format
msgid "corrupt patch at line %d"
-msgstr "patch corrompu à la ligne %d"
+msgstr "rustine corrompue à la ligne %d"
#, c-format
msgid "new file %s depends on old contents"
@@ -985,15 +992,15 @@ msgstr "** attention : le fichier %s devient vide mais n'est pas supprimé"
#, c-format
msgid "corrupt binary patch at line %d: %.*s"
-msgstr "patch binaire corrompu à la ligne %d : %.*s"
+msgstr "rustine binaire corrompue à la ligne %d : %.*s"
#, c-format
msgid "unrecognized binary patch at line %d"
-msgstr "patch binaire non reconnu à la ligne %d"
+msgstr "rustine binaire non reconnue à la ligne %d"
#, c-format
msgid "patch with only garbage at line %d"
-msgstr "patch totalement incompréhensible à la ligne %d"
+msgstr "rustine totalement incompréhensible à la ligne %d"
#, c-format
msgid "unable to read symlink %s"
@@ -1027,28 +1034,30 @@ msgstr ""
#, c-format
msgid "missing binary patch data for '%s'"
-msgstr "données de patch binaire manquantes pour '%s'"
+msgstr "données de rustine binaire manquantes pour '%s'"
#, c-format
msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
msgstr ""
-"impossible d'appliquer l'inverse d'un patch binaire à '%s' sans la section "
-"inverse"
+"impossible d'appliquer l'inverse d'une rustine binaire à '%s' sans la "
+"section inverse"
#, c-format
msgid "cannot apply binary patch to '%s' without full index line"
msgstr ""
-"impossible d'appliquer un patch binaire à '%s' sans la ligne complète d'index"
+"impossible d'appliquer une rustine binaire à '%s' sans la ligne complète "
+"d'index"
#, c-format
msgid ""
"the patch applies to '%s' (%s), which does not match the current contents."
msgstr ""
-"le patch s'applique à '%s' (%s), ce qui ne correspond pas au contenu actuel."
+"la rustine s'applique à '%s' (%s), ce qui ne correspond pas au contenu "
+"actuel."
#, c-format
msgid "the patch applies to an empty '%s' but it is not empty"
-msgstr "le patch s'applique à un '%s' vide mais ce n'est pas vide"
+msgstr "la rustine s'applique à un '%s' vide mais ce n'est pas vide"
#, c-format
msgid "the necessary postimage %s for '%s' cannot be read"
@@ -1056,17 +1065,17 @@ msgstr "l'image postérieure nécessaire %s pour '%s' ne peut pas être lue"
#, c-format
msgid "binary patch does not apply to '%s'"
-msgstr "le patch binaire ne s'applique par correctement à '%s'"
+msgstr "la rustine binaire ne s'applique par correctement à '%s'"
#, c-format
msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
msgstr ""
-"le patch binaire sur '%s' crée un résultat incorrect (%s attendu, mais %s "
+"la rustine binaire sur '%s' crée un résultat incorrect (%s attendu, mais %s "
"trouvé)"
#, c-format
msgid "patch failed: %s:%ld"
-msgstr "le patch a échoué : %s:%ld"
+msgstr "l'application de la rustine a échoué : %s:%ld"
#, c-format
msgid "cannot checkout %s"
@@ -1110,18 +1119,18 @@ msgstr "Échec de l'application de la fusion à 3 points…\n"
#, c-format
msgid "Applied patch to '%s' with conflicts.\n"
-msgstr "Patch %s appliqué avec des conflits.\n"
+msgstr "Rustine %s appliquée avec des conflits.\n"
#, c-format
msgid "Applied patch to '%s' cleanly.\n"
-msgstr "Patch %s appliqué proprement.\n"
+msgstr "Rustine %s appliquée proprement.\n"
#, c-format
msgid "Falling back to direct application...\n"
msgstr "Retour à une application directe…\n"
msgid "removal patch leaves file contents"
-msgstr "le patch de suppression laisse un contenu dans le fichier"
+msgstr "la rustine de suppression laisse un contenu dans le fichier"
#, c-format
msgid "%s: wrong type"
@@ -1158,11 +1167,11 @@ msgstr "le fichier affecté '%s' est au-delà d'un lien symbolique"
#, c-format
msgid "%s: patch does not apply"
-msgstr "%s : le patch ne s'applique pas"
+msgstr "%s : la rustine ne s'applique pas"
#, c-format
msgid "Checking patch %s..."
-msgstr "Vérification du patch %s..."
+msgstr "Vérification de la rustine %s..."
#, c-format
msgid "sha1 information is lacking or useless for submodule %s"
@@ -1191,7 +1200,7 @@ msgstr "suppression de %s dans l'index impossible"
#, c-format
msgid "corrupt patch for submodule %s"
-msgstr "patch corrompu pour le sous-module %s"
+msgstr "rustine corrompue pour le sous-module %s"
#, c-format
msgid "unable to stat newly created file '%s'"
@@ -1221,7 +1230,7 @@ msgstr "écriture du fichier '%s' mode %o impossible"
#, c-format
msgid "Applied patch %s cleanly."
-msgstr "Patch %s appliqué proprement."
+msgstr "Rustine %s appliquée proprement."
msgid "internal error"
msgstr "erreur interne"
@@ -1229,8 +1238,8 @@ msgstr "erreur interne"
#, c-format
msgid "Applying patch %%s with %d reject..."
msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Application du patch %%s avec %d rejet..."
-msgstr[1] "Application du patch %%s avec %d rejets..."
+msgstr[0] "Application de la rustine %%s avec %d rejet..."
+msgstr[1] "Application de la rustine %%s avec %d rejets..."
#, c-format
msgid "cannot open %s"
@@ -1260,7 +1269,7 @@ msgstr "lecture du fichier d'index impossible"
#, c-format
msgid "can't open patch '%s': %s"
-msgstr "ouverture impossible du patch '%s' :%s"
+msgstr "ouverture impossible de la rustine '%s' :%s"
#, c-format
msgid "squelched %d whitespace error"
@@ -1296,35 +1305,35 @@ msgid "remove <num> leading slashes from traditional diff paths"
msgstr "supprimer <num> barres obliques des chemins traditionnels de diff"
msgid "ignore additions made by the patch"
-msgstr "ignorer les additions réalisées par le patch"
+msgstr "ignorer les additions réalisées par la rustine"
msgid "instead of applying the patch, output diffstat for the input"
-msgstr "au lieu d'appliquer le patch, afficher le diffstat de l'entrée"
+msgstr "au lieu d'appliquer la rustine, afficher le diffstat de l'entrée"
msgid "show number of added and deleted lines in decimal notation"
msgstr ""
"afficher le nombre de lignes ajoutées et supprimées en notation décimale"
msgid "instead of applying the patch, output a summary for the input"
-msgstr "au lieu d'appliquer le patch, afficher un résumé de l'entrée"
+msgstr "au lieu d'appliquer la rustine, afficher un résumé de l'entrée"
msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "au lieu d'appliquer le patch, voir si le patch est applicable"
+msgstr "au lieu d'appliquer la rustine, voir si la rustine est applicable"
msgid "make sure the patch is applicable to the current index"
-msgstr "s'assurer que le patch est applicable sur l'index actuel"
+msgstr "s'assurer que la rustine est applicable sur l'index actuel"
msgid "mark new files with `git add --intent-to-add`"
msgstr "marquer les nouveaux fichiers `git add --intent-to-add`"
msgid "apply a patch without touching the working tree"
-msgstr "appliquer les patch sans toucher à la copie de travail"
+msgstr "appliquer les rustines sans toucher à la copie de travail"
msgid "accept a patch that touches outside the working area"
-msgstr "accepter un patch qui touche hors de la copie de travail"
+msgstr "accepter une rustine qui touche hors de la copie de travail"
msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "appliquer aussi le patch (à utiliser avec --stat/--summary/--check)"
+msgstr "appliquer aussi la rustine (à utiliser avec --stat/--summary/--check)"
msgid "attempt three-way merge, fall back on normal patch if that fails"
msgstr ""
@@ -1361,7 +1370,7 @@ msgid "ignore changes in whitespace when finding context"
msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
msgid "apply the patch in reverse"
-msgstr "appliquer le patch en sens inverse"
+msgstr "appliquer la rustine en sens inverse"
msgid "don't expect at least one line of context"
msgstr "ne pas s'attendre à au moins une ligne de contexte"
@@ -1465,8 +1474,9 @@ msgstr "nom d'objet invalide : %s"
msgid "not a tree object: %s"
msgstr "objet arbre invalide : %s"
-msgid "unable to checkout working tree"
-msgstr "impossible d'extraire la copie de travail"
+#, c-format
+msgid "failed to unpack tree object %s"
+msgstr "échec du dépaquetage de l'objet arbre %s"
#, c-format
msgid "File not found: %s"
@@ -1923,7 +1933,7 @@ msgid "could not read the index"
msgstr "impossible de lire l'index"
msgid "editing patch failed"
-msgstr "échec de l'édition du patch"
+msgstr "échec de l'édition de la rustine"
#, c-format
msgid "could not stat '%s'"
@@ -2031,7 +2041,7 @@ msgid "adding embedded git repository: %s"
msgstr "dépôt git embarqué ajouté : %s"
msgid "Use -f if you really want to add them."
-msgstr "Utilisez -f si vous voulez vraiment les ajouter<."
+msgstr "Utilisez -f si vous voulez vraiment les ajouter."
msgid "adding files failed"
msgstr "échec de l'ajout de fichiers"
@@ -2103,10 +2113,10 @@ msgstr "impossible d'ouvrir '%s' en écriture"
#, c-format
msgid "could not parse patch '%s'"
-msgstr "impossible d'analyser le patch '%s'"
+msgstr "impossible d'analyser la rustine '%s'"
msgid "Only one StGIT patch series can be applied at once"
-msgstr "Seulement une série de patchs StGIT peut être appliquée à la fois"
+msgstr "Seulement une série de rustines StGIT peut être appliquée à la fois"
msgid "invalid timestamp"
msgstr "horodatage invalide"
@@ -2118,14 +2128,14 @@ msgid "invalid timezone offset"
msgstr "décalage horaire invalide"
msgid "Patch format detection failed."
-msgstr "Échec de détection du format du patch."
+msgstr "Échec de détection du format de la rustine."
#, c-format
msgid "failed to create directory '%s'"
msgstr "échec de la création du répertoire '%s'"
msgid "Failed to split patches."
-msgstr "Échec de découpage des patchs."
+msgstr "Échec de découpage des rustines."
#, c-format
msgid "When you have resolved this problem, run \"%s --continue\".\n"
@@ -2145,8 +2155,8 @@ msgstr ""
#, c-format
msgid "To restore the original branch and stop patching, run \"%s --abort\"."
msgstr ""
-"Pour restaurer la branche originale et arrêter de patcher, lancez \"%s --"
-"abort\"."
+"Pour restaurer la branche originale et arrêter d'appliquer des rustines, "
+"lancez \"%s --abort\"."
msgid "Patch sent with format=flowed; space at the end of lines might be lost."
msgstr ""
@@ -2178,11 +2188,11 @@ msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
msgstr ""
-"Avez-vous édité le patch à la main ?\n"
+"Avez-vous édité la rustine à la main ?\n"
"Il ne s'applique pas aux blobs enregistrés dans son index."
msgid "Falling back to patching base and 3-way merge..."
-msgstr "Retour à un patch de la base et fusion à 3 points..."
+msgstr "Retour à une rustine de la base et fusion à 3 points..."
msgid "Failed to merge in the changes."
msgstr "Échec d'intégration des modifications."
@@ -2216,7 +2226,7 @@ msgstr "impossible d'écrire le fichier d'index"
#, c-format
msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Index sale : impossible d'appliquer des patchs (sales : %s)"
+msgstr "Index sale : impossible d'appliquer des rustines (sales : %s)"
#, c-format
msgid "Skipping: %.*s"
@@ -2227,7 +2237,7 @@ msgid "Creating an empty commit: %.*s"
msgstr "Création d'un commit vide : %.*s"
msgid "Patch is empty."
-msgstr "Le patch actuel est vide."
+msgstr "La rustine actuelle est vide."
#, c-format
msgid "Applying: %.*s"
@@ -2242,7 +2252,8 @@ msgstr "l'application de la rustine a échoué à %s %.*s"
msgid "Use 'git am --show-current-patch=diff' to see the failed patch"
msgstr ""
-"Utilisez 'git am --show-current-patch=diff' pour visualiser le patch en échec"
+"Utilisez 'git am --show-current-patch=diff' pour visualiser la rustine en "
+"échec"
msgid "No changes - recorded it as an empty commit."
msgstr "aucune modification - enregistré comme un commit vide."
@@ -2254,8 +2265,8 @@ msgid ""
msgstr ""
"Aucun changement - avez-vous oublié d'utiliser 'git add' ?\n"
"S'il n'y a plus rien à indexer, il se peut qu'autre chose ait déjà\n"
-"introduit les mêmes changements ; vous pourriez avoir envie de sauter ce "
-"patch."
+"introduit les mêmes changements ; vous pourriez avoir envie de sauter cette "
+"rustine."
msgid ""
"You still have unmerged paths in your index.\n"
@@ -2342,28 +2353,30 @@ msgid "format"
msgstr "format"
msgid "format the patch(es) are in"
-msgstr "format de présentation des patchs"
+msgstr "format de présentation des rustines"
msgid "override error message when patch failure occurs"
-msgstr "surcharger le message d'erreur lors d'un échec d'application de patch"
+msgstr ""
+"surcharger le message d'erreur lors d'un échec d'application d'une rustine"
msgid "continue applying patches after resolving a conflict"
-msgstr "continuer à appliquer les patchs après résolution d'un conflit"
+msgstr "continuer à appliquer les rustines après résolution d'un conflit"
msgid "synonyms for --continue"
msgstr "synonymes de --continue"
msgid "skip the current patch"
-msgstr "sauter le patch courant"
+msgstr "sauter la rustine courante"
msgid "restore the original branch and abort the patching operation"
-msgstr "restaurer la branche originale et abandonner les applications de patch"
+msgstr ""
+"restaurer la branche originale et abandonner les applications de rustines"
msgid "abort the patching operation but keep HEAD where it is"
-msgstr "abandonne l'opération de patch mais garde HEAD où il est"
+msgstr "abandonne l'opération de rustine mais garde HEAD où il est"
msgid "show the patch being applied"
-msgstr "afficher le patch en cours d'application"
+msgstr "afficher la rustine en cours d'application"
msgid "try to apply current patch again"
msgstr "essayer d'appliquer de nouveau la rustine"
@@ -3126,11 +3139,11 @@ msgid "HEAD not found below refs/heads!"
msgstr "HEAD non trouvée sous refs/heads !"
msgid ""
-"branch with --recurse-submodules can only be used if submodule."
-"propagateBranches is enabled"
+"branch with --recurse-submodules can only be used if "
+"submodule.propagateBranches is enabled"
msgstr ""
-"brancher avec --recurse-submodules ne peut être utilisé que si submodule."
-"propagateBranches est activé"
+"brancher avec --recurse-submodules ne peut être utilisé que si "
+"submodule.propagateBranches est activé"
msgid "--recurse-submodules can only be used to create branches"
msgstr "--recurse-submodules ne peut être utilisé que pour créer des branches"
@@ -3992,9 +4005,8 @@ msgstr "nouvelle branche non née"
msgid "update ignored files (default)"
msgstr "mettre à jour les fichiers ignorés (par défaut)"
-msgid "do not check if another worktree is holding the given ref"
-msgstr ""
-"ne pas vérifier si une autre copie de travail contient le référence fournie"
+msgid "do not check if another worktree is using this branch"
+msgstr "ne pas vérifier si une autre copie-de-travail utilise cette branche"
msgid "checkout our version for unmerged files"
msgstr "extraire notre version pour les fichiers non fusionnés"
@@ -4297,12 +4309,11 @@ msgstr "créer un clone superficiel de cette profondeur"
msgid "create a shallow clone since a specific time"
msgstr "créer un clone superficiel depuis une date spécifique"
-msgid "revision"
-msgstr "révision"
+msgid "ref"
+msgstr "ref"
-msgid "deepen history of shallow clone, excluding rev"
-msgstr ""
-"approfondir l'historique d'un clone superficiel en excluant une révision"
+msgid "deepen history of shallow clone, excluding ref"
+msgstr "approfondit l'historique d'un clone superficiel en excluant une ref"
msgid "clone only one branch, HEAD or --branch"
msgstr "cloner seulement une branche, HEAD ou --branch"
@@ -4386,7 +4397,7 @@ msgstr "échec pour délier '%s'"
#, c-format
msgid "hardlink cannot be checked at '%s'"
-msgstr "le lien dur ne peut pas être vérifier à '%s'"
+msgstr "le lien dur ne peut pas être vérifié à '%s'"
#, c-format
msgid "hardlink different from source at '%s'"
@@ -4436,6 +4447,9 @@ msgstr ""
"la HEAD distante réfère à une référence non existante, impossible de "
"l'extraire"
+msgid "unable to checkout working tree"
+msgstr "impossible d'extraire la copie de travail"
+
msgid "unable to write parameters to config file"
msgstr "impossible d'écrire les paramètres dans le fichier de configuration"
@@ -5255,10 +5269,10 @@ msgstr ""
msgid ""
"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
-"<name> <value>"
+"<name>"
msgstr ""
"git config unset [<option-de-fichier>] [--all] [--value=<valeur>] [--fixed-"
-"value] <nom> <valeur>"
+"value] <nom>"
msgid "git config rename-section [<file-option>] <old-name> <new-name>"
msgstr ""
@@ -5486,7 +5500,7 @@ msgid "value"
msgstr "valeur"
msgid "use default value when missing entry"
-msgstr "utiliser le valeur par défaut quand l'entrée n'existe pas"
+msgstr "utiliser la valeur par défaut quand l'entrée n'existe pas"
msgid "--fixed-value only applies with 'value-pattern'"
msgstr "--fixed-value ne s'applique qu'à 'motif-de-valeur'"
@@ -5523,7 +5537,7 @@ msgid ""
" Use a regexp, --add or --replace-all to change %s."
msgstr ""
"impossible de surcharger des valeurs multiples avec une seule valeur\n"
-" Utilisez une regexp, --add ou --replace-all pour modifier %s."
+" Utilisez une regex, --add ou --replace-all pour modifier %s."
#, c-format
msgid "no such section: %s"
@@ -5549,7 +5563,7 @@ msgid "get all values: key [<value-pattern>]"
msgstr "obtenir toutes les valeurs : clé [<motif-de-valeur>]"
msgid "get values for regexp: name-regex [<value-pattern>]"
-msgstr "obtenir les valeur pour la regexp : name-regex [<motif-de-valeur>]"
+msgstr "obtenir les valeurs pour la regex : name-regex [<motif-de-valeur>]"
msgid "get value specific for the URL: section[.var] URL"
msgstr "obtenir la valeur spécifique pour l'URL : section[.var] URL"
@@ -5586,7 +5600,7 @@ msgid "find the color setting: slot [<stdout-is-tty>]"
msgstr "trouver le réglage de la couleur : slot [<stdout-est-tty>]"
msgid "with --get, use default value when missing entry"
-msgstr "avec --get, utiliser le valeur par défaut quand l'entrée n'existe pas"
+msgstr "avec --get, utiliser la valeur par défaut quand l'entrée n'existe pas"
msgid "--get-color and variable type are incoherent"
msgstr "--get-color et le type de la variable sont incohérents"
@@ -5623,7 +5637,7 @@ msgstr ""
"Les permissions de votre répertoire de socket sont trop permissives ;\n"
"les autres utilisateurs pourraient lire vos identifiants secrets. Lancez :\n"
"\n"
-" chmod 0700 %s"
+"\tchmod 0700 %s"
msgid "print debugging messages to stderr"
msgstr "afficher les messages de debug sur stderr"
@@ -5704,13 +5718,8 @@ msgid "traversed %lu commits\n"
msgstr "%lu commits parcourus\n"
#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"plus de %i étiquettes ont été trouvées; seules les %i plus récentes sont "
-"affichées\n"
-"abandon de la recherche à %s\n"
+msgid "found %i tags; gave up search at %s\n"
+msgstr "%i étiquettes trouvées ; recherche abandonnée à %s\n"
#, c-format
msgid "describe %s\n"
@@ -6154,6 +6163,20 @@ msgstr "%s n'est pas un objet valide"
msgid "the object %s does not exist"
msgstr "l'objet %s n'existe pas"
+#, c-format
+msgid ""
+"Run 'git remote set-head %s %s' to follow the change, or set\n"
+"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
+"if you do not want to see this message. Specifically running\n"
+"'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
+"until the remote changes HEAD to something else."
+msgstr ""
+"Lancez 'git remote set-head %s %s' pour suivre la modification, ou\n"
+"réglez l'option de configuration 'remote.%s.followRemoteHEAD' à une\n"
+"valeur différente si vous ne souhaitez pas voir ce message. Lancer\n"
+"spécifiquement 'git config set remote.%s.followRemoteHEAD %s'\n"
+"va désactiver l'alerte jusqu'à ce que le distant change HEAD."
+
msgid "multiple branches detected, incompatible with --set-upstream"
msgstr "branches multiples détectées, imcompatible avec --set-upstream"
@@ -6294,6 +6317,9 @@ msgstr "correspondance de référence"
msgid "specify fetch refmap"
msgstr "spécifier une correspondance de référence pour la récupération"
+msgid "revision"
+msgstr "révision"
+
msgid "report that we have only objects reachable from this object"
msgstr "rapporte que nous n'avons que des objets joignables depuis cet objet"
@@ -6351,8 +6377,8 @@ msgid "protocol does not support --negotiate-only, exiting"
msgstr "Le protocole ne prend pas en charge --negotiate-only, abandon"
msgid ""
-"--filter can only be used with the remote configured in extensions."
-"partialclone"
+"--filter can only be used with the remote configured in "
+"extensions.partialclone"
msgstr ""
"--filter ne peut être utilisé qu'avec le dépôt distant configuré dans "
"extensions.partialclone"
@@ -6450,7 +6476,7 @@ msgid "config key storing a list of repository paths"
msgstr "clé de config qui stocke la liste des chemins de dépôts"
msgid "keep going even if command fails in a repository"
-msgstr "continuer mêm si la commande échoue dans un dépôt"
+msgstr "continuer même si la commande échoue dans un dépôt"
msgid "missing --config=<config>"
msgstr "--config=<config> manquant"
@@ -6665,7 +6691,7 @@ msgid "check only connectivity"
msgstr "ne vérifier que la connectivité"
msgid "enable more strict checking"
-msgstr "activer une vérification plus strict"
+msgstr "activer une vérification plus stricte"
msgid "write dangling objects in .git/lost-found"
msgstr "écrire les objets en suspens dans .git/lost-found"
@@ -6866,7 +6892,7 @@ msgstr ""
msgid ""
"There are too many unreachable loose objects; run 'git prune' to remove them."
msgstr ""
-"Il y a trop d'objets seuls inaccessibles ; lancez 'git prune' pour les "
+"Il y a trop d'objets esseulés inaccessibles ; lancez 'git prune' pour les "
"supprimer."
msgid ""
@@ -7027,9 +7053,27 @@ msgstr "ni les minuteurs systemd ni crontab ne sont disponibles"
msgid "%s scheduler is not available"
msgstr "le planificateur %s n'est pas disponible"
-msgid "another process is scheduling background maintenance"
+#, c-format
+msgid ""
+"unable to create '%s.lock': %s.\n"
+"\n"
+"Another scheduled git-maintenance(1) process seems to be running in this\n"
+"repository. Please make sure no other maintenance processes are running and\n"
+"then try again. If it still fails, a git-maintenance(1) process may have\n"
+"crashed in this repository earlier: remove the file manually to continue."
+msgstr ""
+"impossible de créer '%s.lock' : %s.\n"
+"\n"
+"Il semble qu'un processus git-maintenance(1) programmé est déjà lancé dans\n"
+"ce dépôt. Veuillez vous assurer qu'aucun processus de maintenance n'est "
+"lancé\n"
+"et réessayez. Si l'échec persiste, un processus git-maintenance(1) peut "
+"avoir\n"
+"planté dans ce dépôt : supprimez le fichier manuellement pour poursuivre."
+
+msgid "cannot acquire lock for scheduled background maintenance"
msgstr ""
-"un autre processus est en train de programmer une maintenance en tâche de "
+"impossible d'acquérir le verrou pour une maintenance programmée en tâche de "
"fond"
msgid "git maintenance start [--scheduler=<scheduler>]"
@@ -7610,6 +7654,22 @@ msgid_plural "chain length = %d: %lu objects"
msgstr[0] "longueur chaînée = %d : %lu objet"
msgstr[1] "longueur chaînée = %d : %lu objets"
+msgid "could not start pack-objects to repack local links"
+msgstr ""
+"impossible de démarrer pack-objects pour ré-empaqueter les liens locaux"
+
+msgid "failed to feed local object to pack-objects"
+msgstr "échéc de la fourniture les objets locaux à pack-objects"
+
+msgid "index-pack: Expecting full hex object ID lines only from pack-objects."
+msgstr ""
+"index-pack : attente de lignes d'Id d'objets en hexa complet seulement "
+"depuis les objects de paquet."
+
+msgid "could not finish pack-objects to repack local links"
+msgstr ""
+"impossible de terminer pack-objects pour ré-empaqueter les objets locaux"
+
msgid "Cannot come back to cwd"
msgstr "Impossible de revenir au répertoire de travail courant"
@@ -7621,6 +7681,9 @@ msgstr "mauvais %s"
msgid "unknown hash algorithm '%s'"
msgstr "algorithme d'empreinte inconnu '%s'"
+msgid "--promisor cannot be used with a pack name"
+msgstr "--promisor ne peut pas être utilisé avec un nom de paquet"
+
msgid "--stdin requires a git repository"
msgstr "--stdin requiert un dépôt git"
@@ -7890,7 +7953,7 @@ msgid "base commit shouldn't be in revision list"
msgstr "le commit de base ne devrait pas faire partie de la liste de révisions"
msgid "cannot get patch id"
-msgstr "impossible d'obtenir l'id du patch"
+msgstr "impossible d'obtenir l'id de la rustine"
msgid "failed to infer range-diff origin of current series"
msgstr ""
@@ -7903,13 +7966,13 @@ msgstr ""
"utilisation de '%s' comme une différence d'intervalle pour la série actuelle"
msgid "use [PATCH n/m] even with a single patch"
-msgstr "utiliser [PATCH n/m] même avec un patch unique"
+msgstr "utiliser [PATCH n/m] même avec une rustine unique"
msgid "use [PATCH] even with multiple patches"
-msgstr "utiliser [PATCH] même avec des patchs multiples"
+msgstr "utiliser [PATCH] même avec des rustines multiples"
msgid "print patches to standard out"
-msgstr "afficher les patchs sur la sortie standard"
+msgstr "afficher les rustines sur la sortie standard"
msgid "generate a cover letter"
msgstr "générer une lettre de motivation"
@@ -7925,7 +7988,7 @@ msgid "use <sfx> instead of '.patch'"
msgstr "utiliser <sfx> au lieu de '.patch'"
msgid "start numbering patches at <n> instead of 1"
-msgstr "démarrer la numérotation des patchs à <n> au lieu de 1"
+msgstr "démarrer la numérotation des rustines à <n> au lieu de 1"
msgid "reroll-count"
msgstr "reroll-count"
@@ -7969,10 +8032,10 @@ msgid "output all-zero hash in From header"
msgstr "écrire une empreinte à zéro dans l'entête From"
msgid "don't include a patch matching a commit upstream"
-msgstr "ne pas inclure un patch correspondant à un commit amont"
+msgstr "ne pas inclure de rustine correspondant à un commit amont"
msgid "show patch format instead of default (patch + stat)"
-msgstr "afficher le format du patch au lieu du défaut (patch + stat)"
+msgstr "afficher le format de la rustine au lieu du défaut (rustine + stat)"
msgid "Messaging"
msgstr "Communication"
@@ -8009,10 +8072,10 @@ msgid "boundary"
msgstr "limite"
msgid "attach the patch"
-msgstr "attacher le patch"
+msgstr "attacher la rustine"
msgid "inline the patch"
-msgstr "patch à l'intérieur"
+msgstr "incorporer la rustine à l'intérieur"
msgid "enable message threading, styles: shallow, deep"
msgstr ""
@@ -8028,17 +8091,17 @@ msgid "base-commit"
msgstr "commit-de-base"
msgid "add prerequisite tree info to the patch series"
-msgstr "ajouter un arbre prérequis à la série de patchs"
+msgstr "ajouter un arbre prérequis à la série de rustines"
msgid "add a signature from a file"
msgstr "ajouter une signature depuis un fichier"
msgid "don't print the patch filenames"
-msgstr "ne pas afficher les noms de fichiers des patchs"
+msgstr "ne pas afficher les noms de fichiers des rustines"
msgid "show progress while generating patches"
msgstr ""
-"afficher la barre de progression durant la phase de génération des patchs"
+"afficher la barre de progression durant la phase de génération des rustines"
msgid "show changes against <rev> in cover letter or single patch"
msgstr ""
@@ -8103,7 +8166,7 @@ msgid "unable to read signature file '%s'"
msgstr "lecture du fichier de signature '%s' impossible"
msgid "Generating patches"
-msgstr "Génération des patchs"
+msgstr "Génération des rustines"
msgid "failed to create output files"
msgstr "échec de création des fichiers en sortie"
@@ -8221,7 +8284,7 @@ msgid ""
" [-q | --quiet] [--exit-code] [--get-url] [--sort=<key>]\n"
" [--symref] [<repository> [<patterns>...]]"
msgstr ""
-"git ls-remote [--brances] [--tags] [--refs] [--upload-pack=<exec>]\n"
+"git ls-remote [--branches] [--tags] [--refs] [--upload-pack=<exec>]\n"
" [-q | --quiet] [--exit-code] [--get-url] [--sort=<clé>]\n"
" [--symref] [<dépôt> [<motif>...]]"
@@ -9007,11 +9070,11 @@ msgstr "git notes [--ref <références-notes>] [list [<object>]]"
msgid ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <référence-notes>] add [-f] [--allow-empty] [--"
"[no-]separator|--separator=<coupure-paragraphe>] [--[no-]stripspace] [-m "
-"<message> | -F <fichier> | (-c | -C) <objet>] [<objet>]"
+"<message> | -F <fichier> | (-c | -C) <objet>] [<objet>] [-e]"
msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
msgstr ""
@@ -9020,11 +9083,11 @@ msgstr ""
msgid ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <références-notes>] append [--allow-empty] [--"
"[no-]separator|--separator=<coupure-paragraphe>] [--[no-]stripspace]-m "
-"<message> | -F <fichier> | (-c | -C) <objet>] [<objet>]"
+"<message> | -F <fichier> | (-c | -C) <objet>] [<objet>] [-e]"
msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
msgstr "git notes [--ref <références-notes>] edit [--allow-empty] [<objet>]"
@@ -9143,6 +9206,9 @@ msgstr "contenu de la note dans un fichier"
msgid "reuse and edit specified note object"
msgstr "réutiliser et éditer l'objet de note spécifié"
+msgid "edit note message in editor"
+msgstr "éditer le message de node dans un éditeur"
+
msgid "reuse specified note object"
msgstr "réutiliser l'objet de note spécifié"
@@ -9652,6 +9718,9 @@ msgstr "gestion des objets manquants"
msgid "do not pack objects in promisor packfiles"
msgstr "ne pas empaqueter les objets dans les fichiers paquets prometteurs"
+msgid "implies --missing=allow-any"
+msgstr "implique --missing=allow-any"
+
msgid "respect islands during delta compression"
msgstr "respecter les îlots pendant la compression des deltas"
@@ -10064,8 +10133,8 @@ msgstr ""
msgid ""
"You didn't specify any refspecs to push, and push.default is \"nothing\"."
msgstr ""
-"Vous n'avez pas spécifié de spécifications de référence à pousser, et push."
-"default est \"nothing\"."
+"Vous n'avez pas spécifié de spécifications de référence à pousser, et "
+"push.default est \"nothing\"."
#, c-format
msgid ""
@@ -10548,7 +10617,7 @@ msgid "continue"
msgstr "continuer"
msgid "skip current patch and continue"
-msgstr "sauter le patch courant et continuer"
+msgstr "sauter la rustine courante et continuer"
msgid "abort and check out the original branch"
msgstr "abandonner et extraire la branche d'origine"
@@ -10560,7 +10629,7 @@ msgid "edit the todo list during an interactive rebase"
msgstr "éditer la liste à faire lors d'un rebasage interactif"
msgid "show the patch file being applied or merged"
-msgstr "afficher le patch en cours d'application ou de fusion"
+msgstr "afficher la rustine en cours d'application ou de fusion"
msgid "use apply strategies to rebase"
msgstr "utiliser des stratégies d'application pour rebaser"
@@ -10943,7 +11012,7 @@ msgid "repository already uses '%s' format"
msgstr "le dépôt utilise déjà le format '%s'"
msgid "enable strict checking"
-msgstr "activer une vérification plus strict"
+msgstr "activer une vérification plus stricte"
msgid "'git refs verify' takes no arguments"
msgstr "'git refs verify' n'accepte aucun argument"
@@ -11287,6 +11356,30 @@ msgid_plural " Local refs configured for 'git push'%s:"
msgstr[0] " Référence locale configurée pour 'git push'%s :"
msgstr[1] " Références locales configurées pour 'git push'%s :"
+#, c-format
+msgid "'%s/HEAD' is unchanged and points to '%s'\n"
+msgstr "'%s/HEAD' est inchangé et pointe sur '%s'\n"
+
+#, c-format
+msgid "'%s/HEAD' has changed from '%s' and now points to '%s'\n"
+msgstr "'%s/HEAD' a changé depuis '%s' et pointe à présent sur '%s'\n"
+
+#, c-format
+msgid "'%s/HEAD' is now created and points to '%s'\n"
+msgstr "'%s/HEAD' a été créé et pointe sur '%s'\n"
+
+#, c-format
+msgid "'%s/HEAD' was detached at '%s' and now points to '%s'\n"
+msgstr "'%s/HEAD' est détaché de '%s' et pointe à présent sur '%s'\n"
+
+#, c-format
+msgid ""
+"'%s/HEAD' used to point to '%s' (which is not a remote branch), but now "
+"points to '%s'\n"
+msgstr ""
+"'%s/HEAD' pointait sur '%s' (qui n'est pas une branche distante), mais "
+"pointe à présent sur '%s'\n"
+
msgid "set refs/remotes/<name>/HEAD according to remote"
msgstr "définir refs/remotes/<nom>/HEAD selon la distante"
@@ -11310,7 +11403,7 @@ msgid "Not a valid ref: %s"
msgstr "Référence non valide : %s"
#, c-format
-msgid "Could not setup %s"
+msgid "Could not set up %s"
msgstr "Impossible de paramétrer %s"
#, c-format
@@ -12454,7 +12547,7 @@ msgid ""
"directory '%s' contains untracked files, but is not in the sparse-checkout "
"cone"
msgstr ""
-"le dossier '%s' contient des fichiers non-suivis, mais n'est pas dans le "
+"le répertoire '%s' contient des fichiers non-suivis, mais n'est pas dans le "
"cone d'extraction clairsemée"
#, c-format
@@ -13191,7 +13284,7 @@ msgid ""
"the superproject is not on any branch"
msgstr ""
"La branche du sous-module %s est configurée pour hériter de la branche du "
-"superprojet, mais le superprojet n'est sur aucune branche"
+"super-projet, mais le super-projet n'est sur aucune branche"
#, c-format
msgid "Unable to find current revision in submodule path '%s'"
@@ -14097,6 +14190,9 @@ msgstr "régler le mode de suivi (voir git-branch(1))"
msgid "try to match the new branch name with a remote-tracking branch"
msgstr "essayer de nommer la nouvelle branche comme la branche amont"
+msgid "use relative paths for worktrees"
+msgstr "utiliser des chemins relatifs pour les arbres-de-travail"
+
#, c-format
msgid "options '%s', '%s', and '%s' cannot be used together"
msgstr "les options '%s', '%s' et '%s' ne peuvent pas être utilisées ensemble"
@@ -14379,6 +14475,26 @@ msgstr "impossible de créer '%s'"
msgid "index-pack died"
msgstr "l'index de groupe a disparu"
+#, c-format
+msgid "directory '%s' is present in index, but not sparse"
+msgstr "Le répertoire '%s' est présent dans l'index et pourtant pas clairsemé"
+
+msgid "corrupted cache-tree has entries not present in index"
+msgstr "l'arbre de cache corrompu a des entrées non présentes dans l'index"
+
+#, c-format
+msgid "%s with flags 0x%x should not be in cache-tree"
+msgstr "%s avec les drapeaux 0x%x ne devrait pas être dans l'arbre de cache"
+
+#, c-format
+msgid "bad subtree '%.*s'"
+msgstr "mauvais sous-arbre '%.*s'"
+
+#, c-format
+msgid "cache-tree for path %.*s does not match. Expected %s got %s"
+msgstr ""
+"l'arbre de cache pour le chemin %.*s ne correspond pas. %s attendu, %s obtenu"
+
msgid "terminating chunk id appears earlier than expected"
msgstr "l'identifiant de terminaison de tronçon apparaît plus tôt qu'attendu"
@@ -14409,13 +14525,13 @@ msgid "Add file contents to the index"
msgstr "Ajouter le contenu de fichiers dans l'index"
msgid "Apply a series of patches from a mailbox"
-msgstr "Appliquer une série de patchs depuis une boîte mail"
+msgstr "Appliquer une série de rustines depuis une boîte mail"
msgid "Annotate file lines with commit information"
msgstr "Annoter les lignes du fichier avec l'information de commit"
msgid "Apply a patch to files and/or to the index"
-msgstr "Appliquer une patch à des fichiers ou à l'index"
+msgstr "Appliquer une rustine à des fichiers ou à l'index"
msgid "Import a GNU Arch repository into Git"
msgstr "Importer dans Git un dépôt GNU Arch"
@@ -14567,7 +14683,7 @@ msgid "Run a Git command on a list of repositories"
msgstr "Lance une commande Git sur une liste de dépôts"
msgid "Prepare patches for e-mail submission"
-msgstr "Préparer les patchs pour soumission par courriel"
+msgstr "Préparer les rustines pour soumission par courriel"
msgid "Verifies the connectivity and validity of the objects in the database"
msgstr ""
@@ -14637,7 +14753,7 @@ msgstr "Afficher le contenu d'un objet arbre"
msgid "Extracts patch and authorship from a single e-mail message"
msgstr ""
-"Extraire le patch et l'information de d'auteur depuis un simple message de "
+"Extraire la rustine et l'information de l'auteur depuis un simple message de "
"courriel"
msgid "Simple UNIX mbox splitter program"
@@ -14700,7 +14816,7 @@ msgid "Pack heads and tags for efficient repository access"
msgstr "Empaqueter les têtes et les étiquettes pour un accès efficace au dépôt"
msgid "Compute unique ID for a patch"
-msgstr "Calculer l'ID unique d'un patch"
+msgstr "Calculer l'ID unique d'une rustine"
msgid "Prune all unreachable objects from the object database"
msgstr "Élaguer les objets inatteignables depuis la base de données des objets"
@@ -14775,7 +14891,7 @@ msgid "Remove files from the working tree and from the index"
msgstr "Supprimer des fichiers de la copie de travail et de l'index"
msgid "Send a collection of patches as emails"
-msgstr "Envoyer un ensemble de patchs comme courriels"
+msgstr "Envoyer un ensemble de rustines comme courriels"
msgid "Push objects over Git protocol to another repository"
msgstr "Pousser les objets sur un autre dépôt via le protocole Git"
@@ -15060,7 +15176,7 @@ msgid ""
"disabling Bloom filters for commit-graph layer '%s' due to incompatible "
"settings"
msgstr ""
-"désactivation des filtres de Bloom opur la couche de graphe de commits '%s' "
+"désactivation des filtres de Bloom pour la couche de graphe de commits '%s' "
"à cause de réglages incompatibles"
msgid "commit-graph has no base graphs chunk"
@@ -15202,8 +15318,8 @@ msgid ""
"attempting to write a commit-graph, but 'commitGraph.changedPathsVersion' "
"(%d) is not supported"
msgstr ""
-"essai d'écriture de graphe de commits, mais 'commitGraph."
-"changedPathsVersion' (%d) n'est pas pris en charge"
+"essai d'écriture de graphe de commits, mais "
+"'commitGraph.changedPathsVersion' (%d) n'est pas pris en charge"
msgid "too many commits to write graph"
msgstr "trop de commits pour écrire un graphe"
@@ -15292,13 +15408,13 @@ msgid ""
"to convert the grafts into replace refs.\n"
"\n"
"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
msgstr ""
"Le support de <GIT_DIR>/info/grafts est déconseillé\n"
"et sera supprimé dans une version future de Git.\n"
"\n"
"Veuillez utiliser \"git replace --convert-graft-file\"\n"
-"pour convertir les grafts en référence de remplacement.\n"
+"pour convertir les grafts en références de remplacement.\n"
"\n"
"Supprimez ce message en lançant\n"
"\"git config advice.graftFileDeprecated false\""
@@ -16139,6 +16255,18 @@ msgstr "l'url n'a pas de schéma : %s"
msgid "credential url cannot be parsed: %s"
msgstr "impossible d'analyser l'url d'identification : %s"
+#, c-format
+msgid "invalid timeout '%s', expecting a non-negative integer"
+msgstr "délai d'attente invalide '%s', entier positif ou nul attendu"
+
+#, c-format
+msgid "invalid init-timeout '%s', expecting a non-negative integer"
+msgstr "délai d'attente d'init invalide '%s', entier positif ou nul attendu"
+
+#, c-format
+msgid "invalid max-connections '%s', expecting an integer"
+msgstr "max-connections invalide '%s', entier attendu"
+
msgid "in the future"
msgstr "dans le futur"
@@ -16211,8 +16339,8 @@ msgstr "impossible de charger la regex île pour '%s' : %s"
#, c-format
msgid "island regex from config has too many capture groups (max=%d)"
msgstr ""
-"l'expression rationnelle depuis la configuration a trop de groupes de "
-"capture (max=%d)"
+"l'expression régulière depuis la configuration a trop de groupes de capture "
+"(max=%d)"
#, c-format
msgid "Marked %d islands, done.\n"
@@ -16735,8 +16863,7 @@ msgstr ""
"ou -G"
msgid "treat <string> in -S as extended POSIX regular expression"
-msgstr ""
-"traiter <chaîne> dans -S comme une expression rationnelle POSIX étendue"
+msgstr "traiter <chaîne> dans -S comme une expression régulière POSIX étendue"
msgid "control the order in which files appear in the output"
msgstr "contrôler l'ordre dans lequel les fichiers apparaissent dans la sortie"
@@ -16880,6 +17007,20 @@ msgstr "espaces de nom de Git \"%s\""
msgid "too many args to run %s"
msgstr "trop d'arguments pour lancer %s"
+#, c-format
+msgid ""
+"You are attempting to fetch %s, which is in the commit graph file but not in "
+"the object database.\n"
+"This is probably due to repo corruption.\n"
+"If you are attempting to repair this repo corruption by refetching the "
+"missing object, use 'git fetch --refetch' with the missing object."
+msgstr ""
+"Vous tentez de récupérer %s, qui est dans le graphe de commit mais pas dans "
+"la base de données des objets.\n"
+"C'est probablement du à une corruption de dépôt.\n"
+"Si vous essayez de réparer cette corruption de dépôt en re-récupérer l'objet "
+"manquant, utilisez 'git fetch --refetch' sur les objets manquants."
+
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack : liste superficielle attendue"
@@ -17469,11 +17610,11 @@ msgstr[1] ""
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
+"You can disable this warning with `git config set advice.ignoredHook false`."
msgstr ""
"Le crochet '%s' a été ignoré parce qu'il n'est pas marqué comme exécutable.\n"
-"Vous pouvez désactiver cet avertissement avec `git config advice.ignoredHook "
-"false`."
+"Vous pouvez désactiver cet avertissement avec `git config set "
+"advice.ignoredHook false`."
msgid "not a git repository"
msgstr "pas un dépôt git"
@@ -17490,15 +17631,9 @@ msgstr ""
msgid "Delegation control is not supported with cURL < 7.22.0"
msgstr "La délégation de commande n'est pas supporté avec cuRL < 7.22.0"
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr "L'épinglage de clé publique n'est pas supporté avec cuRL < 7.39.0"
-
msgid "Unknown value for http.proactiveauth"
msgstr "valeur inconnue pour http.proactiveauth"
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr "CURLSSLOPT_NO_REVOKE n'est pas supporté avec cuRL < 7.44.0"
-
#, c-format
msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
msgstr "Dorsale SSL '%s' non supportée. Dorsales SSL supportées :"
@@ -17688,6 +17823,10 @@ msgid "unable to format message: %s"
msgstr "impossible de formater le message : %s"
#, c-format
+msgid "invalid marker-size '%s', expecting an integer"
+msgstr "taille de marqueur invalide '%s', entier attendu"
+
+#, c-format
msgid "Failed to merge submodule %s (not checked out)"
msgstr "Échec de la fusion du sous-module %s (non extrait)"
@@ -18284,7 +18423,7 @@ msgstr "échec de l'écriture de l'index de multi-paquet"
msgid "cannot expire packs from an incremental multi-pack-index"
msgstr ""
-"impossible d'expirer les paquets dpuis un index multi-paquet incrémental"
+"impossible d'expirer les paquets depuis un index multi-paquet incrémental"
msgid "Counting referenced objects"
msgstr "Comptage des objets référencés"
@@ -18293,7 +18432,7 @@ msgid "Finding and deleting unreferenced packfiles"
msgstr "Recherche et effacement des fichiers paquets non-référencés"
msgid "cannot repack an incremental multi-pack-index"
-msgstr "impossible de ré-empaqueter un index multi-paquet"
+msgstr "impossible de ré-empaqueter un index multi-paquet incrémental"
msgid "could not start pack-objects"
msgstr "impossible de démarrer le groupement d'objets"
@@ -18809,7 +18948,7 @@ msgid ""
"\n"
"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"running \"git config set advice.objectNameWarning false\""
msgstr ""
"Git ne crée normalement jamais de référence qui se termine par 40\n"
"caractères hexa car elle serait ignorée si vous spécifiez juste\n"
@@ -18821,7 +18960,7 @@ msgstr ""
"est créée.\n"
"Veuillez examiner ces références et peut-être les supprimer. Désactivez ce "
"message\n"
-"en lançant \"git config advice.objectNameWarning false\""
+"en lançant \"git config set advice.objectNameWarning false\""
#, c-format
msgid "log for '%.*s' only goes back to %s"
@@ -18986,13 +19125,6 @@ msgstr "l'index inverse requis manque dans l'index multi-paquet"
msgid "could not open pack %s"
msgstr "impossible d'ouvrir le paquet '%s'"
-msgid "could not determine MIDX preferred pack"
-msgstr "impossible de déterminer le paquet préféré de MIDX"
-
-#, c-format
-msgid "preferred pack (%s) is invalid"
-msgstr "le paquet préféré (%s) est invalide"
-
msgid "corrupt bitmap lookup table: triplet position out of index"
msgstr ""
"table de recherche en bitmap corrompue : position de triplet hors d'index"
@@ -19270,7 +19402,7 @@ msgid "use <n> digits to display object names"
msgstr "utiliser <n> chiffres pour afficher les noms des objets"
msgid "prefixed path to initial superproject"
-msgstr "chemin préfixé vers le superprojet initial"
+msgstr "chemin préfixé vers le super-projet initial"
msgid "how to strip spaces and #comments from message"
msgstr "comment éliminer les espaces et les commentaires # du message"
@@ -19484,7 +19616,7 @@ msgstr ""
msgid ""
"pseudo-merge regex from config has too many capture groups (max=%<PRIuMAX>)"
msgstr ""
-"l'expression rationnelle de pseudo-fusion a trop de groupes de capture "
+"l'expression régulière de pseudo-fusion a trop de groupes de capture "
"(max=%<PRIuMAX>)"
#, c-format
@@ -20128,18 +20260,26 @@ msgstr "le journal pour la réf %s s'arrête de manière inattendue sur %s"
msgid "log for %s is empty"
msgstr "le journal pour la réf %s est vide"
-msgid "refusing to force and skip creation of reflog"
-msgstr "refus de forcer et sauter la création du reflog"
-
#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr "refus de mettre à jour une réf avec un nom cassé '%s'"
+msgid "refusing to update reflog for pseudoref '%s'"
+msgstr "refus de mettre à jour le réflog pour la pseudo-réf '%s'"
#, c-format
msgid "refusing to update pseudoref '%s'"
msgstr "refus de mettre à jour la pseudo-réf '%s'"
#, c-format
+msgid "refusing to update reflog with bad name '%s'"
+msgstr "refus de mettre à jour le réflog avec un nom cassé '%s'"
+
+#, c-format
+msgid "refusing to update ref with bad name '%s'"
+msgstr "refus de mettre à jour une réf avec un nom cassé '%s'"
+
+msgid "refusing to force and skip creation of reflog"
+msgstr "refus de forcer et sauter la création du reflog"
+
+#, c-format
msgid "update_ref failed for ref '%s': %s"
msgstr "échec de update_ref pour la réf '%s' : %s"
@@ -20190,6 +20330,10 @@ msgstr ""
"normale trouvée"
#, c-format
+msgid "cannot read ref file '%s'"
+msgstr "impossible de lire le fichier de référence '%s'"
+
+#, c-format
msgid "cannot open directory %s"
msgstr "impossible d'ouvrir le répertoire %s"
@@ -20321,8 +20465,8 @@ msgstr "le serveur distant a envoyé un paquet de fin de réponse inattendu"
msgid "unable to rewind rpc post data - try increasing http.postBuffer"
msgstr ""
-"impossible de rembobiner le données post rpc - essayer d'augmenter http."
-"postBuffer"
+"impossible de rembobiner le données post rpc - essayer d'augmenter "
+"http.postBuffer"
#, c-format
msgid "remote-curl: bad line length character: %.4s"
@@ -20406,6 +20550,10 @@ msgid "more than one uploadpack given, using the first"
msgstr "plus d'un uploadpack fournis, utilisation du premier"
#, c-format
+msgid "unrecognized followRemoteHEAD value '%s' ignored"
+msgstr "valeur '%s' de followRemoteHEAD non reconnue et ignorée "
+
+#, c-format
msgid "unrecognized value transfer.credentialsInUrl: '%s'"
msgstr "valeur non reconnue transfer.credentialsInUrl : '%s'"
@@ -21359,7 +21507,7 @@ msgstr "impossible d'appliquer %s... %s"
#, c-format
msgid "dropping %s %s -- patch contents already upstream\n"
-msgstr "abandon de %s %s -- le contenu de la rustine déjà en amont\n"
+msgstr "abandon de %s %s -- le contenu de la rustine est déjà en amont\n"
#, c-format
msgid "git %s: failed to read the index"
@@ -22364,6 +22512,9 @@ msgstr "le commit %s n'est pas marqué joignable"
msgid "too many commits marked reachable"
msgstr "trop de commits marqués joignables"
+msgid "could not determine MIDX preferred pack"
+msgstr "impossible de déterminer le paquet préféré de MIDX"
+
msgid "test-tool serve-v2 [<options>]"
msgstr "test-tool serve-v2 [<options>]"
@@ -23034,6 +23185,10 @@ msgstr "fichier .git cassé"
msgid ".git file incorrect"
msgstr "fichier .git incorrect"
+msgid ".git file absolute/relative path mismatch"
+msgstr ""
+"non-correspondance entre les chemin absolu entre relatif du fichier .git"
+
msgid "not a valid path"
msgstr "pas un chemin valide"
@@ -23050,6 +23205,9 @@ msgstr "impossible de localiser le dépôt ; fichier .git cassé"
msgid "gitdir unreadable"
msgstr "gitdir non lisible"
+msgid "gitdir absolute/relative path mismatch"
+msgstr "non-correspondance de chemin absolu/relatif de gitdir"
+
msgid "gitdir incorrect"
msgstr "gitdir incorrect"
@@ -23085,6 +23243,14 @@ msgstr "impossible de désinitialiser %s dans '%s'"
msgid "failed to set extensions.worktreeConfig setting"
msgstr "échec de paramétrage extensions.worktreeConfig"
+msgid "unable to upgrade repository format to support relative worktrees"
+msgstr ""
+"impossible de mettre à jour le format de dépôt pour prendre en charge les "
+"arbres-de-travail relatifs"
+
+msgid "unable to set extensions.relativeWorktrees setting"
+msgstr "échec de modification du paramètre extensions.relativeWorktrees"
+
#, c-format
msgid "could not setenv '%s'"
msgstr "impossible de configurer l'environnement '%s'"
@@ -23266,13 +23432,13 @@ msgid "You are in the middle of an am session."
msgstr "Vous êtes au milieu d'une session am."
msgid "The current patch is empty."
-msgstr "Le patch actuel est vide."
+msgstr "La rustine actuelle est vide."
msgid " (fix conflicts and then run \"git am --continue\")"
msgstr " (réglez les conflits puis lancez \"git am --continue\")"
msgid " (use \"git am --skip\" to skip this patch)"
-msgstr " (utilisez \"git am --skip\" pour sauter ce patch)"
+msgstr " (utilisez \"git am --skip\" pour sauter cette rustine)"
msgid ""
" (use \"git am --allow-empty\" to record this patch as an empty commit)"
@@ -23322,7 +23488,7 @@ msgid " (fix conflicts and then run \"git rebase --continue\")"
msgstr " (réglez les conflits puis lancez \"git rebase --continue\")"
msgid " (use \"git rebase --skip\" to skip this patch)"
-msgstr " (utilisez \"git rebase --skip\" pour sauter ce patch)"
+msgstr " (utilisez \"git rebase --skip\" pour sauter cette rustine)"
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr " (utilisez \"git rebase --abort\" pour extraire la branche d'origine)"
@@ -23382,7 +23548,7 @@ msgstr ""
" (tous les conflits sont réglés : lancez \"git cherry-pick --continue\")"
msgid " (use \"git cherry-pick --skip\" to skip this patch)"
-msgstr " (utilisez \"git cherry-pick --skip\" pour sauter ce patch)"
+msgstr " (utilisez \"git cherry-pick --skip\" pour sauter cette rustine)"
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr " (utilisez \"git cherry-pick --abort\" pour annuler le picorage)"
@@ -23404,7 +23570,7 @@ msgid " (all conflicts fixed: run \"git revert --continue\")"
msgstr " (tous les conflits sont réglés : lancez \"git revert --continue\")"
msgid " (use \"git revert --skip\" to skip this patch)"
-msgstr " (utilisez \"git revert --skip\" pour sauter ce patch)"
+msgstr " (utilisez \"git revert --skip\" pour sauter cette rustine)"
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr " (utilisez \"git revert --abort\" pour annuler le rétablissement)"
@@ -23728,7 +23894,7 @@ msgid ""
"\n"
msgstr ""
"\n"
-"Aucun fichier patch spécifié !\n"
+"Aucun fichier de rustine spécifié !\n"
"\n"
#, perl-format
@@ -23748,7 +23914,7 @@ msgid ""
msgstr ""
"Les lignes commençant par \"GIT:\" seront supprimées.\n"
"Envisagez d'inclure un diffstat global ou une table des matières\n"
-"pour le patch que vous êtes en train d'écrire.\n"
+"pour la rustine que vous êtes en train d'écrire.\n"
"\n"
"Effacez le corps si vous ne souhaitez pas envoyer un résumé.\n"
@@ -23785,7 +23951,7 @@ msgid ""
"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
"want to send.\n"
msgstr ""
-"Envoi refusé parce que le patch\n"
+"Envoi refusé parce que la rustine\n"
"\t%s\n"
"a un sujet modèle '*** SUBJECT HERE ***'. Passez --force is vous souhaitez "
"vraiment envoyer.\n"
@@ -23938,7 +24104,7 @@ msgid ""
msgstr ""
"fatal : %s : rejeté par le crochet %s\n"
"%s\n"
-"attention : aucun patch envoyé\n"
+"attention : aucune rustine envoyée\n"
#, perl-format
msgid "unable to open %s: %s\n"
@@ -23950,7 +24116,7 @@ msgid ""
"warning: no patches were sent\n"
msgstr ""
"fatal : %s : %d est plus long que 998 caractères \n"
-"attention : aucun patch envoyé\n"
+"attention : aucune rustine envoyée\n"
#, perl-format
msgid "Skipping %s with backup suffix '%s'.\n"
@@ -23961,229 +24127,6 @@ msgstr "%s sauté avec un suffix de sauvegarde '%s'.\n"
msgid "Do you really want to send %s? [y|N]: "
msgstr "Souhaitez-vous réellement envoyer %s ?[y|N] : "
-#~ msgid "revision walk setup failed\n"
-#~ msgstr "échec de la préparation du parcours des révisions\n"
-
-#, c-format
-#~ msgid "unable to parse contact: %s"
-#~ msgstr "impossible d'analyser le contact : %s"
-
#, c-format
-#~ msgid "truncating .rej filename to %.*s.rej"
-#~ msgstr "troncature du nom de fichier .rej en %.*s.rej"
-
-#~ msgid ""
-#~ "the add.interactive.useBuiltin setting has been removed!\n"
-#~ "See its entry in 'git help config' for details."
-#~ msgstr ""
-#~ "le réglage add.interactive.useBuiltin a été supprimé !\n"
-#~ "Référez-vous à cette entrée dans 'git help config' pour plus de détails."
-
-#~ msgid "git archive: Remote with no URL"
-#~ msgstr "git archive : Dépôt distant sans URL"
-
-#~ msgid "only one action at a time"
-#~ msgstr "une seule action à la fois"
-
-#~ msgid "use [RFC PATCH] instead of [PATCH]"
-#~ msgstr "utiliser [RFC PATCH] au lieu de [PATCH]"
-
-#, c-format
-#~ msgid "no URLs configured for remote '%s'"
-#~ msgstr "aucune URL configurée pour le dépôt distant '%s'"
-
-#, c-format
-#~ msgid "remote '%s' has no configured URL"
-#~ msgstr "le distant '%s' n'a pas d'URL configuré"
-
-#~ msgid ""
-#~ "Use -f if you really want to add them.\n"
-#~ "Turn this message off by running\n"
-#~ "\"git config advice.addIgnoredFile false\""
-#~ msgstr ""
-#~ "Utilisez -f si vous voulez vraiment les ajouter.\n"
-#~ "Éliminez ce message en lançant\n"
-#~ "\"git config advice.addIgnoredFile false\""
-
-#~ msgid ""
-#~ "Maybe you wanted to say 'git add .'?\n"
-#~ "Turn this message off by running\n"
-#~ "\"git config advice.addEmptyPathspec false\""
-#~ msgstr ""
-#~ "Peut-être avez-vous voulu dire 'git add .' ?\n"
-#~ "Éliminez ce message en lançant\n"
-#~ "\"git config advice.addEmptyPathspec false\""
-
-#~ msgid ""
-#~ "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
-#~ "refusing to clean"
-#~ msgstr ""
-#~ "clean.requireForce à true par défaut et ni -i, -n ou -f fourni ; refus de "
-#~ "nettoyer"
-
-#, c-format
-#~ msgid "bad ls-files format: element '%s' does not start with '('"
-#~ msgstr "mauvais format ls-files : l'élément '%s' ne commence pas par '('"
-
-#, c-format
-#~ msgid "bad ls-files format: element '%s' does not end in ')'"
-#~ msgstr "mauvais format ls-files : l'élément '%s' ne se termine pas par ')'"
-
-#, c-format
-#~ msgid "bad ls-files format: %%%.*s"
-#~ msgstr "mauvais format ls-files : %%%.*s"
-
-#~ msgid "keep redundant, empty commits"
-#~ msgstr "garder les validations redondantes, vides"
-
-#~ msgid "core.commentChar should only be one ASCII character"
-#~ msgstr "core.commentChar ne devrait être qu'un unique caractère ASCII"
-
-#~ msgid ""
-#~ "--bundle-uri is incompatible with --depth, --shallow-since, and --shallow-"
-#~ "exclude"
-#~ msgstr ""
-#~ "--bundle-uri est incompatible avec --depth, --shallow-since, et --shallow-"
-#~ "exclude"
-
-#~ msgid "--merge-base is incompatible with --stdin"
-#~ msgstr "--merge-base est incompatible avec --stdin"
-
-#~ msgid ""
-#~ "apply options are incompatible with rebase.autoSquash. Consider adding --"
-#~ "no-autosquash"
-#~ msgstr ""
-#~ "les options d'application sont incompatibles avec rebase.autoSquash. "
-#~ "Considérez l'ajout de --no-autosquash"
-
-#~ msgid "--exclude-hidden cannot be used together with --branches"
-#~ msgstr "--exclude-hidden ne peut être utilisé avec --branches"
-
-#~ msgid "--exclude-hidden cannot be used together with --tags"
-#~ msgstr "--exclude-hidden ne peut pas être utilisé avec --tags"
-
-#~ msgid "--exclude-hidden cannot be used together with --remotes"
-#~ msgstr "--exclude-hidden ne peut pas être utilisé avec --remotes"
-
-#, c-format
-#~ msgid "only one of '%s', '%s' or '%s' can be given"
-#~ msgstr "les options '%s', '%s' et '%s' sont mutuellement exclusives"
-
-#, c-format
-#~ msgid "'%s' and '%s' cannot be used together"
-#~ msgstr "'%s' et '%s' ne peuvent pas être utilisées ensemble"
-
-#, c-format
-#~ msgid "options '%s', and '%s' cannot be used together"
-#~ msgstr "les options '%s' et '%s' ne peuvent pas être utilisées ensemble"
-
-#~ msgid "<commit-ish>"
-#~ msgstr "<commit-esque>"
-
-#, c-format
-#~ msgid "%s is incompatible with %s"
-#~ msgstr "%s est incompatible avec %s"
-
-#~ msgid "unhandled options"
-#~ msgstr "options non gérées"
-
-#, c-format
-#~ msgid "options '%s=%s' and '%s=%s' cannot be used together"
-#~ msgstr ""
-#~ "les options '%s=%s' et '%s=%s' ne peuvent pas être utilisées ensemble"
-
-#, c-format
-#~ msgid "%s : incompatible with something else"
-#~ msgstr "%s est incompatible avec toute autre option"
-
-#~ msgid "Could not write patch"
-#~ msgstr "Impossible d'écrire le patch"
-
-#, c-format
-#~ msgid "Could not stat '%s'"
-#~ msgstr "Stat de '%s' impossible"
-
-#, c-format
-#~ msgid "Cannot delete branch '%s' checked out at '%s'"
-#~ msgstr "Impossible de supprimer la branche '%s' extraite dans '%s'"
-
-#~ msgid "unable to write new_index file"
-#~ msgstr "impossible d'écrire le fichier new_index"
-
-#~ msgid "do not apply config rules"
-#~ msgstr "ne pas appliquer les règles de la configuration"
-
-#~ msgid "join whitespace-continued values"
-#~ msgstr "joindre les valeurs continuées avec des caractères blancs"
-
-#~ msgid "set parsing options"
-#~ msgstr "paramètres d'analyse"
-
-#~ msgid "cannot move directory over file"
-#~ msgstr "impossible de déplacer un répertoire sur un fichier"
-
-#~ msgid "cannot use --filter without --stdout"
-#~ msgstr "impossible d'utiliser --filter sans --stdout"
-
-#~ msgid "cannot use --max-pack-size with --cruft"
-#~ msgstr "impossible d'utiliser --max-pack-size avec --cruft"
-
-#~ msgid "--strategy requires --merge or --interactive"
-#~ msgstr "--strategy requiert --merge ou --interactive"
-
-#, c-format
-#~ msgid ""
-#~ "commit-graph has generation number zero for commit %s, but non-zero "
-#~ "elsewhere"
-#~ msgstr ""
-#~ "le graphe de commit a un numéro de génération nul pour le commit %s, mais "
-#~ "non-nul ailleurs"
-
-#~ msgid "--merge-base only works with commits"
-#~ msgstr "--merge-base ne fonctionne qu'avec des commits"
-
-#~ msgid "scalar clone [<options>] [--] <repo> [<dir>]"
-#~ msgstr "scalar clone [<options>] [--] <dépôt> [<répertoire>]"
-
-#, c-format
-#~ msgid "could not rename '%s' to '%s'"
-#~ msgstr "impossible de renommer '%s' en '%s'"
-
-#, c-format
-#~ msgid "It is not possible to %s because you have unmerged files."
-#~ msgstr "%s n'est pas possible car vous avez des fichiers non fusionnés."
-
-#~ msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-#~ msgstr ""
-#~ "ne pas passer l'option --keep-cr à git-mailsplit indépendamment de am."
-#~ "keepcr"
-
-#~ msgid ""
-#~ "Updates were rejected because the tip of the remote-tracking\n"
-#~ "branch has been updated since the last checkout. You may want\n"
-#~ "to integrate those changes locally (e.g., 'git pull ...')\n"
-#~ "before forcing an update.\n"
-#~ msgstr ""
-#~ "Les mises à jour ont été rejetées, car la pointe de la branche\n"
-#~ "de suivi a été mise à jour depuis la dernière extraction. Intégrez\n"
-#~ "ces changements localement (par exemple 'git pull ...') avant de\n"
-#~ "forcer à nouveau une mise à jour.\n"
-
-#~ msgid "or do not fetch any tag at all (--no-tags)"
-#~ msgstr "ou ne rapatrier aucune étiquette (--no-tags)"
-
-#~ msgid "current working directory is untracked"
-#~ msgstr "l'arbre de travail actuel est non-suivi"
-
-#~ msgid "cannot use --contents with final commit object name"
-#~ msgstr "on ne peut pas utiliser --contents avec un nom d'objet commit final"
-
-#~ msgid "please commit or stash them."
-#~ msgstr "veuillez les valider ou les remiser."
-
-#, c-format
-#~ msgid "Unknown mode: %s"
-#~ msgstr "Mode inconnu : %s"
-
-#~ msgid "could not lock HEAD"
-#~ msgstr "impossible de verrouiller HEAD"
+#~ msgid "preferred pack (%s) is invalid"
+#~ msgstr "le paquet préféré (%s) est invalide"
diff --git a/po/id.po b/po/id.po
index fc34140776..3965c9e941 100644
--- a/po/id.po
+++ b/po/id.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Git\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2024-10-04 08:33+0700\n"
-"PO-Revision-Date: 2024-10-04 08:52+0700\n"
+"POT-Creation-Date: 2024-12-23 18:57+0000\n"
+"PO-Revision-Date: 2025-01-06 15:50+0700\n"
"Last-Translator: Bagas Sanjaya <bagasdotme@gmail.com>\n"
"Language-Team: Indonesian\n"
"Language: id\n"
@@ -755,10 +755,10 @@ msgstr "Hanya berkas biner yang berubah."
#, c-format
msgid ""
"\n"
-"Disable this message with \"git config advice.%s false\""
+"Disable this message with \"git config set advice.%s false\""
msgstr ""
"\n"
-"Nonaktifkan pesan ini dengan \"git config advice.%s false\""
+"Nonaktifkan pesan ini dengan \"git config set advice.%s false\""
#: advice.c
#, c-format
@@ -1670,9 +1670,10 @@ msgstr "bukan nama objek valid: %s"
msgid "not a tree object: %s"
msgstr "bukan objek pohon: %s"
-#: archive.c builtin/clone.c
-msgid "unable to checkout working tree"
-msgstr "tidak dapat men-checkout pohon kerja"
+#: archive.c
+#, c-format
+msgid "failed to unpack tree object %s"
+msgstr "gagal membuka objek pohon %s"
#: archive.c
#, c-format
@@ -3734,11 +3735,11 @@ msgstr "HEAD tidak ditemukan di bawah refs/heads!"
#: builtin/branch.c
msgid ""
-"branch with --recurse-submodules can only be used if submodule."
-"propagateBranches is enabled"
+"branch with --recurse-submodules can only be used if "
+"submodule.propagateBranches is enabled"
msgstr ""
-"cabang dengan --recurse-submodules hanya dapat digunakan jika submodule."
-"propagateBranches diaktifkan"
+"cabang dengan --recurse-submodules hanya dapat digunakan jika "
+"submodule.propagateBranches diaktifkan"
#: builtin/branch.c
msgid "--recurse-submodules can only be used to create branches"
@@ -4767,7 +4768,7 @@ msgstr "gaya konflik '%s' tidak dikenal"
msgid "perform a 3-way merge with the new branch"
msgstr "lakukan penggabungan 3 arah dengan cabang baru"
-#: builtin/checkout.c builtin/log.c parse-options.h
+#: builtin/checkout.c builtin/log.c builtin/range-diff.c parse-options.h
msgid "style"
msgstr "gaya"
@@ -4796,9 +4797,8 @@ msgid "update ignored files (default)"
msgstr "perbarui berkas yang diabaikan (default)"
#: builtin/checkout.c
-msgid "do not check if another worktree is holding the given ref"
-msgstr ""
-"jangan periksa jika pohon kerja yang lain mempunyai referensi yang diberikan"
+msgid "do not check if another worktree is using this branch"
+msgstr "jangan periksa jika pohon kerja yang lain menggunakan cabang ini"
#: builtin/checkout.c
msgid "checkout our version for unmerged files"
@@ -5179,14 +5179,13 @@ msgstr "buat klon dangkal sedalam kedalaman tersebut"
msgid "create a shallow clone since a specific time"
msgstr "buat klon dangkal sejak waktu yang disebutkan"
-#: builtin/clone.c builtin/fetch.c builtin/pull.c builtin/rebase.c
-#: builtin/replay.c
-msgid "revision"
-msgstr "revisi"
+#: builtin/clone.c builtin/fetch.c builtin/pull.c
+msgid "ref"
+msgstr "referensi"
#: builtin/clone.c builtin/fetch.c builtin/pull.c
-msgid "deepen history of shallow clone, excluding rev"
-msgstr "perdalam riwayat klon dangkal, tidak termasuk rev"
+msgid "deepen history of shallow clone, excluding ref"
+msgstr "perdalam riwayat klon dangkal, kecualikan referensi"
#: builtin/clone.c builtin/submodule--helper.c
msgid "clone only one branch, HEAD or --branch"
@@ -5349,6 +5348,10 @@ msgid "remote HEAD refers to nonexistent ref, unable to checkout"
msgstr "HEAD remote merujuk pada ref yang tidak ada, tidak dapat men-checkout"
#: builtin/clone.c
+msgid "unable to checkout working tree"
+msgstr "tidak dapat men-checkout pohon kerja"
+
+#: builtin/clone.c
msgid "unable to write parameters to config file"
msgstr "tidak dapat menulis parameter ke berkas konfigurasi"
@@ -6347,10 +6350,10 @@ msgstr ""
#: builtin/config.c
msgid ""
"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
-"<name> <value>"
+"<name>"
msgstr ""
-"git config unset [<opsi berkas] [--all] [--value=<nilai>] [--fixed-value] "
-"<nama> <nilai>"
+"git config unset [<opsi berkas>] [--all] [--value=<nilai>] [--fixed-value] "
+"<nama>"
#: builtin/config.c
msgid "git config rename-section [<file-option>] <old-name> <new-name>"
@@ -6907,12 +6910,8 @@ msgstr "%lu komit dilintasi\n"
#: builtin/describe.c
#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"lebih dari %i tag ditemukan; %i terbaru didaftarkan\n"
-"menyerah mencari pada %s\n"
+msgid "found %i tags; gave up search at %s\n"
+msgstr "dapat %i tag; menyerah mencari pada %s\n"
#: builtin/describe.c
#, c-format
@@ -7389,8 +7388,8 @@ msgstr ""
"fetch secara normal mengindikasikan cabang mana ada pembaruan terpaksa,\n"
"tapi pemeriksaan tersebut sudah dinonaktifkan. Untuk aktifkan kembali, "
"gunakan\n"
-"bendera '--show-forced-updates' atau jalankan 'git config fetch."
-"showForcedUpdates true'."
+"bendera '--show-forced-updates' atau jalankan 'git config "
+"fetch.showForcedUpdates true'."
#: builtin/fetch.c
#, c-format
@@ -7468,6 +7467,21 @@ msgid "the object %s does not exist"
msgstr "objek '%s' tidak ada"
#: builtin/fetch.c
+#, c-format
+msgid ""
+"Run 'git remote set-head %s %s' to follow the change, or set\n"
+"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
+"if you do not want to see this message. Specifically running\n"
+"'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
+"until the remote changes HEAD to something else."
+msgstr ""
+"Jalankan 'git remote set-head %s %s' untuk mengikuti perubahan, atau setel\n"
+"opsi konfigurasi 'remote.%s.followRemoteHEAD' ke nilai yang berbeda jika\n"
+"Anda tidak ingin melihat pesan ini lagi. Secara rinci menjalakan\n"
+"'git config set remote.%s followRemoteHEAD %s' akan mematikan peringatan\n"
+"ini sampai remote mengubah HEAD ke yang lain."
+
+#: builtin/fetch.c
msgid "multiple branches detected, incompatible with --set-upstream"
msgstr "banyak cabang terdeteksi, tidak kompatibel dengan --set-upstream"
@@ -7641,6 +7655,10 @@ msgstr "peta referensi"
msgid "specify fetch refmap"
msgstr "sebutkan ambil peta referensi"
+#: builtin/fetch.c builtin/pull.c builtin/rebase.c builtin/replay.c
+msgid "revision"
+msgstr "revisi"
+
#: builtin/fetch.c builtin/pull.c
msgid "report that we have only objects reachable from this object"
msgstr ""
@@ -7711,8 +7729,8 @@ msgstr "protokol tidak mendukung --negotiate-only, keluar."
#: builtin/fetch.c
msgid ""
-"--filter can only be used with the remote configured in extensions."
-"partialclone"
+"--filter can only be used with the remote configured in "
+"extensions.partialclone"
msgstr ""
"--filter hanya dapat digunakan dengan remote yang terkonfigurasi di "
"extensions.partialclone"
@@ -8565,8 +8583,25 @@ msgid "%s scheduler is not available"
msgstr "penjadwal %s tidak tersedia"
#: builtin/gc.c
-msgid "another process is scheduling background maintenance"
-msgstr "proses lainnya sedang menjadwalkan peme"
+#, c-format
+msgid ""
+"unable to create '%s.lock': %s.\n"
+"\n"
+"Another scheduled git-maintenance(1) process seems to be running in this\n"
+"repository. Please make sure no other maintenance processes are running and\n"
+"then try again. If it still fails, a git-maintenance(1) process may have\n"
+"crashed in this repository earlier: remove the file manually to continue."
+msgstr ""
+"Tidak dapat membuat '%s.lock': %s.\n"
+"\n"
+"Sepertinya proses git-maintenance(1) lainnya berjalan pada repositori ini.\n"
+"Pastikan tidak ada proses pemeliharaan lainnya yang berjalan dan coba lagi.\n"
+"Jika masih gagal, suatu proses git-maintenance(1) bisa jadi hancur pada\n"
+"repositori ini sebelumnya: hapus berkas secara manual untuk melanjutkan."
+
+#: builtin/gc.c
+msgid "cannot acquire lock for scheduled background maintenance"
+msgstr "tidak dapat memperoleh kunci untuk pemeliharran balik layar terjadwal"
#: builtin/gc.c
msgid "git maintenance start [--scheduler=<scheduler>]"
@@ -9298,6 +9333,23 @@ msgstr[0] "panjang rantai = %d: %lu objek"
msgstr[1] "panjang rantai = %d: %lu objek"
#: builtin/index-pack.c
+msgid "could not start pack-objects to repack local links"
+msgstr "tidak dapat memulai pack-objects untuk mempak ulang tautan lokal"
+
+#: builtin/index-pack.c
+msgid "failed to feed local object to pack-objects"
+msgstr "tidak dapat memasukkan objek ke pada pack-objects"
+
+#: builtin/index-pack.c
+msgid "index-pack: Expecting full hex object ID lines only from pack-objects."
+msgstr ""
+"index-pack: Mengharapkan hanya baris hex ID objek penuh daripack-objects."
+
+#: builtin/index-pack.c
+msgid "could not finish pack-objects to repack local links"
+msgstr "tidak dapat menyelesaikan pack-objects untuk mempak ulang tautan lokal"
+
+#: builtin/index-pack.c
msgid "Cannot come back to cwd"
msgstr "tidak dapat kembali ke direktori kerja saat ini"
@@ -9312,6 +9364,10 @@ msgid "unknown hash algorithm '%s'"
msgstr "algoritma hash tak dikenal '%s'"
#: builtin/index-pack.c
+msgid "--promisor cannot be used with a pack name"
+msgstr "--promisor tidak dapat digunakan dengan nama pak"
+
+#: builtin/index-pack.c
msgid "--stdin requires a git repository"
msgstr "--stdin memerlukan repositori git"
@@ -11055,11 +11111,11 @@ msgstr "git notes [--ref <referensi catan>] [list [<objek>]]"
msgid ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <referensi catatan>] add [-f] [--allow-empty] [--"
"[no-]separator|--separator=<pemisah paragraf>] [--[no-]stripspace] [-m "
-"<pesan | -F <berkas> | (-c | -C) <objek>] [<objek>]"
+"<pesan> | -F <berkas> | (-c | -C) <objek>] [<objek>] [-e]"
#: builtin/notes.c
msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
@@ -11070,11 +11126,11 @@ msgstr ""
msgid ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <referensi catatan>] append [--alow-empty] [--"
"[no]separator|--separator=<pemisah paragraf>] [--[no-]stripspace] [-m "
-"<pesan> | -F <berkas> | (-c | -C) <objek>] [<objek>]"
+"<pesan> | -F <berkas> | (-c | -C) <objek>] [<objek>] [-e]"
#: builtin/notes.c
msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
@@ -11228,6 +11284,10 @@ msgid "reuse and edit specified note object"
msgstr "gunakan ulang dan sunting objek catatan yang disebutkan"
#: builtin/notes.c
+msgid "edit note message in editor"
+msgstr "sunting pesan catatan dalam penyunting"
+
+#: builtin/notes.c
msgid "reuse specified note object"
msgstr "gunakan ulang objek catatan yang disebutkan"
@@ -11857,6 +11917,10 @@ msgid "do not pack objects in promisor packfiles"
msgstr "jangan pak objek di dalam pak penjanji"
#: builtin/pack-objects.c
+msgid "implies --missing=allow-any"
+msgstr "mengimplikasikan --missing=allow-any"
+
+#: builtin/pack-objects.c
msgid "respect islands during delta compression"
msgstr "patuhi pulau selama pemampatan delta"
@@ -12269,8 +12333,8 @@ msgid ""
msgstr ""
"\n"
"Untuk menghindari konfigurasi cabang hulu otomatis ketika namanya\n"
-"tidak akan cocok dengan cabang lokal, lihat opsi 'simple' dari branch."
-"autoSetupMerge\n"
+"tidak akan cocok dengan cabang lokal, lihat opsi 'simple' dari "
+"branch.autoSetupMerge\n"
"di 'git help config'.\n"
#: builtin/push.c
@@ -13811,6 +13875,35 @@ msgstr[0] " Referensi lokal dikonfigurasi untuk 'git push'%s:"
msgstr[1] " Referensi lokal dikonfigurasi untuk 'git push'%s:"
#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' is unchanged and points to '%s'\n"
+msgstr "'%s/HEAD' tak berubah dan menunjuk pada '%s'\n"
+
+#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' has changed from '%s' and now points to '%s'\n"
+msgstr "'%s/HEAD' berubah dari '%s' dan sekarang menunjuk pada '%s'\n"
+
+#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' is now created and points to '%s'\n"
+msgstr "'%s/HEAD' sekarang dibuat dan menunjuk pada '%s'\n"
+
+#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' was detached at '%s' and now points to '%s'\n"
+msgstr "%s/HEAD' terlepas pada '%s' dan sekarang menunjuk pada '%s'\n"
+
+#: builtin/remote.c
+#, c-format
+msgid ""
+"'%s/HEAD' used to point to '%s' (which is not a remote branch), but now "
+"points to '%s'\n"
+msgstr ""
+"'%s/HEAD' dulunya menunjuk pada '%s' (yang bukan cabang remote), tetapi "
+"sekarang menunjuk pada '%s'\n"
+
+#: builtin/remote.c
msgid "set refs/remotes/<name>/HEAD according to remote"
msgstr "setel refs/remotes/<nama>/HEAD tergantung remote"
@@ -13838,8 +13931,8 @@ msgstr "Bukan referensi valid: %s"
#: builtin/remote.c
#, c-format
-msgid "Could not setup %s"
-msgstr "Tidak dapat mengatur %s"
+msgid "Could not set up %s"
+msgstr "Tidak dapat menyiapkan %s"
#: builtin/remote.c
#, c-format
@@ -17247,6 +17340,10 @@ msgstr "pasang mode pelacakan (lihat git-branch(1))"
msgid "try to match the new branch name with a remote-tracking branch"
msgstr "coba cocokkan nama cabang baru dengan sebuah cabang pelacakan remote"
+#: builtin/worktree.c
+msgid "use relative paths for worktrees"
+msgstr "gunakan jalur relatif untuk pohon kerja"
+
#: builtin/worktree.c diff.c parse-options.c
#, c-format
msgid "options '%s', '%s', and '%s' cannot be used together"
@@ -17588,6 +17685,31 @@ msgstr "tidak dapat membuat '%s'"
msgid "index-pack died"
msgstr "index-pack mati"
+#: cache-tree.c
+#, c-format
+msgid "directory '%s' is present in index, but not sparse"
+msgstr "direktori '%s' ada pada indeks, tapi bukan tipis"
+
+#: cache-tree.c unpack-trees.c
+msgid "corrupted cache-tree has entries not present in index"
+msgstr "pohon tembolok rusak mempunyai entri yang tidak ada pada indeks"
+
+#: cache-tree.c
+#, c-format
+msgid "%s with flags 0x%x should not be in cache-tree"
+msgstr "%s dengan bendera 0x%x tidak boleh ada di pohon tembolok"
+
+#: cache-tree.c
+#, c-format
+msgid "bad subtree '%.*s'"
+msgstr "subpohon jelek '%.*s'"
+
+#: cache-tree.c
+#, c-format
+msgid "cache-tree for path %.*s does not match. Expected %s got %s"
+msgstr ""
+"pohon tembolok untuk jalur %.*s tidak cocok. %s diharapkan tapi dapat %s"
+
#: chunk-format.c
msgid "terminating chunk id appears earlier than expected"
msgstr "id bingkah pengakhiran muncul lebih awal dari yang diharapkan"
@@ -18714,16 +18836,16 @@ msgid ""
"to convert the grafts into replace refs.\n"
"\n"
"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
msgstr ""
"Dukungan untuk <GIT_DIR>/info/grafts usang dan akan dihapus\n"
-"pada versi Git di masa yang akan datang.\n"
+"pada versi Git mendatang.\n"
"\n"
"Mohon gunakan \"git replace --convert-graft-file\"\n"
"untuk mengkonversi cangkuk ke referensi penggantian.\n"
"\n"
"Matikan pesan ini dengan menjalankan\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
#: commit.c
#, c-format
@@ -19739,6 +19861,21 @@ msgstr "url tidak punya skema: %s"
msgid "credential url cannot be parsed: %s"
msgstr "url kredensial tidak dapat diuraikan: %s"
+#: daemon.c
+#, c-format
+msgid "invalid timeout '%s', expecting a non-negative integer"
+msgstr "timeout '%s' tidak valid, bilangan bulat non-negatif diharapkan"
+
+#: daemon.c
+#, c-format
+msgid "invalid init-timeout '%s', expecting a non-negative integer"
+msgstr "init-timeout '%s' tidak valid, bilangan bulat non-negatif diharapkan"
+
+#: daemon.c
+#, c-format
+msgid "invalid max-connections '%s', expecting an integer"
+msgstr "max-connections '%s' tidak valid, bilangan bulat diharapkan"
+
#: date.c
msgid "in the future"
msgstr "di masa depan"
@@ -20632,6 +20769,21 @@ msgid "too many args to run %s"
msgstr "terlalu banyak argumen untuk menjalankan %s"
#: fetch-pack.c
+#, c-format
+msgid ""
+"You are attempting to fetch %s, which is in the commit graph file but not in "
+"the object database.\n"
+"This is probably due to repo corruption.\n"
+"If you are attempting to repair this repo corruption by refetching the "
+"missing object, use 'git fetch --refetch' with the missing object."
+msgstr ""
+"Anda mencoba mengambil %s, yang ada di dalam berkas grafik komit tapi bukan "
+"di dalam basis data objek.\n"
+"Bisa jadi ini dikarenakan kerusakan repositori.\n"
+"Apabila Anda mencoba memperbaiki keruskanan repositori ini dengan mengambil "
+"ulang objek yang hilang, gunakan 'git fetch --refetch' dengan objek tersebut."
+
+#: fetch-pack.c
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack: daftar dangkal diharapkan"
@@ -21351,11 +21503,11 @@ msgstr[1] ""
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
+"You can disable this warning with `git config set advice.ignoredHook false`."
msgstr ""
-"Kait '%s' diabaikan karena tidak disetel sebagai dapat dieksekusi.\n"
-"Anda dapat menonaktifkan peringatan ini dengan `git config advice."
-"ignoredHook false`."
+"Kait '%s' diabaikan karena tidak disetel sebagai berkas yang dapat\n"
+"dieksekusi. Anda dapat menonaktifkan peringatan ini dengan\n"
+"`git config set advice.ignoredHook false`."
#: http-fetch.c
msgid "not a git repository"
@@ -21376,18 +21528,10 @@ msgid "Delegation control is not supported with cURL < 7.22.0"
msgstr "Kontrol delegasi tidak didukung oleh cURL < 7.22.0"
#: http.c
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr "Penyematan kunci publik tidak didukung oleh cURL < 7.39.0"
-
-#: http.c
msgid "Unknown value for http.proactiveauth"
msgstr "nilai tidak dikenal untuk http.proactiveauth"
#: http.c
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr "CURLSSLOPT_NO_REVOKE tidak didukung dengan cURL < 7.44.0"
-
-#: http.c
#, c-format
msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
msgstr "Tulang punggung SSL '%s' tidak didukung, yang didukung:"
@@ -21609,6 +21753,11 @@ msgstr "CRLF terkutip terdeteksi"
msgid "unable to format message: %s"
msgstr "tidak dapat memformat pesan: %s"
+#: merge-ll.c
+#, c-format
+msgid "invalid marker-size '%s', expecting an integer"
+msgstr "marker-size '%s' tidak valid, bilangan bulat diharapkan"
+
#: merge-ort.c merge-recursive.c
#, c-format
msgid "Failed to merge submodule %s (not checked out)"
@@ -22955,19 +23104,17 @@ msgid ""
"\n"
"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"running \"git config set advice.objectNameWarning false\""
msgstr ""
"Biasanya Git tidak pernah membuat sebuah referensi yang diakhiri dengan\n"
-"40 karakter hex, karena akan diabaikan ketika Anda hanya menyebutkan 40-"
-"hex.\n"
+"40 karakter hex, karena akan diabaikan ketika Anda hanya merincikan 40-hex.\n"
"Referensi tersebut bisa tidak sengaja dibuat. Misalnya,\n"
"\n"
" git switch -c $br $(git rev-parse ...)\n"
"\n"
"dimana \"$br\" entah bagaimana kosong dan referensi 40-hex dibuat.\n"
-"Mohon periksa referensi tersebut dan mungkin hapus. Matikan pesan ini "
-"dengan\n"
-"menjalankan \"git config advice.objectNameWarning false\""
+"Mohon periksa referensi tersebut dan mungkin hapus. Matikan pesan ini\n"
+"dengan menjalankan \"git config set advice.objectNameWarning false\""
#: object-name.c
#, c-format
@@ -23166,15 +23313,6 @@ msgstr "bitmap multipak kehilangan indeks balik yang diperlukan"
msgid "could not open pack %s"
msgstr "tidak dapat membuka '%s'"
-#: pack-bitmap.c t/helper/test-read-midx.c
-msgid "could not determine MIDX preferred pack"
-msgstr "tidak dapat menentukan pak MIDX terpilih"
-
-#: pack-bitmap.c
-#, c-format
-msgid "preferred pack (%s) is invalid"
-msgstr "pak yang disukai '%s' kadaluarsa"
-
#: pack-bitmap.c
msgid "corrupt bitmap lookup table: triplet position out of index"
msgstr "tabel pencarian bitmap rusak: posisi kembar tiga di luar indeks"
@@ -24546,8 +24684,19 @@ msgid "log for %s is empty"
msgstr "log untuk %s kosong"
#: refs.c
-msgid "refusing to force and skip creation of reflog"
-msgstr "menolak memaksa dan melewatkan pembuatan reflog"
+#, c-format
+msgid "refusing to update reflog for pseudoref '%s'"
+msgstr "menolak memperbarui reflog untuk referensi semu '%s'"
+
+#: refs.c
+#, c-format
+msgid "refusing to update pseudoref '%s'"
+msgstr "menolak memperbarui referensi semu '%s'"
+
+#: refs.c
+#, c-format
+msgid "refusing to update reflog with bad name '%s'"
+msgstr "menolak memperbarui reflog dengan nama jelek '%s'"
#: refs.c
#, c-format
@@ -24555,9 +24704,8 @@ msgid "refusing to update ref with bad name '%s'"
msgstr "menolak memperbarui referensi dengan nama jelek '%s'"
#: refs.c
-#, c-format
-msgid "refusing to update pseudoref '%s'"
-msgstr "menolak memperbarui referensi semu '%s'"
+msgid "refusing to force and skip creation of reflog"
+msgstr "menolak memaksa dan melewatkan pembuatan reflog"
#: refs.c
#, c-format
@@ -24622,6 +24770,11 @@ msgstr ""
#: refs/files-backend.c
#, c-format
+msgid "cannot read ref file '%s'"
+msgstr "tidak dapat membaca berkas referensi '%s'"
+
+#: refs/files-backend.c
+#, c-format
msgid "cannot open directory %s"
msgstr "tidak dapat membuka direktori %s"
@@ -24885,6 +25038,11 @@ msgstr "lebih dari satu paket unggah diberikan, gunakan yang pertama"
#: remote.c
#, c-format
+msgid "unrecognized followRemoteHEAD value '%s' ignored"
+msgstr "nilai followRemoteHEAD yang tak dikenal '%s' diabaikan"
+
+#: remote.c
+#, c-format
msgid "unrecognized value transfer.credentialsInUrl: '%s'"
msgstr "nilai transfer.credentialsInUrl tidak dikenal: '%s'"
@@ -27240,6 +27398,10 @@ msgstr "komit %s tidak ditandai sebagai dapat dicapai"
msgid "too many commits marked reachable"
msgstr "terlalu banyak komit yang ditandai sebagai dapat dicapai"
+#: t/helper/test-read-midx.c
+msgid "could not determine MIDX preferred pack"
+msgstr "tidak dapat menentukan pak MIDX terpilih"
+
#: t/helper/test-serve-v2.c
msgid "test-tool serve-v2 [<options>]"
msgstr "test-tool serve-v2 [<opsi>]"
@@ -28027,6 +28189,10 @@ msgid ".git file incorrect"
msgstr "berkas .git salah"
#: worktree.c
+msgid ".git file absolute/relative path mismatch"
+msgstr "jalur absolut/relative berkas .git tidak cocok"
+
+#: worktree.c
msgid "not a valid path"
msgstr "bukan jalur valid"
@@ -28048,6 +28214,10 @@ msgid "gitdir unreadable"
msgstr "gitdir tidak dapat dibaca"
#: worktree.c
+msgid "gitdir absolute/relative path mismatch"
+msgstr "jalur absolut/relatif gitdir tidak cocok"
+
+#: worktree.c
msgid "gitdir incorrect"
msgstr "gitdir salah"
@@ -28091,6 +28261,16 @@ msgstr "tidak dapat menyetel balik %s di '%s'"
msgid "failed to set extensions.worktreeConfig setting"
msgstr "gagal menyetel setelan extensions.worktreeConfig"
+#: worktree.c
+msgid "unable to upgrade repository format to support relative worktrees"
+msgstr ""
+"tidak dapat meningkatkan format repositori untuk mendukung pohon kerja "
+"relatif"
+
+#: worktree.c
+msgid "unable to set extensions.relativeWorktrees setting"
+msgstr "gagal menyetel setelan extensions.relativeWorktrees"
+
#: wrapper.c
#, c-format
msgid "could not setenv '%s'"
diff --git a/po/sv.po b/po/sv.po
index 973dd940ac..5377b3ece7 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -5,10 +5,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: git 2.47.0\n"
+"Project-Id-Version: git 2.48.0\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2024-09-19 02:06+0000\n"
-"PO-Revision-Date: 2024-09-28 15:45+0100\n"
+"POT-Creation-Date: 2024-12-30 11:57+0100\n"
+"PO-Revision-Date: 2024-12-30 12:03+0100\n"
"Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
"Language-Team: Svenska <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n"
@@ -624,10 +624,10 @@ msgstr "Endast binära filer ändrade."
#, c-format
msgid ""
"\n"
-"Disable this message with \"git config advice.%s false\""
+"Disable this message with \"git config set advice.%s false\""
msgstr ""
"\n"
-"Slå av meddelandet med ”git config advice.%s false”"
+"Slå av meddelandet med ”git config set advice.%s false”"
#, c-format
msgid "%shint:%s%.*s%s\n"
@@ -1300,7 +1300,7 @@ msgstr "fel i deflate (%d)"
#, c-format
msgid "unable to start '%s' filter"
-msgstr "kane inte starta filtret ”%s”"
+msgstr "kan inte starta filtret ”%s”"
msgid "unable to redirect descriptor"
msgstr "kan inte omdirigera handtag"
@@ -1358,6 +1358,10 @@ msgid "not a tree object: %s"
msgstr "inte ett trädobjekt: %s"
#, c-format
+msgid "failed to unpack tree object %s"
+msgstr "misslyckades packa upp trädobjektet %s"
+
+#, c-format
msgid "File not found: %s"
msgstr "Hittar inte filen: %s"
@@ -2808,7 +2812,7 @@ msgstr "kunde inte slå upp HEAD"
#, c-format
msgid "HEAD (%s) points outside of refs/heads/"
-msgstr "HEAD (%s) pekar utenför refs/heads/"
+msgstr "HEAD (%s) pekar utanför refs/heads/"
#, c-format
msgid "branch %s is being rebased at %s"
@@ -2824,7 +2828,7 @@ msgstr "HEAD i arbetskatalogen %s har inte uppdaterats"
#, c-format
msgid "invalid branch name: '%s'"
-msgstr "gelaktigt namn på gren: ”%s”"
+msgstr "felaktigt namn på gren: ”%s”"
#, c-format
msgid "no commit on branch '%s' yet"
@@ -3297,7 +3301,7 @@ msgid "read commands from stdin"
msgstr "läs kommandon från standard in"
msgid "with --batch[-check]: ignores stdin, batches all known objects"
-msgstr "med --batch[-check]: ignorear standard in, buntar alla kända objekt"
+msgstr "med --batch[-check]: ignorerar standard in, buntar alla kända objekt"
msgid "Change or optimize batch output"
msgstr "Ändra eller optimera buntutdata"
@@ -3683,13 +3687,13 @@ msgid ""
"one remote, e.g. the 'origin' remote, consider setting\n"
"checkout.defaultRemote=origin in your config."
msgstr ""
-"Om du menade checka ut en spårad fjärrgren på t.ex ”origin”, kan du\n"
+"Om du menade checka ut en spårad fjärrgren på t.ex. ”origin”, kan du\n"
"göra det genom att ange hela namnet med flaggan --track:\n"
"\n"
" git checkout --track origin/<namn>\n"
"\n"
"Om du alltid vill att utcheckningar med tvetydiga <namn> ska\n"
-"föredra en fjärr, t.ex fjärren ”origin” kan du ställa in\n"
+"föredra en fjärr, t.ex. fjärren ”origin” kan du ställa in\n"
"checkout.defaultRemote=origin i din konfiguration."
#, c-format
@@ -3795,7 +3799,7 @@ msgid "Cannot switch branch to a non-commit '%s'"
msgstr "Kan inte växla gren till icke-incheckningen ”%s”"
msgid "missing branch or commit argument"
-msgstr "saknar gren- eller incheckingsargument"
+msgstr "saknar gren- eller incheckningsargument"
#, c-format
msgid "unknown conflict style '%s'"
@@ -3825,9 +3829,8 @@ msgstr "ny ofödd gren"
msgid "update ignored files (default)"
msgstr "uppdatera ignorerade filer (standard)"
-msgid "do not check if another worktree is holding the given ref"
-msgstr ""
-"kontrollera inte om en annan arbetskatalog håller den angivna referensen"
+msgid "do not check if another worktree is using this branch"
+msgstr "kontrollera inte om en annan arbetskatalog använder grenen"
msgid "checkout our version for unmerged files"
msgstr "checka ut vår version för ej sammanslagna filer"
@@ -4125,11 +4128,11 @@ msgstr "skapa en grund klon på detta djup"
msgid "create a shallow clone since a specific time"
msgstr "skapa en grund klon från en angiven tidpunkt"
-msgid "revision"
-msgstr "revision"
+msgid "ref"
+msgstr "ref"
-msgid "deepen history of shallow clone, excluding rev"
-msgstr "fördjupa historik för grund klon, exkludera revisionen"
+msgid "deepen history of shallow clone, excluding ref"
+msgstr "fördjupa historik för grund klon, exkludera ref"
msgid "clone only one branch, HEAD or --branch"
msgstr "klona endast en gren, HEAD eller --branch"
@@ -4422,7 +4425,7 @@ msgid "the object directory to store the graph"
msgstr "objektkatalogen där grafen ska lagras"
msgid "if the commit-graph is split, only verify the tip file"
-msgstr "om inchecknignsgrafen är delad, kontrollera bara spetsfilen"
+msgstr "om incheckningsgrafen är delad, kontrollera bara spetsfilen"
#, c-format
msgid "Could not open commit-graph '%s'"
@@ -4468,7 +4471,7 @@ msgstr "tillåt skriva en inkrementell incheckningsgraffil"
msgid "maximum number of commits in a non-base split commit-graph"
msgstr ""
-"maximalt antal incheckningar i en delad incheckingsgraf som inte är bad"
+"maximalt antal incheckningar i en delad incheckningsgraf som inte är bad"
msgid "maximum ratio between two levels of a split commit-graph"
msgstr "maximalt förhållande mellan två nivåer av en delad incheckningsgraf"
@@ -4477,7 +4480,7 @@ msgid "only expire files older than a given date-time"
msgstr "låt tid endast gå ut för filer äldre än givet datum och tid"
msgid "maximum number of changed-path Bloom filters to compute"
-msgstr "maximalt antal Bloom-filer med ändrad sökväg att beräkna"
+msgstr "maximalt antal Bloom-filter med ändrad sökväg att beräkna"
msgid "use at most one of --reachable, --stdin-commits, or --stdin-packs"
msgstr "använd som mest en av --reachable, --stdin-commits och --stdin-packs"
@@ -5054,10 +5057,10 @@ msgstr ""
msgid ""
"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
-"<name> <value>"
+"<name>"
msgstr ""
"git config unset [<filflagga>] [--all] [--value=<värde>] [--fixed-value] "
-"<namn> <värde>"
+"<namn>"
msgid "git config rename-section [<file-option>] <old-name> <new-name>"
msgstr "git config rename-section [<filflagga>] <gammalt-namn> <nytt-namn>"
@@ -5423,7 +5426,7 @@ msgstr "”credential-cache” ej tillgänglig; stöd för unix-uttag saknas"
#, c-format
msgid "unable to get credential storage lock in %d ms"
-msgstr "kan inte erhålla låset för lagring av inlogginsuppgifter på %d ms"
+msgstr "kan inte erhålla låset för lagring av inloggningsuppgifter på %d ms"
msgid ""
"git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]"
@@ -5490,12 +5493,8 @@ msgid "traversed %lu commits\n"
msgstr "traverserade %lu incheckningar\n"
#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"mer än %i taggar hittades; listar de %i senaste\n"
-"gav upp sökningen vid %s\n"
+msgid "found %i tags; gave up search at %s\n"
+msgstr "hittade %i taggar; gav upp sökning vid %s\n"
#, c-format
msgid "describe %s\n"
@@ -5783,7 +5782,7 @@ msgid "Expected 'to' command, got %s"
msgstr "Förväntade ”to”-kommando, fick %s"
msgid "Expected format name:filename for submodule rewrite option"
-msgstr "Förvändae formatet namn:filnamn för undermodul-omskrivningsflaggan"
+msgstr "Förväntade formatet namn:filnamn för undermodul-omskrivningsflaggan"
#, c-format
msgid "feature '%s' forbidden in input without --allow-unsafe-features"
@@ -5927,6 +5926,20 @@ msgstr "%s är inte ett giltigt objekt"
msgid "the object %s does not exist"
msgstr "objektet %s finns inte"
+#, c-format
+msgid ""
+"Run 'git remote set-head %s %s' to follow the change, or set\n"
+"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
+"if you do not want to see this message. Specifically running\n"
+"'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
+"until the remote changes HEAD to something else."
+msgstr ""
+"Kör ”git remote set-head %s %s” för att följa ändringen, eller sätt\n"
+"konfigurationsflaggan ”remote %s.followRemoteHEAD” till ett annat värde\n"
+"om du inte vill se det här meddelandet. Du kan specifikt inaktivera\n"
+"varningen till fjärren ändrar HEAD till något annat genom att köra\n"
+"”git config set remote %s.followRemoteHEAD %s”."
+
msgid "multiple branches detected, incompatible with --set-upstream"
msgstr "flera grenar upptäcktes, inkompatibelt med --set-upstream"
@@ -6064,6 +6077,9 @@ msgstr "referenskarta"
msgid "specify fetch refmap"
msgstr "ange referenskarta för ”fetch”"
+msgid "revision"
+msgstr "revision"
+
msgid "report that we have only objects reachable from this object"
msgstr "rapportera att vi bara har objekt nåbara från detta objektet"
@@ -6077,7 +6093,7 @@ msgid "check for forced-updates on all updated branches"
msgstr "se efter tvingade uppdateringar i alla uppdaterade grenar"
msgid "write the commit-graph after fetching"
-msgstr "skriv incheckingsgrafen efter hämtning"
+msgstr "skriv incheckningsgrafen efter hämtning"
msgid "accept refspecs from stdin"
msgstr "ta emot referenser från standard in"
@@ -6125,7 +6141,7 @@ msgid "--atomic can only be used when fetching from one remote"
msgstr "--atomic kan bara användas vid hämtning från en fjärr"
msgid "--stdin can only be used when fetching from one remote"
-msgstr "--stdin kan bara användas vid hämtning fårn en fjärr"
+msgstr "--stdin kan bara användas vid hämtning från en fjärr"
msgid ""
"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
@@ -6422,7 +6438,7 @@ msgid "report root nodes"
msgstr "rapportera rotnoder"
msgid "make index objects head nodes"
-msgstr "gör indexojekt till huvudnoder"
+msgstr "gör indexobjekt till huvudnoder"
msgid "make reflogs head nodes (default)"
msgstr "gör refloggar till huvudnoder (standard)"
@@ -6789,8 +6805,25 @@ msgstr "varken systemd-timer eller crontab är tillgänglig"
msgid "%s scheduler is not available"
msgstr "%s-schemaläggare är inte tillgänglig"
-msgid "another process is scheduling background maintenance"
-msgstr "en annan process schemalägger bakgrundsunderhåll"
+#, c-format
+msgid ""
+"unable to create '%s.lock': %s.\n"
+"\n"
+"Another scheduled git-maintenance(1) process seems to be running in this\n"
+"repository. Please make sure no other maintenance processes are running and\n"
+"then try again. If it still fails, a git-maintenance(1) process may have\n"
+"crashed in this repository earlier: remove the file manually to continue."
+msgstr ""
+"Kunde inte skapa ”%s.lock”: %s.\n"
+"\n"
+"Det verkar som en annan schemalagd git-maintenance(1)-process kör i det\n"
+"här arkivet. Se till att inga andra underhållsprocesser körs och försök\n"
+"sedan igen. Om det fortfarande misslyckas kanske en git-maintenance(1)-\n"
+"process har kraschat i det här arkivet tidigare: ta bort filen manuellt\n"
+"för att fortsätta."
+
+msgid "cannot acquire lock for scheduled background maintenance"
+msgstr "kan inte erhålla låset för schemalagt bakgrundsunderhåll"
msgid "git maintenance start [--scheduler=<scheduler>]"
msgstr "git maintenance start [--scheduler=<schemaläggare>]"
@@ -7320,7 +7353,7 @@ msgstr "paketfilnamnet ”%s” slutar inte med ”.%s”"
#, c-format
msgid "cannot write %s file '%s'"
-msgstr "kan inte ta skriva %s-fil ”%s”"
+msgstr "kan inte skriva %s-fil ”%s”"
#, c-format
msgid "cannot close written %s file '%s'"
@@ -7357,6 +7390,19 @@ msgid_plural "chain length = %d: %lu objects"
msgstr[0] "kedjelängd = %d: %lu objekt"
msgstr[1] "kedjelängd = %d: %lu objekt"
+msgid "could not start pack-objects to repack local links"
+msgstr "kunde inte starta pack-objects för att packa om lokala länkar"
+
+msgid "failed to feed local object to pack-objects"
+msgstr "misslyckades sända lokala objekt till pack-objects"
+
+msgid "index-pack: Expecting full hex object ID lines only from pack-objects."
+msgstr ""
+"index-pack: Förväntar kompletta hex-objekt-ID-rader endast från pack-objects."
+
+msgid "could not finish pack-objects to repack local links"
+msgstr "kunde inte avsluta pack-objects för att packa om lokala länkar"
+
msgid "Cannot come back to cwd"
msgstr "Kan inte gå tillbaka till arbetskatalogen (cwd)"
@@ -7368,6 +7414,9 @@ msgstr "felaktig %s"
msgid "unknown hash algorithm '%s'"
msgstr "okänd hashningsalgoritm ”%s”"
+msgid "--promisor cannot be used with a pack name"
+msgstr "--promisor kan inte användas med ett paketnamn"
+
msgid "--stdin requires a git repository"
msgstr "--stdin kräver ett git-arkiv"
@@ -7683,7 +7732,7 @@ msgid "cover-from-description-mode"
msgstr "cover-from-description-läge"
msgid "generate parts of a cover letter based on a branch's description"
-msgstr "skapa delar av omslagsbrevet baserat på grenbeskrivelsen"
+msgstr "skapa delar av omslagsbrevet baserat på grenbeskrivningen"
msgid "use branch description from file"
msgstr "använd grenbeskrivningar från fil"
@@ -7925,7 +7974,7 @@ msgid "show debugging data"
msgstr "visa felsökningsutdata"
msgid "suppress duplicate entries"
-msgstr "undertyck dublettposter"
+msgstr "undertryck dublettposter"
msgid "show sparse directories in the presence of a sparse index"
msgstr "visa glesa kataloger när et glest index existerar"
@@ -8017,7 +8066,7 @@ msgid "keep subject"
msgstr "behåll ärenderad"
msgid "keep non patch brackets in subject"
-msgstr "behåll hakparanterser som inte är ”patch” i ärenderaden"
+msgstr "behåll hakparenteser som inte är ”patch” i ärenderaden"
msgid "copy Message-ID to the end of commit message"
msgstr "kopiera Message-ID till slutet av incheckningsmeddelandet"
@@ -8172,7 +8221,7 @@ msgid "git merge-tree [--write-tree] [<options>] <branch1> <branch2>"
msgstr "git merge-tree [--write-tree] [<flaggor>] <gren1> <gren2>"
msgid "git merge-tree [--trivial-merge] <base-tree> <branch1> <branch2>"
-msgstr "git merge-tree [--trivial-merge] <baseträd> <gren1> <gren2>"
+msgstr "git merge-tree [--trivial-merge] <basträd> <gren1> <gren2>"
msgid "do a real merge instead of a trivial merge"
msgstr "gör en riktig sammanslagning istället för en enkel sammanslagning"
@@ -8708,11 +8757,11 @@ msgstr "git notes [--ref <anteckningsref>] [list [<objekt>]]"
msgid ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <anteckningsref>] add [-f] [--allow-empty] [--"
"[no-]separator|--separator=<styckebrytning>] [--[no-]stripspace] [-m <medd> "
-"| -F <fil> | (-c | -C) <objekt>] [<objekt>]"
+"| -F <fil> | (-c | -C) <objekt>] [<objekt>] [-e]"
msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
msgstr ""
@@ -8721,11 +8770,11 @@ msgstr ""
msgid ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <anteckningsref>] append [--allow-empty] [--"
"[no-]separator|--separator=<styckebrytning>] [--[no-]stripspace] [-m <medd> "
-"| -F <fil> | (-c | -C) <objekt>] [<objekt>]"
+"| -F <fil> | (-c | -C) <objekt>] [<objekt>] [-e]"
msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
msgstr "git notes [--ref <anteckningsref>] edit [--allow-empty] [<objekt>]"
@@ -8844,6 +8893,9 @@ msgstr "anteckningsinnehåll i en fil"
msgid "reuse and edit specified note object"
msgstr "återanvänd och redigera angivet anteckningsobjekt"
+msgid "edit note message in editor"
+msgstr "redigera anteckning i textredigeringsprogram"
+
msgid "reuse specified note object"
msgstr "återanvänd angivet anteckningsobjekt"
@@ -9192,7 +9244,7 @@ msgstr "kan inte öppna paketfilen"
#, c-format
msgid "loose object at %s could not be examined"
-msgstr "lösa objekt på %s kunde inte underökas"
+msgstr "lösa objekt på %s kunde inte undersökas"
msgid "unable to force loose object"
msgstr "kan inte tvinga lösa objekt"
@@ -9336,6 +9388,9 @@ msgstr "hantering av saknade objekt"
msgid "do not pack objects in promisor packfiles"
msgstr "packa inte objekt i kontraktspackfiler"
+msgid "implies --missing=allow-any"
+msgstr "implicerar --missing=allow-any"
+
msgid "respect islands during delta compression"
msgstr "respektera öar under deltakomprimering"
@@ -9638,7 +9693,7 @@ msgid "Need to specify how to reconcile divergent branches."
msgstr "Måste ange hur avvikande grenar skall förlikas."
msgid "cannot rebase with locally recorded submodule modifications"
-msgstr "kan inte ombasera med lokalt lagrade ändringar i undermoful"
+msgstr "kan inte ombasera med lokalt lagrade ändringar i undermodul"
msgid "git push [<options>] [<repository> [<refspec>...]]"
msgstr "git push [<flaggor>] [<arkiv> [<refspec>...]]"
@@ -10156,7 +10211,7 @@ msgid "empty exec command"
msgstr "tomt exec-kommando"
msgid "rebase onto given branch instead of upstream"
-msgstr "ombasera mot given grenen istället för uppström"
+msgstr "ombasera mot given gren istället för uppström"
msgid "use the merge-base of upstream and branch as the current base"
msgstr "använd sammanslagningsbasen mellan uppströms och gren som aktuell bas"
@@ -10548,7 +10603,7 @@ msgid "process the reflogs of all references"
msgstr "hantera referensloggar för alla referenser"
msgid "limits processing to reflogs from the current worktree only"
-msgstr "begränsar hantering av referensloggar till endst aktuell arbetskatalog"
+msgstr "begränsar hantering av referensloggar till endast aktuell arbetskatalog"
#, c-format
msgid "Marking reachable objects..."
@@ -10919,6 +10974,30 @@ msgid_plural " Local refs configured for 'git push'%s:"
msgstr[0] " Lokal referens konfigurerad för ”git push”%s:"
msgstr[1] " Lokala referenser konfigurerade för ”git push”%s:"
+#, c-format
+msgid "'%s/HEAD' is unchanged and points to '%s'\n"
+msgstr "”%s/HEAD” är oförändrad och pekar på ”%s”\n"
+
+#, c-format
+msgid "'%s/HEAD' has changed from '%s' and now points to '%s'\n"
+msgstr "”%s/HEAD” har ändrats från ”%s” och pekar nu på ”%s”\n"
+
+#, c-format
+msgid "'%s/HEAD' is now created and points to '%s'\n"
+msgstr "”%s/HEAD” har nu skapats och pekar på ”%s”\n"
+
+#, c-format
+msgid "'%s/HEAD' was detached at '%s' and now points to '%s'\n"
+msgstr "”%s/HEAD” kopplades från vid ”%s” och pekar nu på ”%s”\n"
+
+#, c-format
+msgid ""
+"'%s/HEAD' used to point to '%s' (which is not a remote branch), but now "
+"points to '%s'\n"
+msgstr ""
+"”%s/HEAD” pekade tidigare på ”%s” (som inte är en fjärrgren), men pekar nu "
+"på ”%s”\n"
+
msgid "set refs/remotes/<name>/HEAD according to remote"
msgstr "sätt refs/remotes/<namn>/HEAD enligt fjärren"
@@ -10940,7 +11019,7 @@ msgid "Not a valid ref: %s"
msgstr "Inte en giltig referens: %s"
#, c-format
-msgid "Could not setup %s"
+msgid "Could not set up %s"
msgstr "Kunde inte ställa in %s"
#, c-format
@@ -11787,7 +11866,7 @@ msgstr "Ingen sökvägsangivelse gavs. Vilka filer ska jag ta bort?"
msgid "please stage your changes to .gitmodules or stash them to proceed"
msgstr ""
-"löa dina ändringar i .gitmodules eller använd ”stash” för att fortsätta"
+"köa dina ändringar i .gitmodules eller använd ”stash” för att fortsätta"
#, c-format
msgid "not removing '%s' recursively without -r"
@@ -11861,7 +11940,7 @@ msgid "linewrap output"
msgstr "radbryt utdata"
msgid "field"
-msgstr "föt"
+msgstr "fält"
msgid "group by field"
msgstr "gruppera efter fält"
@@ -12022,7 +12101,7 @@ msgid "stricter reference checking, requires exact ref path"
msgstr "striktare referenskontroll, kräver exakt referenssökväg"
msgid "show the HEAD reference, even if it would be filtered out"
-msgstr "visa HEAD-refrens, även när den skulle filtreras ut"
+msgstr "visa HEAD-referens, även när den skulle filtreras ut"
msgid "dereference tags into object IDs"
msgstr "avreferera taggar till objekt-id"
@@ -12079,7 +12158,7 @@ msgid "initialize the sparse-checkout in cone mode"
msgstr "initiera sparse-checkout i konläge"
msgid "toggle the use of a sparse index"
-msgstr "slå på/av använding av glest index"
+msgstr "slå på/av användning av glest index"
#, c-format
msgid "unable to create leading directories of %s"
@@ -12250,7 +12329,7 @@ msgstr "Inga ”stash”-poster hittades."
#, c-format
msgid "%s is not a valid reference"
-msgstr "%s är inte en giltigt referens"
+msgstr "%s är inte en giltig referens"
msgid "git stash clear with arguments is unimplemented"
msgstr "”git stash clear” med argument har inte implementerats"
@@ -12501,7 +12580,7 @@ msgstr ""
"HEAD"
msgid "git submodule status [--quiet] [--cached] [--recursive] [<path>...]"
-msgstr "git submodule status [--quitet] [--cached] [--recursive] [<sökväg>...]"
+msgstr "git submodule status [--quiet] [--cached] [--recursive] [<sökväg>...]"
#, c-format
msgid "* %s %s(blob)->%s(submodule)"
@@ -12524,7 +12603,7 @@ msgid "unexpected mode %o"
msgstr "okänt läge %o"
msgid "use the commit stored in the index instead of the submodule HEAD"
-msgstr "använd incechkning lagrad i indexet istället för undermodulens HEAD"
+msgstr "använd incheckning lagrad i indexet istället för undermodulens HEAD"
msgid "compare the commit in the index with that in the submodule HEAD"
msgstr "jämför incheckningen i indexet med den i undermodulens HEAD"
@@ -13641,6 +13720,9 @@ msgstr "ställ in spårningsläge (se git-branch(1))"
msgid "try to match the new branch name with a remote-tracking branch"
msgstr "försök träffa namn på ny gren mot en fjärrspårande gren"
+msgid "use relative paths for worktrees"
+msgstr "använd relativa sökvägar för arbetskataloger"
+
#, c-format
msgid "options '%s', '%s', and '%s' cannot be used together"
msgstr "flaggorna ”%s”, ”%s” och ”%s” kan inte användas samtidigt"
@@ -13802,7 +13884,7 @@ msgstr "misslyckades lagra maximal skaparsymbol"
#, c-format
msgid "unrecognized bundle mode from URI '%s'"
-msgstr "okänt buntlägre från URI:en ”%s”"
+msgstr "okänt buntläge från URI:en ”%s”"
#, c-format
msgid "exceeded bundle URI recursion limit (%d)"
@@ -13912,6 +13994,26 @@ msgstr "kan inte skapa ”%s”"
msgid "index-pack died"
msgstr "index-pack dog"
+#, c-format
+msgid "directory '%s' is present in index, but not sparse"
+msgstr "katalogen ”%s” finns i indexet, men inte glest"
+
+msgid "corrupted cache-tree has entries not present in index"
+msgstr "trasigt cacheträd innehåller poster som inte finns i indexet"
+
+#, c-format
+msgid "%s with flags 0x%x should not be in cache-tree"
+msgstr "%s med flaggorna 0x%x borde inte finnas i cacheträdet"
+
+#, c-format
+msgid "bad subtree '%.*s'"
+msgstr "felaktigt underträd ”%.*s”"
+
+#, c-format
+msgid "cache-tree for path %.*s does not match. Expected %s got %s"
+msgstr ""
+"cacheträd för sökvägen %.*s stämmer inte överens. Förväntade %s fick %s"
+
msgid "terminating chunk id appears earlier than expected"
msgstr "avslutande stycke-id förekommer tidigare än förväntat"
@@ -14131,7 +14233,7 @@ msgid "Send a collection of patches from stdin to an IMAP folder"
msgstr "Sänd en samling patchar från stdin till en IMAP-mapp"
msgid "Build pack index file for an existing packed archive"
-msgstr "SKapa pack-indexfiler för ett befintligt packat arkiv"
+msgstr "Skapa pack-indexfiler för ett befintligt packat arkiv"
msgid "Create an empty Git repository or reinitialize an existing one"
msgstr "Skapa tomt Git-arkiv eller ominitiera ett befintligt"
@@ -14353,7 +14455,7 @@ msgid "Creates a temporary file with a blob's contents"
msgstr "Skapar temporära filer med innehållet från en blob"
msgid "Unpack objects from a packed archive"
-msgstr "Packa upp objekt från ett pakat arkiv"
+msgstr "Packa upp objekt från ett packat arkiv"
msgid "Register file contents in the working tree to the index"
msgstr "Registrera filinnehållet från arbetskatalogen i indexet"
@@ -14410,7 +14512,7 @@ msgid "Git for CVS users"
msgstr "Git för CVS-användare"
msgid "Tweaking diff output"
-msgstr "Justrea diff-utdata"
+msgstr "Justera diff-utdata"
msgid "A useful minimum set of commands for Everyday Git"
msgstr "Ett användbart minsta uppsättning kommandon för vardags-Git"
@@ -14518,7 +14620,7 @@ msgid "commit-graph generations chunk is wrong size"
msgstr "incheckningsgrafens generationsstycke har fel storlek"
msgid "commit-graph changed-path index chunk is too small"
-msgstr "incheckningsgrafens ändrade-sökvägar-indexstycke är förö litet"
+msgstr "incheckningsgrafens ändrade-sökvägar-indexstycke är för litet"
#, c-format
msgid ""
@@ -14582,10 +14684,10 @@ msgstr "incheckningsgrafens kedjefil är för liten"
#, c-format
msgid "invalid commit-graph chain: line '%s' not a hash"
-msgstr "ogiltig incheckingsgrafkedja: rad ”%s” är inte ett hash-värde"
+msgstr "ogiltig incheckningsgrafkedja: rad ”%s” är inte ett hash-värde"
msgid "unable to find all commit-graph files"
-msgstr "kan inte hitta alla incheckingsgraffiler"
+msgstr "kan inte hitta alla incheckningsgraffiler"
msgid "invalid commit position. commit-graph is likely corrupt"
msgstr "ogiltig incheckningsposition. incheckningsgrafen är troligtvis trasig"
@@ -14627,8 +14729,8 @@ msgstr "Samlar refererade incheckningar"
#, c-format
msgid "Finding commits for commit graph in %<PRIuMAX> pack"
msgid_plural "Finding commits for commit graph in %<PRIuMAX> packs"
-msgstr[0] "Söker incheckningar för incheckingsgraf i %<PRIuMAX> paket"
-msgstr[1] "Söker incheckningar för incheckingsgraf i %<PRIuMAX> paket"
+msgstr[0] "Söker incheckningar för incheckningsgraf i %<PRIuMAX> paket"
+msgstr[1] "Söker incheckningar för incheckningsgraf i %<PRIuMAX> paket"
#, c-format
msgid "error adding pack %s"
@@ -14639,10 +14741,10 @@ msgid "error opening index for %s"
msgstr "fel vid öppning av indexet för %s"
msgid "Finding commits for commit graph among packed objects"
-msgstr "Söker incheckningar för incheckingsgraf i packade objekt"
+msgstr "Söker incheckningar för incheckningsgraf i packade objekt"
msgid "Finding extra edges in commit graph"
-msgstr "Söker ytterligare kanter i incheckingsgraf"
+msgstr "Söker ytterligare kanter i incheckningsgraf"
msgid "failed to write correct number of base graph ids"
msgstr "misslyckades skriva korrekt antal bas-graf-id:n"
@@ -14664,7 +14766,7 @@ msgid "unable to open commit-graph chain file"
msgstr "kan inte öppna incheckningsgrafkedjefilen"
msgid "failed to rename base commit-graph file"
-msgstr "misslyckades byta namn på bas-incheckingsgraffilen"
+msgstr "misslyckades byta namn på bas-incheckningsgraffilen"
msgid "failed to rename temporary commit-graph file"
msgstr "misslyckades byta namn på temporär incheckningsgraffil"
@@ -14777,7 +14879,7 @@ msgid ""
"to convert the grafts into replace refs.\n"
"\n"
"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
msgstr ""
"Stöd för <GIT_DIR>/info/grafts avråds från och\n"
"kommer tas bort i en framtida version av Git.\n"
@@ -14786,7 +14888,7 @@ msgstr ""
"för att omvandla grafts till ersättningsreferenser.\n"
"\n"
"Slå av detta meddelande genom att skriva\n"
-"”git config advice.graftFileDeprecated false”"
+"”git config set advice.graftFileDeprecated false”"
#, c-format
msgid "commit %s exists in commit-graph but not in the object database"
@@ -15233,7 +15335,7 @@ msgstr "referensen ”%s” pekar inte på en blob"
#, c-format
msgid "unable to resolve config blob '%s'"
-msgstr "kan inte slå upp konfigurerings-bloben ”%s”"
+msgstr "kan inte slå upp konfigurerings-blobben ”%s”"
msgid "unable to parse command-line config"
msgstr "kan inte tolka kommandoradskonfiguration"
@@ -15595,7 +15697,20 @@ msgstr "url saknar protokoll: %s"
#, c-format
msgid "credential url cannot be parsed: %s"
-msgstr "kan inte tolka url för inloggingsuppgifter: %s"
+msgstr "kan inte tolka url för inloggningsuppgifter: %s"
+
+#, c-format
+msgid "invalid timeout '%s', expecting a non-negative integer"
+msgstr "felaktig tidsgräns ”%s”, förväntade ett icke-negativt heltal"
+
+#, c-format
+msgid "invalid init-timeout '%s', expecting a non-negative integer"
+msgstr ""
+"felaktig värde för init-timeout ”%s”, förväntade ett icke-negativt heltal"
+
+#, c-format
+msgid "invalid max-connections '%s', expecting an integer"
+msgstr "felaktigt värde för max-connections ”%s”, förväntade ett heltal"
msgid "in the future"
msgstr "i framtiden"
@@ -15987,7 +16102,7 @@ msgid "use default prefixes a/ and b/"
msgstr "använd standardprefixen a/ och b/"
msgid "show context between diff hunks up to the specified number of lines"
-msgstr "visa sammnhang mellan diff-stycken upp till angivet antal rader"
+msgstr "visa sammanhang mellan diff-stycken upp till angivet antal rader"
msgid "<char>"
msgstr "<tecken>"
@@ -16296,6 +16411,20 @@ msgstr "felaktig git-namnrymdssökväg ”%s”"
msgid "too many args to run %s"
msgstr "för många flaggor för att köra %s"
+#, c-format
+msgid ""
+"You are attempting to fetch %s, which is in the commit graph file but not in "
+"the object database.\n"
+"This is probably due to repo corruption.\n"
+"If you are attempting to repair this repo corruption by refetching the "
+"missing object, use 'git fetch --refetch' with the missing object."
+msgstr ""
+"Du försöker hämta %s som är i incheckningsgrafen men inte i "
+"objektdatabasen.\n"
+"Det händer antagligen på grund av att arkivet är trasigt.\n"
+"Om du försöker reparera det trasiga arkivet genom att hämta om det saknade "
+"objektet, använd ”git fetch --refetch” med det saknade objektet."
+
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack: förväntade grund lista"
@@ -16493,7 +16622,7 @@ msgstr "Servern tillåter inte förfrågan om ej tillkännagivet objekt %s"
#, c-format
msgid "fsmonitor_ipc__send_query: invalid path '%s'"
-msgstr "fsmonitor_ipc__send_query: ogilitg sökväg ”%s”"
+msgstr "fsmonitor_ipc__send_query: ogiltig sökväg ”%s”"
#, c-format
msgid "fsmonitor_ipc__send_query: unspecified error on '%s'"
@@ -16767,7 +16896,7 @@ msgid "Interacting with Others"
msgstr "Interaktion med andra"
msgid "Low-level Commands / Manipulators"
-msgstr "Lågnivåkommandon / maniupulerare"
+msgstr "Lågnivåkommandon / manipulerare"
msgid "Low-level Commands / Interrogators"
msgstr "Lågnivåkommandon / frågare"
@@ -16807,7 +16936,7 @@ msgid "External commands"
msgstr "Externa kommandon"
msgid "Command aliases"
-msgstr "Kommadoalias"
+msgstr "Kommandoalias"
msgid "See 'git help <command>' to read about a specific subcommand"
msgstr "Se ”git help <kommando>” för att läsa om ett specifikt underkommando"
@@ -16880,10 +17009,10 @@ msgstr[1] ""
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
+"You can disable this warning with `git config set advice.ignoredHook false`."
msgstr ""
"Kroken ”%s” ignorerades eftersom den inte är markerad som körbar.\n"
-"Du kan inaktivera varningen med ”git config advice.ignoredHook false”."
+"Du kan inaktivera varningen med ”git config set advice.ignoredHook false”."
msgid "not a git repository"
msgstr "inte ett git-arkiv"
@@ -16900,15 +17029,9 @@ msgstr "http.postBuffer har negativt värde; använder förvalet %d"
msgid "Delegation control is not supported with cURL < 7.22.0"
msgstr "Delegerad styrning stöds inte av cURL < 7.22.0"
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr "Fastnålning av öppen nyckel stöds inte av cURL < 7.39.0"
-
msgid "Unknown value for http.proactiveauth"
msgstr "Okänt värde för http.proactiveauth"
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr "CURLSSLOPT_NO_REVOKE stöds inte av cURL < 7.44.0"
-
#, c-format
msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
msgstr "SSL-bakändan ”%s” stöds inte. Dessa SSL-bakändor stöds:"
@@ -17092,6 +17215,10 @@ msgid "unable to format message: %s"
msgstr "kan inte formatera meddelandet: %s"
#, c-format
+msgid "invalid marker-size '%s', expecting an integer"
+msgstr "felaktigt värde för marker-size ”%s”, förväntade ett heltal"
+
+#, c-format
msgid "Failed to merge submodule %s (not checked out)"
msgstr "Misslyckades slå ihop undermodulen %s (ej utcheckad)"
@@ -17152,7 +17279,7 @@ msgid ""
"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
"implicit directory rename(s) putting the following path(s) there: %s."
msgstr ""
-"KONFLIKT (implicit nämnändrad kat): Befintlig fil/kat vid %s är i vägen för "
+"KONFLIKT (implicit namnändrad kat): Befintlig fil/kat vid %s är i vägen för "
"implicit namnändrad(e) katalog(er) som lägger dit följande sökväg(ar): %s."
#, c-format
@@ -17314,7 +17441,7 @@ msgid ""
" - resolve any other conflicts in the superproject\n"
" - commit the resulting index in the superproject\n"
msgstr ""
-"Rekursiv sammanslaning med undermoduler stöder för närvarande endast enkla "
+"Rekursiv sammanslagning med undermoduler stöder för närvarande endast enkla "
"fall.\n"
"Du måste hantera sammanslagning av undermoduler i konflikt manuellt.\n"
"Detta kan göras genom att utföra följande steg:\n"
@@ -17996,6 +18123,14 @@ msgid "missing mapping of %s to %s"
msgstr "saknar koppling av %s till %s"
#, c-format
+msgid "unable to open %s"
+msgstr "kan inte öppna %s"
+
+#, c-format
+msgid "files '%s' and '%s' differ in contents"
+msgstr "filerna ”%s” och ”%s” har olika innehåll"
+
+#, c-format
msgid "unable to write file %s"
msgstr "kan inte skriva filen %s"
@@ -18039,7 +18174,7 @@ msgstr "kan inte utföra ”deflate” på nytt strömobjekt (%d)"
#, c-format
msgid "deflateEnd on stream object failed (%d)"
-msgstr "”deflatEend” på strömobjektet misslyckades (%d)"
+msgstr "”deflateEnd” på strömobjektet misslyckades (%d)"
#, c-format
msgid "unable to create directory %s"
@@ -18081,10 +18216,6 @@ msgid "%s is not a valid '%s' object"
msgstr "%s är inte ett giltigt ”%s”-objekt"
#, c-format
-msgid "unable to open %s"
-msgstr "kan inte öppna %s"
-
-#, c-format
msgid "hash mismatch for %s (expected %s)"
msgstr "hash stämmer inte för %s (förväntade %s)"
@@ -18185,7 +18316,7 @@ msgid ""
"\n"
"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"running \"git config set advice.objectNameWarning false\""
msgstr ""
"Git skapar normalt aldrig referenser som slutar med 40 hexadecimala\n"
"tecken, då detta ignoreras när du anger 40-hex enbart. Dessa\n"
@@ -18195,7 +18326,7 @@ msgstr ""
"\n"
"där ”$br” på något sätt blivit tomt och en 40-hex-referens skapats.\n"
"Undersök referenserna och ta kanske bort dem. Stäng av meddelandet\n"
-"genom att köra ”git config advice.objectNameWarning false”"
+"genom att köra ”git config set advice.objectNameWarning false”"
#, c-format
msgid "log for '%.*s' only goes back to %s"
@@ -18313,7 +18444,7 @@ msgid ""
"corrupted bitmap index file (too short to fit pseudo-merge table header)"
msgstr ""
"trasig bitkarteindexfil (för kort för att få plats för pseudo-"
-"sammanslagningsatbellhuvudet)"
+"sammanslagningstabellhuvudet)"
msgid "corrupted bitmap index file (too short to fit pseudo-merge table)"
msgstr ""
@@ -18354,13 +18485,6 @@ msgstr "flerpaketsbitkarta saknar nödvändigt omvänt index"
msgid "could not open pack %s"
msgstr "kunde inte öppna paketfilen %s"
-msgid "could not determine MIDX preferred pack"
-msgstr "kunde inte bestämma det föredragna MIDX-paketet"
-
-#, c-format
-msgid "preferred pack (%s) is invalid"
-msgstr "föredragen paketfil (%s) är ogiltig"
-
msgid "corrupt bitmap lookup table: triplet position out of index"
msgstr "trasig bitkarteuppslagstabell: trippelposition utanför indexet"
@@ -18414,7 +18538,7 @@ msgstr "bitkarteresultat stämmer inte överens"
#, c-format
msgid "pseudo-merge index out of range (%<PRIu32> >= %<PRIuMAX>)"
-msgstr "pseudosammanslaningsindex utenför intervallet (%<PRIu32> ≥ %<PRIuMAX>)"
+msgstr "pseudosammanslagningsindex utanför intervallet (%<PRIu32> ≥ %<PRIuMAX>)"
#, c-format
msgid "could not find '%s' in pack '%s' at offset %<PRIuMAX>"
@@ -18509,7 +18633,7 @@ msgstr "offset före slutet av packindex för %s (trasigt index?)"
#, c-format
msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "offset borton slutet av packindex för %s (trunkerat index?)"
+msgstr "offset bortom slutet av packindex för %s (trunkerat index?)"
#, c-format
msgid "malformed expiration date '%s'"
@@ -18885,7 +19009,7 @@ msgid ""
"could not parse first line of `log` output: did not start with 'commit ': "
"'%s'"
msgstr ""
-"kunde inte tolka första raden i ”log”-updata: börjar inte med ”commit ”: ”%s”"
+"kunde inte tolka första raden i ”log”-utdata: börjar inte med ”commit ”: ”%s”"
#, c-format
msgid "could not parse git header '%.*s'"
@@ -19000,7 +19124,7 @@ msgstr "%s: öppning av indexfilen misslyckades"
#, c-format
msgid "%s: cannot stat the open index"
-msgstr "%s: kan inte ta startus på det öppna indexet"
+msgstr "%s: kan inte ta status på det öppna indexet"
#, c-format
msgid "%s: index file smaller than expected"
@@ -19269,7 +19393,7 @@ msgstr "kan inte helt tolka %s=%s"
#, c-format
msgid "value expected %s="
-msgstr "vädre förväntades %s="
+msgstr "värde förväntades %s="
#, c-format
msgid "positive value expected '%s' in %%(%s)"
@@ -19475,18 +19599,26 @@ msgstr "loggen för referensen %s slutade oväntat på %s"
msgid "log for %s is empty"
msgstr "loggen för %s är tom"
-msgid "refusing to force and skip creation of reflog"
-msgstr "vägrar att tvinga och hoppa över skapande av reflogg"
-
#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr "vägrar uppdatera referens med trasigt namn ”%s”"
+msgid "refusing to update reflog for pseudoref '%s'"
+msgstr "vägrar uppdatera referenslogg för pseudoreferensen ”%s”"
#, c-format
msgid "refusing to update pseudoref '%s'"
msgstr "vägrar uppdatera pseudoreferensen ”%s”"
#, c-format
+msgid "refusing to update reflog with bad name '%s'"
+msgstr "vägrar uppdatera referenslogg med trasigt namn ”%s”"
+
+#, c-format
+msgid "refusing to update ref with bad name '%s'"
+msgstr "vägrar uppdatera referens med trasigt namn ”%s”"
+
+msgid "refusing to force and skip creation of reflog"
+msgstr "vägrar att tvinga och hoppa över skapande av reflogg"
+
+#, c-format
msgid "update_ref failed for ref '%s': %s"
msgstr "update_ref misslyckades för referensen ”%s”: %s"
@@ -19536,6 +19668,10 @@ msgstr ""
"men är en vanlig referens"
#, c-format
+msgid "cannot read ref file '%s'"
+msgstr "kan inte läsa ref-fil ”%s”"
+
+#, c-format
msgid "cannot open directory %s"
msgstr "kunde inte öppna katalogen %s"
@@ -19741,6 +19877,10 @@ msgid "more than one uploadpack given, using the first"
msgstr "mer än en uploadpack angavs, använder den första"
#, c-format
+msgid "unrecognized followRemoteHEAD value '%s' ignored"
+msgstr "okänt värde ”%s” för followRemoteHEAD ignorerades"
+
+#, c-format
msgid "unrecognized value transfer.credentialsInUrl: '%s'"
msgstr "okänt värde transfer.credentialsInUrl: ”%s”"
@@ -19792,7 +19932,7 @@ msgid ""
"\n"
"Neither worked, so we gave up. You must fully qualify the ref."
msgstr ""
-"Målet du angav är inte ett komplett referensamn (dvs.,\n"
+"Målet du angav är inte ett komplett referensnamn (dvs.,\n"
"startar med ”refs/”). Vi försökte gissa vad du menade genom att:\n"
"\n"
"- Se efter en referens som motsvarar ”%s” på fjärrsidan.\n"
@@ -20050,7 +20190,7 @@ msgstr "misslyckades hitta trädet för %s."
#, c-format
msgid "unsupported section for hidden refs: %s"
-msgstr "sktionen för dolda referenser stöds ej: %s"
+msgstr "sektionen för dolda referenser stöds ej: %s"
msgid "--exclude-hidden= passed more than once"
msgstr "--exclude-hidden= angavs mer än en gång"
@@ -20333,7 +20473,7 @@ msgid ""
"not sending a push certificate since the receiving end does not support --"
"signed push"
msgstr ""
-"sänder inte push-certifikat eftersom mottagarsidan inte stlder push med --"
+"sänder inte push-certifikat eftersom mottagarsidan inte stöder push med --"
"signed"
msgid "the receiving end does not support --atomic push"
@@ -20693,7 +20833,7 @@ msgstr "”%s” är inte ett giltigt referensnamn"
#, c-format
msgid "update-ref requires a fully qualified refname e.g. refs/heads/%s"
-msgstr "update-ref kräver ett fullständigt referensnamn, t.ex refs/heads/%s"
+msgstr "update-ref kräver ett fullständigt referensnamn, t.ex. refs/heads/%s"
#, c-format
msgid "'%s' does not accept merge commits"
@@ -21665,6 +21805,9 @@ msgstr "incheckning %s är inte märkt nåbar"
msgid "too many commits marked reachable"
msgstr "för många incheckningar markerade nåbara"
+msgid "could not determine MIDX preferred pack"
+msgstr "kunde inte bestämma det föredragna MIDX-paketet"
+
msgid "test-tool serve-v2 [<options>]"
msgstr "test-tool serve-v2 [<flaggor>]"
@@ -21698,7 +21841,7 @@ msgstr ""
"[<buntstorlek>]"
msgid "name or pathname of unix domain socket"
-msgstr "namn eller sövkäg till unixdomän-uttag"
+msgstr "namn eller sökväg till unixdomän-uttag"
msgid "named-pipe name"
msgstr "namn på namngivet rör"
@@ -21800,10 +21943,10 @@ msgstr "kunde inte läsa referensen %s"
#, c-format
msgid "unknown response to connect: %s"
-msgstr "okänt svar på ansluntning: %s"
+msgstr "okänt svar på anslutning: %s"
msgid "setting remote service path not supported by protocol"
-msgstr "protkollet stöder inte att sätta sökväg till fjärrtjänst"
+msgstr "protokollet stöder inte att sätta sökväg till fjärrtjänst"
msgid "invalid remote service path"
msgstr "felaktig sökväg till fjärrtjänst"
@@ -21816,7 +21959,7 @@ msgid "--negotiate-only requires protocol v2"
msgstr "--negotiate-only kräver protokoll v2"
msgid "'option' without a matching 'ok/error' directive"
-msgstr "”option” utan mostsvarande ”ok/error”-direktiv"
+msgstr "”option” utan motsvarande ”ok/error”-direktiv"
#, c-format
msgid "expected ok/error, helper said '%s'"
@@ -22319,6 +22462,9 @@ msgstr ".git-filen är trasig"
msgid ".git file incorrect"
msgstr ".git-filen är felaktig"
+msgid ".git file absolute/relative path mismatch"
+msgstr "absolut/relativ sökväg för .git-fil stämmer inte överens"
+
msgid "not a valid path"
msgstr "inte en giltig sökväg"
@@ -22334,6 +22480,9 @@ msgstr "kan inte hitta arkivet; ”.git”-filen är trasig"
msgid "gitdir unreadable"
msgstr "gitdir är oläsbar"
+msgid "gitdir absolute/relative path mismatch"
+msgstr "absolut/relativ sökväg för git-katalog stämmer inte överens"
+
msgid "gitdir incorrect"
msgstr "gitdir är felaktig"
@@ -22368,6 +22517,13 @@ msgstr "kan inte slå av %s i ”%s”"
msgid "failed to set extensions.worktreeConfig setting"
msgstr "misslyckades ändra inställningen extensions.worktreeConfig"
+msgid "unable to upgrade repository format to support relative worktrees"
+msgstr ""
+"kunde inte uppgradera arkivformat till att stöda relativa arbetskataloger"
+
+msgid "unable to set extensions.relativeWorktrees setting"
+msgstr "misslyckades ändra inställningen extensions.relativeWorktrees"
+
#, c-format
msgid "could not setenv '%s'"
msgstr "kunde inte lagra miljövariabeln ”%s”"
@@ -22866,7 +23022,7 @@ msgstr "Kan inte byta katalog till $cdup, toppnivån på arbetskatalogen"
#, sh-format
msgid "fatal: $program_name cannot be used without a working tree."
-msgstr "ödesdigetrt: $program_name kan inte användas utan arbetskatalog."
+msgstr "ödesdigert: $program_name kan inte användas utan arbetskatalog."
msgid "Cannot rewrite branches: You have unstaged changes."
msgstr "Kan inte skriva om grenar: Du har oköade ändringar."
@@ -22915,7 +23071,7 @@ msgid "--dump-aliases incompatible with other options\n"
msgstr "--dump-aliases är inkompatibelt med andra flaggor\n"
msgid "--dump-aliases and --translate-aliases are mutually exclusive\n"
-msgstr "--dump-aliases och --translate-aliases är ömsesidigt utelsutande\n"
+msgstr "--dump-aliases och --translate-aliases är ömsesidigt uteslutande\n"
msgid ""
"fatal: found configuration options for 'sendmail'\n"
@@ -22956,7 +23112,7 @@ msgstr "varning: ”:include:” stöds inte: %s\n"
#, perl-format
msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
-msgstr "varning: omdirigering til ”/fil” eller ”|rör” stöds inte: %s\n"
+msgstr "varning: omdirigering till ”/fil” eller ”|rör” stöds inte: %s\n"
#, perl-format
msgid "warning: sendmail line is not recognized: %s\n"
@@ -23184,7 +23340,7 @@ msgid "cannot send message as 7bit"
msgstr "kan inte sända brev som sjubitars"
msgid "invalid transfer encoding"
-msgstr "ogiltig överföringskondning"
+msgstr "ogiltig överföringskodning"
#, perl-format
msgid ""
@@ -23217,10 +23373,3 @@ msgstr ""
#, perl-format
msgid "Do you really want to send %s? [y|N]: "
msgstr "Vill du verkligen sända %s? [y=ja, n=nej]: "
-
-#~ msgid "revision walk setup failed\n"
-#~ msgstr "misslyckades starta revisionstraversering\n"
-
-#, c-format
-#~ msgid "unable to parse contact: %s"
-#~ msgstr "kan inte tolka kontakt: %s"
diff --git a/po/tr.po b/po/tr.po
index 7aede5cd5f..1bc43453aa 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -2,7 +2,7 @@
# Git Türkçe çevirileri
# Copyright (C) 2020-2024 Emir SARI <emir_sari@icloud.com>
# This file is distributed under the same license as the Git package.
-# Emir SARI <emir_sari@icloud.com>, 2020-2024
+# Emir SARI <emir_sari@icloud.com>, 2020-2025
#
# ######################################################### #
# Git Türkçe kavramlar dizini / Git Turkish Glossary #
@@ -96,8 +96,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Git Turkish Localization Project\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2024-10-03 06:52+0300\n"
-"PO-Revision-Date: 2024-10-03 07:00+0300\n"
+"POT-Creation-Date: 2024-12-23 18:57+0000\n"
+"PO-Revision-Date: 2025-01-01 15:00+0300\n"
"Last-Translator: Emir SARI <emir_sari@icloud.com>\n"
"Language-Team: Turkish (https://github.com/bitigchi/git-po/)\n"
"Language: tr\n"
@@ -714,10 +714,10 @@ msgstr "Yalnızca ikili dosyalar değiştirildi."
#, c-format
msgid ""
"\n"
-"Disable this message with \"git config advice.%s false\""
+"Disable this message with \"git config set advice.%s false\""
msgstr ""
"\n"
-"Bu iletiyi \"git config advice.%s false\" ile devre dışı bırakın"
+"Bu iletiyi \"git config set advice.%s false\" ile devre dışı bırakın"
#, c-format
msgid "%shint:%s%.*s%s\n"
@@ -1441,8 +1441,9 @@ msgstr "geçerli bir nesne adı değil: %s"
msgid "not a tree object: %s"
msgstr "bir ağaç nesnesi değil: %s"
-msgid "unable to checkout working tree"
-msgstr "çalışma ağacı çıkış yapılamıyor"
+#, c-format
+msgid "failed to unpack tree object %s"
+msgstr "%s ağaç nesnesi açılamadı"
#, c-format
msgid "File not found: %s"
@@ -3072,8 +3073,8 @@ msgid "HEAD not found below refs/heads!"
msgstr "HEAD, refs/heads altında bulunamadı!"
msgid ""
-"branch with --recurse-submodules can only be used if submodule."
-"propagateBranches is enabled"
+"branch with --recurse-submodules can only be used if "
+"submodule.propagateBranches is enabled"
msgstr ""
"--recurse-submodules ile dallanma, yalnızca submodule.propagateBranches "
"etkinleştirilmişse kullanılabilir"
@@ -3921,9 +3922,8 @@ msgstr "yeni henüz doğmamış dal"
msgid "update ignored files (default)"
msgstr "yok sayılan dosyaları güncelle (öntanımlı)"
-msgid "do not check if another worktree is holding the given ref"
-msgstr ""
-"verilen başvuruyu başka bir çalışma ağacının tutup tutmadığını denetleme"
+msgid "do not check if another worktree is using this branch"
+msgstr "bu dalı başka bir çalışma ağacının kullanıp kullanmadığını denetleme"
msgid "checkout our version for unmerged files"
msgstr "birleştirilmeyen dosyalar için bizdeki sürümü çıkış yap"
@@ -4224,11 +4224,11 @@ msgstr "verilen derinlikte sığ bir depo oluştur"
msgid "create a shallow clone since a specific time"
msgstr "verilen zamandan sonrasını içeren bir sığ depo oluştur"
-msgid "revision"
-msgstr "revizyon"
+msgid "ref"
+msgstr "başvuru"
-msgid "deepen history of shallow clone, excluding rev"
-msgstr "revizyonu hariç tutarak sığ klonun geçmişini derinleştir"
+msgid "deepen history of shallow clone, excluding ref"
+msgstr "başvuru hariç tutarak sığ klonun geçmişini derinleştir"
msgid "clone only one branch, HEAD or --branch"
msgstr "yalnızca bir dal klonla, HEAD veya --branch"
@@ -4355,6 +4355,9 @@ msgstr "sparse-checkout ilklendirilemedi"
msgid "remote HEAD refers to nonexistent ref, unable to checkout"
msgstr "uzak konum HEAD'i, var olmayan başvuruya başvuruyor; çıkış yapılamıyor"
+msgid "unable to checkout working tree"
+msgstr "çalışma ağacı çıkış yapılamıyor"
+
msgid "unable to write parameters to config file"
msgstr "parametreler yapılandırma dosyasına yazılamıyor"
@@ -5163,10 +5166,10 @@ msgstr ""
msgid ""
"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
-"<name> <value>"
+"<name>"
msgstr ""
"git config unset [<dosya-seçeneği>] [--all] [--value=<değer>] [--fixed-"
-"value] <ad> <değer>"
+"value] <ad>"
msgid "git config rename-section [<file-option>] <old-name> <new-name>"
msgstr "git config rename-section [<dosya-seçeneği>] <eski-ad> <yeni-ad>"
@@ -5601,12 +5604,8 @@ msgid "traversed %lu commits\n"
msgstr "%lu işleme katedildi\n"
#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"%i etiketten fazla etiket bulundu; en son %i listelendi\n"
-"şu konumda arama bırakıldı: %s\n"
+msgid "found %i tags; gave up search at %s\n"
+msgstr "%i etiket bulundu; arama şurada bitirildi: %s\n"
#, c-format
msgid "describe %s\n"
@@ -6040,6 +6039,21 @@ msgstr "%s geçerli bir nesne değil"
msgid "the object %s does not exist"
msgstr "%s diye bir nesne yok"
+#, c-format
+msgid ""
+"Run 'git remote set-head %s %s' to follow the change, or set\n"
+"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
+"if you do not want to see this message. Specifically running\n"
+"'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
+"until the remote changes HEAD to something else."
+msgstr ""
+"Değişikliği izlemek için 'git remote set-head %s %s' yapın veya\n"
+"'remote.%s.followRemoteHEAD' yapılandırma seçeneğini başka bir\n"
+"değere ayarlayın (bu iletiyi görmek istemiyorsanız). Özellikle\n"
+"'git config set remote.%s.followRemoteHEAD %s' komutunu çalıştırmak\n"
+"uyarıyı HEAD'e veya başka bir şeye uzaktan değişiklik olana dek\n"
+"devre dışı bırakır."
+
msgid "multiple branches detected, incompatible with --set-upstream"
msgstr "birden çok dal algılandı, --set-upstream ile uyumsuz"
@@ -6178,6 +6192,9 @@ msgstr "ilgili başvuru"
msgid "specify fetch refmap"
msgstr "getirme ile ilgili başvuruları belirt"
+msgid "revision"
+msgstr "revizyon"
+
msgid "report that we have only objects reachable from this object"
msgstr "yalnızca bu nesneden ulaşılabilir nesnelerimiz olduğunu bildir"
@@ -6232,8 +6249,8 @@ msgid "protocol does not support --negotiate-only, exiting"
msgstr "protokol, --negotiate-only desteklemediğinden çıkılıyor"
msgid ""
-"--filter can only be used with the remote configured in extensions."
-"partialclone"
+"--filter can only be used with the remote configured in "
+"extensions.partialclone"
msgstr ""
"--filter, yalnızca extensions.partialclone içinde yapılandırılmış uzak konum "
"ile kullanılabilir"
@@ -6898,8 +6915,27 @@ msgstr "ne systemd zamanlayıcıları ne de crontab kullanılabiliyor"
msgid "%s scheduler is not available"
msgstr "%s planlayıcısı kullanılamıyor"
-msgid "another process is scheduling background maintenance"
-msgstr "başka bir işlem arka plan bakımı zamanını planlıyor"
+#, c-format
+msgid ""
+"unable to create '%s.lock': %s.\n"
+"\n"
+"Another scheduled git-maintenance(1) process seems to be running in this\n"
+"repository. Please make sure no other maintenance processes are running and\n"
+"then try again. If it still fails, a git-maintenance(1) process may have\n"
+"crashed in this repository earlier: remove the file manually to continue."
+msgstr ""
+"'%s.lock' oluşturulamıyor: %s.\n"
+"\n"
+"Bu depoda başka bir planlı git-maintenance(1) süreci çalışıyor gibi\n"
+"görünüyor. Lütfen başka bir bakım sürecinin çalışmıyor olduğundan emin\n"
+"olun ve yeniden deneyin. Eğer hâlâ başarısız oluyorsa bir git-"
+"maintenance(1)\n"
+"süreci bu depo içinde daha önceden çakılmış olabilir: Sürdürmek için "
+"dosyayı\n"
+"elle kaldırın."
+
+msgid "cannot acquire lock for scheduled background maintenance"
+msgstr "planlı arka plan bakımı için kilit alınamıyor"
msgid "git maintenance start [--scheduler=<scheduler>]"
msgstr "git maintenance start [--scheduler=<görev-planlayıcı>]"
@@ -7472,8 +7508,22 @@ msgid_plural "chain length = %d: %lu objects"
msgstr[0] "zincir uzunluğu = %d: %lu nesne"
msgstr[1] "zincir uzunluğu = %d: %lu nesne"
+msgid "could not start pack-objects to repack local links"
+msgstr "yerel bağlantıları yeniden paketleme için pack-objects başlatılamadı"
+
+msgid "failed to feed local object to pack-objects"
+msgstr "yerel nesne pack-objects'e beslenemedi"
+
+msgid "index-pack: Expecting full hex object ID lines only from pack-objects."
+msgstr ""
+"index-pack: Onaltılı tam nesne kimliği satırları yalnızca pack-objects'ten "
+"bekleniyor."
+
+msgid "could not finish pack-objects to repack local links"
+msgstr "yerel bağlantıları yeniden paketleme için pack-objects bitirilemedi"
+
msgid "Cannot come back to cwd"
-msgstr "Şu anki çalışma dizinine geri gelinemiyor"
+msgstr "Geçerli çalışma dizinine geri gelinemiyor"
#, c-format
msgid "bad %s"
@@ -7483,6 +7533,9 @@ msgstr "hatalı %s"
msgid "unknown hash algorithm '%s'"
msgstr "bilinmeyen sağlama algoritması '%s'"
+msgid "--promisor cannot be used with a pack name"
+msgstr "--promisor bir paket adıyla kullanılamaz"
+
msgid "--stdin requires a git repository"
msgstr "--stdin bir git dizini gerektirir"
@@ -8826,11 +8879,11 @@ msgstr "git notes [--ref <not-bşvr>] [list [<nesne>]]"
msgid ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
-"git notes [--ref <not-bşv>] add [-f] [--allow-empty] [--[no-]separator|--"
-"separator=<paragraf-sonu>] [--[no-]stripspace] [-m <ilet> | -F <dosya> | (-c "
-"| -C) <nesne>] [<nesne>]"
+"git notes [--ref <notlar-baş>] add [-f] [--allow-empty] [--[no-]separator|--"
+"separator=<paragraf-kes>] [--[no-]stripspace] [-m <ileti> | -F <dosya> | (-c "
+"| -C) <nesne>] [<nesne>] [-e]"
msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
msgstr "git notes [--ref <not-bşvr>] copy [-f] <nesneden> <nesneye>"
@@ -8838,11 +8891,11 @@ msgstr "git notes [--ref <not-bşvr>] copy [-f] <nesneden> <nesneye>"
msgid ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
-"git notes [--ref <not-bşv>] append [--allow-empty] [--[no-]separator|--"
-"separator=<paragraf-sonu>] [--[no-]stripspace] [-m <ileti> | -F <dosya> | (-"
-"c | -C) <nesne>] [<nesne>]"
+"git notes [--ref <notlar-baş>] append [--allow-empty] [--[no-]separator|--"
+"separator=<paragraf-kes>] [--[no-]stripspace] [-m <ileti> | -F <dosya> | (-c "
+"| -C) <nesne>] [<nesne>] [-e]"
msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
msgstr "git notes [--ref <not-bşvr>] edit [--allow-empty] [<nesne>]"
@@ -8960,6 +9013,9 @@ msgstr "not içeriği bir dosyada"
msgid "reuse and edit specified note object"
msgstr "belirtilen not nesnesini düzenle ve yeniden kullan"
+msgid "edit note message in editor"
+msgstr "not iletisini düzenleyicide aç"
+
msgid "reuse specified note object"
msgstr "belirtilen not nesnesini yeniden kullan"
@@ -9456,6 +9512,9 @@ msgstr "eksik nesneler için işlem"
msgid "do not pack objects in promisor packfiles"
msgstr "nesneleri vaatçi paket dosyalarıyla paketleme"
+msgid "implies --missing=allow-any"
+msgstr "--missing=allow-any ima eder"
+
msgid "respect islands during delta compression"
msgstr "delta sıkıştırması sırasında adalara uy"
@@ -11057,6 +11116,31 @@ msgid_plural " Local refs configured for 'git push'%s:"
msgstr[0] " 'git push'%s için yapılandırılan yerel başvuru:"
msgstr[1] " 'git push'%s için yapılandırılan yerel başvurular:"
+#, c-format
+msgid "'%s/HEAD' is unchanged and points to '%s'\n"
+msgstr "'%s/HEAD' değiştirilmedi ve '%s' konumuna işaret ediyor\n"
+
+#, c-format
+msgid "'%s/HEAD' has changed from '%s' and now points to '%s'\n"
+msgstr "'%s/HEAD', '%s' konumundan '%s' konumuna değiştirildi\n"
+
+#, c-format
+msgid "'%s/HEAD' is now created and points to '%s'\n"
+msgstr "'%s/HEAD' şimdi oluşturuldu ve '%s' konumuna işaret ediyor\n"
+
+#, c-format
+msgid "'%s/HEAD' was detached at '%s' and now points to '%s'\n"
+msgstr ""
+"'%s/HEAD', '%s' konumunda ayrıldı ve artık '%s' konumuna işaret ediyor\n"
+
+#, c-format
+msgid ""
+"'%s/HEAD' used to point to '%s' (which is not a remote branch), but now "
+"points to '%s'\n"
+msgstr ""
+"'%s/HEAD', uzak dal olmayan '%s' konumuna işaret ediyordu; ancak şimdi '%s' "
+"konumuna işaret ediyor\n"
+
msgid "set refs/remotes/<name>/HEAD according to remote"
msgstr "refs/remotes/<ad>/HEAD'i uzak konuma göre ayarla"
@@ -11078,7 +11162,7 @@ msgid "Not a valid ref: %s"
msgstr "Geçerli bir başvuru değil: %s"
#, c-format
-msgid "Could not setup %s"
+msgid "Could not set up %s"
msgstr "%s ayarlanamadı"
#, c-format
@@ -13779,6 +13863,9 @@ msgstr "izleme kipini ayarla (bkz: git-branch(1))"
msgid "try to match the new branch name with a remote-tracking branch"
msgstr "yeni dalın adını bir uzak izleme dalıyla eşleştirmeyi dene"
+msgid "use relative paths for worktrees"
+msgstr "çalışma ağaçları için göreceli yollar kullan"
+
#, c-format
msgid "options '%s', '%s', and '%s' cannot be used together"
msgstr "'%s', '%s' ve '%s' seçenekleri birlikte kullanılamaz"
@@ -14050,6 +14137,25 @@ msgstr "'%s' oluşturulamıyor"
msgid "index-pack died"
msgstr "index-pack sonlandı"
+#, c-format
+msgid "directory '%s' is present in index, but not sparse"
+msgstr "'%s' dizini indekste var; ancak aralıklı değil"
+
+msgid "corrupted cache-tree has entries not present in index"
+msgstr "hasarlı cache-tree'de indekste olmayan girdiler var"
+
+#, c-format
+msgid "%s with flags 0x%x should not be in cache-tree"
+msgstr "%s, 0x%x bayraklı olarak cache-tree'de olmamalı"
+
+#, c-format
+msgid "bad subtree '%.*s'"
+msgstr "hatalı alt ağaç '%.*s'"
+
+#, c-format
+msgid "cache-tree for path %.*s does not match. Expected %s got %s"
+msgstr "%.*s yolu için olan cache-tree eşleşmiyor. %s bekleniyordu, %s alındı"
+
msgid "terminating chunk id appears earlier than expected"
msgstr "iri parça numarası sonlandırması beklenenden önce ortaya çıkıyor"
@@ -14829,8 +14935,8 @@ msgid ""
"attempting to write a commit-graph, but 'commitGraph.changedPathsVersion' "
"(%d) is not supported"
msgstr ""
-"bir commit-graph yazılmaya çalışılıyor; ancak 'commitGraph."
-"changedPathsVersion' (%d) desteklenmiyor"
+"bir commit-graph yazılmaya çalışılıyor; ancak "
+"'commitGraph.changedPathsVersion' (%d) desteklenmiyor"
msgid "too many commits to write graph"
msgstr "grafik yazımı için pek fazla işleme"
@@ -14909,7 +15015,7 @@ msgid ""
"to convert the grafts into replace refs.\n"
"\n"
"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
msgstr ""
"<GIT_DIR>/info/grafts desteği artık kullanılmamalı\n"
"ve ileriki bir Git sürümünde kaldırılacak.\n"
@@ -14917,7 +15023,7 @@ msgstr ""
"Aşıları değiştirme başvurularına dönüştürmek için\n"
"lütfen \"git replace --convert-graft-file\" kullanın.\n"
"\n"
-"\"git config advice.graftFileDeprecated false\"\n"
+"\"git config set advice.graftFileDeprecated false\"\n"
"kullanarak bu iletiyi kapatabilirsiniz"
#, c-format
@@ -15176,8 +15282,8 @@ msgid ""
"remote URLs cannot be configured in file directly or indirectly included by "
"includeIf.hasconfig:remote.*.url"
msgstr ""
-"uzak URL'ler dosya içinde doğrudan veya başka türlü includeIf.hasconfig:"
-"remote.*.url kullanarak yapılandırılamaz"
+"uzak URL'ler dosya içinde doğrudan veya başka türlü "
+"includeIf.hasconfig:remote.*.url kullanarak yapılandırılamaz"
#, c-format
msgid "invalid config format: %s"
@@ -15733,6 +15839,19 @@ msgstr "url'nin şeması yok: %s"
msgid "credential url cannot be parsed: %s"
msgstr "yetki url'si ayrıştırılamıyor: %s"
+#, c-format
+msgid "invalid timeout '%s', expecting a non-negative integer"
+msgstr "geçersiz zaman aşımı '%s', negatif olmayan bir tamsayı bekleniyor"
+
+#, c-format
+msgid "invalid init-timeout '%s', expecting a non-negative integer"
+msgstr ""
+"geçersiz ilklendirme zaman aşımı '%s', negatif olmayan bir tamsayı bekleniyor"
+
+#, c-format
+msgid "invalid max-connections '%s', expecting an integer"
+msgstr "geçersiz en çok bağlantı '%s', bir tamsayı bekleniyor"
+
msgid "in the future"
msgstr "gelecekte"
@@ -16439,6 +16558,20 @@ msgstr "hatalı git ad alanı yolu \"%s\""
msgid "too many args to run %s"
msgstr "%s çalıştırmak için pek fazla argüman"
+#, c-format
+msgid ""
+"You are attempting to fetch %s, which is in the commit graph file but not in "
+"the object database.\n"
+"This is probably due to repo corruption.\n"
+"If you are attempting to repair this repo corruption by refetching the "
+"missing object, use 'git fetch --refetch' with the missing object."
+msgstr ""
+"İşleme grafiğinde bulunan; ancak nesne veritabanında bulunmayan %s ögesini "
+"getirmeyi deniyorsunuz.\n"
+"Bu, büyük olasılıkla depo hasarından dolayı oluyor.\n"
+"Bu depo hasarını eksik nesneyi yeniden getirerek onarmayı düşünüyorsanız "
+"eksik nesneyle birlikte 'git fetch --refetch' kullanmayı deneyin."
+
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack: sığ bir liste bekleniyordu"
@@ -17024,10 +17157,10 @@ msgstr[1] ""
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
+"You can disable this warning with `git config set advice.ignoredHook false`."
msgstr ""
"'%s' kancası yok sayıldı; çünkü bir yürütülebilir olarak ayarlanmamış.\n"
-"Bu uyarıyı 'git config advice.ignoredHook false' ile kapatabilirsiniz."
+"Bu uyarıyı 'git config set advice.ignoredHook false' ile kapatabilirsiniz."
msgid "not a git repository"
msgstr "bir git deposu değil"
@@ -17043,15 +17176,9 @@ msgstr "http.postBuffer için negatif değer; %d olarak varsayılıyor"
msgid "Delegation control is not supported with cURL < 7.22.0"
msgstr "Delegasyon denetimi cURL < 7.22.0 tarafından desteklenmiyor"
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr "Ortak anahtar iğnelemesi cURL < 7.39.0 tarafından desteklenmiyor"
-
msgid "Unknown value for http.proactiveauth"
msgstr "http.proactiveauth için bilinmeyen değer"
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr "CURLSSLOPT_NO_REVOKE cURL < 7.44.0 tarafından desteklenmiyor"
-
#, c-format
msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
msgstr "Desteklenmeyen SSL arka ucu '%s'. Desteklenen SSL arka uçları:"
@@ -17238,6 +17365,10 @@ msgid "unable to format message: %s"
msgstr "ileti biçimlendirilemiyor: %s"
#, c-format
+msgid "invalid marker-size '%s', expecting an integer"
+msgstr "geçersiz imleyici boyutu '%s', bir tamsayı bekleniyor"
+
+#, c-format
msgid "Failed to merge submodule %s (not checked out)"
msgstr "%s altmodülü birleştirilemedi (çıkış yapılmadı)"
@@ -18339,7 +18470,7 @@ msgid ""
"\n"
"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"running \"git config set advice.objectNameWarning false\""
msgstr ""
"Git normalde hiçbir zaman 40 onaltılı karakterlerle biten bir başvuru\n"
"oluşturmaz; çünkü 40 onaltılı bir başvuru, onu belirlediğiniz zaman yok\n"
@@ -18350,7 +18481,7 @@ msgstr ""
"komutunda \"$br\" bir şekilde boş kalmış ve 40 onaltılı bir başvuru\n"
"oluşturulmuş. Lütfen bu başvuruları inceleyin ve gerekirse silin. Bu "
"iletiyi\n"
-"kapatmak için \"git config advice.objectNameWarning\" yapın"
+"kapatmak için \"git config set advice.objectNameWarning\" yapın"
#, c-format
msgid "log for '%.*s' only goes back to %s"
@@ -18511,13 +18642,6 @@ msgstr "çoklu paket biteşlemi gereken ters indeksi içermiyor"
msgid "could not open pack %s"
msgstr "%s paketi açılamadı"
-msgid "could not determine MIDX preferred pack"
-msgstr "MIDX yeğlenen paketi algılanamadı"
-
-#, c-format
-msgid "preferred pack (%s) is invalid"
-msgstr "yeğlenen paket (%s) geçersiz"
-
msgid "corrupt bitmap lookup table: triplet position out of index"
msgstr "hasarlı biteşlem arama tablosu: üçlü konum indeks dışında"
@@ -19343,8 +19467,8 @@ msgid ""
msgstr ""
"Bu iletiden kaçınmak için, bir işlemeyi kaldırırken açıkça \"drop\" "
"kullanın.\n"
-"Uyarıların düzeyini değiştirmek için 'git config rebase."
-"missingCommitsCheck'\n"
+"Uyarıların düzeyini değiştirmek için 'git config "
+"rebase.missingCommitsCheck'\n"
"kullanın. Kullanılabilir davranışlar: ignore, warn, error.\n"
"\n"
@@ -19626,18 +19750,27 @@ msgstr ""
msgid "log for %s is empty"
msgstr "%s için olan günlük boş"
-msgid "refusing to force and skip creation of reflog"
-msgstr "başvuru günlüğünün oluşturulma/atlanma zorlanması reddediliyor"
-
#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr "hatalı ada iye '%s' başvurusunu güncelleme reddediliyor"
+msgid "refusing to update reflog for pseudoref '%s'"
+msgstr ""
+"'%s' yalancı başvurusu için olan başvuru günlüğünü güncelleme reddediliyor"
#, c-format
msgid "refusing to update pseudoref '%s'"
msgstr "'%s' yalancı başvurusunun güncellenmesi reddediliyor"
#, c-format
+msgid "refusing to update reflog with bad name '%s'"
+msgstr "hatalı adlı '%s' başvuru günlüğünü güncelleme reddediliyor"
+
+#, c-format
+msgid "refusing to update ref with bad name '%s'"
+msgstr "hatalı ada iye '%s' başvurusunu güncelleme reddediliyor"
+
+msgid "refusing to force and skip creation of reflog"
+msgstr "başvuru günlüğünün oluşturulma/atlanma zorlanması reddediliyor"
+
+#, c-format
msgid "update_ref failed for ref '%s': %s"
msgstr "'%s' başvurusu için update_ref başarısız oldu: %s"
@@ -19687,6 +19820,10 @@ msgstr ""
"bekleniyordu; ancak bu normal bir başvuru"
#, c-format
+msgid "cannot read ref file '%s'"
+msgstr "başvuru dosyası '%s' yazılamıyor"
+
+#, c-format
msgid "cannot open directory %s"
msgstr "%s dizini açılamıyor"
@@ -19894,6 +20031,10 @@ msgid "more than one uploadpack given, using the first"
msgstr "birden fazla uploadpack verildi, birincisi kullanılıyor"
#, c-format
+msgid "unrecognized followRemoteHEAD value '%s' ignored"
+msgstr "tanımlanamayan followRemoteHEAD değeri '%s' yok sayıldı"
+
+#, c-format
msgid "unrecognized value transfer.credentialsInUrl: '%s'"
msgstr "tanımlanamayan değer transfer.credentialsInUrl: '%s'"
@@ -21814,6 +21955,9 @@ msgstr "%s işlemesi ulaşılabilir olarak imlenmedi"
msgid "too many commits marked reachable"
msgstr "pek fazla işleme ulaşılabilir olarak imlenmiş"
+msgid "could not determine MIDX preferred pack"
+msgstr "MIDX yeğlenen paketi algılanamadı"
+
msgid "test-tool serve-v2 [<options>]"
msgstr "test-tool serve-v2 [<seçenekler>]"
@@ -22462,6 +22606,9 @@ msgstr ".git dosyası bozuk"
msgid ".git file incorrect"
msgstr ".git dosyası doğru değil"
+msgid ".git file absolute/relative path mismatch"
+msgstr ".git dosyası mutlak/göreceli yolu uyumsuzluğu"
+
msgid "not a valid path"
msgstr "geçerli bir yol değil"
@@ -22477,6 +22624,9 @@ msgstr "depo konumu bulunamıyor: .git dosyası bozuk"
msgid "gitdir unreadable"
msgstr "okunamayan gitdir"
+msgid "gitdir absolute/relative path mismatch"
+msgstr "gitdir mutlak/göreceli yolu uyumsuzluğu"
+
msgid "gitdir incorrect"
msgstr "doğru olmayan gitdir"
@@ -22511,6 +22661,13 @@ msgstr "%s, '%s' içinde ayarı kaldırılamıyor"
msgid "failed to set extensions.worktreeConfig setting"
msgstr "extensions.worktreeConfig yapılandırması ayarlanamadı"
+msgid "unable to upgrade repository format to support relative worktrees"
+msgstr ""
+"depo biçimi göreceli çalışma ağaçlarını desteklemesi için yükseltilemiyor"
+
+msgid "unable to set extensions.relativeWorktrees setting"
+msgstr "extensions.relativeWorktrees yapılandırması ayarlanamadı"
+
#, c-format
msgid "could not setenv '%s'"
msgstr "setenv '%s' yapılamadı"
diff --git a/po/uk.po b/po/uk.po
index 297f7b0687..5f68f36c7d 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Git v2.46\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2023-04-11 09:55-0700\n"
-"PO-Revision-Date: 2024-07-24 08:45-0700\n"
-"Last-Translator: Arkadii Yakovets <ark@cho.red>\n"
+"POT-Creation-Date: 2025-01-04 19:26-0800\n"
+"PO-Revision-Date: 2025-01-03 14:17-0800\n"
+"Last-Translator: Kateryna Golovanova <kate@kgthreads.com>\n"
"Language-Team: Ukrainian <https://github.com/arkid15r/git-uk-l10n/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
-"X-Generator: Poedit 3.4.2\n"
+"X-Generator: Poedit 3.5\n"
#, c-format
msgid "Huh (%s)?"
@@ -41,7 +41,7 @@ msgstr "Оновити"
#, c-format
msgid "could not stage '%s'"
-msgstr "не вдалося додати до індексу %s"
+msgstr "не вдалося додати до індексу \"%s\""
msgid "could not write index"
msgstr "не вдалося записати індекс"
@@ -549,7 +549,7 @@ msgid ""
"/ - search for a hunk matching the given regex\n"
"s - split the current hunk into smaller hunks\n"
"e - manually edit the current hunk\n"
-"p - print the current hunk\n"
+"p - print the current hunk, 'P' to use the pager\n"
"? - print help\n"
msgstr ""
"j - залишити цей шматок невизначеним, перейти до наступного невизначеного "
@@ -562,7 +562,7 @@ msgstr ""
"/ - шукати шматок, що відповідає заданому регвиру\n"
"s - розбити поточний шматок на менші шматки\n"
"e - редагувати поточний шматок вручну\n"
-"p - показати поточний шматок\n"
+"p - показати поточний шматок, \"P\" для гортання сторінок\n"
"? - показати довідку\n"
#, c-format
@@ -634,10 +634,11 @@ msgstr "Змінено лише бінарні файли."
#, c-format
msgid ""
"\n"
-"Disable this message with \"git config advice.%s false\""
+"Disable this message with \"git config set advice.%s false\""
msgstr ""
"\n"
-"Вимкнути це повідомлення можна за допомогою \"git config advice.%s false\""
+"Вимкнути це повідомлення можна за допомогою \"git config set advice.%s "
+"false\""
#, c-format
msgid "%shint:%s%.*s%s\n"
@@ -761,8 +762,8 @@ msgstr ""
"\n"
" git switch -\n"
"\n"
-"Щоб вимкнути цю пораду, встановіть конфігураційний параметр advice."
-"detachedHead у false\n"
+"Щоб вимкнути цю пораду, встановіть конфігураційний параметр "
+"advice.detachedHead у false\n"
#, c-format
msgid ""
@@ -1255,6 +1256,15 @@ msgstr ""
"спробувати тристороннє злиття, повернутися до звичайного латання, якщо це не "
"вдасться"
+msgid "for conflicts, use our version"
+msgstr "у разі конфліктів використовувати нашу версію"
+
+msgid "for conflicts, use their version"
+msgstr "у разі конфліктів використовувати їхню версію"
+
+msgid "for conflicts, use a union version"
+msgstr "у разі конфліктів використовувати обʼєднану версію"
+
msgid "build a temporary index based on embedded index information"
msgstr "створити тимчасовий індекс на основі вбудованої індексної інформації"
@@ -1300,6 +1310,9 @@ msgstr "додати <корінь> до всіх назв файлів"
msgid "don't return error for empty patches"
msgstr "не повертати помилку для порожніх латок"
+msgid "--ours, --theirs, and --union require --3way"
+msgstr "--ours, --theirs, та --union вимагають --3way"
+
#, c-format
msgid "cannot stream blob %s"
msgstr "неможливо транслювати blob %s"
@@ -1372,6 +1385,10 @@ msgid "not a tree object: %s"
msgstr "не є об’єктом дерева: %s"
#, c-format
+msgid "failed to unpack tree object %s"
+msgstr "не вдалося розпакувати обʼєкт дерева %s"
+
+#, c-format
msgid "File not found: %s"
msgstr "Файл не знайдено: %s"
@@ -2174,7 +2191,7 @@ msgstr ""
#, c-format
msgid "Could not parse object '%s'."
-msgstr "Не вдалося розібрати об'єкт '%s'."
+msgstr "Не вдалося розібрати обʼєкт \"%s\"."
msgid "failed to clean index"
msgstr "не вдалося очистити індекс"
@@ -2484,9 +2501,6 @@ msgstr ""
"неприпустимий аргумент %s для \"git bisect terms\".\n"
"Підтримувані опції: --term-good|--term-old і --term-bad|--term-new."
-msgid "revision walk setup failed\n"
-msgstr "не вдалося налаштувати проходження по ревізіям\n"
-
#, c-format
msgid "could not open '%s' for appending"
msgstr "не вдалося відкрити \"%s\" для додавання"
@@ -3026,8 +3040,8 @@ msgid "HEAD not found below refs/heads!"
msgstr "HEAD не знайдено під refs/heads!"
msgid ""
-"branch with --recurse-submodules can only be used if submodule."
-"propagateBranches is enabled"
+"branch with --recurse-submodules can only be used if "
+"submodule.propagateBranches is enabled"
msgstr ""
"гілку з --recurse-submodules можна використовувати лише якщо увімкнено "
"submodule.propagateBranches"
@@ -3478,9 +3492,14 @@ msgstr "git check-mailmap [<опції>] <контакт>..."
msgid "also read contacts from stdin"
msgstr "також читати контакти з stdin"
-#, c-format
-msgid "unable to parse contact: %s"
-msgstr "не вдалося розібрати контакт: %s"
+msgid "read additional mailmap entries from file"
+msgstr "зчитувати додаткові записи mailmap з файлу"
+
+msgid "blob"
+msgstr "blob"
+
+msgid "read additional mailmap entries from blob"
+msgstr "зчитувати додаткові записи mailmap з blob"
msgid "no contacts specified"
msgstr "контакти не вказані"
@@ -3648,7 +3667,7 @@ msgstr "Вже на \"%s\"\n"
#, c-format
msgid "Switched to and reset branch '%s'\n"
-msgstr "Переключено на та скинуто гілку '%s'\n"
+msgstr "Переключено на та скинуто гілку \"%s\"\n"
#, c-format
msgid "Switched to a new branch '%s'\n"
@@ -3842,19 +3861,23 @@ msgstr "шляхи не можуть використовуватись при
#, c-format
msgid "'%s' cannot be used with switching branches"
-msgstr "'%s' не може використовуватись при переключенні гілок"
+msgstr "\"%s\" не може використовуватись при переключенні гілок"
+
+#, c-format
+msgid "'%s' needs the paths to check out"
+msgstr "\"%s\" потрібні шляхи для переходу"
#, c-format
msgid "'%s' cannot be used with '%s'"
-msgstr "'%s' не може використовуватись з '%s'"
+msgstr "\"%s\" не може використовуватись з \"%s\""
#, c-format
msgid "'%s' cannot take <start-point>"
-msgstr "'%s' не може прийняти <стартова-точка>"
+msgstr "\"%s\" не може прийняти <стартова-точка>"
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
-msgstr "Неможливо переключити гілку на не коміт '%s'"
+msgstr "Неможливо переключити гілку на не коміт \"%s\""
msgid "missing branch or commit argument"
msgstr "відсутня гілка або коміт"
@@ -3887,8 +3910,8 @@ msgstr "нова ненароджена гілка"
msgid "update ignored files (default)"
msgstr "оновити ігноровані файли (за замовчуванням)"
-msgid "do not check if another worktree is holding the given ref"
-msgstr "не перевіряти, чи інше робоче дерево містить дане посилання"
+msgid "do not check if another worktree is using this branch"
+msgstr "не перевіряти, чи використовує цю гілку інше робоче дерево"
msgid "checkout our version for unmerged files"
msgstr "використовувати нашу версію для не злитих файлів"
@@ -3919,11 +3942,11 @@ msgstr "неприпустиме зазначення шляху"
#, c-format
msgid "'%s' is not a commit and a branch '%s' cannot be created from it"
-msgstr "'%s' не є комітом, і з нього не можна створити гілку '%s'"
+msgstr "\"%s\" не є комітом, і з нього не можна створити гілку \"%s\""
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr "git checkout: --detach не приймає аргумент шляху '%s'"
+msgstr "git checkout: --detach не приймає аргумент шляху \"%s\""
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
@@ -4191,11 +4214,11 @@ msgstr "створити неглибокий клон вказаної глиб
msgid "create a shallow clone since a specific time"
msgstr "створити неглибокий клон з певного часу"
-msgid "revision"
-msgstr "ревізія"
+msgid "ref"
+msgstr "посилання"
-msgid "deepen history of shallow clone, excluding rev"
-msgstr "поглибити історію неглибокого клону, за винятком ревізії"
+msgid "deepen history of shallow clone, excluding ref"
+msgstr "поглибити історію неглибокого клону, за винятком посилання"
msgid "clone only one branch, HEAD or --branch"
msgstr "клонувати лише одну гілку, HEAD або --branch"
@@ -4428,7 +4451,7 @@ msgstr "не вдалося ініціалізувати сховище, URI п
#, c-format
msgid "failed to fetch objects from bundle URI '%s'"
-msgstr "не вдалося отримати обʼєкти з пакунка URI '%s'"
+msgstr "не вдалося отримати обʼєкти з пакунка URI \"%s\""
msgid "failed to fetch advertised bundles"
msgstr "не вдалося отримати обіцяні пакунки"
@@ -4618,7 +4641,7 @@ msgstr "git commit-tree: не вдалося прочитати"
msgid ""
"git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n"
" [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|"
-"reword):]<commit>)]\n"
+"reword):]<commit>]\n"
" [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n"
" [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n"
" [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n"
@@ -4628,14 +4651,14 @@ msgid ""
msgstr ""
"git commit [-a | --interactive | --patch] [-s] [-v] [-u<режим>] [--amend]\n"
" [--dry-run] [(-c | -C | --squash) <коміт> | --fixup [(amend|"
-"reword):]<коміт>)]\n"
+"reword):]<коміт>]\n"
" [-F <файл> | -m <допис>] [--reset-author] [--allow-empty]\n"
" [--allow-empty-message] [--no-verify] [-e] [--author=<автор>]\n"
" [--date=<дата>] [--cleanup=<режим>] [--[no-]status]\n"
" [-i | -o] [--pathspec-from-file=<файл> [--pathspec-file-nul]]\n"
-" [(--trailer <токен>[(=|:)<значення>])...] [-S[<ідентифікатор "
+" [(--trailer <токен>[(=|:)<значення>])...] [-S[<ідентифікатор-"
"ключа>]]\n"
-" [--] [<визначник шляху>...]"
+" [--] [<визначник-шляху>...]"
msgid "git status [<options>] [--] [<pathspec>...]"
msgstr "git status [<опції>] [--] [<визначник шляху>...]"
@@ -5121,12 +5144,11 @@ msgstr "git config list [<опція-файлу>] [<опція-відображ
msgid ""
"git config get [<file-option>] [<display-option>] [--includes] [--all] [--"
-"regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] "
-"<name>"
+"regexp] [--value=<value>] [--fixed-value] [--default=<default>] <name>"
msgstr ""
"git config get [<опція-файлу>] [<опція-відображення>] [--includes] [--all] "
-"[--regexp=<регвир>] [--value=<значення>] [--fixed-value] [--"
-"default=<значення -за-умовчанням>] <назва>"
+"[--regexp] [--value=<значення>] [--fixed-value] [--default=<за "
+"замовчуванням>] <назва>"
msgid ""
"git config set [<file-option>] [--type=<type>] [--all] [--value=<value>] [--"
@@ -5137,10 +5159,10 @@ msgstr ""
msgid ""
"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
-"<name> <value>"
+"<name>"
msgstr ""
"git config unset [<опція-файлу>] [--all] [--value=<значення>] [--fixed-"
-"value] <назва> <значення>"
+"value] <назва>"
msgid "git config rename-section [<file-option>] <old-name> <new-name>"
msgstr "git config rename-section [<опція-файлу>] <стара-назва> <нова-назва>"
@@ -5155,6 +5177,15 @@ msgid "git config [<file-option>] --get-colorbool <name> [<stdout-is-tty>]"
msgstr "git config [<опція-файлу>] --get-colorbool <назва> [<stdout-is-tty>]"
msgid ""
+"git config get [<file-option>] [<display-option>] [--includes] [--all] [--"
+"regexp=<regexp>] [--value=<value>] [--fixed-value] [--default=<default>] "
+"<name>"
+msgstr ""
+"git config get [<опція-файлу>] [<опція-відображення>] [--includes] [--all] "
+"[--regexp=<регвир>] [--value=<значення>] [--fixed-value] [--default=<за-"
+"замовчуванням>] <назва>"
+
+msgid ""
"git config set [<file-option>] [--type=<type>] [--comment=<message>] [--all] "
"[--value=<value>] [--fixed-value] <name> <value>"
msgstr ""
@@ -5574,12 +5605,8 @@ msgid "traversed %lu commits\n"
msgstr "пройдено через %lu комітів\n"
#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"знайдено більше %i тегів; показані %i останніх\n"
-"припинено пошук на %s\n"
+msgid "found %i tags; gave up search at %s\n"
+msgstr "знайдено %i тегів; припинено пошук на %s\n"
#, c-format
msgid "describe %s\n"
@@ -5964,13 +5991,13 @@ msgid ""
"to avoid this check\n"
msgstr ""
"перевірка примусових оновлень зайняла %.2f секунд; ви можете скористатися\n"
-"\"--no-show-forced-updates\" або виконати \"git config fetch."
-"showForcedUpdates false\"\n"
+"\"--no-show-forced-updates\" або виконати \"git config "
+"fetch.showForcedUpdates false\"\n"
"щоб уникнути цієї перевірки\n"
#, c-format
-msgid "%s did not send all necessary objects\n"
-msgstr "%s не надіслав всіх необхідних обʼєктів\n"
+msgid "%s did not send all necessary objects"
+msgstr "%s не надіслав усі необхідні обʼєкти"
#, c-format
msgid "rejected %s because shallow roots are not allowed to be updated"
@@ -6007,8 +6034,8 @@ msgid "option \"%s\" value \"%s\" is not valid for %s"
msgstr "значення \"%s\" опції \"%s\" неприпустиме для %s"
#, c-format
-msgid "option \"%s\" is ignored for %s\n"
-msgstr "опція \"%s\" ігнорується для %s\n"
+msgid "option \"%s\" is ignored for %s"
+msgstr "опція \"%s\" ігнорується для %s"
#, c-format
msgid "%s is not a valid object"
@@ -6018,6 +6045,21 @@ msgstr "%s не є припустимим об’єктом"
msgid "the object %s does not exist"
msgstr "об’єкт %s не існує"
+#, c-format
+msgid ""
+"Run 'git remote set-head %s %s' to follow the change, or set\n"
+"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
+"if you do not want to see this message. Specifically running\n"
+"'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
+"until the remote changes HEAD to something else."
+msgstr ""
+"Запустіть \"git remote set-head %s %s\", щоб відстежити зміни, або "
+"встановіть\n"
+"\"remote.%s.followRemoteHEAD\" параметр конфігурації на інше значення\n"
+"якщо ви не хочете бачити це повідомлення. Зокрема, виконання команди\n"
+"\"git config set remote.%s.followRemoteHEAD %s\" вимкне попередження\n"
+"доки віддалений сервер не змінить HEAD на щось інше."
+
msgid "multiple branches detected, incompatible with --set-upstream"
msgstr "виявлено кілька гілок, несумісних з --set-upstream"
@@ -6158,6 +6200,9 @@ msgstr "refmap"
msgid "specify fetch refmap"
msgstr "вказати мапу посилань для fetch"
+msgid "revision"
+msgstr "ревізія"
+
msgid "report that we have only objects reachable from this object"
msgstr "звітувати, що у нас є тільки обʼєкти, доступні з цього обʼєкта"
@@ -6212,8 +6257,8 @@ msgid "protocol does not support --negotiate-only, exiting"
msgstr "протокол не підтримує --negotiate-only, вихід"
msgid ""
-"--filter can only be used with the remote configured in extensions."
-"partialclone"
+"--filter can only be used with the remote configured in "
+"extensions.partialclone"
msgstr ""
"--filter можна використовувати лише з віддаленим призначенням, налаштованим "
"у extensions.partialclone"
@@ -6686,6 +6731,9 @@ msgstr "працювати ретельніше (збільшує час вик
msgid "enable auto-gc mode"
msgstr "увімкнути режим автоматичного збору сміття"
+msgid "perform garbage collection in the background"
+msgstr "виконувати прибирання сміття у фоновому режимі"
+
msgid "force running gc even if there may be another gc running"
msgstr "примусово запускати збирач сміття, навіть якщо інший збирач вже працює"
@@ -6786,6 +6834,9 @@ msgstr "завдання \"%s\" не можна вибрати кілька ра
msgid "run tasks based on the state of the repository"
msgstr "запускати завдання на основі стану сховища"
+msgid "perform maintenance in the background"
+msgstr "виконувати технічне обслуговування у фоновому режимі"
+
msgid "frequency"
msgstr "частота"
@@ -6883,8 +6934,26 @@ msgstr "недоступні ні systemd таймери, ні crontab"
msgid "%s scheduler is not available"
msgstr "%s планувальник недоступний"
-msgid "another process is scheduling background maintenance"
-msgstr "ще один процес планує фонове обслуговування"
+#, c-format
+msgid ""
+"unable to create '%s.lock': %s.\n"
+"\n"
+"Another scheduled git-maintenance(1) process seems to be running in this\n"
+"repository. Please make sure no other maintenance processes are running and\n"
+"then try again. If it still fails, a git-maintenance(1) process may have\n"
+"crashed in this repository earlier: remove the file manually to continue."
+msgstr ""
+"не вдалося створити \"%s.lock\": %s.\n"
+"\n"
+"Здається, у цьому сховищі запущено ще один запланований процес git-"
+"maintenance(1). Будь ласка, переконайтеся, що у сховищі не запущено інших "
+"процесів обслуговування, і\n"
+"і спробуйте ще раз. Якщо все одно не вдасться, можливо, \n"
+"раніше у цьому сховищі аварійно завершився git-maintenance(1) процес: "
+"видаліть файл вручну, щоб продовжити роботу."
+
+msgid "cannot acquire lock for scheduled background maintenance"
+msgstr "не може отримати блокування для планового фонового обслуговування"
msgid "git maintenance start [--scheduler=<scheduler>]"
msgstr "git maintenance start [--scheduler=<планувальник>]"
@@ -7418,19 +7487,19 @@ msgstr "локальний обʼєкт %s пошкоджено"
#, c-format
msgid "packfile name '%s' does not end with '.%s'"
-msgstr "ім’я файла пакунка '%s' не закінчується на '.%s'"
+msgstr "ім’я файла пакунка \"%s\" не закінчується на '.%s'"
#, c-format
msgid "cannot write %s file '%s'"
-msgstr "неможливо записати %s файл '%s'"
+msgstr "неможливо записати %s файл \"%s\""
#, c-format
msgid "cannot close written %s file '%s'"
-msgstr "неможливо закрити записаний %s файл '%s'"
+msgstr "неможливо закрити записаний %s файл \"%s\""
#, c-format
msgid "unable to rename temporary '*.%s' file to '%s'"
-msgstr "не вдається перейменувати тимчасовий файл '*.%s' на '%s'"
+msgstr "не вдається перейменувати тимчасовий файл \"*.%s\" на \"%s\""
msgid "error while closing pack file"
msgstr "помилка під час закриття файлу пакунка"
@@ -7441,11 +7510,11 @@ msgstr "невірний pack.indexVersion=%<PRIu32>"
#, c-format
msgid "Cannot open existing pack file '%s'"
-msgstr "Неможливо відкрити існуючий файл пакунка '%s"
+msgstr "Неможливо відкрити існуючий файл пакунка \"%s\""
#, c-format
msgid "Cannot open existing pack idx file for '%s'"
-msgstr "Неможливо відкрити існуючий індексний файл пакунка для '%s"
+msgstr "Неможливо відкрити існуючий індексний файл пакунка для \"%s\""
#, c-format
msgid "non delta: %d object"
@@ -7461,6 +7530,20 @@ msgstr[0] "довжина ланцюжка = %d: %lu об’єкт"
msgstr[1] "довжина ланцюжка = %d: %lu об’єкти"
msgstr[2] "довжина ланцюжка = %d: %lu об’єктів"
+msgid "could not start pack-objects to repack local links"
+msgstr "не вдалося розпочати pack-objects для перепакування локальних посилань"
+
+msgid "failed to feed local object to pack-objects"
+msgstr "не вдалося передати локальний обʼєкт до pack-objects"
+
+msgid "index-pack: Expecting full hex object ID lines only from pack-objects."
+msgstr ""
+"index-pack: очікуються повні рядки шістнадцяткових ідентифікаторів обʼєктів "
+"тільки від pack-objects."
+
+msgid "could not finish pack-objects to repack local links"
+msgstr "не вдалося завершити pack-objects для перепакування локальних посилань"
+
msgid "Cannot come back to cwd"
msgstr "Неможливо повернутися до поточної робочої директорії"
@@ -7470,7 +7553,10 @@ msgstr "невірний %s"
#, c-format
msgid "unknown hash algorithm '%s'"
-msgstr "невідомий хеш-алгоритм '%s'"
+msgstr "невідомий хеш-алгоритм \"%s\""
+
+msgid "--promisor cannot be used with a pack name"
+msgstr "--promisor не можна використовувати з назвою пакунка"
msgid "--stdin requires a git repository"
msgstr "--stdin потребує наявності git сховища"
@@ -7656,9 +7742,6 @@ msgstr "-L<діапазон>:<файл> не можна використовув
msgid "Final output: %d %s\n"
msgstr "Кінцевий результат: %d %s\n"
-msgid "unable to create temporary object directory"
-msgstr "не вдалося створити тимчасову директорію об’єкта"
-
#, c-format
msgid "git show %s: bad file"
msgstr "git show %s: невірний файл"
@@ -8231,15 +8314,6 @@ msgstr "використовувати злиття на основі diff3"
msgid "use a zealous diff3 based merge"
msgstr "використовувати ретельне злиття на основі diff3"
-msgid "for conflicts, use our version"
-msgstr "у разі конфліктів використовувати нашу версію"
-
-msgid "for conflicts, use their version"
-msgstr "у разі конфліктів використовувати їхню версію"
-
-msgid "for conflicts, use a union version"
-msgstr "у разі конфліктів використовувати об’єднану версію"
-
msgid "<algorithm>"
msgstr "<алгоритм>"
@@ -8709,6 +8783,9 @@ msgstr ""
msgid "write multi-pack bitmap"
msgstr "записати multi-pack bitmap"
+msgid "write a new incremental MIDX"
+msgstr "записати новий інкрементний MIDX"
+
msgid "write multi-pack index containing only given indexes"
msgstr "записати multi-pack індекс, що містить лише задані індекси"
@@ -8843,11 +8920,11 @@ msgstr "git notes [--ref <посилання-нотатки>] [list [<об’є
msgid ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <посилання-нотатки>] add [-f] [--allow-empty] [--"
"[no-]separator|--separator=<розділювач-абзаців>] [--[no-]stripspace] [-m "
-"<допис> | -F <файл> | (-c | -C) <обʼєкт>] [<обʼєкт>]"
+"<допис> | -F <файл> | (-c | -C) <обʼєкт>] [<обʼєкт>] [-e]"
msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
msgstr ""
@@ -8856,11 +8933,11 @@ msgstr ""
msgid ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <посилання-нотатки>] append [--allow-empty] [--"
"[no-]separator|--separator=<розділювач-абзаців>] [--[no-]stripspace] [-m "
-"<допис> | -F <файл> | (-c | -C) <обʼєкт>] [<обʼєкт>]"
+"<допис> | -F <файл> | (-c | -C) <обʼєкт>] [<обʼєкт>] [-e]"
msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
msgstr "git notes [--ref <посилання-нотатки>] edit [--allow-empty] [<об’єкт>]"
@@ -8979,6 +9056,9 @@ msgstr "вміст нотатки у файлі"
msgid "reuse and edit specified note object"
msgstr "повторно використати та редагувати вказаний обʼєкт нотатки"
+msgid "edit note message in editor"
+msgstr "редагувати допис нотатки в редакторі"
+
msgid "reuse specified note object"
msgstr "повторно використати вказаний обʼєкт нотатки"
@@ -9195,8 +9275,8 @@ msgstr "очікувався обʼєкт на зміщенні %<PRIuMAX> па
msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
msgstr ""
-"вимкнення bitmap запису, пакунки розбиваються на частини через pack."
-"packSizeLimit"
+"вимкнення bitmap запису, пакунки розбиваються на частини через "
+"pack.packSizeLimit"
msgid "Writing objects"
msgstr "Запис обʼєктів"
@@ -9478,6 +9558,9 @@ msgstr "обробка для відсутніх обʼєктів"
msgid "do not pack objects in promisor packfiles"
msgstr "не пакувати обʼєкти у promisor пакунки"
+msgid "implies --missing=allow-any"
+msgstr "мається на увазі --missing=allow-any"
+
msgid "respect islands during delta compression"
msgstr "поважати острови під час дельта компресії"
@@ -9974,7 +10057,7 @@ msgstr "Надсилання до %s\n"
#, c-format
msgid "failed to push some refs to '%s'"
-msgstr "не вдалося надіслати деякі посилання до '%s'"
+msgstr "не вдалося надіслати деякі посилання до \"%s\""
msgid ""
"recursing into submodule with push.recurseSubmodules=only; using on-demand "
@@ -9985,7 +10068,7 @@ msgstr ""
#, c-format
msgid "invalid value for '%s'"
-msgstr "неприпустиме значення для '%s'"
+msgstr "неприпустиме значення для \"%s\""
msgid "repository"
msgstr "сховище"
@@ -10746,6 +10829,9 @@ msgstr "неприпустимий формат посилання: %s"
msgid "git refs migrate --ref-format=<format> [--dry-run]"
msgstr "git refs migrate --ref-format=<формат> [--dry-run]"
+msgid "git refs verify [--strict] [--verbose]"
+msgstr "git refs verify [--strict] [--verbose]"
+
msgid "specify the reference format to convert to"
msgstr "вкажіть формат посилання, в який потрібно конвертувати"
@@ -10759,6 +10845,12 @@ msgstr "відсутній --ref-format=<формат>"
msgid "repository already uses '%s' format"
msgstr "сховище вже використовує формат \"%s\""
+msgid "enable strict checking"
+msgstr "увімкнути сувору перевірку"
+
+msgid "'git refs verify' takes no arguments"
+msgstr "\"git refs verify\" не потребує аргументів"
+
msgid ""
"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
"mirror=<fetch|push>] <name> <url>"
@@ -11100,6 +11192,30 @@ msgstr[0] " Локальне посилання налаштовано для \
msgstr[1] " Локальних посилання налаштовано для \"git push\"%s:"
msgstr[2] " Локальних посилань налаштовано для \"git push\"%s:"
+#, c-format
+msgid "'%s/HEAD' is unchanged and points to '%s'\n"
+msgstr "\"%s/HEAD\" не змінився і вказує на \"%s\"\n"
+
+#, c-format
+msgid "'%s/HEAD' has changed from '%s' and now points to '%s'\n"
+msgstr "\"%s/HEAD\" змінився з \"%s\" і тепер вказує на \"%s\"\n"
+
+#, c-format
+msgid "'%s/HEAD' is now created and points to '%s'\n"
+msgstr "Створено \"%s/HEAD\", який вказує на \"%s\"\n"
+
+#, c-format
+msgid "'%s/HEAD' was detached at '%s' and now points to '%s'\n"
+msgstr "\"%s/HEAD\" був відʼєднаний на \"%s\" і тепер вказує на \"%s\"\n"
+
+#, c-format
+msgid ""
+"'%s/HEAD' used to point to '%s' (which is not a remote branch), but now "
+"points to '%s'\n"
+msgstr ""
+"\"%s/HEAD\" раніше вказував на \"%s\" (який не є віддаленою гілкою), але "
+"тепер вказує на \"%s\"\n"
+
msgid "set refs/remotes/<name>/HEAD according to remote"
msgstr ""
"встановити refs/remotes/<назва>/HEAD відповідно до віддаленого призначення"
@@ -11124,7 +11240,7 @@ msgid "Not a valid ref: %s"
msgstr "Не є припустимим посиланням: %s"
#, c-format
-msgid "Could not setup %s"
+msgid "Could not set up %s"
msgstr "Не вдалося налаштувати %s"
#, c-format
@@ -11696,11 +11812,11 @@ msgstr "записати лише той факт, що вилучені шля
#, c-format
msgid "Failed to resolve '%s' as a valid revision."
-msgstr "Не вдалося розпізнати '%s' як припустиму ревізію."
+msgstr "Не вдалося розпізнати \"%s\" як припустиму ревізію."
#, c-format
msgid "Failed to resolve '%s' as a valid tree."
-msgstr "Не вдалося розпізнати '%s' як припустиме дерево."
+msgstr "Не вдалося розпізнати \"%s\" як припустиме дерево."
msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
msgstr ""
@@ -11729,7 +11845,7 @@ msgstr ""
#, c-format
msgid "Could not reset index file to revision '%s'."
-msgstr "Не вдалося скинути індексний файл до ревізії '%s'."
+msgstr "Не вдалося скинути індексний файл до ревізії \"%s\"."
msgid "Could not write new index file."
msgstr "Не вдалося записати новий індексний файл."
@@ -12211,11 +12327,11 @@ msgstr "посилання не існує"
msgid "failed to look up reference"
msgstr "не вдалося знайти посилання"
-msgid "only show tags (can be combined with branches)"
-msgstr "показати тільки теги (можна комбінувати з гілками)"
+msgid "only show tags (can be combined with --branches)"
+msgstr "показувати тільки теги (можна комбінувати з --branches)"
-msgid "only show branches (can be combined with tags)"
-msgstr "показати тільки гілки (можна комбінувати з тегами)"
+msgid "only show branches (can be combined with --tags)"
+msgstr "показувати тільки гілки (можна комбінувати з --tags)"
msgid "check for reference existence without resolving"
msgstr "перевіряти наявність посилання без розвʼязання"
@@ -12268,6 +12384,10 @@ msgstr "не вдалося видалити директорію \"%s\""
msgid "failed to create directory for sparse-checkout file"
msgstr "не вдалося створити директорію для файлу розрідженого переходу"
+#, c-format
+msgid "unable to fdopen %s"
+msgstr "не вдалося fdopen %s"
+
msgid "failed to initialize worktree config"
msgstr "не вдалося ініціалізувати конфігурацію робочого дерева"
@@ -12726,8 +12846,8 @@ msgid "couldn't hash object from '%s'"
msgstr "не вдалося хешувати обʼєкт з \"%s\""
#, c-format
-msgid "unexpected mode %o\n"
-msgstr "неочікуваний режим %o\n"
+msgid "unexpected mode %o"
+msgstr "неочікуваний режим %o"
msgid "use the commit stored in the index instead of the submodule HEAD"
msgstr "використати коміт, збережений в індексі, замість підмодуля HEAD"
@@ -12771,8 +12891,8 @@ msgid ""
"Submodule work tree '%s' contains a .git directory. This will be replaced "
"with a .git file by using absorbgitdirs."
msgstr ""
-"Робоче дерево підмодуля \"%s\" містить директорію .git. Її буде замінено на ."
-"git файл за допомогою absorbgitdirs."
+"Робоче дерево підмодуля \"%s\" містить директорію .git. Її буде замінено "
+"на .git файл за допомогою absorbgitdirs."
#, c-format
msgid ""
@@ -13871,6 +13991,9 @@ msgid "try to match the new branch name with a remote-tracking branch"
msgstr ""
"спробуйте співставити нову назву гілки з назвою віддалено відстежуваної гілки"
+msgid "use relative paths for worktrees"
+msgstr "використовувати відносні шляхи для робочих дерев"
+
#, c-format
msgid "options '%s', '%s', and '%s' cannot be used together"
msgstr "опції \"%s\", \"%s\" та \"%s\" не можна використовувати разом"
@@ -14149,6 +14272,25 @@ msgstr "неможливо створити \"%s\""
msgid "index-pack died"
msgstr "index-pack завершився невдало"
+#, c-format
+msgid "directory '%s' is present in index, but not sparse"
+msgstr "Директорія \"%s\" присутня в індексі, але не є розрідженою"
+
+msgid "corrupted cache-tree has entries not present in index"
+msgstr "пошкоджене cache-tree має записи, яких немає в індексі"
+
+#, c-format
+msgid "%s with flags 0x%x should not be in cache-tree"
+msgstr "%s з прапорцями 0x%x не слід бути в cache-tree"
+
+#, c-format
+msgid "bad subtree '%.*s'"
+msgstr "невірне піддерево \"%.*s\""
+
+#, c-format
+msgid "cache-tree for path %.*s does not match. Expected %s got %s"
+msgstr "cache-tree для шляху %.*s не співпадає. Очікувалось %s отримано %s"
+
msgid "terminating chunk id appears earlier than expected"
msgstr "ідентифікатор завершення фрагмента зʼявився раніше, ніж очікувалось"
@@ -15007,16 +15149,16 @@ msgid ""
"to convert the grafts into replace refs.\n"
"\n"
"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
msgstr ""
"Підтримка <GIT_DIR>/info/grafts застаріла\n"
-"і буде вилучена в одній з наступних версій Git.\n"
+"і буде вилучена у наступній версії Git'у.\n"
"\n"
-"Будь ласка, скористайтесь \"git replace --convert-graft-file\"\n"
-"щоб перетворити щепи на заміни посилань.\n"
+"Будь ласка, використовуйте \"git replace --convert-graft-file\"\n"
+"щоб перетворити прищепи на замінювані посилання.\n"
"\n"
"Щоб вимкнути це повідомлення, виконайте\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
#, c-format
msgid "commit %s exists in commit-graph but not in the object database"
@@ -15834,6 +15976,19 @@ msgstr "url не має схеми: %s"
msgid "credential url cannot be parsed: %s"
msgstr "неможливо розібрати url облікових даних: %s"
+#, c-format
+msgid "invalid timeout '%s', expecting a non-negative integer"
+msgstr "неприпустимий таймаут \"%s\", очікується невідʼємне ціле число"
+
+#, c-format
+msgid "invalid init-timeout '%s', expecting a non-negative integer"
+msgstr ""
+"неприпустимий початковий таймаут \"%s\", очікується невідʼємне ціле число"
+
+#, c-format
+msgid "invalid max-connections '%s', expecting an integer"
+msgstr "неприпустимі максимальні з'єднання \"%s\", очікується число"
+
msgid "in the future"
msgstr "у майбутньому"
@@ -16552,6 +16707,21 @@ msgstr "невірний шлях до простору імен git \"%s\""
msgid "too many args to run %s"
msgstr "забагато аргументів для запуску %s"
+#, c-format
+msgid ""
+"You are attempting to fetch %s, which is in the commit graph file but not in "
+"the object database.\n"
+"This is probably due to repo corruption.\n"
+"If you are attempting to repair this repo corruption by refetching the "
+"missing object, use 'git fetch --refetch' with the missing object."
+msgstr ""
+"Ви намагаєтеся отримати %s, який знаходиться у файлі коміт-графа, але не в "
+"базі даних обʼєктів.\n"
+"Ймовірно, це повʼязано з пошкодженням репозиторію.\n"
+"Якщо ви намагаєтеся виправити це пошкодження репозиторію повторним "
+"отриманням відсутнього обʼєкта, скористайтеся командою \"git fetch --"
+"refetch\" з відсутнім обʼєктом."
+
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack: очікувався неглибокий список"
@@ -17140,11 +17310,12 @@ msgstr[2] ""
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
+"You can disable this warning with `git config set advice.ignoredHook false`."
msgstr ""
-"Гачок \"%s\" було проігноровано, оскільки він не визначений як виконуваний.\n"
-"Ви можете вимкнути це попередження за допомогою \"git config advice."
-"ignoredHook false\"."
+"Гачок \"%s\" було проігноровано, оскільки він не визначений як придатний для "
+"виконання.\n"
+"Ви можете вимкнути це попередження за допомогою \"git config set "
+"advice.ignoredHook false\"."
msgid "not a git repository"
msgstr "не є git сховищем"
@@ -17161,15 +17332,9 @@ msgstr ""
msgid "Delegation control is not supported with cURL < 7.22.0"
msgstr "Контроль делегування не підтримується з cURL < 7.22.0"
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr "Закріплення відкритих ключів не підтримується з cURL < 7.39.0"
-
msgid "Unknown value for http.proactiveauth"
msgstr "Невідоме значення для http.proactiveauth"
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr "CURLSSLOPT_NO_REVOKE не підтримується з cURL < 7.44.0"
-
#, c-format
msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
msgstr "Непідтримуваний SSL обробник \"%s\". Підтримувані SSL обробники:"
@@ -17330,13 +17495,16 @@ msgstr ""
msgid "Unable to create '%s.lock': %s"
msgstr "Не вдалося створити \"%s.lock\": %s"
+msgid "unable to create temporary object directory"
+msgstr "не вдалося створити тимчасову директорію обʼєкта"
+
#, c-format
msgid "could not write loose object index %s"
msgstr "не вдалося записати індекс вільного обʼєкта %s"
#, c-format
-msgid "failed to write loose object index %s\n"
-msgstr "не вдалося записати індекс вільного обʼєкта %s\n"
+msgid "failed to write loose object index %s"
+msgstr "не вдалося записати індекс вільного обʼєкта %s"
#, c-format
msgid "unexpected line: '%s'"
@@ -17353,6 +17521,10 @@ msgid "unable to format message: %s"
msgstr "не вдалося відформатувати допис: %s"
#, c-format
+msgid "invalid marker-size '%s', expecting an integer"
+msgstr "неправильний розмір маркера \"%s\", очікується число"
+
+#, c-format
msgid "Failed to merge submodule %s (not checked out)"
msgstr "Не вдалося обʼєднати підмодуль %s (не активне)"
@@ -17887,6 +18059,17 @@ msgstr "не вдалося завантажити пакунок"
msgid "could not open index for %s"
msgstr "не вдалося відкрити індекс для %s"
+#, c-format
+msgid "unable to link '%s' to '%s'"
+msgstr "не вдалося звʼязати \"%s\" з \"%s\""
+
+#, c-format
+msgid "failed to clear multi-pack-index at %s"
+msgstr "не вдалося очистити multi-pack-index при %s"
+
+msgid "cannot write incremental MIDX with bitmap"
+msgstr "неможливо записати інкрементний MIDX з bitmap"
+
msgid "ignoring existing multi-pack-index; checksum mismatch"
msgstr ""
"ігнорування існуючого multi-pack-index; невідповідність контрольних сум"
@@ -17916,18 +18099,33 @@ msgstr "немає файлів пакунків для індексації."
msgid "refusing to write multi-pack .bitmap without any objects"
msgstr "відмовлено в записі мультіпакункового .bitmap без обʼєктів"
+msgid "unable to create temporary MIDX layer"
+msgstr "не вдалося створити тимчасовий шар MIDX"
+
msgid "could not write multi-pack bitmap"
msgstr "не вдалося записати мультіпакунковий bitmap"
+msgid "unable to open multi-pack-index chain file"
+msgstr "не вдалося відкрити ланцюжковий файл multi-pack-index"
+
+msgid "unable to rename new multi-pack-index layer"
+msgstr "не вдалося перейменувати новий multi-pack-index шар"
+
msgid "could not write multi-pack-index"
msgstr "не вдалося записати multi-pack-index"
+msgid "cannot expire packs from an incremental multi-pack-index"
+msgstr "неможливо видалити пакунки з інкрементним multi-pack-index"
+
msgid "Counting referenced objects"
msgstr "Підрахунок обʼєктів, на які є посилання"
msgid "Finding and deleting unreferenced packfiles"
msgstr "Пошук і видалення файлів пакунків без посилань"
+msgid "cannot repack an incremental multi-pack-index"
+msgstr "неможливо перепакувати інкрементний multi-pack-index"
+
msgid "could not start pack-objects"
msgstr "не вдалося розпочати pack-objects"
@@ -17990,6 +18188,27 @@ msgstr ""
"multi-pack-index назви пакунків знаходяться у невірній послідовності: \"%s\" "
"перед \"%s\""
+msgid "multi-pack-index chain file too small"
+msgstr "ланцюжковий файл multi-pack-index занадто малий"
+
+#, c-format
+msgid "pack count in base MIDX too high: %<PRIuMAX>"
+msgstr "кількість пакунків у базовому MIDX занадто велика: %<PRIuMAX>"
+
+#, c-format
+msgid "object count in base MIDX too high: %<PRIuMAX>"
+msgstr "кількість обʼєктів у базовому MIDX занадто велика: %<PRIuMAX>"
+
+#, c-format
+msgid "invalid multi-pack-index chain: line '%s' not a hash"
+msgstr "неприпустимий multi-pack-index ланцюжок: рядок \"%s\" не є хешем"
+
+msgid "unable to find all multi-pack index files"
+msgstr "не вдалося знайти всі файли multi-pack-index"
+
+msgid "invalid MIDX object position, MIDX is likely corrupt"
+msgstr "неприпустима позиція MIDX обʼєкта, ймовірно, MIDX пошкоджено"
+
#, c-format
msgid "bad pack-int-id: %u (%u total packs)"
msgstr "невірний pack-int-id: %u (%u всього пакунків)"
@@ -18008,10 +18227,6 @@ msgstr ""
msgid "multi-pack-index large offset out of bounds"
msgstr "large offset multi-pack-index виходить за межі"
-#, c-format
-msgid "failed to clear multi-pack-index at %s"
-msgstr "не вдалося очистити multi-pack-index при %s"
-
msgid "multi-pack-index file exists, but failed to parse"
msgstr "multi-pack-index файл існує, але його не вдалося розібрати"
@@ -18221,6 +18436,14 @@ msgid "missing mapping of %s to %s"
msgstr "відсутнє зіставлення %s до %s"
#, c-format
+msgid "unable to open %s"
+msgstr "не вдалося відкрити %s"
+
+#, c-format
+msgid "files '%s' and '%s' differ in contents"
+msgstr "файли \"%s\" та \"%s\" відрізняються за вмістом"
+
+#, c-format
msgid "unable to write file %s"
msgstr "не вдалося записати файл %s"
@@ -18305,10 +18528,6 @@ msgid "%s is not a valid '%s' object"
msgstr "%s не є допустимим \"%s\" обʼєктом"
#, c-format
-msgid "unable to open %s"
-msgstr "не вдалося відкрити %s"
-
-#, c-format
msgid "hash mismatch for %s (expected %s)"
msgstr "невідповідність хешу для %s (очікувалось %s)"
@@ -18409,7 +18628,7 @@ msgid ""
"\n"
"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"running \"git config set advice.objectNameWarning false\""
msgstr ""
"Зазвичай Git ніколи не створює посилання, яке закінчується 40-hex "
"символами,\n"
@@ -18584,13 +18803,6 @@ msgstr "у мультіпакунковому bitmap відсутній необ
msgid "could not open pack %s"
msgstr "не вдалося відкрити пакунок %s"
-msgid "could not determine MIDX preferred pack"
-msgstr "не вдалося визначити бажаний пакунок MIDX"
-
-#, c-format
-msgid "preferred pack (%s) is invalid"
-msgstr "бажаний пакунок (%s) є неприпустимим"
-
msgid "corrupt bitmap lookup table: triplet position out of index"
msgstr "пошкоджена bitmap таблиця пошуку: триплетна позиція поза індексом"
@@ -19223,7 +19435,7 @@ msgstr "багатоступеневі записи для злитого фай
#, c-format
msgid "unordered stage entries for '%s'"
-msgstr "невпорядковані записи індексу для '%s'"
+msgstr "невпорядковані записи індексу для \"%s\""
#, c-format
msgid "unable to create load_cache_entries thread: %s"
@@ -19537,6 +19749,10 @@ msgid "expected format: %%(ahead-behind:<committish>)"
msgstr "очікуваний формат: %%(ahead-behind:<комітоподібне>)"
#, c-format
+msgid "expected format: %%(is-base:<committish>)"
+msgstr "очікуваний формат: %%(is-base:<комітоподібне>)"
+
+#, c-format
msgid "malformed field name: %.*s"
msgstr "невірно сформована назва поля: %.*s"
@@ -19711,18 +19927,26 @@ msgstr "лог для посилання %s несподівано заверш
msgid "log for %s is empty"
msgstr "лог для %s порожній"
-msgid "refusing to force and skip creation of reflog"
-msgstr "відмовлено в примусовому пропуску створення рефлогу"
-
#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr "відмовлено в оновленні посилання з невірною назвою \"%s\""
+msgid "refusing to update reflog for pseudoref '%s'"
+msgstr "відмовлено в оновленні псевдопосилання \"%s\""
#, c-format
msgid "refusing to update pseudoref '%s'"
msgstr "відмовлено в оновленні псевдопосилання \"%s\""
#, c-format
+msgid "refusing to update reflog with bad name '%s'"
+msgstr "відмовлено в оновленні reflog з невірною назвою \"%s\""
+
+#, c-format
+msgid "refusing to update ref with bad name '%s'"
+msgstr "відмовлено в оновленні посилання з невірною назвою \"%s\""
+
+msgid "refusing to force and skip creation of reflog"
+msgstr "відмовлено в примусовому пропуску створення рефлогу"
+
+#, c-format
msgid "update_ref failed for ref '%s': %s"
msgstr "update_ref завершився невдало для посилання \"%s\": %s"
@@ -19772,6 +19996,17 @@ msgstr ""
"призначенням \"%s\", але це звичайне посилання"
#, c-format
+msgid "cannot read ref file '%s'"
+msgstr "неможливо прочитати файл посилання \"%s\""
+
+#, c-format
+msgid "cannot open directory %s"
+msgstr "неможливо відкрити директорію %s"
+
+msgid "Checking references consistency"
+msgstr "Перевірка співпадіння посилань"
+
+#, c-format
msgid "refname is dangerous: %s"
msgstr "refname є небезпечним: %s"
@@ -19897,8 +20132,8 @@ msgstr "віддалений сервер надіслав неочікуван
msgid "unable to rewind rpc post data - try increasing http.postBuffer"
msgstr ""
-"не вдалося перемотати вперед rpc post дані - спробуйте збільшити http."
-"postBuffer"
+"не вдалося перемотати вперед rpc post дані - спробуйте збільшити "
+"http.postBuffer"
#, c-format
msgid "remote-curl: bad line length character: %.4s"
@@ -19973,7 +20208,7 @@ msgstr "remote-curl: невідома команда \"%s\" з git"
#, c-format
msgid "config remote shorthand cannot begin with '/': %s"
-msgstr "скорочення віддаленої конфігураціі не може починатися з '/': %s"
+msgstr "скорочення віддаленої конфігураціі не може починатися з \"/\": %s"
msgid "more than one receivepack given, using the first"
msgstr "надано більше одного пакунка для отримання, використано перший"
@@ -19982,8 +20217,12 @@ msgid "more than one uploadpack given, using the first"
msgstr "надано більше одного пакунка для завантаження, використано перший"
#, c-format
+msgid "unrecognized followRemoteHEAD value '%s' ignored"
+msgstr "нерозпізнане followRemoteHEAD значення \"%s\" було проігноровано"
+
+#, c-format
msgid "unrecognized value transfer.credentialsInUrl: '%s'"
-msgstr "нерозпізнане значення transfer.credentialsInUrl: '%s'"
+msgstr "нерозпізнане значення transfer.credentialsInUrl: \"%s\""
#, c-format
msgid "URL '%s' uses plaintext credentials"
@@ -20003,11 +20242,11 @@ msgstr "%s відстежує як %s, так і %s"
#, c-format
msgid "key '%s' of pattern had no '*'"
-msgstr "ключ '%s' шаблону не містив '*'"
+msgstr "ключ \"%s\" шаблону не містив '*'"
#, c-format
msgid "value '%s' of pattern has no '*'"
-msgstr "значення '%s' шаблону не містить '*'"
+msgstr "значення \"%s\" шаблону не містить '*'"
#, c-format
msgid "src refspec %s does not match any"
@@ -20106,11 +20345,11 @@ msgstr "HEAD не вказує на гілку"
#, c-format
msgid "no such branch: '%s'"
-msgstr "немає такої гілки: '%s'"
+msgstr "немає такої гілки: \"%s\""
#, c-format
msgid "no upstream configured for branch '%s'"
-msgstr "першоджерельне сховище не налаштовано для гілки '%s'"
+msgstr "першоджерельне сховище не налаштовано для гілки \"%s\""
#, c-format
msgid "upstream branch '%s' not stored as a remote-tracking branch"
@@ -20131,7 +20370,7 @@ msgid "push refspecs for '%s' do not include '%s'"
msgstr "надіслані визначники посилань для \"%s\" не включають \"%s\""
msgid "push has no destination (push.default is 'nothing')"
-msgstr "надсилання не має призначення (push.default дорівнює 'nothing')"
+msgstr "надсилання не має призначення (push.default дорівнює \"nothing\")"
msgid "cannot resolve 'simple' push to a single destination"
msgstr ""
@@ -20184,7 +20423,7 @@ msgstr[0] ""
msgstr[1] ""
"Ваша гілка відстає від \"%s\" на %d коміти, і її можна перемотати вперед.\n"
msgstr[2] ""
-"Ваша гілка відстає від гілки '%s' на %d комітів, і її можна перемотати "
+"Ваша гілка відстає від гілки \"%s\" на %d комітів, і її можна перемотати "
"вперед.\n"
msgid " (use \"git pull\" to update your local branch)\n"
@@ -20219,7 +20458,7 @@ msgstr "неможливо розібрати очікувану назву об
#, c-format
msgid "cannot strip one component off url '%s'"
-msgstr "неможливо вилучити один компонент з url '%s'"
+msgstr "неможливо вилучити один компонент з url \"%s\""
#, c-format
msgid "bad replace ref name: %s"
@@ -20429,12 +20668,15 @@ msgstr ""
msgid "create repository within 'src' directory"
msgstr "створити сховище в директорії \"src\""
+msgid "specify if tags should be fetched during clone"
+msgstr "вказати, чи потрібно отримувати теги під час клонування"
+
msgid ""
"scalar clone [--single-branch] [--branch <main-branch>] [--full-clone]\n"
-"\t[--[no-]src] <url> [<enlistment>]"
+"\t[--[no-]src] [--[no-]tags] <url> [<enlistment>]"
msgstr ""
"scalar clone [--single-branch] [--branch <головна-гілка>] [--full-clone]\n"
-"\t[--[no-]src] <URL-адреса> [<коренева-директорія>]"
+"\t[--[no-]src] [--[no-]tags] <URL-адреса> [<коренева-директорія-проекту>]"
#, c-format
msgid "cannot deduce worktree name from '%s'"
@@ -20453,6 +20695,10 @@ msgid "could not configure remote in '%s'"
msgstr "не вдалося налаштувати віддалене сховище в \"%s\""
#, c-format
+msgid "could not disable tags in '%s'"
+msgstr "не вдалося вимкнути теги в \"%s\""
+
+#, c-format
msgid "could not configure '%s'"
msgstr "не вдалося налаштувати \"%s\""
@@ -20983,7 +21229,7 @@ msgid ""
msgstr ""
"\"reword\" не приймає коміти злиття. Якщо ви хочете\n"
"відтворити злиття та змінити текст допису, використовуйте\n"
-"\"merge -c\" для коміта."
+"\"merge -c\" для коміта"
#. TRANSLATORS: 'edit', 'merge -C' and 'break' should
#. not be translated.
@@ -21526,6 +21772,10 @@ msgid "failed to stat '%*s%s%s'"
msgstr "не вдалося записати \"%*s%s%s\""
#, c-format
+msgid "safe.directory '%s' not absolute"
+msgstr "safe.directory \"%s\" не є абсолютною"
+
+#, c-format
msgid ""
"detected dubious ownership in repository at '%s'\n"
"%sTo add an exception for this directory, call:\n"
@@ -21863,7 +22113,7 @@ msgstr "Не вдалося оновити підмодуль \"%s\"."
#, c-format
msgid "submodule git dir '%s' is inside git dir '%.*s'"
-msgstr "підмодуль git dir \"%s\" знаходиться всередині git директорії \"%*s\""
+msgstr "підмодуль git dir \"%s\" знаходиться всередині git директорії \"%.*s\""
#, c-format
msgid "expected '%.*s' in submodule path '%s' not to be a symbolic link"
@@ -21936,6 +22186,9 @@ msgstr "коміт %s не позначений як досяжний"
msgid "too many commits marked reachable"
msgstr "забагато комітів позначено як досяжні"
+msgid "could not determine MIDX preferred pack"
+msgstr "не вдалося визначити бажаний пакунок MIDX"
+
msgid "test-tool serve-v2 [<options>]"
msgstr "test-tool serve-v2 [<опції>]"
@@ -22001,6 +22254,24 @@ msgstr "токен"
msgid "command token to send to the server"
msgstr "токен команди для відправки на сервер"
+msgid "unit-test [<options>]"
+msgstr "unit-test [<опції>]"
+
+msgid "immediately exit upon the first failed test"
+msgstr "вихід відразу після першого невдалого тесту"
+
+msgid "suite[::test]"
+msgstr "suite[::test]"
+
+msgid "run only test suite or individual test <suite[::test]>"
+msgstr "запустити тільки набір тестів або окремий тест <suite[::test]>"
+
+msgid "suite"
+msgstr "набір"
+
+msgid "exclude test suite <suite>"
+msgstr "виключити набір тестів <suite>"
+
#, c-format
msgid "running trailer command '%s' failed"
msgstr "не вдалося виконати команду трейлера \"%s\""
@@ -22580,6 +22851,9 @@ msgstr ".git файл пошкоджено"
msgid ".git file incorrect"
msgstr ".git файл не є коректним"
+msgid ".git file absolute/relative path mismatch"
+msgstr "неспівпадіння абсолютного/відносного шляху до .git файлу"
+
msgid "not a valid path"
msgstr "неприпустимий шлях"
@@ -22595,6 +22869,9 @@ msgstr "не вдалося знайти сховище; файл .git пошк
msgid "gitdir unreadable"
msgstr "нечитабельна git директорія"
+msgid "gitdir absolute/relative path mismatch"
+msgstr "неспівпадіння абсолютного/відносного шляху git директорії"
+
msgid "gitdir incorrect"
msgstr "невірна git директорія"
@@ -22630,6 +22907,13 @@ msgstr "не вдалося скинути %s в \"%s\""
msgid "failed to set extensions.worktreeConfig setting"
msgstr "не вдалося встановити extensions.worktreeConfig параметр"
+msgid "unable to upgrade repository format to support relative worktrees"
+msgstr ""
+"не вдалося оновити формат сховища для підтримки відносних робочих дерев"
+
+msgid "unable to set extensions.relativeWorktrees setting"
+msgstr "не вдалося встановити параметр extensions.relativeWorktrees"
+
#, c-format
msgid "could not setenv '%s'"
msgstr "не вдалося встановити змінну оточення \"%s\""
@@ -22965,7 +23249,7 @@ msgstr ""
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Наразі ви робите бісекцію, починаючи з гілки '%s'."
+msgstr "Наразі ви робите бісекцію, починаючи з гілки \"%s\"."
msgid "You are currently bisecting."
msgstr "Наразі ви робите бісекцію."
@@ -23198,6 +23482,9 @@ msgstr "\"%s.final\" містить створений лист.\n"
msgid "--dump-aliases incompatible with other options\n"
msgstr "--dump-aliases несумісна з іншими опціями\n"
+msgid "--dump-aliases and --translate-aliases are mutually exclusive\n"
+msgstr "--dump-aliases і --translate-aliases є взаємовиключними\n"
+
msgid ""
"fatal: found configuration options for 'sendmail'\n"
"git-send-email is configured with the sendemail.* options - note the 'e'.\n"
@@ -23370,8 +23657,8 @@ msgstr ""
" Наведений вище список копій було розширено додатковими\n"
" адресами, знайденими у дописі до коміту латки. Зазвичай\n"
" send-email запитує перед надсиланням, коли це трапляється.\n"
-" Цю поведінку можна контролювати за допомогою параметра sendemail."
-"confirm\n"
+" Цю поведінку можна контролювати за допомогою параметра "
+"sendemail.confirm\n"
" налаштування конфігурації.\n"
"\n"
" Для отримання додаткової інформації виконайте команду \"git send-email --"
diff --git a/po/vi.po b/po/vi.po
index 00008b50f5..80a5f191a8 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -4,11 +4,11 @@
# https://raw.githubusercontent.com/git-l10n/git-po/pot/main/po/git.pot
# ---
# Copyright (C) 2012-2022, Translation Project, Vietnamese Team <http://translationproject.org/team/vi.html>
-# Copyright (C) 2024, Vũ Tiến Hưng <newcomerminecraft@gmail.com>
+# Copyright (C) 2024-2025, Vũ Tiến Hưng <newcomerminecraft@gmail.com>
# Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2012.
# Đoàn Trần Công Danh <congdanhqx@gmail.com>, 2020.
# Trần Ngọc Quân <vnwildman@gmail.com>, 2012-2022.
-# Vũ Tiến Hưng <newcomerminecraft@gmail.com>, 2024.
+# Vũ Tiến Hưng <newcomerminecraft@gmail.com>, 2024-2025.
# ---
# BẢNG THUẬT NGỮ / TERMINOLOGY
# Updated: 2024-07-26, git 2.46
@@ -64,10 +64,10 @@
# +------------------------------------------------------------------+
msgid ""
msgstr ""
-"Project-Id-Version: git 2.47\n"
+"Project-Id-Version: git 2.48\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2024-10-05 01:20+0000\n"
-"PO-Revision-Date: 2024-10-05 16:48+0700\n"
+"POT-Creation-Date: 2024-12-23 18:57+0000\n"
+"PO-Revision-Date: 2025-01-05 01:20+0700\n"
"Last-Translator: Vũ Tiến Hưng <newcomerminecraft@gmail.com>\n"
"Language-Team: Vietnamese <https://github.com/Nekosha/git-po>\n"
"Language: vi\n"
@@ -686,10 +686,10 @@ msgstr "Chỉ có các tập tin nhị phân thay đổi."
#, c-format
msgid ""
"\n"
-"Disable this message with \"git config advice.%s false\""
+"Disable this message with \"git config set advice.%s false\""
msgstr ""
"\n"
-"Tắt lời nhắn này bằng \"git config advice.%s false\""
+"Tắt lời nhắn này bằng \"git config set advice.%s false\""
#, c-format
msgid "%shint:%s%.*s%s\n"
@@ -1904,7 +1904,7 @@ msgid "update tracked files"
msgstr "cập nhật các tập tin được theo dõi"
msgid "renormalize EOL of tracked files (implies -u)"
-msgstr "thường hóa lại EOL của các tập tin được theo dõi (ngụ ý -u)"
+msgstr "thường hóa lại EOL của các tập tin được theo dõi (ngầm chỉ định -u)"
msgid "record only the fact that the path will be added later"
msgstr "chỉ ghi lại sự việc mà đường dẫn sẽ được thêm vào sau"
@@ -2017,7 +2017,7 @@ msgstr "không hiểu cú pháp %s"
#, c-format
msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "'%s' bị xóa bởi móc applypatch-msg"
+msgstr "'%s' bị xóa bởi hook applypatch-msg"
#, c-format
msgid "Malformed input line: '%s'."
@@ -3040,11 +3040,11 @@ msgid "HEAD not found below refs/heads!"
msgstr "Không tìm thấy HEAD ở dưới refs/heads!"
msgid ""
-"branch with --recurse-submodules can only be used if submodule."
-"propagateBranches is enabled"
+"branch with --recurse-submodules can only be used if "
+"submodule.propagateBranches is enabled"
msgstr ""
-"nhánh với --recurse-submodules chỉ có thể được sử dụng nếu submodule."
-"propagateBranches được kích hoạt"
+"nhánh với --recurse-submodules chỉ có thể được sử dụng nếu "
+"submodule.propagateBranches được kích hoạt"
msgid "--recurse-submodules can only be used to create branches"
msgstr "--recurse-submodules chỉ có thể được sử dụng để tạo ra các nhánh"
@@ -3125,7 +3125,7 @@ msgid "libc info: "
msgstr "thông tin libc: "
msgid "not run from a git repository - no hooks to show\n"
-msgstr "không chạy từ một kho git - nên chẳng có móc nào để hiển thị cả\n"
+msgstr "không chạy từ một kho git - nên chẳng có hook nào để hiển thị cả\n"
msgid ""
"git bugreport [(-o | --output-directory) <path>]\n"
@@ -3200,7 +3200,7 @@ msgid "System Info"
msgstr "Thông tin hệ thống"
msgid "Enabled Hooks"
-msgstr "Các Móc đã được bật"
+msgstr "Các hook đã được bật"
#, c-format
msgid "unable to write to %s"
@@ -3880,8 +3880,8 @@ msgstr "nhánh chưa sinh mới"
msgid "update ignored files (default)"
msgstr "cập nhật các tập tin bị bỏ qua (mặc định)"
-msgid "do not check if another worktree is holding the given ref"
-msgstr "không kiểm tra nếu cây làm việc khác đang giữ tham chiếu đã cho"
+msgid "do not check if another worktree is using this branch"
+msgstr "không kiểm tra nếu cây làm việc khác đang sử dụng nhánh này"
msgid "checkout our version for unmerged files"
msgstr "checkout phiên bản của ta cho các tập tin chưa được hòa trộn"
@@ -4129,7 +4129,7 @@ msgid "create a bare repository"
msgstr "tạo kho bare"
msgid "create a mirror repository (implies --bare)"
-msgstr "tạo kho bản sao (ngụ ý --bare)"
+msgstr "tạo kho bản sao (ngầm chỉ định --bare)"
msgid "to clone from a local repository"
msgstr "để nhân bản từ kho nội bộ"
@@ -4182,11 +4182,11 @@ msgstr "tạo bản sao không đầy đủ cho mức sâu đã cho"
msgid "create a shallow clone since a specific time"
msgstr "tạo bản sao không đầy đủ từ thời điểm đã cho"
-msgid "revision"
-msgstr "điểm xét duyệt"
+msgid "ref"
+msgstr "ref"
-msgid "deepen history of shallow clone, excluding rev"
-msgstr "làm sâu hơn lịch sử của bản sao shallow, bằng điểm xét duyệt loại trừ"
+msgid "deepen history of shallow clone, excluding ref"
+msgstr "làm sâu hơn lịch sử của bản sao shallow, loại trừ tham chiếu"
msgid "clone only one branch, HEAD or --branch"
msgstr "chỉ nhân bản một nhánh, HEAD hoặc --branch"
@@ -5068,7 +5068,7 @@ msgid "commit only specified files"
msgstr "chỉ chuyển giao các tập tin đã chỉ ra"
msgid "bypass pre-commit and commit-msg hooks"
-msgstr "vòng qua móc (hook) pre-commit và commit-msg"
+msgstr "bỏ qua hook pre-commit và commit-msg"
msgid "show what would be committed"
msgstr "hiển thị xem cái gì có thể được chuyển giao"
@@ -5077,7 +5077,7 @@ msgid "amend previous commit"
msgstr "'tu bổ' (amend) lần commit trước"
msgid "bypass post-rewrite hook"
-msgstr "vòng qua móc (hook) post-rewrite"
+msgstr "bỏ qua hook post-rewrite"
msgid "ok to record an empty change"
msgstr "ok để ghi lại một thay đổi trống rỗng"
@@ -5143,10 +5143,10 @@ msgstr ""
msgid ""
"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
-"<name> <value>"
+"<name>"
msgstr ""
"git config unset [<tuỳ-chọn>] [--all] [--value=<giá-trị>] [--fixed-value] "
-"<khoá> <giá-trị>"
+"<khoá>"
msgid "git config rename-section [<file-option>] <old-name> <new-name>"
msgstr "git config rename-section [<tuỳ-chọn>] <tên-cũ> <tên-mới>"
@@ -5579,12 +5579,8 @@ msgid "traversed %lu commits\n"
msgstr "đã xuyên %lu qua lần chuyển giao\n"
#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"tìm thấy nhiều hơn %i thẻ; đã liệt kê %i cái gần\n"
-"đây nhất bỏ đi tìm kiếm tại %s\n"
+msgid "found %i tags; gave up search at %s\n"
+msgstr "tìm thấy %i thẻ; từ bỏ tìm kiếm tại %s\n"
#, c-format
msgid "describe %s\n"
@@ -6020,6 +6016,19 @@ msgstr "%s không phải là một đối tượng hợp lệ"
msgid "the object %s does not exist"
msgstr "đối tượng '%s' không tồn tại"
+#, c-format
+msgid ""
+"Run 'git remote set-head %s %s' to follow the change, or set\n"
+"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
+"if you do not want to see this message. Specifically running\n"
+"'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
+"until the remote changes HEAD to something else."
+msgstr ""
+"Chạy 'git remote set-head %s %s' để làm theo thay đổi, hoặc đặt tuỳ chọn\n"
+"'remote.%s.followRemoteHEAD' sang giá trị khác nếu bạn không muốn thấy\n"
+"thông báo này. Cụ thể, 'git config set remote.%s.followRemoteHEAD %s'\n"
+"sẽ vô hiệu cảnh báo này tới khi máy chủ đổi HEAD về chỗ khác."
+
msgid "multiple branches detected, incompatible with --set-upstream"
msgstr "phát hiện nhiều nhánh, không tương thích với --set-upstream"
@@ -6157,6 +6166,9 @@ msgstr "refmap"
msgid "specify fetch refmap"
msgstr "chỉ ra refmap cần lấy về"
+msgid "revision"
+msgstr "điểm xét duyệt"
+
msgid "report that we have only objects reachable from this object"
msgstr "báo rằng ta chỉ có các đối tượng tiếp cận được từ đối tượng này"
@@ -6209,11 +6221,11 @@ msgid "protocol does not support --negotiate-only, exiting"
msgstr "giao thức không hỗ trợ --negotiate-only, nên thoát"
msgid ""
-"--filter can only be used with the remote configured in extensions."
-"partialclone"
+"--filter can only be used with the remote configured in "
+"extensions.partialclone"
msgstr ""
-"--filter chỉ có thể được dùng với máy chủ được cấu hình bằng extensions."
-"partialclone"
+"--filter chỉ có thể được dùng với máy chủ được cấu hình bằng "
+"extensions.partialclone"
msgid "--atomic can only be used when fetching from one remote"
msgstr "--atomic chỉ có thể dùng khi lấy về từ một máy chủ"
@@ -6882,8 +6894,24 @@ msgstr "hoặc là bộ lập lịch systemd hoặc là crontab không sẵn có
msgid "%s scheduler is not available"
msgstr "bộ lên lịch %s không sẵn có"
-msgid "another process is scheduling background maintenance"
-msgstr "một tiến trình khác được lập kế hoạch chạy nền để bảo trì"
+#, c-format
+msgid ""
+"unable to create '%s.lock': %s.\n"
+"\n"
+"Another scheduled git-maintenance(1) process seems to be running in this\n"
+"repository. Please make sure no other maintenance processes are running and\n"
+"then try again. If it still fails, a git-maintenance(1) process may have\n"
+"crashed in this repository earlier: remove the file manually to continue."
+msgstr ""
+"Không thể tạo '%s.lock': %s.\n"
+"\n"
+"Tiến trình git-maintenance(1) khác có lẽ đang chạy ở kho này. Vui lòng\n"
+"chắc chắn rằng mọi tiến trình đã kết thúc và sau đó thử lại. Nếu vẫn lỗi,\n"
+"một tiến trình git-maintenance(1) có lẽ đã crash ở kho này trước đó:\n"
+"gõ bỏ tập tin thủ công để tiếp tục."
+
+msgid "cannot acquire lock for scheduled background maintenance"
+msgstr "không thể lấy được lock để bảo trì nền theo kế hoạch"
msgid "git maintenance start [--scheduler=<scheduler>]"
msgstr "git maintenance start [--scheduler=<bộ lên lịch>]"
@@ -7250,8 +7278,8 @@ msgid ""
"git hook run [--ignore-missing] [--to-stdin=<path>] <hook-name> [-- <hook-"
"args>]"
msgstr ""
-"git hook run [--ignore-missing] [--to-stdin=</đường/dẫn/>] <tên-móc> [-- "
-"<các tham số cho móc>]"
+"git hook run [--ignore-missing] [--to-stdin=</đường/dẫn/>] <tên-hook> [-- "
+"<các tham số cho hook>]"
msgid "silently ignore missing requested <hook-name>"
msgstr "âm thầm bỏ qua các <hook-name> đã yêu cầu còn thiếu"
@@ -7445,6 +7473,20 @@ msgid "chain length = %d: %lu object"
msgid_plural "chain length = %d: %lu objects"
msgstr[0] "chiều dài chuỗi = %d: %lu đối tượng"
+msgid "could not start pack-objects to repack local links"
+msgstr "không thể bắt đầu pack-objects để đóng gói lại các link cục bộ"
+
+msgid "failed to feed local object to pack-objects"
+msgstr "gặp lỗi khi đưa local object cho pack-objects"
+
+msgid "index-pack: Expecting full hex object ID lines only from pack-objects."
+msgstr ""
+"index-pack: Đang chỉ cần các dòng ID đối tượng dạng hexa đầy đủ từ pack-"
+"objects."
+
+msgid "could not finish pack-objects to repack local links"
+msgstr "không thể hoàn tất pack-objects để đóng gói các link cục bộ"
+
msgid "Cannot come back to cwd"
msgstr "Không thể quay lại thư mục hiện hành"
@@ -7456,6 +7498,9 @@ msgstr "%s sai"
msgid "unknown hash algorithm '%s'"
msgstr "không hiểu thuật toán băm dữ liệu '%s'"
+msgid "--promisor cannot be used with a pack name"
+msgstr "không được dùng --promisor với tên pack"
+
msgid "--stdin requires a git repository"
msgstr "--stdin cần một kho git"
@@ -8101,7 +8146,8 @@ msgid "use full path names"
msgstr "dùng tên đường dẫn đầy đủ"
msgid "list entire tree; not just current directory (implies --full-name)"
-msgstr "liệt kê cây mục tin; không chỉ thư mục hiện hành (ngụ ý --full-name)"
+msgstr ""
+"liệt kê cây mục tin; không chỉ thư mục hiện hành (ngầm chỉ định --full-name)"
msgid "--format can't be combined with other format-altering options"
msgstr ""
@@ -8390,10 +8436,10 @@ msgid "continue the current in-progress merge"
msgstr "tiếp tục quá trình hòa trộn hiện tại đang thực hiện"
msgid "bypass pre-merge-commit and commit-msg hooks"
-msgstr "vòng qua móc (hook) pre-merge-commit và commit-msg"
+msgstr "bỏ qua hook pre-merge-commit và commit-msg"
msgid "could not run stash."
-msgstr "không thể chạy stash."
+msgstr "không thể chạy tạm cất."
msgid "stash failed"
msgstr "lệnh tạm cất gặp lỗi"
@@ -8815,11 +8861,11 @@ msgstr "git notes [--ref <notes-ref>] [list [<đối-tượng>]]"
msgid ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <lời-nhắn> | -F <tập-"
-"tin> | (-c | -C) <đối-tượng>] [<đối-tượng>]"
+"tin> | (-c | -C) <đối-tượng>] [<đối-tượng>] [-e]"
msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
msgstr "git notes [--ref <notes-ref>] copy [-f] <từ-đối-tượng> <đến-đối-tượng>"
@@ -8827,11 +8873,11 @@ msgstr "git notes [--ref <notes-ref>] copy [-f] <từ-đối-tượng> <đến-
msgid ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <lời-nhắn> | -F <tập-"
-"tin> | (-c | -C) <đối-tượng>] [<đối-tượng>]"
+"tin> | (-c | -C) <đối-tượng>] [<đối-tượng>] [-e]"
msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
msgstr "git notes [--ref <notes-ref>] edit [--allow-empty] [<đối-tượng>]"
@@ -8950,6 +8996,9 @@ msgstr "nội dung ghi chú (note) nằm trong một tập tin"
msgid "reuse and edit specified note object"
msgstr "dùng lại nhưng có sửa chữa đối tượng note đã chỉ ra"
+msgid "edit note message in editor"
+msgstr "sửa lại chú thích trong trình soạn thảo"
+
msgid "reuse specified note object"
msgstr "dùng lại đối tượng ghi chú (note) đã chỉ ra"
@@ -8988,7 +9037,7 @@ msgid "read objects from stdin"
msgstr "đọc các đối tượng từ stdin"
msgid "load rewriting config for <command> (implies --stdin)"
-msgstr "tải cấu hình chép lại cho <lệnh> (ngụ ý --stdin)"
+msgstr "tải cấu hình chép lại cho <lệnh> (ngầm chỉ định --stdin)"
msgid "too few arguments"
msgstr "quá ít đối số"
@@ -9355,7 +9404,7 @@ msgid "limit pack window by memory in addition to object limit"
msgstr "giới hạn cửa sổ đóng gói theo bộ nhớ cộng thêm với giới hạn đối tượng"
msgid "maximum length of delta chain allowed in the resulting pack"
-msgstr "độ dài tối đa của chuỗi móc xích 'delta' được phép trong gói kết quả"
+msgstr "độ dài tối đa của chuỗi delta được phép trong gói kết quả"
msgid "reuse existing deltas"
msgstr "dùng lại các delta sẵn có"
@@ -9448,8 +9497,11 @@ msgstr "xử lý cho thiếu đối tượng"
msgid "do not pack objects in promisor packfiles"
msgstr "không thể đóng gói các đối tượng trong các tập tin gói promisor"
+msgid "implies --missing=allow-any"
+msgstr "ngầm chỉ định --missing=allow-any"
+
msgid "respect islands during delta compression"
-msgstr "tôn trọng island trong suốt quá trình nén 'delta'"
+msgstr "tôn trọng island trong suốt quá trình nén delta"
msgid "protocol"
msgstr "giao thức"
@@ -9584,7 +9636,7 @@ msgid "allow fast-forward"
msgstr "cho phép chuyển-tiếp-nhanh"
msgid "control use of pre-merge-commit and commit-msg hooks"
-msgstr "điều khiển cách dùng các móc (hook) pre-merge-commit và commit-msg"
+msgstr "điều khiển cách dùng các hook pre-merge-commit và commit-msg"
msgid "automatically stash/stash pop before and after"
msgstr "tự động stash/stash pop trước và sau"
@@ -9785,8 +9837,8 @@ msgid ""
msgstr ""
"\n"
"Để tránh tự động cấu hình nhánh thượng nguồn khi tên của chúng\n"
-"không khớp với nhánh nội bộ, xem tùy chọn 'simple' của branch."
-"autoSetupMerge\n"
+"không khớp với nhánh nội bộ, xem tùy chọn 'simple' của "
+"branch.autoSetupMerge\n"
"trong 'git help config'.\n"
#, c-format
@@ -9994,7 +10046,7 @@ msgid "prune locally removed refs"
msgstr "xén tỉa những tham chiếu bị gỡ bỏ"
msgid "bypass pre-push hook"
-msgstr "vòng qua móc tiền-đẩy (pre-push)"
+msgstr "bỏ qua hook tiền-đẩy (pre-push)"
msgid "push missing but relevant tags"
msgstr "push phần bị thiếu nhưng các thẻ lại thích hợp"
@@ -10289,10 +10341,10 @@ msgid "use the merge-base of upstream and branch as the current base"
msgstr "sử dụng gốc hòa trộn của thượng nguồn và nhánh làm gốc hiện tại"
msgid "allow pre-rebase hook to run"
-msgstr "cho phép móc (hook) pre-rebase được chạy"
+msgstr "cho phép hook pre-rebase được chạy"
msgid "be quiet. implies --no-stat"
-msgstr "im lặng. ngụ ý --no-stat"
+msgstr "im lặng. ngầm chỉ định --no-stat"
msgid "display a diffstat of what changed upstream"
msgstr "hiển thị diffstat của những thay đổi thượng nguồn"
@@ -10526,14 +10578,14 @@ msgid "Current branch %s is up to date.\n"
msgstr "Nhánh hiện tại %s đã được cập nhật rồi.\n"
msgid "HEAD is up to date, rebase forced."
-msgstr "HEAD hiện đã được cập nhật rồi, bị ép buộc rebase."
+msgstr "HEAD hiện đã được cập nhật rồi, ép buộc rebase."
#, c-format
msgid "Current branch %s is up to date, rebase forced.\n"
-msgstr "Nhánh hiện tại %s đã được cập nhật rồi, lệnh rebase ép buộc.\n"
+msgstr "Nhánh hiện tại %s đã được cập nhật rồi, ép buộc rebase.\n"
msgid "The pre-rebase hook refused to rebase."
-msgstr "Móc (hook) pre-rebase từ chối rebase."
+msgstr "Hook pre-rebase từ chối rebase."
#, c-format
msgid "Changes to %s:\n"
@@ -10546,7 +10598,7 @@ msgstr "Thay đổi từ %s thành %s:\n"
#, c-format
msgid "First, rewinding head to replay your work on top of it...\n"
msgstr ""
-"Trước tiên, di chuyển head để xem lại các công việc trên đỉnh của nó...\n"
+"Trước tiên, di chuyển lại head để thực hiện lại các thay đổi trên nó...\n"
msgid "Could not detach HEAD"
msgstr "Không thể tách rời HEAD"
@@ -11048,6 +11100,29 @@ msgid " Local ref configured for 'git push'%s:"
msgid_plural " Local refs configured for 'git push'%s:"
msgstr[0] " Những tham chiếu nội bộ được cấu hình cho lệnh 'git push'%s:"
+#, c-format
+msgid "'%s/HEAD' is unchanged and points to '%s'\n"
+msgstr "'%s/HEAD' không đổi và trỏ đến '%s'\n"
+
+#, c-format
+msgid "'%s/HEAD' has changed from '%s' and now points to '%s'\n"
+msgstr "'%s/HEAD' đã đổi từ '%s' để trỏ đến '%s'\n"
+
+#, c-format
+msgid "'%s/HEAD' is now created and points to '%s'\n"
+msgstr "'%s/HEAD' đã tạo và trỏ đến '%s'\n"
+
+#, c-format
+msgid "'%s/HEAD' was detached at '%s' and now points to '%s'\n"
+msgstr "'%s/HEAD' đã tách ra ở '%s' và trỏ đến '%s'\n"
+
+#, c-format
+msgid ""
+"'%s/HEAD' used to point to '%s' (which is not a remote branch), but now "
+"points to '%s'\n"
+msgstr ""
+"'%s/HEAD' từng trỏ đến '%s' (không phải nhánh máy chủ) và giờ trỏ đến '%s'\n"
+
msgid "set refs/remotes/<name>/HEAD according to remote"
msgstr "đặt refs/remotes/<tên>/HEAD cho phù hợp với máy chủ"
@@ -11069,7 +11144,7 @@ msgid "Not a valid ref: %s"
msgstr "Không phải là tham chiếu hợp lệ: %s"
#, c-format
-msgid "Could not setup %s"
+msgid "Could not set up %s"
msgstr "Không thể cài đặt %s"
#, c-format
@@ -12955,7 +13030,7 @@ msgid "don't print cloning progress"
msgstr "đừng in tiến trình nhân bản"
msgid "disallow cloning into non-empty directory, implies --init"
-msgstr "không cho phép nhân bản vào thư mục trống, ngụ ý --init"
+msgstr "không cho phép nhân bản vào thư mục trống, ngầm chỉ định --init"
msgid ""
"git submodule [--quiet] update [--init [--filter=<filter-spec>]] [--remote] "
@@ -13778,6 +13853,9 @@ msgstr "cài đặt chế độ theo dõi (xem git-branch(1))"
msgid "try to match the new branch name with a remote-tracking branch"
msgstr "có khớp tên tên nhánh mới với một nhánh theo dõi máy chủ"
+msgid "use relative paths for worktrees"
+msgstr "dùng đường dẫn tương đối cho thư mục làm việc"
+
#, c-format
msgid "options '%s', '%s', and '%s' cannot be used together"
msgstr "tùy chọn '%s', '%s' và '%s' không thể dùng cùng nhau"
@@ -14049,6 +14127,25 @@ msgstr "không thể tạo '%s'"
msgid "index-pack died"
msgstr "index-pack đã chết"
+#, c-format
+msgid "directory '%s' is present in index, but not sparse"
+msgstr "Thư mục '%s' có ở trong chỉ mục, mà không phải dạng sparse?"
+
+msgid "corrupted cache-tree has entries not present in index"
+msgstr "cache-tree bị hỏng, chứa mục không có trong chỉ mục"
+
+#, c-format
+msgid "%s with flags 0x%x should not be in cache-tree"
+msgstr "%s với cờ 0x%x không nên có trong cache-tree"
+
+#, c-format
+msgid "bad subtree '%.*s'"
+msgstr "subtree sai '%.*s'"
+
+#, c-format
+msgid "cache-tree for path %.*s does not match. Expected %s got %s"
+msgstr "cache-tree cho đường dẫn %.*s không khớp. Cần %s nhưng có %s"
+
msgid "terminating chunk id appears earlier than expected"
msgstr "id chunk kết thúc sớm hơn bình thường"
@@ -14264,7 +14361,7 @@ msgid "Display help information about Git"
msgstr "Hiển thị thông tin trợ giúp về Git"
msgid "Run git hooks"
-msgstr "Chạy các móc git"
+msgstr "Chạy các hook git"
msgid "Server side implementation of Git over HTTP"
msgstr "Hỗ trợ phía máy chủ của Git qua HTTP"
@@ -14930,7 +15027,7 @@ msgid ""
"to convert the grafts into replace refs.\n"
"\n"
"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
msgstr ""
"Hỗ trợ cho <GIT_DIR>/info/grafts đã không còn\n"
"và sẽ bị xóa bỏ ở phiên bản Git tương lai.\n"
@@ -14939,7 +15036,7 @@ msgstr ""
"để chuyển đổi các graft thành các tham chiếu thay thế.\n"
"\n"
"Tắt lời nhắn này bằng cách chạy\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
#, c-format
msgid "commit %s exists in commit-graph but not in the object database"
@@ -15750,6 +15847,18 @@ msgstr "url không có lược đồ: %s"
msgid "credential url cannot be parsed: %s"
msgstr "không hiểu cú pháp giấy chứng thực url: %s"
+#, c-format
+msgid "invalid timeout '%s', expecting a non-negative integer"
+msgstr "timeout không hợp lệ '%s', cần số nguyên không âm"
+
+#, c-format
+msgid "invalid init-timeout '%s', expecting a non-negative integer"
+msgstr "init-timeout không hợp lệ '%s', cần số nguyên không âm"
+
+#, c-format
+msgid "invalid max-connections '%s', expecting an integer"
+msgstr "max-connections không hợp lệ '%s', cần số nguyên"
+
msgid "in the future"
msgstr "ở tương lai"
@@ -16445,6 +16554,20 @@ msgstr "đường dẫn không gian tên git \"%s\" sai"
msgid "too many args to run %s"
msgstr "quá nhiều tham số để chạy %s"
+#, c-format
+msgid ""
+"You are attempting to fetch %s, which is in the commit graph file but not in "
+"the object database.\n"
+"This is probably due to repo corruption.\n"
+"If you are attempting to repair this repo corruption by refetching the "
+"missing object, use 'git fetch --refetch' with the missing object."
+msgstr ""
+"Bạn đang muốn lấy về %s, nằm trong tập tin đồ-thị-chuyển-giao nhưng nằm "
+"ngoài cơ sở dữ liệu đối tượng.\n"
+"Nhiều khả năng kho chứa đã bị hỏng.\n"
+"Nếu bạn đang cần sửa chữa lại kho chứa bằng cách lấy về đối tượng còn thiếu, "
+"dùng 'git fetch --refetch' với đối tượng đó."
+
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack: cần danh sách shallow"
@@ -16878,8 +17001,8 @@ msgid ""
"given pattern contains NULL byte (via -f <file>). This is only supported "
"with -P under PCRE v2"
msgstr ""
-"mẫu đã cho có chứa NULL byte (qua -f <file>). Điều này chỉ được hỗ trợ với -"
-"P dưới PCRE v2"
+"mẫu đã cho có chứa NULL byte (qua -f <file>). Điều này chỉ được hỗ trợ với "
+"-P dưới PCRE v2"
#, c-format
msgid "'%s': unable to read %s"
@@ -17023,10 +17146,10 @@ msgstr[0] ""
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
+"You can disable this warning with `git config set advice.ignoredHook false`."
msgstr ""
-"Móc '%s' bị bỏ qua bởi vì nó không có cờ thực thi được.\n"
-"Bạn có thể tắt cảnh báo này bằng 'git config advice.ignoredHook false'."
+"Hook '%s' bị bỏ qua bởi vì nó không có cờ thực thi được.\n"
+"Bạn có thể tắt cảnh báo này bằng 'git config set advice.ignoredHook false'."
msgid "not a git repository"
msgstr "không phải là kho git"
@@ -17042,15 +17165,9 @@ msgstr "giá trị âm cho http.postBuffer; đặt thành mặc định là %d"
msgid "Delegation control is not supported with cURL < 7.22.0"
msgstr "Điều khiển giao quyền không được hỗ trợ với cURL < 7.22.0"
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr "Chốt khóa công không được hỗ trợ với cURL < 7.39.0"
-
msgid "Unknown value for http.proactiveauth"
msgstr "không hiểu giá trị cho http.proactiveauth"
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr "CURLSSLOPT_NO_REVOKE không được hỗ trợ với cURL < 7.44.0"
-
#, c-format
msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
msgstr ""
@@ -17204,7 +17321,7 @@ msgstr ""
"Tiến trình git khác có lẽ đang chạy ở kho này, ví dụ\n"
"một trình soạn thảo được mở bởi 'git commit'. Vui lòng chắc chắn\n"
"rằng mọi tiến trình đã kết thúc và sau đó thử lại. Nếu vẫn lỗi,\n"
-"một tiến trình git có lẽ đã crash khi thực hiện ở kho này trước đó:\n"
+"một tiến trình git có lẽ đã crash ở kho này trước đó:\n"
"gõ bỏ tập tin một cách thủ công để tiếp tục."
#, c-format
@@ -17237,8 +17354,12 @@ msgid "unable to format message: %s"
msgstr "không thể định dạng thông điệp: %s"
#, c-format
+msgid "invalid marker-size '%s', expecting an integer"
+msgstr "marker-size không hợp lệ '%s', cần số nguyên"
+
+#, c-format
msgid "Failed to merge submodule %s (not checked out)"
-msgstr "Gặp lỗi khi hòa trộn mô-đun-con %s (không checkout được)"
+msgstr "Gặp lỗi khi hòa trộn mô-đun-con %s (không checkout)"
#, c-format
msgid "Failed to merge submodule %s (no merge base)"
@@ -18335,7 +18456,7 @@ msgid ""
"\n"
"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"running \"git config set advice.objectNameWarning false\""
msgstr ""
"Git thường không bao giờ tạo tham chiếu kết thúc với 40 ký tự hex\n"
"bởi vì nó sẽ bị bỏ qua khi bạn chỉ định 40 ký tự hex. Những tham chiếu\n"
@@ -18344,8 +18465,8 @@ msgstr ""
" git switch -c $br $(git rev-parse ...)\n"
"\n"
"với \"$br\" không hiểu lý do vì sao rỗng và tạo ra tham chiếu 40-hex.\n"
-" Xin hãy kiểm tra những tham chiếu này và xóa chúng đi nếu cần. Tắt\n"
-"lời nhắn này bằng cách chạy lệnh \"git config advice.objectNameWarning "
+"Xin hãy kiểm tra những tham chiếu này và xóa chúng đi nếu cần. Tắt\n"
+"lời nhắn này bằng cách chạy lệnh \"git config set advice.objectNameWarning "
"false\""
#, c-format
@@ -18502,13 +18623,6 @@ msgstr "bitmap multi-pack thiếu chỉ mục để dành cần thiết"
msgid "could not open pack %s"
msgstr "không thể mở gói '%s'"
-msgid "could not determine MIDX preferred pack"
-msgstr "không thể xác định gói MIDX ưa dùng"
-
-#, c-format
-msgid "preferred pack (%s) is invalid"
-msgstr "preferred pack (%s) không hợp lệ"
-
msgid "corrupt bitmap lookup table: triplet position out of index"
msgstr "bảng tìm kiếm bitmap bị hỏng: vị trí bộ ba nằm ngoài chỉ mục"
@@ -19619,18 +19733,26 @@ msgstr "nhật ký cho tham chiếu %s kết thúc bất ngờ trên %s"
msgid "log for %s is empty"
msgstr "nhật ký cho %s trống rỗng"
-msgid "refusing to force and skip creation of reflog"
-msgstr "từ chối bỏ qua việc tạo log tham chiếu"
-
#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr "từ chối cập nhật tham chiếu với tên sai '%s'"
+msgid "refusing to update reflog for pseudoref '%s'"
+msgstr "từ chối cập nhật reflog cho tham chiếu ảo '%s'"
#, c-format
msgid "refusing to update pseudoref '%s'"
msgstr "từ chối cập nhật tham chiếu ảo '%s'"
#, c-format
+msgid "refusing to update reflog with bad name '%s'"
+msgstr "từ chối cập nhật reflog với tên sai '%s'"
+
+#, c-format
+msgid "refusing to update ref with bad name '%s'"
+msgstr "từ chối cập nhật tham chiếu với tên sai '%s'"
+
+msgid "refusing to force and skip creation of reflog"
+msgstr "từ chối bỏ qua việc tạo log tham chiếu"
+
+#, c-format
msgid "update_ref failed for ref '%s': %s"
msgstr "update_ref bị lỗi cho ref '%s': %s"
@@ -19642,7 +19764,7 @@ msgid "ref updates forbidden inside quarantine environment"
msgstr "cập nhật tham chiếu bị cấm trong môi trường kiểm tra"
msgid "ref updates aborted by hook"
-msgstr "các cập nhật tham chiếu bị huỷ bỏ bởi móc"
+msgstr "các cập nhật tham chiếu bị huỷ bỏ bởi hook"
#, c-format
msgid "'%s' exists; cannot create '%s'"
@@ -19680,6 +19802,10 @@ msgstr ""
"tham chiếu thường"
#, c-format
+msgid "cannot read ref file '%s'"
+msgstr "không thể đọc tập tin ref '%s'"
+
+#, c-format
msgid "cannot open directory %s"
msgstr "không thể mở thư mục %s"
@@ -19887,6 +20013,10 @@ msgid "more than one uploadpack given, using the first"
msgstr "đã đưa ra nhiều hơn một gói tải lên, đang sử dụng cái đầu tiên"
#, c-format
+msgid "unrecognized followRemoteHEAD value '%s' ignored"
+msgstr "bỏ qua giá trị không chấp nhận cho followRemoteHEAD '%s'"
+
+#, c-format
msgid "unrecognized value transfer.credentialsInUrl: '%s'"
msgstr "không chấp nhận giá trị transfer.credentialsInUrl: '%s'"
@@ -20650,7 +20780,7 @@ msgstr ""
" git rebase --continue\n"
msgid "'prepare-commit-msg' hook failed"
-msgstr "móc 'prepare-commit-msg' bị lỗi"
+msgstr "hook 'prepare-commit-msg' bị lỗi"
msgid ""
"Your name and email address were configured automatically based\n"
@@ -21812,6 +21942,9 @@ msgstr "lần chuyển giao %s chưa được đánh dấu là tiếp cận đư
msgid "too many commits marked reachable"
msgstr "có quá nhiều lần chuyển giao được đánh dấu là tiếp cận được"
+msgid "could not determine MIDX preferred pack"
+msgstr "không thể xác định gói MIDX ưa dùng"
+
msgid "test-tool serve-v2 [<options>]"
msgstr "test-tool serve-v2 [<các tùy chọn>]"
@@ -22478,6 +22611,9 @@ msgstr "tập tin .git bị hỏng"
msgid ".git file incorrect"
msgstr "tập tin .git không chính xác"
+msgid ".git file absolute/relative path mismatch"
+msgstr "đường dẫn tương đối/tuyệt đối đến file .git không khớp"
+
msgid "not a valid path"
msgstr "không phải là một đường dẫn hợp lệ"
@@ -22493,6 +22629,9 @@ msgstr "không thể định vị kho chứa; tập tin .git bị hỏng"
msgid "gitdir unreadable"
msgstr "gitdir không thể đọc được"
+msgid "gitdir absolute/relative path mismatch"
+msgstr "đường dẫn tương đối/tuyệt đối đến gitdir không khớp"
+
msgid "gitdir incorrect"
msgstr "gitdir không chính xác"
@@ -22527,6 +22666,13 @@ msgstr "không thể bỏ đặt %s trong '%s'"
msgid "failed to set extensions.worktreeConfig setting"
msgstr "gặp lỗi khi đặt cài đặt extensions.worktreeConfig"
+msgid "unable to upgrade repository format to support relative worktrees"
+msgstr ""
+"không thể nâng cấp định định dạng kho chứa để hỗ trợ cây làm việc tương đối"
+
+msgid "unable to set extensions.relativeWorktrees setting"
+msgstr "gặp lỗi khi đặt cài đặt extensions.relativeWorktrees"
+
#, c-format
msgid "could not setenv '%s'"
msgstr "không thể setenv '%s'"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 55d2aee627..12a0fb510b 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -154,8 +154,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Git\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2024-10-05 03:31+0800\n"
-"PO-Revision-Date: 2024-10-05 03:32+0800\n"
+"POT-Creation-Date: 2025-01-02 20:43+0800\n"
+"PO-Revision-Date: 2025-01-05 19:01+0800\n"
"Last-Translator: Teng Long <dyroneteng@gmail.com>\n"
"Language-Team: GitHub <https://github.com/dyrone/git/>\n"
"Language: zh_CN\n"
@@ -886,10 +886,10 @@ msgstr "只有二进制文件被修改。"
#, c-format
msgid ""
"\n"
-"Disable this message with \"git config advice.%s false\""
+"Disable this message with \"git config set advice.%s false\""
msgstr ""
"\n"
-"使用 \"git config advice.%s false\" 来关闭此消息"
+"使用 \"git config set advice.%s false\" 来关闭此消息"
#: advice.c
#, c-format
@@ -1778,9 +1778,10 @@ msgstr "不是一个有效的对象名:%s"
msgid "not a tree object: %s"
msgstr "不是一个树对象:%s"
-#: archive.c builtin/clone.c
-msgid "unable to checkout working tree"
-msgstr "不能检出工作区"
+#: archive.c
+#, c-format
+msgid "failed to unpack tree object %s"
+msgstr "无法解包树对象 %s"
#: archive.c
#, c-format
@@ -1957,7 +1958,7 @@ msgstr "忽略过大的 gitattributes 数据对象 '%s'"
#: attr.c
msgid "cannot use --attr-source or GIT_ATTR_SOURCE without repo"
-msgstr "无法在没有存储库的情况下使用 --attr-source 或 GIT_ATTR_SOURCE"
+msgstr "无法在没有仓库的情况下使用 --attr-source 或 GIT_ATTR_SOURCE"
#: attr.c
msgid "bad --attr-source or GIT_ATTR_SOURCE"
@@ -4813,7 +4814,7 @@ msgstr "未知的冲突风格 '%s'"
msgid "perform a 3-way merge with the new branch"
msgstr "和新的分支执行三方合并"
-#: builtin/checkout.c builtin/log.c parse-options.h
+#: builtin/checkout.c builtin/log.c builtin/range-diff.c parse-options.h
msgid "style"
msgstr "风格"
@@ -4842,8 +4843,8 @@ msgid "update ignored files (default)"
msgstr "更新忽略的文件(默认)"
#: builtin/checkout.c
-msgid "do not check if another worktree is holding the given ref"
-msgstr "不检查指定的引用是否被其他工作区所占用"
+msgid "do not check if another worktree is using this branch"
+msgstr "不检查其他工作区是否正在使用该分支"
#: builtin/checkout.c
msgid "checkout our version for unmerged files"
@@ -5222,14 +5223,13 @@ msgstr "创建一个指定深度的浅克隆"
msgid "create a shallow clone since a specific time"
msgstr "从一个特定时间创建一个浅克隆"
-#: builtin/clone.c builtin/fetch.c builtin/pull.c builtin/rebase.c
-#: builtin/replay.c
-msgid "revision"
-msgstr "版本"
+#: builtin/clone.c builtin/fetch.c builtin/pull.c
+msgid "ref"
+msgstr "引用"
#: builtin/clone.c builtin/fetch.c builtin/pull.c
-msgid "deepen history of shallow clone, excluding rev"
-msgstr "深化浅克隆的历史,除了特定版本"
+msgid "deepen history of shallow clone, excluding ref"
+msgstr "深化浅克隆的历史,除了给定的引用"
#: builtin/clone.c builtin/submodule--helper.c
msgid "clone only one branch, HEAD or --branch"
@@ -5391,6 +5391,10 @@ msgid "remote HEAD refers to nonexistent ref, unable to checkout"
msgstr "远程 HEAD 指向一个不存在的引用,无法检出"
#: builtin/clone.c
+msgid "unable to checkout working tree"
+msgstr "不能检出工作区"
+
+#: builtin/clone.c
msgid "unable to write parameters to config file"
msgstr "无法将参数写入配置文件"
@@ -6368,10 +6372,9 @@ msgstr ""
#: builtin/config.c
msgid ""
"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
-"<name> <value>"
+"<name>"
msgstr ""
-"git config unset [<文件选项>] [--all] [--value=<值>] [--fixed-value] <名称> <"
-"值>"
+"git config unset [<文件选项>] [--all] [--value=<值>] [--fixed-value] <名称>"
#: builtin/config.c
msgid "git config rename-section [<file-option>] <old-name> <new-name>"
@@ -6915,12 +6918,8 @@ msgstr "已遍历 %lu 个提交\n"
#: builtin/describe.c
#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"发现多于 %i 个标签,列出最近的 %i 个\n"
-"在 %s 放弃搜索\n"
+msgid "found %i tags; gave up search at %s\n"
+msgstr "找到 %i 个标签;在 %s 处放弃搜索\n"
#: builtin/describe.c
#, c-format
@@ -7469,6 +7468,21 @@ msgid "the object %s does not exist"
msgstr "对象 '%s' 不存在"
#: builtin/fetch.c
+#, c-format
+msgid ""
+"Run 'git remote set-head %s %s' to follow the change, or set\n"
+"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
+"if you do not want to see this message. Specifically running\n"
+"'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
+"until the remote changes HEAD to something else."
+msgstr ""
+"运行 'git remote set-head %s %s' 以跟随更改,或者\n"
+"如果您不想看到此消息,则将'remote.%s.followRemoteHEAD' 配置选项设置为不同的"
+"值。\n"
+"特别地,运行 'git config set remote.%s.followRemoteHEAD %s' 将禁用警告,直到"
+"远程将 HEAD 更改为其他内容。\""
+
+#: builtin/fetch.c
msgid "multiple branches detected, incompatible with --set-upstream"
msgstr "检测到多分支,和 --set-upstream 不兼容"
@@ -7635,6 +7649,10 @@ msgstr "引用映射"
msgid "specify fetch refmap"
msgstr "指定获取操作的引用映射"
+#: builtin/fetch.c builtin/pull.c builtin/rebase.c builtin/replay.c
+msgid "revision"
+msgstr "版本"
+
#: builtin/fetch.c builtin/pull.c
msgid "report that we have only objects reachable from this object"
msgstr "报告我们只拥有从该对象开始可达的对象"
@@ -7830,7 +7848,7 @@ msgstr "存储着仓库路径列表的配置项键名"
#: builtin/for-each-repo.c
msgid "keep going even if command fails in a repository"
-msgstr "即使存储库中的命令失败,仍继续执行"
+msgstr "即使仓库中的命令失败,仍继续执行"
#: builtin/for-each-repo.c
msgid "missing --config=<config>"
@@ -8546,8 +8564,24 @@ msgid "%s scheduler is not available"
msgstr "%s 调度器不可用"
#: builtin/gc.c
-msgid "another process is scheduling background maintenance"
-msgstr "另外一个进程正运行于后台维护"
+#, c-format
+msgid ""
+"unable to create '%s.lock': %s.\n"
+"\n"
+"Another scheduled git-maintenance(1) process seems to be running in this\n"
+"repository. Please make sure no other maintenance processes are running and\n"
+"then try again. If it still fails, a git-maintenance(1) process may have\n"
+"crashed in this repository earlier: remove the file manually to continue."
+msgstr ""
+"无法创建 '%s.lock':%s。\n"
+"\n"
+"另一个已计划的 git-maintenance(1) 进程似乎正在该仓库中运行。\n"
+"请确保没有其他维护进程正在运行,然后重试。如果仍然运行失败,则\n"
+"git-maintenance(1) 进程可能之前已在此仓库中崩溃:请手动删除该文件以继续。"
+
+#: builtin/gc.c
+msgid "cannot acquire lock for scheduled background maintenance"
+msgstr "无法获取计划的后台维护锁"
#: builtin/gc.c
msgid "git maintenance start [--scheduler=<scheduler>]"
@@ -9273,6 +9307,23 @@ msgstr[0] "链长 = %d: %lu 对象"
msgstr[1] "链长 = %d: %lu 对象"
#: builtin/index-pack.c
+msgid "could not start pack-objects to repack local links"
+msgstr "无法启动 pack-objects 来重新打包本地链接"
+
+#: builtin/index-pack.c
+msgid "failed to feed local object to pack-objects"
+msgstr "无法将本地对象提供给 pack-objects"
+
+#: builtin/index-pack.c
+msgid "index-pack: Expecting full hex object ID lines only from pack-objects."
+msgstr ""
+"index-pack:期望仅从 pack-objects 的输出行中获得完整的十六进制对象 ID。"
+
+#: builtin/index-pack.c
+msgid "could not finish pack-objects to repack local links"
+msgstr "无法完成 pack-objects 来重新打包本地链接"
+
+#: builtin/index-pack.c
msgid "Cannot come back to cwd"
msgstr "无法返回当前工作目录"
@@ -9287,6 +9338,10 @@ msgid "unknown hash algorithm '%s'"
msgstr "未知的哈希算法 '%s'"
#: builtin/index-pack.c
+msgid "--promisor cannot be used with a pack name"
+msgstr "--promisor 无法与包名称一起使用"
+
+#: builtin/index-pack.c
msgid "--stdin requires a git repository"
msgstr "--stdin 需要 git 仓库"
@@ -11002,11 +11057,11 @@ msgstr "git notes [--ref <注解引用>] [list [<对象>]]"
msgid ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <注解引用>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<分段符>] [--[no-]stripspace] [-m <说明> | -F <文件> | (-c | -C) <"
-"对象>] [<对象>]"
+"对象>] [<对象>] [-e]"
#: builtin/notes.c
msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
@@ -11016,11 +11071,11 @@ msgstr "git notes [--ref <注解引用>] copy [-f] <源对象> <目标对象>"
msgid ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <注解引用>] append [--allow-empty] [--[no-]separator|--"
"separator=<分段符>] [--[no-]stripspace] [-m <说明> | -F <文件> | (-c | -C) <"
-"对象>] [<对象>]"
+"对象>] [<对象>] [-e]"
#: builtin/notes.c
msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
@@ -11172,6 +11227,10 @@ msgid "reuse and edit specified note object"
msgstr "重用和编辑指定的注解对象"
#: builtin/notes.c
+msgid "edit note message in editor"
+msgstr "在编辑器中编辑注释说明"
+
+#: builtin/notes.c
msgid "reuse specified note object"
msgstr "重用指定的注解对象"
@@ -11785,6 +11844,10 @@ msgid "do not pack objects in promisor packfiles"
msgstr "不要打包 promisor 包文件中的对象"
#: builtin/pack-objects.c
+msgid "implies --missing=allow-any"
+msgstr "暗含 --missing=allow-any"
+
+#: builtin/pack-objects.c
msgid "respect islands during delta compression"
msgstr "在增量压缩时参考数据岛"
@@ -13669,6 +13732,33 @@ msgstr[0] " 为 'git push' 配置的本地引用%s:"
msgstr[1] " 为 'git push' 配置的本地引用%s:"
#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' is unchanged and points to '%s'\n"
+msgstr "'%s/HEAD' 未改变并指向 '%s'\n"
+
+#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' has changed from '%s' and now points to '%s'\n"
+msgstr "'%s/HEAD' 已从 '%s' 更改,现在指向 '%s'\n"
+
+#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' is now created and points to '%s'\n"
+msgstr "'%s/HEAD' 现已创建并指向 '%s'\n"
+
+#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' was detached at '%s' and now points to '%s'\n"
+msgstr "'%s/HEAD' 在 '%s' 处分离并且现在指向 '%s'\n"
+
+#: builtin/remote.c
+#, c-format
+msgid ""
+"'%s/HEAD' used to point to '%s' (which is not a remote branch), but now "
+"points to '%s'\n"
+msgstr "'%s/HEAD' 曾指向 '%s'(不是远程分支),但现在指向 '%s'\n"
+
+#: builtin/remote.c
msgid "set refs/remotes/<name>/HEAD according to remote"
msgstr "根据远程设置 refs/remotes/<名称>/HEAD"
@@ -13696,7 +13786,7 @@ msgstr "不是一个有效引用:%s"
#: builtin/remote.c
#, c-format
-msgid "Could not setup %s"
+msgid "Could not set up %s"
msgstr "不能设置 %s"
# 译者:注意保持前导空格
@@ -17034,6 +17124,10 @@ msgstr "设置跟踪模式(参见 git-branch(1))"
msgid "try to match the new branch name with a remote-tracking branch"
msgstr "尝试为新分支名匹配一个远程跟踪分支"
+#: builtin/worktree.c
+msgid "use relative paths for worktrees"
+msgstr "对工作区使用相对路径"
+
#: builtin/worktree.c diff.c parse-options.c
#, c-format
msgid "options '%s', '%s', and '%s' cannot be used together"
@@ -17370,6 +17464,30 @@ msgstr "不能创建 '%s'"
msgid "index-pack died"
msgstr "index-pack 终止"
+#: cache-tree.c
+#, c-format
+msgid "directory '%s' is present in index, but not sparse"
+msgstr "目录 '%s' 存在于索引中,但不是稀疏的"
+
+#: cache-tree.c unpack-trees.c
+msgid "corrupted cache-tree has entries not present in index"
+msgstr "损坏的缓存树包含索引中不存在的条目"
+
+#: cache-tree.c
+#, c-format
+msgid "%s with flags 0x%x should not be in cache-tree"
+msgstr "标志位为 0x%2$x 的 %1$s 不应位于缓存树中"
+
+#: cache-tree.c
+#, c-format
+msgid "bad subtree '%.*s'"
+msgstr "损坏的子树 '%.*s'"
+
+#: cache-tree.c
+#, c-format
+msgid "cache-tree for path %.*s does not match. Expected %s got %s"
+msgstr "路径 %.*s 的缓存树不匹配。预期为 %s,实际为 %s"
+
#: chunk-format.c
msgid "terminating chunk id appears earlier than expected"
msgstr "终止块 ID 比预期更早出现"
@@ -18477,15 +18595,15 @@ msgid ""
"to convert the grafts into replace refs.\n"
"\n"
"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
msgstr ""
"对 <GIT_DIR>/info/grafts 的支持已过时,并将在\n"
"未来的Git版本中被移除。\n"
"\n"
"请使用 \"git replace --convert-graft-file\" 将\n"
-"grafts 转换为替换引用。\n"
+"(提交)移植转换为替换引用。\n"
"\n"
-"设置 \"git config advice.graftFileDeprecated false\"\n"
+"运行 \"git config set advice.graftFileDeprecated false\"\n"
"可关闭本消息"
#: commit.c
@@ -19485,6 +19603,21 @@ msgstr "URL 没有 scheme:%s"
msgid "credential url cannot be parsed: %s"
msgstr "不能解析凭据 URL:%s"
+#: daemon.c
+#, c-format
+msgid "invalid timeout '%s', expecting a non-negative integer"
+msgstr "无效的超时值 '%s',应为非负整数"
+
+#: daemon.c
+#, c-format
+msgid "invalid init-timeout '%s', expecting a non-negative integer"
+msgstr "无效的初始超时值 '%s',应为非负整数"
+
+#: daemon.c
+#, c-format
+msgid "invalid max-connections '%s', expecting an integer"
+msgstr "无效的最大连接数 '%s',应为一个整数"
+
#: date.c
msgid "in the future"
msgstr "在将来"
@@ -20352,6 +20485,20 @@ msgid "too many args to run %s"
msgstr "执行 %s 的参数太多"
#: fetch-pack.c
+#, c-format
+msgid ""
+"You are attempting to fetch %s, which is in the commit graph file but not in "
+"the object database.\n"
+"This is probably due to repo corruption.\n"
+"If you are attempting to repair this repo corruption by refetching the "
+"missing object, use 'git fetch --refetch' with the missing object."
+msgstr ""
+"您正在尝试获取 %s,它位于提交图文件中,但不在对象数据库中。\n"
+"这可能是由于仓库损坏造成的。\n"
+"如果您尝试通过重新获取丢失的对象来修复此仓库损坏,请对丢失的对象使用 'git "
+"fetch --refetch'。"
+
+#: fetch-pack.c
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack:应为 shallow 列表"
@@ -21062,10 +21209,10 @@ msgstr[1] ""
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
+"You can disable this warning with `git config set advice.ignoredHook false`."
msgstr ""
"因为没有将钩子 '%s' 设置为可执行,钩子被忽略。您可以通过\n"
-"配置 `git config advice.ignoredHook false` 来关闭这条警告。"
+"配置 `git config set advice.ignoredHook false` 来关闭这条警告。"
#: http-fetch.c
msgid "not a git repository"
@@ -21086,18 +21233,10 @@ msgid "Delegation control is not supported with cURL < 7.22.0"
msgstr "不支持委托控制,因为 cURL < 7.22.0"
#: http.c
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr "不支持公钥文件锁定,因为 cURL < 7.39.0"
-
-#: http.c
msgid "Unknown value for http.proactiveauth"
msgstr "http.proactiveauth 为未知取值"
#: http.c
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr "不支持 CURLSSLOPT_NO_REVOKE,因为 cURL < 7.44.0"
-
-#: http.c
#, c-format
msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
msgstr "不支持的 SSL 后端 '%s'。支持的 SSL 后端:"
@@ -21316,6 +21455,11 @@ msgstr "检测到被引用的 CRLF"
msgid "unable to format message: %s"
msgstr "无法格式化消息:%s"
+#: merge-ll.c
+#, c-format
+msgid "invalid marker-size '%s', expecting an integer"
+msgstr "无效的标记大小 '%s',应为一个整数"
+
#: merge-ort.c merge-recursive.c
#, c-format
msgid "Failed to merge submodule %s (not checked out)"
@@ -22623,7 +22767,7 @@ msgid ""
"\n"
"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"running \"git config set advice.objectNameWarning false\""
msgstr ""
"Git 通常不会创建一个以40个十六进制字符结尾的引用,因为当您只提供40\n"
"个十六进制字符时将被忽略。这些引用可能被错误地创建。例如:\n"
@@ -22631,7 +22775,7 @@ msgstr ""
" git switch -c $br $(git rev-parse ...)\n"
"\n"
"当 \"$br\" 某种原因空白时,一个40位十六进制的引用将被创建。请检查这些\n"
-"引用,可能需要删除它们。运行 \"git config advice.objectNameWarning\n"
+"引用,可能需要删除它们。运行 \"git config set advice.objectNameWarning\n"
"false\" 命令关闭本消息通知。"
#: object-name.c
@@ -22826,15 +22970,6 @@ msgstr "多包位图缺少必需的反向索引"
msgid "could not open pack %s"
msgstr "不能打开包 %s"
-#: pack-bitmap.c t/helper/test-read-midx.c
-msgid "could not determine MIDX preferred pack"
-msgstr "不能确定多包索引的首选包"
-
-#: pack-bitmap.c
-#, c-format
-msgid "preferred pack (%s) is invalid"
-msgstr "首选包 (%s) 无效"
-
#: pack-bitmap.c
msgid "corrupt bitmap lookup table: triplet position out of index"
msgstr "损坏的位图查询表:三元组位置超出索引"
@@ -24170,8 +24305,19 @@ msgid "log for %s is empty"
msgstr "%s 的日志为空"
#: refs.c
-msgid "refusing to force and skip creation of reflog"
-msgstr "拒绝既强制又跳过创建引用日志"
+#, c-format
+msgid "refusing to update reflog for pseudoref '%s'"
+msgstr "拒绝为伪引用 '%s' 更新引用日志"
+
+#: refs.c
+#, c-format
+msgid "refusing to update pseudoref '%s'"
+msgstr "拒绝更新伪引用 '%s'"
+
+#: refs.c
+#, c-format
+msgid "refusing to update reflog with bad name '%s'"
+msgstr "拒绝使用错误名称 '%s' 更新引用日志"
#: refs.c
#, c-format
@@ -24179,9 +24325,8 @@ msgid "refusing to update ref with bad name '%s'"
msgstr "拒绝更新有错误名称 '%s' 的引用"
#: refs.c
-#, c-format
-msgid "refusing to update pseudoref '%s'"
-msgstr "拒绝更新伪引用 '%s'"
+msgid "refusing to force and skip creation of reflog"
+msgstr "拒绝强制跳过创建引用日志"
#: refs.c
#, c-format
@@ -24244,6 +24389,11 @@ msgstr "无法锁定引用 '%s':预期目标为 '%s' 的符号引用:但是
#: refs/files-backend.c
#, c-format
+msgid "cannot read ref file '%s'"
+msgstr "无法读取引用文件 '%s'"
+
+#: refs/files-backend.c
+#, c-format
msgid "cannot open directory %s"
msgstr "无法打开目录 %s"
@@ -24500,6 +24650,11 @@ msgstr "提供了一个以上的 uploadpack,使用第一个"
#: remote.c
#, c-format
+msgid "unrecognized followRemoteHEAD value '%s' ignored"
+msgstr "已忽略无法识别的 followRemoteHEAD 值 '%s'"
+
+#: remote.c
+#, c-format
msgid "unrecognized value transfer.credentialsInUrl: '%s'"
msgstr "无法识别的 transfer.credentialsInUrl 值:'%s'"
@@ -26810,6 +26965,10 @@ msgstr "提交 %s 没有标记为可达"
msgid "too many commits marked reachable"
msgstr "太多提交标记为可达"
+#: t/helper/test-read-midx.c
+msgid "could not determine MIDX preferred pack"
+msgstr "不能确定多包索引的首选包"
+
#: t/helper/test-serve-v2.c
msgid "test-tool serve-v2 [<options>]"
msgstr "test-tool serve-v2 [<选项>]"
@@ -27585,6 +27744,10 @@ msgid ".git file incorrect"
msgstr ".git 文件不正确"
#: worktree.c
+msgid ".git file absolute/relative path mismatch"
+msgstr ".git 文件绝对/相对路径不匹配"
+
+#: worktree.c
msgid "not a valid path"
msgstr "不是一个有效的路径"
@@ -27605,6 +27768,10 @@ msgid "gitdir unreadable"
msgstr "gitdir 不可读"
#: worktree.c
+msgid "gitdir absolute/relative path mismatch"
+msgstr "gitdir 绝对/相对路径不匹配"
+
+#: worktree.c
msgid "gitdir incorrect"
msgstr "gitdir 不正确"
@@ -27648,6 +27815,14 @@ msgstr "无法在 '%2$s' 中取消设置 %1$s"
msgid "failed to set extensions.worktreeConfig setting"
msgstr "无法设置 extensions.worktreeConfig"
+#: worktree.c
+msgid "unable to upgrade repository format to support relative worktrees"
+msgstr "无法升级仓库格式以支持相对工作区"
+
+#: worktree.c
+msgid "unable to set extensions.relativeWorktrees setting"
+msgstr "无法设定 extensions.relativeWorktrees 的设置"
+
#: wrapper.c
#, c-format
msgid "could not setenv '%s'"
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 5e6818f453..a61f544304 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -30,8 +30,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Git\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2024-10-05 01:20+0000\n"
-"PO-Revision-Date: 2024-10-05 15:45+0800\n"
+"POT-Creation-Date: 2024-12-28 13:16+0800\n"
+"PO-Revision-Date: 2024-12-28 13:23+0800\n"
"Last-Translator: Yi-Jyun Pan <pan93412@gmail.com>\n"
"Language-Team: Chinese (Traditional) <http://weblate.slat.org/projects/git-"
"po/git-cli/zh_Hant/>\n"
@@ -764,10 +764,10 @@ msgstr "只有二進位檔案更動了。"
#, c-format
msgid ""
"\n"
-"Disable this message with \"git config advice.%s false\""
+"Disable this message with \"git config set advice.%s false\""
msgstr ""
"\n"
-"請使用「git config advice.%s false」停用此訊息"
+"請使用「git config set advice.%s false」停用此訊息"
#: advice.c
#, c-format
@@ -941,12 +941,12 @@ msgstr "引數過多"
#: apply.c
#, c-format
msgid "unrecognized whitespace option '%s'"
-msgstr "空白字元選項「%s」無法識別"
+msgstr "空白字元選項「%s」不認識"
#: apply.c
#, c-format
msgid "unrecognized whitespace ignore option '%s'"
-msgstr "空白字元忽略選項「%s」無法識別"
+msgstr "空白字元忽略選項「%s」不認識"
#: apply.c archive.c builtin/add.c builtin/branch.c builtin/checkout-index.c
#: builtin/checkout.c builtin/clean.c builtin/clone.c builtin/commit.c
@@ -1081,7 +1081,7 @@ msgstr "二進位修補檔在第 %d 列損壞:%.*s"
#: apply.c
#, c-format
msgid "unrecognized binary patch at line %d"
-msgstr "第 %d 列的二進位修補檔無法識別"
+msgstr "第 %d 列的二進位修補檔不認識"
#: apply.c
#, c-format
@@ -2620,7 +2620,7 @@ msgstr ""
#: builtin/am.c builtin/reset.c
#, c-format
msgid "Could not parse object '%s'."
-msgstr "無法解析「%s」物件。"
+msgstr "無法解析物件「%s」。"
#: builtin/am.c
msgid "failed to clean index"
@@ -2917,7 +2917,7 @@ msgstr "「%s」不是有效的提交"
#, c-format
msgid ""
"could not check out original HEAD '%s'. Try 'git bisect reset <commit>'."
-msgstr "不能簽出原始 HEAD「%s」。請嘗試「git bisect reset <commit>」。"
+msgstr "無法簽出原始 HEAD「%s」。請嘗試「git bisect reset <commit>」。"
#: builtin/bisect.c
#, c-format
@@ -3021,7 +3021,7 @@ msgstr "「 」不是有效術語"
#: builtin/bisect.c
#, c-format
msgid "unrecognized option: '%s'"
-msgstr "無法識別選項:「%s」"
+msgstr "不認識選項:「%s」"
#: builtin/bisect.c
#, c-format
@@ -3460,7 +3460,7 @@ msgstr "無法解析格式化字串"
#: builtin/branch.c
msgid "could not resolve HEAD"
-msgstr "無法解析 HEAD 指標"
+msgstr "無法解析 HEAD"
#: builtin/branch.c
#, c-format
@@ -4689,7 +4689,7 @@ msgstr "未知的衝突輸出風格「%s」"
msgid "perform a 3-way merge with the new branch"
msgstr "和新分支進行三方合併"
-#: builtin/checkout.c builtin/log.c parse-options.h
+#: builtin/checkout.c builtin/log.c builtin/range-diff.c parse-options.h
msgid "style"
msgstr "style"
@@ -4718,8 +4718,8 @@ msgid "update ignored files (default)"
msgstr "更新忽略的檔案(預設值)"
#: builtin/checkout.c
-msgid "do not check if another worktree is holding the given ref"
-msgstr "不檢查其他工作區是否正在佔用指定的引用"
+msgid "do not check if another worktree is using this branch"
+msgstr "不檢查其他工作區是否正在使用此分支"
#: builtin/checkout.c
msgid "checkout our version for unmerged files"
@@ -4875,7 +4875,7 @@ msgstr "無法移除 %s"
#: builtin/clean.c
#, c-format
msgid "could not lstat %s\n"
-msgstr "不能對 %s 進行 lstat\n"
+msgstr "無法對 %s 進行 lstat\n"
#: builtin/clean.c
msgid "Refusing to remove current working directory\n"
@@ -5099,14 +5099,13 @@ msgstr "建立指定深度的淺層複製"
msgid "create a shallow clone since a specific time"
msgstr "建立從指定時間到現在的淺層複製"
-#: builtin/clone.c builtin/fetch.c builtin/pull.c builtin/rebase.c
-#: builtin/replay.c
-msgid "revision"
-msgstr "revision"
+#: builtin/clone.c builtin/fetch.c builtin/pull.c
+msgid "ref"
+msgstr "ref"
#: builtin/clone.c builtin/fetch.c builtin/pull.c
-msgid "deepen history of shallow clone, excluding rev"
-msgstr "取得更多淺層複製的過去歷史記錄,除了特定修訂版"
+msgid "deepen history of shallow clone, excluding ref"
+msgstr "取得更多淺層複製的過往歷史記錄,除了特定修訂版"
#: builtin/clone.c builtin/submodule--helper.c
msgid "clone only one branch, HEAD or --branch"
@@ -5325,12 +5324,12 @@ msgstr "工作區 '%s' 已經存在。"
#: builtin/clone.c builtin/difftool.c builtin/log.c builtin/worktree.c
#, c-format
msgid "could not create leading directories of '%s'"
-msgstr "不能為 '%s' 建立先導目錄"
+msgstr "無法為「%s」建立前導目錄"
#: builtin/clone.c
#, c-format
msgid "could not create work tree dir '%s'"
-msgstr "不能建立工作區目錄 '%s'"
+msgstr "無法建立工作區目錄「%s」"
#: builtin/clone.c
#, c-format
@@ -5495,7 +5494,7 @@ msgstr "無法開啟提交圖鏈「%s」"
#: builtin/commit-graph.c
#, c-format
msgid "unrecognized --split argument, %s"
-msgstr "無法識別的 --split 參數,%s"
+msgstr "不認識的 --split 參數,%s"
#: builtin/commit-graph.c
#, c-format
@@ -5789,12 +5788,12 @@ msgstr "(正從標準輸入中讀取日誌訊息)\n"
#: builtin/commit.c
msgid "could not read log from standard input"
-msgstr "不能從標準輸入中讀取日誌訊息"
+msgstr "無法從標準輸入中讀取記錄"
#: builtin/commit.c
#, c-format
msgid "could not read log file '%s'"
-msgstr "不能讀取日誌檔案 '%s'"
+msgstr "無法讀取日誌檔案「%s」"
#: builtin/commit.c
#, c-format
@@ -5803,11 +5802,11 @@ msgstr "「%s」和「%s:%s」選項不得同時使用"
#: builtin/commit.c
msgid "could not read SQUASH_MSG"
-msgstr "不能讀取 SQUASH_MSG"
+msgstr "無法讀取 SQUASH_MSG"
#: builtin/commit.c
msgid "could not read MERGE_MSG"
-msgstr "不能讀取 MERGE_MSG"
+msgstr "無法讀取 MERGE_MSG"
#: builtin/commit.c bundle.c rerere.c sequencer.c
#, c-format
@@ -5816,7 +5815,7 @@ msgstr "無法開啟「%s」"
#: builtin/commit.c
msgid "could not write commit template"
-msgstr "不能寫提交範本"
+msgstr "無法寫入提交模板"
#: builtin/commit.c
#, c-format
@@ -6192,7 +6191,7 @@ msgstr "允許空的提交說明"
#: builtin/commit.c sequencer.c
msgid "could not parse HEAD commit"
-msgstr "不能解析 HEAD 提交"
+msgstr "無法解析 HEAD 提交"
#: builtin/commit.c
#, c-format
@@ -6201,12 +6200,12 @@ msgstr "損壞的 MERGE_HEAD 檔案(%s)"
#: builtin/commit.c
msgid "could not read MERGE_MODE"
-msgstr "不能讀取 MERGE_MODE"
+msgstr "無法讀取 MERGE_MODE"
#: builtin/commit.c
#, c-format
msgid "could not read commit message: %s"
-msgstr "不能讀取提交說明:%s"
+msgstr "無法讀取提交說明:%s"
#: builtin/commit.c
#, c-format
@@ -6255,10 +6254,10 @@ msgstr ""
#: builtin/config.c
msgid ""
"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
-"<name> <value>"
+"<name>"
msgstr ""
-"git config unset [<檔案選項>] [--all] [--value=<值>] [--fixed-value] <名稱> <"
-"值>"
+"git config unset [<file-option>] [--all] [--value=<value>] [--fixed-value] "
+"<name>"
#: builtin/config.c
msgid "git config rename-section [<file-option>] <old-name> <new-name>"
@@ -6390,7 +6389,7 @@ msgstr "除了顯示組態值,額外顯示其鍵名"
#: builtin/config.c
#, c-format
msgid "unrecognized --type argument, %s"
-msgstr "無法識別的 --type 參數,%s"
+msgstr "不認識的 --type 參數,%s"
#: builtin/config.c
msgid "only one type at a time"
@@ -6804,12 +6803,8 @@ msgstr "已遍歷 %lu 個提交\n"
#: builtin/describe.c
#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"發現多於 %i 個標籤,列出最近的 %i 個\n"
-"在 %s 放棄搜尋\n"
+msgid "found %i tags; gave up search at %s\n"
+msgstr "找到 %i 個標籤;在 %s 放棄搜尋\n"
#: builtin/describe.c
#, c-format
@@ -6997,7 +6992,7 @@ msgstr "工作區檔案被留了下來。"
#: builtin/difftool.c sequencer.c
#, c-format
msgid "could not copy '%s' to '%s'"
-msgstr "不能複製 '%s' 至 '%s'"
+msgstr "無法將「%s」複製到「%s」"
#: builtin/difftool.c
#, c-format
@@ -7358,6 +7353,21 @@ msgid "the object %s does not exist"
msgstr "%s 物件不存在"
#: builtin/fetch.c
+#, c-format
+msgid ""
+"Run 'git remote set-head %s %s' to follow the change, or set\n"
+"'remote.%s.followRemoteHEAD' configuration option to a different value\n"
+"if you do not want to see this message. Specifically running\n"
+"'git config set remote.%s.followRemoteHEAD %s' will disable the warning\n"
+"until the remote changes HEAD to something else."
+msgstr ""
+"執行「git remote set-head %s %s」以追蹤這個變更,或者\n"
+"如果您不想看到這則訊息,請將「remote.%s.followRemoteHEAD」\n"
+"組態選項設定成不同的值。更具體些來說,執行\n"
+"「git config set remote.%s.followRemoteHEAD %s」會停用這個警告,\n"
+"直到遠端將 HEAD 變更為其他內容。"
+
+#: builtin/fetch.c
msgid "multiple branches detected, incompatible with --set-upstream"
msgstr "檢測到多分支,和 --set-upstream 不相容"
@@ -7397,12 +7407,12 @@ msgstr "正在取得 %s\n"
#: builtin/fetch.c
#, c-format
msgid "could not fetch %s"
-msgstr "不能取得 %s"
+msgstr "無法取得 %s"
#: builtin/fetch.c
#, c-format
msgid "could not fetch '%s' (exit code: %d)\n"
-msgstr "無法取得 '%s'(離開碼:%d)\n"
+msgstr "無法取得「%s」(離開碼:%d)\n"
#: builtin/fetch.c
msgid ""
@@ -7527,6 +7537,10 @@ msgstr "引用映射"
msgid "specify fetch refmap"
msgstr "指定取得動作的引用映射"
+#: builtin/fetch.c builtin/pull.c builtin/rebase.c builtin/replay.c
+msgid "revision"
+msgstr "revision"
+
#: builtin/fetch.c builtin/pull.c
msgid "report that we have only objects reachable from this object"
msgstr "報告我們只擁有從該物件開始可以取得的物件"
@@ -7788,18 +7802,18 @@ msgstr "懸空 %s %s"
#: builtin/fsck.c
msgid "could not create lost-found"
-msgstr "不能建立 lost-found"
+msgstr "無法建立 lost-found"
#: builtin/fsck.c builtin/gc.c builtin/rebase.c rebase-interactive.c rerere.c
#: sequencer.c
#, c-format
msgid "could not write '%s'"
-msgstr "不能寫入 '%s'"
+msgstr "無法寫入「%s」"
#: builtin/fsck.c
#, c-format
msgid "could not finish '%s'"
-msgstr "不能完成 '%s'"
+msgstr "無法完成「%s」"
#: builtin/fsck.c
#, c-format
@@ -8069,7 +8083,7 @@ msgstr "無法啟動 fsmonitor 監聽執行緒"
#: builtin/fsmonitor--daemon.c
msgid "could not start fsmonitor health thread"
-msgstr "無法啟動 fsmonitor 健康監聽執行緒"
+msgstr "無法啟動 fsmonitor 健康檢查執行緒"
#: builtin/fsmonitor--daemon.c
msgid "could not initialize listener thread"
@@ -8077,7 +8091,7 @@ msgstr "無法初始化監聽執行緒"
#: builtin/fsmonitor--daemon.c
msgid "could not initialize health thread"
-msgstr "無法初始化健康監聽執行緒"
+msgstr "無法初始化健康檢查執行緒"
#: builtin/fsmonitor--daemon.c
#, c-format
@@ -8251,7 +8265,7 @@ msgstr "不允許 --no-schedule"
#: builtin/gc.c
#, c-format
msgid "unrecognized --schedule argument '%s'"
-msgstr "無法識別的 --schedule 引數 '%s'"
+msgstr "不認識的 --schedule 引數 '%s'"
#: builtin/gc.c
msgid "failed to write commit-graph"
@@ -8425,7 +8439,7 @@ msgstr "無法執行 systemctl"
#: builtin/gc.c
#, c-format
msgid "unrecognized --scheduler argument '%s'"
-msgstr "無法識別的 --scheduler 引數 '%s'"
+msgstr "不認識的 --scheduler 引數 '%s'"
#: builtin/gc.c
msgid "neither systemd timers nor crontab are available"
@@ -8437,8 +8451,26 @@ msgid "%s scheduler is not available"
msgstr "無法使用 %s 排程器"
#: builtin/gc.c
-msgid "another process is scheduling background maintenance"
-msgstr "其他處理程序正在排定背景維護工作"
+#, c-format
+msgid ""
+"unable to create '%s.lock': %s.\n"
+"\n"
+"Another scheduled git-maintenance(1) process seems to be running in this\n"
+"repository. Please make sure no other maintenance processes are running and\n"
+"then try again. If it still fails, a git-maintenance(1) process may have\n"
+"crashed in this repository earlier: remove the file manually to continue."
+msgstr ""
+"無法建立「%s.lock」:%s。\n"
+"\n"
+"似乎有另一個排定的 git-maintenance(1) 程序正在此\n"
+"版本庫中執行。請確保沒有其他維護程序正在執行,\n"
+"然後再試一次。如果仍然失敗,可能是先前的\n"
+"git-maintenance(1) 程序在這個版本庫中意外中斷:\n"
+"請手動移除檔案以繼續。"
+
+#: builtin/gc.c
+msgid "cannot acquire lock for scheduled background maintenance"
+msgstr "無法取得用來進行排定背景維護的鎖"
#: builtin/gc.c
msgid "git maintenance start [--scheduler=<scheduler>]"
@@ -8727,7 +8759,7 @@ msgstr "--open-files-in-pager 僅用於工作區"
#: builtin/grep.c
msgid "--[no-]exclude-standard cannot be used for tracked contents"
-msgstr "--[no-]exclude-standard 不能用於已追蹤內容"
+msgstr "--[no-]exclude-standard 無法用於已追蹤內容"
#: builtin/grep.c
msgid "both --cached and trees are given"
@@ -8825,7 +8857,7 @@ msgstr "git help [[-i|--info] [-m|--man] [-w|--web]] [<command>|<doc>]"
#: builtin/help.c
#, c-format
msgid "unrecognized help format '%s'"
-msgstr "無法識別的協助格式 '%s'"
+msgstr "不認識的協助格式 '%s'"
#: builtin/help.c
msgid "Failed to start emacsclient."
@@ -9158,6 +9190,22 @@ msgid_plural "chain length = %d: %lu objects"
msgstr[0] "鏈長 = %d: %lu 物件"
#: builtin/index-pack.c
+msgid "could not start pack-objects to repack local links"
+msgstr "無法啟動 pack-objects 來重新打包本機連結"
+
+#: builtin/index-pack.c
+msgid "failed to feed local object to pack-objects"
+msgstr "無法將本機物件喂給 pack-objects"
+
+#: builtin/index-pack.c
+msgid "index-pack: Expecting full hex object ID lines only from pack-objects."
+msgstr "index-pack:只預期接受來自 pack-objects 的完整十六進位物件 ID。"
+
+#: builtin/index-pack.c
+msgid "could not finish pack-objects to repack local links"
+msgstr "無法結束 pack-objects 來重新封包"
+
+#: builtin/index-pack.c
msgid "Cannot come back to cwd"
msgstr "無法返回目前工作目錄"
@@ -9172,6 +9220,10 @@ msgid "unknown hash algorithm '%s'"
msgstr "未知的「%s」雜湊算法"
#: builtin/index-pack.c
+msgid "--promisor cannot be used with a pack name"
+msgstr "--promisor 不能與封包名稱一起使用"
+
+#: builtin/index-pack.c
msgid "--stdin requires a git repository"
msgstr "--stdin 需要一個 git 版本庫"
@@ -9256,7 +9308,7 @@ msgstr ""
#: builtin/interpret-trailers.c wrapper.c
#, c-format
msgid "could not stat %s"
-msgstr "不能對 %s 呼叫 stat"
+msgstr "無法 stat %s"
#: builtin/interpret-trailers.c
#, c-format
@@ -9270,21 +9322,21 @@ msgstr "檔案 %s 使用者不可寫"
#: builtin/interpret-trailers.c
msgid "could not open temporary file"
-msgstr "不能開啟暫存檔"
+msgstr "無法開啟暫存檔"
#: builtin/interpret-trailers.c
#, c-format
msgid "could not read input file '%s'"
-msgstr "不能讀取輸入檔案 '%s'"
+msgstr "無法讀取輸入檔案「%s」"
#: builtin/interpret-trailers.c builtin/mktag.c imap-send.c
msgid "could not read from stdin"
-msgstr "不能自標準輸入讀取"
+msgstr "無法從標準輸入讀取"
#: builtin/interpret-trailers.c
#, c-format
msgid "could not rename temporary file to %s"
-msgstr "不能重新命名暫存檔為 %s"
+msgstr "無法將暫存檔重新命名為 %s"
#: builtin/interpret-trailers.c
msgid "edit files in place"
@@ -9388,7 +9440,7 @@ msgstr "追蹤 <開始>,<結束> 範圍中橫列或 <檔案> 中> :<函數名稱
#: builtin/log.c builtin/replay.c builtin/shortlog.c bundle.c
#, c-format
msgid "unrecognized argument: %s"
-msgstr "無法識別的引數:%s"
+msgstr "不認識的引數:%s"
#: builtin/log.c
msgid "-L<range>:<file> cannot be used with pathspec"
@@ -9407,7 +9459,7 @@ msgstr "git show %s: 損壞的檔案"
#: builtin/log.c
#, c-format
msgid "could not read object %s"
-msgstr "不能讀取物件 %s"
+msgstr "無法讀取物件 %s"
#: builtin/log.c
#, c-format
@@ -9474,7 +9526,7 @@ msgstr "無法將 '%s' 解析為一個有效引用"
#: builtin/log.c
msgid "could not find exact merge base"
-msgstr "不能找到準確的合併基礎"
+msgstr "找不到準確的合併基礎"
#: builtin/log.c
msgid ""
@@ -9727,7 +9779,7 @@ msgstr "--remerge-diff 無意義"
#: builtin/log.c builtin/submodule--helper.c rerere.c submodule.c
#, c-format
msgid "could not create directory '%s'"
-msgstr "不能建立目錄 '%s'"
+msgstr "無法建立「%s」目錄"
#: builtin/log.c
msgid "--interdiff requires --cover-letter or single patch"
@@ -9776,7 +9828,7 @@ msgstr "git cherry [-v] [<上游> [<頭> [<限制>]]]"
#, c-format
msgid ""
"Could not find a tracked remote branch, please specify <upstream> manually.\n"
-msgstr "不能找到追蹤的遠端分支,請手動指定 <上游>。\n"
+msgstr "無法找到追蹤的遠端分支,請手動指定 <上游>。\n"
#: builtin/ls-files.c builtin/ls-tree.c
#, c-format
@@ -9900,7 +9952,7 @@ msgid ""
"--format cannot be used with -s, -o, -k, -t, --resolve-undo, --deduplicate, "
"--eol"
msgstr ""
-"--format 不能和 -s、-o、-k、-t、--resolve-undo、--deduplicate、--eol 一起使用"
+"--format 無法和 -s、-o、-k、-t、--resolve-undo、--deduplicate、--eol 一起使用"
#: builtin/ls-remote.c
msgid ""
@@ -10162,7 +10214,7 @@ msgstr "未知選項 %s"
#: builtin/merge-recursive.c
#, c-format
msgid "could not parse object '%s'"
-msgstr "不能解析物件 '%s'"
+msgstr "無法解析物件「%s」"
#: builtin/merge-recursive.c
#, c-format
@@ -10177,7 +10229,7 @@ msgstr "不能處理兩個頭合併之外的任何動作。"
#: builtin/merge-recursive.c
#, c-format
msgid "could not resolve ref '%s'"
-msgstr "無法解析引用 '%s'"
+msgstr "無法解析引用「%s」"
#: builtin/merge-recursive.c
#, c-format
@@ -10280,7 +10332,7 @@ msgstr "選項 `%s' 需要一個值"
#: builtin/merge.c
#, c-format
msgid "Could not find merge strategy '%s'.\n"
-msgstr "不能找到合併策略 '%s'。\n"
+msgstr "找不到合併策略「%s」。\n"
#: builtin/merge.c
#, c-format
@@ -10368,7 +10420,7 @@ msgstr "繞過 pre-merge-commit 和 commit-msg 掛鉤"
#: builtin/merge.c
msgid "could not run stash."
-msgstr "不能執行貯存。"
+msgstr "無法執行貯存。"
#: builtin/merge.c
msgid "stash failed"
@@ -10428,7 +10480,7 @@ msgstr "不能寫 %s"
#: builtin/merge.c
#, c-format
msgid "Could not read from '%s'"
-msgstr "不能從 '%s' 讀取"
+msgstr "無法從「%s」進行讀取"
#: builtin/merge.c
#, c-format
@@ -10495,7 +10547,7 @@ msgstr "環境 '%2$s' 中存在壞的取值 '%1$s'"
#: builtin/merge.c editor.c read-cache.c wrapper.c
#, c-format
msgid "could not close '%s'"
-msgstr "不能關閉 '%s'"
+msgstr "無法關閉「%s」"
#: builtin/merge.c
#, c-format
@@ -10885,11 +10937,11 @@ msgstr "git notes [--ref <註解引用>] [list [<物件>]]"
msgid ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
#: builtin/notes.c
msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
@@ -10899,11 +10951,11 @@ msgstr "git notes [--ref <註解引用>] copy [-f] <來源物件> <目標物件>
msgid ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
msgstr ""
"git notes [--ref <notes-ref>] append [--allow-empty] [--[no-]separator|--"
"separator=<paragraph-break>] [--[no-]stripspace] [-m <msg> | -F <file> | (-c "
-"| -C) <object>] [<object>]"
+"| -C) <object>] [<object>] [-e]"
#: builtin/notes.c
msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
@@ -10984,7 +11036,7 @@ msgstr "為下面的物件寫/編輯說明:"
#: builtin/notes.c
msgid "could not read 'show' output"
-msgstr "不能讀取 'show' 的輸出"
+msgstr "無法讀取「show」的輸出"
#: builtin/notes.c
#, c-format
@@ -11007,7 +11059,7 @@ msgstr "註解內容被留在 %s 中"
#: builtin/notes.c builtin/tag.c
#, c-format
msgid "could not open or read '%s'"
-msgstr "不能開啟或讀取 '%s'"
+msgstr "無法開啟或讀取「%s」"
#: builtin/notes.c
#, c-format
@@ -11055,6 +11107,10 @@ msgid "reuse and edit specified note object"
msgstr "重用和編輯指定的註解物件"
#: builtin/notes.c
+msgid "edit note message in editor"
+msgstr "在編輯器中編輯備註訊息"
+
+#: builtin/notes.c
msgid "reuse specified note object"
msgstr "重用指定的註解物件"
@@ -11352,7 +11408,7 @@ msgstr "%s 的 delta 基準位移越界"
#: builtin/pack-objects.c
msgid "Counting objects"
-msgstr "物件計數中"
+msgstr "正在計算物件數量"
#: builtin/pack-objects.c pack-bitmap.c
#, c-format
@@ -11668,6 +11724,10 @@ msgid "do not pack objects in promisor packfiles"
msgstr "不要打包 promisor packfile 中的物件"
#: builtin/pack-objects.c
+msgid "implies --missing=allow-any"
+msgstr "隱含 --missing=allow-any"
+
+#: builtin/pack-objects.c
msgid "respect islands during delta compression"
msgstr "在差異壓縮時尊重資料島"
@@ -11696,7 +11756,7 @@ msgstr "錯誤的打包壓縮級別 %d"
#: builtin/pack-objects.c
msgid "--max-pack-size cannot be used to build a pack for transfer"
-msgstr "不能使用 --max-pack-size 來組建傳輸用的包檔案"
+msgstr "不能使用 --max-pack-size 來建構傳輸用的包檔案"
#: builtin/pack-objects.c
msgid "minimum pack size limit is 1 MiB"
@@ -12330,7 +12390,7 @@ msgstr ""
#: builtin/push.c
msgid "--all can't be combined with refspecs"
-msgstr "--all 不能和引用規格同時使用"
+msgstr "--all 無法和引用規格同時使用"
#: builtin/push.c
msgid "--mirror can't be combined with refspecs"
@@ -12492,12 +12552,12 @@ msgstr ""
#: builtin/rebase.c sequencer.c
#, c-format
msgid "could not read '%s'."
-msgstr "不能讀取 '%s'。"
+msgstr "無法讀取「%s」。"
#: builtin/rebase.c
#, c-format
msgid "could not create temporary %s"
-msgstr "無法建立暫時的 %s"
+msgstr "無法建立暫存用的 %s"
#: builtin/rebase.c
msgid "could not mark as interactive"
@@ -12505,7 +12565,7 @@ msgstr "無法標記為互動式"
#: builtin/rebase.c
msgid "could not generate todo list"
-msgstr "無法生成待辦列表"
+msgstr "無法產生待辦列表"
#: builtin/rebase.c
msgid "a base commit must be provided with --upstream or --onto"
@@ -12534,7 +12594,7 @@ msgstr "忽略無效的 allow_rerere_autoupdate:'%s'"
#: builtin/rebase.c builtin/rm.c sequencer.c
#, c-format
msgid "could not remove '%s'"
-msgstr "無法刪除 '%s'"
+msgstr "無法刪除「%s」"
#: builtin/rebase.c
#, c-format
@@ -12577,7 +12637,7 @@ msgstr "--empty=ask 已棄用。請改用「--empty=stop」。"
msgid ""
"unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and "
"\"stop\"."
-msgstr "無法識別空類型「%s」;有效的數值有「drop」、「keep」跟「stop」。"
+msgstr "不認識空類型「%s」;有效的數值有「drop」、「keep」跟「stop」。"
#: builtin/rebase.c
msgid ""
@@ -12879,7 +12939,7 @@ msgstr "無效的上游 '%s'"
#: builtin/rebase.c
msgid "Could not create new root commit"
-msgstr "不能建立新的根提交"
+msgstr "無法建立新的根提交"
#: builtin/rebase.c
#, c-format
@@ -13235,7 +13295,7 @@ msgstr "更新 %s 中"
#: builtin/remote.c
#, c-format
msgid "Could not fetch %s"
-msgstr "不能取得 %s"
+msgstr "無法取得 %s"
#: builtin/remote.c
msgid ""
@@ -13290,7 +13350,7 @@ msgstr "遠端 %s 已經存在。"
#: builtin/remote.c
#, c-format
msgid "Could not setup master '%s'"
-msgstr "無法設定 master '%s'"
+msgstr "無法配置 master「%s」"
#: builtin/remote.c trailer.c
#, c-format
@@ -13305,7 +13365,7 @@ msgstr "branch.%s.rebase=%s 未處理。假設成 'true'"
#: builtin/remote.c
#, c-format
msgid "Could not get fetch map for refspec %s"
-msgstr "無法得到引用規格 %s 的取得列表"
+msgstr "無法取得引用規格 %s 的 fetch 映射"
#: builtin/remote.c
msgid "(matching)"
@@ -13318,12 +13378,12 @@ msgstr "(刪除)"
#: builtin/remote.c
#, c-format
msgid "could not set '%s'"
-msgstr "無法設定 '%s'"
+msgstr "無法設定「%s」"
#: builtin/remote.c config.c
#, c-format
msgid "could not unset '%s'"
-msgstr "不能取消設定 '%s'"
+msgstr "無法取消設定「%s」"
#: builtin/remote.c
#, c-format
@@ -13344,7 +13404,7 @@ msgstr "沒有此遠端版本庫:'%s'"
#: builtin/remote.c
#, c-format
msgid "Could not rename config section '%s' to '%s'"
-msgstr "不能重新命名設定小節 '%s' 到 '%s'"
+msgstr "無法將組態的「%s」區段重新命名為「%s」"
#: builtin/remote.c
#, c-format
@@ -13383,7 +13443,7 @@ msgstr[0] "注意:refs/remotes/ 層級之外的一個分支未被移除。要
#: builtin/remote.c
#, c-format
msgid "Could not remove config section '%s'"
-msgstr "不能移除設定小節 '%s'"
+msgstr "無法移除組態的「%s」區段"
#: builtin/remote.c
#, c-format
@@ -13555,6 +13615,33 @@ msgid_plural " Local refs configured for 'git push'%s:"
msgstr[0] " 為 'git push' 設定的本機引用%s:"
#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' is unchanged and points to '%s'\n"
+msgstr "「%s/HEAD」沒有變更,指向「%s」\n"
+
+#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' has changed from '%s' and now points to '%s'\n"
+msgstr "「%s/HEAD」已經從「%s」變更,現在指向「%s」\n"
+
+#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' is now created and points to '%s'\n"
+msgstr "「%s/HEAD」現在已經建立並指向「%s」\n"
+
+#: builtin/remote.c
+#, c-format
+msgid "'%s/HEAD' was detached at '%s' and now points to '%s'\n"
+msgstr "「%s/HEAD」已經在「%s」處分離,現在指向「%s」\n"
+
+#: builtin/remote.c
+#, c-format
+msgid ""
+"'%s/HEAD' used to point to '%s' (which is not a remote branch), but now "
+"points to '%s'\n"
+msgstr "「%s/HEAD」原本指向「%s」(不是遠端分支),但現在指向「%s」\n"
+
+#: builtin/remote.c
msgid "set refs/remotes/<name>/HEAD according to remote"
msgstr "根據遠端設定 refs/remotes/<名稱>/HEAD"
@@ -13582,8 +13669,8 @@ msgstr "不是一個有效引用:%s"
#: builtin/remote.c
#, c-format
-msgid "Could not setup %s"
-msgstr "不能設定 %s"
+msgid "Could not set up %s"
+msgstr "無法配置 %s"
# 譯者:請維持前導空格
#: builtin/remote.c
@@ -13702,7 +13789,7 @@ msgstr "repack:期望來自 pack-objects 的完整十六進位物件 ID。"
#: builtin/repack.c
msgid "could not finish pack-objects to repack promisor objects"
-msgstr "無法完成 pack-objects 來重新打包 promisor 物件"
+msgstr "無法結束 pack-objects 來重新打包 promisor 物件"
#: builtin/repack.c
#, c-format
@@ -13722,7 +13809,7 @@ msgstr "%s 包太大,以致不能縮合"
#: builtin/repack.c
#, c-format
msgid "could not open tempfile %s for writing"
-msgstr "無法開啟 '%s' 暫存檔進行寫入"
+msgstr "無法開啟暫存檔 %s 進行寫入"
#: builtin/repack.c
msgid "could not close refs snapshot tempfile"
@@ -13986,7 +14073,7 @@ msgstr "新物件和舊物件相同:'%s'"
#: builtin/replace.c
#, c-format
msgid "could not parse %s as a commit"
-msgstr "無法將 %s 解析為一個提交"
+msgstr "無法將 %s 解析為提交"
#: builtin/replace.c
#, c-format
@@ -14017,7 +14104,7 @@ msgstr "在取代的提交中簽名將被移除!"
#: builtin/replace.c
#, c-format
msgid "could not write replacement commit for: '%s'"
-msgstr "不能為 '%s' 寫取代提交"
+msgstr "無法寫入下列項目的替代提交:「%s」"
#: builtin/replace.c
#, c-format
@@ -14035,7 +14122,7 @@ msgid ""
"could not convert the following graft(s):\n"
"%s"
msgstr ""
-"不能轉換下列移植:\n"
+"無法轉換下列移植:\n"
"%s"
#: builtin/replace.c
@@ -14072,7 +14159,7 @@ msgstr "使用此格式"
#: builtin/replace.c
msgid "--format cannot be used when not listing"
-msgstr "不列出時不能使用 --format"
+msgstr "非列出操作不能使用 --format"
#: builtin/replace.c
msgid "-f only makes sense when writing a replacement"
@@ -14338,11 +14425,11 @@ msgstr ""
#: builtin/reset.c
#, c-format
msgid "Could not reset index file to revision '%s'."
-msgstr "不能重設索引檔案至版本 '%s'。"
+msgstr "無法將索引檔案重設到修訂版「%s」。"
#: builtin/reset.c
msgid "Could not write new index file."
-msgstr "不能寫入新的索引檔案。"
+msgstr "無法寫入新的索引檔案。"
#: builtin/rev-list.c
#, c-format
@@ -15231,7 +15318,7 @@ msgstr "無法在合併過程套用貯存"
#: builtin/stash.c
#, c-format
msgid "could not generate diff %s^!."
-msgstr "無法生成差異 %s^!."
+msgstr "無法產生差異 %s^!."
#: builtin/stash.c
msgid "conflicts in index. Try without --index."
@@ -15239,7 +15326,7 @@ msgstr "索引中有衝突。請試試看不用 --index。"
#: builtin/stash.c
msgid "could not save index tree"
-msgstr "不能儲存索引樹"
+msgstr "無法儲存索引樹"
#: builtin/stash.c
#, c-format
@@ -15415,14 +15502,14 @@ msgstr "期望一個完整的引用名稱,卻得到 %s"
#: builtin/submodule--helper.c
#, c-format
msgid "could not get a repository handle for submodule '%s'"
-msgstr "無法獲得子模組 '%s' 的版本庫句柄"
+msgstr "無法取得子模組「%s」的版本庫控制代碼"
#: builtin/submodule--helper.c
#, c-format
msgid ""
"could not look up configuration '%s'. Assuming this repository is its own "
"authoritative upstream."
-msgstr "無法找到設定 '%s'。假定這個版本庫是其自身的官方上游。"
+msgstr "找不到「%s」組態設定。假定這個版本庫是其自身的官方上游。"
#: builtin/submodule--helper.c
#, c-format
@@ -15501,7 +15588,7 @@ msgstr "在 .gitmodules 中沒有發現路徑 '%s' 的子模組映射"
#: builtin/submodule--helper.c
#, c-format
msgid "could not resolve HEAD ref inside the submodule '%s'"
-msgstr "無法解析子模組 '%s' 的 HEAD 引用"
+msgstr "無法解析子模組「%s」的 HEAD 引用"
#: builtin/submodule--helper.c
#, c-format
@@ -15540,7 +15627,7 @@ msgstr "%s"
#: builtin/submodule--helper.c
#, c-format
msgid "couldn't hash object from '%s'"
-msgstr "無法雜湊來自 '%s' 的物件"
+msgstr "無法雜湊來自「%s」的物件"
#: builtin/submodule--helper.c
#, c-format
@@ -15569,7 +15656,7 @@ msgstr "git submodule summary [<options>] [<commit>] [--] [<path>]"
#: builtin/submodule--helper.c
msgid "could not fetch a revision for HEAD"
-msgstr "無法取得 HEAD 的版本"
+msgstr "無法取得 HEAD 的修訂版"
#: builtin/submodule--helper.c
#, c-format
@@ -15617,12 +15704,12 @@ msgstr "已清除目錄 '%s'\n"
#: builtin/submodule--helper.c
#, c-format
msgid "Could not remove submodule work tree '%s'\n"
-msgstr "無法移除子模組工作區 '%s'\n"
+msgstr "無法移除子模組工作區「%s」\n"
#: builtin/submodule--helper.c
#, c-format
msgid "could not create empty submodule directory %s"
-msgstr "不能建立空的子模組目錄 %s"
+msgstr "無法建立空的子模組目錄 %s"
#: builtin/submodule--helper.c
#, c-format
@@ -15662,7 +15749,7 @@ msgstr ""
#: builtin/submodule--helper.c
#, c-format
msgid "could not get a repository handle for gitdir '%s'"
-msgstr "無法取得 gitdir「%s」的版本庫控點"
+msgstr "無法取得 gitdir「%s」的版本庫控制代碼"
#: builtin/submodule--helper.c
#, c-format
@@ -15697,7 +15784,7 @@ msgstr "無法複製 '%s' 到子模組路徑 '%s'"
#: builtin/submodule--helper.c
#, c-format
msgid "could not get submodule directory for '%s'"
-msgstr "無法得到 '%s' 的子模組目錄"
+msgstr "無法取得「%s」的子模組目錄"
#: builtin/submodule--helper.c
msgid "alternative anchor for relative paths"
@@ -16826,7 +16913,7 @@ msgstr "無法取消「%2$s」中「%1$s」的設定"
#: builtin/worktree.c
#, c-format
msgid "could not create directory of '%s'"
-msgstr "不能建立目錄 '%s'"
+msgstr "無法建立「%s」的目錄"
#: builtin/worktree.c
msgid "initializing"
@@ -16917,6 +17004,10 @@ msgstr "設定追蹤模式(參見 git-branch(1))"
msgid "try to match the new branch name with a remote-tracking branch"
msgstr "嘗試為新分支名符合一個遠端追蹤分支"
+#: builtin/worktree.c
+msgid "use relative paths for worktrees"
+msgstr "對工作區使用相對路徑"
+
#: builtin/worktree.c diff.c parse-options.c
#, c-format
msgid "options '%s', '%s', and '%s' cannot be used together"
@@ -16987,7 +17078,7 @@ msgstr "'%s' 是一個主工作區"
#: builtin/worktree.c
#, c-format
msgid "could not figure out destination name from '%s'"
-msgstr "無法從 '%s' 算出目的地名稱"
+msgstr "無法從「%s」得出目的地名稱"
#: builtin/worktree.c
#, c-format
@@ -17117,7 +17208,7 @@ msgstr "無法儲存最大的建立權杖"
#: bundle-uri.c
#, c-format
msgid "unrecognized bundle mode from URI '%s'"
-msgstr "無法識別從 URI「%s」取回的套件包模式"
+msgstr "不認識從 URI「%s」取回的套件包模式"
#: bundle-uri.c
#, c-format
@@ -17158,7 +17249,7 @@ msgstr "bundle-uri: 列有空鍵或空值"
#: bundle.c
#, c-format
msgid "unrecognized bundle hash algorithm: %s"
-msgstr "無法識別的套件包雜湊演算法:%s"
+msgstr "不認識的套件包雜湊演算法:%s"
#: bundle.c
#, c-format
@@ -17173,7 +17264,7 @@ msgstr "「%s」不像是一個 v2 或 v3 版本的套件包檔案"
#: bundle.c
#, c-format
msgid "unrecognized header: %s%s (%d)"
-msgstr "無法識別的標頭:%s%s (%d)"
+msgstr "不認識的標頭:%s%s (%d)"
#: bundle.c
msgid "Repository lacks these prerequisite commits:"
@@ -17251,6 +17342,30 @@ msgstr "無法建立「%s」"
msgid "index-pack died"
msgstr "index-pack 終止"
+#: cache-tree.c
+#, c-format
+msgid "directory '%s' is present in index, but not sparse"
+msgstr "「%s」目錄已經在索引裡面,但不在稀疏簽出當中。"
+
+#: cache-tree.c unpack-trees.c
+msgid "corrupted cache-tree has entries not present in index"
+msgstr "損壞的快取樹有不在索引中的項目"
+
+#: cache-tree.c
+#, c-format
+msgid "%s with flags 0x%x should not be in cache-tree"
+msgstr "有 0x%2$x 標記的 %1$s 不應該在快取樹當中"
+
+#: cache-tree.c
+#, c-format
+msgid "bad subtree '%.*s'"
+msgstr "「%.*s」子樹損壞"
+
+#: cache-tree.c
+#, c-format
+msgid "cache-tree for path %.*s does not match. Expected %s got %s"
+msgstr "%.*s 路徑的快取樹不符。預期是 %s,卻得到 %s"
+
#: chunk-format.c
msgid "terminating chunk id appears earlier than expected"
msgstr "終止區塊 ID 比預期還早出現"
@@ -18339,7 +18454,7 @@ msgstr "正在驗證提交圖中的提交"
#: commit-reach.c sequencer.c
#, c-format
msgid "could not parse commit %s"
-msgstr "不能解析提交 %s"
+msgstr "無法解析提交 %s"
#: commit.c
#, c-format
@@ -18355,7 +18470,7 @@ msgid ""
"to convert the grafts into replace refs.\n"
"\n"
"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
+"\"git config set advice.graftFileDeprecated false\""
msgstr ""
"對 <GIT_DIR>/info/grafts 的支援已棄用,並將在\n"
"未來的 Git 版本中被移除。\n"
@@ -18363,8 +18478,8 @@ msgstr ""
"請使用「git replace --convert-graft-file」將\n"
"grafts 轉換為取代引用。\n"
"\n"
-"設定「git config advice.graftFileDeprecated false」\n"
-"可以將本訊息關閉"
+"設定「git config set advice.graftFileDeprecated false」\n"
+"可以關閉此訊息"
#: commit.c
#, c-format
@@ -18672,7 +18787,7 @@ msgstr ""
#: config.c
#, c-format
msgid "could not expand include path '%s'"
-msgstr "無法展開包含路徑 '%s'"
+msgstr "無法展開包含路徑「%s」"
#: config.c
msgid "relative config includes must come from files"
@@ -18971,7 +19086,7 @@ msgstr "不允許多列備註:「%s」"
#: config.c
#, c-format
msgid "could not lock config file %s"
-msgstr "不能鎖定設定檔案 %s"
+msgstr "無法鎖定組態檔案 %s"
#: config.c
#, c-format
@@ -19001,12 +19116,12 @@ msgstr "對 %s 呼叫 chmod 失敗"
#: config.c
#, c-format
msgid "could not write config file %s"
-msgstr "不能寫入設定檔案 %s"
+msgstr "無法寫入組態檔案 %s"
#: config.c
#, c-format
msgid "could not set '%s' to '%s'"
-msgstr "不能設定 '%s' 為 '%s'"
+msgstr "無法將「%s」設為「%s」"
#: config.c
#, c-format
@@ -19205,7 +19320,7 @@ msgstr "無法 fork"
#: connected.c
msgid "Could not run 'git rev-list'"
-msgstr "不能執行 'git rev-list'"
+msgstr "無法執行「git rev-list」"
#: connected.c
msgid "failed write to rev-list"
@@ -19362,6 +19477,21 @@ msgstr "URL 沒有 Scheme:%s"
msgid "credential url cannot be parsed: %s"
msgstr "無法解析憑證 URL:%s"
+#: daemon.c
+#, c-format
+msgid "invalid timeout '%s', expecting a non-negative integer"
+msgstr "無效的 timeout「%s」,預期為非負整數"
+
+#: daemon.c
+#, c-format
+msgid "invalid init-timeout '%s', expecting a non-negative integer"
+msgstr "無效的 init-timeout「%s」,應為非負整數"
+
+#: daemon.c
+#, c-format
+msgid "invalid max-connections '%s', expecting an integer"
+msgstr "無效的 max-connections「%s」,應為整數"
+
#: date.c
msgid "in the future"
msgstr "在將來"
@@ -19458,7 +19588,7 @@ msgstr "無法封存不存在的路徑「%s」"
#: diagnose.c dir.c
#, c-format
msgid "could not open directory '%s'"
-msgstr "不能開啟目錄 '%s'"
+msgstr "無法開啟目錄「%s」"
#: diagnose.c
#, c-format
@@ -20133,12 +20263,12 @@ msgstr "路徑規格 '%s' 未符合任何 git 已知檔案"
#: dir.c
#, c-format
msgid "unrecognized pattern: '%s'"
-msgstr "無法識別樣式:「%s」"
+msgstr "不認識樣式:「%s」"
#: dir.c
#, c-format
msgid "unrecognized negative pattern: '%s'"
-msgstr "無法識別反向模式:「%s」"
+msgstr "不認識反向模式:「%s」"
#: dir.c
#, c-format
@@ -20178,12 +20308,12 @@ msgstr "版本庫 %s 中的索引檔案損壞"
#: dir.c
#, c-format
msgid "could not create directories for %s"
-msgstr "不能為 %s 建立目錄"
+msgstr "無法建立 %s 的目錄"
#: dir.c
#, c-format
msgid "could not migrate git directory from '%s' to '%s'"
-msgstr "不能從 '%s' 遷移 git 目錄到 '%s'"
+msgstr "無法從「%s」遷移 git 目錄到「%s」"
#: editor.c
#, c-format
@@ -20193,12 +20323,12 @@ msgstr "提示:等待您的編輯器關閉檔案...%c"
#: editor.c sequencer.c wrapper.c
#, c-format
msgid "could not write to '%s'"
-msgstr "不能寫入 '%s'"
+msgstr "無法寫入「%s」"
#: editor.c
#, c-format
msgid "could not edit '%s'"
-msgstr "無法編輯 '%s'"
+msgstr "無法編輯「%s」"
#: entry.c
msgid "Filtering content"
@@ -20207,7 +20337,7 @@ msgstr "過濾內容"
#: entry.c
#, c-format
msgid "could not stat file '%s'"
-msgstr "不能對檔案 '%s' 呼叫 stat"
+msgstr "無法 stat 檔案「%s」"
#: environment.c
#, c-format
@@ -20220,6 +20350,23 @@ msgid "too many args to run %s"
msgstr "執行 %s 的參數太多"
#: fetch-pack.c
+#, c-format
+msgid ""
+"You are attempting to fetch %s, which is in the commit graph file but not in "
+"the object database.\n"
+"This is probably due to repo corruption.\n"
+"If you are attempting to repair this repo corruption by refetching the "
+"missing object, use 'git fetch --refetch' with the missing object."
+msgstr ""
+"你正在嘗試取得 %s。這個物件在提交圖檔案中,\n"
+"但不在物件資料庫中。\n"
+"\n"
+"這可能是由於儲存庫損壞所致。\n"
+"\n"
+"如果你想透過重新擷取遺失的物件來修復儲存庫損壞,\n"
+"請使用「git fetch --refetch」並指定遺失的物件。"
+
+#: fetch-pack.c
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack:應為 shallow 列表"
@@ -20647,7 +20794,7 @@ msgstr "執行指令 '%s' 失敗:%s\n"
#: gpg-interface.c
msgid "could not create temporary file"
-msgstr "不能建立暫存檔"
+msgstr "無法建立暫存檔"
#: gpg-interface.c
#, c-format
@@ -20925,10 +21072,10 @@ msgstr[0] ""
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
+"You can disable this warning with `git config set advice.ignoredHook false`."
msgstr ""
-"因為沒有將掛鉤 '%s' 設定為可執行,掛鉤被忽略。您可以透過\n"
-"設定 `git config advice.ignoredHook false` 來關閉這條警告。"
+"因為沒有將掛鉤「%s」設定為可執行,因此忽略這個掛鉤。\n"
+"您可以透過設定「git config set advice.ignoredHook false」來關閉這則警告。"
#: http-fetch.c
msgid "not a git repository"
@@ -20949,18 +21096,10 @@ msgid "Delegation control is not supported with cURL < 7.22.0"
msgstr "不支援委託控制,因為 cURL < 7.22.0"
#: http.c
-msgid "Public key pinning not supported with cURL < 7.39.0"
-msgstr "不支援公鑰檔案鎖定,因為 cURL < 7.39.0"
-
-#: http.c
msgid "Unknown value for http.proactiveauth"
msgstr "http.proactiveauth 的值未知"
#: http.c
-msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
-msgstr "不支援 CURLSSLOPT_NO_REVOKE,因為 cURL < 7.44.0"
-
-#: http.c
#, c-format
msgid "Unsupported SSL backend '%s'. Supported SSL backends:"
msgstr "不支援的 SSL 後端 '%s'。支援的 SSL 後端:"
@@ -20968,12 +21107,12 @@ msgstr "不支援的 SSL 後端 '%s'。支援的 SSL 後端:"
#: http.c
#, c-format
msgid "Could not set SSL backend to '%s': cURL was built without SSL backends"
-msgstr "無法將 SSL 後端設定為 '%s':組建 cURL 時未加入 SSL 後端"
+msgstr "無法將 SSL 後端設定為「%s」:組建 cURL 時未加入 SSL 後端"
#: http.c
#, c-format
msgid "Could not set SSL backend to '%s': already set"
-msgstr "無法將 SSL 後端設定為 '%s':已經設定"
+msgstr "無法將 SSL 後端設定為「%s」:已經設定"
#: http.c
msgid "refusing to read cookies from http.cookiefile '-'"
@@ -21089,7 +21228,7 @@ msgstr "不能混用多種過濾規格"
#: list-objects-filter-options.c
msgid "unable to upgrade repository format to support partial clone"
-msgstr "無法升級版本庫格式,以致不支援部分複製"
+msgstr "無法升級版本庫格式,以支援部分複製"
#: list-objects-filter-options.h
msgid "args"
@@ -21180,6 +21319,11 @@ msgstr "偵測到由可列印字元 (quoted) 所組成的 CRLF"
msgid "unable to format message: %s"
msgstr "無法格式化訊息:%s"
+#: merge-ll.c
+#, c-format
+msgid "invalid marker-size '%s', expecting an integer"
+msgstr "無效的 marker-size「%s」,應為整數"
+
#: merge-ort.c merge-recursive.c
#, c-format
msgid "Failed to merge submodule %s (not checked out)"
@@ -21751,7 +21895,7 @@ msgstr "合併未返回提交"
#: merge-recursive.c
#, c-format
msgid "Could not parse object '%s'"
-msgstr "不能解析物件 '%s'"
+msgstr "無法解析物件「%s」"
#: merge.c
msgid "failed to read the cache"
@@ -21871,7 +22015,7 @@ msgstr "無法將一個增量多封裝索引的套件設為過期"
#: midx-write.c
msgid "Counting referenced objects"
-msgstr "正在計算引用物件"
+msgstr "正在計算引用物件數量"
#: midx-write.c
msgid "Finding and deleting unreferenced packfiles"
@@ -21883,11 +22027,11 @@ msgstr "無法重新封裝增量的多封裝索引"
#: midx-write.c
msgid "could not start pack-objects"
-msgstr "不能開始 pack-objects"
+msgstr "無法啟動 pack-objects"
#: midx-write.c
msgid "could not finish pack-objects"
-msgstr "不能結束 pack-objects"
+msgstr "無法結束 pack-objects"
#: midx.c
msgid "multi-pack-index OID fanout is of the wrong size"
@@ -22489,17 +22633,17 @@ msgid ""
"\n"
"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"running \"git config set advice.objectNameWarning false\""
msgstr ""
-"Git 通常不會建立以 40 個十六進位字元結尾的引用,\n"
-"因為當您只提供 40 個十六進位字元時,其將被忽略。\n"
-"這些引用可能被意外建立。例如:\n"
+"Git 通常不會建立以 40 個十六進位字元結尾的參照,\n"
+"因為在指定 40 個十六進位字元時會被忽略。\n"
+"這些參照可能是意外建立的。例如,\n"
"\n"
" git switch -c $br $(git rev-parse ...)\n"
"\n"
-"當「$br」因為某些原因空白時,會建立出 40 位十六進位的引用。\n"
-"請檢查這些引用,並視需要刪除。執行\n"
-"「git config advice.objectNameWarning false」命令以關閉本訊息通知"
+"其中「$br」不知何故為空白,導致建立了一個 40 個\n"
+"十六進位字元的參照。請檢查這些參照,必要時刪除它們。\n"
+"若要關閉此訊息,請執行「git config set advice.objectNameWarning false」"
#: object-name.c
#, c-format
@@ -22693,15 +22837,6 @@ msgstr "多包位圖缺少需要的反向索引"
msgid "could not open pack %s"
msgstr "無法開啟封包 %s"
-#: pack-bitmap.c t/helper/test-read-midx.c
-msgid "could not determine MIDX preferred pack"
-msgstr "無法確定 MIDX 偏好的封裝"
-
-#: pack-bitmap.c
-#, c-format
-msgid "preferred pack (%s) is invalid"
-msgstr "偏好的封包 (%s) 無效"
-
#: pack-bitmap.c
msgid "corrupt bitmap lookup table: triplet position out of index"
msgstr "位圖查詢表損壞:三元組位置超出索引"
@@ -22774,7 +22909,7 @@ msgstr "偽合併索引超出範圍(%<PRIu32> >= %<PRIuMAX>)"
#: pack-bitmap.c
#, c-format
msgid "could not find '%s' in pack '%s' at offset %<PRIuMAX>"
-msgstr "在「%2$s」封包,位移 %3$<PRIuMAX> 的地方找不到「%1$s」"
+msgstr "無法在「%2$s」封包,位移 %3$<PRIuMAX> 的地方找到「%1$s」"
#: pack-bitmap.c
#, c-format
@@ -23071,7 +23206,7 @@ msgstr "解析 %s 失敗"
#: path.c
#, c-format
msgid "Could not make %s writable by group"
-msgstr "不能設定 %s 為組可寫"
+msgstr "無法設定 %s 為群組可寫"
#: pathspec.c
msgid "Escape character '\\' not allowed as last character in attr value"
@@ -23325,16 +23460,16 @@ msgstr "無法讀取提交 %s 的延伸偽合併表"
#: range-diff.c
msgid "could not start `log`"
-msgstr "不能啟動 `log`"
+msgstr "無法啟動「log」"
#: range-diff.c
msgid "could not read `log` output"
-msgstr "不能讀取 `log` 的輸出"
+msgstr "無法讀取「log」的輸出"
#: range-diff.c sequencer.c
#, c-format
msgid "could not parse commit '%s'"
-msgstr "不能解析提交 '%s'"
+msgstr "無法解析提交「%s」"
#: range-diff.c
#, c-format
@@ -23346,7 +23481,7 @@ msgstr "無法解析第一行「log」輸出:開頭不是「commit」:「%s
#: range-diff.c
#, c-format
msgid "could not parse git header '%.*s'"
-msgstr "無法解析 git 頭 '%.*s'"
+msgstr "無法解析 git 標頭「%.*s」"
#: range-diff.c
msgid "failed to generate diff"
@@ -23355,7 +23490,7 @@ msgstr "生成 diff 失敗"
#: range-diff.c
#, c-format
msgid "could not parse log for '%s'"
-msgstr "不能解析 '%s' 的日誌"
+msgstr "無法解析「%s」的日誌"
#: reachable.c
#, c-format
@@ -23509,7 +23644,7 @@ msgstr "無法加入 load_index_extensions 執行緒:%s"
#: read-cache.c
#, c-format
msgid "could not freshen shared index '%s'"
-msgstr "無法重新整理共享索引 '%s'"
+msgstr "無法更新共享索引「%s」"
#: read-cache.c
#, c-format
@@ -23567,7 +23702,7 @@ msgstr ""
#, c-format
msgid ""
"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
-msgstr "選項 rebase.missingCommitsCheck 的值 %s 無法識別。已忽略。"
+msgstr "選項 rebase.missingCommitsCheck 的值 %s 不認識。已忽略。"
#: rebase-interactive.c
msgid ""
@@ -23669,7 +23804,7 @@ msgstr ""
#: rebase-interactive.c
#, c-format
msgid "could not write '%s'."
-msgstr "不能寫入 '%s'。"
+msgstr "無法寫入「%s」。"
#: rebase-interactive.c
#, c-format
@@ -23728,7 +23863,7 @@ msgstr "%%(%.*s) 不取引數"
#: ref-filter.c
#, c-format
msgid "unrecognized %%(%.*s) argument: %s"
-msgstr "無法識別的 %%(%.*s) 引數:%s"
+msgstr "不認識的 %%(%.*s) 引數:%s"
#: ref-filter.c
#, c-format
@@ -23738,7 +23873,7 @@ msgstr "期望的格式:%%(color:<顏色>)"
#: ref-filter.c
#, c-format
msgid "unrecognized color: %%(color:%s)"
-msgstr "無法識別的顏色:%%(color:%s)"
+msgstr "不認識的顏色:%%(color:%s)"
#: ref-filter.c
#, c-format
@@ -23798,17 +23933,17 @@ msgstr "期望的格式:%%(align:<寬度>,<位置>)"
#: ref-filter.c
#, c-format
msgid "unrecognized position:%s"
-msgstr "無法識別的位置:%s"
+msgstr "不認識的位置:%s"
#: ref-filter.c
#, c-format
msgid "unrecognized width:%s"
-msgstr "無法識別的寬度:%s"
+msgstr "不認識的寬度:%s"
#: ref-filter.c
#, c-format
msgid "unrecognized %%(%s) argument: %s"
-msgstr "無法識別的 %%(%s) 參數:%s"
+msgstr "不認識的 %%(%s) 參數:%s"
#: ref-filter.c
#, c-format
@@ -23879,7 +24014,7 @@ msgstr "本命令拒絕 atom %%(%.*s)"
#: ref-filter.c
#, c-format
msgid "--format=%.*s cannot be used with --python, --shell, --tcl"
-msgstr "--format=%.*s 不能和 --python、--shell、--tcl 一起使用"
+msgstr "--format=%.*s 無法和 --python、--shell、--tcl 一起使用"
#: ref-filter.c
msgid "failed to run 'describe'"
@@ -24037,8 +24172,19 @@ msgid "log for %s is empty"
msgstr "%s 的日誌為空"
#: refs.c
-msgid "refusing to force and skip creation of reflog"
-msgstr "拒絕強制並略過建立引用日誌"
+#, c-format
+msgid "refusing to update reflog for pseudoref '%s'"
+msgstr "拒絕更新偽引用「%s」 的 reflog"
+
+#: refs.c
+#, c-format
+msgid "refusing to update pseudoref '%s'"
+msgstr "拒絕更新偽引用「%s」"
+
+#: refs.c
+#, c-format
+msgid "refusing to update reflog with bad name '%s'"
+msgstr "拒絕更新有錯誤名稱「%s」的 reflog"
#: refs.c
#, c-format
@@ -24046,9 +24192,8 @@ msgid "refusing to update ref with bad name '%s'"
msgstr "拒絕更新有錯誤名稱 '%s' 的引用"
#: refs.c
-#, c-format
-msgid "refusing to update pseudoref '%s'"
-msgstr "拒絕更新偽引用「%s」"
+msgid "refusing to force and skip creation of reflog"
+msgstr "拒絕強制並略過建立引用日誌"
#: refs.c
#, c-format
@@ -24111,6 +24256,11 @@ msgstr "無法鎖定引用「%s」:預期是指向「%s」的符號引用,
#: refs/files-backend.c
#, c-format
+msgid "cannot read ref file '%s'"
+msgstr "無法寫入參照檔案「%s」"
+
+#: refs/files-backend.c
+#, c-format
msgid "cannot open directory %s"
msgstr "無法開啟 %s 目錄"
@@ -24367,8 +24517,13 @@ msgstr "提供了一個以上的 uploadpack,使用第一個"
#: remote.c
#, c-format
+msgid "unrecognized followRemoteHEAD value '%s' ignored"
+msgstr "已經忽略不認識的「%s」數值"
+
+#: remote.c
+#, c-format
msgid "unrecognized value transfer.credentialsInUrl: '%s'"
-msgstr "數值 transfer.credentialsInUrl 無法識別:「%s」"
+msgstr "數值 transfer.credentialsInUrl 不認識:「%s」"
#: remote.c
#, c-format
@@ -24657,7 +24812,7 @@ msgstr "寫入 '%s' (%s) 時發生錯誤"
#: rerere.c
#, c-format
msgid "could not parse conflict hunks in '%s'"
-msgstr "不能解析 '%s' 中的衝突區塊"
+msgstr "無法解析「%s」中的衝突區塊"
#: rerere.c
#, c-format
@@ -24724,7 +24879,7 @@ msgstr "如果可能,重用衝突解決更新索引"
#: reset.c
msgid "could not determine HEAD revision"
-msgstr "不能確定 HEAD 版本"
+msgstr "無法確定 HEAD 修訂版"
#: reset.c sequencer.c
#, c-format
@@ -25110,7 +25265,7 @@ msgstr "無效的提交說明清理模式 '%s'"
#: sequencer.c
#, c-format
msgid "could not delete '%s'"
-msgstr "無法刪除 '%s'"
+msgstr "無法刪除「%s」"
#: sequencer.c
msgid "revert"
@@ -25185,12 +25340,12 @@ msgstr ""
#: sequencer.c
#, c-format
msgid "could not lock '%s'"
-msgstr "不能鎖定 '%s'"
+msgstr "無法鎖定「%s」"
#: sequencer.c
#, c-format
msgid "could not write eol to '%s'"
-msgstr "不能將換行符號寫入 '%s'"
+msgstr "無法將換行符號寫入「%s」"
#: sequencer.c
#, c-format
@@ -25220,7 +25375,7 @@ msgstr "不能更新快取樹"
#: sequencer.c
msgid "could not resolve HEAD commit"
-msgstr "不能解析 HEAD 提交"
+msgstr "無法解析 HEAD 提交"
#: sequencer.c
#, c-format
@@ -25347,7 +25502,7 @@ msgstr "無法找到新建立的提交"
#: sequencer.c
msgid "could not parse newly created commit"
-msgstr "不能解析新建立的提交"
+msgstr "無法解析新建立的提交"
#: sequencer.c
msgid "unable to resolve HEAD after creating commit"
@@ -25364,7 +25519,7 @@ msgstr " (根提交)"
#: sequencer.c
msgid "could not parse HEAD"
-msgstr "不能解析 HEAD"
+msgstr "無法解析 HEAD"
#: sequencer.c
#, c-format
@@ -25392,12 +25547,12 @@ msgstr "作者資訊損壞:缺少日期資訊"
#: sequencer.c
#, c-format
msgid "could not update %s"
-msgstr "不能更新 %s"
+msgstr "無法更新 %s"
#: sequencer.c
#, c-format
msgid "could not parse parent commit %s"
-msgstr "不能解析父提交 %s"
+msgstr "無法解析父提交 %s"
#: sequencer.c
#, c-format
@@ -25438,16 +25593,16 @@ msgstr "需要一個 HEAD 來修復"
#: sequencer.c
msgid "could not read HEAD"
-msgstr "不能讀取 HEAD"
+msgstr "無法讀取 HEAD"
#: sequencer.c
msgid "could not read HEAD's commit message"
-msgstr "不能讀取 HEAD 的提交說明"
+msgstr "無法讀取 HEAD 的提交說明"
#: sequencer.c
#, c-format
msgid "could not read commit message of %s"
-msgstr "不能讀取 %s 的提交說明"
+msgstr "無法讀取 %s 的提交說明"
#: sequencer.c
msgid "your index file is unmerged."
@@ -25482,12 +25637,12 @@ msgstr "%s:不能解析父提交 %s"
#: sequencer.c
#, c-format
msgid "could not revert %s... %s"
-msgstr "不能還原 %s... %s"
+msgstr "無法還原 %s... %s"
#: sequencer.c
#, c-format
msgid "could not apply %s... %s"
-msgstr "不能套用 %s... %s"
+msgstr "無法套用 %s... %s"
#: sequencer.c
#, c-format
@@ -25580,7 +25735,7 @@ msgstr "缺少 %s 的參數"
#: sequencer.c
#, c-format
msgid "could not parse '%s'"
-msgstr "無法解析 '%s'"
+msgstr "無法解析「%s」"
#: sequencer.c
#, c-format
@@ -25655,7 +25810,7 @@ msgstr "嘗試 \"git cherry-pick (--continue | %s--abort | --quit)\""
#: sequencer.c
#, c-format
msgid "could not create sequencer directory '%s'"
-msgstr "不能建立序列目錄 '%s'"
+msgstr "無法建立序列目錄「%s」"
#: sequencer.c
msgid "no cherry-pick or revert in progress"
@@ -25742,12 +25897,12 @@ msgstr ""
#: sequencer.c
#, c-format
msgid "Could not apply %s... %.*s"
-msgstr "不能套用 %s... %.*s"
+msgstr "無法套用 %s... %.*s"
#: sequencer.c
#, c-format
msgid "Could not merge %.*s"
-msgstr "不能合併 %.*s"
+msgstr "無法合併 %.*s"
#: sequencer.c
#, c-format
@@ -25799,7 +25954,7 @@ msgstr "非法的標籤名稱:'%.*s'"
#: sequencer.c
#, c-format
msgid "could not resolve '%s'"
-msgstr "無法解析 '%s'"
+msgstr "無法解析「%s」"
#: sequencer.c
msgid "writing fake root commit"
@@ -25830,12 +25985,12 @@ msgstr "章魚合並不能在一個新的根提交上執行"
#: sequencer.c
#, c-format
msgid "could not get commit message of '%s'"
-msgstr "不能取得 '%s' 的提交說明"
+msgstr "無法取得「%s」的提交說明"
#: sequencer.c
#, c-format
msgid "could not even attempt to merge '%.*s'"
-msgstr "甚至不能嘗試合併 '%.*s'"
+msgstr "甚至無法嘗試合併「%.*s」"
#: sequencer.c
msgid "merge: Unable to write new index file"
@@ -25877,7 +26032,7 @@ msgstr "意外的 stash 回應:'%s'"
#: sequencer.c
#, c-format
msgid "Could not create directory for '%s'"
-msgstr "不能為 '%s' 建立目錄"
+msgstr "無法建立「%s」的目錄"
#: sequencer.c
#, c-format
@@ -25923,7 +26078,7 @@ msgstr "autostash 引用是符號引用"
#: sequencer.c
msgid "could not detach HEAD"
-msgstr "不能分離開頭指標"
+msgstr "無法分離開頭指標"
#: sequencer.c
#, c-format
@@ -25950,7 +26105,7 @@ msgstr ""
"無法執行待辦指令\n"
"\n"
" %.*s\n"
-"已被重新安排,在繼續之前編輯指令,請先編輯待辦列表:\n"
+"已經重新安排。若要在繼續之前編輯指令,請先編輯待辦列表:\n"
"\n"
" git rebase --edit-todo\n"
" git rebase --continue\n"
@@ -25972,16 +26127,16 @@ msgstr "未知指令 %d"
#: sequencer.c
msgid "could not read orig-head"
-msgstr "不能讀取 orig-head"
+msgstr "無法讀取 orig-head"
#: sequencer.c
msgid "could not read 'onto'"
-msgstr "不能讀取 'onto'"
+msgstr "無法讀取「onto」"
#: sequencer.c
#, c-format
msgid "could not update HEAD to %s"
-msgstr "不能更新 HEAD 為 %s"
+msgstr "無法將 HEAD 更新到 %s"
#: sequencer.c
#, c-format
@@ -26018,15 +26173,15 @@ msgstr ""
#: sequencer.c
#, c-format
msgid "could not write file: '%s'"
-msgstr "不能寫入檔案:'%s'"
+msgstr "無法寫入檔案:「%s」"
#: sequencer.c
msgid "could not remove CHERRY_PICK_HEAD"
-msgstr "不能刪除 CHERRY_PICK_HEAD"
+msgstr "無法刪除 CHERRY_PICK_HEAD"
#: sequencer.c
msgid "could not commit staged changes."
-msgstr "不能提交暫存的修改。"
+msgstr "無法提交暫存的修改。"
#: sequencer.c
#, c-format
@@ -26446,7 +26601,7 @@ msgstr "忽略可能被解析為命令列選項的 '%s':%s"
#: submodule-config.c
#, c-format
msgid "Could not update .gitmodules entry %s"
-msgstr "不能更新 .gitmodules 條目 %s"
+msgstr "無法更新 .gitmodules 條目 %s"
#: submodule.c
msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
@@ -26498,7 +26653,7 @@ msgstr "子模組條目 '%s'(%s)是一個 %s,不是一個提交"
msgid ""
"Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
"submodule %s"
-msgstr "無法在 %s 子模組執行 'git rev-list <提交> --not --remotes -n 1' 命令"
+msgstr "無法在 %s 子模組執行「git rev-list <提交> --not --remotes -n 1」命令"
#: submodule.c
#, c-format
@@ -26552,7 +26707,7 @@ msgstr "無法將 '%s' 識別為一個 git 版本庫"
#: submodule.c
#, c-format
msgid "Could not run 'git status --porcelain=2' in submodule %s"
-msgstr "無法在 %s 子模組執行 'git status --porcelain=2'"
+msgstr "無法在 %s 子模組執行「git status --porcelain=2」"
#: submodule.c
#, c-format
@@ -26562,17 +26717,17 @@ msgstr "%s 子模組執行 'git status --porcelain=2' 失敗"
#: submodule.c
#, c-format
msgid "could not start 'git status' in submodule '%s'"
-msgstr "無法在子模組 '%s' 中啟動 'git status'"
+msgstr "無法在子模組「%s」中啟動「git status」"
#: submodule.c
#, c-format
msgid "could not run 'git status' in submodule '%s'"
-msgstr "無法在子模組 '%s' 中執行 'git status'"
+msgstr "無法在子模組「%s」中執行「git status」"
#: submodule.c
#, c-format
msgid "Could not unset core.worktree setting in submodule '%s'"
-msgstr "無法在子模組 '%s' 中取消 core.worktree 的設定"
+msgstr "無法在子模組「%s」中取消 core.worktree 的設定"
#: submodule.c
#, c-format
@@ -26617,7 +26772,7 @@ msgstr "不支援對有多個工作區的子模組 '%s' 執行 relocate_gitdir"
#: submodule.c
#, c-format
msgid "could not lookup name for submodule '%s'"
-msgstr "不能查詢子模組 '%s' 的名稱"
+msgstr "無法查詢子模組「%s」的名稱"
#: submodule.c
#, c-format
@@ -26678,6 +26833,10 @@ msgstr "提交 %s 沒有標記為可以取得"
msgid "too many commits marked reachable"
msgstr "太多提交標記為可以取得"
+#: t/helper/test-read-midx.c
+msgid "could not determine MIDX preferred pack"
+msgstr "無法確定 MIDX 偏好的封裝"
+
#: t/helper/test-serve-v2.c
msgid "test-tool serve-v2 [<options>]"
msgstr "test-tool serve-v2 [<選項>]"
@@ -26833,7 +26992,7 @@ msgstr "%s 也鎖定了 %s"
#: transport-helper.c
msgid "couldn't run fast-import"
-msgstr "不能執行 fast-import"
+msgstr "無法執行 fast-import"
#: transport-helper.c
msgid "error while running fast-import"
@@ -27014,7 +27173,7 @@ msgstr "伺服器不支援「等待完成」(wait-for-done) 功能"
#: transport.c
msgid "could not parse transport.color.* config"
-msgstr "不能解析 transport.color.* 設定"
+msgstr "無法解析 transport.color.* 組態"
#: transport.c
msgid "support for protocol v2 not implemented yet"
@@ -27453,6 +27612,10 @@ msgid ".git file incorrect"
msgstr ".git 檔案不正確"
#: worktree.c
+msgid ".git file absolute/relative path mismatch"
+msgstr ".git 檔案的絕對或相對路徑不一致"
+
+#: worktree.c
msgid "not a valid path"
msgstr "非有效路徑"
@@ -27473,6 +27636,10 @@ msgid "gitdir unreadable"
msgstr "無法讀取 gitdir"
#: worktree.c
+msgid "gitdir absolute/relative path mismatch"
+msgstr "gitdir 的絕對或相對路徑不一致"
+
+#: worktree.c
msgid "gitdir incorrect"
msgstr "不正確的 gitdir"
@@ -27516,10 +27683,18 @@ msgstr "無法取消在「%2$s」設定的 %1$s"
msgid "failed to set extensions.worktreeConfig setting"
msgstr "無法設定 extensions.worktreeConfig 設定"
+#: worktree.c
+msgid "unable to upgrade repository format to support relative worktrees"
+msgstr "無法升級版本庫格式,以支援相對路徑工作區"
+
+#: worktree.c
+msgid "unable to set extensions.relativeWorktrees setting"
+msgstr "無法設定 extensions.relativeWorktrees 設定"
+
#: wrapper.c
#, c-format
msgid "could not setenv '%s'"
-msgstr "無法 setenv '%s'"
+msgstr "無法 setenv「%s」"
#: wrapper.c
#, c-format
@@ -27529,7 +27704,7 @@ msgstr "不能建立 '%s'"
#: wrapper.c
#, c-format
msgid "could not open '%s' for reading and writing"
-msgstr "無法開啟 '%s' 進行讀寫"
+msgstr "無法開啟「%s」進行讀寫"
#: wrapper.c
#, c-format
@@ -28582,6 +28757,24 @@ msgstr "略過 %s 含備份後綴 '%s'。\n"
msgid "Do you really want to send %s? [y|N]: "
msgstr "您真的要傳送 %s?[y|N]: "
+#, c-format
+#~ msgid "preferred pack (%s) is invalid"
+#~ msgstr "偏好的封包 (%s) 無效"
+
+#, c-format
+#~ msgid ""
+#~ "more than %i tags found; listed %i most recent\n"
+#~ "gave up search at %s\n"
+#~ msgstr ""
+#~ "發現多於 %i 個標籤,列出最近的 %i 個\n"
+#~ "在 %s 放棄搜尋\n"
+
+#~ msgid "Public key pinning not supported with cURL < 7.39.0"
+#~ msgstr "不支援公鑰檔案鎖定,因為 cURL < 7.39.0"
+
+#~ msgid "CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"
+#~ msgstr "不支援 CURLSSLOPT_NO_REVOKE,因為 cURL < 7.44.0"
+
#~ msgid "revision walk setup failed\n"
#~ msgstr "修訂版遍歷設定失敗\n"
diff --git a/preload-index.c b/preload-index.c
index ab94d6f399..40ab2abafb 100644
--- a/preload-index.c
+++ b/preload-index.c
@@ -132,7 +132,9 @@ void preload_index(struct index_state *index,
memset(&pd, 0, sizeof(pd));
if (refresh_flags & REFRESH_PROGRESS && isatty(2)) {
- pd.progress = start_delayed_progress(_("Refreshing index"), index->cache_nr);
+ pd.progress = start_delayed_progress(the_repository,
+ _("Refreshing index"),
+ index->cache_nr);
pthread_mutex_init(&pd.mutex, NULL);
}
diff --git a/prio-queue.h b/prio-queue.h
index 36f370625f..38d032636d 100644
--- a/prio-queue.h
+++ b/prio-queue.h
@@ -22,13 +22,13 @@
typedef int (*prio_queue_compare_fn)(const void *one, const void *two, void *cb_data);
struct prio_queue_entry {
- unsigned ctr;
+ size_t ctr;
void *data;
};
struct prio_queue {
prio_queue_compare_fn compare;
- unsigned insertion_ctr;
+ size_t insertion_ctr;
void *cb_data;
size_t alloc, nr;
struct prio_queue_entry *array;
diff --git a/progress.c b/progress.c
index a8fdfceb5c..8d5ae70f3a 100644
--- a/progress.c
+++ b/progress.c
@@ -9,7 +9,6 @@
*/
#define GIT_TEST_PROGRESS_ONLY
-#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
@@ -37,6 +36,7 @@ struct throughput {
};
struct progress {
+ struct repository *repo;
const char *title;
uint64_t last_value;
uint64_t total;
@@ -254,10 +254,12 @@ void display_progress(struct progress *progress, uint64_t n)
display(progress, n, NULL);
}
-static struct progress *start_progress_delay(const char *title, uint64_t total,
+static struct progress *start_progress_delay(struct repository *r,
+ const char *title, uint64_t total,
unsigned delay, unsigned sparse)
{
struct progress *progress = xmalloc(sizeof(*progress));
+ progress->repo = r;
progress->title = title;
progress->total = total;
progress->last_value = -1;
@@ -270,7 +272,7 @@ static struct progress *start_progress_delay(const char *title, uint64_t total,
progress->title_len = utf8_strwidth(title);
progress->split = 0;
set_progress_signal();
- trace2_region_enter("progress", title, the_repository);
+ trace2_region_enter("progress", title, r);
return progress;
}
@@ -284,14 +286,16 @@ static int get_default_delay(void)
return delay_in_secs;
}
-struct progress *start_delayed_progress(const char *title, uint64_t total)
+struct progress *start_delayed_progress(struct repository *r,
+ const char *title, uint64_t total)
{
- return start_progress_delay(title, total, get_default_delay(), 0);
+ return start_progress_delay(r, title, total, get_default_delay(), 0);
}
-struct progress *start_progress(const char *title, uint64_t total)
+struct progress *start_progress(struct repository *r,
+ const char *title, uint64_t total)
{
- return start_progress_delay(title, total, 0, 0);
+ return start_progress_delay(r, title, total, 0, 0);
}
/*
@@ -303,15 +307,17 @@ struct progress *start_progress(const char *title, uint64_t total)
* When "sparse" is set, stop_progress() will automatically force the done
* message to show 100%.
*/
-struct progress *start_sparse_progress(const char *title, uint64_t total)
+struct progress *start_sparse_progress(struct repository *r,
+ const char *title, uint64_t total)
{
- return start_progress_delay(title, total, 0, 1);
+ return start_progress_delay(r, title, total, 0, 1);
}
-struct progress *start_delayed_sparse_progress(const char *title,
+struct progress *start_delayed_sparse_progress(struct repository *r,
+ const char *title,
uint64_t total)
{
- return start_progress_delay(title, total, get_default_delay(), 1);
+ return start_progress_delay(r, title, total, get_default_delay(), 1);
}
static void finish_if_sparse(struct progress *progress)
@@ -341,14 +347,14 @@ static void force_last_update(struct progress *progress, const char *msg)
static void log_trace2(struct progress *progress)
{
- trace2_data_intmax("progress", the_repository, "total_objects",
+ trace2_data_intmax("progress", progress->repo, "total_objects",
progress->total);
if (progress->throughput)
- trace2_data_intmax("progress", the_repository, "total_bytes",
+ trace2_data_intmax("progress", progress->repo, "total_bytes",
progress->throughput->curr_total);
- trace2_region_leave("progress", progress->title, the_repository);
+ trace2_region_leave("progress", progress->title, progress->repo);
}
void stop_progress_msg(struct progress **p_progress, const char *msg)
diff --git a/progress.h b/progress.h
index 3a945637c8..ed068c7bab 100644
--- a/progress.h
+++ b/progress.h
@@ -3,6 +3,7 @@
#include "gettext.h"
struct progress;
+struct repository;
#ifdef GIT_TEST_PROGRESS_ONLY
@@ -14,10 +15,14 @@ void progress_test_force_update(void);
void display_throughput(struct progress *progress, uint64_t total);
void display_progress(struct progress *progress, uint64_t n);
-struct progress *start_progress(const char *title, uint64_t total);
-struct progress *start_sparse_progress(const char *title, uint64_t total);
-struct progress *start_delayed_progress(const char *title, uint64_t total);
-struct progress *start_delayed_sparse_progress(const char *title,
+struct progress *start_progress(struct repository *r,
+ const char *title, uint64_t total);
+struct progress *start_sparse_progress(struct repository *r,
+ const char *title, uint64_t total);
+struct progress *start_delayed_progress(struct repository *r,
+ const char *title, uint64_t total);
+struct progress *start_delayed_sparse_progress(struct repository *r,
+ const char *title,
uint64_t total);
void stop_progress_msg(struct progress **p_progress, const char *msg);
static inline void stop_progress(struct progress **p_progress)
diff --git a/prune-packed.c b/prune-packed.c
index d1c65ab10e..7dad2fc0c1 100644
--- a/prune-packed.c
+++ b/prune-packed.c
@@ -37,7 +37,8 @@ static int prune_object(const struct object_id *oid, const char *path,
void prune_packed_objects(int opts)
{
if (opts & PRUNE_PACKED_VERBOSE)
- progress = start_delayed_progress(_("Removing duplicate objects"), 256);
+ progress = start_delayed_progress(the_repository,
+ _("Removing duplicate objects"), 256);
for_each_loose_file_in_objdir(repo_get_object_directory(the_repository),
prune_object, NULL, prune_subdir, &opts);
diff --git a/pseudo-merge.c b/pseudo-merge.c
index 971f54cfe1..893b763fe4 100644
--- a/pseudo-merge.c
+++ b/pseudo-merge.c
@@ -459,7 +459,8 @@ void select_pseudo_merges(struct bitmap_writer *writer)
return;
if (writer->show_progress)
- progress = start_progress("Selecting pseudo-merge commits",
+ progress = start_progress(the_repository,
+ "Selecting pseudo-merge commits",
writer->pseudo_merge_groups.nr);
refs_for_each_ref(get_main_ref_store(the_repository),
diff --git a/read-cache.c b/read-cache.c
index 15d79839c2..7ef01c3806 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1523,7 +1523,8 @@ int refresh_index(struct index_state *istate, unsigned int flags,
int t2_sum_scan = 0;
if (flags & REFRESH_PROGRESS && isatty(2))
- progress = start_delayed_progress(_("Refresh index"),
+ progress = start_delayed_progress(the_repository,
+ _("Refresh index"),
istate->cache_nr);
trace_performance_enter();
@@ -1716,7 +1717,7 @@ int verify_ce_order;
static int verify_hdr(const struct cache_header *hdr, unsigned long size)
{
- git_hash_ctx c;
+ struct git_hash_ctx c;
unsigned char hash[GIT_MAX_RAWSZ];
int hdr_version;
unsigned char *start, *end;
@@ -1738,8 +1739,8 @@ static int verify_hdr(const struct cache_header *hdr, unsigned long size)
return 0;
the_hash_algo->init_fn(&c);
- the_hash_algo->update_fn(&c, hdr, size - the_hash_algo->rawsz);
- the_hash_algo->final_fn(hash, &c);
+ git_hash_update(&c, hdr, size - the_hash_algo->rawsz);
+ git_hash_final(hash, &c);
if (!hasheq(hash, start, the_repository->hash_algo))
return error(_("bad index file sha1 signature"));
return 0;
@@ -1753,7 +1754,7 @@ static int read_index_extension(struct index_state *istate,
istate->cache_tree = cache_tree_read(data, sz);
break;
case CACHE_EXT_RESOLVE_UNDO:
- istate->resolve_undo = resolve_undo_read(data, sz);
+ istate->resolve_undo = resolve_undo_read(data, sz, the_hash_algo);
break;
case CACHE_EXT_LINK:
if (read_link_extension(istate, data, sz))
@@ -2001,7 +2002,7 @@ static struct index_entry_offset_table *read_ieot_extension(const char *mmap, si
static void write_ieot_extension(struct strbuf *sb, struct index_entry_offset_table *ieot);
static size_t read_eoie_extension(const char *mmap, size_t mmap_size);
-static void write_eoie_extension(struct strbuf *sb, git_hash_ctx *eoie_context, size_t offset);
+static void write_eoie_extension(struct strbuf *sb, struct git_hash_ctx *eoie_context, size_t offset);
struct load_index_extensions
{
@@ -2565,7 +2566,7 @@ int repo_index_has_changes(struct repository *repo,
}
static int write_index_ext_header(struct hashfile *f,
- git_hash_ctx *eoie_f,
+ struct git_hash_ctx *eoie_f,
unsigned int ext,
unsigned int sz)
{
@@ -2575,8 +2576,8 @@ static int write_index_ext_header(struct hashfile *f,
if (eoie_f) {
ext = htonl(ext);
sz = htonl(sz);
- the_hash_algo->update_fn(eoie_f, &ext, sizeof(ext));
- the_hash_algo->update_fn(eoie_f, &sz, sizeof(sz));
+ git_hash_update(eoie_f, &ext, sizeof(ext));
+ git_hash_update(eoie_f, &sz, sizeof(sz));
}
return 0;
}
@@ -2830,7 +2831,7 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
{
uint64_t start = getnanotime();
struct hashfile *f;
- git_hash_ctx *eoie_c = NULL;
+ struct git_hash_ctx *eoie_c = NULL;
struct cache_header hdr;
int i, err = 0, removed, extended, hdr_version;
struct cache_entry **cache = istate->cache;
@@ -3032,7 +3033,7 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
istate->resolve_undo) {
strbuf_reset(&sb);
- resolve_undo_write(&sb, istate->resolve_undo);
+ resolve_undo_write(&sb, istate->resolve_undo, the_hash_algo);
err = write_index_ext_header(f, eoie_c, CACHE_EXT_RESOLVE_UNDO,
sb.len) < 0;
hashwrite(f, sb.buf, sb.len);
@@ -3578,7 +3579,7 @@ static size_t read_eoie_extension(const char *mmap, size_t mmap_size)
uint32_t extsize;
size_t offset, src_offset;
unsigned char hash[GIT_MAX_RAWSZ];
- git_hash_ctx c;
+ struct git_hash_ctx c;
/* ensure we have an index big enough to contain an EOIE extension */
if (mmap_size < sizeof(struct cache_header) + EOIE_SIZE_WITH_HEADER + the_hash_algo->rawsz)
@@ -3633,12 +3634,12 @@ static size_t read_eoie_extension(const char *mmap, size_t mmap_size)
if (src_offset + 8 + extsize < src_offset)
return 0;
- the_hash_algo->update_fn(&c, mmap + src_offset, 8);
+ git_hash_update(&c, mmap + src_offset, 8);
src_offset += 8;
src_offset += extsize;
}
- the_hash_algo->final_fn(hash, &c);
+ git_hash_final(hash, &c);
if (!hasheq(hash, (const unsigned char *)index, the_repository->hash_algo))
return 0;
@@ -3649,7 +3650,7 @@ static size_t read_eoie_extension(const char *mmap, size_t mmap_size)
return offset;
}
-static void write_eoie_extension(struct strbuf *sb, git_hash_ctx *eoie_context, size_t offset)
+static void write_eoie_extension(struct strbuf *sb, struct git_hash_ctx *eoie_context, size_t offset)
{
uint32_t buffer;
unsigned char hash[GIT_MAX_RAWSZ];
@@ -3659,7 +3660,7 @@ static void write_eoie_extension(struct strbuf *sb, git_hash_ctx *eoie_context,
strbuf_add(sb, &buffer, sizeof(uint32_t));
/* hash */
- the_hash_algo->final_fn(hash, eoie_context);
+ git_hash_final(hash, eoie_context);
strbuf_add(sb, hash, the_hash_algo->rawsz);
}
diff --git a/ref-filter.c b/ref-filter.c
index 23054694c2..6da8d4c03b 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -235,6 +235,10 @@ static struct used_atom {
enum { S_BARE, S_GRADE, S_SIGNER, S_KEY,
S_FINGERPRINT, S_PRI_KEY_FP, S_TRUST_LEVEL } option;
} signature;
+ struct {
+ char *name;
+ struct commit *commit;
+ } base;
struct strvec describe_args;
struct refname_atom refname;
char *head;
@@ -891,35 +895,30 @@ static int rest_atom_parser(struct ref_format *format UNUSED,
return 0;
}
-static int ahead_behind_atom_parser(struct ref_format *format,
- struct used_atom *atom UNUSED,
+static int ahead_behind_atom_parser(struct ref_format *format UNUSED,
+ struct used_atom *atom,
const char *arg, struct strbuf *err)
{
- struct string_list_item *item;
-
if (!arg)
return strbuf_addf_ret(err, -1, _("expected format: %%(ahead-behind:<committish>)"));
- item = string_list_append(&format->bases, arg);
- item->util = lookup_commit_reference_by_name(arg);
- if (!item->util)
+ atom->u.base.commit = lookup_commit_reference_by_name(arg);
+ if (!atom->u.base.commit)
die("failed to find '%s'", arg);
return 0;
}
-static int is_base_atom_parser(struct ref_format *format,
- struct used_atom *atom UNUSED,
+static int is_base_atom_parser(struct ref_format *format UNUSED,
+ struct used_atom *atom,
const char *arg, struct strbuf *err)
{
- struct string_list_item *item;
-
if (!arg)
return strbuf_addf_ret(err, -1, _("expected format: %%(is-base:<committish>)"));
- item = string_list_append(&format->is_base_tips, arg);
- item->util = lookup_commit_reference_by_name(arg);
- if (!item->util)
+ atom->u.base.name = xstrdup(arg);
+ atom->u.base.commit = lookup_commit_reference_by_name(arg);
+ if (!atom->u.base.commit)
die("failed to find '%s'", arg);
return 0;
@@ -3009,6 +3008,8 @@ void ref_array_clear(struct ref_array *array)
free(atom->u.head);
else if (atom->atom_type == ATOM_DESCRIBE)
strvec_clear(&atom->u.describe_args);
+ else if (atom->atom_type == ATOM_ISBASE)
+ free(atom->u.base.name);
else if (atom->atom_type == ATOM_TRAILERS ||
(atom->atom_type == ATOM_CONTENTS &&
atom->u.contents.option == C_TRAILERS)) {
@@ -3041,7 +3042,7 @@ static void reach_filter(struct ref_array *array,
struct commit_list **check_reachable,
int include_reached)
{
- int i, old_nr;
+ size_t i, old_nr;
struct commit **to_clear;
if (!*check_reachable)
@@ -3084,22 +3085,30 @@ static void reach_filter(struct ref_array *array,
}
void filter_ahead_behind(struct repository *r,
- struct ref_format *format,
struct ref_array *array)
{
struct commit **commits;
- size_t commits_nr = format->bases.nr + array->nr;
+ size_t bases_nr, commits_nr;
+
+ if (!array->nr)
+ return;
- if (!format->bases.nr || !array->nr)
+ for (size_t i = bases_nr = 0; i < used_atom_cnt; i++) {
+ if (used_atom[i].atom_type == ATOM_AHEADBEHIND)
+ bases_nr++;
+ }
+ if (!bases_nr)
return;
- ALLOC_ARRAY(commits, commits_nr);
- for (size_t i = 0; i < format->bases.nr; i++)
- commits[i] = format->bases.items[i].util;
+ ALLOC_ARRAY(commits, st_add(bases_nr, array->nr));
+ for (size_t i = 0, j = 0; i < used_atom_cnt; i++) {
+ if (used_atom[i].atom_type == ATOM_AHEADBEHIND)
+ commits[j++] = used_atom[i].u.base.commit;
+ }
- ALLOC_ARRAY(array->counts, st_mult(format->bases.nr, array->nr));
+ ALLOC_ARRAY(array->counts, st_mult(bases_nr, array->nr));
- commits_nr = format->bases.nr;
+ commits_nr = bases_nr;
array->counts_nr = 0;
for (size_t i = 0; i < array->nr; i++) {
const char *name = array->items[i]->refname;
@@ -3108,8 +3117,8 @@ void filter_ahead_behind(struct repository *r,
if (!commits[commits_nr])
continue;
- CALLOC_ARRAY(array->items[i]->counts, format->bases.nr);
- for (size_t j = 0; j < format->bases.nr; j++) {
+ CALLOC_ARRAY(array->items[i]->counts, bases_nr);
+ for (size_t j = 0; j < bases_nr; j++) {
struct ahead_behind_count *count;
count = &array->counts[array->counts_nr++];
count->tip_index = commits_nr;
@@ -3125,14 +3134,20 @@ void filter_ahead_behind(struct repository *r,
}
void filter_is_base(struct repository *r,
- struct ref_format *format,
struct ref_array *array)
{
struct commit **bases;
- size_t bases_nr = 0;
+ size_t bases_nr = 0, is_base_nr;
struct ref_array_item **back_index;
- if (!format->is_base_tips.nr || !array->nr)
+ if (!array->nr)
+ return;
+
+ for (size_t i = is_base_nr = 0; i < used_atom_cnt; i++) {
+ if (used_atom[i].atom_type == ATOM_ISBASE)
+ is_base_nr++;
+ }
+ if (!is_base_nr)
return;
CALLOC_ARRAY(back_index, array->nr);
@@ -3142,7 +3157,7 @@ void filter_is_base(struct repository *r,
const char *name = array->items[i]->refname;
struct commit *c = lookup_commit_reference_by_name_gently(name, 1);
- CALLOC_ARRAY(array->items[i]->is_base, format->is_base_tips.nr);
+ CALLOC_ARRAY(array->items[i]->is_base, is_base_nr);
if (!c)
continue;
@@ -3152,15 +3167,20 @@ void filter_is_base(struct repository *r,
bases_nr++;
}
- for (size_t i = 0; i < format->is_base_tips.nr; i++) {
- struct commit *tip = format->is_base_tips.items[i].util;
- int base_index = get_branch_base_for_tip(r, tip, bases, bases_nr);
+ for (size_t i = 0, j = 0; i < used_atom_cnt; i++) {
+ struct commit *tip;
+ int base_index;
+
+ if (used_atom[i].atom_type != ATOM_ISBASE)
+ continue;
+ tip = used_atom[i].u.base.commit;
+ base_index = get_branch_base_for_tip(r, tip, bases, bases_nr);
if (base_index < 0)
continue;
/* Store the string for use in output later. */
- back_index[base_index]->is_base[i] = xstrdup(format->is_base_tips.items[i].string);
+ back_index[base_index]->is_base[j++] = xstrdup(used_atom[i].u.base.name);
}
free(back_index);
@@ -3252,8 +3272,7 @@ struct ref_sorting {
};
static inline int can_do_iterative_format(struct ref_filter *filter,
- struct ref_sorting *sorting,
- struct ref_format *format)
+ struct ref_sorting *sorting)
{
/*
* Reference backends sort patterns lexicographically by refname, so if
@@ -3277,17 +3296,20 @@ static inline int can_do_iterative_format(struct ref_filter *filter,
* - filtering on reachability
* - including ahead-behind information in the formatted output
*/
- return !(filter->reachable_from ||
- filter->unreachable_from ||
- format->bases.nr ||
- format->is_base_tips.nr);
+ for (size_t i = 0; i < used_atom_cnt; i++) {
+ if (used_atom[i].atom_type == ATOM_AHEADBEHIND)
+ return 0;
+ if (used_atom[i].atom_type == ATOM_ISBASE)
+ return 0;
+ }
+ return !(filter->reachable_from || filter->unreachable_from);
}
void filter_and_format_refs(struct ref_filter *filter, unsigned int type,
struct ref_sorting *sorting,
struct ref_format *format)
{
- if (can_do_iterative_format(filter, sorting, format)) {
+ if (can_do_iterative_format(filter, sorting)) {
int save_commit_buffer_orig;
struct ref_filter_and_format_cbdata ref_cbdata = {
.filter = filter,
@@ -3303,8 +3325,8 @@ void filter_and_format_refs(struct ref_filter *filter, unsigned int type,
} else {
struct ref_array array = { 0 };
filter_refs(&array, filter, type);
- filter_ahead_behind(the_repository, format, &array);
- filter_is_base(the_repository, format, &array);
+ filter_ahead_behind(the_repository, &array);
+ filter_is_base(the_repository, &array);
ref_array_sort(sorting, &array);
print_formatted_ref_array(&array, format);
ref_array_clear(&array);
@@ -3638,16 +3660,3 @@ void ref_filter_clear(struct ref_filter *filter)
free_commit_list(filter->unreachable_from);
ref_filter_init(filter);
}
-
-void ref_format_init(struct ref_format *format)
-{
- struct ref_format blank = REF_FORMAT_INIT;
- memcpy(format, &blank, sizeof(blank));
-}
-
-void ref_format_clear(struct ref_format *format)
-{
- string_list_clear(&format->bases, 0);
- string_list_clear(&format->is_base_tips, 0);
- ref_format_init(format);
-}
diff --git a/ref-filter.h b/ref-filter.h
index 754038ab07..013d4cfa64 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -99,12 +99,6 @@ struct ref_format {
/* Internal state to ref-filter */
int need_color_reset_at_eol;
- /* List of bases for ahead-behind counts. */
- struct string_list bases;
-
- /* List of bases for is-base indicators. */
- struct string_list is_base_tips;
-
struct {
int max_count;
int omit_empty;
@@ -117,8 +111,6 @@ struct ref_format {
}
#define REF_FORMAT_INIT { \
.use_color = -1, \
- .bases = STRING_LIST_INIT_DUP, \
- .is_base_tips = STRING_LIST_INIT_DUP, \
}
/* Macros for checking --merged and --no-merged options */
@@ -205,7 +197,6 @@ struct ref_array_item *ref_array_push(struct ref_array *array,
* If this is not called, then any ahead-behind atoms will be blank.
*/
void filter_ahead_behind(struct repository *r,
- struct ref_format *format,
struct ref_array *array);
/*
@@ -215,13 +206,9 @@ void filter_ahead_behind(struct repository *r,
* If this is not called, then any is-base atoms will be blank.
*/
void filter_is_base(struct repository *r,
- struct ref_format *format,
struct ref_array *array);
void ref_filter_init(struct ref_filter *filter);
void ref_filter_clear(struct ref_filter *filter);
-void ref_format_init(struct ref_format *format);
-void ref_format_clear(struct ref_format *format);
-
#endif /* REF_FILTER_H */
diff --git a/refs.c b/refs.c
index 0f41b2fd4a..e1a6a2d189 100644
--- a/refs.c
+++ b/refs.c
@@ -1318,19 +1318,27 @@ int ref_transaction_update(struct ref_transaction *transaction,
return 0;
}
-int ref_transaction_update_reflog(struct ref_transaction *transaction,
- const char *refname,
- const struct object_id *new_oid,
- const struct object_id *old_oid,
- const char *committer_info, unsigned int flags,
- const char *msg, unsigned int index,
- struct strbuf *err)
+/*
+ * Similar to`ref_transaction_update`, but this function is only for adding
+ * a reflog update. Supports providing custom committer information. The index
+ * field can be utiltized to order updates as desired. When not used, the
+ * updates default to being ordered by refname.
+ */
+static int ref_transaction_update_reflog(struct ref_transaction *transaction,
+ const char *refname,
+ const struct object_id *new_oid,
+ const struct object_id *old_oid,
+ const char *committer_info,
+ unsigned int flags,
+ const char *msg,
+ uint64_t index,
+ struct strbuf *err)
{
struct ref_update *update;
assert(err);
- flags |= REF_LOG_ONLY | REF_NO_DEREF;
+ flags |= REF_LOG_ONLY | REF_FORCE_CREATE_REFLOG | REF_NO_DEREF;
if (!transaction_refname_valid(refname, new_oid, flags, err))
return -1;
@@ -1345,6 +1353,13 @@ int ref_transaction_update_reflog(struct ref_transaction *transaction,
update->flags &= ~REF_HAVE_OLD;
update->index = index;
+ /*
+ * Reference backends may need to know the max index to optimize
+ * their writes. So we store the max_index on the transaction level.
+ */
+ if (index > transaction->max_index)
+ transaction->max_index = index;
+
return 0;
}
@@ -2798,7 +2813,7 @@ done:
}
struct reflog_migration_data {
- unsigned int index;
+ uint64_t index;
const char *refname;
struct ref_store *old_refs;
struct ref_transaction *transaction;
diff --git a/refs.h b/refs.h
index a0cdd99250..09be47afbe 100644
--- a/refs.h
+++ b/refs.h
@@ -772,20 +772,6 @@ int ref_transaction_update(struct ref_transaction *transaction,
struct strbuf *err);
/*
- * Similar to`ref_transaction_update`, but this function is only for adding
- * a reflog update. Supports providing custom committer information. The index
- * field can be utiltized to order updates as desired. When not used, the
- * updates default to being ordered by refname.
- */
-int ref_transaction_update_reflog(struct ref_transaction *transaction,
- const char *refname,
- const struct object_id *new_oid,
- const struct object_id *old_oid,
- const char *committer_info, unsigned int flags,
- const char *msg, unsigned int index,
- struct strbuf *err);
-
-/*
* Add a reference creation to transaction. new_oid is the value that
* the reference should have after the update; it must not be
* null_oid. It is verified that the reference does not exist
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 5cfb8b7ca8..29f08dced4 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -2615,9 +2615,6 @@ static int lock_ref_for_update(struct files_ref_store *refs,
update->backend_data = lock;
- if (update->flags & REF_LOG_ONLY)
- goto out;
-
if (update->type & REF_ISSYMREF) {
if (update->flags & REF_NO_DEREF) {
/*
diff --git a/refs/refs-internal.h b/refs/refs-internal.h
index 16550862d3..8894b43d1d 100644
--- a/refs/refs-internal.h
+++ b/refs/refs-internal.h
@@ -120,7 +120,7 @@ struct ref_update {
* when migrating reflogs and we want to ensure we carry over the
* same order.
*/
- unsigned int index;
+ uint64_t index;
/*
* If this ref_update was split off of a symref update via
@@ -203,6 +203,7 @@ struct ref_transaction {
enum ref_transaction_state state;
void *backend_data;
unsigned int flags;
+ uint64_t max_index;
};
/*
diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c
index 00d95a9a2f..7e90e13f74 100644
--- a/refs/reftable-backend.c
+++ b/refs/reftable-backend.c
@@ -942,6 +942,7 @@ struct write_transaction_table_arg {
size_t updates_nr;
size_t updates_alloc;
size_t updates_expected;
+ uint64_t max_index;
};
struct reftable_transaction_data {
@@ -1019,6 +1020,7 @@ static int prepare_transaction_update(struct write_transaction_table_arg **out,
arg->updates_nr = 0;
arg->updates_alloc = 0;
arg->updates_expected = 0;
+ arg->max_index = 0;
}
arg->updates_expected++;
@@ -1428,7 +1430,6 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
struct reftable_log_record *logs = NULL;
struct ident_split committer_ident = {0};
size_t logs_nr = 0, logs_alloc = 0, i;
- uint64_t max_update_index = ts;
const char *committer_info;
int ret = 0;
@@ -1438,7 +1439,14 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
QSORT(arg->updates, arg->updates_nr, transaction_update_cmp);
- reftable_writer_set_limits(writer, ts, ts);
+ /*
+ * During reflog migration, we add indexes for a single reflog with
+ * multiple entries. Each entry will contain a different update_index,
+ * so set the limits accordingly.
+ */
+ ret = reftable_writer_set_limits(writer, ts, ts + arg->max_index);
+ if (ret < 0)
+ goto done;
for (i = 0; i < arg->updates_nr; i++) {
struct reftable_transaction_update *tx_update = &arg->updates[i];
@@ -1540,12 +1548,6 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
*/
log->update_index = ts + u->index;
- /*
- * Note the max update_index so the limit can be set later on.
- */
- if (log->update_index > max_update_index)
- max_update_index = log->update_index;
-
log->refname = xstrdup(u->refname);
memcpy(log->value.update.new_hash,
u->new_oid.hash, GIT_MAX_RAWSZ);
@@ -1609,8 +1611,6 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
* and log blocks.
*/
if (logs) {
- reftable_writer_set_limits(writer, ts, max_update_index);
-
ret = reftable_writer_add_logs(writer, logs, logs_nr);
if (ret < 0)
goto done;
@@ -1632,6 +1632,8 @@ static int reftable_be_transaction_finish(struct ref_store *ref_store UNUSED,
int ret = 0;
for (size_t i = 0; i < tx_data->args_nr; i++) {
+ tx_data->args[i].max_index = transaction->max_index;
+
ret = reftable_addition_add(tx_data->args[i].addition,
write_transaction_table, &tx_data->args[i]);
if (ret < 0)
@@ -1766,7 +1768,9 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
deletion_ts = creation_ts = reftable_stack_next_update_index(arg->be->stack);
if (arg->delete_old)
creation_ts++;
- reftable_writer_set_limits(writer, deletion_ts, creation_ts);
+ ret = reftable_writer_set_limits(writer, deletion_ts, creation_ts);
+ if (ret < 0)
+ goto done;
/*
* Add the new reference. If this is a rename then we also delete the
@@ -2298,7 +2302,9 @@ static int write_reflog_existence_table(struct reftable_writer *writer,
if (ret <= 0)
goto done;
- reftable_writer_set_limits(writer, ts, ts);
+ ret = reftable_writer_set_limits(writer, ts, ts);
+ if (ret < 0)
+ goto done;
/*
* The existence entry has both old and new object ID set to the
@@ -2357,7 +2363,9 @@ static int write_reflog_delete_table(struct reftable_writer *writer, void *cb_da
uint64_t ts = reftable_stack_next_update_index(arg->stack);
int ret;
- reftable_writer_set_limits(writer, ts, ts);
+ ret = reftable_writer_set_limits(writer, ts, ts);
+ if (ret < 0)
+ goto out;
ret = reftable_stack_init_log_iterator(arg->stack, &it);
if (ret < 0)
@@ -2434,7 +2442,9 @@ static int write_reflog_expiry_table(struct reftable_writer *writer, void *cb_da
if (arg->records[i].value_type == REFTABLE_LOG_UPDATE)
live_records++;
- reftable_writer_set_limits(writer, ts, ts);
+ ret = reftable_writer_set_limits(writer, ts, ts);
+ if (ret < 0)
+ return ret;
if (!is_null_oid(&arg->update_oid)) {
struct reftable_ref_record ref = {0};
diff --git a/refspec.c b/refspec.c
index 6d86e04442..4cb80b5208 100644
--- a/refspec.c
+++ b/refspec.c
@@ -5,9 +5,11 @@
#include "gettext.h"
#include "hash.h"
#include "hex.h"
+#include "string-list.h"
#include "strvec.h"
#include "refs.h"
#include "refspec.h"
+#include "remote.h"
#include "strbuf.h"
/*
@@ -236,16 +238,6 @@ int valid_fetch_refspec(const char *fetch_refspec_str)
return ret;
}
-int valid_remote_name(const char *name)
-{
- int result;
- struct strbuf refspec = STRBUF_INIT;
- strbuf_addf(&refspec, "refs/heads/test:refs/remotes/%s/test", name);
- result = valid_fetch_refspec(refspec.buf);
- strbuf_release(&refspec);
- return result;
-}
-
void refspec_ref_prefixes(const struct refspec *rs,
struct strvec *ref_prefixes)
{
@@ -276,3 +268,204 @@ void refspec_ref_prefixes(const struct refspec *rs,
}
}
}
+
+int match_refname_with_pattern(const char *pattern, const char *refname,
+ const char *replacement, char **result)
+{
+ const char *kstar = strchr(pattern, '*');
+ size_t klen;
+ size_t ksuffixlen;
+ size_t namelen;
+ int ret;
+ if (!kstar)
+ die(_("pattern '%s' has no '*'"), pattern);
+ klen = kstar - pattern;
+ ksuffixlen = strlen(kstar + 1);
+ namelen = strlen(refname);
+ ret = !strncmp(refname, pattern, klen) && namelen >= klen + ksuffixlen &&
+ !memcmp(refname + namelen - ksuffixlen, kstar + 1, ksuffixlen);
+ if (ret && replacement) {
+ struct strbuf sb = STRBUF_INIT;
+ const char *vstar = strchr(replacement, '*');
+ if (!vstar)
+ die(_("replacement '%s' has no '*'"), replacement);
+ strbuf_add(&sb, replacement, vstar - replacement);
+ strbuf_add(&sb, refname + klen, namelen - klen - ksuffixlen);
+ strbuf_addstr(&sb, vstar + 1);
+ *result = strbuf_detach(&sb, NULL);
+ }
+ return ret;
+}
+
+static int refspec_match(const struct refspec_item *refspec,
+ const char *name)
+{
+ if (refspec->pattern)
+ return match_refname_with_pattern(refspec->src, name, NULL, NULL);
+
+ return !strcmp(refspec->src, name);
+}
+
+int refname_matches_negative_refspec_item(const char *refname, struct refspec *rs)
+{
+ int i;
+
+ for (i = 0; i < rs->nr; i++) {
+ if (rs->items[i].negative && refspec_match(&rs->items[i], refname))
+ return 1;
+ }
+ return 0;
+}
+
+static int refspec_find_negative_match(struct refspec *rs, struct refspec_item *query)
+{
+ int i, matched_negative = 0;
+ int find_src = !query->src;
+ struct string_list reversed = STRING_LIST_INIT_DUP;
+ const char *needle = find_src ? query->dst : query->src;
+
+ /*
+ * Check whether the queried ref matches any negative refpsec. If so,
+ * then we should ultimately treat this as not matching the query at
+ * all.
+ *
+ * Note that negative refspecs always match the source, but the query
+ * item uses the destination. To handle this, we apply pattern
+ * refspecs in reverse to figure out if the query source matches any
+ * of the negative refspecs.
+ *
+ * The first loop finds and expands all positive refspecs
+ * matched by the queried ref.
+ *
+ * The second loop checks if any of the results of the first loop
+ * match any negative refspec.
+ */
+ for (i = 0; i < rs->nr; i++) {
+ struct refspec_item *refspec = &rs->items[i];
+ char *expn_name;
+
+ if (refspec->negative)
+ continue;
+
+ /* Note the reversal of src and dst */
+ if (refspec->pattern) {
+ const char *key = refspec->dst ? refspec->dst : refspec->src;
+ const char *value = refspec->src;
+
+ if (match_refname_with_pattern(key, needle, value, &expn_name))
+ string_list_append_nodup(&reversed, expn_name);
+ } else if (refspec->matching) {
+ /* For the special matching refspec, any query should match */
+ string_list_append(&reversed, needle);
+ } else if (!refspec->src) {
+ BUG("refspec->src should not be null here");
+ } else if (!strcmp(needle, refspec->src)) {
+ string_list_append(&reversed, refspec->src);
+ }
+ }
+
+ for (i = 0; !matched_negative && i < reversed.nr; i++) {
+ if (refname_matches_negative_refspec_item(reversed.items[i].string, rs))
+ matched_negative = 1;
+ }
+
+ string_list_clear(&reversed, 0);
+
+ return matched_negative;
+}
+
+void refspec_find_all_matches(struct refspec *rs,
+ struct refspec_item *query,
+ struct string_list *results)
+{
+ int i;
+ int find_src = !query->src;
+
+ if (find_src && !query->dst)
+ BUG("refspec_find_all_matches: need either src or dst");
+
+ if (refspec_find_negative_match(rs, query))
+ return;
+
+ for (i = 0; i < rs->nr; i++) {
+ struct refspec_item *refspec = &rs->items[i];
+ const char *key = find_src ? refspec->dst : refspec->src;
+ const char *value = find_src ? refspec->src : refspec->dst;
+ const char *needle = find_src ? query->dst : query->src;
+ char **result = find_src ? &query->src : &query->dst;
+
+ if (!refspec->dst || refspec->negative)
+ continue;
+ if (refspec->pattern) {
+ if (match_refname_with_pattern(key, needle, value, result))
+ string_list_append_nodup(results, *result);
+ } else if (!strcmp(needle, key)) {
+ string_list_append(results, value);
+ }
+ }
+}
+
+int refspec_find_match(struct refspec *rs, struct refspec_item *query)
+{
+ int i;
+ int find_src = !query->src;
+ const char *needle = find_src ? query->dst : query->src;
+ char **result = find_src ? &query->src : &query->dst;
+
+ if (find_src && !query->dst)
+ BUG("refspec_find_match: need either src or dst");
+
+ if (refspec_find_negative_match(rs, query))
+ return -1;
+
+ for (i = 0; i < rs->nr; i++) {
+ struct refspec_item *refspec = &rs->items[i];
+ const char *key = find_src ? refspec->dst : refspec->src;
+ const char *value = find_src ? refspec->src : refspec->dst;
+
+ if (!refspec->dst || refspec->negative)
+ continue;
+ if (refspec->pattern) {
+ if (match_refname_with_pattern(key, needle, value, result)) {
+ query->force = refspec->force;
+ return 0;
+ }
+ } else if (!strcmp(needle, key)) {
+ *result = xstrdup(value);
+ query->force = refspec->force;
+ return 0;
+ }
+ }
+ return -1;
+}
+
+struct ref *apply_negative_refspecs(struct ref *ref_map, struct refspec *rs)
+{
+ struct ref **tail;
+
+ for (tail = &ref_map; *tail; ) {
+ struct ref *ref = *tail;
+
+ if (refname_matches_negative_refspec_item(ref->name, rs)) {
+ *tail = ref->next;
+ free(ref->peer_ref);
+ free(ref);
+ } else
+ tail = &ref->next;
+ }
+
+ return ref_map;
+}
+
+char *apply_refspecs(struct refspec *rs, const char *name)
+{
+ struct refspec_item query;
+
+ memset(&query, 0, sizeof(struct refspec_item));
+ query.src = (char *)name;
+
+ if (refspec_find_match(rs, &query))
+ return NULL;
+
+ return query.dst;
+}
diff --git a/refspec.h b/refspec.h
index 69d693c87d..e2b5cc54ef 100644
--- a/refspec.h
+++ b/refspec.h
@@ -30,6 +30,8 @@ struct refspec_item {
char *raw;
};
+struct string_list;
+
#define REFSPEC_FETCH 1
#define REFSPEC_PUSH 0
@@ -61,7 +63,6 @@ void refspec_appendn(struct refspec *rs, const char **refspecs, int nr);
void refspec_clear(struct refspec *rs);
int valid_fetch_refspec(const char *refspec);
-int valid_remote_name(const char *name);
struct strvec;
/*
@@ -71,4 +72,40 @@ struct strvec;
void refspec_ref_prefixes(const struct refspec *rs,
struct strvec *ref_prefixes);
+int refname_matches_negative_refspec_item(const char *refname, struct refspec *rs);
+
+/*
+ * Checks if a refname matches a globbing refspec pattern.
+ * If replacement is provided, computes the corresponding mapped refname.
+ * Returns 1 if refname matches pattern, 0 otherwise.
+ */
+int match_refname_with_pattern(const char *pattern, const char *refname,
+ const char *replacement, char **result);
+
+/*
+ * Queries a refspec for a match and updates the query item.
+ * Returns 0 on success, -1 if no match is found or negative refspec matches.
+ */
+int refspec_find_match(struct refspec *rs, struct refspec_item *query);
+
+/*
+ * Queries a refspec for all matches and appends results to the provided string
+ * list.
+ */
+void refspec_find_all_matches(struct refspec *rs,
+ struct refspec_item *query,
+ struct string_list *results);
+
+/*
+ * Remove all entries in the input list which match any negative refspec in
+ * the refspec list.
+ */
+struct ref *apply_negative_refspecs(struct ref *ref_map, struct refspec *rs);
+
+/*
+ * Search for a refspec that matches the given name and return the
+ * corresponding destination (dst) if a match is found, NULL otherwise.
+ */
+char *apply_refspecs(struct refspec *rs, const char *name);
+
#endif /* REFSPEC_H */
diff --git a/reftable/basics.c b/reftable/basics.c
index fe2b83ff83..3b5ea27bbd 100644
--- a/reftable/basics.c
+++ b/reftable/basics.c
@@ -263,18 +263,16 @@ int names_equal(const char **a, const char **b)
return a[i] == b[i];
}
-int common_prefix_size(struct reftable_buf *a, struct reftable_buf *b)
+size_t common_prefix_size(struct reftable_buf *a, struct reftable_buf *b)
{
- int p = 0;
- for (; p < a->len && p < b->len; p++) {
+ size_t p = 0;
+ for (; p < a->len && p < b->len; p++)
if (a->buf[p] != b->buf[p])
break;
- }
-
return p;
}
-int hash_size(enum reftable_hash id)
+uint32_t hash_size(enum reftable_hash id)
{
if (!id)
return REFTABLE_HASH_SIZE_SHA1;
diff --git a/reftable/basics.h b/reftable/basics.h
index 4bf71b0954..a2a010a0e1 100644
--- a/reftable/basics.h
+++ b/reftable/basics.h
@@ -169,9 +169,9 @@ static inline void *reftable_alloc_grow(void *p, size_t nelem, size_t elsize,
#endif
/* Find the longest shared prefix size of `a` and `b` */
-int common_prefix_size(struct reftable_buf *a, struct reftable_buf *b);
+size_t common_prefix_size(struct reftable_buf *a, struct reftable_buf *b);
-int hash_size(enum reftable_hash id);
+uint32_t hash_size(enum reftable_hash id);
/*
* Format IDs that identify the hash function used by a reftable. Note that
diff --git a/reftable/block.c b/reftable/block.c
index 9858bbc7c5..b14a8f1259 100644
--- a/reftable/block.c
+++ b/reftable/block.c
@@ -13,9 +13,8 @@ https://developers.google.com/open-source/licenses/bsd
#include "record.h"
#include "reftable-error.h"
#include "system.h"
-#include <zlib.h>
-int header_size(int version)
+size_t header_size(int version)
{
switch (version) {
case 1:
@@ -26,7 +25,7 @@ int header_size(int version)
abort();
}
-int footer_size(int version)
+size_t footer_size(int version)
{
switch (version) {
case 1:
@@ -40,16 +39,15 @@ int footer_size(int version)
static int block_writer_register_restart(struct block_writer *w, int n,
int is_restart, struct reftable_buf *key)
{
- int rlen, err;
+ uint32_t rlen;
+ int err;
rlen = w->restart_len;
- if (rlen >= MAX_RESTARTS) {
+ if (rlen >= MAX_RESTARTS)
is_restart = 0;
- }
- if (is_restart) {
+ if (is_restart)
rlen++;
- }
if (2 + 3 * rlen + n > w->block_size - w->next)
return -1;
if (is_restart) {
@@ -72,7 +70,7 @@ static int block_writer_register_restart(struct block_writer *w, int n,
}
int block_writer_init(struct block_writer *bw, uint8_t typ, uint8_t *block,
- uint32_t block_size, uint32_t header_off, int hash_size)
+ uint32_t block_size, uint32_t header_off, uint32_t hash_size)
{
bw->block = block;
bw->hash_size = hash_size;
@@ -148,8 +146,7 @@ done:
int block_writer_finish(struct block_writer *w)
{
- int i;
- for (i = 0; i < w->restart_len; i++) {
+ for (uint32_t i = 0; i < w->restart_len; i++) {
put_be24(w->block + w->next, w->restarts[i]);
w->next += 3;
}
@@ -214,7 +211,7 @@ int block_writer_finish(struct block_writer *w)
int block_reader_init(struct block_reader *br, struct reftable_block *block,
uint32_t header_off, uint32_t table_block_size,
- int hash_size)
+ uint32_t hash_size)
{
uint32_t full_block_size = table_block_size;
uint8_t typ = block->data[header_off];
diff --git a/reftable/block.h b/reftable/block.h
index 0431e8591f..bef2b8a4c5 100644
--- a/reftable/block.h
+++ b/reftable/block.h
@@ -30,7 +30,7 @@ struct block_writer {
/* How often to restart keys. */
uint16_t restart_interval;
- int hash_size;
+ uint32_t hash_size;
/* Offset of next uint8_t to write. */
uint32_t next;
@@ -48,7 +48,7 @@ struct block_writer {
* initializes the blockwriter to write `typ` entries, using `block` as temporary
* storage. `block` is not owned by the block_writer. */
int block_writer_init(struct block_writer *bw, uint8_t typ, uint8_t *block,
- uint32_t block_size, uint32_t header_off, int hash_size);
+ uint32_t block_size, uint32_t header_off, uint32_t hash_size);
/* returns the block type (eg. 'r' for ref records. */
uint8_t block_writer_type(struct block_writer *bw);
@@ -72,7 +72,7 @@ struct block_reader {
/* the memory block */
struct reftable_block block;
- int hash_size;
+ uint32_t hash_size;
/* Uncompressed data for log entries. */
z_stream *zstream;
@@ -92,7 +92,7 @@ struct block_reader {
/* initializes a block reader. */
int block_reader_init(struct block_reader *br, struct reftable_block *bl,
uint32_t header_off, uint32_t table_block_size,
- int hash_size);
+ uint32_t hash_size);
void block_reader_release(struct block_reader *br);
@@ -108,7 +108,7 @@ struct block_iter {
uint32_t next_off;
const unsigned char *block;
size_t block_len;
- int hash_size;
+ uint32_t hash_size;
/* key for last entry we read. */
struct reftable_buf last_key;
@@ -137,10 +137,10 @@ void block_iter_reset(struct block_iter *it);
void block_iter_close(struct block_iter *it);
/* size of file header, depending on format version */
-int header_size(int version);
+size_t header_size(int version);
/* size of file footer, depending on format version */
-int footer_size(int version);
+size_t footer_size(int version);
/* returns a block to its source. */
void reftable_block_done(struct reftable_block *ret);
diff --git a/reftable/blocksource.c b/reftable/blocksource.c
index 52e0915a67..bba4a45b98 100644
--- a/reftable/blocksource.c
+++ b/reftable/blocksource.c
@@ -24,8 +24,8 @@ static void reftable_buf_close(void *b UNUSED)
{
}
-static int reftable_buf_read_block(void *v, struct reftable_block *dest,
- uint64_t off, uint32_t size)
+static ssize_t reftable_buf_read_block(void *v, struct reftable_block *dest,
+ uint64_t off, uint32_t size)
{
struct reftable_buf *b = v;
assert(off + size <= b->len);
@@ -78,8 +78,8 @@ static void file_close(void *v)
reftable_free(b);
}
-static int file_read_block(void *v, struct reftable_block *dest, uint64_t off,
- uint32_t size)
+static ssize_t file_read_block(void *v, struct reftable_block *dest, uint64_t off,
+ uint32_t size)
{
struct file_block_source *b = v;
assert(off + size <= b->size);
diff --git a/reftable/reader.c b/reftable/reader.c
index ea82955c9b..3f2e4b2800 100644
--- a/reftable/reader.c
+++ b/reftable/reader.c
@@ -20,11 +20,11 @@ uint64_t block_source_size(struct reftable_block_source *source)
return source->ops->size(source->arg);
}
-int block_source_read_block(struct reftable_block_source *source,
- struct reftable_block *dest, uint64_t off,
- uint32_t size)
+ssize_t block_source_read_block(struct reftable_block_source *source,
+ struct reftable_block *dest, uint64_t off,
+ uint32_t size)
{
- int result = source->ops->read_block(source->arg, dest, off, size);
+ ssize_t result = source->ops->read_block(source->arg, dest, off, size);
dest->source = *source;
return result;
}
@@ -57,14 +57,17 @@ static int reader_get_block(struct reftable_reader *r,
struct reftable_block *dest, uint64_t off,
uint32_t sz)
{
+ ssize_t bytes_read;
if (off >= r->size)
return 0;
-
- if (off + sz > r->size) {
+ if (off + sz > r->size)
sz = r->size - off;
- }
- return block_source_read_block(&r->source, dest, off, sz);
+ bytes_read = block_source_read_block(&r->source, dest, off, sz);
+ if (bytes_read < 0)
+ return (int)bytes_read;
+
+ return 0;
}
enum reftable_hash reftable_reader_hash_id(struct reftable_reader *r)
@@ -601,6 +604,7 @@ int reftable_reader_new(struct reftable_reader **out,
struct reftable_reader *r;
uint64_t file_size = block_source_size(source);
uint32_t read_size;
+ ssize_t bytes_read;
int err;
REFTABLE_CALLOC_ARRAY(r, 1);
@@ -619,8 +623,8 @@ int reftable_reader_new(struct reftable_reader **out,
goto done;
}
- err = block_source_read_block(source, &header, 0, read_size);
- if (err != read_size) {
+ bytes_read = block_source_read_block(source, &header, 0, read_size);
+ if (bytes_read < 0 || (size_t)bytes_read != read_size) {
err = REFTABLE_IO_ERROR;
goto done;
}
@@ -645,9 +649,9 @@ int reftable_reader_new(struct reftable_reader **out,
r->hash_id = 0;
r->refcount = 1;
- err = block_source_read_block(source, &footer, r->size,
- footer_size(r->version));
- if (err != footer_size(r->version)) {
+ bytes_read = block_source_read_block(source, &footer, r->size,
+ footer_size(r->version));
+ if (bytes_read < 0 || (size_t)bytes_read != footer_size(r->version)) {
err = REFTABLE_IO_ERROR;
goto done;
}
@@ -750,7 +754,7 @@ static int reftable_reader_refs_for_unindexed(struct reftable_reader *r,
struct table_iter *ti;
struct filtering_ref_iterator *filter = NULL;
struct filtering_ref_iterator empty = FILTERING_REF_ITERATOR_INIT;
- int oid_len = hash_size(r->hash_id);
+ uint32_t oid_len = hash_size(r->hash_id);
int err;
REFTABLE_ALLOC_ARRAY(ti, 1);
diff --git a/reftable/reader.h b/reftable/reader.h
index d2b48a4849..bb72108a6f 100644
--- a/reftable/reader.h
+++ b/reftable/reader.h
@@ -16,9 +16,9 @@ https://developers.google.com/open-source/licenses/bsd
uint64_t block_source_size(struct reftable_block_source *source);
-int block_source_read_block(struct reftable_block_source *source,
- struct reftable_block *dest, uint64_t off,
- uint32_t size);
+ssize_t block_source_read_block(struct reftable_block_source *source,
+ struct reftable_block *dest, uint64_t off,
+ uint32_t size);
void block_source_close(struct reftable_block_source *source);
/* metadata for a block type */
diff --git a/reftable/record.c b/reftable/record.c
index 04429d23fe..8919df8a4d 100644
--- a/reftable/record.c
+++ b/reftable/record.c
@@ -21,47 +21,49 @@ static void *reftable_record_data(struct reftable_record *rec);
int get_var_int(uint64_t *dest, struct string_view *in)
{
- int ptr = 0;
+ const unsigned char *buf = in->buf;
+ unsigned char c;
uint64_t val;
- if (in->len == 0)
+ if (!in->len)
return -1;
- val = in->buf[ptr] & 0x7f;
-
- while (in->buf[ptr] & 0x80) {
- ptr++;
- if (ptr > in->len) {
+ c = *buf++;
+ val = c & 0x7f;
+
+ while (c & 0x80) {
+ /*
+ * We use a micro-optimization here: whenever we see that the
+ * 0x80 bit is set, we know that the remainder of the value
+ * cannot be 0. The zero-values thus doesn't need to be encoded
+ * at all, which is why we subtract 1 when encoding and add 1
+ * when decoding.
+ *
+ * This allows us to save a byte in some edge cases.
+ */
+ val += 1;
+ if (!val || (val & (uint64_t)(~0ULL << (64 - 7))))
+ return -1; /* overflow */
+ if (buf >= in->buf + in->len)
return -1;
- }
- val = (val + 1) << 7 | (uint64_t)(in->buf[ptr] & 0x7f);
+ c = *buf++;
+ val = (val << 7) + (c & 0x7f);
}
*dest = val;
- return ptr + 1;
+ return buf - in->buf;
}
-int put_var_int(struct string_view *dest, uint64_t val)
+int put_var_int(struct string_view *dest, uint64_t value)
{
- uint8_t buf[10] = { 0 };
- int i = 9;
- int n = 0;
- buf[i] = (uint8_t)(val & 0x7f);
- i--;
- while (1) {
- val >>= 7;
- if (!val) {
- break;
- }
- val--;
- buf[i] = 0x80 | (uint8_t)(val & 0x7f);
- i--;
- }
-
- n = sizeof(buf) - i - 1;
- if (dest->len < n)
+ unsigned char varint[10];
+ unsigned pos = sizeof(varint) - 1;
+ varint[pos] = value & 0x7f;
+ while (value >>= 7)
+ varint[--pos] = 0x80 | (--value & 0x7f);
+ if (dest->len < sizeof(varint) - pos)
return -1;
- memcpy(dest->buf, &buf[i + 1], n);
- return n;
+ memcpy(dest->buf, varint + pos, sizeof(varint) - pos);
+ return sizeof(varint) - pos;
}
int reftable_is_block_type(uint8_t typ)
@@ -124,7 +126,7 @@ static int decode_string(struct reftable_buf *dest, struct string_view in)
static int encode_string(const char *str, struct string_view s)
{
struct string_view start = s;
- int l = strlen(str);
+ size_t l = strlen(str);
int n = put_var_int(&s, l);
if (n < 0)
return -1;
@@ -142,9 +144,9 @@ int reftable_encode_key(int *restart, struct string_view dest,
uint8_t extra)
{
struct string_view start = dest;
- int prefix_len = common_prefix_size(&prev_key, &key);
+ size_t prefix_len = common_prefix_size(&prev_key, &key);
uint64_t suffix_len = key.len - prefix_len;
- int n = put_var_int(&dest, (uint64_t)prefix_len);
+ int n = put_var_int(&dest, prefix_len);
if (n < 0)
return -1;
string_view_consume(&dest, n);
@@ -227,7 +229,7 @@ static int reftable_ref_record_key(const void *r, struct reftable_buf *dest)
}
static int reftable_ref_record_copy_from(void *rec, const void *src_rec,
- int hash_size)
+ uint32_t hash_size)
{
struct reftable_ref_record *ref = rec;
const struct reftable_ref_record *src = src_rec;
@@ -235,8 +237,6 @@ static int reftable_ref_record_copy_from(void *rec, const void *src_rec,
size_t refname_cap = 0;
int err;
- assert(hash_size > 0);
-
SWAP(refname, ref->refname);
SWAP(refname_cap, ref->refname_cap);
reftable_ref_record_release(ref);
@@ -317,13 +317,12 @@ static uint8_t reftable_ref_record_val_type(const void *rec)
}
static int reftable_ref_record_encode(const void *rec, struct string_view s,
- int hash_size)
+ uint32_t hash_size)
{
const struct reftable_ref_record *r =
(const struct reftable_ref_record *)rec;
struct string_view start = s;
int n = put_var_int(&s, r->update_index);
- assert(hash_size > 0);
if (n < 0)
return -1;
string_view_consume(&s, n);
@@ -363,7 +362,7 @@ static int reftable_ref_record_encode(const void *rec, struct string_view s,
static int reftable_ref_record_decode(void *rec, struct reftable_buf key,
uint8_t val_type, struct string_view in,
- int hash_size, struct reftable_buf *scratch)
+ uint32_t hash_size, struct reftable_buf *scratch)
{
struct reftable_ref_record *r = rec;
struct string_view start = in;
@@ -372,8 +371,6 @@ static int reftable_ref_record_decode(void *rec, struct reftable_buf key,
size_t refname_cap = 0;
int n, err;
- assert(hash_size > 0);
-
n = get_var_int(&update_index, &in);
if (n < 0)
return n;
@@ -449,7 +446,7 @@ static int reftable_ref_record_is_deletion_void(const void *p)
}
static int reftable_ref_record_equal_void(const void *a,
- const void *b, int hash_size)
+ const void *b, uint32_t hash_size)
{
struct reftable_ref_record *ra = (struct reftable_ref_record *) a;
struct reftable_ref_record *rb = (struct reftable_ref_record *) b;
@@ -493,7 +490,7 @@ static void reftable_obj_record_release(void *rec)
}
static int reftable_obj_record_copy_from(void *rec, const void *src_rec,
- int hash_size UNUSED)
+ uint32_t hash_size UNUSED)
{
struct reftable_obj_record *obj = rec;
const struct reftable_obj_record *src = src_rec;
@@ -525,7 +522,7 @@ static uint8_t reftable_obj_record_val_type(const void *rec)
}
static int reftable_obj_record_encode(const void *rec, struct string_view s,
- int hash_size UNUSED)
+ uint32_t hash_size UNUSED)
{
const struct reftable_obj_record *r = rec;
struct string_view start = s;
@@ -560,7 +557,7 @@ static int reftable_obj_record_encode(const void *rec, struct string_view s,
static int reftable_obj_record_decode(void *rec, struct reftable_buf key,
uint8_t val_type, struct string_view in,
- int hash_size UNUSED,
+ uint32_t hash_size UNUSED,
struct reftable_buf *scratch UNUSED)
{
struct string_view start = in;
@@ -568,7 +565,6 @@ static int reftable_obj_record_decode(void *rec, struct reftable_buf key,
uint64_t count = val_type;
int n = 0;
uint64_t last;
- int j;
reftable_obj_record_release(r);
@@ -603,8 +599,7 @@ static int reftable_obj_record_decode(void *rec, struct reftable_buf key,
string_view_consume(&in, n);
last = r->offsets[0];
- j = 1;
- while (j < count) {
+ for (uint64_t j = 1; j < count; j++) {
uint64_t delta = 0;
int n = get_var_int(&delta, &in);
if (n < 0) {
@@ -613,7 +608,6 @@ static int reftable_obj_record_decode(void *rec, struct reftable_buf key,
string_view_consume(&in, n);
last = r->offsets[j] = (delta + last);
- j++;
}
return start.len - in.len;
}
@@ -624,7 +618,7 @@ static int not_a_deletion(const void *p UNUSED)
}
static int reftable_obj_record_equal_void(const void *a, const void *b,
- int hash_size UNUSED)
+ uint32_t hash_size UNUSED)
{
struct reftable_obj_record *ra = (struct reftable_obj_record *) a;
struct reftable_obj_record *rb = (struct reftable_obj_record *) b;
@@ -699,7 +693,7 @@ static int reftable_log_record_key(const void *r, struct reftable_buf *dest)
}
static int reftable_log_record_copy_from(void *rec, const void *src_rec,
- int hash_size)
+ uint32_t hash_size)
{
struct reftable_log_record *dst = rec;
const struct reftable_log_record *src =
@@ -780,7 +774,7 @@ static uint8_t reftable_log_record_val_type(const void *rec)
}
static int reftable_log_record_encode(const void *rec, struct string_view s,
- int hash_size)
+ uint32_t hash_size)
{
const struct reftable_log_record *r = rec;
struct string_view start = s;
@@ -828,7 +822,7 @@ static int reftable_log_record_encode(const void *rec, struct string_view s,
static int reftable_log_record_decode(void *rec, struct reftable_buf key,
uint8_t val_type, struct string_view in,
- int hash_size, struct reftable_buf *scratch)
+ uint32_t hash_size, struct reftable_buf *scratch)
{
struct string_view start = in;
struct reftable_log_record *r = rec;
@@ -976,7 +970,7 @@ static int null_streq(const char *a, const char *b)
}
static int reftable_log_record_equal_void(const void *a,
- const void *b, int hash_size)
+ const void *b, uint32_t hash_size)
{
return reftable_log_record_equal((struct reftable_log_record *) a,
(struct reftable_log_record *) b,
@@ -1000,7 +994,7 @@ static int reftable_log_record_cmp_void(const void *_a, const void *_b)
}
int reftable_log_record_equal(const struct reftable_log_record *a,
- const struct reftable_log_record *b, int hash_size)
+ const struct reftable_log_record *b, uint32_t hash_size)
{
if (!(null_streq(a->refname, b->refname) &&
a->update_index == b->update_index &&
@@ -1054,7 +1048,7 @@ static int reftable_index_record_key(const void *r, struct reftable_buf *dest)
}
static int reftable_index_record_copy_from(void *rec, const void *src_rec,
- int hash_size UNUSED)
+ uint32_t hash_size UNUSED)
{
struct reftable_index_record *dst = rec;
const struct reftable_index_record *src = src_rec;
@@ -1081,7 +1075,7 @@ static uint8_t reftable_index_record_val_type(const void *rec UNUSED)
}
static int reftable_index_record_encode(const void *rec, struct string_view out,
- int hash_size UNUSED)
+ uint32_t hash_size UNUSED)
{
const struct reftable_index_record *r =
(const struct reftable_index_record *)rec;
@@ -1099,7 +1093,7 @@ static int reftable_index_record_encode(const void *rec, struct string_view out,
static int reftable_index_record_decode(void *rec, struct reftable_buf key,
uint8_t val_type UNUSED,
struct string_view in,
- int hash_size UNUSED,
+ uint32_t hash_size UNUSED,
struct reftable_buf *scratch UNUSED)
{
struct string_view start = in;
@@ -1120,7 +1114,7 @@ static int reftable_index_record_decode(void *rec, struct reftable_buf key,
}
static int reftable_index_record_equal(const void *a, const void *b,
- int hash_size UNUSED)
+ uint32_t hash_size UNUSED)
{
struct reftable_index_record *ia = (struct reftable_index_record *) a;
struct reftable_index_record *ib = (struct reftable_index_record *) b;
@@ -1154,14 +1148,14 @@ int reftable_record_key(struct reftable_record *rec, struct reftable_buf *dest)
}
int reftable_record_encode(struct reftable_record *rec, struct string_view dest,
- int hash_size)
+ uint32_t hash_size)
{
return reftable_record_vtable(rec)->encode(reftable_record_data(rec),
dest, hash_size);
}
int reftable_record_copy_from(struct reftable_record *rec,
- struct reftable_record *src, int hash_size)
+ struct reftable_record *src, uint32_t hash_size)
{
assert(src->type == rec->type);
@@ -1176,7 +1170,7 @@ uint8_t reftable_record_val_type(struct reftable_record *rec)
}
int reftable_record_decode(struct reftable_record *rec, struct reftable_buf key,
- uint8_t extra, struct string_view src, int hash_size,
+ uint8_t extra, struct string_view src, uint32_t hash_size,
struct reftable_buf *scratch)
{
return reftable_record_vtable(rec)->decode(reftable_record_data(rec),
@@ -1203,7 +1197,7 @@ int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b)
reftable_record_data(a), reftable_record_data(b));
}
-int reftable_record_equal(struct reftable_record *a, struct reftable_record *b, int hash_size)
+int reftable_record_equal(struct reftable_record *a, struct reftable_record *b, uint32_t hash_size)
{
if (a->type != b->type)
return 0;
@@ -1211,7 +1205,7 @@ int reftable_record_equal(struct reftable_record *a, struct reftable_record *b,
reftable_record_data(a), reftable_record_data(b), hash_size);
}
-static int hash_equal(const unsigned char *a, const unsigned char *b, int hash_size)
+static int hash_equal(const unsigned char *a, const unsigned char *b, uint32_t hash_size)
{
if (a && b)
return !memcmp(a, b, hash_size);
@@ -1220,9 +1214,8 @@ static int hash_equal(const unsigned char *a, const unsigned char *b, int hash_s
}
int reftable_ref_record_equal(const struct reftable_ref_record *a,
- const struct reftable_ref_record *b, int hash_size)
+ const struct reftable_ref_record *b, uint32_t hash_size)
{
- assert(hash_size > 0);
if (!null_streq(a->refname, b->refname))
return 0;
diff --git a/reftable/record.h b/reftable/record.h
index 25aa908c85..c7755a4d75 100644
--- a/reftable/record.h
+++ b/reftable/record.h
@@ -32,8 +32,10 @@ static inline void string_view_consume(struct string_view *s, int n)
s->len -= n;
}
-/* utilities for de/encoding varints */
-
+/*
+ * Decode and encode a varint. Returns the number of bytes read/written, or a
+ * negative value in case encoding/decoding the varint has failed.
+ */
int get_var_int(uint64_t *dest, struct string_view *in);
int put_var_int(struct string_view *dest, uint64_t val);
@@ -45,18 +47,18 @@ struct reftable_record_vtable {
/* The record type of ('r' for ref). */
uint8_t type;
- int (*copy_from)(void *dest, const void *src, int hash_size);
+ int (*copy_from)(void *dest, const void *src, uint32_t hash_size);
/* a value of [0..7], indicating record subvariants (eg. ref vs. symref
* vs ref deletion) */
uint8_t (*val_type)(const void *rec);
/* encodes rec into dest, returning how much space was used. */
- int (*encode)(const void *rec, struct string_view dest, int hash_size);
+ int (*encode)(const void *rec, struct string_view dest, uint32_t hash_size);
/* decode data from `src` into the record. */
int (*decode)(void *rec, struct reftable_buf key, uint8_t extra,
- struct string_view src, int hash_size,
+ struct string_view src, uint32_t hash_size,
struct reftable_buf *scratch);
/* deallocate and null the record. */
@@ -66,16 +68,13 @@ struct reftable_record_vtable {
int (*is_deletion)(const void *rec);
/* Are two records equal? This assumes they have the same type. Returns 0 for non-equal. */
- int (*equal)(const void *a, const void *b, int hash_size);
+ int (*equal)(const void *a, const void *b, uint32_t hash_size);
/*
* Compare keys of two records with each other. The records must have
* the same type.
*/
int (*cmp)(const void *a, const void *b);
-
- /* Print on stdout, for debugging. */
- void (*print)(const void *rec, int hash_size);
};
/* returns true for recognized block types. Block start with the block type. */
@@ -136,16 +135,16 @@ void reftable_record_init(struct reftable_record *rec, uint8_t typ);
/* see struct record_vtable */
int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b);
-int reftable_record_equal(struct reftable_record *a, struct reftable_record *b, int hash_size);
+int reftable_record_equal(struct reftable_record *a, struct reftable_record *b, uint32_t hash_size);
int reftable_record_key(struct reftable_record *rec, struct reftable_buf *dest);
int reftable_record_copy_from(struct reftable_record *rec,
- struct reftable_record *src, int hash_size);
+ struct reftable_record *src, uint32_t hash_size);
uint8_t reftable_record_val_type(struct reftable_record *rec);
int reftable_record_encode(struct reftable_record *rec, struct string_view dest,
- int hash_size);
+ uint32_t hash_size);
int reftable_record_decode(struct reftable_record *rec, struct reftable_buf key,
uint8_t extra, struct string_view src,
- int hash_size, struct reftable_buf *scratch);
+ uint32_t hash_size, struct reftable_buf *scratch);
int reftable_record_is_deletion(struct reftable_record *rec);
static inline uint8_t reftable_record_type(struct reftable_record *rec)
diff --git a/reftable/reftable-blocksource.h b/reftable/reftable-blocksource.h
index 5aa3990a57..6b326aa5ea 100644
--- a/reftable/reftable-blocksource.h
+++ b/reftable/reftable-blocksource.h
@@ -22,7 +22,7 @@ struct reftable_block_source {
* so it can return itself into the pool. */
struct reftable_block {
uint8_t *data;
- int len;
+ size_t len;
struct reftable_block_source source;
};
@@ -31,10 +31,13 @@ struct reftable_block_source_vtable {
/* returns the size of a block source */
uint64_t (*size)(void *source);
- /* reads a segment from the block source. It is an error to read
- beyond the end of the block */
- int (*read_block)(void *source, struct reftable_block *dest,
- uint64_t off, uint32_t size);
+ /*
+ * Reads a segment from the block source. It is an error to read beyond
+ * the end of the block.
+ */
+ ssize_t (*read_block)(void *source, struct reftable_block *dest,
+ uint64_t off, uint32_t size);
+
/* mark the block as read; may return the data back to malloc */
void (*return_block)(void *source, struct reftable_block *blockp);
diff --git a/reftable/reftable-error.h b/reftable/reftable-error.h
index f404826562..a7e33d964d 100644
--- a/reftable/reftable-error.h
+++ b/reftable/reftable-error.h
@@ -30,6 +30,7 @@ enum reftable_error {
/* Misuse of the API:
* - on writing a record with NULL refname.
+ * - on writing a record before setting the writer limits.
* - on writing a reftable_ref_record outside the table limits
* - on writing a ref or log record before the stack's
* next_update_inde*x
diff --git a/reftable/reftable-record.h b/reftable/reftable-record.h
index ddd48eb579..931e594744 100644
--- a/reftable/reftable-record.h
+++ b/reftable/reftable-record.h
@@ -65,7 +65,7 @@ void reftable_ref_record_release(struct reftable_ref_record *ref);
/* returns whether two reftable_ref_records are the same. Useful for testing. */
int reftable_ref_record_equal(const struct reftable_ref_record *a,
- const struct reftable_ref_record *b, int hash_size);
+ const struct reftable_ref_record *b, uint32_t hash_size);
/* reftable_log_record holds a reflog entry */
struct reftable_log_record {
@@ -105,6 +105,6 @@ void reftable_log_record_release(struct reftable_log_record *log);
/* returns whether two records are equal. Useful for testing. */
int reftable_log_record_equal(const struct reftable_log_record *a,
- const struct reftable_log_record *b, int hash_size);
+ const struct reftable_log_record *b, uint32_t hash_size);
#endif
diff --git a/reftable/reftable-writer.h b/reftable/reftable-writer.h
index 5f9afa620b..1befe3b07c 100644
--- a/reftable/reftable-writer.h
+++ b/reftable/reftable-writer.h
@@ -84,7 +84,7 @@ struct reftable_block_stats {
/* total number of entries written */
int entries;
/* total number of key restarts */
- int restarts;
+ uint32_t restarts;
/* total number of blocks */
int blocks;
/* total number of index blocks */
@@ -124,17 +124,21 @@ int reftable_writer_new(struct reftable_writer **out,
int (*flush_func)(void *),
void *writer_arg, const struct reftable_write_options *opts);
-/* Set the range of update indices for the records we will add. When writing a
- table into a stack, the min should be at least
- reftable_stack_next_update_index(), or REFTABLE_API_ERROR is returned.
-
- For transactional updates to a stack, typically min==max, and the
- update_index can be obtained by inspeciting the stack. When converting an
- existing ref database into a single reftable, this would be a range of
- update-index timestamps.
+/*
+ * Set the range of update indices for the records we will add. When writing a
+ * table into a stack, the min should be at least
+ * reftable_stack_next_update_index(), or REFTABLE_API_ERROR is returned.
+ *
+ * For transactional updates to a stack, typically min==max, and the
+ * update_index can be obtained by inspeciting the stack. When converting an
+ * existing ref database into a single reftable, this would be a range of
+ * update-index timestamps.
+ *
+ * The function should be called before adding any records to the writer. If not
+ * it will fail with REFTABLE_API_ERROR.
*/
-void reftable_writer_set_limits(struct reftable_writer *w, uint64_t min,
- uint64_t max);
+int reftable_writer_set_limits(struct reftable_writer *w, uint64_t min,
+ uint64_t max);
/*
Add a reftable_ref_record. The record should have names that come after
diff --git a/reftable/stack.c b/reftable/stack.c
index 531660a49f..6c4e8be19b 100644
--- a/reftable/stack.c
+++ b/reftable/stack.c
@@ -220,9 +220,9 @@ void reftable_stack_destroy(struct reftable_stack *st)
}
if (st->readers) {
- int i = 0;
struct reftable_buf filename = REFTABLE_BUF_INIT;
- for (i = 0; i < st->readers_len; i++) {
+
+ for (size_t i = 0; i < st->readers_len; i++) {
const char *name = reader_name(st->readers[i]);
int try_unlinking = 1;
@@ -238,6 +238,7 @@ void reftable_stack_destroy(struct reftable_stack *st)
unlink(filename.buf);
}
}
+
reftable_buf_release(&filename);
st->readers_len = 0;
REFTABLE_FREE_AND_NULL(st->readers);
@@ -493,7 +494,7 @@ static int reftable_stack_reload_maybe_reuse(struct reftable_stack *st,
close(fd);
fd = -1;
- delay = delay + (delay * rand()) / RAND_MAX + 1;
+ delay = delay + (delay * git_rand(CSPRNG_BYTES_INSECURE)) / UINT32_MAX + 1;
sleep_millisec(delay);
}
@@ -568,7 +569,6 @@ static int stack_uptodate(struct reftable_stack *st)
{
char **names = NULL;
int err;
- int i = 0;
/*
* When we have cached stat information available then we use it to
@@ -608,7 +608,7 @@ static int stack_uptodate(struct reftable_stack *st)
if (err < 0)
return err;
- for (i = 0; i < st->readers_len; i++) {
+ for (size_t i = 0; i < st->readers_len; i++) {
if (!names[i]) {
err = 1;
goto done;
@@ -659,7 +659,7 @@ int reftable_stack_add(struct reftable_stack *st,
static int format_name(struct reftable_buf *dest, uint64_t min, uint64_t max)
{
char buf[100];
- uint32_t rnd = (uint32_t)git_rand();
+ uint32_t rnd = git_rand(CSPRNG_BYTES_INSECURE);
snprintf(buf, sizeof(buf), "0x%012" PRIx64 "-0x%012" PRIx64 "-%08x",
min, max, rnd);
reftable_buf_reset(dest);
@@ -1058,8 +1058,10 @@ static int stack_write_compact(struct reftable_stack *st,
for (size_t i = first; i <= last; i++)
st->stats.bytes += st->readers[i]->size;
- reftable_writer_set_limits(wr, st->readers[first]->min_update_index,
- st->readers[last]->max_update_index);
+ err = reftable_writer_set_limits(wr, st->readers[first]->min_update_index,
+ st->readers[last]->max_update_index);
+ if (err < 0)
+ goto done;
err = reftable_merged_table_new(&mt, st->readers + first, subtabs_len,
st->opts.hash_id);
@@ -1767,14 +1769,12 @@ static int reftable_stack_clean_locked(struct reftable_stack *st)
}
while ((d = readdir(dir))) {
- int i = 0;
int found = 0;
if (!is_table_name(d->d_name))
continue;
- for (i = 0; !found && i < st->readers_len; i++) {
+ for (size_t i = 0; !found && i < st->readers_len; i++)
found = !strcmp(reader_name(st->readers[i]), d->d_name);
- }
if (found)
continue;
diff --git a/reftable/system.h b/reftable/system.h
index 5274eca1d0..d02eacea8f 100644
--- a/reftable/system.h
+++ b/reftable/system.h
@@ -11,9 +11,8 @@ https://developers.google.com/open-source/licenses/bsd
/* This header glues the reftable library to the rest of Git */
-#define DISABLE_SIGN_COMPARE_WARNINGS
-
#include "git-compat-util.h"
+#include "compat/zlib-compat.h"
/*
* An implementation-specific temporary file. By making this specific to the
diff --git a/reftable/writer.c b/reftable/writer.c
index 740c98038e..f3ab1035d6 100644
--- a/reftable/writer.c
+++ b/reftable/writer.c
@@ -179,11 +179,24 @@ int reftable_writer_new(struct reftable_writer **out,
return 0;
}
-void reftable_writer_set_limits(struct reftable_writer *w, uint64_t min,
+int reftable_writer_set_limits(struct reftable_writer *w, uint64_t min,
uint64_t max)
{
+ /*
+ * Set the min/max update index limits for the reftable writer.
+ * This must be called before adding any records, since:
+ * - The 'next' field gets set after writing the first block.
+ * - The 'last_key' field updates with each new record (but resets
+ * after sections).
+ * Returns REFTABLE_API_ERROR if called after writing has begun.
+ */
+ if (w->next || w->last_key.len)
+ return REFTABLE_API_ERROR;
+
w->min_update_index = min;
w->max_update_index = max;
+
+ return 0;
}
static void writer_release(struct reftable_writer *w)
@@ -577,7 +590,7 @@ static int writer_finish_section(struct reftable_writer *w)
struct common_prefix_arg {
struct reftable_buf *last;
- int max;
+ size_t max;
};
static void update_common(void *void_arg, void *key)
@@ -585,10 +598,9 @@ static void update_common(void *void_arg, void *key)
struct common_prefix_arg *arg = void_arg;
struct obj_index_tree_node *entry = key;
if (arg->last) {
- int n = common_prefix_size(&entry->hash, arg->last);
- if (n > arg->max) {
+ size_t n = common_prefix_size(&entry->hash, arg->last);
+ if (n > arg->max)
arg->max = n;
- }
}
arg->last = &entry->hash;
}
diff --git a/remote-curl.c b/remote-curl.c
index a24e3a8b9a..1273507a96 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -942,7 +942,7 @@ static int post_rpc(struct rpc_state *rpc, int stateless_connect, int flush_rece
do {
err = probe_rpc(rpc, &results);
if (err == HTTP_REAUTH)
- credential_fill(&http_auth, 0);
+ credential_fill(the_repository, &http_auth, 0);
} while (err == HTTP_REAUTH);
if (err != HTTP_OK)
return -1;
@@ -1064,7 +1064,7 @@ retry:
rpc->any_written = 0;
err = run_slot(slot, NULL);
if (err == HTTP_REAUTH && !large_request) {
- credential_fill(&http_auth, 0);
+ credential_fill(the_repository, &http_auth, 0);
curl_slist_free_all(headers);
goto retry;
}
diff --git a/remote.c b/remote.c
index 18e5ccf391..c9c1384c1d 100644
--- a/remote.c
+++ b/remote.c
@@ -294,6 +294,7 @@ static void add_instead_of(struct rewrite *rewrite, const char *instead_of)
rewrite->instead_of_nr++;
}
+#ifndef WITH_BREAKING_CHANGES
static const char *skip_spaces(const char *s)
{
while (isspace(*s))
@@ -301,6 +302,21 @@ static const char *skip_spaces(const char *s)
return s;
}
+static void warn_about_deprecated_remote_type(const char *type,
+ const struct remote *remote)
+{
+ warning(_("reading remote from \"%s/%s\", which is nominated for removal.\n"
+ "\n"
+ "If you still use the \"remotes/\" directory it is recommended to\n"
+ "migrate to config-based remotes:\n"
+ "\n"
+ "\tgit remote rename %s %s\n"
+ "\n"
+ "If you cannot, please let us know why you still need to use it by\n"
+ "sending an e-mail to <git@vger.kernel.org>."),
+ type, remote->name, remote->name, remote->name);
+}
+
static void read_remotes_file(struct remote_state *remote_state,
struct remote *remote)
{
@@ -309,6 +325,9 @@ static void read_remotes_file(struct remote_state *remote_state,
if (!f)
return;
+
+ warn_about_deprecated_remote_type("remotes", remote);
+
remote->configured_in_repo = 1;
remote->origin = REMOTE_REMOTES;
while (strbuf_getline(&buf, f) != EOF) {
@@ -338,6 +357,8 @@ static void read_branches_file(struct remote_state *remote_state,
if (!f)
return;
+ warn_about_deprecated_remote_type("branches", remote);
+
strbuf_getline_lf(&buf, f);
fclose(f);
strbuf_trim(&buf);
@@ -375,6 +396,7 @@ static void read_branches_file(struct remote_state *remote_state,
strbuf_release(&buf);
free(to_free);
}
+#endif /* WITH_BREAKING_CHANGES */
static int handle_config(const char *key, const char *value,
const struct config_context *ctx, void *cb)
@@ -591,6 +613,7 @@ static void read_config(struct repository *repo, int early)
alias_all_urls(repo->remote_state);
}
+#ifndef WITH_BREAKING_CHANGES
static int valid_remote_nick(const char *name)
{
if (!name[0] || is_dot_or_dotdot(name))
@@ -602,6 +625,7 @@ static int valid_remote_nick(const char *name)
return 0;
return 1;
}
+#endif /* WITH_BREAKING_CHANGES */
static const char *remotes_remote_for_branch(struct remote_state *remote_state,
struct branch *branch,
@@ -744,12 +768,14 @@ remotes_remote_get_1(struct remote_state *remote_state, const char *name,
&name_given);
ret = make_remote(remote_state, name, 0);
+#ifndef WITH_BREAKING_CHANGES
if (valid_remote_nick(name) && have_git_dir()) {
if (!valid_remote(ret))
read_remotes_file(remote_state, ret);
if (!valid_remote(ret))
read_branches_file(remote_state, ret);
}
+#endif /* WITH_BREAKING_CHANGES */
if (name_given && !valid_remote(ret))
add_url_alias(remote_state, ret, name);
if (!valid_remote(ret))
@@ -907,210 +933,9 @@ void ref_push_report_free(struct ref_push_report *report)
}
}
-static int match_name_with_pattern(const char *key, const char *name,
- const char *value, char **result)
-{
- const char *kstar = strchr(key, '*');
- size_t klen;
- size_t ksuffixlen;
- size_t namelen;
- int ret;
- if (!kstar)
- die(_("key '%s' of pattern had no '*'"), key);
- klen = kstar - key;
- ksuffixlen = strlen(kstar + 1);
- namelen = strlen(name);
- ret = !strncmp(name, key, klen) && namelen >= klen + ksuffixlen &&
- !memcmp(name + namelen - ksuffixlen, kstar + 1, ksuffixlen);
- if (ret && value) {
- struct strbuf sb = STRBUF_INIT;
- const char *vstar = strchr(value, '*');
- if (!vstar)
- die(_("value '%s' of pattern has no '*'"), value);
- strbuf_add(&sb, value, vstar - value);
- strbuf_add(&sb, name + klen, namelen - klen - ksuffixlen);
- strbuf_addstr(&sb, vstar + 1);
- *result = strbuf_detach(&sb, NULL);
- }
- return ret;
-}
-
-static int refspec_match(const struct refspec_item *refspec,
- const char *name)
-{
- if (refspec->pattern)
- return match_name_with_pattern(refspec->src, name, NULL, NULL);
-
- return !strcmp(refspec->src, name);
-}
-
-int omit_name_by_refspec(const char *name, struct refspec *rs)
-{
- int i;
-
- for (i = 0; i < rs->nr; i++) {
- if (rs->items[i].negative && refspec_match(&rs->items[i], name))
- return 1;
- }
- return 0;
-}
-
-struct ref *apply_negative_refspecs(struct ref *ref_map, struct refspec *rs)
-{
- struct ref **tail;
-
- for (tail = &ref_map; *tail; ) {
- struct ref *ref = *tail;
-
- if (omit_name_by_refspec(ref->name, rs)) {
- *tail = ref->next;
- free(ref->peer_ref);
- free(ref);
- } else
- tail = &ref->next;
- }
-
- return ref_map;
-}
-
-static int query_matches_negative_refspec(struct refspec *rs, struct refspec_item *query)
-{
- int i, matched_negative = 0;
- int find_src = !query->src;
- struct string_list reversed = STRING_LIST_INIT_DUP;
- const char *needle = find_src ? query->dst : query->src;
-
- /*
- * Check whether the queried ref matches any negative refpsec. If so,
- * then we should ultimately treat this as not matching the query at
- * all.
- *
- * Note that negative refspecs always match the source, but the query
- * item uses the destination. To handle this, we apply pattern
- * refspecs in reverse to figure out if the query source matches any
- * of the negative refspecs.
- *
- * The first loop finds and expands all positive refspecs
- * matched by the queried ref.
- *
- * The second loop checks if any of the results of the first loop
- * match any negative refspec.
- */
- for (i = 0; i < rs->nr; i++) {
- struct refspec_item *refspec = &rs->items[i];
- char *expn_name;
-
- if (refspec->negative)
- continue;
-
- /* Note the reversal of src and dst */
- if (refspec->pattern) {
- const char *key = refspec->dst ? refspec->dst : refspec->src;
- const char *value = refspec->src;
-
- if (match_name_with_pattern(key, needle, value, &expn_name))
- string_list_append_nodup(&reversed, expn_name);
- } else if (refspec->matching) {
- /* For the special matching refspec, any query should match */
- string_list_append(&reversed, needle);
- } else if (!refspec->src) {
- BUG("refspec->src should not be null here");
- } else if (!strcmp(needle, refspec->src)) {
- string_list_append(&reversed, refspec->src);
- }
- }
-
- for (i = 0; !matched_negative && i < reversed.nr; i++) {
- if (omit_name_by_refspec(reversed.items[i].string, rs))
- matched_negative = 1;
- }
-
- string_list_clear(&reversed, 0);
-
- return matched_negative;
-}
-
-static void query_refspecs_multiple(struct refspec *rs,
- struct refspec_item *query,
- struct string_list *results)
-{
- int i;
- int find_src = !query->src;
-
- if (find_src && !query->dst)
- BUG("query_refspecs_multiple: need either src or dst");
-
- if (query_matches_negative_refspec(rs, query))
- return;
-
- for (i = 0; i < rs->nr; i++) {
- struct refspec_item *refspec = &rs->items[i];
- const char *key = find_src ? refspec->dst : refspec->src;
- const char *value = find_src ? refspec->src : refspec->dst;
- const char *needle = find_src ? query->dst : query->src;
- char **result = find_src ? &query->src : &query->dst;
-
- if (!refspec->dst || refspec->negative)
- continue;
- if (refspec->pattern) {
- if (match_name_with_pattern(key, needle, value, result))
- string_list_append_nodup(results, *result);
- } else if (!strcmp(needle, key)) {
- string_list_append(results, value);
- }
- }
-}
-
-int query_refspecs(struct refspec *rs, struct refspec_item *query)
-{
- int i;
- int find_src = !query->src;
- const char *needle = find_src ? query->dst : query->src;
- char **result = find_src ? &query->src : &query->dst;
-
- if (find_src && !query->dst)
- BUG("query_refspecs: need either src or dst");
-
- if (query_matches_negative_refspec(rs, query))
- return -1;
-
- for (i = 0; i < rs->nr; i++) {
- struct refspec_item *refspec = &rs->items[i];
- const char *key = find_src ? refspec->dst : refspec->src;
- const char *value = find_src ? refspec->src : refspec->dst;
-
- if (!refspec->dst || refspec->negative)
- continue;
- if (refspec->pattern) {
- if (match_name_with_pattern(key, needle, value, result)) {
- query->force = refspec->force;
- return 0;
- }
- } else if (!strcmp(needle, key)) {
- *result = xstrdup(value);
- query->force = refspec->force;
- return 0;
- }
- }
- return -1;
-}
-
-char *apply_refspecs(struct refspec *rs, const char *name)
-{
- struct refspec_item query;
-
- memset(&query, 0, sizeof(struct refspec_item));
- query.src = (char *)name;
-
- if (query_refspecs(rs, &query))
- return NULL;
-
- return query.dst;
-}
-
int remote_find_tracking(struct remote *remote, struct refspec_item *refspec)
{
- return query_refspecs(&remote->fetch, refspec);
+ return refspec_find_match(&remote->fetch, refspec);
}
static struct ref *alloc_ref_with_prefix(const char *prefix, size_t prefixlen,
@@ -1234,7 +1059,7 @@ int count_refspec_match(const char *pattern,
}
}
-static void tail_link_ref(struct ref *ref, struct ref ***tail)
+void tail_link_ref(struct ref *ref, struct ref ***tail)
{
**tail = ref;
while (ref->next)
@@ -1497,9 +1322,9 @@ static char *get_ref_match(const struct refspec *rs, const struct ref *ref,
const char *dst_side = item->dst ? item->dst : item->src;
int match;
if (direction == FROM_SRC)
- match = match_name_with_pattern(item->src, ref->name, dst_side, &name);
+ match = match_refname_with_pattern(item->src, ref->name, dst_side, &name);
else
- match = match_name_with_pattern(dst_side, ref->name, item->src, &name);
+ match = match_refname_with_pattern(dst_side, ref->name, item->src, &name);
if (match) {
matching_refs = i;
break;
@@ -1535,7 +1360,7 @@ static struct ref **tail_ref(struct ref **head)
struct tips {
struct commit **tip;
- int nr, alloc;
+ size_t nr, alloc;
};
static void add_to_tips(struct tips *tips, const struct object_id *oid)
@@ -1602,7 +1427,7 @@ static void add_missing_tags(struct ref *src, struct ref **dst, struct ref ***ds
const int reachable_flag = 1;
struct commit_list *found_commits;
struct commit **src_commits;
- int nr_src_commits = 0, alloc_src_commits = 16;
+ size_t nr_src_commits = 0, alloc_src_commits = 16;
ALLOC_ARRAY(src_commits, alloc_src_commits);
for_each_string_list_item(item, &src_tag) {
@@ -2117,7 +1942,7 @@ static struct ref *get_expanded_map(const struct ref *remote_refs,
if (strchr(ref->name, '^'))
continue; /* a dereference item */
- if (match_name_with_pattern(refspec->src, ref->name,
+ if (match_refname_with_pattern(refspec->src, ref->name,
refspec->dst, &expn_name) &&
!ignore_symref_update(expn_name, &scratch)) {
struct ref *cpy = copy_ref(ref);
@@ -2535,7 +2360,7 @@ static int get_stale_heads_cb(const char *refname, const char *referent UNUSED,
memset(&query, 0, sizeof(struct refspec_item));
query.dst = (char *)refname;
- query_refspecs_multiple(info->rs, &query, &matches);
+ refspec_find_all_matches(info->rs, &query, &matches);
if (matches.nr == 0)
goto clean_exit; /* No matches */
@@ -3003,3 +2828,13 @@ char *relative_url(const char *remote_url, const char *url,
free(out);
return strbuf_detach(&sb, NULL);
}
+
+int valid_remote_name(const char *name)
+{
+ int result;
+ struct strbuf refspec = STRBUF_INIT;
+ strbuf_addf(&refspec, "refs/heads/test:refs/remotes/%s/test", name);
+ result = valid_fetch_refspec(refspec.buf);
+ strbuf_release(&refspec);
+ return result;
+}
diff --git a/remote.h b/remote.h
index bda10dd5c8..6be5031f64 100644
--- a/remote.h
+++ b/remote.h
@@ -21,8 +21,10 @@ struct transport_ls_refs_options;
enum {
REMOTE_UNCONFIGURED = 0,
REMOTE_CONFIG,
+#ifndef WITH_BREAKING_CHANGES
REMOTE_REMOTES,
REMOTE_BRANCHES
+#endif /* WITH_BREAKING_CHANGES */
};
struct rewrite {
@@ -219,6 +221,11 @@ struct ref *alloc_ref(const char *name);
struct ref *copy_ref(const struct ref *ref);
struct ref *copy_ref_list(const struct ref *ref);
int count_refspec_match(const char *, struct ref *refs, struct ref **matched_ref);
+/*
+ * Put a ref in the tail and prepare tail for adding another one.
+ * *tail is the pointer to the tail of the list of refs.
+ */
+void tail_link_ref(struct ref *ref, struct ref ***tail);
int check_ref_type(const struct ref *ref, int flags);
@@ -261,21 +268,6 @@ int resolve_remote_symref(struct ref *ref, struct ref *list);
*/
struct ref *ref_remove_duplicates(struct ref *ref_map);
-/*
- * Check whether a name matches any negative refspec in rs. Returns 1 if the
- * name matches at least one negative refspec, and 0 otherwise.
- */
-int omit_name_by_refspec(const char *name, struct refspec *rs);
-
-/*
- * Remove all entries in the input list which match any negative refspec in
- * the refspec list.
- */
-struct ref *apply_negative_refspecs(struct ref *ref_map, struct refspec *rs);
-
-int query_refspecs(struct refspec *rs, struct refspec_item *query);
-char *apply_refspecs(struct refspec *rs, const char *name);
-
int check_push_refs(struct ref *src, struct refspec *rs);
int match_push_refs(struct ref *src, struct ref **dst,
struct refspec *rs, int flags);
@@ -461,4 +453,6 @@ void apply_push_cas(struct push_cas_option *, struct remote *, struct ref *);
char *relative_url(const char *remote_url, const char *url,
const char *up_path);
+int valid_remote_name(const char *name);
+
#endif
diff --git a/rerere.c b/rerere.c
index e7fa6426b3..c42cee618b 100644
--- a/rerere.c
+++ b/rerere.c
@@ -358,7 +358,7 @@ static void rerere_strbuf_putconflict(struct strbuf *buf, int ch, size_t size)
}
static int handle_conflict(struct strbuf *out, struct rerere_io *io,
- int marker_size, git_hash_ctx *ctx)
+ int marker_size, struct git_hash_ctx *ctx)
{
enum {
RR_SIDE_1 = 0, RR_SIDE_2, RR_ORIGINAL
@@ -396,12 +396,12 @@ static int handle_conflict(struct strbuf *out, struct rerere_io *io,
strbuf_addbuf(out, &two);
rerere_strbuf_putconflict(out, '>', marker_size);
if (ctx) {
- the_hash_algo->update_fn(ctx, one.buf ?
- one.buf : "",
- one.len + 1);
- the_hash_algo->update_fn(ctx, two.buf ?
- two.buf : "",
- two.len + 1);
+ git_hash_update(ctx, one.buf ?
+ one.buf : "",
+ one.len + 1);
+ git_hash_update(ctx, two.buf ?
+ two.buf : "",
+ two.len + 1);
}
break;
} else if (hunk == RR_SIDE_1)
@@ -432,7 +432,7 @@ static int handle_conflict(struct strbuf *out, struct rerere_io *io,
*/
static int handle_path(unsigned char *hash, struct rerere_io *io, int marker_size)
{
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
struct strbuf buf = STRBUF_INIT, out = STRBUF_INIT;
int has_conflicts = 0;
if (hash)
@@ -453,7 +453,7 @@ static int handle_path(unsigned char *hash, struct rerere_io *io, int marker_siz
strbuf_release(&out);
if (hash)
- the_hash_algo->final_fn(hash, &ctx);
+ git_hash_final(hash, &ctx);
return has_conflicts;
}
diff --git a/resolve-undo.c b/resolve-undo.c
index b5a9dfb4ac..52c45e5a49 100644
--- a/resolve-undo.c
+++ b/resolve-undo.c
@@ -1,4 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
@@ -34,7 +33,8 @@ void record_resolve_undo(struct index_state *istate, struct cache_entry *ce)
ui->mode[stage - 1] = ce->ce_mode;
}
-void resolve_undo_write(struct strbuf *sb, struct string_list *resolve_undo)
+void resolve_undo_write(struct strbuf *sb, struct string_list *resolve_undo,
+ const struct git_hash_algo *algop)
{
struct string_list_item *item;
for_each_string_list_item(item, resolve_undo) {
@@ -50,18 +50,19 @@ void resolve_undo_write(struct strbuf *sb, struct string_list *resolve_undo)
for (i = 0; i < 3; i++) {
if (!ui->mode[i])
continue;
- strbuf_add(sb, ui->oid[i].hash, the_hash_algo->rawsz);
+ strbuf_add(sb, ui->oid[i].hash, algop->rawsz);
}
}
}
-struct string_list *resolve_undo_read(const char *data, unsigned long size)
+struct string_list *resolve_undo_read(const char *data, unsigned long size,
+ const struct git_hash_algo *algop)
{
struct string_list *resolve_undo;
size_t len;
char *endptr;
int i;
- const unsigned rawsz = the_hash_algo->rawsz;
+ const unsigned rawsz = algop->rawsz;
CALLOC_ARRAY(resolve_undo, 1);
resolve_undo->strdup_strings = 1;
@@ -96,8 +97,7 @@ struct string_list *resolve_undo_read(const char *data, unsigned long size)
continue;
if (size < rawsz)
goto error;
- oidread(&ui->oid[i], (const unsigned char *)data,
- the_repository->hash_algo);
+ oidread(&ui->oid[i], (const unsigned char *)data, algop);
size -= rawsz;
data += rawsz;
}
diff --git a/resolve-undo.h b/resolve-undo.h
index 89a3227262..7ed11a1c59 100644
--- a/resolve-undo.h
+++ b/resolve-undo.h
@@ -14,8 +14,10 @@ struct resolve_undo_info {
};
void record_resolve_undo(struct index_state *, struct cache_entry *);
-void resolve_undo_write(struct strbuf *, struct string_list *);
-struct string_list *resolve_undo_read(const char *, unsigned long);
+void resolve_undo_write(struct strbuf *, struct string_list *,
+ const struct git_hash_algo *algop);
+struct string_list *resolve_undo_read(const char *, unsigned long,
+ const struct git_hash_algo *algop);
void resolve_undo_clear_index(struct index_state *);
int unmerge_index_entry(struct index_state *, const char *, struct resolve_undo_info *, unsigned);
void unmerge_index(struct index_state *, const struct pathspec *, unsigned);
diff --git a/scalar.c b/scalar.c
index f24bcd0169..da42b4be0c 100644
--- a/scalar.c
+++ b/scalar.c
@@ -409,6 +409,7 @@ void load_builtin_commands(const char *prefix UNUSED,
static int cmd_clone(int argc, const char **argv)
{
const char *branch = NULL;
+ char *branch_to_free = NULL;
int full_clone = 0, single_branch = 0, show_progress = isatty(2);
int src = 1, tags = 1;
struct option clone_options[] = {
@@ -490,7 +491,7 @@ static int cmd_clone(int argc, const char **argv)
/* common-main already logs `argv` */
trace2_def_repo(the_repository);
- if (!branch && !(branch = remote_default_branch(url))) {
+ if (!branch && !(branch = branch_to_free = remote_default_branch(url))) {
res = error(_("failed to get default branch for '%s'"), url);
goto cleanup;
}
@@ -552,6 +553,7 @@ static int cmd_clone(int argc, const char **argv)
res = register_dir();
cleanup:
+ free(branch_to_free);
free(enlistment);
free(dir);
strbuf_release(&buf);
diff --git a/send-pack.c b/send-pack.c
index 7e83213683..856a65d5f5 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -1,5 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
-
#include "git-compat-util.h"
#include "config.h"
#include "commit.h"
@@ -44,10 +42,11 @@ int option_parse_push_signed(const struct option *opt,
die("bad %s argument: %s", opt->long_name, arg);
}
-static void feed_object(const struct object_id *oid, FILE *fh, int negative)
+static void feed_object(struct repository *r,
+ const struct object_id *oid, FILE *fh, int negative)
{
if (negative &&
- !repo_has_object_file_with_flags(the_repository, oid,
+ !repo_has_object_file_with_flags(r, oid,
OBJECT_INFO_SKIP_FETCH_OBJECT |
OBJECT_INFO_QUICK))
return;
@@ -61,7 +60,8 @@ static void feed_object(const struct object_id *oid, FILE *fh, int negative)
/*
* Make a pack stream and spit it out into file descriptor fd
*/
-static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
+static int pack_objects(struct repository *r,
+ int fd, struct ref *refs, struct oid_array *advertised,
struct oid_array *negotiated,
struct send_pack_args *args)
{
@@ -74,7 +74,7 @@ static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
FILE *po_in;
int rc;
- trace2_region_enter("send_pack", "pack_objects", the_repository);
+ trace2_region_enter("send_pack", "pack_objects", r);
strvec_push(&po.args, "pack-objects");
strvec_push(&po.args, "--all-progress-implied");
strvec_push(&po.args, "--revs");
@@ -87,7 +87,7 @@ static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
strvec_push(&po.args, "-q");
if (args->progress)
strvec_push(&po.args, "--progress");
- if (is_repository_shallow(the_repository))
+ if (is_repository_shallow(r))
strvec_push(&po.args, "--shallow");
if (args->disable_bitmaps)
strvec_push(&po.args, "--no-use-bitmap-index");
@@ -104,15 +104,15 @@ static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
*/
po_in = xfdopen(po.in, "w");
for (size_t i = 0; i < advertised->nr; i++)
- feed_object(&advertised->oid[i], po_in, 1);
+ feed_object(r, &advertised->oid[i], po_in, 1);
for (size_t i = 0; i < negotiated->nr; i++)
- feed_object(&negotiated->oid[i], po_in, 1);
+ feed_object(r, &negotiated->oid[i], po_in, 1);
while (refs) {
if (!is_null_oid(&refs->old_oid))
- feed_object(&refs->old_oid, po_in, 1);
+ feed_object(r, &refs->old_oid, po_in, 1);
if (!is_null_oid(&refs->new_oid))
- feed_object(&refs->new_oid, po_in, 0);
+ feed_object(r, &refs->new_oid, po_in, 0);
refs = refs->next;
}
@@ -146,10 +146,10 @@ static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
*/
if (rc > 128 && rc != 141)
error("pack-objects died of signal %d", rc - 128);
- trace2_region_leave("send_pack", "pack_objects", the_repository);
+ trace2_region_leave("send_pack", "pack_objects", r);
return -1;
}
- trace2_region_leave("send_pack", "pack_objects", the_repository);
+ trace2_region_leave("send_pack", "pack_objects", r);
return 0;
}
@@ -164,7 +164,8 @@ static int receive_unpack_status(struct packet_reader *reader)
return 0;
}
-static int receive_status(struct packet_reader *reader, struct ref *refs)
+static int receive_status(struct repository *r,
+ struct packet_reader *reader, struct ref *refs)
{
struct ref *hint;
int ret;
@@ -172,7 +173,7 @@ static int receive_status(struct packet_reader *reader, struct ref *refs)
int new_report = 0;
int once = 0;
- trace2_region_enter("send_pack", "receive_status", the_repository);
+ trace2_region_enter("send_pack", "receive_status", r);
hint = NULL;
ret = receive_unpack_status(reader);
while (1) {
@@ -221,10 +222,10 @@ static int receive_status(struct packet_reader *reader, struct ref *refs)
if (!strcmp(key, "refname"))
report->ref_name = xstrdup_or_null(val);
else if (!strcmp(key, "old-oid") && val &&
- !parse_oid_hex(val, &old_oid, &val))
+ !parse_oid_hex_algop(val, &old_oid, &val, r->hash_algo))
report->old_oid = oiddup(&old_oid);
else if (!strcmp(key, "new-oid") && val &&
- !parse_oid_hex(val, &new_oid, &val))
+ !parse_oid_hex_algop(val, &new_oid, &val, r->hash_algo))
report->new_oid = oiddup(&new_oid);
else if (!strcmp(key, "forced-update"))
report->forced_update = 1;
@@ -271,7 +272,7 @@ static int receive_status(struct packet_reader *reader, struct ref *refs)
new_report = 1;
}
}
- trace2_region_leave("send_pack", "receive_status", the_repository);
+ trace2_region_leave("send_pack", "receive_status", r);
return ret;
}
@@ -293,9 +294,9 @@ static int advertise_shallow_grafts_cb(const struct commit_graft *graft, void *c
return 0;
}
-static void advertise_shallow_grafts_buf(struct strbuf *sb)
+static void advertise_shallow_grafts_buf(struct repository *r, struct strbuf *sb)
{
- if (!is_repository_shallow(the_repository))
+ if (!is_repository_shallow(r))
return;
for_each_commit_graft(advertise_shallow_grafts_cb, sb);
}
@@ -426,13 +427,14 @@ static void reject_invalid_nonce(const char *nonce, int len)
}
}
-static void get_commons_through_negotiation(const char *url,
+static void get_commons_through_negotiation(struct repository *r,
+ const char *url,
const struct ref *remote_refs,
struct oid_array *commons)
{
struct child_process child = CHILD_PROCESS_INIT;
const struct ref *ref;
- int len = the_hash_algo->hexsz + 1; /* hash + NL */
+ int len = r->hash_algo->hexsz + 1; /* hash + NL */
int nr_negotiation_tip = 0;
child.git_cmd = 1;
@@ -466,7 +468,7 @@ static void get_commons_through_negotiation(const char *url,
break;
if (read_len != len)
die("invalid length read %d", read_len);
- if (parse_oid_hex(hex_hash, &oid, &end) || *end != '\n')
+ if (parse_oid_hex_algop(hex_hash, &oid, &end, r->hash_algo) || *end != '\n')
die("invalid hash");
oid_array_append(commons, &oid);
} while (1);
@@ -480,7 +482,8 @@ static void get_commons_through_negotiation(const char *url,
}
}
-int send_pack(struct send_pack_args *args,
+int send_pack(struct repository *r,
+ struct send_pack_args *args,
int fd[], struct child_process *conn,
struct ref *remote_refs,
struct oid_array *extra_have)
@@ -518,17 +521,17 @@ int send_pack(struct send_pack_args *args,
goto out;
}
- git_config_get_bool("push.negotiate", &push_negotiate);
+ repo_config_get_bool(r, "push.negotiate", &push_negotiate);
if (push_negotiate) {
- trace2_region_enter("send_pack", "push_negotiate", the_repository);
- get_commons_through_negotiation(args->url, remote_refs, &commons);
- trace2_region_leave("send_pack", "push_negotiate", the_repository);
+ trace2_region_enter("send_pack", "push_negotiate", r);
+ get_commons_through_negotiation(r, args->url, remote_refs, &commons);
+ trace2_region_leave("send_pack", "push_negotiate", r);
}
- if (!git_config_get_bool("push.usebitmaps", &use_bitmaps))
+ if (!repo_config_get_bool(r, "push.usebitmaps", &use_bitmaps))
args->disable_bitmaps = !use_bitmaps;
- git_config_get_bool("transfer.advertisesid", &advertise_sid);
+ repo_config_get_bool(r, "transfer.advertisesid", &advertise_sid);
/* Does the other end support the reporting? */
if (server_supports("report-status-v2"))
@@ -554,7 +557,7 @@ int send_pack(struct send_pack_args *args,
if (server_supports("push-options"))
push_options_supported = 1;
- if (!server_supports_hash(the_hash_algo->name, &object_format_supported))
+ if (!server_supports_hash(r->hash_algo->name, &object_format_supported))
die(_("the receiving end does not support this repository's hash algorithm"));
if (args->push_cert != SEND_PACK_PUSH_CERT_NEVER) {
@@ -596,7 +599,7 @@ int send_pack(struct send_pack_args *args,
if (use_push_options)
strbuf_addstr(&cap_buf, " push-options");
if (object_format_supported)
- strbuf_addf(&cap_buf, " object-format=%s", the_hash_algo->name);
+ strbuf_addf(&cap_buf, " object-format=%s", r->hash_algo->name);
if (agent_supported)
strbuf_addf(&cap_buf, " agent=%s", git_user_agent_sanitized());
if (advertise_sid)
@@ -629,7 +632,8 @@ int send_pack(struct send_pack_args *args,
reject_atomic_push(remote_refs, args->send_mirror);
error("atomic push failed for ref %s. status: %d",
ref->name, ref->status);
- ret = args->porcelain ? 0 : -1;
+ ret = ERROR_SEND_PACK_BAD_REF_STATUS;
+ packet_flush(out);
goto out;
}
/* else fallthrough */
@@ -646,7 +650,7 @@ int send_pack(struct send_pack_args *args,
}
if (!args->dry_run)
- advertise_shallow_grafts_buf(&req_buf);
+ advertise_shallow_grafts_buf(r, &req_buf);
/*
* Finally, tell the other end!
@@ -686,7 +690,7 @@ int send_pack(struct send_pack_args *args,
}
if (args->stateless_rpc) {
- if (!args->dry_run && (cmds_sent || is_repository_shallow(the_repository))) {
+ if (!args->dry_run && (cmds_sent || is_repository_shallow(r))) {
packet_buf_flush(&req_buf);
send_sideband(out, -1, req_buf.buf, req_buf.len, LARGE_PACKET_MAX);
}
@@ -711,7 +715,7 @@ int send_pack(struct send_pack_args *args,
PACKET_READ_DIE_ON_ERR_PACKET);
if (need_pack_data && cmds_sent) {
- if (pack_objects(out, remote_refs, extra_have, &commons, args) < 0) {
+ if (pack_objects(r, out, remote_refs, extra_have, &commons, args) < 0) {
if (args->stateless_rpc)
close(out);
if (git_connection_is_socket(conn))
@@ -724,7 +728,7 @@ int send_pack(struct send_pack_args *args,
* we get one).
*/
if (status_report)
- receive_status(&reader, remote_refs);
+ receive_status(r, &reader, remote_refs);
if (use_sideband) {
close(demux.out);
@@ -743,7 +747,7 @@ int send_pack(struct send_pack_args *args,
packet_flush(out);
if (status_report && cmds_sent)
- ret = receive_status(&reader, remote_refs);
+ ret = receive_status(r, &reader, remote_refs);
else
ret = 0;
if (args->stateless_rpc)
@@ -760,11 +764,6 @@ int send_pack(struct send_pack_args *args,
if (ret < 0)
goto out;
- if (args->porcelain) {
- ret = 0;
- goto out;
- }
-
for (ref = remote_refs; ref; ref = ref->next) {
switch (ref->status) {
case REF_STATUS_NONE:
@@ -772,7 +771,7 @@ int send_pack(struct send_pack_args *args,
case REF_STATUS_OK:
break;
default:
- ret = -1;
+ ret = ERROR_SEND_PACK_BAD_REF_STATUS;
goto out;
}
}
diff --git a/send-pack.h b/send-pack.h
index 7edb80596c..c5ded2d200 100644
--- a/send-pack.h
+++ b/send-pack.h
@@ -6,12 +6,16 @@
struct child_process;
struct oid_array;
struct ref;
+struct repository;
/* Possible values for push_cert field in send_pack_args. */
#define SEND_PACK_PUSH_CERT_NEVER 0
#define SEND_PACK_PUSH_CERT_IF_ASKED 1
#define SEND_PACK_PUSH_CERT_ALWAYS 2
+/* At least one reference has been rejected by the remote side. */
+#define ERROR_SEND_PACK_BAD_REF_STATUS 1
+
struct send_pack_args {
const char *url;
unsigned verbose:1,
@@ -35,7 +39,17 @@ struct option;
int option_parse_push_signed(const struct option *opt,
const char *arg, int unset);
-int send_pack(struct send_pack_args *args,
+/*
+ * Compute a packfile and write it to a file descriptor. The `fd` array needs
+ * to contain two file descriptors: `fd[0]` is the file descriptor used as
+ * input for the packet reader, whereas `fd[1]` is the file descriptor the
+ * packfile will be written to.
+ *
+ * Returns 0 on success, non-zero otherwise. Negative return values indicate a
+ * generic error, whereas positive return values indicate specific error
+ * conditions as documented with the `ERROR_SEND_PACK_*` constants.
+ */
+int send_pack(struct repository *r, struct send_pack_args *args,
int fd[], struct child_process *conn,
struct ref *remote_refs, struct oid_array *extra_have);
diff --git a/serve.c b/serve.c
index c8694e3751..f6dfe34a2b 100644
--- a/serve.c
+++ b/serve.c
@@ -1,5 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
-
#include "git-compat-util.h"
#include "repository.h"
#include "config.h"
@@ -159,7 +157,7 @@ static struct protocol_capability capabilities[] = {
},
};
-void protocol_v2_advertise_capabilities(void)
+void protocol_v2_advertise_capabilities(struct repository *r)
{
struct strbuf capability = STRBUF_INIT;
struct strbuf value = STRBUF_INIT;
@@ -170,7 +168,7 @@ void protocol_v2_advertise_capabilities(void)
for (size_t i = 0; i < ARRAY_SIZE(capabilities); i++) {
struct protocol_capability *c = &capabilities[i];
- if (c->advertise(the_repository, &value)) {
+ if (c->advertise(r, &value)) {
strbuf_addstr(&capability, c->name);
if (value.len) {
@@ -214,20 +212,20 @@ static struct protocol_capability *get_capability(const char *key, const char **
return NULL;
}
-static int receive_client_capability(const char *key)
+static int receive_client_capability(struct repository *r, const char *key)
{
const char *value;
const struct protocol_capability *c = get_capability(key, &value);
- if (!c || c->command || !c->advertise(the_repository, NULL))
+ if (!c || c->command || !c->advertise(r, NULL))
return 0;
if (c->receive)
- c->receive(the_repository, value);
+ c->receive(r, value);
return 1;
}
-static int parse_command(const char *key, struct protocol_capability **command)
+static int parse_command(struct repository *r, const char *key, struct protocol_capability **command)
{
const char *out;
@@ -238,7 +236,7 @@ static int parse_command(const char *key, struct protocol_capability **command)
if (*command)
die("command '%s' requested after already requesting command '%s'",
out, (*command)->name);
- if (!cmd || !cmd->advertise(the_repository, NULL) || !cmd->command || value)
+ if (!cmd || !cmd->advertise(r, NULL) || !cmd->command || value)
die("invalid command '%s'", out);
*command = cmd;
@@ -253,7 +251,7 @@ enum request_state {
PROCESS_REQUEST_DONE,
};
-static int process_request(void)
+static int process_request(struct repository *r)
{
enum request_state state = PROCESS_REQUEST_KEYS;
struct packet_reader reader;
@@ -278,8 +276,8 @@ static int process_request(void)
case PACKET_READ_EOF:
BUG("Should have already died when seeing EOF");
case PACKET_READ_NORMAL:
- if (parse_command(reader.line, &command) ||
- receive_client_capability(reader.line))
+ if (parse_command(r, reader.line, &command) ||
+ receive_client_capability(r, reader.line))
seen_capability_or_command = 1;
else
die("unknown capability '%s'", reader.line);
@@ -319,30 +317,30 @@ static int process_request(void)
if (!command)
die("no command requested");
- if (client_hash_algo != hash_algo_by_ptr(the_repository->hash_algo))
+ if (client_hash_algo != hash_algo_by_ptr(r->hash_algo))
die("mismatched object format: server %s; client %s",
- the_repository->hash_algo->name,
+ r->hash_algo->name,
hash_algos[client_hash_algo].name);
- command->command(the_repository, &reader);
+ command->command(r, &reader);
return 0;
}
-void protocol_v2_serve_loop(int stateless_rpc)
+void protocol_v2_serve_loop(struct repository *r, int stateless_rpc)
{
if (!stateless_rpc)
- protocol_v2_advertise_capabilities();
+ protocol_v2_advertise_capabilities(r);
/*
* If stateless-rpc was requested then exit after
* a single request/response exchange
*/
if (stateless_rpc) {
- process_request();
+ process_request(r);
} else {
for (;;)
- if (process_request())
+ if (process_request(r))
break;
}
}
diff --git a/serve.h b/serve.h
index f946cf904a..85bf73cfe5 100644
--- a/serve.h
+++ b/serve.h
@@ -1,7 +1,9 @@
#ifndef SERVE_H
#define SERVE_H
-void protocol_v2_advertise_capabilities(void);
-void protocol_v2_serve_loop(int stateless_rpc);
+struct repository;
+
+void protocol_v2_advertise_capabilities(struct repository *r);
+void protocol_v2_serve_loop(struct repository *r, int stateless_rpc);
#endif /* SERVE_H */
diff --git a/server-info.c b/server-info.c
index ef2f3f4b5c..31c3fdc118 100644
--- a/server-info.c
+++ b/server-info.c
@@ -1,4 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
@@ -18,6 +17,7 @@
#include "tempfile.h"
struct update_info_ctx {
+ struct repository *repo;
FILE *cur_fp;
FILE *old_fp; /* becomes NULL if it differs from cur_fp */
struct strbuf cur_sb;
@@ -73,7 +73,7 @@ static int uic_printf(struct update_info_ctx *uic, const char *fmt, ...)
* it into place. The contents of the file come from "generate", which
* should return non-zero if it encounters an error.
*/
-static int update_info_file(char *path,
+static int update_info_file(struct repository *r, char *path,
int (*generate)(struct update_info_ctx *),
int force)
{
@@ -81,6 +81,7 @@ static int update_info_file(char *path,
struct tempfile *f = NULL;
int ret = -1;
struct update_info_ctx uic = {
+ .repo = r,
.cur_fp = NULL,
.old_fp = NULL,
.cur_sb = STRBUF_INIT,
@@ -152,7 +153,7 @@ static int add_info_ref(const char *path, const char *referent UNUSED, const str
void *cb_data)
{
struct update_info_ctx *uic = cb_data;
- struct object *o = parse_object(the_repository, oid);
+ struct object *o = parse_object(uic->repo, oid);
if (!o)
return -1;
@@ -160,7 +161,7 @@ static int add_info_ref(const char *path, const char *referent UNUSED, const str
return -1;
if (o->type == OBJ_TAG) {
- o = deref_tag(the_repository, o, path, 0);
+ o = deref_tag(uic->repo, o, path, 0);
if (o)
if (uic_printf(uic, "%s %s^{}\n",
oid_to_hex(&o->oid), path) < 0)
@@ -171,14 +172,14 @@ static int add_info_ref(const char *path, const char *referent UNUSED, const str
static int generate_info_refs(struct update_info_ctx *uic)
{
- return refs_for_each_ref(get_main_ref_store(the_repository),
+ return refs_for_each_ref(get_main_ref_store(uic->repo),
add_info_ref, uic);
}
-static int update_info_refs(int force)
+static int update_info_refs(struct repository *r, int force)
{
- char *path = git_pathdup("info/refs");
- int ret = update_info_file(path, generate_info_refs, force);
+ char *path = repo_git_path(r, "info/refs");
+ int ret = update_info_file(r, path, generate_info_refs, force);
free(path);
return ret;
}
@@ -284,14 +285,14 @@ static int compare_info(const void *a_, const void *b_)
return 1;
}
-static void init_pack_info(const char *infofile, int force)
+static void init_pack_info(struct repository *r, const char *infofile, int force)
{
struct packed_git *p;
int stale;
int i;
size_t alloc = 0;
- for (p = get_all_packs(the_repository); p; p = p->next) {
+ for (p = get_all_packs(r); p; p = p->next) {
/* we ignore things on alternate path since they are
* not available to the pullers in general.
*/
@@ -340,33 +341,36 @@ static int write_pack_info_file(struct update_info_ctx *uic)
return 0;
}
-static int update_info_packs(int force)
+static int update_info_packs(struct repository *r, int force)
{
char *infofile = mkpathdup("%s/info/packs",
- repo_get_object_directory(the_repository));
+ repo_get_object_directory(r));
int ret;
- init_pack_info(infofile, force);
- ret = update_info_file(infofile, write_pack_info_file, force);
+ init_pack_info(r, infofile, force);
+ ret = update_info_file(r, infofile, write_pack_info_file, force);
free_pack_info();
free(infofile);
return ret;
}
/* public */
-int update_server_info(int force)
+int update_server_info(struct repository *r, int force)
{
/* We would add more dumb-server support files later,
* including index of available pack files and their
* intended audiences.
*/
int errs = 0;
+ char *path;
- errs = errs | update_info_refs(force);
- errs = errs | update_info_packs(force);
+ errs = errs | update_info_refs(r, force);
+ errs = errs | update_info_packs(r, force);
/* remove leftover rev-cache file if there is any */
- unlink_or_warn(git_path("info/rev-cache"));
+ path = repo_git_path(r, "info/rev-cache");
+ unlink_or_warn(path);
+ free(path);
return errs;
}
diff --git a/server-info.h b/server-info.h
index 13bbde2c55..e634d1722b 100644
--- a/server-info.h
+++ b/server-info.h
@@ -1,7 +1,9 @@
#ifndef SERVER_INFO_H
#define SERVER_INFO_H
+struct repository;
+
/* Dumb servers support */
-int update_server_info(int);
+int update_server_info(struct repository *r, int force);
#endif /* SERVER_INFO_H */
diff --git a/setup.c b/setup.c
index 8a488f3e7c..7da7aa8984 100644
--- a/setup.c
+++ b/setup.c
@@ -2517,7 +2517,9 @@ static void repository_format_configure(struct repository_format *repo_fmt,
int env_algo = hash_algo_by_name(env);
if (env_algo == GIT_HASH_UNKNOWN)
die(_("unknown hash algorithm '%s'"), env);
- repo_fmt->hash_algo = env_algo;
+ if (repo_fmt->version < 0 ||
+ repo_fmt->hash_algo == GIT_HASH_UNKNOWN)
+ repo_fmt->hash_algo = env_algo;
} else if (cfg.hash != GIT_HASH_UNKNOWN) {
repo_fmt->hash_algo = cfg.hash;
}
@@ -2534,7 +2536,9 @@ static void repository_format_configure(struct repository_format *repo_fmt,
ref_format = ref_storage_format_by_name(env);
if (ref_format == REF_STORAGE_FORMAT_UNKNOWN)
die(_("unknown ref storage format '%s'"), env);
- repo_fmt->ref_storage_format = ref_format;
+ if (repo_fmt->version < 0 ||
+ repo_fmt->ref_storage_format == REF_STORAGE_FORMAT_UNKNOWN)
+ repo_fmt->ref_storage_format = ref_format;
} else if (cfg.ref_format != REF_STORAGE_FORMAT_UNKNOWN) {
repo_fmt->ref_storage_format = cfg.ref_format;
}
diff --git a/shallow.c b/shallow.c
index 82a8da3d73..b54244ffa9 100644
--- a/shallow.c
+++ b/shallow.c
@@ -1,5 +1,4 @@
#define USE_THE_REPOSITORY_VARIABLE
-#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
#include "hex.h"
@@ -134,7 +133,8 @@ static void free_depth_in_slab(int **ptr)
struct commit_list *get_shallow_commits(struct object_array *heads, int depth,
int shallow_flag, int not_shallow_flag)
{
- int i = 0, cur_depth = 0;
+ size_t i = 0;
+ int cur_depth = 0;
struct commit_list *result = NULL;
struct object_array stack = OBJECT_ARRAY_INIT;
struct commit *commit = NULL;
@@ -335,16 +335,16 @@ static int write_shallow_commits_1(struct strbuf *out, int use_pack_protocol,
const struct oid_array *extra,
unsigned flags)
{
- struct write_shallow_data data;
- int i;
- data.out = out;
- data.use_pack_protocol = use_pack_protocol;
- data.count = 0;
- data.flags = flags;
+ struct write_shallow_data data = {
+ .out = out,
+ .use_pack_protocol = use_pack_protocol,
+ .flags = flags,
+ };
+
for_each_commit_graft(write_one_shallow, &data);
if (!extra)
return data.count;
- for (i = 0; i < extra->nr; i++) {
+ for (size_t i = 0; i < extra->nr; i++) {
strbuf_addstr(out, oid_to_hex(extra->oid + i));
strbuf_addch(out, '\n');
data.count++;
@@ -466,7 +466,6 @@ struct trace_key trace_shallow = TRACE_KEY_INIT(SHALLOW);
*/
void prepare_shallow_info(struct shallow_info *info, struct oid_array *sa)
{
- int i;
trace_printf_key(&trace_shallow, "shallow: prepare_shallow_info\n");
memset(info, 0, sizeof(*info));
info->shallow = sa;
@@ -474,7 +473,7 @@ void prepare_shallow_info(struct shallow_info *info, struct oid_array *sa)
return;
ALLOC_ARRAY(info->ours, sa->nr);
ALLOC_ARRAY(info->theirs, sa->nr);
- for (i = 0; i < sa->nr; i++) {
+ for (size_t i = 0; i < sa->nr; i++) {
if (repo_has_object_file(the_repository, sa->oid + i)) {
struct commit_graft *graft;
graft = lookup_commit_graft(the_repository,
@@ -507,7 +506,7 @@ void clear_shallow_info(struct shallow_info *info)
void remove_nonexistent_theirs_shallow(struct shallow_info *info)
{
struct object_id *oid = info->shallow->oid;
- int i, dst;
+ size_t i, dst;
trace_printf_key(&trace_shallow, "shallow: remove_nonexistent_theirs_shallow\n");
for (i = dst = 0; i < info->nr_theirs; i++) {
if (i != dst)
@@ -535,7 +534,7 @@ static uint32_t *paint_alloc(struct paint_info *info)
unsigned nr = DIV_ROUND_UP(info->nr_bits, 32);
unsigned size = nr * sizeof(uint32_t);
void *p;
- if (!info->pool_count || size > info->end - info->free) {
+ if (!info->pool_count || info->end < info->free + size) {
if (size > POOL_SIZE)
BUG("pool size too small for %d in paint_alloc()",
size);
@@ -560,7 +559,7 @@ static void paint_down(struct paint_info *info, const struct object_id *oid,
{
unsigned int i, nr;
struct commit_list *head = NULL;
- int bitmap_nr = DIV_ROUND_UP(info->nr_bits, 32);
+ size_t bitmap_nr = DIV_ROUND_UP(info->nr_bits, 32);
size_t bitmap_size = st_mult(sizeof(uint32_t), bitmap_nr);
struct commit *c = lookup_commit_reference_gently(the_repository, oid,
1);
@@ -660,7 +659,7 @@ void assign_shallow_commits_to_refs(struct shallow_info *info,
struct object_id *oid = info->shallow->oid;
struct oid_array *ref = info->ref;
unsigned int i, nr;
- int *shallow, nr_shallow = 0;
+ size_t *shallow, nr_shallow = 0;
struct paint_info pi;
trace_printf_key(&trace_shallow, "shallow: assign_shallow_commits_to_refs\n");
@@ -735,7 +734,7 @@ void assign_shallow_commits_to_refs(struct shallow_info *info,
struct commit_array {
struct commit **commits;
- int nr, alloc;
+ size_t nr, alloc;
};
static int add_ref(const char *refname UNUSED,
@@ -753,12 +752,11 @@ static int add_ref(const char *refname UNUSED,
return 0;
}
-static void update_refstatus(int *ref_status, int nr, uint32_t *bitmap)
+static void update_refstatus(int *ref_status, size_t nr, uint32_t *bitmap)
{
- unsigned int i;
if (!ref_status)
return;
- for (i = 0; i < nr; i++)
+ for (size_t i = 0; i < nr; i++)
if (bitmap[i / 32] & (1U << (i % 32)))
ref_status[i]++;
}
@@ -773,8 +771,8 @@ static void post_assign_shallow(struct shallow_info *info,
struct object_id *oid = info->shallow->oid;
struct commit *c;
uint32_t **bitmap;
- int dst, i, j;
- int bitmap_nr = DIV_ROUND_UP(info->ref->nr, 32);
+ size_t dst, i, j;
+ size_t bitmap_nr = DIV_ROUND_UP(info->ref->nr, 32);
struct commit_array ca;
trace_printf_key(&trace_shallow, "shallow: post_assign_shallow\n");
diff --git a/shallow.h b/shallow.h
index e9ca7e4bc8..9bfeade93e 100644
--- a/shallow.h
+++ b/shallow.h
@@ -59,8 +59,8 @@ void prune_shallow(unsigned options);
*/
struct shallow_info {
struct oid_array *shallow;
- int *ours, nr_ours;
- int *theirs, nr_theirs;
+ size_t *ours, nr_ours;
+ size_t *theirs, nr_theirs;
struct oid_array *ref;
/* for receive-pack */
@@ -69,7 +69,7 @@ struct shallow_info {
int *reachable;
int *shallow_ref;
struct commit **commits;
- int nr_commits;
+ size_t nr_commits;
};
void prepare_shallow_info(struct shallow_info *, struct oid_array *);
diff --git a/strbuf.c b/strbuf.c
index 8ddd4b06c5..f30fdc6984 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -497,7 +497,9 @@ void strbuf_add_percentencode(struct strbuf *dst, const char *src, int flags)
unsigned char ch = src[i];
if (ch <= 0x1F || ch >= 0x7F ||
(ch == '/' && (flags & STRBUF_ENCODE_SLASH)) ||
- strchr(URL_UNSAFE_CHARS, ch))
+ ((flags & STRBUF_ENCODE_HOST_AND_PORT) ?
+ !isalnum(ch) && !strchr("-.:[]", ch) :
+ !!strchr(URL_UNSAFE_CHARS, ch)))
strbuf_addf(dst, "%%%02X", (unsigned char)ch);
else
strbuf_addch(dst, ch);
diff --git a/strbuf.h b/strbuf.h
index 4dc05b4ba7..6362777c0a 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -356,6 +356,7 @@ void strbuf_expand_bad_format(const char *format, const char *command);
void strbuf_addbuf_percentquote(struct strbuf *dst, const struct strbuf *src);
#define STRBUF_ENCODE_SLASH 1
+#define STRBUF_ENCODE_HOST_AND_PORT 2
/**
* Append the contents of a string to a strbuf, percent-encoding any characters
diff --git a/t/Makefile b/t/Makefile
index daa5fcae86..2994eb5fa9 100644
--- a/t/Makefile
+++ b/t/Makefile
@@ -177,3 +177,18 @@ perf:
.PHONY: pre-clean $(T) aggregate-results clean valgrind perf \
check-chainlint clean-chainlint test-chainlint $(UNIT_TESTS)
+
+.PHONY: libgit-sys-test libgit-rs-test
+libgit-sys-test:
+ $(QUIET)(\
+ cd ../contrib/libgit-sys && \
+ cargo test \
+ )
+libgit-rs-test:
+ $(QUIET)(\
+ cd ../contrib/libgit-rs && \
+ cargo test \
+ )
+ifdef INCLUDE_LIBGIT_RS
+all:: libgit-sys-test libgit-rs-test
+endif
diff --git a/t/README b/t/README
index e84824dc00..53e5b4a710 100644
--- a/t/README
+++ b/t/README
@@ -471,6 +471,10 @@ a test and then fails then the whole test run will abort. This can help to make
sure the expected tests are executed and not silently skipped when their
dependency breaks or is simply not present in a new environment.
+GIT_TEST_NAME_HASH_VERSION=<int>, when set, causes 'git pack-objects' to
+assume '--name-hash-version=<n>'.
+
+
Naming Tests
------------
diff --git a/t/helper/meson.build b/t/helper/meson.build
index 5e83884246..1d6154ce97 100644
--- a/t/helper/meson.build
+++ b/t/helper/meson.build
@@ -34,12 +34,14 @@ test_tool_sources = [
'test-match-trees.c',
'test-mergesort.c',
'test-mktemp.c',
+ 'test-name-hash.c',
'test-online-cpus.c',
'test-pack-mtimes.c',
'test-parse-options.c',
'test-parse-pathspec-file.c',
'test-partial-clone.c',
'test-path-utils.c',
+ 'test-path-walk.c',
'test-pcre2-config.c',
'test-pkt-line.c',
'test-proc-receive.c',
diff --git a/t/helper/test-csprng.c b/t/helper/test-csprng.c
index a4a0aca617..c86dcc4870 100644
--- a/t/helper/test-csprng.c
+++ b/t/helper/test-csprng.c
@@ -15,7 +15,7 @@ int cmd__csprng(int argc, const char **argv)
while (count) {
unsigned long chunk = count < sizeof(buf) ? count : sizeof(buf);
- if (csprng_bytes(buf, chunk) < 0) {
+ if (csprng_bytes(buf, chunk, 0) < 0) {
perror("failed to read");
return 5;
}
diff --git a/t/helper/test-hash-speed.c b/t/helper/test-hash-speed.c
index 80df1aae66..fbf67fe6bd 100644
--- a/t/helper/test-hash-speed.c
+++ b/t/helper/test-hash-speed.c
@@ -3,16 +3,16 @@
#define NUM_SECONDS 3
-static inline void compute_hash(const struct git_hash_algo *algo, git_hash_ctx *ctx, uint8_t *final, const void *p, size_t len)
+static inline void compute_hash(const struct git_hash_algo *algo, struct git_hash_ctx *ctx, uint8_t *final, const void *p, size_t len)
{
algo->init_fn(ctx);
- algo->update_fn(ctx, p, len);
- algo->final_fn(final, ctx);
+ git_hash_update(ctx, p, len);
+ git_hash_final(final, ctx);
}
int cmd__hash_speed(int ac, const char **av)
{
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
unsigned char hash[GIT_MAX_RAWSZ];
clock_t initial, start, end;
unsigned bufsizes[] = { 64, 256, 1024, 8192, 16384 };
diff --git a/t/helper/test-hash.c b/t/helper/test-hash.c
index 45d829c908..f0ee61c8b4 100644
--- a/t/helper/test-hash.c
+++ b/t/helper/test-hash.c
@@ -1,14 +1,16 @@
#include "test-tool.h"
#include "hex.h"
-int cmd_hash_impl(int ac, const char **av, int algo)
+int cmd_hash_impl(int ac, const char **av, int algo, int unsafe)
{
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
unsigned char hash[GIT_MAX_HEXSZ];
unsigned bufsz = 8192;
int binary = 0;
char *buffer;
const struct git_hash_algo *algop = &hash_algos[algo];
+ if (unsafe)
+ algop = unsafe_hash_algo(algop);
if (ac == 2) {
if (!strcmp(av[1], "-b"))
@@ -46,9 +48,9 @@ int cmd_hash_impl(int ac, const char **av, int algo)
}
if (this_sz == 0)
break;
- algop->update_fn(&ctx, buffer, this_sz);
+ git_hash_update(&ctx, buffer, this_sz);
}
- algop->final_fn(hash, &ctx);
+ git_hash_final(hash, &ctx);
if (binary)
fwrite(hash, 1, algop->rawsz, stdout);
diff --git a/t/helper/test-name-hash.c b/t/helper/test-name-hash.c
new file mode 100644
index 0000000000..af1d52de10
--- /dev/null
+++ b/t/helper/test-name-hash.c
@@ -0,0 +1,23 @@
+/*
+ * test-name-hash.c: Read a list of paths over stdin and report on their
+ * name-hash and full name-hash.
+ */
+
+#include "test-tool.h"
+#include "git-compat-util.h"
+#include "pack-objects.h"
+#include "strbuf.h"
+
+int cmd__name_hash(int argc UNUSED, const char **argv UNUSED)
+{
+ struct strbuf line = STRBUF_INIT;
+
+ while (!strbuf_getline(&line, stdin)) {
+ printf("%10u ", pack_name_hash(line.buf));
+ printf("%10u ", pack_name_hash_v2((unsigned const char *)line.buf));
+ printf("%s\n", line.buf);
+ }
+
+ strbuf_release(&line);
+ return 0;
+}
diff --git a/t/helper/test-path-walk.c b/t/helper/test-path-walk.c
new file mode 100644
index 0000000000..61e845e5ec
--- /dev/null
+++ b/t/helper/test-path-walk.c
@@ -0,0 +1,132 @@
+#define USE_THE_REPOSITORY_VARIABLE
+
+#include "test-tool.h"
+#include "dir.h"
+#include "environment.h"
+#include "hex.h"
+#include "object-name.h"
+#include "object.h"
+#include "pretty.h"
+#include "revision.h"
+#include "setup.h"
+#include "parse-options.h"
+#include "strbuf.h"
+#include "path-walk.h"
+#include "oid-array.h"
+
+static const char * const path_walk_usage[] = {
+ N_("test-tool path-walk <options> -- <revision-options>"),
+ NULL
+};
+
+struct path_walk_test_data {
+ uintmax_t batch_nr;
+
+ uintmax_t commit_nr;
+ uintmax_t tree_nr;
+ uintmax_t blob_nr;
+ uintmax_t tag_nr;
+};
+
+static int emit_block(const char *path, struct oid_array *oids,
+ enum object_type type, void *data)
+{
+ struct path_walk_test_data *tdata = data;
+ const char *typestr;
+
+ if (type == OBJ_TREE)
+ tdata->tree_nr += oids->nr;
+ else if (type == OBJ_BLOB)
+ tdata->blob_nr += oids->nr;
+ else if (type == OBJ_COMMIT)
+ tdata->commit_nr += oids->nr;
+ else if (type == OBJ_TAG)
+ tdata->tag_nr += oids->nr;
+ else
+ BUG("we do not understand this type");
+
+ typestr = type_name(type);
+
+ /* This should never be output during tests. */
+ if (!oids->nr)
+ printf("%"PRIuMAX":%s:%s:EMPTY\n",
+ tdata->batch_nr, typestr, path);
+
+ for (size_t i = 0; i < oids->nr; i++) {
+ struct object *o = lookup_unknown_object(the_repository,
+ &oids->oid[i]);
+ printf("%"PRIuMAX":%s:%s:%s%s\n",
+ tdata->batch_nr, typestr, path,
+ oid_to_hex(&oids->oid[i]),
+ o->flags & UNINTERESTING ? ":UNINTERESTING" : "");
+ }
+
+ tdata->batch_nr++;
+ return 0;
+}
+
+int cmd__path_walk(int argc, const char **argv)
+{
+ int res, stdin_pl = 0;
+ struct rev_info revs = REV_INFO_INIT;
+ struct path_walk_info info = PATH_WALK_INFO_INIT;
+ struct path_walk_test_data data = { 0 };
+ struct option options[] = {
+ OPT_BOOL(0, "blobs", &info.blobs,
+ N_("toggle inclusion of blob objects")),
+ OPT_BOOL(0, "commits", &info.commits,
+ N_("toggle inclusion of commit objects")),
+ OPT_BOOL(0, "tags", &info.tags,
+ N_("toggle inclusion of tag objects")),
+ OPT_BOOL(0, "trees", &info.trees,
+ N_("toggle inclusion of tree objects")),
+ OPT_BOOL(0, "prune", &info.prune_all_uninteresting,
+ N_("toggle pruning of uninteresting paths")),
+ OPT_BOOL(0, "stdin-pl", &stdin_pl,
+ N_("read a pattern list over stdin")),
+ OPT_END(),
+ };
+
+ setup_git_directory();
+ revs.repo = the_repository;
+
+ argc = parse_options(argc, argv, NULL,
+ options, path_walk_usage,
+ PARSE_OPT_KEEP_UNKNOWN_OPT | PARSE_OPT_KEEP_ARGV0);
+
+ if (argc > 1)
+ setup_revisions(argc, argv, &revs, NULL);
+ else
+ usage(path_walk_usage[0]);
+
+ info.revs = &revs;
+ info.path_fn = emit_block;
+ info.path_fn_data = &data;
+
+ if (stdin_pl) {
+ struct strbuf in = STRBUF_INIT;
+ CALLOC_ARRAY(info.pl, 1);
+
+ info.pl->use_cone_patterns = 1;
+
+ strbuf_fread(&in, 2048, stdin);
+ add_patterns_from_buffer(in.buf, in.len, "", 0, info.pl);
+ strbuf_release(&in);
+ }
+
+ res = walk_objects_by_path(&info);
+
+ printf("commits:%" PRIuMAX "\n"
+ "trees:%" PRIuMAX "\n"
+ "blobs:%" PRIuMAX "\n"
+ "tags:%" PRIuMAX "\n",
+ data.commit_nr, data.tree_nr, data.blob_nr, data.tag_nr);
+
+ if (info.pl) {
+ clear_pattern_list(info.pl);
+ free(info.pl);
+ }
+
+ release_revisions(&revs);
+ return res;
+}
diff --git a/t/helper/test-progress.c b/t/helper/test-progress.c
index 44be2645e9..1f75b7bd19 100644
--- a/t/helper/test-progress.c
+++ b/t/helper/test-progress.c
@@ -17,10 +17,14 @@
*
* See 't0500-progress-display.sh' for examples.
*/
+
+#define USE_THE_REPOSITORY_VARIABLE
#define GIT_TEST_PROGRESS_ONLY
+
#include "test-tool.h"
#include "parse-options.h"
#include "progress.h"
+#include "repository.h"
#include "strbuf.h"
#include "string-list.h"
@@ -64,7 +68,7 @@ int cmd__progress(int argc, const char **argv)
else
die("invalid input: '%s'", line.buf);
- progress = start_progress(title, total);
+ progress = start_progress(the_repository, title, total);
} else if (skip_prefix(line.buf, "progress ", (const char **) &end)) {
uint64_t item_count = strtoull(end, &end, 10);
if (*end != '\0')
diff --git a/t/helper/test-reach.c b/t/helper/test-reach.c
index 01cf77ae65..028ec00306 100644
--- a/t/helper/test-reach.c
+++ b/t/helper/test-reach.c
@@ -35,7 +35,7 @@ int cmd__reach(int ac, const char **av)
struct commit_list *X, *Y;
struct object_array X_obj = OBJECT_ARRAY_INIT;
struct commit **X_array, **Y_array;
- int X_nr, X_alloc, Y_nr, Y_alloc;
+ size_t X_nr, X_alloc, Y_nr, Y_alloc;
struct strbuf buf = STRBUF_INIT;
struct repository *r = the_repository;
@@ -157,7 +157,7 @@ int cmd__reach(int ac, const char **av)
clear_contains_cache(&cache);
} else if (!strcmp(av[1], "get_reachable_subset")) {
const int reachable_flag = 1;
- int i, count = 0;
+ int count = 0;
struct commit_list *current;
struct commit_list *list = get_reachable_subset(X_array, X_nr,
Y_array, Y_nr,
@@ -169,7 +169,7 @@ int cmd__reach(int ac, const char **av)
oid_to_hex(&list->item->object.oid));
count++;
}
- for (i = 0; i < Y_nr; i++) {
+ for (size_t i = 0; i < Y_nr; i++) {
if (Y_array[i]->object.flags & reachable_flag)
count--;
}
diff --git a/t/helper/test-serve-v2.c b/t/helper/test-serve-v2.c
index 054cbcf5d8..63a200b8d4 100644
--- a/t/helper/test-serve-v2.c
+++ b/t/helper/test-serve-v2.c
@@ -1,6 +1,9 @@
+#define USE_THE_REPOSITORY_VARIABLE
+
#include "test-tool.h"
#include "gettext.h"
#include "parse-options.h"
+#include "repository.h"
#include "serve.h"
#include "setup.h"
@@ -28,9 +31,9 @@ int cmd__serve_v2(int argc, const char **argv)
PARSE_OPT_KEEP_UNKNOWN_OPT);
if (advertise_capabilities)
- protocol_v2_advertise_capabilities();
+ protocol_v2_advertise_capabilities(the_repository);
else
- protocol_v2_serve_loop(stateless_rpc);
+ protocol_v2_serve_loop(the_repository, stateless_rpc);
return 0;
}
diff --git a/t/helper/test-sha1.c b/t/helper/test-sha1.c
index e60d000c03..349540c4df 100644
--- a/t/helper/test-sha1.c
+++ b/t/helper/test-sha1.c
@@ -3,7 +3,7 @@
int cmd__sha1(int ac, const char **av)
{
- return cmd_hash_impl(ac, av, GIT_HASH_SHA1);
+ return cmd_hash_impl(ac, av, GIT_HASH_SHA1, 0);
}
int cmd__sha1_is_sha1dc(int argc UNUSED, const char **argv UNUSED)
@@ -13,3 +13,8 @@ int cmd__sha1_is_sha1dc(int argc UNUSED, const char **argv UNUSED)
#endif
return 1;
}
+
+int cmd__sha1_unsafe(int ac, const char **av)
+{
+ return cmd_hash_impl(ac, av, GIT_HASH_SHA1, 1);
+}
diff --git a/t/helper/test-sha1.sh b/t/helper/test-sha1.sh
index 84594885c7..bf387d3db1 100755
--- a/t/helper/test-sha1.sh
+++ b/t/helper/test-sha1.sh
@@ -3,25 +3,31 @@
dd if=/dev/zero bs=1048576 count=100 2>/dev/null |
/usr/bin/time t/helper/test-tool sha1 >/dev/null
+dd if=/dev/zero bs=1048576 count=100 2>/dev/null |
+/usr/bin/time t/helper/test-tool sha1-unsafe >/dev/null
+
while read expect cnt pfx
do
case "$expect" in '#'*) continue ;; esac
- actual=$(
- {
- test -z "$pfx" || echo "$pfx"
- dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null |
- perl -pe 'y/\000/g/'
- } | ./t/helper/test-tool sha1 $cnt
- )
- if test "$expect" = "$actual"
- then
- echo "OK: $expect $cnt $pfx"
- else
- echo >&2 "OOPS: $cnt"
- echo >&2 "expect: $expect"
- echo >&2 "actual: $actual"
- exit 1
- fi
+ for sha1 in sha1 sha1-unsafe
+ do
+ actual=$(
+ {
+ test -z "$pfx" || echo "$pfx"
+ dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null |
+ perl -pe 'y/\000/g/'
+ } | ./t/helper/test-tool $sha1 $cnt
+ )
+ if test "$expect" = "$actual"
+ then
+ echo "OK ($sha1): $expect $cnt $pfx"
+ else
+ echo >&2 "OOPS ($sha1): $cnt"
+ echo >&2 "expect ($sha1): $expect"
+ echo >&2 "actual ($sha1): $actual"
+ exit 1
+ fi
+ done
done <<EOF
da39a3ee5e6b4b0d3255bfef95601890afd80709 0
3f786850e387550fdab836ed7e6dc881de23001b 0 a
diff --git a/t/helper/test-sha256.c b/t/helper/test-sha256.c
index 2fb20438f3..7fd0aa1fcd 100644
--- a/t/helper/test-sha256.c
+++ b/t/helper/test-sha256.c
@@ -3,5 +3,5 @@
int cmd__sha256(int ac, const char **av)
{
- return cmd_hash_impl(ac, av, GIT_HASH_SHA256);
+ return cmd_hash_impl(ac, av, GIT_HASH_SHA256, 0);
}
diff --git a/t/helper/test-simple-ipc.c b/t/helper/test-simple-ipc.c
index fb5927775d..03cc5eea2c 100644
--- a/t/helper/test-simple-ipc.c
+++ b/t/helper/test-simple-ipc.c
@@ -612,8 +612,8 @@ int cmd__simple_ipc(int argc, const char **argv)
if (argc < 2)
usage_with_options(simple_ipc_usage, options);
- if (argc == 2 && !strcmp(argv[1], "-h"))
- usage_with_options(simple_ipc_usage, options);
+ show_usage_with_options_if_asked(argc, argv,
+ simple_ipc_usage, options);
if (argc == 2 && !strcmp(argv[1], "SUPPORTS_SIMPLE_IPC"))
return 0;
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 4a7aa993ba..50dc4dac4e 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -44,6 +44,7 @@ static struct test_cmd cmds[] = {
{ "match-trees", cmd__match_trees },
{ "mergesort", cmd__mergesort },
{ "mktemp", cmd__mktemp },
+ { "name-hash", cmd__name_hash },
{ "online-cpus", cmd__online_cpus },
{ "pack-mtimes", cmd__pack_mtimes },
{ "parse-options", cmd__parse_options },
@@ -52,6 +53,7 @@ static struct test_cmd cmds[] = {
{ "parse-subcommand", cmd__parse_subcommand },
{ "partial-clone", cmd__partial_clone },
{ "path-utils", cmd__path_utils },
+ { "path-walk", cmd__path_walk },
{ "pcre2-config", cmd__pcre2_config },
{ "pkt-line", cmd__pkt_line },
{ "proc-receive", cmd__proc_receive },
@@ -70,6 +72,7 @@ static struct test_cmd cmds[] = {
{ "serve-v2", cmd__serve_v2 },
{ "sha1", cmd__sha1 },
{ "sha1-is-sha1dc", cmd__sha1_is_sha1dc },
+ { "sha1-unsafe", cmd__sha1_unsafe },
{ "sha256", cmd__sha256 },
{ "sigchain", cmd__sigchain },
{ "simple-ipc", cmd__simple_ipc },
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index 21802ac27d..6d62a5b53d 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -37,6 +37,7 @@ int cmd__lazy_init_name_hash(int argc, const char **argv);
int cmd__match_trees(int argc, const char **argv);
int cmd__mergesort(int argc, const char **argv);
int cmd__mktemp(int argc, const char **argv);
+int cmd__name_hash(int argc, const char **argv);
int cmd__online_cpus(int argc, const char **argv);
int cmd__pack_mtimes(int argc, const char **argv);
int cmd__parse_options(int argc, const char **argv);
@@ -45,6 +46,7 @@ int cmd__parse_pathspec_file(int argc, const char** argv);
int cmd__parse_subcommand(int argc, const char **argv);
int cmd__partial_clone(int argc, const char **argv);
int cmd__path_utils(int argc, const char **argv);
+int cmd__path_walk(int argc, const char **argv);
int cmd__pcre2_config(int argc, const char **argv);
int cmd__pkt_line(int argc, const char **argv);
int cmd__proc_receive(int argc, const char **argv);
@@ -63,6 +65,7 @@ int cmd__scrap_cache_tree(int argc, const char **argv);
int cmd__serve_v2(int argc, const char **argv);
int cmd__sha1(int argc, const char **argv);
int cmd__sha1_is_sha1dc(int argc, const char **argv);
+int cmd__sha1_unsafe(int argc, const char **argv);
int cmd__sha256(int argc, const char **argv);
int cmd__sigchain(int argc, const char **argv);
int cmd__simple_ipc(int argc, const char **argv);
@@ -81,6 +84,6 @@ int cmd__windows_named_pipe(int argc, const char **argv);
#endif
int cmd__write_cache(int argc, const char **argv);
-int cmd_hash_impl(int ac, const char **av, int algo);
+int cmd_hash_impl(int ac, const char **av, int algo, int unsafe);
#endif
diff --git a/t/interop/Makefile b/t/interop/Makefile
index 6911c2915a..4ff4ed0616 100644
--- a/t/interop/Makefile
+++ b/t/interop/Makefile
@@ -1,3 +1,6 @@
+# The default target of this Makefile is...
+all::
+
# Import tree-wide shared Makefile behavior and libraries
include ../../shared.mak
@@ -8,7 +11,7 @@ SHELL_PATH ?= $(SHELL)
SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
T = $(sort $(wildcard i[0-9][0-9][0-9][0-9]-*.sh))
-all: $(T)
+all:: $(T)
$(T):
@echo "*** $@ ***"; '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
diff --git a/t/lib-credential.sh b/t/lib-credential.sh
index 58b9c74060..cc6bf9aa5f 100644
--- a/t/lib-credential.sh
+++ b/t/lib-credential.sh
@@ -566,6 +566,21 @@ helper_test_authtype() {
EOF
'
+ test_expect_success "helper ($HELPER) gets authtype and credential only if request has authtype capability" '
+ check fill $HELPER <<-\EOF
+ protocol=https
+ host=git.example.com
+ --
+ protocol=https
+ host=git.example.com
+ username=askpass-username
+ password=askpass-password
+ --
+ askpass: Username for '\''https://git.example.com'\'':
+ askpass: Password for '\''https://askpass-username@git.example.com'\'':
+ EOF
+ '
+
test_expect_success "helper ($HELPER) stores authtype and credential with username" '
check approve $HELPER <<-\EOF
capability[]=authtype
diff --git a/t/meson.build b/t/meson.build
index 602ebfe6a2..780939d49f 100644
--- a/t/meson.build
+++ b/t/meson.build
@@ -1,5 +1,13 @@
clar_test_suites = [
'unit-tests/u-ctype.c',
+ 'unit-tests/u-example-decorate.c',
+ 'unit-tests/u-hash.c',
+ 'unit-tests/u-hashmap.c',
+ 'unit-tests/u-mem-pool.c',
+ 'unit-tests/u-prio-queue.c',
+ 'unit-tests/u-reftable-tree.c',
+ 'unit-tests/u-strbuf.c',
+ 'unit-tests/u-strcmp-offset.c',
'unit-tests/u-strvec.c',
]
@@ -40,14 +48,9 @@ clar_unit_tests = executable('unit-tests',
test('unit-tests', clar_unit_tests)
unit_test_programs = [
- 'unit-tests/t-example-decorate.c',
- 'unit-tests/t-hash.c',
- 'unit-tests/t-hashmap.c',
- 'unit-tests/t-mem-pool.c',
'unit-tests/t-oid-array.c',
'unit-tests/t-oidmap.c',
'unit-tests/t-oidtree.c',
- 'unit-tests/t-prio-queue.c',
'unit-tests/t-reftable-basics.c',
'unit-tests/t-reftable-block.c',
'unit-tests/t-reftable-merged.c',
@@ -56,9 +59,6 @@ unit_test_programs = [
'unit-tests/t-reftable-readwrite.c',
'unit-tests/t-reftable-record.c',
'unit-tests/t-reftable-stack.c',
- 'unit-tests/t-reftable-tree.c',
- 'unit-tests/t-strbuf.c',
- 'unit-tests/t-strcmp-offset.c',
'unit-tests/t-trailer.c',
'unit-tests/t-urlmatch-normalization.c',
]
@@ -721,6 +721,8 @@ integration_tests = [
't5617-clone-submodules-remote.sh',
't5618-alternate-refs.sh',
't5619-clone-local-ambiguous-transport.sh',
+ 't5620-backfill.sh',
+ 't5621-clone-revision.sh',
't5700-protocol-v1.sh',
't5701-git-serve.sh',
't5702-protocol-v2.sh',
@@ -829,6 +831,7 @@ integration_tests = [
't6500-gc.sh',
't6501-freshen-objects.sh',
't6600-test-reach.sh',
+ 't6601-path-walk.sh',
't6700-tree-depth.sh',
't7001-mv.sh',
't7002-mv-sparse-checkout.sh',
diff --git a/t/perf/Makefile b/t/perf/Makefile
index e4808aebed..9b3090c4ed 100644
--- a/t/perf/Makefile
+++ b/t/perf/Makefile
@@ -1,10 +1,13 @@
+# The default target of this Makefile is...
+all::
+
# Import tree-wide shared Makefile behavior and libraries
include ../../shared.mak
-include ../../config.mak
export GIT_TEST_OPTIONS
-all: test-lint perf
+all:: test-lint perf
perf: pre-clean
./run
diff --git a/t/perf/p5313-pack-objects.sh b/t/perf/p5313-pack-objects.sh
new file mode 100755
index 0000000000..be5229a0ec
--- /dev/null
+++ b/t/perf/p5313-pack-objects.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+test_description='Tests pack performance using bitmaps'
+. ./perf-lib.sh
+
+GIT_TEST_PASSING_SANITIZE_LEAK=0
+export GIT_TEST_PASSING_SANITIZE_LEAK
+
+test_perf_large_repo
+
+test_expect_success 'create rev input' '
+ cat >in-thin <<-EOF &&
+ $(git rev-parse HEAD)
+ ^$(git rev-parse HEAD~1)
+ EOF
+
+ cat >in-big <<-EOF &&
+ $(git rev-parse HEAD)
+ ^$(git rev-parse HEAD~1000)
+ EOF
+
+ cat >in-shallow <<-EOF
+ $(git rev-parse HEAD)
+ --shallow $(git rev-parse HEAD)
+ EOF
+'
+
+for version in 1 2
+do
+ export version
+
+ test_perf "thin pack with version $version" '
+ git pack-objects --thin --stdout --revs --sparse \
+ --name-hash-version=$version <in-thin >out
+ '
+
+ test_size "thin pack size with version $version" '
+ test_file_size out
+ '
+
+ test_perf "big pack with version $version" '
+ git pack-objects --stdout --revs --sparse \
+ --name-hash-version=$version <in-big >out
+ '
+
+ test_size "big pack size with version $version" '
+ test_file_size out
+ '
+
+ test_perf "shallow fetch pack with version $version" '
+ git pack-objects --stdout --revs --sparse --shallow \
+ --name-hash-version=$version <in-shallow >out
+ '
+
+ test_size "shallow pack size with version $version" '
+ test_file_size out
+ '
+
+ test_perf "repack with version $version" '
+ git repack -adf --name-hash-version=$version
+ '
+
+ test_size "repack size with version $version" '
+ gitdir=$(git rev-parse --git-dir) &&
+ pack=$(ls $gitdir/objects/pack/pack-*.pack) &&
+ test_file_size "$pack"
+ '
+done
+
+test_done
diff --git a/t/perf/p5314-name-hash.sh b/t/perf/p5314-name-hash.sh
new file mode 100755
index 0000000000..4ef0ba7711
--- /dev/null
+++ b/t/perf/p5314-name-hash.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+test_description='Tests pack performance using bitmaps'
+. ./perf-lib.sh
+
+GIT_TEST_PASSING_SANITIZE_LEAK=0
+export GIT_TEST_PASSING_SANITIZE_LEAK
+
+test_perf_large_repo
+
+test_size 'paths at head' '
+ git ls-tree -r --name-only HEAD >path-list &&
+ wc -l <path-list &&
+ test-tool name-hash <path-list >name-hashes
+'
+
+for version in 1 2
+do
+ test_size "distinct hash value: v$version" '
+ awk "{ print \$$version; }" <name-hashes | sort | \
+ uniq -c >name-hash-count &&
+ wc -l <name-hash-count
+ '
+
+ test_size "maximum multiplicity: v$version" '
+ sort -nr <name-hash-count | head -n 1 | \
+ awk "{ print \$1; }"
+ '
+done
+
+test_done
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 72a0c2e7d4..c49d9e0d38 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -586,6 +586,18 @@ test_expect_success 'GIT_DEFAULT_HASH overrides init.defaultObjectFormat' '
echo sha256 >expected
'
+for hash in sha1 sha256
+do
+ test_expect_success "reinit repository with GIT_DEFAULT_HASH=$hash does not change format" '
+ test_when_finished "rm -rf repo" &&
+ git init repo &&
+ git -C repo rev-parse --show-object-format >expect &&
+ GIT_DEFAULT_HASH=$hash git init repo &&
+ git -C repo rev-parse --show-object-format >actual &&
+ test_cmp expect actual
+ '
+done
+
test_expect_success 'extensions.objectFormat is not allowed with repo version 0' '
test_when_finished "rm -rf explicit-v0" &&
git init --object-format=sha256 explicit-v0 &&
@@ -697,6 +709,15 @@ do
git -C refformat rev-parse --show-ref-format >actual &&
test_cmp expect actual
'
+
+ test_expect_success "reinit repository with GIT_DEFAULT_REF_FORMAT=$format does not change format" '
+ test_when_finished "rm -rf refformat" &&
+ git init refformat &&
+ git -C refformat rev-parse --show-ref-format >expect &&
+ GIT_DEFAULT_REF_FORMAT=$format git init refformat &&
+ git -C refformat rev-parse --show-ref-format >actual &&
+ test_cmp expect actual
+ '
done
test_expect_success "--ref-format= overrides GIT_DEFAULT_REF_FORMAT" '
@@ -861,15 +882,6 @@ test_expect_success 're-init with includeIf.onbranch condition' '
test_cmp expect actual
'
-test_expect_success 're-init with includeIf.onbranch condition' '
- test_when_finished "rm -rf repo" &&
- git init repo &&
- git -c includeIf.onbranch:nonexistent.path=/does/not/exist init repo &&
- echo $GIT_DEFAULT_REF_FORMAT >expect &&
- git -C repo rev-parse --show-ref-format >actual &&
- test_cmp expect actual
-'
-
test_expect_success 're-init skips non-matching includeIf.onbranch' '
test_when_finished "rm -rf repo config" &&
cat >config <<-EOF &&
diff --git a/t/t0012-help.sh b/t/t0012-help.sh
index 1d273d91c2..d3a0967e9d 100755
--- a/t/t0012-help.sh
+++ b/t/t0012-help.sh
@@ -255,8 +255,9 @@ do
(
GIT_CEILING_DIRECTORIES=$(pwd) &&
export GIT_CEILING_DIRECTORIES &&
- test_expect_code 129 git -C sub $builtin -h >output 2>&1
+ test_expect_code 129 git -C sub $builtin -h >output 2>err
) &&
+ test_must_be_empty err &&
test_grep usage output
'
done <builtins
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index dbb2e73bcd..8545cdfab5 100755
--- a/t/t0060-path-utils.sh
+++ b/t/t0060-path-utils.sh
@@ -592,17 +592,19 @@ test_lazy_prereq CAN_EXEC_IN_PWD '
./git rev-parse
'
+test_expect_success !VALGRIND,RUNTIME_PREFIX,CAN_EXEC_IN_PWD 'setup runtime prefix' '
+ mkdir -p pretend/bin &&
+ cp "$GIT_EXEC_PATH"/git$X pretend/bin/
+'
+
test_expect_success !VALGRIND,RUNTIME_PREFIX,CAN_EXEC_IN_PWD 'RUNTIME_PREFIX works' '
- mkdir -p pretend/bin pretend/libexec/git-core &&
+ mkdir -p pretend/libexec/git-core &&
echo "echo HERE" | write_script pretend/libexec/git-core/git-here &&
- cp "$GIT_EXEC_PATH"/git$X pretend/bin/ &&
GIT_EXEC_PATH= ./pretend/bin/git here >actual &&
echo HERE >expect &&
test_cmp expect actual'
test_expect_success !VALGRIND,RUNTIME_PREFIX,CAN_EXEC_IN_PWD '%(prefix)/ works' '
- mkdir -p pretend/bin &&
- cp "$GIT_EXEC_PATH"/git$X pretend/bin/ &&
git config yes.path "%(prefix)/yes" &&
GIT_EXEC_PATH= ./pretend/bin/git config --path yes.path >actual &&
echo "$(pwd)/pretend/yes" >expect &&
diff --git a/t/t0210-trace2-normal.sh b/t/t0210-trace2-normal.sh
index eff9a59dbd..4287ed3fbb 100755
--- a/t/t0210-trace2-normal.sh
+++ b/t/t0210-trace2-normal.sh
@@ -243,6 +243,15 @@ test_expect_success 'bug messages followed by BUG() are written to trace2' '
test_cmp expect actual
'
+test_expect_success 'a valueless true configuration variable is handled' '
+ test_when_finished "rm -f trace2.normal actual expect" &&
+ echo >expect &&
+ GIT_TRACE2="$(pwd)/trace2.normal" \
+ GIT_TRACE2_CONFIG_PARAMS=foo.true \
+ git -c foo.true config foo.true >actual &&
+ test_cmp expect actual
+'
+
sane_unset GIT_TRACE2_BRIEF
# Now test without environment variables and get all Trace2 settings
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
index 17952e52d6..cb3a85c7ff 100755
--- a/t/t0300-credentials.sh
+++ b/t/t0300-credentials.sh
@@ -76,6 +76,10 @@ test_expect_success 'setup helper scripts' '
test -z "$pexpiry" || echo password_expiry_utc=$pexpiry
EOF
+ write_script git-credential-cntrl-in-username <<-\EOF &&
+ printf "username=\\007latrix Lestrange\\n"
+ EOF
+
PATH="$PWD:$PATH"
'
@@ -696,6 +700,19 @@ test_expect_success 'match percent-encoded values in username' '
EOF
'
+test_expect_success 'match percent-encoded values in hostname' '
+ test_config "credential.https://a%20b%20c/.helper" "$HELPER" &&
+ check fill <<-\EOF
+ url=https://a b c/
+ --
+ protocol=https
+ host=a b c
+ username=foo
+ password=bar
+ --
+ EOF
+'
+
test_expect_success 'fetch with multiple path components' '
test_unconfig credential.helper &&
test_config credential.https://example.com/foo/repo.git.helper "verbatim foo bar" &&
@@ -885,6 +902,22 @@ test_expect_success 'url parser rejects embedded newlines' '
test_cmp expect stderr
'
+test_expect_success 'url parser rejects embedded carriage returns' '
+ test_config credential.helper "!true" &&
+ test_must_fail git credential fill 2>stderr <<-\EOF &&
+ url=https://example%0d.com/
+ EOF
+ cat >expect <<-\EOF &&
+ fatal: credential value for host contains carriage return
+ If this is intended, set `credential.protectProtocol=false`
+ EOF
+ test_cmp expect stderr &&
+ GIT_ASKPASS=true \
+ git -c credential.protectProtocol=false credential fill <<-\EOF
+ url=https://example%0d.com/
+ EOF
+'
+
test_expect_success 'host-less URLs are parsed as empty host' '
check fill "verbatim foo bar" <<-\EOF
url=cert:///path/to/cert.pem
@@ -994,4 +1027,20 @@ test_expect_success 'credential config with partial URLs' '
test_grep "skipping credential lookup for key" stderr
'
+BEL="$(printf '\007')"
+
+test_expect_success 'interactive prompt is sanitized' '
+ check fill cntrl-in-username <<-EOF
+ protocol=https
+ host=example.org
+ --
+ protocol=https
+ host=example.org
+ username=${BEL}latrix Lestrange
+ password=askpass-password
+ --
+ askpass: Password for ${SQ}https://%07latrix%20Lestrange@example.org${SQ}:
+ EOF
+'
+
test_done
diff --git a/t/t0450/txt-help-mismatches b/t/t0450/txt-help-mismatches
index 28003f18c9..c4a15fd0cb 100644
--- a/t/t0450/txt-help-mismatches
+++ b/t/t0450/txt-help-mismatches
@@ -45,7 +45,6 @@ rebase
remote
remote-ext
remote-fd
-repack
reset
restore
rev-parse
diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh
index ff9bf213aa..398865d6eb 100755
--- a/t/t1006-cat-file.sh
+++ b/t/t1006-cat-file.sh
@@ -240,7 +240,8 @@ test_expect_success "setup" '
git config extensions.objectformat $test_hash_algo &&
git config extensions.compatobjectformat $test_compat_hash_algo &&
echo_without_newline "$hello_content" > hello &&
- git update-index --add hello
+ git update-index --add hello &&
+ git commit -m "add hello file"
'
run_blob_tests () {
@@ -602,6 +603,34 @@ test_expect_success FUNNYNAMES '--batch-check, -Z with newline in input' '
test_cmp expect actual
'
+test_expect_success 'setup with curly braches in input' '
+ git branch "foo{bar" HEAD &&
+ git branch "foo@" HEAD
+'
+
+test_expect_success 'object reference with curly brace' '
+ git cat-file -p "foo{bar:hello" >actual &&
+ git cat-file -p HEAD:hello >expect &&
+ test_cmp expect actual
+'
+
+test_expect_success 'object reference with at-sign' '
+ git cat-file -p "foo@@{0}:hello" >actual &&
+ git cat-file -p HEAD:hello >expect &&
+ test_cmp expect actual
+'
+
+test_expect_success 'setup with commit with colon' '
+ git commit-tree -m "testing: just a bunch of junk" HEAD^{tree} >out &&
+ git branch other $(cat out)
+'
+
+test_expect_success 'object reference via commit text search' '
+ git cat-file -p "other^{/testing:}:hello" >actual &&
+ git cat-file -p HEAD:hello >expect &&
+ test_cmp expect actual
+'
+
test_expect_success 'setup blobs which are likely to delta' '
test-tool genrandom foo 10240 >foo &&
{ cat foo && echo plus; } >foo-plus &&
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
index e2316f1dd4..29045aad43 100755
--- a/t/t1400-update-ref.sh
+++ b/t/t1400-update-ref.sh
@@ -2068,4 +2068,13 @@ do
done
+test_expect_success 'update-ref should also create reflog for HEAD' '
+ test_commit to-rewind &&
+ git rev-parse HEAD >expect &&
+ head=$(git symbolic-ref HEAD) &&
+ git update-ref --create-reflog "$head" HEAD~ &&
+ git rev-parse HEAD@{1} >actual &&
+ test_cmp expect actual
+'
+
test_done
diff --git a/t/t1460-refs-migrate.sh b/t/t1460-refs-migrate.sh
index f59bc4860f..a6d9b35a46 100755
--- a/t/t1460-refs-migrate.sh
+++ b/t/t1460-refs-migrate.sh
@@ -224,9 +224,38 @@ do
test_commit --date "100003000 +0700" --no-tag -C repo second &&
test_migration repo "$to_format"
'
+
+ test_expect_success "$from_format -> $to_format: stash is retained" '
+ test_when_finished "rm -rf repo" &&
+ git init --ref-format=$from_format repo &&
+ (
+ cd repo &&
+ test_commit initial A &&
+ echo foo >A &&
+ git stash push &&
+ echo bar >A &&
+ git stash push &&
+ git stash list >expect.reflog &&
+ test_migration . "$to_format" &&
+ git stash list >actual.reflog &&
+ test_cmp expect.reflog actual.reflog
+ )
+ '
done
done
+test_expect_success 'multiple reftable blocks with multiple entries' '
+ test_when_finished "rm -rf repo" &&
+ git init --ref-format=files repo &&
+ test_commit -C repo first &&
+ printf "create refs/heads/ref-%d HEAD\n" $(test_seq 5000) >stdin &&
+ git -C repo update-ref --stdin <stdin &&
+ test_commit -C repo second &&
+ printf "update refs/heads/ref-%d HEAD\n" $(test_seq 3000) >stdin &&
+ git -C repo update-ref --stdin <stdin &&
+ test_migration repo reftable
+'
+
test_expect_success 'migrating from files format deletes backend files' '
test_when_finished "rm -rf repo" &&
git init --ref-format=files repo &&
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index a3a21c54cf..f3e720dc10 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -410,6 +410,20 @@ test_expect_success 'bare main worktree has HEAD at branch deleted by secondary
git -C secondary branch -D main
'
+test_expect_success 'secondary worktrees recognize core.bare=true in main config.worktree' '
+ test_when_finished "rm -rf bare_repo non_bare_repo secondary_worktree" &&
+ git init -b main non_bare_repo &&
+ test_commit -C non_bare_repo x &&
+
+ git clone --bare non_bare_repo bare_repo &&
+ git -C bare_repo config extensions.worktreeConfig true &&
+ git -C bare_repo config unset core.bare &&
+ git -C bare_repo config --worktree core.bare true &&
+
+ git -C bare_repo worktree add ../secondary_worktree &&
+ git -C secondary_worktree checkout main
+'
+
test_expect_success 'git branch --list -v with --abbrev' '
test_when_finished "git branch -D t" &&
git branch t &&
diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh
index 500c9d0e72..a6bd88a58d 100755
--- a/t/t3203-branch-output.sh
+++ b/t/t3203-branch-output.sh
@@ -368,6 +368,34 @@ test_expect_success 'git branch --format with ahead-behind' '
test_cmp expect actual
'
+test_expect_success 'git branch `--sort=[-]ahead-behind` option' '
+ cat >expect <<-\EOF &&
+ (HEAD detached from fromtag) 0 0
+ refs/heads/ambiguous 0 0
+ refs/heads/branch-two 0 0
+ refs/heads/branch-one 1 0
+ refs/heads/main 1 0
+ refs/heads/ref-to-branch 1 0
+ refs/heads/ref-to-remote 1 0
+ EOF
+ git branch --format="%(refname) %(ahead-behind:HEAD)" \
+ --sort=refname --sort=ahead-behind:HEAD >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ (HEAD detached from fromtag) 0 0
+ refs/heads/branch-one 1 0
+ refs/heads/main 1 0
+ refs/heads/ref-to-branch 1 0
+ refs/heads/ref-to-remote 1 0
+ refs/heads/ambiguous 0 0
+ refs/heads/branch-two 0 0
+ EOF
+ git branch --format="%(refname) %(ahead-behind:HEAD)" \
+ --sort=refname --sort=-ahead-behind:HEAD >actual &&
+ test_cmp expect actual
+'
+
test_expect_success 'git branch with --format=%(rest) must fail' '
test_must_fail git branch --format="%(rest)" >actual
'
diff --git a/t/t4100-apply-stat.sh b/t/t4100-apply-stat.sh
index 146e73d8f5..a5664f3eb3 100755
--- a/t/t4100-apply-stat.sh
+++ b/t/t4100-apply-stat.sh
@@ -38,4 +38,17 @@ incomplete (1)
incomplete (2)
EOF
+test_expect_success 'applying a hunk header which overflows fails' '
+ cat >patch <<-\EOF &&
+ diff -u a/file b/file
+ --- a/file
+ +++ b/file
+ @@ -98765432109876543210 +98765432109876543210 @@
+ -a
+ +b
+ EOF
+ test_must_fail git apply patch 2>err &&
+ echo "error: corrupt patch at line 4" >expect &&
+ test_cmp expect err
+'
test_done
diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh
index 2421491931..4a6242ff99 100755
--- a/t/t4203-mailmap.sh
+++ b/t/t4203-mailmap.sh
@@ -113,6 +113,18 @@ test_expect_success 'check-mailmap --stdin simple address: no mapping' '
test_cmp expect actual
'
+test_expect_success 'check-mailmap name and address: mapping' '
+ test_when_finished "rm .mailmap" &&
+ cat >.mailmap <<-EOF &&
+ Bug Reports <bugs-new@company.xx> Bugs <bugs@company.xx>
+ EOF
+ cat >expect <<-EOF &&
+ <bugs@company.xx>
+ EOF
+ git check-mailmap "bugs@company.xx" >actual &&
+ test_cmp expect actual
+'
+
test_expect_success 'No mailmap' '
cat >expect <<-EOF &&
$GIT_AUTHOR_NAME (1):
diff --git a/t/t4209-log-pickaxe.sh b/t/t4209-log-pickaxe.sh
index a675ace081..0e2f80a268 100755
--- a/t/t4209-log-pickaxe.sh
+++ b/t/t4209-log-pickaxe.sh
@@ -93,6 +93,22 @@ test_expect_success 'usage: --no-pickaxe-regex' '
test_cmp expect actual
'
+test_expect_success 'usage: -G and -S with empty argument' '
+ cat >expect <<-\EOF &&
+ error: -S requires a non-empty argument
+ EOF
+
+ test_expect_code 129 git log -S "" 2>actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ error: -G requires a non-empty argument
+ EOF
+
+ test_expect_code 129 git log -G "" 2>actual &&
+ test_cmp expect actual
+'
+
test_log expect_initial --grep initial
test_log expect_nomatch --grep InItial
test_log_icase expect_initial --grep InItial
diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index d1d6248558..5ac8d39094 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -689,4 +689,38 @@ do
'
done
+test_expect_success 'valid and invalid --name-hash-versions' '
+ sane_unset GIT_TEST_NAME_HASH_VERSION &&
+
+ # Valid values are hard to verify other than "do not fail".
+ # Performance tests will be more valuable to validate these versions.
+ # Negative values are converted to version 1.
+ for value in -1 1 2
+ do
+ git pack-objects base --all --name-hash-version=$value || return 1
+ done &&
+
+ # Invalid values have clear post-conditions.
+ for value in 0 3
+ do
+ test_must_fail git pack-objects base --all --name-hash-version=$value 2>err &&
+ test_grep "invalid --name-hash-version option" err || return 1
+ done
+'
+
+# The following test is not necessarily a permanent choice, but since we do not
+# have a "name hash version" bit in the .bitmap file format, we cannot write the
+# hash values into the .bitmap file without risking breakage later.
+#
+# TODO: Make these compatible in the future and replace this test with the
+# expected behavior when both are specified.
+test_expect_success '--name-hash-version=2 and --write-bitmap-index are incompatible' '
+ git pack-objects base --all --name-hash-version=2 --write-bitmap-index 2>err &&
+ test_grep "currently, --write-bitmap-index requires --name-hash-version=1" err &&
+
+ # --stdout option silently removes --write-bitmap-index
+ git pack-objects --stdout --all --name-hash-version=2 --write-bitmap-index >out 2>err &&
+ ! test_grep "currently, --write-bitmap-index requires --name-hash-version=1" err
+'
+
test_done
diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh
index eabfcd7ff6..621bbbdd26 100755
--- a/t/t5310-pack-bitmaps.sh
+++ b/t/t5310-pack-bitmaps.sh
@@ -26,6 +26,36 @@ has_any () {
grep -Ff "$1" "$2"
}
+# Since name-hash values are stored in the .bitmap files, add a test
+# that checks that the name-hash calculations are stable across versions.
+# Not exhaustive, but these hashing algorithms would be hard to change
+# without causing deviations here.
+test_expect_success 'name-hash value stability' '
+ cat >names <<-\EOF &&
+ first
+ second
+ third
+ a/one-long-enough-for-collisions
+ b/two-long-enough-for-collisions
+ many/parts/to/this/path/enough/to/collide/in/v2
+ enough/parts/to/this/path/enough/to/collide/in/v2
+ EOF
+
+ test-tool name-hash <names >out &&
+
+ cat >expect <<-\EOF &&
+ 2582249472 1763573760 first
+ 2289942528 1188134912 second
+ 2300837888 1130758144 third
+ 2544516325 3963087891 a/one-long-enough-for-collisions
+ 2544516325 4013419539 b/two-long-enough-for-collisions
+ 1420111091 1709547268 many/parts/to/this/path/enough/to/collide/in/v2
+ 1420111091 1709547268 enough/parts/to/this/path/enough/to/collide/in/v2
+ EOF
+
+ test_cmp expect out
+'
+
test_bitmap_cases () {
writeLookupTable=false
for i in "$@"
@@ -419,7 +449,10 @@ test_bitmap_cases () {
cat >expect <<-\EOF &&
error: missing value for '\''pack.preferbitmaptips'\''
EOF
- git repack -adb 2>actual &&
+
+ # Disable name hash version adjustment due to stderr comparison.
+ GIT_TEST_NAME_HASH_VERSION=1 \
+ git repack -adb 2>actual &&
test_cmp expect actual
)
'
diff --git a/t/t5323-pack-redundant.sh b/t/t5323-pack-redundant.sh
index 8dbbcc5e51..688cd9706c 100755
--- a/t/t5323-pack-redundant.sh
+++ b/t/t5323-pack-redundant.sh
@@ -36,6 +36,12 @@ relationship between packs and objects is as follows:
. ./test-lib.sh
+if ! test_have_prereq WITHOUT_BREAKING_CHANGES
+then
+ skip_all='skipping git-pack-redundant tests; built with breaking changes'
+ test_done
+fi
+
main_repo=main.git
shared_repo=shared.git
diff --git a/t/t5333-pseudo-merge-bitmaps.sh b/t/t5333-pseudo-merge-bitmaps.sh
index 1dd6284756..3905cb6e4f 100755
--- a/t/t5333-pseudo-merge-bitmaps.sh
+++ b/t/t5333-pseudo-merge-bitmaps.sh
@@ -208,7 +208,8 @@ test_expect_success 'bitmapPseudoMerge.stableThreshold creates stable groups' '
'
test_expect_success 'out of order thresholds are rejected' '
- test_must_fail git \
+ # Disable the test var to remove a stderr message.
+ test_must_fail env GIT_TEST_NAME_HASH_VERSION=1 git \
-c bitmapPseudoMerge.test.pattern="refs/*" \
-c bitmapPseudoMerge.test.threshold=1.month.ago \
-c bitmapPseudoMerge.test.stableThreshold=1.week.ago \
diff --git a/t/t5401-update-hooks.sh b/t/t5401-update-hooks.sh
index 723d1e17ec..17a46fd3ba 100755
--- a/t/t5401-update-hooks.sh
+++ b/t/t5401-update-hooks.sh
@@ -64,14 +64,14 @@ test_expect_success 'updated as expected' '
'
test_expect_success 'hooks ran' '
- test -f victim.git/pre-receive.args &&
- test -f victim.git/pre-receive.stdin &&
- test -f victim.git/update.args &&
- test -f victim.git/update.stdin &&
- test -f victim.git/post-receive.args &&
- test -f victim.git/post-receive.stdin &&
- test -f victim.git/post-update.args &&
- test -f victim.git/post-update.stdin
+ test_path_is_file victim.git/pre-receive.args &&
+ test_path_is_file victim.git/pre-receive.stdin &&
+ test_path_is_file victim.git/update.args &&
+ test_path_is_file victim.git/update.stdin &&
+ test_path_is_file victim.git/post-receive.args &&
+ test_path_is_file victim.git/post-receive.stdin &&
+ test_path_is_file victim.git/post-update.args &&
+ test_path_is_file victim.git/post-update.stdin
'
test_expect_success 'pre-receive hook input' '
diff --git a/t/t5504-fetch-receive-strict.sh b/t/t5504-fetch-receive-strict.sh
index 8212a70be8..58074506c5 100755
--- a/t/t5504-fetch-receive-strict.sh
+++ b/t/t5504-fetch-receive-strict.sh
@@ -64,12 +64,6 @@ test_expect_success 'fetch with transfer.fsckobjects' '
)
'
-cat >exp <<EOF
-To dst
-! refs/heads/main:refs/heads/test [remote rejected] (missing necessary objects)
-Done
-EOF
-
test_expect_success 'push without strict' '
rm -rf dst &&
git init dst &&
@@ -78,6 +72,11 @@ test_expect_success 'push without strict' '
git config fetch.fsckobjects false &&
git config transfer.fsckobjects false
) &&
+ cat >exp <<-\EOF &&
+ To dst
+ ! refs/heads/main:refs/heads/test [remote rejected] (missing necessary objects)
+ Done
+ EOF
test_must_fail git push --porcelain dst main:refs/heads/test >act &&
test_cmp exp act
'
@@ -94,11 +93,6 @@ test_expect_success 'push with !receive.fsckobjects' '
test_cmp exp act
'
-cat >exp <<EOF
-To dst
-! refs/heads/main:refs/heads/test [remote rejected] (unpacker error)
-EOF
-
test_expect_success 'push with receive.fsckobjects' '
rm -rf dst &&
git init dst &&
@@ -107,6 +101,10 @@ test_expect_success 'push with receive.fsckobjects' '
git config receive.fsckobjects true &&
git config transfer.fsckobjects false
) &&
+ cat >exp <<-\EOF &&
+ To dst
+ ! refs/heads/main:refs/heads/test [remote rejected] (unpacker error)
+ EOF
test_must_fail git push --porcelain dst main:refs/heads/test >act &&
test_cmp exp act
'
@@ -129,15 +127,14 @@ test_expect_success 'repair the "corrupt or missing" object' '
git fsck
'
-cat >bogus-commit <<EOF
-tree $EMPTY_TREE
-author Bugs Bunny 1234567890 +0000
-committer Bugs Bunny <bugs@bun.ni> 1234567890 +0000
-
-This commit object intentionally broken
-EOF
-
test_expect_success 'setup bogus commit' '
+ cat >bogus-commit <<-EOF &&
+ tree $EMPTY_TREE
+ author Bugs Bunny 1234567890 +0000
+ committer Bugs Bunny <bugs@bun.ni> 1234567890 +0000
+
+ This commit object intentionally broken
+ EOF
commit="$(git hash-object --literally -t commit -w --stdin <bogus-commit)"
'
@@ -167,6 +164,8 @@ test_expect_success 'fsck with unsorted skipList' '
test_expect_success 'fsck with invalid or bogus skipList input' '
git -c fsck.skipList=/dev/null -c fsck.missingEmail=ignore fsck &&
+ test_must_fail git -c fsck.skipList -c fsck.missingEmail=ignore fsck 2>err &&
+ test_grep "unable to parse '\'fsck.skiplist\'' from command-line config" err &&
test_must_fail git -c fsck.skipList=does-not-exist -c fsck.missingEmail=ignore fsck 2>err &&
test_grep "could not open.*: does-not-exist" err &&
test_must_fail git -c fsck.skipList=.git/config -c fsck.missingEmail=ignore fsck 2>err &&
@@ -213,6 +212,11 @@ test_expect_success 'fsck with exhaustive accepted skipList input (various types
test_must_be_empty err
'
+test_expect_success 'receive-pack with missing receive.fsck.skipList path' '
+ test_must_fail git -c receive.fsck.skipList receive-pack dst 2>err &&
+ test_grep "unable to parse '\'receive.fsck.skiplist\'' from command-line config" err
+'
+
test_expect_success 'push with receive.fsck.skipList' '
git push . $commit:refs/heads/bogus &&
rm -rf dst &&
@@ -255,6 +259,9 @@ test_expect_success 'fetch with fetch.fsck.skipList' '
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec &&
# Invalid and/or bogus skipList input
+ test_must_fail git --git-dir=dst/.git -c fetch.fsck.skipList fetch \
+ "file://$(pwd)" $refspec 2>err &&
+ test_grep "unable to parse '\'fetch.fsck.skiplist\'' from command-line config" err &&
git --git-dir=dst/.git config fetch.fsck.skipList /dev/null &&
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec &&
git --git-dir=dst/.git config fetch.fsck.skipList does-not-exist &&
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index 519f7973e3..bb7e0c6879 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -589,6 +589,16 @@ test_expect_success 'add --mirror setting HEAD' '
)
'
+test_expect_success 'non-mirror fetch does not interfere with mirror' '
+ test_when_finished rm -rf headnotmain &&
+ (
+ git init --bare -b notmain headnotmain &&
+ cd headnotmain &&
+ git remote add -f other ../two &&
+ test "$(git symbolic-ref HEAD)" = "refs/heads/notmain"
+ )
+'
+
test_expect_success 'add --mirror=fetch' '
mkdir mirror-fetch &&
git init -b main mirror-fetch/parent &&
@@ -1113,7 +1123,7 @@ Pull: refs/heads/main:refs/heads/origin
Pull: refs/heads/next:refs/heads/origin2
EOF
-test_expect_success 'migrate a remote from named file in $GIT_DIR/remotes' '
+test_expect_success WITHOUT_BREAKING_CHANGES 'migrate a remote from named file in $GIT_DIR/remotes' '
git clone one five &&
origin_url=$(pwd)/one &&
(
@@ -1139,7 +1149,7 @@ test_expect_success 'migrate a remote from named file in $GIT_DIR/remotes' '
)
'
-test_expect_success 'migrate a remote from named file in $GIT_DIR/branches' '
+test_expect_success WITHOUT_BREAKING_CHANGES 'migrate a remote from named file in $GIT_DIR/branches' '
git clone --template= one six &&
origin_url=$(pwd)/one &&
(
@@ -1155,7 +1165,7 @@ test_expect_success 'migrate a remote from named file in $GIT_DIR/branches' '
)
'
-test_expect_success 'migrate a remote from named file in $GIT_DIR/branches (2)' '
+test_expect_success WITHOUT_BREAKING_CHANGES 'migrate a remote from named file in $GIT_DIR/branches (2)' '
git clone --template= one seven &&
(
cd seven &&
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 2d9587059f..5f350facf5 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -34,14 +34,11 @@ test_expect_success "clone and setup child repos" '
git clone . three &&
(
cd three &&
- git config branch.main.remote two &&
- git config branch.main.merge refs/heads/one &&
- mkdir -p .git/remotes &&
- cat >.git/remotes/two <<-\EOF
- URL: ../two/.git/
- Pull: refs/heads/main:refs/heads/two
- Pull: refs/heads/one:refs/heads/one
- EOF
+ git config set remote.two.url ../two/.git/ &&
+ git config set remote.two.fetch refs/heads/main:refs/heads/two &&
+ git config set --append remote.two.fetch refs/heads/one:refs/heads/one &&
+ git config set branch.main.remote two &&
+ git config set branch.main.merge refs/heads/one
) &&
git clone . bundle &&
git clone . seven
@@ -84,6 +81,23 @@ test_expect_success "fetch test remote HEAD" '
branch=$(git rev-parse refs/remotes/origin/main) &&
test "z$head" = "z$branch"'
+test_expect_success "fetch test remote HEAD in bare repository" '
+ test_when_finished rm -rf barerepo &&
+ (
+ cd "$D" &&
+ git init --bare barerepo &&
+ cd barerepo &&
+ git remote add upstream ../two &&
+ git fetch upstream &&
+ git rev-parse --verify refs/remotes/upstream/HEAD &&
+ git rev-parse --verify refs/remotes/upstream/main &&
+ head=$(git rev-parse refs/remotes/upstream/HEAD) &&
+ branch=$(git rev-parse refs/remotes/upstream/main) &&
+ test "z$head" = "z$branch"
+ )
+'
+
+
test_expect_success "fetch test remote HEAD change" '
cd "$D" &&
cd two &&
@@ -1240,7 +1254,12 @@ test_expect_success 'all boundary commits are excluded' '
test_tick &&
git merge otherside &&
ad=$(git log --no-walk --format=%ad HEAD) &&
- git bundle create twoside-boundary.bdl main --since="$ad" &&
+
+ # If the a different name hash function is used here, then no delta
+ # pair is found and the bundle does not expand to three objects
+ # when fixing the thin object.
+ GIT_TEST_NAME_HASH_VERSION=1 \
+ git bundle create twoside-boundary.bdl main --since="$ad" &&
test_bundle_object_count --thin twoside-boundary.bdl 3
'
diff --git a/t/t5515-fetch-merge-logic.sh b/t/t5515-fetch-merge-logic.sh
index 320d26796d..4e6026c611 100755
--- a/t/t5515-fetch-merge-logic.sh
+++ b/t/t5515-fetch-merge-logic.sh
@@ -104,28 +104,31 @@ test_expect_success setup '
git config remote.config-glob.fetch refs/heads/*:refs/remotes/rem/* &&
remotes="$remotes config-glob" &&
- mkdir -p .git/remotes &&
- cat >.git/remotes/remote-explicit <<-\EOF &&
- URL: ../.git/
- Pull: refs/heads/main:remotes/rem/main
- Pull: refs/heads/one:remotes/rem/one
- Pull: two:remotes/rem/two
- Pull: refs/heads/three:remotes/rem/three
- EOF
- remotes="$remotes remote-explicit" &&
-
- cat >.git/remotes/remote-glob <<-\EOF &&
- URL: ../.git/
- Pull: refs/heads/*:refs/remotes/rem/*
- EOF
- remotes="$remotes remote-glob" &&
-
- mkdir -p .git/branches &&
- echo "../.git" > .git/branches/branches-default &&
- remotes="$remotes branches-default" &&
-
- echo "../.git#one" > .git/branches/branches-one &&
- remotes="$remotes branches-one" &&
+ if test_have_prereq WITHOUT_BREAKING_CHANGES
+ then
+ mkdir -p .git/remotes &&
+ cat >.git/remotes/remote-explicit <<-\EOF &&
+ URL: ../.git/
+ Pull: refs/heads/main:remotes/rem/main
+ Pull: refs/heads/one:remotes/rem/one
+ Pull: two:remotes/rem/two
+ Pull: refs/heads/three:remotes/rem/three
+ EOF
+ remotes="$remotes remote-explicit" &&
+
+ cat >.git/remotes/remote-glob <<-\EOF &&
+ URL: ../.git/
+ Pull: refs/heads/*:refs/remotes/rem/*
+ EOF
+ remotes="$remotes remote-glob" &&
+
+ mkdir -p .git/branches &&
+ echo "../.git" > .git/branches/branches-default &&
+ remotes="$remotes branches-default" &&
+
+ echo "../.git#one" > .git/branches/branches-one &&
+ remotes="$remotes branches-one"
+ fi &&
for remote in $remotes ; do
git config branch.br-$remote.remote $remote &&
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index 041d7d806f..85ed049627 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -975,7 +975,7 @@ test_expect_success 'allow push to HEAD of non-bare repository (config)' '
! grep "warning: updating the current branch" stderr
'
-test_expect_success 'fetch with branches' '
+test_expect_success WITHOUT_BREAKING_CHANGES 'fetch with branches' '
mk_empty testrepo &&
git branch second $the_first_commit &&
git checkout second &&
@@ -991,7 +991,7 @@ test_expect_success 'fetch with branches' '
git checkout main
'
-test_expect_success 'fetch with branches containing #' '
+test_expect_success WITHOUT_BREAKING_CHANGES 'fetch with branches containing #' '
mk_empty testrepo &&
mkdir testrepo/.git/branches &&
echo "..#second" > testrepo/.git/branches/branch2 &&
@@ -1005,7 +1005,7 @@ test_expect_success 'fetch with branches containing #' '
git checkout main
'
-test_expect_success 'push with branches' '
+test_expect_success WITHOUT_BREAKING_CHANGES 'push with branches' '
mk_empty testrepo &&
git checkout second &&
@@ -1022,7 +1022,7 @@ test_expect_success 'push with branches' '
)
'
-test_expect_success 'push with branches containing #' '
+test_expect_success WITHOUT_BREAKING_CHANGES 'push with branches containing #' '
mk_empty testrepo &&
test_when_finished "rm -rf .git/branches" &&
@@ -1211,18 +1211,16 @@ test_expect_success 'push --porcelain --dry-run rejected' '
'
test_expect_success 'push --prune' '
- mk_test testrepo heads/main heads/second heads/foo heads/bar &&
+ mk_test testrepo heads/main heads/foo heads/bar &&
git push --prune testrepo : &&
check_push_result testrepo $the_commit heads/main &&
- check_push_result testrepo $the_first_commit heads/second &&
! check_push_result testrepo $the_first_commit heads/foo heads/bar
'
test_expect_success 'push --prune refspec' '
- mk_test testrepo tmp/main tmp/second tmp/foo tmp/bar &&
+ mk_test testrepo tmp/main tmp/foo tmp/bar &&
git push --prune testrepo "refs/heads/*:refs/tmp/*" &&
check_push_result testrepo $the_commit tmp/main &&
- check_push_result testrepo $the_first_commit tmp/second &&
! check_push_result testrepo $the_first_commit tmp/foo tmp/bar
'
diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh
index 71428f3d5c..538b603f03 100755
--- a/t/t5541-http-push-smart.sh
+++ b/t/t5541-http-push-smart.sh
@@ -343,7 +343,7 @@ test_expect_success 'push over smart http with auth' '
git push "$HTTPD_URL"/auth/smart/test_repo.git &&
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
log -1 --format=%s >actual &&
- expect_askpass both user@host &&
+ expect_askpass both user%40host &&
test_cmp expect actual
'
@@ -355,7 +355,7 @@ test_expect_success 'push to auth-only-for-push repo' '
git push "$HTTPD_URL"/auth-push/smart/test_repo.git &&
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
log -1 --format=%s >actual &&
- expect_askpass both user@host &&
+ expect_askpass both user%40host &&
test_cmp expect actual
'
@@ -385,7 +385,7 @@ test_expect_success 'push into half-auth-complete requires password' '
git push "$HTTPD_URL/half-auth-complete/smart/half-auth.git" &&
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/half-auth.git" \
log -1 --format=%s >actual &&
- expect_askpass both user@host &&
+ expect_askpass both user%40host &&
test_cmp expect actual
'
diff --git a/t/t5543-atomic-push.sh b/t/t5543-atomic-push.sh
index 04b47ad84a..3a700b0676 100755
--- a/t/t5543-atomic-push.sh
+++ b/t/t5543-atomic-push.sh
@@ -280,4 +280,34 @@ test_expect_success 'atomic push reports (reject by non-ff)' '
test_cmp expect actual
'
+test_expect_success 'atomic push reports exit code failure' '
+ write_script receive-pack-wrapper <<-\EOF &&
+ git-receive-pack "$@"
+ exit 1
+ EOF
+ test_must_fail git -C workbench push --atomic \
+ --receive-pack="${SQ}$(pwd)${SQ}/receive-pack-wrapper" \
+ up HEAD:refs/heads/no-conflict 2>err &&
+ cat >expect <<-EOF &&
+ To ../upstream
+ * [new branch] HEAD -> no-conflict
+ error: failed to push some refs to ${SQ}../upstream${SQ}
+ EOF
+ test_cmp expect err
+'
+
+test_expect_success 'atomic push reports exit code failure with porcelain' '
+ write_script receive-pack-wrapper <<-\EOF &&
+ git-receive-pack "$@"
+ exit 1
+ EOF
+ test_must_fail git -C workbench push --atomic --porcelain \
+ --receive-pack="${SQ}$(pwd)${SQ}/receive-pack-wrapper" \
+ up HEAD:refs/heads/no-conflict-porcelain 2>err &&
+ cat >expect <<-EOF &&
+ error: failed to push some refs to ${SQ}../upstream${SQ}
+ EOF
+ test_cmp expect err
+'
+
test_done
diff --git a/t/t5548-push-porcelain.sh b/t/t5548-push-porcelain.sh
index 6282728eaf..4c19404ebe 100755
--- a/t/t5548-push-porcelain.sh
+++ b/t/t5548-push-porcelain.sh
@@ -54,29 +54,67 @@ format_and_save_expect () {
sed -e 's/^> //' -e 's/Z$//' >expect
}
+create_upstream_template () {
+ git init --bare upstream-template.git &&
+ git clone upstream-template.git tmp_work_dir &&
+ create_commits_in tmp_work_dir A B &&
+ (
+ cd tmp_work_dir &&
+ git push origin \
+ $B:refs/heads/main \
+ $A:refs/heads/foo \
+ $A:refs/heads/bar \
+ $A:refs/heads/baz
+ ) &&
+ rm -rf tmp_work_dir
+}
+
+setup_upstream () {
+ if test $# -ne 1
+ then
+ BUG "location of upstream repository is not provided"
+ fi &&
+ rm -rf "$1" &&
+ if ! test -d upstream-template.git
+ then
+ create_upstream_template
+ fi &&
+ git clone --mirror upstream-template.git "$1" &&
+ # The upstream repository provides services using the HTTP protocol.
+ if ! test "$1" = "upstream.git"
+ then
+ git -C "$1" config http.receivepack true
+ fi
+}
+
setup_upstream_and_workbench () {
- # Upstream after setup : main(B) foo(A) bar(A) baz(A)
- # Workbench after setup : main(A)
+ if test $# -ne 1
+ then
+ BUG "location of upstream repository is not provided"
+ fi
+ upstream="$1"
+
+ # Upstream after setup: main(B) foo(A) bar(A) baz(A)
+ # Workbench after setup: main(A) baz(A) next(A)
test_expect_success "setup upstream repository and workbench" '
- rm -rf upstream.git workbench &&
- git init --bare upstream.git &&
- git init workbench &&
- create_commits_in workbench A B &&
+ setup_upstream "$upstream" &&
+ rm -rf workbench &&
+ git clone "$upstream" workbench &&
(
cd workbench &&
+ git update-ref refs/heads/main $A &&
+ git update-ref refs/heads/baz $A &&
+ git update-ref refs/heads/next $A &&
# Try to make a stable fixed width for abbreviated commit ID,
# this fixed-width oid will be replaced with "<OID>".
git config core.abbrev 7 &&
- git remote add origin ../upstream.git &&
- git update-ref refs/heads/main $A &&
- git push origin \
- $B:refs/heads/main \
- $A:refs/heads/foo \
- $A:refs/heads/bar \
- $A:refs/heads/baz
+ git config advice.pushUpdateRejected false
) &&
- git -C "workbench" config advice.pushUpdateRejected false &&
- upstream=upstream.git
+ # The upstream repository provides services using the HTTP protocol.
+ if ! test "$upstream" = "upstream.git"
+ then
+ git -C workbench remote set-url origin "$HTTPD_URL/smart/upstream.git"
+ fi
'
}
@@ -88,34 +126,29 @@ run_git_push_porcelain_output_test() {
;;
file)
PROTOCOL="builtin protocol"
- URL_PREFIX="\.\."
+ URL_PREFIX=".*"
;;
esac
# Refs of upstream : main(B) foo(A) bar(A) baz(A)
# Refs of workbench: main(A) baz(A) next(A)
# git-push : main(A) NULL (B) baz(A) next(A)
- test_expect_success "porcelain output of successful git-push ($PROTOCOL)" '
- (
- cd workbench &&
- git update-ref refs/heads/main $A &&
- git update-ref refs/heads/baz $A &&
- git update-ref refs/heads/next $A &&
- git push --porcelain --force origin \
- main \
- :refs/heads/foo \
- $B:bar \
- baz \
- next
- ) >out &&
+ test_expect_success ".. git-push --porcelain ($PROTOCOL)" '
+ test_when_finished "setup_upstream \"$upstream\"" &&
+ test_must_fail git -C workbench push --porcelain origin \
+ main \
+ :refs/heads/foo \
+ $B:bar \
+ baz \
+ next >out &&
make_user_friendly_and_stable_output <out >actual &&
- format_and_save_expect <<-EOF &&
+ format_and_save_expect <<-\EOF &&
> To <URL/of/upstream.git>
> = refs/heads/baz:refs/heads/baz [up to date]
> <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B>
> - :refs/heads/foo [deleted]
- > + refs/heads/main:refs/heads/main <COMMIT-B>...<COMMIT-A> (forced update)
> * refs/heads/next:refs/heads/next [new branch]
+ > ! refs/heads/main:refs/heads/main [rejected] (non-fast-forward)
> Done
EOF
test_cmp expect actual &&
@@ -125,34 +158,32 @@ run_git_push_porcelain_output_test() {
cat >expect <<-EOF &&
<COMMIT-B> refs/heads/bar
<COMMIT-A> refs/heads/baz
- <COMMIT-A> refs/heads/main
+ <COMMIT-B> refs/heads/main
<COMMIT-A> refs/heads/next
EOF
test_cmp expect actual
'
- # Refs of upstream : main(A) bar(B) baz(A) next(A)
- # Refs of workbench: main(B) bar(A) baz(A) next(A)
- # git-push : main(B) bar(A) NULL next(A)
- test_expect_success "atomic push failed ($PROTOCOL)" '
- (
- cd workbench &&
- git update-ref refs/heads/main $B &&
- git update-ref refs/heads/bar $A &&
- test_must_fail git push --atomic --porcelain origin \
- main \
- bar \
- :baz \
- next
- ) >out &&
+ # Refs of upstream : main(B) foo(A) bar(A) baz(A)
+ # Refs of workbench: main(A) baz(A) next(A)
+ # git-push : main(A) NULL (B) baz(A) next(A)
+ test_expect_success ".. git-push --porcelain --force ($PROTOCOL)" '
+ test_when_finished "setup_upstream \"$upstream\"" &&
+ git -C workbench push --porcelain --force origin \
+ main \
+ :refs/heads/foo \
+ $B:bar \
+ baz \
+ next >out &&
make_user_friendly_and_stable_output <out >actual &&
format_and_save_expect <<-EOF &&
- To <URL/of/upstream.git>
- > = refs/heads/next:refs/heads/next [up to date]
- > ! refs/heads/bar:refs/heads/bar [rejected] (non-fast-forward)
- > ! (delete):refs/heads/baz [rejected] (atomic push failed)
- > ! refs/heads/main:refs/heads/main [rejected] (atomic push failed)
- Done
+ > To <URL/of/upstream.git>
+ > = refs/heads/baz:refs/heads/baz [up to date]
+ > <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B>
+ > - :refs/heads/foo [deleted]
+ > + refs/heads/main:refs/heads/main <COMMIT-B>...<COMMIT-A> (forced update)
+ > * refs/heads/next:refs/heads/next [new branch]
+ > Done
EOF
test_cmp expect actual &&
@@ -167,34 +198,129 @@ run_git_push_porcelain_output_test() {
test_cmp expect actual
'
- test_expect_success "prepare pre-receive hook ($PROTOCOL)" '
- test_hook --setup -C "$upstream" pre-receive <<-EOF
- exit 1
+ # Refs of upstream : main(B) foo(A) bar(A) baz(A)
+ # Refs of workbench: main(A) baz(A) next(A)
+ # git-push : main(A) NULL (B) baz(A) next(A)
+ test_expect_success ".. git push --porcelain --atomic ($PROTOCOL)" '
+ test_when_finished "setup_upstream \"$upstream\"" &&
+ test_must_fail git -C workbench push --porcelain --atomic origin \
+ main \
+ :refs/heads/foo \
+ $B:bar \
+ baz \
+ next >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ format_and_save_expect <<-EOF &&
+ > To <URL/of/upstream.git>
+ > = refs/heads/baz:refs/heads/baz [up to date]
+ > ! <COMMIT-B>:refs/heads/bar [rejected] (atomic push failed)
+ > ! (delete):refs/heads/foo [rejected] (atomic push failed)
+ > ! refs/heads/main:refs/heads/main [rejected] (non-fast-forward)
+ > ! refs/heads/next:refs/heads/next [rejected] (atomic push failed)
+ > Done
+ EOF
+ test_cmp expect actual &&
+
+ git -C "$upstream" show-ref >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ cat >expect <<-EOF &&
+ <COMMIT-A> refs/heads/bar
+ <COMMIT-A> refs/heads/baz
+ <COMMIT-A> refs/heads/foo
+ <COMMIT-B> refs/heads/main
+ EOF
+ test_cmp expect actual
+ '
+
+ # Refs of upstream : main(B) foo(A) bar(A) baz(A)
+ # Refs of workbench: main(A) baz(A) next(A)
+ # git-push : main(A) NULL (B) baz(A) next(A)
+ test_expect_success ".. pre-receive hook declined ($PROTOCOL)" '
+ test_when_finished "rm -f \"$upstream/hooks/pre-receive\" &&
+ setup_upstream \"$upstream\"" &&
+ test_hook --setup -C "$upstream" pre-receive <<-EOF &&
+ exit 1
+ EOF
+ test_must_fail git -C workbench push --porcelain --force origin \
+ main \
+ :refs/heads/foo \
+ $B:bar \
+ baz \
+ next >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ format_and_save_expect <<-EOF &&
+ > To <URL/of/upstream.git>
+ > = refs/heads/baz:refs/heads/baz [up to date]
+ > ! <COMMIT-B>:refs/heads/bar [remote rejected] (pre-receive hook declined)
+ > ! :refs/heads/foo [remote rejected] (pre-receive hook declined)
+ > ! refs/heads/main:refs/heads/main [remote rejected] (pre-receive hook declined)
+ > ! refs/heads/next:refs/heads/next [remote rejected] (pre-receive hook declined)
+ > Done
+ EOF
+ test_cmp expect actual &&
+
+ git -C "$upstream" show-ref >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ cat >expect <<-EOF &&
+ <COMMIT-A> refs/heads/bar
+ <COMMIT-A> refs/heads/baz
+ <COMMIT-A> refs/heads/foo
+ <COMMIT-B> refs/heads/main
EOF
+ test_cmp expect actual
'
- # Refs of upstream : main(A) bar(B) baz(A) next(A)
- # Refs of workbench: main(B) bar(A) baz(A) next(A)
- # git-push : main(B) bar(A) NULL next(A)
- test_expect_success "pre-receive hook declined ($PROTOCOL)" '
+ # Refs of upstream : main(B) foo(A) bar(A) baz(A)
+ # Refs of workbench: main(A) baz(A) next(A)
+ # git-push : main(A) next(A)
+ test_expect_success ".. non-fastforward push ($PROTOCOL)" '
+ test_when_finished "setup_upstream \"$upstream\"" &&
(
cd workbench &&
- git update-ref refs/heads/main $B &&
- git update-ref refs/heads/bar $A &&
- test_must_fail git push --porcelain --force origin \
+ test_must_fail git push --porcelain origin \
main \
- bar \
- :baz \
next
) >out &&
make_user_friendly_and_stable_output <out >actual &&
format_and_save_expect <<-EOF &&
- To <URL/of/upstream.git>
- > = refs/heads/next:refs/heads/next [up to date]
- > ! refs/heads/bar:refs/heads/bar [remote rejected] (pre-receive hook declined)
- > ! :refs/heads/baz [remote rejected] (pre-receive hook declined)
- > ! refs/heads/main:refs/heads/main [remote rejected] (pre-receive hook declined)
- Done
+ > To <URL/of/upstream.git>
+ > * refs/heads/next:refs/heads/next [new branch]
+ > ! refs/heads/main:refs/heads/main [rejected] (non-fast-forward)
+ > Done
+ EOF
+ test_cmp expect actual &&
+
+ git -C "$upstream" show-ref >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ cat >expect <<-EOF &&
+ <COMMIT-A> refs/heads/bar
+ <COMMIT-A> refs/heads/baz
+ <COMMIT-A> refs/heads/foo
+ <COMMIT-B> refs/heads/main
+ <COMMIT-A> refs/heads/next
+ EOF
+ test_cmp expect actual
+ '
+
+ # Refs of upstream : main(B) foo(A) bar(A) baz(A)
+ # Refs of workbench: main(A) baz(A) next(A)
+ # git-push : main(A) NULL (B) baz(A) next(A)
+ test_expect_success ".. git push --porcelain --atomic --force ($PROTOCOL)" '
+ git -C workbench push --porcelain --atomic --force origin \
+ main \
+ :refs/heads/foo \
+ $B:bar \
+ baz \
+ next >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ format_and_save_expect <<-\EOF &&
+ > To <URL/of/upstream.git>
+ > = refs/heads/baz:refs/heads/baz [up to date]
+ > <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B>
+ > - :refs/heads/foo [deleted]
+ > + refs/heads/main:refs/heads/main <COMMIT-B>...<COMMIT-A> (forced update)
+ > * refs/heads/next:refs/heads/next [new branch]
+ > Done
EOF
test_cmp expect actual &&
@@ -208,71 +334,174 @@ run_git_push_porcelain_output_test() {
EOF
test_cmp expect actual
'
+}
- test_expect_success "remove pre-receive hook ($PROTOCOL)" '
- rm "$upstream/hooks/pre-receive"
+run_git_push_dry_run_porcelain_output_test() {
+ case $1 in
+ http)
+ PROTOCOL="HTTP protocol"
+ URL_PREFIX="http://.*"
+ ;;
+ file)
+ PROTOCOL="builtin protocol"
+ URL_PREFIX=".*"
+ ;;
+ esac
+
+ # Refs of upstream : main(B) foo(A) bar(A) baz(A)
+ # Refs of workbench: main(A) baz(A) next(A)
+ # git-push : main(A) NULL (B) baz(A) next(A)
+ test_expect_success ".. git-push --porcelain --dry-run ($PROTOCOL)" '
+ test_must_fail git -C workbench push --porcelain --dry-run origin \
+ main \
+ :refs/heads/foo \
+ $B:bar \
+ baz \
+ next >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ format_and_save_expect <<-EOF &&
+ > To <URL/of/upstream.git>
+ > = refs/heads/baz:refs/heads/baz [up to date]
+ > <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B>
+ > - :refs/heads/foo [deleted]
+ > * refs/heads/next:refs/heads/next [new branch]
+ > ! refs/heads/main:refs/heads/main [rejected] (non-fast-forward)
+ > Done
+ EOF
+ test_cmp expect actual &&
+
+ git -C "$upstream" show-ref >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ cat >expect <<-EOF &&
+ <COMMIT-A> refs/heads/bar
+ <COMMIT-A> refs/heads/baz
+ <COMMIT-A> refs/heads/foo
+ <COMMIT-B> refs/heads/main
+ EOF
+ test_cmp expect actual
'
- # Refs of upstream : main(A) bar(B) baz(A) next(A)
- # Refs of workbench: main(B) bar(A) baz(A) next(A)
- # git-push : main(B) bar(A) NULL next(A)
- test_expect_success "non-fastforward push ($PROTOCOL)" '
- (
- cd workbench &&
- test_must_fail git push --porcelain origin \
- main \
- bar \
- :baz \
- next
- ) >out &&
+ # Refs of upstream : main(B) foo(A) bar(A) baz(A)
+ # Refs of workbench: main(A) baz(A) next(A)
+ # push : main(A) NULL (B) baz(A) next(A)
+ test_expect_success ".. git-push --porcelain --dry-run --force ($PROTOCOL)" '
+ git -C workbench push --porcelain --dry-run --force origin \
+ main \
+ :refs/heads/foo \
+ $B:bar \
+ baz \
+ next >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ format_and_save_expect <<-EOF &&
+ > To <URL/of/upstream.git>
+ > = refs/heads/baz:refs/heads/baz [up to date]
+ > <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B>
+ > - :refs/heads/foo [deleted]
+ > + refs/heads/main:refs/heads/main <COMMIT-B>...<COMMIT-A> (forced update)
+ > * refs/heads/next:refs/heads/next [new branch]
+ > Done
+ EOF
+ test_cmp expect actual &&
+
+ git -C "$upstream" show-ref >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ cat >expect <<-EOF &&
+ <COMMIT-A> refs/heads/bar
+ <COMMIT-A> refs/heads/baz
+ <COMMIT-A> refs/heads/foo
+ <COMMIT-B> refs/heads/main
+ EOF
+ test_cmp expect actual
+ '
+
+ # Refs of upstream : main(B) foo(A) bar(A) baz(A)
+ # Refs of workbench: main(A) baz(A) next(A)
+ # git-push : main(A) NULL (B) baz(A) next(A)
+ test_expect_success ".. git-push --porcelain --dry-run --atomic ($PROTOCOL)" '
+ test_must_fail git -C workbench push --porcelain --dry-run --atomic origin \
+ main \
+ :refs/heads/foo \
+ $B:bar \
+ baz \
+ next >out &&
make_user_friendly_and_stable_output <out >actual &&
format_and_save_expect <<-EOF &&
- To <URL/of/upstream.git>
- > = refs/heads/next:refs/heads/next [up to date]
- > - :refs/heads/baz [deleted]
- > refs/heads/main:refs/heads/main <COMMIT-A>..<COMMIT-B>
- > ! refs/heads/bar:refs/heads/bar [rejected] (non-fast-forward)
- Done
+ > To <URL/of/upstream.git>
+ > = refs/heads/baz:refs/heads/baz [up to date]
+ > ! <COMMIT-B>:refs/heads/bar [rejected] (atomic push failed)
+ > ! (delete):refs/heads/foo [rejected] (atomic push failed)
+ > ! refs/heads/main:refs/heads/main [rejected] (non-fast-forward)
+ > ! refs/heads/next:refs/heads/next [rejected] (atomic push failed)
+ > Done
EOF
test_cmp expect actual &&
git -C "$upstream" show-ref >out &&
make_user_friendly_and_stable_output <out >actual &&
cat >expect <<-EOF &&
- <COMMIT-B> refs/heads/bar
+ <COMMIT-A> refs/heads/bar
+ <COMMIT-A> refs/heads/baz
+ <COMMIT-A> refs/heads/foo
+ <COMMIT-B> refs/heads/main
+ EOF
+ test_cmp expect actual
+ '
+
+ # Refs of upstream : main(B) foo(A) bar(A) baz(A)
+ # Refs of workbench: main(A) baz(A) next(A)
+ # push : main(A) NULL (B) baz(A) next(A)
+ test_expect_success ".. git-push --porcelain --dry-run --atomic --force ($PROTOCOL)" '
+ git -C workbench push --porcelain --dry-run --atomic --force origin \
+ main \
+ :refs/heads/foo \
+ $B:bar \
+ baz \
+ next >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ format_and_save_expect <<-EOF &&
+ > To <URL/of/upstream.git>
+ > = refs/heads/baz:refs/heads/baz [up to date]
+ > <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B>
+ > - :refs/heads/foo [deleted]
+ > + refs/heads/main:refs/heads/main <COMMIT-B>...<COMMIT-A> (forced update)
+ > * refs/heads/next:refs/heads/next [new branch]
+ > Done
+ EOF
+ test_cmp expect actual &&
+
+ git -C "$upstream" show-ref >out &&
+ make_user_friendly_and_stable_output <out >actual &&
+ cat >expect <<-EOF &&
+ <COMMIT-A> refs/heads/bar
+ <COMMIT-A> refs/heads/baz
+ <COMMIT-A> refs/heads/foo
<COMMIT-B> refs/heads/main
- <COMMIT-A> refs/heads/next
EOF
test_cmp expect actual
'
}
-# Initialize the upstream repository and local workbench.
-setup_upstream_and_workbench
+setup_upstream_and_workbench upstream.git
-# Run git-push porcelain test on builtin protocol
run_git_push_porcelain_output_test file
+setup_upstream_and_workbench upstream.git
+
+run_git_push_dry_run_porcelain_output_test file
+
ROOT_PATH="$PWD"
. "$TEST_DIRECTORY"/lib-gpg.sh
. "$TEST_DIRECTORY"/lib-httpd.sh
. "$TEST_DIRECTORY"/lib-terminal.sh
start_httpd
+setup_askpass_helper
-# Re-initialize the upstream repository and local workbench.
-setup_upstream_and_workbench
-
-test_expect_success "setup for http" '
- git -C upstream.git config http.receivepack true &&
- upstream="$HTTPD_DOCUMENT_ROOT_PATH/upstream.git" &&
- mv upstream.git "$upstream" &&
+setup_upstream_and_workbench "$HTTPD_DOCUMENT_ROOT_PATH/upstream.git"
- git -C workbench remote set-url origin $HTTPD_URL/smart/upstream.git
-'
+run_git_push_porcelain_output_test http
-setup_askpass_helper
+setup_upstream_and_workbench "$HTTPD_DOCUMENT_ROOT_PATH/upstream.git"
-# Run git-push porcelain test on HTTP protocol
-run_git_push_porcelain_output_test http
+run_git_push_dry_run_porcelain_output_test http
test_done
diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh
index 21795a19bf..ed0ad66fad 100755
--- a/t/t5550-http-fetch-dumb.sh
+++ b/t/t5550-http-fetch-dumb.sh
@@ -111,13 +111,13 @@ test_expect_success 'http auth can use user/pass in URL' '
test_expect_success 'http auth can use just user in URL' '
set_askpass wrong pass@host &&
git clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-pass &&
- expect_askpass pass user@host
+ expect_askpass pass user%40host
'
test_expect_success 'http auth can request both user and pass' '
set_askpass user@host pass@host &&
git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-both &&
- expect_askpass both user@host
+ expect_askpass both user%40host
'
test_expect_success 'http auth respects credential helper config' '
@@ -135,14 +135,14 @@ test_expect_success 'http auth can get username from config' '
test_config_global "credential.$HTTPD_URL.username" user@host &&
set_askpass wrong pass@host &&
git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-user &&
- expect_askpass pass user@host
+ expect_askpass pass user%40host
'
test_expect_success 'configured username does not override URL' '
test_config_global "credential.$HTTPD_URL.username" wrong &&
set_askpass wrong pass@host &&
git clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-user2 &&
- expect_askpass pass user@host
+ expect_askpass pass user%40host
'
test_expect_success 'set up repo with http submodules' '
@@ -163,7 +163,7 @@ test_expect_success 'cmdline credential config passes to submodule via clone' '
set_askpass wrong pass@host &&
git -c "credential.$HTTPD_URL.username=user@host" \
clone --recursive super super-clone &&
- expect_askpass pass user@host
+ expect_askpass pass user%40host
'
test_expect_success 'cmdline credential config passes submodule via fetch' '
@@ -174,7 +174,7 @@ test_expect_success 'cmdline credential config passes submodule via fetch' '
git -C super-clone \
-c "credential.$HTTPD_URL.username=user@host" \
fetch --recurse-submodules &&
- expect_askpass pass user@host
+ expect_askpass pass user%40host
'
test_expect_success 'cmdline credential config passes submodule update' '
@@ -191,7 +191,7 @@ test_expect_success 'cmdline credential config passes submodule update' '
git -C super-clone \
-c "credential.$HTTPD_URL.username=user@host" \
submodule update &&
- expect_askpass pass user@host
+ expect_askpass pass user%40host
'
test_expect_success 'fetch changes via http' '
diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh
index ceb3336a5c..761fdfcfe6 100755
--- a/t/t5551-http-fetch-smart.sh
+++ b/t/t5551-http-fetch-smart.sh
@@ -181,7 +181,7 @@ test_expect_success 'clone from password-protected repository' '
echo two >expect &&
set_askpass user@host pass@host &&
git clone --bare "$HTTPD_URL/auth/smart/repo.git" smart-auth &&
- expect_askpass both user@host &&
+ expect_askpass both user%40host &&
git --git-dir=smart-auth log -1 --format=%s >actual &&
test_cmp expect actual
'
@@ -221,7 +221,7 @@ test_expect_success 'clone from auth-only-for-objects repository' '
echo two >expect &&
set_askpass user@host pass@host &&
git clone --bare "$HTTPD_URL/auth-fetch/smart/repo.git" half-auth &&
- expect_askpass both user@host &&
+ expect_askpass both user%40host &&
git --git-dir=half-auth log -1 --format=%s >actual &&
test_cmp expect actual
'
@@ -246,14 +246,14 @@ test_expect_success 'redirects send auth to new location' '
set_askpass user@host pass@host &&
git -c credential.useHttpPath=true \
clone $HTTPD_URL/smart-redir-auth/repo.git repo-redir-auth &&
- expect_askpass both user@host auth/smart/repo.git
+ expect_askpass both user%40host auth/smart/repo.git
'
test_expect_success 'GIT_TRACE_CURL redacts auth details' '
rm -rf redact-auth trace &&
set_askpass user@host pass@host &&
GIT_TRACE_CURL="$(pwd)/trace" git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth &&
- expect_askpass both user@host &&
+ expect_askpass both user%40host &&
# Ensure that there is no "Basic" followed by a base64 string, but that
# the auth details are redacted
@@ -265,7 +265,7 @@ test_expect_success 'GIT_CURL_VERBOSE redacts auth details' '
rm -rf redact-auth trace &&
set_askpass user@host pass@host &&
GIT_CURL_VERBOSE=1 git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth 2>trace &&
- expect_askpass both user@host &&
+ expect_askpass both user%40host &&
# Ensure that there is no "Basic" followed by a base64 string, but that
# the auth details are redacted
@@ -278,7 +278,7 @@ test_expect_success 'GIT_TRACE_CURL does not redact auth details if GIT_TRACE_RE
set_askpass user@host pass@host &&
GIT_TRACE_REDACT=0 GIT_TRACE_CURL="$(pwd)/trace" \
git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth &&
- expect_askpass both user@host &&
+ expect_askpass both user%40host &&
grep -i "Authorization: Basic [0-9a-zA-Z+/]" trace
'
@@ -592,7 +592,7 @@ test_expect_success 'http auth remembers successful credentials' '
# the first request prompts the user...
set_askpass user@host pass@host &&
git ls-remote "$HTTPD_URL/auth/smart/repo.git" >/dev/null &&
- expect_askpass both user@host &&
+ expect_askpass both user%40host &&
# ...and the second one uses the stored value rather than
# prompting the user.
@@ -623,7 +623,7 @@ test_expect_success 'http auth forgets bogus credentials' '
# us to prompt the user again.
set_askpass user@host pass@host &&
git ls-remote "$HTTPD_URL/auth/smart/repo.git" >/dev/null &&
- expect_askpass both user@host
+ expect_askpass both user%40host
'
test_expect_success 'client falls back from v2 to v0 to match server' '
diff --git a/t/t5620-backfill.sh b/t/t5620-backfill.sh
new file mode 100755
index 0000000000..58c81556e7
--- /dev/null
+++ b/t/t5620-backfill.sh
@@ -0,0 +1,211 @@
+#!/bin/sh
+
+test_description='git backfill on partial clones'
+
+GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
+export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
+
+. ./test-lib.sh
+
+# We create objects in the 'src' repo.
+test_expect_success 'setup repo for object creation' '
+ echo "{print \$1}" >print_1.awk &&
+ echo "{print \$2}" >print_2.awk &&
+
+ git init src &&
+
+ mkdir -p src/a/b/c &&
+ mkdir -p src/d/e &&
+
+ for i in 1 2
+ do
+ for n in 1 2 3 4
+ do
+ echo "Version $i of file $n" > src/file.$n.txt &&
+ echo "Version $i of file a/$n" > src/a/file.$n.txt &&
+ echo "Version $i of file a/b/$n" > src/a/b/file.$n.txt &&
+ echo "Version $i of file a/b/c/$n" > src/a/b/c/file.$n.txt &&
+ echo "Version $i of file d/$n" > src/d/file.$n.txt &&
+ echo "Version $i of file d/e/$n" > src/d/e/file.$n.txt &&
+ git -C src add . &&
+ git -C src commit -m "Iteration $n" || return 1
+ done
+ done
+'
+
+# Clone 'src' into 'srv.bare' so we have a bare repo to be our origin
+# server for the partial clone.
+test_expect_success 'setup bare clone for server' '
+ git clone --bare "file://$(pwd)/src" srv.bare &&
+ git -C srv.bare config --local uploadpack.allowfilter 1 &&
+ git -C srv.bare config --local uploadpack.allowanysha1inwant 1
+'
+
+# do basic partial clone from "srv.bare"
+test_expect_success 'do partial clone 1, backfill gets all objects' '
+ git clone --no-checkout --filter=blob:none \
+ --single-branch --branch=main \
+ "file://$(pwd)/srv.bare" backfill1 &&
+
+ # Backfill with no options gets everything reachable from HEAD.
+ GIT_TRACE2_EVENT="$(pwd)/backfill-file-trace" git \
+ -C backfill1 backfill &&
+
+ # We should have engaged the partial clone machinery
+ test_trace2_data promisor fetch_count 48 <backfill-file-trace &&
+
+ # No more missing objects!
+ git -C backfill1 rev-list --quiet --objects --missing=print HEAD >revs2 &&
+ test_line_count = 0 revs2
+'
+
+test_expect_success 'do partial clone 2, backfill min batch size' '
+ git clone --no-checkout --filter=blob:none \
+ --single-branch --branch=main \
+ "file://$(pwd)/srv.bare" backfill2 &&
+
+ GIT_TRACE2_EVENT="$(pwd)/batch-trace" git \
+ -C backfill2 backfill --min-batch-size=20 &&
+
+ # Batches were used
+ test_trace2_data promisor fetch_count 20 <batch-trace >matches &&
+ test_line_count = 2 matches &&
+ test_trace2_data promisor fetch_count 8 <batch-trace &&
+
+ # No more missing objects!
+ git -C backfill2 rev-list --quiet --objects --missing=print HEAD >revs2 &&
+ test_line_count = 0 revs2
+'
+
+test_expect_success 'backfill --sparse without sparse-checkout fails' '
+ git init not-sparse &&
+ test_must_fail git -C not-sparse backfill --sparse 2>err &&
+ grep "problem loading sparse-checkout" err
+'
+
+test_expect_success 'backfill --sparse' '
+ git clone --sparse --filter=blob:none \
+ --single-branch --branch=main \
+ "file://$(pwd)/srv.bare" backfill3 &&
+
+ # Initial checkout includes four files at root.
+ git -C backfill3 rev-list --quiet --objects --missing=print HEAD >missing &&
+ test_line_count = 44 missing &&
+
+ # Initial sparse-checkout is just the files at root, so we get the
+ # older versions of the four files at tip.
+ GIT_TRACE2_EVENT="$(pwd)/sparse-trace1" git \
+ -C backfill3 backfill --sparse &&
+ test_trace2_data promisor fetch_count 4 <sparse-trace1 &&
+ test_trace2_data path-walk paths 5 <sparse-trace1 &&
+ git -C backfill3 rev-list --quiet --objects --missing=print HEAD >missing &&
+ test_line_count = 40 missing &&
+
+ # Expand the sparse-checkout to include 'd' recursively. This
+ # engages the algorithm to skip the trees for 'a'. Note that
+ # the "sparse-checkout set" command downloads the objects at tip
+ # to satisfy the current checkout.
+ git -C backfill3 sparse-checkout set d &&
+ GIT_TRACE2_EVENT="$(pwd)/sparse-trace2" git \
+ -C backfill3 backfill --sparse &&
+ test_trace2_data promisor fetch_count 8 <sparse-trace2 &&
+ test_trace2_data path-walk paths 15 <sparse-trace2 &&
+ git -C backfill3 rev-list --quiet --objects --missing=print HEAD >missing &&
+ test_line_count = 24 missing &&
+
+ # Disabling the --sparse option (on by default) will download everything
+ git -C backfill3 backfill --no-sparse &&
+ git -C backfill3 rev-list --quiet --objects --missing=print HEAD >missing &&
+ test_line_count = 0 missing
+'
+
+test_expect_success 'backfill --sparse without cone mode (positive)' '
+ git clone --no-checkout --filter=blob:none \
+ --single-branch --branch=main \
+ "file://$(pwd)/srv.bare" backfill4 &&
+
+ # No blobs yet
+ git -C backfill4 rev-list --quiet --objects --missing=print HEAD >missing &&
+ test_line_count = 48 missing &&
+
+ # Define sparse-checkout by filename regardless of parent directory.
+ # This downloads 6 blobs to satisfy the checkout.
+ git -C backfill4 sparse-checkout set --no-cone "**/file.1.txt" &&
+ git -C backfill4 checkout main &&
+
+ # Track new blob count
+ git -C backfill4 rev-list --quiet --objects --missing=print HEAD >missing &&
+ test_line_count = 42 missing &&
+
+ GIT_TRACE2_EVENT="$(pwd)/no-cone-trace1" git \
+ -C backfill4 backfill --sparse &&
+ test_trace2_data promisor fetch_count 6 <no-cone-trace1 &&
+
+ # This walk needed to visit all directories to search for these paths.
+ test_trace2_data path-walk paths 12 <no-cone-trace1 &&
+ git -C backfill4 rev-list --quiet --objects --missing=print HEAD >missing &&
+ test_line_count = 36 missing
+'
+
+test_expect_success 'backfill --sparse without cone mode (negative)' '
+ git clone --no-checkout --filter=blob:none \
+ --single-branch --branch=main \
+ "file://$(pwd)/srv.bare" backfill5 &&
+
+ # No blobs yet
+ git -C backfill5 rev-list --quiet --objects --missing=print HEAD >missing &&
+ test_line_count = 48 missing &&
+
+ # Define sparse-checkout by filename regardless of parent directory.
+ # This downloads 18 blobs to satisfy the checkout
+ git -C backfill5 sparse-checkout set --no-cone "**/file*" "!**/file.1.txt" &&
+ git -C backfill5 checkout main &&
+
+ # Track new blob count
+ git -C backfill5 rev-list --quiet --objects --missing=print HEAD >missing &&
+ test_line_count = 30 missing &&
+
+ GIT_TRACE2_EVENT="$(pwd)/no-cone-trace2" git \
+ -C backfill5 backfill --sparse &&
+ test_trace2_data promisor fetch_count 18 <no-cone-trace2 &&
+
+ # This walk needed to visit all directories to search for these paths, plus
+ # 12 extra "file.?.txt" paths than the previous test.
+ test_trace2_data path-walk paths 24 <no-cone-trace2 &&
+ git -C backfill5 rev-list --quiet --objects --missing=print HEAD >missing &&
+ test_line_count = 12 missing
+'
+
+. "$TEST_DIRECTORY"/lib-httpd.sh
+start_httpd
+
+test_expect_success 'create a partial clone over HTTP' '
+ SERVER="$HTTPD_DOCUMENT_ROOT_PATH/server" &&
+ rm -rf "$SERVER" repo &&
+ git clone --bare "file://$(pwd)/src" "$SERVER" &&
+ test_config -C "$SERVER" uploadpack.allowfilter 1 &&
+ test_config -C "$SERVER" uploadpack.allowanysha1inwant 1 &&
+
+ git clone --no-checkout --filter=blob:none \
+ "$HTTPD_URL/smart/server" backfill-http
+'
+
+test_expect_success 'backfilling over HTTP succeeds' '
+ GIT_TRACE2_EVENT="$(pwd)/backfill-http-trace" git \
+ -C backfill-http backfill &&
+
+ # We should have engaged the partial clone machinery
+ test_trace2_data promisor fetch_count 48 <backfill-http-trace &&
+
+ # Confirm all objects are present, none missing.
+ git -C backfill-http rev-list --objects --all >rev-list-out &&
+ awk "{print \$1;}" <rev-list-out >oids &&
+ GIT_TRACE2_EVENT="$(pwd)/walk-trace" git -C backfill-http \
+ cat-file --batch-check <oids >batch-out &&
+ ! grep missing batch-out
+'
+
+# DO NOT add non-httpd-specific tests here, because the last part of this
+# test script is only executed when httpd is available and enabled.
+
+test_done
diff --git a/t/t5621-clone-revision.sh b/t/t5621-clone-revision.sh
new file mode 100755
index 0000000000..db3b8cff55
--- /dev/null
+++ b/t/t5621-clone-revision.sh
@@ -0,0 +1,122 @@
+#!/bin/sh
+
+test_description='tests for git clone --revision'
+GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
+export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+ test_commit --no-tag "initial commit" README "Hello" &&
+ test_commit --annotate "second commit" README "Hello world" v1.0 &&
+ test_commit --no-tag "third commit" README "Hello world!" &&
+ git switch -c feature v1.0 &&
+ test_commit --no-tag "feature commit" README "Hello world!" &&
+ git switch main
+'
+
+test_expect_success 'clone with --revision being a branch' '
+ test_when_finished "rm -rf dst" &&
+ git clone --revision=refs/heads/feature . dst &&
+ git rev-parse refs/heads/feature >expect &&
+ git -C dst rev-parse HEAD >actual &&
+ test_must_fail git -C dst symbolic-ref -q HEAD >/dev/null &&
+ test_cmp expect actual &&
+ git -C dst for-each-ref refs >expect &&
+ test_must_be_empty expect &&
+ test_must_fail git -C dst config remote.origin.fetch
+'
+
+test_expect_success 'clone with --depth and --revision being a branch' '
+ test_when_finished "rm -rf dst" &&
+ git clone --no-local --depth=1 --revision=refs/heads/feature . dst &&
+ git rev-parse refs/heads/feature >expect &&
+ git -C dst rev-parse HEAD >actual &&
+ test_must_fail git -C dst symbolic-ref -q HEAD >/dev/null &&
+ test_cmp expect actual &&
+ git -C dst for-each-ref refs >expect &&
+ test_must_be_empty expect &&
+ test_must_fail git -C dst config remote.origin.fetch &&
+ git -C dst rev-list HEAD >actual &&
+ test_line_count = 1 actual
+'
+
+test_expect_success 'clone with --revision being a tag' '
+ test_when_finished "rm -rf dst" &&
+ git clone --revision=refs/tags/v1.0 . dst &&
+ git rev-parse refs/tags/v1.0^{} >expect &&
+ git -C dst rev-parse HEAD >actual &&
+ test_must_fail git -C dst symbolic-ref -q HEAD >/dev/null &&
+ test_cmp expect actual &&
+ git -C dst for-each-ref refs >expect &&
+ test_must_be_empty expect &&
+ test_must_fail git -C dst config remote.origin.fetch
+'
+
+test_expect_success 'clone with --revision being HEAD' '
+ test_when_finished "rm -rf dst" &&
+ git clone --revision=HEAD . dst &&
+ git rev-parse HEAD >expect &&
+ git -C dst rev-parse HEAD >actual &&
+ test_must_fail git -C dst symbolic-ref -q HEAD >/dev/null &&
+ test_cmp expect actual &&
+ git -C dst for-each-ref refs >expect &&
+ test_must_be_empty expect &&
+ test_must_fail git -C dst config remote.origin.fetch
+'
+
+test_expect_success 'clone with --revision being a raw commit hash' '
+ test_when_finished "rm -rf dst" &&
+ oid=$(git rev-parse refs/heads/feature) &&
+ git clone --revision=$oid . dst &&
+ echo $oid >expect &&
+ git -C dst rev-parse HEAD >actual &&
+ test_must_fail git -C dst symbolic-ref -q HEAD >/dev/null &&
+ test_cmp expect actual &&
+ git -C dst for-each-ref refs >expect &&
+ test_must_be_empty expect &&
+ test_must_fail git -C dst config remote.origin.fetch
+'
+
+test_expect_success 'clone with --revision and --bare' '
+ test_when_finished "rm -rf dst" &&
+ git clone --revision=refs/heads/main --bare . dst &&
+ oid=$(git rev-parse refs/heads/main) &&
+ git -C dst cat-file -t $oid >actual &&
+ echo "commit" >expect &&
+ test_cmp expect actual &&
+ git -C dst for-each-ref refs >expect &&
+ test_must_be_empty expect &&
+ test_must_fail git -C dst config remote.origin.fetch
+'
+
+test_expect_success 'clone with --revision being a short raw commit hash' '
+ test_when_finished "rm -rf dst" &&
+ oid=$(git rev-parse --short refs/heads/feature) &&
+ test_must_fail git clone --revision=$oid . dst 2>err &&
+ test_grep "fatal: Remote revision $oid not found in upstream origin" err
+'
+
+test_expect_success 'clone with --revision being a tree hash' '
+ test_when_finished "rm -rf dst" &&
+ oid=$(git rev-parse refs/heads/feature^{tree}) &&
+ test_must_fail git clone --revision=$oid . dst 2>err &&
+ test_grep "error: object $oid is a tree, not a commit" err
+'
+
+test_expect_success 'clone with --revision being the parent of a ref fails' '
+ test_when_finished "rm -rf dst" &&
+ test_must_fail git clone --revision=refs/heads/main^ . dst
+'
+
+test_expect_success 'clone with --revision and --branch fails' '
+ test_when_finished "rm -rf dst" &&
+ test_must_fail git clone --revision=refs/heads/main --branch=main . dst
+'
+
+test_expect_success 'clone with --revision and --mirror fails' '
+ test_when_finished "rm -rf dst" &&
+ test_must_fail git clone --revision=refs/heads/main --mirror . dst
+'
+
+test_done
diff --git a/t/t6020-bundle-misc.sh b/t/t6020-bundle-misc.sh
index 4ce62feaa2..b3807e8f35 100755
--- a/t/t6020-bundle-misc.sh
+++ b/t/t6020-bundle-misc.sh
@@ -246,7 +246,11 @@ test_expect_success 'create bundle with --since option' '
EOF
test_cmp expect actual &&
- git bundle create since.bdl \
+ # If a different name hash function is used, then one fewer
+ # delta base is found and this counts a different number
+ # of objects after performing --fix-thin.
+ GIT_TEST_NAME_HASH_VERSION=1 \
+ git bundle create since.bdl \
--since "Thu Apr 7 15:27:00 2005 -0700" \
--all &&
diff --git a/t/t6022-rev-list-missing.sh b/t/t6022-rev-list-missing.sh
index 7553a9cca2..3e2790d4c8 100755
--- a/t/t6022-rev-list-missing.sh
+++ b/t/t6022-rev-list-missing.sh
@@ -145,4 +145,57 @@ do
done
done
+for obj in "HEAD~1" "HEAD^{tree}" "HEAD:foo" "HEAD:foo/bar" "HEAD:baz baz"
+do
+ test_expect_success "--missing=print-info with missing '$obj'" '
+ test_when_finished rm -rf missing-info &&
+
+ git init missing-info &&
+ (
+ cd missing-info &&
+ git commit --allow-empty -m first &&
+
+ mkdir foo &&
+ echo bar >foo/bar &&
+ echo baz >"baz baz" &&
+ echo bat >bat\" &&
+ git add -A &&
+ git commit -m second &&
+
+ oid="$(git rev-parse "$obj")" &&
+ path=".git/objects/$(test_oid_to_path $oid)" &&
+ type_info=" type=$(git cat-file -t $oid)" &&
+
+ case $obj in
+ HEAD:foo)
+ path_info=" path=foo"
+ ;;
+ HEAD:foo/bar)
+ path_info=" path=foo/bar"
+ ;;
+ "HEAD:baz baz")
+ path_info=" path=\"baz baz\""
+ ;;
+ "HEAD:bat\"")
+ path_info=" path=\"bat\\\"\""
+ ;;
+ esac &&
+
+ # Before the object is made missing, we use rev-list to
+ # get the expected oids.
+ git rev-list --objects --no-object-names \
+ HEAD ^"$obj" >expect.raw &&
+ echo "?$oid$path_info$type_info" >>expect.raw &&
+
+ mv "$path" "$path.hidden" &&
+ git rev-list --objects --no-object-names \
+ --missing=print-info HEAD >actual.raw &&
+
+ sort actual.raw >actual &&
+ sort expect.raw >expect &&
+ test_cmp expect actual
+ )
+ '
+done
+
test_done
diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh
index 3f6160d702..76843a6169 100755
--- a/t/t6120-describe.sh
+++ b/t/t6120-describe.sh
@@ -82,11 +82,13 @@ check_describe R-2-gHASH HEAD^^
check_describe A-3-gHASH HEAD^^2
check_describe B HEAD^^2^
check_describe R-1-gHASH HEAD^^^
+check_describe R-1-gHASH R-1-g$(git rev-parse --short HEAD^^)~1
check_describe c-7-gHASH --tags HEAD
check_describe c-6-gHASH --tags HEAD^
check_describe e-1-gHASH --tags HEAD^^
check_describe c-2-gHASH --tags HEAD^^2
+check_describe c-2-gHASH --tags c-2-g$(git rev-parse --short HEAD^^2)^0
check_describe B --tags HEAD^^2^
check_describe e --tags HEAD^^^
check_describe e --tags --exact-match HEAD^^^
@@ -725,4 +727,26 @@ test_expect_success '--exact-match does not show --always fallback' '
test_must_fail git describe --exact-match --always
'
+test_expect_success 'avoid being fooled by describe-like filename' '
+ test_when_finished rm out &&
+
+ git rev-parse --short HEAD >out &&
+ FILENAME=filename-g$(cat out) &&
+ touch $FILENAME &&
+ git add $FILENAME &&
+ git commit -m "Add $FILENAME" &&
+
+ git cat-file -t HEAD:$FILENAME >actual &&
+
+ echo blob >expect &&
+ test_cmp expect actual
+'
+
+test_expect_success 'do not be fooled by invalid describe format ' '
+ test_when_finished rm out &&
+
+ git rev-parse --short HEAD >out &&
+ test_must_fail git cat-file -t "refs/tags/super-invalid/./../...../ ~^:/?*[////\\\\\\&}/busted.lock-42-g"$(cat out)
+'
+
test_done
diff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh
index 88d1cf2cde..94080c65d1 100755
--- a/t/t6423-merge-rename-directories.sh
+++ b/t/t6423-merge-rename-directories.sh
@@ -5071,7 +5071,8 @@ test_expect_success '12i: Directory rename causes rename-to-self' '
test_path_is_file source/bar &&
test_path_is_file source/baz &&
- git ls-files | uniq >tracked &&
+ git ls-files >actual &&
+ uniq <actual >tracked &&
test_line_count = 3 tracked &&
git status --porcelain -uno >actual &&
@@ -5129,7 +5130,8 @@ test_expect_success '12j: Directory rename to root causes rename-to-self' '
test_path_is_file bar &&
test_path_is_file baz &&
- git ls-files | uniq >tracked &&
+ git ls-files >actual &&
+ uniq <actual >tracked &&
test_line_count = 3 tracked &&
git status --porcelain -uno >actual &&
@@ -5187,7 +5189,8 @@ test_expect_success '12k: Directory rename with sibling causes rename-to-self' '
test_path_is_file dirA/bar &&
test_path_is_file dirA/baz &&
- git ls-files | uniq >tracked &&
+ git ls-files >actual &&
+ uniq <actual >tracked &&
test_line_count = 3 tracked &&
git status --porcelain -uno >actual &&
diff --git a/t/t6500-gc.sh b/t/t6500-gc.sh
index 5378455968..bef472cb8d 100755
--- a/t/t6500-gc.sh
+++ b/t/t6500-gc.sh
@@ -338,6 +338,39 @@ test_expect_success 'gc.maxCruftSize sets appropriate repack options' '
test_subcommand $cruft_max_size_opts --max-cruft-size=3145728 <trace2.txt
'
+test_expect_success '--expire-to sets repack --expire-to' '
+ rm -rf expired &&
+ mkdir expired &&
+ expire_to="$(pwd)/expired/pack" &&
+ GIT_TRACE2_EVENT=$(pwd)/trace2.txt git -C cruft--max-size gc --cruft --expire-to="$expire_to" &&
+ test_subcommand $cruft_max_size_opts --expire-to="$expire_to" <trace2.txt
+'
+
+test_expect_success '--expire-to with --prune=now sets repack --expire-to' '
+ rm -rf expired &&
+ mkdir expired &&
+ expire_to="$(pwd)/expired/pack" &&
+ GIT_TRACE2_EVENT=$(pwd)/trace2.txt git -C cruft--max-size gc --cruft --prune=now --expire-to="$expire_to" &&
+ test_subcommand git repack -d -l --cruft --cruft-expiration=now --expire-to="$expire_to" <trace2.txt
+'
+
+
+test_expect_success '--expire-to with --no-cruft sets repack -A' '
+ rm -rf expired &&
+ mkdir expired &&
+ expire_to="$(pwd)/expired/pack" &&
+ GIT_TRACE2_EVENT=$(pwd)/trace2.txt git -C cruft--max-size gc --no-cruft --expire-to="$expire_to" &&
+ test_subcommand git repack -d -l -A --unpack-unreachable=2.weeks.ago <trace2.txt
+'
+
+test_expect_success '--expire-to with --no-cruft sets repack -a' '
+ rm -rf expired &&
+ mkdir expired &&
+ expire_to="$(pwd)/expired/pack" &&
+ GIT_TRACE2_EVENT=$(pwd)/trace2.txt git -C cruft--max-size gc --no-cruft --prune=now --expire-to="$expire_to" &&
+ test_subcommand git repack -d -l -a <trace2.txt
+'
+
run_and_wait_for_gc () {
# We read stdout from gc for the side effect of waiting until the
# background gc process exits, closing its fd 9. Furthermore, the
diff --git a/t/t6600-test-reach.sh b/t/t6600-test-reach.sh
index 2591f8b8b3..6638d1aa1d 100755
--- a/t/t6600-test-reach.sh
+++ b/t/t6600-test-reach.sh
@@ -733,4 +733,33 @@ test_expect_success 'for-each-ref is-base:multiple' '
--format="%(refname)[%(is-base:commit-2-3)-%(is-base:commit-6-5)]" --stdin
'
+test_expect_success 'for-each-ref is-base: --sort' '
+ cat >input <<-\EOF &&
+ refs/heads/commit-1-1
+ refs/heads/commit-4-2
+ refs/heads/commit-4-4
+ refs/heads/commit-8-4
+ EOF
+
+ cat >expect <<-\EOF &&
+ refs/heads/commit-1-1
+ refs/heads/commit-4-4
+ refs/heads/commit-8-4
+ refs/heads/commit-4-2
+ EOF
+ run_all_modes git for-each-ref \
+ --format="%(refname)" --stdin \
+ --sort=refname --sort=is-base:commit-2-3 &&
+
+ cat >expect <<-\EOF &&
+ refs/heads/commit-4-2
+ refs/heads/commit-1-1
+ refs/heads/commit-4-4
+ refs/heads/commit-8-4
+ EOF
+ run_all_modes git for-each-ref \
+ --format="%(refname)" --stdin \
+ --sort=refname --sort=-is-base:commit-2-3
+'
+
test_done
diff --git a/t/t6601-path-walk.sh b/t/t6601-path-walk.sh
new file mode 100755
index 0000000000..c89b0f1e19
--- /dev/null
+++ b/t/t6601-path-walk.sh
@@ -0,0 +1,400 @@
+#!/bin/sh
+
+TEST_PASSES_SANITIZE_LEAK=true
+
+test_description='direct path-walk API tests'
+
+. ./test-lib.sh
+
+test_expect_success 'setup test repository' '
+ git checkout -b base &&
+
+ # Make some objects that will only be reachable
+ # via non-commit tags.
+ mkdir child &&
+ echo file >child/file &&
+ git add child &&
+ git commit -m "will abandon" &&
+ git tag -a -m "tree" tree-tag HEAD^{tree} &&
+ echo file2 >file2 &&
+ git add file2 &&
+ git commit --amend -m "will abandon" &&
+ git tag tree-tag2 HEAD^{tree} &&
+
+ echo blob >file &&
+ blob_oid=$(git hash-object -t blob -w --stdin <file) &&
+ git tag -a -m "blob" blob-tag "$blob_oid" &&
+ echo blob2 >file2 &&
+ blob2_oid=$(git hash-object -t blob -w --stdin <file2) &&
+ git tag blob-tag2 "$blob2_oid" &&
+
+ rm -fr child file file2 &&
+
+ mkdir left &&
+ mkdir right &&
+ echo a >a &&
+ echo b >left/b &&
+ echo c >right/c &&
+ git add . &&
+ git commit --amend -m "first" &&
+ git tag -m "first" first HEAD &&
+
+ echo d >right/d &&
+ git add right &&
+ git commit -m "second" &&
+ git tag -a -m "second (under)" second.1 HEAD &&
+ git tag -a -m "second (top)" second.2 second.1 &&
+
+ # Set up file/dir collision in history.
+ rm a &&
+ mkdir a &&
+ echo a >a/a &&
+ echo bb >left/b &&
+ git add a left &&
+ git commit -m "third" &&
+ git tag -a -m "third" third &&
+
+ git checkout -b topic HEAD~1 &&
+ echo cc >right/c &&
+ git commit -a -m "topic" &&
+ git tag -a -m "fourth" fourth
+'
+
+test_expect_success 'all' '
+ test-tool path-walk -- --all >out &&
+
+ cat >expect <<-EOF &&
+ 0:commit::$(git rev-parse topic)
+ 0:commit::$(git rev-parse base)
+ 0:commit::$(git rev-parse base~1)
+ 0:commit::$(git rev-parse base~2)
+ 1:tag:/tags:$(git rev-parse refs/tags/first)
+ 1:tag:/tags:$(git rev-parse refs/tags/second.1)
+ 1:tag:/tags:$(git rev-parse refs/tags/second.2)
+ 1:tag:/tags:$(git rev-parse refs/tags/third)
+ 1:tag:/tags:$(git rev-parse refs/tags/fourth)
+ 1:tag:/tags:$(git rev-parse refs/tags/tree-tag)
+ 1:tag:/tags:$(git rev-parse refs/tags/blob-tag)
+ 2:blob:/tagged-blobs:$(git rev-parse refs/tags/blob-tag^{})
+ 2:blob:/tagged-blobs:$(git rev-parse refs/tags/blob-tag2^{})
+ 3:tree::$(git rev-parse topic^{tree})
+ 3:tree::$(git rev-parse base^{tree})
+ 3:tree::$(git rev-parse base~1^{tree})
+ 3:tree::$(git rev-parse base~2^{tree})
+ 3:tree::$(git rev-parse refs/tags/tree-tag^{})
+ 3:tree::$(git rev-parse refs/tags/tree-tag2^{})
+ 4:blob:a:$(git rev-parse base~2:a)
+ 5:blob:file2:$(git rev-parse refs/tags/tree-tag2^{}:file2)
+ 6:tree:a/:$(git rev-parse base:a)
+ 7:tree:child/:$(git rev-parse refs/tags/tree-tag:child)
+ 8:blob:child/file:$(git rev-parse refs/tags/tree-tag:child/file)
+ 9:tree:left/:$(git rev-parse base:left)
+ 9:tree:left/:$(git rev-parse base~2:left)
+ 10:blob:left/b:$(git rev-parse base~2:left/b)
+ 10:blob:left/b:$(git rev-parse base:left/b)
+ 11:tree:right/:$(git rev-parse topic:right)
+ 11:tree:right/:$(git rev-parse base~1:right)
+ 11:tree:right/:$(git rev-parse base~2:right)
+ 12:blob:right/c:$(git rev-parse base~2:right/c)
+ 12:blob:right/c:$(git rev-parse topic:right/c)
+ 13:blob:right/d:$(git rev-parse base~1:right/d)
+ blobs:10
+ commits:4
+ tags:7
+ trees:13
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'indexed objects' '
+ test_when_finished git reset --hard &&
+
+ # stage change into index, adding a blob but
+ # also invalidating the cache-tree for the root
+ # and the "left" directory.
+ echo bogus >left/c &&
+ git add left &&
+
+ test-tool path-walk -- --indexed-objects >out &&
+
+ cat >expect <<-EOF &&
+ 0:blob:a:$(git rev-parse HEAD:a)
+ 1:blob:left/b:$(git rev-parse HEAD:left/b)
+ 2:blob:left/c:$(git rev-parse :left/c)
+ 3:blob:right/c:$(git rev-parse HEAD:right/c)
+ 4:blob:right/d:$(git rev-parse HEAD:right/d)
+ 5:tree:right/:$(git rev-parse topic:right)
+ blobs:5
+ commits:0
+ tags:0
+ trees:1
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'branches and indexed objects mix well' '
+ test_when_finished git reset --hard &&
+
+ # stage change into index, adding a blob but
+ # also invalidating the cache-tree for the root
+ # and the "right" directory.
+ echo fake >right/d &&
+ git add right &&
+
+ test-tool path-walk -- --indexed-objects --branches >out &&
+
+ cat >expect <<-EOF &&
+ 0:commit::$(git rev-parse topic)
+ 0:commit::$(git rev-parse base)
+ 0:commit::$(git rev-parse base~1)
+ 0:commit::$(git rev-parse base~2)
+ 1:tree::$(git rev-parse topic^{tree})
+ 1:tree::$(git rev-parse base^{tree})
+ 1:tree::$(git rev-parse base~1^{tree})
+ 1:tree::$(git rev-parse base~2^{tree})
+ 2:tree:a/:$(git rev-parse refs/tags/third:a)
+ 3:tree:left/:$(git rev-parse base:left)
+ 3:tree:left/:$(git rev-parse base~2:left)
+ 4:blob:left/b:$(git rev-parse base:left/b)
+ 4:blob:left/b:$(git rev-parse base~2:left/b)
+ 5:tree:right/:$(git rev-parse topic:right)
+ 5:tree:right/:$(git rev-parse base~1:right)
+ 5:tree:right/:$(git rev-parse base~2:right)
+ 6:blob:right/c:$(git rev-parse base~2:right/c)
+ 6:blob:right/c:$(git rev-parse topic:right/c)
+ 7:blob:right/d:$(git rev-parse base~1:right/d)
+ 7:blob:right/d:$(git rev-parse :right/d)
+ 8:blob:a:$(git rev-parse base~2:a)
+ blobs:7
+ commits:4
+ tags:0
+ trees:10
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'base & topic, sparse' '
+ cat >patterns <<-EOF &&
+ /*
+ !/*/
+ /left/
+ EOF
+
+ test-tool path-walk --stdin-pl -- base topic <patterns >out &&
+
+ cat >expect <<-EOF &&
+ 0:commit::$(git rev-parse topic)
+ 0:commit::$(git rev-parse base)
+ 0:commit::$(git rev-parse base~1)
+ 0:commit::$(git rev-parse base~2)
+ 1:tree::$(git rev-parse topic^{tree})
+ 1:tree::$(git rev-parse base^{tree})
+ 1:tree::$(git rev-parse base~1^{tree})
+ 1:tree::$(git rev-parse base~2^{tree})
+ 2:blob:a:$(git rev-parse base~2:a)
+ 3:tree:left/:$(git rev-parse base:left)
+ 3:tree:left/:$(git rev-parse base~2:left)
+ 4:blob:left/b:$(git rev-parse base~2:left/b)
+ 4:blob:left/b:$(git rev-parse base:left/b)
+ blobs:3
+ commits:4
+ tags:0
+ trees:6
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'topic only' '
+ test-tool path-walk -- topic >out &&
+
+ cat >expect <<-EOF &&
+ 0:commit::$(git rev-parse topic)
+ 0:commit::$(git rev-parse base~1)
+ 0:commit::$(git rev-parse base~2)
+ 1:tree::$(git rev-parse topic^{tree})
+ 1:tree::$(git rev-parse base~1^{tree})
+ 1:tree::$(git rev-parse base~2^{tree})
+ 2:blob:a:$(git rev-parse base~2:a)
+ 3:tree:left/:$(git rev-parse base~2:left)
+ 4:blob:left/b:$(git rev-parse base~2:left/b)
+ 5:tree:right/:$(git rev-parse topic:right)
+ 5:tree:right/:$(git rev-parse base~1:right)
+ 5:tree:right/:$(git rev-parse base~2:right)
+ 6:blob:right/c:$(git rev-parse base~2:right/c)
+ 6:blob:right/c:$(git rev-parse topic:right/c)
+ 7:blob:right/d:$(git rev-parse base~1:right/d)
+ blobs:5
+ commits:3
+ tags:0
+ trees:7
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'topic, not base' '
+ test-tool path-walk -- topic --not base >out &&
+
+ cat >expect <<-EOF &&
+ 0:commit::$(git rev-parse topic)
+ 1:tree::$(git rev-parse topic^{tree})
+ 2:blob:a:$(git rev-parse topic:a):UNINTERESTING
+ 3:tree:left/:$(git rev-parse topic:left):UNINTERESTING
+ 4:blob:left/b:$(git rev-parse topic:left/b):UNINTERESTING
+ 5:tree:right/:$(git rev-parse topic:right)
+ 6:blob:right/c:$(git rev-parse topic:right/c)
+ 7:blob:right/d:$(git rev-parse topic:right/d):UNINTERESTING
+ blobs:4
+ commits:1
+ tags:0
+ trees:3
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'fourth, blob-tag2, not base' '
+ test-tool path-walk -- fourth blob-tag2 --not base >out &&
+
+ cat >expect <<-EOF &&
+ 0:commit::$(git rev-parse topic)
+ 1:tag:/tags:$(git rev-parse fourth)
+ 2:blob:/tagged-blobs:$(git rev-parse refs/tags/blob-tag2^{})
+ 3:tree::$(git rev-parse topic^{tree})
+ 4:blob:a:$(git rev-parse base~1:a):UNINTERESTING
+ 5:tree:left/:$(git rev-parse base~1:left):UNINTERESTING
+ 6:blob:left/b:$(git rev-parse base~1:left/b):UNINTERESTING
+ 7:tree:right/:$(git rev-parse topic:right)
+ 8:blob:right/c:$(git rev-parse topic:right/c)
+ 9:blob:right/d:$(git rev-parse base~1:right/d):UNINTERESTING
+ blobs:5
+ commits:1
+ tags:1
+ trees:3
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'topic, not base, only blobs' '
+ test-tool path-walk --no-trees --no-commits \
+ -- topic --not base >out &&
+
+ cat >expect <<-EOF &&
+ 0:blob:a:$(git rev-parse topic:a):UNINTERESTING
+ 1:blob:left/b:$(git rev-parse topic:left/b):UNINTERESTING
+ 2:blob:right/c:$(git rev-parse topic:right/c)
+ 3:blob:right/d:$(git rev-parse topic:right/d):UNINTERESTING
+ blobs:4
+ commits:0
+ tags:0
+ trees:0
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+# No, this doesn't make a lot of sense for the path-walk API,
+# but it is possible to do.
+test_expect_success 'topic, not base, only commits' '
+ test-tool path-walk --no-blobs --no-trees \
+ -- topic --not base >out &&
+
+ cat >expect <<-EOF &&
+ 0:commit::$(git rev-parse topic)
+ commits:1
+ blobs:0
+ tags:0
+ trees:0
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'topic, not base, only trees' '
+ test-tool path-walk --no-blobs --no-commits \
+ -- topic --not base >out &&
+
+ cat >expect <<-EOF &&
+ 0:tree::$(git rev-parse topic^{tree})
+ 1:tree:left/:$(git rev-parse topic:left):UNINTERESTING
+ 2:tree:right/:$(git rev-parse topic:right)
+ commits:0
+ blobs:0
+ tags:0
+ trees:3
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'topic, not base, boundary' '
+ test-tool path-walk -- --boundary topic --not base >out &&
+
+ cat >expect <<-EOF &&
+ 0:commit::$(git rev-parse topic)
+ 0:commit::$(git rev-parse base~1):UNINTERESTING
+ 1:tree::$(git rev-parse topic^{tree})
+ 1:tree::$(git rev-parse base~1^{tree}):UNINTERESTING
+ 2:blob:a:$(git rev-parse base~1:a):UNINTERESTING
+ 3:tree:left/:$(git rev-parse base~1:left):UNINTERESTING
+ 4:blob:left/b:$(git rev-parse base~1:left/b):UNINTERESTING
+ 5:tree:right/:$(git rev-parse topic:right)
+ 5:tree:right/:$(git rev-parse base~1:right):UNINTERESTING
+ 6:blob:right/c:$(git rev-parse base~1:right/c):UNINTERESTING
+ 6:blob:right/c:$(git rev-parse topic:right/c)
+ 7:blob:right/d:$(git rev-parse base~1:right/d):UNINTERESTING
+ blobs:5
+ commits:2
+ tags:0
+ trees:5
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'topic, not base, boundary with pruning' '
+ test-tool path-walk --prune -- --boundary topic --not base >out &&
+
+ cat >expect <<-EOF &&
+ 0:commit::$(git rev-parse topic)
+ 0:commit::$(git rev-parse base~1):UNINTERESTING
+ 1:tree::$(git rev-parse topic^{tree})
+ 1:tree::$(git rev-parse base~1^{tree}):UNINTERESTING
+ 2:tree:right/:$(git rev-parse topic:right)
+ 2:tree:right/:$(git rev-parse base~1:right):UNINTERESTING
+ 3:blob:right/c:$(git rev-parse base~1:right/c):UNINTERESTING
+ 3:blob:right/c:$(git rev-parse topic:right/c)
+ blobs:2
+ commits:2
+ tags:0
+ trees:4
+ EOF
+
+ test_cmp_sorted expect out
+'
+
+test_expect_success 'trees are reported exactly once' '
+ test_when_finished "rm -rf unique-trees" &&
+ test_create_repo unique-trees &&
+ (
+ cd unique-trees &&
+ mkdir initial &&
+ test_commit initial/file &&
+ git switch -c move-to-top &&
+ git mv initial/file.t ./ &&
+ test_tick &&
+ git commit -m moved &&
+ git update-ref refs/heads/other HEAD
+ ) &&
+ test-tool -C unique-trees path-walk -- --all >out &&
+ tree=$(git -C unique-trees rev-parse HEAD:) &&
+ grep "$tree" out >out-filtered &&
+ test_line_count = 1 out-filtered
+'
+
+test_done
diff --git a/t/t7110-reset-merge.sh b/t/t7110-reset-merge.sh
index 61669a2d21..9a335071af 100755
--- a/t/t7110-reset-merge.sh
+++ b/t/t7110-reset-merge.sh
@@ -270,13 +270,13 @@ test_expect_success '--merge is ok with added/deleted merge' '
git reset --hard third &&
rm -f file2 &&
test_must_fail git merge branch3 &&
- ! test -f file2 &&
- test -f file3 &&
+ test_path_is_missing file2 &&
+ test_path_is_file file3 &&
git diff --exit-code file3 &&
git diff --exit-code branch3 file3 &&
git reset --merge HEAD &&
- ! test -f file3 &&
- ! test -f file2 &&
+ test_path_is_missing file3 &&
+ test_path_is_missing file2 &&
git diff --exit-code --cached
'
@@ -284,8 +284,8 @@ test_expect_success '--keep fails with added/deleted merge' '
git reset --hard third &&
rm -f file2 &&
test_must_fail git merge branch3 &&
- ! test -f file2 &&
- test -f file3 &&
+ test_path_is_missing file2 &&
+ test_path_is_file file3 &&
git diff --exit-code file3 &&
git diff --exit-code branch3 file3 &&
test_must_fail git reset --keep HEAD 2>err.log &&
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index 297c6c3b5c..c562bad042 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -1093,7 +1093,9 @@ test_expect_success 'submodule update --quiet passes quietness to fetch with a s
) &&
git clone super4 super5 &&
(cd super5 &&
- git submodule update --quiet --init --depth=1 submodule3 >out 2>err &&
+ # This test var can mess with the stderr output checked in this test.
+ GIT_TEST_NAME_HASH_VERSION=1 \
+ git submodule update --quiet --init --depth=1 submodule3 >out 2>err &&
test_must_be_empty out &&
test_must_be_empty err
) &&
diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh
index 8d7b234beb..77b6d0040e 100755
--- a/t/t7407-submodule-foreach.sh
+++ b/t/t7407-submodule-foreach.sh
@@ -426,14 +426,14 @@ test_expect_success 'option-like arguments passed to foreach commands are not lo
git submodule foreach "echo be --quiet" > ../expected &&
git submodule foreach echo be --quiet > ../actual
) &&
- grep -sq -e "--quiet" expected &&
+ test_grep -e "--quiet" expected &&
test_cmp expected actual
'
test_expect_success 'option-like arguments passed to foreach recurse correctly' '
git -C clone2 submodule foreach --recursive "echo be --an-option" >expect &&
git -C clone2 submodule foreach --recursive echo be --an-option >actual &&
- grep -e "--an-option" expect &&
+ test_grep -e "--an-option" expect &&
test_cmp expect actual
'
diff --git a/t/t7422-submodule-output.sh b/t/t7422-submodule-output.sh
index f21e920367..023a5cbdc4 100755
--- a/t/t7422-submodule-output.sh
+++ b/t/t7422-submodule-output.sh
@@ -167,10 +167,45 @@ do
done
test_expect_success !MINGW 'git submodule status --recursive propagates SIGPIPE' '
- { git submodule status --recursive 2>err; echo $?>status; } |
- grep -q X/S &&
- test_must_be_empty err &&
- test_match_signal 13 "$(cat status)"
+ # The test setup is somewhat involved because triggering a SIGPIPE is
+ # racy with buffered pipes. To avoid the raciness we thus need to make
+ # sure that the subprocess in question fills the buffers completely,
+ # which requires a couple thousand submodules in total.
+ test_when_finished "rm -rf submodule repo" &&
+ git init submodule &&
+ (
+ cd submodule &&
+ test_commit initial &&
+
+ COMMIT=$(git rev-parse HEAD) &&
+ for i in $(test_seq 2000)
+ do
+ printf "[submodule \"sm-$i\"]\npath = recursive-submodule-path-$i\n" "$i" ||
+ return 1
+ done >gitmodules &&
+ BLOB=$(git hash-object -w --stdin <gitmodules) &&
+
+ printf "100644 blob $BLOB\t.gitmodules\n" >tree &&
+ for i in $(test_seq 2000)
+ do
+ printf "160000 commit $COMMIT\trecursive-submodule-path-%d\n" "$i" ||
+ return 1
+ done >>tree &&
+ TREE=$(git mktree <tree) &&
+
+ COMMIT=$(git commit-tree "$TREE") &&
+ git reset --hard "$COMMIT"
+ ) &&
+
+ git init repo &&
+ (
+ cd repo &&
+ GIT_ALLOW_PROTOCOL=file git submodule add "$(pwd)"/../submodule &&
+ { git submodule status --recursive 2>err; echo $?>status; } |
+ grep -q recursive-submodule-path-1 &&
+ test_must_be_empty err &&
+ test_match_signal 13 "$(cat status)"
+ )
'
test_done
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index ef54cff4fa..2a8df29219 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -173,7 +173,7 @@ test_expect_success 'merge -h with invalid index' '
cd broken &&
git init &&
>.git/index &&
- test_expect_code 129 git merge -h 2>usage
+ test_expect_code 129 git merge -h >usage
) &&
test_grep "[Uu]sage: git merge" broken/usage
'
diff --git a/t/t7603-merge-reduce-heads.sh b/t/t7603-merge-reduce-heads.sh
index 4887ca705b..1f8c3b7ccb 100755
--- a/t/t7603-merge-reduce-heads.sh
+++ b/t/t7603-merge-reduce-heads.sh
@@ -52,12 +52,12 @@ test_expect_success 'merge c1 with c2, c3, c4, c5' '
test "$(git rev-parse c3)" = "$(git rev-parse HEAD^3)" &&
test "$(git rev-parse c5)" = "$(git rev-parse HEAD^4)" &&
git diff --exit-code &&
- test -f c0.c &&
- test -f c1.c &&
- test -f c2.c &&
- test -f c3.c &&
- test -f c4.c &&
- test -f c5.c &&
+ test_path_is_file c0.c &&
+ test_path_is_file c1.c &&
+ test_path_is_file c2.c &&
+ test_path_is_file c3.c &&
+ test_path_is_file c4.c &&
+ test_path_is_file c5.c &&
git show --format=%s -s >actual &&
! grep c1 actual &&
grep c2 actual &&
@@ -75,12 +75,12 @@ test_expect_success 'pull c2, c3, c4, c5 into c1' '
test "$(git rev-parse c3)" = "$(git rev-parse HEAD^3)" &&
test "$(git rev-parse c5)" = "$(git rev-parse HEAD^4)" &&
git diff --exit-code &&
- test -f c0.c &&
- test -f c1.c &&
- test -f c2.c &&
- test -f c3.c &&
- test -f c4.c &&
- test -f c5.c &&
+ test_path_is_file c0.c &&
+ test_path_is_file c1.c &&
+ test_path_is_file c2.c &&
+ test_path_is_file c3.c &&
+ test_path_is_file c4.c &&
+ test_path_is_file c5.c &&
git show --format=%s -s >actual &&
! grep c1 actual &&
grep c2 actual &&
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index be1188e736..611755cc13 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -308,7 +308,10 @@ test_expect_success 'no bitmaps created if .keep files present' '
keep=${pack%.pack}.keep &&
test_when_finished "rm -f \"\$keep\"" &&
>"$keep" &&
- git -C bare.git repack -ad 2>stderr &&
+
+ # Disable --name-hash-version test due to stderr comparison.
+ GIT_TEST_NAME_HASH_VERSION=1 \
+ git -C bare.git repack -ad 2>stderr &&
test_must_be_empty stderr &&
find bare.git/objects/pack/ -type f -name "*.bitmap" >actual &&
test_must_be_empty actual
@@ -319,7 +322,10 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' '
blob=$(test-tool genrandom big $((1024*1024)) |
git -C bare.git hash-object -w --stdin) &&
git -C bare.git update-ref refs/tags/big $blob &&
- git -C bare.git repack -ad 2>stderr &&
+
+ # Disable --name-hash-version test due to stderr comparison.
+ GIT_TEST_NAME_HASH_VERSION=1 \
+ git -C bare.git repack -ad 2>stderr &&
test_must_be_empty stderr &&
find bare.git/objects/pack -type f -name "*.bitmap" >actual &&
test_must_be_empty actual
@@ -776,6 +782,12 @@ test_expect_success 'repack -ad cleans up old .tmp-* packs' '
test_must_be_empty tmpfiles
'
+test_expect_success '--name-hash-version option passes through to pack-objects' '
+ GIT_TRACE2_EVENT="$(pwd)/hash-trace.txt" \
+ git repack -a --name-hash-version=2 &&
+ test_subcommand_flex git pack-objects --name-hash-version=2 <hash-trace.txt
+'
+
test_expect_success 'setup for update-server-info' '
git init update-server-info &&
test_commit -C update-server-info message
diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh
index 5715f4d69a..5559d4ccb4 100755
--- a/t/t7701-repack-unpack-unreachable.sh
+++ b/t/t7701-repack-unpack-unreachable.sh
@@ -195,4 +195,20 @@ test_expect_success 'repack -k packs unreachable loose objects' '
git cat-file -p $sha1
'
+test_expect_success 'repack -k packs unreachable loose objects without existing packfiles' '
+ test_when_finished "rm -rf repo" &&
+ git init repo &&
+ (
+ cd repo &&
+
+ oid=$(echo would-be-deleted-loose | git hash-object -w --stdin) &&
+ objpath=.git/objects/$(echo $sha1 | sed "s,..,&/,") &&
+ test_path_is_file $objpath &&
+
+ git repack -ad --keep-unreachable &&
+ test_path_is_missing $objpath &&
+ git cat-file -p $oid
+ )
+'
+
test_done
diff --git a/t/t8002-blame.sh b/t/t8002-blame.sh
index 0147de304b..e98993276a 100755
--- a/t/t8002-blame.sh
+++ b/t/t8002-blame.sh
@@ -126,6 +126,32 @@ test_expect_success '--no-abbrev works like --abbrev with full length' '
check_abbrev $hexsz --no-abbrev
'
+test_expect_success 'blame --abbrev gets truncated' '
+ check_abbrev $hexsz --abbrev=9000 HEAD
+'
+
+test_expect_success 'blame --abbrev gets truncated with boundary commit' '
+ check_abbrev $hexsz --abbrev=9000 ^HEAD
+'
+
+test_expect_success 'blame --abbrev -b truncates the blank boundary' '
+ # Note that `--abbrev=` always gets incremented by 1, which is why we
+ # expect 11 leading spaces and not 10.
+ cat >expect <<-EOF &&
+ $(printf "%11s" "") (<author@example.com> 2005-04-07 15:45:13 -0700 1) abbrev
+ EOF
+ git blame -b --abbrev=10 ^HEAD -- abbrev.t >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'blame with excessive --abbrev and -b culls to hash length' '
+ cat >expect <<-EOF &&
+ $(printf "%${hexsz}s" "") (<author@example.com> 2005-04-07 15:45:13 -0700 1) abbrev
+ EOF
+ git blame -b --abbrev=9000 ^HEAD -- abbrev.t >actual &&
+ test_cmp expect actual
+'
+
test_expect_success '--exclude-promisor-objects does not BUG-crash' '
test_must_fail git blame --exclude-promisor-objects one
'
diff --git a/t/t9003-help-autocorrect.sh b/t/t9003-help-autocorrect.sh
index 85a5074b5e..8da318d2b5 100755
--- a/t/t9003-help-autocorrect.sh
+++ b/t/t9003-help-autocorrect.sh
@@ -28,15 +28,18 @@ test_expect_success 'setup' '
test_cmp expect actual
'
-test_expect_success 'autocorrect showing candidates' '
- git config help.autocorrect 0 &&
+for show in false no off 0 show
+do
+ test_expect_success 'autocorrect showing candidates' '
+ git config help.autocorrect $show &&
- test_must_fail git lfg 2>actual &&
- grep "^ lgf" actual &&
+ test_must_fail git lfg 2>actual &&
+ grep "^ lgf" actual &&
- test_must_fail git distimdist 2>actual &&
- grep "^ distimdistim" actual
-'
+ test_must_fail git distimdist 2>actual &&
+ grep "^ distimdistim" actual
+ '
+done
for immediate in -1 immediate
do
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 3465904323..79377bc0fc 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -927,7 +927,7 @@ test_expect_success () {
test -n "$test_skip_test_preamble" ||
say >&3 "expecting success of $TEST_NUMBER.$test_count '$1': $test_body"
if test_run_ "$test_body" &&
- check_test_results_san_file_empty_
+ ! check_test_results_san_file_has_entries_
then
test_ok_ "$1"
else
@@ -1268,6 +1268,16 @@ test_cmp () {
eval "$GIT_TEST_CMP" '"$@"'
}
+# test_cmp_sorted runs test_cmp on sorted versions of the two
+# input files. Uses "$1.sorted" and "$2.sorted" as temp files.
+
+test_cmp_sorted () {
+ sort <"$1" >"$1.sorted" &&
+ sort <"$2" >"$2.sorted" &&
+ test_cmp "$1.sorted" "$2.sorted" &&
+ rm "$1.sorted" "$2.sorted"
+}
+
# Check that the given config key has the expected value.
#
# test_cmp_config [-C <dir>] <expected-value>
@@ -1886,6 +1896,32 @@ test_subcommand () {
fi
}
+# Check that the given subcommand was run with the given set of
+# arguments in order (but with possible extra arguments).
+#
+# test_subcommand_flex [!] <command> <args>... < <trace>
+#
+# If the first parameter passed is !, this instead checks that
+# the given command was not called.
+#
+test_subcommand_flex () {
+ local negate=
+ if test "$1" = "!"
+ then
+ negate=t
+ shift
+ fi
+
+ local expr="$(printf '"%s".*' "$@")"
+
+ if test -n "$negate"
+ then
+ ! grep "\[$expr\]"
+ else
+ grep "\[$expr\]"
+ fi
+}
+
# Check that the given command was invoked as part of the
# trace2-format trace on stdin.
#
diff --git a/t/test-lib.sh b/t/test-lib.sh
index d1f62adbf8..9001ed3a64 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -1169,20 +1169,20 @@ test_atexit_handler () {
teardown_malloc_check
}
-check_test_results_san_file_empty_ () {
- test -z "$TEST_RESULTS_SAN_FILE" && return 0
-
- # stderr piped to /dev/null because the directory may have
- # been "rmdir"'d already.
- ! find "$TEST_RESULTS_SAN_DIR" \
- -type f \
- -name "$TEST_RESULTS_SAN_FILE_PFX.*" 2>/dev/null |
- xargs grep ^DEDUP_TOKEN |
+check_test_results_san_file_has_entries_ () {
+ test -z "$TEST_RESULTS_SAN_FILE" && return 1
+
+ # Lines marked with DEDUP_TOKEN show unique leaks. We only care that we
+ # found at least one.
+ #
+ # But also suppress any false positives caused by bugs or races in the
+ # sanitizer itself.
+ grep -s ^DEDUP_TOKEN "$TEST_RESULTS_SAN_FILE".* |
grep -qv sanitizer::GetThreadStackTopAndBottom
}
check_test_results_san_file_ () {
- if check_test_results_san_file_empty_
+ if ! check_test_results_san_file_has_entries_
then
return
fi &&
@@ -1862,6 +1862,10 @@ test_lazy_prereq CURL '
curl --version
'
+test_lazy_prereq WITHOUT_BREAKING_CHANGES '
+ test -z "$WITH_BREAKING_CHANGES"
+'
+
# SHA1 is a test if the hash algorithm in use is SHA-1. This is both for tests
# which will not work with other hash algorithms and tests that work but don't
# test anything meaningful (e.g. special values which cause short collisions).
diff --git a/t/unit-tests/generate-clar-decls.sh b/t/unit-tests/generate-clar-decls.sh
index 3b315c64b3..abf6a2ea2a 100755
--- a/t/unit-tests/generate-clar-decls.sh
+++ b/t/unit-tests/generate-clar-decls.sh
@@ -14,6 +14,7 @@ do
suite_name=$(basename "$suite")
suite_name=${suite_name%.c}
suite_name=${suite_name#u-}
+ suite_name=$(echo "$suite_name" | tr '-' '_')
sed -ne "s/^\(void test_${suite_name}__[a-zA-Z_0-9][a-zA-Z_0-9]*(void)\)$/extern \1;/p" "$suite" ||
exit 1
done >"$OUTPUT"
diff --git a/t/unit-tests/t-example-decorate.c b/t/unit-tests/t-example-decorate.c
deleted file mode 100644
index bfc776e223..0000000000
--- a/t/unit-tests/t-example-decorate.c
+++ /dev/null
@@ -1,74 +0,0 @@
-#define USE_THE_REPOSITORY_VARIABLE
-
-#include "test-lib.h"
-#include "object.h"
-#include "decorate.h"
-#include "repository.h"
-
-struct test_vars {
- struct object *one, *two, *three;
- struct decoration n;
- int decoration_a, decoration_b;
-};
-
-static void t_add(struct test_vars *vars)
-{
- void *ret = add_decoration(&vars->n, vars->one, &vars->decoration_a);
-
- check(ret == NULL);
- ret = add_decoration(&vars->n, vars->two, NULL);
- check(ret == NULL);
-}
-
-static void t_readd(struct test_vars *vars)
-{
- void *ret = add_decoration(&vars->n, vars->one, NULL);
-
- check(ret == &vars->decoration_a);
- ret = add_decoration(&vars->n, vars->two, &vars->decoration_b);
- check(ret == NULL);
-}
-
-static void t_lookup(struct test_vars *vars)
-{
- void *ret = lookup_decoration(&vars->n, vars->one);
-
- check(ret == NULL);
- ret = lookup_decoration(&vars->n, vars->two);
- check(ret == &vars->decoration_b);
- ret = lookup_decoration(&vars->n, vars->three);
- check(ret == NULL);
-}
-
-static void t_loop(struct test_vars *vars)
-{
- int objects_noticed = 0;
-
- for (size_t i = 0; i < vars->n.size; i++) {
- if (vars->n.entries[i].base)
- objects_noticed++;
- }
- check_int(objects_noticed, ==, 2);
-}
-
-int cmd_main(int argc UNUSED, const char **argv UNUSED)
-{
- struct object_id one_oid = { { 1 } }, two_oid = { { 2 } }, three_oid = { { 3 } };
- struct test_vars vars = { 0 };
-
- vars.one = lookup_unknown_object(the_repository, &one_oid);
- vars.two = lookup_unknown_object(the_repository, &two_oid);
- vars.three = lookup_unknown_object(the_repository, &three_oid);
-
- TEST(t_add(&vars),
- "Add 2 objects, one with a non-NULL decoration and one with a NULL decoration.");
- TEST(t_readd(&vars),
- "When re-adding an already existing object, the old decoration is returned.");
- TEST(t_lookup(&vars),
- "Lookup returns the added declarations, or NULL if the object was never added.");
- TEST(t_loop(&vars), "The user can also loop through all entries.");
-
- clear_decoration(&vars.n, NULL);
-
- return test_done();
-}
diff --git a/t/unit-tests/t-mem-pool.c b/t/unit-tests/t-mem-pool.c
deleted file mode 100644
index fe500c704b..0000000000
--- a/t/unit-tests/t-mem-pool.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "test-lib.h"
-#include "mem-pool.h"
-
-static void setup_static(void (*f)(struct mem_pool *), size_t block_alloc)
-{
- struct mem_pool pool = { .block_alloc = block_alloc };
- f(&pool);
- mem_pool_discard(&pool, 0);
-}
-
-static void t_calloc_100(struct mem_pool *pool)
-{
- size_t size = 100;
- char *buffer = mem_pool_calloc(pool, 1, size);
- for (size_t i = 0; i < size; i++)
- check_int(buffer[i], ==, 0);
- if (!check(pool->mp_block != NULL))
- return;
- check(pool->mp_block->next_free != NULL);
- check(pool->mp_block->end != NULL);
-}
-
-int cmd_main(int argc UNUSED, const char **argv UNUSED)
-{
- TEST(setup_static(t_calloc_100, 1024 * 1024),
- "mem_pool_calloc returns 100 zeroed bytes with big block");
- TEST(setup_static(t_calloc_100, 1),
- "mem_pool_calloc returns 100 zeroed bytes with tiny block");
-
- return test_done();
-}
diff --git a/t/unit-tests/t-prio-queue.c b/t/unit-tests/t-prio-queue.c
deleted file mode 100644
index a053635000..0000000000
--- a/t/unit-tests/t-prio-queue.c
+++ /dev/null
@@ -1,91 +0,0 @@
-#include "test-lib.h"
-#include "prio-queue.h"
-
-static int intcmp(const void *va, const void *vb, void *data UNUSED)
-{
- const int *a = va, *b = vb;
- return *a - *b;
-}
-
-
-#define MISSING -1
-#define DUMP -2
-#define STACK -3
-#define GET -4
-#define REVERSE -5
-
-static int show(int *v)
-{
- return v ? *v : MISSING;
-}
-
-static void test_prio_queue(int *input, size_t input_size,
- int *result, size_t result_size)
-{
- struct prio_queue pq = { intcmp };
- int j = 0;
-
- for (size_t i = 0; i < input_size; i++) {
- void *peek, *get;
- switch(input[i]) {
- case GET:
- peek = prio_queue_peek(&pq);
- get = prio_queue_get(&pq);
- if (!check(peek == get))
- return;
- if (!check_uint(j, <, result_size))
- break;
- if (!check_int(result[j], ==, show(get)))
- test_msg(" j: %d", j);
- j++;
- break;
- case DUMP:
- while ((peek = prio_queue_peek(&pq))) {
- get = prio_queue_get(&pq);
- if (!check(peek == get))
- return;
- if (!check_uint(j, <, result_size))
- break;
- if (!check_int(result[j], ==, show(get)))
- test_msg(" j: %d", j);
- j++;
- }
- break;
- case STACK:
- pq.compare = NULL;
- break;
- case REVERSE:
- prio_queue_reverse(&pq);
- break;
- default:
- prio_queue_put(&pq, &input[i]);
- break;
- }
- }
- check_uint(j, ==, result_size);
- clear_prio_queue(&pq);
-}
-
-#define TEST_INPUT(input, result) \
- test_prio_queue(input, ARRAY_SIZE(input), result, ARRAY_SIZE(result))
-
-int cmd_main(int argc UNUSED, const char **argv UNUSED)
-{
- TEST(TEST_INPUT(((int []){ 2, 6, 3, 10, 9, 5, 7, 4, 5, 8, 1, DUMP }),
- ((int []){ 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10 })),
- "prio-queue works for basic input");
- TEST(TEST_INPUT(((int []){ 6, 2, 4, GET, 5, 3, GET, GET, 1, DUMP }),
- ((int []){ 2, 3, 4, 1, 5, 6 })),
- "prio-queue works for mixed put & get commands");
- TEST(TEST_INPUT(((int []){ 1, 2, GET, GET, GET, 1, 2, GET, GET, GET }),
- ((int []){ 1, 2, MISSING, 1, 2, MISSING })),
- "prio-queue works when queue is empty");
- TEST(TEST_INPUT(((int []){ STACK, 8, 1, 5, 4, 6, 2, 3, DUMP }),
- ((int []){ 3, 2, 6, 4, 5, 1, 8 })),
- "prio-queue works when used as a LIFO stack");
- TEST(TEST_INPUT(((int []){ STACK, 1, 2, 3, 4, 5, 6, REVERSE, DUMP }),
- ((int []){ 1, 2, 3, 4, 5, 6 })),
- "prio-queue works when LIFO stack is reversed");
-
- return test_done();
-}
diff --git a/t/unit-tests/t-reftable-basics.c b/t/unit-tests/t-reftable-basics.c
index 990dc1a244..9ba7eb05ad 100644
--- a/t/unit-tests/t-reftable-basics.c
+++ b/t/unit-tests/t-reftable-basics.c
@@ -120,7 +120,7 @@ int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
for (size_t i = 0; i < ARRAY_SIZE(cases); i++) {
check(!reftable_buf_addstr(&a, cases[i].a));
check(!reftable_buf_addstr(&b, cases[i].b));
- check_int(common_prefix_size(&a, &b), ==, cases[i].want);
+ check_uint(common_prefix_size(&a, &b), ==, cases[i].want);
reftable_buf_reset(&a);
reftable_buf_reset(&b);
}
@@ -157,13 +157,13 @@ int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
old_alloc = alloc;
old_arr = arr;
- reftable_set_alloc(malloc, realloc_stub, free);
+ reftable_set_alloc(NULL, realloc_stub, NULL);
check(REFTABLE_ALLOC_GROW(arr, old_alloc + 1, alloc));
check(arr == old_arr);
check_uint(alloc, ==, old_alloc);
old_alloc = alloc;
- reftable_set_alloc(malloc, realloc, free);
+ reftable_set_alloc(NULL, NULL, NULL);
check(!REFTABLE_ALLOC_GROW(arr, old_alloc + 1, alloc));
check(arr != NULL);
check_uint(alloc, >, old_alloc);
@@ -188,11 +188,11 @@ int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
arr[alloc - 1] = 42;
old_alloc = alloc;
- reftable_set_alloc(malloc, realloc_stub, free);
+ reftable_set_alloc(NULL, realloc_stub, NULL);
REFTABLE_ALLOC_GROW_OR_NULL(arr, old_alloc + 1, alloc);
check(arr == NULL);
check_uint(alloc, ==, 0);
- reftable_set_alloc(malloc, realloc, free);
+ reftable_set_alloc(NULL, NULL, NULL);
reftable_free(arr);
}
diff --git a/t/unit-tests/t-reftable-readwrite.c b/t/unit-tests/t-reftable-readwrite.c
index 6b75a419b9..c9626831da 100644
--- a/t/unit-tests/t-reftable-readwrite.c
+++ b/t/unit-tests/t-reftable-readwrite.c
@@ -108,8 +108,8 @@ static void t_log_buffer_size(void)
hash, to ensure that the compressed part is larger than the original.
*/
for (i = 0; i < REFTABLE_HASH_SIZE_SHA1; i++) {
- log.value.update.old_hash[i] = (uint8_t)(git_rand() % 256);
- log.value.update.new_hash[i] = (uint8_t)(git_rand() % 256);
+ log.value.update.old_hash[i] = (uint8_t)(git_rand(0) % 256);
+ log.value.update.new_hash[i] = (uint8_t)(git_rand(0) % 256);
}
reftable_writer_set_limits(w, update_index, update_index);
err = reftable_writer_add_log(w, &log);
@@ -325,7 +325,7 @@ static void t_log_zlib_corruption(void)
};
for (i = 0; i < sizeof(message) - 1; i++)
- message[i] = (uint8_t)(git_rand() % 64 + ' ');
+ message[i] = (uint8_t)(git_rand(0) % 64 + ' ');
reftable_writer_set_limits(w, 1, 1);
@@ -643,7 +643,7 @@ static void t_write_empty_table(void)
check_int(err, ==, REFTABLE_EMPTY_TABLE_ERROR);
reftable_writer_free(w);
- check_int(buf.len, ==, header_size(1) + footer_size(1));
+ check_uint(buf.len, ==, header_size(1) + footer_size(1));
block_source_from_buf(&source, &buf);
diff --git a/t/unit-tests/t-reftable-record.c b/t/unit-tests/t-reftable-record.c
index 42bc64cec8..d49d2a2729 100644
--- a/t/unit-tests/t-reftable-record.c
+++ b/t/unit-tests/t-reftable-record.c
@@ -58,9 +58,25 @@ static void t_varint_roundtrip(void)
}
}
+static void t_varint_overflow(void)
+{
+ unsigned char buf[] = {
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x00,
+ };
+ struct string_view view = {
+ .buf = buf,
+ .len = sizeof(buf),
+ };
+ uint64_t value;
+ int err = get_var_int(&value, &view);
+ check_int(err, ==, -1);
+}
+
static void set_hash(uint8_t *h, int j)
{
- for (int i = 0; i < hash_size(REFTABLE_HASH_SHA1); i++)
+ for (size_t i = 0; i < hash_size(REFTABLE_HASH_SHA1); i++)
h[i] = (j >> i) & 0xff;
}
@@ -544,6 +560,7 @@ int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
TEST(t_reftable_log_record_roundtrip(), "record operations work on log record");
TEST(t_reftable_ref_record_roundtrip(), "record operations work on ref record");
TEST(t_varint_roundtrip(), "put_var_int and get_var_int work");
+ TEST(t_varint_overflow(), "get_var_int notices an integer overflow");
TEST(t_key_roundtrip(), "reftable_encode_key and reftable_decode_key work");
TEST(t_reftable_obj_record_roundtrip(), "record operations work on obj record");
TEST(t_reftable_index_record_roundtrip(), "record operations work on index record");
diff --git a/t/unit-tests/t-reftable-stack.c b/t/unit-tests/t-reftable-stack.c
index aeec195b2b..c3f0059c34 100644
--- a/t/unit-tests/t-reftable-stack.c
+++ b/t/unit-tests/t-reftable-stack.c
@@ -103,7 +103,8 @@ static void t_read_file(void)
static int write_test_ref(struct reftable_writer *wr, void *arg)
{
struct reftable_ref_record *ref = arg;
- reftable_writer_set_limits(wr, ref->update_index, ref->update_index);
+ check(!reftable_writer_set_limits(wr, ref->update_index,
+ ref->update_index));
return reftable_writer_add_ref(wr, ref);
}
@@ -143,7 +144,8 @@ static int write_test_log(struct reftable_writer *wr, void *arg)
{
struct write_log_arg *wla = arg;
- reftable_writer_set_limits(wr, wla->update_index, wla->update_index);
+ check(!reftable_writer_set_limits(wr, wla->update_index,
+ wla->update_index));
return reftable_writer_add_log(wr, wla->log);
}
@@ -961,7 +963,7 @@ static void t_reflog_expire(void)
static int write_nothing(struct reftable_writer *wr, void *arg UNUSED)
{
- reftable_writer_set_limits(wr, 1, 1);
+ check(!reftable_writer_set_limits(wr, 1, 1));
return 0;
}
@@ -1369,11 +1371,57 @@ static void t_reftable_stack_reload_with_missing_table(void)
clear_dir(dir);
}
+static int write_limits_after_ref(struct reftable_writer *wr, void *arg)
+{
+ struct reftable_ref_record *ref = arg;
+ check(!reftable_writer_set_limits(wr, ref->update_index, ref->update_index));
+ check(!reftable_writer_add_ref(wr, ref));
+ return reftable_writer_set_limits(wr, ref->update_index, ref->update_index);
+}
+
+static void t_reftable_invalid_limit_updates(void)
+{
+ struct reftable_ref_record ref = {
+ .refname = (char *) "HEAD",
+ .update_index = 1,
+ .value_type = REFTABLE_REF_SYMREF,
+ .value.symref = (char *) "master",
+ };
+ struct reftable_write_options opts = {
+ .default_permissions = 0660,
+ };
+ struct reftable_addition *add = NULL;
+ char *dir = get_tmp_dir(__LINE__);
+ struct reftable_stack *st = NULL;
+ int err;
+
+ err = reftable_new_stack(&st, dir, &opts);
+ check(!err);
+
+ reftable_addition_destroy(add);
+
+ err = reftable_stack_new_addition(&add, st, 0);
+ check(!err);
+
+ /*
+ * write_limits_after_ref also updates the update indexes after adding
+ * the record. This should cause an err to be returned, since the limits
+ * must be set at the start.
+ */
+ err = reftable_addition_add(add, write_limits_after_ref, &ref);
+ check_int(err, ==, REFTABLE_API_ERROR);
+
+ reftable_addition_destroy(add);
+ reftable_stack_destroy(st);
+ clear_dir(dir);
+}
+
int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
{
TEST(t_empty_add(), "empty addition to stack");
TEST(t_read_file(), "read_lines works");
TEST(t_reflog_expire(), "expire reflog entries");
+ TEST(t_reftable_invalid_limit_updates(), "prevent limit updates after adding records");
TEST(t_reftable_stack_add(), "add multiple refs and logs to stack");
TEST(t_reftable_stack_add_one(), "add a single ref record to stack");
TEST(t_reftable_stack_add_performs_auto_compaction(), "addition to stack triggers auto-compaction");
diff --git a/t/unit-tests/t-strbuf.c b/t/unit-tests/t-strbuf.c
deleted file mode 100644
index 3f4044d697..0000000000
--- a/t/unit-tests/t-strbuf.c
+++ /dev/null
@@ -1,122 +0,0 @@
-#include "test-lib.h"
-#include "strbuf.h"
-
-/* wrapper that supplies tests with an empty, initialized strbuf */
-static void setup(void (*f)(struct strbuf*, const void*),
- const void *data)
-{
- struct strbuf buf = STRBUF_INIT;
-
- f(&buf, data);
- strbuf_release(&buf);
- check_uint(buf.len, ==, 0);
- check_uint(buf.alloc, ==, 0);
-}
-
-/* wrapper that supplies tests with a populated, initialized strbuf */
-static void setup_populated(void (*f)(struct strbuf*, const void*),
- const char *init_str, const void *data)
-{
- struct strbuf buf = STRBUF_INIT;
-
- strbuf_addstr(&buf, init_str);
- check_uint(buf.len, ==, strlen(init_str));
- f(&buf, data);
- strbuf_release(&buf);
- check_uint(buf.len, ==, 0);
- check_uint(buf.alloc, ==, 0);
-}
-
-static int assert_sane_strbuf(struct strbuf *buf)
-{
- /* Initialized strbufs should always have a non-NULL buffer */
- if (!check(!!buf->buf))
- return 0;
- /* Buffers should always be NUL-terminated */
- if (!check_char(buf->buf[buf->len], ==, '\0'))
- return 0;
- /*
- * Freshly-initialized strbufs may not have a dynamically allocated
- * buffer
- */
- if (buf->len == 0 && buf->alloc == 0)
- return 1;
- /* alloc must be at least one byte larger than len */
- return check_uint(buf->len, <, buf->alloc);
-}
-
-static void t_static_init(void)
-{
- struct strbuf buf = STRBUF_INIT;
-
- check_uint(buf.len, ==, 0);
- check_uint(buf.alloc, ==, 0);
- check_char(buf.buf[0], ==, '\0');
-}
-
-static void t_dynamic_init(void)
-{
- struct strbuf buf;
-
- strbuf_init(&buf, 1024);
- check(assert_sane_strbuf(&buf));
- check_uint(buf.len, ==, 0);
- check_uint(buf.alloc, >=, 1024);
- check_char(buf.buf[0], ==, '\0');
- strbuf_release(&buf);
-}
-
-static void t_addch(struct strbuf *buf, const void *data)
-{
- const char *p_ch = data;
- const char ch = *p_ch;
- size_t orig_alloc = buf->alloc;
- size_t orig_len = buf->len;
-
- if (!check(assert_sane_strbuf(buf)))
- return;
- strbuf_addch(buf, ch);
- if (!check(assert_sane_strbuf(buf)))
- return;
- if (!(check_uint(buf->len, ==, orig_len + 1) &&
- check_uint(buf->alloc, >=, orig_alloc)))
- return; /* avoid de-referencing buf->buf */
- check_char(buf->buf[buf->len - 1], ==, ch);
- check_char(buf->buf[buf->len], ==, '\0');
-}
-
-static void t_addstr(struct strbuf *buf, const void *data)
-{
- const char *text = data;
- size_t len = strlen(text);
- size_t orig_alloc = buf->alloc;
- size_t orig_len = buf->len;
-
- if (!check(assert_sane_strbuf(buf)))
- return;
- strbuf_addstr(buf, text);
- if (!check(assert_sane_strbuf(buf)))
- return;
- if (!(check_uint(buf->len, ==, orig_len + len) &&
- check_uint(buf->alloc, >=, orig_alloc) &&
- check_uint(buf->alloc, >, orig_len + len) &&
- check_char(buf->buf[orig_len + len], ==, '\0')))
- return;
- check_str(buf->buf + orig_len, text);
-}
-
-int cmd_main(int argc UNUSED, const char **argv UNUSED)
-{
- if (!TEST(t_static_init(), "static initialization works"))
- test_skip_all("STRBUF_INIT is broken");
- TEST(t_dynamic_init(), "dynamic initialization works");
- TEST(setup(t_addch, "a"), "strbuf_addch adds char");
- TEST(setup(t_addch, ""), "strbuf_addch adds NUL char");
- TEST(setup_populated(t_addch, "initial value", "a"),
- "strbuf_addch appends to initial value");
- TEST(setup(t_addstr, "hello there"), "strbuf_addstr adds string");
- TEST(setup_populated(t_addstr, "initial value", "hello there"),
- "strbuf_addstr appends string to initial value");
-
- return test_done();
-}
diff --git a/t/unit-tests/t-strcmp-offset.c b/t/unit-tests/t-strcmp-offset.c
deleted file mode 100644
index 6880f21161..0000000000
--- a/t/unit-tests/t-strcmp-offset.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include "test-lib.h"
-#include "read-cache-ll.h"
-
-static void check_strcmp_offset(const char *string1, const char *string2,
- int expect_result, uintmax_t expect_offset)
-{
- size_t offset;
- int result = strcmp_offset(string1, string2, &offset);
-
- /*
- * Because different CRTs behave differently, only rely on signs of the
- * result values.
- */
- result = (result < 0 ? -1 :
- result > 0 ? 1 :
- 0);
-
- check_int(result, ==, expect_result);
- check_uint((uintmax_t)offset, ==, expect_offset);
-}
-
-#define TEST_STRCMP_OFFSET(string1, string2, expect_result, expect_offset) \
- TEST(check_strcmp_offset(string1, string2, expect_result, \
- expect_offset), \
- "strcmp_offset(%s, %s) works", #string1, #string2)
-
-int cmd_main(int argc UNUSED, const char **argv UNUSED)
-{
- TEST_STRCMP_OFFSET("abc", "abc", 0, 3);
- TEST_STRCMP_OFFSET("abc", "def", -1, 0);
- TEST_STRCMP_OFFSET("abc", "abz", -1, 2);
- TEST_STRCMP_OFFSET("abc", "abcdef", -1, 3);
-
- return test_done();
-}
diff --git a/t/unit-tests/u-example-decorate.c b/t/unit-tests/u-example-decorate.c
new file mode 100644
index 0000000000..9b1d1ce753
--- /dev/null
+++ b/t/unit-tests/u-example-decorate.c
@@ -0,0 +1,64 @@
+#define USE_THE_REPOSITORY_VARIABLE
+
+#include "unit-test.h"
+#include "object.h"
+#include "decorate.h"
+#include "repository.h"
+
+struct test_vars {
+ struct object *one, *two, *three;
+ struct decoration n;
+ int decoration_a, decoration_b;
+};
+
+static struct test_vars vars;
+
+void test_example_decorate__initialize(void)
+{
+ struct object_id one_oid = { { 1 } }, two_oid = { { 2 } }, three_oid = { { 3 } };
+
+ vars.one = lookup_unknown_object(the_repository, &one_oid);
+ vars.two = lookup_unknown_object(the_repository, &two_oid);
+ vars.three = lookup_unknown_object(the_repository, &three_oid);
+}
+
+void test_example_decorate__cleanup(void)
+{
+ clear_decoration(&vars.n, NULL);
+}
+
+void test_example_decorate__add(void)
+{
+ cl_assert_equal_p(add_decoration(&vars.n, vars.one, &vars.decoration_a), NULL);
+ cl_assert_equal_p(add_decoration(&vars.n, vars.two, NULL), NULL);
+}
+
+void test_example_decorate__readd(void)
+{
+ cl_assert_equal_p(add_decoration(&vars.n, vars.one, &vars.decoration_a), NULL);
+ cl_assert_equal_p(add_decoration(&vars.n, vars.two, NULL), NULL);
+ cl_assert_equal_p(add_decoration(&vars.n, vars.one, NULL), &vars.decoration_a);
+ cl_assert_equal_p(add_decoration(&vars.n, vars.two, &vars.decoration_b), NULL);
+}
+
+void test_example_decorate__lookup(void)
+{
+ cl_assert_equal_p(add_decoration(&vars.n, vars.two, &vars.decoration_b), NULL);
+ cl_assert_equal_p(add_decoration(&vars.n, vars.one, NULL), NULL);
+ cl_assert_equal_p(lookup_decoration(&vars.n, vars.two), &vars.decoration_b);
+ cl_assert_equal_p(lookup_decoration(&vars.n, vars.one), NULL);
+}
+
+void test_example_decorate__loop(void)
+{
+ int objects_noticed = 0;
+
+ cl_assert_equal_p(add_decoration(&vars.n, vars.one, &vars.decoration_a), NULL);
+ cl_assert_equal_p(add_decoration(&vars.n, vars.two, &vars.decoration_b), NULL);
+
+ for (size_t i = 0; i < vars.n.size; i++)
+ if (vars.n.entries[i].base)
+ objects_noticed++;
+
+ cl_assert_equal_i(objects_noticed, 2);
+}
diff --git a/t/unit-tests/t-hash.c b/t/unit-tests/u-hash.c
index e62647019b..bd4ac6a6e1 100644
--- a/t/unit-tests/t-hash.c
+++ b/t/unit-tests/u-hash.c
@@ -1,84 +1,109 @@
-#include "test-lib.h"
+#include "unit-test.h"
#include "hex.h"
#include "strbuf.h"
static void check_hash_data(const void *data, size_t data_length,
const char *expected_hashes[])
{
- if (!check(data != NULL)) {
- test_msg("BUG: NULL data pointer provided");
- return;
- }
+ cl_assert(data != NULL);
for (size_t i = 1; i < ARRAY_SIZE(hash_algos); i++) {
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
unsigned char hash[GIT_MAX_HEXSZ];
const struct git_hash_algo *algop = &hash_algos[i];
algop->init_fn(&ctx);
- algop->update_fn(&ctx, data, data_length);
- algop->final_fn(hash, &ctx);
+ git_hash_update(&ctx, data, data_length);
+ git_hash_final(hash, &ctx);
- if (!check_str(hash_to_hex_algop(hash, algop), expected_hashes[i - 1]))
- test_msg("result does not match with the expected for %s\n", hash_algos[i].name);
+ cl_assert_equal_s(hash_to_hex_algop(hash,algop), expected_hashes[i - 1]);
}
}
/* Works with a NUL terminated string. Doesn't work if it should contain a NUL character. */
#define TEST_HASH_STR(data, expected_sha1, expected_sha256) do { \
const char *expected_hashes[] = { expected_sha1, expected_sha256 }; \
- TEST(check_hash_data(data, strlen(data), expected_hashes), \
- "SHA1 and SHA256 (%s) works", #data); \
+ check_hash_data(data, strlen(data), expected_hashes); \
} while (0)
/* Only works with a literal string, useful when it contains a NUL character. */
#define TEST_HASH_LITERAL(literal, expected_sha1, expected_sha256) do { \
const char *expected_hashes[] = { expected_sha1, expected_sha256 }; \
- TEST(check_hash_data(literal, (sizeof(literal) - 1), expected_hashes), \
- "SHA1 and SHA256 (%s) works", #literal); \
+ check_hash_data(literal, (sizeof(literal) - 1), expected_hashes); \
} while (0)
-int cmd_main(int argc UNUSED, const char **argv UNUSED)
+void test_hash__empty_string(void)
{
- struct strbuf aaaaaaaaaa_100000 = STRBUF_INIT;
- struct strbuf alphabet_100000 = STRBUF_INIT;
-
- strbuf_addstrings(&aaaaaaaaaa_100000, "aaaaaaaaaa", 100000);
- strbuf_addstrings(&alphabet_100000, "abcdefghijklmnopqrstuvwxyz", 100000);
-
TEST_HASH_STR("",
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
+}
+
+void test_hash__single_character(void)
+{
TEST_HASH_STR("a",
"86f7e437faa5a7fce15d1ddcb9eaeaea377667b8",
"ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb");
+}
+
+void test_hash__multi_character(void)
+{
TEST_HASH_STR("abc",
"a9993e364706816aba3e25717850c26c9cd0d89d",
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
+}
+
+void test_hash__message_digest(void)
+{
TEST_HASH_STR("message digest",
"c12252ceda8be8994d5fa0290a47231c1d16aae3",
"f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650");
+}
+
+void test_hash__alphabet(void)
+{
TEST_HASH_STR("abcdefghijklmnopqrstuvwxyz",
"32d10c7b8cf96570ca04ce37f2a19d84240d3a89",
"71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73");
+}
+
+void test_hash__aaaaaaaaaa_100000(void)
+{
+ struct strbuf aaaaaaaaaa_100000 = STRBUF_INIT;
+ strbuf_addstrings(&aaaaaaaaaa_100000, "aaaaaaaaaa", 100000);
TEST_HASH_STR(aaaaaaaaaa_100000.buf,
"34aa973cd4c4daa4f61eeb2bdbad27316534016f",
"cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0");
+ strbuf_release(&aaaaaaaaaa_100000);
+}
+
+void test_hash__alphabet_100000(void)
+{
+ struct strbuf alphabet_100000 = STRBUF_INIT;
+ strbuf_addstrings(&alphabet_100000, "abcdefghijklmnopqrstuvwxyz", 100000);
TEST_HASH_STR(alphabet_100000.buf,
"e7da7c55b3484fdf52aebec9cbe7b85a98f02fd4",
"e406ba321ca712ad35a698bf0af8d61fc4dc40eca6bdcea4697962724ccbde35");
+ strbuf_release(&alphabet_100000);
+}
+
+void test_hash__zero_blob_literal(void)
+{
TEST_HASH_LITERAL("blob 0\0",
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
"473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813");
+}
+
+void test_hash__three_blob_literal(void)
+{
TEST_HASH_LITERAL("blob 3\0abc",
"f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f",
"c1cf6e465077930e88dc5136641d402f72a229ddd996f627d60e9639eaba35a6");
+}
+
+void test_hash__zero_tree_literal(void)
+{
TEST_HASH_LITERAL("tree 0\0",
"4b825dc642cb6eb9a060e54bf8d69288fbee4904",
"6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321");
-
- strbuf_release(&aaaaaaaaaa_100000);
- strbuf_release(&alphabet_100000);
-
- return test_done();
}
diff --git a/t/unit-tests/t-hashmap.c b/t/unit-tests/u-hashmap.c
index 83b79dff39..eb80aa1348 100644
--- a/t/unit-tests/t-hashmap.c
+++ b/t/unit-tests/u-hashmap.c
@@ -1,4 +1,4 @@
-#include "test-lib.h"
+#include "unit-test.h"
#include "hashmap.h"
#include "strbuf.h"
@@ -83,23 +83,23 @@ static void t_replace(struct hashmap *map, unsigned int ignore_case)
struct test_entry *entry;
entry = alloc_test_entry("key1", "value1", ignore_case);
- check_pointer_eq(hashmap_put_entry(map, entry, ent), NULL);
+ cl_assert_equal_p(hashmap_put_entry(map, entry, ent), NULL);
entry = alloc_test_entry(ignore_case ? "Key1" : "key1", "value2",
ignore_case);
entry = hashmap_put_entry(map, entry, ent);
- if (check(entry != NULL))
- check_str(get_value(entry), "value1");
+ cl_assert(entry != NULL);
+ cl_assert_equal_s(get_value(entry), "value1");
free(entry);
entry = alloc_test_entry("fooBarFrotz", "value3", ignore_case);
- check_pointer_eq(hashmap_put_entry(map, entry, ent), NULL);
+ cl_assert_equal_p(hashmap_put_entry(map, entry, ent), NULL);
entry = alloc_test_entry(ignore_case ? "FOObarFrotz" : "fooBarFrotz",
"value4", ignore_case);
entry = hashmap_put_entry(map, entry, ent);
- if (check(entry != NULL))
- check_str(get_value(entry), "value3");
+ cl_assert(entry != NULL);
+ cl_assert_equal_s(get_value(entry), "value3");
free(entry);
}
@@ -122,20 +122,18 @@ static void t_get(struct hashmap *map, unsigned int ignore_case)
for (size_t i = 0; i < ARRAY_SIZE(key_val); i++) {
entry = alloc_test_entry(key_val[i][0], key_val[i][1],
ignore_case);
- check_pointer_eq(hashmap_put_entry(map, entry, ent), NULL);
+ cl_assert_equal_p(hashmap_put_entry(map, entry, ent), NULL);
}
for (size_t i = 0; i < ARRAY_SIZE(query); i++) {
entry = get_test_entry(map, query[i][0], ignore_case);
- if (check(entry != NULL))
- check_str(get_value(entry), query[i][1]);
- else
- test_msg("query key: %s", query[i][0]);
+ cl_assert(entry != NULL);
+ cl_assert_equal_s(get_value(entry), query[i][1]);
}
- check_pointer_eq(get_test_entry(map, "notInMap", ignore_case), NULL);
- check_int(map->tablesize, ==, 64);
- check_int(hashmap_get_size(map), ==, ARRAY_SIZE(key_val));
+ cl_assert_equal_p(get_test_entry(map, "notInMap", ignore_case), NULL);
+ cl_assert_equal_i(map->tablesize, 64);
+ cl_assert_equal_i(hashmap_get_size(map), ARRAY_SIZE(key_val));
}
static void t_add(struct hashmap *map, unsigned int ignore_case)
@@ -165,39 +163,19 @@ static void t_add(struct hashmap *map, unsigned int ignore_case)
hashmap_for_each_entry_from(map, entry, ent)
{
- int ret;
- if (!check_int((ret = key_val_contains(
- key_val, seen,
- ARRAY_SIZE(key_val), entry)),
- ==, 0)) {
- switch (ret) {
- case 1:
- test_msg("found entry was not given in the input\n"
- " key: %s\n value: %s",
- entry->key, get_value(entry));
- break;
- case 2:
- test_msg("duplicate entry detected\n"
- " key: %s\n value: %s",
- entry->key, get_value(entry));
- break;
- }
- } else {
- count++;
- }
+ int ret = key_val_contains(key_val, seen,
+ ARRAY_SIZE(key_val), entry);
+ cl_assert_equal_i(ret, 0);
+ count++;
}
- check_int(count, ==, 2);
+ cl_assert_equal_i(count, 2);
}
- for (size_t i = 0; i < ARRAY_SIZE(seen); i++) {
- if (!check_int(seen[i], ==, 1))
- test_msg("following key-val pair was not iterated over:\n"
- " key: %s\n value: %s",
- key_val[i][0], key_val[i][1]);
- }
+ for (size_t i = 0; i < ARRAY_SIZE(seen); i++)
+ cl_assert_equal_i(seen[i], 1);
- check_int(hashmap_get_size(map), ==, ARRAY_SIZE(key_val));
- check_pointer_eq(get_test_entry(map, "notInMap", ignore_case), NULL);
+ cl_assert_equal_i(hashmap_get_size(map), ARRAY_SIZE(key_val));
+ cl_assert_equal_p(get_test_entry(map, "notInMap", ignore_case), NULL);
}
static void t_remove(struct hashmap *map, unsigned int ignore_case)
@@ -211,24 +189,25 @@ static void t_remove(struct hashmap *map, unsigned int ignore_case)
for (size_t i = 0; i < ARRAY_SIZE(key_val); i++) {
entry = alloc_test_entry(key_val[i][0], key_val[i][1], ignore_case);
- check_pointer_eq(hashmap_put_entry(map, entry, ent), NULL);
+ cl_assert_equal_p(hashmap_put_entry(map, entry, ent), NULL);
}
for (size_t i = 0; i < ARRAY_SIZE(remove); i++) {
entry = alloc_test_entry(remove[i][0], "", ignore_case);
removed = hashmap_remove_entry(map, entry, ent, remove[i][0]);
- if (check(removed != NULL))
- check_str(get_value(removed), remove[i][1]);
+ cl_assert(removed != NULL);
+ cl_assert_equal_s(get_value(removed), remove[i][1]);
free(entry);
free(removed);
}
entry = alloc_test_entry("notInMap", "", ignore_case);
- check_pointer_eq(hashmap_remove_entry(map, entry, ent, "notInMap"), NULL);
+ cl_assert_equal_p(hashmap_remove_entry(map, entry, ent, "notInMap"), NULL);
free(entry);
- check_int(map->tablesize, ==, 64);
- check_int(hashmap_get_size(map), ==, ARRAY_SIZE(key_val) - ARRAY_SIZE(remove));
+ cl_assert_equal_i(map->tablesize, 64);
+ cl_assert_equal_i(hashmap_get_size(map),
+ ARRAY_SIZE(key_val) - ARRAY_SIZE(remove));
}
static void t_iterate(struct hashmap *map, unsigned int ignore_case)
@@ -242,38 +221,21 @@ static void t_iterate(struct hashmap *map, unsigned int ignore_case)
for (size_t i = 0; i < ARRAY_SIZE(key_val); i++) {
entry = alloc_test_entry(key_val[i][0], key_val[i][1], ignore_case);
- check_pointer_eq(hashmap_put_entry(map, entry, ent), NULL);
+ cl_assert_equal_p(hashmap_put_entry(map, entry, ent), NULL);
}
hashmap_for_each_entry(map, &iter, entry, ent /* member name */)
{
- int ret;
- if (!check_int((ret = key_val_contains(key_val, seen,
- ARRAY_SIZE(key_val),
- entry)), ==, 0)) {
- switch (ret) {
- case 1:
- test_msg("found entry was not given in the input\n"
- " key: %s\n value: %s",
- entry->key, get_value(entry));
- break;
- case 2:
- test_msg("duplicate entry detected\n"
- " key: %s\n value: %s",
- entry->key, get_value(entry));
- break;
- }
- }
+ int ret = key_val_contains(key_val, seen,
+ ARRAY_SIZE(key_val),
+ entry);
+ cl_assert(ret == 0);
}
- for (size_t i = 0; i < ARRAY_SIZE(seen); i++) {
- if (!check_int(seen[i], ==, 1))
- test_msg("following key-val pair was not iterated over:\n"
- " key: %s\n value: %s",
- key_val[i][0], key_val[i][1]);
- }
+ for (size_t i = 0; i < ARRAY_SIZE(seen); i++)
+ cl_assert_equal_i(seen[i], 1);
- check_int(hashmap_get_size(map), ==, ARRAY_SIZE(key_val));
+ cl_assert_equal_i(hashmap_get_size(map), ARRAY_SIZE(key_val));
}
static void t_alloc(struct hashmap *map, unsigned int ignore_case)
@@ -284,17 +246,17 @@ static void t_alloc(struct hashmap *map, unsigned int ignore_case)
char *key = xstrfmt("key%d", i);
char *value = xstrfmt("value%d", i);
entry = alloc_test_entry(key, value, ignore_case);
- check_pointer_eq(hashmap_put_entry(map, entry, ent), NULL);
+ cl_assert_equal_p(hashmap_put_entry(map, entry, ent), NULL);
free(key);
free(value);
}
- check_int(map->tablesize, ==, 64);
- check_int(hashmap_get_size(map), ==, 51);
+ cl_assert_equal_i(map->tablesize, 64);
+ cl_assert_equal_i(hashmap_get_size(map), 51);
entry = alloc_test_entry("key52", "value52", ignore_case);
- check_pointer_eq(hashmap_put_entry(map, entry, ent), NULL);
- check_int(map->tablesize, ==, 256);
- check_int(hashmap_get_size(map), ==, 52);
+ cl_assert_equal_p(hashmap_put_entry(map, entry, ent), NULL);
+ cl_assert_equal_i(map->tablesize, 256);
+ cl_assert_equal_i(hashmap_get_size(map), 52);
for (int i = 1; i <= 12; i++) {
char *key = xstrfmt("key%d", i);
@@ -302,27 +264,27 @@ static void t_alloc(struct hashmap *map, unsigned int ignore_case)
entry = alloc_test_entry(key, "", ignore_case);
removed = hashmap_remove_entry(map, entry, ent, key);
- if (check(removed != NULL))
- check_str(value, get_value(removed));
+ cl_assert(removed != NULL);
+ cl_assert_equal_s(value, get_value(removed));
free(key);
free(value);
free(entry);
free(removed);
}
- check_int(map->tablesize, ==, 256);
- check_int(hashmap_get_size(map), ==, 40);
+ cl_assert_equal_i(map->tablesize, 256);
+ cl_assert_equal_i(hashmap_get_size(map), 40);
entry = alloc_test_entry("key40", "", ignore_case);
removed = hashmap_remove_entry(map, entry, ent, "key40");
- if (check(removed != NULL))
- check_str("value40", get_value(removed));
- check_int(map->tablesize, ==, 64);
- check_int(hashmap_get_size(map), ==, 39);
+ cl_assert(removed != NULL);
+ cl_assert_equal_s("value40", get_value(removed));
+ cl_assert_equal_i(map->tablesize, 64);
+ cl_assert_equal_i(hashmap_get_size(map), 39);
free(entry);
free(removed);
}
-static void t_intern(void)
+void test_hashmap__intern(void)
{
const char *values[] = { "value1", "Value1", "value2", "value2" };
@@ -330,32 +292,68 @@ static void t_intern(void)
const char *i1 = strintern(values[i]);
const char *i2 = strintern(values[i]);
- if (!check(!strcmp(i1, values[i])))
- test_msg("strintern(%s) returns %s\n", values[i], i1);
- else if (!check(i1 != values[i]))
- test_msg("strintern(%s) returns input pointer\n",
- values[i]);
- else if (!check_pointer_eq(i1, i2))
- test_msg("address('%s') != address('%s'), so strintern('%s') != strintern('%s')",
- i1, i2, values[i], values[i]);
- else
- check_str(i1, values[i]);
+ cl_assert_equal_s(i1, values[i]);
+ cl_assert(i1 != values[i]);
+ cl_assert_equal_p(i1, i2);
}
}
-int cmd_main(int argc UNUSED, const char **argv UNUSED)
+void test_hashmap__replace_case_sensitive(void)
+{
+ setup(t_replace, 0);
+}
+
+void test_hashmap__replace_case_insensitive(void)
+{
+ setup(t_replace, 1);
+}
+
+void test_hashmap__get_case_sensitive(void)
+{
+ setup(t_get, 0);
+}
+
+void test_hashmap__get_case_insensitive(void)
+{
+ setup(t_get, 1);
+}
+
+void test_hashmap__add_case_sensitive(void)
+{
+ setup(t_add, 0);
+}
+
+void test_hashmap__add_case_insensitive(void)
+{
+ setup(t_add, 1);
+}
+
+void test_hashmap__remove_case_sensitive(void)
+{
+ setup(t_remove, 0);
+}
+
+void test_hashmap__remove_case_insensitive(void)
+{
+ setup(t_remove, 1);
+}
+
+void test_hashmap__iterate_case_sensitive(void)
+{
+ setup(t_iterate, 0);
+}
+
+void test_hashmap__iterate_case_insensitive(void)
+{
+ setup(t_iterate, 1);
+}
+
+void test_hashmap__alloc_case_sensitive(void)
+{
+ setup(t_alloc, 0);
+}
+
+void test_hashmap__alloc_case_insensitive(void)
{
- TEST(setup(t_replace, 0), "replace works");
- TEST(setup(t_replace, 1), "replace (case insensitive) works");
- TEST(setup(t_get, 0), "get works");
- TEST(setup(t_get, 1), "get (case insensitive) works");
- TEST(setup(t_add, 0), "add works");
- TEST(setup(t_add, 1), "add (case insensitive) works");
- TEST(setup(t_remove, 0), "remove works");
- TEST(setup(t_remove, 1), "remove (case insensitive) works");
- TEST(setup(t_iterate, 0), "iterate works");
- TEST(setup(t_iterate, 1), "iterate (case insensitive) works");
- TEST(setup(t_alloc, 0), "grow / shrink works");
- TEST(t_intern(), "string interning works");
- return test_done();
+ setup(t_alloc, 1);
}
diff --git a/t/unit-tests/u-mem-pool.c b/t/unit-tests/u-mem-pool.c
new file mode 100644
index 0000000000..2bc2493b7e
--- /dev/null
+++ b/t/unit-tests/u-mem-pool.c
@@ -0,0 +1,25 @@
+#include "unit-test.h"
+#include "mem-pool.h"
+
+static void test_many_pool_allocations(size_t block_alloc)
+{
+ struct mem_pool pool = { .block_alloc = block_alloc };
+ size_t size = 100;
+ char *buffer = mem_pool_calloc(&pool, 1, size);
+ for (size_t i = 0; i < size; i++)
+ cl_assert_equal_i(0, buffer[i]);
+ cl_assert(pool.mp_block != NULL);
+ cl_assert(pool.mp_block->next_free != NULL);
+ cl_assert(pool.mp_block->end != NULL);
+ mem_pool_discard(&pool, 0);
+}
+
+void test_mem_pool__big_block(void)
+{
+ test_many_pool_allocations(1024 * 1024);
+}
+
+void test_mem_pool__tiny_block(void)
+{
+ test_many_pool_allocations(1);
+}
diff --git a/t/unit-tests/u-prio-queue.c b/t/unit-tests/u-prio-queue.c
new file mode 100644
index 0000000000..145e689c9c
--- /dev/null
+++ b/t/unit-tests/u-prio-queue.c
@@ -0,0 +1,94 @@
+#include "unit-test.h"
+#include "prio-queue.h"
+
+static int intcmp(const void *va, const void *vb, void *data UNUSED)
+{
+ const int *a = va, *b = vb;
+ return *a - *b;
+}
+
+
+#define MISSING -1
+#define DUMP -2
+#define STACK -3
+#define GET -4
+#define REVERSE -5
+
+static int show(int *v)
+{
+ return v ? *v : MISSING;
+}
+
+static void test_prio_queue(int *input, size_t input_size,
+ int *result, size_t result_size)
+{
+ struct prio_queue pq = { intcmp };
+ size_t j = 0;
+
+ for (size_t i = 0; i < input_size; i++) {
+ void *peek, *get;
+ switch(input[i]) {
+ case GET:
+ peek = prio_queue_peek(&pq);
+ get = prio_queue_get(&pq);
+ cl_assert(peek == get);
+ cl_assert(j < result_size);
+ cl_assert_equal_i(result[j], show(get));
+ j++;
+ break;
+ case DUMP:
+ while ((peek = prio_queue_peek(&pq))) {
+ get = prio_queue_get(&pq);
+ cl_assert(peek == get);
+ cl_assert(j < result_size);
+ cl_assert_equal_i(result[j], show(get));
+ j++;
+ }
+ break;
+ case STACK:
+ pq.compare = NULL;
+ break;
+ case REVERSE:
+ prio_queue_reverse(&pq);
+ break;
+ default:
+ prio_queue_put(&pq, &input[i]);
+ break;
+ }
+ }
+ cl_assert_equal_i(j, result_size);
+ clear_prio_queue(&pq);
+}
+
+#define TEST_INPUT(input, result) \
+ test_prio_queue(input, ARRAY_SIZE(input), result, ARRAY_SIZE(result))
+
+void test_prio_queue__basic(void)
+{
+ TEST_INPUT(((int []){ 2, 6, 3, 10, 9, 5, 7, 4, 5, 8, 1, DUMP }),
+ ((int []){ 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10 }));
+}
+
+void test_prio_queue__mixed(void)
+{
+ TEST_INPUT(((int []){ 6, 2, 4, GET, 5, 3, GET, GET, 1, DUMP }),
+ ((int []){ 2, 3, 4, 1, 5, 6 }));
+}
+
+void test_prio_queue__empty(void)
+{
+ TEST_INPUT(((int []){ 1, 2, GET, GET, GET, 1, 2, GET, GET, GET }),
+ ((int []){ 1, 2, MISSING, 1, 2, MISSING }));
+}
+
+void test_prio_queue__stack(void)
+{
+ TEST_INPUT(((int []){ STACK, 8, 1, 5, 4, 6, 2, 3, DUMP }),
+ ((int []){ 3, 2, 6, 4, 5, 1, 8 }));
+}
+
+void test_prio_queue__reverse_stack(void)
+{
+ TEST_INPUT(((int []){ STACK, 1, 2, 3, 4, 5, 6, REVERSE, DUMP }),
+ ((int []){ 1, 2, 3, 4, 5, 6 }));
+}
diff --git a/t/unit-tests/t-reftable-tree.c b/t/unit-tests/u-reftable-tree.c
index 79b175a45a..bcf9061071 100644
--- a/t/unit-tests/t-reftable-tree.c
+++ b/t/unit-tests/u-reftable-tree.c
@@ -6,7 +6,7 @@ license that can be found in the LICENSE file or at
https://developers.google.com/open-source/licenses/bsd
*/
-#include "test-lib.h"
+#include "unit-test.h"
#include "reftable/tree.h"
static int t_compare(const void *a, const void *b)
@@ -25,7 +25,7 @@ static void store(void *arg, void *key)
c->arr[c->len++] = key;
}
-static void t_tree_search(void)
+void test_reftable_tree__tree_search(void)
{
struct tree_node *root = NULL;
void *values[11] = { 0 };
@@ -38,20 +38,20 @@ static void t_tree_search(void)
*/
do {
nodes[i] = tree_insert(&root, &values[i], &t_compare);
- check(nodes[i] != NULL);
+ cl_assert(nodes[i] != NULL);
i = (i * 7) % 11;
} while (i != 1);
for (i = 1; i < ARRAY_SIZE(nodes); i++) {
- check_pointer_eq(&values[i], nodes[i]->key);
- check_pointer_eq(nodes[i], tree_search(root, &values[i], &t_compare));
+ cl_assert_equal_p(&values[i], nodes[i]->key);
+ cl_assert_equal_p(nodes[i], tree_search(root, &values[i], &t_compare));
}
- check(!tree_search(root, values, t_compare));
+ cl_assert(tree_search(root, values, t_compare) == NULL);
tree_free(root);
}
-static void t_infix_walk(void)
+void test_reftable_tree__infix_walk(void)
{
struct tree_node *root = NULL;
void *values[11] = { 0 };
@@ -64,23 +64,15 @@ static void t_infix_walk(void)
do {
struct tree_node *node = tree_insert(&root, &values[i], t_compare);
- check(node != NULL);
+ cl_assert(node != NULL);
i = (i * 7) % 11;
count++;
} while (i != 1);
infix_walk(root, &store, &c);
for (i = 1; i < ARRAY_SIZE(values); i++)
- check_pointer_eq(&values[i], out[i - 1]);
- check(!out[i - 1]);
- check_int(c.len, ==, count);
+ cl_assert_equal_p(&values[i], out[i - 1]);
+ cl_assert(out[i - 1] == NULL);
+ cl_assert_equal_i(c.len, count);
tree_free(root);
}
-
-int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
-{
- TEST(t_tree_search(), "tree_search works");
- TEST(t_infix_walk(), "infix_walk works");
-
- return test_done();
-}
diff --git a/t/unit-tests/u-strbuf.c b/t/unit-tests/u-strbuf.c
new file mode 100644
index 0000000000..caa5d78aa3
--- /dev/null
+++ b/t/unit-tests/u-strbuf.c
@@ -0,0 +1,119 @@
+#include "unit-test.h"
+#include "strbuf.h"
+
+/* wrapper that supplies tests with an empty, initialized strbuf */
+static void setup(void (*f)(struct strbuf*, const void*),
+ const void *data)
+{
+ struct strbuf buf = STRBUF_INIT;
+
+ f(&buf, data);
+ strbuf_release(&buf);
+ cl_assert_equal_i(buf.len, 0);
+ cl_assert_equal_i(buf.alloc, 0);
+}
+
+/* wrapper that supplies tests with a populated, initialized strbuf */
+static void setup_populated(void (*f)(struct strbuf*, const void*),
+ const char *init_str, const void *data)
+{
+ struct strbuf buf = STRBUF_INIT;
+
+ strbuf_addstr(&buf, init_str);
+ cl_assert_equal_i(buf.len, strlen(init_str));
+ f(&buf, data);
+ strbuf_release(&buf);
+ cl_assert_equal_i(buf.len, 0);
+ cl_assert_equal_i(buf.alloc, 0);
+}
+
+static void assert_sane_strbuf(struct strbuf *buf)
+{
+ /* Initialized strbufs should always have a non-NULL buffer */
+ cl_assert(buf->buf != NULL);
+ /* Buffers should always be NUL-terminated */
+ cl_assert(buf->buf[buf->len] == '\0');
+ /*
+ * In case the buffer contains anything, `alloc` must alloc must
+ * be at least one byte larger than `len`.
+ */
+ if (buf->len)
+ cl_assert(buf->len < buf->alloc);
+}
+
+void test_strbuf__static_init(void)
+{
+ struct strbuf buf = STRBUF_INIT;
+
+ cl_assert_equal_i(buf.len, 0);
+ cl_assert_equal_i(buf.alloc, 0);
+ cl_assert(buf.buf[0] == '\0');
+}
+
+void test_strbuf__dynamic_init(void)
+{
+ struct strbuf buf;
+
+ strbuf_init(&buf, 1024);
+ assert_sane_strbuf(&buf);
+ cl_assert_equal_i(buf.len, 0);
+ cl_assert(buf.alloc >= 1024);
+ cl_assert(buf.buf[0] == '\0');
+ strbuf_release(&buf);
+}
+
+static void t_addch(struct strbuf *buf, const void *data)
+{
+ const char *p_ch = data;
+ const char ch = *p_ch;
+ size_t orig_alloc = buf->alloc;
+ size_t orig_len = buf->len;
+
+ assert_sane_strbuf(buf);
+ strbuf_addch(buf, ch);
+ assert_sane_strbuf(buf);
+ cl_assert_equal_i(buf->len, orig_len + 1);
+ cl_assert(buf->alloc >= orig_alloc);
+ cl_assert(buf->buf[buf->len] == '\0');
+}
+
+static void t_addstr(struct strbuf *buf, const void *data)
+{
+ const char *text = data;
+ size_t len = strlen(text);
+ size_t orig_alloc = buf->alloc;
+ size_t orig_len = buf->len;
+
+ assert_sane_strbuf(buf);
+ strbuf_addstr(buf, text);
+ assert_sane_strbuf(buf);
+ cl_assert_equal_i(buf->len, orig_len + len);
+ cl_assert(buf->alloc >= orig_alloc);
+ cl_assert(buf->buf[buf->len] == '\0');
+ cl_assert_equal_s(buf->buf + orig_len, text);
+}
+
+void test_strbuf__add_single_char(void)
+{
+ setup(t_addch, "a");
+}
+
+void test_strbuf__add_empty_char(void)
+{
+ setup(t_addch, "");
+}
+
+void test_strbuf__add_append_char(void)
+{
+ setup_populated(t_addch, "initial value", "a");
+}
+
+void test_strbuf__add_single_str(void)
+{
+ setup(t_addstr, "hello there");
+}
+
+void test_strbuf__add_append_str(void)
+{
+ setup_populated(t_addstr, "initial value", "hello there");
+}
diff --git a/t/unit-tests/u-strcmp-offset.c b/t/unit-tests/u-strcmp-offset.c
new file mode 100644
index 0000000000..7e8e9acf3c
--- /dev/null
+++ b/t/unit-tests/u-strcmp-offset.c
@@ -0,0 +1,45 @@
+#include "unit-test.h"
+#include "read-cache-ll.h"
+
+static void check_strcmp_offset(const char *string1, const char *string2,
+ int expect_result, uintmax_t expect_offset)
+{
+ size_t offset;
+ int result = strcmp_offset(string1, string2, &offset);
+
+ /*
+ * Because different CRTs behave differently, only rely on signs of the
+ * result values.
+ */
+ result = (result < 0 ? -1 :
+ result > 0 ? 1 :
+ 0);
+
+ cl_assert_equal_i(result, expect_result);
+ cl_assert_equal_i((uintmax_t)offset, expect_offset);
+}
+
+void test_strcmp_offset__empty(void)
+{
+ check_strcmp_offset("", "", 0, 0);
+}
+
+void test_strcmp_offset__equal(void)
+{
+ check_strcmp_offset("abc", "abc", 0, 3);
+}
+
+void test_strcmp_offset__different(void)
+{
+ check_strcmp_offset("abc", "def", -1, 0);
+}
+
+void test_strcmp_offset__mismatch(void)
+{
+ check_strcmp_offset("abc", "abz", -1, 2);
+}
+
+void test_strcmp_offset__different_length(void)
+{
+ check_strcmp_offset("abc", "abcdef", -1, 3);
+}
diff --git a/templates/Makefile b/templates/Makefile
index bd1e9e30c1..722755338d 100644
--- a/templates/Makefile
+++ b/templates/Makefile
@@ -1,3 +1,6 @@
+# The default target of this Makefile is...
+all::
+
# Import tree-wide shared Makefile behavior and libraries
include ../shared.mak
@@ -23,7 +26,7 @@ PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
template_instdir_SQ = $(subst ','\'',$(template_instdir))
-all: boilerplates.made custom
+all:: boilerplates.made custom
# Put templates that can be copied straight from the source
# in a file direc--tory--file in the source. They will be
diff --git a/tmp-objdir.c b/tmp-objdir.c
index 659fcdcc29..0ea078a5c5 100644
--- a/tmp-objdir.c
+++ b/tmp-objdir.c
@@ -1,5 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
-
#include "git-compat-util.h"
#include "tmp-objdir.h"
#include "abspath.h"
@@ -16,6 +14,7 @@
#include "repository.h"
struct tmp_objdir {
+ struct repository *repo;
struct strbuf path;
struct strvec env;
struct object_directory *prev_odb;
@@ -116,7 +115,8 @@ static int setup_tmp_objdir(const char *root)
return ret;
}
-struct tmp_objdir *tmp_objdir_create(const char *prefix)
+struct tmp_objdir *tmp_objdir_create(struct repository *r,
+ const char *prefix)
{
static int installed_handlers;
struct tmp_objdir *t;
@@ -125,6 +125,7 @@ struct tmp_objdir *tmp_objdir_create(const char *prefix)
BUG("only one tmp_objdir can be used at a time");
t = xcalloc(1, sizeof(*t));
+ t->repo = r;
strbuf_init(&t->path, 0);
strvec_init(&t->env);
@@ -134,7 +135,7 @@ struct tmp_objdir *tmp_objdir_create(const char *prefix)
* them.
*/
strbuf_addf(&t->path, "%s/tmp_objdir-%s-XXXXXX",
- repo_get_object_directory(the_repository), prefix);
+ repo_get_object_directory(r), prefix);
if (!mkdtemp(t->path.buf)) {
/* free, not destroy, as we never touched the filesystem */
@@ -154,7 +155,7 @@ struct tmp_objdir *tmp_objdir_create(const char *prefix)
}
env_append(&t->env, ALTERNATE_DB_ENVIRONMENT,
- absolute_path(repo_get_object_directory(the_repository)));
+ absolute_path(repo_get_object_directory(r)));
env_replace(&t->env, DB_ENVIRONMENT, absolute_path(t->path.buf));
env_replace(&t->env, GIT_QUARANTINE_ENVIRONMENT,
absolute_path(t->path.buf));
@@ -273,14 +274,14 @@ int tmp_objdir_migrate(struct tmp_objdir *t)
return 0;
if (t->prev_odb) {
- if (the_repository->objects->odb->will_destroy)
+ if (t->repo->objects->odb->will_destroy)
BUG("migrating an ODB that was marked for destruction");
restore_primary_odb(t->prev_odb, t->path.buf);
t->prev_odb = NULL;
}
strbuf_addbuf(&src, &t->path);
- strbuf_addstr(&dst, repo_get_object_directory(the_repository));
+ strbuf_addstr(&dst, repo_get_object_directory(t->repo));
ret = migrate_paths(&src, &dst, 0);
diff --git a/tmp-objdir.h b/tmp-objdir.h
index 237d96b660..fceda14979 100644
--- a/tmp-objdir.h
+++ b/tmp-objdir.h
@@ -11,7 +11,7 @@
* Example:
*
* struct child_process child = CHILD_PROCESS_INIT;
- * struct tmp_objdir *t = tmp_objdir_create("incoming");
+ * struct tmp_objdir *t = tmp_objdir_create(repo, "incoming");
* strvec_push(&child.args, cmd);
* strvec_pushv(&child.env, tmp_objdir_env(t));
* if (!run_command(&child)) && !tmp_objdir_migrate(t))
@@ -21,13 +21,14 @@
*
*/
+struct repository;
struct tmp_objdir;
/*
* Create a new temporary object directory with the specified prefix;
* returns NULL on failure.
*/
-struct tmp_objdir *tmp_objdir_create(const char *prefix);
+struct tmp_objdir *tmp_objdir_create(struct repository *r, const char *prefix);
/*
* Return a list of environment strings, suitable for use with
diff --git a/trace.c b/trace.c
index 2cfd25942e..9b99460db8 100644
--- a/trace.c
+++ b/trace.c
@@ -21,7 +21,6 @@
* along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
-#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h"
@@ -298,7 +297,7 @@ static const char *quote_crnl(const char *path)
return new_path.buf;
}
-void trace_repo_setup(void)
+void trace_repo_setup(struct repository *r)
{
const char *git_work_tree, *prefix = startup_info->prefix;
char *cwd;
@@ -308,14 +307,14 @@ void trace_repo_setup(void)
cwd = xgetcwd();
- if (!(git_work_tree = repo_get_work_tree(the_repository)))
+ if (!(git_work_tree = repo_get_work_tree(r)))
git_work_tree = "(null)";
if (!startup_info->prefix)
prefix = "(null)";
- trace_printf_key(&trace_setup_key, "setup: git_dir: %s\n", quote_crnl(repo_get_git_dir(the_repository)));
- trace_printf_key(&trace_setup_key, "setup: git_common_dir: %s\n", quote_crnl(repo_get_common_dir(the_repository)));
+ trace_printf_key(&trace_setup_key, "setup: git_dir: %s\n", quote_crnl(repo_get_git_dir(r)));
+ trace_printf_key(&trace_setup_key, "setup: git_common_dir: %s\n", quote_crnl(repo_get_common_dir(r)));
trace_printf_key(&trace_setup_key, "setup: worktree: %s\n", quote_crnl(git_work_tree));
trace_printf_key(&trace_setup_key, "setup: cwd: %s\n", quote_crnl(cwd));
trace_printf_key(&trace_setup_key, "setup: prefix: %s\n", quote_crnl(prefix));
diff --git a/trace.h b/trace.h
index d304d55aa1..9152fe9b3e 100644
--- a/trace.h
+++ b/trace.h
@@ -92,7 +92,9 @@ extern struct trace_key trace_default_key;
extern struct trace_key trace_perf_key;
extern struct trace_key trace_setup_key;
-void trace_repo_setup(void);
+struct repository;
+
+void trace_repo_setup(struct repository *r);
/**
* Checks whether the trace key is enabled. Used to prevent expensive
diff --git a/trace2.c b/trace2.c
index 82d16e2783..c23c0a227b 100644
--- a/trace2.c
+++ b/trace2.c
@@ -764,7 +764,7 @@ void trace2_def_param_fl(const char *file, int line, const char *param,
if (!trace2_enabled)
return;
- redacted = redact_arg(value);
+ redacted = value ? redact_arg(value) : NULL;
for_each_wanted_builtin (j, tgt_j)
if (tgt_j->pfn_param_fl)
diff --git a/trace2/tr2_sid.c b/trace2/tr2_sid.c
index 09c4ef0d17..1c1d27b0ee 100644
--- a/trace2/tr2_sid.c
+++ b/trace2/tr2_sid.c
@@ -32,7 +32,7 @@ static void tr2_sid_append_my_sid_component(void)
{
const struct git_hash_algo *algo = &hash_algos[GIT_HASH_SHA1];
struct tr2_tbuf tb_now;
- git_hash_ctx ctx;
+ struct git_hash_ctx ctx;
pid_t pid = getpid();
unsigned char hash[GIT_MAX_RAWSZ + 1];
char hex[GIT_MAX_HEXSZ + 1];
@@ -46,8 +46,8 @@ static void tr2_sid_append_my_sid_component(void)
strbuf_add(&tr2sid_buf, "Localhost", 9);
else {
algo->init_fn(&ctx);
- algo->update_fn(&ctx, hostname, strlen(hostname));
- algo->final_fn(hash, &ctx);
+ git_hash_update(&ctx, hostname, strlen(hostname));
+ git_hash_final(hash, &ctx);
hash_to_hex_algop_r(hex, hash, algo);
strbuf_addch(&tr2sid_buf, 'H');
strbuf_add(&tr2sid_buf, hex, 8);
diff --git a/trace2/tr2_tgt_event.c b/trace2/tr2_tgt_event.c
index 69ee40449f..5a0381791f 100644
--- a/trace2/tr2_tgt_event.c
+++ b/trace2/tr2_tgt_event.c
@@ -493,7 +493,8 @@ static void fn_param_fl(const char *file, int line, const char *param,
event_fmt_prepare(event_name, file, line, NULL, &jw);
jw_object_string(&jw, "scope", scope_name);
jw_object_string(&jw, "param", param);
- jw_object_string(&jw, "value", value);
+ if (value)
+ jw_object_string(&jw, "value", value);
jw_end(&jw);
tr2_dst_write_line(&tr2dst_event, &jw.json);
diff --git a/trace2/tr2_tgt_normal.c b/trace2/tr2_tgt_normal.c
index baef48aa69..924736ab36 100644
--- a/trace2/tr2_tgt_normal.c
+++ b/trace2/tr2_tgt_normal.c
@@ -307,8 +307,9 @@ static void fn_param_fl(const char *file, int line, const char *param,
enum config_scope scope = kvi->scope;
const char *scope_name = config_scope_name(scope);
- strbuf_addf(&buf_payload, "def_param scope:%s %s=%s", scope_name, param,
- value);
+ strbuf_addf(&buf_payload, "def_param scope:%s %s", scope_name, param);
+ if (value)
+ strbuf_addf(&buf_payload, "=%s", value);
normal_io_write_fl(file, line, &buf_payload);
strbuf_release(&buf_payload);
}
diff --git a/trace2/tr2_tgt_perf.c b/trace2/tr2_tgt_perf.c
index 298ae27f9d..4eb9289f95 100644
--- a/trace2/tr2_tgt_perf.c
+++ b/trace2/tr2_tgt_perf.c
@@ -448,8 +448,9 @@ static void fn_param_fl(const char *file, int line, const char *param,
struct strbuf scope_payload = STRBUF_INIT;
enum config_scope scope = kvi->scope;
const char *scope_name = config_scope_name(scope);
-
- strbuf_addf(&buf_payload, "%s:%s", param, value);
+ strbuf_addstr(&buf_payload, param);
+ if (value)
+ strbuf_addf(&buf_payload, ":%s", value);
strbuf_addf(&scope_payload, "%s:%s", "scope", scope_name);
perf_io_write_fl(file, line, event_name, NULL, NULL, NULL,
diff --git a/transport.c b/transport.c
index 10d820c333..6c2801bcbd 100644
--- a/transport.c
+++ b/transport.c
@@ -207,6 +207,7 @@ static int fetch_refs_from_bundle(struct transport *transport,
ret = unbundle(the_repository, &data->header, data->fd,
&extra_index_pack_args, &opts);
+ data->fd = -1; /* `unbundle()` closes the file descriptor */
transport->hash_algo = data->header.hash_algo;
strvec_clear(&extra_index_pack_args);
@@ -932,8 +933,15 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
break;
case protocol_v1:
case protocol_v0:
- ret = send_pack(&args, data->fd, data->conn, remote_refs,
+ ret = send_pack(the_repository, &args, data->fd, data->conn, remote_refs,
&data->extra_have);
+ /*
+ * Ignore the specific error code to maintain consistent behavior
+ * with the "push_refs()" function across different transports,
+ * such as "push_refs_with_push()" for HTTP protocol.
+ */
+ if (ret == ERROR_SEND_PACK_BAD_REF_STATUS)
+ ret = 0;
break;
case protocol_unknown_version:
BUG("unknown protocol version");
@@ -941,15 +949,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
close(data->fd[1]);
close(data->fd[0]);
- /*
- * Atomic push may abort the connection early and close the pipe,
- * which may cause an error for `finish_connect()`. Ignore this error
- * for atomic git-push.
- */
- if (ret || args.atomic)
- finish_connect(data->conn);
- else
- ret = finish_connect(data->conn);
+ ret |= finish_connect(data->conn);
data->conn = NULL;
data->finished_handshake = 0;
diff --git a/tree-diff.c b/tree-diff.c
index d9237ffd9b..60c558c2b5 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -48,8 +48,8 @@
free((x)); \
} while(0)
-static struct combine_diff_path *ll_diff_tree_paths(
- struct combine_diff_path *p, const struct object_id *oid,
+static void ll_diff_tree_paths(
+ struct combine_diff_path ***tail, const struct object_id *oid,
const struct object_id **parents_oid, int nparent,
struct strbuf *base, struct diff_options *opt,
int depth);
@@ -125,72 +125,6 @@ static int emit_diff_first_parent_only(struct diff_options *opt, struct combine_
/*
- * Make a new combine_diff_path from path/mode/sha1
- * and append it to paths list tail.
- *
- * Memory for created elements could be reused:
- *
- * - if last->next == NULL, the memory is allocated;
- *
- * - if last->next != NULL, it is assumed that p=last->next was returned
- * earlier by this function, and p->next was *not* modified.
- * The memory is then reused from p.
- *
- * so for clients,
- *
- * - if you do need to keep the element
- *
- * p = path_appendnew(p, ...);
- * process(p);
- * p->next = NULL;
- *
- * - if you don't need to keep the element after processing
- *
- * pprev = p;
- * p = path_appendnew(p, ...);
- * process(p);
- * p = pprev;
- * ; don't forget to free tail->next in the end
- *
- * p->parent[] remains uninitialized.
- */
-static struct combine_diff_path *path_appendnew(struct combine_diff_path *last,
- int nparent, const struct strbuf *base, const char *path, int pathlen,
- unsigned mode, const struct object_id *oid)
-{
- struct combine_diff_path *p;
- size_t len = st_add(base->len, pathlen);
- size_t alloclen = combine_diff_path_size(nparent, len);
-
- /* if last->next is !NULL - it is a pre-allocated memory, we can reuse */
- p = last->next;
- if (p && (alloclen > (intptr_t)p->next)) {
- FREE_AND_NULL(p);
- }
-
- if (!p) {
- p = xmalloc(alloclen);
-
- /*
- * until we go to it next round, .next holds how many bytes we
- * allocated (for faster realloc - we don't need copying old data).
- */
- p->next = (struct combine_diff_path *)(intptr_t)alloclen;
- }
-
- last->next = p;
-
- p->path = (char *)&(p->parent[nparent]);
- memcpy(p->path, base->buf, base->len);
- memcpy(p->path + base->len, path, pathlen);
- p->path[len] = 0;
- p->mode = mode;
- oidcpy(&p->oid, oid ? oid : null_oid());
-
- return p;
-}
-
-/*
* new path should be added to combine diff
*
* 3 cases on how/when it should be called and behaves:
@@ -200,10 +134,10 @@ static struct combine_diff_path *path_appendnew(struct combine_diff_path *last,
* t, tp -> path modified/added
* (M for tp[i]=tp[imin], A otherwise)
*/
-static struct combine_diff_path *emit_path(struct combine_diff_path *p,
- struct strbuf *base, struct diff_options *opt, int nparent,
- struct tree_desc *t, struct tree_desc *tp,
- int imin, int depth)
+static void emit_path(struct combine_diff_path ***tail,
+ struct strbuf *base, struct diff_options *opt,
+ int nparent, struct tree_desc *t, struct tree_desc *tp,
+ int imin, int depth)
{
unsigned short mode;
const char *path;
@@ -243,8 +177,13 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *p,
if (emitthis) {
int keep;
- struct combine_diff_path *pprev = p;
- p = path_appendnew(p, nparent, base, path, pathlen, mode, oid);
+ struct combine_diff_path *p;
+
+ strbuf_add(base, path, pathlen);
+ p = combine_diff_path_new(base->buf, base->len, mode,
+ oid ? oid : null_oid(),
+ nparent);
+ strbuf_setlen(base, old_baselen);
for (i = 0; i < nparent; ++i) {
/*
@@ -279,21 +218,12 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *p,
if (opt->pathchange)
keep = opt->pathchange(opt, p);
- /*
- * If a path was filtered or consumed - we don't need to add it
- * to the list and can reuse its memory, leaving it as
- * pre-allocated element on the tail.
- *
- * On the other hand, if path needs to be kept, we need to
- * correct its .next to NULL, as it was pre-initialized to how
- * much memory was allocated.
- *
- * see path_appendnew() for details.
- */
- if (!keep)
- p = pprev;
- else
- p->next = NULL;
+ if (keep) {
+ **tail = p;
+ *tail = &p->next;
+ } else {
+ free(p);
+ }
}
if (recurse) {
@@ -309,13 +239,12 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *p,
strbuf_add(base, path, pathlen);
strbuf_addch(base, '/');
- p = ll_diff_tree_paths(p, oid, parents_oid, nparent, base, opt,
- depth + 1);
+ ll_diff_tree_paths(tail, oid, parents_oid, nparent, base, opt,
+ depth + 1);
FAST_ARRAY_FREE(parents_oid, nparent);
}
strbuf_setlen(base, old_baselen);
- return p;
}
static void skip_uninteresting(struct tree_desc *t, struct strbuf *base,
@@ -428,8 +357,8 @@ static inline void update_tp_entries(struct tree_desc *tp, int nparent)
update_tree_entry(&tp[i]);
}
-static struct combine_diff_path *ll_diff_tree_paths(
- struct combine_diff_path *p, const struct object_id *oid,
+static void ll_diff_tree_paths(
+ struct combine_diff_path ***tail, const struct object_id *oid,
const struct object_id **parents_oid, int nparent,
struct strbuf *base, struct diff_options *opt,
int depth)
@@ -533,8 +462,8 @@ static struct combine_diff_path *ll_diff_tree_paths(
}
/* D += {δ(t,pi) if pi=p[imin]; "+a" if pi > p[imin]} */
- p = emit_path(p, base, opt, nparent,
- &t, tp, imin, depth);
+ emit_path(tail, base, opt, nparent,
+ &t, tp, imin, depth);
skip_emit_t_tp:
/* t↓, ∀ pi=p[imin] pi↓ */
@@ -545,8 +474,8 @@ static struct combine_diff_path *ll_diff_tree_paths(
/* t < p[imin] */
else if (cmp < 0) {
/* D += "+t" */
- p = emit_path(p, base, opt, nparent,
- &t, /*tp=*/NULL, -1, depth);
+ emit_path(tail, base, opt, nparent,
+ &t, /*tp=*/NULL, -1, depth);
/* t↓ */
update_tree_entry(&t);
@@ -561,8 +490,8 @@ static struct combine_diff_path *ll_diff_tree_paths(
goto skip_emit_tp;
}
- p = emit_path(p, base, opt, nparent,
- /*t=*/NULL, tp, imin, depth);
+ emit_path(tail, base, opt, nparent,
+ /*t=*/NULL, tp, imin, depth);
skip_emit_tp:
/* ∀ pi=p[imin] pi↓ */
@@ -575,24 +504,16 @@ static struct combine_diff_path *ll_diff_tree_paths(
free(tptree[i]);
FAST_ARRAY_FREE(tptree, nparent);
FAST_ARRAY_FREE(tp, nparent);
-
- return p;
}
struct combine_diff_path *diff_tree_paths(
- struct combine_diff_path *p, const struct object_id *oid,
+ const struct object_id *oid,
const struct object_id **parents_oid, int nparent,
struct strbuf *base, struct diff_options *opt)
{
- p = ll_diff_tree_paths(p, oid, parents_oid, nparent, base, opt, 0);
-
- /*
- * free pre-allocated last element, if any
- * (see path_appendnew() for details about why)
- */
- FREE_AND_NULL(p->next);
-
- return p;
+ struct combine_diff_path *head = NULL, **tail = &head;
+ ll_diff_tree_paths(&tail, oid, parents_oid, nparent, base, opt, 0);
+ return head;
}
/*
@@ -708,14 +629,13 @@ static void ll_diff_tree_oid(const struct object_id *old_oid,
const struct object_id *new_oid,
struct strbuf *base, struct diff_options *opt)
{
- struct combine_diff_path phead, *p;
+ struct combine_diff_path *paths, *p;
pathchange_fn_t pathchange_old = opt->pathchange;
- phead.next = NULL;
opt->pathchange = emit_diff_first_parent_only;
- diff_tree_paths(&phead, new_oid, &old_oid, 1, base, opt);
+ paths = diff_tree_paths(new_oid, &old_oid, 1, base, opt);
- for (p = phead.next; p;) {
+ for (p = paths; p;) {
struct combine_diff_path *pprev = p;
p = p->next;
free(pprev);
diff --git a/unix-socket.c b/unix-socket.c
index 483c9c448c..8860203c3f 100644
--- a/unix-socket.c
+++ b/unix-socket.c
@@ -65,8 +65,10 @@ static int unix_sockaddr_init(struct sockaddr_un *sa, const char *path,
if (strbuf_getcwd(&cwd))
return -1;
ctx->orig_dir = strbuf_detach(&cwd, NULL);
- if (chdir_len(dir, slash - dir) < 0)
+ if (chdir_len(dir, slash - dir) < 0) {
+ FREE_AND_NULL(ctx->orig_dir);
return -1;
+ }
}
memset(sa, 0, sizeof(*sa));
diff --git a/unpack-trees.c b/unpack-trees.c
index b3be5d542f..334cb84f65 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -372,7 +372,8 @@ static struct progress *get_progress(struct unpack_trees_options *o,
total++;
}
- return start_delayed_progress(_("Updating files"), total);
+ return start_delayed_progress(the_repository,
+ _("Updating files"), total);
}
static void setup_collided_checkout_detection(struct checkout *state,
@@ -1773,6 +1774,7 @@ static int clear_ce_flags(struct index_state *istate,
strbuf_reset(&prefix);
if (show_progress)
istate->progress = start_delayed_progress(
+ the_repository,
_("Updating index flags"),
istate->cache_nr);
diff --git a/usage.c b/usage.c
index 47709006c1..38b46bbbfe 100644
--- a/usage.c
+++ b/usage.c
@@ -8,7 +8,7 @@
#include "gettext.h"
#include "trace2.h"
-static void vreportf(const char *prefix, const char *err, va_list params)
+static void vfreportf(FILE *f, const char *prefix, const char *err, va_list params)
{
char msg[4096];
char *p, *pend = msg + sizeof(msg);
@@ -32,8 +32,13 @@ static void vreportf(const char *prefix, const char *err, va_list params)
}
*(p++) = '\n'; /* we no longer need a NUL */
- fflush(stderr);
- write_in_full(2, msg, p - msg);
+ fflush(f);
+ write_in_full(fileno(f), msg, p - msg);
+}
+
+static void vreportf(const char *prefix, const char *err, va_list params)
+{
+ vfreportf(stderr, prefix, err, params);
}
static NORETURN void usage_builtin(const char *err, va_list params)
@@ -173,6 +178,22 @@ void NORETURN usage(const char *err)
usagef("%s", err);
}
+static void show_usage_if_asked_helper(const char *err, ...)
+{
+ va_list params;
+
+ va_start(params, err);
+ vfreportf(stdout, _("usage: "), err, params);
+ va_end(params);
+ exit(129);
+}
+
+void show_usage_if_asked(int ac, const char **av, const char *err)
+{
+ if (ac == 2 && !strcmp(av[1], "-h"))
+ show_usage_if_asked_helper(err);
+}
+
void NORETURN die(const char *err, ...)
{
va_list params;
diff --git a/version.c b/version.c
index 8e927cf1eb..279269cc50 100644
--- a/version.c
+++ b/version.c
@@ -2,10 +2,15 @@
#include "git-compat-util.h"
#include "version.h"
-#include "version-def.h"
#include "strbuf.h"
#include "gettext.h"
+#ifndef GIT_VERSION_H
+# include "version-def.h"
+#else
+# include GIT_VERSION_H
+#endif
+
const char git_version_string[] = GIT_VERSION;
const char git_built_from_commit_string[] = GIT_BUILT_FROM_COMMIT;
diff --git a/walker.c b/walker.c
index 7cc9dbea46..1cf3da0219 100644
--- a/walker.c
+++ b/walker.c
@@ -172,7 +172,8 @@ static int loop(struct walker *walker)
uint64_t nr = 0;
if (walker->get_progress)
- progress = start_delayed_progress(_("Fetching objects"), 0);
+ progress = start_delayed_progress(the_repository,
+ _("Fetching objects"), 0);
while (process_queue) {
struct object *obj = process_queue->item;
diff --git a/worktree.c b/worktree.c
index 248bbb39d4..d4a68c9c23 100644
--- a/worktree.c
+++ b/worktree.c
@@ -65,6 +65,28 @@ static int is_current_worktree(struct worktree *wt)
return is_current;
}
+/*
+* When in a secondary worktree, and when extensions.worktreeConfig
+* is true, only $commondir/config and $commondir/worktrees/<id>/
+* config.worktree are consulted, hence any core.bare=true setting in
+* $commondir/config.worktree gets overlooked. Thus, check it manually
+* to determine if the repository is bare.
+*/
+static int is_main_worktree_bare(struct repository *repo)
+{
+ int bare = 0;
+ struct config_set cs = {0};
+ char *worktree_config = xstrfmt("%s/config.worktree", repo_get_common_dir(repo));
+
+ git_configset_init(&cs);
+ git_configset_add_file(&cs, worktree_config);
+ git_configset_get_bool(&cs, "core.bare", &bare);
+
+ git_configset_clear(&cs);
+ free(worktree_config);
+ return bare;
+}
+
/**
* get the main worktree
*/
@@ -79,16 +101,17 @@ static struct worktree *get_main_worktree(int skip_reading_head)
CALLOC_ARRAY(worktree, 1);
worktree->repo = the_repository;
worktree->path = strbuf_detach(&worktree_path, NULL);
- /*
- * NEEDSWORK: If this function is called from a secondary worktree and
- * config.worktree is present, is_bare_repository_cfg will reflect the
- * contents of config.worktree, not the contents of the main worktree.
- * This means that worktree->is_bare may be set to 0 even if the main
- * worktree is configured to be bare.
- */
- worktree->is_bare = (is_bare_repository_cfg == 1) ||
- is_bare_repository();
worktree->is_current = is_current_worktree(worktree);
+ worktree->is_bare = (is_bare_repository_cfg == 1) ||
+ is_bare_repository() ||
+ /*
+ * When in a secondary worktree we have to also verify if the main
+ * worktree is bare in $commondir/config.worktree.
+ * This check is unnecessary if we're currently in the main worktree,
+ * as prior checks already consulted all configs of the current worktree.
+ */
+ (!worktree->is_current && is_main_worktree_bare(the_repository));
+
if (!skip_reading_head)
add_head_info(worktree);
return worktree;
diff --git a/wrapper.c b/wrapper.c
index fa79fd6ec9..8b98593149 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -479,7 +479,7 @@ int git_mkstemps_mode(char *pattern, int suffix_len, int mode)
for (count = 0; count < TMP_MAX; ++count) {
int i;
uint64_t v;
- if (csprng_bytes(&v, sizeof(v)) < 0)
+ if (csprng_bytes(&v, sizeof(v), 0) < 0)
return error_errno("unable to get random bytes for temporary file");
/* Fill in the random bits. */
@@ -750,7 +750,7 @@ int open_nofollow(const char *path, int flags)
#endif
}
-int csprng_bytes(void *buf, size_t len)
+int csprng_bytes(void *buf, size_t len, MAYBE_UNUSED unsigned flags)
{
#if defined(HAVE_ARC4RANDOM) || defined(HAVE_ARC4RANDOM_LIBBSD)
/* This function never returns an error. */
@@ -785,14 +785,18 @@ int csprng_bytes(void *buf, size_t len)
return -1;
return 0;
#elif defined(HAVE_OPENSSL_CSPRNG)
- int res = RAND_bytes(buf, len);
- if (res == 1)
+ switch (RAND_pseudo_bytes(buf, len)) {
+ case 1:
return 0;
- if (res == -1)
- errno = ENOTSUP;
- else
+ case 0:
+ if (flags & CSPRNG_BYTES_INSECURE)
+ return 0;
errno = EIO;
- return -1;
+ return -1;
+ default:
+ errno = ENOTSUP;
+ return -1;
+ }
#else
ssize_t res;
char *p = buf;
@@ -816,11 +820,11 @@ int csprng_bytes(void *buf, size_t len)
#endif
}
-uint32_t git_rand(void)
+uint32_t git_rand(unsigned flags)
{
uint32_t result;
- if (csprng_bytes(&result, sizeof(result)) < 0)
+ if (csprng_bytes(&result, sizeof(result), flags) < 0)
die(_("unable to get random bytes"));
return result;
diff --git a/wrapper.h b/wrapper.h
index a6b3e1f09e..7df824e34a 100644
--- a/wrapper.h
+++ b/wrapper.h
@@ -127,18 +127,26 @@ int open_nofollow(const char *path, int flags);
void sleep_millisec(int millisec);
+enum {
+ /*
+ * Accept insecure bytes, which some CSPRNG implementations may return
+ * in case the entropy pool has been exhausted.
+ */
+ CSPRNG_BYTES_INSECURE = (1 << 0),
+};
+
/*
* Generate len bytes from the system cryptographically secure PRNG.
* Returns 0 on success and -1 on error, setting errno. The inability to
- * satisfy the full request is an error.
+ * satisfy the full request is an error. Accepts CSPRNG flags.
*/
-int csprng_bytes(void *buf, size_t len);
+int csprng_bytes(void *buf, size_t len, unsigned flags);
/*
* Returns a random uint32_t, uniformly distributed across all possible
- * values.
+ * values. Accepts CSPRNG flags.
*/
-uint32_t git_rand(void);
+uint32_t git_rand(unsigned flags);
/* Provide log2 of the given `size_t`. */
static inline unsigned log2u(uintmax_t sz)
diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c
index 4685ba6137..8889b8b62a 100644
--- a/xdiff/xdiffi.c
+++ b/xdiff/xdiffi.c
@@ -19,7 +19,6 @@
* Davide Libenzi <davidel@xmailserver.org>
*
*/
-#define DISABLE_SIGN_COMPARE_WARNINGS
#include "xinclude.h"
@@ -1014,7 +1013,7 @@ static void xdl_mark_ignorable_lines(xdchange_t *xscr, xdfenv_t *xe, long flags)
static int record_matches_regex(xrecord_t *rec, xpparam_t const *xpp) {
regmatch_t regmatch;
- int i;
+ size_t i;
for (i = 0; i < xpp->ignore_regex_nr; i++)
if (!regexec_buf(xpp->ignore_regex[i], rec->ptr, rec->size, 1,
diff --git a/xdiff/xemit.c b/xdiff/xemit.c
index 75f0fe4986..f8e3f25b03 100644
--- a/xdiff/xemit.c
+++ b/xdiff/xemit.c
@@ -54,7 +54,7 @@ xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
xdchange_t *xch, *xchp, *lxch;
long max_common = 2 * xecfg->ctxlen + xecfg->interhunkctxlen;
long max_ignorable = xecfg->ctxlen;
- unsigned long ignored = 0; /* number of ignored blank lines */
+ long ignored = 0; /* number of ignored blank lines */
/* remove ignorable changes that are too far before other changes */
for (xchp = *xscr; xchp && xchp->ignore; xchp = xchp->next) {
diff --git a/xdiff/xhistogram.c b/xdiff/xhistogram.c
index 16a8fe2f3f..040d81e0bc 100644
--- a/xdiff/xhistogram.c
+++ b/xdiff/xhistogram.c
@@ -106,7 +106,7 @@ static int scanA(struct histindex *index, int line1, int count1)
unsigned int chain_len;
struct record **rec_chain, *rec;
- for (ptr = LINE_END(1); line1 <= ptr; ptr--) {
+ for (ptr = LINE_END(1); (unsigned int)line1 <= ptr; ptr--) {
tbl_idx = TABLE_HASH(index, 1, ptr);
rec_chain = index->records + tbl_idx;
rec = *rec_chain;
@@ -181,14 +181,14 @@ static int try_lcs(struct histindex *index, struct region *lcs, int b_ptr,
be = bs;
rc = rec->cnt;
- while (line1 < as && line2 < bs
+ while ((unsigned int)line1 < as && (unsigned int)line2 < bs
&& CMP(index, 1, as - 1, 2, bs - 1)) {
as--;
bs--;
if (1 < rc)
rc = XDL_MIN(rc, CNT(index, as));
}
- while (ae < LINE_END(1) && be < LINE_END(2)
+ while (ae < (unsigned int)LINE_END(1) && be < (unsigned int)LINE_END(2)
&& CMP(index, 1, ae + 1, 2, be + 1)) {
ae++;
be++;
@@ -313,7 +313,7 @@ redo:
if (count1 <= 0 && count2 <= 0)
return 0;
- if (LINE_END(1) >= MAX_PTR)
+ if ((unsigned int)LINE_END(1) >= MAX_PTR)
return -1;
if (!count1) {
diff --git a/xdiff/xinclude.h b/xdiff/xinclude.h
index 7e56542526..a4285ac0eb 100644
--- a/xdiff/xinclude.h
+++ b/xdiff/xinclude.h
@@ -23,8 +23,6 @@
#if !defined(XINCLUDE_H)
#define XINCLUDE_H
-#define DISABLE_SIGN_COMPARE_WARNINGS
-
#include "git-compat-util.h"
#include "xmacros.h"
#include "xdiff.h"
diff --git a/xdiff/xpatience.c b/xdiff/xpatience.c
index a2d8955537..82f663004e 100644
--- a/xdiff/xpatience.c
+++ b/xdiff/xpatience.c
@@ -19,6 +19,7 @@
* Davide Libenzi <davidel@xmailserver.org>
*
*/
+
#include "xinclude.h"
/*
@@ -75,7 +76,7 @@ struct hashmap {
static int is_anchor(xpparam_t const *xpp, const char *line)
{
- int i;
+ size_t i;
for (i = 0; i < xpp->anchors_nr; i++) {
if (!strncmp(line, xpp->anchors[i], strlen(xpp->anchors[i])))
return 1;
diff --git a/xdiff/xutils.c b/xdiff/xutils.c
index 9e36f24875..444a108f87 100644
--- a/xdiff/xutils.c
+++ b/xdiff/xutils.c
@@ -375,7 +375,7 @@ static int xdl_format_hunk_hdr(long s1, long c1, long s2, long c2,
nb += 3;
if (func && funclen) {
buf[nb++] = ' ';
- if (funclen > sizeof(buf) - nb - 1)
+ if ((size_t)funclen > sizeof(buf) - nb - 1)
funclen = sizeof(buf) - nb - 1;
memcpy(buf + nb, func, funclen);
nb += funclen;
@@ -437,7 +437,7 @@ void* xdl_alloc_grow_helper(void *p, long nr, long *alloc, size_t size)
{
void *tmp = NULL;
size_t n = ((LONG_MAX - 16) / 2 >= *alloc) ? 2 * *alloc + 16 : LONG_MAX;
- if (nr > n)
+ if ((size_t)nr > n)
n = nr;
if (SIZE_MAX / size >= n)
tmp = xdl_realloc(p, n * size);