Re: [PATCH v2] git p4: implement view spec wildcards with p4 where
2013/9/4 Junio C Hamano gits...@pobox.com: kazuki saitoh ksaitoh...@gmail.com writes: Currently, git p4 does not support many of the view wildcards, such as * and %%n. It only knows the common ... mapping, and exclusions. Redo the entire wildcard code around the idea of directly querying the p4 server for the mapping. For each commit, invoke p4 where with committed file paths as args and use the client mapping to decide where the file goes in git. This simplifies a lot of code, and adds support for all wildcards supported by p4. Downside is that there is probably a 20%-ish slowdown with this approach. [pw: redo code and tests] Signed-off-by: Kazuki Saitoh ksaitoh...@gmail.com Signed-off-by: Pete Wyckoff p...@padd.com This was whitespace-damaged in the message I received, so what is queued is after manual fix-up. Please double check what will be queued on 'pu' later and Ack, and then I'll move it to 'next' and 'master'. Indeed, some line is broken by line wrapping. I use Gmail web interface and didn't read git format-patch --help. Sorry for the inconvenience. I checked 'pu' branch and it looks correct. Acked-by: Kazuki Saitoh ksaitoh...@gmail.com Thanks. --- git-p4.py | 223 +- 1 file changed, 59 insertions(+), 164 deletions(-) diff --git a/git-p4.py b/git-p4.py index 31e71ff..1793e86 100755 --- a/git-p4.py +++ b/git-p4.py @@ -780,11 +780,14 @@ def getClientSpec(): # dictionary of all client parameters entry = specList[0] +# the //client/ name +client_name = entry[Client] + # just the keys that start with View view_keys = [ k for k in entry.keys() if k.startswith(View) ] # hold this new View -view = View() +view = View(client_name) # append the lines, in order, to the view for view_num in range(len(view_keys)): @@ -1555,8 +1558,8 @@ class P4Submit(Command, P4UserMap): for b in body: labelTemplate += \t + b + \n labelTemplate += View:\n -for mapping in clientSpec.mappings: -labelTemplate += \t%s\n % mapping.depot_side.path +for depot_side in clientSpec.mappings: +labelTemplate += \t%s\n % depot_side if self.dry_run: print Would create p4 label %s for tag % name @@ -1568,7 +1571,7 @@ class P4Submit(Command, P4UserMap): # Use the label p4_system([tag, -l, name] + - [%s@%s % (mapping.depot_side.path, changelist) for mapping in clientSpec.mappings]) + [%s@%s % (depot_side, changelist) for depot_side in clientSpec.mappings]) if verbose: print created p4 label for tag %s % name @@ -1796,117 +1799,16 @@ class View(object): Represent a p4 view (p4 help views), and map files in a repo according to the view. -class Path(object): -A depot or client path, possibly containing wildcards. - The only one supported is ... at the end, currently. - Initialize with the full path, with //depot or //client. - -def __init__(self, path, is_depot): -self.path = path -self.is_depot = is_depot -self.find_wildcards() -# remember the prefix bit, useful for relative mappings -m = re.match((//[^/]+/), self.path) -if not m: -die(Path %s does not start with //prefix/ % self.path) -prefix = m.group(1) -if not self.is_depot: -# strip //client/ on client paths -self.path = self.path[len(prefix):] - -def find_wildcards(self): -Make sure wildcards are valid, and set up internal - variables. - -self.ends_triple_dot = False -# There are three wildcards allowed in p4 views -# (see p4 help views). This code knows how to -# handle ... (only at the end), but cannot deal with -# %%n or *. Only check the depot_side, as p4 should -# validate that the client_side matches too. -if re.search(r'%%[1-9]', self.path): -die(Can't handle %%n wildcards in view: %s % self.path) -if self.path.find(*) = 0: -die(Can't handle * wildcards in view: %s % self.path) -triple_dot_index = self.path.find(...) -if triple_dot_index = 0: -if triple_dot_index != len(self.path) - 3: -die(Can handle only single ... wildcard, at end: %s % -self.path) -self.ends_triple_dot = True - -def ensure_compatible(self, other_path): -Make sure the wildcards agree. -if self.ends_triple_dot != other_path.ends_triple_dot: -
Re: [PATCH v2] git p4: implement view spec wildcards with p4 where
kazuki saitoh ksaitoh...@gmail.com writes: Currently, git p4 does not support many of the view wildcards, such as * and %%n. It only knows the common ... mapping, and exclusions. Redo the entire wildcard code around the idea of directly querying the p4 server for the mapping. For each commit, invoke p4 where with committed file paths as args and use the client mapping to decide where the file goes in git. This simplifies a lot of code, and adds support for all wildcards supported by p4. Downside is that there is probably a 20%-ish slowdown with this approach. [pw: redo code and tests] Signed-off-by: Kazuki Saitoh ksaitoh...@gmail.com Signed-off-by: Pete Wyckoff p...@padd.com This was whitespace-damaged in the message I received, so what is queued is after manual fix-up. Please double check what will be queued on 'pu' later and Ack, and then I'll move it to 'next' and 'master'. Thanks. --- git-p4.py | 223 +- 1 file changed, 59 insertions(+), 164 deletions(-) diff --git a/git-p4.py b/git-p4.py index 31e71ff..1793e86 100755 --- a/git-p4.py +++ b/git-p4.py @@ -780,11 +780,14 @@ def getClientSpec(): # dictionary of all client parameters entry = specList[0] +# the //client/ name +client_name = entry[Client] + # just the keys that start with View view_keys = [ k for k in entry.keys() if k.startswith(View) ] # hold this new View -view = View() +view = View(client_name) # append the lines, in order, to the view for view_num in range(len(view_keys)): @@ -1555,8 +1558,8 @@ class P4Submit(Command, P4UserMap): for b in body: labelTemplate += \t + b + \n labelTemplate += View:\n -for mapping in clientSpec.mappings: -labelTemplate += \t%s\n % mapping.depot_side.path +for depot_side in clientSpec.mappings: +labelTemplate += \t%s\n % depot_side if self.dry_run: print Would create p4 label %s for tag % name @@ -1568,7 +1571,7 @@ class P4Submit(Command, P4UserMap): # Use the label p4_system([tag, -l, name] + - [%s@%s % (mapping.depot_side.path, changelist) for mapping in clientSpec.mappings]) + [%s@%s % (depot_side, changelist) for depot_side in clientSpec.mappings]) if verbose: print created p4 label for tag %s % name @@ -1796,117 +1799,16 @@ class View(object): Represent a p4 view (p4 help views), and map files in a repo according to the view. -class Path(object): -A depot or client path, possibly containing wildcards. - The only one supported is ... at the end, currently. - Initialize with the full path, with //depot or //client. - -def __init__(self, path, is_depot): -self.path = path -self.is_depot = is_depot -self.find_wildcards() -# remember the prefix bit, useful for relative mappings -m = re.match((//[^/]+/), self.path) -if not m: -die(Path %s does not start with //prefix/ % self.path) -prefix = m.group(1) -if not self.is_depot: -# strip //client/ on client paths -self.path = self.path[len(prefix):] - -def find_wildcards(self): -Make sure wildcards are valid, and set up internal - variables. - -self.ends_triple_dot = False -# There are three wildcards allowed in p4 views -# (see p4 help views). This code knows how to -# handle ... (only at the end), but cannot deal with -# %%n or *. Only check the depot_side, as p4 should -# validate that the client_side matches too. -if re.search(r'%%[1-9]', self.path): -die(Can't handle %%n wildcards in view: %s % self.path) -if self.path.find(*) = 0: -die(Can't handle * wildcards in view: %s % self.path) -triple_dot_index = self.path.find(...) -if triple_dot_index = 0: -if triple_dot_index != len(self.path) - 3: -die(Can handle only single ... wildcard, at end: %s % -self.path) -self.ends_triple_dot = True - -def ensure_compatible(self, other_path): -Make sure the wildcards agree. -if self.ends_triple_dot != other_path.ends_triple_dot: - die(Both paths must end with ... if either does;\n + - paths: %s %s % (self.path, other_path.path)) - -def match_wildcards(self, test_path): -See if this test_path matches us, and fill in the value - of the