Skip to content

refs: honor REFSPEC_SHORTHAND for multi-segment refs#7148

Merged
ethomson merged 1 commit into
libgit2:mainfrom
roberth:refs-shorthand-multi-segment
Dec 20, 2025
Merged

refs: honor REFSPEC_SHORTHAND for multi-segment refs#7148
ethomson merged 1 commit into
libgit2:mainfrom
roberth:refs-shorthand-multi-segment

Conversation

@roberth
Copy link
Copy Markdown
Contributor

@roberth roberth commented Oct 15, 2025

GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND is documented to "interpret the name as part of a refspec in shorthand form so the ONELEVEL naming rules aren't enforced and 'master' becomes a valid name."

However, the multi-segment pseudoref check was not respecting this flag, rejecting valid refspecs like "A/b" and "HEAD/feature" even when SHORTHAND was set.

The single-segment check at line 1015 already honors this flag. This change makes the multi-segment check at line 1021 consistent with that behavior and with the documented intent.

Git itself accepts these refspec patterns without issue.

In Nix we've applied a workaround instead (NixOS/nix#14253) but this still seems to be a problem in libgit2.

GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND is documented to "interpret the
name as part of a refspec in shorthand form so the ONELEVEL naming rules
aren't enforced and 'master' becomes a valid name."

However, the multi-segment pseudoref check was not respecting this flag,
rejecting valid refspecs like "A/b" and "HEAD/feature" even when
SHORTHAND was set.

The single-segment check at line 1015 already honors this flag. This
change makes the multi-segment check at line 1021 consistent with that
behavior and with the documented intent.

Git itself accepts these refspec patterns without issue.
@ethomson
Copy link
Copy Markdown
Member

Thanks for the explanation and the fix - this makes sense to me!

@ethomson ethomson merged commit 3ac4c0a into libgit2:main Dec 20, 2025
19 checks passed
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request May 5, 2026
v1.9.3

This release includes a number of bugfixes and compatibility
improvements, particularly around SHA256 support.

* cmake: fix linker error when using ninja build generator by
  @kcsaul in libgit2/libgit2#7249
* Handle redirects with Content-Length: 0 correctly by
  @ethomson in libgit2/libgit2#7246
* ci: use poxygit v0.8.1 in the tests by @ethomson in
  libgit2/libgit2#7248
* Zero indexer stats in pack objects by @ethomson in
  libgit2/libgit2#7243
* submodule: git_index_add_bypath does not move conflict entries
  to REUC by @lrm29 in libgit2/libgit2#7003
* fix: prevent SSH timeout infinite loop and enable TCP keepalive
  by @ambv in libgit2/libgit2#7165
* merge_files: avoid UB in xdiff by @ethomson in
  libgit2/libgit2#7239
* git_merge_file_from_index: handle cases when a child (ours or
  theirs) is null by @eantoranz in
  libgit2/libgit2#7092
* cmake: write git.h.tmp to current binary directory by @kcsaul in
  libgit2/libgit2#7241
* fix(pack): ensure pack_backend__read returns null terminated buffer
  by @kanru in libgit2/libgit2#7238
* Check object lengths against headers in read_loose by @howtonotwin
  in libgit2/libgit2#7178
* cmake: don't recreate git2.h unnecessarily by @ethomson in
  libgit2/libgit2#7234
* Memory Backend Corruption Fix by @kcsaul in
  libgit2/libgit2#7232
* Fixed a heap-buffer-overflow in the smart_pkt.c:set_data function
  by @oliverchang in libgit2/libgit2#7118
* fix(transport): get oid_type on local transport by @weihanglo in
  libgit2/libgit2#7229
* `GIT_REMOTE_DOWNLOAD_TAGS_ALL`: remove stray "the" in docs by
  @DanielEScherzer in libgit2/libgit2#7228
* fix(clone): propagate object format in local clone by @weihanglo in
  libgit2/libgit2#7226
* repo: Fix possible null pointer dereference by @csware in
  libgit2/libgit2#7225
* revparse: Allow `HEAD` abbreviation `@` by @KoviRobi in
  libgit2/libgit2#7218
* camke: include libssh2 in `Requires.private` in the PC file
  by @carlosmn in libgit2/libgit2#7215
* futils: fix undefined behavior in O_FSYNC fallback definition
  by @cehoffman in libgit2/libgit2#7211
* pcre: actually fix dangling-pointer warning by @ethomson in
  libgit2/libgit2#7206
