[darcs-users] hunk move as primitive change
Ben Franksen
benjamin.franksen at bessy.de
Tue Apr 30 23:51:42 UTC 2013
Hi Everyone
This is something I have on my wish-list for longer than I can think. The
idea is quite simple: a primitive change type that says "this sequence of
lines moved from file X line N to file Y line M". Here, X and Y need not be
different, i.e. a hunk move need not be between different files.
To my knowledge no existing VCS has such a feature. There are two advantages
I expect:
(1) Moving code around is something I do regularly in the process of
cleaning up my (or other's) code. Currently such changes are represented
(e.g. when using record or whatsnew) as "remove these lines from file X line
N (long block of code follows), add these lines to file Y line M (another
long block of code follows)". The remove and insert changes need not even be
adjacent to one another (they typically are not) and even if they are it is
very hard for the human eye to spot small differences in a long stretch of
text. So if the tool told me I have a move (or I could tell it that this is
the case) then I could be confident that no functional change occurred.
(2) A hunk move commutes with changes /inside/ the hunk, or at least I can
see no reason why it should not. This is not the case for the way such a
move is represented now (as a remove and insert). This would mean more
changes commute and thus less (accidental, unwanted) conflicts.
Even though the idea is simple, this is certainly not "low hanging fruit".
It would be necessary to somehow record that the context for changes further
down in the affected files translates up resp. down (by the number of lines
moved), and to update this information when commuting such a change with
other changes. On the other hand, for regular hunks we do that already, so
maybe it is not that difficult after all. In any case adding a new primitive
change type most probably counts as a "deep" change to the Darcs code; and I
wonder if the repository format would have to be adapted and whether this
could be done in a backward compatible way.
BTW, a "better record command" as in the GSOC proposal (which I find very
promising) could be tought to detect hunk moves and present them to the user
as such. It could even propose to record a move if there /are/ additional
changes inside such a moved hunk, i.e. separate the move from (minor)
changes made to the affected lines, using some kind of similarity measure.
I would love to hear what you think about that.
Cheers
--
Ben Franksen
() ascii ribbon campaign - against html e-mail
/\ www.asciiribbon.org - against proprietary attachm€nts
More information about the darcs-users
mailing list