summaryrefslogtreecommitdiff
path: root/tests/cp/same-file
blob: 981f0768c758292afaf055fc9760d1326b250c7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/bin/sh

LANGUAGE=C; export LANGUAGE
LANG=C; export LANG

VERSION_CONTROL=numbered; export VERSION_CONTROL

pwd=`pwd`
PATH=$pwd/../../src:$PATH

actual=actual-$$
expected=expected-$$
trap "cd $pwd; rm -rf $actual $expected dir" 0 1 2 3 15

exec 1> $actual

contents=XYZ
for args in 'foo symlink' 'symlink foo' 'foo foo' 'sl1 sl2'; do
  for options in '' -b -d -bd -bdf; do
    rm -rf dir
    mkdir dir
    cd dir
    echo $contents > foo
    case "$args" in *symlink*) ln -s foo symlink ;; esac
    case "$args" in *sl1*) ln -s foo sl1;; esac
    case "$args" in *sl2*) ln -s foo sl2;; esac
    (
      (
	cp $options $args 2>.err
	echo $?
	test -s .err && echo "[`cat .err`]"
	# Strip off all but the file names.
	ls -lG * | sed 's/^..............................................//'
	for f in $args; do
	  if test -f $f; then
	    # make sure the file was copied.
	    case "`cat $f`" in
	      "$contents") ;;
	      *) echo cp FAILED;;
	    esac
	  else
	    echo symlink-loop
	  fi
	done
      ) | tr '\012' ' '
      echo
    ) | sed 's/  *$//'
    cd ..
  done
  echo
done

cat <<\EOF > $expected
1 [cp: `foo' and `symlink' are the same file] foo symlink -> foo
0 foo symlink symlink.~1~ -> foo
1 [cp: `foo' and `symlink' are the same file] foo symlink -> foo
0 foo symlink symlink.~1~ -> foo
0 foo symlink symlink.~1~ -> foo

1 [cp: `symlink' and `foo' are the same file] foo symlink -> foo
1 [cp: `symlink' and `foo' are the same file] foo symlink -> foo
1 [cp: `symlink' and `foo' are the same file] foo symlink -> foo
0 foo -> foo foo.~1~ symlink -> foo symlink-loop symlink-loop
0 foo -> foo foo.~1~ symlink -> foo symlink-loop symlink-loop

1 [cp: `foo' and `foo' are the same file] foo
1 [cp: `foo' and `foo' are the same file] foo
1 [cp: `foo' and `foo' are the same file] foo
1 [cp: `foo' and `foo' are the same file] foo
0 foo foo.~1~

1 [cp: `sl1' and `sl2' are the same file] foo sl1 -> foo sl2 -> foo
0 foo sl1 -> foo sl2 sl2.~1~ -> foo
1 [cp: `sl1' and `sl2' are the same file] foo sl1 -> foo sl2 -> foo
0 foo sl1 -> foo sl2 -> foo sl2.~1~ -> foo
0 foo sl1 -> foo sl2 -> foo sl2.~1~ -> foo

EOF

cmp $expected $actual || cat $actual 1>&2