Patchwork D9378: errors: remove trailing "!" from some error messages for consistency

login
register
mail settings
Submitter phabricator
Date Nov. 23, 2020, 11:41 p.m.
Message ID <differential-rev-PHID-DREV-dczya4t3llt6nomit52h-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/47661/
State Superseded
Headers show

Comments

phabricator - Nov. 23, 2020, 11:41 p.m.
martinvonz created this revision.
Herald added a reviewer: durin42.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  Some types of exceptions had a trailing "!" printed after the message
  from the exception itself. I guess some of these errors seem a little
  more severe (?), but it seems more likely that the inconsistency was
  just an oversight.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D9378

AFFECTED FILES
  mercurial/scmutil.py
  tests/test-alias.t
  tests/test-bheads.t
  tests/test-bookmarks-current.t
  tests/test-bookmarks-pushpull.t
  tests/test-bookmarks.t
  tests/test-branch-change.t
  tests/test-branch-option.t
  tests/test-bundle-r.t
  tests/test-bundle.t
  tests/test-clone.t
  tests/test-commandserver.t
  tests/test-commit.t
  tests/test-committer.t
  tests/test-convert-filemap.t
  tests/test-default-push.t
  tests/test-directaccess.t
  tests/test-dispatch.t
  tests/test-export.t
  tests/test-flagprocessor.t
  tests/test-globalopts.t
  tests/test-glog-beautifygraph.t
  tests/test-glog.t
  tests/test-grep.t
  tests/test-hook.t
  tests/test-http-bad-server.t
  tests/test-i18n.t
  tests/test-identify.t
  tests/test-infinitepush-ci.t
  tests/test-init.t
  tests/test-journal-exists.t
  tests/test-largefiles-misc.t
  tests/test-largefiles.t
  tests/test-legacy-exit-code.t
  tests/test-lfconvert.t
  tests/test-lfs-serve-access.t
  tests/test-lfs-serve.t
  tests/test-lfs-test-server.t
  tests/test-lfs.t
  tests/test-log.t
  tests/test-logexchange.t
  tests/test-manifest.t
  tests/test-mq-qdelete.t
  tests/test-mq-qrefresh.t
  tests/test-mq.t
  tests/test-narrow-clone.t
  tests/test-narrow-exchange.t
  tests/test-obshistory.t
  tests/test-obsolete-distributed.t
  tests/test-obsolete.t
  tests/test-patchbomb.t
  tests/test-pull-bundle.t
  tests/test-pull-r.t
  tests/test-pull.t
  tests/test-push.t
  tests/test-rebase-dest.t
  tests/test-remotefilelog-repack.t
  tests/test-repo-compengines.t
  tests/test-requires.t
  tests/test-revisions.t
  tests/test-revlog-v2.t
  tests/test-revlog.t
  tests/test-revset-legacy-lookup.t
  tests/test-revset-outgoing.t
  tests/test-revset.t
  tests/test-revset2.t
  tests/test-share.t
  tests/test-sparse-requirement.t
  tests/test-ssh-bundle1.t
  tests/test-ssh-proto.t
  tests/test-ssh-repoerror.t
  tests/test-ssh.t
  tests/test-static-http.t
  tests/test-strip.t
  tests/test-subrepo-recursion.t
  tests/test-subrepo.t
  tests/test-template-functions.t
  tests/test-treediscovery-legacy.t
  tests/test-update-branches.t
  tests/test-username-newline.t
  tests/test-wireproto-caching.t
  tests/test-wireproto-command-changesetdata.t
  tests/test-wireproto-command-filedata.t
  tests/test-wireproto-command-filesdata.t
  tests/test-wireproto-command-manifestdata.t
  tests/test-wireproto-command-rawstorefiledata.t

CHANGE DETAILS




To: martinvonz, durin42, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-wireproto-command-rawstorefiledata.t b/tests/test-wireproto-command-rawstorefiledata.t
--- a/tests/test-wireproto-command-rawstorefiledata.t
+++ b/tests/test-wireproto-command-rawstorefiledata.t
@@ -31,7 +31,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending rawstorefiledata command
-  abort: missing required arguments: files!
+  abort: missing required arguments: files
   [255]
 
 Unknown files value results in error
@@ -42,7 +42,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending rawstorefiledata command
-  abort: unknown file type: unknown!
+  abort: unknown file type: unknown
   [255]
 
 Requesting just changelog works
diff --git a/tests/test-wireproto-command-manifestdata.t b/tests/test-wireproto-command-manifestdata.t
--- a/tests/test-wireproto-command-manifestdata.t
+++ b/tests/test-wireproto-command-manifestdata.t
@@ -49,7 +49,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending manifestdata command
-  abort: missing required arguments: nodes, tree!
+  abort: missing required arguments: nodes, tree
   [255]
 
   $ sendhttpv2peer << EOF
@@ -58,7 +58,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending manifestdata command
-  abort: missing required arguments: tree!
+  abort: missing required arguments: tree
   [255]
 
 Unknown node is an error
@@ -70,7 +70,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending manifestdata command
-  abort: unknown node: \xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa! (esc)
+  abort: unknown node: \xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa (esc)
   [255]
 
 Fetching a single revision returns just metadata by default
diff --git a/tests/test-wireproto-command-filesdata.t b/tests/test-wireproto-command-filesdata.t
--- a/tests/test-wireproto-command-filesdata.t
+++ b/tests/test-wireproto-command-filesdata.t
@@ -71,7 +71,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending filesdata command
-  abort: missing required arguments: revisions!
+  abort: missing required arguments: revisions
   [255]
 
 Bad pattern to pathfilter is rejected
@@ -87,7 +87,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending filesdata command
-  abort: include pattern must begin with `path:` or `rootfilesin:`; got bad:foo!
+  abort: include pattern must begin with `path:` or `rootfilesin:`; got bad:foo
   [255]
 
   $ sendhttpv2peer << EOF
@@ -101,7 +101,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending filesdata command
-  abort: exclude pattern must begin with `path:` or `rootfilesin:`; got glob:foo!
+  abort: exclude pattern must begin with `path:` or `rootfilesin:`; got glob:foo
   [255]
 
 Fetching a single changeset without parents fetches all files
diff --git a/tests/test-wireproto-command-filedata.t b/tests/test-wireproto-command-filedata.t
--- a/tests/test-wireproto-command-filedata.t
+++ b/tests/test-wireproto-command-filedata.t
@@ -78,7 +78,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending filedata command
-  abort: missing required arguments: nodes, path!
+  abort: missing required arguments: nodes, path
   [255]
 
   $ sendhttpv2peer << EOF
@@ -87,7 +87,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending filedata command
-  abort: missing required arguments: path!
+  abort: missing required arguments: path
   [255]
 
 Unknown node is an error
@@ -99,7 +99,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending filedata command
-  abort: unknown file node: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
+  abort: unknown file node: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   [255]
 
 Fetching a single revision returns just metadata by default
diff --git a/tests/test-wireproto-command-changesetdata.t b/tests/test-wireproto-command-changesetdata.t
--- a/tests/test-wireproto-command-changesetdata.t
+++ b/tests/test-wireproto-command-changesetdata.t
@@ -44,7 +44,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending changesetdata command
-  abort: missing required arguments: revisions!
+  abort: missing required arguments: revisions
   [255]
 
 Missing nodes for changesetexplicit results in error
@@ -55,7 +55,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending changesetdata command
-  abort: nodes key not present in changesetexplicit revision specifier!
+  abort: nodes key not present in changesetexplicit revision specifier
   [255]
 
 changesetexplicitdepth requires nodes and depth keys
@@ -66,7 +66,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending changesetdata command
-  abort: nodes key not present in changesetexplicitdepth revision specifier!
+  abort: nodes key not present in changesetexplicitdepth revision specifier
   [255]
 
   $ sendhttpv2peer << EOF
@@ -75,7 +75,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending changesetdata command
-  abort: depth key not present in changesetexplicitdepth revision specifier!
+  abort: depth key not present in changesetexplicitdepth revision specifier
   [255]
 
   $ sendhttpv2peer << EOF
@@ -84,7 +84,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending changesetdata command
-  abort: nodes key not present in changesetexplicitdepth revision specifier!
+  abort: nodes key not present in changesetexplicitdepth revision specifier
   [255]
 
 changesetdagrange requires roots and heads keys
@@ -95,7 +95,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending changesetdata command
-  abort: roots key not present in changesetdagrange revision specifier!
+  abort: roots key not present in changesetdagrange revision specifier
   [255]
 
   $ sendhttpv2peer << EOF
@@ -104,7 +104,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending changesetdata command
-  abort: heads key not present in changesetdagrange revision specifier!
+  abort: heads key not present in changesetdagrange revision specifier
   [255]
 
   $ sendhttpv2peer << EOF
@@ -113,7 +113,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending changesetdata command
-  abort: roots key not present in changesetdagrange revision specifier!
+  abort: roots key not present in changesetdagrange revision specifier
   [255]
 
 Empty changesetdagrange heads results in an error
@@ -124,7 +124,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending changesetdata command
-  abort: heads key in changesetdagrange cannot be empty!
+  abort: heads key in changesetdagrange cannot be empty
   [255]
 
 Sending just dagrange heads sends all revisions
diff --git a/tests/test-wireproto-caching.t b/tests/test-wireproto-caching.t
--- a/tests/test-wireproto-caching.t
+++ b/tests/test-wireproto-caching.t
@@ -451,7 +451,7 @@ 
   > EOF
   creating http peer for wire protocol version 2
   sending manifestdata command
-  abort: unknown node: \xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa! (esc)
+  abort: unknown node: \xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa (esc)
   [255]
 
   $ cat .hg/blackbox.log
diff --git a/tests/test-username-newline.t b/tests/test-username-newline.t
--- a/tests/test-username-newline.t
+++ b/tests/test-username-newline.t
@@ -22,6 +22,6 @@ 
   adding a
   transaction abort!
   rollback completed
-  abort: username 'foo\nbar3' contains a newline!
+  abort: username 'foo\nbar3' contains a newline
   [255]
 
diff --git a/tests/test-update-branches.t b/tests/test-update-branches.t
--- a/tests/test-update-branches.t
+++ b/tests/test-update-branches.t
@@ -57,7 +57,7 @@ 
 
   $ cd ..
   $ hg update b1
-  abort: no repository found in '$TESTTMP' (.hg not found)!
+  abort: no repository found in '$TESTTMP' (.hg not found)
   [255]
   $ cd b1
 
diff --git a/tests/test-treediscovery-legacy.t b/tests/test-treediscovery-legacy.t
--- a/tests/test-treediscovery-legacy.t
+++ b/tests/test-treediscovery-legacy.t
@@ -122,7 +122,7 @@ 
   $ cd empty1
   $ hg incoming $remote --rev name1
   comparing with http://localhost:$HGPORT/
-  abort: cannot look up remote changes; remote repository does not support the 'changegroupsubset' capability!
+  abort: cannot look up remote changes; remote repository does not support the 'changegroupsubset' capability
   [255]
   $ hg incoming $remote
   comparing with http://localhost:$HGPORT/
@@ -311,7 +311,7 @@ 
   $ hg init partial; cd partial
   $ hg incoming $remote --rev name2
   comparing with http://localhost:$HGPORT/
-  abort: cannot look up remote changes; remote repository does not support the 'changegroupsubset' capability!
+  abort: cannot look up remote changes; remote repository does not support the 'changegroupsubset' capability
   [255]
   $ hg pull $remote --rev name2
   pulling from http://localhost:$HGPORT/
