Obey p4 views when using client spec
PATCH 1/1 Obey p4 views when using client spec
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.
--- contrib/fast-import/git-p4 | 50 ++++++++++++++++++++++++++++++++++++--- contrib/fast-import/git-p4.txt | 5 ++++ 2 files changed, 51 insertions(+), 4 deletions(-)
contrib/fast-import/git-p4 +46 -4
@@ -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])]
@@ -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
@@ -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 = []
contrib/fast-import/git-p4.txt +5 -0
@@ -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... =========================
Signature · 1 line
1.7.3.2
[email protected] wrote on Fri, 11 Feb 2011 16:33 -0800:
Quoted 10 lines
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
Quoted 8 lines
branch/
branch/foo
branch/barp4 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 <[email protected]>
Nice, thanks for making the changes.
Tor Arvid Lund
Acked-byQuoted 15 lines · Pete Wyckoff
[email protected] wrote on Fri, 11 Feb 2011 16:33 -0800:
Quoted 14 lines
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
Quoted 8 lines
Quoted 4 lines
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 <[email protected]>Nice, thanks for making the changes.
Acked-by Pete Wyckoff <[email protected]>
Good work, Ian! Thanks.
Quoted 6 lines · Tor Arvid Lund
Quoted 6 lines
Quoted 5 lines
...
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 <[email protected]>
Quoted 7 lines
Quoted 3 lines
Nice, thanks for making the changes.
Acked-by Pete Wyckoff <[email protected]>Good work, Ian! Thanks.
Acked-by Tor Arvid Lund <[email protected]>
Will apply; thanks.