SVN: Как автоматизировать передачу коммитов между ветками - PullRequest
0 голосов
/ 14 июня 2009

Я хочу автоматизировать этот процесс:

  1. Число поступает из внешней системы, скажем, 35.
  2. Ищите и находите коммиты svn, у которых # 35 в комментариях к ветви A.
  3. Составьте список всех изменений этих коммитов до коммитов до них.
  4. Примените эти изменения к ветви B.

Например, если у rev 95 есть # 35 в комментариях и введен новый файл по сравнению с rev 94, добавьте этот [Add File x.txt]. И версия 132 имеет # 35 в своих комментариях, и она изменила строку в x.txt. Добавьте это также [Изменить строку n, файл x.txt]. И так далее. Теперь у нас есть список изменений:

[Add File x.txt]
[Change line n, file x.txt]
...

Примените эти изменения к ветви B.

Может ли это быть достигнуто на SVN? Каковы команды (или способ, отличный от командной строки)? Существует ли документация, касающаяся необходимых команд для этих операций?

Ответы [ 2 ]

1 голос
/ 14 июня 2009

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

perl merge-ticket.pl searchWord sourceURL

указание номера заявки и URL-адреса хранилища для ветви A. Сценарий объединяет соответствующие ревизии из ветви A в рабочую копию.

# merge-ticket.pl
use strict;
use XML::Parser;

if ($#ARGV != 1) {
    die "usage: $0 searchWord sourceURL\n";
    exit 1;
}
my $searchWord = $ARGV[0];
my $sourceUrl = $ARGV[1];

my @revisions = ();

my $revision;
my $inMsg;
my $message;

sub startTag {
    my($parser, $tag, %attrs) = @_;

    if ($tag eq 'logentry') {
        $revision = $attrs{'revision'};
    } elsif ($tag eq 'msg') {
        $inMsg = 1;
        $message = '';
    }
}

sub endTag {
    my($parser, $tag) = @_;

    if ($tag eq 'msg') {
        $inMsg = 0;
        if ($message =~ /\b$searchWord\b/) {
            push(@revisions, $revision);
            print "$revision: $message\n";
        }
    }
}

sub characterData {
    my($parser, $data) = @_;

    if ($inMsg) {
        $message .= $data;
    }
}

# Search commit log messages for word.
my $command = "svn log --xml $sourceUrl";
open(INPUT, "$command|") || die "Error executing $command: $!\n";
my $parser = new XML::Parser(
        Handlers => {
            Start => \&startTag,
            End => \&endTag,
            Char => \&characterData});
$parser->parse(*INPUT);
close(INPUT);

if ($#revisions < 0) {
    print "No log messages containing $searchWord found\n";
    exit 1;
}

# Merge found revisions into working copy.
my $changes = join(',', reverse(@revisions));
$command = "svn merge -c$changes $sourceUrl";
print "$command\n";
system $command;
1 голос
/ 14 июня 2009

Вам нужно знать ревизию (и), которая была только что принята, затем оформить / переключиться на ветку B и выполнить svn merge -c 123,125, если ревизии были 123 и 125.

См. Также SvnBook о слиянии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...