/[smeserver]/builds_bin/update_repos
ViewVC logotype

Diff of /builds_bin/update_repos

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

Revision 1.1 by slords, Sat Apr 14 21:25:26 2007 UTC Revision 1.13 by slords, Mon Jun 4 16:39:15 2007 UTC
# Line 9  sub compare($$); Line 9  sub compare($$);
9    
10  my $releases = 2;  my $releases = 2;
11    
12  my $rpm_flags =  RPM2->vsf_nodsa;  my $releasedir = '/releases';
13  my $repodir = '/releases/7';  my $smerel = '7';
14    my $centosrel = '4';
15    my $fedorarel = '3';
16    my $builds = '/builds/rpms';
17  my $stagedir = '/builds';  my $stagedir = '/builds';
18  my @repos = qw(  my $arch = `uname -i`;
19                  /releases/7/smeos/i386/CentOS/RPMS  chomp $arch;
                 /releases/7/smeupdates/i386/RPMS  
                 /releases/7/smeupdates-testing/i386/RPMS  
                 /releases/7/smeextras/i386/RPMS  
                 /releases/7/smeaddons/i386/RPMS  
                 /releases/7/smetest/i386/RPMS  
                 /releases/7/smedev/i386/RPMS  
                 /builds/rpms/RPMS/i386  
                 /builds/rpms/RPMS/i586  
                 /builds/rpms/RPMS/i686  
                 /builds/rpms/RPMS/noarch  
                 /builds/RPMS  
                 );  
 my $devrepo = (grep { m{/sme} } reverse @repos)[0];  
   
 my @srcrepos = qw(  
                 /mirrors/centos/4/fasttrack/SRPMS  
                 /mirrors/centos/4/updates/SRPMS  
                 /mirrors/centos/4/os/SRPMS  
                 /mirrors/centos/4/extras/SRPMS  
                 /mirrors/rpmforge/dag/source  
                 /mirrors/atrpms/src/el4-i386/atrpms/stable  
                 /builds/rpms/SRPMS  
                 );  
20    
21  my %repohash;  my @repos = (
22  my %srcrepohash;                "$releasedir/$smerel/smeos/$arch/CentOS/RPMS",
23                  "$releasedir/$smerel/smeos/$arch/SME/RPMS",
24                  "$releasedir/$smerel/smeos/$arch/RPMS",
25                  "$releasedir/$smerel/smeos/$arch/SME",
26                  "$releasedir/$smerel/smeupdates/$arch/RPMS",
27                  "$releasedir/$smerel/smeupdates-testing/$arch/RPMS",
28                  "$releasedir/$smerel/smeextras/$arch/RPMS",
29                  "$releasedir/$smerel/smeaddons/$arch/RPMS",
30                  "$releasedir/$smerel/smetest/$arch/RPMS",
31                  "$releasedir/$smerel/smedev/$arch/RPMS",
32                  "$builds/RPMS/$arch",
33                  "$builds/RPMS/i586",
34                  "$builds/RPMS/i686",
35                  "$builds/RPMS/noarch",
36                  "$stagedir/RPMS",
37                );
38    
39    my @srcrepos = (
40                     "/mirrors/centos/$centosrel/fasttrack/SRPMS",
41                     "/mirrors/centos/$centosrel/updates/SRPMS",
42                     "/mirrors/centos/$centosrel/os/SRPMS",
43                     "/mirrors/centos/$centosrel/extras/SRPMS",
44                     "/mirrors/rpmforge/dag/source",
45                     "/mirrors/atrpms/src/el$centosrel-$arch/atrpms/stable",
46                     "/mirrors/atrpms/src/el$centosrel-$arch/atrpms/testing",
47                     "/mirrors/fedora/epel/$centosrel/SRPMS",
48                     "/mirrors/fedora/core/updates/$fedorarel/SRPMS",
49                     "/mirrors/fedora/core/$fedorarel/source/SRPMS",
50                     "/mirrors/fedora/extras/$fedorarel/SRPMS",
51                     "$builds/SRPMS",
52                  );
53    
54    my $rpm_flags = RPM2->vsf_nodsaheader | RPM2->vsf_nodsa;
55    
56    my @rpms;
57    my %srpms;
58    my %sources;
59  my %changed;  my %changed;
60  my %copy;  my %copy;
 my @remove;  
