Mercurial > hg > mercurial-source
annotate hgext/share.py @ 31831:0332b8fafd05
bookmarks: check HG_PENDING strictly
Before this patch, checking HG_PENDING in bookmarks.py might cause
unintentional reading unrelated '.hg/bookmarks.pending' in, because it
just examines existence of HG_PENDING environment variable.
This patch uses txnutil.trypending() to check HG_PENDING strictly.
This patch also changes share extension.
Enabling share extension (+ bookmark sharing) makes
bookmarks._getbkfile() receive repo to be shared (= "srcrepo"). On the
other hand, HG_PENDING always refers current working repo (=
"currepo"), and bookmarks.pending is written only into currepo.
Therefore, we should try to read .hg/bookmarks.pending of currepo in
at first. If it doesn't exist, we try to read .hg/bookmarks of srcrepo
in.
Even after this patch, an external hook spawned in currepo can't see
pending changes in currepo via srcrepo, even though such changes
become visible after closing transaction, because there is no easy and
cheap way to know existence of pending changes in currepo via srcrepo.
Please see https://www.mercurial-scm.org/wiki/SharedRepository, too.
BTW, this patch may cause failure of bisect in the repository of
Mercurial itself, if examination at bisecting assumes that an external
hook can see all pending changes while nested transactions across
repositories.
This invisibility issue will be fixed by subsequent patch, which
allows HG_PENDING to refer multiple repositories.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Tue, 21 Feb 2017 01:21:00 +0900 |
parents | d5883fd055c6 |
children | 23080c03a604 |
rev | line source |
---|---|
8805
28eaf6f8abce
share: add experimental share extension
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com> |
28eaf6f8abce
share: add experimental share extension
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
28eaf6f8abce
share: add experimental share extension
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
3 # This software may be used and distributed according to the terms of the |
10263 | 4 # GNU General Public License version 2 or any later version. |
8805
28eaf6f8abce
share: add experimental share extension
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
5 |
26320
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
6 '''share a common history between several working directories |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
7 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
8 Automatic Pooled Storage for Clones |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
9 ----------------------------------- |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
10 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
11 When this extension is active, :hg:`clone` can be configured to |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
12 automatically share/pool storage across multiple clones. This |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
13 mode effectively converts :hg:`clone` to :hg:`clone` + :hg:`share`. |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
14 The benefit of using this mode is the automatic management of |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
15 store paths and intelligent pooling of related repositories. |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
16 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
17 The following ``share.`` config options influence this feature: |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
18 |
26411
bf3d10f0c34a
share: make option docs more check-config friendly
Matt Mackall <mpm@selenic.com>
parents:
26320
diff
changeset
|
19 ``share.pool`` |
26320
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
20 Filesystem path where shared repository data will be stored. When |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
21 defined, :hg:`clone` will automatically use shared repository |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
22 storage instead of creating a store inside each clone. |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
23 |
26411
bf3d10f0c34a
share: make option docs more check-config friendly
Matt Mackall <mpm@selenic.com>
parents:
26320
diff
changeset
|
24 ``share.poolnaming`` |
26320
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
25 How directory names in ``share.pool`` are constructed. |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
26 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
27 "identity" means the name is derived from the first changeset in the |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
28 repository. In this mode, different remotes share storage if their |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
29 root/initial changeset is identical. In this mode, the local shared |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
30 repository is an aggregate of all encountered remote repositories. |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
31 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
32 "remote" means the name is derived from the source repository's |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
33 path or URL. In this mode, storage is only shared if the path or URL |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
34 requested in the :hg:`clone` command matches exactly to a repository |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
35 that was cloned before. |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
36 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
37 The default naming mode is "identity." |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
38 ''' |
8873
e872ef2e6758
help: add/fix docstrings for a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8807
diff
changeset
|
39 |
30246
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
40 from __future__ import absolute_import |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
41 |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
42 import errno |
8805
28eaf6f8abce
share: add experimental share extension
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
43 from mercurial.i18n import _ |
30246
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
44 from mercurial import ( |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
45 bookmarks, |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
46 cmdutil, |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
47 commands, |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
48 error, |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
49 extensions, |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
50 hg, |
31831
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
51 txnutil, |
30246
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
52 util, |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
53 ) |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
54 |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
55 repository = hg.repository |
6a98f9408a50
py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30185
diff
changeset
|
56 parseurl = hg.parseurl |
15080
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
57 |
21253
d2ce7a20fe86
share: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20056
diff
changeset
|
58 cmdtable = {} |
d2ce7a20fe86
share: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20056
diff
changeset
|
59 command = cmdutil.command(cmdtable) |
30611
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
30267
diff
changeset
|
60 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
25621
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24484
diff
changeset
|
61 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24484
diff
changeset
|
62 # be specifying the version(s) of Mercurial they are tested with, or |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24484
diff
changeset
|
63 # leave the attribute unspecified. |
30611
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
30267
diff
changeset
|
64 testedwith = 'ships-with-hg-core' |
16743
38caf405d010
hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents:
15083
diff
changeset
|
65 |
21253
d2ce7a20fe86
share: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20056
diff
changeset
|
66 @command('share', |
24484
135b23868f45
commands: replace "working copy" with "working directory" in help/messages
Yuya Nishihara <yuya@tcha.org>
parents:
23895
diff
changeset
|
67 [('U', 'noupdate', None, _('do not create a working directory')), |
23626
cd79fb4d75fd
share: add option to share bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents:
23556
diff
changeset
|
68 ('B', 'bookmarks', None, _('also share bookmarks'))], |
cd79fb4d75fd
share: add option to share bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents:
23556
diff
changeset
|
69 _('[-U] [-B] SOURCE [DEST]'), |
21772
5a4d1a6c605f
share: define norepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21253
diff
changeset
|
70 norepo=True) |
23626
cd79fb4d75fd
share: add option to share bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents:
23556
diff
changeset
|
71 def share(ui, source, dest=None, noupdate=False, bookmarks=False): |
10798
e46c19c586fa
share: drop experimental label
Martin Geisler <mg@lazybytes.net>
parents:
10263
diff
changeset
|
72 """create a new shared repository |
8805
28eaf6f8abce
share: add experimental share extension
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
73 |
9261
4b8b0c124b99
share: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9075
diff
changeset
|
74 Initialize a new repository and working directory that shares its |
23626
cd79fb4d75fd
share: add option to share bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents:
23556
diff
changeset
|
75 history (and optionally bookmarks) with another repository. |
8805
28eaf6f8abce
share: add experimental share extension
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
76 |
12389 | 77 .. note:: |
19997
de16c673455b
documentation: add an extra newline after note directive
Simon Heimberg <simohe@besonet.ch>
parents:
19399
diff
changeset
|
78 |
12389 | 79 using rollback or extensions that destroy/modify history (mq, |
80 rebase, etc.) can cause considerable confusion with shared | |
81 clones. In particular, if two shared clones are both updated to | |
82 the same changeset, and one of them destroys that changeset | |
83 with rollback, the other clone will suddenly stop working: all | |
84 operations will fail with "abort: working directory has unknown | |
85 parent". The only known workaround is to use debugsetparents on | |
19399
02465cafb0a9
share: remove reference to tip
Matt Mackall <mpm@selenic.com>
parents:
18825
diff
changeset
|
86 the broken clone to reset it to a changeset that still exists. |
8805
28eaf6f8abce
share: add experimental share extension
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
87 """ |
28eaf6f8abce
share: add experimental share extension
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
88 |
28000
98e59d9e0d77
share: pass named arguments
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27826
diff
changeset
|
89 return hg.share(ui, source, dest=dest, update=not noupdate, |
98e59d9e0d77
share: pass named arguments
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27826
diff
changeset
|
90 bookmarks=bookmarks) |
8805
28eaf6f8abce
share: add experimental share extension
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
91 |
21253
d2ce7a20fe86
share: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20056
diff
changeset
|
92 @command('unshare', [], '') |
15080
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
93 def unshare(ui, repo): |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
94 """convert a shared repository to a normal one |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
95 |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
96 Copy the store data to the repo and remove the sharedpath data. |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
97 """ |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
98 |
23678
965788d9ae09
localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23638
diff
changeset
|
99 if not repo.shared(): |
27227
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26411
diff
changeset
|
100 raise error.Abort(_("this is not a shared repo")) |
15080
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
101 |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
102 destlock = lock = None |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
103 lock = repo.lock() |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
104 try: |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
105 # we use locks here because if we race with commit, we |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
106 # can end up with extra data in the cloned revlogs that's |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
107 # not pointed to by changesets, thus causing verify to |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
108 # fail |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
109 |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
110 destlock = hg.copystore(ui, repo, repo.path) |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
111 |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
112 sharefile = repo.join('sharedpath') |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
113 util.rename(sharefile, sharefile + '.old') |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
114 |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
115 repo.requirements.discard('sharedpath') |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
116 repo._writerequirements() |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
117 finally: |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
118 destlock and destlock.release() |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
119 lock and lock.release() |
ea96bdda593c
hgext: introduce unshare command
Simon Heimberg <simohe@besonet.ch>
parents:
12389
diff
changeset
|
120 |
26225
1c7e62360068
share: replace reference to 'sopener' with 'svfs'
Siddharth Agarwal <sid0@fb.com>
parents:
26214
diff
changeset
|
121 # update store, spath, svfs and sjoin of repo |
20056
cbcd85fa75c0
share: fix unshare calling wrong repo.__init__() method
Brodie Rao <brodie@sf.io>
parents:
19997
diff
changeset
|
122 repo.unfiltered().__init__(repo.baseui, repo.root) |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
123 |
26320
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
124 # Wrap clone command to pass auto share options. |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
125 def clone(orig, ui, source, *args, **opts): |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
126 pool = ui.config('share', 'pool', None) |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
127 if pool: |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
128 pool = util.expandpath(pool) |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
129 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
130 opts['shareopts'] = dict( |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
131 pool=pool, |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
132 mode=ui.config('share', 'poolnaming', 'identity'), |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
133 ) |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
134 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
135 return orig(ui, source, *args, **opts) |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
136 |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
137 def extsetup(ui): |
27826
34d26e22a2b0
bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents:
27573
diff
changeset
|
138 extensions.wrapfunction(bookmarks, '_getbkfile', getbkfile) |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
139 extensions.wrapfunction(bookmarks.bmstore, 'recordchange', recordchange) |
27573
a7eecd021782
share: wrap bmstore._writerepo for transaction sensitivity (issue4940)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27227
diff
changeset
|
140 extensions.wrapfunction(bookmarks.bmstore, '_writerepo', writerepo) |
26320
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26225
diff
changeset
|
141 extensions.wrapcommand(commands.table, 'clone', clone) |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
142 |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
143 def _hassharedbookmarks(repo): |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
144 """Returns whether this repo has shared bookmarks""" |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
145 try: |
23895
7e71898a7cdc
share: replace the bookmarks.shared file with an entry on a new "shared" file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23678
diff
changeset
|
146 shared = repo.vfs.read('shared').splitlines() |
26214
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25621
diff
changeset
|
147 except IOError as inst: |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
148 if inst.errno != errno.ENOENT: |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
149 raise |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
150 return False |
30185
f21e0d91d386
share: move magic string to a constant
Martijn Pieters <mjpieters@fb.com>
parents:
28000
diff
changeset
|
151 return hg.sharedbookmarks in shared |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
152 |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
153 def _getsrcrepo(repo): |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
154 """ |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
155 Returns the source repository object for a given shared repository. |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
156 If repo is not a shared repository, return None. |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
157 """ |
23638
012a7b482d68
share: use the 'sharedpath' attr on repo instead of reloading from the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
23637
diff
changeset
|
158 if repo.sharedpath == repo.path: |
012a7b482d68
share: use the 'sharedpath' attr on repo instead of reloading from the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
23637
diff
changeset
|
159 return None |
012a7b482d68
share: use the 'sharedpath' attr on repo instead of reloading from the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
23637
diff
changeset
|
160 |
30267
2550604f5ec7
share: don't recreate the source repo each time
Durham Goode <durham@fb.com>
parents:
30246
diff
changeset
|
161 if util.safehasattr(repo, 'srcrepo') and repo.srcrepo: |
2550604f5ec7
share: don't recreate the source repo each time
Durham Goode <durham@fb.com>
parents:
30246
diff
changeset
|
162 return repo.srcrepo |
2550604f5ec7
share: don't recreate the source repo each time
Durham Goode <durham@fb.com>
parents:
30246
diff
changeset
|
163 |
23638
012a7b482d68
share: use the 'sharedpath' attr on repo instead of reloading from the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
23637
diff
changeset
|
164 # the sharedpath always ends in the .hg; we want the path to the repo |
012a7b482d68
share: use the 'sharedpath' attr on repo instead of reloading from the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
23637
diff
changeset
|
165 source = repo.vfs.split(repo.sharedpath)[0] |
012a7b482d68
share: use the 'sharedpath' attr on repo instead of reloading from the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
23637
diff
changeset
|
166 srcurl, branches = parseurl(source) |
30267
2550604f5ec7
share: don't recreate the source repo each time
Durham Goode <durham@fb.com>
parents:
30246
diff
changeset
|
167 srcrepo = repository(repo.ui, srcurl) |
2550604f5ec7
share: don't recreate the source repo each time
Durham Goode <durham@fb.com>
parents:
30246
diff
changeset
|
168 repo.srcrepo = srcrepo |
2550604f5ec7
share: don't recreate the source repo each time
Durham Goode <durham@fb.com>
parents:
30246
diff
changeset
|
169 return srcrepo |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
170 |
27826
34d26e22a2b0
bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents:
27573
diff
changeset
|
171 def getbkfile(orig, repo): |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
172 if _hassharedbookmarks(repo): |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
173 srcrepo = _getsrcrepo(repo) |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
174 if srcrepo is not None: |
31831
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
175 # just orig(srcrepo) doesn't work as expected, because |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
176 # HG_PENDING refers repo.root. |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
177 try: |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
178 fp, pending = txnutil.trypending(repo.root, repo.vfs, |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
179 'bookmarks') |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
180 if pending: |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
181 # only in this case, bookmark information in repo |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
182 # is up-to-date. |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
183 return fp |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
184 fp.close() |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
185 except IOError as inst: |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
186 if inst.errno != errno.ENOENT: |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
187 raise |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
188 |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
189 # otherwise, we should read bookmarks from srcrepo, |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
190 # because .hg/bookmarks in srcrepo might be already |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
191 # changed via another sharing repo |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
192 repo = srcrepo |
31831
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
193 |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
194 # TODO: Pending changes in repo are still invisible in |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
195 # srcrepo, because bookmarks.pending is written only into repo. |
0332b8fafd05
bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30611
diff
changeset
|
196 # See also https://www.mercurial-scm.org/wiki/SharedRepository |
27826
34d26e22a2b0
bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents:
27573
diff
changeset
|
197 return orig(repo) |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
198 |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
199 def recordchange(orig, self, tr): |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
200 # Continue with write to local bookmarks file as usual |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
201 orig(self, tr) |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
202 |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
203 if _hassharedbookmarks(self._repo): |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
204 srcrepo = _getsrcrepo(self._repo) |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
205 if srcrepo is not None: |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
206 category = 'share-bookmarks' |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
207 tr.addpostclose(category, lambda tr: self._writerepo(srcrepo)) |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
208 |
27573
a7eecd021782
share: wrap bmstore._writerepo for transaction sensitivity (issue4940)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27227
diff
changeset
|
209 def writerepo(orig, self, repo): |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
210 # First write local bookmarks file in case we ever unshare |
27573
a7eecd021782
share: wrap bmstore._writerepo for transaction sensitivity (issue4940)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27227
diff
changeset
|
211 orig(self, repo) |
a7eecd021782
share: wrap bmstore._writerepo for transaction sensitivity (issue4940)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27227
diff
changeset
|
212 |
23556
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
213 if _hassharedbookmarks(self._repo): |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
214 srcrepo = _getsrcrepo(self._repo) |
141baca16059
share: implement shared bookmark functionality
Ryan McElroy <rmcelroy@fb.com>
parents:
21772
diff
changeset
|
215 if srcrepo is not None: |
27573
a7eecd021782
share: wrap bmstore._writerepo for transaction sensitivity (issue4940)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27227
diff
changeset
|
216 orig(self, srcrepo) |