Merge branch 'sh/p4-multi-depot'

"git p4" when interacting with multiple depots at the same time
used to incorrectly drop changes.

* sh/p4-multi-depot:
  git-p4: reduce number of server queries for fetches
  git-p4: support multiple depot paths in p4 submit
  git-p4: failing test case for skipping changes with multiple depots
This commit is contained in:
Junio C Hamano 2015-12-28 13:58:57 -08:00
commit aecb9979df
2 changed files with 57 additions and 26 deletions

View File

@ -822,10 +822,8 @@ def p4ChangesForPaths(depotPaths, changeRange, requestedBlockSize):
die("cannot use --changes-block-size with non-numeric revisions") die("cannot use --changes-block-size with non-numeric revisions")
block_size = None block_size = None
# Accumulate change numbers in a dictionary to avoid duplicates changes = []
changes = {}
for p in depotPaths:
# Retrieve changes a block at a time, to prevent running # Retrieve changes a block at a time, to prevent running
# into a MaxResults/MaxScanRows error from the server. # into a MaxResults/MaxScanRows error from the server.
@ -838,11 +836,12 @@ def p4ChangesForPaths(depotPaths, changeRange, requestedBlockSize):
else: else:
revisionRange = "%s,%s" % (changeStart, changeEnd) revisionRange = "%s,%s" % (changeStart, changeEnd)
for p in depotPaths:
cmd += ["%s...@%s" % (p, revisionRange)] cmd += ["%s...@%s" % (p, revisionRange)]
for line in p4_read_pipe_lines(cmd): # Insert changes in chronological order
changeNum = int(line.split(" ")[1]) for line in reversed(p4_read_pipe_lines(cmd)):
changes[changeNum] = True changes.append(int(line.split(" ")[1]))
if not block_size: if not block_size:
break break
@ -852,9 +851,8 @@ def p4ChangesForPaths(depotPaths, changeRange, requestedBlockSize):
changeStart = end + 1 changeStart = end + 1
changelist = changes.keys() changes = sorted(changes)
changelist.sort() return changes
return changelist
def p4PathStartsWith(path, prefix): def p4PathStartsWith(path, prefix):
# This method tries to remedy a potential mixed-case issue: # This method tries to remedy a potential mixed-case issue:
@ -1458,6 +1456,8 @@ class P4Submit(Command, P4UserMap):
Remove lines in the Files section that show changes to files Remove lines in the Files section that show changes to files
outside the depot path we're committing into.""" outside the depot path we're committing into."""
[upstream, settings] = findUpstreamBranchPoint()
template = "" template = ""
inFilesSection = False inFilesSection = False
for line in p4_read_pipe_lines(['change', '-o']): for line in p4_read_pipe_lines(['change', '-o']):
@ -1470,6 +1470,11 @@ class P4Submit(Command, P4UserMap):
lastTab = path.rfind("\t") lastTab = path.rfind("\t")
if lastTab != -1: if lastTab != -1:
path = path[:lastTab] path = path[:lastTab]
if settings.has_key('depot-paths'):
if not [p for p in settings['depot-paths']
if p4PathStartsWith(path, p)]:
continue
else:
if not p4PathStartsWith(path, self.depotPath): if not p4PathStartsWith(path, self.depotPath):
continue continue
else: else:

View File

@ -84,7 +84,7 @@ p4_add_file() {
(cd "$cli" && (cd "$cli" &&
>$1 && >$1 &&
p4 add $1 && p4 add $1 &&
p4 submit -d "Added a file" $1 p4 submit -d "Added file $1" $1
) )
} }
@ -112,6 +112,32 @@ test_expect_success 'Syncing files' '
) )
' '
# Handling of multiple depot paths:
# git p4 clone //depot/pathA //depot/pathB
#
test_expect_success 'Create a repo with multiple depot paths' '
client_view "//depot/pathA/... //client/pathA/..." \
"//depot/pathB/... //client/pathB/..." &&
mkdir -p "$cli/pathA" "$cli/pathB" &&
for p in pathA pathB
do
for i in $(test_seq 1 10)
do
p4_add_file "$p/file$p$i"
done
done
'
test_expect_success 'Clone repo with multiple depot paths' '
(
cd "$git" &&
git p4 clone --changes-block-size=4 //depot/pathA@all //depot/pathB@all \
--destination=dest &&
ls -1 dest >log &&
test_line_count = 20 log
)
'
test_expect_success 'kill p4d' ' test_expect_success 'kill p4d' '
kill_p4d kill_p4d
' '