Skip to content

Commit 867ce04

Browse files
committed
Merge branch 'mh/fast-import-notes-fix-new' into maint
"git fast-import" sometimes mishandled while rebalancing notes tree, which has been fixed. * mh/fast-import-notes-fix-new: fast-import: properly fanout notes when tree is imported
2 parents bdc370a + 405d7f4 commit 867ce04

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

fast-import.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2218,13 +2218,17 @@ static uintmax_t do_change_note_fanout(
22182218
char *fullpath, unsigned int fullpath_len,
22192219
unsigned char fanout)
22202220
{
2221-
struct tree_content *t = root->tree;
2221+
struct tree_content *t;
22222222
struct tree_entry *e, leaf;
22232223
unsigned int i, tmp_hex_sha1_len, tmp_fullpath_len;
22242224
uintmax_t num_notes = 0;
22252225
unsigned char sha1[20];
22262226
char realpath[60];
22272227

2228+
if (!root->tree)
2229+
load_tree(root);
2230+
t = root->tree;
2231+
22282232
for (i = 0; t && i < t->entry_count; i++) {
22292233
e = t->entries[i];
22302234
tmp_hex_sha1_len = hex_sha1_len + e->name->str_len;
@@ -2276,8 +2280,6 @@ static uintmax_t do_change_note_fanout(
22762280
leaf.tree);
22772281
} else if (S_ISDIR(e->versions[1].mode)) {
22782282
/* This is a subdir that may contain note entries */
2279-
if (!e->tree)
2280-
load_tree(e);
22812283
num_notes += do_change_note_fanout(orig_root, e,
22822284
hex_sha1, tmp_hex_sha1_len,
22832285
fullpath, tmp_fullpath_len, fanout);

t/t9301-fast-import-notes.sh

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,48 @@ test_expect_success 'verify that lots of notes trigger a fanout scheme' '
483483
484484
'
485485

486+
# Create another notes tree from the one above
487+
SP=" "
488+
cat >>input <<INPUT_END
489+
commit refs/heads/other_commits
490+
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
491+
data <<COMMIT
492+
commit #$(($num_commit + 1))
493+
COMMIT
494+
495+
from refs/heads/many_commits
496+
M 644 inline file
497+
data <<EOF
498+
file contents in commit #$(($num_commit + 1))
499+
EOF
500+
501+
commit refs/notes/other_notes
502+
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
503+
data <<COMMIT
504+
committing one more note on a tree imported from a previous notes tree
505+
COMMIT
506+
507+
M 040000 $(git log --no-walk --format=%T refs/notes/many_notes)$SP
508+
N inline :$(($num_commit + 1))
509+
data <<EOF
510+
note for commit #$(($num_commit + 1))
511+
EOF
512+
INPUT_END
513+
514+
test_expect_success 'verify that importing a notes tree respects the fanout scheme' '
515+
git fast-import <input &&
516+
517+
# None of the entries in the top-level notes tree should be a full SHA1
518+
git ls-tree --name-only refs/notes/other_notes |
519+
while read path
520+
do
521+
if test $(expr length "$path") -ge 40
522+
then
523+
return 1
524+
fi
525+
done
526+
'
527+
486528
cat >>expect_non-note1 << EOF
487529
This is not a note, but rather a regular file residing in a notes tree
488530
EOF

0 commit comments

Comments
 (0)