diff --git a/tests/test-template-functions.t b/tests/test-template-functions.t
--- a/tests/test-template-functions.t
+++ b/tests/test-template-functions.t
@@ -1294,10 +1294,10 @@ 
   $ hg log -T '{revset("%d", rev)}\n' -r'null'
   -1
   $ hg log -T '{revset("%d", rev + 1)}\n' -r'tip'
-  abort: unknown revision '3'!
+  abort: unknown revision '3'
   [255]
   $ hg log -T '{revset("%d", rev - 1)}\n' -r'null'
-  abort: unknown revision '-2'!
+  abort: unknown revision '-2'
   [255]
 
 Invalid arguments passed to revset()
diff --git a/tests/test-subrepo.t b/tests/test-subrepo.t
--- a/tests/test-subrepo.t
+++ b/tests/test-subrepo.t
@@ -1280,7 +1280,7 @@ 
   ../shared/subrepo-2/.hg/wcache/manifestfulltextcache (reporevlogstore !)
   ../shared/subrepo-2/file
   $ hg -R ../shared in
-  abort: repository default not found!
+  abort: repository default not found
   [255]
   $ hg -R ../shared/subrepo-2 showconfig paths
   paths.default=$TESTTMP/subrepo-status/subrepo-2
@@ -1964,7 +1964,7 @@ 
   $ hg clone malicious-proxycommand malicious-proxycommand-clone
   updating to branch default
   cloning subrepo s from ssh://fakehost%7Ctouch%24%7BIFS%7Downed/path
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
   $ [ ! -f owned ] || echo 'you got owned'
 
@@ -1978,7 +1978,7 @@ 
   $ hg clone malicious-proxycommand malicious-proxycommand-clone
   updating to branch default
   cloning subrepo s from ssh://fakehost%7Ctouch%20owned/path
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
   $ [ ! -f owned ] || echo 'you got owned'
 
diff --git a/tests/test-subrepo-recursion.t b/tests/test-subrepo-recursion.t
--- a/tests/test-subrepo-recursion.t
+++ b/tests/test-subrepo-recursion.t
@@ -575,7 +575,7 @@ 
   $ hg --config progress.disable=True clone ../empty2 ../empty_clone
   updating to branch default
   cloning subrepo foo from $TESTTMP/empty2/foo
-  abort: repository $TESTTMP/empty2/foo not found!
+  abort: repository $TESTTMP/empty2/foo not found
   [255]
 
 Disable progress extension and cleanup:
diff --git a/tests/test-strip.t b/tests/test-strip.t
--- a/tests/test-strip.t
+++ b/tests/test-strip.t
@@ -708,7 +708,7 @@ 
   saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob)
   bookmark 'todelete' deleted
   $ hg id -ir dcbb326fdec2
-  abort: unknown revision 'dcbb326fdec2'!
+  abort: unknown revision 'dcbb326fdec2'
   [255]
   $ hg id -ir d62d843c9a01
   d62d843c9a01
@@ -724,17 +724,17 @@ 
   bookmark 'multipledelete1' deleted
   bookmark 'multipledelete2' deleted
   $ hg id -ir e46a4836065c
-  abort: unknown revision 'e46a4836065c'!
+  abort: unknown revision 'e46a4836065c'
   [255]
   $ hg id -ir b4594d867745
-  abort: unknown revision 'b4594d867745'!
+  abort: unknown revision 'b4594d867745'
   [255]
   $ hg strip -B singlenode1 -B singlenode2
   saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/43227190fef8-8da858f2-backup.hg
   bookmark 'singlenode1' deleted
   bookmark 'singlenode2' deleted
   $ hg id -ir 43227190fef8
-  abort: unknown revision '43227190fef8'!
+  abort: unknown revision '43227190fef8'
   [255]
   $ hg strip -B unknownbookmark
   abort: bookmark 'unknownbookmark' not found
@@ -749,7 +749,7 @@ 
   saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob)
   bookmark 'delete' deleted
   $ hg id -ir 6:2702dd0c91e7
-  abort: unknown revision '2702dd0c91e7'!
+  abort: unknown revision '2702dd0c91e7'
   [255]
   $ hg update B
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
diff --git a/tests/test-static-http.t b/tests/test-static-http.t
--- a/tests/test-static-http.t
+++ b/tests/test-static-http.t
@@ -94,7 +94,7 @@ 
 
   $ cd ..
   $ hg clone -r doesnotexist static-http://localhost:$HGPORT/remote local0
-  abort: unknown revision 'doesnotexist'!
+  abort: unknown revision 'doesnotexist'
   [255]
   $ hg clone -r 0 static-http://localhost:$HGPORT/remote local0
   adding changesets
@@ -169,7 +169,7 @@ 
   $ cd ..
   $ mkdir notarepo
   $ hg clone static-http://localhost:$HGPORT/notarepo local3
-  abort: 'http://localhost:$HGPORT/notarepo' does not appear to be an hg repository!
+  abort: 'http://localhost:$HGPORT/notarepo' does not appear to be an hg repository
   [255]
 
 Clone with tags and branches works
diff --git a/tests/test-ssh.t b/tests/test-ssh.t
--- a/tests/test-ssh.t
+++ b/tests/test-ssh.t
@@ -43,19 +43,19 @@ 
 repo not found error
 
   $ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/nonexistent local
-  remote: abort: repository nonexistent not found!
-  abort: no suitable response from remote hg!
+  remote: abort: repository nonexistent not found
+  abort: no suitable response from remote hg
   [255]
   $ hg clone -q -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/nonexistent local
-  remote: abort: repository nonexistent not found!
-  abort: no suitable response from remote hg!
+  remote: abort: repository nonexistent not found
+  abort: no suitable response from remote hg
   [255]
 
 non-existent absolute path
 
   $ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/`pwd`/nonexistent local
-  remote: abort: repository $TESTTMP/nonexistent not found!
-  abort: no suitable response from remote hg!
+  remote: abort: repository $TESTTMP/nonexistent not found
+  abort: no suitable response from remote hg
   [255]
 
 clone remote via stream
@@ -135,8 +135,8 @@ 
 
   $ hg pull -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/doesnotexist
   pulling from ssh://user@dummy/doesnotexist
-  remote: abort: repository doesnotexist not found!
-  abort: no suitable response from remote hg!
+  remote: abort: repository doesnotexist not found
+  abort: no suitable response from remote hg
   [255]
 
 local change
@@ -360,7 +360,7 @@ 
 
   $ hg push ssh://user:erroneouspwd@dummy/remote
   pushing to ssh://user:*@dummy/remote (glob)
-  abort: password in URL not supported!
+  abort: password in URL not supported
   [255]
 
   $ cd $TESTTMP
@@ -379,7 +379,7 @@ 
   73649e48688a
 
   $ hg id --ssh "\"$PYTHON\" \"$TESTDIR/dummyssh\"" "ssh://user@dummy/a repo#noNoNO"
-  abort: unknown revision 'noNoNO'!
+  abort: unknown revision 'noNoNO'
   [255]
 
 Test (non-)escaping of remote paths with spaces when cloning (issue3145):
@@ -420,12 +420,12 @@ 
 
   $ hg id --ssh "sh ssh.sh" "ssh://user@dummy/a'repo"
   remote: Illegal repository "$TESTTMP/a'repo"
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
   $ hg id --ssh "sh ssh.sh" --remotecmd hacking "ssh://user@dummy/a'repo"
   remote: Illegal command "hacking -R 'a'\''repo' serve --stdio"
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
   $ SSH_ORIGINAL_COMMAND="'hg' -R 'a'repo' serve --stdio" "$PYTHON" "$TESTDIR/../contrib/hg-ssh"
@@ -675,7 +675,7 @@ 
 
   $ hg pull ssh://brokenrepository -e "\"$PYTHON\" \"$TESTDIR/dummyssh\""
   pulling from ssh://brokenrepository/
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
 abort with configured error hint when there is a ssh problem when pulling
