comparison mercurial/commands.py @ 47433:fc8e29ffc380

dog-raft: work with str-keyed opts throughout Differential Revision: https://phab.mercurial-scm.org/D10864
author Martin von Zweigbergk <martinvonz@google.com>
date Thu, 10 Jun 2021 15:56:55 -0700
parents 7f7457f84311
children 7a430116f639
comparison
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