##// END OF EJS Templates
bundlespec: introduce an attr-based class for bundlespec...
Boris Feld -
r37181:b229fd9a default
parent child Browse files
Show More
@@ -1199,12 +1199,12 b' def bundle(ui, repo, fname, dest=None, *'
1199 1199
1200 1200 bundletype = opts.get('type', 'bzip2').lower()
1201 1201 try:
1202 bcompression, cgversion, params = exchange.parsebundlespec(
1203 repo, bundletype, strict=False)
1202 bundlespec = exchange.parsebundlespec(repo, bundletype, strict=False)
1204 1203 except error.UnsupportedBundleSpecification as e:
1205 1204 raise error.Abort(pycompat.bytestr(e),
1206 1205 hint=_("see 'hg help bundlespec' for supported "
1207 1206 "values for --type"))
1207 cgversion = bundlespec.version
1208 1208
1209 1209 # Packed bundles are a pseudo bundle format for now.
1210 1210 if cgversion == 's1':
@@ -1246,6 +1246,7 b' def bundle(ui, repo, fname, dest=None, *'
1246 1246 scmutil.nochangesfound(ui, repo, not base and outgoing.excluded)
1247 1247 return 1
1248 1248
1249 bcompression = bundlespec.compression
1249 1250 if cgversion == '01': #bundle1
1250 1251 if bcompression is None:
1251 1252 bcompression = 'UN'
@@ -17,6 +17,9 b' from .node import ('
17 17 hex,
18 18 nullid,
19 19 )
20 from .thirdparty import (
21 attr,
22 )
20 23 from . import (
21 24 bookmarks as bookmod,
22 25 bundle2,
@@ -52,6 +55,12 b' urlreq = util.urlreq'
52 55 # Compression engines allowed in version 1. THIS SHOULD NEVER CHANGE.
53 56 _bundlespecv1compengines = {'gzip', 'bzip2', 'none'}
54 57
58 @attr.s
59 class bundlespec(object):
60 compression = attr.ib()
61 version = attr.ib()
62 params = attr.ib()
63
55 64 def parsebundlespec(repo, spec, strict=True, externalnames=False):
56 65 """Parse a bundle string specification into parts.
57 66
@@ -75,8 +84,9 b' def parsebundlespec(repo, spec, strict=T'
75 84 If ``externalnames`` is False (the default), the human-centric names will
76 85 be converted to their internal representation.
77 86
78 Returns a 3-tuple of (compression, version, parameters). Compression will
79 be ``None`` if not in strict mode and a compression isn't defined.
87 Returns a bundlespec object of (compression, version, parameters).
88 Compression will be ``None`` if not in strict mode and a compression isn't
89 defined.
80 90
81 91 An ``InvalidBundleSpecification`` is raised when the specification is
82 92 not syntactically well formed.
@@ -172,7 +182,8 b' def parsebundlespec(repo, spec, strict=T'
172 182 engine = util.compengines.forbundlename(compression)
173 183 compression = engine.bundletype()[1]
174 184 version = _bundlespeccgversions[version]
175 return compression, version, params
185
186 return bundlespec(compression, version, params)
176 187
177 188 def readbundle(ui, fh, fname, vfs=None):
178 189 header = changegroup.readexactly(fh, 4)
@@ -2140,10 +2151,10 b' def parseclonebundlesmanifest(repo, s):'
2140 2151 # component of the BUNDLESPEC.
2141 2152 if key == 'BUNDLESPEC':
2142 2153 try:
2143 comp, version, params = parsebundlespec(repo, value,
2144 externalnames=True)
2145 attrs['COMPRESSION'] = comp
2146 attrs['VERSION'] = version
2154 bundlespec = parsebundlespec(repo, value,
2155 externalnames=True)
2156 attrs['COMPRESSION'] = bundlespec.compression
2157 attrs['VERSION'] = bundlespec.version
2147 2158 except error.InvalidBundleSpecification:
2148 2159 pass
2149 2160 except error.UnsupportedBundleSpecification:
@@ -2168,10 +2179,12 b' def filterclonebundleentries(repo, entri'
2168 2179 spec = entry.get('BUNDLESPEC')
2169 2180 if spec:
2170 2181 try:
2171 comp, version, params = parsebundlespec(repo, spec, strict=True)
2182 bundlespec = parsebundlespec(repo, spec, strict=True)
2172 2183
2173 2184 # If a stream clone was requested, filter out non-streamclone
2174 2185 # entries.
2186 comp = bundlespec.compression
2187 version = bundlespec.version
2175 2188 if streamclonerequested and (comp != 'UN' or version != 's1'):
2176 2189 repo.ui.debug('filtering %s because not a stream clone\n' %
2177 2190 entry['URL'])
General Comments 0
You need to be logged in to leave comments. Login now