[ANNOUNCE] Git v2.28.0-rc0

Junio C Hamano
2020-07-09T21:40:57Z

An early preview release Git v2.28.0-rc0 is now available for
testing at the usual places. It is comprised of 284 non-merge
commits since v2.27.0, contributed by 42 people, 9 of which are
new faces.

The tarballs are found at:

https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.28.0-rc0' tag and the 'master' branch that the tag points at:

url = https://kernel.googlesource.com/pub/scm/git/git
url = git://repo.or.cz/alt-git.git
url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.27.0 are as follows.
Welcome to the Git development community!

Andrew Ng, Chris Torek, Don Goodman-Wilson, Jiuyang Xie, Luc
Van Oostenryck, Marco Trevisan (Treviño), Miroslav Koškár,
Rafael Aquini, and Srinidhi Kaushik.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

Abhishek Kumar, Ben Keene, brian m. carlson, Carlo Marcelo Arenas
Belón, Christian Couder, Denton Liu, Derrick Stolee, Đoàn
Trần Công Danh, Elijah Newren, Emily Shaffer, Eric Sunshine,
Han-Wen Nienhuys, Jacob Keller, Jeff King, Johannes Schindelin,
John Lin, Jonathan Nieder, Jonathan Tan, Josh Steadmon, Junio C
Hamano, Laurent Arnoud, Martin Ågren, Matheus Tavares, Paolo
Bonzini, Patrick Steinhardt, Ramsay Jones, Randall S. Becker,
René Scharfe, Shourya Shukla, SZEDER Gábor, Taylor Blau,
Ville Skyttä, and Xin Li.

----------------------------------------------------------------

Git 2.28 Release Notes (draft)
==============================

Updates since v2.27
-------------------

Backward compatibility notes

* "fetch.writeCommitGraph" is deemed to be still a bit too risky and
is no longer part of the "feature.experimental" set.

* It used to be that setting extensions.* configuration variables
alone, while leaving core.repositoryFormatVersion=0, made these
settings effective, which was a wrong thing to do. In version 0,
there was no special meaning in extensions.* configuration
variables. This has been corrected. If you need these repository
extensions to be effective, the core.repositoryFormatVersion
variable needs to be updated to 1 after vetting these extensions.*
variables are set correctly.

UI, Workflows & Features

* The commands in the "diff" family learned to honor "diff.relative"
configuration variable.

* The check in "git fsck" to ensure that the tree objects are sorted
still had corner cases it missed unsorted entries.

* The interface to redact sensitive information in the trace output
has been simplified.

* The command line completion (in contrib/) learned to complete
options that the "git switch" command takes.

* "git diff" used to take arguments in random and nonsense range
notation, e.g. "git diff A..B C", "git diff A..B C...D", etc.,
which has been cleaned up.

* "git diff-files" has been taught to say paths that are marked as
intent-to-add are new files, not modified from an empty blob.

* "git status" learned to report the status of sparse checkout.

* "git difftool" has trouble dealing with paths added to the index
with the intent-to-add bit.

* "git fast-export --anonymize" learned to take customized mapping to
allow its users to tweak its output more usable for debugging.

* The command line completion support (in contrib/) used to be
prepared to work with "set -u" but recent changes got a bit more
sloppy. This has been corrected.

Performance, Internal Implementation, Development Support etc.

* Code optimization for a common case.
(merge 8777616e4d an/merge-single-strategy-optim later to maint).

* We've adopted a convention that any on-stack structure can be
initialized to have zero values in all fields with "= { 0 }",
even when the first field happens to be a pointer, but sparse
complained that a null pointer should be spelled NULL for a long
time. Start using -Wno-universal-initializer option to squelch
it (the latest sparse has it on by default).

* "git log -L..." now takes advantage of the "which paths are touched
by this commit?" info stored in the commit-graph system.

* As FreeBSD is not the only platform whose regexp library reports
a REG_ILLSEQ error when fed invalid UTF-8, add logic to detect that
automatically and skip the affected tests.

* "git bugreport" learns to report what shell is in use.

* Support for GIT_CURL_VERBOSE has been rewritten in terms of
GIT_TRACE_CURL.

