ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Alexey Tourbin <at@altlinux.ru>
To: devel@altlinux.ru
Subject: [devel] preview: buildreq.pl
Date: Thu, 29 Apr 2004 23:11:19 +0400
Message-ID: <20040429191119.GW1895@solemn.turbinal.org> (raw)


[-- 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 --]

                 reply	other threads:[~2004-04-29 19:11 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040429191119.GW1895@solemn.turbinal.org \
    --to=at@altlinux.ru \
    --cc=devel@altlinux.ru \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

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