--- a/mercurial/ui.py Wed Dec 26 23:03:32 2007 +0100
+++ b/mercurial/ui.py Thu Dec 27 13:39:59 2007 +0100
@@ -412,14 +412,15 @@
def prompt(self, msg, pat=None, default="y", matchflags=0):
if not self.interactive: return default
- try:
- r = self._readline(msg + ' ')
- if not pat or re.match(pat, r, matchflags):
- return r
- else:
- self.write(_("unrecognized response\n"))
- except EOFError:
- raise util.Abort(_('response expected'))
+ while True:
+ try:
+ r = self._readline(msg + ' ')
+ if not pat or re.match(pat, r, matchflags):
+ return r
+ else:
+ self.write(_("unrecognized response\n"))
+ except EOFError:
+ raise util.Abort(_('response expected'))
def getpass(self, prompt=None, default=None):
if not self.interactive: return default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-merge-prompt Thu Dec 27 13:39:59 2007 +0100
@@ -0,0 +1,69 @@
+#!/bin/sh
+#
+# Test for b5605d88dc27
+# Make ui.prompt repeat on "unrecognized response" again (issue897)
+# and for 840e2b315c1f
+# Fix misleading error and prompts during update/merge (issue556)
+
+status() {
+ [ $? -ne 0 ] && echo "failed."
+ echo "status:"
+ hg st -A file1 file2
+ for file in file1 file2; do
+ if [ -f $file ]; then
+ echo "$file:"
+ cat $file
+ else
+ echo "$file does not exist"
+ fi
+ done
+}
+
+hg init repo
+cd repo
+echo 1 > file1
+echo 2 > file2
+hg ci -Am 'added file1 and file2' # rev 0
+
+hg rm file1
+echo changed >> file2
+hg ci -m 'removed file1, changed file2' # rev 1
+
+hg co 0
+echo changed >> file1
+hg rm file2
+hg ci -m 'changed file1, removed file2' # rev 2
+
+echo
+echo "# non-interactive merge"
+hg merge -y || echo "failed"
+status
+
+echo
+echo "# interactive merge"
+hg co -C
+hg merge --config ui.interactive=true <<EOF || echo "failed"
+c
+d
+EOF
+status
+
+echo
+echo "# interactive merge with bad input"
+hg co -C
+hg merge --config ui.interactive=true <<EOF || echo "failed"
+foo
+bar
+d
+baz
+c
+EOF
+status
+
+echo
+echo "# interactive merge with not enough input"
+hg co -C
+hg merge --config ui.interactive=true <<EOF || echo "failed"
+d
+EOF
+status
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-merge-prompt.out Thu Dec 27 13:39:59 2007 +0100
@@ -0,0 +1,64 @@
+adding file1
+adding file2
+2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+# non-interactive merge
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+status:
+M file2
+C file1
+file1:
+1
+changed
+file2:
+2
+changed
+
+# interactive merge
+0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ local changed file1 which remote deleted
+use (c)hanged version or (d)elete? remote changed file2 which local deleted
+use (c)hanged version or leave (d)eleted? 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+status:
+file2: No such file or directory
+C file1
+file1:
+1
+changed
+file2 does not exist
+
+# interactive merge with bad input
+0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ local changed file1 which remote deleted
+use (c)hanged version or (d)elete? unrecognized response
+ local changed file1 which remote deleted
+use (c)hanged version or (d)elete? unrecognized response
+ local changed file1 which remote deleted
+use (c)hanged version or (d)elete? remote changed file2 which local deleted
+use (c)hanged version or leave (d)eleted? unrecognized response
+remote changed file2 which local deleted
+use (c)hanged version or leave (d)eleted? 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+status:
+M file2
+R file1
+file1 does not exist
+file2:
+2
+changed
+
+# interactive merge with not enough input
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ local changed file1 which remote deleted
+use (c)hanged version or (d)elete? remote changed file2 which local deleted
+use (c)hanged version or leave (d)eleted? abort: response expected
+failed
+status:
+file2: No such file or directory
+C file1
+file1:
+1
+changed
+file2 does not exist