Home | History | Annotate | Line # | Download | only in contrib
clmerge.in revision 1.1.1.1.2.2
      1  1.1.1.1.2.2  jym #! @PERL@
      2  1.1.1.1.2.2  jym 
      3  1.1.1.1.2.2  jym # Copyright (C) 1995-2005 The Free Software Foundation, Inc.
      4  1.1.1.1.2.2  jym 
      5  1.1.1.1.2.2  jym # This program is free software; you can redistribute it and/or modify
      6  1.1.1.1.2.2  jym # it under the terms of the GNU General Public License as published by
      7  1.1.1.1.2.2  jym # the Free Software Foundation; either version 2, or (at your option)
      8  1.1.1.1.2.2  jym # any later version.
      9  1.1.1.1.2.2  jym #
     10  1.1.1.1.2.2  jym # This program is distributed in the hope that it will be useful,
     11  1.1.1.1.2.2  jym # but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  1.1.1.1.2.2  jym # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  1.1.1.1.2.2  jym # GNU General Public License for more details.
     14  1.1.1.1.2.2  jym 
     15  1.1.1.1.2.2  jym # Merge conflicted ChangeLogs
     16  1.1.1.1.2.2  jym # tromey Mon Aug 15 1994
     17  1.1.1.1.2.2  jym 
     18  1.1.1.1.2.2  jym # Usage is:
     19  1.1.1.1.2.2  jym #
     20  1.1.1.1.2.2  jym #	cl-merge [-i] file ...
     21  1.1.1.1.2.2  jym #
     22  1.1.1.1.2.2  jym # With -i, it works in place (backups put in a ~ file).  Otherwise the
     23  1.1.1.1.2.2  jym # merged ChangeLog is printed to stdout.
     24  1.1.1.1.2.2  jym 
     25  1.1.1.1.2.2  jym # Please report any bugs to me.  I wrote this yesterday, so there are no
     26  1.1.1.1.2.2  jym # guarantees about its performance.  I recommend checking its output
     27  1.1.1.1.2.2  jym # carefully.  If you do send a bug report, please include the failing
     28  1.1.1.1.2.2  jym # ChangeLog, so I can include it in my test suite.
     29  1.1.1.1.2.2  jym #
     30  1.1.1.1.2.2  jym # Tom
     31  1.1.1.1.2.2  jym # ---
     32  1.1.1.1.2.2  jym # tromey (at] busco.lanl.gov             Member, League for Programming Freedom
     33  1.1.1.1.2.2  jym # Sadism and farce are always inexplicably linked.
     34  1.1.1.1.2.2  jym #	-- Alexander Theroux
     35  1.1.1.1.2.2  jym 
     36  1.1.1.1.2.2  jym 
     37  1.1.1.1.2.2  jym # Month->number mapping.  Used for sorting.
     38  1.1.1.1.2.2  jym %months = ('Jan', 0,
     39  1.1.1.1.2.2  jym 	   'Feb', 1,
     40  1.1.1.1.2.2  jym 	   'Mar', 2,
     41  1.1.1.1.2.2  jym 	   'Apr', 3,
     42  1.1.1.1.2.2  jym 	   'May', 4,
     43  1.1.1.1.2.2  jym 	   'Jun', 5,
     44  1.1.1.1.2.2  jym 	   'Jul', 6,
     45  1.1.1.1.2.2  jym 	   'Aug', 7,
     46  1.1.1.1.2.2  jym 	   'Sep', 8,
     47  1.1.1.1.2.2  jym 	   'Oct', 9,
     48  1.1.1.1.2.2  jym 	   'Nov', 10,
     49  1.1.1.1.2.2  jym 	   'Dec', 11);
     50  1.1.1.1.2.2  jym 
     51  1.1.1.1.2.2  jym # If '-i' is given, do it in-place.
     52  1.1.1.1.2.2  jym if ($ARGV[0] eq '-i') {
     53  1.1.1.1.2.2  jym     shift (@ARGV);
     54  1.1.1.1.2.2  jym     $^I = '~';
     55  1.1.1.1.2.2  jym }
     56  1.1.1.1.2.2  jym 
     57  1.1.1.1.2.2  jym $lastkey = '';
     58  1.1.1.1.2.2  jym $lastval = '';
     59  1.1.1.1.2.2  jym $conf = 0;
     60  1.1.1.1.2.2  jym %conflist = ();
     61  1.1.1.1.2.2  jym 
     62  1.1.1.1.2.2  jym $tjd = 0;
     63  1.1.1.1.2.2  jym 
     64  1.1.1.1.2.2  jym # Simple state machine.  The states:
     65  1.1.1.1.2.2  jym #
     66  1.1.1.1.2.2  jym # 0	Not in conflict.  Just copy input to output.
     67  1.1.1.1.2.2  jym # 1	Beginning an entry.  Next non-blank line is key.
     68  1.1.1.1.2.2  jym # 2	In entry.  Entry beginner transitions to state 1.
     69  1.1.1.1.2.2  jym while (<>) {
     70  1.1.1.1.2.2  jym     if (/^<<<</ || /^====/) {
     71  1.1.1.1.2.2  jym 	# Start of a conflict.
     72  1.1.1.1.2.2  jym 
     73  1.1.1.1.2.2  jym 	# Copy last key into array.
     74  1.1.1.1.2.2  jym 	if ($lastkey ne '') {
     75  1.1.1.1.2.2  jym 	    $conflist{$lastkey} = $lastval;
     76  1.1.1.1.2.2  jym 
     77  1.1.1.1.2.2  jym 	    $lastkey = '';
     78  1.1.1.1.2.2  jym 	    $lastval = '';
     79  1.1.1.1.2.2  jym 	}
     80  1.1.1.1.2.2  jym 
     81  1.1.1.1.2.2  jym 	$conf = 1;
     82  1.1.1.1.2.2  jym     } elsif (/^>>>>/) {
     83  1.1.1.1.2.2  jym 	# End of conflict.  Output.
     84  1.1.1.1.2.2  jym 
     85  1.1.1.1.2.2  jym 	# Copy last key into array.
     86  1.1.1.1.2.2  jym 	if ($lastkey ne '') {
     87  1.1.1.1.2.2  jym 	    $conflist{$lastkey} = $lastval;
     88  1.1.1.1.2.2  jym 
     89  1.1.1.1.2.2  jym 	    $lastkey = '';
     90  1.1.1.1.2.2  jym 	    $lastval = '';
     91  1.1.1.1.2.2  jym 	}
     92  1.1.1.1.2.2  jym 
     93  1.1.1.1.2.2  jym 	foreach (reverse sort clcmp keys %conflist) {
     94  1.1.1.1.2.2  jym 	    print STDERR "doing $_" if $tjd;
     95  1.1.1.1.2.2  jym 	    print $_;
     96  1.1.1.1.2.2  jym 	    print $conflist{$_};
     97  1.1.1.1.2.2  jym 	}
     98  1.1.1.1.2.2  jym 
     99  1.1.1.1.2.2  jym 	$lastkey = '';
    100  1.1.1.1.2.2  jym 	$lastval = '';
    101  1.1.1.1.2.2  jym 	$conf = 0;
    102  1.1.1.1.2.2  jym 	%conflist = ();
    103  1.1.1.1.2.2  jym     } elsif ($conf == 1) {
    104  1.1.1.1.2.2  jym 	# Beginning an entry.  Skip empty lines.  Error if not a real
    105  1.1.1.1.2.2  jym 	# beginner.
    106  1.1.1.1.2.2  jym 	if (/^$/) {
    107  1.1.1.1.2.2  jym 	    # Empty line; just skip at this point.
    108  1.1.1.1.2.2  jym 	} elsif (/^[MTWFS]/) {
    109  1.1.1.1.2.2  jym 	    # Looks like the name of a day; assume opener and move to
    110  1.1.1.1.2.2  jym 	    # "in entry" state.
    111  1.1.1.1.2.2  jym 	    $lastkey = $_;
    112  1.1.1.1.2.2  jym 	    $conf = 2;
    113  1.1.1.1.2.2  jym 	    print STDERR "found $_" if $tjd;
    114  1.1.1.1.2.2  jym 	} else {
    115  1.1.1.1.2.2  jym 	    die ("conflict crosses entry boundaries: $_");
    116  1.1.1.1.2.2  jym 	}
    117  1.1.1.1.2.2  jym     } elsif ($conf == 2) {
    118  1.1.1.1.2.2  jym 	# In entry.  Copy into variable until we see beginner line.
    119  1.1.1.1.2.2  jym 	if (/^[MTWFS]/) {
    120  1.1.1.1.2.2  jym 	    # Entry beginner line.
    121  1.1.1.1.2.2  jym 
    122  1.1.1.1.2.2  jym 	    # Copy last key into array.
    123  1.1.1.1.2.2  jym 	    if ($lastkey ne '') {
    124  1.1.1.1.2.2  jym 		$conflist{$lastkey} = $lastval;
    125  1.1.1.1.2.2  jym 
    126  1.1.1.1.2.2  jym 		$lastkey = '';
    127  1.1.1.1.2.2  jym 		$lastval = '';
    128  1.1.1.1.2.2  jym 	    }
    129  1.1.1.1.2.2  jym 
    130  1.1.1.1.2.2  jym 	    $lastkey = $_;
    131  1.1.1.1.2.2  jym 	    print STDERR "found $_" if $tjd;
    132  1.1.1.1.2.2  jym 	    $lastval = '';
    133  1.1.1.1.2.2  jym 	} else {
    134  1.1.1.1.2.2  jym 	    $lastval .= $_;
    135  1.1.1.1.2.2  jym 	}
    136  1.1.1.1.2.2  jym     } else {
    137  1.1.1.1.2.2  jym 	# Just copy.
    138  1.1.1.1.2.2  jym 	print;
    139  1.1.1.1.2.2  jym     }
    140  1.1.1.1.2.2  jym }
    141  1.1.1.1.2.2  jym 
    142  1.1.1.1.2.2  jym # Compare ChangeLog time strings like <=>.
    143  1.1.1.1.2.2  jym #
    144  1.1.1.1.2.2  jym # 0         1         2         3
    145  1.1.1.1.2.2  jym # Thu Aug 11 13:22:42 1994  Tom Tromey  (tromey (at] creche.colorado.edu)
    146  1.1.1.1.2.2  jym # 0123456789012345678901234567890
    147  1.1.1.1.2.2  jym #
    148  1.1.1.1.2.2  jym sub clcmp {
    149  1.1.1.1.2.2  jym     # First check year.
    150  1.1.1.1.2.2  jym     $r = substr ($a, 20, 4) <=> substr ($b, 20, 4);
    151  1.1.1.1.2.2  jym 
    152  1.1.1.1.2.2  jym     # Now check month.
    153  1.1.1.1.2.2  jym     $r = $months{substr ($a, 4, 3)} <=> $months{substr ($b, 4, 3)} if !$r;
    154  1.1.1.1.2.2  jym 
    155  1.1.1.1.2.2  jym     # Now check day.
    156  1.1.1.1.2.2  jym     $r = substr ($a, 8, 2) <=> substr ($b, 8, 2) if !$r;
    157  1.1.1.1.2.2  jym 
    158  1.1.1.1.2.2  jym     # Now check time (3 parts).
    159  1.1.1.1.2.2  jym     $r = substr ($a, 11, 2) <=> substr ($b, 11, 2) if !$r;
    160  1.1.1.1.2.2  jym     $r = substr ($a, 14, 2) <=> substr ($b, 14, 2) if !$r;
    161  1.1.1.1.2.2  jym     $r = substr ($a, 17, 2) <=> substr ($b, 17, 2) if !$r;
    162  1.1.1.1.2.2  jym 
    163  1.1.1.1.2.2  jym     $r;
    164  1.1.1.1.2.2  jym }
    165