@@ -683,7 +683,7 @@ 
   $ hg pull ssh://brokenrepository -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" \
   > --config ui.ssherrorhint="Please see http://company/internalwiki/ssh.html"
   pulling from ssh://brokenrepository/
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   (Please see http://company/internalwiki/ssh.html)
   [255]
 
@@ -696,11 +696,11 @@ 
   $ hg pull ssh://something --config ui.ssh="sh dumpenv"
   pulling from ssh://something/
   remote: 
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
   $ hg pull ssh://something --config ui.ssh="sh dumpenv" --config sshenv.VAR=17
   pulling from ssh://something/
   remote: 17
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
diff --git a/tests/test-ssh-repoerror.t b/tests/test-ssh-repoerror.t
--- a/tests/test-ssh-repoerror.t
+++ b/tests/test-ssh-repoerror.t
@@ -17,7 +17,7 @@ 
 
   $ hg id ssh://user@dummy/no-read
   remote: abort: Permission denied: *$TESTTMP/no-read/.hg* (glob)
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
 special case files are visible, but unreadable
@@ -35,7 +35,7 @@ 
 
   $ hg id ssh://user@dummy/other
   remote: abort: Permission denied: '$TESTTMP/other/.hg/requires'
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
 directory toward the repository is read only
@@ -51,7 +51,7 @@ 
 
   $ hg id ssh://user@dummy/deep/nested
   remote: abort: Permission denied: *$TESTTMP/deep/nested/.hg* (glob)
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
 repository has wrong requirement
@@ -62,7 +62,7 @@ 
   000000000000
   $ echo flying-car >> repo-future/.hg/requires
   $ hg id ssh://user@dummy/repo-future
-  remote: abort: repository requires features unknown to this Mercurial: flying-car!
+  remote: abort: repository requires features unknown to this Mercurial: flying-car
   remote: (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
diff --git a/tests/test-ssh-proto.t b/tests/test-ssh-proto.t
--- a/tests/test-ssh-proto.t
+++ b/tests/test-ssh-proto.t
@@ -270,7 +270,7 @@ 
   sending between command
   remote: 0
   remote: 1
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
 Sending an unknown command to the server results in an empty response to that command
diff --git a/tests/test-ssh-bundle1.t b/tests/test-ssh-bundle1.t
--- a/tests/test-ssh-bundle1.t
+++ b/tests/test-ssh-bundle1.t
@@ -53,16 +53,16 @@ 
 repo not found error
 
   $ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/nonexistent local
-  remote: abort: repository nonexistent not found!
-  abort: no suitable response from remote hg!
+  remote: abort: repository nonexistent not found
+  abort: no suitable response from remote hg
   [255]
 
 non-existent absolute path
 
 #if no-msys
   $ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy//`pwd`/nonexistent local
-  remote: abort: repository /$TESTTMP/nonexistent not found!
-  abort: no suitable response from remote hg!
+  remote: abort: repository /$TESTTMP/nonexistent not found
+  abort: no suitable response from remote hg
   [255]
 #endif
 
@@ -147,8 +147,8 @@ 
 
   $ hg pull -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/doesnotexist
   pulling from ssh://user@dummy/doesnotexist
-  remote: abort: repository doesnotexist not found!
-  abort: no suitable response from remote hg!
+  remote: abort: repository doesnotexist not found
+  abort: no suitable response from remote hg
   [255]
 
 local change
@@ -340,7 +340,7 @@ 
 
   $ hg push ssh://user:erroneouspwd@dummy/remote
   pushing to ssh://user:*@dummy/remote (glob)
-  abort: password in URL not supported!
+  abort: password in URL not supported
   [255]
 
   $ cd $TESTTMP
@@ -359,7 +359,7 @@ 
   73649e48688a
 
   $ hg id --ssh "\"$PYTHON\" \"$TESTDIR/dummyssh\"" "ssh://user@dummy/a repo#noNoNO"
-  abort: unknown revision 'noNoNO'!
+  abort: unknown revision 'noNoNO'
   [255]
 
 Test (non-)escaping of remote paths with spaces when cloning (issue3145):
@@ -387,12 +387,12 @@ 
 
   $ hg id --ssh "sh ssh.sh" "ssh://user@dummy/a'repo"
   remote: Illegal repository "$TESTTMP/a'repo"
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
   $ hg id --ssh "sh ssh.sh" --remotecmd hacking "ssh://user@dummy/a'repo"
   remote: Illegal command "hacking -R 'a'\''repo' serve --stdio"
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
   $ SSH_ORIGINAL_COMMAND="'hg' serve -R 'a'repo' --stdio" "$PYTHON" "$TESTDIR/../contrib/hg-ssh"
diff --git a/tests/test-sparse-requirement.t b/tests/test-sparse-requirement.t
--- a/tests/test-sparse-requirement.t
+++ b/tests/test-sparse-requirement.t
@@ -46,7 +46,7 @@ 
 Client without sparse enabled reacts properly
 
   $ hg files
-  abort: repository is using sparse feature but sparse is not enabled; enable the "sparse" extensions to access!
+  abort: repository is using sparse feature but sparse is not enabled; enable the "sparse" extensions to access
   [255]
 
 Requirement for sparse is removed when sparse is disabled
diff --git a/tests/test-share.t b/tests/test-share.t
--- a/tests/test-share.t
+++ b/tests/test-share.t
@@ -211,7 +211,7 @@ 
   $TESTTMP/thisdir/rel
   $ mv thisdir thatdir
   $ hg -R thatdir/abs root
-  abort: .hg/sharedpath points to nonexistent directory $TESTTMP/thisdir/orig/.hg!
+  abort: .hg/sharedpath points to nonexistent directory $TESTTMP/thisdir/orig/.hg
   [255]
   $ hg -R thatdir/rel root
   $TESTTMP/thatdir/rel
@@ -247,7 +247,7 @@ 
 We cannot open the repo with the unknown requirement
 
   $ hg -R sharenewrequires status
-  abort: repository requires features unknown to this Mercurial: missing-requirement!
+  abort: repository requires features unknown to this Mercurial: missing-requirement
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 
diff --git a/tests/test-revset2.t b/tests/test-revset2.t
--- a/tests/test-revset2.t
+++ b/tests/test-revset2.t
@@ -319,7 +319,7 @@ 
 test unknown revision in `_list`
 
   $ log '0|unknown'
-  abort: unknown revision 'unknown'!
+  abort: unknown revision 'unknown'
   [255]
 
 test integer range in `_list`
@@ -329,11 +329,11 @@ 
   0
 
   $ log '-10|-11'
-  abort: unknown revision '-11'!
+  abort: unknown revision '-11'
   [255]
 
   $ log '9|10'
-  abort: unknown revision '10'!
+  abort: unknown revision '10'
   [255]
 
 test '0000' != '0' in `_list`
@@ -589,7 +589,7 @@ 
 we can use patterns when searching for tags
 
   $ log 'tag("1..*")'
-  abort: tag '1..*' does not exist!
+  abort: tag '1..*' does not exist
   [255]
   $ log 'tag("re:1..*")'
   6
@@ -600,16 +600,16 @@ 
   $ log 'tag("re:0..*")'
 
   $ log 'tag(unknown)'
-  abort: tag 'unknown' does not exist!
+  abort: tag 'unknown' does not exist
   [255]
   $ log 'tag("re:unknown")'
   $ log 'present(tag("unknown"))'
   $ log 'present(tag("re:unknown"))'
   $ log 'branch(unknown)'
-  abort: unknown revision 'unknown'!
+  abort: unknown revision 'unknown'
   [255]
   $ log 'branch("literal:unknown")'
-  abort: branch 'unknown' does not exist!
+  abort: branch 'unknown' does not exist
   [255]
   $ log 'branch("re:unknown")'
   $ log 'present(branch("unknown"))'
@@ -665,7 +665,7 @@ 
   1
 
   $ log 'named("unknown")'
-  abort: namespace 'unknown' does not exist!
+  abort: namespace 'unknown' does not exist
   [255]
   $ log 'named("re:unknown")'
   $ log 'present(named("unknown"))'
@@ -758,7 +758,7 @@ 
   [10]
 
   $ log 'branchpoint()~-1'
-  abort: revision in set has more than one child!
+  abort: revision in set has more than one child
   [255]
 
 Bogus function gets suggestions
@@ -869,7 +869,7 @@ 
   $ export HGPLAIN
   $ try m
   (symbol 'm')
-  abort: unknown revision 'm'!
+  abort: unknown revision 'm'
   [255]
 
   $ HGPLAINEXCEPT=revsetalias
@@ -1060,7 +1060,7 @@ 
     (func
       (symbol 'max')
       (string '$1')))
-  abort: unknown revision '$1'!
+  abort: unknown revision '$1'
   [255]
 
 test scope of alias expansion: 'universe' is expanded prior to 'shadowall(0)',
diff --git a/tests/test-revset.t b/tests/test-revset.t
--- a/tests/test-revset.t
+++ b/tests/test-revset.t
@@ -305,7 +305,7 @@ 
       (symbol 'c'))
     (negate
       (symbol 'a')))
-  abort: unknown revision '-a'!
+  abort: unknown revision '-a'
   [255]
   $ try é
   (symbol '\xc3\xa9')
@@ -406,7 +406,7 @@ 
   hg: parse error: date requires a string
   [10]
   $ log 'date'
-  abort: unknown revision 'date'!
+  abort: unknown revision 'date'
   [255]
   $ log 'date('
   hg: parse error at 5: not a prefix: end
@@ -420,10 +420,10 @@ 
   hg: parse error: invalid date: 'tip'
   [10]
   $ log '0:date'
-  abort: unknown revision 'date'!
+  abort: unknown revision 'date'
   [255]
   $ log '::"date"'
-  abort: unknown revision 'date'!
+  abort: unknown revision 'date'
   [255]
   $ hg book date -r 4
   $ log '0:date'
@@ -1873,7 +1873,7 @@ 
   3
   $ hg log --template '{rev}\n' -r 'id(x)'
   $ hg log --template '{rev}\n' -r 'x'
-  abort: 00changelog.i@: ambiguous identifier!
+  abort: 00changelog.i@: ambiguous identifier
   [255]
   $ log 'id(23268)'
   4
@@ -2040,13 +2040,13 @@ 
   obsoleted 1 changesets
 
   $ hg debugrevspec 'fff'
-  abort: 00changelog.i@fff: ambiguous identifier!
+  abort: 00changelog.i@fff: ambiguous identifier
   [255]
   $ hg debugrevspec 'ffff'
-  abort: 00changelog.i@ffff: ambiguous identifier!
+  abort: 00changelog.i@ffff: ambiguous identifier
   [255]
   $ hg debugrevspec 'fffb'
-  abort: 00changelog.i@fffb: ambiguous identifier!
+  abort: 00changelog.i@fffb: ambiguous identifier
   [255]
 BROKEN should be '2' (node lookup uses unfiltered repo)
   $ hg debugrevspec 'id(fffb)'
@@ -3066,7 +3066,7 @@ 
   1
   0
   $ log 'expectsize(0:1, 1)'
-  abort: revset size mismatch. expected 1, got 2!
+  abort: revset size mismatch. expected 1, got 2
   [255]
   $ log 'expectsize(0:4, -1)'
   hg: parse error: negative size
@@ -3076,7 +3076,7 @@ 
   1
   2
   $ log 'expectsize(0:1, 3:5)'
-  abort: revset size mismatch. expected between 3 and 5, got 2!
+  abort: revset size mismatch. expected between 3 and 5, got 2
   [255]
   $ log 'expectsize(0:1, -1:2)'
   hg: parse error: negative size
@@ -3103,8 +3103,8 @@ 
   1
   2
   $ log 'expectsize(0:2, 4:)'
-  abort: revset size mismatch. expected between 4 and 11, got 3!
+  abort: revset size mismatch. expected between 4 and 11, got 3
   [255]
   $ log 'expectsize(0:2, :2)'
-  abort: revset size mismatch. expected between 0 and 2, got 3!
+  abort: revset size mismatch. expected between 0 and 2, got 3
   [255]
diff --git a/tests/test-revset-outgoing.t b/tests/test-revset-outgoing.t
--- a/tests/test-revset-outgoing.t
+++ b/tests/test-revset-outgoing.t
@@ -105,11 +105,11 @@ 
   green = ../a#default
 
   $ hg tout green
-  abort: repository green does not exist!
+  abort: repository green does not exist
   [255]
 
   $ hg tlog -r 'outgoing("green")'
-  abort: repository green does not exist!
+  abort: repository green does not exist
   [255]
 
   $ cd ..
diff --git a/tests/test-revset-legacy-lookup.t b/tests/test-revset-legacy-lookup.t
--- a/tests/test-revset-legacy-lookup.t
+++ b/tests/test-revset-legacy-lookup.t
@@ -95,10 +95,10 @@ 
   $ hg log -r '"foo"'
   2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
   $ hg log -r '("foo")'
-  abort: unknown revision 'foo'!
+  abort: unknown revision 'foo'
   [255]
   $ hg log -r 'revset("foo")'
-  abort: unknown revision 'foo'!
+  abort: unknown revision 'foo'
   [255]
   $ hg log -r '("\"foo\"")'
   2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
@@ -125,10 +125,10 @@ 
   $ hg log -r 'foo+bar'
   4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
   $ hg log -r '(foo+bar)'
-  abort: unknown revision 'foo'!
+  abort: unknown revision 'foo'
   [255]
   $ hg log -r 'revset(foo+bar)'
-  abort: unknown revision 'foo'!
+  abort: unknown revision 'foo'
   [255]
   $ hg log -r '"foo+bar"'
   4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
diff --git a/tests/test-revlog.t b/tests/test-revlog.t
--- a/tests/test-revlog.t
+++ b/tests/test-revlog.t
@@ -7,7 +7,7 @@ 
   ...     fh.write(b'\x00\x01\x00\x00') and None
 
   $ hg log
-  abort: unknown flags (0x01) in version 0 revlog 00changelog.i!
+  abort: unknown flags (0x01) in version 0 revlog 00changelog.i
   [255]
 
 Unknown flags on revlog version 1 are rejected
@@ -16,7 +16,7 @@ 
   ...     fh.write(b'\x00\x04\x00\x01') and None
 
   $ hg log
-  abort: unknown flags (0x04) in version 1 revlog 00changelog.i!
+  abort: unknown flags (0x04) in version 1 revlog 00changelog.i
   [255]
 
 Unknown version is rejected
@@ -25,7 +25,7 @@ 
   ...     fh.write(b'\x00\x00\x00\x02') and None
 
   $ hg log
-  abort: unknown version (2) in revlog 00changelog.i!
+  abort: unknown version (2) in revlog 00changelog.i
   [255]
 
   $ cd ..
diff --git a/tests/test-revlog-v2.t b/tests/test-revlog-v2.t
--- a/tests/test-revlog-v2.t
+++ b/tests/test-revlog-v2.t
@@ -6,7 +6,7 @@ 
   $ cd invalidreq
   $ echo exp-revlogv2.unknown >> .hg/requires
   $ hg log
-  abort: repository requires features unknown to this Mercurial: exp-revlogv2.unknown!
+  abort: repository requires features unknown to this Mercurial: exp-revlogv2.unknown
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
   $ cd ..
@@ -35,7 +35,7 @@ 
   ...     fh.write(b'\xff\x00\xde\xad') and None
 
   $ hg log
-  abort: unknown flags (0xff00) in version 57005 revlog 00changelog.i!
+  abort: unknown flags (0xff00) in version 57005 revlog 00changelog.i
   [255]
 
   $ cd ..
diff --git a/tests/test-revisions.t b/tests/test-revisions.t
--- a/tests/test-revisions.t
+++ b/tests/test-revisions.t
@@ -36,7 +36,7 @@ 
   1:9
 7 was ambiguous and still is
   $ hg l -r 7
-  abort: 00changelog.i@7: ambiguous identifier!
+  abort: 00changelog.i@7: ambiguous identifier
   [255]
 7b is no longer ambiguous
   $ hg l -r 7b
diff --git a/tests/test-requires.t b/tests/test-requires.t
--- a/tests/test-requires.t
+++ b/tests/test-requires.t
@@ -5,16 +5,16 @@ 
   $ hg commit -m test
   $ rm .hg/requires
   $ hg tip
-  abort: unknown version (2) in revlog 00changelog.i!
+  abort: unknown version (2) in revlog 00changelog.i
   [255]
   $ echo indoor-pool > .hg/requires
   $ hg tip
-  abort: repository requires features unknown to this Mercurial: indoor-pool!
+  abort: repository requires features unknown to this Mercurial: indoor-pool
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
   $ echo outdoor-pool >> .hg/requires
   $ hg tip
-  abort: repository requires features unknown to this Mercurial: indoor-pool outdoor-pool!
+  abort: repository requires features unknown to this Mercurial: indoor-pool outdoor-pool
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
   $ cd ..
@@ -71,7 +71,7 @@ 
   [255]
 
   $ hg clone supported clone-dst
-  abort: repository requires features unknown to this Mercurial: featuresetup-test!
+  abort: repository requires features unknown to this Mercurial: featuresetup-test
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
   $ hg clone --pull supported clone-dst
diff --git a/tests/test-repo-compengines.t b/tests/test-repo-compengines.t
--- a/tests/test-repo-compengines.t
+++ b/tests/test-repo-compengines.t
@@ -37,7 +37,7 @@ 
   $ cd unknownrequirement
   $ echo exp-compression-unknown >> .hg/requires
   $ hg log
-  abort: repository requires features unknown to this Mercurial: exp-compression-unknown!
+  abort: repository requires features unknown to this Mercurial: exp-compression-unknown
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 
diff --git a/tests/test-remotefilelog-repack.t b/tests/test-remotefilelog-repack.t
--- a/tests/test-remotefilelog-repack.t
+++ b/tests/test-remotefilelog-repack.t
@@ -306,7 +306,7 @@ 
   $ hg prefetch -r 2
   1 files fetched over 1 fetches - (1 misses, 0.00% hit ratio) over * (glob)
   $ hg prefetch -r 38
-  abort: unknown revision '38'!
+  abort: unknown revision '38'
   [255]
   $ ls_l $TESTTMP/hgcache/master/packs/ | grep datapack
   -r--r--r--      70 052643fdcdebbd42d7c180a651a30d46098e6fe1.datapack
diff --git a/tests/test-rebase-dest.t b/tests/test-rebase-dest.t
--- a/tests/test-rebase-dest.t
+++ b/tests/test-rebase-dest.t
@@ -161,7 +161,7 @@ 
   > | |
   > A D
   > EOS
-  abort: unknown revision 'SRC'!
+  abort: unknown revision 'SRC'
   [255]
 
 Rebase to null should work:
diff --git a/tests/test-push.t b/tests/test-push.t
--- a/tests/test-push.t
+++ b/tests/test-push.t
@@ -340,11 +340,11 @@ 
   [255]
   $ hg -R test-revflag push 'ssh://fakehost|touch${IFS}owned/path'
   pushing to ssh://fakehost%7Ctouch%24%7BIFS%7Downed/path
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
   $ hg -R test-revflag push 'ssh://fakehost%7Ctouch%20owned/path'
   pushing to ssh://fakehost%7Ctouch%20owned/path
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
   $ [ ! -f owned ] || echo 'you got owned'
diff --git a/tests/test-pull.t b/tests/test-pull.t
--- a/tests/test-pull.t
+++ b/tests/test-pull.t
@@ -68,17 +68,17 @@ 
 
   $ hg pull -r 'xxxxxxxxxxxxxxxxxxxy'
   pulling from http://foo@localhost:$HGPORT/
-  abort: unknown revision 'xxxxxxxxxxxxxxxxxxxy'!
+  abort: unknown revision 'xxxxxxxxxxxxxxxxxxxy'
   [255]
   $ hg pull -r 'xxxxxxxxxxxxxxxxxx y'
   pulling from http://foo@localhost:$HGPORT/
-  abort: unknown revision 'xxxxxxxxxxxxxxxxxx y'!
+  abort: unknown revision 'xxxxxxxxxxxxxxxxxx y'
   [255]
 
 Test pull of working copy revision
   $ hg pull -r 'ffffffffffff'
   pulling from http://foo@localhost:$HGPORT/
-  abort: unknown revision 'ffffffffffff'!
+  abort: unknown revision 'ffffffffffff'
   [255]
 
 Issue622: hg init && hg pull -u URL doesn't checkout default branch
@@ -140,11 +140,11 @@ 
   [255]
   $ hg pull 'ssh://fakehost|touch${IFS}owned/path'
   pulling from ssh://fakehost%7Ctouch%24%7BIFS%7Downed/path
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
   $ hg --config ui.timestamp-output=true pull 'ssh://fakehost%7Ctouch%20owned/path'
   \[20[2-9][0-9]-[01][0-9]-[0-3][0-9]T[0-5][0-9]:[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9][0-9][0-9][0-9]\] pulling from ssh://fakehost%7Ctouch%20owned/path (re)
-  \[20[2-9][0-9]-[01][0-9]-[0-3][0-9]T[0-5][0-9]:[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9][0-9][0-9][0-9]\] abort: no suitable response from remote hg! (re)
+  \[20[2-9][0-9]-[01][0-9]-[0-3][0-9]T[0-5][0-9]:[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9][0-9][0-9][0-9]\] abort: no suitable response from remote hg (re)
   [255]
 
   $ [ ! -f owned ] || echo 'you got owned'
diff --git a/tests/test-pull-r.t b/tests/test-pull-r.t
--- a/tests/test-pull-r.t
+++ b/tests/test-pull-r.t
@@ -111,7 +111,7 @@ 
 Pull a missing revision:
 
   $ hg pull -qr missing ../repo
-  abort: unknown revision 'missing'!
+  abort: unknown revision 'missing'
   [255]
 
 Pull multiple revisions with update:
diff --git a/tests/test-pull-bundle.t b/tests/test-pull-bundle.t
--- a/tests/test-pull-bundle.t
+++ b/tests/test-pull-bundle.t
@@ -180,7 +180,7 @@ 
   adding manifests
   adding file changes
   added 0 changesets with 0 changes to 1 files
-  abort: 00changelog.i@ed1b79f46b9a: no node!
+  abort: 00changelog.i@ed1b79f46b9a: no node
   [255]
   $ cd ..
   $ killdaemons.py
diff --git a/tests/test-patchbomb.t b/tests/test-patchbomb.t
--- a/tests/test-patchbomb.t
+++ b/tests/test-patchbomb.t
@@ -3100,7 +3100,7 @@ 
   $ echo 'publicurl=$TESTTMP/missing' >> $HGRCPATH
   $ hg email --date '1980-1-1 0:1' -t foo -s test -r '10'
   unable to access public repo: $TESTTMP/missing
-  abort: repository $TESTTMP/missing not found!
+  abort: repository $TESTTMP/missing not found
   [255]
 
 node missing at public
diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t
--- a/tests/test-obsolete.t
+++ b/tests/test-obsolete.t
@@ -200,10 +200,10 @@ 
   $ hg tip
   5:5601fb93a350 (draft) [tip ] add new_3_c
   $ hg log -r 6
-  abort: unknown revision '6'!
+  abort: unknown revision '6'
   [255]
   $ hg log -r 4
-  abort: hidden revision '4' was rewritten as: 5601fb93a350!
+  abort: hidden revision '4' was rewritten as: 5601fb93a350
   (use --hidden to access hidden revisions)
   [255]
   $ hg debugrevspec 'rev(6)'
@@ -1541,7 +1541,7 @@ 
   4:13bedc178fce (draft *obsolete*) [ bookb] add b [rewritten using amend as 5:a9b1f8652753]
   $ hg book -d bookb
   $ hg log -r 13bedc178fce
-  abort: hidden revision '13bedc178fce' was rewritten as: a9b1f8652753!
+  abort: hidden revision '13bedc178fce' was rewritten as: a9b1f8652753
   (use --hidden to access hidden revisions)
   [255]
 
diff --git a/tests/test-obsolete-distributed.t b/tests/test-obsolete-distributed.t
--- a/tests/test-obsolete-distributed.t
+++ b/tests/test-obsolete-distributed.t
@@ -544,7 +544,7 @@ 
   adding file changes
   added 2 changesets with 0 changes to 2 files (+1 heads)
   (2 other changesets obsolete on arrival)
-  abort: cannot update to target: filtered revision '6'!
+  abort: cannot update to target: filtered revision '6'
   [255]
 
   $ cd ..
diff --git a/tests/test-obshistory.t b/tests/test-obshistory.t
--- a/tests/test-obshistory.t
+++ b/tests/test-obshistory.t
@@ -51,7 +51,7 @@ 
 Actual test
 -----------
   $ hg update 471f378eab4c
-  abort: hidden revision '471f378eab4c' was rewritten as: 4ae3a4151de9!
+  abort: hidden revision '471f378eab4c' was rewritten as: 4ae3a4151de9
   (use --hidden to access hidden revisions)
   [255]
   $ hg update --hidden "desc(A0)"
@@ -115,7 +115,7 @@ 
   $ hg up 1
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg up 0dec01379d3b
-  abort: hidden revision '0dec01379d3b' is pruned!
+  abort: hidden revision '0dec01379d3b' is pruned
   (use --hidden to access hidden revisions)
   [255]
   $ hg up --hidden -r 'desc(B0)'
@@ -193,7 +193,7 @@ 
 Actual test
 -----------
   $ hg update 471597cad322
-  abort: hidden revision '471597cad322' was split as: 337fec4d2edc, f257fde29c7a!
+  abort: hidden revision '471597cad322' was split as: 337fec4d2edc, f257fde29c7a
   (use --hidden to access hidden revisions)
   [255]
   $ hg update --hidden 'min(desc(A0))'
@@ -293,7 +293,7 @@ 
 Actual test
 -----------
   $ hg update de7290d8b885
-  abort: hidden revision 'de7290d8b885' was split as: 337fec4d2edc, f257fde29c7a and 2 more!
+  abort: hidden revision 'de7290d8b885' was split as: 337fec4d2edc, f257fde29c7a and 2 more
   (use --hidden to access hidden revisions)
   [255]
   $ hg update --hidden 'min(desc(A0))'
@@ -374,7 +374,7 @@ 
  Actual test
  -----------
   $ hg update 471f378eab4c
-  abort: hidden revision '471f378eab4c' was rewritten as: eb5a0daa2192!
+  abort: hidden revision '471f378eab4c' was rewritten as: eb5a0daa2192
   (use --hidden to access hidden revisions)
   [255]
   $ hg update --hidden 'desc(A0)'
@@ -382,7 +382,7 @@ 
   updated to hidden changeset 471f378eab4c
   (hidden revision '471f378eab4c' was rewritten as: eb5a0daa2192)
   $ hg update 0dec01379d3b
-  abort: hidden revision '0dec01379d3b' was rewritten as: eb5a0daa2192!
+  abort: hidden revision '0dec01379d3b' was rewritten as: eb5a0daa2192
   (use --hidden to access hidden revisions)
   [255]
   $ hg update --hidden 'desc(B0)'
@@ -457,7 +457,7 @@ 
 Actual test
 -----------
   $ hg update 471f378eab4c
-  abort: hidden revision '471f378eab4c' has diverged!
+  abort: hidden revision '471f378eab4c' has diverged
   (use --hidden to access hidden revisions)
   [255]
   $ hg update --hidden 'desc(A0)'
@@ -554,7 +554,7 @@ 
  Actual test
  -----------
   $ hg update 471f378eab4c
-  abort: hidden revision '471f378eab4c' was rewritten as: eb5a0daa2192!
+  abort: hidden revision '471f378eab4c' was rewritten as: eb5a0daa2192
   (use --hidden to access hidden revisions)
   [255]
   $ hg update --hidden 'desc(A0)'
diff --git a/tests/test-narrow-exchange.t b/tests/test-narrow-exchange.t
--- a/tests/test-narrow-exchange.t
+++ b/tests/test-narrow-exchange.t
@@ -105,7 +105,7 @@ 
   remote: adding file changes
   remote: transaction abort!
   remote: rollback completed
-  remote: abort: data/inside2/f.i@4a1aa07735e6: unknown parent! (reporevlogstore !)
+  remote: abort: data/inside2/f.i@4a1aa07735e6: unknown parent
   remote: abort: data/inside2/f/index@4a1aa07735e6: no node! (reposimplestore !)
   abort: stream ended unexpectedly (got 0 bytes, expected 4)
   [255]
@@ -221,5 +221,5 @@ 
   remote: error: pretxnchangegroup.lfs hook raised an exception: data/inside2/f.i@f59b4e021835: no match found (lfs-on !)
   remote: transaction abort! (lfs-on !)
   remote: rollback completed (lfs-on !)
-  remote: abort: data/inside2/f.i@f59b4e021835: no match found! (lfs-on !)
+  remote: abort: data/inside2/f.i@f59b4e021835: no match found (lfs-on !)
   abort: stream ended unexpectedly (got 0 bytes, expected 4) (lfs-on !)
diff --git a/tests/test-narrow-clone.t b/tests/test-narrow-clone.t
--- a/tests/test-narrow-clone.t
+++ b/tests/test-narrow-clone.t
@@ -69,7 +69,7 @@ 
   abort: server does not support narrow clones
   [255]
   $ hg tracked -R narrow-via-localpeer
-  abort: repository narrow-via-localpeer not found!
+  abort: repository narrow-via-localpeer not found
   [255]
   $ rm -Rf narrow-via-localpeer
 
diff --git a/tests/test-mq.t b/tests/test-mq.t
--- a/tests/test-mq.t
+++ b/tests/test-mq.t
@@ -171,7 +171,7 @@ 
   guards
   $ cat .hg/patches/series
   $ hg qinit -c
-  abort: repository $TESTTMP/d/.hg/patches already exists!
+  abort: repository $TESTTMP/d/.hg/patches already exists
   [255]
   $ cd ..
 
@@ -253,7 +253,7 @@ 
 init --mq with nonexistent directory
 
   $ hg init --mq nonexistentdir
-  abort: repository nonexistentdir not found!
+  abort: repository nonexistentdir not found
   [255]
 
 
diff --git a/tests/test-mq-qrefresh.t b/tests/test-mq-qrefresh.t
--- a/tests/test-mq-qrefresh.t
+++ b/tests/test-mq-qrefresh.t
@@ -504,7 +504,7 @@ 
   transaction abort!
   rollback completed
   qrefresh interrupted while patch was popped! (revert --all, qpush to recover)
-  abort: username 'foo\nbar' contains a newline!
+  abort: username 'foo\nbar' contains a newline
   [255]
   $ rm a
   $ cat .hg/patches/a
@@ -520,7 +520,7 @@ 
   transaction abort!
   rollback completed
   qrefresh interrupted while patch was popped! (revert --all, qpush to recover)
-  abort: empty username!
+  abort: empty username
   [255]
   $ cat .hg/patches/a
   # HG changeset patch
diff --git a/tests/test-mq-qdelete.t b/tests/test-mq-qdelete.t
--- a/tests/test-mq-qdelete.t
+++ b/tests/test-mq-qdelete.t
@@ -114,7 +114,7 @@ 
   now at: pb
 
   $ hg qfinish -a pc
-  abort: unknown revision 'pc'!
+  abort: unknown revision 'pc'
   [255]
 
   $ hg qpush
diff --git a/tests/test-manifest.t b/tests/test-manifest.t
--- a/tests/test-manifest.t
+++ b/tests/test-manifest.t
@@ -87,7 +87,7 @@ 
 The next two calls are expected to abort:
 
   $ hg manifest -r 2
-  abort: unknown revision '2'!
+  abort: unknown revision '2'
   [255]
 
   $ hg manifest -r tip tip
diff --git a/tests/test-logexchange.t b/tests/test-logexchange.t
--- a/tests/test-logexchange.t
+++ b/tests/test-logexchange.t
@@ -481,15 +481,15 @@ 
 Testing for a literal name which does not exists, which should fail.
 
   $ hg log -r 'remotebranches(def)' -GT "{rev}:{node|short} {remotenames}\n"
-  abort: remote name 'def' does not exist!
+  abort: remote name 'def' does not exist
   [255]
 
   $ hg log -r 'remotebookmarks("server3")' -GT "{rev}:{node|short} {remotenames}\n"
-  abort: remote name 'server3' does not exist!
+  abort: remote name 'server3' does not exist
   [255]
 
   $ hg log -r 'remotenames("server3")' -GT "{rev}:{node|short} {remotenames}\n"
-  abort: remote name 'server3' does not exist!
+  abort: remote name 'server3' does not exist
   [255]
 
 Testing for a pattern which does not match anything, which shouldn't fail.
diff --git a/tests/test-log.t b/tests/test-log.t
--- a/tests/test-log.t
+++ b/tests/test-log.t
@@ -4,13 +4,13 @@ 
   $ cd empty
   $ hg log
   $ hg log -r 1
-  abort: unknown revision '1'!
+  abort: unknown revision '1'
   [255]
   $ hg log -r -1:0
-  abort: unknown revision '-1'!
+  abort: unknown revision '-1'
   [255]
   $ hg log -r 'branch(name)'
-  abort: unknown revision 'name'!
+  abort: unknown revision 'name'
   [255]
   $ hg log -r null -q
   -1:000000000000
@@ -1068,7 +1068,7 @@ 
 log -r <some unknown node id>
 
   $ hg log -r 1000000000000000000000000000000000000000
-  abort: unknown revision '1000000000000000000000000000000000000000'!
+  abort: unknown revision '1000000000000000000000000000000000000000'
   [255]
 
 log -k r1
@@ -1500,7 +1500,7 @@ 
 log -b dummy
 
   $ hg log -b dummy
-  abort: unknown revision 'dummy'!
+  abort: unknown revision 'dummy'
   [255]
 
 
@@ -1996,7 +1996,7 @@ 
   1:a765632148dc55d38c35c4f247c618701886cb2f
   0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
   $ hg log -r a
-  abort: hidden revision 'a' is pruned!
+  abort: hidden revision 'a' is pruned
   (use --hidden to access hidden revisions)
   [255]
 
@@ -2060,7 +2060,7 @@ 
   2:94375ec45bddd2a824535fc04855bd058c926ec0
   3:d7d28b288a6b83d5d2cf49f10c5974deed3a1d2e
   $ hg log -T'{rev}:{node}\n' -r:0
-  abort: hidden revision '0' is pruned!
+  abort: hidden revision '0' is pruned
   (use --hidden to access hidden revisions)
   [255]
   $ hg log -T'{rev}:{node}\n' -f
diff --git a/tests/test-lfs.t b/tests/test-lfs.t
--- a/tests/test-lfs.t
+++ b/tests/test-lfs.t
@@ -22,7 +22,7 @@ 
   > EOF
 
   $ hg config extensions
-  abort: repository requires features unknown to this Mercurial: lfs!
+  abort: repository requires features unknown to this Mercurial: lfs
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 
@@ -41,7 +41,7 @@ 
 
   $ hg config extensions
   \*\*\* failed to import extension lfs from missing.py: [Errno *] $ENOENT$: 'missing.py' (glob)
-  abort: repository requires features unknown to this Mercurial: lfs!
+  abort: repository requires features unknown to this Mercurial: lfs
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 
@@ -985,7 +985,7 @@ 
 Accessing a corrupt file will complain
 
   $ hg --cwd fromcorrupt2 cat -r 0 large
-  abort: integrity check failed on data/large.i:0!
+  abort: integrity check failed on data/large.i:0
   [255]
 
 lfs -> normal -> lfs round trip conversions are possible.  The 'none()'
diff --git a/tests/test-lfs-test-server.t b/tests/test-lfs-test-server.t
--- a/tests/test-lfs-test-server.t
+++ b/tests/test-lfs-test-server.t
@@ -459,7 +459,7 @@ 
   Content-Type: text/plain; charset=utf-8 (git-server !)
   Date: $HTTP_DATE$ (git-server !)
   abort: corrupt remote lfs object: d11e1a642b60813aee592094109b406089b8dff4cb157157f753418ec7857998 (git-server !)
-  abort: LFS server error for "c": Validation error! (hg-server !)
+  abort: LFS server error for "c": Validation error
   [255]
 
 The corrupted blob is not added to the usercache or local store
@@ -826,7 +826,7 @@ 
     ]
     "transfer": "basic" (hg-server !)
   }
-  abort: LFS server error for "b": The object does not exist!
+  abort: LFS server error for "b": The object does not exist
   [255]
 
 Check error message when object does not exist:
@@ -937,7 +937,7 @@ 
     ]
     "transfer": "basic" (hg-server !)
   }
-  abort: LFS server error for "a": The object does not exist!
+  abort: LFS server error for "a": The object does not exist
   [255]
 
   $ "$PYTHON" $RUNTESTDIR/killdaemons.py $DAEMON_PIDS
diff --git a/tests/test-lfs-serve.t b/tests/test-lfs-serve.t
--- a/tests/test-lfs-serve.t
+++ b/tests/test-lfs-serve.t
@@ -282,7 +282,7 @@ 
 
   $ hg clone http://localhost:$HGPORT $TESTTMP/client4_clone
   (remote is using large file support (lfs), but it is explicitly disabled in the local configuration)
-  abort: repository requires features unknown to this Mercurial: lfs!
+  abort: repository requires features unknown to this Mercurial: lfs
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
   $ grep 'lfs' $TESTTMP/client4_clone/.hg/requires $SERVER_REQUIRES
@@ -510,7 +510,7 @@ 
 Misc: process dies early if a requirement exists and the extension is disabled
 
   $ hg --config extensions.lfs=! summary
-  abort: repository requires features unknown to this Mercurial: lfs!
+  abort: repository requires features unknown to this Mercurial: lfs
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 
diff --git a/tests/test-lfs-serve-access.t b/tests/test-lfs-serve-access.t
--- a/tests/test-lfs-serve-access.t
+++ b/tests/test-lfs-serve-access.t
@@ -30,7 +30,7 @@ 
   $ hg -R client push http://localhost:$HGPORT
   pushing to http://localhost:$HGPORT/
   searching for changes
