Re: [PATCH] xdl_merge(): introduce XDL_MERGE_ZEALOUS_ALNUM

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Wed, 13 Feb 2008, Johannes Schindelin wrote:
> 
> With XDL_MERGE_ZEALOUS_ALNUM, we use the following heuristics: when a
> hunk does not contain any letters or digits, it is treated as conflicting.

Well, I think this is interesting in itself, but..

To some degree it would be even more interesting to at least partially 
separate the issue of "what conflicts" with the issue of "how do we 
express things when they _do_ conflict".

IOW, it's quite possible that we want to have the ZEALOUS algorithm for 
doing conflict resolution (on the assumption that we want aggressively 
merge), but then when conflicts happen _despite_ being zealous in the 
resolver, print out the resulting conflict with near-by conflicts merged 
into bigger block.

> In other words, a conflict which used to look like this:
> 
> 	<<<<<<<
> 	if (a == 1)
> 	=======
> 	if (a == 2)
> 	>>>>>>>
> 	{
> 	<<<<<<<
> 		b = 2;
> 	=======
> 		b = 1;
> 	>>>>>>>
> 
> will look like this with ZEALOUS_ALNUM:
> 
> 	<<<<<<<
> 	if (a == 1)
> 	{
> 		b = 2;
> 	=======
> 	if (a == 2)
> 	{
> 		b = 1;
> 	>>>>>>>

I think this is an improvement already, but to take the example that 
voltspike had:

 <<<<<<< HEAD:file.txt
 void newfunc1()
 =======
 void newfunc2()
 >>>>>>> merge:file.txt
 {
   int err;
 <<<<<<< HEAD:file.txt
   err = doSomething();
 =======
   err = doSomethingElse();
 >>>>>>> merge:file.txt

this does have alnum's in the shared region ("int err") so it wouldn't 
have been modified by this, but it would be nice to notice: "there were 
just two small lines between two conflicts, and we could actually make the 
final conflict marker _smaller_ by merging them", and just doing the 
reverse of xdl_refine_conflicts(), and do a "xdl_merge_conflicts()" before 
printout, and get

 <<<<<<< HEAD:file.txt
 void newfunc1()
 {
   int err;
   err = doSomething();
 =======
 void newfunc2()
 {
   int err;
   err = doSomethingElse();
 >>>>>>> merge:file.txt

(note how this really *is* smaller: it's 11 lines rather than 12 lines, 
because while we had to duplicate the two common lines in between the 
conflicts (+2), we got rid of the three marker lines (-3), giving us a net 
win of one line.

So the "merge adjacent conflicts" logic should actually be pretty simple: 
if there is less than three lines between two conflicts, the conflicts 
should always be merged, because the end result is smaller.

(And with three lines in between the end result is as many lines, but 
arguably simpler, so it's probably better to merge then too).

Hmm? What do you think?

			Linus
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux