Mercurial > hg
diff mercurial/commands.py @ 51438:05eba178da45 stable
branching: merge default into stable for 6.7rc0
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Fri, 23 Feb 2024 15:10:44 +0100 |
parents | e2dfa403452d |
children | f28d5d68b71a |
line wrap: on
line diff
--- a/mercurial/commands.py Thu Feb 22 18:28:01 2024 +0100 +++ b/mercurial/commands.py Fri Feb 23 15:10:44 2024 +0100 @@ -29,6 +29,7 @@ copies, debugcommands as debugcommandsmod, destutil, + diffutil, discovery, encoding, error, @@ -370,6 +371,13 @@ _(b'revset to not display (EXPERIMENTAL)'), _(b'REV'), ), + ( + b'L', + b'line-range', + [], + _(b'follow line range of specified file (EXPERIMENTAL)'), + _(b'FILE,RANGE'), + ), ] + diffwsopts + walkopts @@ -398,6 +406,13 @@ .. container:: verbose + Use -L/--line-range FILE,M:N options to filter the output to the lines + from M to N in FILE. This option is incompatible with --no-follow and + cannot be combined with file pattern arguments. When combined with --rev + the line ranges refer to the state of the file at the requested revision. + + .. container:: verbose + Template: The following keywords are supported in addition to the common template @@ -418,7 +433,20 @@ Returns 0 on success. """ opts = pycompat.byteskwargs(opts) - if not pats: + + linerange = opts.get(b'line_range') + + if linerange and opts.get(b'no_follow'): + raise error.InputError( + _(b'--line-range is incompatible with --no-follow') + ) + + if pats and linerange: + raise error.InputError( + _(b'cannot combine filename or pattern and --line-range') + ) + + if not pats and not linerange: raise error.InputError( _(b'at least one filename or pattern is required') ) @@ -449,6 +477,12 @@ repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn') ctx = logcmdutil.revsingle(repo, rev) + if not pats: + pats = [ + fname + for fname, _ranges in logcmdutil._parselinerangeopt(repo, opts) + ] + ui.pager(b'annotate') rootfm = ui.formatter(b'annotate', opts) if ui.debugflag: @@ -553,6 +587,16 @@ lines = fctx.annotate( follow=follow, skiprevs=skiprevs, diffopts=diffopts ) + if linerange: + _fname, (line_start, line_end) = list( + logcmdutil._parselinerangeopt(repo, opts) + )[0] + lines = [ + line + for no, line in enumerate(lines) + if line_start <= no < line_end + ] + if not lines: fm.end() continue @@ -1358,7 +1402,6 @@ repo.dirstate.setbranch(label, repo.currenttransaction()) ui.status(_(b'reset working directory to branch %s\n') % label) elif label: - scmutil.checknewlabel(repo, label, b'branch') if revs: return cmdutil.changebranch(ui, repo, revs, label, **opts) @@ -2660,7 +2703,7 @@ if change: repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn') ctx2 = logcmdutil.revsingle(repo, change, None) - ctx1 = logcmdutil.diff_parent(ctx2) + ctx1 = diffutil.diff_parent(ctx2) elif from_rev or to_rev: repo = scmutil.unhidehashlikerevs( repo, [from_rev] + [to_rev], b'nowarn' @@ -7687,7 +7730,7 @@ _(b'[-u] FILE...'), helpcategory=command.CATEGORY_IMPORT_EXPORT, ) -def unbundle(ui, repo, fname1, *fnames, **opts): +def unbundle(ui, repo, fname1, *fnames, _unbundle_source=b'unbundle', **opts): """apply one or more bundle files Apply one or more bundle files generated by :hg:`bundle`. @@ -7715,7 +7758,11 @@ txnname = b'unbundle\n%s' % urlutil.hidepassword(url) with repo.transaction(txnname) as tr: op = bundle2.applybundle( - repo, gen, tr, source=b'unbundle', url=url + repo, + gen, + tr, + source=_unbundle_source, # used by debug::unbundle + url=url, ) except error.BundleUnknownFeatureError as exc: raise error.Abort(