annotate mercurial/bookmarks.py @ 32381:b9942bc6b292

localrepo: extract bookmarkheads method to bookmarks.py This method is only used internally by destutil, and it's obscure enough I'm willing to just move it without a deprecation warning, especially since the new method has more constrained functionality. Design-wise I'd also like to get active bookmark handling folded into the bookmark store, so that we don't squirrel away an extra attribute for the active bookmark on the repository object.
author Augie Fackler <augie@google.com>
date Thu, 18 May 2017 16:43:56 -0400
parents 8a32d6352196
children b5613bda454e
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
25917
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
8 from __future__ import absolute_import
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
9
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
10 import errno
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
11
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
12 from .i18n import _
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
13 from .node import (
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
14 bin,
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
15 hex,
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
16 )
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
17 from . import (
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
18 encoding,
29354
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
19 error,
25917
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
20 lock as lockmod,
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
21 obsolete,
31052
0332b8fafd05 bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
22 txnutil,
25917
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
23 util,
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
24 )
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
25
27186
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
26 def _getbkfile(repo):
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
27 """Hook so that extensions that mess with the store can hook bm storage.
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
28
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
29 For core, this just handles wether we should see pending
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
30 bookmarks or the committed ones. Other extensions (like share)
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
31 may need to tweak this behavior further.
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
32 """
31052
0332b8fafd05 bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
33 fp, pending = txnutil.trypending(repo.root, repo.vfs, 'bookmarks')
0332b8fafd05 bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
34 return fp
27186
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
35
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
36 class bmstore(dict):
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
37 """Storage for bookmarks.
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
38
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
39 This object should do all bookmark-related reads and writes, so
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
40 that it's fairly simple to replace the storage underlying
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
41 bookmarks without having to clone the logic surrounding
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
42 bookmarks. This type also should manage the active bookmark, if
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
43 any.
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
44
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
45 This particular bmstore implementation stores bookmarks as
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
46 {hash}\s{name}\n (the same format as localtags) in
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
47 .hg/bookmarks. The mapping is stored as {name: nodeid}.
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
48 """
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
49
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
50 def __init__(self, repo):
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
51 dict.__init__(self)
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
52 self._repo = repo
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
53 try:
27186
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
54 bkfile = _getbkfile(repo)
23360
e06daad65f85 bookmark: read pending data when appropriate
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23317
diff changeset
55 for line in bkfile:
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
56 line = line.strip()
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
57 if not line:
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
58 continue
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
59 if ' ' not in line:
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
60 repo.ui.warn(_('malformed line in .hg/bookmarks: %r\n')
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
61 % line)
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
62 continue
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
63 sha, refspec = line.split(' ', 1)
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
64 refspec = encoding.tolocal(refspec)
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
65 try:
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
66 self[refspec] = repo.changelog.lookup(sha)
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
67 except LookupError:
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
68 pass
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25569
diff changeset
69 except IOError as inst:
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
70 if inst.errno != errno.ENOENT:
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
71 raise
27187
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
72 self._clean = True
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
73 self._active = _readactive(repo, self)
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
74 self._aclean = True
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
75
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
76 @property
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
77 def active(self):
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
78 return self._active
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
79
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
80 @active.setter
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
81 def active(self, mark):
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
82 if mark is not None and mark not in self:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
83 raise AssertionError('bookmark %s does not exist!' % mark)
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
84
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
85 self._active = mark
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
86 self._aclean = False
27187
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
87
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
88 def __setitem__(self, *args, **kwargs):
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
89 self._clean = False
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
90 return dict.__setitem__(self, *args, **kwargs)
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
91
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
92 def __delitem__(self, key):
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
93 self._clean = False
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
94 return dict.__delitem__(self, key)
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
95
22665
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
96 def recordchange(self, tr):
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
97 """record that bookmarks have been changed in a transaction
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
98
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
99 The transaction is then responsible for updating the file content."""
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
100 tr.addfilegenerator('bookmarks', ('bookmarks',), self._write,
23317
197e17be5407 transaction: use 'location' instead of 'vfs' objects for file generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23199
diff changeset
101 location='plain')
22941
da2758c0aca0 bookmarks: inform transaction-related hooks that some bookmarks were moved
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22667
diff changeset
102 tr.hookargs['bookmark_moved'] = '1'
22665
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
103
23469
65e48b8d20f5 bookmarks: factor out repository lookup from writing bookmarks file
Ryan McElroy <rmcelroy@fb.com>
parents: 23458
diff changeset
104 def _writerepo(self, repo):
65e48b8d20f5 bookmarks: factor out repository lookup from writing bookmarks file
Ryan McElroy <rmcelroy@fb.com>
parents: 23458
diff changeset
105 """Factored out for extensibility"""
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
106 rbm = repo._bookmarks
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
107 if rbm.active not in self:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
108 rbm.active = None
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
109 rbm._writeactive()
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
110
27799
24b4dbb16c60 with: use context manager for wlock in _writerepo
Bryan O'Sullivan <bryano@fb.com>
parents: 27698
diff changeset
111 with repo.wlock():
29300
f92afd23a099 bookmarks: make writing files out avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29084
diff changeset
112 file_ = repo.vfs('bookmarks', 'w', atomictemp=True,
f92afd23a099 bookmarks: make writing files out avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29084
diff changeset
113 checkambig=True)
27188
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
114 try:
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
115 self._write(file_)
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
116 except: # re-raises
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
117 file_.discard()
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
118 raise
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
119 finally:
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
120 file_.close()
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
121
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
122 def _writeactive(self):
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
123 if self._aclean:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
124 return
27800
1c5f2c2c046b with: use context manager for wlock in _writeactive
Bryan O'Sullivan <bryano@fb.com>
parents: 27799
diff changeset
125 with self._repo.wlock():
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
126 if self._active is not None:
29300
f92afd23a099 bookmarks: make writing files out avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29084
diff changeset
127 f = self._repo.vfs('bookmarks.current', 'w', atomictemp=True,
f92afd23a099 bookmarks: make writing files out avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29084
diff changeset
128 checkambig=True)
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
129 try:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
130 f.write(encoding.fromlocal(self._active))
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
131 finally:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
132 f.close()
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
133 else:
31544
8a32d6352196 bookmarks: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31052
diff changeset
134 self._repo.vfs.tryunlink('bookmarks.current')
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
135 self._aclean = True
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
136
22664
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
137 def _write(self, fp):
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
138 for name, node in self.iteritems():
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
139 fp.write("%s %s\n" % (hex(node), encoding.fromlocal(name)))
27187
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
140 self._clean = True
29066
e6f490e32863 bookmarks: properly invalidate volatile sets when writing bookmarks
Augie Fackler <augie@google.com>
parents: 28182
diff changeset
141 self._repo.invalidatevolatilesets()
22664
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
142
28182
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
143 def expandname(self, bname):
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
144 if bname == '.':
29354
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
145 if self.active:
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
146 return self.active
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
147 else:
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
148 raise error.Abort(_("no active bookmark"))
28182
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
149 return bname
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
150
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
151 def _readactive(repo, marks):
24946
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
152 """
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
153 Get the active bookmark. We can have an active bookmark that updates
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
154 itself as we commit. This function returns the name of that bookmark.
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
155 It is stored in .hg/bookmarks.current
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
156 """
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
157 mark = None
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
158 try:
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23469
diff changeset
159 file = repo.vfs('bookmarks.current')
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25569
diff changeset
160 except IOError as inst:
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
161 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
162 raise
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
163 return None
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
164 try:
27685
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
165 # No readline() in osutil.posixfile, reading everything is
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
166 # cheap.
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
167 # Note that it's possible for readlines() here to raise
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
168 # IOError, since we might be reading the active mark over
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
169 # static-http which only tries to load the file when we try
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
170 # to read from it.
13381
d073468e3c5f bookmarks: read current bookmark as utf-8 and convert it to local
David Soria Parra <dsp@php.net>
parents: 13354
diff changeset
171 mark = encoding.tolocal((file.readlines() or [''])[0])
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
172 if mark == '' or mark not in marks:
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
173 mark = None
27685
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
174 except IOError as inst:
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
175 if inst.errno != errno.ENOENT:
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
176 raise
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
177 return None
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
178 finally:
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
179 file.close()
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
180 return mark
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
181
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
182 def activate(repo, mark):
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
183 """
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
184 Set the given bookmark to be 'active', meaning that this bookmark will
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
185 follow new commits that are made.
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
186 The name is recorded in .hg/bookmarks.current
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
187 """
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
188 repo._bookmarks.active = mark
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
189 repo._bookmarks._writeactive()
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
190
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
191 def deactivate(repo):
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
192 """
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26520
diff changeset
193 Unset the active bookmark in this repository.
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
194 """
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
195 repo._bookmarks.active = None
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
196 repo._bookmarks._writeactive()
16191
7c75924a6926 update: delete bookmarks.current when explicitly updating to a rev (issue3276)
Idan Kamara <idankk86@gmail.com>
parents: 15984
diff changeset
197
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
198 def isactivewdirparent(repo):
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
199 """
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
200 Tell whether the 'active' bookmark (the one that follows new commits)
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
201 points to one of the parents of the current working directory (wdir).
18471
2096e025a728 update: update to current bookmark if it moved out from under us (issue3682)
Kevin Bullock <kbullock@ringworld.org>
parents: 18363
diff changeset
202
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
203 While this is normally the case, it can on occasion be false; for example,
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
204 immediately after a pull, the active bookmark can be moved to point
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
205 to a place different than the wdir. This is solved by running `hg update`.
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
206 """
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
207 mark = repo._activebookmark
18471
2096e025a728 update: update to current bookmark if it moved out from under us (issue3682)
Kevin Bullock <kbullock@ringworld.org>
parents: 18363
diff changeset
208 marks = repo._bookmarks
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
209 parents = [p.node() for p in repo[None].parents()]
18471
2096e025a728 update: update to current bookmark if it moved out from under us (issue3682)
Kevin Bullock <kbullock@ringworld.org>
parents: 18363
diff changeset
210 return (mark in marks and marks[mark] in parents)
2096e025a728 update: update to current bookmark if it moved out from under us (issue3682)
Kevin Bullock <kbullock@ringworld.org>
parents: 18363
diff changeset
211
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
212 def deletedivergent(repo, deletefrom, bm):
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
213 '''Delete divergent versions of bm on nodes in deletefrom.
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
214
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
215 Return True if at least one bookmark was deleted, False otherwise.'''
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
216 deleted = False
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
217 marks = repo._bookmarks
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
218 divergent = [b for b in marks if b.split('@', 1)[0] == bm.split('@', 1)[0]]
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
219 for mark in divergent:
21843
92666a869ea4 bookmarks: avoid deleting primary bookmarks on rebase
Matt Mackall <mpm@selenic.com>
parents: 20352
diff changeset
220 if mark == '@' or '@' not in mark:
92666a869ea4 bookmarks: avoid deleting primary bookmarks on rebase
Matt Mackall <mpm@selenic.com>
parents: 20352
diff changeset
221 # can't be divergent by definition
92666a869ea4 bookmarks: avoid deleting primary bookmarks on rebase
Matt Mackall <mpm@selenic.com>
parents: 20352
diff changeset
222 continue
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
223 if mark and marks[mark] in deletefrom:
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
224 if mark != bm:
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
225 del marks[mark]
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
226 deleted = True
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
227 return deleted
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
228
32381
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
229 def headsforactive(repo):
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
230 """Given a repo with an active bookmark, return divergent bookmark nodes.
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
231
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
232 Args:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
233 repo: A repository with an active bookmark.
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
234
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
235 Returns:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
236 A list of binary node ids that is the full list of other
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
237 revisions with bookmarks divergent from the active bookmark. If
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
238 there were no divergent bookmarks, then this list will contain
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
239 only one entry.
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
240 """
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
241 if not repo._activebookmark:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
242 raise ValueError(
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
243 'headsforactive() only makes sense with an active bookmark')
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
244 name = repo._activebookmark.split('@', 1)[0]
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
245 heads = []
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
246 for mark, n in repo._bookmarks.iteritems():
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
247 if mark.split('@', 1)[0] == name:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
248 heads.append(n)
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
249 return heads
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
250
19523
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
251 def calculateupdate(ui, repo, checkout):
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
252 '''Return a tuple (targetrev, movemarkfrom) indicating the rev to
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
253 check out and where to move the active bookmark from, if needed.'''
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
254 movemarkfrom = None
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
255 if checkout is None:
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
256 activemark = repo._activebookmark
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
257 if isactivewdirparent(repo):
19523
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
258 movemarkfrom = repo['.'].node()
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
259 elif activemark:
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
260 ui.status(_("updating to active bookmark %s\n") % activemark)
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
261 checkout = activemark
19523
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
262 return (checkout, movemarkfrom)
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
263
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
264 def update(repo, parents, node):
19110
741d94aa92e4 bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley <sean.michael.farley@gmail.com>
parents: 18984
diff changeset
265 deletefrom = parents
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
266 marks = repo._bookmarks
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
267 update = False
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
268 active = marks.active
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
269 if not active:
16706
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
270 return False
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
271
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
272 if marks[active] in parents:
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
273 new = repo[node]
19110
741d94aa92e4 bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley <sean.michael.farley@gmail.com>
parents: 18984
diff changeset
274 divs = [repo[b] for b in marks
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
275 if b.split('@', 1)[0] == active.split('@', 1)[0]]
19110
741d94aa92e4 bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley <sean.michael.farley@gmail.com>
parents: 18984
diff changeset
276 anc = repo.changelog.ancestors([new.rev()])
741d94aa92e4 bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley <sean.michael.farley@gmail.com>
parents: 18984
diff changeset
277 deletefrom = [b.node() for b in divs if b.rev() in anc or b == new]
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
278 if validdest(repo, repo[marks[active]], new):
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
279 marks[active] = new.node()
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
280 update = True
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
281
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
282 if deletedivergent(repo, deletefrom, active):
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
283 update = True
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
284
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
285 if update:
26999
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
286 lock = tr = None
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
287 try:
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
288 lock = repo.lock()
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
289 tr = repo.transaction('bookmark')
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
290 marks.recordchange(tr)
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
291 tr.close()
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
292 finally:
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
293 lockmod.release(tr, lock)
15621
013688350c7d bookmarks: update and updatecurrentbookmark return status
Kevin Bullock <kbullock@ringworld.org>
parents: 15614
diff changeset
294 return update
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
295
30481
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
296 def listbinbookmarks(repo):
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
297 # We may try to list bookmarks on a repo type that does not
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
298 # support it (e.g., statichttprepository).
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
299 marks = getattr(repo, '_bookmarks', {})
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
300
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
301 hasnode = repo.changelog.hasnode
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
302 for k, v in marks.iteritems():
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
303 # don't expose local divergent bookmarks
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
304 if hasnode(v) and ('@' not in k or k.endswith('@')):
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
305 yield k, v
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
306
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
307 def listbookmarks(repo):
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
308 d = {}
30482
55ec13c82ea0 bookmarks: use listbinbookmarks() in listbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 30481
diff changeset
309 for book, node in listbinbookmarks(repo):
55ec13c82ea0 bookmarks: use listbinbookmarks() in listbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 30481
diff changeset
310 d[book] = hex(node)
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
311 return d
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
312
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
313 def pushbookmark(repo, key, old, new):
22667
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
314 w = l = tr = None
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
315 try:
22667
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
316 w = repo.wlock()
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
317 l = repo.lock()
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
318 tr = repo.transaction('bookmarks')
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
319 marks = repo._bookmarks
22364
5c153c69fdb2 bookmarks: allow pushkey if new equals current
Durham Goode <durham@fb.com>
parents: 21843
diff changeset
320 existing = hex(marks.get(key, ''))
5c153c69fdb2 bookmarks: allow pushkey if new equals current
Durham Goode <durham@fb.com>
parents: 21843
diff changeset
321 if existing != old and existing != new:
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
322 return False
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
323 if new == '':
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
324 del marks[key]
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
325 else:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
326 if new not in repo:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
327 return False
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
328 marks[key] = repo[new].node()
22667
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
329 marks.recordchange(tr)
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
330 tr.close()
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
331 return True
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
332 finally:
22667
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
333 lockmod.release(tr, l, w)
13354
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
334
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
335 def comparebookmarks(repo, srcmarks, dstmarks, targets=None):
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
336 '''Compare bookmarks between srcmarks and dstmarks
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
337
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
338 This returns tuple "(addsrc, adddst, advsrc, advdst, diverge,
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
339 differ, invalid)", each are list of bookmarks below:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
340
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
341 :addsrc: added on src side (removed on dst side, perhaps)
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
342 :adddst: added on dst side (removed on src side, perhaps)
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
343 :advsrc: advanced on src side
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
344 :advdst: advanced on dst side
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
345 :diverge: diverge
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
346 :differ: changed, but changeset referred on src is unknown on dst
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
347 :invalid: unknown on both side
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
348 :same: same on both side
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
349
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
350 Each elements of lists in result tuple is tuple "(bookmark name,
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
351 changeset ID on source side, changeset ID on destination
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
352 side)". Each changeset IDs are 40 hexadecimal digit string or
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
353 None.
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
354
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
355 Changeset IDs of tuples in "addsrc", "adddst", "differ" or
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
356 "invalid" list may be unknown for repo.
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
357
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
358 If "targets" is specified, only bookmarks listed in it are
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
359 examined.
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
360 '''
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
361
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
362 if targets:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
363 bset = set(targets)
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
364 else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
365 srcmarkset = set(srcmarks)
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
366 dstmarkset = set(dstmarks)
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
367 bset = srcmarkset | dstmarkset
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
368
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
369 results = ([], [], [], [], [], [], [], [])
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
370 addsrc = results[0].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
371 adddst = results[1].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
372 advsrc = results[2].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
373 advdst = results[3].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
374 diverge = results[4].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
375 differ = results[5].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
376 invalid = results[6].append
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
377 same = results[7].append
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
378
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
379 for b in sorted(bset):
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
380 if b not in srcmarks:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
381 if b in dstmarks:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
382 adddst((b, None, dstmarks[b]))
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
383 else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
384 invalid((b, None, None))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
385 elif b not in dstmarks:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
386 addsrc((b, srcmarks[b], None))
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
387 else:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
388 scid = srcmarks[b]
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
389 dcid = dstmarks[b]
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
390 if scid == dcid:
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
391 same((b, scid, dcid))
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
392 elif scid in repo and dcid in repo:
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
393 sctx = repo[scid]
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
394 dctx = repo[dcid]
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
395 if sctx.rev() < dctx.rev():
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
396 if validdest(repo, sctx, dctx):
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
397 advdst((b, scid, dcid))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
398 else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
399 diverge((b, scid, dcid))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
400 else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
401 if validdest(repo, dctx, sctx):
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
402 advsrc((b, scid, dcid))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
403 else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
404 diverge((b, scid, dcid))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
405 else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
406 # it is too expensive to examine in detail, in this case
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
407 differ((b, scid, dcid))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
408
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
409 return results
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
410
24355
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
411 def _diverge(ui, b, path, localmarks, remotenode):
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
412 '''Return appropriate diverged bookmark for specified ``path``
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
413
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
414 This returns None, if it is failed to assign any divergent
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
415 bookmark name.
24355
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
416
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
417 This reuses already existing one with "@number" suffix, if it
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
418 refers ``remotenode``.
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
419 '''
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
420 if b == '@':
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
421 b = ''
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
422 # try to use an @pathalias suffix
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
423 # if an @pathalias already exists, we overwrite (update) it
22629
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
424 if path.startswith("file:"):
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
425 path = util.url(path).path
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
426 for p, u in ui.configitems("paths"):
22629
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
427 if u.startswith("file:"):
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
428 u = util.url(u).path
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
429 if path == u:
24354
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
430 return '%s@%s' % (b, p)
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
431
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
432 # assign a unique "@number" suffix newly
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
433 for x in range(1, 100):
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
434 n = '%s@%d' % (b, x)
24355
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
435 if n not in localmarks or localmarks[n] == remotenode:
24354
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
436 return n
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
437
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
438 return None
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
439
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
440 def unhexlifybookmarks(marks):
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
441 binremotemarks = {}
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
442 for name, node in marks.items():
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
443 binremotemarks[name] = bin(node)
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
444 return binremotemarks
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
445
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22665
diff changeset
446 def updatefromremote(ui, repo, remotemarks, path, trfunc, explicit=()):
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
447 ui.debug("checking for updated bookmarks\n")
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
448 localmarks = repo._bookmarks
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
449 (addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
450 ) = comparebookmarks(repo, remotemarks, localmarks)
15614
260a6449d83a bookmarks: mark divergent bookmarks with book@pathalias when source in [paths]
Matt Mackall <mpm@selenic.com>
parents: 15613
diff changeset
451
22644
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
452 status = ui.status
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
453 warn = ui.warn
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
454 if ui.configbool('ui', 'quietbookmarkmove', False):
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
455 status = warn = ui.debug
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
456
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
457 explicit = set(explicit)
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
458 changed = []
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
459 for b, scid, dcid in addsrc:
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
460 if scid in repo: # add remote bookmarks for changes we already have
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
461 changed.append((b, scid, status,
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
462 _("adding remote bookmark %s\n") % (b)))
25564
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
463 elif b in explicit:
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
464 explicit.remove(b)
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
465 ui.warn(_("remote bookmark %s points to locally missing %s\n")
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
466 % (b, hex(scid)[:12]))
25564
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
467
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
468 for b, scid, dcid in advsrc:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
469 changed.append((b, scid, status,
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
470 _("updating bookmark %s\n") % (b)))
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
471 # remove normal movement from explicit set
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
472 explicit.difference_update(d[0] for d in changed)
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
473
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
474 for b, scid, dcid in diverge:
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
475 if b in explicit:
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
476 explicit.discard(b)
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
477 changed.append((b, scid, status,
23199
c35ffa4249ca bookmarks: fix formatting of exchange message (issue4439)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23081
diff changeset
478 _("importing bookmark %s\n") % (b)))
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
479 else:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
480 db = _diverge(ui, b, path, localmarks, scid)
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
481 if db:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
482 changed.append((db, scid, warn,
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
483 _("divergent bookmark %s stored as %s\n") %
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
484 (b, db)))
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
485 else:
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
486 warn(_("warning: failed to assign numbered name "
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
487 "to divergent bookmark %s\n") % (b))
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
488 for b, scid, dcid in adddst + advdst:
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
489 if b in explicit:
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
490 explicit.discard(b)
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
491 changed.append((b, scid, status,
23199
c35ffa4249ca bookmarks: fix formatting of exchange message (issue4439)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23081
diff changeset
492 _("importing bookmark %s\n") % (b)))
25564
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
493 for b, scid, dcid in differ:
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
494 if b in explicit:
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
495 explicit.remove(b)
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
496 ui.warn(_("remote bookmark %s points to locally missing %s\n")
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
497 % (b, hex(scid)[:12]))
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
498
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
499 if changed:
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22665
diff changeset
500 tr = trfunc()
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
501 for b, node, writer, msg in sorted(changed):
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
502 localmarks[b] = node
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
503 writer(msg)
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22665
diff changeset
504 localmarks.recordchange(tr)
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
505
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
506 def incoming(ui, repo, other):
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
507 '''Show bookmarks incoming from other to repo
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
508 '''
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
509 ui.status(_("searching for changed bookmarks\n"))
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
510
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
511 remotemarks = unhexlifybookmarks(other.listkeys('bookmarks'))
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
512 r = comparebookmarks(repo, remotemarks, repo._bookmarks)
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
513 addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = r
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
514
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
515 incomings = []
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
516 if ui.debugflag:
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
517 getid = lambda id: id
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
518 else:
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
519 getid = lambda id: id[:12]
24660
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
520 if ui.verbose:
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
521 def add(b, id, st):
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
522 incomings.append(" %-25s %s %s\n" % (b, getid(id), st))
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
523 else:
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
524 def add(b, id, st):
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
525 incomings.append(" %-25s %s\n" % (b, getid(id)))
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
526 for b, scid, dcid in addsrc:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
527 # i18n: "added" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
528 add(b, hex(scid), _('added'))
24657
3d7c512b258d bookmarks: show incoming bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24400
diff changeset
529 for b, scid, dcid in advsrc:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
530 # i18n: "advanced" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
531 add(b, hex(scid), _('advanced'))
24657
3d7c512b258d bookmarks: show incoming bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24400
diff changeset
532 for b, scid, dcid in diverge:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
533 # i18n: "diverged" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
534 add(b, hex(scid), _('diverged'))
24657
3d7c512b258d bookmarks: show incoming bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24400
diff changeset
535 for b, scid, dcid in differ:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
536 # i18n: "changed" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
537 add(b, hex(scid), _('changed'))
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
538
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
539 if not incomings:
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
540 ui.status(_("no changed bookmarks found\n"))
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
541 return 1
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
542
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
543 for s in sorted(incomings):
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
544 ui.write(s)
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
545
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
546 return 0
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
547
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
548 def outgoing(ui, repo, other):
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
549 '''Show bookmarks outgoing from repo to other
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
550 '''
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
551 ui.status(_("searching for changed bookmarks\n"))
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
552
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
553 remotemarks = unhexlifybookmarks(other.listkeys('bookmarks'))
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
554 r = comparebookmarks(repo, repo._bookmarks, remotemarks)
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
555 addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = r
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
556
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
557 outgoings = []
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
558 if ui.debugflag:
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
559 getid = lambda id: id
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
560 else:
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
561 getid = lambda id: id[:12]
24661
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
562 if ui.verbose:
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
563 def add(b, id, st):
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
564 outgoings.append(" %-25s %s %s\n" % (b, getid(id), st))
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
565 else:
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
566 def add(b, id, st):
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
567 outgoings.append(" %-25s %s\n" % (b, getid(id)))
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
568 for b, scid, dcid in addsrc:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
569 # i18n: "added refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
570 add(b, hex(scid), _('added'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
571 for b, scid, dcid in adddst:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
572 # i18n: "deleted" refers to a bookmark
24661
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
573 add(b, ' ' * 40, _('deleted'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
574 for b, scid, dcid in advsrc:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
575 # i18n: "advanced" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
576 add(b, hex(scid), _('advanced'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
577 for b, scid, dcid in diverge:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
578 # i18n: "diverged" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
579 add(b, hex(scid), _('diverged'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
580 for b, scid, dcid in differ:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
581 # i18n: "changed" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
582 add(b, hex(scid), _('changed'))
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
583
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
584 if not outgoings:
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
585 ui.status(_("no changed bookmarks found\n"))
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
586 return 1
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
587
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
588 for s in sorted(outgoings):
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
589 ui.write(s)
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
590
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
591 return 0
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
592
24400
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
593 def summary(repo, other):
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
594 '''Compare bookmarks between repo and other for "hg summary" output
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
595
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
596 This returns "(# of incoming, # of outgoing)" tuple.
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
597 '''
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
598 remotemarks = unhexlifybookmarks(other.listkeys('bookmarks'))
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
599 r = comparebookmarks(repo, remotemarks, repo._bookmarks)
24400
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
600 addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = r
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
601 return (len(addsrc), len(adddst))
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
602
17550
fc530080013b bookmarks: extract valid destination logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17425
diff changeset
603 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
604 """Is the new bookmark destination a valid update from the old one"""
18008
cf91b36f368c clfilter: `bookmark.validdest` should run on unfiltered repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
605 repo = repo.unfiltered()
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
606 if old == new:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
607 # 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
608 return False
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
609 elif not old:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
610 # 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
611 # (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
612 return True
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
613 elif repo.obsstore:
18984
efef056b1ae9 obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18851
diff changeset
614 return new.node() in obsolete.foreground(repo, [old.node()])
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
615 else:
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23877
diff changeset
616 # still an independent clause as it is lazier (and therefore faster)
17627
84f12b832ee8 bookmarks: use "changectx.descendant()" for efficient descendant examination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17625
diff changeset
617 return old.descendant(new)