Mercurial > hg
comparison hgext/share.py @ 23548:141baca16059
share: implement shared bookmark functionality
This does not cause any behavioral change unless a 'bookmarks.shared' marker
file exists. A future change will add UI to create this file when a repository
is shared.
author | Ryan McElroy <rmcelroy@fb.com> |
---|---|
date | Sat, 13 Dec 2014 14:31:55 -0800 |
parents | 5a4d1a6c605f |
children | cd79fb4d75fd |
comparison
equal
deleted
inserted
replaced
23547:21446f4d5c62 | 23548:141baca16059 |
---|---|
4 # GNU General Public License version 2 or any later version. | 4 # GNU General Public License version 2 or any later version. |
5 | 5 |
6 '''share a common history between several working directories''' | 6 '''share a common history between several working directories''' |
7 | 7 |
8 from mercurial.i18n import _ | 8 from mercurial.i18n import _ |
9 from mercurial import cmdutil, hg, util | 9 from mercurial import cmdutil, hg, util, extensions, bookmarks |
10 from mercurial.hg import repository, parseurl | |
11 import errno | |
10 | 12 |
11 cmdtable = {} | 13 cmdtable = {} |
12 command = cmdutil.command(cmdtable) | 14 command = cmdutil.command(cmdtable) |
13 testedwith = 'internal' | 15 testedwith = 'internal' |
14 | 16 |
65 destlock and destlock.release() | 67 destlock and destlock.release() |
66 lock and lock.release() | 68 lock and lock.release() |
67 | 69 |
68 # update store, spath, sopener and sjoin of repo | 70 # update store, spath, sopener and sjoin of repo |
69 repo.unfiltered().__init__(repo.baseui, repo.root) | 71 repo.unfiltered().__init__(repo.baseui, repo.root) |
72 | |
73 def extsetup(ui): | |
74 extensions.wrapfunction(bookmarks.bmstore, 'getbkfile', getbkfile) | |
75 extensions.wrapfunction(bookmarks.bmstore, 'recordchange', recordchange) | |
76 extensions.wrapfunction(bookmarks.bmstore, 'write', write) | |
77 | |
78 def _hassharedbookmarks(repo): | |
79 """Returns whether this repo has shared bookmarks""" | |
80 try: | |
81 repo.vfs.read('bookmarks.shared') | |
82 return True | |
83 except IOError, inst: | |
84 if inst.errno != errno.ENOENT: | |
85 raise | |
86 return False | |
87 | |
88 def _getsrcrepo(repo): | |
89 """ | |
90 Returns the source repository object for a given shared repository. | |
91 If repo is not a shared repository, return None. | |
92 """ | |
93 srcrepo = None | |
94 try: | |
95 # strip because some tools write with newline after | |
96 sharedpath = repo.vfs.read('sharedpath').strip() | |
97 # the sharedpath always ends in the .hg; we want the path to the repo | |
98 source = sharedpath.rsplit('/.hg', 1)[0] | |
99 srcurl, branches = parseurl(source) | |
100 srcrepo = repository(repo.ui, srcurl) | |
101 except IOError, inst: | |
102 if inst.errno != errno.ENOENT: | |
103 raise | |
104 return srcrepo | |
105 | |
106 def getbkfile(orig, self, repo): | |
107 if _hassharedbookmarks(repo): | |
108 srcrepo = _getsrcrepo(repo) | |
109 if srcrepo is not None: | |
110 repo = srcrepo | |
111 return orig(self, repo) | |
112 | |
113 def recordchange(orig, self, tr): | |
114 # Continue with write to local bookmarks file as usual | |
115 orig(self, tr) | |
116 | |
117 if _hassharedbookmarks(self._repo): | |
118 srcrepo = _getsrcrepo(self._repo) | |
119 if srcrepo is not None: | |
120 category = 'share-bookmarks' | |
121 tr.addpostclose(category, lambda tr: self._writerepo(srcrepo)) | |
122 | |
123 def write(orig, self): | |
124 # First write local bookmarks file in case we ever unshare | |
125 orig(self) | |
126 if _hassharedbookmarks(self._repo): | |
127 srcrepo = _getsrcrepo(self._repo) | |
128 if srcrepo is not None: | |
129 self._writerepo(srcrepo) |