github.com/catandhorse/git-lfs@v2.5.2+incompatible/t/t-status.sh (about) 1 #!/usr/bin/env bash 2 3 . "$(dirname "$0")/testlib.sh" 4 5 begin_test "status" 6 ( 7 set -e 8 9 mkdir repo-1 10 cd repo-1 11 git init 12 git lfs track "*.dat" 13 14 file_1="some data" 15 file_1_oid="$(calc_oid "$file_1")" 16 file_1_oid_short="$(echo "$file_1_oid" | head -c 7)" 17 printf "$file_1" > file1.dat 18 git add file1.dat 19 git commit -m "file1.dat" 20 21 file_1_new="other data" 22 file_1_new_oid="$(calc_oid "$file_1_new")" 23 file_1_new_oid_short="$(echo "$file_1_new_oid" | head -c 7)" 24 printf "$file_1_new" > file1.dat 25 26 file_2="file2 data" 27 file_2_oid="$(calc_oid "$file_2")" 28 file_2_oid_short="$(echo "$file_2_oid" | head -c 7)" 29 printf "$file_2" > file2.dat 30 git add file2.dat 31 32 file_3="file3 data" 33 file_3_oid="$(calc_oid "$file_3")" 34 file_3_oid_short="$(echo "$file_3_oid" | head -c 7)" 35 printf "$file_3" > file3.dat 36 git add file3.dat 37 38 file_3_new="file3 other data" 39 file_3_new_oid="$(calc_oid "$file_3_new")" 40 file_3_new_oid_short="$(echo "$file_3_new_oid" | head -c 7)" 41 printf "$file_3_new" > file3.dat 42 43 expected="On branch master 44 45 Git LFS objects to be committed: 46 47 file2.dat (LFS: $file_2_oid_short) 48 file3.dat (LFS: $file_3_oid_short) 49 50 Git LFS objects not staged for commit: 51 52 file1.dat (LFS: $file_1_oid_short -> File: $file_1_new_oid_short) 53 file3.dat (File: $file_3_new_oid_short)" 54 55 [ "$expected" = "$(git lfs status)" ] 56 ) 57 end_test 58 59 begin_test "status --porcelain" 60 ( 61 set -e 62 63 mkdir repo-2 64 cd repo-2 65 git init 66 git lfs track "*.dat" 67 echo "some data" > file1.dat 68 git add file1.dat 69 git commit -m "file1.dat" 70 71 echo "other data" > file1.dat 72 echo "file2 data" > file2.dat 73 git add file2.dat 74 75 echo "file3 data" > file3.dat 76 git add file3.dat 77 78 echo "file3 other data" > file3.dat 79 80 expected=" M file1.dat 81 A file3.dat 82 A file2.dat" 83 84 [ "$expected" = "$(git lfs status --porcelain)" ] 85 ) 86 end_test 87 88 begin_test "status --json" 89 ( 90 set -e 91 92 mkdir repo-3 93 cd repo-3 94 git init 95 git lfs track "*.dat" 96 echo "some data" > file1.dat 97 git add file1.dat 98 git commit -m "file1.dat" 99 100 echo "other data" > file1.dat 101 102 expected='{"files":{"file1.dat":{"status":"M"}}}' 103 [ "$expected" = "$(git lfs status --json)" ] 104 105 git add file1.dat 106 git commit -m "file1.dat changed" 107 git mv file1.dat file2.dat 108 109 expected='{"files":{"file2.dat":{"status":"R","from":"file1.dat"}}}' 110 [ "$expected" = "$(git lfs status --json)" ] 111 112 git commit -m "file1.dat -> file2.dat" 113 114 # Ensure status --json does not include non-lfs files 115 echo hi > test1.txt 116 git add test1.txt 117 expected='{"files":{}}' 118 [ "$expected" = "$(git lfs status --json)" ] 119 ) 120 end_test 121 122 begin_test "status in a sub-directory" 123 ( 124 set -e 125 126 reponame="status-sub-directory" 127 git init "$reponame" 128 cd "$reponame" 129 130 git lfs track "*.dat" 131 printf "asdf" > file.dat 132 mkdir -p dir 133 git add .gitattributes file.dat 134 git commit -m "initial commit" 135 136 printf "ASDF" > file.dat 137 138 expected="On branch master 139 140 Git LFS objects to be committed: 141 142 143 Git LFS objects not staged for commit: 144 145 ../file.dat (LFS: f0e4c2f -> File: 99b3bcf)" 146 147 [ "$expected" = "$(cd dir && git lfs status)" ] 148 ) 149 end_test 150 151 begin_test "status: outside git repository" 152 ( 153 set +e 154 git lfs status 2>&1 > status.log 155 res=$? 156 157 set -e 158 if [ "$res" = "0" ]; then 159 echo "Passes because $GIT_LFS_TEST_DIR is unset." 160 exit 0 161 fi 162 [ "$res" = "128" ] 163 grep "Not in a git repository" status.log 164 ) 165 end_test 166 167 begin_test "status - before initial commit" 168 ( 169 set -e 170 171 git init repo-initial 172 cd repo-initial 173 git lfs track "*.dat" 174 175 # should not fail when nothing to display (ignore output, will be blank) 176 git lfs status 177 178 contents="some data" 179 contents_oid="$(calc_oid "$contents")" 180 contents_oid_short="$(echo "$contents_oid" | head -c 7)" 181 182 printf "$contents" > file1.dat 183 git add file1.dat 184 185 expected=" 186 Git LFS objects to be committed: 187 188 file1.dat (LFS: $contents_oid_short) 189 190 Git LFS objects not staged for commit:" 191 192 [ "$expected" = "$(git lfs status)" ] 193 ) 194 end_test 195 196 begin_test "status shows multiple files with identical contents" 197 ( 198 set -e 199 200 reponame="uniq-status" 201 mkdir "$reponame" 202 cd "$reponame" 203 204 git init 205 git lfs track "*.dat" 206 207 contents="contents" 208 printf "$contents" > a.dat 209 printf "$contents" > b.dat 210 211 git add --all . 212 213 git lfs status | tee status.log 214 215 [ "1" -eq "$(grep -c "a.dat" status.log)" ] 216 [ "1" -eq "$(grep -c "b.dat" status.log)" ] 217 ) 218 end_test 219 220 begin_test "status shows multiple copies of partially staged files" 221 ( 222 set -e 223 224 reponame="status-partially-staged" 225 git init "$reponame" 226 cd "$reponame" 227 228 git lfs track "*.dat" 229 git add .gitattributes 230 git commit -m "initial commit" 231 232 contents_1="part 1" 233 contents_1_oid="$(calc_oid "$contents_1")" 234 contents_1_oid_short="$(echo "$contents_1_oid" | head -c 7)" 235 printf "$contents_1" > a.dat 236 237 # "$contents_1" changes are staged 238 git add a.dat 239 240 # "$contents_2" changes are unstaged 241 contents_2="part 2" 242 contents_2_oid="$(calc_oid "$contents_2")" 243 contents_2_oid_short="$(echo "$contents_2_oid" | head -c 7)" 244 printf "$contents_2" > a.dat 245 246 expected="On branch master 247 248 Git LFS objects to be committed: 249 250 a.dat (LFS: $contents_1_oid_short) 251 252 Git LFS objects not staged for commit: 253 254 a.dat (File: $contents_2_oid_short)" 255 actual="$(git lfs status)" 256 257 diff -u <(echo "$expected") <(echo "$actual") 258 ) 259 end_test 260 261 begin_test "status: LFS to LFS change" 262 ( 263 set -e 264 265 reponame="status-lfs-to-lfs-change" 266 setup_remote_repo "$reponame" 267 clone_repo "$reponame" "$reponame" 268 269 contents="contents" 270 contents_oid="$(calc_oid "$contents")" 271 contents_oid_short="$(echo "$contents_oid" | head -c 7)" 272 273 git lfs track "*.dat" 274 git add .gitattributes 275 git commit -m "track *.dat files" 276 277 printf "$contents" > a.dat 278 git add a.dat 279 git commit -m "add a.dat" 280 281 contents_new="$contents +extra" 282 contents_new_oid="$(calc_oid "$contents_new")" 283 contents_new_oid_short="$(echo $contents_new_oid | head -c 7)" 284 285 printf "$contents_new" > a.dat 286 git add a.dat 287 288 expected="On branch master 289 290 Git LFS objects to be committed: 291 292 a.dat (LFS: $contents_oid_short -> LFS: $contents_new_oid_short) 293 294 Git LFS objects not staged for commit:" 295 actual="$(git lfs status)" 296 297 [ "$expected" = "$actual" ] 298 ) 299 end_test 300 301 begin_test "status: Git to LFS change" 302 ( 303 set -e 304 305 reponame="status-git-to-lfs-change" 306 setup_remote_repo "$reponame" 307 clone_repo "$reponame" "$reponame" 308 309 contents="contents" 310 contents_oid="$(calc_oid "$contents")" 311 contents_oid_short="$(echo "$contents_oid" | head -c 7)" 312 313 printf "$contents" > a.dat 314 git add a.dat 315 git commit -m "add a.dat" 316 317 git lfs track "*.dat" 318 git add .gitattributes 319 git commit -m "track *.dat files" 320 321 contents_new="$contents +extra" 322 contents_new_oid="$(calc_oid "$contents_new")" 323 contents_new_oid_short="$(echo $contents_new_oid | head -c 7)" 324 325 printf "$contents_new" > a.dat 326 git add a.dat 327 328 expected="On branch master 329 330 Git LFS objects to be committed: 331 332 a.dat (Git: $contents_oid_short -> LFS: $contents_new_oid_short) 333 334 Git LFS objects not staged for commit:" 335 actual="$(git lfs status)" 336 337 [ "$expected" = "$actual" ] 338 ) 339 end_test 340 341 begin_test "status: Git to LFS conversion" 342 ( 343 set -e 344 345 reponame="status-git-to-lfs-conversion" 346 setup_remote_repo "$reponame" 347 clone_repo "$reponame" "$reponame" 348 349 contents="contents" 350 contents_oid="$(calc_oid "$contents")" 351 contents_oid_short="$(echo "$contents_oid" | head -c 7)" 352 353 printf "$contents" > a.dat 354 git add a.dat 355 git commit -m "add a.dat" 356 357 git lfs track "*.dat" 358 git add .gitattributes 359 git commit -m "track *.dat" 360 361 git push origin master 362 363 pushd "$TRASHDIR" > /dev/null 364 clone_repo "$reponame" "$reponame-2" 365 366 git add a.dat 367 368 git lfs status 2>&1 | tee status.log 369 if [ "0" -ne "${PIPESTATUS[0]}" ]; then 370 echo >&2 "git lfs status should have succeeded, didn't ..." 371 exit 1 372 fi 373 374 expected="On branch master 375 Git LFS objects to be pushed to origin/master: 376 377 378 Git LFS objects to be committed: 379 380 a.dat (Git: $contents_oid_short -> LFS: $contents_oid_short) 381 382 Git LFS objects not staged for commit:" 383 actual="$(cat status.log)" 384 385 [ "$expected" = "$actual" ] 386 popd > /dev/null 387 ) 388 end_test 389 390 begin_test "status (missing objects)" 391 ( 392 set -e 393 394 reponame="status-missing-objects" 395 git init "$reponame" 396 cd "$reponame" 397 398 git lfs track "*.dat" 399 printf "a" > a.dat 400 401 git add .gitattributes a.dat 402 git commit -m "initial commit" 403 404 # Remove the original object "a.dat" (ensure '--no-filters' is not given). 405 oid="$(git hash-object -t blob -- a.dat)" 406 rm -rf ".git/objects/${oid:0:2}/${oid:2}" 407 408 # Create an unstaged change against a source file that doesn't exist. 409 printf "b" > a.dat 410 git add a.dat 411 412 git lfs status \ 413 | grep "a.dat (?: <missing> -> LFS: $(calc_oid b | head -c 7))" 414 ) 415 end_test 416 417 begin_test "status (unpushed objects)" 418 ( 419 set -e 420 421 reponame="status-unpushed-objects" 422 setup_remote_repo "$reponame" 423 clone_repo "$reponame" "$reponame" 424 425 git lfs track "*.dat" 426 git add .gitattributes 427 git commit -m "initial commit" 428 429 git push origin master 430 431 contents="a" 432 oid="$(calc_oid "$contents")" 433 printf "$contents" > a.dat 434 435 git add a.dat 436 git commit -m "add a large file" 437 438 expected="On branch master 439 Git LFS objects to be pushed to origin/master: 440 441 a.dat ($oid) 442 443 Git LFS objects to be committed: 444 445 446 Git LFS objects not staged for commit:" 447 448 [ "$expected" = "$(git lfs status)" ] 449 ) 450 end_test