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:
Mazo, Andrey 2019-04-01 18:02:32 +00:00 committed by Junio C Hamano
parent d6045201fc
commit a2bee10ad9
2 changed files with 16 additions and 9 deletions

View File

@ -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

View File

@ -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 &&
(