* Preliminary clean-ups around refs API, plus file format
specification documentation for the reftable backend.

* Workaround breakage in MSVC build, where "curl-config --cflags"
gives settings appropriate for GCC build.

* Code clean-up of "git clean" resulted in a fix of recent
performance regression.

* Code clean-up in the codepath that serves "git fetch" continues.

* "git merge-base --is-ancestor" is taught to take advantage of the
commit graph.

* Rewrite of parts of the scripted "git submodule" Porcelain command
continues; this time it is "git submodule set-branch" subcommand's
turn.

* The "fetch/clone" protocol has been updated to allow the server to
instruct the clients to grab pre-packaged packfile(s) in addition
to the packed object data coming over the wire.

* A misdesigned strbuf_write_fd() function has been retired.

* SHA-256 migration work continues, including CVS/SVN interface.

* A few fields in "struct commit" that do not have to always be
present have been moved to commit slabs.

* API cleanup for get_worktrees()

* By renumbering object flag bits, "struct object" managed to lose
bloated inter-field padding.

* The name of the primary branch in existing repositories, and the
default name used for the first branch in newly created
repositories, is made configurable, so that we can eventually wean
ourselves off of the hardcoded 'master'.

* The effort to avoid using test_must_fail on non-git command continues.

Fixes since v2.27
-----------------

* The "--prepare-p4-only" option of "git p4" is supposed to stop
after replaying one changeset, but kept going (by mistake?)

* The error message from "git checkout -b foo -t bar baz" was
confusing.

* Some repositories in the wild have commits that record nonsense
committer timezone (e.g. rails.git); "git fast-import" learned an
option to pass these nonsense timestamps intact to allow recreating
existing repositories as-is.
(merge d42a2fb72f en/fast-import-looser-date later to maint).

* The command line completion script (in contrib/) tried to complete
"git stash -p" as if it were "git stash push -p", but it was too
aggressive and also affected "git stash show -p", which has been
corrected.
(merge fffd0cf520 vs/complete-stash-show-p-fix later to maint).

* On-the-wire protocol v2 easily falls into a deadlock between the
remote-curl helper and the fetch-pack process when the server side
prematurely throws an error and disconnects. The communication has
been updated to make it more robust.

* "git checkout -p" did not handle a newly added path at all.
(merge 2c8bd8471a js/checkout-p-new-file later to maint).

* The code to parse "git bisect start" command line was lax in
validating the arguments.
(merge 4d9005ff5d cb/bisect-helper-parser-fix later to maint).

* Reduce memory usage during "diff --quiet" in a worktree with too
many stat-unmatched paths.
(merge d2d7fbe129 jk/diff-memuse-optim-with-stat-unmatch later to maint).

* The reflog entries for "git clone" and "git fetch" did not
anonymize the URL they operated on.
(merge 46da295a77 js/reflog-anonymize-for-clone-and-fetch later to maint).

* The behaviour of "sparse-checkout" in the state "git clone
--no-checkout" left was changed accidentally in 2.27, which has
been corrected.

* Use of negative pathspec, while collecting paths including
untracked ones in the working tree, was broken.

* The same worktree directory must be registered only once, but
"git worktree move" allowed this invariant to be violated, which
has been corrected.
(merge 810382ed37 es/worktree-duplicate-paths later to maint).

* The effect of sparse checkout settings on submodules is documented.
(merge e7d7c73249 en/sparse-with-submodule-doc later to maint).

* Code clean-up around "git branch" with a minor bugfix.
(merge dc44639904 dl/branch-cleanup later to maint).

* A branch name used in a test has been clarified to match what is
going on.
(merge 08dc26061f pb/t4014-unslave later to maint).

* An in-code comment in "git diff" has been updated.
(merge c592fd4c83 dl/diff-usage-comment-update later to maint).

* The documentation and some tests have been adjusted for the recent
renaming of "pu" branch to "seen".
(merge 6dca5dbf93 js/pu-to-seen later to maint).

* The code to push changes over "dumb" HTTP had a bad interaction
with the commit reachability code due to incorrect allocation of
object flag bits, which has been corrected.
(merge 64472d15e9 bc/http-push-flagsfix later to maint).

