# HG changeset patch
# User Martin Geisler <mg@lazybytes.net>
# Date 2009-05-16 09:12:49
# Node ID c5b3d3e30de7a6238c151a182441f74aa9ecb1cc
# Parent  eb7be0e752d92b100e9dfe7cb728039c2e6c91d5

changelog: refuse to add revisions with empty usernames

An empty username or a username with a "\n" will make the revision
text contain two "\n\n" sequences -> corrupt repository.

The problem is that changelog.read expects to find exactly one "\n\n"
separator and thus cannot unpack the revision.

diff --git a/mercurial/changelog.py b/mercurial/changelog.py
--- a/mercurial/changelog.py
+++ b/mercurial/changelog.py
@@ -202,6 +202,11 @@ class changelog(revlog.revlog):
                   user=None, date=None, extra={}):
 
         user = user.strip()
+        # An empty username or a username with a "\n" will make the
+        # revision text contain two "\n\n" sequences -> corrupt
+        # repository since read cannot unpack the revision.
+        if not user:
+            raise error.RevlogError(_("empty username"))
         if "\n" in user:
             raise error.RevlogError(_("username %s contains a newline")
                                     % repr(user))
diff --git a/tests/test-committer b/tests/test-committer
--- a/tests/test-committer
+++ b/tests/test-committer
@@ -29,3 +29,8 @@ echo "username = " >> .hg/hgrc
 hg commit -d '1000000 0' -m commit-1
 rm .hg/hgrc
 hg commit -d '1000000 0' -m commit-1 2>&1 | sed -e "s/'[^']*'/user@host/"
+
+echo space > asdf
+hg commit -d '1000000 0' -u ' ' -m commit-1
+
+true
diff --git a/tests/test-committer.out b/tests/test-committer.out
--- a/tests/test-committer.out
+++ b/tests/test-committer.out
@@ -24,3 +24,6 @@ summary:     commit-1
 
 abort: Please specify a username.
 No username found, using user@host instead
+transaction abort!
+rollback completed
+abort: empty username!