/t/t9301-fast-import-notes.sh
Shell | 682 lines | 571 code | 95 blank | 16 comment | 56 complexity | 3a397ac6fae886cf172a570385c08927 MD5 | raw file
- #!/bin/sh
- #
- # Copyright (c) 2009 Johan Herland
- #
- test_description='test git fast-import of notes objects'
- . ./test-lib.sh
- test_tick
- cat >input <<INPUT_END
- commit refs/heads/master
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- first commit
- COMMIT
- M 644 inline foo
- data <<EOF
- file foo in first commit
- EOF
- M 755 inline bar
- data <<EOF
- file bar in first commit
- EOF
- M 644 inline baz/xyzzy
- data <<EOF
- file baz/xyzzy in first commit
- EOF
- commit refs/heads/master
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- second commit
- COMMIT
- M 644 inline foo
- data <<EOF
- file foo in second commit
- EOF
- M 755 inline baz/xyzzy
- data <<EOF
- file baz/xyzzy in second commit
- EOF
- commit refs/heads/master
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- third commit
- COMMIT
- M 644 inline foo
- data <<EOF
- file foo in third commit
- EOF
- commit refs/heads/master
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- fourth commit
- COMMIT
- M 755 inline bar
- data <<EOF
- file bar in fourth commit
- EOF
- INPUT_END
- test_expect_success 'set up master branch' '
- git fast-import <input &&
- git whatchanged master
- '
- commit4=$(git rev-parse refs/heads/master)
- commit3=$(git rev-parse "$commit4^")
- commit2=$(git rev-parse "$commit4~2")
- commit1=$(git rev-parse "$commit4~3")
- test_tick
- cat >input <<INPUT_END
- commit refs/notes/test
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- first notes commit
- COMMIT
- M 644 inline $commit1
- data <<EOF
- first note for first commit
- EOF
- M 755 inline $commit2
- data <<EOF
- first note for second commit
- EOF
- INPUT_END
- cat >expect <<EXPECT_END
- fourth commit
- third commit
- second commit
- first note for second commit
- first commit
- first note for first commit
- EXPECT_END
- test_expect_success 'add notes with simple M command' '
- git fast-import <input &&
- GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
- test_cmp expect actual
- '
- test_tick
- cat >input <<INPUT_END
- feature notes
- commit refs/notes/test
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- second notes commit
- COMMIT
- from refs/notes/test^0
- N inline $commit3
- data <<EOF
- first note for third commit
- EOF
- N inline $commit4
- data <<EOF
- first note for fourth commit
- EOF
- INPUT_END
- cat >expect <<EXPECT_END
- fourth commit
- first note for fourth commit
- third commit
- first note for third commit
- second commit
- first note for second commit
- first commit
- first note for first commit
- EXPECT_END
- test_expect_success 'add notes with simple N command' '
- git fast-import <input &&
- GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
- test_cmp expect actual
- '
- test_tick
- cat >input <<INPUT_END
- commit refs/notes/test
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- third notes commit
- COMMIT
- from refs/notes/test^0
- N inline $commit1
- data <<EOF
- second note for first commit
- EOF
- N inline $commit2
- data <<EOF
- second note for second commit
- EOF
- N inline $commit3
- data <<EOF
- second note for third commit
- EOF
- N inline $commit4
- data <<EOF
- second note for fourth commit
- EOF
- INPUT_END
- cat >expect <<EXPECT_END
- fourth commit
- second note for fourth commit
- third commit
- second note for third commit
- second commit
- second note for second commit
- first commit
- second note for first commit
- EXPECT_END
- test_expect_success 'update existing notes with N command' '
- git fast-import <input &&
- GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
- test_cmp expect actual
- '
- test_tick
- cat >input <<INPUT_END
- commit refs/notes/test
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- fourth notes commit
- COMMIT
- from refs/notes/test^0
- M 644 inline $(echo "$commit3" | sed "s|^..|&/|")
- data <<EOF
- prefix of note for third commit
- EOF
- M 644 inline $(echo "$commit4" | sed "s|^..|&/|")
- data <<EOF
- prefix of note for fourth commit
- EOF
- M 644 inline $(echo "$commit4" | sed "s|^\(..\)\(..\)|\1/\2/|")
- data <<EOF
- pre-prefix of note for fourth commit
- EOF
- N inline $commit1
- data <<EOF
- third note for first commit
- EOF
- N inline $commit2
- data <<EOF
- third note for second commit
- EOF
- N inline $commit3
- data <<EOF
- third note for third commit
- EOF
- N inline $commit4
- data <<EOF
- third note for fourth commit
- EOF
- INPUT_END
- whitespace=" "
- cat >expect <<EXPECT_END
- fourth commit
- pre-prefix of note for fourth commit
- $whitespace
- prefix of note for fourth commit
- $whitespace
- third note for fourth commit
- third commit
- prefix of note for third commit
- $whitespace
- third note for third commit
- second commit
- third note for second commit
- first commit
- third note for first commit
- EXPECT_END
- test_expect_success 'add concatentation notes with M command' '
- git fast-import <input &&
- GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
- test_cmp expect actual
- '
- test_tick
- cat >input <<INPUT_END
- commit refs/notes/test
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- fifth notes commit
- COMMIT
- from refs/notes/test^0
- deleteall
- INPUT_END
- cat >expect <<EXPECT_END
- fourth commit
- third commit
- second commit
- first commit
- EXPECT_END
- test_expect_success 'verify that deleteall also removes notes' '
- git fast-import <input &&
- GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
- test_cmp expect actual
- '
- test_tick
- cat >input <<INPUT_END
- commit refs/notes/test
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- sixth notes commit
- COMMIT
- from refs/notes/test^0
- M 644 inline $commit1
- data <<EOF
- third note for first commit
- EOF
- M 644 inline $commit3
- data <<EOF
- third note for third commit
- EOF
- N inline $commit1
- data <<EOF
- fourth note for first commit
- EOF
- N inline $commit3
- data <<EOF
- fourth note for third commit
- EOF
- INPUT_END
- cat >expect <<EXPECT_END
- fourth commit
- third commit
- fourth note for third commit
- second commit
- first commit
- fourth note for first commit
- EXPECT_END
- test_expect_success 'verify that later N commands override earlier M commands' '
- git fast-import <input &&
- GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
- test_cmp expect actual
- '
- # Write fast-import commands to create the given number of commits
- fast_import_commits () {
- my_ref=$1
- my_num_commits=$2
- my_append_to_file=$3
- my_i=0
- while test $my_i -lt $my_num_commits
- do
- my_i=$(($my_i + 1))
- test_tick
- cat >>"$my_append_to_file" <<INPUT_END
- commit $my_ref
- mark :$my_i
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- commit #$my_i
- COMMIT
- M 644 inline file
- data <<EOF
- file contents in commit #$my_i
- EOF
- INPUT_END
- done
- }
- # Write fast-import commands to create the given number of notes annotating
- # the commits created by fast_import_commits()
- fast_import_notes () {
- my_notes_ref=$1
- my_num_commits=$2
- my_append_to_file=$3
- my_note_append=$4
- test_tick
- cat >>"$my_append_to_file" <<INPUT_END
- commit $my_notes_ref
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- committing $my_num_commits notes
- COMMIT
- INPUT_END
- my_i=0
- while test $my_i -lt $my_num_commits
- do
- my_i=$(($my_i + 1))
- cat >>"$my_append_to_file" <<INPUT_END
- N inline :$my_i
- data <<EOF
- note for commit #$my_i$my_note_append
- EOF
- INPUT_END
- done
- }
- rm input expect
- num_commits=400
- # Create lots of commits
- fast_import_commits "refs/heads/many_commits" $num_commits input
- # Create one note per above commit
- fast_import_notes "refs/notes/many_notes" $num_commits input
- # Add a couple of non-notes as well
- test_tick
- cat >>input <<INPUT_END
- commit refs/notes/many_notes
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- committing some non-notes to the notes tree
- COMMIT
- M 755 inline foobar/non-note.txt
- data <<EOF
- This is not a note, but rather a regular file residing in a notes tree
- EOF
- M 644 inline deadbeef
- data <<EOF
- Non-note file
- EOF
- M 644 inline de/adbeef
- data <<EOF
- Another non-note file
- EOF
- INPUT_END
- # Finally create the expected output from all these notes and commits
- i=$num_commits
- while test $i -gt 0
- do
- cat >>expect <<EXPECT_END
- commit #$i
- note for commit #$i
- EXPECT_END
- i=$(($i - 1))
- done
- test_expect_success 'add lots of commits and notes' '
- git fast-import <input &&
- GIT_NOTES_REF=refs/notes/many_notes git log refs/heads/many_commits |
- grep "^ " > actual &&
- test_cmp expect actual
- '
- test_expect_success 'verify that lots of notes trigger a fanout scheme' '
- # None of the entries in the top-level notes tree should be a full SHA1
- git ls-tree --name-only refs/notes/many_notes |
- while read path
- do
- if test $(expr length "$path") -ge 40
- then
- return 1
- fi
- done
- '
- cat >>expect_non-note1 << EOF
- This is not a note, but rather a regular file residing in a notes tree
- EOF
- cat >>expect_non-note2 << EOF
- Non-note file
- EOF
- cat >>expect_non-note3 << EOF
- Another non-note file
- EOF
- test_expect_success 'verify that non-notes are untouched by a fanout change' '
- git cat-file -p refs/notes/many_notes:foobar/non-note.txt > actual &&
- test_cmp expect_non-note1 actual &&
- git cat-file -p refs/notes/many_notes:deadbeef > actual &&
- test_cmp expect_non-note2 actual &&
- git cat-file -p refs/notes/many_notes:de/adbeef > actual &&
- test_cmp expect_non-note3 actual
- '
- # Change the notes for the three top commits
- test_tick
- cat >input <<INPUT_END
- commit refs/notes/many_notes
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- changing notes for the top three commits
- COMMIT
- from refs/notes/many_notes^0
- INPUT_END
- rm expect
- i=$num_commits
- j=0
- while test $j -lt 3
- do
- cat >>input <<INPUT_END
- N inline refs/heads/many_commits~$j
- data <<EOF
- changed note for commit #$i
- EOF
- INPUT_END
- cat >>expect <<EXPECT_END
- commit #$i
- changed note for commit #$i
- EXPECT_END
- i=$(($i - 1))
- j=$(($j + 1))
- done
- test_expect_success 'change a few existing notes' '
- git fast-import <input &&
- GIT_NOTES_REF=refs/notes/many_notes git log -n3 refs/heads/many_commits |
- grep "^ " > actual &&
- test_cmp expect actual
- '
- test_expect_success 'verify that changing notes respect existing fanout' '
- # None of the entries in the top-level notes tree should be a full SHA1
- git ls-tree --name-only refs/notes/many_notes |
- while read path
- do
- if test $(expr length "$path") -ge 40
- then
- return 1
- fi
- done
- '
- remaining_notes=10
- test_tick
- cat >input <<INPUT_END
- commit refs/notes/many_notes
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- removing all notes but $remaining_notes
- COMMIT
- from refs/notes/many_notes^0
- INPUT_END
- i=$(($num_commits - $remaining_notes))
- for sha1 in $(git rev-list -n $i refs/heads/many_commits)
- do
- cat >>input <<INPUT_END
- N 0000000000000000000000000000000000000000 $sha1
- INPUT_END
- done
- i=$num_commits
- rm expect
- while test $i -gt 0
- do
- cat >>expect <<EXPECT_END
- commit #$i
- EXPECT_END
- if test $i -le $remaining_notes
- then
- cat >>expect <<EXPECT_END
- note for commit #$i
- EXPECT_END
- fi
- i=$(($i - 1))
- done
- test_expect_success 'remove lots of notes' '
- git fast-import <input &&
- GIT_NOTES_REF=refs/notes/many_notes git log refs/heads/many_commits |
- grep "^ " > actual &&
- test_cmp expect actual
- '
- test_expect_success 'verify that removing notes trigger fanout consolidation' '
- # All entries in the top-level notes tree should be a full SHA1
- git ls-tree --name-only -r refs/notes/many_notes |
- while read path
- do
- # Explicitly ignore the non-note paths
- test "$path" = "foobar/non-note.txt" && continue
- test "$path" = "deadbeef" && continue
- test "$path" = "de/adbeef" && continue
- if test $(expr length "$path") -ne 40
- then
- return 1
- fi
- done
- '
- test_expect_success 'verify that non-notes are untouched by a fanout change' '
- git cat-file -p refs/notes/many_notes:foobar/non-note.txt > actual &&
- test_cmp expect_non-note1 actual &&
- git cat-file -p refs/notes/many_notes:deadbeef > actual &&
- test_cmp expect_non-note2 actual &&
- git cat-file -p refs/notes/many_notes:de/adbeef > actual &&
- test_cmp expect_non-note3 actual
- '
- rm input expect
- num_notes_refs=10
- num_commits=16
- some_commits=8
- # Create commits
- fast_import_commits "refs/heads/more_commits" $num_commits input
- # Create one note per above commit per notes ref
- i=0
- while test $i -lt $num_notes_refs
- do
- i=$(($i + 1))
- fast_import_notes "refs/notes/more_notes_$i" $num_commits input
- done
- # Trigger branch reloading in git-fast-import by repeating the note creation
- i=0
- while test $i -lt $num_notes_refs
- do
- i=$(($i + 1))
- fast_import_notes "refs/notes/more_notes_$i" $some_commits input " (2)"
- done
- # Finally create the expected output from the notes in refs/notes/more_notes_1
- i=$num_commits
- while test $i -gt 0
- do
- note_data="note for commit #$i"
- if test $i -le $some_commits
- then
- note_data="$note_data (2)"
- fi
- cat >>expect <<EXPECT_END
- commit #$i
- $note_data
- EXPECT_END
- i=$(($i - 1))
- done
- test_expect_success "add notes to $num_commits commits in each of $num_notes_refs refs" '
- git fast-import --active-branches=5 <input &&
- GIT_NOTES_REF=refs/notes/more_notes_1 git log refs/heads/more_commits |
- grep "^ " > actual &&
- test_cmp expect actual
- '
- test_done