2009-02-19 3 views
22

Ich habe ein altes CVS-Repository, das zu Perforce migriert werden soll.Wie identifiziere ich welche Zweige in CVS existieren?

Für jedes Modul muss ich identifizieren, welche Zweige in diesem Modul existieren.

Ich möchte nur eine Liste der Zweignamen, keine Tags. Es muss ein Befehlszeilen-Tool sein, aus Gründen der Skripterstellung.

Zum Beispiel (vorausgesetzt, es ist ein cvs-list-branches.sh Skript):

$ ./cvs-list-branches.sh module1 
HEAD 
dev_foobar 
Release_1_2 
Release_1_3 
$ 

Antwort

4

Dies wird auch Tags bringen, aber Tags und Zweige sind im Grunde die gleichen in CVS.

$cvs.exe rlog -h -l -b module1 
+0

Gibt es eine einfache Möglichkeit, Tags, um herauszufiltern? Unser CI-Server produziert jede Nacht viele und viele Tags ... Oder ist CVS wirklich so dumm, dass es keinen Unterschied zwischen einer Verzweigung und einem Tag gibt? –

+0

Anders als die Versionsnummern zu analysieren, gibt es keine Möglichkeit, dies zu sagen. Sie müssen sich daran erinnern, dass Zweige etwas sind, das CVS zu RCS hinzugefügt hat, die echte Versionskontrolle unter der Haube. –

0

mit WinCVS (Gui-Client für Windows) In diesem trivial ist, wird ein Rechtsklick Sie Zweige geben und Tags die Dateien haben.

Durch eine Shell können Sie cvs log -h -l-Modul verwenden.

+0

Ich sagte ausdrücklich, dass es ein Befehlszeilenprogramm sein sollte! –

+1

und es ist da! A hat gerade die wincvs-Informationen hinzugefügt, damit es für andere nützlich sein kann. –

15

Sie könnten einfach Protokollausgabe von cvs log -h analysieren. Für jede Datei gibt es einen Abschnitt namens . Alle dort aufgeführten Tags mit einer Revisionsnummer, die als vorletzte Ziffer eine Null enthält, sind Verzweigungen. Z.B .:

$ cvs log -h 

Rcs file : '/cvsroot/Module/File.pas,v' 
Working file : 'File.pas' 
Head revision : 1.1 
Branch revision : 
Locks : strict 
Access : 
Symbolic names : 
    1.1 : 'Release-1-0' 
    1.1.2.4 : 'Release-1-1' 
    1.1.0.2 : 'Maintenance-BRANCH' 
Keyword substitution : 'kv' 
Total revisions : 5 
Selected revisions : 0 
Description : 

=============================================== 

In diesem Beispiel Maintenance-BRANCH ist eindeutig ein Zweig, weil seine Versionsnummer als 1.1 aufgeführt ist. .2. Dies wird auch manchmal als magische Zweigrevisionsnummer bezeichnet.

+0

Hallo, Wenn es keinen solchen Zweig mit einer Revisionsnummer für den magischen Zweig gibt, was bedeutet das? –

+0

'cvs log -h' gibt viele Ausgaben, wenn Sie viele Dateien haben. Um es abzumildern, verwenden Sie 'cvs log pom.xml' oder etwas ähnliches, um nur das Protokoll einer Datei zu erhalten. (Dies wird in allen Situationen funktionieren, oder?) –

+1

@LimitedAtonement: Ja, tut es. Als ich "parse the output of" schrieb, nahm ich an, dass man eine Art Skript schreiben würde, um die Ausgabe vorzuverarbeiten, bevor man sie mit bloßem Auge verzehrte ...;) –

0

Ich habe eine kleine Sammlung von "handlichen" Korn-Shell-Funktionen, von denen eines Tags für eine bestimmte Datei abruft. Ich habe einen schnellen Versuch gemacht, es anzupassen, um zu tun, was Sie wollen. Es führt einfach ein seding/greping der (r) Protokollausgabe aus und listet Versionen auf, die ".0." in ihnen (was anzeigt, dass es sich um einen Zweig-Tag ist):

get_branch_tags() 
{ 
    typeset FILE_PATH=$1 

    TEMP_TAGS_INFO=/tmp/cvsinfo$$ 

    /usr/local/bin/cvs rlog $FILE_PATH 1>${TEMP_TAGS_INFO} 2>/dev/null 

    TEMPTAGS=`sed -n '/symbolic names:/,/keyword substitution:/p' ${TEMP_TAGS_INFO} | grep "\.0\." | cut -d: -f1 | awk '{print $1}'` 
    TAGS=`echo $TEMPTAGS | tr ' ' '/'` 
    echo ${TAGS:-NONE} 
    rm -Rf $TEMP_TAGS_INFO 2>/dev/null 1>&2 
} 
24

Als schneller Hack :) Das gleiche gilt für steht rlog.

cvs log -h | awk -F"[.:]" '/^\t/&&$(NF-1)==0{print $1}' | sort -u 

Verbesserte Version als pro bdevay, irrelevant Ausgabe versteckt und links ausrichtende das Ergebnis:

cvs log -h 2>&1 | awk -F"[.:]" '/^\t/&&$(NF-1)==0{print $1}' | awk '{print $1}' | sort -u 
+3

Klein verschönern: 'cvs log -h 2> & 1 | awk -F "[.:]" '/^\ t/&& $ (NF-1) == 0 {print $ 1}' | awk '{print $ 1}' | sort -u' Es verbirgt auch die Zeilen beginnen mit "cvs log:" und richtet das Ergebnis nach links aus. – bdevay

+0

nice touch für die Verwendung von 2> & 1 und das Ausblenden irrelevanter Daten –