* pcre: update cmake warnings for non-gcc by @ethomson in
  libgit2/libgit2#7205
* Fix some warnings with gcc by @ethomson in
  libgit2/libgit2#7203
* fix: apply insteadOf from global config for detached remotes by
  @weihanglo in libgit2/libgit2#7195
* Fix `git_index_entry` documentation by @bakersdozen123 in
  libgit2/libgit2#7192
* config: Fix potential null value passed to %s by @ethomson in
  libgit2/libgit2#7190
* index: support USE_NSEC=OFF by @ethomson in
  libgit2/libgit2#7187
* feat(remote): expose `git_remote_oid_type` by @weihanglo in
  libgit2/libgit2#7185
* fix(smart): keep caps across RPC stream resets by @weihanglo in
  libgit2/libgit2#7183
* fix wrong comment by @Murmele in
  libgit2/libgit2#7181
* fix(sha256): pass correct oid type by @weihanglo in
  libgit2/libgit2#7179
* examples: correct `git_commit_time` comment by @qaqland in
  libgit2/libgit2#7175
* tests: update to latest clar by @ethomson in
  libgit2/libgit2#7173
* delta: fix undefined behavior in hdr_sz varint parsing
  by @Oblivionsage in libgit2/libgit2#7172
* ci: Update macos-13 to macos-14 images on GitHub Actions by @ambv
  in libgit2/libgit2#7167
* ci: Fix cases of -Werror=discarded-qualifiers raised by @gcc 15.2
  by @ambv in libgit2/libgit2#7164
* Use CMAKE_INSTALL_INCLUDEDIR for libgit2package INSTALL_INTERFACE
  by @aware70 in libgit2/libgit2#7155
* Fix C4703 uninitialized pointer variable warnings by
  @ShiningMassXAcc in libgit2/libgit2#7154
* test: check the correct filesystem for case-sensitivity by @ambv
  in libgit2/libgit2#7153
* ci: update ci/docker/fedora to work with Rawhide 44 by @ambv
  in libgit2/libgit2#7152
* refs: honor REFSPEC_SHORTHAND for multi-segment refs by @roberth
  in libgit2/libgit2#7148
* config: Fix potential null value passed to %s by @orgads in
  libgit2/libgit2#7131
* Fix potential access to uninitialized variables by @orgads
  in libgit2/libgit2#7130
* refspec: Detect DEL character in is_valid_name by @xokdvium
  in libgit2/libgit2#7120
* Update documentation to clarify that cert cb is always called
  by @ehuss in libgit2/libgit2#7119
* Update `racy.c` reference by @emmanuel-ferdman in
  libgit2/libgit2#7091
* Avoid duplicate definition of git_http_auth_dummy. by
  @JohannesWilde in libgit2/libgit2#7077
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request May 13, 2026
v1.9.3

This release includes a number of bugfixes and compatibility
improvements, particularly around SHA256 support.

* cmake: fix linker error when using ninja build generator by
  @kcsaul in libgit2/libgit2#7249
* Handle redirects with Content-Length: 0 correctly by
  @ethomson in libgit2/libgit2#7246
* ci: use poxygit v0.8.1 in the tests by @ethomson in
  libgit2/libgit2#7248
* Zero indexer stats in pack objects by @ethomson in
  libgit2/libgit2#7243
* submodule: git_index_add_bypath does not move conflict entries
  to REUC by @lrm29 in libgit2/libgit2#7003
* fix: prevent SSH timeout infinite loop and enable TCP keepalive
  by @ambv in libgit2/libgit2#7165
* merge_files: avoid UB in xdiff by @ethomson in
  libgit2/libgit2#7239
* git_merge_file_from_index: handle cases when a child (ours or
  theirs) is null by @eantoranz in
  libgit2/libgit2#7092
* cmake: write git.h.tmp to current binary directory by @kcsaul in
  libgit2/libgit2#7241
* fix(pack): ensure pack_backend__read returns null terminated buffer
  by @kanru in libgit2/libgit2#7238
* Check object lengths against headers in read_loose by @howtonotwin
  in libgit2/libgit2#7178
* cmake: don't recreate git2.h unnecessarily by @ethomson in
  libgit2/libgit2#7234
* Memory Backend Corruption Fix by @kcsaul in
  libgit2/libgit2#7232
* Fixed a heap-buffer-overflow in the smart_pkt.c:set_data function
  by @oliverchang in libgit2/libgit2#7118
* fix(transport): get oid_type on local transport by @weihanglo in
  libgit2/libgit2#7229
