hgext/convert/__init__.py
changeset 9058 b10cee4bd2c1
parent 8932 f87884329419
child 9086 f459f09b4214
equal deleted inserted replaced
9057:07788bbb35e4 9058:b10cee4bd2c1
    31 
    31 
    32     Accepted destination formats [identifiers]:
    32     Accepted destination formats [identifiers]:
    33     - Mercurial [hg]
    33     - Mercurial [hg]
    34     - Subversion [svn] (history on branches is not preserved)
    34     - Subversion [svn] (history on branches is not preserved)
    35 
    35 
    36     If no revision is given, all revisions will be converted.
    36     If no revision is given, all revisions will be converted. Otherwise,
    37     Otherwise, convert will only import up to the named revision
    37     convert will only import up to the named revision (given in a format
    38     (given in a format understood by the source).
    38     understood by the source).
    39 
    39 
    40     If no destination directory name is specified, it defaults to the
    40     If no destination directory name is specified, it defaults to the basename
    41     basename of the source with '-hg' appended. If the destination
    41     of the source with '-hg' appended. If the destination repository doesn't
    42     repository doesn't exist, it will be created.
    42     exist, it will be created.
    43 
    43 
    44     By default, all sources except Mercurial will use
    44     By default, all sources except Mercurial will use --branchsort. Mercurial
    45     --branchsort. Mercurial uses --sourcesort to preserve original
    45     uses --sourcesort to preserve original revision numbers order. Sort modes
    46     revision numbers order. Sort modes have the following effects:
    46     have the following effects:
    47       --branchsort: convert from parent to child revision when
    47       --branchsort: convert from parent to child revision when possible, which
    48         possible, which means branches are usually converted one after
    48         means branches are usually converted one after the other. It generates
    49         the other. It generates more compact repositories.
    49         more compact repositories.
    50       --datesort: sort revisions by date. Converted repositories have
    50       --datesort: sort revisions by date. Converted repositories have
    51         good-looking changelogs but are often an order of magnitude
    51         good-looking changelogs but are often an order of magnitude larger
    52         larger than the same ones generated by --branchsort.
    52         than the same ones generated by --branchsort.
    53       --sourcesort: try to preserve source revisions order, only
    53       --sourcesort: try to preserve source revisions order, only supported by
    54         supported by Mercurial sources.
    54         Mercurial sources.
    55 
    55 
    56     If <REVMAP> isn't given, it will be put in a default location
    56     If <REVMAP> isn't given, it will be put in a default location
    57     (<dest>/.hg/shamap by default). The <REVMAP> is a simple text file
    57     (<dest>/.hg/shamap by default). The <REVMAP> is a simple text file that
    58     that maps each source commit ID to the destination ID for that
    58     maps each source commit ID to the destination ID for that revision, like
    59     revision, like so:
    59     so:
       
    60 
    60     <source ID> <destination ID>
    61     <source ID> <destination ID>
    61 
    62 
    62     If the file doesn't exist, it's automatically created. It's
    63     If the file doesn't exist, it's automatically created. It's updated on
    63     updated on each commit copied, so convert-repo can be interrupted
    64     each commit copied, so convert-repo can be interrupted and can be run
    64     and can be run repeatedly to copy new commits.
    65     repeatedly to copy new commits.
    65 
    66 
    66     The [username mapping] file is a simple text file that maps each
    67     The [username mapping] file is a simple text file that maps each source
    67     source commit author to a destination commit author. It is handy
    68     commit author to a destination commit author. It is handy for source SCMs
    68     for source SCMs that use unix logins to identify authors (eg:
    69     that use unix logins to identify authors (eg: CVS). One line per author
    69     CVS). One line per author mapping and the line format is:
    70     mapping and the line format is: srcauthor=whatever string you want
    70     srcauthor=whatever string you want
    71 
    71 
    72     The filemap is a file that allows filtering and remapping of files and
    72     The filemap is a file that allows filtering and remapping of files
    73     directories. Comment lines start with '#'. Each line can contain one of
    73     and directories. Comment lines start with '#'. Each line can
    74     the following directives:
    74     contain one of the following directives:
       
    75 
    75 
    76       include path/to/file
    76       include path/to/file
    77 
    77 
    78       exclude path/to/file
    78       exclude path/to/file
    79 
    79 
    80       rename from/file to/file
    80       rename from/file to/file
    81 
    81 
    82     The 'include' directive causes a file, or all files under a
    82     The 'include' directive causes a file, or all files under a directory, to
    83     directory, to be included in the destination repository, and the
    83     be included in the destination repository, and the exclusion of all other
    84     exclusion of all other files and directories not explicitly included.
    84     files and directories not explicitly included. The 'exclude' directive
    85     The 'exclude' directive causes files or directories to be omitted.
    85     causes files or directories to be omitted. The 'rename' directive renames
    86     The 'rename' directive renames a file or directory. To rename from
    86     a file or directory. To rename from a subdirectory into the root of the
    87     a subdirectory into the root of the repository, use '.' as the
    87     repository, use '.' as the path to rename to.
    88     path to rename to.
    88 
    89 
    89     The splicemap is a file that allows insertion of synthetic history,
    90     The splicemap is a file that allows insertion of synthetic
    90     letting you specify the parents of a revision. This is useful if you want
    91     history, letting you specify the parents of a revision. This is
    91     to e.g. give a Subversion merge two parents, or graft two disconnected
    92     useful if you want to e.g. give a Subversion merge two parents, or
    92     series of history together. Each entry contains a key, followed by a
    93     graft two disconnected series of history together. Each entry
    93     space, followed by one or two comma-separated values. The key is the
    94     contains a key, followed by a space, followed by one or two
    94     revision ID in the source revision control system whose parents should be
    95     comma-separated values. The key is the revision ID in the source
    95     modified (same format as a key in .hg/shamap). The values are the revision
    96     revision control system whose parents should be modified (same
    96     IDs (in either the source or destination revision control system) that
    97     format as a key in .hg/shamap). The values are the revision IDs
       
    98     (in either the source or destination revision control system) that
       
    99     should be used as the new parents for that node.
    97     should be used as the new parents for that node.
   100 
    98 
   101     The branchmap is a file that allows you to rename a branch when it is
    99     The branchmap is a file that allows you to rename a branch when it is
   102     being brought in from whatever external repository. When used in
   100     being brought in from whatever external repository. When used in
   103     conjunction with a splicemap, it allows for a powerful combination
   101     conjunction with a splicemap, it allows for a powerful combination to help
   104     to help fix even the most badly mismanaged repositories and turn them
   102     fix even the most badly mismanaged repositories and turn them into nicely
   105     into nicely structured Mercurial repositories. The branchmap contains
   103     structured Mercurial repositories. The branchmap contains lines of the
   106     lines of the form "original_branch_name new_branch_name".
   104     form "original_branch_name new_branch_name". "original_branch_name" is the
   107     "original_branch_name" is the name of the branch in the source
   105     name of the branch in the source repository, and "new_branch_name" is the
   108     repository, and "new_branch_name" is the name of the branch is the
   106     name of the branch is the destination repository. This can be used to (for
   109     destination repository. This can be used to (for instance) move code
   107     instance) move code in one repository from "default" to a named branch.
   110     in one repository from "default" to a named branch.
       
   111 
   108 
   112     Mercurial Source
   109     Mercurial Source
   113     -----------------
   110     -----------------
   114 
   111 
   115     --config convert.hg.ignoreerrors=False    (boolean)
   112     --config convert.hg.ignoreerrors=False    (boolean)
   116         ignore integrity errors when reading. Use it to fix Mercurial
   113         ignore integrity errors when reading. Use it to fix Mercurial
   117         repositories with missing revlogs, by converting from and to
   114         repositories with missing revlogs, by converting from and to
   118         Mercurial.
   115         Mercurial.
   119     --config convert.hg.saverev=False         (boolean)
   116     --config convert.hg.saverev=False         (boolean)
   120         store original revision ID in changeset (forces target IDs to
   117         store original revision ID in changeset (forces target IDs to change)
   121         change)
       
   122     --config convert.hg.startrev=0            (hg revision identifier)
   118     --config convert.hg.startrev=0            (hg revision identifier)
   123         convert start revision and its descendants
   119         convert start revision and its descendants
   124 
   120 
   125     CVS Source
   121     CVS Source
   126     ----------
   122     ----------
   127 
   123 
   128     CVS source will use a sandbox (i.e. a checked-out copy) from CVS
   124     CVS source will use a sandbox (i.e. a checked-out copy) from CVS to
   129     to indicate the starting point of what will be converted. Direct
   125     indicate the starting point of what will be converted. Direct access to
   130     access to the repository files is not needed, unless of course the
   126     the repository files is not needed, unless of course the repository is
   131     repository is :local:. The conversion uses the top level directory
   127     :local:. The conversion uses the top level directory in the sandbox to
   132     in the sandbox to find the CVS repository, and then uses CVS rlog
   128     find the CVS repository, and then uses CVS rlog commands to find files to
   133     commands to find files to convert. This means that unless a
   129     convert. This means that unless a filemap is given, all files under the
   134     filemap is given, all files under the starting directory will be
   130     starting directory will be converted, and that any directory
   135     converted, and that any directory reorganization in the CVS
   131     reorganization in the CVS sandbox is ignored.
   136     sandbox is ignored.
       
   137 
   132 
   138     Because CVS does not have changesets, it is necessary to collect
   133     Because CVS does not have changesets, it is necessary to collect
   139     individual commits to CVS and merge them into changesets. CVS
   134     individual commits to CVS and merge them into changesets. CVS source uses
   140     source uses its internal changeset merging code by default but can
   135     its internal changeset merging code by default but can be configured to
   141     be configured to call the external 'cvsps' program by setting:
   136     call the external 'cvsps' program by setting:
       
   137 
   142         --config convert.cvsps='cvsps -A -u --cvs-direct -q'
   138         --config convert.cvsps='cvsps -A -u --cvs-direct -q'
       
   139 
   143     This option is deprecated and will be removed in Mercurial 1.4.
   140     This option is deprecated and will be removed in Mercurial 1.4.
   144 
   141 
   145     The options shown are the defaults.
   142     The options shown are the defaults.
   146 
   143 
   147     Internal cvsps is selected by setting
   144     Internal cvsps is selected by setting
       
   145 
   148         --config convert.cvsps=builtin
   146         --config convert.cvsps=builtin
       
   147 
   149     and has a few more configurable options:
   148     and has a few more configurable options:
   150         --config convert.cvsps.cache=True     (boolean)
   149         --config convert.cvsps.cache=True     (boolean)
   151             Set to False to disable remote log caching, for testing and
   150             Set to False to disable remote log caching, for testing and
   152             debugging purposes.
   151             debugging purposes.
   153         --config convert.cvsps.fuzz=60        (integer)
   152         --config convert.cvsps.fuzz=60        (integer)
   154             Specify the maximum time (in seconds) that is allowed
   153             Specify the maximum time (in seconds) that is allowed between
   155             between commits with identical user and log message in a
   154             commits with identical user and log message in a single changeset.
   156             single changeset. When very large files were checked in as
   155             When very large files were checked in as part of a changeset then
   157             part of a changeset then the default may not be long
   156             the default may not be long enough.
   158             enough.
       
   159         --config convert.cvsps.mergeto='{{mergetobranch ([-\\w]+)}}'
   157         --config convert.cvsps.mergeto='{{mergetobranch ([-\\w]+)}}'
   160             Specify a regular expression to which commit log messages
   158             Specify a regular expression to which commit log messages are
   161             are matched. If a match occurs, then the conversion
   159             matched. If a match occurs, then the conversion process will
   162             process will insert a dummy revision merging the branch on
   160             insert a dummy revision merging the branch on which this log
   163             which this log message occurs to the branch indicated in
   161             message occurs to the branch indicated in the regex.
   164             the regex.
       
   165         --config convert.cvsps.mergefrom='{{mergefrombranch ([-\\w]+)}}'
   162         --config convert.cvsps.mergefrom='{{mergefrombranch ([-\\w]+)}}'
   166             Specify a regular expression to which commit log messages
   163             Specify a regular expression to which commit log messages are
   167             are matched. If a match occurs, then the conversion
   164             matched. If a match occurs, then the conversion process will add
   168             process will add the most recent revision on the branch
   165             the most recent revision on the branch indicated in the regex as
   169             indicated in the regex as the second parent of the
   166             the second parent of the changeset.
   170             changeset.
   167 
   171 
   168     The hgext/convert/cvsps wrapper script allows the builtin changeset
   172     The hgext/convert/cvsps wrapper script allows the builtin
   169     merging code to be run without doing a conversion. Its parameters and
   173     changeset merging code to be run without doing a conversion. Its
   170     output are similar to that of cvsps 2.1.
   174     parameters and output are similar to that of cvsps 2.1.
       
   175 
   171 
   176     Subversion Source
   172     Subversion Source
   177     -----------------
   173     -----------------
   178 
   174 
   179     Subversion source detects classical trunk/branches/tags layouts.
   175     Subversion source detects classical trunk/branches/tags layouts. By
   180     By default, the supplied "svn://repo/path/" source URL is
   176     default, the supplied "svn://repo/path/" source URL is converted as a
   181     converted as a single branch. If "svn://repo/path/trunk" exists it
   177     single branch. If "svn://repo/path/trunk" exists it replaces the default
   182     replaces the default branch. If "svn://repo/path/branches" exists,
   178     branch. If "svn://repo/path/branches" exists, its subdirectories are
   183     its subdirectories are listed as possible branches. If
   179     listed as possible branches. If "svn://repo/path/tags" exists, it is
   184     "svn://repo/path/tags" exists, it is looked for tags referencing
   180     looked for tags referencing converted branches. Default "trunk",
   185     converted branches. Default "trunk", "branches" and "tags" values
   181     "branches" and "tags" values can be overridden with following options. Set
   186     can be overridden with following options. Set them to paths
   182     them to paths relative to the source URL, or leave them blank to disable
   187     relative to the source URL, or leave them blank to disable auto
   183     auto detection.
   188     detection.
       
   189 
   184 
   190     --config convert.svn.branches=branches    (directory name)
   185     --config convert.svn.branches=branches    (directory name)
   191         specify the directory containing branches
   186         specify the directory containing branches
   192     --config convert.svn.tags=tags            (directory name)
   187     --config convert.svn.tags=tags            (directory name)
   193         specify the directory containing tags
   188         specify the directory containing tags
   194     --config convert.svn.trunk=trunk          (directory name)
   189     --config convert.svn.trunk=trunk          (directory name)
   195         specify the name of the trunk branch
   190         specify the name of the trunk branch
   196 
   191 
   197     Source history can be retrieved starting at a specific revision,
   192     Source history can be retrieved starting at a specific revision, instead
   198     instead of being integrally converted. Only single branch
   193     of being integrally converted. Only single branch conversions are
   199     conversions are supported.
   194     supported.
   200 
   195 
   201     --config convert.svn.startrev=0           (svn revision number)
   196     --config convert.svn.startrev=0           (svn revision number)
   202         specify start Subversion revision.
   197         specify start Subversion revision.
   203 
   198 
   204     Perforce Source
   199     Perforce Source
   205     ---------------
   200     ---------------
   206 
   201 
   207     The Perforce (P4) importer can be given a p4 depot path or a
   202     The Perforce (P4) importer can be given a p4 depot path or a client
   208     client specification as source. It will convert all files in the
   203     specification as source. It will convert all files in the source to a flat
   209     source to a flat Mercurial repository, ignoring labels, branches
   204     Mercurial repository, ignoring labels, branches and integrations. Note
   210     and integrations. Note that when a depot path is given you then
   205     that when a depot path is given you then usually should specify a target
   211     usually should specify a target directory, because otherwise the
   206     directory, because otherwise the target may be named ...-hg.
   212     target may be named ...-hg.
   207 
   213 
   208     It is possible to limit the amount of source history to be converted by
   214     It is possible to limit the amount of source history to be
   209     specifying an initial Perforce revision.
   215     converted by specifying an initial Perforce revision.
       
   216 
   210 
   217     --config convert.p4.startrev=0            (perforce changelist number)
   211     --config convert.p4.startrev=0            (perforce changelist number)
   218         specify initial Perforce revision.
   212         specify initial Perforce revision.
   219 
   213 
   220 
   214 
   235     return subversion.debugsvnlog(ui, **opts)
   229     return subversion.debugsvnlog(ui, **opts)
   236 
   230 
   237 def debugcvsps(ui, *args, **opts):
   231 def debugcvsps(ui, *args, **opts):
   238     '''create changeset information from CVS
   232     '''create changeset information from CVS
   239 
   233 
   240     This command is intended as a debugging tool for the CVS to
   234     This command is intended as a debugging tool for the CVS to Mercurial
   241     Mercurial converter, and can be used as a direct replacement for
   235     converter, and can be used as a direct replacement for cvsps.
   242     cvsps.
   236 
   243 
   237     Hg debugcvsps reads the CVS rlog for current directory (or any named
   244     Hg debugcvsps reads the CVS rlog for current directory (or any
   238     directory) in the CVS repository, and converts the log to a series of
   245     named directory) in the CVS repository, and converts the log to a
   239     changesets based on matching commit log entries and dates.
   246     series of changesets based on matching commit log entries and
   240     '''
   247     dates.'''
       
   248     return cvsps.debugcvsps(ui, *args, **opts)
   241     return cvsps.debugcvsps(ui, *args, **opts)
   249 
   242 
   250 commands.norepo += " convert debugsvnlog debugcvsps"
   243 commands.norepo += " convert debugsvnlog debugcvsps"
   251 
   244 
   252 cmdtable = {
   245 cmdtable = {