2011-12-24 3 views
3

Я собираюсь управлять корейской локализованной версией PuTTY в mercurial.Преобразование репозитория svn PuTTY в хранилище ртути

Требования к ртутный репозитория:

  • Мы должны быть в состоянии следить за последними версиями из хранилища PuTTY SVN.
  • Не требуется толкание.

Мой план состоит в том, чтобы иметь исходный багажник и ветви как названные ветви в ртутном хранилище и добавить свою собственную ветку. Я собираюсь использовать 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 выпущена на ветке шпатлевки-0.61! Поэтому я не смог получить последние исправления. :(

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

Любые предложения и комментарии

ответ

1

Я посмотрел на хранилище. Вы правы, что svndumpfilter не может быть использован для переименования файла на протяжении всей истории, поэтому я написал небольшой скрипт, который выполняет переименование в файле дампа. Единственной сложной задачей было добавить создание папки tags и branches.Чтобы использовать сценарий, вы должны сделать 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 репозиторий:

    $ рт.ст. конвертировать файл: // $ PWD/шпатлевка

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

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

я решил следить тОЛЬКО отпущенной исходного кода, а не каждая ревизия

Так что результат здесь:.?. 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' 
Смежные вопросы