* "git send-email --in-reply-to=<msg>" did not use the In-Reply-To:
header with the value given from the command line, and let it be
overridden by the value on In-Reply-To: header in the messages
being sent out (if exists).
(merge f9f60d7066 ra/send-email-in-reply-to-from-command-line-wins later to maint).

* "git log -Lx,y:path --before=date" lost track of where the range
should be because it didn't take the changes made by the youngest
commits that are omitted from the output into account.

* When "fetch.writeCommitGraph" configuration is set in a shallow
repository and a fetch moves the shallow boundary, we wrote out
broken commit-graph files that do not match the reality, which has
been corrected.

* "git checkout" failed to catch an error from fstat() after updating
a path in the working tree.
(merge 35e6e212fd mt/entry-fstat-fallback-fix later to maint).

* Other code cleanup, docfix, build fix, etc.
(merge 2c31a7aa44 jx/pkt-line-doc-count-fix later to maint).
(merge d63ae31962 cb/t5608-cleanup later to maint).
(merge 788db145c7 dl/t-readme-spell-git-correctly later to maint).
(merge 45a87a83bb dl/python-2.7-is-the-floor-version later to maint).
(merge b75a219904 es/advertise-contribution-doc later to maint).
(merge 0c9a4f638a rs/pull-leakfix later to maint).
(merge d546fe2874 rs/commit-reach-leakfix later to maint).
(merge 087bf5409c mk/pb-pretty-email-without-domain-part-fix later to maint).
(merge 5f4ee57ad9 es/worktree-code-cleanup later to maint).
(merge 0172f7834a cc/cat-file-usage-update later to maint).
(merge 81de0c01cf ma/rebase-doc-typofix later to maint).

----------------------------------------------------------------

Changes since v2.27.0 are as follows:

Abhishek Kumar (4):
object: drop parsed_object_pool->commit_count
commit-graph: introduce commit_graph_data_slab
commit: move members graph_pos, generation to a slab
commit-graph: minimize commit_graph_data_slab access

Andrew Ng (1):
merge: optimization to skip evaluate_result for single strategy

Ben Keene (1):
git-p4.py: fix --prepare-p4-only error with multiple commits

Carlo Marcelo Arenas Belón (5):
t/helper: teach test-regex to report pattern errors (like REG_ILLSEQ)
t4210: detect REG_ILLSEQ dynamically and skip affected tests
bisect--helper: avoid segfault with bad syntax in `start --term-*`
t5608: avoid say() and use "skip_all" instead for consistency
commit-reach: avoid is_descendant_of() shim

Chris Torek (3):
t/t3430: avoid undefined git diff behavior
git diff: improve range handling
Documentation: usage for diff combined commits

Christian Couder (40):
upload-pack: remove unused 'wants' from upload_pack_data
upload-pack: move {want,have}_obj to upload_pack_data
upload-pack: move 'struct upload_pack_data' around
upload-pack: use 'struct upload_pack_data' in upload_pack()
upload-pack: pass upload_pack_data to get_common_commits()
upload-pack: pass upload_pack_data to receive_needs()
upload-pack: use upload_pack_data writer in receive_needs()
upload-pack: move symref to upload_pack_data
upload-pack: pass upload_pack_data to send_ref()
upload-pack: pass upload_pack_data to check_non_tip()
upload-pack: remove static variable 'stateless_rpc'
upload-pack: pass upload_pack_data to create_pack_file()
upload-pack: use upload_pack_data fields in receive_needs()
upload-pack: annotate upload_pack_data fields
upload-pack: move static vars to upload_pack_data
upload-pack: move use_sideband to upload_pack_data
upload-pack: move filter_capability_requested to upload_pack_data
upload-pack: move multi_ack to upload_pack_data
upload-pack: change multi_ack to an enum
upload-pack: pass upload_pack_data to upload_pack_config()
upload-pack: move keepalive to upload_pack_data
upload-pack: move allow_filter to upload_pack_data
upload-pack: move allow_ref_in_want to upload_pack_data
upload-pack: move allow_sideband_all to upload_pack_data
upload-pack: move pack_objects_hook to upload_pack_data
upload-pack: pass upload_pack_data to send_shallow_list()
upload-pack: pass upload_pack_data to deepen()
upload-pack: pass upload_pack_data to deepen_by_rev_list()
upload-pack: pass upload_pack_data to send_unshallow()
upload-pack: move shallow_nr to upload_pack_data
upload-pack: move extra_edge_obj to upload_pack_data
upload-pack: move allow_unadvertised_object_request to upload_pack_data
upload-pack: change allow_unadvertised_object_request to an enum
upload-pack: pass upload_pack_data to process_haves()
upload-pack: pass upload_pack_data to send_acks()
upload-pack: pass upload_pack_data to ok_to_give_up()
upload-pack: pass upload_pack_data to got_oid()
upload-pack: move oldest_have to upload_pack_data
upload-pack: refactor common code into do_got_oid()
cat-file: add missing [=<format>] to usage/synopsis

