ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] preview: buildreq.pl
@ 2004-04-29 19:11 Alexey Tourbin
  0 siblings, 0 replies; only message in thread
From: Alexey Tourbin @ 2004-04-29 19:11 UTC (permalink / raw)
  To: devel


[-- Attachment #1.1: Type: text/plain, Size: 2358 bytes --]

<...>
Нужно писать по одной перловой программе в день, тогда жизнь наладится.
В частности, есть идея переработать buildreq и другие утилиты из этого
комплекта, чтобы возникало меньше вопросов.

К сожалению, за день всего сделать не удается.

Примеры использования того, что уже нарисовано, приведены ниже.
Работает быстро (перл вообще работает на редкость быстро).
Завтра нужно подумать над алгоритмом автоматической оптимизации
зависимостей.  Как вы помните, дело было в том, что получаются не
деревья зависимостей (чего хотелось бы), а граф зависимостей (и непонятно,
с какой вершины начинать его "разматывать").

Была также отдельная проблема с виртуальными пакетами.

В идеале, нужно избавиться от предикатной кувалды 
/etc/buildreqs/packages/essential. :)

Если кто-нибудь может подсказать что-нибудь дельное на уровне алгоритма,
прошу подсказать.  Кто не в курсе и кому интересно, искать

Date: Sun, 16 Nov 2003 17:58:30 +0300
Subject: [devel] packagereq/buildreq proposal
Message-ID: <20031116145830.GC1863@julia.office.altlinux.ru>

Отдельный вопрос -- как это назвать. :)


$ ~/bin/buildreq.pl --packageof /bin/date
coreutils
$ ~/bin/buildreq.pl --packagereq /bin/date
coreutils
glibc-core
glibc-core-i686
glibc-gconv-modules
glibc-locales
$ ~/bin/buildreq.pl --packagereq --explain /bin/date
coreutils
        /bin/date
glibc-core
        /etc/localtime
glibc-core-i686
        /lib/i686/libc.so.6
        /lib/i686/libpthread.so.0
        /lib/i686/librt.so.1
glibc-gconv-modules
        /usr/lib/gconv/gconv-modules.cache
glibc-locales
        /usr/lib/locale/ru_RU.CP1251/LC_COLLATE
        /usr/lib/locale/ru_RU.CP1251/LC_CTYPE
        /usr/lib/locale/ru_RU.CP1251/LC_MONETARY
        /usr/lib/locale/ru_RU.CP1251/LC_NUMERIC
$ ~/bin/buildreq.pl --packagereq -- rpm -bc ~/RPM/SPECS/perl-YAML.spec
<...>
+ exit 0
GConf2
bzip2
bzlib
control
coreutils
findutils
glibc-core
glibc-core-i686
glibc-gconv-modules
glibc-locales
glibc-nss
grep
libalternatives-devel
libbeecrypt
libdb4.2
libpam0-devel
libpopt
librpm
librpmbuild
libruby-devel
libxmms-devel
make
perl-XML-SAX
perl-base
perl-devel
perl-pod
rpm
rpm-build
rpm-build-perl
setup
sh
tar
texinfo
yelp
zlib
$

-- 
Перепишите FAM и давайте искать кошелек под root.
		-- Markov chain after fortunes-ALT

[-- Attachment #1.2: buildreq.pl --]
[-- Type: text/plain, Size: 1613 bytes --]

#!/usr/bin/perl
# $Id$

use strict;
#use diagnostics;

sub filereq (@) {
	my @strace = qw(strace -kqfF -e file -o |cat --); # okay, I love cat(1)
	open my $fh, "-|", @strace, @_
		or die "@strace @_ failed\n";
	my %trace; my %files; local $_;
	while (<$fh>) {
		chomp;
		if (s/^(\d+)(\s+)(.*)\s+<unfinished\s+\.\.\.>$/$1$2$3/) {
			die "pid $1 unfinished twice\n"
				if defined $trace{$1};
			$trace{$1} = $_;
			next;
		} elsif (s/^(\d+)\s+<\.\.\.\s+\w+\s+resumed>//) {
			die "pid $1 resumed without being unfinished\n"
				if not defined $trace{$1};
			$_ = delete($trace{$1}) . $_;
		}
		$files{$1}++ if /^\d+\s+\w+\("(\/.+?)"/;
	}
	return \%files;
}

use RPM::Database;
my $rpmdb = RPM::Database->new
	or die "rpmdb: $RPM::err\n";

sub packageof ($) {
	my $hdr = $rpmdb->find_by_file($_[0]);
	$hdr ? $$hdr{NAME} : undef;
}

sub packagereq (@) {
	my $files = filereq @_;
	my %packages;
	while (my ($file, undef) = each %$files) {
		next unless -f $file;
		my $package = packageof $file;
		next unless $package;
		push @{$packages{$package}}, $file;
	}
	return \%packages;
}

use Getopt::Long qw(GetOptions);
GetOptions explain => \my $explain,
	filereq => \my $filereq, packageof => \my $packageof,
	packagereq => \my $packagereq;

$filereq ^ $packageof ^ $packagereq or die "usage: $0 --mode arguments\n";

sub out ($) {
	my $tbl = shift;
	foreach my $k (sort keys %$tbl) {
		print $k . "\n";
		next unless $explain;
		foreach my $v (sort @{$$tbl{$k}}) {
			print "\t$v\n";
		}
	}
}

$filereq and out filereq @ARGV or
$packageof and print packageof($ARGV[0]) . "\n" or
$packagereq and out packagereq @ARGV;

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-04-29 19:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-04-29 19:11 [devel] preview: buildreq.pl Alexey Tourbin

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git