annotate mercurial/exchange.py @ 48250:1730b2fceaa1

dirstate-v2: adds a flag to mark a file as modified Right now, a files with a file system state that requires a lookup (same size, different mtime) will requires a lookup. If the result of that lookup is a modified files, it will remains ambiguous, requiring a lookup on the next status run too. To fix this, we introduce a dedicated flag in the new format. Such flag will allow to record such file as "known modified" avoiding an extra lookup later. As None of the associate code currently exist in the status code, we do the minimal implementation: if we read a dirstate entry with this flag set, we make it as "ambiguous" so that the next status code has to look it up. The same as it would have to without this flag existing anyway. Differential Revision: https://phab.mercurial-scm.org/D11681
author Simon Sapin <simon.sapin@octobus.net>
date Fri, 15 Oct 2021 16:12:00 +0200
parents 4d2ab365699e
children aad84024660f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
1 # exchange.py - utility to exchange data between repos.
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
2 #
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46780
diff changeset
3 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
4 #
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
7
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
8 from __future__ import absolute_import
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
9
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
10 import collections
44545
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
11 import weakref
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
12
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
13 from .i18n import _
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
14 from .node import (
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
15 hex,
38791
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
16 nullrev,
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
17 )
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
18 from . import (
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
19 bookmarks as bookmod,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
20 bundle2,
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45681
diff changeset
21 bundlecaches,
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
22 changegroup,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
23 discovery,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
24 error,
39629
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
25 exchangev2,
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
26 lock as lockmod,
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35305
diff changeset
27 logexchange,
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
28 narrowspec,
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
29 obsolete,
43580
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43278
diff changeset
30 obsutil,
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
31 phases,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
32 pushkey,
32896
e14484e7f562 py3: use pycompat.strkwargs() to convert kwargs keys to str before passing
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32891
diff changeset
33 pycompat,
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
34 requirements,
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
35 scmutil,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
36 streamclone,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
37 url as urlmod,
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
38 util,
40492
440f5b65be57 exchange: pass includepats and excludepats as arguments to getbundle()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40352
diff changeset
39 wireprototypes,
27523
68b9abf1cb82 exchange: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27244
diff changeset
40 )
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43913
diff changeset
41 from .utils import (
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43913
diff changeset
42 hashutil,
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43913
diff changeset
43 stringutil,
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
44 urlutil,
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43913
diff changeset
45 )
47226
19d4802cb304 sidedata: add a 'side-data' repository feature and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47012
diff changeset
46 from .interfaces import repository
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
47
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
48 urlerr = util.urlerr
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
49 urlreq = util.urlreq
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
50
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
51 _NARROWACL_SECTION = b'narrowacl'
38789
9b64b73d702b exchange: move disabling of rev-branch-cache bundle part out of narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38614
diff changeset
52
26639
92d67e5729b9 exchange: move bundle specification parsing from cmdutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26623
diff changeset
53
21064
4d9d490d7bbe bundle2: add a ui argument to readbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21063
diff changeset
54 def readbundle(ui, fh, fname, vfs=None):
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
55 header = changegroup.readexactly(fh, 4)
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
56
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
57 alg = None
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
58 if not fname:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
59 fname = b"stream"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
60 if not header.startswith(b'HG') and header.startswith(b'\0'):
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
61 fh = changegroup.headerlessfixup(fh, header)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
62 header = b"HG10"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
63 alg = b'UN'
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
64 elif vfs:
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
65 fname = vfs.join(fname)
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
66
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
67 magic, version = header[0:2], header[2:4]
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
68
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
69 if magic != b'HG':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
70 raise error.Abort(_(b'%s: not a Mercurial bundle') % fname)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
71 if version == b'10':
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
72 if alg is None:
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
73 alg = changegroup.readexactly(fh, 2)
22390
e2806b8613ca changegroup: rename bundle-related functions and classes
Sune Foldager <cryo@cyanite.org>
parents: 22354
diff changeset
74 return changegroup.cg1unpacker(fh, alg)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
75 elif version.startswith(b'2'):
25640
39f0064a3079 bundle2.getunbundler: rename "header" to "magicstring"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25559
diff changeset
76 return bundle2.getunbundler(ui, fh, magicstring=magic + version)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
77 elif version == b'S1':
26756
9e272a96f764 exchange: support for streaming clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26732
diff changeset
78 return streamclone.streamcloneapplier(fh)
21065
f9a9a6d63e89 bundle2: prepare readbundle to return more that one type of bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21064
diff changeset
79 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
80 raise error.Abort(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
81 _(b'%s: unknown bundle version %s') % (fname, version)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
82 )
21063
7ca4f2049d3b bundle2: move `readbundle` into the `exchange` module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21062
diff changeset
83
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
84
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
85 def getbundlespec(ui, fh):
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
86 """Infer the bundlespec from a bundle file handle.
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
87
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
88 The input file handle is seeked and the original seek position is not
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
89 restored.
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
90 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
91
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
92 def speccompression(alg):
30440
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
93 try:
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
94 return util.compengines.forbundletype(alg).bundletype()[0]
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
95 except KeyError:
c3944ab1443a exchange: obtain compression engines from the registrar
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30332
diff changeset
96 return None
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
97
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
98 b = readbundle(ui, fh, None)
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
99 if isinstance(b, changegroup.cg1unpacker):
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
100 alg = b._type
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
101 if alg == b'_truncatedBZ':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
102 alg = b'BZ'
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
103 comp = speccompression(alg)
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
104 if not comp:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
105 raise error.Abort(_(b'unknown compression algorithm: %s') % alg)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
106 return b'%s-v1' % comp
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
107 elif isinstance(b, bundle2.unbundle20):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
108 if b'Compression' in b.params:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
109 comp = speccompression(b.params[b'Compression'])
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
110 if not comp:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
111 raise error.Abort(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
112 _(b'unknown compression algorithm: %s') % comp
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
113 )
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
114 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
115 comp = b'none'
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
116
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
117 version = None
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
118 for part in b.iterparts():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
119 if part.type == b'changegroup':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
120 version = part.params[b'version']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
121 if version in (b'01', b'02'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
122 version = b'v2'
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
123 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
124 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
125 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
126 b'changegroup version %s does not have '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
127 b'a known bundlespec'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
128 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
129 % version,
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
130 hint=_(b'try upgrading your Mercurial client'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
131 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
132 elif part.type == b'stream2' and version is None:
37168
a2b350d9f6ae bundlespec: add support for some variants
Boris Feld <boris.feld@octobus.net>
parents: 37167
diff changeset
133 # A stream2 part requires to be part of a v2 bundle
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
134 requirements = urlreq.unquote(part.params[b'requirements'])
37168
a2b350d9f6ae bundlespec: add support for some variants
Boris Feld <boris.feld@octobus.net>
parents: 37167
diff changeset
135 splitted = requirements.split()
a2b350d9f6ae bundlespec: add support for some variants
Boris Feld <boris.feld@octobus.net>
parents: 37167
diff changeset
136 params = bundle2._formatrequirementsparams(splitted)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
137 return b'none-v2;stream=v2;%s' % params
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
138
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
139 if not version:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
140 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
141 _(b'could not identify changegroup version in bundle')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
142 )
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
143
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
144 return b'%s-%s' % (comp, version)
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
145 elif isinstance(b, streamclone.streamcloneapplier):
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
146 requirements = streamclone.readbundle1header(fh)[2]
37167
6f467adf9f05 bundle: add the possibility to bundle a stream v2 part
Boris Feld <boris.feld@octobus.net>
parents: 37165
diff changeset
147 formatted = bundle2._formatrequirementsparams(requirements)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
148 return b'none-packed1;%s' % formatted
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
149 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
150 raise error.Abort(_(b'unknown bundle type: %s') % b)
27883
4f4b80b3f2bf exchange: implement function for inferring bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27751
diff changeset
151
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
152
29808
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
153 def _computeoutgoing(repo, heads, common):
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
154 """Computes which revs are outgoing given a set of common
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
155 and a set of heads.
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
156
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
157 This is a separate function so extensions can have access to
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
158 the logic.
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
159
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
160 Returns a discovery.outgoing object.
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
161 """
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
162 cl = repo.changelog
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
163 if common:
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
164 hasnode = cl.hasnode
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
165 common = [n for n in common if hasnode(n)]
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
166 else:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46977
diff changeset
167 common = [repo.nullid]
29808
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
168 if not heads:
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
169 heads = cl.heads()
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
170 return discovery.outgoing(repo, common, heads)
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
171
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
172
40767
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
173 def _checkpublish(pushop):
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
174 repo = pushop.repo
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
175 ui = repo.ui
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
176 behavior = ui.config(b'experimental', b'auto-publish')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
177 if pushop.publish or behavior not in (b'warn', b'confirm', b'abort'):
40767
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
178 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
179 remotephases = listkeys(pushop.remote, b'phases')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
180 if not remotephases.get(b'publishing', False):
40767
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
181 return
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
182
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
183 if pushop.revs is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
184 published = repo.filtered(b'served').revs(b'not public()')
40767
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
185 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
186 published = repo.revs(b'::%ln - public()', pushop.revs)
47492
f03e9d30258e exchange: use "served" repo filter to guess what the server will publish
Anton Shestakov <av6@dwimlabs.net>
parents: 47226
diff changeset
187 # we want to use pushop.revs in the revset even if they themselves are
f03e9d30258e exchange: use "served" repo filter to guess what the server will publish
Anton Shestakov <av6@dwimlabs.net>
parents: 47226
diff changeset
188 # secret, but we don't want to have anything that the server won't see
f03e9d30258e exchange: use "served" repo filter to guess what the server will publish
Anton Shestakov <av6@dwimlabs.net>
parents: 47226
diff changeset
189 # in the result of this expression
f03e9d30258e exchange: use "served" repo filter to guess what the server will publish
Anton Shestakov <av6@dwimlabs.net>
parents: 47226
diff changeset
190 published &= repo.filtered(b'served')
40767
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
191 if published:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
192 if behavior == b'warn':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
193 ui.warn(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
194 _(b'%i changesets about to be published\n') % len(published)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
195 )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
196 elif behavior == b'confirm':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
197 if ui.promptchoice(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
198 _(b'push and publish %i changesets (yn)?$$ &Yes $$ &No')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
199 % len(published)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
200 ):
45877
ac362d5a7893 errors: introduce CanceledError and use it in a few places
Martin von Zweigbergk <martinvonz@google.com>
parents: 45784
diff changeset
201 raise error.CanceledError(_(b'user quit'))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
202 elif behavior == b'abort':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
203 msg = _(b'push would publish %i changesets') % len(published)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
204 hint = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
205 b"use --publish or adjust 'experimental.auto-publish'"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
206 b" config"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
207 )
40767
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
208 raise error.Abort(msg, hint=hint)
33d30fb1e4ae push: config option to control behavior when pushing to a publishing server
Anton Shestakov <av6@dwimlabs.net>
parents: 40686
diff changeset
209
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
210
29682
2db085d5f5a2 bundle2: rename the _canusebundle2 method to _forcebundle1
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
211 def _forcebundle1(op):
2db085d5f5a2 bundle2: rename the _canusebundle2 method to _forcebundle1
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
212 """return true if a pull/push must use bundle1
24650
b83a8f512a80 exchange: introduce a '_canusebundle2' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24649
diff changeset
213
29683
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
214 This function is used to allow testing of the older bundle version"""
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
215 ui = op.repo.ui
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30187
diff changeset
216 # The goal is this config is to allow developer to choose the bundle
29683
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
217 # version used during exchanged. This is especially handy during test.
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
218 # Value is a list of bundle version to be picked from, highest version
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
219 # should be used.
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
220 #
6786c3f8684d bundle2: add a devel option controling bundle version used for exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29682
diff changeset
221 # developer config: devel.legacy.exchange
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
222 exchange = ui.configlist(b'devel', b'legacy.exchange')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
223 forcebundle1 = b'bundle2' not in exchange and b'bundle1' in exchange
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
224 return forcebundle1 or not op.remote.capable(b'bundle2')
24650
b83a8f512a80 exchange: introduce a '_canusebundle2' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24649
diff changeset
225
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
226
20346
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
227 class pushoperation(object):
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
228 """A object that represent a single push operation
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
229
28456
d9d51da7a850 pushoperation: fix language issues in docstring
Nathan Goldbaum <ngoldbau@illinois.edu>
parents: 28182
diff changeset
230 Its purpose is to carry push related state and very common operations.
20346
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
231
28456
d9d51da7a850 pushoperation: fix language issues in docstring
Nathan Goldbaum <ngoldbau@illinois.edu>
parents: 28182
diff changeset
232 A new pushoperation should be created at the beginning of each push and
d9d51da7a850 pushoperation: fix language issues in docstring
Nathan Goldbaum <ngoldbau@illinois.edu>
parents: 28182
diff changeset
233 discarded afterward.
20346
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
234 """
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
235
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
236 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
237 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
238 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
239 remote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
240 force=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
241 revs=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
242 newbranch=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
243 bookmarks=(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
244 publish=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
245 pushvars=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
246 ):
20346
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
247 # repo we push from
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
248 self.repo = repo
20347
3ec5f833348e push: ease access to current ui object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20346
diff changeset
249 self.ui = repo.ui
20348
d64c904db55a push: move `remote` argument in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20347
diff changeset
250 # repo we push to
d64c904db55a push: move `remote` argument in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20347
diff changeset
251 self.remote = remote
20349
89f90457979e push: move `force` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20348
diff changeset
252 # force option provided
89f90457979e push: move `force` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20348
diff changeset
253 self.force = force
20350
8c85d968ee65 push: move `revs` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20349
diff changeset
254 # revs to be pushed (None is "all")
8c85d968ee65 push: move `revs` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20349
diff changeset
255 self.revs = revs
22623
cd7e17aa6040 push: pass list of bookmark to `exchange.push`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22622
diff changeset
256 # bookmark explicitly pushed
cd7e17aa6040 push: pass list of bookmark to `exchange.push`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22622
diff changeset
257 self.bookmarks = bookmarks
20351
c05ad450df23 push: move `newbranch` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20350
diff changeset
258 # allow push of new branch
c05ad450df23 push: move `newbranch` argument into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20350
diff changeset
259 self.newbranch = newbranch
21901
8612c4ab7f54 push: add a ``pushop.stepsdone`` attribute
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21899
diff changeset
260 # step already performed
8612c4ab7f54 push: add a ``pushop.stepsdone`` attribute
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21899
diff changeset
261 # (used to check what steps have been already performed through bundle2)
8612c4ab7f54 push: add a ``pushop.stepsdone`` attribute
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21899
diff changeset
262 self.stepsdone = set()
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
263 # Integer version of the changegroup push result
20439
0d3ccf285ff2 push: move push return value in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20438
diff changeset
264 # - None means nothing to push
0d3ccf285ff2 push: move push return value in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20438
diff changeset
265 # - 0 means HTTP error
0d3ccf285ff2 push: move push return value in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20438
diff changeset
266 # - 1 means we pushed and remote head count is unchanged *or*
0d3ccf285ff2 push: move push return value in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20438
diff changeset
267 # we have outgoing changesets but refused to push
0d3ccf285ff2 push: move push return value in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20438
diff changeset
268 # - other values as described by addchangegroup()
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
269 self.cgresult = None
22624
eef31f9a4c0f push: add `pushoperation.bkresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22623
diff changeset
270 # Boolean value for the bookmark push
eef31f9a4c0f push: add `pushoperation.bkresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22623
diff changeset
271 self.bkresult = None
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
272 # discover.outgoing object (contains common and outgoing data)
20440
400da8bc7786 push: move outgoing object in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20439
diff changeset
273 self.outgoing = None
32709
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
274 # all remote topological heads before the push
20462
0031ef5df586 push: move `remoteheads` into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20441
diff changeset
275 self.remoteheads = None
32709
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
276 # Details of the remote branch pre and post push
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
277 #
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
278 # mapping: {'branch': ([remoteheads],
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
279 # [newheads],
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
280 # [unsyncedheads],
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
281 # [discardedheads])}
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
282 # - branch: the branch name
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
283 # - remoteheads: the list of remote heads known locally
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
284 # None if the branch is new
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
285 # - newheads: the new remote heads (known locally) with outgoing pushed
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
286 # - unsyncedheads: the list of remote heads unknown locally.
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
287 # - discardedheads: the list of remote heads made obsolete by the push
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
288 self.pushbranchmap = None
20464
d032417db243 push: move `incoming` into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20463
diff changeset
289 # testable as a boolean indicating if any nodes are missing locally.
d032417db243 push: move `incoming` into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20463
diff changeset
290 self.incoming = None
34819
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
291 # summary of the remote phase situation
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
292 self.remotephases = None
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
293 # phases changes that must be pushed along side the changesets
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
294 self.outdatedphases = None
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
295 # phases changes that must be pushed if changeset push fails
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
296 self.fallbackoutdatedphases = None
22034
5f57bc77657c push: move the list of obsmarker to push into the push operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22033
diff changeset
297 # outgoing obsmarkers
22035
24bb01f42e82 push: introduce a discovery step for obsmarker
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22034
diff changeset
298 self.outobsmarkers = set()
42924
e0bf41b83cef exchange: avoid unnecessary conversion of bookmark nodes to hex (API)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42914
diff changeset
299 # outgoing bookmarks, list of (bm, oldnode | '', newnode | '')
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
300 self.outbookmarks = []
23437
94e2862dbcfb push: elevate phase transaction to cover entire operation
Eric Sumner <ericsumner@fb.com>
parents: 23436
diff changeset
301 # transaction manager
94e2862dbcfb push: elevate phase transaction to cover entire operation
Eric Sumner <ericsumner@fb.com>
parents: 23436
diff changeset
302 self.trmanager = None
25485
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
303 # map { pushkey partid -> callback handling failure}
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
304 # used to handle exception from mandatory pushkey part failure
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
305 self.pkfailcb = {}
33885
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
306 # an iterable of pushvars or None
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
307 self.pushvars = pushvars
40686
9b8d1ad851f8 push: add --publish flag to change phase of pushed changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 40492
diff changeset
308 # publish pushed changesets
9b8d1ad851f8 push: add --publish flag to change phase of pushed changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 40492
diff changeset
309 self.publish = publish
20346
42df1fe32552 push: introduce a pushoperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20345
diff changeset
310
22014
71083b020b4a push: extract future heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21989
diff changeset
311 @util.propertycache
71083b020b4a push: extract future heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21989
diff changeset
312 def futureheads(self):
71083b020b4a push: extract future heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21989
diff changeset
313 """future remote heads if the changeset push succeeds"""
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45117
diff changeset
314 return self.outgoing.ancestorsof
22014
71083b020b4a push: extract future heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21989
diff changeset
315
22015
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
316 @util.propertycache
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
317 def fallbackheads(self):
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
318 """future remote heads if the changeset push fails"""
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
319 if self.revs is None:
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
320 # not target to push, all common are relevant
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
321 return self.outgoing.commonheads
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
322 unfi = self.repo.unfiltered()
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45117
diff changeset
323 # I want cheads = heads(::ancestorsof and ::commonheads)
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45117
diff changeset
324 # (ancestorsof is revs with secret changeset filtered out)
22015
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
325 #
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
326 # This can be expressed as:
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45117
diff changeset
327 # cheads = ( (ancestorsof and ::commonheads)
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45117
diff changeset
328 # + (commonheads and ::ancestorsof))"
22015
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
329 # )
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
330 #
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
331 # while trying to push we already computed the following:
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
332 # common = (::commonheads)
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45117
diff changeset
333 # missing = ((commonheads::ancestorsof) - commonheads)
22015
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
334 #
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
335 # We can pick:
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45117
diff changeset
336 # * ancestorsof part of common (::commonheads)
26184
327d09f0b5d4 exchange: allow fallbackheads to use lazy set behavior
Durham Goode <durham@fb.com>
parents: 25896
diff changeset
337 common = self.outgoing.common
43562
a49b2e253035 index: use `index.rev` in `exchange.fallbackheads`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43545
diff changeset
338 rev = self.repo.changelog.index.rev
a49b2e253035 index: use `index.rev` in `exchange.fallbackheads`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43545
diff changeset
339 cheads = [node for node in self.revs if rev(node) in common]
22015
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
340 # and
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
341 # * commonheads parents on missing
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
342 revset = unfi.set(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
343 b'%ln and parents(roots(%ln))',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
344 self.outgoing.commonheads,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
345 self.outgoing.missing,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
346 )
22015
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
347 cheads.extend(c.node() for c in revset)
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
348 return cheads
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
349
22016
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
350 @property
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
351 def commonheads(self):
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
352 """set of all common heads after changeset bundle push"""
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
353 if self.cgresult:
22016
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
354 return self.futureheads
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
355 else:
7d976d71684c push: move common heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22015
diff changeset
356 return self.fallbackheads
22015
c478031deba2 push: extract fallback heads computation into pushop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22014
diff changeset
357
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
358
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
359 # mapping of message used when pushing bookmark
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
360 bookmsgmap = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
361 b'update': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
362 _(b"updating bookmark %s\n"),
45910
f0626acf007d errors: drop trailing "!" for some errors about bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents: 45877
diff changeset
363 _(b'updating bookmark %s failed\n'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
364 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
365 b'export': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
366 _(b"exporting bookmark %s\n"),
45910
f0626acf007d errors: drop trailing "!" for some errors about bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents: 45877
diff changeset
367 _(b'exporting bookmark %s failed\n'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
368 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
369 b'delete': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
370 _(b"deleting remote bookmark %s\n"),
45910
f0626acf007d errors: drop trailing "!" for some errors about bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents: 45877
diff changeset
371 _(b'deleting remote bookmark %s failed\n'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
372 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
373 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
374
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
375
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
376 def push(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
377 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
378 remote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
379 force=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
380 revs=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
381 newbranch=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
382 bookmarks=(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
383 publish=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
384 opargs=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
385 ):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45910
diff changeset
386 """Push outgoing changesets (limited by revs) from a local
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
387 repository to remote. Return an integer:
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
388 - None means nothing to push
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
389 - 0 means HTTP error
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
390 - 1 means we pushed and remote head count is unchanged *or*
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
391 we have outgoing changesets but refused to push
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
392 - other values as described by addchangegroup()
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45910
diff changeset
393 """
26729
16e69e6b357b exchange: add oparg to push so that extensions can wrap pushop
Sean Farley <sean@farley.io>
parents: 26700
diff changeset
394 if opargs is None:
16e69e6b357b exchange: add oparg to push so that extensions can wrap pushop
Sean Farley <sean@farley.io>
parents: 26700
diff changeset
395 opargs = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
396 pushop = pushoperation(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
397 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
398 remote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
399 force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
400 revs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
401 newbranch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
402 bookmarks,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
403 publish,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
404 **pycompat.strkwargs(opargs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
405 )
20348
d64c904db55a push: move `remote` argument in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20347
diff changeset
406 if pushop.remote.local():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
407 missing = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
408 set(pushop.repo.requirements) - pushop.remote.local().supported
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
409 )
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
410 if missing:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
411 msg = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
412 b"required features are not"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
413 b" supported in the destination:"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
414 b" %s"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
415 ) % (b', '.join(sorted(missing)))
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26566
diff changeset
416 raise error.Abort(msg)
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
417
20348
d64c904db55a push: move `remote` argument in the push object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20347
diff changeset
418 if not pushop.remote.canpush():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
419 raise error.Abort(_(b"destination does not support push"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
420
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
421 if not pushop.remote.capable(b'unbundle'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
422 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
423 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
424 b'cannot push: destination does not support the '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
425 b'unbundle wire protocol command'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
426 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
427 )
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
428 for category in sorted(bundle2.read_remote_wanted_sidedata(pushop.remote)):
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
429 # Check that a computer is registered for that category for at least
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
430 # one revlog kind.
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
431 for kind, computers in repo._sidedata_computers.items():
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
432 if computers.get(category):
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
433 break
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
434 else:
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
435 raise error.Abort(
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
436 _(
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
437 b'cannot push: required sidedata category not supported'
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
438 b" by this client: '%s'"
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
439 )
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
440 % pycompat.bytestr(category)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
441 )
33791
20d663a104fb exchange: drop now-unnecessary "local" from lock name variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 33790
diff changeset
442 # get lock as we might write phase data
20d663a104fb exchange: drop now-unnecessary "local" from lock name variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 33790
diff changeset
443 wlock = lock = None
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
444 try:
42326
5d4ec64a6fcb exchange: don't take wlock if bookmarks are stored in .hg/store/
Martin von Zweigbergk <martinvonz@google.com>
parents: 42209
diff changeset
445 # bundle2 push may receive a reply bundle touching bookmarks
5d4ec64a6fcb exchange: don't take wlock if bookmarks are stored in .hg/store/
Martin von Zweigbergk <martinvonz@google.com>
parents: 42209
diff changeset
446 # requiring the wlock. Take it now to ensure proper ordering.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
447 maypushback = pushop.ui.configbool(b'experimental', b'bundle2.pushback')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
448 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
449 (not _forcebundle1(pushop))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
450 and maypushback
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
451 and not bookmod.bookmarksinstore(repo)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
452 ):
33791
20d663a104fb exchange: drop now-unnecessary "local" from lock name variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 33790
diff changeset
453 wlock = pushop.repo.wlock()
20d663a104fb exchange: drop now-unnecessary "local" from lock name variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 33790
diff changeset
454 lock = pushop.repo.lock()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
455 pushop.trmanager = transactionmanager(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
456 pushop.repo, b'push-response', pushop.remote.url()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
457 )
38000
7c05198cd1ca push: continue without locking on lock failure other than EEXIST (issue5882)
Yuya Nishihara <yuya@tcha.org>
parents: 37768
diff changeset
458 except error.LockUnavailable as err:
20345
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
459 # source repo cannot be locked.
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
460 # We do not abort the push, but just disable the local phase
8567b4ea76ac exchange: extract push function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
461 # synchronisation.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
462 msg = b'cannot lock source repository: %s\n' % stringutil.forcebytestr(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
463 err
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
464 )
20347
3ec5f833348e push: ease access to current ui object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20346
diff changeset
465 pushop.ui.debug(msg)
33792
5904511fc9f8 exchange: remove need for "locked" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 33791
diff changeset
466
41760
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
467 with wlock or util.nullcontextmanager():
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
468 with lock or util.nullcontextmanager():
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
469 with pushop.trmanager or util.nullcontextmanager():
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
470 pushop.repo.checkpush(pushop)
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
471 _checkpublish(pushop)
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
472 _pushdiscovery(pushop)
43913
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
473 if not pushop.force:
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
474 _checksubrepostate(pushop)
41760
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
475 if not _forcebundle1(pushop):
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
476 _pushbundle2(pushop)
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
477 _pushchangeset(pushop)
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
478 _pushsyncphase(pushop)
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
479 _pushobsolete(pushop)
1eb2fc21da12 cleanup: prefer nested context managers to \-continuations
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
480 _pushbookmark(pushop)
33701
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
481
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
482 if repo.ui.configbool(b'experimental', b'remotenames'):
38614
4d5fb4062f0b remotenames: synchronise remotenames after push also
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38604
diff changeset
483 logexchange.pullremotenames(repo, remote)
4d5fb4062f0b remotenames: synchronise remotenames after push also
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38604
diff changeset
484
22616
cda85cfc8252 push: `exchange.push` now returns the `pushoperation` object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22615
diff changeset
485 return pushop
20352
58300f61b139 push: move bookmarks exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20351
diff changeset
486
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
487
22018
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
488 # list of steps to perform discovery before push
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
489 pushdiscoveryorder = []
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
490
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
491 # Mapping between step name and function
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
492 #
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
493 # This exists to help extensions wrap steps if necessary
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
494 pushdiscoverymapping = {}
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
495
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
496
22018
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
497 def pushdiscovery(stepname):
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
498 """decorator for function performing discovery before push
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
499
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
500 The function is added to the step -> function mapping and appended to the
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
501 list of steps. Beware that decorated function will be added in order (this
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
502 may matter).
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
503
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
504 You can only use this decorator for a new step, if you want to wrap a step
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
505 from an extension, change the pushdiscovery dictionary directly."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
506
22018
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
507 def dec(func):
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
508 assert stepname not in pushdiscoverymapping
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
509 pushdiscoverymapping[stepname] = func
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
510 pushdiscoveryorder.append(stepname)
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
511 return func
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
512
22018
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
513 return dec
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
514
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
515
20466
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
516 def _pushdiscovery(pushop):
22018
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
517 """Run all discovery steps"""
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
518 for stepname in pushdiscoveryorder:
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
519 step = pushdiscoverymapping[stepname]
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
520 step(pushop)
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
521
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
522
43913
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
523 def _checksubrepostate(pushop):
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
524 """Ensure all outgoing referenced subrepo revisions are present locally"""
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
525 for n in pushop.outgoing.missing:
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
526 ctx = pushop.repo[n]
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
527
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
528 if b'.hgsub' in ctx.manifest() and b'.hgsubstate' in ctx.files():
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
529 for subpath in sorted(ctx.substate):
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
530 sub = ctx.sub(subpath)
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
531 sub.verify(onpush=True)
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
532
4b7d5d10c45d exchange: ensure all outgoing subrepo references are present before pushing
Matt Harbison <matt_harbison@yahoo.com>
parents: 43821
diff changeset
533
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
534 @pushdiscovery(b'changeset')
22018
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
535 def _pushdiscoverychangeset(pushop):
ddb56e7e1b92 push: make discovery extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22017
diff changeset
536 """discover the changeset that need to be pushed"""
20466
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
537 fci = discovery.findcommonincoming
35305
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35268
diff changeset
538 if pushop.revs:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
539 commoninc = fci(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
540 pushop.repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
541 pushop.remote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
542 force=pushop.force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
543 ancestorsof=pushop.revs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
544 )
35305
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35268
diff changeset
545 else:
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35268
diff changeset
546 commoninc = fci(pushop.repo, pushop.remote, force=pushop.force)
20466
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
547 common, inc, remoteheads = commoninc
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
548 fco = discovery.findcommonoutgoing
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
549 outgoing = fco(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
550 pushop.repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
551 pushop.remote,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
552 onlyheads=pushop.revs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
553 commoninc=commoninc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
554 force=pushop.force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
555 )
20466
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
556 pushop.outgoing = outgoing
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
557 pushop.remoteheads = remoteheads
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
558 pushop.incoming = inc
233623d58c9a push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20465
diff changeset
559
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
560
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
561 @pushdiscovery(b'phase')
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
562 def _pushdiscoveryphase(pushop):
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
563 """discover the phase that needs to be pushed
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
564
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
565 (computed for both success and failure case for changesets push)"""
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
566 outgoing = pushop.outgoing
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
567 unfi = pushop.repo.unfiltered()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
568 remotephases = listkeys(pushop.remote, b'phases')
37757
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
569
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
570 if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
571 pushop.ui.configbool(b'ui', b'_usedassubrepo')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
572 and remotephases # server supports phases
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
573 and not pushop.outgoing.missing # no changesets to be pushed
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
574 and remotephases.get(b'publishing', False)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
575 ):
25337
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
576 # When:
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
577 # - this is a subrepo push
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
578 # - and remote support phase
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
579 # - and no changeset are to be pushed
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
580 # - and remote is publishing
34817
a80142b03552 exchange: fix issue3781 reference in the comment
Boris Feld <boris.feld@octobus.net>
parents: 34374
diff changeset
581 # We may be in issue 3781 case!
25337
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
582 # We drop the possible phase synchronisation done by
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
583 # courtesy to publish changesets possibly locally draft
636b1f1b9f8d subrepo: detect issue3781 case earlier so it apply to bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25236
diff changeset
584 # on the remote.
34818
6709b5661d1b phase: simplify the check for issue3781 shortcut in discovery
Boris Feld <boris.feld@octobus.net>
parents: 34817
diff changeset
585 pushop.outdatedphases = []
6709b5661d1b phase: simplify the check for issue3781 shortcut in discovery
Boris Feld <boris.feld@octobus.net>
parents: 34817
diff changeset
586 pushop.fallbackoutdatedphases = []
6709b5661d1b phase: simplify the check for issue3781 shortcut in discovery
Boris Feld <boris.feld@octobus.net>
parents: 34817
diff changeset
587 return
34819
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
588
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
589 pushop.remotephases = phases.remotephasessummary(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
590 pushop.repo, pushop.fallbackheads, remotephases
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
591 )
34819
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
592 droots = pushop.remotephases.draftroots
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
593
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
594 extracond = b''
34819
eb6375651974 phase: gather remote phase information in a summary object
Boris Feld <boris.feld@octobus.net>
parents: 34818
diff changeset
595 if not pushop.remotephases.publishing:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
596 extracond = b' and public()'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
597 revset = b'heads((%%ln::%%ln) %s)' % extracond
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
598 # Get the list of all revs draft on remote by public here.
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
599 # XXX Beware that revset break if droots is not strictly
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
600 # XXX root we may want to ensure it is but it is costly
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
601 fallback = list(unfi.set(revset, droots, pushop.fallbackheads))
40686
9b8d1ad851f8 push: add --publish flag to change phase of pushed changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 40492
diff changeset
602 if not pushop.remotephases.publishing and pushop.publish:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
603 future = list(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
604 unfi.set(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
605 b'%ln and (not public() or %ln::)', pushop.futureheads, droots
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
606 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
607 )
40686
9b8d1ad851f8 push: add --publish flag to change phase of pushed changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 40492
diff changeset
608 elif not outgoing.missing:
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
609 future = fallback
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
610 else:
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
611 # adds changeset we are going to push as draft
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
612 #
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23082
diff changeset
613 # should not be necessary for publishing server, but because of an
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
614 # issue fixed in xxxxx we have to do it anyway.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
615 fdroots = list(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
616 unfi.set(b'roots(%ln + %ln::)', outgoing.missing, droots)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
617 )
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
618 fdroots = [f.node() for f in fdroots]
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
619 future = list(unfi.set(revset, fdroots, pushop.futureheads))
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
620 pushop.outdatedphases = future
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
621 pushop.fallbackoutdatedphases = fallback
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
622
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
623
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
624 @pushdiscovery(b'obsmarker')
22035
24bb01f42e82 push: introduce a discovery step for obsmarker
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22034
diff changeset
625 def _pushdiscoveryobsmarkers(pushop):
37757
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
626 if not obsolete.isenabled(pushop.repo, obsolete.exchangeopt):
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
627 return
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
628
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
629 if not pushop.repo.obsstore:
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
630 return
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
631
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
632 if b'obsolete' not in listkeys(pushop.remote, b'namespaces'):
37757
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
633 return
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
634
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
635 repo = pushop.repo
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
636 # very naive computation, that can be quite expensive on big repo.
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
637 # However: evolution is currently slow on them anyway.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
638 nodes = (c.node() for c in repo.set(b'::%ln', pushop.futureheads))
37757
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
639 pushop.outobsmarkers = pushop.repo.obsstore.relevantmarkers(nodes)
22035
24bb01f42e82 push: introduce a discovery step for obsmarker
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22034
diff changeset
640
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
641
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
642 @pushdiscovery(b'bookmarks')
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
643 def _pushdiscoverybookmarks(pushop):
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
644 ui = pushop.ui
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
645 repo = pushop.repo.unfiltered()
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
646 remote = pushop.remote
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
647 ui.debug(b"checking for updated bookmarks\n")
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
648 ancestors = ()
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
649 if pushop.revs:
38604
2834ac06d5a9 py3: fix revnums in bookmark discovery to be consumable more than once
Yuya Nishihara <yuya@tcha.org>
parents: 38000
diff changeset
650 revnums = pycompat.maplist(repo.changelog.rev, pushop.revs)
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
651 ancestors = repo.changelog.ancestors(revnums, inclusive=True)
37757
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
652
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
653 remotebookmark = bookmod.unhexlifybookmarks(listkeys(remote, b'bookmarks'))
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
654
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
655 explicit = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
656 repo._bookmarks.expandname(bookmark) for bookmark in pushop.bookmarks
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
657 }
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
658
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
659 comp = bookmod.comparebookmarks(repo, repo._bookmarks, remotebookmark)
36938
8fd9b56e8d7c push-discovery: extract the bookmark comparison logic in its own function
Boris Feld <boris.feld@octobus.net>
parents: 36937
diff changeset
660 return _processcompared(pushop, ancestors, explicit, remotebookmark, comp)
8fd9b56e8d7c push-discovery: extract the bookmark comparison logic in its own function
Boris Feld <boris.feld@octobus.net>
parents: 36937
diff changeset
661
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
662
36938
8fd9b56e8d7c push-discovery: extract the bookmark comparison logic in its own function
Boris Feld <boris.feld@octobus.net>
parents: 36937
diff changeset
663 def _processcompared(pushop, pushed, explicit, remotebms, comp):
42914
08fce968d00b doc: fix up confusing doc comment
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42820
diff changeset
664 """take decision on bookmarks to push to the remote repo
36938
8fd9b56e8d7c push-discovery: extract the bookmark comparison logic in its own function
Boris Feld <boris.feld@octobus.net>
parents: 36937
diff changeset
665
42914
08fce968d00b doc: fix up confusing doc comment
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42820
diff changeset
666 Exists to help extensions alter this behavior.
36938
8fd9b56e8d7c push-discovery: extract the bookmark comparison logic in its own function
Boris Feld <boris.feld@octobus.net>
parents: 36937
diff changeset
667 """
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23047
diff changeset
668 addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = comp
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
669
36938
8fd9b56e8d7c push-discovery: extract the bookmark comparison logic in its own function
Boris Feld <boris.feld@octobus.net>
parents: 36937
diff changeset
670 repo = pushop.repo
8fd9b56e8d7c push-discovery: extract the bookmark comparison logic in its own function
Boris Feld <boris.feld@octobus.net>
parents: 36937
diff changeset
671
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
672 for b, scid, dcid in advsrc:
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
673 if b in explicit:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
674 explicit.remove(b)
36938
8fd9b56e8d7c push-discovery: extract the bookmark comparison logic in its own function
Boris Feld <boris.feld@octobus.net>
parents: 36937
diff changeset
675 if not pushed or repo[scid].rev() in pushed:
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
676 pushop.outbookmarks.append((b, dcid, scid))
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
677 # search added bookmark
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
678 for b, scid, dcid in addsrc:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
679 if b in explicit:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
680 explicit.remove(b)
44372
8407031f195f bookmarks: prevent pushes of divergent bookmarks (foo@remote)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44282
diff changeset
681 if bookmod.isdivergent(b):
8407031f195f bookmarks: prevent pushes of divergent bookmarks (foo@remote)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44282
diff changeset
682 pushop.ui.warn(_(b'cannot push divergent bookmark %s!\n') % b)
8407031f195f bookmarks: prevent pushes of divergent bookmarks (foo@remote)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44282
diff changeset
683 pushop.bkresult = 2
8407031f195f bookmarks: prevent pushes of divergent bookmarks (foo@remote)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44282
diff changeset
684 else:
8407031f195f bookmarks: prevent pushes of divergent bookmarks (foo@remote)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44282
diff changeset
685 pushop.outbookmarks.append((b, b'', scid))
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
686 # search for overwritten bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
687 for b, scid, dcid in list(advdst) + list(diverge) + list(differ):
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
688 if b in explicit:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
689 explicit.remove(b)
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
690 pushop.outbookmarks.append((b, dcid, scid))
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
691 # search for bookmark to delete
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
692 for b, scid, dcid in adddst:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
693 if b in explicit:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
694 explicit.remove(b)
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
695 # treat as "deleted locally"
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
696 pushop.outbookmarks.append((b, dcid, b''))
23082
0fc4686de1d7 exchange: don't report failure from identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23081
diff changeset
697 # identical bookmarks shouldn't get reported
0fc4686de1d7 exchange: don't report failure from identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23081
diff changeset
698 for b, scid, dcid in same:
0fc4686de1d7 exchange: don't report failure from identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23081
diff changeset
699 if b in explicit:
0fc4686de1d7 exchange: don't report failure from identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23081
diff changeset
700 explicit.remove(b)
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
701
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
702 if explicit:
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
703 explicit = sorted(explicit)
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
704 # we should probably list all of them
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
705 pushop.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
706 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
707 b'bookmark %s does not exist on the local '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
708 b'or remote repository!\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
709 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
710 % explicit[0]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
711 )
22651
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
712 pushop.bkresult = 2
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
713
b901645a8784 push: gather all bookmark decisions together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22650
diff changeset
714 pushop.outbookmarks.sort()
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
715
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
716
20465
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
717 def _pushcheckoutgoing(pushop):
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
718 outgoing = pushop.outgoing
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
719 unfi = pushop.repo.unfiltered()
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
720 if not outgoing.missing:
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
721 # nothing to push
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
722 scmutil.nochangesfound(unfi.ui, unfi, outgoing.excluded)
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
723 return False
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
724 # something to push
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
725 if not pushop.force:
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
726 # if repo.obsstore == False --> no obsolete
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
727 # then, save the iteration
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
728 if unfi.obsstore:
45214
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
729 # this message are here for 80 char limit reason
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
730 mso = _(b"push includes obsolete changeset: %s!")
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
731 mspd = _(b"push includes phase-divergent changeset: %s!")
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
732 mscd = _(b"push includes content-divergent changeset: %s!")
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
733 mst = {
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
734 b"orphan": _(b"push includes orphan changeset: %s!"),
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
735 b"phase-divergent": mspd,
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
736 b"content-divergent": mscd,
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
737 }
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
738 # If we are to push if there is at least one
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
739 # obsolete or unstable changeset in missing, at
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
740 # least one of the missinghead will be obsolete or
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
741 # unstable. So checking heads only is ok
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
742 for node in outgoing.ancestorsof:
20465
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
743 ctx = unfi[node]
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
744 if ctx.obsolete():
45214
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
745 raise error.Abort(mso % ctx)
33730
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33726
diff changeset
746 elif ctx.isunstable():
45214
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
747 # TODO print more than one instability in the abort
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
748 # message
6063c1857d0a exchange: backout changeset c26335fa4225
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45156
diff changeset
749 raise error.Abort(mst[ctx.instabilities()[0]] % ctx)
25836
dede675dc0c1 bookmarks: mark internal-only config option
Matt Mackall <mpm@selenic.com>
parents: 25668
diff changeset
750
26935
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26855
diff changeset
751 discovery.checkheads(pushop)
20465
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
752 return True
170f71061069 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20464
diff changeset
753
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
754
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
755 # List of names of steps to perform for an outgoing bundle2, order matters.
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
756 b2partsgenorder = []
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
757
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
758 # Mapping between step name and function
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
759 #
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
760 # This exists to help extensions wrap steps if necessary
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
761 b2partsgenmapping = {}
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
762
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
763
24731
88a36edefea5 bundle2: add an 'idx' argument to the 'b2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24697
diff changeset
764 def b2partsgenerator(stepname, idx=None):
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
765 """decorator for function generating bundle2 part
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
766
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
767 The function is added to the step -> function mapping and appended to the
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
768 list of steps. Beware that decorated functions will be added in order
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
769 (this may matter).
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
770
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
771 You can only use this decorator for new steps, if you want to wrap a step
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
772 from an extension, attack the b2partsgenmapping dictionary directly."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
773
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
774 def dec(func):
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
775 assert stepname not in b2partsgenmapping
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
776 b2partsgenmapping[stepname] = func
24731
88a36edefea5 bundle2: add an 'idx' argument to the 'b2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24697
diff changeset
777 if idx is None:
88a36edefea5 bundle2: add an 'idx' argument to the 'b2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24697
diff changeset
778 b2partsgenorder.append(stepname)
88a36edefea5 bundle2: add an 'idx' argument to the 'b2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24697
diff changeset
779 else:
88a36edefea5 bundle2: add an 'idx' argument to the 'b2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24697
diff changeset
780 b2partsgenorder.insert(idx, stepname)
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
781 return func
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
782
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
783 return dec
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
784
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
785
26428
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
786 def _pushb2ctxcheckheads(pushop, bundler):
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
787 """Generate race condition checking parts
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
788
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26779
diff changeset
789 Exists as an independent function to aid extensions
26428
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
790 """
32709
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
791 # * 'force' do not check for push race,
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
792 # * if we don't push anything, there are nothing to check.
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45117
diff changeset
793 if not pushop.force and pushop.outgoing.ancestorsof:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
794 allowunrelated = b'related' in bundler.capabilities.get(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
795 b'checkheads', ()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
796 )
33138
78fc540c53e1 pushrace: avoid crash on bare push when using concurrent push mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33043
diff changeset
797 emptyremote = pushop.pushbranchmap is None
78fc540c53e1 pushrace: avoid crash on bare push when using concurrent push mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33043
diff changeset
798 if not allowunrelated or emptyremote:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
799 bundler.newpart(b'check:heads', data=iter(pushop.remoteheads))
32709
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
800 else:
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
801 affected = set()
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
802 for branch, heads in pycompat.iteritems(pushop.pushbranchmap):
32709
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
803 remoteheads, newheads, unsyncedheads, discardedheads = heads
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
804 if remoteheads is not None:
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
805 remote = set(remoteheads)
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
806 affected |= set(discardedheads) & remote
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
807 affected |= remote - set(newheads)
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
808 if affected:
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32652
diff changeset
809 data = iter(sorted(affected))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
810 bundler.newpart(b'check:updated-heads', data=data)
26428
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
811
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
812
34821
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
813 def _pushing(pushop):
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
814 """return True if we are pushing anything"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
815 return bool(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
816 pushop.outgoing.missing
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
817 or pushop.outdatedphases
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
818 or pushop.outobsmarkers
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
819 or pushop.outbookmarks
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
820 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
821
34821
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
822
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
823 @b2partsgenerator(b'check-bookmarks')
35259
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
824 def _pushb2checkbookmarks(pushop, bundler):
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
825 """insert bookmark move checking"""
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
826 if not _pushing(pushop) or pushop.force:
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
827 return
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
828 b2caps = bundle2.bundle2caps(pushop.remote)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
829 hasbookmarkcheck = b'bookmarks' in b2caps
35259
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
830 if not (pushop.outbookmarks and hasbookmarkcheck):
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
831 return
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
832 data = []
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
833 for book, old, new in pushop.outbookmarks:
ad5f2b923b0d push: include a 'check:bookmarks' part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35236
diff changeset
834 data.append((book, old))
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
835 checkdata = bookmod.binaryencode(pushop.repo, data)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
836 bundler.newpart(b'check:bookmarks', data=checkdata)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
837
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
838
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
839 @b2partsgenerator(b'check-phases')
34821
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
840 def _pushb2checkphases(pushop, bundler):
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
841 """insert phase move checking"""
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
842 if not _pushing(pushop) or pushop.force:
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
843 return
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
844 b2caps = bundle2.bundle2caps(pushop.remote)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
845 hasphaseheads = b'heads' in b2caps.get(b'phases', ())
34821
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
846 if pushop.remotephases is not None and hasphaseheads:
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
847 # check that the remote phase has not changed
45117
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45062
diff changeset
848 checks = {p: [] for p in phases.allphases}
34821
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
849 checks[phases.public].extend(pushop.remotephases.publicheads)
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
850 checks[phases.draft].extend(pushop.remotephases.draftroots)
45117
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45062
diff changeset
851 if any(pycompat.itervalues(checks)):
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45062
diff changeset
852 for phase in checks:
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45062
diff changeset
853 checks[phase].sort()
34821
aa5e7b4a3a01 phase: generate a push-race detection part on push
Boris Feld <boris.feld@octobus.net>
parents: 34819
diff changeset
854 checkdata = phases.binaryencode(checks)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
855 bundler.newpart(b'check:phases', data=checkdata)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
856
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
857
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
858 @b2partsgenerator(b'changeset')
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
859 def _pushb2ctx(pushop, bundler):
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
860 """handle changegroup push through bundle2
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
861
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
862 addchangegroup result is stored in the ``pushop.cgresult`` attribute.
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
863 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
864 if b'changesets' in pushop.stepsdone:
21902
7a7def851ba0 push: use `stepsdone` to control changegroup push through bundle10 or bundle20
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21901
diff changeset
865 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
866 pushop.stepsdone.add(b'changesets')
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
867 # Send known heads to the server for race detection.
21903
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
868 if not _pushcheckoutgoing(pushop):
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
869 return
28876
79b8f052ee51 localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents: 28668
diff changeset
870 pushop.repo.prepushoutgoinghooks(pushop)
26428
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
871
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
872 _pushb2ctxcheckheads(pushop, bundler)
b75c4651b186 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com>
parents: 26184
diff changeset
873
23180
116b80d63815 push: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23179
diff changeset
874 b2caps = bundle2.bundle2caps(pushop.remote)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
875 version = b'01'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
876 cgversions = b2caps.get(b'changegroup')
28668
07f1fbf1f758 exchange: make _pushb2ctx() look more like _getbundlechangegrouppart()
Martin von Zweigbergk <martinvonz@google.com>
parents: 28667
diff changeset
877 if cgversions: # 3.1 and 3.2 ship with an empty value
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
878 cgversions = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
879 v
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
880 for v in cgversions
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
881 if v in changegroup.supportedoutgoingversions(pushop.repo)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
882 ]
23180
116b80d63815 push: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23179
diff changeset
883 if not cgversions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
884 raise error.Abort(_(b'no common changegroup version'))
23180
116b80d63815 push: send highest changegroup format supported by both side
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23179
diff changeset
885 version = max(cgversions)
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
886
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
887 remote_sidedata = bundle2.read_remote_wanted_sidedata(pushop.remote)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
888 cgstream = changegroup.makestream(
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
889 pushop.repo,
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
890 pushop.outgoing,
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
891 version,
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
892 b'push',
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
893 bundlecaps=b2caps,
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
894 remote_sidedata=remote_sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
895 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
896 cgpart = bundler.newpart(b'changegroup', data=cgstream)
28668
07f1fbf1f758 exchange: make _pushb2ctx() look more like _getbundlechangegrouppart()
Martin von Zweigbergk <martinvonz@google.com>
parents: 28667
diff changeset
897 if cgversions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
898 cgpart.addparam(b'version', version)
45552
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
899 if scmutil.istreemanifest(pushop.repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
900 cgpart.addparam(b'treemanifest', b'1')
47226
19d4802cb304 sidedata: add a 'side-data' repository feature and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47012
diff changeset
901 if repository.REPO_FEATURE_SIDE_DATA in pushop.repo.features:
43131
c17a63eb5d4c sidedata: apply basic but tight security around exchange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
902 cgpart.addparam(b'exp-sidedata', b'1')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
903
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
904 def handlereply(op):
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23082
diff changeset
905 """extract addchangegroup returns from server reply"""
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
906 cgreplies = op.records.getreplies(cgpart.id)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
907 assert len(cgreplies[b'changegroup']) == 1
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
908 pushop.cgresult = cgreplies[b'changegroup'][0][b'return']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
909
21899
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
910 return handlereply
52ab44b979f4 bundle2-push: extract changegroup logic in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21898
diff changeset
911
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
912
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
913 @b2partsgenerator(b'phase')
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
914 def _pushb2phases(pushop, bundler):
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
915 """handle phase push through bundle2"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
916 if b'phases' in pushop.stepsdone:
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
917 return
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
918 b2caps = bundle2.bundle2caps(pushop.remote)
34836
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
919 ui = pushop.repo.ui
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
920
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
921 legacyphase = b'phases' in ui.configlist(b'devel', b'legacy.exchange')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
922 haspushkey = b'pushkey' in b2caps
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
923 hasphaseheads = b'heads' in b2caps.get(b'phases', ())
34836
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
924
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
925 if hasphaseheads and not legacyphase:
34910
498697fe41f2 exchange: propagate the subfunctions return
Boris Feld <boris.feld@octobus.net>
parents: 34836
diff changeset
926 return _pushb2phaseheads(pushop, bundler)
34836
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
927 elif haspushkey:
34910
498697fe41f2 exchange: propagate the subfunctions return
Boris Feld <boris.feld@octobus.net>
parents: 34836
diff changeset
928 return _pushb2phasespushkey(pushop, bundler)
34822
c1e7ce11db9b phase: isolate logic to update remote phrase through bundle2 pushkey
Boris Feld <boris.feld@octobus.net>
parents: 34821
diff changeset
929
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
930
34836
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
931 def _pushb2phaseheads(pushop, bundler):
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
932 """push phase information through a bundle2 - binary part"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
933 pushop.stepsdone.add(b'phases')
34836
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
934 if pushop.outdatedphases:
45117
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45062
diff changeset
935 updates = {p: [] for p in phases.allphases}
34836
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
936 updates[0].extend(h.node() for h in pushop.outdatedphases)
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
937 phasedata = phases.binaryencode(updates)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
938 bundler.newpart(b'phase-heads', data=phasedata)
34836
537de0b14030 phase: use a binary phase part to push through bundle2 (BC)
Boris Feld <boris.feld@octobus.net>
parents: 34822
diff changeset
939
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
940
34822
c1e7ce11db9b phase: isolate logic to update remote phrase through bundle2 pushkey
Boris Feld <boris.feld@octobus.net>
parents: 34821
diff changeset
941 def _pushb2phasespushkey(pushop, bundler):
c1e7ce11db9b phase: isolate logic to update remote phrase through bundle2 pushkey
Boris Feld <boris.feld@octobus.net>
parents: 34821
diff changeset
942 """push phase information through a bundle2 - pushkey part"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
943 pushop.stepsdone.add(b'phases')
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
944 part2node = []
25502
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
945
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
946 def handlefailure(pushop, exc):
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
947 targetid = int(exc.partid)
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
948 for partid, node in part2node:
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
949 if partid == targetid:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
950 raise error.Abort(_(b'updating %s to public failed') % node)
25502
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
951
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
952 enc = pushkey.encode
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
953 for newremotehead in pushop.outdatedphases:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
954 part = bundler.newpart(b'pushkey')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
955 part.addparam(b'namespace', enc(b'phases'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
956 part.addparam(b'key', enc(newremotehead.hex()))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
957 part.addparam(b'old', enc(b'%d' % phases.draft))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
958 part.addparam(b'new', enc(b'%d' % phases.public))
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
959 part2node.append((part.id, newremotehead))
25502
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
960 pushop.pkfailcb[part.id] = handlefailure
bd41c19383db phases: abort the whole push if phases fail to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25501
diff changeset
961
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
962 def handlereply(op):
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
963 for partid, node in part2node:
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
964 partrep = op.records.getreplies(partid)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
965 results = partrep[b'pushkey']
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
966 assert len(results) <= 1
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
967 msg = None
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
968 if not results:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
969 msg = _(b'server ignored update of %s to public!\n') % node
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
970 elif not int(results[0][b'return']):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
971 msg = _(b'updating %s to public failed!\n') % node
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
972 if msg is not None:
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
973 pushop.ui.warn(msg)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
974
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
975 return handlereply
21904
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
976
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
977
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
978 @b2partsgenerator(b'obsmarkers')
22347
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
979 def _pushb2obsmarkers(pushop, bundler):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
980 if b'obsmarkers' in pushop.stepsdone:
22347
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
981 return
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
982 remoteversions = bundle2.obsmarkersversion(bundler.capabilities)
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
983 if obsolete.commonversion(remoteversions) is None:
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
984 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
985 pushop.stepsdone.add(b'obsmarkers')
22347
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
986 if pushop.outobsmarkers:
43580
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43278
diff changeset
987 markers = obsutil.sortedmarkers(pushop.outobsmarkers)
32515
e70d6dbde713 bundle2: move function building obsmarker-part in the bundle2 module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32291
diff changeset
988 bundle2.buildobsmarkerspart(bundler, markers)
22347
7198cb9b56b9 push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22346
diff changeset
989
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
990
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
991 @b2partsgenerator(b'bookmarks')
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
992 def _pushb2bookmarks(pushop, bundler):
25895
c30b739c322f exchange: s/phase/bookmark/ in _pushb2bookmarks()
Martin von Zweigbergk <martinvonz@google.com>
parents: 25836
diff changeset
993 """handle bookmark push through bundle2"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
994 if b'bookmarks' in pushop.stepsdone:
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
995 return
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
996 b2caps = bundle2.bundle2caps(pushop.remote)
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
997
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
998 legacy = pushop.repo.ui.configlist(b'devel', b'legacy.exchange')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
999 legacybooks = b'bookmarks' in legacy
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1000
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1001 if not legacybooks and b'bookmarks' in b2caps:
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1002 return _pushb2bookmarkspart(pushop, bundler)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1003 elif b'pushkey' in b2caps:
35262
3fd5f05a5b87 push: move bundle2-pushkey based bookmarks exchange in its own function
Boris Feld <boris.feld@octobus.net>
parents: 35259
diff changeset
1004 return _pushb2bookmarkspushkey(pushop, bundler)
3fd5f05a5b87 push: move bundle2-pushkey based bookmarks exchange in its own function
Boris Feld <boris.feld@octobus.net>
parents: 35259
diff changeset
1005
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1006
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1007 def _bmaction(old, new):
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1008 """small utility for bookmark pushing"""
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1009 if not old:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1010 return b'export'
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1011 elif not new:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1012 return b'delete'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1013 return b'update'
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1014
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1015
42811
3332bde53714 exchange: abort on pushing bookmarks pointing to secret changesets (issue6159)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42326
diff changeset
1016 def _abortonsecretctx(pushop, node, b):
3332bde53714 exchange: abort on pushing bookmarks pointing to secret changesets (issue6159)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42326
diff changeset
1017 """abort if a given bookmark points to a secret changeset"""
3332bde53714 exchange: abort on pushing bookmarks pointing to secret changesets (issue6159)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42326
diff changeset
1018 if node and pushop.repo[node].phase() == phases.secret:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1019 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
1020 _(b'cannot push bookmark %s as it points to a secret changeset') % b
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1021 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1022
42811
3332bde53714 exchange: abort on pushing bookmarks pointing to secret changesets (issue6159)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42326
diff changeset
1023
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1024 def _pushb2bookmarkspart(pushop, bundler):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1025 pushop.stepsdone.add(b'bookmarks')
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1026 if not pushop.outbookmarks:
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1027 return
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1028
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1029 allactions = []
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1030 data = []
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1031 for book, old, new in pushop.outbookmarks:
42811
3332bde53714 exchange: abort on pushing bookmarks pointing to secret changesets (issue6159)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42326
diff changeset
1032 _abortonsecretctx(pushop, new, book)
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1033 data.append((book, new))
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1034 allactions.append((book, _bmaction(old, new)))
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
1035 checkdata = bookmod.binaryencode(pushop.repo, data)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1036 bundler.newpart(b'bookmarks', data=checkdata)
35264
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1037
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1038 def handlereply(op):
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1039 ui = pushop.ui
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1040 # if success
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1041 for book, action in allactions:
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1042 ui.status(bookmsgmap[action][0] % book)
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1043
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1044 return handlereply
a1e70c1dbec0 bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
Boris Feld <boris.feld@octobus.net>
parents: 35262
diff changeset
1045
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1046
35262
3fd5f05a5b87 push: move bundle2-pushkey based bookmarks exchange in its own function
Boris Feld <boris.feld@octobus.net>
parents: 35259
diff changeset
1047 def _pushb2bookmarkspushkey(pushop, bundler):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1048 pushop.stepsdone.add(b'bookmarks')
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1049 part2book = []
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1050 enc = pushkey.encode
25501
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
1051
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
1052 def handlefailure(pushop, exc):
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
1053 targetid = int(exc.partid)
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
1054 for partid, book, action in part2book:
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
1055 if partid == targetid:
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
1056 raise error.Abort(bookmsgmap[action][1].rstrip() % book)
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
1057 # we should not be called for part we did not generated
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
1058 assert False
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
1059
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1060 for book, old, new in pushop.outbookmarks:
42811
3332bde53714 exchange: abort on pushing bookmarks pointing to secret changesets (issue6159)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42326
diff changeset
1061 _abortonsecretctx(pushop, new, book)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1062 part = bundler.newpart(b'pushkey')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1063 part.addparam(b'namespace', enc(b'bookmarks'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1064 part.addparam(b'key', enc(book))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1065 part.addparam(b'old', enc(hex(old)))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1066 part.addparam(b'new', enc(hex(new)))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1067 action = b'update'
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1068 if not old:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1069 action = b'export'
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1070 elif not new:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1071 action = b'delete'
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1072 part2book.append((part.id, book, action))
25501
a99fee62611d bookmarks: abort the whole push if bookmarks fails to update (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25485
diff changeset
1073 pushop.pkfailcb[part.id] = handlefailure
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1074
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1075 def handlereply(op):
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1076 ui = pushop.ui
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1077 for partid, book, action in part2book:
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1078 partrep = op.records.getreplies(partid)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1079 results = partrep[b'pushkey']
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1080 assert len(results) <= 1
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1081 if not results:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1082 pushop.ui.warn(_(b'server ignored bookmark %s update\n') % book)
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1083 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1084 ret = int(results[0][b'return'])
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1085 if ret:
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1086 ui.status(bookmsgmap[action][0] % book)
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1087 else:
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1088 ui.warn(bookmsgmap[action][1] % book)
22649
1d7a2422b90c push: set bkresult when pushing bookmarks through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22645
diff changeset
1089 if pushop.bkresult is not None:
1d7a2422b90c push: set bkresult when pushing bookmarks through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22645
diff changeset
1090 pushop.bkresult = 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1091
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1092 return handlereply
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1093
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1094
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1095 @b2partsgenerator(b'pushvars', idx=0)
33693
db3dc11356ed pushvars: move fb extension pushvars to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33689
diff changeset
1096 def _getbundlesendvars(pushop, bundler):
db3dc11356ed pushvars: move fb extension pushvars to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33689
diff changeset
1097 '''send shellvars via bundle2'''
33885
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
1098 pushvars = pushop.pushvars
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
1099 if pushvars:
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
1100 shellvars = {}
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
1101 for raw in pushvars:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1102 if b'=' not in raw:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1103 msg = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1104 b"unable to parse variable '%s', should follow "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1105 b"'KEY=VALUE' or 'KEY=' format"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1106 )
33885
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
1107 raise error.Abort(msg % raw)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1108 k, v = raw.split(b'=', 1)
33885
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
1109 shellvars[k] = v
800bb35d891e pushvars: do not mangle repo state
Jun Wu <quark@fb.com>
parents: 33794
diff changeset
1110
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1111 part = bundler.newpart(b'pushvars')
33693
db3dc11356ed pushvars: move fb extension pushvars to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33689
diff changeset
1112
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
1113 for key, value in pycompat.iteritems(shellvars):
33693
db3dc11356ed pushvars: move fb extension pushvars to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33689
diff changeset
1114 part.addparam(key, value, mandatory=False)
22242
ed222ebd61be push: add bookmarks to the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22240
diff changeset
1115
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1116
21061
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
1117 def _pushbundle2(pushop):
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
1118 """push data to the remote using bundle2
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
1119
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
1120 The only currently supported type of data is changegroup but this will
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
1121 evolve in the future."""
21644
17755dd8c509 bundle2: introduce a bundle2caps function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21643
diff changeset
1122 bundler = bundle2.bundle20(pushop.ui, bundle2.bundle2caps(pushop.remote))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1123 pushback = pushop.trmanager and pushop.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1124 b'experimental', b'bundle2.pushback'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1125 )
23439
743736fc7c41 bundle2-push: provide transaction to reply unbundler
Eric Sumner <ericsumner@fb.com>
parents: 23437
diff changeset
1126
21142
15039ce3e4a3 bundle2: include client capabilities in the pushed bundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21141
diff changeset
1127 # create reply capability
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1128 capsblob = bundle2.encodecaps(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1129 bundle2.getrepocaps(pushop.repo, allowpushback=pushback, role=b'client')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1130 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1131 bundler.newpart(b'replycaps', data=capsblob)
21904
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
1132 replyhandlers = []
22017
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
1133 for partgenname in b2partsgenorder:
7986e99bb69a push: rework the bundle2partsgenerators logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22016
diff changeset
1134 partgen = b2partsgenmapping[partgenname]
21904
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
1135 ret = partgen(pushop, bundler)
21941
dab31290c7eb bundle2: only use callable return as reply handler
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21906
diff changeset
1136 if callable(ret):
dab31290c7eb bundle2: only use callable return as reply handler
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21906
diff changeset
1137 replyhandlers.append(ret)
21904
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
1138 # do not push if nothing to push
21903
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
1139 if bundler.nbparts <= 1:
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
1140 return
21061
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
1141 stream = util.chunkbuffer(bundler.getchunks())
21182
08c84fd99aac bundle2: catch UnknownPartError during local push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21181
diff changeset
1142 try:
25485
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
1143 try:
37646
72e26319f3b8 wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
1144 with pushop.remote.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1145 reply = e.callcommand(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1146 b'unbundle',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1147 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1148 b'bundle': stream,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1149 b'heads': [b'force'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1150 b'url': pushop.remote.url(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1151 },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1152 ).result()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25640
diff changeset
1153 except error.BundleValueError as exc:
46977
3f87d2af0bd6 errors: raise RemoteError in some places in exchange.py
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
1154 raise error.RemoteError(_(b'missing support for %s') % exc)
25485
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
1155 try:
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
1156 trgetter = None
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
1157 if pushback:
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
1158 trgetter = pushop.trmanager.transaction
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
1159 op = bundle2.processbundle(pushop.repo, reply, trgetter)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25640
diff changeset
1160 except error.BundleValueError as exc:
46977
3f87d2af0bd6 errors: raise RemoteError in some places in exchange.py
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
1161 raise error.RemoteError(_(b'missing support for %s') % exc)
26829
58f1645f72c3 bundle2: attribute remote failures to remote (issue4788)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
1162 except bundle2.AbortFromPart as exc:
46478
db9e33beb0fb bundle2: print "error:abort" message to stderr instead of stdout
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
1163 pushop.ui.error(_(b'remote: %s\n') % exc)
30908
4c8dcb491974 bundle2: keep hint close to the primary message when remote abort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30685
diff changeset
1164 if exc.hint is not None:
46478
db9e33beb0fb bundle2: print "error:abort" message to stderr instead of stdout
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
1165 pushop.ui.error(_(b'remote: %s\n') % (b'(%s)' % exc.hint))
46977
3f87d2af0bd6 errors: raise RemoteError in some places in exchange.py
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
1166 raise error.RemoteError(_(b'push failed on remote'))
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25640
diff changeset
1167 except error.PushkeyFailed as exc:
25485
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
1168 partid = int(exc.partid)
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
1169 if partid not in pushop.pkfailcb:
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
1170 raise
8182163ae983 push: catch and process PushkeyFailed error
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25480
diff changeset
1171 pushop.pkfailcb[partid](pushop, exc)
21904
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
1172 for rephand in replyhandlers:
5fbccbcc07ea bundle2-push: introduce a list of part generating functions
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21903
diff changeset
1173 rephand(op)
21061
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
1174
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1175
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1176 def _pushchangeset(pushop):
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1177 """Make the actual push of changeset bundle to remote repo"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1178 if b'changesets' in pushop.stepsdone:
21902
7a7def851ba0 push: use `stepsdone` to control changegroup push through bundle10 or bundle20
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21901
diff changeset
1179 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1180 pushop.stepsdone.add(b'changesets')
21903
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
1181 if not _pushcheckoutgoing(pushop):
48f61cfb7576 bundle2-push: move changegroup push validation inside _pushb2ctx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21902
diff changeset
1182 return
33701
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1183
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1184 # Should have verified this in push().
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1185 assert pushop.remote.capable(b'unbundle')
33701
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1186
28876
79b8f052ee51 localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents: 28668
diff changeset
1187 pushop.repo.prepushoutgoinghooks(pushop)
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1188 outgoing = pushop.outgoing
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1189 # TODO: get bundlecaps from remote
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1190 bundlecaps = None
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1191 # create a changegroup from local
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1192 if pushop.revs is None and not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1193 outgoing.excluded or pushop.repo.changelog.filteredrevs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1194 ):
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1195 # push everything,
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1196 # use the fast path, no race possible on push
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1197 cg = changegroup.makechangegroup(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1198 pushop.repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1199 outgoing,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1200 b'01',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1201 b'push',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1202 fastpath=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1203 bundlecaps=bundlecaps,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1204 )
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1205 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1206 cg = changegroup.makechangegroup(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1207 pushop.repo, outgoing, b'01', b'push', bundlecaps=bundlecaps
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1208 )
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1209
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1210 # apply changegroup to remote
33701
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1211 # local repo finds heads on server, finds out what
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1212 # revs it must push. once revs transferred, if server
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1213 # finds it has different heads (someone else won
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1214 # commit/push race), server aborts.
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1215 if pushop.force:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1216 remoteheads = [b'force']
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1217 else:
33701
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1218 remoteheads = pushop.remoteheads
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1219 # ssh: return remote's addchangegroup()
fda0867cfe03 exchange: drop support for lock-based unbundling (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33693
diff changeset
1220 # http: return remote's addchangegroup() or 0 for error
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1221 pushop.cgresult = pushop.remote.unbundle(cg, remoteheads, pushop.repo.url())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1222
20463
f1b532a310e4 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20462
diff changeset
1223
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1224 def _pushsyncphase(pushop):
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
1225 """synchronise phase information locally and remotely"""
20468
7d0bbb6dd730 push: extract new common set computation from phase synchronisation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20467
diff changeset
1226 cheads = pushop.commonheads
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1227 # even when we don't push, exchanging phase data is useful
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1228 remotephases = listkeys(pushop.remote, b'phases')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1229 if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1230 pushop.ui.configbool(b'ui', b'_usedassubrepo')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1231 and remotephases # server supports phases
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1232 and pushop.cgresult is None # nothing was pushed
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1233 and remotephases.get(b'publishing', False)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1234 ):
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1235 # When:
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1236 # - this is a subrepo push
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1237 # - and remote support phase
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1238 # - and no changeset was pushed
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1239 # - and remote is publishing
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1240 # We may be in issue 3871 case!
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1241 # We drop the possible phase synchronisation done by
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1242 # courtesy to publish changesets possibly locally draft
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1243 # on the remote.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1244 remotephases = {b'publishing': b'True'}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1245 if not remotephases: # old server or public only reply from non-publishing
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1246 _localphasemove(pushop, cheads)
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1247 # don't push any phase data as there is nothing to push
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1248 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1249 ana = phases.analyzeremotephases(pushop.repo, cheads, remotephases)
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1250 pheads, droots = ana
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1251 ### Apply remote phase on local
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1252 if remotephases.get(b'publishing', False):
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1253 _localphasemove(pushop, cheads)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1254 else: # publish = False
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1255 _localphasemove(pushop, pheads)
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1256 _localphasemove(pushop, cheads, phases.draft)
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1257 ### Apply local phase on remote
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1258
22615
4f14303e8954 push: rename `pushop.ret` to `pushop.cgresult`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22543
diff changeset
1259 if pushop.cgresult:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1260 if b'phases' in pushop.stepsdone:
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
1261 # phases already pushed though bundle2
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
1262 return
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
1263 outdated = pushop.outdatedphases
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
1264 else:
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
1265 outdated = pushop.fallbackoutdatedphases
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
1266
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1267 pushop.stepsdone.add(b'phases')
22020
311979b773fb push: include phase push in the unified bundle2 push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22019
diff changeset
1268
22019
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
1269 # filter heads already turned public by the push
9fcf772f15ff push: perform phases discovery before the push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22018
diff changeset
1270 outdated = [c for c in outdated if c.node() not in pheads]
23376
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
1271 # fallback to independent pushkey command
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
1272 for newremotehead in outdated:
37647
516b5a5edae3 exchange: use command executor for pushkey
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
1273 with pushop.remote.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1274 r = e.callcommand(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1275 b'pushkey',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1276 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1277 b'namespace': b'phases',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1278 b'key': newremotehead.hex(),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1279 b'old': b'%d' % phases.draft,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1280 b'new': b'%d' % phases.public,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1281 },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1282 ).result()
37647
516b5a5edae3 exchange: use command executor for pushkey
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
1283
23376
2e65da5f80df push: stop independent usage of bundle2 in syncphase (issue4454)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23082
diff changeset
1284 if not r:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1285 pushop.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1286 _(b'updating %s to public failed!\n') % newremotehead
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1287 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1288
20441
eca9d5375606 push: move phases synchronisation function in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20440
diff changeset
1289
20438
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
1290 def _localphasemove(pushop, nodes, phase=phases.public):
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
1291 """move <nodes> to <phase> in the local source repo"""
23437
94e2862dbcfb push: elevate phase transaction to cover entire operation
Eric Sumner <ericsumner@fb.com>
parents: 23436
diff changeset
1292 if pushop.trmanager:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1293 phases.advanceboundary(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1294 pushop.repo, pushop.trmanager.transaction(), phase, nodes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1295 )
20438
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
1296 else:
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
1297 # repo is not locked, do not change any phases!
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
1298 # Informs the user that phases should have been moved when
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
1299 # applicable.
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
1300 actualmoves = [n for n in nodes if phase < pushop.repo[n].phase()]
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
1301 phasestr = phases.phasenames[phase]
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
1302 if actualmoves:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1303 pushop.ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1304 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1305 b'cannot lock source repo, skipping '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1306 b'local %s phase update\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1307 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1308 % phasestr
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1309 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1310
20438
2b5ab0d11327 push: move local phase move in a normal function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20437
diff changeset
1311
20433
6af248474224 push: feed pushoperation object to _pushobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20432
diff changeset
1312 def _pushobsolete(pushop):
20434
e009e59e4566 push: drop now outdated comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20433
diff changeset
1313 """utility function to push obsolete markers to a remote"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1314 if b'obsmarkers' in pushop.stepsdone:
22036
f1528ef123f4 push: use stepsdone for obsmarkers push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22035
diff changeset
1315 return
20433
6af248474224 push: feed pushoperation object to _pushobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20432
diff changeset
1316 repo = pushop.repo
6af248474224 push: feed pushoperation object to _pushobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20432
diff changeset
1317 remote = pushop.remote
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1318 pushop.stepsdone.add(b'obsmarkers')
22350
6d113cc7a31a push: only push obsmarkers relevant to the "pushed subset"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22347
diff changeset
1319 if pushop.outobsmarkers:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1320 pushop.ui.debug(b'try to push obsolete markers to remote\n')
20432
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
1321 rslts = []
43580
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43278
diff changeset
1322 markers = obsutil.sortedmarkers(pushop.outobsmarkers)
43278
2c70dd03b743 py3: fix sorting of obsolete markers during push
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43277
diff changeset
1323 remotedata = obsolete._pushkeyescape(markers)
20432
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
1324 for key in sorted(remotedata, reverse=True):
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
1325 # reverse sort to ensure we end with dump0
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
1326 data = remotedata[key]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1327 rslts.append(remote.pushkey(b'obsolete', key, b'', data))
20432
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
1328 if [r for r in rslts if not r]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1329 msg = _(b'failed to push some obsolete markers!\n')
20432
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
1330 repo.ui.warn(msg)
1b926f0bbf8a push: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20431
diff changeset
1331
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1332
20431
bebf8b8479f3 push: feed pushoperation object to _pushbookmark function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20352
diff changeset
1333 def _pushbookmark(pushop):
20352
58300f61b139 push: move bookmarks exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20351
diff changeset
1334 """Update bookmark position on remote"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1335 if pushop.cgresult == 0 or b'bookmarks' in pushop.stepsdone:
22228
a3dc2d385490 pushbookmark: do not attempt to update bookmarks if the push failed (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22227
diff changeset
1336 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1337 pushop.stepsdone.add(b'bookmarks')
20431
bebf8b8479f3 push: feed pushoperation object to _pushbookmark function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20352
diff changeset
1338 ui = pushop.ui
bebf8b8479f3 push: feed pushoperation object to _pushbookmark function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20352
diff changeset
1339 remote = pushop.remote
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1340
22239
0688010ee38f push: move bookmark discovery with other discovery steps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22238
diff changeset
1341 for b, old, new in pushop.outbookmarks:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1342 action = b'update'
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1343 if not old:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1344 action = b'export'
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1345 elif not new:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1346 action = b'delete'
37647
516b5a5edae3 exchange: use command executor for pushkey
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
1347
516b5a5edae3 exchange: use command executor for pushkey
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
1348 with remote.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1349 r = e.callcommand(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1350 b'pushkey',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1351 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1352 b'namespace': b'bookmarks',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1353 b'key': b,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1354 b'old': hex(old),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1355 b'new': hex(new),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1356 },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1357 ).result()
37647
516b5a5edae3 exchange: use command executor for pushkey
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
1358
516b5a5edae3 exchange: use command executor for pushkey
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
1359 if r:
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1360 ui.status(bookmsgmap[action][0] % b)
20352
58300f61b139 push: move bookmarks exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20351
diff changeset
1361 else:
22650
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1362 ui.warn(bookmsgmap[action][1] % b)
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1363 # discovery can have set the value form invalid entry
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1364 if pushop.bkresult is not None:
36952c91e6c3 push: prepare the issue of multiple kinds of messages
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22649
diff changeset
1365 pushop.bkresult = 1
20469
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
1366
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1367
20472
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
1368 class pulloperation(object):
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
1369 """A object that represent a single pull operation
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
1370
23219
61cd79ac4b99 exchange: swap "push" for "pull" in pulloperation docstring
Mike Edgar <adgar@google.com>
parents: 23218
diff changeset
1371 It purpose is to carry pull related state and very common operation.
20472
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
1372
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
1373 A new should be created at the beginning of each pull and discarded
20472
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
1374 afterward.
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
1375 """
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
1376
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1377 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1378 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1379 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1380 remote,
48241
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47492
diff changeset
1381 path,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1382 heads=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1383 force=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1384 bookmarks=(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1385 remotebookmarks=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1386 streamclonerequested=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1387 includepats=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1388 excludepats=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1389 depth=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1390 ):
20596
004a1744088d exchange: fix docs for pulloperation
Siddharth Agarwal <sid0@fb.com>
parents: 20489
diff changeset
1391 # repo we pull into
20472
b97a453b8c27 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20469
diff changeset
1392 self.repo = repo
20596
004a1744088d exchange: fix docs for pulloperation
Siddharth Agarwal <sid0@fb.com>
parents: 20489
diff changeset
1393 # repo we pull from
20473
1516daaca632 pull: move `remote` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20472
diff changeset
1394 self.remote = remote
48241
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47492
diff changeset
1395 # path object used to build this remote
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47492
diff changeset
1396 #
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47492
diff changeset
1397 # Ideally, the remote peer would carry that directly.
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47492
diff changeset
1398 self.remote_path = path
20474
c9bceafc61be pull: move `heads` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20473
diff changeset
1399 # revision we try to pull (None is "all")
c9bceafc61be pull: move `heads` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20473
diff changeset
1400 self.heads = heads
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
1401 # bookmark pulled explicitly
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1402 self.explicitbookmarks = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1403 repo._bookmarks.expandname(bookmark) for bookmark in bookmarks
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1404 ]
20475
b79b405583af pull: move `force` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20474
diff changeset
1405 # do we force pull?
b79b405583af pull: move `force` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20474
diff changeset
1406 self.force = force
26448
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
1407 # whether a streaming clone was requested
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
1408 self.streamclonerequested = streamclonerequested
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1409 # transaction manager
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1410 self.trmanager = None
20487
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1411 # set of common changeset between local and remote before pull
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1412 self.common = None
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1413 # set of pulled head
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1414 self.rheads = None
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
1415 # list of missing changeset to fetch remotely
20488
76e66654f74e pull: move `fetch` subset into the object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20487
diff changeset
1416 self.fetch = None
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
1417 # remote bookmarks data
25446
b5311068077e pull: prevent race condition in bookmark update when using -B (issue4689)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25445
diff changeset
1418 self.remotebookmarks = remotebookmarks
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
1419 # result of changegroup pulling (used as return code by pull)
20898
f295b2ac3579 pull: move return code in the pull operation object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20878
diff changeset
1420 self.cgresult = None
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
1421 # list of step already done
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
1422 self.stepsdone = set()
26689
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
1423 # Whether we attempted a clone from pre-generated bundles.
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
1424 self.clonebundleattempted = False
39553
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1425 # Set of file patterns to include.
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1426 self.includepats = includepats
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1427 # Set of file patterns to exclude.
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1428 self.excludepats = excludepats
40331
ac59de55c8b4 exchange: support declaring pull depth
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39911
diff changeset
1429 # Number of ancestor changesets to pull from each pulled head.
ac59de55c8b4 exchange: support declaring pull depth
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39911
diff changeset
1430 self.depth = depth
20487
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1431
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1432 @util.propertycache
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1433 def pulledsubset(self):
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1434 """heads of the set of changeset target by the pull"""
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1435 # compute target subset
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1436 if self.heads is None:
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1437 # We pulled every thing possible
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1438 # sync on everything common
20878
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
1439 c = set(self.common)
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
1440 ret = list(self.common)
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
1441 for n in self.rheads:
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
1442 if n not in c:
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
1443 ret.append(n)
09e7118715eb pull: prevent duplicated entry in `op.pulledsubset`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20596
diff changeset
1444 return ret
20487
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1445 else:
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1446 # We pulled a specific subset
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1447 # sync on this subset
f715cc0b5107 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20486
diff changeset
1448 return self.heads
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
1449
26464
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
1450 @util.propertycache
26465
eda32ee9962f exchange: expose bundle2 availability on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26464
diff changeset
1451 def canusebundle2(self):
29682
2db085d5f5a2 bundle2: rename the _canusebundle2 method to _forcebundle1
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
1452 return not _forcebundle1(self)
26465
eda32ee9962f exchange: expose bundle2 availability on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26464
diff changeset
1453
eda32ee9962f exchange: expose bundle2 availability on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26464
diff changeset
1454 @util.propertycache
26464
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
1455 def remotebundle2caps(self):
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
1456 return bundle2.bundle2caps(self.remote)
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
1457
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
1458 def gettransaction(self):
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1459 # deprecated; talk to trmanager directly
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1460 return self.trmanager.transaction()
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1461
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1462
33793
bbbbd3c30bfc util: add base class for transactional context managers
Martin von Zweigbergk <martinvonz@google.com>
parents: 33792
diff changeset
1463 class transactionmanager(util.transactional):
23543
4dd8a6a1240d spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23439
diff changeset
1464 """An object to manage the life cycle of a transaction
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1465
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1466 It creates the transaction on demand and calls the appropriate hooks when
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1467 closing the transaction."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1468
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1469 def __init__(self, repo, source, url):
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1470 self.repo = repo
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1471 self.source = source
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1472 self.url = url
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1473 self._tr = None
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1474
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1475 def transaction(self):
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1476 """Return an open transaction object, constructing if necessary"""
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1477 if not self._tr:
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
1478 trname = b'%s\n%s' % (self.source, urlutil.hidepassword(self.url))
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1479 self._tr = self.repo.transaction(trname)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1480 self._tr.hookargs[b'source'] = self.source
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1481 self._tr.hookargs[b'url'] = self.url
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
1482 return self._tr
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
1483
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1484 def close(self):
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
1485 """close transaction if created"""
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
1486 if self._tr is not None:
23222
6b7e60fb0b38 exchange: use the postclose API on transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23219
diff changeset
1487 self._tr.close()
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
1488
23436
52db731b964d pull: extract transaction logic into separate object
Eric Sumner <ericsumner@fb.com>
parents: 23382
diff changeset
1489 def release(self):
20477
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
1490 """release transaction if created"""
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
1491 if self._tr is not None:
2607a21bb40b pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
1492 self._tr.release()
20469
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
1493
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1494
37757
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
1495 def listkeys(remote, namespace):
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
1496 with remote.commandexecutor() as e:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1497 return e.callcommand(b'listkeys', {b'namespace': namespace}).result()
37757
2a8ad00b8aed exchange: use command executor interface for calling listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37663
diff changeset
1498
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1499
37498
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1500 def _fullpullbundle2(repo, pullop):
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1501 # The server may send a partial reply, i.e. when inlining
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1502 # pre-computed bundles. In that case, update the common
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1503 # set based on the results and pull another bundle.
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1504 #
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1505 # There are two indicators that the process is finished:
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1506 # - no changeset has been added, or
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1507 # - all remote heads are known locally.
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1508 # The head check must use the unfiltered view as obsoletion
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1509 # markers can hide heads.
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1510 unfi = repo.unfiltered()
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1511 unficl = unfi.changelog
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1512
37498
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1513 def headsofdiff(h1, h2):
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1514 """Returns heads(h1 % h2)"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1515 res = unfi.set(b'heads(%ln %% %ln)', h1, h2)
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44372
diff changeset
1516 return {ctx.node() for ctx in res}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1517
37498
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1518 def headsofunion(h1, h2):
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1519 """Returns heads((h1 + h2) - null)"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1520 res = unfi.set(b'heads((%ln + %ln - null))', h1, h2)
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44372
diff changeset
1521 return {ctx.node() for ctx in res}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1522
37498
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1523 while True:
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1524 old_heads = unficl.heads()
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1525 clstart = len(unficl)
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1526 _pullbundle2(pullop)
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
1527 if requirements.NARROW_REQUIREMENT in repo.requirements:
37498
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1528 # XXX narrow clones filter the heads on the server side during
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1529 # XXX getbundle and result in partial replies as well.
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1530 # XXX Disable pull bundles in this case as band aid to avoid
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1531 # XXX extra round trips.
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1532 break
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1533 if clstart == len(unficl):
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1534 break
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1535 if all(unficl.hasnode(n) for n in pullop.rheads):
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1536 break
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1537 new_heads = headsofdiff(unficl.heads(), old_heads)
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1538 pullop.common = headsofunion(new_heads, pullop.common)
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1539 pullop.rheads = set(pullop.rheads) - pullop.common
aacfca6f9767 wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents: 37237
diff changeset
1540
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1541
44545
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1542 def add_confirm_callback(repo, pullop):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45910
diff changeset
1543 """adds a finalize callback to transaction which can be used to show stats
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45910
diff changeset
1544 to user and confirm the pull before committing transaction"""
44545
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1545
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1546 tr = pullop.trmanager.transaction()
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1547 scmutil.registersummarycallback(
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1548 repo, tr, txnname=b'pull', as_validator=True
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1549 )
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1550 reporef = weakref.ref(repo.unfiltered())
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1551
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1552 def prompt(tr):
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1553 repo = reporef()
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1554 cm = _(b'accept incoming changes (yn)?$$ &Yes $$ &No')
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1555 if repo.ui.promptchoice(cm):
45681
a736ab681b78 errors: stop passing non-strings to Abort's constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 45552
diff changeset
1556 raise error.Abort(b"user aborted")
44545
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1557
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1558 tr.addvalidator(b'900-pull-prompt', prompt)
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1559
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1560
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1561 def pull(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1562 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1563 remote,
48241
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47492
diff changeset
1564 path=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1565 heads=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1566 force=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1567 bookmarks=(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1568 opargs=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1569 streamclonerequested=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1570 includepats=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1571 excludepats=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1572 depth=None,
44545
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1573 confirm=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1574 ):
26440
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1575 """Fetch repository data from a remote.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1576
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1577 This is the main function used to retrieve data from a remote repository.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1578
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1579 ``repo`` is the local repository to clone into.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1580 ``remote`` is a peer instance.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1581 ``heads`` is an iterable of revisions we want to pull. ``None`` (the
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1582 default) means to pull everything from the remote.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1583 ``bookmarks`` is an iterable of bookmarks requesting to be pulled. By
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1584 default, all remote bookmarks are pulled.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1585 ``opargs`` are additional keyword arguments to pass to ``pulloperation``
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1586 initialization.
26448
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
1587 ``streamclonerequested`` is a boolean indicating whether a "streaming
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
1588 clone" is requested. A "streaming clone" is essentially a raw file copy
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
1589 of revlogs from the server. This only works when the local repository is
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
1590 empty. The default value of ``None`` means to respect the server
e05fd574c922 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26443
diff changeset
1591 configuration for preferring stream clones.
39553
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1592 ``includepats`` and ``excludepats`` define explicit file patterns to
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1593 include and exclude in storage, respectively. If not defined, narrow
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1594 patterns from the repo instance are used, if available.
40331
ac59de55c8b4 exchange: support declaring pull depth
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39911
diff changeset
1595 ``depth`` is an integer indicating the DAG depth of history we're
ac59de55c8b4 exchange: support declaring pull depth
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39911
diff changeset
1596 interested in. If defined, for each revision specified in ``heads``, we
ac59de55c8b4 exchange: support declaring pull depth
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39911
diff changeset
1597 will fetch up to this many of its ancestors and data associated with them.
44545
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1598 ``confirm`` is a boolean indicating whether the pull should be confirmed
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1599 before committing the transaction. This overrides HGPLAIN.
26440
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1600
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1601 Returns the ``pulloperation`` created for this pull.
85b992177d2a exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26428
diff changeset
1602 """
25445
1457c1f28c92 pull: allow a generic way to pass parameters to the pull operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25444
diff changeset
1603 if opargs is None:
1457c1f28c92 pull: allow a generic way to pass parameters to the pull operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25444
diff changeset
1604 opargs = {}
39553
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1605
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1606 # We allow the narrow patterns to be passed in explicitly to provide more
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1607 # flexibility for API consumers.
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1608 if includepats or excludepats:
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1609 includepats = includepats or set()
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1610 excludepats = excludepats or set()
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1611 else:
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1612 includepats, excludepats = repo.narrowpats
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1613
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1614 narrowspec.validatepatterns(includepats)
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1615 narrowspec.validatepatterns(excludepats)
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39158
diff changeset
1616
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1617 pullop = pulloperation(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1618 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1619 remote,
48241
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47492
diff changeset
1620 path=path,
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47492
diff changeset
1621 heads=heads,
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47492
diff changeset
1622 force=force,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1623 bookmarks=bookmarks,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1624 streamclonerequested=streamclonerequested,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1625 includepats=includepats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1626 excludepats=excludepats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1627 depth=depth,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1628 **pycompat.strkwargs(opargs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1629 )
33702
033484935391 exchange: access requirements on repo instead of peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33701
diff changeset
1630
033484935391 exchange: access requirements on repo instead of peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33701
diff changeset
1631 peerlocal = pullop.remote.local()
033484935391 exchange: access requirements on repo instead of peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33701
diff changeset
1632 if peerlocal:
033484935391 exchange: access requirements on repo instead of peer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33701
diff changeset
1633 missing = set(peerlocal.requirements) - pullop.repo.supported
20469
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
1634 if missing:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1635 msg = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1636 b"required features are not"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1637 b" supported in the destination:"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1638 b" %s"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1639 ) % (b', '.join(sorted(missing)))
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26566
diff changeset
1640 raise error.Abort(msg)
20469
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
1641
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1642 for category in repo._wanted_sidedata:
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1643 # Check that a computer is registered for that category for at least
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1644 # one revlog kind.
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1645 for kind, computers in repo._sidedata_computers.items():
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1646 if computers.get(category):
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1647 break
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1648 else:
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1649 # This should never happen since repos are supposed to be able to
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1650 # generate the sidedata they require.
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1651 raise error.ProgrammingError(
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1652 _(
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1653 b'sidedata category requested by local side without local'
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1654 b"support: '%s'"
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1655 )
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1656 % pycompat.bytestr(category)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1657 )
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1658
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1659 pullop.trmanager = transactionmanager(repo, b'pull', remote.url())
42326
5d4ec64a6fcb exchange: don't take wlock if bookmarks are stored in .hg/store/
Martin von Zweigbergk <martinvonz@google.com>
parents: 42209
diff changeset
1660 wlock = util.nullcontextmanager()
5d4ec64a6fcb exchange: don't take wlock if bookmarks are stored in .hg/store/
Martin von Zweigbergk <martinvonz@google.com>
parents: 42209
diff changeset
1661 if not bookmod.bookmarksinstore(repo):
5d4ec64a6fcb exchange: don't take wlock if bookmarks are stored in .hg/store/
Martin von Zweigbergk <martinvonz@google.com>
parents: 42209
diff changeset
1662 wlock = repo.wlock()
5d4ec64a6fcb exchange: don't take wlock if bookmarks are stored in .hg/store/
Martin von Zweigbergk <martinvonz@google.com>
parents: 42209
diff changeset
1663 with wlock, repo.lock(), pullop.trmanager:
44545
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1664 if confirm or (
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1665 repo.ui.configbool(b"pull", b"confirm") and not repo.ui.plain()
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1666 ):
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1667 add_confirm_callback(repo, pullop)
bd7b2c8d06cc pull: add `--confirm` flag to confirm before writing changes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
1668
39629
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1669 # Use the modern wire protocol, if available.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1670 if remote.capable(b'command-changesetdata'):
39629
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1671 exchangev2.pull(pullop)
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1672 else:
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1673 # This should ideally be in _pullbundle2(). However, it needs to run
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1674 # before discovery to avoid extra work.
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1675 _maybeapplyclonebundle(pullop)
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1676 streamclone.maybeperformlegacystreamclone(pullop)
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1677 _pulldiscovery(pullop)
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1678 if pullop.canusebundle2:
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1679 _fullpullbundle2(repo, pullop)
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1680 _pullchangeset(pullop)
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1681 _pullphase(pullop)
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1682 _pullbookmarks(pullop)
a86d21e70b2b exchangev2: start to implement pull with wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
1683 _pullobsolete(pullop)
20469
6b4c789d618d exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20468
diff changeset
1684
35236
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35041
diff changeset
1685 # storing remotenames
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1686 if repo.ui.configbool(b'experimental', b'remotenames'):
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35305
diff changeset
1687 logexchange.pullremotenames(repo, remote)
35236
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35041
diff changeset
1688
22693
68439b154063 exchange: have `pull` return the pulloperation object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
1689 return pullop
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
1690
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1691
22936
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1692 # list of steps to perform discovery before pull
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1693 pulldiscoveryorder = []
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1694
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1695 # Mapping between step name and function
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1696 #
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1697 # This exists to help extensions wrap steps if necessary
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1698 pulldiscoverymapping = {}
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1699
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1700
22936
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1701 def pulldiscovery(stepname):
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1702 """decorator for function performing discovery before pull
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1703
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1704 The function is added to the step -> function mapping and appended to the
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1705 list of steps. Beware that decorated function will be added in order (this
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1706 may matter).
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1707
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1708 You can only use this decorator for a new step, if you want to wrap a step
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1709 from an extension, change the pulldiscovery dictionary directly."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1710
22936
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1711 def dec(func):
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1712 assert stepname not in pulldiscoverymapping
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1713 pulldiscoverymapping[stepname] = func
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1714 pulldiscoveryorder.append(stepname)
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1715 return func
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1716
22936
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1717 return dec
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1718
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1719
20900
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
1720 def _pulldiscovery(pullop):
22936
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1721 """Run all discovery steps"""
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1722 for stepname in pulldiscoveryorder:
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1723 step = pulldiscoverymapping[stepname]
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1724 step(pullop)
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1725
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1726
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1727 @pulldiscovery(b'b1:bookmarks')
25369
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
1728 def _pullbookmarkbundle1(pullop):
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
1729 """fetch bookmark data in bundle1 case
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
1730
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
1731 If not using bundle2, we have to fetch bookmarks before changeset
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
1732 discovery to reduce the chance and impact of race conditions."""
25443
443d3decbdde pull: skip pulling remote bookmarks with bundle1 if a value already exist
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25423
diff changeset
1733 if pullop.remotebookmarks is not None:
443d3decbdde pull: skip pulling remote bookmarks with bundle1 if a value already exist
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25423
diff changeset
1734 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1735 if pullop.canusebundle2 and b'listkeys' in pullop.remotebundle2caps:
25479
f00a63a43c4b bundle2: pull bookmark the old way if no bundle2 listkeys support (issue4701)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25446
diff changeset
1736 # all known bundle2 servers now support listkeys, but lets be nice with
f00a63a43c4b bundle2: pull bookmark the old way if no bundle2 listkeys support (issue4701)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25446
diff changeset
1737 # new implementation.
f00a63a43c4b bundle2: pull bookmark the old way if no bundle2 listkeys support (issue4701)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25446
diff changeset
1738 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1739 books = listkeys(pullop.remote, b'bookmarks')
35039
d7a4384d2d87 pull: store binary node in pullop.remotebookmarks
Boris Feld <boris.feld@octobus.net>
parents: 34910
diff changeset
1740 pullop.remotebookmarks = bookmod.unhexlifybookmarks(books)
25369
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
1741
02defdb1b628 pull: only prefetch bookmarks when using bundle1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25337
diff changeset
1742
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1743 @pulldiscovery(b'changegroup')
22936
dae236906fb2 pull: make discovery phase extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22693
diff changeset
1744 def _pulldiscoverychangegroup(pullop):
20900
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
1745 """discovery phase for the pull
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
1746
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
1747 Current handle changeset discovery only, will change handle all discovery
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
1748 at some point."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1749 tmp = discovery.findcommonincoming(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1750 pullop.repo, pullop.remote, heads=pullop.heads, force=pullop.force
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1751 )
23848
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1752 common, fetch, rheads = tmp
43545
9c1f4e2f1fc4 index: use `index.has_node` in `exchange._pulldiscoverychangegroup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
1753 has_node = pullop.repo.unfiltered().changelog.index.has_node
23848
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1754 if fetch and rheads:
34317
e45ec589f962 discovery: avoid dropping remote heads hidden locally
Boris Feld <boris.feld@octobus.net>
parents: 34221
diff changeset
1755 # If a remote heads is filtered locally, put in back in common.
23848
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1756 #
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1757 # This is a hackish solution to catch most of "common but locally
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1758 # hidden situation". We do not performs discovery on unfiltered
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1759 # repository because it end up doing a pathological amount of round
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1760 # trip for w huge amount of changeset we do not care about.
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1761 #
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1762 # If a set of such "common but filtered" changeset exist on the server
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1763 # but are not including a remote heads, we'll not be able to detect it,
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1764 scommon = set(common)
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1765 for n in rheads:
43545
9c1f4e2f1fc4 index: use `index.has_node` in `exchange._pulldiscoverychangegroup`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
1766 if has_node(n):
23975
3b7088a5c64c discovery: properly exclude locally known but filtered heads
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23890
diff changeset
1767 if n not in scommon:
3b7088a5c64c discovery: properly exclude locally known but filtered heads
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23890
diff changeset
1768 common.append(n)
34317
e45ec589f962 discovery: avoid dropping remote heads hidden locally
Boris Feld <boris.feld@octobus.net>
parents: 34221
diff changeset
1769 if set(rheads).issubset(set(common)):
23848
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1770 fetch = []
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1771 pullop.common = common
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1772 pullop.fetch = fetch
c5456b64eb07 discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23591
diff changeset
1773 pullop.rheads = rheads
20900
cb37fb91bc5a pull: put discovery step in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20899
diff changeset
1774
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1775
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
1776 def _pullbundle2(pullop):
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
1777 """pull data using bundle2
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
1778
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
1779 For now, the only supported data are changegroup."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1780 kwargs = {b'bundlecaps': caps20to10(pullop.repo, role=b'client')}
26471
41dd7b2c7e15 exchange: add "streaming all changes" to bundle2 pulling
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26465
diff changeset
1781
35761
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
1782 # make ui easier to access
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
1783 ui = pullop.repo.ui
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
1784
32257
205bd3936179 bundle2: don't check for whether we can do stream clones
Siddharth Agarwal <sid0@fb.com>
parents: 32222
diff changeset
1785 # At the moment we don't do stream clones over bundle2. If that is
205bd3936179 bundle2: don't check for whether we can do stream clones
Siddharth Agarwal <sid0@fb.com>
parents: 32222
diff changeset
1786 # implemented then here's where the check for that will go.
35763
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
1787 streaming = streamclone.canperformstreamclone(pullop, bundle2=True)[0]
26471
41dd7b2c7e15 exchange: add "streaming all changes" to bundle2 pulling
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26465
diff changeset
1788
35761
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
1789 # declare pull perimeters
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1790 kwargs[b'common'] = pullop.common
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1791 kwargs[b'heads'] = pullop.heads or pullop.rheads
35761
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
1792
40492
440f5b65be57 exchange: pass includepats and excludepats as arguments to getbundle()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40352
diff changeset
1793 # check server supports narrow and then adding includepats and excludepats
440f5b65be57 exchange: pass includepats and excludepats as arguments to getbundle()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40352
diff changeset
1794 servernarrow = pullop.remote.capable(wireprototypes.NARROWCAP)
440f5b65be57 exchange: pass includepats and excludepats as arguments to getbundle()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40352
diff changeset
1795 if servernarrow and pullop.includepats:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1796 kwargs[b'includepats'] = pullop.includepats
40492
440f5b65be57 exchange: pass includepats and excludepats as arguments to getbundle()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40352
diff changeset
1797 if servernarrow and pullop.excludepats:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1798 kwargs[b'excludepats'] = pullop.excludepats
40492
440f5b65be57 exchange: pass includepats and excludepats as arguments to getbundle()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40352
diff changeset
1799
35763
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
1800 if streaming:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1801 kwargs[b'cg'] = False
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1802 kwargs[b'stream'] = True
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1803 pullop.stepsdone.add(b'changegroup')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1804 pullop.stepsdone.add(b'phases')
35763
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
1805
7eedbd5d4880 streamclone: add support for bundle2 based stream clone
Boris Feld <boris.feld@octobus.net>
parents: 35762
diff changeset
1806 else:
35762
40df727b6f4f pull: preindent some code
Boris Feld <boris.feld@octobus.net>
parents: 35761
diff changeset
1807 # pulling changegroup
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1808 pullop.stepsdone.add(b'changegroup')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1809
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1810 kwargs[b'cg'] = pullop.fetch
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1811
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1812 legacyphase = b'phases' in ui.configlist(b'devel', b'legacy.exchange')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1813 hasbinaryphase = b'heads' in pullop.remotebundle2caps.get(b'phases', ())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1814 if not legacyphase and hasbinaryphase:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1815 kwargs[b'phases'] = True
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1816 pullop.stepsdone.add(b'phases')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1817
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1818 if b'listkeys' in pullop.remotebundle2caps:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1819 if b'phases' not in pullop.stepsdone:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1820 kwargs[b'listkeys'] = [b'phases']
35761
1908d360f977 pull: reorganize bundle2 argument bundling
Boris Feld <boris.feld@octobus.net>
parents: 35759
diff changeset
1821
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1822 bookmarksrequested = False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1823 legacybookmark = b'bookmarks' in ui.configlist(b'devel', b'legacy.exchange')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1824 hasbinarybook = b'bookmarks' in pullop.remotebundle2caps
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1825
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1826 if pullop.remotebookmarks is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1827 pullop.stepsdone.add(b'request-bookmarks')
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1828
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1829 if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1830 b'request-bookmarks' not in pullop.stepsdone
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1831 and pullop.remotebookmarks is None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1832 and not legacybookmark
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1833 and hasbinarybook
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1834 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1835 kwargs[b'bookmarks'] = True
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1836 bookmarksrequested = True
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1837
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1838 if b'listkeys' in pullop.remotebundle2caps:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1839 if b'request-bookmarks' not in pullop.stepsdone:
25444
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
1840 # make sure to always includes bookmark data when migrating
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
1841 # `hg incoming --bundle` to using this function.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1842 pullop.stepsdone.add(b'request-bookmarks')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1843 kwargs.setdefault(b'listkeys', []).append(b'bookmarks')
26690
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
1844
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
1845 # If this is a full pull / clone and the server supports the clone bundles
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
1846 # feature, tell the server whether we attempted a clone bundle. The
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
1847 # presence of this flag indicates the client supports clone bundles. This
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
1848 # will enable the server to treat clients that support clone bundles
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
1849 # differently from those that don't.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1850 if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1851 pullop.remote.capable(b'clonebundles')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1852 and pullop.heads is None
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46977
diff changeset
1853 and list(pullop.common) == [pullop.repo.nullid]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1854 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1855 kwargs[b'cbattempted'] = pullop.clonebundleattempted
26690
704818fb170d exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26689
diff changeset
1856
26471
41dd7b2c7e15 exchange: add "streaming all changes" to bundle2 pulling
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26465
diff changeset
1857 if streaming:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1858 pullop.repo.ui.status(_(b'streaming all changes\n'))
26471
41dd7b2c7e15 exchange: add "streaming all changes" to bundle2 pulling
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26465
diff changeset
1859 elif not pullop.fetch:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1860 pullop.repo.ui.status(_(b"no changes found\n"))
21258
71931b789424 exchange: fix bad indentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21257
diff changeset
1861 pullop.cgresult = 0
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
1862 else:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46977
diff changeset
1863 if pullop.heads is None and list(pullop.common) == [pullop.repo.nullid]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1864 pullop.repo.ui.status(_(b"requesting all changes\n"))
22953
b1d694d3975e obsolete: add exchange option
Durham Goode <durham@fb.com>
parents: 22937
diff changeset
1865 if obsolete.isenabled(pullop.repo, obsolete.exchangeopt):
26464
9a7fc6d48898 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26462
diff changeset
1866 remoteversions = bundle2.obsmarkersversion(pullop.remotebundle2caps)
22354
a89add6c6b2f bundle2: pull obsmarkers relevant to the pulled set through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22353
diff changeset
1867 if obsolete.commonversion(remoteversions) is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1868 kwargs[b'obsmarkers'] = True
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1869 pullop.stepsdone.add(b'obsmarkers')
21159
024f38f6d5f6 bundle2: allow extensions to extend the getbundle request
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21158
diff changeset
1870 _pullbundle2extraprepare(pullop, kwargs)
37648
8f3c6fb55369 exchange: use command executor for getbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37647
diff changeset
1871
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1872 remote_sidedata = bundle2.read_remote_wanted_sidedata(pullop.remote)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1873 if remote_sidedata:
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1874 kwargs[b'remote_sidedata'] = remote_sidedata
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1875
37648
8f3c6fb55369 exchange: use command executor for getbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37647
diff changeset
1876 with pullop.remote.commandexecutor() as e:
8f3c6fb55369 exchange: use command executor for getbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37647
diff changeset
1877 args = dict(kwargs)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1878 args[b'source'] = b'pull'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1879 bundle = e.callcommand(b'getbundle', args).result()
37648
8f3c6fb55369 exchange: use command executor for getbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37647
diff changeset
1880
8f3c6fb55369 exchange: use command executor for getbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37647
diff changeset
1881 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1882 op = bundle2.bundleoperation(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1883 pullop.repo, pullop.gettransaction, source=b'pull'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1884 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1885 op.modes[b'bookmarks'] = b'records'
37648
8f3c6fb55369 exchange: use command executor for getbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37647
diff changeset
1886 bundle2.processbundle(pullop.repo, bundle, op=op)
8f3c6fb55369 exchange: use command executor for getbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37647
diff changeset
1887 except bundle2.AbortFromPart as exc:
46478
db9e33beb0fb bundle2: print "error:abort" message to stderr instead of stdout
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
1888 pullop.repo.ui.error(_(b'remote: abort: %s\n') % exc)
46977
3f87d2af0bd6 errors: raise RemoteError in some places in exchange.py
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
1889 raise error.RemoteError(_(b'pull failed on remote'), hint=exc.hint)
37648
8f3c6fb55369 exchange: use command executor for getbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37647
diff changeset
1890 except error.BundleValueError as exc:
46977
3f87d2af0bd6 errors: raise RemoteError in some places in exchange.py
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
1891 raise error.RemoteError(_(b'missing support for %s') % exc)
21259
ab5040cd5749 bundle2: fix bundle2 pulling all revs on empty pulls
Durham Goode <durham@fb.com>
parents: 21258
diff changeset
1892
ab5040cd5749 bundle2: fix bundle2 pulling all revs on empty pulls
Durham Goode <durham@fb.com>
parents: 21258
diff changeset
1893 if pullop.fetch:
33037
d765ad56081f bundle: make combinechangegroupresults() take a bundleoperation
Martin von Zweigbergk <martinvonz@google.com>
parents: 33036
diff changeset
1894 pullop.cgresult = bundle2.combinechangegroupresults(op)
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
1895
21658
0696ca0a685b pull: when remote supports it, pull phase data alongside changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21657
diff changeset
1896 # processing phases change
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1897 for namespace, value in op.records[b'listkeys']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1898 if namespace == b'phases':
21658
0696ca0a685b pull: when remote supports it, pull phase data alongside changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21657
diff changeset
1899 _pullapplyphases(pullop, value)
0696ca0a685b pull: when remote supports it, pull phase data alongside changesets
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21657
diff changeset
1900
22656
c9276945eba3 pull: retrieve bookmarks through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22655
diff changeset
1901 # processing bookmark update
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1902 if bookmarksrequested:
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1903 books = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1904 for record in op.records[b'bookmarks']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1905 books[record[b'bookmark']] = record[b"node"]
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1906 pullop.remotebookmarks = books
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1907 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1908 for namespace, value in op.records[b'listkeys']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1909 if namespace == b'bookmarks':
35268
44b8b5ad30eb pull: retrieve bookmarks through the binary part when possible
Boris Feld <boris.feld@octobus.net>
parents: 35267
diff changeset
1910 pullop.remotebookmarks = bookmod.unhexlifybookmarks(value)
25444
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
1911
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
1912 # bookmark data were either already there or pulled in the bundle
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
1913 if pullop.remotebookmarks is not None:
1d1fd5d44f57 pull: skip pulling remote bookmarks with bundle2 if a value already exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25443
diff changeset
1914 _pullbookmarks(pullop)
22656
c9276945eba3 pull: retrieve bookmarks through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22655
diff changeset
1915
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1916
21159
024f38f6d5f6 bundle2: allow extensions to extend the getbundle request
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21158
diff changeset
1917 def _pullbundle2extraprepare(pullop, kwargs):
024f38f6d5f6 bundle2: allow extensions to extend the getbundle request
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21158
diff changeset
1918 """hook function so that extensions can extend the getbundle call"""
024f38f6d5f6 bundle2: allow extensions to extend the getbundle request
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21158
diff changeset
1919
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1920
20489
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1921 def _pullchangeset(pullop):
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1922 """pull changeset from unbundle into the local repo"""
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1923 # We delay the open of the transaction as late as possible so we
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1924 # don't open transaction for nothing or you break future useful
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1925 # rollback call
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1926 if b'changegroup' in pullop.stepsdone:
22653
d94f5bec9c8e pull: perform the todostep inside functions handling old way of pulling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22651
diff changeset
1927 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1928 pullop.stepsdone.add(b'changegroup')
20899
d62319f91cb7 pull: move the cgresult logic in _pullchangeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20898
diff changeset
1929 if not pullop.fetch:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1930 pullop.repo.ui.status(_(b"no changes found\n"))
23217
2f12ac53b528 exchange: fix indentation in _pullchangeset
Mike Edgar <adgar@google.com>
parents: 23208
diff changeset
1931 pullop.cgresult = 0
2f12ac53b528 exchange: fix indentation in _pullchangeset
Mike Edgar <adgar@google.com>
parents: 23208
diff changeset
1932 return
32930
af31d531dda0 changegroup: let callers pass in transaction to apply() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32927
diff changeset
1933 tr = pullop.gettransaction()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46977
diff changeset
1934 if pullop.heads is None and list(pullop.common) == [pullop.repo.nullid]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1935 pullop.repo.ui.status(_(b"requesting all changes\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1936 elif pullop.heads is None and pullop.remote.capable(b'changegroupsubset'):
20489
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1937 # issue1320, avoid a race if remote changed after discovery
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1938 pullop.heads = pullop.rheads
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1939
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1940 if pullop.remote.capable(b'getbundle'):
20489
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1941 # TODO: get bundlecaps from remote
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1942 cg = pullop.remote.getbundle(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1943 b'pull', common=pullop.common, heads=pullop.heads or pullop.rheads
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1944 )
20489
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1945 elif pullop.heads is None:
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37498
diff changeset
1946 with pullop.remote.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1947 cg = e.callcommand(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45910
diff changeset
1948 b'changegroup',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45910
diff changeset
1949 {
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45910
diff changeset
1950 b'nodes': pullop.fetch,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45910
diff changeset
1951 b'source': b'pull',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45910
diff changeset
1952 },
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1953 ).result()
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37498
diff changeset
1954
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1955 elif not pullop.remote.capable(b'changegroupsubset'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1956 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1957 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1958 b"partial pull cannot be done because "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1959 b"other repository doesn't support "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1960 b"changegroupsubset."
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1961 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1962 )
20489
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1963 else:
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37498
diff changeset
1964 with pullop.remote.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1965 cg = e.callcommand(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1966 b'changegroupsubset',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1967 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1968 b'bases': pullop.fetch,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1969 b'heads': pullop.heads,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1970 b'source': b'pull',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1971 },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1972 ).result()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1973
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1974 bundleop = bundle2.applybundle(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1975 pullop.repo, cg, tr, b'pull', pullop.remote.url()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1976 )
33040
2baef42a2881 bundle: make applybundle1() return a bundleoperation
Martin von Zweigbergk <martinvonz@google.com>
parents: 33039
diff changeset
1977 pullop.cgresult = bundle2.combinechangegroupresults(bundleop)
20489
7b5ec1c7e8e2 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20488
diff changeset
1978
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1979
20486
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
1980 def _pullphase(pullop):
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
1981 # Get remote phases data from remote
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1982 if b'phases' in pullop.stepsdone:
22653
d94f5bec9c8e pull: perform the todostep inside functions handling old way of pulling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22651
diff changeset
1983 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1984 remotephases = listkeys(pullop.remote, b'phases')
21654
ddf9a00c1239 pull: split remote phases retrieval from actual application
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21645
diff changeset
1985 _pullapplyphases(pullop, remotephases)
ddf9a00c1239 pull: split remote phases retrieval from actual application
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21645
diff changeset
1986
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1987
21654
ddf9a00c1239 pull: split remote phases retrieval from actual application
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21645
diff changeset
1988 def _pullapplyphases(pullop, remotephases):
ddf9a00c1239 pull: split remote phases retrieval from actual application
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21645
diff changeset
1989 """apply phase movement from observed remote state"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1990 if b'phases' in pullop.stepsdone:
22937
92bf9abc4deb pull: use `stepsdone` instead of `todosteps`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22936
diff changeset
1991 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1992 pullop.stepsdone.add(b'phases')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1993 publishing = bool(remotephases.get(b'publishing', False))
20486
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
1994 if remotephases and not publishing:
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30187
diff changeset
1995 # remote is new and non-publishing
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1996 pheads, _dr = phases.analyzeremotephases(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1997 pullop.repo, pullop.pulledsubset, remotephases
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
1998 )
22068
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
1999 dheads = pullop.pulledsubset
20486
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
2000 else:
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
2001 # Remote is old or publishing all common changesets
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
2002 # should be seen as public
22068
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2003 pheads = pullop.pulledsubset
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2004 dheads = []
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2005 unfi = pullop.repo.unfiltered()
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2006 phase = unfi._phasecache.phase
43563
4d8a4ecbb8b9 index: use `index.get_rev` in `exchange._pullapplyphases`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43562
diff changeset
2007 rev = unfi.changelog.index.get_rev
22068
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2008 public = phases.public
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2009 draft = phases.draft
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2010
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2011 # exclude changesets already public locally and update the others
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2012 pheads = [pn for pn in pheads if phase(unfi, rev(pn)) > public]
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2013 if pheads:
22069
616a455b02ca phase: add a transaction argument to advanceboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22068
diff changeset
2014 tr = pullop.gettransaction()
616a455b02ca phase: add a transaction argument to advanceboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22068
diff changeset
2015 phases.advanceboundary(pullop.repo, tr, public, pheads)
22068
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2016
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2017 # exclude changesets already draft locally and update the others
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2018 dheads = [pn for pn in dheads if phase(unfi, rev(pn)) > draft]
d34058dd3246 pull: pre-filter remote phases before moving local ones
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
2019 if dheads:
22069
616a455b02ca phase: add a transaction argument to advanceboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22068
diff changeset
2020 tr = pullop.gettransaction()
616a455b02ca phase: add a transaction argument to advanceboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22068
diff changeset
2021 phases.advanceboundary(pullop.repo, tr, draft, dheads)
20486
0c469df6e914 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20485
diff changeset
2022
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2023
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
2024 def _pullbookmarks(pullop):
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
2025 """process the remote bookmark information to update the local one"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2026 if b'bookmarks' in pullop.stepsdone:
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
2027 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2028 pullop.stepsdone.add(b'bookmarks')
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
2029 repo = pullop.repo
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
2030 remotebookmarks = pullop.remotebookmarks
48242
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48241
diff changeset
2031 bookmarks_mode = None
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48241
diff changeset
2032 if pullop.remote_path is not None:
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48241
diff changeset
2033 bookmarks_mode = pullop.remote_path.bookmarks_mode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2034 bookmod.updatefromremote(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2035 repo.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2036 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2037 remotebookmarks,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2038 pullop.remote.url(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2039 pullop.gettransaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2040 explicit=pullop.explicitbookmarks,
48242
4d2ab365699e bookmarks: move the `mirror` option to the `paths` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48241
diff changeset
2041 mode=bookmarks_mode,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2042 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2043
22654
02e0a574bcd3 pull: move bookmark pulling into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22653
diff changeset
2044
20478
80628d4069be push: feed pulloperation object to _pullobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20477
diff changeset
2045 def _pullobsolete(pullop):
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2046 """utility function to pull obsolete markers from a remote
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2047
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2048 The `gettransaction` is function that return the pull transaction, creating
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2049 one if necessary. We return the transaction to inform the calling code that
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2050 a new transaction have been created (when applicable).
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2051
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2052 Exists mostly to allow overriding for experimentation purpose"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2053 if b'obsmarkers' in pullop.stepsdone:
22653
d94f5bec9c8e pull: perform the todostep inside functions handling old way of pulling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22651
diff changeset
2054 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2055 pullop.stepsdone.add(b'obsmarkers')
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2056 tr = None
22953
b1d694d3975e obsolete: add exchange option
Durham Goode <durham@fb.com>
parents: 22937
diff changeset
2057 if obsolete.isenabled(pullop.repo, obsolete.exchangeopt):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2058 pullop.repo.ui.debug(b'fetching remote obsolete markers\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2059 remoteobs = listkeys(pullop.remote, b'obsolete')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2060 if b'dump0' in remoteobs:
20478
80628d4069be push: feed pulloperation object to _pullobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20477
diff changeset
2061 tr = pullop.gettransaction()
27558
b5b54825de6b pull: make a single call to obsstore.add (issue5006)
Matt Mackall <mpm@selenic.com>
parents: 27523
diff changeset
2062 markers = []
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2063 for key in sorted(remoteobs, reverse=True):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2064 if key.startswith(b'dump'):
32201
4462a981e8df base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents: 32166
diff changeset
2065 data = util.b85decode(remoteobs[key])
27558
b5b54825de6b pull: make a single call to obsstore.add (issue5006)
Matt Mackall <mpm@selenic.com>
parents: 27523
diff changeset
2066 version, newmarks = obsolete._readmarkers(data)
b5b54825de6b pull: make a single call to obsstore.add (issue5006)
Matt Mackall <mpm@selenic.com>
parents: 27523
diff changeset
2067 markers += newmarks
b5b54825de6b pull: make a single call to obsstore.add (issue5006)
Matt Mackall <mpm@selenic.com>
parents: 27523
diff changeset
2068 if markers:
b5b54825de6b pull: make a single call to obsstore.add (issue5006)
Matt Mackall <mpm@selenic.com>
parents: 27523
diff changeset
2069 pullop.repo.obsstore.add(tr, markers)
20478
80628d4069be push: feed pulloperation object to _pullobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20477
diff changeset
2070 pullop.repo.invalidatevolatilesets()
20476
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2071 return tr
1180c6ec5695 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20475
diff changeset
2072
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2073
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2074 def applynarrowacl(repo, kwargs):
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2075 """Apply narrow fetch access control.
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2076
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2077 This massages the named arguments for getbundle wire protocol commands
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2078 so requested data is filtered through access control rules.
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2079 """
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2080 ui = repo.ui
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2081 # TODO this assumes existence of HTTP and is a layering violation.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2082 username = ui.shortuser(ui.environ.get(b'REMOTE_USER') or ui.username())
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2083 user_includes = ui.configlist(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2084 _NARROWACL_SECTION,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2085 username + b'.includes',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2086 ui.configlist(_NARROWACL_SECTION, b'default.includes'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2087 )
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2088 user_excludes = ui.configlist(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2089 _NARROWACL_SECTION,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2090 username + b'.excludes',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2091 ui.configlist(_NARROWACL_SECTION, b'default.excludes'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2092 )
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2093 if not user_includes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2094 raise error.Abort(
43769
27c6d6f53d46 exchange: eliminate some bytes.format() calls
Matt Harbison <matt_harbison@yahoo.com>
parents: 43661
diff changeset
2095 _(b"%s configuration for user %s is empty")
27c6d6f53d46 exchange: eliminate some bytes.format() calls
Matt Harbison <matt_harbison@yahoo.com>
parents: 43661
diff changeset
2096 % (_NARROWACL_SECTION, username)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2097 )
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2098
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2099 user_includes = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2100 b'path:.' if p == b'*' else b'path:' + p for p in user_includes
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2101 ]
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2102 user_excludes = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2103 b'path:.' if p == b'*' else b'path:' + p for p in user_excludes
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2104 ]
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2105
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2106 req_includes = set(kwargs.get('includepats', []))
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2107 req_excludes = set(kwargs.get('excludepats', []))
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2108
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2109 req_includes, req_excludes, invalid_includes = narrowspec.restrictpatterns(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2110 req_includes, req_excludes, user_includes, user_excludes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2111 )
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2112
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2113 if invalid_includes:
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2114 raise error.Abort(
43769
27c6d6f53d46 exchange: eliminate some bytes.format() calls
Matt Harbison <matt_harbison@yahoo.com>
parents: 43661
diff changeset
2115 _(b"The following includes are not accessible for %s: %s")
43821
ea97cd64c500 exchange: fix an attempt to format a list into bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 43795
diff changeset
2116 % (username, stringutil.pprint(invalid_includes))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2117 )
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2118
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2119 new_args = {}
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2120 new_args.update(kwargs)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2121 new_args['narrow'] = True
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2122 new_args['narrow_acl'] = True
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2123 new_args['includepats'] = req_includes
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2124 if req_excludes:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2125 new_args['excludepats'] = req_excludes
38807
98df52d5042c exchange: make narrow ACL presence imply narrow=True
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38792
diff changeset
2126
38790
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2127 return new_args
3e7387337a3c exchange: move narrow acl functionality into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38789
diff changeset
2128
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2129
38791
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2130 def _computeellipsis(repo, common, heads, known, match, depth=None):
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2131 """Compute the shape of a narrowed DAG.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2132
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2133 Args:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2134 repo: The repository we're transferring.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2135 common: The roots of the DAG range we're transferring.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2136 May be just [nullid], which means all ancestors of heads.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2137 heads: The heads of the DAG range we're transferring.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2138 match: The narrowmatcher that allows us to identify relevant changes.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2139 depth: If not None, only consider nodes to be full nodes if they are at
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2140 most depth changesets away from one of heads.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2141
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2142 Returns:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2143 A tuple of (visitnodes, relevant_nodes, ellipsisroots) where:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2144
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2145 visitnodes: The list of nodes (either full or ellipsis) which
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2146 need to be sent to the client.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2147 relevant_nodes: The set of changelog nodes which change a file inside
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2148 the narrowspec. The client needs these as non-ellipsis nodes.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2149 ellipsisroots: A dict of {rev: parents} that is used in
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2150 narrowchangegroup to produce ellipsis nodes with the
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2151 correct parents.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2152 """
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2153 cl = repo.changelog
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2154 mfl = repo.manifestlog
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2155
39158
b0c73866c9fb exchange: don't use dagutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38835
diff changeset
2156 clrev = cl.rev
b0c73866c9fb exchange: don't use dagutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38835
diff changeset
2157
b0c73866c9fb exchange: don't use dagutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38835
diff changeset
2158 commonrevs = {clrev(n) for n in common} | {nullrev}
b0c73866c9fb exchange: don't use dagutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38835
diff changeset
2159 headsrevs = {clrev(n) for n in heads}
b0c73866c9fb exchange: don't use dagutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38835
diff changeset
2160
38791
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2161 if depth:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2162 revdepth = {h: 0 for h in headsrevs}
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2163
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2164 ellipsisheads = collections.defaultdict(set)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2165 ellipsisroots = collections.defaultdict(set)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2166
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2167 def addroot(head, curchange):
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2168 """Add a root to an ellipsis head, splitting heads with 3 roots."""
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2169 ellipsisroots[head].add(curchange)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2170 # Recursively split ellipsis heads with 3 roots by finding the
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2171 # roots' youngest common descendant which is an elided merge commit.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2172 # That descendant takes 2 of the 3 roots as its own, and becomes a
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2173 # root of the head.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2174 while len(ellipsisroots[head]) > 2:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2175 child, roots = splithead(head)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2176 splitroots(head, child, roots)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2177 head = child # Recurse in case we just added a 3rd root
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2178
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2179 def splitroots(head, child, roots):
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2180 ellipsisroots[head].difference_update(roots)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2181 ellipsisroots[head].add(child)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2182 ellipsisroots[child].update(roots)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2183 ellipsisroots[child].discard(child)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2184
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2185 def splithead(head):
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2186 r1, r2, r3 = sorted(ellipsisroots[head])
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2187 for nr1, nr2 in ((r2, r3), (r1, r3), (r1, r2)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2188 mid = repo.revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2189 b'sort(merge() & %d::%d & %d::%d, -rev)', nr1, head, nr2, head
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2190 )
38791
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2191 for j in mid:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2192 if j == nr2:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2193 return nr2, (nr1, nr2)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2194 if j not in ellipsisroots or len(ellipsisroots[j]) < 2:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2195 return j, (nr1, nr2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2196 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2197 _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2198 b'Failed to split up ellipsis node! head: %d, '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2199 b'roots: %d %d %d'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2200 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2201 % (head, r1, r2, r3)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2202 )
38791
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2203
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2204 missing = list(cl.findmissingrevs(common=commonrevs, heads=headsrevs))
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2205 visit = reversed(missing)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2206 relevant_nodes = set()
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2207 visitnodes = [cl.node(m) for m in missing]
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2208 required = set(headsrevs) | known
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2209 for rev in visit:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2210 clrev = cl.changelogrevision(rev)
39158
b0c73866c9fb exchange: don't use dagutil
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38835
diff changeset
2211 ps = [prev for prev in cl.parentrevs(rev) if prev != nullrev]
38791
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2212 if depth is not None:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2213 curdepth = revdepth[rev]
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2214 for p in ps:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2215 revdepth[p] = min(curdepth + 1, revdepth.get(p, depth + 1))
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2216 needed = False
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2217 shallow_enough = depth is None or revdepth[rev] <= depth
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2218 if shallow_enough:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2219 curmf = mfl[clrev.manifest].read()
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2220 if ps:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2221 # We choose to not trust the changed files list in
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2222 # changesets because it's not always correct. TODO: could
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2223 # we trust it for the non-merge case?
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2224 p1mf = mfl[cl.changelogrevision(ps[0]).manifest].read()
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2225 needed = bool(curmf.diff(p1mf, match))
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2226 if not needed and len(ps) > 1:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2227 # For merge changes, the list of changed files is not
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2228 # helpful, since we need to emit the merge if a file
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2229 # in the narrow spec has changed on either side of the
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2230 # merge. As a result, we do a manifest diff to check.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2231 p2mf = mfl[cl.changelogrevision(ps[1]).manifest].read()
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2232 needed = bool(curmf.diff(p2mf, match))
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2233 else:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2234 # For a root node, we need to include the node if any
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2235 # files in the node match the narrowspec.
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2236 needed = any(curmf.walk(match))
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2237
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2238 if needed:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2239 for head in ellipsisheads[rev]:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2240 addroot(head, rev)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2241 for p in ps:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2242 required.add(p)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2243 relevant_nodes.add(cl.node(rev))
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2244 else:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2245 if not ps:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2246 ps = [nullrev]
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2247 if rev in required:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2248 for head in ellipsisheads[rev]:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2249 addroot(head, rev)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2250 for p in ps:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2251 ellipsisheads[p].add(rev)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2252 else:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2253 for p in ps:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2254 ellipsisheads[p] |= ellipsisheads[rev]
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2255
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2256 # add common changesets as roots of their reachable ellipsis heads
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2257 for c in commonrevs:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2258 for head in ellipsisheads[c]:
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2259 addroot(head, c)
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2260 return visitnodes, relevant_nodes, ellipsisroots
7e66e7999bdd exchange: move _computeellipsis() from narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38790
diff changeset
2261
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2262
35783
c97639ad6874 bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35765
diff changeset
2263 def caps20to10(repo, role):
21645
aed14bb165f3 bundle2: introduce a ``caps20to10`` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21644
diff changeset
2264 """return a set with appropriate options to use bundle20 during getbundle"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2265 caps = {b'HG20'}
35783
c97639ad6874 bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35765
diff changeset
2266 capsblob = bundle2.encodecaps(bundle2.getrepocaps(repo, role=role))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2267 caps.add(b'bundle2=' + urlreq.quote(capsblob))
21645
aed14bb165f3 bundle2: introduce a ``caps20to10`` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21644
diff changeset
2268 return caps
aed14bb165f3 bundle2: introduce a ``caps20to10`` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21644
diff changeset
2269
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2270
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2271 # List of names of steps to perform for a bundle2 for getbundle, order matters.
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2272 getbundle2partsorder = []
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2273
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2274 # Mapping between step name and function
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2275 #
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2276 # This exists to help extensions wrap steps if necessary
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2277 getbundle2partsmapping = {}
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2278
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2279
24732
8f70b529cb0c bundle2: add an 'idx' argument to the 'getbundle2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24731
diff changeset
2280 def getbundle2partsgenerator(stepname, idx=None):
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2281 """decorator for function generating bundle2 part for getbundle
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2282
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2283 The function is added to the step -> function mapping and appended to the
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2284 list of steps. Beware that decorated functions will be added in order
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2285 (this may matter).
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2286
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2287 You can only use this decorator for new steps, if you want to wrap a step
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2288 from an extension, attack the getbundle2partsmapping dictionary directly."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2289
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2290 def dec(func):
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2291 assert stepname not in getbundle2partsmapping
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2292 getbundle2partsmapping[stepname] = func
24732
8f70b529cb0c bundle2: add an 'idx' argument to the 'getbundle2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24731
diff changeset
2293 if idx is None:
8f70b529cb0c bundle2: add an 'idx' argument to the 'getbundle2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24731
diff changeset
2294 getbundle2partsorder.append(stepname)
8f70b529cb0c bundle2: add an 'idx' argument to the 'getbundle2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24731
diff changeset
2295 else:
8f70b529cb0c bundle2: add an 'idx' argument to the 'getbundle2partsgenerator'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24731
diff changeset
2296 getbundle2partsorder.insert(idx, stepname)
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2297 return func
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2298
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2299 return dec
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2300
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2301
27244
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
2302 def bundle2requested(bundlecaps):
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
2303 if bundlecaps is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2304 return any(cap.startswith(b'HG2') for cap in bundlecaps)
27244
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
2305 return False
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
2306
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2307
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2308 def getbundlechunks(
46711
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2309 repo,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2310 source,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2311 heads=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2312 common=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2313 bundlecaps=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2314 remote_sidedata=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2315 **kwargs
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2316 ):
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30068
diff changeset
2317 """Return chunks constituting a bundle's raw data.
20954
dba91f8060eb bundle2: add an exchange.getbundle function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20933
diff changeset
2318
24686
e0e28e910fa3 bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24650
diff changeset
2319 Could be a bundle HG10 or a bundle HG20 depending on bundlecaps
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30068
diff changeset
2320 passed.
20954
dba91f8060eb bundle2: add an exchange.getbundle function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20933
diff changeset
2321
35785
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
2322 Returns a 2-tuple of a dict with metadata about the generated bundle
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
2323 and an iterator over raw chunks (of varying sizes).
20954
dba91f8060eb bundle2: add an exchange.getbundle function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20933
diff changeset
2324 """
33016
4e6dc34b5d7a py3: convert kwargs keys' back to bytes using pycompat.byteskwargs()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32991
diff changeset
2325 kwargs = pycompat.byteskwargs(kwargs)
35785
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
2326 info = {}
27244
709977a4fc9d exchange: standalone function to determine if bundle2 is requested
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26935
diff changeset
2327 usebundle2 = bundle2requested(bundlecaps)
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2328 # bundle10 case
24649
2d15c59a001b bundle2: detect bundle2 stream/request on /HG2./ instead of /HG2Y/
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24641
diff changeset
2329 if not usebundle2:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2330 if bundlecaps and not kwargs.get(b'cg', True):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2331 raise ValueError(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2332 _(b'request for bundle10 must include changegroup')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2333 )
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2334
21656
36200dc6b3bd getbundle: raise error if extra arguments are provided for bundle10
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21654
diff changeset
2335 if kwargs:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2336 raise ValueError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2337 _(b'unsupported getbundle arguments: %s')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2338 % b', '.join(sorted(kwargs.keys()))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2339 )
29808
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
2340 outgoing = _computeoutgoing(repo, heads, common)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2341 info[b'bundleversion'] = 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2342 return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2343 info,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2344 changegroup.makestream(
46711
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2345 repo,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2346 outgoing,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2347 b'01',
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2348 source,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2349 bundlecaps=bundlecaps,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2350 remote_sidedata=remote_sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2351 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2352 )
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2353
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2354 # bundle20 case
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2355 info[b'bundleversion'] = 2
21143
5bb5d4ba14e5 bundle2: transmit capabilities to getbundle during pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21142
diff changeset
2356 b2caps = {}
5bb5d4ba14e5 bundle2: transmit capabilities to getbundle during pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21142
diff changeset
2357 for bcaps in bundlecaps:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2358 if bcaps.startswith(b'bundle2='):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2359 blob = urlreq.unquote(bcaps[len(b'bundle2=') :])
21143
5bb5d4ba14e5 bundle2: transmit capabilities to getbundle during pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21142
diff changeset
2360 b2caps.update(bundle2.decodecaps(blob))
5bb5d4ba14e5 bundle2: transmit capabilities to getbundle during pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21142
diff changeset
2361 bundler = bundle2.bundle20(repo.ui, b2caps)
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2362
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2363 kwargs[b'heads'] = heads
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2364 kwargs[b'common'] = common
23218
0e78ea8e592a exchange: prepare kwargs for bundle2 part generation exactly once
Mike Edgar <adgar@google.com>
parents: 23217
diff changeset
2365
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2366 for name in getbundle2partsorder:
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2367 func = getbundle2partsmapping[name]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2368 func(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2369 bundler,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2370 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2371 source,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2372 bundlecaps=bundlecaps,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2373 b2caps=b2caps,
46711
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2374 remote_sidedata=remote_sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2375 **pycompat.strkwargs(kwargs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2376 )
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2377
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2378 info[b'prefercompressed'] = bundler.prefercompressed
35787
a84dbc87dae9 exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35785
diff changeset
2379
35785
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35784
diff changeset
2380 return info, bundler.getchunks()
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2381
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2382
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2383 @getbundle2partsgenerator(b'stream2')
37167
6f467adf9f05 bundle: add the possibility to bundle a stream v2 part
Boris Feld <boris.feld@octobus.net>
parents: 37165
diff changeset
2384 def _getbundlestream2(bundler, repo, *args, **kwargs):
6f467adf9f05 bundle: add the possibility to bundle a stream v2 part
Boris Feld <boris.feld@octobus.net>
parents: 37165
diff changeset
2385 return bundle2.addpartbundlestream2(bundler, repo, **kwargs)
35759
c24dad55ac19 bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents: 35578
diff changeset
2386
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2387
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2388 @getbundle2partsgenerator(b'changegroup')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2389 def _getbundlechangegrouppart(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2390 bundler,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2391 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2392 source,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2393 bundlecaps=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2394 b2caps=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2395 heads=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2396 common=None,
46711
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2397 remote_sidedata=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2398 **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2399 ):
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2400 """add a changegroup part to the requested bundle"""
43770
44b605638918 exchange: guard against method invocation on `b2caps=None` args
Matt Harbison <matt_harbison@yahoo.com>
parents: 43769
diff changeset
2401 if not kwargs.get('cg', True) or not b2caps:
38792
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2402 return
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2403
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2404 version = b'01'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2405 cgversions = b2caps.get(b'changegroup')
38792
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2406 if cgversions: # 3.1 and 3.2 ship with an empty value
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2407 cgversions = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2408 v
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2409 for v in cgversions
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2410 if v in changegroup.supportedoutgoingversions(repo)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2411 ]
38792
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2412 if not cgversions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2413 raise error.Abort(_(b'no common changegroup version'))
38792
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2414 version = max(cgversions)
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2415
38792
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2416 outgoing = _computeoutgoing(repo, heads, common)
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2417 if not outgoing.missing:
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2418 return
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2419
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2420 if kwargs.get('narrow', False):
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2421 include = sorted(filter(bool, kwargs.get('includepats', [])))
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2422 exclude = sorted(filter(bool, kwargs.get('excludepats', [])))
40344
2c5835b4246b narrow: when widening, don't include manifests the client already has
Martin von Zweigbergk <martinvonz@google.com>
parents: 40337
diff changeset
2423 matcher = narrowspec.match(repo.root, include=include, exclude=exclude)
38808
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38807
diff changeset
2424 else:
40344
2c5835b4246b narrow: when widening, don't include manifests the client already has
Martin von Zweigbergk <martinvonz@google.com>
parents: 40337
diff changeset
2425 matcher = None
38808
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38807
diff changeset
2426
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2427 cgstream = changegroup.makestream(
46711
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2428 repo,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2429 outgoing,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2430 version,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2431 source,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2432 bundlecaps=bundlecaps,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2433 matcher=matcher,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46478
diff changeset
2434 remote_sidedata=remote_sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2435 )
38792
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2436
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2437 part = bundler.newpart(b'changegroup', data=cgstream)
38792
afb442f58cbf exchange: refactor control flow of _getbundlechangegrouppart()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38791
diff changeset
2438 if cgversions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2439 part.addparam(b'version', version)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2440
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2441 part.addparam(b'nbchanges', b'%d' % len(outgoing.missing), mandatory=False)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2442
45552
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
2443 if scmutil.istreemanifest(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2444 part.addparam(b'treemanifest', b'1')
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2445
47226
19d4802cb304 sidedata: add a 'side-data' repository feature and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47012
diff changeset
2446 if repository.REPO_FEATURE_SIDE_DATA in repo.features:
43131
c17a63eb5d4c sidedata: apply basic but tight security around exchange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
2447 part.addparam(b'exp-sidedata', b'1')
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
2448 sidedata = bundle2.format_remote_wanted_sidedata(repo)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
2449 part.addparam(b'exp-wanted-sidedata', sidedata)
43131
c17a63eb5d4c sidedata: apply basic but tight security around exchange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
2450
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2451 if (
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2452 kwargs.get('narrow', False)
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2453 and kwargs.get('narrow_acl', False)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2454 and (include or exclude)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2455 ):
42209
280f7a095df8 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42057
diff changeset
2456 # this is mandatory because otherwise ACL clients won't work
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2457 narrowspecpart = bundler.newpart(b'Narrow:responsespec')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2458 narrowspecpart.data = b'%s\0%s' % (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2459 b'\n'.join(include),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2460 b'\n'.join(exclude),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2461 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2462
38808
d99083996398 exchange: move simple narrow changegroup generation from extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38807
diff changeset
2463
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2464 @getbundle2partsgenerator(b'bookmarks')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2465 def _getbundlebookmarkpart(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2466 bundler, repo, source, bundlecaps=None, b2caps=None, **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2467 ):
35267
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
2468 """add a bookmark part to the requested bundle"""
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2469 if not kwargs.get('bookmarks', False):
35267
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
2470 return
43770
44b605638918 exchange: guard against method invocation on `b2caps=None` args
Matt Harbison <matt_harbison@yahoo.com>
parents: 43769
diff changeset
2471 if not b2caps or b'bookmarks' not in b2caps:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2472 raise error.Abort(_(b'no common bookmarks exchange method'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2473 books = bookmod.listbinbookmarks(repo)
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
2474 data = bookmod.binaryencode(repo, books)
35267
cb4dcd7fabe7 getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents: 35264
diff changeset
2475 if data:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2476 bundler.newpart(b'bookmarks', data=data)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2477
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2478
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2479 @getbundle2partsgenerator(b'listkeys')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2480 def _getbundlelistkeysparts(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2481 bundler, repo, source, bundlecaps=None, b2caps=None, **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2482 ):
22542
6b180a0c703e bundle2: separate bundle10 and bundle2 cases in getbundle()
Mike Hommey <mh@glandium.org>
parents: 22541
diff changeset
2483 """add parts containing listkeys namespaces to the requested bundle"""
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2484 listkeys = kwargs.get('listkeys', ())
21657
0ff44e06275d getbundle: support of listkeys argument when bundle2 is used
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21656
diff changeset
2485 for namespace in listkeys:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2486 part = bundler.newpart(b'listkeys')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2487 part.addparam(b'namespace', namespace)
21657
0ff44e06275d getbundle: support of listkeys argument when bundle2 is used
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21656
diff changeset
2488 keys = repo.listkeys(namespace).items()
0ff44e06275d getbundle: support of listkeys argument when bundle2 is used
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21656
diff changeset
2489 part.data = pushkey.encodekeys(keys)
20967
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
2490
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2491
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2492 @getbundle2partsgenerator(b'obsmarkers')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2493 def _getbundleobsmarkerpart(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2494 bundler, repo, source, bundlecaps=None, b2caps=None, heads=None, **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2495 ):
22541
4e1a80c022a4 bundle2: pass b2caps down to functions adding bundle2 parts for getbundle
Mike Hommey <mh@glandium.org>
parents: 22390
diff changeset
2496 """add an obsolescence markers part to the requested bundle"""
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2497 if kwargs.get('obsmarkers', False):
22353
47e3420ae889 getbundle: add `obsmarkers` argument to getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22352
diff changeset
2498 if heads is None:
47e3420ae889 getbundle: add `obsmarkers` argument to getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22352
diff changeset
2499 heads = repo.heads()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2500 subset = [c.node() for c in repo.set(b'::%ln', heads)]
22353
47e3420ae889 getbundle: add `obsmarkers` argument to getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22352
diff changeset
2501 markers = repo.obsstore.relevantmarkers(subset)
43580
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43278
diff changeset
2502 markers = obsutil.sortedmarkers(markers)
32515
e70d6dbde713 bundle2: move function building obsmarker-part in the bundle2 module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32291
diff changeset
2503 bundle2.buildobsmarkerspart(bundler, markers)
22353
47e3420ae889 getbundle: add `obsmarkers` argument to getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22352
diff changeset
2504
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2505
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2506 @getbundle2partsgenerator(b'phases')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2507 def _getbundlephasespart(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2508 bundler, repo, source, bundlecaps=None, b2caps=None, heads=None, **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2509 ):
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2510 """add phase heads part to the requested bundle"""
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2511 if kwargs.get('phases', False):
43795
0f6782df1100 exchange: replace a "not x in ys" by more Pythonic "x not in ys"
Martin von Zweigbergk <martinvonz@google.com>
parents: 43770
diff changeset
2512 if not b2caps or b'heads' not in b2caps.get(b'phases'):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2513 raise error.Abort(_(b'no common phases exchange method'))
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2514 if heads is None:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2515 heads = repo.heads()
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2516
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2517 headsbyphase = collections.defaultdict(set)
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2518 if repo.publishing():
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2519 headsbyphase[phases.public] = heads
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2520 else:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2521 # find the appropriate heads to move
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2522
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2523 phase = repo._phasecache.phase
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2524 node = repo.changelog.node
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2525 rev = repo.changelog.rev
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2526 for h in heads:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2527 headsbyphase[phase(repo, rev(h))].add(h)
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2528 seenphases = list(headsbyphase.keys())
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2529
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2530 # We do not handle anything but public and draft phase for now)
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2531 if seenphases:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2532 assert max(seenphases) <= phases.draft
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2533
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2534 # if client is pulling non-public changesets, we need to find
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2535 # intermediate public heads.
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2536 draftheads = headsbyphase.get(phases.draft, set())
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2537 if draftheads:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2538 publicheads = headsbyphase.get(phases.public, set())
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2539
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2540 revset = b'heads(only(%ln, %ln) and public())'
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2541 extraheads = repo.revs(revset, draftheads, publicheads)
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2542 for r in extraheads:
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2543 headsbyphase[phases.public].add(node(r))
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2544
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2545 # transform data in a format used by the encoding function
45117
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45062
diff changeset
2546 phasemapping = {
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45062
diff changeset
2547 phase: sorted(headsbyphase[phase]) for phase in phases.allphases
b1e51ef4e536 phases: sparsify phase lists
Joerg Sonnenberger <joerg@bec.de>
parents: 45062
diff changeset
2548 }
34322
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2549
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2550 # generate the actual part
10e162bb9bf5 pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents: 34317
diff changeset
2551 phasedata = phases.binaryencode(phasemapping)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2552 bundler.newpart(b'phase-heads', data=phasedata)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2553
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2554
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2555 @getbundle2partsgenerator(b'hgtagsfnodes')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2556 def _getbundletagsfnodes(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2557 bundler,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2558 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2559 source,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2560 bundlecaps=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2561 b2caps=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2562 heads=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2563 common=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2564 **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2565 ):
25402
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2566 """Transfer the .hgtags filenodes mapping.
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2567
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2568 Only values for heads in this bundle will be transferred.
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2569
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2570 The part data consists of pairs of 20 byte changeset node and .hgtags
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2571 filenodes raw values.
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2572 """
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2573 # Don't send unless:
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2574 # - changeset are being exchanged,
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2575 # - the client supports it.
43770
44b605638918 exchange: guard against method invocation on `b2caps=None` args
Matt Harbison <matt_harbison@yahoo.com>
parents: 43769
diff changeset
2576 if not b2caps or not (kwargs.get('cg', True) and b'hgtagsfnodes' in b2caps):
25402
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2577 return
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2578
29808
8d226db31f20 computeoutgoing: move the function from 'changegroup' to 'exchange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29807
diff changeset
2579 outgoing = _computeoutgoing(repo, heads, common)
32222
6068712cbf03 bundle2: move tagsfnodecache generation in a generic function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32201
diff changeset
2580 bundle2.addparttagsfnodescache(repo, bundler, outgoing)
25402
0c2ded041d10 exchange: support transferring .hgtags fnodes mapping
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25369
diff changeset
2581
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2582
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2583 @getbundle2partsgenerator(b'cache:rev-branch-cache')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2584 def _getbundlerevbranchcache(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2585 bundler,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2586 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2587 source,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2588 bundlecaps=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2589 b2caps=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2590 heads=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2591 common=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2592 **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2593 ):
36966
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2594 """Transfer the rev-branch-cache mapping
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2595
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2596 The payload is a series of data related to each branch
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2597
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2598 1) branch name length
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2599 2) number of open heads
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2600 3) number of closed heads
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2601 4) open heads nodes
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2602 5) closed heads nodes
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2603 """
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2604 # Don't send unless:
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2605 # - changeset are being exchanged,
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2606 # - the client supports it.
38789
9b64b73d702b exchange: move disabling of rev-branch-cache bundle part out of narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38614
diff changeset
2607 # - narrow bundle isn't in play (not currently compatible).
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2608 if (
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2609 not kwargs.get('cg', True)
43770
44b605638918 exchange: guard against method invocation on `b2caps=None` args
Matt Harbison <matt_harbison@yahoo.com>
parents: 43769
diff changeset
2610 or not b2caps
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2611 or b'rev-branch-cache' not in b2caps
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43278
diff changeset
2612 or kwargs.get('narrow', False)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2613 or repo.ui.has_section(_NARROWACL_SECTION)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2614 ):
36966
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2615 return
38789
9b64b73d702b exchange: move disabling of rev-branch-cache bundle part out of narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38614
diff changeset
2616
36966
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2617 outgoing = _computeoutgoing(repo, heads, common)
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2618 bundle2.addpartrevbranchcache(repo, bundler, outgoing)
c0e90df1ab1e revbranchcache: add the necessary bit to send 'rbc' data over bundle2
Boris Feld <boris.feld@octobus.net>
parents: 36938
diff changeset
2619
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2620
20967
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
2621 def check_heads(repo, their_heads, context):
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
2622 """check if the heads of a repo have been modified
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
2623
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
2624 Used by peer for unbundling.
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
2625 """
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
2626 heads = repo.heads()
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43913
diff changeset
2627 heads_hash = hashutil.sha1(b''.join(sorted(heads))).digest()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2628 if not (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2629 their_heads == [b'force']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2630 or their_heads == heads
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2631 or their_heads == [b'hashed', heads_hash]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2632 ):
20967
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
2633 # someone else committed/pushed/unbundled while we
984850270acb unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20956
diff changeset
2634 # were transferring data
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2635 raise error.PushRaced(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
2636 b'repository changed while %s - please try again' % context
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2637 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2638
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2639
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2640 def unbundle(repo, cg, heads, source, url):
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2641 """Apply a bundle to a repo.
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2642
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2643 this function makes sure the repo is locked during the application and have
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21012
diff changeset
2644 mechanism to check that no push race occurred between the creation of the
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2645 bundle and its application.
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2646
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2647 If the push was raced as PushRaced exception is raised."""
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2648 r = 0
21061
62d35f251c60 bundle2: allow using bundle2 for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
2649 # need a transaction when processing a bundle2 stream
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2650 # [wlock, lock, tr] - needs to be an array so nested functions can modify it
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2651 lockandtr = [None, None, None]
24847
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
2652 recordout = None
24878
e530cde6d115 bundle2: disable ouput capture unless we use http (issue4613 issue4615)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24851
diff changeset
2653 # quick fix for output mismatch with bundle2 in 3.4
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2654 captureoutput = repo.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2655 b'experimental', b'bundle2-output-capture'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2656 )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2657 if url.startswith(b'remote:http:') or url.startswith(b'remote:https:'):
24878
e530cde6d115 bundle2: disable ouput capture unless we use http (issue4613 issue4615)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24851
diff changeset
2658 captureoutput = True
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2659 try:
30868
847f06179f60 unbundle: add a small comment to clarify the 'check_heads' call
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30685
diff changeset
2660 # note: outside bundle1, 'heads' is expected to be empty and this
847f06179f60 unbundle: add a small comment to clarify the 'check_heads' call
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30685
diff changeset
2661 # 'check_heads' call wil be a no-op
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2662 check_heads(repo, heads, b'uploading changes')
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2663 # push can proceed
32891
7e2eb964a561 exchange: switch to usual way of testing for bundle2-ness
Martin von Zweigbergk <martinvonz@google.com>
parents: 32845
diff changeset
2664 if not isinstance(cg, bundle2.unbundle20):
30870
c5bee6aa4971 unbundle: swap conditional branches for clarity
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30869
diff changeset
2665 # legacy case: bundle1 (changegroup 01)
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
2666 txnname = b"\n".join([source, urlutil.hidepassword(url)])
32930
af31d531dda0 changegroup: let callers pass in transaction to apply() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32927
diff changeset
2667 with repo.lock(), repo.transaction(txnname) as tr:
33043
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33040
diff changeset
2668 op = bundle2.applybundle(repo, cg, tr, source, url)
33040
2baef42a2881 bundle: make applybundle1() return a bundleoperation
Martin von Zweigbergk <martinvonz@google.com>
parents: 33039
diff changeset
2669 r = bundle2.combinechangegroupresults(op)
30870
c5bee6aa4971 unbundle: swap conditional branches for clarity
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30869
diff changeset
2670 else:
24795
f9aa4cb8f2dd bundle2: store the salvaged output on the exception object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24754
diff changeset
2671 r = None
21187
bcfd44abad93 bundle2: gracefully handle hook abort
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21184
diff changeset
2672 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2673
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2674 def gettransaction():
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2675 if not lockandtr[2]:
42326
5d4ec64a6fcb exchange: don't take wlock if bookmarks are stored in .hg/store/
Martin von Zweigbergk <martinvonz@google.com>
parents: 42209
diff changeset
2676 if not bookmod.bookmarksinstore(repo):
5d4ec64a6fcb exchange: don't take wlock if bookmarks are stored in .hg/store/
Martin von Zweigbergk <martinvonz@google.com>
parents: 42209
diff changeset
2677 lockandtr[0] = repo.wlock()
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2678 lockandtr[1] = repo.lock()
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2679 lockandtr[2] = repo.transaction(source)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2680 lockandtr[2].hookargs[b'source'] = source
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2681 lockandtr[2].hookargs[b'url'] = url
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2682 lockandtr[2].hookargs[b'bundle2'] = b'1'
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2683 return lockandtr[2]
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2684
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2685 # Do greedy locking by default until we're satisfied with lazy
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2686 # locking.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2687 if not repo.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2688 b'experimental', b'bundle2lazylocking'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2689 ):
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2690 gettransaction()
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2691
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2692 op = bundle2.bundleoperation(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2693 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2694 gettransaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2695 captureoutput=captureoutput,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2696 source=b'push',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2697 )
24851
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
2698 try:
25896
6805a4f76cda exchange: fix dead assignment
Martin von Zweigbergk <martinvonz@google.com>
parents: 25895
diff changeset
2699 op = bundle2.processbundle(repo, cg, op=op)
24851
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
2700 finally:
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
2701 r = op.reply
24878
e530cde6d115 bundle2: disable ouput capture unless we use http (issue4613 issue4615)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24851
diff changeset
2702 if captureoutput and r is not None:
24851
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
2703 repo.ui.pushbuffer(error=True, subproc=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2704
24851
df0ce98c882f bundle2: also save output when error happens during part processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24850
diff changeset
2705 def recordout(output):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2706 r.newpart(b'output', data=output, mandatory=False)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2707
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2708 if lockandtr[2] is not None:
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2709 lockandtr[2].close()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25640
diff changeset
2710 except BaseException as exc:
21187
bcfd44abad93 bundle2: gracefully handle hook abort
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21184
diff changeset
2711 exc.duringunbundle2 = True
24878
e530cde6d115 bundle2: disable ouput capture unless we use http (issue4613 issue4615)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24851
diff changeset
2712 if captureoutput and r is not None:
24847
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
2713 parts = exc._bundle2salvagedoutput = r.salvageoutput()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2714
24847
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
2715 def recordout(output):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2716 part = bundle2.bundlepart(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2717 b'output', data=output, mandatory=False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2718 )
24847
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
2719 parts.append(part)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2720
21187
bcfd44abad93 bundle2: gracefully handle hook abort
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21184
diff changeset
2721 raise
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2722 finally:
26566
58880acd2369 bundle2: allow lazily acquiring the lock
Durham Goode <durham@fb.com>
parents: 26471
diff changeset
2723 lockmod.release(lockandtr[2], lockandtr[1], lockandtr[0])
24847
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
2724 if recordout is not None:
b705e5ab3b07 bundle2: capture transaction rollback message output (issue4614)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24795
diff changeset
2725 recordout(repo.ui.popbuffer())
20968
33d5fdd9bd99 unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20967
diff changeset
2726 return r
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2727
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2728
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2729 def _maybeapplyclonebundle(pullop):
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2730 """Apply a clone bundle from a remote, if possible."""
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2731
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2732 repo = pullop.repo
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2733 remote = pullop.remote
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2734
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2735 if not repo.ui.configbool(b'ui', b'clonebundles'):
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2736 return
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2737
26855
9350f00a7b23 exchange: do not attempt clone bundle if local repo is non-empty (issue4932)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26829
diff changeset
2738 # Only run if local repo is empty.
9350f00a7b23 exchange: do not attempt clone bundle if local repo is non-empty (issue4932)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26829
diff changeset
2739 if len(repo):
9350f00a7b23 exchange: do not attempt clone bundle if local repo is non-empty (issue4932)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26829
diff changeset
2740 return
9350f00a7b23 exchange: do not attempt clone bundle if local repo is non-empty (issue4932)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26829
diff changeset
2741
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2742 if pullop.heads:
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2743 return
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2744
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2745 if not remote.capable(b'clonebundles'):
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2746 return
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2747
37649
a168799687e5 wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37648
diff changeset
2748 with remote.commandexecutor() as e:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2749 res = e.callcommand(b'clonebundles', {}).result()
26689
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
2750
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
2751 # If we call the wire protocol command, that's good enough to record the
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
2752 # attempt.
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
2753 pullop.clonebundleattempted = True
2c9f15366982 exchange: record that we attempted to fetch a clone bundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26688
diff changeset
2754
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45681
diff changeset
2755 entries = bundlecaches.parseclonebundlesmanifest(repo, res)
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2756 if not entries:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2757 repo.ui.note(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2758 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2759 b'no clone bundles available on remote; '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2760 b'falling back to regular clone\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2761 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2762 )
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2763 return
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2764
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45681
diff changeset
2765 entries = bundlecaches.filterclonebundleentries(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2766 repo, entries, streamclonerequested=pullop.streamclonerequested
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2767 )
34364
ff406f3e57b2 exchange: perform stream clone with clone bundle with --uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34323
diff changeset
2768
26644
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
2769 if not entries:
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
2770 # There is a thundering herd concern here. However, if a server
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
2771 # operator doesn't advertise bundles appropriate for its clients,
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
2772 # they deserve what's coming. Furthermore, from a client's
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
2773 # perspective, no automatic fallback would mean not being able to
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
2774 # clone!
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2775 repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2776 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2777 b'no compatible clone bundles available on server; '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2778 b'falling back to regular clone\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2779 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2780 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2781 repo.ui.warn(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
2782 _(b'(you may want to report this to the server operator)\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2783 )
26644
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
2784 return
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
2785
45784
74271829ddc0 clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45681
diff changeset
2786 entries = bundlecaches.sortclonebundleentries(repo.ui, entries)
26644
74de1c59f71c clonebundles: filter on bundle specification
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26643
diff changeset
2787
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2788 url = entries[0][b'URL']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2789 repo.ui.status(_(b'applying clone bundle from %s\n') % url)
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2790 if trypullbundlefromurl(repo.ui, repo, url):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2791 repo.ui.status(_(b'finished applying clone bundle\n'))
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2792 # Bundle failed.
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2793 #
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2794 # We abort by default to avoid the thundering herd of
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2795 # clients flooding a server that was expecting expensive
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2796 # clone load to be offloaded.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2797 elif repo.ui.configbool(b'ui', b'clonebundlefallback'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2798 repo.ui.warn(_(b'falling back to normal clone\n'))
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2799 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2800 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2801 _(b'error applying bundle'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2802 hint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2803 b'if this error persists, consider contacting '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2804 b'the server operator or disable clone '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2805 b'bundles via '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2806 b'"--config ui.clonebundles=false"'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2807 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2808 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2809
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2810
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2811 def trypullbundlefromurl(ui, repo, url):
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2812 """Attempt to apply a bundle from a URL."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2813 with repo.lock(), repo.transaction(b'bundleurl') as tr:
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2814 try:
32843
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
2815 fh = urlmod.open(ui, url)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2816 cg = readbundle(ui, fh, b'stream')
26643
d2e16419d3f4 clonebundle: support bundle2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26640
diff changeset
2817
33043
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33040
diff changeset
2818 if isinstance(cg, streamclone.streamcloneapplier):
32843
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
2819 cg.apply(repo)
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
2820 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2821 bundle2.applybundle(repo, cg, tr, b'clonebundles', url)
32843
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
2822 return True
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
2823 except urlerr.httperror as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2824 ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2825 _(b'HTTP error fetching bundle: %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2826 % stringutil.forcebytestr(e)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2827 )
32843
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
2828 except urlerr.urlerror as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2829 ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2830 _(b'error fetching bundle: %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2831 % stringutil.forcebytestr(e.reason)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42925
diff changeset
2832 )
26623
5a95fe44121d clonebundles: support for seeding clones from pre-generated bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
2833
32843
a470bbb4e3af clonebundle: use context managers for lock and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32709
diff changeset
2834 return False