162 lines
4.3 KiB
Bash
Executable File
162 lines
4.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# TODO: needs root to mount tmpfs to test moving across filesystems.
|
|
# check handling of chattr +i immutable bit
|
|
# "touch two; chmod -w two; mv one two" shouldn't prompt to delete two if
|
|
# one doesn't exist.
|
|
|
|
# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
|
|
# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
|
|
|
|
[ -f testing.sh ] && . testing.sh
|
|
|
|
#testing "name" "command" "result" "infile" "stdin"
|
|
|
|
touch file
|
|
testing "file to file" \
|
|
"mv file file1 && [ ! -e file -a -f file1 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -f file*
|
|
|
|
touch file
|
|
mkdir dir
|
|
testing "file to dir" \
|
|
"mv file dir && [ ! -e file -a -f dir/file ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -rf file* dir*
|
|
|
|
mkdir dir
|
|
testing "dir to dir" \
|
|
"mv dir dir1 && [ ! -e dir -a -d dir1 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -rf dir*
|
|
|
|
mkdir dir1 dir2
|
|
touch file1 file2 dir1/file3
|
|
ln -s file1 link1
|
|
testing "multiple files/dirs to a dir" \
|
|
"mv file1 file2 link1 dir1 dir2 &&
|
|
[ ! -e file1 -a ! -e file2 -a ! -e link1 -a ! -e dir1 ] &&
|
|
[ -f dir2/file1 -a -f dir2/file2 -a -L dir2/link1 -a -d dir2/dir1 ] &&
|
|
[ -f dir2/dir1/file3 ] && readlink dir2/link1" \
|
|
"file1\n" "" ""
|
|
rm -rf file* link* dir*
|
|
|
|
dd if=/dev/zero of=file1 seek=10k count=1 >/dev/null 2>&1
|
|
testing "random file to new file" \
|
|
"mv file1 file2 && [ ! -e file1 -a -f file2 ] && stat -c %s file2" \
|
|
"5243392\n" "" ""
|
|
rm -f file*
|
|
|
|
touch file1
|
|
ln -s file1 link1
|
|
testing "symlink to new symlink" \
|
|
"mv link1 link2 && [ ! -e link1 -a -L link2 ] && readlink link2" \
|
|
"file1\n" "" ""
|
|
unlink tLink2 &>/dev/null
|
|
rm -f file* link*
|
|
|
|
touch file1
|
|
ln file1 link1
|
|
testing "hard link to new hardlink" \
|
|
"mv link1 link2 && [ ! -e link1 -a -f link2 -a file1 -ef link2 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
unlink link2 &>/dev/null
|
|
rm -f file* link*
|
|
|
|
touch file1
|
|
chmod a-r file1
|
|
testing "file to unreadable file" \
|
|
"mv file1 file2 && [ ! -e file1 -a -f file2 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -f file*
|
|
|
|
touch file1
|
|
ln file1 link1
|
|
mkdir dir1
|
|
testing "file hardlink dir" \
|
|
"mv file1 link1 dir1 &&
|
|
[ ! -e file1 -a ! -e link1 -a -f dir1/file1 -a -f dir1/link1 ] &&
|
|
[ dir1/file1 -ef dir1/link1 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -rf file* link* dir*
|
|
|
|
mkdir -p dir1/dir2 dir3
|
|
touch dir1/dir2/file1 dir1/dir2/file2
|
|
testing "dir to new dir" \
|
|
"mv dir1/dir2 dir3/new &&
|
|
[ ! -e dir1/dir2 -a -d dir3/new -a -f dir3/new/file1 ] &&
|
|
[ -f dir3/new/file2 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -rf file* dir*
|
|
|
|
mkdir dir1 dir2
|
|
testing "dir to existing dir" \
|
|
"mv dir1 dir2 && [ ! -e dir1 -a -d dir2/dir1 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -rf dir*
|
|
|
|
# Trailing slash was once throwing: bad 'dir1/dir2/': Resource busy
|
|
mkdir -p dir1/dir2
|
|
testing "dir1/dir2 to ." \
|
|
"mv dir1/dir2 . && [ ! -e dir1/dir2 -a -d dir2 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -rf dir*
|
|
mkdir -p dir1/dir2
|
|
testing "dir1/dir2/ to ." \
|
|
"mv dir1/dir2/ . && [ ! -e dir1/dir2 -a -d dir2 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -rf dir*
|
|
mkdir -p dir1/dir2
|
|
testing "dir1/dir2/ to ./" \
|
|
"mv dir1/dir2/ ./ && [ ! -e dir1/dir2 -a -d dir2 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -rf dir*
|
|
testing "not/exists/ to ./" \
|
|
"mv not/exists/ ./ 2>&1 | grep -o not/exists/" \
|
|
"not/exists/\n" "" ""
|
|
|
|
touch file1 file2
|
|
chmod 400 file1 file2
|
|
testing "force over unwritable" \
|
|
"mv -f file1 file2 && [ ! -e file1 -a -e file2 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -f file*
|
|
|
|
touch file1 file2
|
|
testing "no clobber (dest exists)" \
|
|
"mv -n file1 file2 && [ -e file1 -a -e file2 ] && echo yes"\
|
|
"yes\n" "" ""
|
|
rm -f file*
|
|
|
|
touch file1
|
|
testing "no clobber (dest doesn't exist)" \
|
|
"mv -n file1 new-dest && [ ! -e file1 -a -e new-dest ] && echo yes"\
|
|
"yes\n" "" ""
|
|
rm -f file*
|
|
|
|
touch file1 file2
|
|
chmod 400 file1 file2
|
|
testing "over unwritable file only prompts when stdin is a terminal" \
|
|
"mv file2 file1 2>/dev/null && [ -e file1 -a ! -e file2 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -f file*
|
|
|
|
touch file1 file2
|
|
testing "interactive: no stdin" \
|
|
"mv -i file2 file1 2>/dev/null && [ -e file1 -a -e file2 ] && echo yes" \
|
|
"yes\n" "" ""
|
|
rm -f file*
|
|
|
|
touch file1 file2
|
|
testing "interactive: answered YES" \
|
|
"mv -i file2 file1 2>/dev/null && [ -e file1 -a ! -e file2 ] && echo yes" \
|
|
"yes\n" "" "y\n"
|
|
rm -f file*
|
|
|
|
touch file1 file2
|
|
testing "interactive: answered NO" \
|
|
"mv -i file2 file1 2>/dev/null && [ -e file1 -a -e file2 ] && echo yes" \
|
|
"yes\n" "" "n\n"
|
|
rm -f file*
|