# [PATCHv3 0/2] git-p4: shelved change update with move/copy

5 messages from 2019-01-18 to 2019-01-22. Participants: Luke Diamand, Junio C Hamano, Mazo, Andrey.
Thread: https://gitlist.dev/t/50258

## Luke Diamand, 2019-01-18 09:36

Subject: [PATCHv3 0/2] git-p4: shelved change update with move/copy
Message-ID: <20190118093656.16521-1-luke@diamand.org>
URL: https://gitlist.dev/e/20190118093656.16521-1-luke%40diamand.org

```
This updates the patchset to support copy, as suggested by Andrey.

Luke Diamand (2):
  git-p4: add failing test for shelved CL update involving move/copy
  git-p4: handle update of moved/copied files when updating a shelve

 git-p4.py                |  2 ++
 t/t9807-git-p4-submit.sh | 57 +++++++++++++++++++++++++++++++++++++---
 2 files changed, 56 insertions(+), 3 deletions(-)

-- 
2.20.1.100.g9ee79a14a8


```

## Luke Diamand, 2019-01-18 09:36

Subject: [PATCHv3 1/2] git-p4: add failing test for shelved CL update involving move/copy
Message-ID: <20190118093656.16521-2-luke@diamand.org>
URL: https://gitlist.dev/e/20190118093656.16521-2-luke%40diamand.org
In-Reply-To: <20190118093656.16521-1-luke@diamand.org>

```
Updating a shelved P4 changelist where one or more files have
been moved or copied does not work. Add a test for this.

The problem is that P4 requires a complete list of the files being
changed, and move/copy only includes the _source_ in the case of
updating a shelved changelist. This results in errors from Perforce
such as:

  //depot/src - needs tofile //depot/dst
  Submit aborted -- fix problems then use 'p4 submit -c 1234'

Signed-off-by: Luke Diamand <luke@diamand.org>
Acked-by: Andrey Mazo <amazo@checkvideo.com>
---
 t/t9807-git-p4-submit.sh | 57 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 54 insertions(+), 3 deletions(-)

diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh
index 2325599ee6..2ad3d801cc 100755
--- a/t/t9807-git-p4-submit.sh
+++ b/t/t9807-git-p4-submit.sh
@@ -500,6 +500,10 @@ test_expect_success 'submit --shelve' '
 	)
 '
 
+last_shelve() {
+	p4 -G changes -s shelved -m 1 //depot/... | marshal_dump change
+}
+
 make_shelved_cl() {
 	test_commit "$1" >/dev/null &&
 	git p4 submit --origin HEAD^ --shelve >/dev/null &&
@@ -533,12 +537,59 @@ test_expect_success 'submit --update-shelve' '
 	) &&
 	(
 		cd "$cli" &&
-		change=$(p4 -G changes -s shelved -m 1 //depot/... | \
-			 marshal_dump change) &&
+		change=$(last_shelve) &&
 		p4 unshelve -c $change -s $change &&
 		grep -q updated-line shelf.t &&
 		p4 describe -S $change | grep added-file.t &&
-		test_path_is_missing shelved-change-1.t
+		test_path_is_missing shelved-change-1.t &&
+		p4 revert ...
+	)
+'
+
+test_expect_failure 'update a shelve involving moved and copied files' '
+	test_when_finished cleanup_git &&
+	(
+		cd "$cli" &&
+		: >file_to_move &&
+		p4 add file_to_move &&
+		p4 submit -d "change1" &&
+		p4 edit file_to_move &&
+		echo change >>file_to_move &&
+		p4 submit -d "change2" &&
+		p4 opened
+	) &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		git config git-p4.detectCopies true &&
+		git config git-p4.detectRenames true &&
+		git config git-p4.skipSubmitEdit true &&
+		mkdir moved &&
+		cp file_to_move copy_of_file &&
+		git add copy_of_file &&
+		git mv file_to_move moved/ &&
+		git commit -m "rename a file" &&
+		git p4 submit -M --shelve --origin HEAD^ &&
+		: >new_file &&
+		git add new_file &&
+		git commit --amend &&
+		git show --stat HEAD &&
+		change=$(last_shelve) &&
+		git p4 submit -M --update-shelve $change --commit HEAD
+	) &&
+	(
+		cd "$cli" &&
+		change=$(last_shelve) &&
+		echo change=$change &&
+		p4 unshelve -s $change &&
+		p4 submit -d "Testing update-shelve" &&
+		test_path_is_file copy_of_file &&
+		test_path_is_file moved/file_to_move &&
+		test_path_is_missing file_to_move &&
+		test_path_is_file new_file &&
+		echo "unshelved and submitted change $change" &&
+		p4 changes moved/file_to_move | grep "Testing update-shelve" &&
+		p4 changes copy_of_file | grep "Testing update-shelve"
 	)
 '
 
-- 
2.20.1.100.g9ee79a14a8


```

