On Fri, Apr 7, 2017 at 4:50 AM, Joel Polowin <jpolowin_at_hotmail.com> wrote:
> Hi, all. This is my first post to this list, but I've been a member
> on many others.
>
> I'd like to make a feature/enhancement suggestion for svn. Would you
> please let me know how I might do that? Or of course I'd be happy if
> someone can tell me how to do what I want with the existing features,
> though a couple of people in my group who are more experienced than
> I am with svn haven't been able to figure out how it might be done.
>
> In case posting to this list is sufficient... I'd like to be able
> to specify a line range for a file so that _svn log filename_ would
> show the change log for only those lines, allowing for the movements
> of the first and last lines through the file's history. So if my file
> 'blargh' has a function which currently begins at line 1500 and ends at
> line 1800, the command "svn log blargh --lines 1500:1800" would give
> me the commit messages for that function even if that block of lines
> was originally added to occupy, say, lines 2700 to 3500. And wouldn't
> report the messages for commits that didn't touch that block of lines.
>
> This would help to resolve a conflict in my work group regarding good
> practises for code documentation. :-(
Interesting question. In theory svn could do this ... it's sort of a
combination of 'blame' and 'log'. The information is there. But at
present there is no functionality exposed for this in the client.
* 'svn blame' works by invoking 'get_file_revs2' on the repository,
retrieving all revisions, and processing the diffs between them,
sequentially. It keeps track of which rev / author last touched each
line (in the end it outputs the final result: each line with its
corresponding "last rev / author"). See the source of
libsvn_client/blame.c [1] for a starting point.
* Your 'svn log Filename --lines 1500:1800' could similarly walk the
history of the file with get_file_revs2. It would need to keep a list,
per line, of all revisions that touched the line. And at the end
output the log of all revisions that are applicable to the range of
lines given.
You might be able to write this, purely client-side, in C, or using
one of the language bindings (python bindings or JavaHL), invoking the
get_file_rev2 API.
[1] http://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_client/blame.c,
see lines 809 and following, where it calls svn_ra_get_file_revs2,
passing file_rev_handler as callback function.
--
Johan
Received on 2017-04-07 14:17:07 CEST