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>
This commit is contained in:
parent
8618d322e0
commit
e665e98ec1
48
git-p4.py
48
git-p4.py
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user