From 3b61f8346068f79c9c22d22a6446eb7401495414 Mon Sep 17 00:00:00 2001 From: Francois Pons Date: Fri, 31 Mar 2000 14:37:44 +0000 Subject: *** empty log message *** --- ChangeLog | 4 +++ genfilelist | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rpmtools.spec | 6 +++- 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100755 genfilelist diff --git a/ChangeLog b/ChangeLog index 3373df8..d77f951 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2000-03-31 François Pons + + * genfilelist: new tool to build a filelist from a RPMS repository. + 2000-03-26 Pixel * gendepslist2.cc: add ability to handle files (was only diff --git a/genfilelist b/genfilelist new file mode 100755 index 0000000..741b685 --- /dev/null +++ b/genfilelist @@ -0,0 +1,105 @@ +#!/usr/bin/perl + +#- Generate filelist with obseletes packages. +#- Copyright (C) 2000 MandrakeSoft (fpons@mandrakesoft.com) +#- +#- This program is free software; you can redistribute it and/or modify +#- it under the terms of the GNU General Public License as published by +#- the Free Software Foundation; either version 2, or (at your option) +#- any later version. +#- +#- This program is distributed in the hope that it will be useful, +#- but WITHOUT ANY WARRANTY; without even the implied warranty of +#- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#- GNU General Public License for more details. +#- +#- You should have received a copy of the GNU General Public License +#- along with this program; if not, write to the Free Software +#- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#- usage is: +#- genfilelist + + +use strict qw(subs vars refs); + +sub packfilelist { + my %countdir = (); + my @commonparts; + + #- search for common parts of name. + foreach (@_) { + my $filename = $_; + foreach (0..length($filename)) { + ++$countdir{substr($filename, 0, $_)}; + } + } + + #- pass 1: recompute counter. + foreach (sort { $countdir{$b} <=> $countdir{$a} || ($countdir{$b} == $countdir{$a} && length($b) <=> length($a)) } + keys %countdir) { + my $filepart = $_; + if (length($filepart) > 4 && $countdir{$filepart} > 1) { + foreach (0..length($filepart)-1) { + my $subpart = substr($filepart, 0, $_); + if (length($subpart) * $countdir{$subpart} < length($filepart) * $countdir{$filepart}) { + $countdir{$subpart} -= $countdir{$filepart} if $countdir{$filepart} > 0; + } else { + $countdir{$filepart} -= $countdir{$subpart} if $countdir{$subpart} > 0; + } + } + } else { + delete $countdir{$filepart}; + } + } + + #- pass 2: filter out overstring. + foreach (sort { $countdir{$a} <=> $countdir{$b} || ($countdir{$a} == $countdir{$b} && length($a) <=> length($b)) } + keys %countdir) { + my $filepart = $_; + if ($countdir{$filepart} > 1) { + foreach (0..length($filepart)-1) { + delete $countdir{substr($filepart, 0, $_)}; + } + } + } + + #- pass 3: get result. + foreach (sort { $countdir{$b} <=> $countdir{$a} || ($countdir{$b} == $countdir{$a} && length($b) <=> length($a)) } + keys %countdir) { + push @commonparts, $_ if $countdir{$_} > 1 && @commonparts < 10; + } + + @commonparts; +} + +#- main program. +sub main { + my ($rpms_dir) = @_; + + local *DIR; + opendir DIR, $rpms_dir or die "unable to parse directory: $!"; + foreach (readdir DIR) { + if (/(.*)-[^-]*-[^-]*$/) { + print "#$1\n"; + + my @filelist = split '\n', `rpm -qpl $rpms_dir/$_`; + my @obsoletes = split '\n', `rpm -qp --obsoletes $rpms_dir/$_`; + my @commonparts = packfilelist(@filelist); + + foreach (@obsoletes) { print "*$_\n" } + foreach (0..$#commonparts) { print "=$commonparts[$_]\n" } #- commonparts are printed in from 0 to n-1. + foreach my $filename (@filelist) { + map { + if (substr($filename, 0, length($commonparts[$_])) eq $commonparts[$_]) { + print $_ . substr($filename, length($commonparts[$_])) . "\n"; next; + } + } (0..$#commonparts); + print " $filename\n"; + } + } + } + closedir DIR; +} + +main(@ARGV); diff --git a/rpmtools.spec b/rpmtools.spec index d2253b1..1b422e4 100644 --- a/rpmtools.spec +++ b/rpmtools.spec @@ -1,5 +1,5 @@ %define name rpmtools -%define release 13mdk +%define release 14mdk # do not modify here, see Makefile in the CVS %define version 1.1 @@ -55,8 +55,12 @@ rm -rf $RPM_BUILD_ROOT /usr/bin/hdlist2prereq /usr/bin/hdlist2groups /usr/bin/genhdlists +/usr/bin/genfilelist %changelog +* Fri Mar 31 2000 François PONS 1.1-14mdk +- add genfilelist + * Mon Mar 27 2000 Pixel 1.1-13mdk - add hdlist2groups -- cgit v1.2.1