From 61bfe16c0b5c5b26080e07c235e34d451738c34f2dbb1833635d8bb6f663fd94 Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Thu, 6 Apr 2023 13:16:24 +0000 Subject: [PATCH] Accepting request 1077726 from home:adamm:branches:devel:tools:scm - sha256_clone_fix.patch: fix cloning of empty sha256 repositories OBS-URL: https://build.opensuse.org/request/show/1077726 OBS-URL: https://build.opensuse.org/package/show/devel:tools:scm/git?expand=0&rev=612 --- git.changes | 5 +++ git.spec | 1 + sha256_clone_fix.patch | 76 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 sha256_clone_fix.patch diff --git a/git.changes b/git.changes index 7b4b891..23907b6 100644 --- a/git.changes +++ b/git.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Thu Apr 6 10:51:06 UTC 2023 - Adam Majer + +- sha256_clone_fix.patch: fix cloning of empty sha256 repositories + ------------------------------------------------------------------- Mon Mar 13 20:08:03 UTC 2023 - Andreas Stieger diff --git a/git.spec b/git.spec index 4531a5a..2f07ff9 100644 --- a/git.spec +++ b/git.spec @@ -61,6 +61,7 @@ Patch4: git-prevent_xss-default.diff Patch6: git-tcsh-completion-fixes.diff Patch8: git-asciidoc.patch Patch10: setup-don-t-fail-if-commondir-reference-is-deleted.patch +Patch11: sha256_clone_fix.patch BuildRequires: fdupes BuildRequires: gpg2 BuildRequires: libcurl-devel diff --git a/sha256_clone_fix.patch b/sha256_clone_fix.patch new file mode 100644 index 0000000..332da21 --- /dev/null +++ b/sha256_clone_fix.patch @@ -0,0 +1,76 @@ +commit 8b214c2e9dda8fc5b8d49b978fd2c155b7596cd0 +Author: Junio C Hamano +Date: Wed Apr 5 14:15:33 2023 -0700 + + clone: propagate object-format when cloning from void + + A user could prepare an empty repository and set it to use SHA256 as + the object format. The new repository created by "git clone" from + such a repository however would not record that it is expecting + objects in the same SHA256 format. This works as expected if the + source repository is not empty. + + Just like we started copying the name of the primary branch from the + remote repository even if it is unborn in 3d8314f8 (clone: propagate + empty remote HEAD even with other branches, 2022-07-07), lift the + code that records the object format out of the block executed only + when cloning from an instantiated repository, so that it works also + when cloning from an empty repository. + + Signed-off-by: Junio C Hamano + +diff --git a/builtin/clone.c b/builtin/clone.c +index 462c286274..8f16d18a43 100644 +--- a/builtin/clone.c ++++ b/builtin/clone.c +@@ -910,6 +910,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) + int err = 0, complete_refs_before_fetch = 1; + int submodule_progress; + int filter_submodules = 0; ++ int hash_algo; + + struct transport_ls_refs_options transport_ls_refs_options = + TRANSPORT_LS_REFS_OPTIONS_INIT; +@@ -1298,15 +1299,15 @@ int cmd_clone(int argc, const char **argv, const char *prefix) + } + } + +- if (mapped_refs) { +- int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport)); +- + /* + * Now that we know what algorithm the remote side is using, + * let's set ours to the same thing. + */ +- initialize_repository_version(hash_algo, 1); +- repo_set_hash_algo(the_repository, hash_algo); ++ hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport)); ++ initialize_repository_version(hash_algo, 1); ++ repo_set_hash_algo(the_repository, hash_algo); ++ ++ if (mapped_refs) { + /* + * transport_get_remote_refs() may return refs with null sha-1 + * in mapped_refs (see struct transport->get_refs_list +diff --git a/t/t5702-protocol-v2.sh b/t/t5702-protocol-v2.sh +index 71aabe30b7..6af5c2062f 100755 +--- a/t/t5702-protocol-v2.sh ++++ b/t/t5702-protocol-v2.sh +@@ -269,6 +269,17 @@ test_expect_success 'clone propagates unborn HEAD from non-empty repo' ' + grep "warning: remote HEAD refers to nonexistent ref" stderr + ' + ++test_expect_success 'clone propagates object-format from empty repo' ' ++ test_when_finished "rm -fr src256 dst256" && ++ ++ echo sha256 >expect && ++ git init --object-format=sha256 src256 && ++ git clone src256 dst256 && ++ git -C dst256 rev-parse --show-object-format >actual && ++ ++ test_cmp expect actual ++' ++ + test_expect_success 'bare clone propagates unborn HEAD from non-empty repo' ' + test_when_finished "rm -rf file_unborn_parent file_unborn_child.git" && +