t / t6001-rev-list-merge-order.shon commit [PATCH] Remove unnecessary sort from t6001 testcase (9d89d19)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Jon Seymour
   4#
   5
   6test_description='Tests git-rev-list --merge-order functionality'
   7
   8. ./test-lib.sh
   9
  10#
  11# TODO: move the following block (upto --- end ...) into testlib.sh
  12#
  13[ -d .git/refs/tags ] || mkdir -p .git/refs/tags
  14
  15sed_script="";
  16
  17# Answer the sha1 has associated with the tag. The tag must exist in .git or .git/refs/tags
  18tag()
  19{
  20        _tag=$1
  21        [ -f .git/refs/tags/$_tag ] || error "tag: \"$_tag\" does not exist"
  22        cat .git/refs/tags/$_tag
  23}
  24
  25# Generate a commit using the text specified to make it unique and the tree
  26# named by the tag specified.
  27unique_commit()
  28{
  29        _text=$1
  30        _tree=$2
  31        shift 2
  32        echo $_text | git-commit-tree $(tag $_tree) "$@"
  33}
  34
  35# Save the output of a command into the tag specified. Prepend
  36# a substitution script for the tag onto the front of $sed_script
  37save_tag()
  38{
  39        _tag=$1 
  40        [ -n "$_tag" ] || error "usage: save_tag tag commit-args ..."
  41        shift 1
  42        "$@" >.git/refs/tags/$_tag
  43        sed_script="s/$(tag $_tag)/$_tag/g${sed_script+;}$sed_script"
  44}
  45
  46# Replace unhelpful sha1 hashses with their symbolic equivalents 
  47entag()
  48{
  49        sed "$sed_script"
  50}
  51
  52# Execute a command after first saving, then setting the GIT_AUTHOR_EMAIL
  53# tag to a specified value. Restore the original value on return.
  54as_author()
  55{
  56        _author=$1
  57        shift 1
  58        _save=$GIT_AUTHOR_EMAIL
  59
  60        export GIT_AUTHOR_EMAIL="$_author"
  61        "$@"
  62        export GIT_AUTHOR_EMAIL="$_save"
  63}
  64
  65commit_date()
  66{
  67        _commit=$1
  68        git-cat-file commit $_commit | sed -n "s/^committer .*> \([0-9]*\) .*/\1/p" 
  69}
  70
  71on_committer_date()
  72{
  73    _date=$1
  74    shift 1
  75    GIT_COMMITTER_DATE=$_date "$@"
  76}
  77
  78# Execute a command and suppress any error output.
  79hide_error()
  80{
  81        "$@" 2>/dev/null
  82}
  83
  84check_output()
  85{
  86        _name=$1
  87        shift 1
  88        if eval "$*" | entag > $_name.actual
  89        then
  90                diff $_name.expected $_name.actual
  91        else
  92                return 1;
  93        fi
  94}
  95
  96# Turn a reasonable test description into a reasonable test name.
  97# All alphanums translated into -'s which are then compressed and stripped
  98# from front and back.
  99name_from_description()
 100{
 101        tr "'" '-' | tr '~`!@#$%^&*()_+={}[]|\;:"<>,/? ' '-' | tr -s '-' | tr '[A-Z]' '[a-z]' | sed "s/^-*//;s/-*\$//"
 102}
 103
 104
 105# Execute the test described by the first argument, by eval'ing
 106# command line specified in the 2nd argument. Check the status code
 107# is zero and that the output matches the stream read from 
 108# stdin.
 109test_output_expect_success()
 110{       
 111        _description=$1
 112        _test=$2
 113        [ $# -eq 2 ] || error "usage: test_output_expect_success description test <<EOF ... EOF"
 114        _name=$(echo $_description | name_from_description)
 115        cat > $_name.expected
 116        test_expect_success "$_description" "check_output $_name \"$_test\"" 
 117}
 118
 119# --- end of stuff to move ---
 120
 121# test-case specific test function
 122check_adjacency()
 123{
 124    read previous
 125    echo "= $previous"
 126    while read next
 127    do
 128        if ! (git-cat-file commit $previous | grep "^parent $next" >/dev/null)
 129        then
 130            echo "^ $next"
 131        else
 132            echo "| $next"
 133        fi
 134        previous=$next
 135    done
 136}
 137
 138list_duplicates()
 139{
 140    "$@" | sort | uniq -d
 141}
 142
 143grep_stderr()
 144{
 145    args=$1
 146    shift 1
 147    "$@" 2>&1 | grep "$args"
 148}
 149
 150date >path0
 151git-update-cache --add path0
 152save_tag tree git-write-tree
 153on_committer_date "1971-08-16 00:00:00" hide_error save_tag root unique_commit root tree
 154on_committer_date "1971-08-16 00:00:01" save_tag l0 unique_commit l0 tree -p root
 155on_committer_date "1971-08-16 00:00:02" save_tag l1 unique_commit l1 tree -p l0
 156on_committer_date "1971-08-16 00:00:03" save_tag l2 unique_commit l2 tree -p l1
 157on_committer_date "1971-08-16 00:00:04" save_tag a0 unique_commit a0 tree -p l2
 158on_committer_date "1971-08-16 00:00:05" save_tag a1 unique_commit a1 tree -p a0
 159on_committer_date "1971-08-16 00:00:06" save_tag b1 unique_commit b1 tree -p a0
 160on_committer_date "1971-08-16 00:00:07" save_tag c1 unique_commit c1 tree -p b1
 161on_committer_date "1971-08-16 00:00:08" as_author foobar@example.com save_tag b2 unique_commit b2 tree -p b1
 162on_committer_date "1971-08-16 00:00:09" save_tag b3 unique_commit b2 tree -p b2
 163on_committer_date "1971-08-16 00:00:10" save_tag c2 unique_commit c2 tree -p c1 -p b2
 164on_committer_date "1971-08-16 00:00:11" save_tag c3 unique_commit c3 tree -p c2
 165on_committer_date "1971-08-16 00:00:12" save_tag a2 unique_commit a2 tree -p a1
 166on_committer_date "1971-08-16 00:00:13" save_tag a3 unique_commit a3 tree -p a2
 167on_committer_date "1971-08-16 00:00:14" save_tag b4 unique_commit b4 tree -p b3 -p a3
 168on_committer_date "1971-08-16 00:00:15" save_tag a4 unique_commit a4 tree -p a3 -p b4 -p c3
 169on_committer_date "1971-08-16 00:00:16" save_tag l3 unique_commit l3 tree -p a4
 170on_committer_date "1971-08-16 00:00:17" save_tag l4 unique_commit l4 tree -p l3
 171on_committer_date "1971-08-16 00:00:18" save_tag l5 unique_commit l5 tree -p l4
 172on_committer_date "1971-08-16 00:00:19" save_tag m1 unique_commit m1 tree -p a4 -p c3
 173on_committer_date "1971-08-16 00:00:20" save_tag m2 unique_commit m2 tree -p c3 -p a4
 174on_committer_date "1971-08-16 00:00:21" hide_error save_tag alt_root unique_commit alt_root tree
 175on_committer_date "1971-08-16 00:00:22" save_tag r0 unique_commit r0 tree -p alt_root
 176on_committer_date "1971-08-16 00:00:23" save_tag r1 unique_commit r1 tree -p r0
 177on_committer_date "1971-08-16 00:00:24" save_tag l5r1 unique_commit l5r1 tree -p l5 -p r1
 178on_committer_date "1971-08-16 00:00:25" save_tag r1l5 unique_commit r1l5 tree -p r1 -p l5
 179
 180
 181#
 182# note: as of 20/6, it isn't possible to create duplicate parents, so this
 183# can't be tested.
 184#
 185#on_committer_date "1971-08-16 00:00:20" save_tag m3 unique_commit m3 tree -p c3 -p a4 -p c3
 186hide_error save_tag e1 as_author e@example.com unique_commit e1 tree
 187save_tag e2 as_author e@example.com unique_commit e2 tree -p e1
 188save_tag f1 as_author f@example.com unique_commit f1 tree -p e1
 189save_tag e3 as_author e@example.com unique_commit e3 tree -p e2
 190save_tag f2 as_author f@example.com unique_commit f2 tree -p f1
 191save_tag e4 as_author e@example.com unique_commit e4 tree -p e3 -p f2
 192save_tag e5 as_author e@example.com unique_commit e5 tree -p e4
 193save_tag f3 as_author f@example.com unique_commit f3 tree -p f2
 194save_tag f4 as_author f@example.com unique_commit f4 tree -p f3
 195save_tag e6 as_author e@example.com unique_commit e6 tree -p e5 -p f4
 196save_tag f5 as_author f@example.com unique_commit f5 tree -p f4
 197save_tag f6 as_author f@example.com unique_commit f6 tree -p f5 -p e6
 198save_tag e7 as_author e@example.com unique_commit e7 tree -p e6
 199save_tag e8 as_author e@example.com unique_commit e8 tree -p e7
 200save_tag e9 as_author e@example.com unique_commit e9 tree -p e8
 201save_tag f7 as_author f@example.com unique_commit f7 tree -p f6
 202save_tag f8 as_author f@example.com unique_commit f8 tree -p f7
 203save_tag f9 as_author f@example.com unique_commit f9 tree -p f8
 204save_tag e10 as_author e@example.com unique_commit e1 tree -p e9 -p f8
 205
 206hide_error save_tag g0 unique_commit g0 tree
 207save_tag g1 unique_commit g1 tree -p g0
 208save_tag h1 unique_commit g2 tree -p g0
 209save_tag g2 unique_commit g3 tree -p g1 -p h1
 210save_tag h2 unique_commit g4 tree -p g2
 211save_tag g3 unique_commit g5 tree -p g2
 212save_tag g4 unique_commit g6 tree -p g3 -p h2
 213
 214tag l5 > .git/HEAD
 215
 216#
 217# cd to t/trash and use 
 218#
 219#    git-rev-list ... 2>&1 | sed "$(cat sed.script)" 
 220#
 221# if you ever want to manually debug the operation of git-rev-list
 222#
 223echo $sed_script > sed.script
 224
 225test_expect_success 'rev-list has correct number of entries' 'git-rev-list HEAD | wc -l | tr -s " "' <<EOF
 22619
 227EOF
 228
 229normal_adjacency_count=$(git-rev-list HEAD | check_adjacency | grep -c "\^" | tr -d ' ')
 230merge_order_adjacency_count=$(git-rev-list --merge-order HEAD | check_adjacency | grep -c "\^" | tr -d ' ')
 231test_expect_success '--merge-order produces as many or fewer discontinuities' '[ $merge_order_adjacency_count -le $normal_adjacency_count ]'
 232test_output_expect_success 'simple merge order' 'git-rev-list --merge-order --show-breaks HEAD' <<EOF
 233= l5
 234| l4
 235| l3
 236= a4
 237| c3
 238| c2
 239| c1
 240^ b4
 241| b3
 242| b2
 243| b1
 244^ a3
 245| a2
 246| a1
 247= a0
 248| l2
 249| l1
 250| l0
 251= root
 252EOF
 253
 254test_output_expect_success 'two diamonds merge order (g6)' 'git-rev-list --merge-order --show-breaks g4' <<EOF
 255= g4
 256| h2
 257^ g3
 258= g2
 259| h1
 260^ g1
 261= g0
 262EOF
 263
 264test_output_expect_success 'multiple heads' 'git-rev-list --merge-order a3 b3 c3' <<EOF
 265c3
 266c2
 267c1
 268b3
 269b2
 270b1
 271a3
 272a2
 273a1
 274a0
 275l2
 276l1
 277l0
 278root
 279EOF
 280
 281test_output_expect_success 'multiple heads, prune at a1' 'git-rev-list --merge-order a3 b3 c3 ^a1' <<EOF
 282c3
 283c2
 284c1
 285b3
 286b2
 287b1
 288a3
 289a2
 290EOF
 291
 292test_output_expect_success 'multiple heads, prune at l1' 'git-rev-list --merge-order a3 b3 c3 ^l1' <<EOF
 293c3
 294c2
 295c1
 296b3
 297b2
 298b1
 299a3
 300a2
 301a1
 302a0
 303l2
 304EOF
 305
 306test_output_expect_success 'cross-epoch, head at l5, prune at l1' 'git-rev-list --merge-order l5 ^l1' <<EOF
 307l5
 308l4
 309l3
 310a4
 311c3
 312c2
 313c1
 314b4
 315b3
 316b2
 317b1
 318a3
 319a2
 320a1
 321a0
 322l2
 323EOF
 324
 325test_output_expect_success 'duplicated head arguments' 'git-rev-list --merge-order l5 l5 ^l1' <<EOF
 326l5
 327l4
 328l3
 329a4
 330c3
 331c2
 332c1
 333b4
 334b3
 335b2
 336b1
 337a3
 338a2
 339a1
 340a0
 341l2
 342EOF
 343
 344test_output_expect_success 'prune near merge' 'git-rev-list --merge-order a4 ^c3' <<EOF
 345a4
 346b4
 347b3
 348a3
 349a2
 350a1
 351EOF
 352
 353test_output_expect_success "head has no parent" 'git-rev-list --merge-order --show-breaks root' <<EOF
 354= root
 355EOF
 356
 357test_output_expect_success "two nodes - one head, one base" 'git-rev-list --merge-order --show-breaks l0' <<EOF
 358= l0
 359= root
 360EOF
 361
 362test_output_expect_success "three nodes one head, one internal, one base" 'git-rev-list --merge-order --show-breaks l1' <<EOF
 363= l1
 364| l0
 365= root
 366EOF
 367
 368test_output_expect_success "linear prune l2 ^root" 'git-rev-list --merge-order --show-breaks l2 ^root' <<EOF
 369^ l2
 370| l1
 371| l0
 372EOF
 373
 374test_output_expect_success "linear prune l2 ^l0" 'git-rev-list --merge-order --show-breaks l2 ^l0' <<EOF
 375^ l2
 376| l1
 377EOF
 378
 379test_output_expect_success "linear prune l2 ^l1" 'git-rev-list --merge-order --show-breaks l2 ^l1' <<EOF
 380^ l2
 381EOF
 382
 383test_output_expect_success "linear prune l5 ^a4" 'git-rev-list --merge-order --show-breaks l5 ^a4' <<EOF
 384^ l5
 385| l4
 386| l3
 387EOF
 388
 389test_output_expect_success "linear prune l5 ^l3" 'git-rev-list --merge-order --show-breaks l5 ^l3' <<EOF
 390^ l5
 391| l4
 392EOF
 393
 394test_output_expect_success "linear prune l5 ^l4" 'git-rev-list --merge-order --show-breaks l5 ^l4' <<EOF
 395^ l5
 396EOF
 397
 398test_output_expect_success "max-count 10 - merge order" 'git-rev-list --merge-order --show-breaks --max-count=10 l5' <<EOF
 399= l5
 400| l4
 401| l3
 402= a4
 403| c3
 404| c2
 405| c1
 406^ b4
 407| b3
 408| b2
 409EOF
 410
 411test_output_expect_success "max-count 10 - non merge order" 'git-rev-list --max-count=10 l5' <<EOF
 412l5
 413l4
 414l3
 415a4
 416b4
 417a3
 418a2
 419c3
 420c2
 421b3
 422EOF
 423
 424test_output_expect_success '--max-age=c3, no --merge-order' "git-rev-list --max-age=$(commit_date c3) l5" <<EOF
 425l5
 426l4
 427l3
 428a4
 429b4
 430a3
 431a2
 432c3
 433EOF
 434
 435test_output_expect_success '--max-age=c3, --merge-order' "git-rev-list --merge-order --max-age=$(commit_date c3) l5" <<EOF
 436l5
 437l4
 438l3
 439a4
 440c3
 441b4
 442a3
 443a2
 444EOF
 445
 446test_output_expect_success 'one specified head reachable from another a4, c3, --merge-order' "list_duplicates git-rev-list --merge-order a4 c3" <<EOF
 447EOF
 448
 449test_output_expect_success 'one specified head reachable from another c3, a4, --merge-order' "list_duplicates git-rev-list --merge-order c3 a4" <<EOF
 450EOF
 451
 452test_output_expect_success 'one specified head reachable from another a4, c3, no --merge-order' "list_duplicates git-rev-list a4 c3" <<EOF
 453EOF
 454
 455test_output_expect_success 'one specified head reachable from another c3, a4, no --merge-order' "list_duplicates git-rev-list c3 a4" <<EOF
 456EOF
 457
 458test_output_expect_success 'graph with c3 and a4 parents of head' "list_duplicates git-rev-list m1" <<EOF
 459EOF
 460
 461test_output_expect_success 'graph with a4 and c3 parents of head' "list_duplicates git-rev-list m2" <<EOF
 462EOF
 463
 464test_expect_success "head ^head --merge-order" 'git-rev-list --merge-order --show-breaks a3 ^a3' <<EOF
 465EOF
 466
 467#
 468# can't test this now - duplicate parents can't be created
 469#
 470#test_output_expect_success 'duplicate parents' 'git-rev-list --parents --merge-order --show-breaks m3' <<EOF
 471#= m3 c3 a4 c3
 472#| a4 c3 b4 a3
 473#| b4 a3 b3
 474#| b3 b2
 475#^ a3 a2
 476#| a2 a1
 477#| a1 a0
 478#^ c3 c2
 479#| c2 b2 c1
 480#| b2 b1
 481#^ c1 b1
 482#| b1 a0
 483#= a0 l2
 484#| l2 l1
 485#| l1 l0
 486#| l0 root
 487#= root
 488#EOF
 489
 490test_expect_success "head ^head no --merge-order" 'git-rev-list a3 ^a3' <<EOF
 491EOF
 492
 493test_output_expect_success 'simple merge order (l5r1)' 'git-rev-list --merge-order --show-breaks l5r1' <<EOF
 494= l5r1
 495| r1
 496| r0
 497| alt_root
 498^ l5
 499| l4
 500| l3
 501| a4
 502| c3
 503| c2
 504| c1
 505^ b4
 506| b3
 507| b2
 508| b1
 509^ a3
 510| a2
 511| a1
 512| a0
 513| l2
 514| l1
 515| l0
 516= root
 517EOF
 518
 519test_output_expect_success 'simple merge order (r1l5)' 'git-rev-list --merge-order --show-breaks r1l5' <<EOF
 520= r1l5
 521| l5
 522| l4
 523| l3
 524| a4
 525| c3
 526| c2
 527| c1
 528^ b4
 529| b3
 530| b2
 531| b1
 532^ a3
 533| a2
 534| a1
 535| a0
 536| l2
 537| l1
 538| l0
 539| root
 540^ r1
 541| r0
 542= alt_root
 543EOF
 544
 545test_output_expect_success "don't print things unreachable from one branch" "git-rev-list a3 ^b3 --merge-order" <<EOF
 546a3
 547a2
 548a1
 549EOF
 550
 551#
 552#
 553
 554test_done