Show More
@@ -0,0 +1,73 | |||||
|
1 | # Mercurial bookmark support code | |||
|
2 | # | |||
|
3 | # Copyright 2008 David Soria Parra <dsp@php.net> | |||
|
4 | # | |||
|
5 | # This software may be used and distributed according to the terms of the | |||
|
6 | # GNU General Public License version 2 or any later version. | |||
|
7 | ||||
|
8 | from mercurial.i18n import _ | |||
|
9 | from mercurial.node import nullid, nullrev, bin, hex, short | |||
|
10 | from mercurial import encoding | |||
|
11 | import os | |||
|
12 | ||||
|
13 | def write(repo): | |||
|
14 | '''Write bookmarks | |||
|
15 | ||||
|
16 | Write the given bookmark => hash dictionary to the .hg/bookmarks file | |||
|
17 | in a format equal to those of localtags. | |||
|
18 | ||||
|
19 | We also store a backup of the previous state in undo.bookmarks that | |||
|
20 | can be copied back on rollback. | |||
|
21 | ''' | |||
|
22 | refs = repo._bookmarks | |||
|
23 | ||||
|
24 | try: | |||
|
25 | bms = repo.opener('bookmarks').read() | |||
|
26 | except IOError: | |||
|
27 | bms = '' | |||
|
28 | repo.opener('undo.bookmarks', 'w').write(bms) | |||
|
29 | ||||
|
30 | if repo._bookmarkcurrent not in refs: | |||
|
31 | setcurrent(repo, None) | |||
|
32 | wlock = repo.wlock() | |||
|
33 | try: | |||
|
34 | file = repo.opener('bookmarks', 'w', atomictemp=True) | |||
|
35 | for refspec, node in refs.iteritems(): | |||
|
36 | file.write("%s %s\n" % (hex(node), encoding.fromlocal(refspec))) | |||
|
37 | file.rename() | |||
|
38 | ||||
|
39 | # touch 00changelog.i so hgweb reloads bookmarks (no lock needed) | |||
|
40 | try: | |||
|
41 | os.utime(repo.sjoin('00changelog.i'), None) | |||
|
42 | except OSError: | |||
|
43 | pass | |||
|
44 | ||||
|
45 | finally: | |||
|
46 | wlock.release() | |||
|
47 | ||||
|
48 | def setcurrent(repo, mark): | |||
|
49 | '''Set the name of the bookmark that we are currently on | |||
|
50 | ||||
|
51 | Set the name of the bookmark that we are on (hg update <bookmark>). | |||
|
52 | The name is recorded in .hg/bookmarks.current | |||
|
53 | ''' | |||
|
54 | current = repo._bookmarkcurrent | |||
|
55 | if current == mark: | |||
|
56 | return | |||
|
57 | ||||
|
58 | refs = repo._bookmarks | |||
|
59 | ||||
|
60 | # do not update if we do update to a rev equal to the current bookmark | |||
|
61 | if (mark and mark not in refs and | |||
|
62 | current and refs[current] == repo.changectx('.').node()): | |||
|
63 | return | |||
|
64 | if mark not in refs: | |||
|
65 | mark = '' | |||
|
66 | wlock = repo.wlock() | |||
|
67 | try: | |||
|
68 | file = repo.opener('bookmarks.current', 'w', atomictemp=True) | |||
|
69 | file.write(mark) | |||
|
70 | file.rename() | |||
|
71 | finally: | |||
|
72 | wlock.release() | |||
|
73 | repo._bookmarkcurrent = mark |
@@ -32,70 +32,9 from mercurial.i18n import _ | |||||
32 | from mercurial.node import nullid, nullrev, bin, hex, short |
|
32 | from mercurial.node import nullid, nullrev, bin, hex, short | |
33 | from mercurial import util, commands, repair, extensions, pushkey, hg, url |
|
33 | from mercurial import util, commands, repair, extensions, pushkey, hg, url | |
34 | from mercurial import revset, encoding |
|
34 | from mercurial import revset, encoding | |
|
35 | from mercurial import bookmarks | |||
35 | import os |
|
36 | import os | |
36 |
|
37 | |||
37 | def write(repo): |
|
|||
38 | '''Write bookmarks |
|
|||
39 |
|
||||
40 | Write the given bookmark => hash dictionary to the .hg/bookmarks file |
|
|||
41 | in a format equal to those of localtags. |
|
|||
42 |
|
||||
43 | We also store a backup of the previous state in undo.bookmarks that |
|
|||
44 | can be copied back on rollback. |
|
|||
45 | ''' |
|
|||
46 | refs = repo._bookmarks |
|
|||
47 |
|
||||
48 | try: |
|
|||
49 | bms = repo.opener('bookmarks').read() |
|
|||
50 | except IOError: |
|
|||
51 | bms = '' |
|
|||
52 | repo.opener('undo.bookmarks', 'w').write(bms) |
|
|||
53 |
|
||||
54 | if repo._bookmarkcurrent not in refs: |
|
|||
55 | setcurrent(repo, None) |
|
|||
56 | wlock = repo.wlock() |
|
|||
57 | try: |
|
|||
58 | file = repo.opener('bookmarks', 'w', atomictemp=True) |
|
|||
59 | for refspec, node in refs.iteritems(): |
|
|||
60 | file.write("%s %s\n" % (hex(node), encoding.fromlocal(refspec))) |
|
|||
61 | file.rename() |
|
|||
62 |
|
||||
63 | # touch 00changelog.i so hgweb reloads bookmarks (no lock needed) |
|
|||
64 | try: |
|
|||
65 | os.utime(repo.sjoin('00changelog.i'), None) |
|
|||
66 | except OSError: |
|
|||
67 | pass |
|
|||
68 |
|
||||
69 | finally: |
|
|||
70 | wlock.release() |
|
|||
71 |
|
||||
72 | def setcurrent(repo, mark): |
|
|||
73 | '''Set the name of the bookmark that we are currently on |
|
|||
74 |
|
||||
75 | Set the name of the bookmark that we are on (hg update <bookmark>). |
|
|||
76 | The name is recorded in .hg/bookmarks.current |
|
|||
77 | ''' |
|
|||
78 | current = repo._bookmarkcurrent |
|
|||
79 | if current == mark: |
|
|||
80 | return |
|
|||
81 |
|
||||
82 | refs = repo._bookmarks |
|
|||
83 |
|
||||
84 | # do not update if we do update to a rev equal to the current bookmark |
|
|||
85 | if (mark and mark not in refs and |
|
|||
86 | current and refs[current] == repo.changectx('.').node()): |
|
|||
87 | return |
|
|||
88 | if mark not in refs: |
|
|||
89 | mark = '' |
|
|||
90 | wlock = repo.wlock() |
|
|||
91 | try: |
|
|||
92 | file = repo.opener('bookmarks.current', 'w', atomictemp=True) |
|
|||
93 | file.write(mark) |
|
|||
94 | file.rename() |
|
|||
95 | finally: |
|
|||
96 | wlock.release() |
|
|||
97 | repo._bookmarkcurrent = mark |
|
|||
98 |
|
||||
99 | def bookmark(ui, repo, mark=None, rev=None, force=False, delete=False, rename=None): |
|
38 | def bookmark(ui, repo, mark=None, rev=None, force=False, delete=False, rename=None): | |
100 | '''track a line of development with movable markers |
|
39 | '''track a line of development with movable markers | |
101 |
|
40 | |||
@@ -127,8 +66,8 def bookmark(ui, repo, mark=None, rev=No | |||||
127 | marks[mark] = marks[rename] |
|
66 | marks[mark] = marks[rename] | |
128 | del marks[rename] |
|
67 | del marks[rename] | |
129 | if repo._bookmarkcurrent == rename: |
|
68 | if repo._bookmarkcurrent == rename: | |
130 | setcurrent(repo, mark) |
|
69 | bookmarks.setcurrent(repo, mark) | |
131 | write(repo) |
|
70 | bookmarks.write(repo) | |
132 | return |
|
71 | return | |
133 |
|
72 | |||
134 | if delete: |
|
73 | if delete: | |
@@ -137,9 +76,9 def bookmark(ui, repo, mark=None, rev=No | |||||
137 | if mark not in marks: |
|
76 | if mark not in marks: | |
138 | raise util.Abort(_("a bookmark of this name does not exist")) |
|
77 | raise util.Abort(_("a bookmark of this name does not exist")) | |
139 | if mark == repo._bookmarkcurrent: |
|
78 | if mark == repo._bookmarkcurrent: | |
140 | setcurrent(repo, None) |
|
79 | bookmarks.setcurrent(repo, None) | |
141 | del marks[mark] |
|
80 | del marks[mark] | |
142 | write(repo) |
|
81 | bookmarks.write(repo) | |
143 | return |
|
82 | return | |
144 |
|
83 | |||
145 | if mark is not None: |
|
84 | if mark is not None: | |
@@ -159,8 +98,8 def bookmark(ui, repo, mark=None, rev=No | |||||
159 | marks[mark] = repo.lookup(rev) |
|
98 | marks[mark] = repo.lookup(rev) | |
160 | else: |
|
99 | else: | |
161 | marks[mark] = repo.changectx('.').node() |
|
100 | marks[mark] = repo.changectx('.').node() | |
162 | setcurrent(repo, mark) |
|
101 | bookmarks.setcurrent(repo, mark) | |
163 | write(repo) |
|
102 | bookmarks.write(repo) | |
164 | return |
|
103 | return | |
165 |
|
104 | |||
166 | if mark is None: |
|
105 | if mark is None: | |
@@ -218,7 +157,7 def strip(oldstrip, ui, repo, node, back | |||||
218 | if len(update) > 0: |
|
157 | if len(update) > 0: | |
219 | for m in update: |
|
158 | for m in update: | |
220 | marks[m] = repo.changectx('.').node() |
|
159 | marks[m] = repo.changectx('.').node() | |
221 | write(repo) |
|
160 | bookmarks.write(repo) | |
222 |
|
161 | |||
223 | def reposetup(ui, repo): |
|
162 | def reposetup(ui, repo): | |
224 | if not repo.local(): |
|
163 | if not repo.local(): | |
@@ -290,7 +229,7 def reposetup(ui, repo): | |||||
290 | marks[mark] = node |
|
229 | marks[mark] = node | |
291 | update = True |
|
230 | update = True | |
292 | if update: |
|
231 | if update: | |
293 | write(self) |
|
232 | bookmarks.write(self) | |
294 |
|
233 | |||
295 | def commitctx(self, ctx, error=False): |
|
234 | def commitctx(self, ctx, error=False): | |
296 | """Add a revision to the repository and |
|
235 | """Add a revision to the repository and | |
@@ -331,7 +270,7 def reposetup(ui, repo): | |||||
331 | self.ui.warn(_("not updating divergent" |
|
270 | self.ui.warn(_("not updating divergent" | |
332 | " bookmark %s\n") % k) |
|
271 | " bookmark %s\n") % k) | |
333 | if changed: |
|
272 | if changed: | |
334 | write(repo) |
|
273 | bookmarks.write(repo) | |
335 |
|
274 | |||
336 | return result |
|
275 | return result | |
337 |
|
276 | |||
@@ -405,7 +344,7 def pushbookmark(repo, key, old, new): | |||||
405 | if new not in repo: |
|
344 | if new not in repo: | |
406 | return False |
|
345 | return False | |
407 | marks[key] = repo[new].node() |
|
346 | marks[key] = repo[new].node() | |
408 | write(repo) |
|
347 | bookmarks.write(repo) | |
409 | return True |
|
348 | return True | |
410 | finally: |
|
349 | finally: | |
411 | w.release() |
|
350 | w.release() | |
@@ -432,7 +371,7 def pull(oldpull, ui, repo, source="defa | |||||
432 | # explicit pull overrides local bookmark if any |
|
371 | # explicit pull overrides local bookmark if any | |
433 | ui.status(_("importing bookmark %s\n") % b) |
|
372 | ui.status(_("importing bookmark %s\n") % b) | |
434 | repo._bookmarks[b] = repo[rb[b]].node() |
|
373 | repo._bookmarks[b] = repo[rb[b]].node() | |
435 | write(repo) |
|
374 | bookmarks.write(repo) | |
436 |
|
375 | |||
437 | return result |
|
376 | return result | |
438 |
|
377 | |||
@@ -542,7 +481,7 def updatecurbookmark(orig, ui, repo, *a | |||||
542 | rev = opts['rev'] |
|
481 | rev = opts['rev'] | |
543 | if not rev and len(args) > 0: |
|
482 | if not rev and len(args) > 0: | |
544 | rev = args[0] |
|
483 | rev = args[0] | |
545 | setcurrent(repo, rev) |
|
484 | bookmarks.setcurrent(repo, rev) | |
546 | return res |
|
485 | return res | |
547 |
|
486 | |||
548 | def bmrevset(repo, subset, x): |
|
487 | def bmrevset(repo, subset, x): |
General Comments 0
You need to be logged in to leave comments.
Login now