t / t3905-stash-include-untracked.shon commit general improvements (43abf13)
   1#!/bin/sh
   2#
   3# Copyright (c) 2011 David Caldwell
   4#
   5
   6test_description='Test git stash --include-untracked'
   7
   8. ./test-lib.sh
   9
  10test_expect_success 'stash save --include-untracked some dirty working directory' '
  11        echo 1 > file &&
  12        git add file &&
  13        test_tick &&
  14        git commit -m initial &&
  15        echo 2 > file &&
  16        git add file &&
  17        echo 3 > file &&
  18        test_tick &&
  19        echo 1 > file2 &&
  20        echo 1 > HEAD &&
  21        mkdir untracked &&
  22        echo untracked >untracked/untracked &&
  23        git stash --include-untracked &&
  24        git diff-files --quiet &&
  25        git diff-index --cached --quiet HEAD
  26'
  27
  28cat > expect <<EOF
  29?? actual
  30?? expect
  31EOF
  32
  33test_expect_success 'stash save --include-untracked cleaned the untracked files' '
  34        git status --porcelain >actual &&
  35        test_cmp expect actual
  36'
  37
  38tracked=$(git rev-parse --short $(echo 1 | git hash-object --stdin))
  39untracked=$(git rev-parse --short $(echo untracked | git hash-object --stdin))
  40cat > expect.diff <<EOF
  41diff --git a/HEAD b/HEAD
  42new file mode 100644
  43index 0000000..$tracked
  44--- /dev/null
  45+++ b/HEAD
  46@@ -0,0 +1 @@
  47+1
  48diff --git a/file2 b/file2
  49new file mode 100644
  50index 0000000..$tracked
  51--- /dev/null
  52+++ b/file2
  53@@ -0,0 +1 @@
  54+1
  55diff --git a/untracked/untracked b/untracked/untracked
  56new file mode 100644
  57index 0000000..$untracked
  58--- /dev/null
  59+++ b/untracked/untracked
  60@@ -0,0 +1 @@
  61+untracked
  62EOF
  63cat > expect.lstree <<EOF
  64HEAD
  65file2
  66untracked
  67EOF
  68
  69test_expect_success 'stash save --include-untracked stashed the untracked files' '
  70        test_path_is_missing file2 &&
  71        test_path_is_missing untracked &&
  72        test_path_is_missing HEAD &&
  73        git diff HEAD stash^3 -- HEAD file2 untracked >actual &&
  74        test_cmp expect.diff actual &&
  75        git ls-tree --name-only stash^3: >actual &&
  76        test_cmp expect.lstree actual
  77'
  78test_expect_success 'stash save --patch --include-untracked fails' '
  79        test_must_fail git stash --patch --include-untracked
  80'
  81
  82test_expect_success 'stash save --patch --all fails' '
  83        test_must_fail git stash --patch --all
  84'
  85
  86git clean --force --quiet
  87
  88cat > expect <<EOF
  89 M file
  90?? HEAD
  91?? actual
  92?? expect
  93?? file2
  94?? untracked/
  95EOF
  96
  97test_expect_success 'stash pop after save --include-untracked leaves files untracked again' '
  98        git stash pop &&
  99        git status --porcelain >actual &&
 100        test_cmp expect actual &&
 101        test "1" = "$(cat file2)" &&
 102        test untracked = "$(cat untracked/untracked)"
 103'
 104
 105git clean --force --quiet -d
 106
 107test_expect_success 'stash save -u dirty index' '
 108        echo 4 > file3 &&
 109        git add file3 &&
 110        test_tick &&
 111        git stash -u
 112'
 113
 114blob=$(git rev-parse --short $(echo 4 | git hash-object --stdin))
 115cat > expect <<EOF
 116diff --git a/file3 b/file3
 117new file mode 100644
 118index 0000000..$blob
 119--- /dev/null
 120+++ b/file3
 121@@ -0,0 +1 @@
 122+4
 123EOF
 124
 125test_expect_success 'stash save --include-untracked dirty index got stashed' '
 126        git stash pop --index &&
 127        git diff --cached >actual &&
 128        test_cmp expect actual
 129'
 130
 131git reset > /dev/null
 132
 133# Must direct output somewhere where it won't be considered an untracked file
 134test_expect_success 'stash save --include-untracked -q is quiet' '
 135        echo 1 > file5 &&
 136        git stash save --include-untracked --quiet > .git/stash-output.out 2>&1 &&
 137        test_line_count = 0 .git/stash-output.out &&
 138        rm -f .git/stash-output.out
 139'
 140
 141test_expect_success 'stash save --include-untracked removed files' '
 142        rm -f file &&
 143        git stash save --include-untracked &&
 144        echo 1 > expect &&
 145        test_cmp expect file
 146'
 147
 148rm -f expect
 149
 150test_expect_success 'stash save --include-untracked removed files got stashed' '
 151        git stash pop &&
 152        test_path_is_missing file
 153'
 154
 155cat > .gitignore <<EOF
 156.gitignore
 157ignored
 158ignored.d/
 159EOF
 160
 161test_expect_success 'stash save --include-untracked respects .gitignore' '
 162        echo ignored > ignored &&
 163        mkdir ignored.d &&
 164        echo ignored >ignored.d/untracked &&
 165        git stash -u &&
 166        test -s ignored &&
 167        test -s ignored.d/untracked &&
 168        test -s .gitignore
 169'
 170
 171test_expect_success 'stash save -u can stash with only untracked files different' '
 172        echo 4 > file4 &&
 173        git stash -u &&
 174        test_path_is_missing file4
 175'
 176
 177test_expect_success 'stash save --all does not respect .gitignore' '
 178        git stash -a &&
 179        test_path_is_missing ignored &&
 180        test_path_is_missing ignored.d &&
 181        test_path_is_missing .gitignore
 182'
 183
 184test_expect_success 'stash save --all is stash poppable' '
 185        git stash pop &&
 186        test -s ignored &&
 187        test -s ignored.d/untracked &&
 188        test -s .gitignore
 189'
 190
 191test_expect_success 'stash push --include-untracked with pathspec' '
 192        >foo &&
 193        >bar &&
 194        git stash push --include-untracked -- foo &&
 195        test_path_is_file bar &&
 196        test_path_is_missing foo &&
 197        git stash pop &&
 198        test_path_is_file bar &&
 199        test_path_is_file foo
 200'
 201
 202test_expect_success 'stash push with $IFS character' '
 203        >"foo bar" &&
 204        >foo &&
 205        >bar &&
 206        git add foo* &&
 207        git stash push --include-untracked -- "foo b*" &&
 208        test_path_is_missing "foo bar" &&
 209        test_path_is_file foo &&
 210        test_path_is_file bar &&
 211        git stash pop &&
 212        test_path_is_file "foo bar" &&
 213        test_path_is_file foo &&
 214        test_path_is_file bar
 215'
 216
 217cat > .gitignore <<EOF
 218ignored
 219ignored.d/*
 220EOF
 221
 222test_expect_success 'stash previously ignored file' '
 223        git reset HEAD &&
 224        git add .gitignore &&
 225        git commit -m "Add .gitignore" &&
 226        >ignored.d/foo &&
 227        echo "!ignored.d/foo" >> .gitignore &&
 228        git stash save --include-untracked &&
 229        test_path_is_missing ignored.d/foo &&
 230        git stash pop &&
 231        test_path_is_file ignored.d/foo
 232'
 233
 234test_expect_success 'stash -u -- <untracked> doesnt print error' '
 235        >untracked &&
 236        git stash push -u -- untracked 2>actual &&
 237        test_path_is_missing untracked &&
 238        test_line_count = 0 actual
 239'
 240
 241test_expect_success 'stash -u -- <untracked> leaves rest of working tree in place' '
 242        >tracked &&
 243        git add tracked &&
 244        >untracked &&
 245        git stash push -u -- untracked &&
 246        test_path_is_missing untracked &&
 247        test_path_is_file tracked
 248'
 249
 250test_expect_success 'stash -u -- <tracked> <untracked> clears changes in both' '
 251        >tracked &&
 252        git add tracked &&
 253        >untracked &&
 254        git stash push -u -- tracked untracked &&
 255        test_path_is_missing tracked &&
 256        test_path_is_missing untracked
 257'
 258
 259test_expect_success 'stash --all -- <ignored> stashes ignored file' '
 260        >ignored.d/bar &&
 261        git stash push --all -- ignored.d/bar &&
 262        test_path_is_missing ignored.d/bar
 263'
 264
 265test_expect_success 'stash --all -- <tracked> <ignored> clears changes in both' '
 266        >tracked &&
 267        git add tracked &&
 268        >ignored.d/bar &&
 269        git stash push --all -- tracked ignored.d/bar &&
 270        test_path_is_missing tracked &&
 271        test_path_is_missing ignored.d/bar
 272'
 273
 274test_expect_success 'stash -u -- <ignored> leaves ignored file alone' '
 275        >ignored.d/bar &&
 276        git stash push -u -- ignored.d/bar &&
 277        test_path_is_file ignored.d/bar
 278'
 279
 280test_expect_success 'stash -u -- <non-existant> shows no changes when there are none' '
 281        git stash push -u -- non-existant >actual &&
 282        echo "No local changes to save" >expect &&
 283        test_i18ncmp expect actual
 284'
 285
 286test_expect_success 'stash -u with globs' '
 287        >untracked.txt &&
 288        git stash -u -- ":(glob)**/*.txt" &&
 289        test_path_is_missing untracked.txt
 290'
 291
 292test_done