Subject: Re: [PATCHv2 04/12] git p4: move conflict prompt into run, add [q]uit input

From: Luke Diamand <[email-masked]>
Date: Sat, 15 Sep 2012 22:56:05 +0100

I'll need to supply a followup patch to ensure that a config option can 
override the prompt.

Ack.

On 09/09/12 21:16, Pete Wyckoff wrote:
> When applying a commit to the p4 workspace fails, a prompt
> asks what to do next.  This belongs up in run() instead
> of in applyCommit(), where run() can notice, for instance,
> that the prompt is unnecessary because this is the last commit.
>
> Offer two options about how to continue at conflict: [s]kip or
> [q]uit.  Having an explicit "quit" option gives git p4 a chance
> to clean up, show the applied-commit summary, and do tag export.
>
> Signed-off-by: Pete Wyckoff<[email-masked]>
> ---
>   git-p4.py                     | 41 +++++++++++++++++++++++++++++------------
>   t/t9815-git-p4-submit-fail.sh | 31 +++++++++++++++++++++++++++----
>   2 files changed, 56 insertions(+), 16 deletions(-)
>
> diff --git a/git-p4.py b/git-p4.py
> index e08fea1..479f1fc 100755
> --- a/git-p4.py
> +++ b/git-p4.py
> @@ -1198,17 +1198,11 @@ class P4Submit(Command, P4UserMap):
>                       patch_succeeded = True
>
>           if not patch_succeeded:
> -            print "What do you want to do?"
> -            response = "x"
> -            while response != "s":
> -                response = raw_input("[s]kip this patch ")
> -            if response == "s":
> -                print "Skipping! Good luck with the next patches..."
> -                for f in editedFiles:
> -                    p4_revert(f)
> -                for f in filesToAdd:
> -                    os.remove(f)
> -                return False
> +            for f in editedFiles:
> +                p4_revert(f)
> +            for f in filesToAdd:
> +                os.remove(f)
> +            return False
>
>           system(applyPatchCmd)
>
> @@ -1475,11 +1469,34 @@ class P4Submit(Command, P4UserMap):
>           if gitConfig("git-p4.detectCopiesHarder", "--bool") == "true":
>               self.diffOpts += " --find-copies-harder"
>
> +        #
> +        # Apply the commits, one at a time.  On failure, ask if should
> +        # continue to try the rest of the patches, or quit.
> +        #
>           applied = []
> -        for commit in commits:
> +        last = len(commits) - 1
> +        for i, commit in enumerate(commits):
>               ok = self.applyCommit(commit)
>               if ok:
>                   applied.append(commit)
> +            else:
> +                if i<  last:
> +                    quit = False
> +                    while True:
> +                        print "What do you want to do?"
> +                        response = raw_input("[s]kip this commit but apply"
> +                                             " the rest, or [q]uit? ")
> +                        if not response:
> +                            continue
> +                        if response[0] == "s":
> +                            print "Skipping this commit, but applying the rest"
> +                            break
> +                        if response[0] == "q":
> +                            print "Quitting"
> +                            quit = True
> +                            break
> +                    if quit:
> +                        break
>
>           chdir(self.oldWorkingDirectory)
>
> diff --git a/t/t9815-git-p4-submit-fail.sh b/t/t9815-git-p4-submit-fail.sh
> index 5c36714..397b3e8 100755
> --- a/t/t9815-git-p4-submit-fail.sh
> +++ b/t/t9815-git-p4-submit-fail.sh
> @@ -18,7 +18,7 @@ test_expect_success 'init depot' '
>   	)
>   '
>
> -test_expect_success 'conflict on one commit, skip' '
> +test_expect_success 'conflict on one commit' '
>   	test_when_finished cleanup_git&&
>   	git p4 clone --dest="$git" //depot&&
>   	(
> @@ -34,12 +34,12 @@ test_expect_success 'conflict on one commit, skip' '
>   		echo line3>>file1&&
>   		git add file1&&
>   		git commit -m "line3 in file1 will conflict"&&
> -		echo s | test_expect_code 1 git p4 submit>out&&
> +		test_expect_code 1 git p4 submit>out&&
>   		test_i18ngrep "No commits applied" out
>   	)
>   '
>
> -test_expect_success 'conflict on second of two commits, skip' '
> +test_expect_success 'conflict on second of two commits' '
>   	test_when_finished cleanup_git&&
>   	git p4 clone --dest="$git" //depot&&
>   	(
> @@ -57,7 +57,7 @@ test_expect_success 'conflict on second of two commits, skip' '
>   		echo line4>>file1&&
>   		git add file1&&
>   		git commit -m "line4 in file1 will conflict"&&
> -		echo s | test_expect_code 1 git p4 submit>out&&
> +		test_expect_code 1 git p4 submit>out&&
>   		test_i18ngrep "Applied only the commits" out
>   	)
>   '
> @@ -85,6 +85,29 @@ test_expect_success 'conflict on first of two commits, skip' '
>   	)
>   '
>
> +test_expect_success 'conflict on first of two commits, quit' '
> +	test_when_finished cleanup_git&&
> +	git p4 clone --dest="$git" //depot&&
> +	(
> +		cd "$cli"&&
> +		p4 open file1&&
> +		echo line7>>file1&&
> +		p4 submit -d "line7 in file1"
> +	)&&
> +	(
> +		cd "$git"&&
> +		git config git-p4.skipSubmitEdit true&&
> +		# this submit should cause a conflict
> +		echo line8>>file1&&
> +		git add file1&&
> +		git commit -m "line8 in file1 will conflict"&&
> +		# but this commit is okay
> +		test_commit "okay_commit_after_quit"&&
> +		echo q | test_expect_code 1 git p4 submit>out&&
> +		test_i18ngrep "No commits applied" out
> +	)
> +'
> +
>   test_expect_success 'kill p4d' '
>   	kill_p4d
>   '