--- a/tests/test-convert Sun Sep 26 20:43:43 2010 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-#!/bin/sh
-
-cat >> $HGRCPATH <<EOF
-[extensions]
-convert=
-[convert]
-hg.saverev=False
-EOF
-
-hg help convert
-
-hg init a
-cd a
-echo a > a
-hg ci -d'0 0' -Ama
-hg cp a b
-hg ci -d'1 0' -mb
-hg rm a
-hg ci -d'2 0' -mc
-hg mv b a
-hg ci -d'3 0' -md
-echo a >> a
-hg ci -d'4 0' -me
-
-cd ..
-hg convert a 2>&1 | grep -v 'subversion python bindings could not be loaded'
-hg --cwd a-hg pull ../a
-
-touch bogusfile
-echo % should fail
-hg convert a bogusfile
-
-mkdir bogusdir
-chmod 000 bogusdir
-
-echo % should fail
-hg convert a bogusdir
-
-echo % should succeed
-chmod 700 bogusdir
-hg convert a bogusdir
-
-echo % test pre and post conversion actions
-echo 'include b' > filemap
-hg convert --debug --filemap filemap a partialb | \
- grep 'run hg'
-
-echo % converting empty dir should fail "nicely"
-mkdir emptydir
-# override $PATH to ensure p4 not visible; use $PYTHON in case we're
-# running from a devel copy, not a temp installation
-PATH="$BINDIR" $PYTHON "$BINDIR"/hg convert emptydir 2>&1 | sed 's,file://.*/emptydir,.../emptydir,g'
-
-echo % convert with imaginary source type
-hg convert --source-type foo a a-foo
-echo % convert with imaginary sink type
-hg convert --dest-type foo a a-foo
-
-echo
-echo % "testing: convert must not produce duplicate entries in fncache"
-hg convert a b
-echo % "contents of fncache file:"
-cat b/.hg/store/fncache
-
-echo '% test bogus URL'
-hg convert -q bzr+ssh://foobar@selenic.com/baz baz
-
-true
--- a/tests/test-convert.out Sun Sep 26 20:43:43 2010 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,318 +0,0 @@
-hg convert [OPTION]... SOURCE [DEST [REVMAP]]
-
-convert a foreign SCM repository to a Mercurial one.
-
- Accepted source formats [identifiers]:
-
- - Mercurial [hg]
- - CVS [cvs]
- - Darcs [darcs]
- - git [git]
- - Subversion [svn]
- - Monotone [mtn]
- - GNU Arch [gnuarch]
- - Bazaar [bzr]
- - Perforce [p4]
-
- Accepted destination formats [identifiers]:
-
- - Mercurial [hg]
- - Subversion [svn] (history on branches is not preserved)
-
- If no revision is given, all revisions will be converted. Otherwise,
- convert will only import up to the named revision (given in a format
- understood by the source).
-
- If no destination directory name is specified, it defaults to the basename
- of the source with "-hg" appended. If the destination repository doesn't
- exist, it will be created.
-
- By default, all sources except Mercurial will use --branchsort. Mercurial
- uses --sourcesort to preserve original revision numbers order. Sort modes
- have the following effects:
-
- --branchsort convert from parent to child revision when possible, which
- means branches are usually converted one after the other. It
- generates more compact repositories.
- --datesort sort revisions by date. Converted repositories have good-
- looking changelogs but are often an order of magnitude
- larger than the same ones generated by --branchsort.
- --sourcesort try to preserve source revisions order, only supported by
- Mercurial sources.
-
- If <REVMAP> isn't given, it will be put in a default location
- (<dest>/.hg/shamap by default). The <REVMAP> is a simple text file that
- maps each source commit ID to the destination ID for that revision, like
- so:
-
- <source ID> <destination ID>
-
- If the file doesn't exist, it's automatically created. It's updated on
- each commit copied, so "hg convert" can be interrupted and can be run
- repeatedly to copy new commits.
-
- The authormap is a simple text file that maps each source commit author to
- a destination commit author. It is handy for source SCMs that use unix
- logins to identify authors (eg: CVS). One line per author mapping and the
- line format is:
-
- source author = destination author
-
- Empty lines and lines starting with a "#" are ignored.
-
- The filemap is a file that allows filtering and remapping of files and
- directories. Each line can contain one of the following directives:
-
- include path/to/file-or-dir
-
- exclude path/to/file-or-dir
-
- rename path/to/source path/to/destination
-
- Comment lines start with "#". A specified path matches if it equals the
- full relative name of a file or one of its parent directories. The
- "include" or "exclude" directive with the longest matching path applies,
- so line order does not matter.
-
- The "include" directive causes a file, or all files under a directory, to
- be included in the destination repository, and the exclusion of all other
- files and directories not explicitly included. The "exclude" directive
- causes files or directories to be omitted. The "rename" directive renames
- a file or directory if it is converted. To rename from a subdirectory into
- the root of the repository, use "." as the path to rename to.
-
- The splicemap is a file that allows insertion of synthetic history,
- letting you specify the parents of a revision. This is useful if you want
- to e.g. give a Subversion merge two parents, or graft two disconnected
- series of history together. Each entry contains a key, followed by a
- space, followed by one or two comma-separated values:
-
- key parent1, parent2
-
- The key is the revision ID in the source revision control system whose
- parents should be modified (same format as a key in .hg/shamap). The
- values are the revision IDs (in either the source or destination revision
- control system) that should be used as the new parents for that node. For
- example, if you have merged "release-1.0" into "trunk", then you should
- specify the revision on "trunk" as the first parent and the one on the
- "release-1.0" branch as the second.
-
- The branchmap is a file that allows you to rename a branch when it is
- being brought in from whatever external repository. When used in
- conjunction with a splicemap, it allows for a powerful combination to help
- fix even the most badly mismanaged repositories and turn them into nicely
- structured Mercurial repositories. The branchmap contains lines of the
- form:
-
- original_branch_name new_branch_name
-
- where "original_branch_name" is the name of the branch in the source
- repository, and "new_branch_name" is the name of the branch is the
- destination repository. No whitespace is allowed in the branch names. This
- can be used to (for instance) move code in one repository from "default"
- to a named branch.
-
- Mercurial Source
- ----------------
-
- --config convert.hg.ignoreerrors=False (boolean)
- ignore integrity errors when reading. Use it to fix Mercurial
- repositories with missing revlogs, by converting from and to
- Mercurial.
-
- --config convert.hg.saverev=False (boolean)
- store original revision ID in changeset (forces target IDs to change)
-
- --config convert.hg.startrev=0 (hg revision identifier)
- convert start revision and its descendants
-
- CVS Source
- ----------
-
- CVS source will use a sandbox (i.e. a checked-out copy) from CVS to
- indicate the starting point of what will be converted. Direct access to
- the repository files is not needed, unless of course the repository is
- :local:. The conversion uses the top level directory in the sandbox to
- find the CVS repository, and then uses CVS rlog commands to find files to
- convert. This means that unless a filemap is given, all files under the
- starting directory will be converted, and that any directory
- reorganization in the CVS sandbox is ignored.
-
- The options shown are the defaults.
-
- --config convert.cvsps.cache=True (boolean)
- Set to False to disable remote log caching, for testing and debugging
- purposes.
-
- --config convert.cvsps.fuzz=60 (integer)
- Specify the maximum time (in seconds) that is allowed between commits
- with identical user and log message in a single changeset. When very
- large files were checked in as part of a changeset then the default
- may not be long enough.
-
- --config convert.cvsps.mergeto='{{mergetobranch ([-\w]+)}}'
- Specify a regular expression to which commit log messages are matched.
- If a match occurs, then the conversion process will insert a dummy
- revision merging the branch on which this log message occurs to the
- branch indicated in the regex.
-
- --config convert.cvsps.mergefrom='{{mergefrombranch ([-\w]+)}}'
- Specify a regular expression to which commit log messages are matched.
- If a match occurs, then the conversion process will add the most
- recent revision on the branch indicated in the regex as the second
- parent of the changeset.
-
- --config hook.cvslog
- Specify a Python function to be called at the end of gathering the CVS
- log. The function is passed a list with the log entries, and can
- modify the entries in-place, or add or delete them.
-
- --config hook.cvschangesets
- Specify a Python function to be called after the changesets are
- calculated from the the CVS log. The function is passed a list with
- the changeset entries, and can modify the changesets in-place, or add
- or delete them.
-
- An additional "debugcvsps" Mercurial command allows the builtin changeset
- merging code to be run without doing a conversion. Its parameters and
- output are similar to that of cvsps 2.1. Please see the command help for
- more details.
-
- Subversion Source
- -----------------
-
- Subversion source detects classical trunk/branches/tags layouts. By
- default, the supplied "svn://repo/path/" source URL is converted as a
- single branch. If "svn://repo/path/trunk" exists it replaces the default
- branch. If "svn://repo/path/branches" exists, its subdirectories are
- listed as possible branches. If "svn://repo/path/tags" exists, it is
- looked for tags referencing converted branches. Default "trunk",
- "branches" and "tags" values can be overridden with following options. Set
- them to paths relative to the source URL, or leave them blank to disable
- auto detection.
-
- --config convert.svn.branches=branches (directory name)
- specify the directory containing branches
-
- --config convert.svn.tags=tags (directory name)
- specify the directory containing tags
-
- --config convert.svn.trunk=trunk (directory name)
- specify the name of the trunk branch
-
- Source history can be retrieved starting at a specific revision, instead
- of being integrally converted. Only single branch conversions are
- supported.
-
- --config convert.svn.startrev=0 (svn revision number)
- specify start Subversion revision.
-
- Perforce Source
- ---------------
-
- The Perforce (P4) importer can be given a p4 depot path or a client
- specification as source. It will convert all files in the source to a flat
- Mercurial repository, ignoring labels, branches and integrations. Note
- that when a depot path is given you then usually should specify a target
- directory, because otherwise the target may be named ...-hg.
-
- It is possible to limit the amount of source history to be converted by
- specifying an initial Perforce revision.
-
- --config convert.p4.startrev=0 (perforce changelist number)
- specify initial Perforce revision.
-
- Mercurial Destination
- ---------------------
-
- --config convert.hg.clonebranches=False (boolean)
- dispatch source branches in separate clones.
-
- --config convert.hg.tagsbranch=default (branch name)
- tag revisions branch name
-
- --config convert.hg.usebranchnames=True (boolean)
- preserve branch names
-
-options:
-
- -s --source-type TYPE source repository type
- -d --dest-type TYPE destination repository type
- -r --rev REV import up to target revision REV
- -A --authormap FILE remap usernames using this file
- --filemap FILE remap file names using contents of file
- --splicemap FILE splice synthesized history into place
- --branchmap FILE change branch names while converting
- --branchsort try to sort changesets by branches
- --datesort try to sort changesets by date
- --sourcesort preserve source changesets order
-
-use "hg -v help convert" to show global options
-adding a
-assuming destination a-hg
-initializing destination a-hg repository
-scanning source...
-sorting...
-converting...
-4 a
-3 b
-2 c
-1 d
-0 e
-pulling from ../a
-searching for changes
-no changes found
-% should fail
-initializing destination bogusfile repository
-abort: cannot create new bundle repository
-% should fail
-abort: Permission denied: bogusdir
-% should succeed
-initializing destination bogusdir repository
-scanning source...
-sorting...
-converting...
-4 a
-3 b
-2 c
-1 d
-0 e
-% test pre and post conversion actions
-run hg source pre-conversion action
-run hg sink pre-conversion action
-run hg sink post-conversion action
-run hg source post-conversion action
-% converting empty dir should fail nicely
-assuming destination emptydir-hg
-initializing destination emptydir-hg repository
-emptydir does not look like a CVS checkout
-emptydir does not look like a Git repository
-emptydir does not look like a Subversion repository
-emptydir is not a local Mercurial repository
-emptydir does not look like a darcs repository
-emptydir does not look like a monotone repository
-emptydir does not look like a GNU Arch repository
-emptydir does not look like a Bazaar repository
-cannot find required "p4" tool
-abort: emptydir: missing or unsupported repository
-% convert with imaginary source type
-initializing destination a-foo repository
-abort: foo: invalid source repository type
-% convert with imaginary sink type
-abort: foo: invalid destination repository type
-
-% testing: convert must not produce duplicate entries in fncache
-initializing destination b repository
-scanning source...
-sorting...
-converting...
-4 a
-3 b
-2 c
-1 d
-0 e
-% contents of fncache file:
-data/a.i
-data/b.i
-% test bogus URL
-abort: bzr+ssh://foobar@selenic.com/baz: missing or unsupported repository
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-convert.t Sun Sep 26 14:32:13 2010 -0500
@@ -0,0 +1,387 @@
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert=
+ > [convert]
+ > hg.saverev=False
+ > EOF
+ $ hg help convert
+ hg convert [OPTION]... SOURCE [DEST [REVMAP]]
+
+ convert a foreign SCM repository to a Mercurial one.
+
+ Accepted source formats [identifiers]:
+
+ - Mercurial [hg]
+ - CVS [cvs]
+ - Darcs [darcs]
+ - git [git]
+ - Subversion [svn]
+ - Monotone [mtn]
+ - GNU Arch [gnuarch]
+ - Bazaar [bzr]
+ - Perforce [p4]
+
+ Accepted destination formats [identifiers]:
+
+ - Mercurial [hg]
+ - Subversion [svn] (history on branches is not preserved)
+
+ If no revision is given, all revisions will be converted. Otherwise,
+ convert will only import up to the named revision (given in a format
+ understood by the source).
+
+ If no destination directory name is specified, it defaults to the basename
+ of the source with "-hg" appended. If the destination repository doesn't
+ exist, it will be created.
+
+ By default, all sources except Mercurial will use --branchsort. Mercurial
+ uses --sourcesort to preserve original revision numbers order. Sort modes
+ have the following effects:
+
+ --branchsort convert from parent to child revision when possible, which
+ means branches are usually converted one after the other. It
+ generates more compact repositories.
+ --datesort sort revisions by date. Converted repositories have good-
+ looking changelogs but are often an order of magnitude
+ larger than the same ones generated by --branchsort.
+ --sourcesort try to preserve source revisions order, only supported by
+ Mercurial sources.
+
+ If <REVMAP> isn't given, it will be put in a default location
+ (<dest>/.hg/shamap by default). The <REVMAP> is a simple text file that
+ maps each source commit ID to the destination ID for that revision, like
+ so:
+
+ <source ID> <destination ID>
+
+ If the file doesn't exist, it's automatically created. It's updated on
+ each commit copied, so "hg convert" can be interrupted and can be run
+ repeatedly to copy new commits.
+
+ The authormap is a simple text file that maps each source commit author to
+ a destination commit author. It is handy for source SCMs that use unix
+ logins to identify authors (eg: CVS). One line per author mapping and the
+ line format is:
+
+ source author = destination author
+
+ Empty lines and lines starting with a "#" are ignored.
+
+ The filemap is a file that allows filtering and remapping of files and
+ directories. Each line can contain one of the following directives:
+
+ include path/to/file-or-dir
+
+ exclude path/to/file-or-dir
+
+ rename path/to/source path/to/destination
+
+ Comment lines start with "#". A specified path matches if it equals the
+ full relative name of a file or one of its parent directories. The
+ "include" or "exclude" directive with the longest matching path applies,
+ so line order does not matter.
+
+ The "include" directive causes a file, or all files under a directory, to
+ be included in the destination repository, and the exclusion of all other
+ files and directories not explicitly included. The "exclude" directive
+ causes files or directories to be omitted. The "rename" directive renames
+ a file or directory if it is converted. To rename from a subdirectory into
+ the root of the repository, use "." as the path to rename to.
+
+ The splicemap is a file that allows insertion of synthetic history,
+ letting you specify the parents of a revision. This is useful if you want
+ to e.g. give a Subversion merge two parents, or graft two disconnected
+ series of history together. Each entry contains a key, followed by a
+ space, followed by one or two comma-separated values:
+
+ key parent1, parent2
+
+ The key is the revision ID in the source revision control system whose
+ parents should be modified (same format as a key in .hg/shamap). The
+ values are the revision IDs (in either the source or destination revision
+ control system) that should be used as the new parents for that node. For
+ example, if you have merged "release-1.0" into "trunk", then you should
+ specify the revision on "trunk" as the first parent and the one on the
+ "release-1.0" branch as the second.
+
+ The branchmap is a file that allows you to rename a branch when it is
+ being brought in from whatever external repository. When used in
+ conjunction with a splicemap, it allows for a powerful combination to help
+ fix even the most badly mismanaged repositories and turn them into nicely
+ structured Mercurial repositories. The branchmap contains lines of the
+ form:
+
+ original_branch_name new_branch_name
+
+ where "original_branch_name" is the name of the branch in the source
+ repository, and "new_branch_name" is the name of the branch is the
+ destination repository. No whitespace is allowed in the branch names. This
+ can be used to (for instance) move code in one repository from "default"
+ to a named branch.
+
+ Mercurial Source
+ ----------------
+
+ --config convert.hg.ignoreerrors=False (boolean)
+ ignore integrity errors when reading. Use it to fix Mercurial
+ repositories with missing revlogs, by converting from and to
+ Mercurial.
+
+ --config convert.hg.saverev=False (boolean)
+ store original revision ID in changeset (forces target IDs to change)
+
+ --config convert.hg.startrev=0 (hg revision identifier)
+ convert start revision and its descendants
+
+ CVS Source
+ ----------
+
+ CVS source will use a sandbox (i.e. a checked-out copy) from CVS to
+ indicate the starting point of what will be converted. Direct access to
+ the repository files is not needed, unless of course the repository is
+ :local:. The conversion uses the top level directory in the sandbox to
+ find the CVS repository, and then uses CVS rlog commands to find files to
+ convert. This means that unless a filemap is given, all files under the
+ starting directory will be converted, and that any directory
+ reorganization in the CVS sandbox is ignored.
+
+ The options shown are the defaults.
+
+ --config convert.cvsps.cache=True (boolean)
+ Set to False to disable remote log caching, for testing and debugging
+ purposes.
+
+ --config convert.cvsps.fuzz=60 (integer)
+ Specify the maximum time (in seconds) that is allowed between commits
+ with identical user and log message in a single changeset. When very
+ large files were checked in as part of a changeset then the default
+ may not be long enough.
+
+ --config convert.cvsps.mergeto='{{mergetobranch ([-\w]+)}}'
+ Specify a regular expression to which commit log messages are matched.
+ If a match occurs, then the conversion process will insert a dummy
+ revision merging the branch on which this log message occurs to the
+ branch indicated in the regex.
+
+ --config convert.cvsps.mergefrom='{{mergefrombranch ([-\w]+)}}'
+ Specify a regular expression to which commit log messages are matched.
+ If a match occurs, then the conversion process will add the most
+ recent revision on the branch indicated in the regex as the second
+ parent of the changeset.
+
+ --config hook.cvslog
+ Specify a Python function to be called at the end of gathering the CVS
+ log. The function is passed a list with the log entries, and can
+ modify the entries in-place, or add or delete them.
+
+ --config hook.cvschangesets
+ Specify a Python function to be called after the changesets are
+ calculated from the the CVS log. The function is passed a list with
+ the changeset entries, and can modify the changesets in-place, or add
+ or delete them.
+
+ An additional "debugcvsps" Mercurial command allows the builtin changeset
+ merging code to be run without doing a conversion. Its parameters and
+ output are similar to that of cvsps 2.1. Please see the command help for
+ more details.
+
+ Subversion Source
+ -----------------
+
+ Subversion source detects classical trunk/branches/tags layouts. By
+ default, the supplied "svn://repo/path/" source URL is converted as a
+ single branch. If "svn://repo/path/trunk" exists it replaces the default
+ branch. If "svn://repo/path/branches" exists, its subdirectories are
+ listed as possible branches. If "svn://repo/path/tags" exists, it is
+ looked for tags referencing converted branches. Default "trunk",
+ "branches" and "tags" values can be overridden with following options. Set
+ them to paths relative to the source URL, or leave them blank to disable
+ auto detection.
+
+ --config convert.svn.branches=branches (directory name)
+ specify the directory containing branches
+
+ --config convert.svn.tags=tags (directory name)
+ specify the directory containing tags
+
+ --config convert.svn.trunk=trunk (directory name)
+ specify the name of the trunk branch
+
+ Source history can be retrieved starting at a specific revision, instead
+ of being integrally converted. Only single branch conversions are
+ supported.
+
+ --config convert.svn.startrev=0 (svn revision number)
+ specify start Subversion revision.
+
+ Perforce Source
+ ---------------
+
+ The Perforce (P4) importer can be given a p4 depot path or a client
+ specification as source. It will convert all files in the source to a flat
+ Mercurial repository, ignoring labels, branches and integrations. Note
+ that when a depot path is given you then usually should specify a target
+ directory, because otherwise the target may be named ...-hg.
+
+ It is possible to limit the amount of source history to be converted by
+ specifying an initial Perforce revision.
+
+ --config convert.p4.startrev=0 (perforce changelist number)
+ specify initial Perforce revision.
+
+ Mercurial Destination
+ ---------------------
+
+ --config convert.hg.clonebranches=False (boolean)
+ dispatch source branches in separate clones.
+
+ --config convert.hg.tagsbranch=default (branch name)
+ tag revisions branch name
+
+ --config convert.hg.usebranchnames=True (boolean)
+ preserve branch names
+
+ options:
+
+ -s --source-type TYPE source repository type
+ -d --dest-type TYPE destination repository type
+ -r --rev REV import up to target revision REV
+ -A --authormap FILE remap usernames using this file
+ --filemap FILE remap file names using contents of file
+ --splicemap FILE splice synthesized history into place
+ --branchmap FILE change branch names while converting
+ --branchsort try to sort changesets by branches
+ --datesort try to sort changesets by date
+ --sourcesort preserve source changesets order
+
+ use "hg -v help convert" to show global options
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg ci -d'0 0' -Ama
+ adding a
+ $ hg cp a b
+ $ hg ci -d'1 0' -mb
+ $ hg rm a
+ $ hg ci -d'2 0' -mc
+ $ hg mv b a
+ $ hg ci -d'3 0' -md
+ $ echo a >> a
+ $ hg ci -d'4 0' -me
+ $ cd ..
+ $ hg convert a 2>&1 | grep -v 'subversion python bindings could not be loaded'
+ assuming destination a-hg
+ initializing destination a-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 4 a
+ 3 b
+ 2 c
+ 1 d
+ 0 e
+ $ hg --cwd a-hg pull ../a
+ pulling from ../a
+ searching for changes
+ no changes found
+ $ touch bogusfile
+
+should fail
+
+ $ hg convert a bogusfile
+ initializing destination bogusfile repository
+ abort: cannot create new bundle repository
+ [255]
+ $ mkdir bogusdir
+ $ chmod 000 bogusdir
+
+should fail
+
+ $ hg convert a bogusdir
+ abort: Permission denied: bogusdir
+ [255]
+
+should succeed
+
+ $ chmod 700 bogusdir
+ $ hg convert a bogusdir
+ initializing destination bogusdir repository
+ scanning source...
+ sorting...
+ converting...
+ 4 a
+ 3 b
+ 2 c
+ 1 d
+ 0 e
+
+test pre and post conversion actions
+
+ $ echo 'include b' > filemap
+ $ hg convert --debug --filemap filemap a partialb | \
+ > grep 'run hg'
+ run hg source pre-conversion action
+ run hg sink pre-conversion action
+ run hg sink post-conversion action
+ run hg source post-conversion action
+
+converting empty dir should fail "nicely
+
+ $ mkdir emptydir
+
+override $PATH to ensure p4 not visible; use $PYTHON in case we're
+running from a devel copy, not a temp installation
+
+ $ PATH="$BINDIR" $PYTHON "$BINDIR"/hg convert emptydir
+ assuming destination emptydir-hg
+ initializing destination emptydir-hg repository
+ emptydir does not look like a CVS checkout
+ emptydir does not look like a Git repository
+ emptydir does not look like a Subversion repository
+ emptydir is not a local Mercurial repository
+ emptydir does not look like a darcs repository
+ emptydir does not look like a monotone repository
+ emptydir does not look like a GNU Arch repository
+ emptydir does not look like a Bazaar repository
+ cannot find required "p4" tool
+ abort: emptydir: missing or unsupported repository
+ [255]
+
+convert with imaginary source type
+
+ $ hg convert --source-type foo a a-foo
+ initializing destination a-foo repository
+ abort: foo: invalid source repository type
+ [255]
+
+convert with imaginary sink type
+
+ $ hg convert --dest-type foo a a-foo
+ abort: foo: invalid destination repository type
+ [255]
+
+testing: convert must not produce duplicate entries in fncache
+
+ $ hg convert a b
+ initializing destination b repository
+ scanning source...
+ sorting...
+ converting...
+ 4 a
+ 3 b
+ 2 c
+ 1 d
+ 0 e
+
+contents of fncache file:
+
+ $ cat b/.hg/store/fncache
+ data/a.i
+ data/b.i
+
+test bogus URL
+
+ $ hg convert -q bzr+ssh://foobar@selenic.com/baz baz
+ abort: bzr+ssh://foobar@selenic.com/baz: missing or unsupported repository
+ [255]