You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

916 lines
26 KiB

#!/bin/sh
#
# Usage: git-ftp-test.sh
#
# You can define environment variables to choose the FTP server to test on.
#
# Example:
# export GIT_FTP_ROOT='localhost/git-ftp-tests'
# export GIT_FTP_USER='git-ftp-test'
# export GIT_FTP_PASSWD='s3cr3t'
# ./git-ftp-test.sh
#
# You can choose test cases as well:
# export TEST_CASES='test_displays_usage test_prints_version'
# ./git-ftp-test.sh
#
# Or you can write it in one line:
# TEST_CASES='test_displays_usage' GIT_FTP_PASSWD='s3cr3t' ./git-ftp-test.sh
suite() {
for testcase in ${TEST_CASES}; do
suite_addTest "$testcase"
done
}
oneTimeSetUp() {
GIT_FTP_CMD="$(dirname "$TESTDIR")/git-ftp"
: ${GIT_FTP_USER=ftp}
: ${GIT_FTP_PASSWD=}
: ${GIT_FTP_ROOT=localhost}
START=$(date +%s)
}
oneTimeTearDown() {
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
}
setUp() {
if command -v mktemp > /dev/null 2>&1; then
GIT_PROJECT_PATH="$(mktemp -d -t git-ftp-XXXX)"
else
GIT_PROJECT_PATH="git-ftp-test-repo-$(date | md5sum | cut -d ' ' -f1)"
mkdir -p "$GIT_PROJECT_PATH"
fi
GIT_PROJECT_NAME="$(basename $GIT_PROJECT_PATH)"
GIT_FTP_URL="$GIT_FTP_ROOT/$GIT_PROJECT_NAME"
CURL_URL="ftp://$GIT_FTP_USER:$GIT_FTP_PASSWD@$GIT_FTP_URL"
[ -n "$GIT_FTP_USER" ] && GIT_FTP_USER_ARG="-u $GIT_FTP_USER"
[ -n "$GIT_FTP_PASSWD" ] && GIT_FTP_PASSWD_ARG="-p $GIT_FTP_PASSWD"
GIT_FTP="$GIT_FTP_CMD $GIT_FTP_USER_ARG $GIT_FTP_PASSWD_ARG $GIT_FTP_URL"
cd $GIT_PROJECT_PATH
# make some content
for i in 1 2 3 4 5
do
echo "$i" >> ./"test $i.txt"
mkdir -p "dir $i"
echo "$i" >> "dir $i/test $i.txt"
done;
# git them
git init > /dev/null 2>&1
git add . > /dev/null 2>&1
git commit -a -m "init" > /dev/null 2>&1
}
tearDown() {
tmpfiles=$(ls .git-ftp*-tmp 2> /dev/null)
assertEquals '' "$tmpfiles"
rm -rf $GIT_PROJECT_PATH
command -v lftp >/dev/null 2>&1 && {
lftp -u $GIT_FTP_USER,$GIT_FTP_PASSWD $GIT_FTP_ROOT -e "set ftp:list-options -a; rm -rf '$GIT_PROJECT_NAME'; exit" > /dev/null 2>&1
}
}
test_displays_usage() {
usage=$($GIT_FTP_CMD 2>&1)
assertEquals "git-ftp <action> [<options>] <url>" "$usage"
}
test_prints_version() {
version=$($GIT_FTP_CMD 2>&1 --version)
assertEquals = "git-ftp version 1.3.0-UNRELEASED" "$version"
}
test_inits() {
init=$($GIT_FTP init)
assertEquals 0 $?
assertTrue 'file does not exist' "remote_file_exists 'test 1.txt'"
assertTrue 'file differs' "remote_file_equals 'test 1.txt'"
}
test_init_fails() {
init=$($GIT_FTP_CMD -v -u wrong_user -p wrong_passwd $GIT_FTP_URL init 2>&1)
assertEquals 5 $?
error_count=$(echo "$init" | grep -F 'Access denied' | wc -l)
assertEquals 1 $error_count
}
test_inits_and_pushes() {
cd $GIT_PROJECT_PATH
# this should pass
init=$($GIT_FTP init)
rtrn=$?
assertEquals 0 $rtrn
# this should fail
init2=$($GIT_FTP init 2>&1)
rtrn=$?
assertEquals 2 $rtrn
assertEquals "fatal: Commit found, use 'git ftp push' to sync. Exiting..." "$init2"
# make some changes
echo "1" >> "./test 1.txt"
git commit -a -m "change" > /dev/null 2>&1
# this should pass
push=$($GIT_FTP push)
rtrn=$?
assertEquals 0 $rtrn
}
test_pushes_and_fails() {
cd $GIT_PROJECT_PATH
push="$($GIT_FTP push 2>&1)"
rtrn=$?
assertEquals "fatal: Could not get last commit. Network down? Wrong URL? Use 'git ftp init' for the initial push., exiting..." "$push"
assertEquals 5 $rtrn
}
test_push_unknown_commit() {
$GIT_FTP init > /dev/null
echo '000000000' | curl -s -T - $CURL_URL/.git-ftp.log
push="$($GIT_FTP push 0>&- 2>&1)"
assertEquals 0 $?
assertContains 'Unknown SHA1 object' "$push"
assertContains 'Do you want to ignore' "$push"
}
test_push_nothing() {
init=$($GIT_FTP init)
# make some changes
echo "1" >> "./test 1.txt"
git commit -a -m "change" > /dev/null 2>&1
push=$($GIT_FTP push --dry-run)
assertEquals 0 $?
assertTrue "$push" "echo \"$push\" | grep '1 file to sync:'"
echo 'test 1.txt' >> .git-ftp-ignore
push=$($GIT_FTP push)
assertEquals 0 $?
firstline=$(echo "$push" | head -n 1)
assertEquals 'There are no files to sync.' "$firstline"
}
test_push_added() {
cd $GIT_PROJECT_PATH
init=$($GIT_FTP init)
# add a file
file='newfile.txt'
echo "1" > "./$file"
git add $file
git commit -m "change" > /dev/null 2>&1
push=$($GIT_FTP push)
assertEquals 0 $? || echo "Push: $push"
assertEquals "1" "$(curl -s $CURL_URL/$file)"
}
test_push_twice() {
cd $GIT_PROJECT_PATH
init=$($GIT_FTP init)
# make some changes
echo "1" >> "./test 1.txt"
git commit -a -m "change" > /dev/null 2>&1
push=$($GIT_FTP push)
assertEquals 0 $? || echo "First push: $push"
push=$($GIT_FTP push)
assertEquals 0 $? || echo "Second push: $push"
assertTrue "$push" "echo \"$push\" | grep 'Everything up-to-date.'"
}
test_push_unknown_sha1() {
cd $GIT_PROJECT_PATH
init=$($GIT_FTP init)
# make some changes
echo "1" >> "./test 1.txt"
git commit -a -m "change" > /dev/null 2>&1
# change remote SHA1
echo '000000000' | curl -T - $CURL_URL/.git-ftp.log 2> /dev/null
push=$(echo 'N' | $GIT_FTP push)
assertEquals 0 $?
echo "$push" | grep 'Unknown SHA1 object' > /dev/null
assertFalse ' test 1.txt uploaded' "remote_file_equals 'test 1.txt'"
}
test_push_unknown_sha1_Y() {
cd $GIT_PROJECT_PATH
init=$($GIT_FTP init)
# make some changes
echo "1" >> "./test 1.txt"
git commit -a -m "change" > /dev/null 2>&1
# change remote SHA1
echo '000000000' | curl -T - $CURL_URL/.git-ftp.log 2> /dev/null
push=$(echo 'Y' | $GIT_FTP push)
assertEquals 0 $?
echo "$push" | grep 'Unknown SHA1 object' > /dev/null
assertEquals 0 $?
assertTrue ' test 1.txt uploaded' "remote_file_equals 'test 1.txt'"
}
test_defaults() {
cd $GIT_PROJECT_PATH
git config git-ftp.user $GIT_FTP_USER
git config git-ftp.password $GIT_FTP_PASSWD
git config git-ftp.url $GIT_FTP_URL
init=$($GIT_FTP_CMD init)
rtrn=$?
assertEquals 0 $rtrn
}
test_defaults_uses_url_by_cli() {
cd $GIT_PROJECT_PATH
git config git-ftp.user $GIT_FTP_USER
git config git-ftp.password $GIT_FTP_PASSWD
git config git-ftp.url notexisits
init=$($GIT_FTP_CMD init $GIT_FTP_URL)
rtrn=$?
assertEquals 0 $rtrn
}
test_defaults_uses_user_by_cli() {
[ -z "$GIT_FTP_USER" ] && startSkipping
cd $GIT_PROJECT_PATH
git config git-ftp.user johndoe
git config git-ftp.password $GIT_FTP_PASSWD
git config git-ftp.url $GIT_FTP_URL
init=$($GIT_FTP_CMD init $GIT_FTP_USER_ARG)
rtrn=$?
assertEquals 0 $rtrn
}
test_defaults_uses_password_by_cli() {
[ -z "$GIT_FTP_PASSWD" ] && startSkipping
cd $GIT_PROJECT_PATH
git config git-ftp.user $GIT_FTP_USER
git config git-ftp.password wrongpasswd
git config git-ftp.url $GIT_FTP_URL
init=$($GIT_FTP_CMD init $GIT_FTP_PASSWD_ARG)
rtrn=$?
assertEquals 0 $rtrn
}
test_deployedsha1file_rename() {
local file='git-ftp.txt'
git config git-ftp.deployedsha1file "$file"
init=$($GIT_FTP init)
assertEquals 0 $?
assertTrue " '$file' does not exist" "remote_file_exists '$file'"
assertFalse " '.git-ftp.log' does exist" "remote_file_exists '.git-ftp.log'"
}
test_scopes() {
cd $GIT_PROJECT_PATH
git config git-ftp.user $GIT_FTP_USER
git config git-ftp.password wrongpasswd
git config git-ftp.url $GIT_FTP_URL
git config git-ftp.testing.password $GIT_FTP_PASSWD
init=$($GIT_FTP_CMD init -s testing)
rtrn=$?
assertEquals 0 $rtrn
}
test_invalid_scope_name() {
out=$($GIT_FTP_CMD init -s invalid:scope 2>&1)
assertEquals 2 $?
assertEquals 'fatal: Invalid scope name.' "$out"
out=$($GIT_FTP_CMD add-scope invalid:scope 2>&1)
assertEquals 2 $?
assertEquals 'fatal: Invalid scope name.' "$out"
}
test_scopes_using_branchname_as_scope() {
cd $GIT_PROJECT_PATH
git config git-ftp.production.user $GIT_FTP_USER
git config git-ftp.production.password $GIT_FTP_PASSWD
git config git-ftp.production.url $GIT_FTP_URL
git checkout -b production > /dev/null 2>&1
init=$($GIT_FTP_CMD init -s)
rtrn=$?
assertEquals 0 $rtrn
}
test_overwrite_defaults_by_scopes_emtpy_string() {
cd $GIT_PROJECT_PATH
git config git-ftp.user $GIT_FTP_USER
git config git-ftp.password $GIT_FTP_PASSWD
git config git-ftp.url $GIT_FTP_URL
git config git-ftp.testing.url ''
init=$($GIT_FTP_CMD init -s testing 2>/dev/null)
rtrn=$?
assertEquals 3 $rtrn
}
test_scopes_uses_password_by_cli() {
cd $GIT_PROJECT_PATH
git config git-ftp.user $GIT_FTP_USER
git config git-ftp.password wrongpasswd
git config git-ftp.url $GIT_FTP_URL
git config git-ftp.testing.password wrongpasswdtoo
init=$($GIT_FTP_CMD init -s testing $GIT_FTP_PASSWD_ARG)
rtrn=$?
assertEquals 0 $rtrn
}
test_scopes_add() {
add=$($GIT_FTP_CMD add-scope xyz ftpes://user:password@ftp.example.com/xyz)
assertEquals 0 $?
assertFalse 'Does not display warning with valid URL' "echo $add | grep ^Warning -q"
add=$($GIT_FTP_CMD add-scope xyz ftpes://user:pass:word@ftp.example.com/xyz)
assertEquals 0 $?
assertTrue 'Does display warning invalid URL' "echo $add | grep ^Warning -q"
}
test_delete() {
cd $GIT_PROJECT_PATH
init=$($GIT_FTP init)
assertTrue 'test failed: file does not exist' "remote_file_exists 'test 1.txt'"
git rm "test 1.txt" > /dev/null 2>&1
git commit -a -m "delete file" > /dev/null 2>&1
push=$($GIT_FTP push)
rtrn=$?
assertEquals 0 $rtrn
assertFalse 'test failed: file still exists' "remote_file_exists 'test 1.txt'"
assertTrue 'test failed: file does not exist' "remote_file_exists 'dir 1/test 1.txt'"
git rm -r "dir 1" > /dev/null 2>&1
git commit -a -m "delete dir" > /dev/null 2>&1
push=$($GIT_FTP push)
assertFalse 'test failed: dir and file still exists' "remote_file_exists 'dir 1/test 1.txt'"
# See https://github.com/git-ftp/git-ftp/issues/168
# assertFalse 'test failed: dir still exists' "remote_file_exists 'dir 1/'"
}
test_ignore_single_file() {
cd $GIT_PROJECT_PATH
echo "test 1.txt" > .git-ftp-ignore
init=$($GIT_FTP init)
assertFalse 'test failed: file was not ignored' "remote_file_exists 'test 1.txt'"
}
test_ignore_single_file_force_unknown_commit() {
init=$($GIT_FTP init)
local file='ignored.txt'
touch $file
echo $file > .git-ftp-ignore
git add .
git commit -m 'added new file that should be ignored' -q
echo '000000000' | curl -s -T - $CURL_URL/.git-ftp.log
push=$($GIT_FTP push -f)
assertFalse 'test failed: file was not ignored' "remote_file_exists '$file'"
}
test_ignore_dir() {
cd $GIT_PROJECT_PATH
echo "dir 1/*" > .git-ftp-ignore
init=$($GIT_FTP init)
assertFalse 'test failed: dir was not ignored' "remote_file_exists 'dir 1/test 1.txt'"
assertTrue 'test failed: wrong dir was ignored' "remote_file_exists 'dir 2/test 2.txt'"
}
test_ignore_pattern() {
cd $GIT_PROJECT_PATH
echo "test*" > .git-ftp-ignore
init=$($GIT_FTP init)
for i in 1 2 3 4 5
do
assertFalse 'test failed: was not ignored' "remote_file_exists 'test $i.txt'"
done;
}
test_ignore_pattern_single() {
cd $GIT_PROJECT_PATH
echo 'test' > 'test'
echo 'test' > .git-ftp-ignore
git add .
git commit -m 'adding file that should not be uploaded' > /dev/null
init=$($GIT_FTP init)
assertFalse 'test failed: was not ignored' "remote_file_exists 'test'"
for i in 1 2 3 4 5
do
assertTrue 'test failed: was ignored' "remote_file_exists 'test $i.txt'"
done;
}
test_ignore_wildcard_files() {
cd $GIT_PROJECT_PATH
echo "test *.txt" > .git-ftp-ignore
init=$($GIT_FTP init)
for i in 1 2 3 4 5
do
assertFalse 'test failed: was not ignored' "remote_file_exists 'test $i.txt'"
done;
}
test_include_init() {
echo 'unversioned' > unversioned.txt
echo 'unversioned.txt' >> .gitignore
echo 'unversioned.txt:test 1.txt' > .git-ftp-include
git add .
git commit -m 'unversioned file unversioned.txt should be uploaded with test 1.txt' > /dev/null
init=$($GIT_FTP init)
assertTrue 'unversioned.txt was not uploaded' "remote_file_exists 'unversioned.txt'"
}
test_include_directory() {
mkdir unversioned
touch unversioned/file.txt
echo 'unversioned/:test 1.txt' > .git-ftp-include
mkdir unversioned-not-included
touch unversioned-not-included/file.txt
init=$($GIT_FTP init)
assertTrue 'unversioned/file.txt was not uploaded' "remote_file_exists 'unversioned/file.txt'"
assertFalse 'unversioned-not-included/file.txt was uploaded' "remote_file_exists 'unversioned-not-included/file.txt'"
}
test_include_directory_always() {
mkdir unversioned
touch unversioned/file.txt
echo '!unversioned/' > .git-ftp-include
mkdir unversioned-not-included
touch unversioned-not-included/file.txt
init=$($GIT_FTP init)
assertTrue 'unversioned/file.txt was not uploaded' "remote_file_exists 'unversioned/file.txt'"
assertFalse 'unversioned-not-included/file.txt was uploaded' "remote_file_exists 'unversioned-not-included/file.txt'"
}
test_include_whitespace_init() {
cd $GIT_PROJECT_PATH
echo 'unversioned' > unversioned.txt
echo 'unversioned.txt' >> .gitignore
echo 'unversioned.txt:test X.txt' > .git-ftp-include
git add .
git commit -m 'unversioned file unversioned.txt should not be uploaded. test X.txt does not exist.' > /dev/null
init=$($GIT_FTP init)
assertFalse 'unversioned.txt was uploaded' "remote_file_exists 'unversioned.txt'"
}
test_include_push() {
cd $GIT_PROJECT_PATH
init=$($GIT_FTP init)
echo 'unversioned' > unversioned.txt
echo 'unversioned.txt' >> .gitignore
echo 'unversioned.txt:test 1.txt' > .git-ftp-include
echo 'new content' >> 'test 1.txt'
git add .
git commit -m 'unversioned file unversioned.txt should be uploaded with test 1.txt' > /dev/null
push=$($GIT_FTP push)
assertTrue 'unversioned.txt was not uploaded' "remote_file_exists 'unversioned.txt'"
}
test_include_push_delete() {
echo 'unversioned' > unversioned.txt
echo 'unversioned.txt' >> .gitignore
echo 'unversioned.txt:test 1.txt' > .git-ftp-include
echo 'unversioned.txt:test 2.txt' >> .git-ftp-include
echo 'new content' >> 'test 1.txt'
git add .
git commit -m 'unversioned file unversioned.txt should be uploaded with test 1.txt' -q
init=$($GIT_FTP init)
git rm 'test 1.txt' -q
git commit -m 'the trigger file of unversioned.txt is deleted which deletes the target file' -q
push=$($GIT_FTP push)
assertTrue 'unversioned.txt was deleted' "remote_file_exists 'unversioned.txt'"
echo 'new content' >> 'test 2.txt'
rm 'unversioned.txt'
git commit -a -m 'the local deletion of unversioned.txt should delete remote file' -q
push=$($GIT_FTP push)
assertFalse 'unversioned.txt was not deleted' "remote_file_exists 'unversioned.txt'"
}
test_include_ignore_init() {
cd $GIT_PROJECT_PATH
echo 'htaccess' > .htaccess
echo 'htaccess.prod' > .htaccess.prod
echo '.htaccess:.htaccess.prod' > .git-ftp-include
echo '.htaccess.prod' > .gitignore
git add .
git commit -m 'htaccess setup' > /dev/null
init=$($GIT_FTP init)
assertTrue ' .htaccess was ignored' "remote_file_exists '.htaccess'"
assertFalse ' .htaccess.prod was uploaded' "remote_file_exists '.htaccess.prod'"
}
test_include_ignore_push() {
cd $GIT_PROJECT_PATH
init=$($GIT_FTP init)
echo 'htaccess' > .htaccess
echo 'htaccess.prod' > .htaccess.prod
echo '.htaccess:.htaccess.prod' > .git-ftp-include
echo '.htaccess.prod' > .gitignore
git add .
git commit -m 'htaccess setup' > /dev/null
push=$($GIT_FTP push)
assertTrue ' .htaccess was ignored' "remote_file_exists '.htaccess'"
assertFalse ' .htaccess.prod was uploaded' "remote_file_exists '.htaccess.prod'"
}
# Testing Github issue #245
test_include_ignore_all_push() {
init=$($GIT_FTP init)
echo 'always include me' > untracked.txt
echo '!untracked.txt' > .git-ftp-include
git commit --allow-empty -m 'There are no changed files in this commit.' -q
push=$($GIT_FTP push)
assertTrue ' include file always' "remote_file_exists 'untracked.txt'"
}
test_include_ftp_ignore_init() {
cd $GIT_PROJECT_PATH
echo 'htaccess' > .htaccess
echo 'htaccess.prod' > .htaccess.prod
echo '.htaccess:.htaccess.prod' > .git-ftp-include
echo '.htaccess.prod' > .git-ftp-ignore
git add .
git commit -m 'htaccess setup' > /dev/null
init=$($GIT_FTP init)
assertTrue ' .htaccess was ignored' "remote_file_exists '.htaccess'"
assertFalse ' .htaccess.prod was uploaded' "remote_file_exists '.htaccess.prod'"
}
test_include_ftp_ignore_push() {
cd $GIT_PROJECT_PATH
init=$($GIT_FTP init)
echo 'htaccess' > .htaccess
echo 'htaccess.prod' > .htaccess.prod
echo '.htaccess:.htaccess.prod' > .git-ftp-include
echo '.htaccess.prod' > .git-ftp-ignore
git add .
git commit -m 'htaccess setup' > /dev/null
push=$($GIT_FTP push)
assertTrue ' .htaccess was ignored' "remote_file_exists '.htaccess'"
assertFalse ' .htaccess.prod was uploaded' "remote_file_exists '.htaccess.prod'"
}
# addresses issue #41
test_include_similar() {
cd $GIT_PROJECT_PATH
echo 'unversioned' > foo.html
echo '/foo.html' >> .gitignore
echo 'foo.html:templates/foo.html' > .git-ftp-include
mkdir templates
echo 'new content' >> 'templates/foo.html'
git add .
git commit -m 'unversioned file foo.html should be uploaded with templates/foo.html' > /dev/null
init=$($GIT_FTP init)
assertTrue 'foo.html was not uploaded' "remote_file_exists 'foo.html'"
assertTrue 'templates/foo.html was not uploaded' "remote_file_exists 'templates/foo.html'"
}
# resolves issue #245
test_include_syncroot() {
syncroot="dist"
targetfile="main.css"
target="$syncroot/$targetfile"
source="main.scss"
touch "$source"
mkdir "$syncroot"
touch "$target"
echo "$syncroot" > ".gitignore"
echo "$target:/$source" > ".git-ftp-include"
git add . > /dev/null
git commit -a -m "test uploading only dist files" -q
init=$($GIT_FTP init --syncroot "$syncroot")
assertTrue "remote file '$targetfile'" "remote_file_exists '$targetfile'"
}
test_hidden_file_only() {
cd $GIT_PROJECT_PATH
echo "test" > .htaccess
git add . > /dev/null 2>&1
git commit -a -m "init" > /dev/null 2>&1
init=$($GIT_FTP init)
assertTrue 'test failed: .htaccess not uploaded' "remote_file_exists '.htaccess'"
}
# issue #23
test_file_with_nonchar() {
file1='#4253-Release Contest.md'
file1enc='%234253-Release%20Contest.md'
file2='v1.2.0 #8950 - Custom Partner Player.md'
file2enc='v1.2.0%20%238950%20-%20Custom%20Partner%20Player.md'
echo 'content1' > "$file1"
echo 'content2' > "$file2"
git add .
git commit -a -m 'added special filenames' -q
init=$($GIT_FTP init)
assertTrue " file $file1 not uploaded" "remote_file_equals '$file1' '$file1enc'"
assertTrue " file $file2 not uploaded" "remote_file_equals '$file2' '$file2enc'"
git rm "$file1" -q
git rm "$file2" -q
git commit -m 'delete' -q
push=$($GIT_FTP push)
assertFalse "file $file1 still exists in $CURL_URL" "remote_file_exists '$file1enc'"
assertFalse "file $file2 still exists in $CURL_URL" "remote_file_exists '$file2enc'"
}
# issue #209
test_file_with_unicode() {
supports_unicode || startSkipping
file1='umlaut_ä.md'
file1enc='umlaut_%C3%A4.md'
echo 'content' > "$file1"
git add .
git commit -a -m 'added special filenames' -q
init=$($GIT_FTP init)
assertTrue " file $file1 not uploaded" "remote_file_equals '$file1' '$file1enc'"
git rm "$file1" -q
git commit -m 'delete' -q
push=$($GIT_FTP push)
assertFalse "file $file1 still exists in $CURL_URL" "remote_file_exists '$file1enc'"
}
test_syncroot() {
cd $GIT_PROJECT_PATH
syncroot='foo bar'
mkdir "$syncroot" && echo "test" > "$syncroot/syncroot.txt"
git add . > /dev/null 2>&1
git commit -a -m "syncroot test" > /dev/null 2>&1
init=$($GIT_FTP init --syncroot "$syncroot")
assertTrue 'test failed: syncroot.txt not there as expected' "remote_file_exists 'syncroot.txt'"
}
test_download() {
skip_without lftp
cd $GIT_PROJECT_PATH
$GIT_FTP init > /dev/null
echo 'foreign content' > external.txt
curl -T external.txt $CURL_URL/ 2> /dev/null
rtrn=$?
assertEquals 0 $rtrn
rm external.txt
$GIT_FTP download > /dev/null 2>&1
rtrn=$?
assertEquals 0 $rtrn
assertTrue ' external file not downloaded' "[ -r 'external.txt' ]"
}
test_download_untracked() {
skip_without lftp
cd $GIT_PROJECT_PATH
$GIT_FTP init > /dev/null
echo 'foreign content' | curl -T - $CURL_URL/external.txt 2> /dev/null
touch 'untracked.file'
$GIT_FTP download > /dev/null 2>&1
assertEquals 8 $?
assertFalse ' external file downloaded' "[ -f 'external.txt' ]"
assertTrue ' untracked file deleted' "[ -r 'untracked.file' ]"
}
test_download_syncroot() {
skip_without lftp
cd $GIT_PROJECT_PATH
mkdir foobar && echo "test" > foobar/syncroot.txt
git add . > /dev/null 2>&1
git commit -a -m "syncroot test" > /dev/null 2>&1
init=$($GIT_FTP init --syncroot foobar)
echo 'foreign content' > external.txt
curl -T external.txt $CURL_URL/ 2> /dev/null
rm external.txt
$GIT_FTP download --syncroot foobar/ > /dev/null 2>&1
rtrn=$?
assertEquals 0 $rtrn
assertFalse ' external file downloaded to git root' "[ -r 'external.txt' ]"
assertTrue ' external file not downloaded to syncroot' "[ -r 'foobar/external.txt' ]"
}
test_download_dry_run() {
skip_without lftp
cd $GIT_PROJECT_PATH
$GIT_FTP init > /dev/null
echo 'foreign content' | curl -T - $CURL_URL/external.txt 2> /dev/null
$GIT_FTP download --dry-run > /dev/null 2>&1
assertEquals 0 $?
assertTrue ' external file downloaded' "[ ! -e 'external.txt' ]"
}
test_pull() {
skip_without lftp
cd $GIT_PROJECT_PATH
$GIT_FTP init > /dev/null
echo 'foreign content' > external.txt
curl -T external.txt $CURL_URL/ 2> /dev/null
rm external.txt
echo 'own content' > internal.txt
git add . > /dev/null 2>&1
git commit -a -m "local modification" > /dev/null 2>&1
$GIT_FTP pull > /dev/null 2>&1
rtrn=$?
assertEquals 0 $rtrn
assertTrue ' external file not downloaded' "[ -r 'external.txt' ]"
assertTrue ' external file not listed in commit message' "git log | grep 'external.txt'"
}
test_pull_nothing() {
skip_without lftp
cd $GIT_PROJECT_PATH
$GIT_FTP init > /dev/null
$GIT_FTP pull > /dev/null 2>&1
assertEquals 0 $?
}
test_pull_branch() {
skip_without lftp
cd $GIT_PROJECT_PATH
$GIT_FTP init > /dev/null
echo 'foreign content' > external.txt
curl -T external.txt $CURL_URL/ 2> /dev/null
rm external.txt
echo 'own content' > internal.txt
git add . > /dev/null 2>&1
git commit -a -m "local modification" > /dev/null 2>&1
git checkout -b deploy-branch > /dev/null 2>&1
echo '1' > version.txt
git add -A .
git commit -m 'branch modification' > /dev/null 2>&1
$GIT_FTP pull > /dev/null 2>&1
rtrn=$?
assertEquals 0 $rtrn
assertTrue ' external file not downloaded' "[ -r 'external.txt' ]"
assertTrue ' version.txt of deploy-branch not found' "[ -r 'version.txt' ]"
assertEquals '## deploy-branch' "$(git status -sb)"
}
test_pull_no_commit() {
skip_without lftp
cd $GIT_PROJECT_PATH
$GIT_FTP init > /dev/null
echo 'foreign content' > external.txt
curl -T external.txt $CURL_URL/ 2> /dev/null
rm external.txt
echo 'own content' > internal.txt
git add . > /dev/null 2>&1
git commit -a -m "local modification" > /dev/null 2>&1
LOCAL_SHA1=$(git log -n 1 --pretty=format:%H)
$GIT_FTP pull --no-commit > /dev/null 2>&1
rtrn=$?
assertEquals 0 $rtrn
assertTrue ' external file not downloaded' "[ -r 'external.txt' ]"
assertEquals $LOCAL_SHA1 $(git log -n 1 --pretty=format:%H)
}
test_pull_dry_run() {
skip_without lftp
cd $GIT_PROJECT_PATH
$GIT_FTP init > /dev/null
echo 'foreign content' | curl -T - $CURL_URL/external.txt 2> /dev/null
echo 'own content' > internal.txt
git add . > /dev/null 2>&1
git commit -a -m "local modification" > /dev/null 2>&1
pull=$($GIT_FTP pull --dry-run 2> /dev/null)
assertEquals 0 $?
assertTrue ' external file downloaded' "[ ! -e 'external.txt' ]"
assertFalse "$pull" "echo \"$pull\" | grep 'Last deployment changed to '"
# TODO: idea: really download files and show `git diff` and `git diff --stat`, then reset
}
test_pull_untracked() {
skip_without lftp
cd $GIT_PROJECT_PATH
$GIT_FTP init > /dev/null
echo 'foreign content' | curl -T - $CURL_URL/external.txt 2> /dev/null
echo 'own content' > internal.txt
echo 'internal.txt' >> .gitignore
git add . > /dev/null 2>&1
git commit -a -m "ignore some file" > /dev/null 2>&1
pull=$($GIT_FTP pull 2> /dev/null)
assertEquals 0 $?
assertTrue 'internal.txt is missing' "[ -f internal.txt ]"
assertEquals '' "$(git log -- 'internal.txt')"
}
test_pull_stash() {
skip_without lftp
cd $GIT_PROJECT_PATH
$GIT_FTP init > /dev/null
echo 'foreign content' | curl -T - $CURL_URL/external.txt 2> /dev/null
echo 'own content' > internal.txt
git stash -u -q
pull=$($GIT_FTP pull 2> /dev/null)
assertEquals 0 $?
stash_count="$(git stash list | wc -l)"
stash_count=$((stash_count+0)) # trims whitespaces produced by wc on OSX
assertEquals 1 "$stash_count"
assertFalse 'internal.txt appeared' "[ -f internal.txt ]"
assertEquals '' "$(git log -- 'internal.txt')"
}
test_submodule() {
submodule='sub'
file='file.txt'
mkdir "$submodule"
cd "$submodule"
touch "$file"
git init -q
git add .
git commit -m 'initial submodule commit' -q
cd ..
git submodule -q add "/$submodule" > /dev/null
git commit -m 'adding submodule' -q
init=$($GIT_FTP init)
assertTrue "test failed: $file not there as expected" "remote_file_exists '$submodule/$file'"
}
test_submodule_catchup() {
submodule='sub'
file='file.txt'
mkdir "$submodule"
cd "$submodule"
touch "$file"
git init -q
git add .
git commit -m 'initial submodule commit' -q
cd ..
git submodule -q add "/$submodule" > /dev/null
git commit -m 'adding submodule' -q
catchup=$($GIT_FTP catchup)
assertTrue "test failed: $submodule/.git-ftp.log not there as expected" "remote_file_exists '$submodule/.git-ftp.log'"
}
disabled_test_file_named_dash() {
cd $GIT_PROJECT_PATH
echo "foobar" > -
assertTrue 'test failed: file named - not there as expected' "[ -f '$GIT_PROJECT_PATH/-' ]"
git add . > /dev/null 2>&1
git commit -a -m "file named - test" > /dev/null 2>&1
init=$($GIT_FTP init)
rtrn=$?
assertEquals 0 $rtrn
}
remote_file_exists() {
curl "$CURL_URL/$1" --head > /dev/null
}
remote_file_equals() {
local file="$1"
local remote="$2"
[ -z "$remote" ] && remote="$file"
curl -s "$CURL_URL/$remote" | diff - "$file" > /dev/null
}
assertContains() {
assertTrue "Could not find expression: $1\nTested: $2" "echo \"$2\" | grep '$1'"
}
skip_without() {
command -v $1 > /dev/null || startSkipping
}
# Git for Windows running with Wine doesn't handle unicode well.
# Unicode filenames don't work on Windows at the moment.
# - `sort -u` thinks that 'a' equals 'ä' and therefore omits 'ä'.
# - `curl` fails to open files with unicode in their name bagder/curl#345
supports_unicode() {
count="$(printf 'a\nä\n' | sort -u | wc -l)"
count=$((count+0)) # trims whitespaces produced by wc on OSX
test "$count" = "2"
}
abs_dirname() {
# Some systems don't know the `realpath` command and `readlink -f` doesn't work on OSX ...
# use workaround from http://stackoverflow.com/a/3572105
(cd "$(dirname "$1")" && echo "$PWD")
}
# load and run shUnit2
TESTDIR="$(abs_dirname "$0")"
. $TESTDIR/shunit2-2.1.6/src/shunit2