* `GIT_REMOTE_DOWNLOAD_TAGS_ALL`: remove stray "the" in docs by
  @DanielEScherzer in libgit2/libgit2#7228
* fix(clone): propagate object format in local clone by @weihanglo in
  libgit2/libgit2#7226
* repo: Fix possible null pointer dereference by @csware in
  libgit2/libgit2#7225
* revparse: Allow `HEAD` abbreviation `@` by @KoviRobi in
  libgit2/libgit2#7218
* camke: include libssh2 in `Requires.private` in the PC file
  by @carlosmn in libgit2/libgit2#7215
* futils: fix undefined behavior in O_FSYNC fallback definition
  by @cehoffman in libgit2/libgit2#7211
* pcre: actually fix dangling-pointer warning by @ethomson in
  libgit2/libgit2#7206
* pcre: update cmake warnings for non-gcc by @ethomson in
  libgit2/libgit2#7205
* Fix some warnings with gcc by @ethomson in
  libgit2/libgit2#7203
* fix: apply insteadOf from global config for detached remotes by
  @weihanglo in libgit2/libgit2#7195
* Fix `git_index_entry` documentation by @bakersdozen123 in
  libgit2/libgit2#7192
* config: Fix potential null value passed to %s by @ethomson in
  libgit2/libgit2#7190
* index: support USE_NSEC=OFF by @ethomson in
  libgit2/libgit2#7187
* feat(remote): expose `git_remote_oid_type` by @weihanglo in
  libgit2/libgit2#7185
* fix(smart): keep caps across RPC stream resets by @weihanglo in
  libgit2/libgit2#7183
* fix wrong comment by @Murmele in
  libgit2/libgit2#7181
* fix(sha256): pass correct oid type by @weihanglo in
  libgit2/libgit2#7179
* examples: correct `git_commit_time` comment by @qaqland in
  libgit2/libgit2#7175
* tests: update to latest clar by @ethomson in
  libgit2/libgit2#7173
* delta: fix undefined behavior in hdr_sz varint parsing
  by @Oblivionsage in libgit2/libgit2#7172
* ci: Update macos-13 to macos-14 images on GitHub Actions by @ambv
  in libgit2/libgit2#7167
* ci: Fix cases of -Werror=discarded-qualifiers raised by @gcc 15.2
  by @ambv in libgit2/libgit2#7164
* Use CMAKE_INSTALL_INCLUDEDIR for libgit2package INSTALL_INTERFACE
  by @aware70 in libgit2/libgit2#7155
* Fix C4703 uninitialized pointer variable warnings by
  @ShiningMassXAcc in libgit2/libgit2#7154
* test: check the correct filesystem for case-sensitivity by @ambv
  in libgit2/libgit2#7153
* ci: update ci/docker/fedora to work with Rawhide 44 by @ambv
  in libgit2/libgit2#7152
* refs: honor REFSPEC_SHORTHAND for multi-segment refs by @roberth
  in libgit2/libgit2#7148
* config: Fix potential null value passed to %s by @orgads in
  libgit2/libgit2#7131
* Fix potential access to uninitialized variables by @orgads
  in libgit2/libgit2#7130
* refspec: Detect DEL character in is_valid_name by @xokdvium
  in libgit2/libgit2#7120
* Update documentation to clarify that cert cb is always called
  by @ehuss in libgit2/libgit2#7119
* Update `racy.c` reference by @emmanuel-ferdman in
  libgit2/libgit2#7091
* Avoid duplicate definition of git_http_auth_dummy. by
  @JohannesWilde in libgit2/libgit2#7077
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request May 21, 2026
v1.9.3

This release includes a number of bugfixes and compatibility
improvements, particularly around SHA256 support.

* cmake: fix linker error when using ninja build generator by
  @kcsaul in libgit2/libgit2#7249
* Handle redirects with Content-Length: 0 correctly by
  @ethomson in libgit2/libgit2#7246
* ci: use poxygit v0.8.1 in the tests by @ethomson in
  libgit2/libgit2#7248
* Zero indexer stats in pack objects by @ethomson in
  libgit2/libgit2#7243
* submodule: git_index_add_bypath does not move conflict entries
  to REUC by @lrm29 in libgit2/libgit2#7003
* fix: prevent SSH timeout infinite loop and enable TCP keepalive
  by @ambv in libgit2/libgit2#7165
* merge_files: avoid UB in xdiff by @ethomson in
  libgit2/libgit2#7239
