将PuTTY的svn存储库转换为mercurial存储库

时间:2011-12-24 16:42:51

标签: svn mercurial dvcs putty

我将在mercurial中管理一个韩语本地化的PuTTY版本。

mercurial存储库的要求:

  • 我们应该能够跟踪PuTTY svn存储库的最新版本。
  • 无需推送。

我的计划是将原始主干和分支作为mercurial存储库中的命名分支,并添加我自己的分支。 我将在初始转换后使用 hgsubversion 进行连续拉动。

问题是,PuTTY存储库(http://svn.tartarus.org/sgt/)在标准布局中,更糟糕的是,还包含其他项目。 DVCS转换工具适用于标准布局存储库,但不适用于非标准布局存储库。

所以我必须映射目录,使其成为“标准”,如:

  • /putty => /trunk
  • /putty-0.xx => /tags/0.xx
  • /putty-branch-0.xx => /branches/0.xx
  • 忽略所有其他目录

如果主干有发布所需的每个修订版,只转换主干就没问题。 但不幸的是,版本0.62在putty-branch-0.61分支发布!所以我无法获得最新版本。 :(

我正在尝试使用svnsyncsvnadmin dumpsvndumpfilter在mercurial转换之前转换原始的svn存储库标准,但是无法使用它们手动映射目录。 (或者我可能不知道如何与他们一起做。)

有任何建议和意见吗?

2 个答案:

答案 0 :(得分:1)

我看了一下存储库。你是正确的svndumpfilter不能用于在整个历史记录中重命名文件,所以我写了一个小脚本,在转储文件中重命名。唯一棘手的部分是添加tagsbranches文件夹的创建。要使用该脚本,您应该制作一个cronjob或类似的:

  1. 下载latest Putty SVN dump file

    $ wget http://www.chiark.greenend.org.uk/~sgtatham/putty/putty-svn.dump.gz
    
  2. 使用脚本修复转储文件:

    $ zcat putty-svn.dump.gz | fix-dump.py > fixed.dump
    
  3. 将其加载到新的空存储库中:

    $ svnadmin create putty
    $ svnadmin load putty < fixed.dump
    
  4. 将Subversion存储库转换为Mercurial存储库:

    $ hg convert file:// $ PWD / putty

  5. 据我所知,分支和标签是正确创建的。

    您要求持续拉动(增量转换)。幸运的是,hg converthgsubversion都支持这一点。在将变更集转换为Mercurial之前,您需要每天重做步骤1-3。这将起作用,因为前三个步骤是 deterministic 。这意味着您的putty SVN存储库的行为就像Putty开发人员使用您在那里维护的正确分支和标记名称直接在其中工作一样。

    脚本如下:

    #!/usr/bin/python
    
    import sys, re
    
    moves = [(r"^Node(-copyfrom|)?-path: %s" % pattern, r"Node\1-path: %s" % repl)
             for (pattern, repl) in [(r"putty-branch-(0\...)", r"branches/\2"),
                                     (r"putty-(0\...)", r"tags/\2"),
                                     (r"putty(/|\n)", r"trunk\2")]]
    
    empty_dir_template = """\
    Node-path: %s
    Node-kind: dir
    Node-action: add
    Prop-content-length: 10
    Content-length: 10
    
    PROPS-END\n\n"""
    
    created_dirs = False
    for line in sys.stdin:
        if not created_dirs and line == "Node-path: putty\n":
            sys.stdout.write(empty_dir_template % "tags")
            sys.stdout.write(empty_dir_template % "branches")
            created_dirs = True
        for pattern, repl in moves:
            line, count = re.subn(pattern, repl, line, 1)
            if count > 0: break
        sys.stdout.write(line)
    

答案 1 :(得分:0)

我决定只跟踪已发布的源代码,而不是每次修订。

结果就在这里:https://bitbucket.org/daybreaker/iputty/changesets

为此,我遵循了以下步骤(例如):

svn ls -R svn://svn.tartarus.org/sgt/putty-0.58 > 58.txt
svn ls -R svn://svn.tartarus.org/sgt/putty-0.59 > 59.txt
svn ls -R svn://svn.tartarus.org/sgt/putty-0.60 > 60.txt
svn ls -R svn://svn.tartarus.org/sgt/putty-0.61 > 61.txt
svn ls -R svn://svn.tartarus.org/sgt/putty-0.62 > 62.txt

hg init iputty
cd iputty
svn export --force svn://svn.tartarus.org/sgt/putty-0.58 .
hg branch original
hg add
hg commit -m 'Imported PuTTY 0.58 release.'
svn export --force svn://svn.tartarus.org/sgt/putty-0.59 .
diff -U3 ../58.txt ../59.txt
hg add (added files from diff)
hg rm (removed files from diff)
hg commit -m 'Imported PuTTY 0.59 release.'
(repeat this for the remaining releases)

hg up -r(rev# of 0.60 release)
svn export --force (URL of my own modified PuTTY repository) .
hg branch default
hg commit -m 'Imported the most recent dPuTTY source code. blah blah'