Denton Liu (18):
lib-submodule-update: add space after function name
lib-submodule-update: consolidate --recurse-submodules
remote-curl: fix typo
remote-curl: remove label indentation
transport: extract common fetch_pack() call
pkt-line: extern packet_length()
remote-curl: error on incomplete packet
pkt-line: define PACKET_READ_RESPONSE_END
stateless-connect: send response end packet
t/README: avoid poor-man's small caps GIT
CodingGuidelines: specify Python 2.7 is the oldest version
lib-submodule-update: prepend "git" to $command
t3200: rename "expected" to "expect"
t3200: test for specific errors
branch: don't mix --edit-description
builtin/diff: update usage comment
builtin/diff: fix botched update of usage comment
lib-submodule-update: pass 'test_must_fail' as an argument

Derrick Stolee (3):
line-log: integrate with changed-path Bloom filters
commit-reach: create repo_is_descendant_of()
commit-reach: use fast logic in repo_in_merge_base

Don Goodman-Wilson (1):
init: allow setting the default for the initial branch name via the config

Elijah Newren (11):
fast-import: add new --date-format=raw-permissive format
sparse-checkout: avoid staging deletions of all files
dir: fix treatment of negated pathspecs
git-sparse-checkout: clarify interactions with submodules
dir: fix a few confusing comments
dir, clean: avoid disallowed behavior
clean: consolidate handling of ignored parameters
clean: optimize and document cases where we recurse into subdirectories
wt-status: show sparse checkout status as well
git-prompt: document how in-progress operations affect the prompt
git-prompt: include sparsity state as well

Emily Shaffer (3):
help: add shell-path to --build-options
bugreport: include user interactive shell
docs: mention MyFirstContribution in more places

Eric Sunshine (10):
worktree: factor out repeated string literal
worktree: give "should be pruned?" function more meaningful name
worktree: make high-level pruning re-usable
worktree: prune duplicate entries referencing same worktree path
worktree: prune linked worktree referencing main worktree path
worktree: generalize candidate worktree path validation
worktree: make "move" refuse to move atop missing registered worktree
worktree: drop get_worktrees() special-purpose sorting option
worktree: drop get_worktrees() unused 'flags' argument
worktree: avoid dead-code in conditional

Han-Wen Nienhuys (5):
refs.h: clarify reflog iteration order
t: use update-ref and show-ref to reading/writing refs
refs: improve documentation for ref iterator
reftable: clarify how empty tables should be written
reftable: define version 2 of the spec to accomodate SHA256

Jacob Keller (16):
completion: add test showing subpar git switch completion
completion: add tests showing subpar DWIM logic for switch/checkout
completion: add tests showing subar checkout --detach logic
completion: add tests showing subpar switch/checkout --track logic
completion: add tests showing subpar -c/-C startpoint completion
completion: add tests showing subpar -c/C argument completion
completion: add tests showing subpar switch/checkout --orphan logic
completion: replace overloaded track term for __git_complete_refs
completion: extract function __git_dwim_remote_heads
completion: perform DWIM logic directly in __git_complete_refs
completion: improve handling of DWIM mode for switch/checkout
completion: improve completion for git switch with no options
completion: improve handling of --detach in checkout
completion: improve handling of --track in switch/checkout
completion: improve handling of -c/-C and -b/-B in switch/checkout
completion: improve handling of --orphan option of switch/checkout

