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