зеркало из https://github.com/microsoft/git.git
Merge branch 'pw/p4-view-updates'
* pw/p4-view-updates: git-p4: add tests demonstrating spec overlay ambiguities git-p4: adjust test to adhere to stricter useClientSpec git-p4: clarify comment git-p4: fix verbose comment typo git-p4: only a single ... wildcard is supported
This commit is contained in:
Коммит
1082fb22b2
|
@ -314,6 +314,11 @@ around whitespace. Of the possible wildcards, git-p4 only handles
|
|||
'...', and only when it is at the end of the path. Git-p4 will complain
|
||||
if it encounters an unhandled wildcard.
|
||||
|
||||
Bugs in the implementation of overlap mappings exist. If multiple depot
|
||||
paths map through overlays to the same location in the repository,
|
||||
git-p4 can choose the wrong one. This is hard to solve without
|
||||
dedicating a client spec just for git-p4.
|
||||
|
||||
The name of the client can be given to git-p4 in multiple ways. The
|
||||
variable 'git-p4.client' takes precedence if it exists. Otherwise,
|
||||
normal p4 mechanisms of determining the client are used: environment
|
||||
|
|
|
@ -1207,8 +1207,8 @@ class View(object):
|
|||
die("Can't handle * wildcards in view: %s" % self.path)
|
||||
triple_dot_index = self.path.find("...")
|
||||
if triple_dot_index >= 0:
|
||||
if not self.path.endswith("..."):
|
||||
die("Can handle ... wildcard only at end of path: %s" %
|
||||
if triple_dot_index != len(self.path) - 3:
|
||||
die("Can handle only single ... wildcard, at end: %s" %
|
||||
self.path)
|
||||
self.ends_triple_dot = True
|
||||
|
||||
|
@ -1263,7 +1263,7 @@ class View(object):
|
|||
if self.exclude:
|
||||
c = "-"
|
||||
return "View.Mapping: %s%s -> %s" % \
|
||||
(c, self.depot_side, self.client_side)
|
||||
(c, self.depot_side.path, self.client_side.path)
|
||||
|
||||
def map_depot_to_client(self, depot_path):
|
||||
"""Calculate the client path if using this mapping on the
|
||||
|
@ -1363,7 +1363,8 @@ class View(object):
|
|||
else:
|
||||
# This mapping matched; no need to search any further.
|
||||
# But, the mapping could be rejected if the client path
|
||||
# has already been claimed by an earlier mapping.
|
||||
# has already been claimed by an earlier mapping (i.e.
|
||||
# one later in the list, which we are walking backwards).
|
||||
already_mapped_in_client = False
|
||||
for f in paths_filled:
|
||||
# this is View.Path.match
|
||||
|
|
|
@ -146,7 +146,7 @@ test_expect_success 'clone --use-client-spec' '
|
|||
(
|
||||
cd "$git" &&
|
||||
test_path_is_file bus/dir/f4 &&
|
||||
test_path_is_file file1
|
||||
test_path_is_missing file1
|
||||
) &&
|
||||
cleanup_git &&
|
||||
|
||||
|
@ -159,7 +159,7 @@ test_expect_success 'clone --use-client-spec' '
|
|||
"$GITP4" sync //depot/... &&
|
||||
git checkout -b master p4/master &&
|
||||
test_path_is_file bus/dir/f4 &&
|
||||
test_path_is_file file1
|
||||
test_path_is_missing file1
|
||||
)
|
||||
'
|
||||
|
||||
|
|
|
@ -101,12 +101,18 @@ test_expect_success 'unsupported view wildcard *' '
|
|||
test_must_fail "$GITP4" clone --use-client-spec --dest="$git" //depot
|
||||
'
|
||||
|
||||
test_expect_success 'wildcard ... only supported at end of spec' '
|
||||
test_expect_success 'wildcard ... only supported at end of spec 1' '
|
||||
client_view "//depot/.../file11 //client/.../file11" &&
|
||||
test_when_finished cleanup_git &&
|
||||
test_must_fail "$GITP4" clone --use-client-spec --dest="$git" //depot
|
||||
'
|
||||
|
||||
test_expect_success 'wildcard ... only supported at end of spec 2' '
|
||||
client_view "//depot/.../a/... //client/.../a/..." &&
|
||||
test_when_finished cleanup_git &&
|
||||
test_must_fail "$GITP4" clone --use-client-spec --dest="$git" //depot
|
||||
'
|
||||
|
||||
test_expect_success 'basic map' '
|
||||
client_view "//depot/dir1/... //client/cli1/..." &&
|
||||
files="cli1/file11 cli1/file12" &&
|
||||
|
@ -240,6 +246,393 @@ test_expect_success 'quotes on rhs only' '
|
|||
git_verify "cdir 1/file11" "cdir 1/file12"
|
||||
'
|
||||
|
||||
#
|
||||
# What happens when two files of the same name are overlayed together?
|
||||
# The last-listed file should take preference.
|
||||
#
|
||||
# //depot
|
||||
# - dir1
|
||||
# - file11
|
||||
# - file12
|
||||
# - filecollide
|
||||
# - dir2
|
||||
# - file21
|
||||
# - file22
|
||||
# - filecollide
|
||||
#
|
||||
test_expect_success 'overlay collision setup' '
|
||||
client_view "//depot/... //client/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
echo dir1/filecollide >dir1/filecollide &&
|
||||
p4 add dir1/filecollide &&
|
||||
p4 submit -d dir1/filecollide &&
|
||||
echo dir2/filecollide >dir2/filecollide &&
|
||||
p4 add dir2/filecollide &&
|
||||
p4 submit -d dir2/filecollide
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'overlay collision 1 to 2' '
|
||||
client_view "//depot/dir1/... //client/..." \
|
||||
"+//depot/dir2/... //client/..." &&
|
||||
files="file11 file12 file21 file22 filecollide" &&
|
||||
echo dir2/filecollide >actual &&
|
||||
client_verify $files &&
|
||||
test_cmp actual "$cli"/filecollide &&
|
||||
test_when_finished cleanup_git &&
|
||||
"$GITP4" clone --use-client-spec --dest="$git" //depot &&
|
||||
git_verify $files &&
|
||||
test_cmp actual "$git"/filecollide
|
||||
'
|
||||
|
||||
test_expect_failure 'overlay collision 2 to 1' '
|
||||
client_view "//depot/dir2/... //client/..." \
|
||||
"+//depot/dir1/... //client/..." &&
|
||||
files="file11 file12 file21 file22 filecollide" &&
|
||||
echo dir1/filecollide >actual &&
|
||||
client_verify $files &&
|
||||
test_cmp actual "$cli"/filecollide &&
|
||||
test_when_finished cleanup_git &&
|
||||
"$GITP4" clone --use-client-spec --dest="$git" //depot &&
|
||||
git_verify $files &&
|
||||
test_cmp actual "$git"/filecollide
|
||||
'
|
||||
|
||||
test_expect_success 'overlay collision delete 2' '
|
||||
client_view "//depot/... //client/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
p4 delete dir2/filecollide &&
|
||||
p4 submit -d "remove dir2/filecollide"
|
||||
)
|
||||
'
|
||||
|
||||
# no filecollide, got deleted with dir2
|
||||
test_expect_failure 'overlay collision 1 to 2, but 2 deleted' '
|
||||
client_view "//depot/dir1/... //client/..." \
|
||||
"+//depot/dir2/... //client/..." &&
|
||||
files="file11 file12 file21 file22" &&
|
||||
client_verify $files &&
|
||||
test_when_finished cleanup_git &&
|
||||
"$GITP4" clone --use-client-spec --dest="$git" //depot &&
|
||||
git_verify $files
|
||||
'
|
||||
|
||||
test_expect_success 'overlay collision update 1' '
|
||||
client_view "//depot/dir1/... //client/dir1/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
p4 open dir1/filecollide &&
|
||||
echo dir1/filecollide update >dir1/filecollide &&
|
||||
p4 submit -d "update dir1/filecollide"
|
||||
)
|
||||
'
|
||||
|
||||
# still no filecollide, dir2 still wins with the deletion even though the
|
||||
# change to dir1 is more recent
|
||||
test_expect_failure 'overlay collision 1 to 2, but 2 deleted, then 1 updated' '
|
||||
client_view "//depot/dir1/... //client/..." \
|
||||
"+//depot/dir2/... //client/..." &&
|
||||
files="file11 file12 file21 file22" &&
|
||||
client_verify $files &&
|
||||
test_when_finished cleanup_git &&
|
||||
"$GITP4" clone --use-client-spec --dest="$git" //depot &&
|
||||
git_verify $files
|
||||
'
|
||||
|
||||
test_expect_success 'overlay collision delete filecollides' '
|
||||
client_view "//depot/... //client/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
p4 delete dir1/filecollide dir2/filecollide &&
|
||||
p4 submit -d "remove filecollides"
|
||||
)
|
||||
'
|
||||
|
||||
#
|
||||
# Overlays as part of sync, rather than initial checkout:
|
||||
# 1. add a file in dir1
|
||||
# 2. sync to include it
|
||||
# 3. add same file in dir2
|
||||
# 4. sync, make sure content switches as dir2 has priority
|
||||
# 5. add another file in dir1
|
||||
# 6. sync
|
||||
# 7. add/delete same file in dir2
|
||||
# 8. sync, make sure it disappears, again dir2 wins
|
||||
# 9. cleanup
|
||||
#
|
||||
# //depot
|
||||
# - dir1
|
||||
# - file11
|
||||
# - file12
|
||||
# - colA
|
||||
# - colB
|
||||
# - dir2
|
||||
# - file21
|
||||
# - file22
|
||||
# - colA
|
||||
# - colB
|
||||
#
|
||||
test_expect_success 'overlay sync: add colA in dir1' '
|
||||
client_view "//depot/dir1/... //client/dir1/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
echo dir1/colA >dir1/colA &&
|
||||
p4 add dir1/colA &&
|
||||
p4 submit -d dir1/colA
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync: initial git checkout' '
|
||||
client_view "//depot/dir1/... //client/..." \
|
||||
"+//depot/dir2/... //client/..." &&
|
||||
files="file11 file12 file21 file22 colA" &&
|
||||
echo dir1/colA >actual &&
|
||||
client_verify $files &&
|
||||
test_cmp actual "$cli"/colA &&
|
||||
"$GITP4" clone --use-client-spec --dest="$git" //depot &&
|
||||
git_verify $files &&
|
||||
test_cmp actual "$git"/colA
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync: add colA in dir2' '
|
||||
client_view "//depot/dir2/... //client/dir2/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
echo dir2/colA >dir2/colA &&
|
||||
p4 add dir2/colA &&
|
||||
p4 submit -d dir2/colA
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync: colA content switch' '
|
||||
client_view "//depot/dir1/... //client/..." \
|
||||
"+//depot/dir2/... //client/..." &&
|
||||
files="file11 file12 file21 file22 colA" &&
|
||||
echo dir2/colA >actual &&
|
||||
client_verify $files &&
|
||||
test_cmp actual "$cli"/colA &&
|
||||
(
|
||||
cd "$git" &&
|
||||
"$GITP4" sync --use-client-spec &&
|
||||
git merge --ff-only p4/master
|
||||
) &&
|
||||
git_verify $files &&
|
||||
test_cmp actual "$git"/colA
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync: add colB in dir1' '
|
||||
client_view "//depot/dir1/... //client/dir1/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
echo dir1/colB >dir1/colB &&
|
||||
p4 add dir1/colB &&
|
||||
p4 submit -d dir1/colB
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync: colB appears' '
|
||||
client_view "//depot/dir1/... //client/..." \
|
||||
"+//depot/dir2/... //client/..." &&
|
||||
files="file11 file12 file21 file22 colA colB" &&
|
||||
echo dir1/colB >actual &&
|
||||
client_verify $files &&
|
||||
test_cmp actual "$cli"/colB &&
|
||||
(
|
||||
cd "$git" &&
|
||||
"$GITP4" sync --use-client-spec &&
|
||||
git merge --ff-only p4/master
|
||||
) &&
|
||||
git_verify $files &&
|
||||
test_cmp actual "$git"/colB
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync: add/delete colB in dir2' '
|
||||
client_view "//depot/dir2/... //client/dir2/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
echo dir2/colB >dir2/colB &&
|
||||
p4 add dir2/colB &&
|
||||
p4 submit -d dir2/colB &&
|
||||
p4 delete dir2/colB &&
|
||||
p4 submit -d "delete dir2/colB"
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync: colB disappears' '
|
||||
client_view "//depot/dir1/... //client/..." \
|
||||
"+//depot/dir2/... //client/..." &&
|
||||
files="file11 file12 file21 file22 colA" &&
|
||||
client_verify $files &&
|
||||
test_when_finished cleanup_git &&
|
||||
(
|
||||
cd "$git" &&
|
||||
"$GITP4" sync --use-client-spec &&
|
||||
git merge --ff-only p4/master
|
||||
) &&
|
||||
git_verify $files
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync: cleanup' '
|
||||
client_view "//depot/... //client/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
p4 delete dir1/colA dir2/colA dir1/colB &&
|
||||
p4 submit -d "remove overlay sync files"
|
||||
)
|
||||
'
|
||||
|
||||
#
|
||||
# Overlay tests again, but swapped so dir1 has priority.
|
||||
# 1. add a file in dir1
|
||||
# 2. sync to include it
|
||||
# 3. add same file in dir2
|
||||
# 4. sync, make sure content does not switch
|
||||
# 5. add another file in dir1
|
||||
# 6. sync
|
||||
# 7. add/delete same file in dir2
|
||||
# 8. sync, make sure it is still there
|
||||
# 9. cleanup
|
||||
#
|
||||
# //depot
|
||||
# - dir1
|
||||
# - file11
|
||||
# - file12
|
||||
# - colA
|
||||
# - colB
|
||||
# - dir2
|
||||
# - file21
|
||||
# - file22
|
||||
# - colA
|
||||
# - colB
|
||||
#
|
||||
test_expect_success 'overlay sync swap: add colA in dir1' '
|
||||
client_view "//depot/dir1/... //client/dir1/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
echo dir1/colA >dir1/colA &&
|
||||
p4 add dir1/colA &&
|
||||
p4 submit -d dir1/colA
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync swap: initial git checkout' '
|
||||
client_view "//depot/dir2/... //client/..." \
|
||||
"+//depot/dir1/... //client/..." &&
|
||||
files="file11 file12 file21 file22 colA" &&
|
||||
echo dir1/colA >actual &&
|
||||
client_verify $files &&
|
||||
test_cmp actual "$cli"/colA &&
|
||||
"$GITP4" clone --use-client-spec --dest="$git" //depot &&
|
||||
git_verify $files &&
|
||||
test_cmp actual "$git"/colA
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync swap: add colA in dir2' '
|
||||
client_view "//depot/dir2/... //client/dir2/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
echo dir2/colA >dir2/colA &&
|
||||
p4 add dir2/colA &&
|
||||
p4 submit -d dir2/colA
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_failure 'overlay sync swap: colA no content switch' '
|
||||
client_view "//depot/dir2/... //client/..." \
|
||||
"+//depot/dir1/... //client/..." &&
|
||||
files="file11 file12 file21 file22 colA" &&
|
||||
echo dir1/colA >actual &&
|
||||
client_verify $files &&
|
||||
test_cmp actual "$cli"/colA &&
|
||||
(
|
||||
cd "$git" &&
|
||||
"$GITP4" sync --use-client-spec &&
|
||||
git merge --ff-only p4/master
|
||||
) &&
|
||||
git_verify $files &&
|
||||
test_cmp actual "$git"/colA
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync swap: add colB in dir1' '
|
||||
client_view "//depot/dir1/... //client/dir1/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
echo dir1/colB >dir1/colB &&
|
||||
p4 add dir1/colB &&
|
||||
p4 submit -d dir1/colB
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync swap: colB appears' '
|
||||
client_view "//depot/dir2/... //client/..." \
|
||||
"+//depot/dir1/... //client/..." &&
|
||||
files="file11 file12 file21 file22 colA colB" &&
|
||||
echo dir1/colB >actual &&
|
||||
client_verify $files &&
|
||||
test_cmp actual "$cli"/colB &&
|
||||
(
|
||||
cd "$git" &&
|
||||
"$GITP4" sync --use-client-spec &&
|
||||
git merge --ff-only p4/master
|
||||
) &&
|
||||
git_verify $files &&
|
||||
test_cmp actual "$git"/colB
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync swap: add/delete colB in dir2' '
|
||||
client_view "//depot/dir2/... //client/dir2/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
echo dir2/colB >dir2/colB &&
|
||||
p4 add dir2/colB &&
|
||||
p4 submit -d dir2/colB &&
|
||||
p4 delete dir2/colB &&
|
||||
p4 submit -d "delete dir2/colB"
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_failure 'overlay sync swap: colB no change' '
|
||||
client_view "//depot/dir2/... //client/..." \
|
||||
"+//depot/dir1/... //client/..." &&
|
||||
files="file11 file12 file21 file22 colA colB" &&
|
||||
echo dir1/colB >actual &&
|
||||
client_verify $files &&
|
||||
test_cmp actual "$cli"/colB &&
|
||||
test_when_finished cleanup_git &&
|
||||
(
|
||||
cd "$git" &&
|
||||
"$GITP4" sync --use-client-spec &&
|
||||
git merge --ff-only p4/master
|
||||
) &&
|
||||
git_verify $files &&
|
||||
test_cmp actual "$cli"/colB
|
||||
'
|
||||
|
||||
test_expect_success 'overlay sync swap: cleanup' '
|
||||
client_view "//depot/... //client/..." &&
|
||||
(
|
||||
cd "$cli" &&
|
||||
p4 sync &&
|
||||
p4 delete dir1/colA dir2/colA dir1/colB &&
|
||||
p4 submit -d "remove overlay sync files"
|
||||
)
|
||||
'
|
||||
|
||||
#
|
||||
# Rename directories to test quoting in depot-side mappings
|
||||
# //depot
|
||||
|
|
Загрузка…
Ссылка в новой задаче