Преобразование svn-хранилища PuTTY в ртутное хранилище - PullRequest
3 голосов
/ 24 декабря 2011

Я собираюсь управлять корейской локализованной версией PuTTY в Mercurial.

Требования к хранилищу 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! Так что яне удалось получить последние ревизии для него.: (*

Я пытаюсь использовать svnsync, svnadmin dump и svndumpfilter для преобразования исходного стандарта хранилища SVN перед преобразованием Mercurial, но отображение каталогов вручнуюкак я хочу не возможно с ними.(Или, может быть, я не знаю, как это сделать с ними.)

Есть предложения и комментарии?

Ответы [ 2 ]

1 голос
/ 25 декабря 2011

Я посмотрел на хранилище.Вы правы, что svndumpfilter нельзя использовать для переименования файла в истории, поэтому я написал небольшой скрипт, который выполняет переименование в файле дампа.Единственной сложностью было добавить создание папок tags и branches.Чтобы использовать сценарий, вы должны сделать cronjob или аналогичный файл, который:

  1. загружает последний файл дампа SVN Putty :

    $ 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

Насколько я вижу, ветви и тегисозданы правильно.

Вы запрашиваете непрерывное вытягивание (инкрементное преобразование).К счастью, оба hg convert и hgsubversion поддерживают это.Вам нужно будет повторять шаги 1–3 каждый день, прежде чем вы сможете преобразовать наборы изменений в Mercurial.Это будет работать, так как первые три шага детерминированы .Это означает, что ваш 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)
0 голосов
/ 25 декабря 2011

Я решил отслеживать ТОЛЬКО выпущенный исходный код, а не каждую ревизию.

Итак, результат здесь: 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...