Skip to content

Commit

Permalink
Make the helper test more robust and easier to use
Browse files Browse the repository at this point in the history
  • Loading branch information
caitp committed Sep 29, 2017
1 parent 5ca5f39 commit e3e6e71
Showing 1 changed file with 145 additions and 20 deletions.
165 changes: 145 additions & 20 deletions tools/copy_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,150 @@
# A little helper for copying built tests into an implementation's repo, for
# testing changes.
#
# The first parameter is the root directory which test262 tests should be copied
# into, and subsequent parameters are tests to copy.
#
# Example:
# ./tools/copy_tests.sh ~/v8/test/test262/data `git diff HEAD~1 --name-only`

function mov {
for file in "$@"; do
target_path="$destination/`dirname "$file"`"
if [ -f "$file" ]; then
echo -n "Copying '$file' to '$target_path'"
mkdir -p "$target_path"
cp -f "$file" "$target_path" || echo " fail !" & echo "done."
else
echo "Skipping '$file': file not found."
fi
done
# The destination directory is specified with `-d`, `--dest` or `--destination`.
# Source files can be positional (in which case, they are ignored if not found
# to be relative to the test directory), or specified via utilities such as
# `--head` (tests changed in the current working directory), or `--since N`
# (tests changed in the last N commits).

script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
root_dir="$( dirname "$script_dir" )"
tests_dir="$root_dir/test"

help_msg="$(cat <<-END
Help:
-d <argument> | -d=<argument>
--dest <argument> | --dest=<argument>
--destination <argument> | --destination=<argument>
Specify a destination directory to receive copied tests. If not present,
the script runs in dry-run mode and does not copy files.
-n
--dryrun
--dry-run
Don't copy files, but print the operations which would be performed.
Useful for debugging.
--head
Copy test files which have changed in the working directory since the
last commit. Performs \`git diff HEAD --name-only\`.
-s <argument> | -s=<argument>
--diff <argument> | --diff=<argument>
--since <argument> | --since=<argument>
Copy files which have changed in the past N commits. Also includes
changes in the current working directory since the last commit. Performs
\`git diff HEAD~\<argument> --name-only\`.
-h
--help
Print this help message.
END
)"

check_path() {
local file="$1"
if ( [ ! -f "$file" ] ); then
return
fi

local path=$(echo "$( realpath --relative-to="$root_dir/test" "$file" )" | tr "/" " ")
for part in $path; do
if [ "$part" = ".." ]; then
return
fi
done

echo "$file"
}

files=( )
dry_run=0
while [[ $# -gt 0 ]]; do
case "$1" in
-d|--dest|--destination)
# Select the destination to copy into (value is following
# positional parameter)
destination="$2"
shift
shift
;;
-d=*|--dest=*|--destination=*)
# Select the destination to copy into (value follows `=` sign)
destination="${i#*=}"
shift
;;
-n|--dryrun|--dry-run)
# Don't actually copy files, but instead list the files to copy
dry_run=1
shift
;;
--head)
# Add test files changed since the last commit
files+=( "$( git diff HEAD --name-only | grep "^test/" )" )
shift
;;
-s|--diff|--since)
# Add test files changed in the last N commits (N is following
# positional parameter)
files+=( "$( git diff HEAD~$2 --name-only | grep "^test/" )" )
shift
shift
;;
-s=*|--diff=*|--since=*)
# Add test files changed in the last N commits (N follows `=` sign)
files+=( "$( git diff HEAD~${i#*=} --name-only | grep "^test/" )" )
shift
;;
-h|--help)
echo -n "$help_msg"
exit 0
;;
*)
# Add a specific test, if it's a file relative to $tests_dir
if [ -n "$( check_path "$1" )" ]; then
files+=( "$1" )
fi
shift
;;
esac
done

if [ ${#destination} -eq 0 ]; then
echo -n "Error: No destination specified."
echo -n "$help_msg"
exit 1
fi

function main {
for file in $files; do
# Convert absolute path to relative path
file="$( realpath --relative-to="$root_dir" "$file" )"
target_path="$destination/$( dirname "$file" )"
cmd=$( cat <<-END
mkdir -p "$target_path"
cp -f "$file" "$target_path"
END
)
if [ $dry_run -eq 0 ]; then
eval "$cmd"
else
echo "$cmd"
echo ""
fi
done
}

destination=$1
shift 1
mov "$@"
old_dir=$( pwd )
cd "$root_dir"
main
cd "$old_dir"

0 comments on commit e3e6e71

Please sign in to comment.