##// END OF EJS Templates
upgrade: move descriptions and selection logic in individual classes...
Pierre-Yves David -
r32031:11a2461f default
parent child Browse files
Show More
@@ -140,93 +140,153 b' class improvement(object):'
140 140 return hash(self.name)
141 141
142 142 class formatvariant(improvement):
143 """an improvement subclass dedicated to repository format
143 """an improvement subclass dedicated to repository format"""
144 type = deficiency
145 ### The following attributes should be defined for each class:
146
147 # machine-readable string uniquely identifying this improvement. it will be
148 # mapped to an action later in the upgrade process.
149 name = None
144 150
145 extra attributes:
151 # message intended for humans explaining the improvement in more detail,
152 # including the implications of it ``deficiency`` types, should be worded
153 # in the present tense.
154 description = None
155
156 # message intended for humans explaining what an upgrade addressing this
157 # issue will do. should be worded in the future tense.
158 upgrademessage = None
146 159
147 fromdefault (``deficiency`` types only)
148 Boolean indicating whether the current (deficient) state deviates
149 from Mercurial's default configuration.
160 # value of current Mercurial default for new repository
161 default = None
162
163 def __init__(self):
164 raise NotImplementedError()
165
166 @staticmethod
167 def fromrepo(repo):
168 """current value of the variant in the repository"""
169 raise NotImplementedError()
150 170
151 fromconfig (``deficiency`` types only)
152 Boolean indicating whether the current (deficient) state deviates
153 from the current Mercurial configuration.
171 @staticmethod
172 def fromconfig(repo):
173 """current value of the variant in the configuration"""
174 raise NotImplementedError()
175
176 class requirementformatvariant(formatvariant):
177 """formatvariant based on a 'requirement' name.
178
179 Many format variant are controlled by a 'requirement'. We define a small
180 subclass to factor the code.
154 181 """
155 182
156 def __init__(self, name, description, upgrademessage, fromdefault,
157 fromconfig):
158 super(formatvariant, self).__init__(name, deficiency, description,
159 upgrademessage)
160 self.fromdefault = fromdefault
161 self.fromconfig = fromconfig
183 # the requirement that control this format variant
184 _requirement = None
185
186 @staticmethod
187 def _newreporequirements(repo):
188 return localrepo.newreporequirements(repo)
189
190 @classmethod
191 def fromrepo(cls, repo):
192 assert cls._requirement is not None
193 return cls._requirement in repo.requirements
194
195 @classmethod
196 def fromconfig(cls, repo):
197 assert cls._requirement is not None
198 return cls._requirement in cls._newreporequirements(repo)
199
200 class fncache(requirementformatvariant):
201 name = 'fncache'
202
203 _requirement = 'fncache'
204
205 default = True
206
207 description = _('long and reserved filenames may not work correctly; '
208 'repository performance is sub-optimal')
209
210 upgrademessage = _('repository will be more resilient to storing '
211 'certain paths and performance of certain '
212 'operations should be improved')
213
214 class dotencode(requirementformatvariant):
215 name = 'dotencode'
216
217 _requirement = 'dotencode'
218
219 default = True
220
221 description = _('storage of filenames beginning with a period or '
222 'space may not work correctly')
223
224 upgrademessage = _('repository will be better able to store files '
225 'beginning with a space or period')
226
227 class generaldelta(requirementformatvariant):
228 name = 'generaldelta'
229
230 _requirement = 'generaldelta'
231
232 default = True
233
234 description = _('deltas within internal storage are unable to '
235 'choose optimal revisions; repository is larger and '
236 'slower than it could be; interaction with other '
237 'repositories may require extra network and CPU '
238 'resources, making "hg push" and "hg pull" slower')
239
240 upgrademessage = _('repository storage will be able to create '
241 'optimal deltas; new repository data will be '
242 'smaller and read times should decrease; '
243 'interacting with other repositories using this '
244 'storage model should require less network and '
245 'CPU resources, making "hg push" and "hg pull" '
246 'faster')
247
248 class removecldeltachain(formatvariant):
249 name = 'removecldeltachain'
250
251 default = True
252
253 description = _('changelog storage is using deltas instead of '
254 'raw entries; changelog reading and any '
255 'operation relying on changelog data are slower '
256 'than they could be')
257
258 upgrademessage = _('changelog storage will be reformated to '
259 'store raw entries; changelog reading will be '
260 'faster; changelog size may be reduced')
261
262 @staticmethod
263 def fromrepo(repo):
264 # Mercurial 4.0 changed changelogs to not use delta chains. Search for
265 # changelogs with deltas.
266 cl = repo.changelog
267 chainbase = cl.chainbase
268 return all(rev == chainbase(rev) for rev in cl)
269
270 @staticmethod
271 def fromconfig(repo):
272 return True
162 273
163 274 def finddeficiencies(repo):
164 275 """returns a list of deficiencies that the repo suffer from"""
165 newreporeqs = localrepo.newreporequirements(repo)
166
167 276 deficiencies = []
168 277
169 278 # We could detect lack of revlogv1 and store here, but they were added
170 279 # in 0.9.2 and we don't support upgrading repos without these
171 280 # requirements, so let's not bother.
172 281
173 if 'fncache' not in repo.requirements:
174 deficiencies.append(formatvariant(
175 name='fncache',
176 description=_('long and reserved filenames may not work correctly; '
177 'repository performance is sub-optimal'),
178 upgrademessage=_('repository will be more resilient to storing '
179 'certain paths and performance of certain '
180 'operations should be improved'),
181 fromdefault=True,
182 fromconfig='fncache' in newreporeqs))
183
184 if 'dotencode' not in repo.requirements:
185 deficiencies.append(formatvariant(
186 name='dotencode',
187 description=_('storage of filenames beginning with a period or '
188 'space may not work correctly'),
189 upgrademessage=_('repository will be better able to store files '
190 'beginning with a space or period'),
191 fromdefault=True,
192 fromconfig='dotencode' in newreporeqs))
193
194 if 'generaldelta' not in repo.requirements:
195 deficiencies.append(formatvariant(
196 name='generaldelta',
197 description=_('deltas within internal storage are unable to '
198 'choose optimal revisions; repository is larger and '
199 'slower than it could be; interaction with other '
200 'repositories may require extra network and CPU '
201 'resources, making "hg push" and "hg pull" slower'),
202 upgrademessage=_('repository storage will be able to create '
203 'optimal deltas; new repository data will be '
204 'smaller and read times should decrease; '
205 'interacting with other repositories using this '
206 'storage model should require less network and '
207 'CPU resources, making "hg push" and "hg pull" '
208 'faster'),
209 fromdefault=True,
210 fromconfig='generaldelta' in newreporeqs))
211
212 # Mercurial 4.0 changed changelogs to not use delta chains. Search for
213 # changelogs with deltas.
214 cl = repo.changelog
215 for rev in cl:
216 chainbase = cl.chainbase(rev)
217 if chainbase != rev:
218 deficiencies.append(formatvariant(
219 name='removecldeltachain',
220 description=_('changelog storage is using deltas instead of '
221 'raw entries; changelog reading and any '
222 'operation relying on changelog data are slower '
223 'than they could be'),
224 upgrademessage=_('changelog storage will be reformated to '
225 'store raw entries; changelog reading will be '
226 'faster; changelog size may be reduced'),
227 fromdefault=True,
228 fromconfig=True))
229 break
282 if not fncache.fromrepo(repo):
283 deficiencies.append(fncache)
284 if not dotencode.fromrepo(repo):
285 deficiencies.append(dotencode)
286 if not generaldelta.fromrepo(repo):
287 deficiencies.append(generaldelta)
288 if not removecldeltachain.fromrepo(repo):
289 deficiencies.append(removecldeltachain)
230 290
231 291 return deficiencies
232 292
@@ -680,9 +740,9 b' def upgraderepo(ui, repo, run=False, opt'
680 740 onlydefault = []
681 741
682 742 for d in deficiencies:
683 if d.fromconfig:
743 if d.fromconfig(repo):
684 744 fromconfig.append(d)
685 elif d.fromdefault:
745 elif d.default:
686 746 onlydefault.append(d)
687 747
688 748 if fromconfig or onlydefault:
General Comments 0
You need to be logged in to leave comments. Login now