* git_merge_file_from_index: handle cases when a child (ours or
  theirs) is null by @eantoranz in
  libgit2/libgit2#7092
* cmake: write git.h.tmp to current binary directory by @kcsaul in
  libgit2/libgit2#7241
* fix(pack): ensure pack_backend__read returns null terminated buffer
  by @kanru in libgit2/libgit2#7238
* Check object lengths against headers in read_loose by @howtonotwin
  in libgit2/libgit2#7178
* cmake: don't recreate git2.h unnecessarily by @ethomson in
  libgit2/libgit2#7234
* Memory Backend Corruption Fix by @kcsaul in
  libgit2/libgit2#7232
* Fixed a heap-buffer-overflow in the smart_pkt.c:set_data function
  by @oliverchang in libgit2/libgit2#7118
* fix(transport): get oid_type on local transport by @weihanglo in
  libgit2/libgit2#7229
* `GIT_REMOTE_DOWNLOAD_TAGS_ALL`: remove stray "the" in docs by
  @DanielEScherzer in libgit2/libgit2#7228
* fix(clone): propagate object format in local clone by @weihanglo in
  libgit2/libgit2#7226
* repo: Fix possible null pointer dereference by @csware in
  libgit2/libgit2#7225
* revparse: Allow `HEAD` abbreviation `@` by @KoviRobi in
  libgit2/libgit2#7218
* camke: include libssh2 in `Requires.private` in the PC file
  by @carlosmn in libgit2/libgit2#7215
* futils: fix undefined behavior in O_FSYNC fallback definition
  by @cehoffman in libgit2/libgit2#7211
* pcre: actually fix dangling-pointer warning by @ethomson in
  libgit2/libgit2#7206
* pcre: update cmake warnings for non-gcc by @ethomson in
  libgit2/libgit2#7205
* Fix some warnings with gcc by @ethomson in
  libgit2/libgit2#7203
* fix: apply insteadOf from global config for detached remotes by
  @weihanglo in libgit2/libgit2#7195
* Fix `git_index_entry` documentation by @bakersdozen123 in
  libgit2/libgit2#7192
* config: Fix potential null value passed to %s by @ethomson in
  libgit2/libgit2#7190
* index: support USE_NSEC=OFF by @ethomson in
  libgit2/libgit2#7187
* feat(remote): expose `git_remote_oid_type` by @weihanglo in
  libgit2/libgit2#7185
* fix(smart): keep caps across RPC stream resets by @weihanglo in
  libgit2/libgit2#7183
* fix wrong comment by @Murmele in
  libgit2/libgit2#7181
* fix(sha256): pass correct oid type by @weihanglo in
  libgit2/libgit2#7179
* examples: correct `git_commit_time` comment by @qaqland in
  libgit2/libgit2#7175
* tests: update to latest clar by @ethomson in
  libgit2/libgit2#7173
* delta: fix undefined behavior in hdr_sz varint parsing
  by @Oblivionsage in libgit2/libgit2#7172
* ci: Update macos-13 to macos-14 images on GitHub Actions by @ambv
  in libgit2/libgit2#7167
* ci: Fix cases of -Werror=discarded-qualifiers raised by @gcc 15.2
  by @ambv in libgit2/libgit2#7164
* Use CMAKE_INSTALL_INCLUDEDIR for libgit2package INSTALL_INTERFACE
  by @aware70 in libgit2/libgit2#7155
* Fix C4703 uninitialized pointer variable warnings by
  @ShiningMassXAcc in libgit2/libgit2#7154
* test: check the correct filesystem for case-sensitivity by @ambv
  in libgit2/libgit2#7153
* ci: update ci/docker/fedora to work with Rawhide 44 by @ambv
  in libgit2/libgit2#7152
* refs: honor REFSPEC_SHORTHAND for multi-segment refs by @roberth
  in libgit2/libgit2#7148
* config: Fix potential null value passed to %s by @orgads in
  libgit2/libgit2#7131
* Fix potential access to uninitialized variables by @orgads
  in libgit2/libgit2#7130
* refspec: Detect DEL character in is_valid_name by @xokdvium
  in libgit2/libgit2#7120
* Update documentation to clarify that cert cb is always called
  by @ehuss in libgit2/libgit2#7119
* Update `racy.c` reference by @emmanuel-ferdman in
  libgit2/libgit2#7091
* Avoid duplicate definition of git_http_auth_dummy. by
  @JohannesWilde in libgit2/libgit2#7077
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants