diff options
author | Pete Wyckoff <pw@padd.com> | 2012-04-29 20:57:16 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-04-30 16:00:04 -0700 |
commit | b6ad6dcc3b0629d525abc9fe0882e1b0eb969e17 (patch) | |
tree | 9f00b39820b05293dd65097c8aaf5823c77654ea | |
parent | 0f224e5b73a73f37887eb7cb3e51073f889a3f9c (diff) | |
download | git-b6ad6dcc3b0629d525abc9fe0882e1b0eb969e17.tar.gz |
git p4: fix writable file after rename or copy
The way rename works is with a "p4 integrate", optionally
followed by a "p4 edit" if the change is not a 100% rename.
Contents are generated by applying a patch, not doing a file
system rename. Copy is similar.
In this case, p4 does not fix the permissions back to read-only.
Make sure this happens by calling "p4 sync -f".
Signed-off-by: Pete Wyckoff <pw@padd.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-x | git-p4.py | 12 | ||||
-rwxr-xr-x | t/t9807-git-p4-submit.sh | 6 | ||||
-rwxr-xr-x | t/t9809-git-p4-client-view.sh | 7 |
3 files changed, 20 insertions, 5 deletions
@@ -1038,6 +1038,7 @@ class P4Submit(Command, P4UserMap): filesToAdd = set() filesToDelete = set() editedFiles = set() + pureRenameCopy = set() filesToChangeExecBit = {} for line in diff: @@ -1061,10 +1062,13 @@ class P4Submit(Command, P4UserMap): elif modifier == "C": src, dest = diff['src'], diff['dst'] p4_integrate(src, dest) + pureRenameCopy.add(dest) if diff['src_sha1'] != diff['dst_sha1']: p4_edit(dest) + pureRenameCopy.discard(dest) if isModeExecChanged(diff['src_mode'], diff['dst_mode']): p4_edit(dest) + pureRenameCopy.discard(dest) filesToChangeExecBit[dest] = diff['dst_mode'] os.unlink(dest) editedFiles.add(dest) @@ -1073,6 +1077,8 @@ class P4Submit(Command, P4UserMap): p4_integrate(src, dest) if diff['src_sha1'] != diff['dst_sha1']: p4_edit(dest) + else: + pureRenameCopy.add(dest) if isModeExecChanged(diff['src_mode'], diff['dst_mode']): p4_edit(dest) filesToChangeExecBit[dest] = diff['dst_mode'] @@ -1226,6 +1232,12 @@ class P4Submit(Command, P4UserMap): # unmarshalled. changelist = self.lastP4Changelist() self.modifyChangelistUser(changelist, p4User) + + # The rename/copy happened by applying a patch that created a + # new file. This leaves it writable, which confuses p4. + for f in pureRenameCopy: + p4_sync(f, "-f") + else: # skip this patch print "Submission cancelled, undoing p4 changes." diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh index a2499ee024..f23b4c3620 100755 --- a/t/t9807-git-p4-submit.sh +++ b/t/t9807-git-p4-submit.sh @@ -158,7 +158,8 @@ test_expect_success 'submit copy' ' ) && ( cd "$cli" && - test_path_is_file file5.ta + test_path_is_file file5.ta && + test ! -w file5.ta ) ' @@ -176,7 +177,8 @@ test_expect_success 'submit rename' ' ( cd "$cli" && test_path_is_missing file6.t && - test_path_is_file file6.ta + test_path_is_file file6.ta && + test ! -w file6.ta ) ' diff --git a/t/t9809-git-p4-client-view.sh b/t/t9809-git-p4-client-view.sh index 796b02c7f3..43ed1feedf 100755 --- a/t/t9809-git-p4-client-view.sh +++ b/t/t9809-git-p4-client-view.sh @@ -349,7 +349,8 @@ test_expect_success 'subdir clone, submit copy' ' ) && ( cd "$cli" && - test_path_is_file dir1/file11a + test_path_is_file dir1/file11a && + test ! -w dir1/file11a ) ' @@ -368,14 +369,14 @@ test_expect_success 'subdir clone, submit rename' ' ( cd "$cli" && test_path_is_missing dir1/file13 && - test_path_is_file dir1/file13a + test_path_is_file dir1/file13a && + test ! -w dir1/file13a ) ' test_expect_success 'reinit depot' ' ( cd "$cli" && - p4 sync -f && rm files && p4 delete */* && p4 submit -d "delete all files" && |