mercurial/commands.py
changeset 47433 fc8e29ffc380
parent 47432 7f7457f84311
child 47437 7a430116f639
equal deleted inserted replaced
47432:7f7457f84311 47433:fc8e29ffc380
  3103     statedata = {}
  3103     statedata = {}
  3104     # list of new nodes created by ongoing graft
  3104     # list of new nodes created by ongoing graft
  3105     statedata[b'newnodes'] = []
  3105     statedata[b'newnodes'] = []
  3106 
  3106 
  3107     cmdutil.resolve_commit_options(ui, opts)
  3107     cmdutil.resolve_commit_options(ui, opts)
  3108     opts = pycompat.byteskwargs(opts)
  3108 
  3109 
  3109     editor = cmdutil.getcommiteditor(editform=b'graft', **opts)
  3110     editor = cmdutil.getcommiteditor(
  3110 
  3111         editform=b'graft', **pycompat.strkwargs(opts)
  3111     cmdutil.check_at_most_one_arg(opts, 'abort', 'stop', 'continue')
  3112     )
       
  3113 
       
  3114     cmdutil.check_at_most_one_arg(opts, b'abort', b'stop', b'continue')
       
  3115 
  3112 
  3116     cont = False
  3113     cont = False
  3117     if opts.get(b'no_commit'):
  3114     if opts.get('no_commit'):
  3118         cmdutil.check_incompatible_arguments(
  3115         cmdutil.check_incompatible_arguments(
  3119             opts,
  3116             opts,
  3120             b'no_commit',
  3117             'no_commit',
  3121             [b'edit', b'currentuser', b'currentdate', b'log'],
  3118             ['edit', 'currentuser', 'currentdate', 'log'],
  3122         )
  3119         )
  3123 
  3120 
  3124     graftstate = statemod.cmdstate(repo, b'graftstate')
  3121     graftstate = statemod.cmdstate(repo, b'graftstate')
  3125 
  3122 
  3126     if opts.get(b'stop'):
  3123     if opts.get('stop'):
  3127         cmdutil.check_incompatible_arguments(
  3124         cmdutil.check_incompatible_arguments(
  3128             opts,
  3125             opts,
  3129             b'stop',
  3126             'stop',
  3130             [
  3127             [
  3131                 b'edit',
  3128                 'edit',
  3132                 b'log',
  3129                 'log',
  3133                 b'user',
  3130                 'user',
  3134                 b'date',
  3131                 'date',
  3135                 b'currentdate',
  3132                 'currentdate',
  3136                 b'currentuser',
  3133                 'currentuser',
  3137                 b'rev',
  3134                 'rev',
  3138             ],
  3135             ],
  3139         )
  3136         )
  3140         return _stopgraft(ui, repo, graftstate)
  3137         return _stopgraft(ui, repo, graftstate)
  3141     elif opts.get(b'abort'):
  3138     elif opts.get('abort'):
  3142         cmdutil.check_incompatible_arguments(
  3139         cmdutil.check_incompatible_arguments(
  3143             opts,
  3140             opts,
  3144             b'abort',
  3141             'abort',
  3145             [
  3142             [
  3146                 b'edit',
  3143                 'edit',
  3147                 b'log',
  3144                 'log',
  3148                 b'user',
  3145                 'user',
  3149                 b'date',
  3146                 'date',
  3150                 b'currentdate',
  3147                 'currentdate',
  3151                 b'currentuser',
  3148                 'currentuser',
  3152                 b'rev',
  3149                 'rev',
  3153             ],
  3150             ],
  3154         )
  3151         )
  3155         return cmdutil.abortgraft(ui, repo, graftstate)
  3152         return cmdutil.abortgraft(ui, repo, graftstate)
  3156     elif opts.get(b'continue'):
  3153     elif opts.get('continue'):
  3157         cont = True
  3154         cont = True
  3158         if revs:
  3155         if revs:
  3159             raise error.InputError(_(b"can't specify --continue and revisions"))
  3156             raise error.InputError(_(b"can't specify --continue and revisions"))
  3160         # read in unfinished revisions
  3157         # read in unfinished revisions
  3161         if graftstate.exists():
  3158         if graftstate.exists():
  3162             statedata = cmdutil.readgraftstate(repo, graftstate)
  3159             statedata = cmdutil.readgraftstate(repo, graftstate)
  3163             if statedata.get(b'date'):
  3160             if statedata.get(b'date'):
  3164                 opts[b'date'] = statedata[b'date']
  3161                 opts['date'] = statedata[b'date']
  3165             if statedata.get(b'user'):
  3162             if statedata.get(b'user'):
  3166                 opts[b'user'] = statedata[b'user']
  3163                 opts['user'] = statedata[b'user']
  3167             if statedata.get(b'log'):
  3164             if statedata.get(b'log'):
  3168                 opts[b'log'] = True
  3165                 opts['log'] = True
  3169             if statedata.get(b'no_commit'):
  3166             if statedata.get(b'no_commit'):
  3170                 opts[b'no_commit'] = statedata.get(b'no_commit')
  3167                 opts['no_commit'] = statedata.get(b'no_commit')
  3171             if statedata.get(b'base'):
  3168             if statedata.get(b'base'):
  3172                 opts[b'base'] = statedata.get(b'base')
  3169                 opts['base'] = statedata.get(b'base')
  3173             nodes = statedata[b'nodes']
  3170             nodes = statedata[b'nodes']
  3174             revs = [repo[node].rev() for node in nodes]
  3171             revs = [repo[node].rev() for node in nodes]
  3175         else:
  3172         else:
  3176             cmdutil.wrongtooltocontinue(repo, _(b'graft'))
  3173             cmdutil.wrongtooltocontinue(repo, _(b'graft'))
  3177     else:
  3174     else:
  3181         cmdutil.bailifchanged(repo)
  3178         cmdutil.bailifchanged(repo)
  3182         revs = scmutil.revrange(repo, revs)
  3179         revs = scmutil.revrange(repo, revs)
  3183 
  3180 
  3184     skipped = set()
  3181     skipped = set()
  3185     basectx = None
  3182     basectx = None
  3186     if opts.get(b'base'):
  3183     if opts.get('base'):
  3187         basectx = scmutil.revsingle(repo, opts[b'base'], None)
  3184         basectx = scmutil.revsingle(repo, opts['base'], None)
  3188     if basectx is None:
  3185     if basectx is None:
  3189         # check for merges
  3186         # check for merges
  3190         for rev in repo.revs(b'%ld and merge()', revs):
  3187         for rev in repo.revs(b'%ld and merge()', revs):
  3191             ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
  3188             ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
  3192             skipped.add(rev)
  3189             skipped.add(rev)
  3200     # --continues. That's because without --force, any revisions we decided to
  3197     # --continues. That's because without --force, any revisions we decided to
  3201     # skip would have been filtered out here, so they wouldn't have made their
  3198     # skip would have been filtered out here, so they wouldn't have made their
  3202     # way to the graftstate. With --force, any revisions we would have otherwise
  3199     # way to the graftstate. With --force, any revisions we would have otherwise
  3203     # skipped would not have been filtered out, and if they hadn't been applied
  3200     # skipped would not have been filtered out, and if they hadn't been applied
  3204     # already, they'd have been in the graftstate.
  3201     # already, they'd have been in the graftstate.
  3205     if not (cont or opts.get(b'force')) and basectx is None:
  3202     if not (cont or opts.get('force')) and basectx is None:
  3206         # check for ancestors of dest branch
  3203         # check for ancestors of dest branch
  3207         ancestors = repo.revs(b'%ld & (::.)', revs)
  3204         ancestors = repo.revs(b'%ld & (::.)', revs)
  3208         for rev in ancestors:
  3205         for rev in ancestors:
  3209             ui.warn(_(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev]))
  3206             ui.warn(_(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev]))
  3210 
  3207 
  3273                     )
  3270                     )
  3274                     revs.remove(r)
  3271                     revs.remove(r)
  3275         if not revs:
  3272         if not revs:
  3276             return -1
  3273             return -1
  3277 
  3274 
  3278     if opts.get(b'no_commit'):
  3275     if opts.get('no_commit'):
  3279         statedata[b'no_commit'] = True
  3276         statedata[b'no_commit'] = True
  3280     if opts.get(b'base'):
  3277     if opts.get('base'):
  3281         statedata[b'base'] = opts[b'base']
  3278         statedata[b'base'] = opts['base']
  3282     for pos, ctx in enumerate(repo.set(b"%ld", revs)):
  3279     for pos, ctx in enumerate(repo.set(b"%ld", revs)):
  3283         desc = b'%d:%s "%s"' % (
  3280         desc = b'%d:%s "%s"' % (
  3284             ctx.rev(),
  3281             ctx.rev(),
  3285             ctx,
  3282             ctx,
  3286             ctx.description().split(b'\n', 1)[0],
  3283             ctx.description().split(b'\n', 1)[0],
  3287         )
  3284         )
  3288         names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
  3285         names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
  3289         if names:
  3286         if names:
  3290             desc += b' (%s)' % b' '.join(names)
  3287             desc += b' (%s)' % b' '.join(names)
  3291         ui.status(_(b'grafting %s\n') % desc)
  3288         ui.status(_(b'grafting %s\n') % desc)
  3292         if opts.get(b'dry_run'):
  3289         if opts.get('dry_run'):
  3293             continue
  3290             continue
  3294 
  3291 
  3295         source = ctx.extra().get(b'source')
  3292         source = ctx.extra().get(b'source')
  3296         extra = {}
  3293         extra = {}
  3297         if source:
  3294         if source:
  3298             extra[b'source'] = source
  3295             extra[b'source'] = source
  3299             extra[b'intermediate-source'] = ctx.hex()
  3296             extra[b'intermediate-source'] = ctx.hex()
  3300         else:
  3297         else:
  3301             extra[b'source'] = ctx.hex()
  3298             extra[b'source'] = ctx.hex()
  3302         user = ctx.user()
  3299         user = ctx.user()
  3303         if opts.get(b'user'):
  3300         if opts.get('user'):
  3304             user = opts[b'user']
  3301             user = opts['user']
  3305             statedata[b'user'] = user
  3302             statedata[b'user'] = user
  3306         date = ctx.date()
  3303         date = ctx.date()
  3307         if opts.get(b'date'):
  3304         if opts.get('date'):
  3308             date = opts[b'date']
  3305             date = opts['date']
  3309             statedata[b'date'] = date
  3306             statedata[b'date'] = date
  3310         message = ctx.description()
  3307         message = ctx.description()
  3311         if opts.get(b'log'):
  3308         if opts.get('log'):
  3312             message += b'\n(grafted from %s)' % ctx.hex()
  3309             message += b'\n(grafted from %s)' % ctx.hex()
  3313             statedata[b'log'] = True
  3310             statedata[b'log'] = True
  3314 
  3311 
  3315         # we don't merge the first commit when continuing
  3312         # we don't merge the first commit when continuing
  3316         if not cont:
  3313         if not cont:
  3317             # perform the graft merge with p1(rev) as 'ancestor'
  3314             # perform the graft merge with p1(rev) as 'ancestor'
  3318             overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
  3315             overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
  3319             base = ctx.p1() if basectx is None else basectx
  3316             base = ctx.p1() if basectx is None else basectx
  3320             with ui.configoverride(overrides, b'graft'):
  3317             with ui.configoverride(overrides, b'graft'):
  3321                 stats = mergemod.graft(repo, ctx, base, [b'local', b'graft'])
  3318                 stats = mergemod.graft(repo, ctx, base, [b'local', b'graft'])
  3322             # report any conflicts
  3319             # report any conflicts
  3323             if stats.unresolvedcount > 0:
  3320             if stats.unresolvedcount > 0:
  3331                 return 1
  3328                 return 1
  3332         else:
  3329         else:
  3333             cont = False
  3330             cont = False
  3334 
  3331 
  3335         # commit if --no-commit is false
  3332         # commit if --no-commit is false
  3336         if not opts.get(b'no_commit'):
  3333         if not opts.get('no_commit'):
  3337             node = repo.commit(
  3334             node = repo.commit(
  3338                 text=message, user=user, date=date, extra=extra, editor=editor
  3335                 text=message, user=user, date=date, extra=extra, editor=editor
  3339             )
  3336             )
  3340             if node is None:
  3337             if node is None:
  3341                 ui.warn(
  3338                 ui.warn(
  3346             elif statedata.get(b'newnodes') is not None:
  3343             elif statedata.get(b'newnodes') is not None:
  3347                 nn = statedata[b'newnodes']  # type: List[bytes]
  3344                 nn = statedata[b'newnodes']  # type: List[bytes]
  3348                 nn.append(node)
  3345                 nn.append(node)
  3349 
  3346 
  3350     # remove state when we complete successfully
  3347     # remove state when we complete successfully
  3351     if not opts.get(b'dry_run'):
  3348     if not opts.get('dry_run'):
  3352         graftstate.delete()
  3349         graftstate.delete()
  3353 
  3350 
  3354     return 0
  3351     return 0
  3355 
  3352 
  3356 
  3353