Skip to content

Commit

Permalink
Obey p4 views when using client spec
Browse files Browse the repository at this point in the history
When using the p4 client spec, this attempts to obey the client's
output preferences.

For example, a view like

//depot/foo/branch/... //client/branch/foo/...
//depot/bar/branch/... //client/branch/bar/...

will result in a directory layout in the git tree of

branch/
branch/foo
branch/bar

p4 can do various other reordering that this change doesn't support,
but we should detect it and at least fail nicely.

Signed-off-by: Ian Wienand <ianw@vmware.com>
Acked-by: Pete Wyckoff <pw@padd.com>
Acked-by: Tor Arvid Lund <torarvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Ian Wienand authored and Junio C Hamano committed Feb 14, 2011
1 parent cbef0db commit 3952710
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 4 deletions.
50 changes: 46 additions & 4 deletions contrib/fast-import/git-p4
Original file line number Diff line number Diff line change
Expand Up @@ -910,6 +910,22 @@ class P4Sync(Command):
return files

def stripRepoPath(self, path, prefixes):
if self.useClientSpec:

# if using the client spec, we use the output directory
# specified in the client. For example, a view
# //depot/foo/branch/... //client/branch/foo/...
# will end up putting all foo/branch files into
# branch/foo/
for val in self.clientSpecDirs:
if path.startswith(val[0]):
# replace the depot path with the client path
path = path.replace(val[0], val[1][1])
# now strip out the client (//client/...)
path = re.sub("^(//[^/]+/)", '', path)
# the rest is all path
return path

if self.keepRepoPath:
prefixes = [re.sub("^(//[^/]+/).*", r'\1', prefixes[0])]

Expand Down Expand Up @@ -1032,7 +1048,7 @@ class P4Sync(Command):
includeFile = True
for val in self.clientSpecDirs:
if f['path'].startswith(val[0]):
if val[1] <= 0:
if val[1][0] <= 0:
includeFile = False
break

Expand Down Expand Up @@ -1475,19 +1491,45 @@ class P4Sync(Command):
for entry in specList:
for k,v in entry.iteritems():
if k.startswith("View"):

# p4 has these %%1 to %%9 arguments in specs to
# reorder paths; which we can't handle (yet :)
if re.match('%%\d', v) != None:
print "Sorry, can't handle %%n arguments in client specs"
sys.exit(1)

if v.startswith('"'):
start = 1
else:
start = 0
index = v.find("...")

# save the "client view"; i.e the RHS of the view
# line that tells the client where to put the
# files for this view.
cv = v[index+3:].strip() # +3 to remove previous '...'

# if the client view doesn't end with a
# ... wildcard, then we're going to mess up the
# output directory, so fail gracefully.
if not cv.endswith('...'):
print 'Sorry, client view in "%s" needs to end with wildcard' % (k)
sys.exit(1)
cv=cv[:-3]

# now save the view; +index means included, -index
# means it should be filtered out.
v = v[start:index]
if v.startswith("-"):
v = v[1:]
temp[v] = -len(v)
include = -len(v)
else:
temp[v] = len(v)
include = len(v)

temp[v] = (include, cv)

self.clientSpecDirs = temp.items()
self.clientSpecDirs.sort( lambda x, y: abs( y[1] ) - abs( x[1] ) )
self.clientSpecDirs.sort( lambda x, y: abs( y[1][0] ) - abs( x[1][0] ) )

def run(self, args):
self.depotPaths = []
Expand Down
5 changes: 5 additions & 0 deletions contrib/fast-import/git-p4.txt
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,11 @@ git-p4.useclientspec

git config [--global] git-p4.useclientspec false

The P4CLIENT environment variable should be correctly set for p4 to be
able to find the relevant client. This client spec will be used to
both filter the files cloned by git and set the directory layout as
specified in the client (this implies --keep-path style semantics).

Implementation Details...
=========================

Expand Down

0 comments on commit 3952710

Please sign in to comment.