chiark / gitweb /
wip more merge driver
[topbloke.git] / topbloke-merge-lists
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use IO::Handle;
6
7 our %flag;
8 our @order, @order_final_maybe;
9
10 while (@ARGV && $ARGV[0] =~ m/^\-/) {
11     $_ = shift @ARGV;
12     if (s/^-U//) {
13         $flag{$_}{Result} = 0;
14         push @order_final_maybe, $_;
15     } elsif (s/^-D//) {
16         $flag{$_}{Result} = 1;
17         push @order_final_maybe, $_;
18     } elsif (m/^--$/) {
19         last;
20     } else {
21         die "$0: bad option\n";
22     }
23 }
24
25 @ARGV==3 or die "$0: bad usage\n";
26
27 foreach my $ix (qw(0 1 2)) {
28     open F, '<', $ARGV[$ix] or die "$ix $!";
29     while (<F>) {
30         chomp or die;
31         $flag{$_}{Input}[$ix] = 1;
32         my $ff = $flag{$_};
33         push @order, $_ unless $ff->{InOrder}++;
34     }
35     F->error and die $!;
36     close F or die $!;
37 }
38
39 foreach $_ (@order_final_maybe) {
40     push @order, $_ unless $flags{$_}{InOrder}++;
41 }
42
43 open O, '>', "$current.tmp" or die "$current.tmp $!";
44
45 foreach $_ (@order) {
46     my $ff = $flag{$_};
47     if (!defined $ff->{Result}) {
48         my $s = '';
49         foreach my $ix (qw(0 1 2)) {
50             $ff->{Input}[$ix] ||= 1;
51             $s .= $ff->{Input}[$ix];
52         }
53         $ff->{Result} =
54             $s eq '000' ? '000' :
55             $s eq '111' ? '111' :
56             $ff->{Input}[1];
57     }
58     if ($ff->{Result}) {
59         print O "$_\n" or die $!;
60     }
61 }
62
63 close O or die $!;
64 rename "$current.tmp", "$current" or die "$current $!";
65 exit 0;