annotate mercurial/bookmarks.py @ 17984:b74361cf7c0a stable

update: allow update to existing branches with invalid names (issue3710) Starting with 361ab1e2086f, users are no longer able to update a working copy to a branch named with a "bad" character (such as ':'). Prior to v2.4, it was possible to create branch names using "bad" characters, so this breaks backwards compatibility. Mercurial must allow users to update to existing branches with bad names. However, it should continue to prevent the creation of new branches with bad names. A test was added to confirm that 'hg update' works as expected. The test uses a bundled repo that was created with an earlier version of Mercurial.
author Tim Henigan <tim.henigan@gmail.com>
date Tue, 27 Nov 2012 08:47:35 -0500
parents 75b43843eb4d
children ed225834b372
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
1 # Mercurial bookmark support code
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
2 #
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
3 # Copyright 2008 David Soria Parra <dsp@php.net>
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
4 #
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
7
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
8 from mercurial.i18n import _
14064
e4bfb9c337f3 remove unused imports and variables
Alexander Solovyov <alexander@solovyov.net>
parents: 14039
diff changeset
9 from mercurial.node import hex
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
10 from mercurial import encoding, error, util, obsolete, phases
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
11 import errno, os
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
12
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
13 def read(repo):
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
14 '''Parse .hg/bookmarks file and return a dictionary
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
15
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
16 Bookmarks are stored as {HASH}\\s{NAME}\\n (localtags format) values
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
17 in the .hg/bookmarks file.
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
18 Read the file and return a (name=>nodeid) dictionary
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
19 '''
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
20 bookmarks = {}
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
21 try:
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
22 for line in repo.opener('bookmarks'):
14845
677339529a53 bookmarks: more robust parsing of bookmarks file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14559
diff changeset
23 line = line.strip()
14848
09c9c120a817 bookmarks: simplify warning code
Matt Mackall <mpm@selenic.com>
parents: 14847
diff changeset
24 if not line:
09c9c120a817 bookmarks: simplify warning code
Matt Mackall <mpm@selenic.com>
parents: 14847
diff changeset
25 continue
14845
677339529a53 bookmarks: more robust parsing of bookmarks file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14559
diff changeset
26 if ' ' not in line:
14848
09c9c120a817 bookmarks: simplify warning code
Matt Mackall <mpm@selenic.com>
parents: 14847
diff changeset
27 repo.ui.warn(_('malformed line in .hg/bookmarks: %r\n') % line)
14845
677339529a53 bookmarks: more robust parsing of bookmarks file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14559
diff changeset
28 continue
14847
400ba7cccbae bookmarks: drop superfluous strip
Matt Mackall <mpm@selenic.com>
parents: 14846
diff changeset
29 sha, refspec = line.split(' ', 1)
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
30 refspec = encoding.tolocal(refspec)
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
31 try:
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
32 bookmarks[refspec] = repo.changelog.lookup(sha)
16573
5983de86462c bookmarks: catch the proper exception for missing revisions
Matt Mackall <mpm@selenic.com>
parents: 16276
diff changeset
33 except LookupError:
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
34 pass
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
35 except IOError, inst:
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
36 if inst.errno != errno.ENOENT:
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
37 raise
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
38 return bookmarks
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
39
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
40 def readcurrent(repo):
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
41 '''Get the current bookmark
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
42
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
43 If we use gittishsh branches we have a current bookmark that
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
44 we are on. This function returns the name of the bookmark. It
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
45 is stored in .hg/bookmarks.current
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
46 '''
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
47 mark = None
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
48 try:
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
49 file = repo.opener('bookmarks.current')
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
50 except IOError, inst:
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
51 if inst.errno != errno.ENOENT:
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
52 raise
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
53 return None
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
54 try:
17425
e95ec38f86b0 fix wording and not-completely-trivial spelling errors and bad docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 16719
diff changeset
55 # No readline() in osutil.posixfile, reading everything is cheap
13381
d073468e3c5f bookmarks: read current bookmark as utf-8 and convert it to local
David Soria Parra <dsp@php.net>
parents: 13354
diff changeset
56 mark = encoding.tolocal((file.readlines() or [''])[0])
13627
71a96f6c205d bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13478
diff changeset
57 if mark == '' or mark not in repo._bookmarks:
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
58 mark = None
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
59 finally:
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
60 file.close()
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
61 return mark
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
62
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
63 def write(repo):
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
64 '''Write bookmarks
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
65
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
66 Write the given bookmark => hash dictionary to the .hg/bookmarks file
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
67 in a format equal to those of localtags.
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
68
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
69 We also store a backup of the previous state in undo.bookmarks that
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
70 can be copied back on rollback.
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
71 '''
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
72 refs = repo._bookmarks
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
73
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
74 if repo._bookmarkcurrent not in refs:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
75 setcurrent(repo, None)
13425
0fe36c347c00 bookmarks: forbid \0 \r \n : in bookmark names (BC)
David Soria Parra <dsp@php.net>
parents: 13416
diff changeset
76
15908
60cb4f381a78 bookmarks: backout locking change in 12dea4d998ec
Matt Mackall <mpm@selenic.com>
parents: 15887
diff changeset
77 wlock = repo.wlock()
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
78 try:
13425
0fe36c347c00 bookmarks: forbid \0 \r \n : in bookmark names (BC)
David Soria Parra <dsp@php.net>
parents: 13416
diff changeset
79
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
80 file = repo.opener('bookmarks', 'w', atomictemp=True)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
81 for refspec, node in refs.iteritems():
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
82 file.write("%s %s\n" % (hex(node), encoding.fromlocal(refspec)))
15057
774da7121fc9 atomictempfile: make close() consistent with other file-like objects.
Greg Ward <greg@gerg.ca>
parents: 14946
diff changeset
83 file.close()
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
84
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
85 # touch 00changelog.i so hgweb reloads bookmarks (no lock needed)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
86 try:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
87 os.utime(repo.sjoin('00changelog.i'), None)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
88 except OSError:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
89 pass
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
90
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
91 finally:
15908
60cb4f381a78 bookmarks: backout locking change in 12dea4d998ec
Matt Mackall <mpm@selenic.com>
parents: 15887
diff changeset
92 wlock.release()
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
93
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
94 def setcurrent(repo, mark):
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
95 '''Set the name of the bookmark that we are currently on
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
96
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
97 Set the name of the bookmark that we are on (hg update <bookmark>).
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
98 The name is recorded in .hg/bookmarks.current
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
99 '''
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
100 current = repo._bookmarkcurrent
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
101 if current == mark:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
102 return
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
103
13647
c0c599709846 bookmarks: remove API limitation in setcurrent
David Soria Parra <dsp@php.net>
parents: 13646
diff changeset
104 if mark not in repo._bookmarks:
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
105 mark = ''
13425
0fe36c347c00 bookmarks: forbid \0 \r \n : in bookmark names (BC)
David Soria Parra <dsp@php.net>
parents: 13416
diff changeset
106
15908
60cb4f381a78 bookmarks: backout locking change in 12dea4d998ec
Matt Mackall <mpm@selenic.com>
parents: 15887
diff changeset
107 wlock = repo.wlock()
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
108 try:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
109 file = repo.opener('bookmarks.current', 'w', atomictemp=True)
14559
e29821ca94cf bookmarks: recognize the current bookmark when the local encoding isn't UTF-8
LUO Zheng <xmuluo@gmail.com>
parents: 14268
diff changeset
110 file.write(encoding.fromlocal(mark))
15057
774da7121fc9 atomictempfile: make close() consistent with other file-like objects.
Greg Ward <greg@gerg.ca>
parents: 14946
diff changeset
111 file.close()
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
112 finally:
15908
60cb4f381a78 bookmarks: backout locking change in 12dea4d998ec
Matt Mackall <mpm@selenic.com>
parents: 15887
diff changeset
113 wlock.release()
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
114 repo._bookmarkcurrent = mark
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
115
16191
7c75924a6926 update: delete bookmarks.current when explicitly updating to a rev (issue3276)
Idan Kamara <idankk86@gmail.com>
parents: 15984
diff changeset
116 def unsetcurrent(repo):
7c75924a6926 update: delete bookmarks.current when explicitly updating to a rev (issue3276)
Idan Kamara <idankk86@gmail.com>
parents: 15984
diff changeset
117 wlock = repo.wlock()
7c75924a6926 update: delete bookmarks.current when explicitly updating to a rev (issue3276)
Idan Kamara <idankk86@gmail.com>
parents: 15984
diff changeset
118 try:
16194
6ba530122d8b bookmarks: restore python 2.4 compatibility
Gilles Moris <gilles.moris@free.fr>
parents: 16191
diff changeset
119 try:
6ba530122d8b bookmarks: restore python 2.4 compatibility
Gilles Moris <gilles.moris@free.fr>
parents: 16191
diff changeset
120 util.unlink(repo.join('bookmarks.current'))
6ba530122d8b bookmarks: restore python 2.4 compatibility
Gilles Moris <gilles.moris@free.fr>
parents: 16191
diff changeset
121 repo._bookmarkcurrent = None
6ba530122d8b bookmarks: restore python 2.4 compatibility
Gilles Moris <gilles.moris@free.fr>
parents: 16191
diff changeset
122 except OSError, inst:
6ba530122d8b bookmarks: restore python 2.4 compatibility
Gilles Moris <gilles.moris@free.fr>
parents: 16191
diff changeset
123 if inst.errno != errno.ENOENT:
6ba530122d8b bookmarks: restore python 2.4 compatibility
Gilles Moris <gilles.moris@free.fr>
parents: 16191
diff changeset
124 raise
16191
7c75924a6926 update: delete bookmarks.current when explicitly updating to a rev (issue3276)
Idan Kamara <idankk86@gmail.com>
parents: 15984
diff changeset
125 finally:
7c75924a6926 update: delete bookmarks.current when explicitly updating to a rev (issue3276)
Idan Kamara <idankk86@gmail.com>
parents: 15984
diff changeset
126 wlock.release()
7c75924a6926 update: delete bookmarks.current when explicitly updating to a rev (issue3276)
Idan Kamara <idankk86@gmail.com>
parents: 15984
diff changeset
127
13663
d16c99f16f00 bundle: update current bookmark to most recent revision on current branch
David Soria Parra <dsp@php.net>
parents: 13647
diff changeset
128 def updatecurrentbookmark(repo, oldnode, curbranch):
d16c99f16f00 bundle: update current bookmark to most recent revision on current branch
David Soria Parra <dsp@php.net>
parents: 13647
diff changeset
129 try:
16719
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16706
diff changeset
130 return update(repo, oldnode, repo.branchtip(curbranch))
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16706
diff changeset
131 except error.RepoLookupError:
13663
d16c99f16f00 bundle: update current bookmark to most recent revision on current branch
David Soria Parra <dsp@php.net>
parents: 13647
diff changeset
132 if curbranch == "default": # no default branch!
15621
013688350c7d bookmarks: update and updatecurrentbookmark return status
Kevin Bullock <kbullock@ringworld.org>
parents: 15614
diff changeset
133 return update(repo, oldnode, repo.lookup("tip"))
13663
d16c99f16f00 bundle: update current bookmark to most recent revision on current branch
David Soria Parra <dsp@php.net>
parents: 13647
diff changeset
134 else:
d16c99f16f00 bundle: update current bookmark to most recent revision on current branch
David Soria Parra <dsp@php.net>
parents: 13647
diff changeset
135 raise util.Abort(_("branch %s not found") % curbranch)
d16c99f16f00 bundle: update current bookmark to most recent revision on current branch
David Soria Parra <dsp@php.net>
parents: 13647
diff changeset
136
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
137 def update(repo, parents, node):
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
138 marks = repo._bookmarks
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
139 update = False
16706
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
140 cur = repo._bookmarkcurrent
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
141 if not cur:
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
142 return False
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
143
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
144 toupdate = [b for b in marks if b.split('@', 1)[0] == cur.split('@', 1)[0]]
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
145 for mark in toupdate:
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
146 if mark and marks[mark] in parents:
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
147 old = repo[marks[mark]]
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
148 new = repo[node]
17627
84f12b832ee8 bookmarks: use "changectx.descendant()" for efficient descendant examination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17625
diff changeset
149 if old.descendant(new) and mark == cur:
16706
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
150 marks[cur] = new.node()
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
151 update = True
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
152 if mark != cur:
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
153 del marks[mark]
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
154 if update:
15237
7196ed7a1505 bookmarks: delegate writing to the repo just like reading
Augie Fackler <durin42@gmail.com>
parents: 15057
diff changeset
155 repo._writebookmarks(marks)
15621
013688350c7d bookmarks: update and updatecurrentbookmark return status
Kevin Bullock <kbullock@ringworld.org>
parents: 15614
diff changeset
156 return update
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
157
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
158 def listbookmarks(repo):
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
159 # We may try to list bookmarks on a repo type that does not
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
160 # support it (e.g., statichttprepository).
14946
28762bf809d8 bookmarks: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14848
diff changeset
161 marks = getattr(repo, '_bookmarks', {})
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
162
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
163 d = {}
14946
28762bf809d8 bookmarks: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14848
diff changeset
164 for k, v in marks.iteritems():
15613
2fad18f15409 bookmarks: shadow divergent bookmarks of foo with foo@n
Matt Mackall <mpm@selenic.com>
parents: 15237
diff changeset
165 # don't expose local divergent bookmarks
16276
6b16ded5c810 bookmarks: clone non-divergent bookmarks with @ in them
Kevin Bullock <kbullock@ringworld.org>
parents: 16194
diff changeset
166 if '@' not in k or k.endswith('@'):
15613
2fad18f15409 bookmarks: shadow divergent bookmarks of foo with foo@n
Matt Mackall <mpm@selenic.com>
parents: 15237
diff changeset
167 d[k] = hex(v)
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
168 return d
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
169
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
170 def pushbookmark(repo, key, old, new):
15908
60cb4f381a78 bookmarks: backout locking change in 12dea4d998ec
Matt Mackall <mpm@selenic.com>
parents: 15887
diff changeset
171 w = repo.wlock()
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
172 try:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
173 marks = repo._bookmarks
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
174 if hex(marks.get(key, '')) != old:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
175 return False
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
176 if new == '':
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
177 del marks[key]
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
178 else:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
179 if new not in repo:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
180 return False
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
181 marks[key] = repo[new].node()
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
182 write(repo)
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
183 return True
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
184 finally:
15908
60cb4f381a78 bookmarks: backout locking change in 12dea4d998ec
Matt Mackall <mpm@selenic.com>
parents: 15887
diff changeset
185 w.release()
13354
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
186
15614
260a6449d83a bookmarks: mark divergent bookmarks with book@pathalias when source in [paths]
Matt Mackall <mpm@selenic.com>
parents: 15613
diff changeset
187 def updatefromremote(ui, repo, remote, path):
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
188 ui.debug("checking for updated bookmarks\n")
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
189 rb = remote.listkeys('bookmarks')
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
190 changed = False
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
191 for k in rb.keys():
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
192 if k in repo._bookmarks:
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
193 nr, nl = rb[k], repo._bookmarks[k]
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
194 if nr in repo:
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
195 cr = repo[nr]
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
196 cl = repo[nl]
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
197 if cl.rev() >= cr.rev():
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
198 continue
17550
fc530080013b bookmarks: extract valid destination logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17425
diff changeset
199 if validdest(repo, cl, cr):
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
200 repo._bookmarks[k] = cr.node()
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
201 changed = True
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
202 ui.status(_("updating bookmark %s\n") % k)
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
203 else:
17770
6c81b8ebf66e bookmarks: when @ bookmark diverges, don't double the @ sign (BC)
David M. Carr <david@carrclan.us>
parents: 17738
diff changeset
204 if k == '@':
6c81b8ebf66e bookmarks: when @ bookmark diverges, don't double the @ sign (BC)
David M. Carr <david@carrclan.us>
parents: 17738
diff changeset
205 kd = ''
6c81b8ebf66e bookmarks: when @ bookmark diverges, don't double the @ sign (BC)
David M. Carr <david@carrclan.us>
parents: 17738
diff changeset
206 else:
6c81b8ebf66e bookmarks: when @ bookmark diverges, don't double the @ sign (BC)
David M. Carr <david@carrclan.us>
parents: 17738
diff changeset
207 kd = k
15614
260a6449d83a bookmarks: mark divergent bookmarks with book@pathalias when source in [paths]
Matt Mackall <mpm@selenic.com>
parents: 15613
diff changeset
208 # find a unique @ suffix
15613
2fad18f15409 bookmarks: shadow divergent bookmarks of foo with foo@n
Matt Mackall <mpm@selenic.com>
parents: 15237
diff changeset
209 for x in range(1, 100):
17770
6c81b8ebf66e bookmarks: when @ bookmark diverges, don't double the @ sign (BC)
David M. Carr <david@carrclan.us>
parents: 17738
diff changeset
210 n = '%s@%d' % (kd, x)
15613
2fad18f15409 bookmarks: shadow divergent bookmarks of foo with foo@n
Matt Mackall <mpm@selenic.com>
parents: 15237
diff changeset
211 if n not in repo._bookmarks:
2fad18f15409 bookmarks: shadow divergent bookmarks of foo with foo@n
Matt Mackall <mpm@selenic.com>
parents: 15237
diff changeset
212 break
15614
260a6449d83a bookmarks: mark divergent bookmarks with book@pathalias when source in [paths]
Matt Mackall <mpm@selenic.com>
parents: 15613
diff changeset
213 # try to use an @pathalias suffix
260a6449d83a bookmarks: mark divergent bookmarks with book@pathalias when source in [paths]
Matt Mackall <mpm@selenic.com>
parents: 15613
diff changeset
214 # if an @pathalias already exists, we overwrite (update) it
260a6449d83a bookmarks: mark divergent bookmarks with book@pathalias when source in [paths]
Matt Mackall <mpm@selenic.com>
parents: 15613
diff changeset
215 for p, u in ui.configitems("paths"):
260a6449d83a bookmarks: mark divergent bookmarks with book@pathalias when source in [paths]
Matt Mackall <mpm@selenic.com>
parents: 15613
diff changeset
216 if path == u:
17770
6c81b8ebf66e bookmarks: when @ bookmark diverges, don't double the @ sign (BC)
David M. Carr <david@carrclan.us>
parents: 17738
diff changeset
217 n = '%s@%s' % (kd, p)
15614
260a6449d83a bookmarks: mark divergent bookmarks with book@pathalias when source in [paths]
Matt Mackall <mpm@selenic.com>
parents: 15613
diff changeset
218
15613
2fad18f15409 bookmarks: shadow divergent bookmarks of foo with foo@n
Matt Mackall <mpm@selenic.com>
parents: 15237
diff changeset
219 repo._bookmarks[n] = cr.node()
2fad18f15409 bookmarks: shadow divergent bookmarks of foo with foo@n
Matt Mackall <mpm@selenic.com>
parents: 15237
diff changeset
220 changed = True
2fad18f15409 bookmarks: shadow divergent bookmarks of foo with foo@n
Matt Mackall <mpm@selenic.com>
parents: 15237
diff changeset
221 ui.warn(_("divergent bookmark %s stored as %s\n") % (k, n))
16697
c285aae10f6c bookmarks: pull new bookmarks from remote by default (BC)
Levi Bard <levi@unity3d.com>
parents: 16573
diff changeset
222 elif rb[k] in repo:
c285aae10f6c bookmarks: pull new bookmarks from remote by default (BC)
Levi Bard <levi@unity3d.com>
parents: 16573
diff changeset
223 # add remote bookmarks for changes we already have
c285aae10f6c bookmarks: pull new bookmarks from remote by default (BC)
Levi Bard <levi@unity3d.com>
parents: 16573
diff changeset
224 repo._bookmarks[k] = repo[rb[k]].node()
c285aae10f6c bookmarks: pull new bookmarks from remote by default (BC)
Levi Bard <levi@unity3d.com>
parents: 16573
diff changeset
225 changed = True
c285aae10f6c bookmarks: pull new bookmarks from remote by default (BC)
Levi Bard <levi@unity3d.com>
parents: 16573
diff changeset
226 ui.status(_("adding remote bookmark %s\n") % k)
15613
2fad18f15409 bookmarks: shadow divergent bookmarks of foo with foo@n
Matt Mackall <mpm@selenic.com>
parents: 15237
diff changeset
227
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
228 if changed:
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
229 write(repo)
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
230
17667
2b6a795f19f7 bookmarks: rename arguments/variables for source code readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17627
diff changeset
231 def diff(ui, dst, src):
13354
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
232 ui.status(_("searching for changed bookmarks\n"))
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
233
17667
2b6a795f19f7 bookmarks: rename arguments/variables for source code readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17627
diff changeset
234 smarks = src.listkeys('bookmarks')
2b6a795f19f7 bookmarks: rename arguments/variables for source code readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17627
diff changeset
235 dmarks = dst.listkeys('bookmarks')
13354
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
236
17667
2b6a795f19f7 bookmarks: rename arguments/variables for source code readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17627
diff changeset
237 diff = sorted(set(smarks) - set(dmarks))
13354
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
238 for k in diff:
17667
2b6a795f19f7 bookmarks: rename arguments/variables for source code readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17627
diff changeset
239 mark = ui.debugflag and smarks[k] or smarks[k][:12]
15984
894f83a35653 bookmarks: respect --debug during incoming/outgoing
David Soria Parra <dsp@php.net>
parents: 15908
diff changeset
240 ui.write(" %-25s %s\n" % (k, mark))
13354
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
241
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
242 if len(diff) <= 0:
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
243 ui.status(_("no changed bookmarks found\n"))
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
244 return 1
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
245 return 0
17550
fc530080013b bookmarks: extract valid destination logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17425
diff changeset
246
fc530080013b bookmarks: extract valid destination logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17425
diff changeset
247 def validdest(repo, old, new):
fc530080013b bookmarks: extract valid destination logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17425
diff changeset
248 """Is the new bookmark destination a valid update from the old one"""
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
249 if old == new:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
250 # Old == new -> nothing to update.
17625
b83c18204c36 bookmarks: avoid redundant creation/assignment of "validdests" in "validdest()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17551
diff changeset
251 return False
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
252 elif not old:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
253 # old is nullrev, anything is valid.
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
254 # (new != nullrev has been excluded by the previous check)
17625
b83c18204c36 bookmarks: avoid redundant creation/assignment of "validdests" in "validdest()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17551
diff changeset
255 return True
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
256 elif repo.obsstore:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
257 # We only need this complicated logic if there is obsolescence
17738
b8424c92ba2b spelling: fix minor spell checker issues
Mads Kiilerich <mads@kiilerich.com>
parents: 17667
diff changeset
258 # XXX will probably deserve an optimised revset.
17865
daf32ebfde6b bookmark: prevent crashing when a successor is unknown locally (issue3680)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17827
diff changeset
259 nm = repo.changelog.nodemap
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
260 validdests = set([old])
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
261 plen = -1
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
262 # compute the whole set of successors or descendants
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
263 while len(validdests) != plen:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
264 plen = len(validdests)
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
265 succs = set(c.node() for c in validdests)
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
266 for c in validdests:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
267 if c.phase() > phases.public:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
268 # obsolescence marker does not apply to public changeset
17826
46e1a4e24225 obsolete: rename `anysuccessors` into `allsuccessors`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17818
diff changeset
269 succs.update(obsolete.allsuccessors(repo.obsstore,
17827
612db9d7e76a obsolete: have `allsuccessors` takes a list of nodes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17826
diff changeset
270 [c.node()]))
17866
75b43843eb4d bookmark: simplify nodemap check introduced in the previous changeset
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17865
diff changeset
271 known = (n for n in succs if n in nm)
17865
daf32ebfde6b bookmark: prevent crashing when a successor is unknown locally (issue3680)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17827
diff changeset
272 validdests = set(repo.set('%ln::', known))
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
273 validdests.remove(old)
17625
b83c18204c36 bookmarks: avoid redundant creation/assignment of "validdests" in "validdest()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17551
diff changeset
274 return new in validdests
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
275 else:
17627
84f12b832ee8 bookmarks: use "changectx.descendant()" for efficient descendant examination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17625
diff changeset
276 return old.descendant(new)