comparison mercurial/cmdutil.py @ 24359:521fe8287dd5

revert: add flag to make revert interactive
author Laurent Charignon <lcharignon@fb.com>
date Mon, 16 Mar 2015 16:33:59 -0700
parents 8d9e9063b040
children 135b23868f45
comparison
equal deleted inserted replaced
24358:8d9e9063b040 24359:521fe8287dd5
3016 3016
3017 3017
3018 if not opts.get('dry_run'): 3018 if not opts.get('dry_run'):
3019 needdata = ('revert', 'add', 'undelete') 3019 needdata = ('revert', 'add', 'undelete')
3020 _revertprefetch(repo, ctx, *[actions[name][0] for name in needdata]) 3020 _revertprefetch(repo, ctx, *[actions[name][0] for name in needdata])
3021 3021 interactive = opts.get('interactive', False)
3022 _performrevert(repo, parents, ctx, actions) 3022 _performrevert(repo, parents, ctx, actions, interactive)
3023 3023
3024 # get the list of subrepos that must be reverted 3024 # get the list of subrepos that must be reverted
3025 subrepomatch = scmutil.match(ctx, pats, opts) 3025 subrepomatch = scmutil.match(ctx, pats, opts)
3026 targetsubs = sorted(s for s in ctx.substate if subrepomatch(s)) 3026 targetsubs = sorted(s for s in ctx.substate if subrepomatch(s))
3027 3027
3034 3034
3035 def _revertprefetch(repo, ctx, *files): 3035 def _revertprefetch(repo, ctx, *files):
3036 """Let extension changing the storage layer prefetch content""" 3036 """Let extension changing the storage layer prefetch content"""
3037 pass 3037 pass
3038 3038
3039 def _performrevert(repo, parents, ctx, actions): 3039 def _performrevert(repo, parents, ctx, actions, interactive=False):
3040 """function that actually perform all the actions computed for revert 3040 """function that actually perform all the actions computed for revert
3041 3041
3042 This is an independent function to let extension to plug in and react to 3042 This is an independent function to let extension to plug in and react to
3043 the imminent revert. 3043 the imminent revert.
3044 3044
3068 # merges to avoid losing information about merged/dirty files. 3068 # merges to avoid losing information about merged/dirty files.
3069 if p2 != nullid: 3069 if p2 != nullid:
3070 normal = repo.dirstate.normallookup 3070 normal = repo.dirstate.normallookup
3071 else: 3071 else:
3072 normal = repo.dirstate.normal 3072 normal = repo.dirstate.normal
3073 for f in actions['revert'][0]: 3073
3074 checkout(f) 3074 if interactive:
3075 if normal: 3075 # Prompt the user for changes to revert
3076 normal(f) 3076 torevert = [repo.wjoin(f) for f in actions['revert'][0]]
3077 m = scmutil.match(ctx, torevert, {})
3078 diff = patch.diff(repo, None, ctx.node(), m)
3079 originalchunks = patch.parsepatch(diff)
3080 try:
3081 chunks = recordfilter(repo.ui, originalchunks)
3082 except patch.PatchError, err:
3083 raise util.Abort(_('error parsing patch: %s') % err)
3084
3085 # Apply changes
3086 fp = cStringIO.StringIO()
3087 for c in chunks:
3088 c.write(fp)
3089 dopatch = fp.tell()
3090 fp.seek(0)
3091 if dopatch:
3092 try:
3093 patch.internalpatch(repo.ui, repo, fp, 1, eolmode=None)
3094 except patch.PatchError, err:
3095 raise util.Abort(str(err))
3096 del fp
3097
3098 for f in actions['revert'][0]:
3099 if normal:
3100 normal(f)
3101
3102 else:
3103 for f in actions['revert'][0]:
3104 checkout(f)
3105 if normal:
3106 normal(f)
3077 3107
3078 for f in actions['add'][0]: 3108 for f in actions['add'][0]:
3079 checkout(f) 3109 checkout(f)
3080 repo.dirstate.add(f) 3110 repo.dirstate.add(f)
3081 3111