gistore 1.0.0.rc4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +30 -0
  3. data/COPYING +340 -0
  4. data/README.md +98 -0
  5. data/exe/gistore +15 -0
  6. data/lib/gistore.rb +20 -0
  7. data/lib/gistore/cmd/add.rb +15 -0
  8. data/lib/gistore/cmd/checkout.rb +49 -0
  9. data/lib/gistore/cmd/commit.rb +171 -0
  10. data/lib/gistore/cmd/config.rb +23 -0
  11. data/lib/gistore/cmd/export-to-backups.rb +79 -0
  12. data/lib/gistore/cmd/gc.rb +15 -0
  13. data/lib/gistore/cmd/git-version.rb +14 -0
  14. data/lib/gistore/cmd/init.rb +36 -0
  15. data/lib/gistore/cmd/restore-from-backups.rb +91 -0
  16. data/lib/gistore/cmd/rm.rb +15 -0
  17. data/lib/gistore/cmd/safe-commands.rb +53 -0
  18. data/lib/gistore/cmd/status.rb +40 -0
  19. data/lib/gistore/cmd/task.rb +85 -0
  20. data/lib/gistore/cmd/version.rb +27 -0
  21. data/lib/gistore/config.rb +13 -0
  22. data/lib/gistore/config/gistore.yml +1 -0
  23. data/lib/gistore/error.rb +6 -0
  24. data/lib/gistore/repo.rb +683 -0
  25. data/lib/gistore/runner.rb +43 -0
  26. data/lib/gistore/templates/description +1 -0
  27. data/lib/gistore/templates/hooks/applypatch-msg.sample +15 -0
  28. data/lib/gistore/templates/hooks/commit-msg.sample +24 -0
  29. data/lib/gistore/templates/hooks/post-update.sample +8 -0
  30. data/lib/gistore/templates/hooks/pre-applypatch.sample +14 -0
  31. data/lib/gistore/templates/hooks/pre-commit.sample +49 -0
  32. data/lib/gistore/templates/hooks/pre-push.sample +54 -0
  33. data/lib/gistore/templates/hooks/pre-rebase.sample +169 -0
  34. data/lib/gistore/templates/hooks/prepare-commit-msg.sample +36 -0
  35. data/lib/gistore/templates/hooks/update.sample +128 -0
  36. data/lib/gistore/templates/info/exclude +6 -0
  37. data/lib/gistore/utils.rb +382 -0
  38. data/lib/gistore/version.rb +4 -0
  39. data/t/Makefile +80 -0
  40. data/t/README +745 -0
  41. data/t/aggregate-results.sh +46 -0
  42. data/t/lib-worktree.sh +76 -0
  43. data/t/t0000-init.sh +75 -0
  44. data/t/t0010-config.sh +75 -0
  45. data/t/t0020-version.sh +32 -0
  46. data/t/t1000-add-remove.sh +89 -0
  47. data/t/t1010-status.sh +87 -0
  48. data/t/t1020-commit.sh +134 -0
  49. data/t/t1030-commit-and-rotate.sh +266 -0
  50. data/t/t2000-task-and-commit-all.sh +132 -0
  51. data/t/t3000-checkout.sh +115 -0
  52. data/t/t3010-export-and-restore.sh +141 -0
  53. data/t/test-binary-1.png +0 -0
  54. data/t/test-binary-2.png +0 -0
  55. data/t/test-lib-functions.sh +722 -0
  56. data/t/test-lib.sh +684 -0
  57. metadata +161 -0
