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: |