##// END OF EJS Templates
merge: simplify hook code
merge: simplify hook code
Matt Mackall -
r3109:62044d16 default
Show More
Name Size Modified Last Commit Author
/ tests
README Loading ...
coverage.py Loading ...
fish-merge Loading ...
get-with-headers.py Loading ...
md5sum.py Loading ...
run-tests.py Loading ...
test-abort-checkin Loading ...
test-abort-checkin.out Loading ...
test-addremove Loading ...
test-addremove.out Loading ...
test-annotate Loading ...
test-annotate.out Loading ...
test-archive Loading ...
test-archive.out Loading ...
test-backout Loading ...
test-backout.out Loading ...
test-backwards-remove Loading ...
test-backwards-remove.out Loading ...
test-bad-extension Loading ...
test-bad-extension.out Loading ...
test-bad-pull Loading ...
test-bad-pull.out Loading ...
test-basic Loading ...
test-basic.out Loading ...
test-bdiff Loading ...
test-bdiff.out Loading ...
test-bisect Loading ...
test-bisect.out Loading ...
test-branch Loading ...
test-branch.out Loading ...
test-bundle Loading ...
test-bundle.out Loading ...
test-cat Loading ...
test-cat.out Loading ...
test-clone Loading ...
test-clone-failure Loading ...
test-clone-failure.out Loading ...
test-clone-pull-corruption Loading ...
test-clone-pull-corruption.out Loading ...
test-clone-r Loading ...
test-clone-r.out Loading ...
test-clone.out Loading ...
test-command-template Loading ...
test-command-template.out Loading ...
test-commit Loading ...
test-commit.out Loading ...
test-committer Loading ...
test-committer.out Loading ...
test-conflict Loading ...
test-conflict.out Loading ...
test-confused-revert Loading ...
test-confused-revert.out Loading ...
test-copy Loading ...
test-copy.out Loading ...
test-copy2 Loading ...
test-copy2.out Loading ...
test-default-push Loading ...
test-default-push.out Loading ...
test-diff-ignore-whitespace Loading ...
test-diff-ignore-whitespace.out Loading ...
test-diff-newlines Loading ...
test-diff-newlines.out Loading ...
test-diff-subdir Loading ...
test-diff-subdir.out Loading ...
test-diffdir Loading ...
test-diffdir.out Loading ...
test-empty Loading ...
test-empty-dir Loading ...
test-empty-dir.out Loading ...
test-empty-group Loading ...
test-empty-group.out Loading ...
test-empty.out Loading ...
test-encode Loading ...
test-encode.out Loading ...
test-excessive-merge Loading ...
test-excessive-merge.out Loading ...
test-extdiff Loading ...
test-extdiff.out Loading ...
test-fetch Loading ...
test-fetch.out Loading ...
test-filebranch Loading ...
test-filebranch.out Loading ...
test-flags Loading ...
test-flags.out Loading ...
test-git-export Loading ...
test-git-export.out Loading ...
test-git-import Loading ...
test-git-import.out Loading ...
test-globalopts Loading ...
test-globalopts.out Loading ...
test-grep Loading ...
test-grep.out Loading ...
test-help Loading ...
test-help.out Loading ...
test-hgignore Loading ...
test-hgignore.out Loading ...
test-hgrc Loading ...
test-hgrc.out Loading ...
test-hook Loading ...
test-hook.out Loading ...
test-http Loading ...
test-http-proxy Loading ...
test-http-proxy.out Loading ...
test-http.out Loading ...
test-hup Loading ...
test-hup.out Loading ...
test-import Loading ...
test-import.out Loading ...
test-incoming-outgoing Loading ...
test-incoming-outgoing.out Loading ...
test-init Loading ...
test-init.out Loading ...
test-issue322 Loading ...
test-issue322.out Loading ...
test-locate Loading ...
test-locate.out Loading ...
test-lock-badness Loading ...
test-lock-badness.out Loading ...
test-log Loading ...
test-log.out Loading ...
test-merge-default Loading ...
test-merge-default.out Loading ...
test-merge-revert Loading ...
test-merge-revert.out Loading ...
test-merge-revert2 Loading ...
test-merge-revert2.out Loading ...
test-merge1 Loading ...
test-merge1.out Loading ...
test-merge2 Loading ...
test-merge2.out Loading ...
test-merge3 Loading ...
test-merge3.out Loading ...
test-merge4 Loading ...
test-merge4.out Loading ...
test-merge5 Loading ...
test-merge5.out Loading ...
test-merge6 Loading ...
test-merge6.out Loading ...
test-merge7 Loading ...
test-merge7.out Loading ...
test-mq Loading ...
test-mq-guards Loading ...
test-mq-guards.out Loading ...
test-mq-qdelete Loading ...
test-mq-qdelete.out Loading ...
test-mq-qdiff Loading ...
test-mq-qdiff.out Loading ...
test-mq-qnew-twice Loading ...
test-mq-qnew-twice.out Loading ...
test-mq-qrefresh-replace-log-message Loading ...
test-mq-qrefresh-replace-log-message.out Loading ...
test-mq-qrename Loading ...
test-mq-qrename.out Loading ...
test-mq-qsave Loading ...
test-mq-qsave.out Loading ...
test-mq.out Loading ...
test-nested-repo Loading ...
test-nested-repo.out Loading ...
test-notfound Loading ...
test-notfound.out Loading ...
test-oldcgi Loading ...
test-oldcgi.out Loading ...
test-parse-date Loading ...
test-parse-date.out Loading ...
test-parseindex Loading ...
test-parseindex.out Loading ...
test-permissions Loading ...
test-permissions.out Loading ...
test-pull Loading ...
test-pull-permission Loading ...
test-pull-permission.out Loading ...
test-pull-pull-corruption Loading ...
test-pull-pull-corruption.out Loading ...
test-pull-pull-corruption2 Loading ...
test-pull-pull-corruption2.out Loading ...
test-pull.out Loading ...
test-push-hook-lock Loading ...
test-push-hook-lock.out Loading ...
test-push-http Loading ...
test-push-http.out Loading ...
test-push-r Loading ...
test-push-r.out Loading ...
test-push-warn Loading ...
test-push-warn.out Loading ...
test-rawcommit1 Loading ...
test-rawcommit1.out Loading ...
test-remove Loading ...
test-remove.out Loading ...
test-rename Loading ...
test-rename.out Loading ...
test-revert Loading ...
test-revert-unknown Loading ...
test-revert-unknown.out Loading ...
test-revert.out Loading ...
test-ro-message Loading ...
test-ro-message.out Loading ...
test-rollback Loading ...
test-rollback.out Loading ...
test-simple-update Loading ...
test-simple-update.out Loading ...
test-ssh Loading ...
test-ssh.out Loading ...
test-static-http Loading ...
test-static-http.out Loading ...
test-status Loading ...
test-status.out Loading ...
test-strict Loading ...
test-strict.out Loading ...
test-symlinks Loading ...
test-symlinks.out Loading ...
test-tag Loading ...
test-tag.out Loading ...
test-tags Loading ...
test-tags.out Loading ...
test-ui-config Loading ...
test-ui-config.out Loading ...
test-unrelated-pull Loading ...
test-unrelated-pull.out Loading ...
test-up-local-change Loading ...
test-up-local-change.out Loading ...
test-update-reverse Loading ...
test-update-reverse.out Loading ...
test-walk Loading ...
test-walk.out Loading ...
test-webraw Loading ...
test-webraw.out Loading ...
tinyproxy.py Loading ...

