t / t9832-unshelve.shon commit built-in rebase --autostash: leave the current branch alone if possible (176f5d9)
   1#!/bin/sh
   2
   3last_shelved_change () {
   4        p4 changes -s shelved -m1 | cut -d " " -f 2
   5}
   6
   7test_description='git p4 unshelve'
   8
   9. ./lib-git-p4.sh
  10
  11test_expect_success 'start p4d' '
  12        start_p4d
  13'
  14
  15test_expect_success 'init depot' '
  16        (
  17                cd "$cli" &&
  18                echo file1 >file1 &&
  19                p4 add file1 &&
  20                p4 submit -d "change 1" &&
  21                : >file_to_delete &&
  22                p4 add file_to_delete &&
  23                p4 submit -d "file to delete"
  24        )
  25'
  26
  27test_expect_success 'initial clone' '
  28        git p4 clone --dest="$git" //depot/@all
  29'
  30
  31test_expect_success 'create shelved changelist' '
  32        (
  33                cd "$cli" &&
  34                p4 edit file1 &&
  35                echo "a change" >>file1 &&
  36                echo "new file" >file2 &&
  37                p4 add file2 &&
  38                p4 delete file_to_delete &&
  39                p4 opened &&
  40                p4 shelve -i <<EOF
  41Change: new
  42Description:
  43        Test commit
  44
  45        Further description
  46Files:
  47        //depot/file1
  48        //depot/file2
  49        //depot/file_to_delete
  50EOF
  51
  52        ) &&
  53        (
  54                cd "$git" &&
  55                change=$(last_shelved_change) &&
  56                git p4 unshelve $change &&
  57                git show refs/remotes/p4/unshelved/$change | grep -q "Further description" &&
  58                git cherry-pick refs/remotes/p4/unshelved/$change &&
  59                test_path_is_file file2 &&
  60                test_cmp file1 "$cli"/file1 &&
  61                test_cmp file2 "$cli"/file2 &&
  62                test_path_is_missing file_to_delete
  63        )
  64'
  65
  66test_expect_success 'update shelved changelist and re-unshelve' '
  67        test_when_finished cleanup_git &&
  68        (
  69                cd "$cli" &&
  70                change=$(last_shelved_change) &&
  71                echo "file3" >file3 &&
  72                p4 add -c $change file3 &&
  73                p4 shelve -i -r <<EOF &&
  74Change: $change
  75Description:
  76        Test commit
  77
  78        Further description
  79Files:
  80        //depot/file1
  81        //depot/file2
  82        //depot/file3
  83        //depot/file_to_delete
  84EOF
  85                p4 describe $change
  86        ) &&
  87        (
  88                cd "$git" &&
  89                change=$(last_shelved_change) &&
  90                git p4 unshelve $change &&
  91                git diff refs/remotes/p4/unshelved/$change.0 refs/remotes/p4/unshelved/$change | grep -q file3
  92        )
  93'
  94
  95# This is the tricky case where the shelved changelist base revision doesn't
  96# match git-p4's idea of the base revision
  97#
  98# We will attempt to unshelve a change that is based on a change one commit
  99# ahead of p4/master
 100
 101test_expect_success 'create shelved changelist based on p4 change ahead of p4/master' '
 102        git p4 clone --dest="$git" //depot/@all &&
 103        (
 104                cd "$cli" &&
 105                p4 revert ... &&
 106                p4 edit file1 &&
 107                echo "foo" >>file1 &&
 108                p4 submit -d "change:foo" &&
 109                p4 edit file1 &&
 110                echo "bar" >>file1 &&
 111                p4 shelve -i <<EOF &&
 112Change: new
 113Description:
 114        Change to be unshelved
 115Files:
 116        //depot/file1
 117EOF
 118                change=$(last_shelved_change) &&
 119                p4 describe -S $change | grep -q "Change to be unshelved"
 120        )
 121'
 122
 123# Now try to unshelve it. git-p4 should refuse to do so.
 124test_expect_success 'try to unshelve the change' '
 125        test_when_finished cleanup_git &&
 126        (
 127                change=$(last_shelved_change) &&
 128                cd "$git" &&
 129                test_must_fail git p4 unshelve $change 2>out.txt &&
 130                grep -q "cannot unshelve" out.txt
 131        )
 132'
 133
 134test_expect_success 'kill p4d' '
 135        kill_p4d
 136'
 137
 138test_done