Mercurial > hg
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 |