Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.gentoo.dev > #70465
| From | Michał Górny <mgorny@gentoo.org> |
|---|---|
| Newsgroups | linux.gentoo.dev |
| Subject | [gentoo-dev] [PATCH] git-r3.eclass: Add support for sha256 objects |
| Date | 2026-04-26 18:50 +0200 |
| Message-ID | <MOaQa-AvT-11@gated-at.bofh.it> (permalink) |
| Organization | linux.* mail to news gateway |
Add support for remote repositories using sha256 objects. When fetching
a new repository, use ls-remote to check if the remote hashes look like
sha1 or sha256, and init the bare repository accordingly. Similarly,
look at the checked out commit id to init the checkout repo.
This doesn't handle upstream migrating from sha1 to sha256 in place
gracefully. Instead, whenever 'git fetch' fails, the eclass hints that
the local clone may need to be removed.
Note that sha256 support is experimental upstream and does not come with
any backwards compatibility support. Upstream indicates that adding
said support may break compatibility with prior sha256 deployments.
Closes: https://bugs.gentoo.org/973239
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/git-r3.eclass | 45 ++++++++++++++++++++++++++++++++++++++++----
1 file changed, 41 insertions(+), 4 deletions(-)
diff --git a/eclass/git-r3.eclass b/eclass/git-r3.eclass
index 719e2eea4fb04..99f846b237b41 100644
--- a/eclass/git-r3.eclass
+++ b/eclass/git-r3.eclass
@@ -322,6 +322,27 @@ _git-r3_env_setup() {
fi
}
+# @FUNCTION: _git-r3_get_object_format
+# @USAGE: <hash>
+# @INTERNAL
+# @DESCRIPTION:
+# Determine the object format from hash. Prints "sha1" or "sha256".
+_git-r3_get_object_format() {
+ local h=${1}
+
+ case "${#h}" in
+ 40)
+ echo sha1
+ ;;
+ 64)
+ echo sha256
+ ;;
+ *)
+ die "Unrecognized hash: ${h}"
+ ;;
+ esac
+}
+
# @FUNCTION: _git-r3_set_gitdir
# @USAGE: <repo-uri>
# @INTERNAL
@@ -334,7 +355,8 @@ _git-r3_env_setup() {
_git-r3_set_gitdir() {
debug-print-function ${FUNCNAME} "$@"
- local repo_name=${1#*://*/}
+ local repo_uri=${1}
+ local repo_name=${repo_uri#*://*/}
# strip the trailing slash
repo_name=${repo_name%/}
@@ -391,7 +413,13 @@ _git-r3_set_gitdir() {
umask "${EVCS_UMASK}" || die "Bad options to umask: ${EVCS_UMASK}"
fi
mkdir "${GIT_DIR}" || die
- git init --bare -b __init__ || die
+
+ # determine the remote object format
+ local head_ref=(
+ $(git ls-remote "${repo_uri}" "HEAD" || die)
+ )
+ local object_format=$(_git-r3_get_object_format "${head_ref[0]}")
+ git init --object-format="${object_format}" --bare -b __init__ || die
if [[ ${saved_umask} ]]; then
umask "${saved_umask}" || die
fi
@@ -850,7 +878,15 @@ git-r3_fetch() {
if [[ ${saved_umask} ]]; then
umask "${saved_umask}" || die
fi
- [[ ${success} ]] || die "Unable to fetch from any of EGIT_REPO_URI"
+ if [[ ! ${success} ]]; then
+ eerror "Fetching git repository failed. Please inspect the log for errors."
+ eerror "If you see 'mismatched algorithm' errors, please remove the local clone"
+ eerror "and try again:"
+ eerror " rm -r ${GIT_DIR}"
+ eerror
+
+ die "Unable to fetch from any of EGIT_REPO_URI"
+ fi
# submodules can reference commits in any branch
# always use the 'mirror' mode to accommodate that, bug #503332
@@ -958,7 +994,8 @@ git-r3_checkout() {
# use git init+fetch instead of clone since the latter doesn't like
# non-empty directories.
- git init --quiet -b __init__ || die
+ local object_format=$(_git-r3_get_object_format "${new_commit_id}")
+ git init --object-format="${object_format}" --quiet -b __init__ || die
if [[ ${EGIT_LFS} ]]; then
# The "skip-repo" flag will just skip the installation of the pre-push hooks.
# We don't use these hook as we don't do any pushes
Back to linux.gentoo.dev | Previous | Next | Find similar
[gentoo-dev] [PATCH] git-r3.eclass: Add support for sha256 objects Michał Górny <mgorny@gentoo.org> - 2026-04-26 18:50 +0200
csiph-web