## Luke Diamand, 2019-01-18 09:36

Subject: [PATCHv3 2/2] git-p4: handle update of moved/copied files when updating a shelve
Message-ID: <20190118093656.16521-3-luke@diamand.org>
URL: https://gitlist.dev/e/20190118093656.16521-3-luke%40diamand.org
In-Reply-To: <20190118093656.16521-2-luke@diamand.org>

```
Perforce requires a complete list of files being operated on. If
git is updating an existing shelved changelist, then any files
which are moved or copied were not being added to this list.

Signed-off-by: Luke Diamand <luke@diamand.org>
Acked-by: Andrey Mazo <amazo@checkvideo.com>
---
 git-p4.py                | 2 ++
 t/t9807-git-p4-submit.sh | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/git-p4.py b/git-p4.py
index 1998c3e141..b1c262e13d 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -1859,6 +1859,7 @@ def applyCommit(self, id):
                     filesToAdd.remove(path)
             elif modifier == "C":
                 src, dest = diff['src'], diff['dst']
+                all_files.append(dest)
                 p4_integrate(src, dest)
                 pureRenameCopy.add(dest)
                 if diff['src_sha1'] != diff['dst_sha1']:
@@ -1875,6 +1876,7 @@ def applyCommit(self, id):
                 editedFiles.add(dest)
             elif modifier == "R":
                 src, dest = diff['src'], diff['dst']
+                all_files.append(dest)
                 if self.p4HasMoveCommand:
                     p4_edit(src)        # src must be open before move
                     p4_move(src, dest)  # opens for (move/delete, move/add)
diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh
index 2ad3d801cc..099e5e079d 100755
--- a/t/t9807-git-p4-submit.sh
+++ b/t/t9807-git-p4-submit.sh
@@ -546,7 +546,7 @@ test_expect_success 'submit --update-shelve' '
 	)
 '
 
-test_expect_failure 'update a shelve involving moved and copied files' '
+test_expect_success 'update a shelve involving moved and copied files' '
 	test_when_finished cleanup_git &&
 	(
 		cd "$cli" &&
-- 
2.20.1.100.g9ee79a14a8


```

## Junio C Hamano, 2019-01-18 17:46

Subject: Re: [PATCHv3 0/2] git-p4: shelved change update with move/copy
Message-ID: <xmqqva2lluz6.fsf@gitster-ct.c.googlers.com>
URL: https://gitlist.dev/e/xmqqva2lluz6.fsf%40gitster-ct.c.googlers.com
In-Reply-To: <20190118093656.16521-1-luke@diamand.org>

```
Luke Diamand <luke@diamand.org> writes:

> This updates the patchset to support copy, as suggested by Andrey.
>
> Luke Diamand (2):
>   git-p4: add failing test for shelved CL update involving move/copy
>   git-p4: handle update of moved/copied files when updating a shelve
>
>  git-p4.py                |  2 ++
>  t/t9807-git-p4-submit.sh | 57 +++++++++++++++++++++++++++++++++++++---
>  2 files changed, 56 insertions(+), 3 deletions(-)

Thanks.

This has been listed among those that have been planned to be merged
down to 'next', which I wanted to do today.  I'll replace it with
this round and merge it in a few days.

```

## Mazo, Andrey, 2019-01-22 18:16

Subject: Re: [PATCHv3 0/2] git-p4: shelved change update with move/copy
Message-ID: <20190122181547.2172-1-amazo@checkvideo.com>
URL: https://gitlist.dev/e/20190122181547.2172-1-amazo%40checkvideo.com
In-Reply-To: <20190118093656.16521-1-luke@diamand.org>

```
> This updates the patchset to support copy, as suggested by Andrey.
> 
> Luke Diamand (2):
>   git-p4: add failing test for shelved CL update involving move/copy
>   git-p4: handle update of moved/copied files when updating a shelve
> 
>  git-p4.py                |  2 ++
>  t/t9807-git-p4-submit.sh | 57 +++++++++++++++++++++++++++++++++++++---
>  2 files changed, 56 insertions(+), 3 deletions(-)

Thank you for addressing my comments!
The updated patchset looks good to me:
Acked-by: Andrey Mazo <amazo@checkvideo.com>

Thank you,
Andrey

```