A simple testing framework

To run the tests, do:

cd tests/
python run-tests.py

This finds all scripts in the test directory named test-* and executes
them. The scripts can be either shell scripts or Python. Each test is
run in a temporary directory that is removed when the test is complete.

A test-<x> succeeds if the script returns success and its output
matches test-<x>.out. If the new output doesn't match, it is stored in
test-<x>.err.

There are some tricky points here that you should be aware of when
writing tests:

- hg commit and hg merge want user interaction

for commit use -m "text"
for hg merge, set HGMERGE to something noninteractive (like true or merge)

- changeset hashes will change based on user and date which make
things like hg history output change

use commit -m "test" -u test -d "1000000 0"

- diff will show the current time

use hg diff | sed -e "s/\(+++ [a-zA-Z0-9_/.-]*\).*/\1/" \
-e "s/\(--- [a-zA-Z0-9_/.-]*\).*/\1/"
to strip dates

- You can append your own hgrc settings to the file that the environment
variable HGRCPATH points to. This file is cleared before running a test.

You also need to be careful that the tests are portable from one platform
to another. You're probably working on Linux, where the GNU toolchain has
more (or different) functionality than on MacOS, *BSD, Solaris, AIX, etc.
While testing on all platforms is the only sure-fire way to make sure that
you've written portable code, here's a list of problems that have been
found and fixed in the tests. Another, more comprehensive list may be
found in the GNU Autoconf manual, online here:

http://www.gnu.org/software/autoconf/manual/html_node/Portable-Shell.html

sh:

The Bourne shell is a very basic shell. /bin/sh on Linux is typically
bash, which even in Bourne-shell mode has many features that Bourne shells
on other Unix systems don't have (and even on Linux /bin/sh isn't
guaranteed to be bash). You'll need to be careful about constructs that
seem ubiquitous, but are actually not available in the least common
denominator. While using another shell (ksh, bash explicitly, posix shell,
etc.) explicitly may seem like another option, these may not exist in a
portable location, and so are generally probably not a good idea. You may
find that rewriting the test in python will be easier.

- don't use pushd/popd; save the output of "pwd" and use "cd" in place of
the pushd, and cd back to the saved pwd instead of popd.

- don't use math expressions like let, (( ... )), or $(( ... )); use "expr"
instead.

grep:

- don't use the -q option; redirect stdout to /dev/null instead.

- don't use extended regular expressions with grep; use egrep instead, and
don't escape any regex operators.

sed:

- make sure that the beginning-of-line matcher ("^") is at the very
beginning of the expression -- it may not be supported inside parens.

echo:

- echo may interpret "\n" and print a newline; use printf instead if you
want a literal "\n" (backslash + n).

false:

- false is guaranteed only to return a non-zero value; you cannot depend on
it being 1. On Solaris in particular, /bin/false returns 255. Rewrite
your test to not depend on a particular return value, or create a
temporary "false" executable, and call that instead.

diff:

- don't use the -N option. There's no particularly good workaround short
of writing a reasonably complicated replacement script, but substituting
gdiff for diff if you can't rewrite the test not to need -N will probably
do.