#!/bin/sh setvar test_description = ''git patch-id'' source ./test-lib.sh test_expect_success 'setup' ' as="a a a a a a a a" && # eight a test_write_lines $as >foo && test_write_lines $as >bar && git add foo bar && git commit -a -m initial && test_write_lines $as b >foo && test_write_lines $as b >bar && git commit -a -m first && git checkout -b same master && git commit --amend -m same-msg && git checkout -b notsame master && echo c >foo && echo c >bar && git commit --amend -a -m notsame-msg && test_write_lines bar foo >bar-then-foo && test_write_lines foo bar >foo-then-bar ' test_expect_success 'patch-id output is well-formed' ' git log -p -1 | git patch-id >output && grep "^[a-f0-9]\{40\} $(git rev-parse HEAD)$" output ' #calculate patch id. Make sure output is not empty. proc calc_patch_id { setvar patch_name = "$1" shift git patch-id @ARGV | sed "s/ .*//" >patch-id_"$patch_name" && test_line_count -gt 0 patch-id_"$patch_name" } proc get_top_diff { git log -p -1 @ARGV -O bar-then-foo -- } proc get_patch_id { get_top_diff $1 | calc_patch_id @ARGV } test_expect_success 'patch-id detects equality' ' get_patch_id master && get_patch_id same && test_cmp patch-id_master patch-id_same ' test_expect_success 'patch-id detects inequality' ' get_patch_id master && get_patch_id notsame && ! test_cmp patch-id_master patch-id_notsame ' test_expect_success 'patch-id supports git-format-patch output' ' get_patch_id master && git checkout same && git format-patch -1 --stdout | calc_patch_id same && test_cmp patch-id_master patch-id_same && set $(git format-patch -1 --stdout | git patch-id) && test "$2" = $(git rev-parse HEAD) ' test_expect_success 'whitespace is irrelevant in footer' ' get_patch_id master && git checkout same && git format-patch -1 --stdout | sed "s/ \$//" | calc_patch_id same && test_cmp patch-id_master patch-id_same ' proc cmp_patch_id { if test $1 = "relevant" { ! test_cmp patch-id_"$2" patch-id_"$3" } else { test_cmp patch-id_"$2" patch-id_"$3" } } proc test_patch_id_file_order { setvar relevant = "$1" shift setvar name = ""order-${1}-$relevant"" shift get_top_diff "master" | calc_patch_id $name @ARGV && git checkout same && git format-patch -1 --stdout -O foo-then-bar | calc_patch_id "ordered-$name" @ARGV && cmp_patch_id $relevant $name "ordered-$name" } # combined test for options: add more tests here to make them # run with all options proc test_patch_id { test_patch_id_file_order @ARGV } # small tests with detailed diagnostic for basic options. test_expect_success 'file order is irrelevant with --stable' ' test_patch_id_file_order irrelevant --stable --stable ' test_expect_success 'file order is relevant with --unstable' ' test_patch_id_file_order relevant --unstable --unstable ' #Now test various option combinations. test_expect_success 'default is unstable' ' test_patch_id relevant default ' test_expect_success 'patchid.stable = true is stable' ' test_config patchid.stable true && test_patch_id irrelevant patchid.stable=true ' test_expect_success 'patchid.stable = false is unstable' ' test_config patchid.stable false && test_patch_id relevant patchid.stable=false ' test_expect_success '--unstable overrides patchid.stable = true' ' test_config patchid.stable true && test_patch_id relevant patchid.stable=true--unstable --unstable ' test_expect_success '--stable overrides patchid.stable = false' ' test_config patchid.stable false && test_patch_id irrelevant patchid.stable=false--stable --stable ' test_expect_success 'patch-id supports git-format-patch MIME output' ' get_patch_id master && git checkout same && git format-patch -1 --attach --stdout | calc_patch_id same && test_cmp patch-id_master patch-id_same ' test_expect_success 'patch-id respects config from subdir' ' test_config patchid.stable true && mkdir subdir && # copy these because test_patch_id() looks for them in # the current directory cp bar-then-foo foo-then-bar subdir && ( cd subdir && test_patch_id irrelevant patchid.stable=true ) ' cat >nonl <<< ''' diff --git i/a w/a index e69de29..2e65efe 100644 --- i/a +++ w/a @@ -0,0 +1 @@ +a \ No newline at end of file diff --git i/b w/b index e69de29..6178079 100644 --- i/b +++ w/b @@ -0,0 +1 @@ +b ''' cat >withnl <<< ''' diff --git i/a w/a index e69de29..7898192 100644 --- i/a +++ w/a @@ -0,0 +1 @@ +a diff --git i/b w/b index e69de29..6178079 100644 --- i/b +++ w/b @@ -0,0 +1 @@ +b ''' test_expect_success 'patch-id handles no-nl-at-eof markers' ' cat nonl | calc_patch_id nonl && cat withnl | calc_patch_id withnl && test_cmp patch-id_nonl patch-id_withnl ' test_done