chiark / gitweb /
wip more merge driver
[topbloke.git] / topbloke-merge-lists
diff --git a/topbloke-merge-lists b/topbloke-merge-lists
new file mode 100755 (executable)
index 0000000..42737e0
--- /dev/null
@@ -0,0 +1,65 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use IO::Handle;
+
+our %flag;
+our @order, @order_final_maybe;
+
+while (@ARGV && $ARGV[0] =~ m/^\-/) {
+    $_ = shift @ARGV;
+    if (s/^-U//) {
+       $flag{$_}{Result} = 0;
+       push @order_final_maybe, $_;
+    } elsif (s/^-D//) {
+       $flag{$_}{Result} = 1;
+       push @order_final_maybe, $_;
+    } elsif (m/^--$/) {
+       last;
+    } else {
+       die "$0: bad option\n";
+    }
+}
+
+@ARGV==3 or die "$0: bad usage\n";
+
+foreach my $ix (qw(0 1 2)) {
+    open F, '<', $ARGV[$ix] or die "$ix $!";
+    while (<F>) {
+       chomp or die;
+       $flag{$_}{Input}[$ix] = 1;
+       my $ff = $flag{$_};
+       push @order, $_ unless $ff->{InOrder}++;
+    }
+    F->error and die $!;
+    close F or die $!;
+}
+
+foreach $_ (@order_final_maybe) {
+    push @order, $_ unless $flags{$_}{InOrder}++;
+}
+
+open O, '>', "$current.tmp" or die "$current.tmp $!";
+
+foreach $_ (@order) {
+    my $ff = $flag{$_};
+    if (!defined $ff->{Result}) {
+       my $s = '';
+       foreach my $ix (qw(0 1 2)) {
+           $ff->{Input}[$ix] ||= 1;
+           $s .= $ff->{Input}[$ix];
+       }
+       $ff->{Result} =
+           $s eq '000' ? '000' :
+           $s eq '111' ? '111' :
+           $ff->{Input}[1];
+    }
+    if ($ff->{Result}) {
+       print O "$_\n" or die $!;
+    }
+}
+
+close O or die $!;
+rename "$current.tmp", "$current" or die "$current $!";
+exit 0;