diff options
author | Joel Holdsworth <jholdsworth@nvidia.com> | 2021-12-16 16:46:16 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-12-17 01:06:35 +0300 |
commit | e665e98ec1d1558a55a3e7e5fd5e88d70396ec96 (patch) | |
tree | 02adfeb2df110900609c39445b3b62bb58d9e669 /git-p4.py | |
parent | 8618d322e00f88b7b5528abfc75b26c162032a21 (diff) |
git-p4: pre-compile RCS keyword regexes
Previously git-p4.py would compile one of two regular expressions for
ever RCS keyword-enabled file. This patch improves simplifies the code
by pre-compiling the two regular expressions when the script first
loads.
Signed-off-by: Joel Holdsworth <jholdsworth@nvidia.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-p4.py')
-rwxr-xr-x | git-p4.py | 48 |
1 files changed, 18 insertions, 30 deletions
@@ -56,6 +56,9 @@ defaultBlockSize = 1<<20 p4_access_checked = False +re_ko_keywords = re.compile(r'\$(Id|Header)(:[^$\n]+)?\$') +re_k_keywords = re.compile(r'\$(Id|Header|Author|Date|DateTime|Change|File|Revision)(:[^$\n]+)?\$') + def p4_build_cmd(cmd): """Build a suitable p4 command line. @@ -577,20 +580,12 @@ def p4_type(f): # def p4_keywords_regexp_for_type(base, type_mods): if base in ("text", "unicode", "binary"): - kwords = None if "ko" in type_mods: - kwords = 'Id|Header' + return re_ko_keywords elif "k" in type_mods: - kwords = 'Id|Header|Author|Date|DateTime|Change|File|Revision' + return re_k_keywords else: return None - pattern = r""" - \$ # Starts with a dollar, followed by... - (%s) # one of the keywords, followed by... - (:[^$\n]+)? # possibly an old expansion, followed by... - \$ # another dollar - """ % kwords - return pattern else: return None @@ -1753,15 +1748,13 @@ class P4Submit(Command, P4UserMap): return result - def patchRCSKeywords(self, file, pattern): - # Attempt to zap the RCS keywords in a p4 controlled file matching the given pattern + def patchRCSKeywords(self, file, regexp): + # Attempt to zap the RCS keywords in a p4 controlled file matching the given regex (handle, outFileName) = tempfile.mkstemp(dir='.') try: with os.fdopen(handle, "w+") as outFile, open(file, "r") as inFile: - regexp = re.compile(pattern, re.VERBOSE) for line in inFile.readlines(): - line = regexp.sub(r'$\1$', line) - outFile.write(line) + outFile.write(regexp.sub(r'$\1$', line)) # Forcibly overwrite the original file os.unlink(file) shutil.move(outFileName, file) @@ -2088,25 +2081,22 @@ class P4Submit(Command, P4UserMap): # the patch to see if that's possible. if gitConfigBool("git-p4.attemptRCSCleanup"): file = None - pattern = None kwfiles = {} for file in editedFiles | filesToDelete: # did this file's delta contain RCS keywords? - pattern = p4_keywords_regexp_for_file(file) - - if pattern: + regexp = p4_keywords_regexp_for_file(file) + if regexp: # this file is a possibility...look for RCS keywords. - regexp = re.compile(pattern, re.VERBOSE) for line in read_pipe_lines(["git", "diff", "%s^..%s" % (id, id), file]): if regexp.search(line): if verbose: - print("got keyword match on %s in %s in %s" % (pattern, line, file)) - kwfiles[file] = pattern + print("got keyword match on %s in %s in %s" % (regex.pattern, line, file)) + kwfiles[file] = regexp break - for file in kwfiles: + for file, regexp in kwfiles.items(): if verbose: - print("zapping %s with %s" % (line,pattern)) + print("zapping %s with %s" % (line, regexp.pattern)) # File is being deleted, so not open in p4. Must # disable the read-only bit on windows. if self.isWindows and file not in editedFiles: @@ -3026,12 +3016,10 @@ class P4Sync(Command, P4UserMap): # Note that we do not try to de-mangle keywords on utf16 files, # even though in theory somebody may want that. - pattern = p4_keywords_regexp_for_type(type_base, type_mods) - if pattern: - regexp = re.compile(pattern, re.VERBOSE) - text = ''.join(decode_text_stream(c) for c in contents) - text = regexp.sub(r'$\1$', text) - contents = [ encode_text_stream(text) ] + regexp = p4_keywords_regexp_for_type(type_base, type_mods) + if regexp: + contents = [encode_text_stream(regexp.sub( + r'$\1$', ''.join(decode_text_stream(c) for c in contents)))] if self.largeFileSystem: (git_mode, contents) = self.largeFileSystem.processContent(git_mode, relPath, contents) |