source: soft/build_system/build_system/upload/robot/trunk/process-obsoletes2 @ 1

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

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

File size: 4.4 KB
Line 
1#!/usr/bin/perl
2#---------------------------------------------------------------
3# Project         : Mandriva Linux
4# Module          : robot
5# File            : process-obsoletes2
6# Version         : $Id: process-obsoletes2 913 2006-04-28 08:36:46Z mandrake $
7# Author          : Warly
8# Created On      : Tue Sep 04 16:55:00 2001
9# Purpose         : move obsoleted packages to another dir.
10#---------------------------------------------------------------
11use URPM;
12use strict;
13use File::NCopy qw(copy);
14
15my %flag = (
16    '<' => 2,
17    '>' => 4,
18    '==' => 8,
19    '<=' => 10,
20    '>=' => 12
21);
22
23
24@ARGV >= 2 or print STDERR "usage: $0 <binary rpm> <distribution root> <architecture> <media 1> <media 2> ... <media n>\n" and exit 1;
25
26my $RPM = shift @ARGV;
27my $top = shift @ARGV;
28my $arch = shift @ARGV;
29-f "$top/$arch/VERSION" or die "FATAL: $top/$arch/VERSION does not exist, the path does not seem to be a distribution root";
30my @media = @ARGV;
31
32my $OLDDIR="/mnt/BIG/dis/old";
33
34if (!-d $OLDDIR){
35    print STDERR "$0: invalid OLDDIR: $OLDDIR\n";
36    exit 1
37}
38
39my %header;
40get_rpm_header(\%header, $RPM) or die "Could not open $RPM: $!";
41
42ref $header{OBSOLETES} or exit;
43
44foreach my $media (@media) {
45        my $dir = "$top/$arch/media/$media";
46        my $srpm_dir = "$top/SRPMS/$media";
47        opendir my $DIR, $dir or next;
48        #print "Checking $dir\n";
49        foreach (readdir $DIR){
50                for (my $i; $i < @{$header{OBSOLETES}}; $i++){
51                        my $obs = $header{OBSOLETES}[$i];
52                        my $version = $header{OBSOLETEVERSION}[$i];
53                        my $release = $header{OBSOLETEVERSION}[$i];
54                        my $flag = $header{OBSOLETEFLAGS}[$i];
55                        m/\Q$obs\E-[^-]+-[^-]+\.[^.]+\.rpm/ or next;
56                        my %oh;
57                        #print "Checking $_\n";
58                        get_rpm_header(\%oh, "$dir/$_") or die "Could not open $dir/$_: $!";
59                        my $ok = 0;
60                        if ($oh{NAME} eq $obs){
61                                print "processing obsoletes for $RPM ($obs)\n";
62                                if ($version){
63                                        my ($epoch, $ver) = $version =~ /(?:(\d+):)?([^-]+(?:-[^-]*)?)/;
64                                        $epoch ||= '0';
65                                        $oh{EPOCH} ||= '0';
66                                        my $over = "$oh{EPOCH}-$oh{VERSION}-$oh{RELEASE}";
67                                        #print "OVER $over ($epoch-$ver)\n";
68                                        my $flag = $header{OBSOLETEFLAGS}[$i];
69                                        if ($flag & 2){ if (URPM::ranges_overlap("> $over","== $epoch-$ver-$release")) { $ok = 1 } }           
70                                        if ($flag & 4){ if (URPM::ranges_overlap("< $over","== $epoch-$ver-$release")) { $ok = 1 } }           
71                                        if ($flag & 8){ if (URPM::ranges_overlap("== $over","== $epoch-$ver-$release")) { $ok = 1 }}           
72                                } else {
73                                        $ok = 1 
74                                }
75                        }
76                        $ok or next;
77                        my $srpm=$oh{SOURCERPM};
78                        cp("$dir/$_","$OLDDIR/$_");
79                        if (-f "$srpm_dir/$srpm") {
80                                cp("$srpm_dir/$srpm","$OLDDIR/$srpm");
81                        }
82                }
83        }       
84        closedir $DIR
85}
86
87sub cp {
88        my ($file,$dest) = @_;
89        print "$file -> $dest\n";
90        my $err = link "$file", "$dest";
91        if (!$err) {
92                $err = copy "$file", "$dest";
93                if (!$err) {
94                        print "ERROR: unable to copy $file to $dest: $!\n";
95                        unlink $file;
96                        return
97                }
98        } 
99        unlink "$file";
100}
101
102sub get_rpm_header {
103    my ($header, $rpm) = @_;
104    my $urpm = new URPM;
105    my $id = $urpm->parse_rpm($rpm, keep_all_tags => 1);
106    my $pkg = $urpm->{depslist}[$id] or print "ERROR get_rpm_header: could not parse $rpm\n" and return;
107    $header->{NAME} = $pkg->name;
108    $header->{EPOCH} = $pkg->epoch || '';
109    $header->{VERSION} = $pkg->version;
110    $header->{RELEASE} = $pkg->release;
111    $header->{GROUP} = $pkg->group;
112    $header->{ARCH} = $pkg->arch;
113    $header->{SOURCERPM} = $pkg->sourcerpm;
114    $header->{SUMMARY} = $pkg->summary;
115    foreach my $t (['requires', 'REQUIRE', 'REQUIRENAME'], ['provides', 'PROVIDES', 'PROVIDES'], ['obsoletes', 'OBSOLETE', 'OBSOLETES']) {
116        my ($func, $pref, $first) = @$t;
117        foreach my $r ($pkg->$func){
118            my ($name, $a_flag, $version) = $r =~ /([^[]*)(?:\[(.*) (.*)\])?/;
119            push @{$header->{$first}}, $name;
120            my $d_flag = $flag{$a_flag};
121            push @{$header->{"${pref}FLAGS"}}, $d_flag;
122            push @{$header->{"${pref}VERSION"}}, $version
123        }
124    }
125    my ($i, %dir);
126    foreach my $r ($pkg->files){
127        my ($dir, $name) = $r =~ m,(.*/)([^/]*),;
128        push @{$header->{BASENAMES}}, $name;
129        if (! defined $dir{$dir}) {
130            $dir{$dir} = $i++;
131            push @{$header->{DIRNAMES}}, $dir
132        }
133        push @{$header->{DIRINDEXES}}, $dir{$dir};
134    }
135    $header->{FILEUSERNAME} = [ $pkg->files_owner ];
136    $header->{CHANGELOGTIME} = [ $pkg->changelog_time ];
137    $header->{CHANGELOGNAME} = [ $pkg->changelog_name ];
138    $header->{CHANGELOGTEXT} = [ $pkg->changelog_text ];
139    $header->{BUILDTIME} = $pkg->buildtime;
140    1
141}                                   
142
143# process-obsoletes ends here
Note: See TracBrowser for help on using the repository browser.