git-p4: don't exclude other files with same prefix
Make sure not to exclude files unintentionally if exclude paths are specified without a trailing /. I.e., don't exclude "//depot/file_dont_exclude" if run with "-//depot/file". Do this by ensuring that paths without a trailing "/" are only matched completely. Also, abort path search on the first match as a micro-optimization. Signed-off-by: Andrey Mazo <amazo@checkvideo.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
d6045201fc
commit
a2bee10ad9
21
git-p4.py
21
git-p4.py
@ -2623,18 +2623,25 @@ class P4Sync(Command, P4UserMap):
|
||||
if self.verbose:
|
||||
print("checkpoint finished: " + out)
|
||||
|
||||
def isPathWanted(self, path):
|
||||
for p in self.cloneExclude:
|
||||
if p.endswith("/"):
|
||||
if p4PathStartsWith(path, p):
|
||||
return False
|
||||
# "-//depot/file1" without a trailing "/" should only exclude "file1", but not "file111" or "file1_dir/file2"
|
||||
elif path.lower() == p.lower():
|
||||
return False
|
||||
for p in self.depotPaths:
|
||||
if p4PathStartsWith(path, p):
|
||||
return True
|
||||
return False
|
||||
|
||||
def extractFilesFromCommit(self, commit, shelved=False, shelved_cl = 0):
|
||||
files = []
|
||||
fnum = 0
|
||||
while "depotFile%s" % fnum in commit:
|
||||
path = commit["depotFile%s" % fnum]
|
||||
|
||||
if [p for p in self.cloneExclude
|
||||
if p4PathStartsWith(path, p)]:
|
||||
found = False
|
||||
else:
|
||||
found = [p for p in self.depotPaths
|
||||
if p4PathStartsWith(path, p)]
|
||||
found = self.isPathWanted(path)
|
||||
if not found:
|
||||
fnum = fnum + 1
|
||||
continue
|
||||
|
@ -53,7 +53,7 @@ test_expect_success 'clone, excluding part of repo' '
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_failure 'clone, excluding single file, no trailing /' '
|
||||
test_expect_success 'clone, excluding single file, no trailing /' '
|
||||
test_when_finished cleanup_git &&
|
||||
git p4 clone -//depot/discard_file --dest="$git" //depot/...@all &&
|
||||
(
|
||||
@ -85,7 +85,7 @@ test_expect_success 'clone, then sync with exclude' '
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_failure 'clone, then sync with exclude, no trailing /' '
|
||||
test_expect_success 'clone, then sync with exclude, no trailing /' '
|
||||
test_when_finished cleanup_git &&
|
||||
git p4 clone -//depot/discard/... -//depot/discard_file --dest="$git" //depot/...@all &&
|
||||
(
|
||||
|
Loading…
Reference in New Issue
Block a user