diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/syncrpms | 109 |
1 files changed, 87 insertions, 22 deletions
diff --git a/tools/syncrpms b/tools/syncrpms index 2073b6e84..f0c80750c 100755 --- a/tools/syncrpms +++ b/tools/syncrpms @@ -43,6 +43,14 @@ sub cp { exec '/bin/cp', @_; } } +sub mv { + my $pid; + if ($pid = fork()) { + waitpid($pid, 0); + } else { + exec '/bin/mv', @_; + } +} sub rm { my $pid; if ($pid = fork()) { @@ -54,17 +62,26 @@ sub rm { #- get a hash on name of srpms/rpms in a directory. sub get_rpms { - my ($dir, $rpms, $flag) = @_; + my ($dir, $rpms, $flag, $modifiable) = @_; opendir D, $dir or die "cannot open directory $dir\n"; map { if (/([^\/]*?)-([^-]*)-([^-]*)\.([^-]*)(?:\.src)?\.rpm$/) { if ($rpms->{$1}) { - if (version_compare($rpms->{$1}{version}, $2) > 0 || - version_compare($rpms->{$1}{version}, $2) == 0 && version_compare($rpms->{$1}{release}, $3) > 0) { - if ($flag->{clean}) { - print "removing obseleted $rpms->{$1}{file} by $_ in $rpms->{$1}{dir}\n" if $flag->{verbose}; - rm("$rpms->{$1}{dir}/$rpms->{$1}{file}"); + if (version_compare($2, $rpms->{$1}{version}) > 0 || + version_compare($2, $rpms->{$1}{version}) == 0 && version_compare($3, $rpms->{$1}{release}) > 0) { + if ($modifiable) { + if ($flag->{sorted}) { + print "you said rpms directory are sorted, so I keep obseleted $rpms->{$1}{file} by $_ in $rpms->{$1}{dir}\n" if $flag->{verbose}; + } else { + if (-d $flag->{conflict}) { + print "moving obseleted $rpms->{$1}{file} by $_ in $rpms->{$1}{dir}\n" if $flag->{verbose}; + mv("$rpms->{$1}{dir}/$rpms->{$1}{file}", $flag->{conflict}); + } elsif ($flag->{clean}) { + print "removing obseleted $rpms->{$1}{file} by $_ in $rpms->{$1}{dir}\n" if $flag->{verbose}; + rm("$rpms->{$1}{dir}/$rpms->{$1}{file}"); + } + } } $rpms->{$1} = { name => $1, version => $2, @@ -74,9 +91,15 @@ sub get_rpms { file => $_, }; } else { - if ($flag->{clean}) { - print "removing older or equal $_ by $rpms->{$1}{file} in $dir\n" if $flag->{verbose}; - rm("$dir/$_"); + if ($modifiable) { + if (-d $flag->{conflict}) { + print "copying older or equal $_ by $rpms->{$1}{file} in $flag->{conflict}\n" if $flag->{verbose}; + cp("$dir/$_", $flag->{conflict}); + chmod 0644, "$flag->{conflict}/$_"; + } elsif ($flag->{clean}) { + print "removing older or equal $_ by $rpms->{$1}{file} in $dir\n" if $flag->{verbose}; + rm("$dir/$_"); + } } } } else { @@ -95,6 +118,39 @@ sub get_rpms { closedir D; } +#- sync packages list according to hashes of rpms. +sub sync_medium { + my ($rpmsdirs, $list, $rpms, $flag) = @_; + my %pkg2dir; + + #- build a hash according to rpmsdirs and list for package name. + my $i = 0; + foreach (@$list) { + local *F; + open F, $_ or die "unable to open packages list file \"$_\"\n"; + foreach (<F>) { + chomp; + print STDERR "package \"$_\" is listed in mulitple list files!\n" if $pkg2dir{$_}; + $pkg2dir{$_} = $rpmsdirs->[$i]; + print "package \"$_\" listed in list files does not exists in rpms directory\n" if $flag->{verbose} && !$rpms->{$_}; + } + close F; + + ++$i; + } + + #- check for right directory, and move if necessary. + foreach (values %$rpms) { + unless ($pkg2dir{$_->{name}}) { + print "file $_->{file} in $_->{dir} define package \"$_->{name}\" not listed in list files\n" if $flag->{verbose}; + } elsif ($_->{dir} ne $pkg2dir{$_->{name}}) { + print "moving file $_->{file} in $_->{dir} to $pkg2dir{$_->{name}}\n" if $flag->{verbose}; + mv("$_->{dir}/$_->{file}", $pkg2dir{$_->{name}}); + $_->{dir} = $pkg2dir{$_->{name}}; + } + } +} + #- sync two hashes of rpms, update rpms and printer newer version that are not taken into account. sub sync_rpms { my ($source, $target, $flag) = @_; @@ -107,6 +163,7 @@ sub sync_rpms { } if (-d $flag->{add}) { cp("$source->{$_}{dir}/$source->{$_}{file}", $flag->{add}); + chmod 0644, "$flag->{add}/$source->{$_}{file}"; } } } @@ -122,6 +179,7 @@ sub sync_rpms { } if ($flag->{update}) { cp("$source->{$_}{dir}/$source->{$_}{file}", $target->{$_}{dir}); + chmod 0644, "$target->{$_}{dir}/$source->{$_}{file}"; unless (-e "$target->{$_}{dir}/$source->{$_}{file}") { die "unable to copy $source->{$_}{file} from $source->{$_}{dir} into $target->{$_}{dir}\n"; } @@ -153,21 +211,24 @@ sub sync_rpms { sub main { my @from_rpms; my @to_rpms; - my $target_rpms; + my @list; + my $target; my %flag; my %source; my %target; foreach (@_) { if (/^--(\w*)$/) { - if ($1 eq 'verbose' || $1 eq 'update' || $1 eq 'remove' || $1 eq 'clean') { + if ($1 eq 'verbose' || $1 eq 'update' || $1 eq 'remove' || $1 eq 'clean' || $1 eq 'sorted') { $flag{$1} = 1; - } elsif ($1 eq 'add') { - $flag{add} = undef; + } elsif ($1 eq 'add' || $1 eq 'conflict') { + $flag{$1} = undef; } elsif ($1 eq 'from') { - $target_rpms = \@from_rpms; + $target = \@from_rpms; } elsif ($1 eq 'to') { - $target_rpms = \@to_rpms; + $target = \@to_rpms; + } elsif ($1 eq 'list') { + $target = \@list; } else { die "unknown option: $1\n"; } @@ -175,26 +236,30 @@ sub main { if (exists $flag{add} && ! $flag{add}) { $flag{add} = $_; die "cannot add to non-directory: $_\n" unless -d $flag{add}; + } elsif (exists $flag{conflict} && ! $flag{conflict}) { + $flag{conflict} = $_; + die "cannot add to non-directory: $_\n" unless -d $flag{conflict}; } else { - die "unknown parameter: $_\n" unless $target_rpms; - push @$target_rpms, $_; + die "unknown parameter: $_\n" unless $target; + push @$target, $_; } } } - die "usage: syncrpms [--update] [--remove] [--clean] [--add <dir>] --from <dir_sources> --to <dir_target>\n" - unless scalar(@from_rpms) > 0 && scalar(@to_rpms) > 0; + die "usage: syncrpms [--update] [--remove] [--clean] [--sorted] [--add <dir>] [--conflict <dir>] --from <dir_sources> --to <dir_targets> [--list <files>]\n" + unless scalar(@from_rpms) > 0 || scalar(@to_rpms) > 0; #- parse directory structures. - get_rpms($_, \%source, \%flag) foreach @from_rpms; - get_rpms($_, \%target, \%flag) foreach @to_rpms; + get_rpms($_, \%source, \%flag, 0) foreach @from_rpms; + get_rpms($_, \%target, \%flag, 1) foreach @to_rpms; print STDERR "reading " . scalar(keys %source) . " packages as source rpms from\n"; print STDERR " $_\n" foreach @from_rpms; print STDERR "reading " . scalar(keys %target) . " packages as target rpms from\n"; print STDERR " $_\n" foreach @to_rpms; - sync_rpms(\%source, \%target, \%flag); + sync_medium(\@to_rpms, \@list, \%target, \%flag) if scalar(@list) > 0 && scalar(@to_rpms) > 0; + sync_rpms(\%source, \%target, \%flag) if scalar(@from_rpms) > 0 && scalar(@to_rpms) > 0; } main(@ARGV); |