source: soft/build_system/build_system/upload/robot/trunk/check_sync @ 1

Last change on this file since 1 was 1, checked in by fasma, 12 years ago

Initial Import from Mandriva's soft revision 224062 and package revision 45733

File size: 4.3 KB
Line 
1#!/usr/bin/perl
2
3use strict;
4use RPM4::Header;
5use Data::Dumper;
6
7my $verbose;
8@ARGV or usage();
9my @argv = grep {
10    if (/^-v$/) {
11       $verbose = 1;
12       0
13    } else {
14        1
15    }
16} @ARGV;
17
18my $cachefile = "/home/mandrake/tmp/check_sync.cache";
19my $cache;
20if (-f $cachefile) {
21        $cache = do $cachefile
22} else {
23        $cache = {}
24}
25my @supported_arch = ('i586', 'x86_64', 'ppc', 'sparc', 'sparc64');
26my %trans_arch =  ( 'i386' => 'i586', 'i486' => 'i586', 'i686' => 'i586');
27$trans_arch{$a} = $a foreach @supported_arch;
28
29my $top = shift @argv;
30my @arch = @argv;
31my @media = ('main', 'contrib');
32-d $top && @arch or usage();
33my (%ref, %unsynchro, %missing, %extra, %srpm, %arch);
34foreach my $media (@media) {
35    my $path = "$top/SRPMS/$media/release";
36    opendir my $dir, $path or die "FATAL check_sync: could not open $path ($!)";
37    foreach my $rpm (readdir $dir) {
38            my ($name, $version) = $rpm =~ /(.*)-([^-]+-[^-]+)\.src.rpm$/ or next;
39            $version =~ s/(mdk|mdv2007.0)//;
40            $srpm{$media}{$name} = $version;
41            if (!$cache->{arch}{$rpm}) {
42                my $hdr = RPM4::Header->new("$path/$rpm");
43                my (@exclusive_arch) = $hdr->queryformat('%{EXCLUSIVEARCH}');
44                my (@exclude_arch) = $hdr->queryformat('%{EXCLUDEARCH}');
45                if (@exclusive_arch) {
46                    foreach my $a (@exclusive_arch) {
47                        $cache->{arch}{$rpm}{$trans_arch{$a}} = 1
48                    }
49                } else {
50                    foreach my $a (@supported_arch) {
51                        $cache->{arch}{$rpm}{$a} = 1
52                    }
53                }
54                foreach my $a (@exclude_arch) {
55                    $cache->{arch}{$rpm}{$trans_arch{$a}} = 0
56                }
57            }
58    }
59}
60foreach my $arch (@arch) {
61    foreach my $media (@media) {
62        my $path = "$top/$arch/media/$media/release";
63        opendir my $dir, $path or die "FATAL check_sync could not open $path ($!)";
64        foreach my $rpm (readdir $dir) {
65            $rpm =~ /\.rpm$/ or next;
66            my ($srpm);
67            if ($cache->{srpm}{$rpm}) {
68                $srpm = $cache->{srpm}{$rpm}   
69            } else {
70                my $hdr = RPM4::Header->new("$path/$rpm");
71                $srpm = $hdr->queryformat('%{SOURCERPM}');
72                $cache->{srpm}{$rpm} = $srpm
73            }
74            my ($name, $version) = $srpm =~ /(.*)-([^-]+-[^-]+)\.[^.]+\.rpm$/ or next;
75            $version =~ s/(mdk|mdv2007.0)//;
76            $ref{$arch}{$media}{$name}++;
77            if ($srpm{$media}{$name}) {
78                if ($version ne $srpm{$media}{$name}) {
79                    $unsynchro{$arch}{$media}++;
80                    print "UNSYNCHRONIZED $arch $media: $name\n" if $verbose
81                }
82            } else {
83                $extra{$arch}{$media}++;
84                print "EXTRA $arch $media: $name\n" if $verbose
85            }
86        }
87        closedir $dir
88    }
89}
90
91open my $file, ">$cachefile";
92$Data::Dumper::Indent = 1;
93$Data::Dumper::Terse = 1;
94print $file Data::Dumper->Dump([ $cache ], [ "cache" ]);
95
96close $file;
97my $time = get_time();
98foreach my $arch (@arch) {
99    my $level;
100    my $max;
101    foreach my $media (@media) {
102        my $missing;
103        foreach my $name (keys %{$srpm{$media}}) {
104            my $version = $srpm{$media}{$name};
105            if ($cache->{arch}{"$name-$version.src.rpm"}{$arch}) {
106                $missing++;
107                next
108            }
109            $missing{$arch}{$media}++ if ! $ref{$arch}{$media}{$name}
110        }
111        print "Total missing $arch $media: $missing{$arch}{$media}\n";
112        print "Total extra $arch $media: $extra{$arch}{$media}\n";
113        print "Total unsynchro $arch $media: $unsynchro{$arch}{$media}\n";
114        print "Total missing $missing\n";
115        $max += (int(keys %{$srpm{$media}}) - $missing) * 4;
116        $level +=  $missing{$arch}{$media} * 2 + $extra{$arch}{$media} * 2 + $unsynchro{$arch}{$media}
117    }
118    my $l = $level / $max;
119    print "$time $top $arch unsynchronization level: $l ($level / $max)\n";
120}
121
122#foreach my $arch (@arch) {
123#       print "| $d |  $date{$d}{$arch} |  $date{$d}{$arch} |\n"
124#}
125
126exit;
127
128sub get_time {
129    my ($sec,$min,$hour,$mday,$mon,$year) = gmtime(time());
130    $year += 1900;
131    my $fulldate = sprintf "%4d%02d%02d%02d%02d%02d", $year, $mon+1, $mday, $hour, $min, $sec;
132    $fulldate
133}
134
135sub usage {
136    print "
137        $0 usage:
138
139                $0 <distro top dir> <arch 1 (ref)> <arch 2> ... <arch n>\n\n";
140    exit
141}
142
143sub usage {
144    print "
145    usage:
146       
147        check_sync [-v] <path> <reference arch> <compared arch 1> <compared arch 2> ... <compared arch n>\n\n";
148        exit
149}
150
151# cat ~/files/arch_sync_cooker.log | perl -ne 'my ($date, $arch, $level) = /(\d{8})\d+ \/mnt\/BIG\/dis\/cooker\/ (\w+) unsynchronization level: (0.\d{4})\d+/; $date{$date}{$arch}= $level; $date and print "$date $arch $level\n"; END { foreach my $d (sort keys %date) { print "| $d |  $date{$d}{x86_64} |  $date{$d}{ppc} |\n"} }'
152#
Note: See TracBrowser for help on using the repository browser.