diff --git a/0001-fast-import-fix-over-allocation-of-marks-storage.patch b/0001-fast-import-fix-over-allocation-of-marks-storage.patch deleted file mode 100644 index eff5fb2..0000000 --- a/0001-fast-import-fix-over-allocation-of-marks-storage.patch +++ /dev/null @@ -1,221 +0,0 @@ -From 3f018ec716292b4d757385686f42f57af3bca685 Mon Sep 17 00:00:00 2001 -From: Jeff King -Date: Thu, 15 Oct 2020 11:38:49 -0400 -Subject: [PATCH] fast-import: fix over-allocation of marks storage - -Fast-import stores its marks in a trie-like structure made of mark_set -structs. Each struct has a fixed size (1024). If our id number is too -large to fit in the struct, then we allocate a new struct which shifts -the id number by 10 bits. Our original struct becomes a child node -of this new layer, and the new struct becomes the top level of the trie. - -This scheme was broken by ddddf8d7e2 (fast-import: permit reading -multiple marks files, 2020-02-22). Before then, we had a top-level -"marks" pointer, and the push-down worked by assigning the new top-level -struct to "marks". But after that commit, insert_mark() takes a pointer -to the mark_set, rather than using the global "marks". It continued to -assign to the global "marks" variable during the push down, which was -wrong for two reasons: - - - we added a call in option_rewrite_submodules() which uses a separate - mark set; pushing down on "marks" is outright wrong here. We'd - corrupt the "marks" set, and we'd fail to correctly store any - submodule mappings with an id over 1024. - - - the other callers passed "marks", but the push-down was still wrong. - In read_mark_file(), we take the pointer to the mark_set as a - parameter. So even though insert_mark() was updating the global - "marks", the local pointer we had in read_mark_file() was not - updated. As a result, we'd add a new level when needed, but then the - next call to insert_mark() wouldn't see it! It would then allocate a - new layer, which would also not be seen, and so on. Lookups for the - lost layers obviously wouldn't work, but before we even hit any - lookup stage, we'd generally run out of memory and die. - -Our tests didn't notice either of these cases because they didn't have -enough marks to trigger the push-down behavior. The new tests in t9304 -cover both cases (and fail without this patch). - -We can solve the problem by having insert_mark() take a pointer-to-pointer -of the top-level of the set. Then our push down can assign to it in a -way that the caller actually sees. Note the subtle reordering in -option_rewrite_submodules(). Our call to read_mark_file() may modify our -top-level set pointer, so we have to wait until after it returns to -assign its value into the string_list. - -Reported-by: Sergey Brester -Signed-off-by: Jeff King -Signed-off-by: Junio C Hamano ---- - builtin/fast-import.c | 31 ++++++++++++---------- - t/t9304-fast-import-marks.sh | 51 ++++++++++++++++++++++++++++++++++++ - 2 files changed, 68 insertions(+), 14 deletions(-) - create mode 100755 t/t9304-fast-import-marks.sh - -diff --git a/builtin/fast-import.c b/builtin/fast-import.c -index 1bf50a73dc359..70d7d25eed2e0 100644 ---- a/builtin/fast-import.c -+++ b/builtin/fast-import.c -@@ -150,7 +150,7 @@ struct recent_command { - char *buf; - }; - --typedef void (*mark_set_inserter_t)(struct mark_set *s, struct object_id *oid, uintmax_t mark); -+typedef void (*mark_set_inserter_t)(struct mark_set **s, struct object_id *oid, uintmax_t mark); - typedef void (*each_mark_fn_t)(uintmax_t mark, void *obj, void *cbp); - - /* Configured limits on output */ -@@ -526,13 +526,15 @@ static unsigned int hc_str(const char *s, size_t len) - return r; - } - --static void insert_mark(struct mark_set *s, uintmax_t idnum, struct object_entry *oe) -+static void insert_mark(struct mark_set **top, uintmax_t idnum, struct object_entry *oe) - { -+ struct mark_set *s = *top; -+ - while ((idnum >> s->shift) >= 1024) { - s = mem_pool_calloc(&fi_mem_pool, 1, sizeof(struct mark_set)); -- s->shift = marks->shift + 10; -- s->data.sets[0] = marks; -- marks = s; -+ s->shift = (*top)->shift + 10; -+ s->data.sets[0] = *top; -+ *top = s; - } - while (s->shift) { - uintmax_t i = idnum >> s->shift; -@@ -944,7 +946,7 @@ static int store_object( - - e = insert_object(&oid); - if (mark) -- insert_mark(marks, mark, e); -+ insert_mark(&marks, mark, e); - if (e->idx.offset) { - duplicate_count_by_type[type]++; - return 1; -@@ -1142,7 +1144,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark) - e = insert_object(&oid); - - if (mark) -- insert_mark(marks, mark, e); -+ insert_mark(&marks, mark, e); - - if (e->idx.offset) { - duplicate_count_by_type[OBJ_BLOB]++; -@@ -1717,7 +1719,7 @@ static void dump_marks(void) - } - } - --static void insert_object_entry(struct mark_set *s, struct object_id *oid, uintmax_t mark) -+static void insert_object_entry(struct mark_set **s, struct object_id *oid, uintmax_t mark) - { - struct object_entry *e; - e = find_object(oid); -@@ -1734,12 +1736,12 @@ static void insert_object_entry(struct mark_set *s, struct object_id *oid, uintm - insert_mark(s, mark, e); - } - --static void insert_oid_entry(struct mark_set *s, struct object_id *oid, uintmax_t mark) -+static void insert_oid_entry(struct mark_set **s, struct object_id *oid, uintmax_t mark) - { - insert_mark(s, mark, xmemdupz(oid, sizeof(*oid))); - } - --static void read_mark_file(struct mark_set *s, FILE *f, mark_set_inserter_t inserter) -+static void read_mark_file(struct mark_set **s, FILE *f, mark_set_inserter_t inserter) - { - char line[512]; - while (fgets(line, sizeof(line), f)) { -@@ -1772,7 +1774,7 @@ static void read_marks(void) - goto done; /* Marks file does not exist */ - else - die_errno("cannot read '%s'", import_marks_file); -- read_mark_file(marks, f, insert_object_entry); -+ read_mark_file(&marks, f, insert_object_entry); - fclose(f); - done: - import_marks_file_done = 1; -@@ -3228,7 +3230,7 @@ static void parse_alias(void) - die(_("Expected 'to' command, got %s"), command_buf.buf); - e = find_object(&b.oid); - assert(e); -- insert_mark(marks, next_mark, e); -+ insert_mark(&marks, next_mark, e); - } - - static char* make_fast_import_path(const char *path) -@@ -3321,13 +3323,14 @@ static void option_rewrite_submodules(const char *arg, struct string_list *list) - *f = '\0'; - f++; - ms = xcalloc(1, sizeof(*ms)); -- string_list_insert(list, s)->util = ms; - - fp = fopen(f, "r"); - if (!fp) - die_errno("cannot read '%s'", f); -- read_mark_file(ms, fp, insert_oid_entry); -+ read_mark_file(&ms, fp, insert_oid_entry); - fclose(fp); -+ -+ string_list_insert(list, s)->util = ms; - } - - static int parse_one_option(const char *option) -diff --git a/t/t9304-fast-import-marks.sh b/t/t9304-fast-import-marks.sh -new file mode 100755 -index 0000000000000..d4359dba21c9c ---- /dev/null -+++ b/t/t9304-fast-import-marks.sh -@@ -0,0 +1,51 @@ -+#!/bin/sh -+ -+test_description='test exotic situations with marks' -+. ./test-lib.sh -+ -+test_expect_success 'setup dump of basic history' ' -+ test_commit one && -+ git fast-export --export-marks=marks HEAD >dump -+' -+ -+test_expect_success 'setup large marks file' ' -+ # normally a marks file would have a lot of useful, unique -+ # marks. But for our purposes, just having a lot of nonsense -+ # ones is fine. Start at 1024 to avoid clashing with marks -+ # legitimately used in our tiny dump. -+ blob=$(git rev-parse HEAD:one.t) && -+ for i in $(test_seq 1024 16384) -+ do -+ echo ":$i $blob" -+ done >>marks -+' -+ -+test_expect_success 'import with large marks file' ' -+ git fast-import --import-marks=marks dump -+' -+ -+test_expect_success 'setup submodule mapping with large id' ' -+ old=$(git rev-parse HEAD:sub) && -+ new=$(echo $old | sed s/./a/g) && -+ echo ":12345 $old" >from && -+ echo ":12345 $new" >to -+' -+ -+test_expect_success 'import with submodule mapping' ' -+ git init dst && -+ git -C dst fast-import \ -+ --rewrite-submodules-from=sub:../from \ -+ --rewrite-submodules-to=sub:../to \ -+ actual && -+ echo "$new" >expect && -+ test_cmp expect actual -+' -+ -+test_done diff --git a/0001-log-diagnose-L-used-with-pathspec-as-an-error.patch b/0001-log-diagnose-L-used-with-pathspec-as-an-error.patch deleted file mode 100644 index 0f99aba..0000000 --- a/0001-log-diagnose-L-used-with-pathspec-as-an-error.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 39664cb0aca42f240468ddf84fe75df4172ab63f Mon Sep 17 00:00:00 2001 -From: Junio C Hamano -Date: Wed, 4 Nov 2020 09:54:01 -0800 -Subject: [PATCH] log: diagnose -L used with pathspec as an error - -The -L option is documented to accept no pathspec, but the -command line option parser has allowed the combination without -checking so far. Ensure that there is no pathspec when the -L -option is in effect to fix this. - -Incidentally, this change fixes another bug in the command line -option parser, which has allowed the -L option used together -with the --follow option. Because the latter requires exactly -one path given, but the former takes no pathspec, they become -mutually incompatible automatically. Because the -L option -follows renames on its own, there is no reason to give --follow -at the same time. - -The new tests say they may fail with "-L and --follow being -incompatible" instead of "-L and pathspec being incompatible". -Currently the expected failure can come only from the latter, but -this is to futureproof them, in case we decide to add code to -explicititly die on -L and --follow used together. - -Heled-by: Jeff King -Signed-off-by: Junio C Hamano ---- - builtin/log.c | 3 +++ - t/t4211-line-log.sh | 22 ++++++++++++++++++++++ - 2 files changed, 25 insertions(+) - -diff --git a/builtin/log.c b/builtin/log.c -index 0a7ed4bef92b9..9d70f3e60b9c0 100644 ---- a/builtin/log.c -+++ b/builtin/log.c -@@ -206,6 +206,9 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix, - if (argc > 1) - die(_("unrecognized argument: %s"), argv[1]); - -+ if (rev->line_level_traverse && rev->prune_data.nr) -+ die(_("-L: cannot be used with pathspec")); -+ - memset(&w, 0, sizeof(w)); - userformat_find_requirements(NULL, &w); - -diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh -index 2d1d7b5d1938a..85d151423dedc 100755 ---- a/t/t4211-line-log.sh -+++ b/t/t4211-line-log.sh -@@ -8,6 +8,28 @@ test_expect_success 'setup (import history)' ' - git reset --hard - ' - -+test_expect_success 'basic command line parsing' ' -+ # This may fail due to "no such path a.c in commit", or -+ # "-L is incompatible with pathspec", depending on the -+ # order the error is checked. Either is acceptable. -+ test_must_fail git log -L1,1:a.c -- a.c && -+ -+ # -L requires there is no pathspec -+ test_must_fail git log -L1,1:b.c -- b.c 2>error && -+ test_i18ngrep "cannot be used with pathspec" error && -+ -+ # This would fail because --follow wants a single path, but -+ # we may fail due to incompatibility between -L/--follow in -+ # the future. Either is acceptable. -+ test_must_fail git log -L1,1:b.c --follow && -+ test_must_fail git log --follow -L1,1:b.c && -+ -+ # This would fail because -L wants no pathspec, but -+ # we may fail due to incompatibility between -L/--follow in -+ # the future. Either is acceptable. -+ test_must_fail git log --follow -L1,1:b.c -- b.c -+' -+ - canned_test_1 () { - test_expect_$1 "$2" " - git log $2 >actual && diff --git a/git.spec b/git.spec index 8e9e616..5de02f6 100644 --- a/git.spec +++ b/git.spec @@ -93,11 +93,11 @@ %endif # Define for release candidates -#global rcrev .rc0 +%global rcrev .rc1 Name: git -Version: 2.29.2 -Release: 4%{?rcrev}%{?dist} +Version: 2.30.0 +Release: 0.1%{?rcrev}%{?dist} Summary: Fast Version Control System License: GPLv2 URL: https://git-scm.com/ @@ -129,14 +129,6 @@ Source99: print-failed-test-output # https://bugzilla.redhat.com/490602 Patch0: git-cvsimport-Ignore-cvsps-2.2b1-Branches-output.patch -# https://bugzilla.redhat.com/1791810 -# https://lore.kernel.org/git/xmqqy2jglv29.fsf_-_@gitster.c.googlers.com/ -Patch1: https://github.com/git/git/commit/39664cb0ac.patch#/0001-log-diagnose-L-used-with-pathspec-as-an-error.patch - -# https://bugzilla.redhat.com/1900335 -# https://lore.kernel.org/git/20201015153849.GA551964@coredump.intra.peff.net/ -Patch2: https://github.com/git/git/commit/3f018ec716.patch#/0001-fast-import-fix-over-allocation-of-marks-storage.patch - %if %{with docs} # pod2man is needed to build Git.3pm BuildRequires: %{_bindir}/pod2man @@ -1089,6 +1081,12 @@ rmdir --ignore-fail-on-non-empty "$testdir" %{?with_docs:%{_pkgdocdir}/git-svn.html} %changelog +* Sat Dec 19 2020 Todd Zullinger - 2.30.0-0.1.rc1 +- update to 2.30.0-rc1 + +* Mon Dec 14 2020 Todd Zullinger - 2.30.0-0.0.rc0 +- update to 2.30.0-rc0 + * Sun Dec 06 2020 Todd Zullinger - 2.29.2-4 - move git-difftool to git-core, it does not require perl diff --git a/sources b/sources index 61331f5..6c6c71c 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -SHA512 (git-2.29.2.tar.xz) = 34117628c6d43ac0940c43bffaa1bda7f12af863728f391492725a3e57d1bbda523cf7734e90f463fe9a9ae4e70fc1cc2523643dbb3c27377d98dc4736b0ea62 -SHA512 (git-2.29.2.tar.sign) = 781f0f12d061ca5d3576a23f90df7646fb03cc4a735a41c0118022a1124a053cdea439905efd69cd6cb0161dfe40b93b4c8c99ddac4bc484ecee14881e7ed0af +SHA512 (git-2.30.0.rc1.tar.xz) = dfd51fce13b93fefde0364601efade9e438556469f5d6977e00a2e0727e5f50c506452d214848804831855bf22ba2593aa1d7bb01ad81a111e7ddfd9b17a9760 +SHA512 (git-2.30.0.rc1.tar.sign) = e709a8ef1f38fe8872d412aeb5fdff2cce38c27b8415a91994bd3b4b6b93a3d675cc4efa26adaaa13ac232e528e8765d5cce5dd857bd1c14977fe8f2df579866