Jeff King (14):
diff: discard blob data from stat-unmatched pairs
upload-pack: actually use some upload_pack_data bitfields
t9351: derive anonymized tree checks from original repo
fast-export: use xmemdupz() for anonymizing oids
fast-export: store anonymized oids as hex strings
fast-export: tighten anonymize_mem() interface to handle only strings
fast-export: stop storing lengths in anonymized hashmaps
fast-export: use a flex array to store anonymized entries
fast-export: move global "idents" anonymize hashmap into function
fast-export: add a "data" callback parameter to anonymize_str()
fast-export: allow seeding the anonymized mapping
fast-export: anonymize "master" refname
fast-export: use local array to store anonymized oid
diff: check for merge bases before assigning sym->base

Jiuyang Xie (1):
doc: fix wrong 4-byte length of pkt-line message

Johannes Schindelin (16):
checkout -p: handle new files correctly
clone/fetch: anonymize URLs in the reflog
msvc: fix "REG_STARTEND" issue
fmt-merge-msg: stop treating `master` specially
send-pack/transport-helper: avoid mentioning a particular branch
submodule: fall back to remote's HEAD for missing remote.<name>.branch
docs: add missing diamond brackets
init: allow specifying the initial branch name for the new repository
clone: use configured default branch name when appropriate
remote: use the configured default branch name when appropriate
testsvn: respect `init.defaultBranch`
docs: adjust for the recent rename of `pu` to `seen`
docs: adjust the technical overview for the rename `pu` -> `seen`
tests: reference `seen` wherever `pu` was referenced
diff-files --raw: show correct post-image of intent-to-add files
difftool -d: ensure that intent-to-add files are handled correctly

John Lin (1):
bash-completion: add git-prune into bash completion

Jonathan Nieder (3):
config: let feature.experimental imply protocol.version=2
reftable: file format documentation
experimental: default to fetch.writeCommitGraph=false

Jonathan Tan (12):
t5551: test that GIT_TRACE_CURL redacts password
http, imap-send: stop using CURLOPT_VERBOSE
http: redact all cookies, teach GIT_TRACE_REDACT=0
http: use --stdin when indexing dumb HTTP pack
http: refactor finish_http_pack_request()
http-fetch: refactor into function
http-fetch: support fetching packfiles by URL
Documentation: order protocol v2 sections
Documentation: add Packfile URIs design doc
upload-pack: refactor reading of pack-objects out
fetch-pack: support more than one pack lockfile
upload-pack: send part of packfile response as uri

Josh Steadmon (1):
fuzz-commit-graph: properly free graph struct

Junio C Hamano (8):
Start the post 2.27 cycle
The second batch
The third batch
The fourth batch
The fifth batch
The sixth batch
The seventh batch
Git 2.28-rc0

Laurent Arnoud (1):
diff: add config option relative

Luc Van Oostenryck (1):
sparse: allow '{ 0 }' to be used without warnings

Marco Trevisan (Treviño) (1):
completion: use native ZSH array pattern matching

Martin Ågren (1):
git-rebase.txt: fix description list separator

Matheus Tavares (1):
entry: check for fstat() errors after checkout

Miroslav Koškár (1):
doc: fix author vs. committer copy/paste error

Paolo Bonzini (1):
t4014: do not use "slave branch" nomenclature

Patrick Steinhardt (1):
refs: implement reference transaction hook

Rafael Aquini (1):
send-email: restore --in-reply-to superseding behavior

Ramsay Jones (1):
upload-pack: fix a sparse '0 as NULL pointer' warning

Randall S. Becker (2):
bugreport.c: replace strbuf_write_fd with write_in_full
strbuf: remove unreferenced strbuf_write_fd method.

René Scharfe (10):
fsck: fix a typo in a comment
t1450: increase test coverage of in-tree d/f detection
t1450: demonstrate undetected in-tree d/f conflict
fsck: detect more in-tree d/f conflicts
checkout: add tests for -b and --track
checkout: improve error messages for -b with extra argument
commit-reach: plug minor memory leak after using is_descendant_of()
pull: plug minor memory leak after using is_descendant_of()
revision: reallocate TOPO_WALK object flags
revision: disable min_age optimization with line-log

