Added git-p4 clone convenience command

Signed-off-by: Simon Hausmann <simon@lst.de>
This commit is contained in:
Simon Hausmann 2007-04-08 10:08:26 +02:00
Родитель 68ed351ab5
Коммит f9a3a4f796
2 изменённых файлов: 77 добавлений и 3 удалений

Просмотреть файл

@ -440,6 +440,7 @@ class P4Sync(Command):
self.detectBranches = False self.detectBranches = False
self.detectLabels = False self.detectLabels = False
self.changesFile = "" self.changesFile = ""
self.tagLastChange = True
def p4File(self, depotPath): def p4File(self, depotPath):
return os.popen("p4 print -q \"%s\"" % depotPath, "rb").read() return os.popen("p4 print -q \"%s\"" % depotPath, "rb").read()
@ -826,7 +827,6 @@ class P4Sync(Command):
self.globalPrefix = "" self.globalPrefix = ""
self.changeRange = "" self.changeRange = ""
self.initialParent = "" self.initialParent = ""
self.tagLastChange = True
if len(self.branch) == 0: if len(self.branch) == 0:
self.branch = "p4" self.branch = "p4"
@ -1062,6 +1062,58 @@ class P4Rebase(Command):
system("git diff-tree --stat --summary -M %s HEAD" % oldHead) system("git diff-tree --stat --summary -M %s HEAD" % oldHead)
return True return True
class P4Clone(P4Sync):
def __init__(self):
P4Sync.__init__(self)
self.description = "Creates a new git repository and imports from Perforce into it"
self.usage = "usage: %prog [options] //depot/path[@revRange] [directory]"
self.needsGit = False
self.tagLastChange = False
def run(self, args):
if len(args) < 1:
return False
depotPath = args[0]
dir = ""
if len(args) == 2:
dir = args[1]
elif len(args) > 2:
return False
if not depotPath.startswith("//"):
return False
if len(dir) == 0:
dir = depotPath
atPos = dir.rfind("@")
if atPos != -1:
dir = dir[0:atPos]
hashPos = dir.rfind("#")
if hashPos != -1:
dir = dir[0:hashPos]
if dir.endswith("..."):
dir = dir[:-3]
if dir.endswith("/"):
dir = dir[:-1]
slashPos = dir.rfind("/")
if slashPos != -1:
dir = dir[slashPos + 1:]
print "Importing from %s into %s" % (depotPath, dir)
os.makedirs(dir)
os.chdir(dir)
system("git init")
if not P4Sync.run(self, [depotPath]):
return False
os.wait()
if self.branch != "master":
system("git branch master p4")
system("git checkout -f")
return True
class HelpFormatter(optparse.IndentedHelpFormatter): class HelpFormatter(optparse.IndentedHelpFormatter):
def __init__(self): def __init__(self):
optparse.IndentedHelpFormatter.__init__(self) optparse.IndentedHelpFormatter.__init__(self)
@ -1085,7 +1137,8 @@ commands = {
"clean-tags" : P4CleanTags(), "clean-tags" : P4CleanTags(),
"submit" : P4Submit(), "submit" : P4Submit(),
"sync" : P4Sync(), "sync" : P4Sync(),
"rebase" : P4Rebase() "rebase" : P4Rebase(),
"clone" : P4Clone()
} }
if len(sys.argv[1:]) == 0: if len(sys.argv[1:]) == 0:

Просмотреть файл

@ -10,7 +10,25 @@ done using "git-p4 submit".
Importing Importing
========= =========
The procedure is simple: You can simply start with
git-p4 clone //depot/path/project
or
git-p4 clone //depot/path/project myproject
This will create an empty git repository in a subdirectory called "project" (or
"myproject" with the second command), import the head revision from the
specified perforce path into a git "p4" branch, create a master branch off it
and check it out. If you want the entire history (not just the head revision) then
you can simply append a "@all" to the depot path:
git-p4 clone //depot/project/main@all myproject
If you want more control you can also use the git-p4 sync command directly:
mkdir repo-git mkdir repo-git
cd repo-git cd repo-git
@ -31,6 +49,9 @@ a big import. This may take a while.
Support for Perforce integrations is still work in progress. Don't bother Support for Perforce integrations is still work in progress. Don't bother
trying it unless you want to hack on it :) trying it unless you want to hack on it :)
For convenience there's also the git-p4 clone command that works similar to
git-clone and combines the creation of the git repository with the the initial
import and the branch setup
Incremental Imports Incremental Imports
=================== ===================