61    
 %{$srcrepohash{$stagedir}} = map { $_ => 0 } grep { /\.rpm$/ } readdir SRPMS if ( opendir SRPMS, "$stagedir/SRPMS" );  
 closedir SRPMS;  
   
 print "\n";  
62  foreach my $repo ( @repos ) {  foreach my $repo ( @repos ) {
63          if ( $repo =~ m{^(.*/[0-9]+/sme[^/]*)/} ) {          my $r = $repo;
64                  my $srcrepo = $1;          if ( $repo =~ m{$stagedir/RPMS} ) {
65                    $r = $stagedir;
66            } elsif ( $repo =~ m{$builds/RPMS} ) {
67                    $r = 'builds';
68            } elsif ( $repo =~ m{^($releasedir/$smerel/sme[^/]*)/} ) {
69                    $r = $1;
70            }
71    
72                  %{$srcrepohash{$srcrepo}} = map { $_ => 0 } grep { /\.rpm$/ } readdir SRPMS if ( opendir SRPMS, "$srcrepo/SRPMS" );          if ( $r ne 'builds' ) {
73                    opendir SRPMS, "$r/SRPMS" or next;
74                    foreach my $srpm ( grep { /\.rpm$/ } readdir SRPMS ) {
75                            $srpms{$r}{$srpm} = 0;
76                            $sources{$srpm} = "$r/SRPMS";
77                    }
78                  closedir SRPMS;                  closedir SRPMS;
79          }          }
80    
81          opendir RPMS, $repo;          opendir RPMS, $repo or next;
82          foreach my $rpm ( grep { m{\.rpm} } readdir RPMS ) {          foreach my $pkg ( reverse sort map { RPM2->open_package("$repo/$_", $rpm_flags); } grep { /\.rpm$/ } readdir RPMS ) {
83                  my $header = RPM2->open_package("$repo/$rpm", $rpm_flags);                  my $rpm = { name => $pkg->tag("NAME"),
84                  my $pkg = $header->tag("NAME").".".$header->tag("ARCH");                                  filename => join("-", map { $pkg->tag($_) } qw/name version release/) . "." . $pkg->tag("ARCH"),
85                  if ( $repo =~ m{/builds/RPMS} ) {                                  version => $pkg->tag("VERSION"),
86                          push @{$repohash{$pkg}{$stagedir}}, $header;                                  release => $pkg->tag("RELEASE"),
87                  } elsif ( $repo =~ m{/builds/} ) {                                  repo => $r,
88                          push @{$repohash{$pkg}{builds}}, $header;                                  rpm => $pkg,
89                  } elsif ( $repo =~ m{^(.*/[0-9]+/sme[^/]*)/} ) {                                };
90                          my $pos = $1;                  my $source = $pkg->tag("SOURCERPM");
91                          push @{$repohash{$pkg}{$pos}}, $header;                  $source =~ s#-$rpm->{version}-$rpm->{release}.*##;
92                    $rpm->{source} = $source;
93    
94                    if ( $rpm->{repo} =~ m{^$releasedir/$smerel/} && $rpm->{repo} !~ m{/smedev$} ) {
95                            $rpm->{repo} = 'deleted' if grep { $_->{repo} ne $rpm->{repo} && $_->{name} eq $rpm->{name} && $_->{rpm} ge $rpm->{rpm} } @rpms;
96                            $rpm->{repo} = 'deleted' if grep { $_->{repo} eq $rpm->{repo} && $_->{name} eq $rpm->{name} && $_->{rpm} gt $rpm->{rpm} } @rpms;
97                            $changed{$r}++ if $rpm->{repo} eq 'deleted';
98                  }                  }
99    
100                    push @rpms, $rpm;
101          }          }
102          closedir RPMS;          closedir RPMS;
103  }  }
104    
 my %sources;  
