--- a/contrib/zsh_completion Wed Dec 10 00:16:12 2008 +0100
+++ b/contrib/zsh_completion Wed Dec 10 00:29:10 2008 +0100
@@ -4,14 +4,13 @@
# it into your zsh function path (/usr/share/zsh/site-functions for
# instance)
#
-# Copyright (C) 2005 Steve Borho
+# Copyright (C) 2005-6 Steve Borho
# Copyright (C) 2006-8 Brendan Cully <brendan@kublai.com>
#
# This is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your
# option) any later version.
-#
emulate -LR zsh
setopt extendedglob
@@ -117,28 +116,54 @@
_hg_get_commands() {
typeset -ga _hg_cmd_list
typeset -gA _hg_alias_list
- local hline cmd cmdalias
- _call_program help hg --verbose help | while read -A hline
+ local hline cmd cmdalias helpstate
+ local helpmode=$1
+
+ _call_program help hg --verbose help $helpmode 2>/dev/null | while read -A hline
do
- cmd="$hline[1]"
- case $cmd in
- *:)
- cmd=${cmd%:}
- _hg_cmd_list+=($cmd)
- ;;
- *,)
- cmd=${cmd%,}
- _hg_cmd_list+=($cmd)
- integer i=2
- while (( i <= $#hline ))
- do
- cmdalias=${hline[$i]%(:|,)}
- _hg_cmd_list+=($cmdalias)
- _hg_alias_list+=($cmdalias $cmd)
- (( i++ ))
- done
- ;;
- esac
+ if [ "$hline" = "list of commands:" ]
+ then
+ helpstate="commands"
+ continue
+ elif [ "$hline" = "enabled extensions:" ]
+ then
+ helpstate="extensions"
+ continue
+ elif [ "$hline" = "additional help topics:" ]
+ then
+ helpstate="topics"
+ continue
+ fi
+
+ if [ "$helpstate" = commands ]
+ then
+ cmd="$hline[1]"
+ case $cmd in
+ *:)
+ cmd=${cmd%:}
+ _hg_cmd_list+=($cmd)
+ ;;
+ *,)
+ cmd=${cmd%,}
+ _hg_cmd_list+=($cmd)
+ integer i=2
+ while (( i <= $#hline ))
+ do
+ cmdalias=${hline[$i]%(:|,)}
+ _hg_cmd_list+=($cmdalias)
+ _hg_alias_list+=($cmdalias $cmd)
+ (( i++ ))
+ done
+ ;;
+ esac
+ elif [ -z "$helpmode" -a "$helpstate" = extensions ]
+ then
+ cmd="$hline[1]"
+ if [ -n "$cmd" ]
+ then
+ _hg_get_commands $cmd
+ fi
+ fi
done
}
--- a/hgext/bookmarks.py Wed Dec 10 00:16:12 2008 +0100
+++ b/hgext/bookmarks.py Wed Dec 10 00:29:10 2008 +0100
@@ -14,9 +14,19 @@
It is possible to use bookmark names in every revision lookup (e.g. hg
merge, hg update).
+
+The bookmark extension offers the possiblity to have a more git-like experience
+by adding the following configuration option to your .hgrc:
+
+[bookmarks]
+track.current = True
+
+This will cause bookmarks to track the bookmark that you are currently on, and
+just updates it. This is similar to git's approach of branching.
'''
from mercurial.commands import templateopts, hex, short
+from mercurial import extensions
from mercurial.i18n import _
from mercurial import cmdutil, util, commands, changelog
from mercurial.node import nullid, nullrev
@@ -55,10 +65,53 @@
if os.path.exists(repo.join('bookmarks')):
util.copyfile(repo.join('bookmarks'), repo.join('undo.bookmarks'))
file = repo.opener('bookmarks', 'w+')
+ if current(repo) not in refs:
+ setcurrent(repo, None)
for refspec, node in refs.items():
file.write("%s %s\n" % (hex(node), refspec))
file.close()
+def current(repo):
+ '''Get the current bookmark
+
+ If we use gittishsh branches we have a current bookmark that
+ we are on. This function returns the name of the bookmark. It
+ is stored in .hg/bookmarks.current
+ '''
+ if repo._bookmarkcurrent:
+ return repo._bookmarkcurrent
+ mark = None
+ if os.path.exists(repo.join('bookmarks.current')):
+ file = repo.opener('bookmarks.current')
+ mark = file.readline()
+ if mark == '':
+ mark = None
+ file.close()
+ repo._bookmarkcurrent = mark
+ return mark
+
+def setcurrent(repo, mark):
+ '''Set the name of the bookmark that we are currently on
+
+ Set the name of the bookmark that we are on (hg update <bookmark>).
+ The name is recoreded in .hg/bookmarks.current
+ '''
+ if current(repo) == mark:
+ return
+
+ refs = parse(repo)
+
+ # do not update if we do update to a rev equal to the current bookmark
+ if (mark not in refs and
+ current(repo) and refs[current(repo)] == repo.changectx('.').node()):
+ return
+ if mark not in refs:
+ mark = ''
+ file = repo.opener('bookmarks.current', 'w+')
+ file.write(mark)
+ file.close()
+ repo._bookmarkcurrent = mark
+
def bookmark(ui, repo, mark=None, rev=None, force=False, delete=False, rename=None):
'''mercurial bookmarks
@@ -121,7 +174,11 @@
ui.status("no bookmarks set\n")
else:
for bmark, n in marks.iteritems():
- prefix = (n == cur) and '*' or ' '
+ if ui.configbool('bookmarks', 'track.current'):
+ prefix = (bmark == current(repo) and n == cur) and '*' or ' '
+ else:
+ prefix = (n == cur) and '*' or ' '
+
ui.write(" %s %-25s %d:%s\n" % (
prefix, bmark, repo.changelog.rev(n), hexfn(n)))
return
@@ -166,6 +223,7 @@
# init a bookmark cache as otherwise we would get a infinite reading
# in lookup()
repo._bookmarks = None
+ repo._bookmarkcurrent = None
class bookmark_repo(repo.__class__):
def rollback(self):
@@ -192,9 +250,14 @@
marks = parse(repo)
update = False
for mark, n in marks.items():
- if n in parents:
- marks[mark] = node
- update = True
+ if ui.configbool('bookmarks', 'track.current'):
+ if mark == current(repo) and n in parents:
+ marks[mark] = node
+ update = True
+ else:
+ if n in parents:
+ marks[mark] = node
+ update = True
if update:
write(repo, marks)
return node
@@ -218,8 +281,35 @@
write(repo, marks)
return result
+ def tags(self):
+ """Merge bookmarks with normal tags"""
+ if self.tagscache:
+ return self.tagscache
+
+ tagscache = super(bookmark_repo, self).tags()
+ tagscache.update(parse(repo))
+ return tagscache
+
repo.__class__ = bookmark_repo
+def updatecurbookmark(orig, ui, repo, *args, **opts):
+ '''Set the current bookmark
+
+ If the user updates to a bookmark we update the .hg/bookmarks.current
+ file.
+ '''
+ res = orig(ui, repo, *args, **opts)
+ rev = opts['rev']
+ if not rev and len(args) > 0:
+ rev = args[0]
+ setcurrent(repo, rev)
+ return res
+
+def uisetup(ui):
+ 'Replace push with a decorator to provide --non-bookmarked option'
+ if ui.configbool('bookmarks', 'track.current'):
+ extensions.wrapcommand(commands.table, 'update', updatecurbookmark)
+
cmdtable = {
"bookmarks":
(bookmark,
--- a/hgext/bugzilla.py Wed Dec 10 00:16:12 2008 +0100
+++ b/hgext/bugzilla.py Wed Dec 10 00:29:10 2008 +0100
@@ -185,6 +185,7 @@
self.run('''insert into bugs_activity (bug_id, who, bug_when, fieldid)
values (%s, %s, %s, %s)''',
(bugid, userid, now, self.longdesc_id))
+ self.conn.commit()
class bugzilla_3_0(bugzilla_2_16):
'''support for bugzilla 3.0 series.'''
--- a/hgext/convert/cvs.py Wed Dec 10 00:16:12 2008 +0100
+++ b/hgext/convert/cvs.py Wed Dec 10 00:29:10 2008 +0100
@@ -144,11 +144,11 @@
if branch == "HEAD":
branch = ""
if branch:
- latest = None
+ latest = 0
# the last changeset that contains a base
# file is our parent
for r in oldrevs:
- latest = max(filerevids.get(r, None), latest)
+ latest = max(filerevids.get(r, 0), latest)
if latest:
p = [latest]
--- a/mercurial/changelog.py Wed Dec 10 00:16:12 2008 +0100
+++ b/mercurial/changelog.py Wed Dec 10 00:29:10 2008 +0100
@@ -179,7 +179,7 @@
user = user.strip()
if "\n" in user:
- raise RevlogError(_("username %s contains a newline") % `user`)
+ raise RevlogError(_("username %s contains a newline") % repr(user))
user, desc = util.fromlocal(user), util.fromlocal(desc)
if date:
--- a/mercurial/dispatch.py Wed Dec 10 00:16:12 2008 +0100
+++ b/mercurial/dispatch.py Wed Dec 10 00:29:10 2008 +0100
@@ -90,7 +90,7 @@
else:
raise
except socket.error, inst:
- ui.warn(_("abort: %s\n") % inst[-1])
+ ui.warn(_("abort: %s\n") % inst.args[-1])
except IOError, inst:
if hasattr(inst, "code"):
ui.warn(_("abort: %s\n") % inst)
@@ -100,7 +100,7 @@
except: # it might be anything, for example a string
reason = inst.reason
ui.warn(_("abort: error: %s\n") % reason)
- elif hasattr(inst, "args") and inst[0] == errno.EPIPE:
+ elif hasattr(inst, "args") and inst.args[0] == errno.EPIPE:
if ui.debugflag:
ui.warn(_("broken pipe\n"))
elif getattr(inst, "strerror", None):
@@ -116,13 +116,13 @@
else:
ui.warn(_("abort: %s\n") % inst.strerror)
except util.UnexpectedOutput, inst:
- ui.warn(_("abort: %s") % inst[0])
- if not isinstance(inst[1], basestring):
- ui.warn(" %r\n" % (inst[1],))
- elif not inst[1]:
+ ui.warn(_("abort: %s") % inst.args[0])
+ if not isinstance(inst.args[1], basestring):
+ ui.warn(" %r\n" % (inst.args[1],))
+ elif not inst.args[1]:
ui.warn(_(" empty string\n"))
else:
- ui.warn("\n%r\n" % util.ellipsis(inst[1]))
+ ui.warn("\n%r\n" % util.ellipsis(inst.args[1]))
except ImportError, inst:
m = str(inst).split()[-1]
ui.warn(_("abort: could not import module %s!\n") % m)
--- a/mercurial/ui.py Wed Dec 10 00:16:12 2008 +0100
+++ b/mercurial/ui.py Wed Dec 10 00:29:10 2008 +0100
@@ -350,7 +350,7 @@
if not user:
raise util.Abort(_("Please specify a username."))
if "\n" in user:
- raise util.Abort(_("username %s contains a newline\n") % `user`)
+ raise util.Abort(_("username %s contains a newline\n") % repr(user))
return user
def shortuser(self, user):
--- a/mercurial/util.py Wed Dec 10 00:16:12 2008 +0100
+++ b/mercurial/util.py Wed Dec 10 00:29:10 2008 +0100
@@ -705,7 +705,7 @@
if cwd is not None and oldcwd != cwd:
os.chdir(oldcwd)
-class SignatureError:
+class SignatureError(Exception):
pass
def checksignature(func):
--- a/mercurial/util_win32.py Wed Dec 10 00:16:12 2008 +0100
+++ b/mercurial/util_win32.py Wed Dec 10 00:29:10 2008 +0100
@@ -19,7 +19,7 @@
import util
from win32com.shell import shell,shellcon
-class WinError:
+class WinError(Exception):
winerror_map = {
winerror.ERROR_ACCESS_DENIED: errno.EACCES,
winerror.ERROR_ACCOUNT_DISABLED: errno.EACCES,
--- a/tests/test-bdiff Wed Dec 10 00:16:12 2008 +0100
+++ b/tests/test-bdiff Wed Dec 10 00:29:10 2008 +0100
@@ -9,13 +9,13 @@
if d:
c = mpatch.patches(a, [d])
if c != b:
- print "***", `a`, `b`
+ print "***", repr(a), repr(b)
print "bad:"
- print `c`[:200]
- print `d`
+ print repr(c)[:200]
+ print repr(d)
def test(a, b):
- print "***", `a`, `b`
+ print "***", repr(a), repr(b)
test1(a, b)
test1(b, a)
--- a/tests/test-bookmarks-rebase.out Wed Dec 10 00:16:12 2008 +0100
+++ b/tests/test-bookmarks-rebase.out Wed Dec 10 00:29:10 2008 +0100
@@ -18,6 +18,8 @@
rebase completed
changeset: 3:9163974d1cb5
tag: tip
+tag: two
+tag: one
parent: 1:925d80f479bb
parent: 2:db815d6d32e6
user: test
--- a/tests/test-bookmarks.out Wed Dec 10 00:16:12 2008 +0100
+++ b/tests/test-bookmarks.out Wed Dec 10 00:29:10 2008 +0100
@@ -7,6 +7,7 @@
* X 0:f7b1eb17ad24
% look up bookmark
changeset: 0:f7b1eb17ad24
+tag: X
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
@@ -51,7 +52,10 @@
* x y 2:0316ce92851d
% look up stripped bookmark name
changeset: 2:0316ce92851d
+tag: X2
+tag: Y
tag: tip
+tag: x y
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: 2
--- a/tests/test-walkrepo.py Wed Dec 10 00:16:12 2008 +0100
+++ b/tests/test-walkrepo.py Wed Dec 10 00:29:10 2008 +0100
@@ -24,26 +24,26 @@
reposet = frozenset(walkrepos('.', followsym=True))
if sym and (len(reposet) != 3):
print "reposet = %r" % (reposet,)
- raise SystemExit(1, "Found %d repositories when I should have found 3" % (len(reposet),))
+ print "Found %d repositories when I should have found 3" % (len(reposet),)
if (not sym) and (len(reposet) != 2):
print "reposet = %r" % (reposet,)
- raise SystemExit(1, "Found %d repositories when I should have found 2" % (len(reposet),))
+ print "Found %d repositories when I should have found 2" % (len(reposet),)
sub1set = frozenset((pjoin('.', 'sub1'),
pjoin('.', 'circle', 'subdir', 'sub1')))
if len(sub1set & reposet) != 1:
print "sub1set = %r" % (sub1set,)
print "reposet = %r" % (reposet,)
- raise SystemExit(1, "sub1set and reposet should have exactly one path in common.")
+ print "sub1set and reposet should have exactly one path in common."
sub2set = frozenset((pjoin('.', 'subsub1'),
pjoin('.', 'subsubdir', 'subsub1')))
if len(sub2set & reposet) != 1:
print "sub2set = %r" % (sub2set,)
print "reposet = %r" % (reposet,)
- raise SystemExit(1, "sub1set and reposet should have exactly one path in common.")
+ print "sub1set and reposet should have exactly one path in common."
sub3 = pjoin('.', 'circle', 'top1')
if sym and not (sub3 in reposet):
print "reposet = %r" % (reposet,)
- raise SystemExit(1, "Symbolic links are supported and %s is not in reposet" % (sub3,))
+ print "Symbolic links are supported and %s is not in reposet" % (sub3,)
runtest()
if sym: