Added git-p4 clone convenience command

Signed-off-by: Simon Hausmann <simon@lst.de>
maint
Simon Hausmann 2007-04-08 10:08:26 +02:00
parent 68ed351ab5
commit f9a3a4f796
2 changed files with 77 additions and 3 deletions

View File

@ -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:

View File

@ -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
=================== ===================