105  foreach my $repo ( reverse @srcrepos ) {  foreach my $repo ( reverse @srcrepos ) {
106          my %temp_repo = map { $_ => $repo } grep { /\.rpm$/ } readdir SRPMS if ( opendir SRPMS, $repo );          my %temp_repo = map { $_ => $repo } grep { /\.rpm$/ } readdir SRPMS if ( opendir SRPMS, $repo );
107          closedir SRPMS;          closedir SRPMS;
108    
109          %sources = (%sources, %temp_repo);          %sources = (%sources, %temp_repo);
110  }  }
111    
112  foreach my $pkg ( keys %repohash ) {  my @latest;
113          foreach my $repo ( @repos ) {  foreach my $rpm ( reverse grep { $_->{repo} =~ m{^$releasedir/$smerel/} && $_->{repo} !~ m{/smedev$} } @rpms )  {
114                  if ( $repo =~ m{/builds/RPMS} ) {          unless ( grep { $_->{name} eq $rpm->{name} && $_->{rpm} gt $rpm->{rpm} } @latest ) {
115                          next unless $repohash{$pkg}{latest} || $repohash{$pkg}{$stagedir};                  push @latest, $rpm;
116                          my ($latest, @rest) = sort { $b cmp $a } @{$repohash{$pkg}{$stagedir}};                  unless ( grep { $_->{repo} eq $stagedir && $_->{filename} eq $rpm->{filename} } @rpms ) {
117                          delete $repohash{$pkg}{$stagedir};                          push @{$copy{"$stagedir/RPMS"}}, $rpm->{rpm}->filename;
118                          push @remove, map { $_->filename } @rest if @rest;                          push @rpms, { name => $rpm->{name},
119                          if ( $repohash{$pkg}{latest} ) {                                        filename => $rpm->{filename},
120                                  if ($repohash{$pkg}{latest} ne $latest ) {                                        version => $rpm->{version},
121                                          push @remove, $latest->filename;                                        release => $rpm->{release},
122                                          push @{$copy{"$stagedir/RPMS"}}, $repohash{$pkg}{latest}->filename;                                        repo => $stagedir,
123                                          $repohash{$pkg}{$stagedir} = $repohash{$pkg}{latest};                                        rpm => $rpm->{rpm},
124                                  } else {                                        source => $rpm->{source}
125                                          $repohash{$pkg}{$stagedir} = $latest;                                      };
                                 }  
                         } else {  
                                 push @remove, $latest->filename;  
                         }  
                 } elsif ( $repo =~ m{^(.*/[0-9]+/sme[^/]*)/} ) {  
                         my $pos = $1;  
                         next unless $repohash{$pkg}{$pos};  
                         if ( $pos =~ m{/smedev$} ) {  
                                 next unless $repohash{$pkg}{latest};  
                                 my @rest = grep { $_ le $repohash{$pkg}{latest} } @{$repohash{$pkg}{$pos}};  
                                 if ( @rest ) {  
                                         push @remove, map { $_->filename } @rest;  
                                         $changed{$pos}++;  
                                         @{$repohash{$pkg}{$pos}} = grep { $_ gt $repohash{$pkg}{latest} } @{$repohash{$pkg}{$pos}};  
                                         delete $repohash{$pkg}{$pos};  
                                 }  
                         } else {  
                                 my ($latest, @rest) = sort { $b cmp $a } @{$repohash{$pkg}{$pos}};  
                                 delete $repohash{$pkg}{$pos};  
                                 if ( $repohash{$pkg}{latest} && $repohash{$pkg}{latest} ge $latest ) {  
                                         push @rest, $latest;  
                                 } else {  
                                         $repohash{$pkg}{latest} = $latest;  
                                         $repohash{$pkg}{$pos} = $latest;  
                                 }  
                                 if ( @rest ) {  
                                         push @remove, map { $_->filename } @rest;  
                                         $changed{$pos}++;  
                                 }  
                         }  
126                  }                  }
127          }          }
128  }  }
129    
130  foreach my $pkg ( sort grep { $repohash{$_}{builds} } keys %repohash ) {  foreach my $rpm ( grep { $_->{repo} eq $stagedir } @rpms )  {
131          my %versions = ();          $rpm->{repo} = 'deleted' unless grep { $_->{filename} eq $rpm->{filename} } @latest;
         foreach my $ver ( sort { $b cmp $a } @{$repohash{$pkg}{builds}} ) {  
                 next if $repohash{$pkg}{latest} && $repohash{$pkg}{latest} ge $ver;  
   
                 $versions{$ver->tag("VERSION")}++;  
                 if ( $versions{$ver->tag("VERSION")} > $releases || (scalar keys %versions) > $releases ) {  
                         foreach my $rpm ( grep { $ver eq $_ } @{$repohash{$pkg}{"$repodir/smedev"}} ) {  
                                 push @remove, $rpm->filename;  
                                 @{$repohash{$pkg}{"$repodir/smedev"}} = grep { $rpm ne $_ } @{$repohash{$pkg}{"$repodir/smedev"}};  
                                 $changed{"$repodir/smedev"}++;  
                         }  
                 } else {  
                         print "Possible update " . $ver->filename . "\n" if $repohash{$pkg}{latest};  
                         if ( ! grep { $ver eq $_ } @{$repohash{$pkg}{"$repodir/smedev"}} ) {  
                                 push @{$copy{$devrepo}}, $ver->filename;  
                                 push @{$repohash{$pkg}{"$repodir/smedev"}}, $ver;  
                                 $changed{"$repodir/smedev"}++;  
                         }  
                 }  
         }  
132  }  }
133    
134  foreach my $pkg ( grep { $repohash{$_}{"$repodir/smedev"} } keys %repohash ) {  my @devel;
135          foreach my $rpm ( @{$repohash{$pkg}{"$repodir/smedev"}} ) {  my %versions;
136                  unless ( grep { $rpm eq $_ } @{$repohash{$pkg}{builds}} ) {  foreach my $rpm ( grep { $_->{repo} eq 'builds' } @rpms )  {
137                          push @remove, $rpm->filename;          next if grep { $_->{name} eq $rpm->{name} && $_->{rpm} ge $rpm->{rpm} } @latest;
138                          @{$repohash{$pkg}{"$repodir/smedev"}} = grep { $rpm ne $_ } @{$repohash{$pkg}{"$repodir/smedev"}};  
139                          $changed{"$repodir/smedev"}++;          $versions{$rpm->{name}}{$rpm->{version}}++ unless grep { $_->{name} eq $rpm->{name} && $_->{rpm} eq $rpm->{rpm} } @devel;
140                  }          next if $versions{$rpm->{name}}{$rpm->{version}} > $releases || scalar keys %{$versions{$rpm->{name}}} > $releases;
141            print "Possible update " . $rpm->{rpm}->filename . "\n" if grep { $_->{name} eq $rpm->{name} } @latest;
142    
143            push @devel, $rpm;
144            unless ( grep { $_->{repo} =~ m{/smedev$} && $_->{filename} eq $rpm->{filename} } @rpms ) {
145                    push @{$copy{"$releasedir/$smerel/smedev/$arch/RPMS"}}, $rpm->{rpm}->filename;
146                    $changed{"$releasedir/$smerel/smedev"}++;
147                    push @rpms, { name => $rpm->{name},
148                                  filename => $rpm->{filename},
149                                  version => $rpm->{version},
150                                  release => $rpm->{release},
151                                  repo => "$releasedir/$smerel/smedev",
152                                  rpm => $rpm->{rpm},
153                                  source => $rpm->{source}
154                                };
155          }          }
156  }  }
157    
158    foreach my $rpm ( grep { $_->{repo} =~ m{/smedev$} } @rpms )  {
159            $rpm->{repo} = 'deleted' unless grep { $_->{filename} eq $rpm->{filename} } @devel;
160    }
161    
162  print "\n";  print "\n";
163  foreach my $repo ( sort keys %srcrepohash ) {  foreach my $rpm ( grep { $_->{repo} !~ m{^(builds|deleted)$} } @rpms ) {
164          foreach my $pkg ( sort grep { $repohash{$_}{$repo} } keys %repohash ) {          my $src;
165                  my @rpms = ref($repohash{$pkg}{$repo}) eq "ARRAY" ? @{$repohash{$pkg}{$repo}} : ($repohash{$pkg}{$repo});          my $srpm = $rpm->{rpm}->tag("SOURCERPM");
166                  foreach my $rpm ( sort @rpms ) {  
167                          my $src = $rpm->tag("SOURCERPM");          my @sources = ();
168            push @sources, ($src = $srpm);
169                          my @sources = ();          push @sources, $src if (($src = $srpm) =~ s/\.el\d\.rf\./\.rf\./);
170                          push @sources, $src;          push @sources, $src if (($src = $srpm) =~ s/\.[0-3]\.el\d+\.rf\./\.rf\./);
171                          push @sources, $src if ($src =~ s/\.2\.el4\.rf\./\.rf\./);          push @sources, $src if (($src = $srpm) =~ s/\.(el|fc)\d\.at//);
172                          push @sources, $src if ($src =~ s/\.el4\.rf\./\.rf\./);          push @sources, $src if (($src = $srpm) =~ s/\.at//);
173                          push @sources, $src if ($src =~ s/\.el4\.at\./\.at\./);          push @sources, $src if (($src = $srpm) =~ s/\.(el|fc)\d//);
174                          push @sources, $src if ($src =~ s/\.rf\./\.dag\./);          push @sources, $src if (($src = $srpm) =~ s/\.\d+\.(el|fc)\d//);
175    
176                          my $found = 0;          my $found = 0;
177                          foreach my $source ( @sources ) {          my $repo = $rpm->{repo};
178                                  if ( $sources{$source} ) {          foreach my $source ( @sources ) {
179                                          unless ( -f "$repo/SRPMS/$source" ) {                  if ( $sources{$source} ) {
180                                                  push @{$copy{"$repo/SRPMS"}}, "$sources{$source}/$source";                          unless ( -f "$repo/SRPMS/$source" ) {
181                                                  $changed{$repo}++;                                  push @{$copy{"$repo/SRPMS"}}, "$sources{$source}/$source";
182                                          }                                  $changed{$repo}++ unless $repo eq $stagedir;
                                         $srcrepohash{$repo}{$source}++;  
                                         $found++;  
                                         last;  
                                 } elsif ( -f "$repo/SRPMS/$source" ) {  
                                         print "Found missing source $repo/SRPMS/$source for ".$rpm->as_nvre()."\n";  
                                         $srcrepohash{$repo}{$source}++;  
                                         $found++;  
                                 }  
183                          }                          }
184                          print "Can't find source for ".$rpm->as_nvre()."\n" unless $found;                          $srpms{$repo}{$source}++;
185                            $found++;
186                            last;
187                  }                  }
188          }          }
189            print "Can't find source for ".$rpm->{rpm}->filename."\n" unless $found;
190    }
191    
192          foreach my $rpm ( keys %{$srcrepohash{$repo}} ) {  my @remove;
193                  unless ( $srcrepohash{$repo}{$rpm} ) {  foreach my $repo ( keys %srpms ) {
194            foreach my $rpm ( keys %{$srpms{$repo}} ) {
195                    unless ( $srpms{$repo}{$rpm} ) {
196                          push @remove, "$repo/SRPMS/$rpm";                          push @remove, "$repo/SRPMS/$rpm";
197                          $changed{$repo}++;                          $changed{$repo}++ unless $repo eq $stagedir;
198                  }                  }
199          }          }
200  }  }
201    
202  print "\n";  print "\n";
203  foreach my $repo ( sort keys %copy ) {  foreach my $repo ( sort keys %copy ) {
204          foreach my $rpm ( sort keys %{{ map { $_ => 1 } @{$copy{$repo}} }} ) {          foreach my $rpm ( keys %{{ map { $_ => 1 } @{$copy{$repo}} }} ) {
205                  print "copying $rpm to $repo/\n";                  print "copying $rpm to $repo/\n";
206                  system(qw(cp --preserve=timestamps), $rpm, "$repo/");                  system(qw(cp --preserve=timestamps), $rpm, "$repo/");
207          }          }
208  }  }
209    
210  print "\n";  print "\n";
211  foreach my $rpm ( sort keys %{{ map { $_ => 1 } @remove }} ) {  foreach my $rpm ( keys %{{ map { $_ => 1 } (@remove, map { $_->{rpm}->filename } grep { $_->{repo} eq 'deleted' } @rpms) }} ) {
212          print "removing $rpm\n";          print "removing $rpm\n";
213          unlink $rpm;          unlink $rpm;
214  }  }
215    
216  print "\n";  print "\n";
217  foreach my $repo ( sort keys %changed ) {  foreach my $repo ( sort keys %changed ) {
218          next if $repo =~ m{^/builds};          my $dir=`readlink -f $repo/$arch`;
219            chomp $dir;
220          print "rebuilding $repo/i386...\n";          print "rebuilding $dir...\n";
221          system(qw(createrepo), "$repo/i386");          system(qw(createrepo), "$dir");
222          system(qw(repoview), "$repo/i386");          system(qw(repoview), "$dir");
223  }  }


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed