2009-06-13 6 views
0

I übertragen wollen diesen Prozess automatisieren:svn: Wie zu automatisieren verpflichten zwischen Zweigen

  1. Eine Reihe von einem externen System kommt, sagen wir mal, 35.
  2. Suchen und finden svn verpflichtet haben, die # 35 in ihre Kommentare zu Zweig A.
  3. Machen Sie eine Liste aller Änderungen dieser Commits zu den Commits vor ihnen.
  4. Wenden Sie diese Änderungen an Zweig B.

Für z.B. Wenn rev 95 # 35 in seinen Kommentaren hat und eine neue Datei über rev 94 eingefügt hat, füge diese [Add File x.txt] hinzu. Und rev 132 hat # 35 in seinen Kommentaren und es änderte eine Zeile in x.txt. Fügen Sie dies auch hinzu [Zeile n ändern, Datei x.txt]. Und so weiter. Jetzt haben wir eine Liste der Änderungen:

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

Wenden Sie diese Änderungen an Zweig B.

Kann dies auf svn erreicht werden? Was sind die Befehle (oder ein anderer Weg als die Befehlszeile)? Enthält eine Dokumentation die notwendigen Befehle für diese Operationen?

Antwort

1

Sie müssen die Revision wissen (n), die gerade begangen wurde, dann Kasse/Schalter auf Zweig B und svn merge -c 123.125, wenn die Revisionen waren 123 und 125

Siehe auch SvnBook on merging

1

Wenn Ihre Entwickler ausreichend diszipliniert sind, um die Ticketnummer immer in die Commit-Protokollnachricht zu schreiben, können Sie dieses Perl-Skript verwenden, das nach Revisionen sucht, in denen die Protokollnachricht ein bestimmtes Wort enthält. Zuerst eine Arbeitskopie des Zweigs B Kasse, dann innerhalb der Arbeitskopie, laufen

perl merge-ticket.pl searchWord sourceURL 

die Ticketnummer und die Repository-URL für Zweig A. Angabe das Skript die passenden Änderungen von Zweig A in die Arbeitskopie übergeht.

# 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; 
+0

Wow, das sieht nach einem tollen Stück Arbeit aus und macht genau das, was ich brauche. Wenn ich nur ein wenig Perl wüsste (: Ich werde versuchen, das zu verstehen und zu C# zu konvertieren. Danke. –

Verwandte Themen