#!/bin/sh
#
# Copyright (c) 2019 Stefan Sperling <stsp@openbsd.org>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
. ./common.sh
function test_update_basic {
local testroot=`test_init update_basic`
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
echo "modified alpha" > $testroot/repo/alpha
git_commit $testroot/repo -m "modified alpha"
echo "U alpha" > $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
echo "modified alpha" > $testroot/content.expected
cat $testroot/wt/alpha > $testroot/content
cmp $testroot/content.expected $testroot/content
ret="$?"
if [ "$ret" != "0" ]; then
diff -u $testroot/content.expected $testroot/content
fi
test_done "$testroot" "$ret"
}
function test_update_adds_file {
local testroot=`test_init update_adds_file`
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
echo "new" > $testroot/repo/gamma/new
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "adding a new file"
echo "A gamma/new" > $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
echo "new" >> $testroot/content.expected
cat $testroot/wt/gamma/new > $testroot/content
cmp $testroot/content.expected $testroot/content
ret="$?"
if [ "$ret" != "0" ]; then
diff -u $testroot/content.expected $testroot/content
fi
test_done "$testroot" "$ret"
}
function test_update_deletes_file {
local testroot=`test_init update_deletes_file`
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
(cd $testroot/repo && git_rm $testroot/repo beta)
git_commit $testroot/repo -m "deleting a file"
echo "D beta" > $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
if [ -e $testroot/wt/beta ]; then
echo "removed file beta still exists on disk" >&2
test_done "$testroot" "1"
return 1
fi
test_done "$testroot" "0"
}
function test_update_deletes_dir {
local testroot=`test_init update_deletes_dir`
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
(cd $testroot/repo && git_rm $testroot/repo -r epsilon)
git_commit $testroot/repo -m "deleting a directory"
echo "D epsilon/zeta" > $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
if [ -e $testroot/wt/epsilon ]; then
echo "removed dir epsilon still exists on disk" >&2
test_done "$testroot" "1"
return 1
fi
test_done "$testroot" "0"
}
function test_update_deletes_dir_with_path_prefix {
local testroot=`test_init update_deletes_dir_with_path_prefix`
local first_rev=`git_show_head $testroot/repo`
mkdir $testroot/repo/epsilon/psi
echo mu > $testroot/repo/epsilon/psi/mu
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "adding a sub-directory beneath epsilon"
# check out the epsilon/ sub-tree
got checkout -p epsilon $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
# update back to first commit and expect psi/mu to be deleted
echo "D psi/mu" > $testroot/stdout.expected
echo "Updated to commit $first_rev" >> $testroot/stdout.expected
(cd $testroot/wt && got update -c $first_rev > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
if [ -e $testroot/wt/psi ]; then
echo "removed dir psi still exists on disk" >&2
test_done "$testroot" "1"
return 1
fi
test_done "$testroot" "0"
}
function test_update_deletes_dir_recursively {
local testroot=`test_init update_deletes_dir_recursively`
local first_rev=`git_show_head $testroot/repo`
mkdir $testroot/repo/epsilon/psi
echo mu > $testroot/repo/epsilon/psi/mu
mkdir $testroot/repo/epsilon/psi/chi
echo tau > $testroot/repo/epsilon/psi/chi/tau
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "adding a sub-directory beneath epsilon"
# check out the epsilon/ sub-tree
got checkout -p epsilon $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
# update back to first commit and expect psi/mu to be deleted
echo "D psi/chi/tau" > $testroot/stdout.expected
echo "D psi/mu" >> $testroot/stdout.expected
echo "Updated to commit $first_rev" >> $testroot/stdout.expected
(cd $testroot/wt && got update -c $first_rev > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
if [ -e $testroot/wt/psi ]; then
echo "removed dir psi still exists on disk" >&2
test_done "$testroot" "1"
return 1
fi
test_done "$testroot" "0"
}
function test_update_sibling_dirs_with_common_prefix {
local testroot=`test_init update_sibling_dirs_with_common_prefix`
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
mkdir $testroot/repo/epsilon2
echo mu > $testroot/repo/epsilon2/mu
(cd $testroot/repo && git add epsilon2/mu)
git_commit $testroot/repo -m "adding sibling of epsilon"
echo change > $testroot/repo/epsilon/zeta
git_commit $testroot/repo -m "changing epsilon/zeta"
echo "U epsilon/zeta" > $testroot/stdout.expected
echo "A epsilon2/mu" >> $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
echo "another change" > $testroot/repo/epsilon/zeta
git_commit $testroot/repo -m "changing epsilon/zeta again"
echo "U epsilon/zeta" > $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
# Bug: This update used to do delete/add epsilon2/mu again:
# U epsilon/zeta
# D epsilon2/mu <--- not intended
# A epsilon2/mu <--- not intended
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
test_done "$testroot" "0"
}
function test_update_dir_with_dot_sibling {
local testroot=`test_init update_dir_with_dot_sibling`
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
echo text > $testroot/repo/epsilon.txt
(cd $testroot/repo && git add epsilon.txt)
git_commit $testroot/repo -m "adding sibling of epsilon"
echo change > $testroot/repo/epsilon/zeta
git_commit $testroot/repo -m "changing epsilon/zeta"
echo "A epsilon.txt" > $testroot/stdout.expected
echo "U epsilon/zeta" >> $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
echo "another change" > $testroot/repo/epsilon/zeta
git_commit $testroot/repo -m "changing epsilon/zeta again"
echo "U epsilon/zeta" > $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
test_done "$testroot" "0"
}
function test_update_moves_files_upwards {
local testroot=`test_init update_moves_files_upwards`
mkdir $testroot/repo/epsilon/psi
echo mu > $testroot/repo/epsilon/psi/mu
mkdir $testroot/repo/epsilon/psi/chi
echo tau > $testroot/repo/epsilon/psi/chi/tau
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "adding a sub-directory beneath epsilon"
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
(cd $testroot/repo && git mv epsilon/psi/mu epsilon/mu)
(cd $testroot/repo && git mv epsilon/psi/chi/tau epsilon/psi/tau)
git_commit $testroot/repo -m "moving files upwards"
echo "A epsilon/mu" > $testroot/stdout.expected
echo "D epsilon/psi/chi/tau" >> $testroot/stdout.expected
echo "D epsilon/psi/mu" >> $testroot/stdout.expected
echo "A epsilon/psi/tau" >> $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
if [ -e $testroot/wt/epsilon/psi/chi ]; then
echo "removed dir epsilon/psi/chi still exists on disk" >&2
test_done "$testroot" "1"
return 1
fi
if [ -e $testroot/wt/epsilon/psi/mu ]; then
echo "removed file epsilon/psi/mu still exists on disk" >&2
test_done "$testroot" "1"
return 1
fi
test_done "$testroot" "0"
}
function test_update_moves_files_to_new_dir {
local testroot=`test_init update_moves_files_to_new_dir`
mkdir $testroot/repo/epsilon/psi
echo mu > $testroot/repo/epsilon/psi/mu
mkdir $testroot/repo/epsilon/psi/chi
echo tau > $testroot/repo/epsilon/psi/chi/tau
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "adding a sub-directory beneath epsilon"
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
mkdir -p $testroot/repo/epsilon-new/psi
(cd $testroot/repo && git mv epsilon/psi/mu epsilon-new/mu)
(cd $testroot/repo && git mv epsilon/psi/chi/tau epsilon-new/psi/tau)
git_commit $testroot/repo -m "moving files upwards"
echo "A epsilon-new/mu" > $testroot/stdout.expected
echo "A epsilon-new/psi/tau" >> $testroot/stdout.expected
echo "D epsilon/psi/chi/tau" >> $testroot/stdout.expected
echo "D epsilon/psi/mu" >> $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
if [ -e $testroot/wt/epsilon/psi/chi ]; then
echo "removed dir epsilon/psi/chi still exists on disk" >&2
test_done "$testroot" "1"
return 1
fi
if [ -e $testroot/wt/epsilon/psi/mu ]; then
echo "removed file epsilon/psi/mu still exists on disk" >&2
test_done "$testroot" "1"
return 1
fi
test_done "$testroot" "0"
}
function test_update_creates_missing_parent {
local testroot=`test_init update_creates_missing_parent no_tree`
touch $testroot/repo/Makefile
touch $testroot/repo/snake.6
touch $testroot/repo/snake.c
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "adding initial snake tree"
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
mkdir -p $testroot/repo/snake
(cd $testroot/repo && git mv Makefile snake.6 snake.c snake)
touch $testroot/repo/snake/move.c
touch $testroot/repo/snake/pathnames.h
touch $testroot/repo/snake/snake.h
mkdir -p $testroot/repo/snscore
touch $testroot/repo/snscore/Makefile
touch $testroot/repo/snscore/snscore.c
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "restructuring snake tree"
echo "D Makefile" > $testroot/stdout.expected
echo "D snake.6" >> $testroot/stdout.expected
echo "D snake.c" >> $testroot/stdout.expected
echo "A snake/Makefile" >> $testroot/stdout.expected
echo "A snake/move.c" >> $testroot/stdout.expected
echo "A snake/pathnames.h" >> $testroot/stdout.expected
echo "A snake/snake.6" >> $testroot/stdout.expected
echo "A snake/snake.c" >> $testroot/stdout.expected
echo "A snake/snake.h" >> $testroot/stdout.expected
echo "A snscore/Makefile" >> $testroot/stdout.expected
echo "A snscore/snscore.c" >> $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
test_done "$testroot" "0"
}
function test_update_creates_missing_parent_with_subdir {
local testroot=`test_init update_creates_missing_parent no_tree`
touch $testroot/repo/Makefile
touch $testroot/repo/snake.6
touch $testroot/repo/snake.c
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "adding initial snake tree"
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
mkdir -p $testroot/repo/sss/snake
(cd $testroot/repo && git mv Makefile snake.6 snake.c sss/snake)
touch $testroot/repo/sss/snake/move.c
touch $testroot/repo/sss/snake/pathnames.h
touch $testroot/repo/sss/snake/snake.h
mkdir -p $testroot/repo/snscore
touch $testroot/repo/snscore/Makefile
touch $testroot/repo/snscore/snscore.c
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "restructuring snake tree"
echo "D Makefile" > $testroot/stdout.expected
echo "D snake.6" >> $testroot/stdout.expected
echo "D snake.c" >> $testroot/stdout.expected
echo "A snscore/Makefile" >> $testroot/stdout.expected
echo "A snscore/snscore.c" >> $testroot/stdout.expected
echo "A sss/snake/Makefile" >> $testroot/stdout.expected
echo "A sss/snake/move.c" >> $testroot/stdout.expected
echo "A sss/snake/pathnames.h" >> $testroot/stdout.expected
echo "A sss/snake/snake.6" >> $testroot/stdout.expected
echo "A sss/snake/snake.c" >> $testroot/stdout.expected
echo "A sss/snake/snake.h" >> $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
test_done "$testroot" "0"
}
function test_update_file_in_subsubdir {
local testroot=`test_init update_fle_in_subsubdir no_tree`
touch $testroot/repo/Makefile
mkdir -p $testroot/repo/altq
touch $testroot/repo/altq/if_altq.h
mkdir -p $testroot/repo/arch/alpha
touch $testroot/repo/arch/alpha/Makefile
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "adding initial tree"
got checkout $testroot/repo $testroot/wt > /dev/null
if [ "$?" != "0" ]; then
test_done "$testroot" "$?"
return 1
fi
echo change > $testroot/repo/arch/alpha/Makefile
(cd $testroot/repo && git add .)
git_commit $testroot/repo -m "changed a file"
echo "U arch/alpha/Makefile" > $testroot/stdout.expected
echo -n "Updated to commit " >> $testroot/stdout.expected
git_show_head $testroot/repo >> $testroot/stdout.expected
echo >> $testroot/stdout.expected
(cd $testroot/wt && got update > $testroot/stdout)
cmp $testroot/stdout.expected $testroot/stdout
if [ "$?" != "0" ]; then
diff -u $testroot/stdout.expected $testroot/stdout
test_done "$testroot" "$?"
return 1
fi
test_done "$testroot" "0"
}
run_test test_update_basic
run_test test_update_adds_file
run_test test_update_deletes_file
run_test test_update_deletes_dir
run_test test_update_deletes_dir_with_path_prefix
run_test test_update_deletes_dir_recursively
run_test test_update_sibling_dirs_with_common_prefix
run_test test_update_dir_with_dot_sibling
run_test test_update_moves_files_upwards
run_test test_update_moves_files_to_new_dir
run_test test_update_creates_missing_parent
run_test test_update_creates_missing_parent_with_subdir
run_test test_update_file_in_subsubdir