From: Bill Pemberton Date: Mon, 03 May 2010 18:06:35 GMT Subject: [PATCH v2] blame: add a range option to -L Message-ID: <1272909995-3198-1-git-send-email-wfp5p@virginia.edu> In addition to , you can now use
% to specify how many lines around
that you want to see. For example: -L 20%5 would show lines 15 through 25 Signed-off-by: Bill Pemberton --- This is like the previous patch to create a range option to -L in git-blame. However, this one uses -L% I chose to use % since it's on a standard keyboard. Documentation/blame-options.txt | 4 ++++ Documentation/git-blame.txt | 8 ++++++++ builtin/blame.c | 18 +++++++++++++++--- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt index d820569..f65e69c 100644 --- a/Documentation/blame-options.txt +++ b/Documentation/blame-options.txt @@ -32,6 +32,10 @@ This is only valid for and will specify a number of lines before or after the line given by . + +-L
%:: + This works like , with the annotated range + centered on
and showing lines around it. + -l:: Show long rev (Default: off). diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt index a27f439..73f6b83 100644 --- a/Documentation/git-blame.txt +++ b/Documentation/git-blame.txt @@ -110,6 +110,14 @@ line 40): git blame -L 40,60 foo git blame -L 40,+21 foo +A range of lines around a particular line can be shown by using '%' +instead of ','. If you wanted to see line 20 along with the 5 +lines around it: + + git blame -L 20%5 foo + + + Also you can use a regular expression to specify the line range: git blame -L '/^sub hello {/,/^}$/' foo diff --git a/builtin/blame.c b/builtin/blame.c index fc15863..eabc292 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -1887,6 +1887,9 @@ static const char *parse_loc(const char *spec, /* Allow "-L ,+20" to mean starting at * for 20 lines, or "-L ,-5" for 5 lines ending at * . + * + * In addition "-L %5" means starting at + * -5 and ending at +5 */ if (1 < begin && (spec[0] == '+' || spec[0] == '-')) { num = strtol(spec + 1, &term, 10); @@ -1958,10 +1961,19 @@ static void prepare_blame_range(struct scoreboard *sb, const char *term; term = parse_loc(bottomtop, sb, lno, 1, bottom); - if (*term == ',') { + if (*term == ',') + term = parse_loc(term + 1, sb, lno, *bottom + 1, top); + else if (*term == '%') { + long x; + /* ignore + or - if it's there */ + if ((*(term+1) == '+') || (*(term+1) == '-')) + term++; term = parse_loc(term + 1, sb, lno, *bottom + 1, top); - if (*term) - usage(blame_usage); + x = *top; + *top = *bottom - x; + *bottom += x; + if (*bottom < 1) + *bottom = 1; } if (*term) usage(blame_usage); -- 1.7.1