Как скопировать пакет Monticello в другой репозиторий под другим именем с Gofer

Контекст - это:
Пакет имел несколько веток, разработанных в нескольких хранилищах.

  • squeaksource
  • source.squeak.org/trunk

Развитие остановлено в source.squeak.org, и цель состоит в том, чтобы передать ветку обратно в squeaksource, чтобы все версии были опубликованы в одном репозитории.
Но чтобы облегчить просмотр людей и быструю идентификацию ветки, я хочу добавить стандартную идентификацию ветки в имя копии squeaksource.
Есть ли способ автоматизировать эту операцию? С Гофер может быть?

Ответ 1

Пакеты Monticello неизменяемы. Вы можете легко перемещать версии, но вы не должны переименовывать файлы. Если вы это сделаете, вы разбиваете историю и теряете способность объединять версии в своем дереве версий и с вкладами других людей.

Чтобы переместить все версии пакета A из исходного URL-адреса в целевой URL-адрес, вы можете использовать:

Gofer new
   repository: 'source url';
   package: 'A';
   fetch

" If you understand the concequences you could rename/rebranch the version files in your package-cache at this point. "

Gofer new
   repository: 'target url';
   package: 'A';
   push

Ответ 2

Более загадочное решение, которое позволяет избежать последующей сериализации и десериализации пакетов Monticello. Это полезно для очень больших репозиториев и ускоряет копирование:

| sourceRepositoryUrl destinationRepositoryUrl files |

repositoryUrl := 'http://www.squeaksource.com/PROJECT'.
destinationRepositoryUrl := 'http://smalltalkhub.com/mc/USER/PROJECT/main'.

files := (MCHttpRepository new 
    parseFileNamesFromStream: (ZnClient new get: repositoryUrl; entity) readStream)
    select: [ :each | ZnMonticelloServerDelegate new isValidMczName: each ].

files do: [ :fileName ||entity stream|

    Transcript show: fileName; cr.
    "download version"
    entity := ZnClient new
    beOneShot;
        url: repositoryUrl;
        addPath: fileName;
        get;
        entity.

    "upload the version to gemstone"
    ZnClient new
        beOneShot;
        ifFail: [ :exception | Transcript show: fileName; show: ' '; print: exception ];
        username: 'USER' password: 'PASSWORD';
        entity: entity;
        url: destinationRepositoryUrl;
        addPath: fileName;
        put ]
displayingProgress: [ :fileName| 'Copying ', fileName]