-  abort: LFS HTTP error: HTTP Error 400: no such method: .git!
+  abort: LFS HTTP error: HTTP Error 400: no such method: .git
   (check that lfs serving is enabled on http://localhost:$HGPORT/.git/info/lfs and "upload" is supported)
   [255]
 
@@ -52,7 +52,7 @@ 
   added 1 changesets with 1 changes to 1 files
   new changesets 525251863cad
   updating to branch default
-  abort: LFS HTTP error: HTTP Error 400: no such method: .git!
+  abort: LFS HTTP error: HTTP Error 400: no such method: .git
   (check that lfs serving is enabled on http://localhost:$HGPORT/.git/info/lfs and "download" is supported)
   [255]
 
@@ -78,7 +78,7 @@ 
 Reasonable hint for a misconfigured blob server
 
   $ hg -R httpclone update default --config lfs.url=http://localhost:$HGPORT/missing
-  abort: LFS HTTP error: HTTP Error 404: Not Found!
+  abort: LFS HTTP error: HTTP Error 404: Not Found
   (the "lfs.url" config may be used to override http://localhost:$HGPORT/missing)
   [255]
 
@@ -86,6 +86,7 @@ 
   abort: LFS error: *onnection *refused*! (glob) (?)
   abort: LFS error: $EADDRNOTAVAIL$! (glob) (?)
   abort: LFS error: No route to host! (?)
+  abort: LFS error: Connection refused
   (the "lfs.url" config may be used to override http://localhost:$HGPORT2/missing)
   [255]
 
@@ -266,7 +267,7 @@ 
   added 1 changesets with 1 changes to 1 files
   new changesets 525251863cad
   updating to branch default
-  abort: LFS server error for "lfs.bin": Internal server error!
+  abort: LFS server error for "lfs.bin": Internal server error
   [255]
 
 Test an I/O error in localstore.verify() (Batch API) with PUT
@@ -276,7 +277,7 @@ 
   $ hg -R client push http://localhost:$HGPORT1
   pushing to http://localhost:$HGPORT1/
   searching for changes
-  abort: LFS server error for "unknown": Internal server error!
+  abort: LFS server error for "unknown": Internal server error
   [255]
 TODO: figure out how to associate the file name in the error above
 
@@ -285,7 +286,7 @@ 
   $ hg -R client push http://localhost:$HGPORT1
   pushing to http://localhost:$HGPORT1/
   searching for changes
-  abort: LFS HTTP error: HTTP Error 422: corrupt blob (oid=b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c, action=upload)!
+  abort: LFS HTTP error: HTTP Error 422: corrupt blob (oid=b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c, action=upload)
   [255]
 
   $ echo 'test lfs file' > server/lfs3.bin
@@ -297,14 +298,14 @@ 
 
   $ hg --config lfs.url=http://localhost:$HGPORT1/.git/info/lfs \
   >    -R client update -r tip
-  abort: LFS HTTP error: HTTP Error 500: Internal Server Error (oid=276f73cfd75f9fb519810df5f5d96d6594ca2521abd86cbcd92122f7d51a1f3d, action=download)!
+  abort: LFS HTTP error: HTTP Error 500: Internal Server Error (oid=276f73cfd75f9fb519810df5f5d96d6594ca2521abd86cbcd92122f7d51a1f3d, action=download)
   [255]
 
 Test a checksum failure during the processing of the GET request
 
   $ hg --config lfs.url=http://localhost:$HGPORT1/.git/info/lfs \
   >    -R client update -r tip
-  abort: LFS HTTP error: HTTP Error 422: corrupt blob (oid=276f73cfd75f9fb519810df5f5d96d6594ca2521abd86cbcd92122f7d51a1f3d, action=download)!
+  abort: LFS HTTP error: HTTP Error 422: corrupt blob (oid=276f73cfd75f9fb519810df5f5d96d6594ca2521abd86cbcd92122f7d51a1f3d, action=download)
   [255]
 
   $ "$PYTHON" $RUNTESTDIR/killdaemons.py $DAEMON_PIDS
@@ -451,7 +452,7 @@ 
   $ hg -R auth_clone push --config extensions.x=use_digests.py
   pushing to http://localhost:$HGPORT1/
   searching for changes
-  abort: LFS HTTP error: HTTP Error 401: the server must support Basic Authentication!
+  abort: LFS HTTP error: HTTP Error 401: the server must support Basic Authentication
   (api=http://localhost:$HGPORT1/.git/info/lfs/objects/batch, action=upload)
   [255]
 
diff --git a/tests/test-lfconvert.t b/tests/test-lfconvert.t
--- a/tests/test-lfconvert.t
+++ b/tests/test-lfconvert.t
@@ -212,16 +212,16 @@ 
   abort: ssh://localhost/foo is not a local Mercurial repo
   [255]
   $ hg lfconvert nosuchrepo foo
-  abort: repository nosuchrepo not found!
+  abort: repository nosuchrepo not found
   [255]
   $ hg share -q -U bigfile-repo shared
   $ printf 'bogus' > shared/.hg/sharedpath
   $ hg lfconvert shared foo
-  abort: .hg/sharedpath points to nonexistent directory $TESTTMP/bogus!
+  abort: .hg/sharedpath points to nonexistent directory $TESTTMP/bogus
   [255]
   $ hg lfconvert bigfile-repo largefiles-repo
   initializing destination largefiles-repo
-  abort: repository largefiles-repo already exists!
+  abort: repository largefiles-repo already exists
   [255]
 
 add another largefile to the new largefiles repo
diff --git a/tests/test-legacy-exit-code.t b/tests/test-legacy-exit-code.t
--- a/tests/test-legacy-exit-code.t
+++ b/tests/test-legacy-exit-code.t
@@ -12,7 +12,7 @@ 
   $ hg ci -Aqm initial
 
   $ hg co nonexistent
-  abort: unknown revision 'nonexistent'!
+  abort: unknown revision 'nonexistent'
   [255]
 
   $ hg co 'none()'
diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t
--- a/tests/test-largefiles.t
+++ b/tests/test-largefiles.t
@@ -1070,7 +1070,7 @@ 
 Clone URL without path:
 
   $ hg clone file://
-  abort: repository / not found!
+  abort: repository / not found
   [255]
 
 Ensure base clone command argument validation
diff --git a/tests/test-largefiles-misc.t b/tests/test-largefiles-misc.t
--- a/tests/test-largefiles-misc.t
+++ b/tests/test-largefiles-misc.t
@@ -23,7 +23,7 @@ 
   > EOF
 
   $ hg config extensions
-  abort: repository requires features unknown to this Mercurial: largefiles!
+  abort: repository requires features unknown to this Mercurial: largefiles
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 
@@ -42,7 +42,7 @@ 
 
   $ hg config extensions
   \*\*\* failed to import extension largefiles from missing.py: [Errno *] $ENOENT$: 'missing.py' (glob)
-  abort: repository requires features unknown to this Mercurial: largefiles!
+  abort: repository requires features unknown to this Mercurial: largefiles
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 
@@ -1009,7 +1009,7 @@ 
   $ hg -R enabledlocally root
   $TESTTMP/individualenabling/enabledlocally
   $ hg -R notenabledlocally root
-  abort: repository requires features unknown to this Mercurial: largefiles!
+  abort: repository requires features unknown to this Mercurial: largefiles
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 
@@ -1026,7 +1026,7 @@ 
   [255]
 
   $ hg clone enabledlocally clone-dst
-  abort: repository requires features unknown to this Mercurial: largefiles!
+  abort: repository requires features unknown to this Mercurial: largefiles
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
   $ test -d clone-dst
diff --git a/tests/test-journal-exists.t b/tests/test-journal-exists.t
--- a/tests/test-journal-exists.t
+++ b/tests/test-journal-exists.t
@@ -9,7 +9,7 @@ 
 
   $ echo foo > a
   $ hg ci -Am0
-  abort: abandoned transaction found!
+  abort: abandoned transaction found
   (run 'hg recover' to clean up transaction)
   [255]
 
@@ -21,7 +21,7 @@ 
 
   $ touch .hg/store/journal
   $ hg ci -Am0
-  abort: abandoned transaction found!
+  abort: abandoned transaction found
   (run 'hg recover' to clean up transaction)
   [255]
   $ hg recover --verify
@@ -36,7 +36,7 @@ 
 
   $ touch .hg/store/journal
   $ hg ci -Am0
-  abort: abandoned transaction found!
+  abort: abandoned transaction found
   (run 'hg recover' to clean up transaction)
   [255]
   $ hg recover --no-verify
diff --git a/tests/test-init.t b/tests/test-init.t
--- a/tests/test-init.t
+++ b/tests/test-init.t
@@ -32,10 +32,10 @@ 
 test custom revlog chunk cache sizes
 
   $ hg --config format.chunkcachesize=0 log -R local -pv
-  abort: revlog chunk cache size 0 is not greater than 0!
+  abort: revlog chunk cache size 0 is not greater than 0
   [255]
   $ hg --config format.chunkcachesize=1023 log -R local -pv
-  abort: revlog chunk cache size 1023 is not a power of 2!
+  abort: revlog chunk cache size 1023 is not a power of 2
   [255]
   $ hg --config format.chunkcachesize=1024 log -R local -pv
   changeset:   0:08b9e9f63b32
@@ -103,7 +103,7 @@ 
 test failure
 
   $ hg init local
-  abort: repository local already exists!
+  abort: repository local already exists
   [255]
 
 init+push to remote2
@@ -148,15 +148,15 @@ 
 init to existing repo
 
   $ hg init -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote1
-  abort: repository remote1 already exists!
-  abort: could not create remote repo!
+  abort: repository remote1 already exists
+  abort: could not create remote repo
   [255]
 
 clone to existing repo
 
   $ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" local ssh://user@dummy/remote1
-  abort: repository remote1 already exists!
-  abort: could not create remote repo!
+  abort: repository remote1 already exists
+  abort: could not create remote repo
   [255]
 
 output of dummyssh
diff --git a/tests/test-infinitepush-ci.t b/tests/test-infinitepush-ci.t
--- a/tests/test-infinitepush-ci.t
+++ b/tests/test-infinitepush-ci.t
@@ -205,7 +205,7 @@ 
 
   $ hg pull -r b4e4bce660512ad3e71189e14588a70ac8e31fef
   pulling from $TESTTMP/repo
-  abort: unknown revision 'b4e4bce660512ad3e71189e14588a70ac8e31fef'!
+  abort: unknown revision 'b4e4bce660512ad3e71189e14588a70ac8e31fef'
   [255]
   $ hg glog
   o  1:6cb0989601f1 added a
@@ -242,7 +242,7 @@ 
 XXX: we should support this
   $ hg pull -r b4e4bce660512
   pulling from ssh://user@dummy/repo
-  abort: unknown revision 'b4e4bce660512'!
+  abort: unknown revision 'b4e4bce660512'
   [255]
 
 XXX: we should show better message when the pull is happening from bundlestore
diff --git a/tests/test-identify.t b/tests/test-identify.t
--- a/tests/test-identify.t
+++ b/tests/test-identify.t
@@ -155,21 +155,21 @@ 
 test invalid lookup
 
   $ hg id -r noNoNO http://localhost:$HGPORT1/
-  abort: unknown revision 'noNoNO'!
+  abort: unknown revision 'noNoNO'
   [255]
 
 Make sure we do not obscure unknown requires file entries (issue2649)
 
   $ echo fake >> .hg/requires
   $ hg id
-  abort: repository requires features unknown to this Mercurial: fake!
+  abort: repository requires features unknown to this Mercurial: fake
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 
   $ cd ..
 #if no-outer-repo
   $ hg id test
-  abort: repository requires features unknown to this Mercurial: fake!
+  abort: repository requires features unknown to this Mercurial: fake
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 #endif
diff --git a/tests/test-i18n.t b/tests/test-i18n.t
--- a/tests/test-i18n.t
+++ b/tests/test-i18n.t
@@ -8,19 +8,19 @@ 
 using the "replace" error handler:
 
   $ LANGUAGE=pt_BR hg tip
-  abortado: n?o foi encontrado um reposit?rio em '$TESTTMP' (.hg n?o encontrado)!
+  abortado: n?o foi encontrado um reposit?rio em '$TESTTMP' (.hg n?o encontrado)
   [255]
 
 Using a more accommodating encoding:
 
   $ HGENCODING=UTF-8 LANGUAGE=pt_BR hg tip
-  abortado: n\xc3\xa3o foi encontrado um reposit\xc3\xb3rio em '$TESTTMP' (.hg n\xc3\xa3o encontrado)! (esc)
+  abortado: n\xc3\xa3o foi encontrado um reposit\xc3\xb3rio em '$TESTTMP' (.hg n\xc3\xa3o encontrado) (esc)
   [255]
 
 Different encoding:
 
   $ HGENCODING=Latin-1 LANGUAGE=pt_BR hg tip
-  abortado: n\xe3o foi encontrado um reposit\xf3rio em '$TESTTMP' (.hg n\xe3o encontrado)! (esc)
+  abortado: n\xe3o foi encontrado um reposit\xf3rio em '$TESTTMP' (.hg n\xe3o encontrado) (esc)
   [255]
 
 #endif
diff --git a/tests/test-http-bad-server.t b/tests/test-http-bad-server.t
--- a/tests/test-http-bad-server.t
+++ b/tests/test-http-bad-server.t
@@ -351,7 +351,7 @@ 
   ---%<--- (applicat)
   
   ---%<---
-  !
+  
   [255]
 
   $ killdaemons.py $DAEMON_PIDS
@@ -474,7 +474,7 @@ 
   ---%<--- (application/mercuri)
   
   ---%<---
-  !
+  
   [255]
 
   $ killdaemons.py $DAEMON_PIDS
diff --git a/tests/test-hook.t b/tests/test-hook.t
--- a/tests/test-hook.t
+++ b/tests/test-hook.t
@@ -1123,7 +1123,7 @@ 
   $ hg id
   loading pre-identify.npmd hook failed:
   abort: No module named repo! (no-py3 !)
-  abort: No module named 'repo'! (py3 !)
+  abort: No module named 'repo'
   [255]
 
   $ cd ../../b
diff --git a/tests/test-grep.t b/tests/test-grep.t
--- a/tests/test-grep.t
+++ b/tests/test-grep.t
@@ -1018,7 +1018,7 @@ 
   $ hg grep --diff -fr'wdir()' data
   add0-cp4-mod4:2147483647:+:data4
   add0-mod4:2147483647:+:data4
-  add0-rm4:2147483647:-:abort: add0-rm4@None: not found in manifest!
+  add0-rm4:2147483647:-:abort: add0-rm4@None: not found in manifest
   [255]
 
   $ hg grep -fr'wdir()' data
diff --git a/tests/test-glog.t b/tests/test-glog.t
--- a/tests/test-glog.t
+++ b/tests/test-glog.t
@@ -1452,9 +1452,9 @@ 
         <fullreposet+ 0:37>,
         <user 'not-a-user'>>>>
   $ testlog -b not-a-branch
-  abort: unknown revision 'not-a-branch'!
-  abort: unknown revision 'not-a-branch'!
-  abort: unknown revision 'not-a-branch'!
+  abort: unknown revision 'not-a-branch'
+  abort: unknown revision 'not-a-branch'
+  abort: unknown revision 'not-a-branch'
   $ testlog -b 35 -b 36 --only-branch branch
   []
   (or
diff --git a/tests/test-glog-beautifygraph.t b/tests/test-glog-beautifygraph.t
--- a/tests/test-glog-beautifygraph.t
+++ b/tests/test-glog-beautifygraph.t
@@ -1602,9 +1602,9 @@ 
         <fullreposet+ 0:37>,
         <user 'not-a-user'>>>>
   $ testlog -b not-a-branch
-  abort: unknown revision 'not-a-branch'!
-  abort: unknown revision 'not-a-branch'!
-  abort: unknown revision 'not-a-branch'!
+  abort: unknown revision 'not-a-branch'
+  abort: unknown revision 'not-a-branch'
+  abort: unknown revision 'not-a-branch'
   $ testlog -b 35 -b 36 --only-branch branch
   []
   (or
diff --git a/tests/test-globalopts.t b/tests/test-globalopts.t
--- a/tests/test-globalopts.t
+++ b/tests/test-globalopts.t
@@ -85,14 +85,14 @@ 
   $ hg ann a/a a/a
   0: a
   $ hg ann a/a b/b
-  abort: no repository found in '$TESTTMP' (.hg not found)!
+  abort: no repository found in '$TESTTMP' (.hg not found)
   [255]
   $ hg -R b ann a/a
   abort: a/a not under root '$TESTTMP/b'
   (consider using '--cwd b')
   [255]
   $ hg log
-  abort: no repository found in '$TESTTMP' (.hg not found)!
+  abort: no repository found in '$TESTTMP' (.hg not found)
   [255]
 
 #endif
diff --git a/tests/test-flagprocessor.t b/tests/test-flagprocessor.t
--- a/tests/test-flagprocessor.t
+++ b/tests/test-flagprocessor.t
@@ -189,7 +189,7 @@ 
 # TEST: ensure a missing processor is handled
   $ echo '[FAIL][BASE64][GZIP][NOOP]' > fail-base64-gzip-noop
   $ hg commit -Aqm 'fail+base64+gzip+noop'
-  abort: missing processor for flag '0x1'!
+  abort: missing processor for flag '0x1'
   [255]
   $ rm fail-base64-gzip-noop
 
diff --git a/tests/test-export.t b/tests/test-export.t
--- a/tests/test-export.t
+++ b/tests/test-export.t
@@ -369,7 +369,7 @@ 
   hg: parse error: empty query
   [10]
   $ hg export 999
-  abort: unknown revision '999'!
+  abort: unknown revision '999'
   [255]
   $ hg export "not all()"
   abort: export requires at least one changeset
diff --git a/tests/test-dispatch.t b/tests/test-dispatch.t
--- a/tests/test-dispatch.t
+++ b/tests/test-dispatch.t
@@ -41,10 +41,10 @@ 
 "--" may be an option value:
 
   $ hg -R -- log
-  abort: repository -- not found!
+  abort: repository -- not found
   [255]
   $ hg log -R --
-  abort: repository -- not found!
+  abort: repository -- not found
   [255]
   $ hg log -T --
   -- (no-eol)
@@ -126,20 +126,20 @@ 
 
 #if no-chg
   $ HGPLAIN=+strictflags hg log -b --config='hooks.pre-log=false' default
-  abort: unknown revision '--config=hooks.pre-log=false'!
+  abort: unknown revision '--config=hooks.pre-log=false'
   [255]
   $ HGPLAIN=+strictflags hg log -b -R. default
-  abort: unknown revision '-R.'!
+  abort: unknown revision '-R.'
   [255]
   $ HGPLAIN=+strictflags hg log -b --cwd=. default
-  abort: unknown revision '--cwd=.'!
+  abort: unknown revision '--cwd=.'
   [255]
 #endif
   $ HGPLAIN=+strictflags hg log -b --debugger default
-  abort: unknown revision '--debugger'!
+  abort: unknown revision '--debugger'
   [255]
   $ HGPLAIN=+strictflags hg log -b --config='alias.log=!echo pwned' default
-  abort: unknown revision '--config=alias.log=!echo pwned'!
+  abort: unknown revision '--config=alias.log=!echo pwned'
   [255]
 
   $ HGPLAIN=+strictflags hg log --config='hooks.pre-log=false' -b default
@@ -197,7 +197,7 @@ 
 No repo:
 
   $ hg cat
-  abort: no repository found in '$TESTTMP' (.hg not found)!
+  abort: no repository found in '$TESTTMP' (.hg not found)
   [255]
 
 #endif
diff --git a/tests/test-directaccess.t b/tests/test-directaccess.t
--- a/tests/test-directaccess.t
+++ b/tests/test-directaccess.t
@@ -40,7 +40,7 @@ 
 Testing with rev number
 
   $ hg exp 2 --config experimental.directaccess.revnums=False
-  abort: hidden revision '2' was rewritten as: 2443a0e66469!
+  abort: hidden revision '2' was rewritten as: 2443a0e66469
   (use --hidden to access hidden revisions)
   [255]
 
@@ -73,7 +73,7 @@ 
   A c
 
   $ hg status --change 2 --config experimental.directaccess.revnums=False
-  abort: hidden revision '2' was rewritten as: 2443a0e66469!
+  abort: hidden revision '2' was rewritten as: 2443a0e66469
   (use --hidden to access hidden revisions)
   [255]
 
@@ -195,12 +195,12 @@ 
 Commands with undefined intent should not work right now
 
   $ hg phase -r 28ad74
-  abort: hidden revision '28ad74' was rewritten as: 2443a0e66469!
+  abort: hidden revision '28ad74' was rewritten as: 2443a0e66469
   (use --hidden to access hidden revisions)
   [255]
 
   $ hg phase -r 2
-  abort: hidden revision '2' was rewritten as: 2443a0e66469!
+  abort: hidden revision '2' was rewritten as: 2443a0e66469
   (use --hidden to access hidden revisions)
   [255]
 
diff --git a/tests/test-default-push.t b/tests/test-default-push.t
--- a/tests/test-default-push.t
+++ b/tests/test-default-push.t
@@ -75,7 +75,7 @@ 
 Pushing to a path that isn't defined should not fall back to default
 
   $ hg --cwd b push doesnotexist
-  abort: repository doesnotexist does not exist!
+  abort: repository doesnotexist does not exist
   [255]
 
 :pushurl is used when defined
diff --git a/tests/test-convert-filemap.t b/tests/test-convert-filemap.t
--- a/tests/test-convert-filemap.t
+++ b/tests/test-convert-filemap.t
@@ -292,7 +292,7 @@ 
   $ rm -rf source/.hg/store/data/dir/file4
 #endif
   $ hg -q convert --filemap renames.fmap --datesort source dummydest
-  abort: data/dir/file3.i@e96dce0bc6a2: no match found! (reporevlogstore !)
+  abort: data/dir/file3.i@e96dce0bc6a2: no match found
   abort: data/dir/file3/index@e96dce0bc6a2: no node! (reposimplestore !)
   [255]
   $ hg -q convert --filemap renames.fmap --datesort --config convert.hg.ignoreerrors=1 source renames.repo
diff --git a/tests/test-committer.t b/tests/test-committer.t
--- a/tests/test-committer.t
+++ b/tests/test-committer.t
@@ -102,7 +102,7 @@ 
   $ hg commit -u ' ' -m commit-1
   transaction abort!
   rollback completed
-  abort: empty username!
+  abort: empty username
   [255]
 
 # don't add tests here, previous test is unstable
diff --git a/tests/test-commit.t b/tests/test-commit.t
--- a/tests/test-commit.t
+++ b/tests/test-commit.t
@@ -164,7 +164,7 @@ 
   $ echo foo >> foo
   $ echo fake >> .hg/requires
   $ hg commit -m bla
-  abort: repository requires features unknown to this Mercurial: fake!
+  abort: repository requires features unknown to this Mercurial: fake
   (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
   [255]
 
diff --git a/tests/test-commandserver.t b/tests/test-commandserver.t
--- a/tests/test-commandserver.t
+++ b/tests/test-commandserver.t
@@ -90,7 +90,7 @@ 
   *** runcommand id
   000000000000 tip
   *** runcommand id -runknown
-  abort: unknown revision 'unknown'!
+  abort: unknown revision 'unknown'
    [255]
 
   >>> from hgclient import bprint, check, readchannel
@@ -148,7 +148,7 @@ 
   ...     runcommand(server, [b'log', b'-b', b'--config=alias.log=!echo pwned',
   ...                         b'default'])
   *** runcommand log -b --config=alias.log=!echo pwned default
-  abort: unknown revision '--config=alias.log=!echo pwned'!
+  abort: unknown revision '--config=alias.log=!echo pwned'
    [255]
 
 check that "histedit --commands=-" can read rules from the input channel:
@@ -731,7 +731,7 @@ 
 
   $ cd repo
   $ hg serve --cmdserver pipe -R ../nonexistent
-  abort: repository ../nonexistent not found!
+  abort: repository ../nonexistent not found
   [255]
   $ cd ..
 
diff --git a/tests/test-clone.t b/tests/test-clone.t
--- a/tests/test-clone.t
+++ b/tests/test-clone.t
@@ -611,7 +611,7 @@ 
 No local source
 
   $ hg clone a b
-  abort: repository a not found!
+  abort: repository a not found
   [255]
 
 Invalid URL
@@ -1106,7 +1106,7 @@ 
   $ hg -R a id -r 0
   acb14030fe0a
   $ hg id -R remote -r 0
-  abort: repository remote not found!
+  abort: repository remote not found
   [255]
   $ hg --config share.pool=share -q clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" a ssh://user@dummy/remote
   $ hg -R remote id -r 0
@@ -1176,10 +1176,10 @@ 
   abort: potentially unsafe url: 'ssh://-oProxyCommand=touch${IFS}owned/path'
   [255]
   $ hg clone 'ssh://fakehost|touch%20owned/path'
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
   $ hg clone 'ssh://fakehost%7Ctouch%20owned/path'
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
   $ hg clone 'ssh://-oProxyCommand=touch owned%20foo@example.com/nonexistent/path'
@@ -1207,14 +1207,14 @@ 
   sending upgrade request: * proto=exp-ssh-v2-0003 (glob) (sshv2 !)
   sending hello command
   sending between command
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
   $ hg clone "ssh://example.com:%3btouch%20owned%20/" --debug
   running sh -c "read l; read l; read l" -p ';touch owned ' example.com 'hg -R . serve --stdio'
   sending upgrade request: * proto=exp-ssh-v2-0003 (glob) (sshv2 !)
   sending hello command
   sending between command
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 #endif
 
@@ -1223,7 +1223,7 @@ 
   sending upgrade request: * proto=exp-ssh-v2-0003 (glob) (sshv2 !)
   sending hello command
   sending between command
-  abort: no suitable response from remote hg!
+  abort: no suitable response from remote hg
   [255]
 
 We should not have created a file named owned - if it exists, the
diff --git a/tests/test-bundle.t b/tests/test-bundle.t
--- a/tests/test-bundle.t
+++ b/tests/test-bundle.t
@@ -697,13 +697,13 @@ 
   $ cd orig
   $ hg incoming '../test#bundle.hg'
   comparing with ../test
-  abort: unknown revision 'bundle.hg'!
+  abort: unknown revision 'bundle.hg'
   [255]
 
 note that percent encoding is not handled:
 
   $ hg incoming ../test%23bundle.hg
-  abort: repository ../test%23bundle.hg not found!
+  abort: repository ../test%23bundle.hg not found
   [255]
   $ cd ..
 
@@ -733,7 +733,7 @@ 
 partial history bundle, fails w/ unknown parent
 
   $ hg -R bundle.hg verify
-  abort: 00changelog.i@bbd179dfa0a7: unknown parent!
+  abort: 00changelog.i@bbd179dfa0a7: unknown parent
   [255]
 
 full history bundle, refuses to verify non-local repo
diff --git a/tests/test-bundle-r.t b/tests/test-bundle-r.t
--- a/tests/test-bundle-r.t
+++ b/tests/test-bundle-r.t
@@ -177,7 +177,7 @@ 
   abort: --all is incompatible with specifying a destination
   [10]
   $ hg -R test bundle -r tip test-bundle-branch1.hg
-  abort: repository default-push not found!
+  abort: repository default-push not found
   [255]
 
   $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg
@@ -223,7 +223,7 @@ 
   adding changesets
   transaction abort!
   rollback completed
-  abort: 00changelog.i@93ee6ab32777: unknown parent!
+  abort: 00changelog.i@93ee6ab32777: unknown parent
   [255]
 
 revision 2
diff --git a/tests/test-branch-option.t b/tests/test-branch-option.t
--- a/tests/test-branch-option.t
+++ b/tests/test-branch-option.t
@@ -57,12 +57,12 @@ 
 unknown branch and fallback
 
   $ hg in -qbz
-  abort: unknown branch 'z'!
+  abort: unknown branch 'z'
   [255]
   $ hg in -q ../branch#z
   2:f25d57ab0566
   $ hg out -qbz
-  abort: unknown branch 'z'!
+  abort: unknown branch 'z'
   [255]
 
 in rev c branch a
diff --git a/tests/test-branch-change.t b/tests/test-branch-change.t
--- a/tests/test-branch-change.t
+++ b/tests/test-branch-change.t
@@ -143,7 +143,7 @@ 
 Changing branch of an obsoleted changeset
 
   $ hg branch -r 4 foobar
-  abort: hidden revision '4' was rewritten as: 7c1991464886!
+  abort: hidden revision '4' was rewritten as: 7c1991464886
   (use --hidden to access hidden revisions)
   [255]
 
diff --git a/tests/test-bookmarks.t b/tests/test-bookmarks.t
--- a/tests/test-bookmarks.t
+++ b/tests/test-bookmarks.t
@@ -184,22 +184,22 @@ 
 but "literal:." is not since "." seems not a literal bookmark:
 
   $ hg log -r 'bookmark("literal:.")'
-  abort: bookmark '.' does not exist!
+  abort: bookmark '.' does not exist
   [255]
 
 "." should fail if there's no active bookmark:
 
   $ hg bookmark --inactive
   $ hg log -r 'bookmark(.)'
-  abort: no active bookmark!
+  abort: no active bookmark
   [255]
   $ hg log -r 'present(bookmark(.))'
 
   $ hg log -r 'bookmark(unknown)'
-  abort: bookmark 'unknown' does not exist!
+  abort: bookmark 'unknown' does not exist
   [255]
   $ hg log -r 'bookmark("literal:unknown")'
-  abort: bookmark 'unknown' does not exist!
+  abort: bookmark 'unknown' does not exist
   [255]
   $ hg log -r 'bookmark("re:unknown")'
   $ hg log -r 'present(bookmark("literal:unknown"))'
@@ -277,7 +277,7 @@ 
   $ hg book rename-me
   $ hg book -i rename-me
   $ hg book -m . renamed
-  abort: no active bookmark!
+  abort: no active bookmark
   [255]
   $ hg up -q Y
   $ hg book -d rename-me
@@ -297,7 +297,7 @@ 
   $ hg book delete-me
   $ hg book -i delete-me
   $ hg book -d .
-  abort: no active bookmark!
+  abort: no active bookmark
   [255]
   $ hg up -q Y
   $ hg book -d delete-me
diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t
--- a/tests/test-bookmarks-pushpull.t
+++ b/tests/test-bookmarks-pushpull.t
@@ -356,7 +356,7 @@ 
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   (leaving bookmark V)
   $ hg push -B . ../a
-  abort: no active bookmark!
+  abort: no active bookmark
   [255]
   $ hg update -r V
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
diff --git a/tests/test-bookmarks-current.t b/tests/test-bookmarks-current.t
--- a/tests/test-bookmarks-current.t
+++ b/tests/test-bookmarks-current.t
@@ -244,5 +244,5 @@ 
   Y
   $ hg bookmarks --inactive
   $ hg bookmarks -ql .
-  abort: no active bookmark!
+  abort: no active bookmark
   [255]
diff --git a/tests/test-bheads.t b/tests/test-bheads.t
--- a/tests/test-bheads.t
+++ b/tests/test-bheads.t
@@ -251,7 +251,7 @@ 
   -------
   7: Adding c branch (c)
   -------
-  abort: unknown revision 'z'!
+  abort: unknown revision 'z'
   -------
 
 =======
diff --git a/tests/test-alias.t b/tests/test-alias.t
--- a/tests/test-alias.t
+++ b/tests/test-alias.t
@@ -496,13 +496,13 @@ 
   $ hg init sub
   $ cd sub
   $ hg count 'branch(default)'
-  abort: unknown revision 'default'!
+  abort: unknown revision 'default'
   0
   $ hg -v count 'branch(default)'
-  abort: unknown revision 'default'!
+  abort: unknown revision 'default'
   0
   $ hg -R .. count 'branch(default)'
-  abort: unknown revision 'default'!
+  abort: unknown revision 'default'
   0
   $ hg --cwd .. count 'branch(default)'
   2
@@ -714,9 +714,9 @@ 
 
 #if no-outer-repo
   $ hg root
-  abort: no repository found in '$TESTTMP' (.hg not found)!
+  abort: no repository found in '$TESTTMP' (.hg not found)
   [255]
   $ hg --config alias.hgroot='!hg root' hgroot
-  abort: no repository found in '$TESTTMP' (.hg not found)!
+  abort: no repository found in '$TESTTMP' (.hg not found)
   [255]
 #endif
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -193,7 +193,7 @@ 
         if inst.hint:
             ui.error(b'(%s)\n' % inst.hint)
     except error.RepoError as inst:
-        ui.error(_(b"abort: %s!\n") % inst)
+        ui.error(_(b"abort: %s\n") % inst)
         if inst.hint:
             ui.error(_(b"(%s)\n") % inst.hint)
     except error.ResponseError as inst:
@@ -208,9 +208,9 @@ 
         else:
             ui.error(b"\n%r\n" % pycompat.bytestr(stringutil.ellipsis(msg)))
     except error.CensoredNodeError as inst:
-        ui.error(_(b"abort: file censored %s!\n") % inst)
+        ui.error(_(b"abort: file censored %s\n") % inst)
     except error.StorageError as inst:
-        ui.error(_(b"abort: %s!\n") % inst)
+        ui.error(_(b"abort: %s\n") % inst)
         if inst.hint:
             ui.error(_(b"(%s)\n") % inst.hint)
     except error.InterventionRequired as inst:
@@ -235,7 +235,7 @@ 
         # Don't print a message -- the worker already should have
         return inst.status_code
     except ImportError as inst:
-        ui.error(_(b"abort: %s!\n") % stringutil.forcebytestr(inst))
+        ui.error(_(b"abort: %s\n") % stringutil.forcebytestr(inst))
         m = stringutil.forcebytestr(inst).split()[-1]
         if m in b"mpatch bdiff".split():
             ui.error(_(b"(did you forget to compile extensions?)\n"))