301 |
301 |
302 return parentctxnode, rules, keep, topmost, replacements, backupfile |
302 return parentctxnode, rules, keep, topmost, replacements, backupfile |
303 |
303 |
304 def clear(self): |
304 def clear(self): |
305 self.repo.vfs.unlink('histedit-state') |
305 self.repo.vfs.unlink('histedit-state') |
|
306 |
|
307 class histeditaction(object): |
|
308 def __init__(self, state, node): |
|
309 self.state = state |
|
310 self.repo = state.repo |
|
311 self.node = node |
|
312 |
|
313 @classmethod |
|
314 def fromrule(cls, state, rule): |
|
315 """Parses the given rule, returning an instance of the histeditaction. |
|
316 """ |
|
317 repo = state.repo |
|
318 rulehash = rule.strip().split(' ', 1)[0] |
|
319 try: |
|
320 node = repo[rulehash].node() |
|
321 except error.RepoError: |
|
322 raise util.Abort(_('unknown changeset %s listed') % rulehash[:12]) |
|
323 return cls(state, node) |
|
324 |
|
325 def run(self): |
|
326 """Runs the action. The default behavior is simply apply the action's |
|
327 rulectx onto the current parentctx.""" |
|
328 self.applychange() |
|
329 self.continuedirty() |
|
330 return self.continueclean() |
|
331 |
|
332 def applychange(self): |
|
333 """Applies the changes from this action's rulectx onto the current |
|
334 parentctx, but does not commit them.""" |
|
335 repo = self.repo |
|
336 rulectx = repo[self.node] |
|
337 hg.update(repo, self.state.parentctxnode) |
|
338 stats = applychanges(repo.ui, repo, rulectx, {}) |
|
339 if stats and stats[3] > 0: |
|
340 raise error.InterventionRequired(_('Fix up the change and run ' |
|
341 'hg histedit --continue')) |
|
342 |
|
343 def continuedirty(self): |
|
344 """Continues the action when changes have been applied to the working |
|
345 copy. The default behavior is to commit the dirty changes.""" |
|
346 repo = self.repo |
|
347 rulectx = repo[self.node] |
|
348 |
|
349 editor = self.commiteditor() |
|
350 commit = commitfuncfor(repo, rulectx) |
|
351 |
|
352 commit(text=rulectx.description(), user=rulectx.user(), |
|
353 date=rulectx.date(), extra=rulectx.extra(), editor=editor) |
|
354 |
|
355 def commiteditor(self): |
|
356 """The editor to be used to edit the commit message.""" |
|
357 return False |
|
358 |
|
359 def continueclean(self): |
|
360 """Continues the action when the working copy is clean. The default |
|
361 behavior is to accept the current commit as the new version of the |
|
362 rulectx.""" |
|
363 ctx = self.repo['.'] |
|
364 if ctx.node() == self.state.parentctxnode: |
|
365 self.repo.ui.warn(_('%s: empty changeset\n') % |
|
366 node.short(self.node)) |
|
367 return ctx, [(self.node, tuple())] |
|
368 if ctx.node() == self.node: |
|
369 # Nothing changed |
|
370 return ctx, [] |
|
371 return ctx, [(self.node, (ctx.node(),))] |
306 |
372 |
307 def commitfuncfor(repo, src): |
373 def commitfuncfor(repo, src): |
308 """Build a commit function for the replacement of <src> |
374 """Build a commit function for the replacement of <src> |
309 |
375 |
310 This function ensure we apply the same treatment to all changesets. |
376 This function ensure we apply the same treatment to all changesets. |