From: Pete Wyckoff Date: Mon, 30 Apr 2012 00:57:16 +0000 (-0400) Subject: git p4: fix writable file after rename or copy X-Git-Tag: v1.7.11-rc0~68^2~1 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b6ad6dcc3b0629d525abc9fe0882e1b0eb969e17;p=git-core%2Fgit.git 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 Signed-off-by: Junio C Hamano --- diff --git a/git-p4.py b/git-p4.py index a22354ae8..2d83aa883 100755 --- a/git-p4.py +++ b/git-p4.py @@ -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 a2499ee02..f23b4c362 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 796b02c7f..43ed1feed 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" &&