Как скопировать пакет 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]