Ich möchte einige Skripte in Python schreiben, die einige automatische Änderungen am Quellcode vornehmen. Wenn das Skript feststellt, dass es die Datei ändern muss, möchte ich sie zunächst aus Perforce auschecken. Ich kümmere mich nicht um das Einchecken, weil ich immer zuerst bauen und testen möchte.
Antworten
Zu viele Anzeigen?Perforce bietet Python-Wrapper für seine C/C++-Tools an, die in binärer Form für Windows und als Quellcode für andere Plattformen verfügbar sind:
http://www.perforce.com/perforce/loadsupp.html#api
Die Dokumentation der Skripting-API ist sehr hilfreich:
http://www.perforce.com/perforce/doc.current/manuals/p4script/p4script.pdf
Die Verwendung der Python-API ist dem Befehlszeilen-Client sehr ähnlich:
PythonWin 2.5.1 (r251:54863, May 1 2007, 17:47:05) [MSC v.1310 32 bit (Intel)] on win32.
Portions Copyright 1994-2006 Mark Hammond - see 'Help/About PythonWin' for further copyright information.
>>> import P4
>>> p4 = P4.P4()
>>> p4.connect() # connect to the default server, with the default clientspec
>>> desc = {"Description": "My new changelist description",
... "Change": "new"
... }
>>> p4.input = desc
>>> p4.run("changelist", "-i")
['Change 2579505 created.']
>>>
Ich werde es über die Befehlszeile überprüfen:
P:\>p4 changelist -o 2579505
# A Perforce Change Specification.
#
# Change: The change number. 'new' on a new changelist.
# Date: The date this specification was last modified.
# Client: The client on which the changelist was created. Read-only.
# User: The user who created the changelist.
# Status: Either 'pending' or 'submitted'. Read-only.
# Description: Comments about the changelist. Required.
# Jobs: What opened jobs are to be closed by this changelist.
# You may delete jobs from this list. (New changelists only.)
# Files: What opened files from the default changelist are to be added
# to this changelist. You may delete files from this list.
# (New changelists only.)
Change: 2579505
Date: 2008/10/08 13:57:02
Client: MYCOMPUTER-DT
User: myusername
Status: pending
Description:
My new changelist description
Das habe ich mir ausgedacht:
import os
def CreateNewChangeList(description):
"Create a new changelist and returns the changelist number as a string"
p4in, p4out = os.popen2("p4 changelist -i")
p4in.write("change: new\n")
p4in.write("description: " + description)
p4in.close()
changelist = p4out.readline().split()[1]
return changelist
def OpenFileForEdit(file, changelist = ""):
"Open a file for edit, if a changelist is passed in then open it in that list"
cmd = "p4 edit "
if changelist:
cmd += " -c " + changelist + " "
ret = os.popen(cmd + file).readline().strip()
if not ret.endswith("opened for edit"):
print "Couldn't open", file, "for edit:"
print ret
raise ValueError
Das P4-Python-Modul von Perforce wie in einer anderen Antwort erwähnt, ist der richtige Weg, aber wenn die Installation dieses Moduls keine Option ist, können Sie das Flag -G verwenden, um die Ausgabe von p4.exe zu analysieren:
p4 [ options ] command [ arg ... ]
options:
-c client -C charset -d dir -H host -G -L language
-p port -P pass -s -Q charset -u user -x file
The -G flag causes all output (and batch input for form commands
with -i) to be formatted as marshalled Python dictionary objects.
Das Bauen aus den p4python-Quellen erfordert das Herunterladen und Extrahieren der für diese Version empfohlenen p4 api. Zum Beispiel, wenn Sie die Windows XP x86 Version von P4Python 2008.2 für activepython 2.5 bauen:
- Herunterladen und Extrahieren der beiden p4python y p4api
- die setup.cfg für p4python so korrigieren, dass sie auf das Verzeichnis p4api verweist.
Um Dateien zur Bearbeitung zu öffnen (auschecken), siehe 'p4 help open' auf der Kommandozeile.
Sie können Dateien auschecken, ohne eine Änderungsliste zu erstellen, wenn Sie die Datei zur Standard-Änderungsliste hinzufügen, aber es ist eine gute Idee, zuerst eine Änderungsliste zu erstellen.
P4Python kompiliert derzeit nicht für activepython 2.6 ohne Visual Studio 2008; die mitgelieferten Bibliotheken werden mit 2005 oder 2003 gebaut. P4Python zu zwingen, gegen mingw zu kompilieren, ist fast unmöglich, selbst mit Pexports von python26.dll und Reimp/Reassemblierung der bereitgestellten .lib-Dateien in .a-Dateien.
In diesem Fall werden Sie wahrscheinlich eher subprocess verwenden und die p4-Ergebnisse als Python-Objekte zurückgeben, die marshaled sind. Sie können Ihren eigenen Befehls-Wrapper schreiben, der ein arg-Array entgegennimmt, die Befehle konstruiert und ausführt und das Ergebniswörterbuch zurückgibt.
Sie könnten versuchen, alles zu ändern, zu testen und bei Erfolg die Dateien, die sich unterscheiden, mit etwas zu öffnen, das 'p4 diff -se //...' entspricht.
- See previous answers
- Weitere Antworten anzeigen
0 Stimmen
Ich stelle das hier rein, damit ich in Zukunft danach suchen kann :)
1 Stimmen
@Matt Price - Ich glaube, dafür ist die Funktion "Lieblingsfrage" gedacht :).