Преобразование хранилища Subversion в Mercurial, преобразование идентификаторов ревизий в журналах фиксации. - PullRequest
3 голосов
/ 14 января 2011

Я конвертирую большой (около 9000 наборов изменений) репозиторий Subversion в Mercurial. Он связан с системой отслеживания ошибок Trac, поэтому в журналах фиксации есть много перекрестных ссылок на другие идентификаторы ревизий, а также номера заявок.

Я пытаюсь hgsubversion и конвертировать расширение. Кажется, что оба хорошо работают с нашим репозиторием, но идентификаторы ревизий, указанные в журналах фиксации, не конвертируются.

(Часть Trac довольно проста - мы можем просто отсканировать базу данных и преобразовать все вхождения ссылки на идентификатор редакции.)

Итак, я изменил исходный код расширения для преобразования следующим образом:

(mercurial_sink класс в hg.py)

def _rewritedesc(self, desc, source, revmap):
    # Only for subversion source.
    # We assume that no future revision is mentioned in commit logs.
    rx_revision = re.compile(r'(r(\d+)|\[(\d+)\])') # it's actually defined in module header.
    def replacer(m):
        if m is None:
            return m.group(0)
        new_revid = revmap.get(source.source.revid(m.group(2) or m.group(3)))
        print 'converting commit log : %s -> [%s]' % (m.group(0), new_revid)
        if new_revid is None:
            return m.group(0)
        return '[%s]' % new_revid[:12]
    return rx_revision.sub(replacer, desc)

def putcommit(self, files, copies, parents, commit, source, revmap):
    ...
    text = self._rewritedesc(commit.desc, source, revmap)
    ...

Кажется, это работает, но проблема в том, что процесс преобразования не сканирует наборы изменений в порядке их фиксации. Есть много пропущенных результатов конверсии.

На самом деле, расширение для преобразования предоставляет несколько вариантов сортировки, включая «исходную сортировку», которая обрабатывает наборы изменений в порядке фиксации, но поддерживается только для ртутных источников. «Сортировка дат», похоже, работает лучше, чем «Сортировка филиалов», но не так хорошо, как я хочу.

Я выяснил, могу ли я изменить журналы фиксации после завершения процесса преобразования (в то время у нас была полная карта идентификаторов ревизий, сгенерированная расширением), но это невозможно - существуют известные хаки, использующие расширение mq и histedit, но изменяет идентификатор повторной регистрации.

Есть ли люди, которые пытались сделать это или помочь мне?

1 Ответ

1 голос
/ 15 февраля 2011

Как насчет двухэтапного преобразования? Сначала конвертируйте репозиторий в Mercurial из SVN. Затем снова запустите расширение convert в вашем новом хранилище Hg, чтобы преобразовать все описания? Тогда вы сможете использовать sourcesort.

...