changeset 17789:4cfd02c2df9a

bookmarks: check bookmark format during rename (issue3662)
author David Soria Parra <dsp@php.net>
date Wed, 17 Oct 2012 08:44:49 +0200
parents 9912baaae7df
children 0291e122fb05
files mercurial/commands.py tests/test-bookmarks.t
diffstat 2 files changed, 47 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/commands.py	Tue Oct 16 13:35:58 2012 -0500
+++ b/mercurial/commands.py	Wed Oct 17 08:44:49 2012 +0200
@@ -789,6 +789,24 @@
     marks = repo._bookmarks
     cur   = repo.changectx('.').node()
 
+    def checkformat(mark):
+        if "\n" in mark:
+            raise util.Abort(_("bookmark name cannot contain newlines"))
+        mark = mark.strip()
+        if not mark:
+            raise util.Abort(_("bookmark names cannot consist entirely of "
+                               "whitespace"))
+        return mark
+
+    def checkconflict(repo, mark, force=False):
+        if mark in marks and not force:
+            raise util.Abort(_("bookmark '%s' already exists "
+                               "(use -f to force)") % mark)
+        if ((mark in repo.branchmap() or mark == repo.dirstate.branch())
+            and not force):
+            raise util.Abort(
+                _("a bookmark cannot have the name of an existing branch"))
+
     if delete:
         if mark is None:
             raise util.Abort(_("bookmark name required"))
@@ -801,13 +819,12 @@
         return
 
     if rename:
+        if mark is None:
+            raise util.Abort(_("new bookmark name required"))
+        mark = checkformat(mark)
         if rename not in marks:
             raise util.Abort(_("bookmark '%s' does not exist") % rename)
-        if mark in marks and not force:
-            raise util.Abort(_("bookmark '%s' already exists "
-                               "(use -f to force)") % mark)
-        if mark is None:
-            raise util.Abort(_("new bookmark name required"))
+        checkconflict(repo, mark, force)
         marks[mark] = marks[rename]
         if repo._bookmarkcurrent == rename and not inactive:
             bookmarks.setcurrent(repo, mark)
@@ -816,22 +833,11 @@
         return
 
     if mark is not None:
-        if "\n" in mark:
-            raise util.Abort(_("bookmark name cannot contain newlines"))
-        mark = mark.strip()
-        if not mark:
-            raise util.Abort(_("bookmark names cannot consist entirely of "
-                               "whitespace"))
+        mark = checkformat(mark)
         if inactive and mark == repo._bookmarkcurrent:
             bookmarks.setcurrent(repo, None)
             return
-        if mark in marks and not force:
-            raise util.Abort(_("bookmark '%s' already exists "
-                               "(use -f to force)") % mark)
-        if ((mark in repo.branchmap() or mark == repo.dirstate.branch())
-            and not force):
-            raise util.Abort(
-                _("a bookmark cannot have the name of an existing branch"))
+        checkconflict(repo, mark, force)
         if rev:
             marks[mark] = scmutil.revsingle(repo, rev).node()
         else:
--- a/tests/test-bookmarks.t	Tue Oct 16 13:35:58 2012 -0500
+++ b/tests/test-bookmarks.t	Wed Oct 17 08:44:49 2012 +0200
@@ -217,12 +217,31 @@
   abort: bookmark name cannot contain newlines
   [255]
 
+  $ hg bookmark -m Z '
+  > '
+  abort: bookmark name cannot contain newlines
+  [255]
+
 bookmark with existing name
 
   $ hg bookmark Z
   abort: bookmark 'Z' already exists (use -f to force)
   [255]
 
+  $ hg bookmark -m Y Z
+  abort: bookmark 'Z' already exists (use -f to force)
+  [255]
+
+bookmark with name of branch
+
+  $ hg bookmark default
+  abort: a bookmark cannot have the name of an existing branch
+  [255]
+
+  $ hg bookmark -m Y default
+  abort: a bookmark cannot have the name of an existing branch
+  [255]
+
 force bookmark with existing name
 
   $ hg bookmark -f Z
@@ -247,6 +266,10 @@
   abort: bookmark names cannot consist entirely of whitespace
   [255]
 
+  $ hg bookmark -m Y ' '
+  abort: bookmark names cannot consist entirely of whitespace
+  [255]
+
 invalid bookmark
 
   $ hg bookmark 'foo:bar'