data/t/test-lib.sh ADDED
@@ -0,0 +1,684 @@
1
+ #!/bin/sh
2
+ #
3
+ # Copyright (c) 2013 Jiang Xin (borrow from Git)
4
+ # Copyright (c) 2005 Junio C Hamano
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 2 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with this program. If not, see http://www.gnu.org/licenses/ .
18
+
19
+ # Keep the original TERM for say_color
20
+ ORIGINAL_TERM=$TERM
21
+
22
+ # Test the binaries we have just built. The tests are kept in
23
+ # t/ subdirectory and are run in 'trash directory' subdirectory.
24
+ if test -z "$TEST_DIRECTORY"
25
+ then
26
+ # We allow tests to override this, in case they want to run tests
27
+ # outside of t/, e.g. for running tests on the test library
28
+ # itself.
29
+ TEST_DIRECTORY=$(pwd)
30
+ fi
31
+ if test -z "$TEST_OUTPUT_DIRECTORY"
32
+ then
33
+ # Similarly, override this to store the test-results subdir
34
+ # elsewhere
35
+ TEST_OUTPUT_DIRECTORY=$TEST_DIRECTORY
36
+ fi
37
+ if test -n "$TEST_LOCAL_UNINSTALLED"
38
+ then
39
+ GISTORE_BIN_DIR="$TEST_DIRECTORY"/../bin
40
+ fi
41
+
42
+ ################################################################
43
+ # It appears that people try to run tests without building...
44
+ if test -n "$TEST_LOCAL_UNINSTALLED"
45
+ then
46
+ "$GISTORE_BIN_DIR/gistore" >/dev/null 2>&1
47
+ else
48
+ gistore >/dev/null 2>&1
49
+ fi
50
+ if test $? != 0
51
+ then
52
+ cat >&2 <<-EOF
53
+ Error: can not find gistore for test. Run the following command
54
+ to test gistore in local repository.
55
+
56
+ $ TEST_LOCAL_UNINSTALLED=t make
57
+
58
+ EOF
59
+ exit 1
60
+ fi
61
+
62
+ SHELL_PATH="/bin/sh"
63
+ DIFF='diff'
64
+ export PERL_PATH SHELL_PATH
65
+
66
+ # if --tee was passed, write the output not only to the terminal, but
67
+ # additionally to the file test-results/$BASENAME.out, too.
68
+ case "$GIT_TEST_TEE_STARTED, $* " in
69
+ done,*)
70
+ # do not redirect again
71
+ ;;
72
+ *' --tee '*|*' --va'*)
73
+ mkdir -p "$TEST_OUTPUT_DIRECTORY/test-results"
74
+ BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)"
75
+ (GIT_TEST_TEE_STARTED=done ${SHELL_PATH} "$0" "$@" 2>&1;
76
+ echo $? > $BASE.exit) | tee $BASE.out
77
+ test "$(cat $BASE.exit)" = 0
78
+ exit
79
+ ;;
80
+ esac
81
+
82
+ # For repeatability, reset the environment to known value.
83
+ PAGER=cat
84
+ TZ=UTC
85
+ TERM=dumb
86
+ export PAGER TERM TZ
87
+ EDITOR=:
88
+ # A call to "unset" with no arguments causes at least Solaris 10
89
+ # /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets
90
+ # deriving from the command substitution clustered with the other
91
+ # ones.
92
+ unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH" -e '
93
+ my @env = keys %ENV;
94
+ my $ok = join("|", qw(
95
+ TRACE
96
+ DEBUG
97
+ USE_LOOKUP
98
+ TEST
99
+ .*_TEST
100
+ PROVE
101
+ UNZIP
102
+ PERF_
103
+ ));
104
+ my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env);
105
+ print join("\n", @vars);
106
+ ')
107
+ GIT_AUTHOR_EMAIL=author@example.com
108
+ GIT_AUTHOR_NAME='A U Thor'
109
+ GIT_COMMITTER_EMAIL=committer@example.com
110
+ GIT_COMMITTER_NAME='C O Mitter'
111
+ unset GIT_MERGE_VERBOSITY
112
+ unset GIT_MERGE_AUTOEDIT
113
+ export GIT_MERGE_VERBOSITY GIT_MERGE_AUTOEDIT
114
+ export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
115
+ export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
116
+ export EDITOR
117
+
118
+ # Add libc MALLOC and MALLOC_PERTURB test
119
+ # only if we are not executing the test with valgrind
120
+ if test -n "$TEST_NO_MALLOC_CHECK"
121
+ then
122
+ setup_malloc_check () {
123
+ : nothing
124
+ }
125
+ teardown_malloc_check () {
126
+ : nothing
127
+ }
128
+ else
129
+ setup_malloc_check () {
130
+ MALLOC_CHECK_=3 MALLOC_PERTURB_=165
131
+ export MALLOC_CHECK_ MALLOC_PERTURB_
132
+ }
133
+ teardown_malloc_check () {
134
+ unset MALLOC_CHECK_ MALLOC_PERTURB_
135
+ }
136
+ fi
137
+
138
+ # Protect ourselves from common misconfiguration to export
139
+ # CDPATH into the environment
140
+ unset CDPATH
141
+
142
+ unset GREP_OPTIONS
143
+ unset UNZIP
144
+
145
+ case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
146
+ 1|2|true)
147
+ echo "* warning: Some tests will not work if GIT_TRACE" \
148
+ "is set as to trace on STDERR ! *"
149
+ echo "* warning: Please set GIT_TRACE to something" \
150
+ "other than 1, 2 or true ! *"
151
+ ;;
152
+ esac
153
+
154
+ # Convenience
155
+ #
156
+ # A regexp to match 5 and 40 hexdigits
157
+ _x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
158
+ _x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05"
159
+
160
+ # Zero SHA-1
161
+ _z40=0000000000000000000000000000000000000000
162
+
163
+ # Line feed
164
+ LF='
165
+ '
166
+
167
+ export _x05 _x40 _z40 LF
168
+
169
+ # Each test should start with something like this, after copyright notices:
170
+ #
171
+ # test_description='Description of this test...
172
+ # This test checks if command xyzzy does the right thing...
173
+ # '
174
+ # . ./test-lib.sh
175
+ [ "x$ORIGINAL_TERM" != "xdumb" ] && (
176
+ TERM=$ORIGINAL_TERM &&
177
+ export TERM &&
178
+ [ -t 1 ] &&
179
+ tput bold >/dev/null 2>&1 &&
180
+ tput setaf 1 >/dev/null 2>&1 &&
181
+ tput sgr0 >/dev/null 2>&1
182
+ ) &&
183
+ color=t
184
+
185
+ while test "$#" -ne 0
186
+ do
187
+ case "$1" in
188
+ -d|--d|--de|--deb|--debu|--debug)
189
+ debug=t; shift ;;
190
+ -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
191
+ immediate=t; shift ;;
192
+ -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
193
+ GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;;
194
+ -h|--h|--he|--hel|--help)
195
+ help=t; shift ;;
196
+ -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
197
+ verbose=t; shift ;;
198
+ --verbose-only=*)
199
+ verbose_only=$(expr "z$1" : 'z[^=]*=\(.*\)')
200
+ shift ;;
201
+ -q|--q|--qu|--qui|--quie|--quiet)
202
+ # Ignore --quiet under a TAP::Harness. Saying how many tests
203
+ # passed without the ok/not ok details is always an error.
204
+ test -z "$HARNESS_ACTIVE" && quiet=t; shift ;;
205
+ --no-color)
206
+ color=; shift ;;
207
+ --tee)
208
+ shift ;; # was handled already
209
+ --root=*)
210
+ root=$(expr "z$1" : 'z[^=]*=\(.*\)')
211
+ shift ;;
212
+ --statusprefix=*)
213
+ statusprefix=$(expr "z$1" : 'z[^=]*=\(.*\)')
214
+ shift ;;
215
+ *)
216
+ echo "error: unknown test option '$1'" >&2; exit 1 ;;
217
+ esac
218
+ done
219
+
220
+ if test -n "$color"
221
+ then
222
+ say_color () {
223
+ (
224
+ TERM=$ORIGINAL_TERM
225
+ export TERM
226
+ case "$1" in
227
+ error)
228
+ tput bold; tput setaf 1;; # bold red
229
+ skip)
230
+ tput setaf 4;; # blue
231
+ warn)
232
+ tput setaf 3;; # brown/yellow
233
+ pass)
234
+ tput setaf 2;; # green
235
+ info)
236
+ tput setaf 6;; # cyan
237
+ *)
238
+ test -n "$quiet" && return;;
239
+ esac
240
+ shift
241
+ printf "%s" "$*"
242
+ tput sgr0
243
+ echo
244
+ )
245
+ }
246
+ else
247
+ say_color() {
248
+ test -z "$1" && test -n "$quiet" && return
249
+ shift
250
+ printf "%s\n" "$*"
251
+ }
252
+ fi
253
+
254
+ error () {
255
+ say_color error "error: $*"
256
+ GIT_EXIT_OK=t
257
+ exit 1
258
+ }
259
+
260
+ say () {
261
+ say_color info "$*"
262
+ }
263
+
264
+ ## TODO: ##test "${test_description}" != "" ||
265
+ ## TODO: ##error "Test script did not set test_description."
266
+
267
+ if test "$help" = "t"
268
+ then
269
+ echo "$test_description"
270
+ exit 0
271
+ fi
272
+
273
+ exec 5>&1
274
+ exec 6<&0
275
+ if test "$verbose" = "t"
276
+ then
277
+ exec 4>&2 3>&1
278
+ else
279
+ exec 4>/dev/null 3>/dev/null
280
+ fi
281
+
282
+ test_failure=0
283
+ test_count=0
284
+ test_fixed=0
285
+ test_broken=0
286
+ test_success=0
287
+
288
+ test_external_has_tap=0
289
+
290
+ die () {
291
+ code=$?
292
+ if test -n "$GIT_EXIT_OK"
293
+ then
294
+ exit $code
295
+ else
296
+ echo >&5 "FATAL: Unexpected exit with code $code"
297
+ exit 1
298
+ fi
299
+ }
300
+
301
+ GIT_EXIT_OK=
302
+ trap 'die' EXIT
303
+
304
+ # The user-facing functions are loaded from a separate file so that
305
+ # test_perf subshells can have them too
306
+ . "$TEST_DIRECTORY/test-lib-functions.sh"
307
+
308
+ # You are not expected to call test_ok_ and test_failure_ directly, use
309
+ # the text_expect_* functions instead.
310
+
311
+ test_ok_ () {
312
+ test_success=$(($test_success + 1))
313
+ say_color "" "${statusprefix}ok $test_count - $@"
314
+ }
315
+
316
+ test_failure_ () {
317
+ test_failure=$(($test_failure + 1))
318
+ say_color error "${statusprefix}not ok $test_count - $1"
319
+ shift
320
+ echo "$@" | sed -e 's/^/# /'
321
+ test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
322
+ }
323
+
324
+ test_known_broken_ok_ () {
325
+ test_fixed=$(($test_fixed+1))
326
+ say_color error "${statusprefix}ok $test_count - $@ # TODO known breakage vanished"
327
+ }
328
+
329
+ test_known_broken_failure_ () {
330
+ test_broken=$(($test_broken+1))
331
+ say_color warn "${statusprefix}not ok $test_count - $@ # TODO known breakage"
332
+ }
333
+
334
+ test_debug () {
335
+ test "$debug" = "" || eval "$1"
336
+ }
337
+
338
+ match_pattern_list () {
339
+ arg="$1"
340
+ shift
341
+ test -z "$*" && return 1
342
+ for pattern_
343
+ do
344
+ case "$arg" in
345
+ $pattern_)
346
+ return 0
347
+ esac
348
+ done
349
+ return 1
350
+ }
351
+
352
+ maybe_teardown_verbose () {
353
+ test -z "$verbose_only" && return
354
+ exec 4>/dev/null 3>/dev/null
355
+ verbose=
356
+ }
357
+
358
+ last_verbose=t
359
+ maybe_setup_verbose () {
360
+ test -z "$verbose_only" && return
361
+ if match_pattern_list $test_count $verbose_only
362
+ then
363
+ exec 4>&2 3>&1
364
+ # Emit a delimiting blank line when going from
365
+ # non-verbose to verbose. Within verbose mode the
366
+ # delimiter is printed by test_expect_*. The choice
367
+ # of the initial $last_verbose is such that before
368
+ # test 1, we do not print it.
369
+ test -z "$last_verbose" && echo >&3 ""
370
+ verbose=t
371
+ else
372
+ exec 4>/dev/null 3>/dev/null
373
+ verbose=
374
+ fi
375
+ last_verbose=$verbose
376
+ }
377
+
378
+ test_eval_ () {
379
+ # This is a separate function because some tests use
380
+ # "return" to end a test_expect_success block early.
381
+ eval </dev/null >&3 2>&4 "$*"
382
+ }
383
+
384
+ test_run_ () {
385
+ test_cleanup=:
386
+ expecting_failure=$2
387
+ setup_malloc_check
388
+ test_eval_ "$1"
389
+ eval_ret=$?
390
+ teardown_malloc_check
391
+
392
+ if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure"
393
+ then
394
+ setup_malloc_check
395
+ test_eval_ "$test_cleanup"
396
+ teardown_malloc_check
397
+ fi
398
+ if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"
399
+ then
400
+ echo ""
401
+ fi
402
+ return "$eval_ret"
403
+ }
404
+
405
+ test_start_ () {
406
+ test_count=$(($test_count+1))
407
+ maybe_setup_verbose
408
+ }
409
+
410
+ test_finish_ () {
411
+ echo >&3 ""
412
+ maybe_teardown_verbose
413
+ }
414
+
415
+ test_skip () {
416
+ to_skip=
417
+ if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS
418
+ then
419
+ to_skip=t
420
+ fi
421
+ if test -z "$to_skip" && test -n "$test_prereq" &&
422
+ ! test_have_prereq "$test_prereq"
423
+ then
424
+ to_skip=t
425
+ fi
426
+ case "$to_skip" in
427
+ t)
428
+ of_prereq=
429
+ if test "$missing_prereq" != "$test_prereq"
430
+ then
431
+ of_prereq=" of $test_prereq"
432
+ fi
433
+
434
+ say_color skip >&3 "${statusprefix}skipping test: $@"
435
+ say_color skip "${statusprefix}ok $test_count # skip $1 (missing $missing_prereq${of_prereq})"
436
+ : true
437
+ ;;
438
+ *)
439
+ false
440
+ ;;
441
+ esac
442
+ }
443
+
444
+ # stub; perf-lib overrides it
445
+ test_at_end_hook_ () {
446
+ :
447
+ }
448
+
449
+ test_done () {
450
+ GIT_EXIT_OK=t
451
+
452
+ # Note: t0000 relies on $HARNESS_ACTIVE disabling the .counts
453
+ # output file
454
+ if test -z "$HARNESS_ACTIVE"
455
+ then
456
+ test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results"
457
+ mkdir -p "$test_results_dir"
458
+ base=${0##*/}
459
+ test_results_path="$test_results_dir/${base%.sh}-$$.counts"
460
+
461
+ cat >>"$test_results_path" <<-EOF
462
+ total $test_count
463
+ success $test_success
464
+ fixed $test_fixed
465
+ broken $test_broken
466
+ failed $test_failure
467
+
468
+ EOF
469
+ fi
470
+
471
+ if test "$test_fixed" != 0
472
+ then
473
+ say_color error "${statusprefix}# $test_fixed known breakage(s) vanished; please update test(s)"
474
+ fi
475
+ if test "$test_broken" != 0
476
+ then
477
+ say_color warn "${statusprefix}# still have $test_broken known breakage(s)"
478
+ fi
479
+ if test "$test_broken" != 0 || test "$test_fixed" != 0
480
+ then
481
+ test_remaining=$(( $test_count - $test_broken - $test_fixed ))
482
+ msg="remaining $test_remaining test(s)"
483
+ else
484
+ test_remaining=$test_count
485
+ msg="$test_count test(s)"
486
+ fi
487
+ case "$test_failure" in
488
+ 0)
489
+ # Maybe print SKIP message
490
+ if test -n "$skip_all" && test $test_count -gt 0
491
+ then
492
+ error "Can't use skip_all after running some tests"
493
+ fi
494
+ [ -z "$skip_all" ] || skip_all=" # SKIP $skip_all"
495
+
496
+ if test $test_external_has_tap -eq 0
497
+ then
498
+ if test $test_remaining -gt 0
499
+ then
500
+ say_color pass "${statusprefix}# passed all $msg"
501
+ fi
502
+ say "${statusprefix}1..$test_count$skip_all"
503
+ fi
504
+
505
+ test -d "$remove_trash" &&
506
+ cd "$(dirname "$remove_trash")" &&
507
+ rm -rf "$(basename "$remove_trash")"
508
+
509
+ test_at_end_hook_
510
+
511
+ exit 0 ;;
512
+
513
+ *)
514
+ if test $test_external_has_tap -eq 0
515
+ then
516
+ say_color error "${statusprefix}# failed $test_failure among $msg"
517
+ say "${statusprefix}1..$test_count"
518
+ fi
519
+
520
+ exit 1 ;;
521
+
522
+ esac
523
+ }
524
+
525
+
526
+ # Set up a directory that we can put in PATH which redirects all gistore
527
+ # calls.
528
+ if test -n "$TEST_LOCAL_UNINSTALLED"
529
+ then
530
+ PATH="$GISTORE_BIN_DIR:$PATH"
531
+ export PATH
532
+ fi
533
+
534
+ # GIT_TEST_CMP is used in function test_cmp
535
+ if test -z "$GIT_TEST_CMP"
536
+ then
537
+ if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT"
538
+ then
539
+ GIT_TEST_CMP="$DIFF -c"
540
+ else
541
+ GIT_TEST_CMP="$DIFF -u"
542
+ fi
543
+ fi
544
+
545
+ # Test repository
546
+ TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)"
547
+ test -n "$root" && TRASH_DIRECTORY="$root/$TRASH_DIRECTORY"
548
+ case "$TRASH_DIRECTORY" in
549
+ /*) ;; # absolute path is good
550
+ *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY" ;;
551
+ esac
552
+ test ! -z "$debug" || remove_trash=$TRASH_DIRECTORY
553
+ rm -fr "$TRASH_DIRECTORY" || {
554
+ GIT_EXIT_OK=t
555
+ echo >&5 "FATAL: Cannot prepare test area"
556
+ exit 1
557
+ }
558
+
559
+ HOME="$TRASH_DIRECTORY"
560
+ export HOME
561
+
562
+ if test -z "$TEST_NO_CREATE_REPO"
563
+ then
564
+ test_create_repo "$TRASH_DIRECTORY"
565
+ else
566
+ mkdir -p "$TRASH_DIRECTORY"
567
+ fi
568
+
569
+ # Use -P to resolve symlinks in our working directory so that the cwd
570
+ # in subprocesses like git equals our $PWD (for pathname comparisons).
571
+ cd -P "$TRASH_DIRECTORY" || exit 1
572
+
573
+ this_test=${0##*/}
574
+ this_test=${this_test%%-*}
575
+ if match_pattern_list "$this_test" $GIT_SKIP_TESTS
576
+ then
577
+ say_color info >&3 "skipping test $this_test altogether"
578
+ skip_all="skip all tests in $this_test"
579
+ test_done
580
+ fi
581
+
582
+ # Provide an implementation of the 'yes' utility
583
+ yes () {
584
+ if test $# = 0
585
+ then
586
+ y=y
587
+ else
588
+ y="$*"
589
+ fi
590
+
591
+ while echo "$y"
592
+ do
593
+ :
594
+ done
595
+ }
596
+
597
+ # Git capibilities
598
+ if test $(gistore check-git-version 1.8.2) -ge 0; then
599
+ test_set_prereq GIT_CAP_WILDMATCH
600
+ fi
601
+
602
+ ( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_1
603
+ test -z "$NO_PERL" && test_set_prereq PERL
604
+ test -z "$NO_PYTHON" && test_set_prereq PYTHON
605
+ test -n "$USE_LIBPCRE" && test_set_prereq LIBPCRE
606
+ test -z "$NO_GETTEXT" && test_set_prereq GETTEXT
607
+
608
+ # Use this instead of test_cmp to compare files that contain expected and
609
+ # actual output from git commands that can be translated. When running
610
+ # under GETTEXT_POISON this pretends that the command produced expected
611
+ # results.
612
+ test_i18ncmp () {
613
+ test -n "$GETTEXT_POISON" || test_cmp "$@"
614
+ }
615
+
616
+ # Use this instead of "grep expected-string actual" to see if the
617
+ # output from a git command that can be translated either contains an
618
+ # expected string, or does not contain an unwanted one. When running
619
+ # under GETTEXT_POISON this pretends that the command produced expected
620
+ # results.
621
+ test_i18ngrep () {
622
+ if test -n "$GETTEXT_POISON"
623
+ then
624
+ : # pretend success
625
+ elif test "x!" = "x$1"
626
+ then
627
+ shift
628
+ ! grep "$@"
629
+ else
630
+ grep "$@"
631
+ fi
632
+ }
633
+
634
+ test_lazy_prereq PIPE '
635
+ # test whether the filesystem supports FIFOs
636
+ case $(uname -s) in
637
+ CYGWIN*)
638
+ false
639
+ ;;
640
+ *)
641
+ rm -f testfifo && mkfifo testfifo
642
+ ;;
643
+ esac
644
+ '
645
+
646
+ test_lazy_prereq SYMLINKS '
647
+ # test whether the filesystem supports symbolic links
648
+ ln -s x y && test -h y
649
+ '
650
+
651
+ test_lazy_prereq CASE_INSENSITIVE_FS '
652
+ echo good >CamelCase &&
653
+ echo bad >camelcase &&
654
+ test "$(cat CamelCase)" != good
655
+ '
656
+
657
+ test_lazy_prereq UTF8_NFD_TO_NFC '
658
+ # check whether FS converts nfd unicode to nfc
659
+ auml=$(printf "\303\244")
660
+ aumlcdiar=$(printf "\141\314\210")
661
+ >"$auml" &&
662
+ case "$(echo *)" in
663
+ "$aumlcdiar")
664
+ true ;;
665
+ *)
666
+ false ;;
667
+ esac
668
+ '
669
+
670
+ test_lazy_prereq AUTOIDENT '
671
+ sane_unset GIT_AUTHOR_NAME &&
672
+ sane_unset GIT_AUTHOR_EMAIL &&
673
+ git var GIT_AUTHOR_IDENT
674
+ '
675
+
676
+ # When the tests are run as root, permission tests will report that
677
+ # things are writable when they shouldn't be.
678
+ test -w / || test_set_prereq SANITY
679
+
680
+ GIT_UNZIP=${GIT_UNZIP:-unzip}
681
+ test_lazy_prereq UNZIP '
682
+ "$GIT_UNZIP" -v
683
+ test $? -ne 127
684
+ '