SZEDER Gábor (4):
line-log: remove unused fields from 'struct line_log_data'
t4211-line-log: add tests for parent oids
line-log: more responsive, incremental 'git log -L'
line-log: try to use generation number-based topo-ordering

Shourya Shukla (1):
submodule: port subcommand 'set-branch' from shell to C

Srinidhi Kaushik (1):
diff-files: treat "i-t-a" files as "not-in-index"

Taylor Blau (11):
commit-graph.c: extract 'refs_cb_data'
commit-graph.c: show progress of finding reachable commits
commit-graph.c: peel refs in 'add_ref_to_set'
builtin/commit-graph.c: extract 'read_one_commit()'
builtin/commit-graph.c: dereference tags in builtin
commit-graph.c: simplify 'fill_oids_from_commits'
t5318: reorder test below 'graph_read_expect'
commit-graph: drop COMMIT_GRAPH_WRITE_CHECK_OIDS flag
t5318: use 'test_must_be_empty'
t5318: test that '--stdin-commits' respects '--[no-]progress'
commit.c: don't persist substituted parents when unshallowing

Ville Skyttä (2):
completion: don't override given stash subcommand with -p
completion: nounset mode fixes

Xin Li (4):
repository: add a helper function to perform repository format upgrade
fetch: allow adding a filter after initial clone
sparse-checkout: upgrade repository to version 1 when enabling extension
check_repository_format_gently(): refuse extensions for old repositories

brian m. carlson (61):
t1050: match object ID paths in a hash-insensitive way
Documentation: document v1 protocol object-format capability
builtin/checkout: simplify metadata initialization
t2060: add a test for switch with --orphan and --discard-changes
connect: have ref processing code take struct packet_reader
wrapper: add function to compare strings with different NUL termination
remote: advertise the object-format capability on the server side
connect: add function to parse multiple v1 capability values
connect: add function to fetch value of a v2 server capability
pkt-line: add a member for hash algorithm
transport: add a hash algorithm member
connect: add function to detect supported v1 hash functions
send-pack: detect when the server doesn't support our hash
connect: make parse_feature_value extern
fetch-pack: detect when the server doesn't support our hash
connect: detect algorithm when fetching refs
builtin/receive-pack: detect when the server doesn't support our hash
docs: update remote helper docs for object-format extensions
transport-helper: implement object-format extensions
remote-curl: implement object-format extensions
builtin/clone: initialize hash algorithm properly
t5562: pass object-format in synthesized test data
fetch-pack: parse and advertise the object-format capability
setup: set the_repository's hash algo when checking format
t3200: mark assertion with SHA1 prerequisite
packfile: compute and use the index CRC offset
t5302: modernize test formatting
builtin/show-index: provide options to determine hash algo
t1302: expect repo format version 1 for SHA-256
Documentation/technical: document object-format for protocol v2
connect: pass full packet reader when parsing v2 refs
connect: parse v2 refs with correct hash algorithm
serve: advertise object-format capability for protocol v2
t5500: make hash independent
builtin/ls-remote: initialize repository based on fetch
remote-curl: detect algorithm for dumb HTTP by size
builtin/index-pack: add option to specify hash algorithm
t1050: pass algorithm to index-pack when outside repo
remote-curl: avoid truncating refs with ls-remote
t/helper: initialize the repository for test-sha1-array
t5702: offer an object-format capability in the test
t5703: use object-format serve option
t5704: send object-format capability with SHA-256
t5300: pass --object-format to git index-pack
bundle: detect hash algorithm when reading refs
remote-testgit: adapt for object-format
t9109: make test hash independent
t9168: make test hash independent
t9108: make test hash independent
t9100: make test work with SHA-256
t9104: make hash size independent
t9101: make hash independent
t/lib-git-svn: make hash size independent
perl: create and switch variables for hash constants
perl: make Git::IndexInfo work with SHA-256
perl: make SVN code hash independent
git-svn: set the OID length based on hash algorithm
git-cvsserver: port to SHA-256
git-cvsimport: port to SHA-256
git-cvsexportcommit: port to SHA-256
http-push: ensure unforced pushes fail when data would be lost

Đoàn Trần Công Danh (1):
contrib: subtree: adjust test to change in fmt-merge-msg