* [devel] autodeps
@ 2000-11-24 21:07 Mikhail Zabaluev
2000-11-25 16:00 ` Dmitry V. Levin
0 siblings, 1 reply; 5+ messages in thread
From: Mikhail Zabaluev @ 2000-11-24 21:07 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 1143 bytes --]
Привет.
Обнаружил, в чем проблема с 'AutoReqProv: perl' в rpm. Скрипт
find-provides слишком полагается на суждение программы file о том, что
есть perl script. Та, на самом деле, почти никогда не скажет такого о
модуле, который не начинается со строки типа '#!/usr/bin/perl'.
file-3.33-1mdk вообще считает многие модули какими-то файлами для
palmtop'а Newton, даже не текстовыми! Пришлось отучать.
Прилагаю патч для find-{provides,requires} и снова perl.prov - там нужно
было добавить содержимое RPM_BUILD_ROOT ко всем путям поиска.
Следует заметить, что скриптам perl.prov и perl.req лучше давать весь
список файлов зараз - так _намного_ быстрее.
Еще есть предложения:
- добавить еще один псевдоним для значения по умолчанию Auto{Req,Prov} -
'default', чтобы можно было писать 'AutoReqProv: default, perl'
или 'AutoReqProv: default, noshell';
- реализовать подстановку переменной окружения RPM_PERL_LIB_PATH для
perl.prov из макроса.
--
Stay tuned,
MhZ mailto:mookid@sigent.ru
-----------
Mr. Cole's Axiom:
The sum of the intelligence on the planet is a constant;
the population is growing.
[-- Attachment #2: reqprov.patch --]
[-- Type: text/plain, Size: 1233 bytes --]
--- find-provides.orig Fri Nov 24 18:51:28 2000
+++ find-provides Fri Nov 24 22:28:31 2000
@@ -91,7 +91,7 @@
{
local f="$1"
local t="$2"
- if [ -z "${t/$f: perl script text*/}" ]; then
+ if [ -z "${t/$f: perl script text*/}" -o -z "${f/*.p[lmh]/}" ]; then
if [ -n "$FIND_PERL" ]; then
/usr/lib/rpm/perl.prov "$f"
fi
@@ -129,7 +129,7 @@
while IFS= read -r f; do
if t="$(file -L "$f")"; then
- if [ -z "${t/$f: * script text*/}" ]; then
+ if [ -z "${t/$f: * text*/}" ]; then
FOUND_PROVS="$FOUND_PROVS
$(FindScriptProvs "$f" "$t")"
elif [ -z "${t/$f: * shared object*/}" ]; then
--- find-requires.orig Fri Nov 24 18:51:39 2000
+++ find-requires Fri Nov 24 22:28:21 2000
@@ -115,7 +115,7 @@
if [ -n "$FIND_SHELL" ]; then
/usr/lib/rpm/shell.req "$f"
fi
- elif [ -z "${t/$f: perl script text*/}" ]; then
+ elif [ -z "${t/$f: perl script text*/}" -o -z "${f/*.p[lmh]/}" ]; then
if [ -n "$FIND_PERL" ]; then
/usr/lib/rpm/perl.req "$f"
fi
@@ -164,7 +164,7 @@
while IFS= read -r f; do
t="$(file "$f")"
- if [ -z "${t/$f: * script text*/}" ]; then
+ if [ -z "${t/$f: * text*/}" ]; then
FOUND_REQS="$FOUND_REQS
$(FindScriptReqs "$f" "$t")"
elif [ -z "${t/$f: * executable*/}" ]; then
[-- Attachment #3: perl.prov --]
[-- Type: text/plain, Size: 6725 bytes --]
#!/usr/bin/perl
# RPM (and it's source code) is covered under two separate licenses.
# The entire code base may be distributed under the terms of the GNU
# General Public License (GPL), which appears immediately below.
# Alternatively, all of the source code in the lib subdirectory of the
# RPM source code distribution as well as any code derived from that
# code may instead be distributed under the GNU Library General Public
# License (LGPL), at the choice of the distributor. The complete text
# of the LGPL appears at the bottom of this file.
# This alternative is allowed to enable applications to be linked
# against the RPM library (commonly called librpm) without forcing
# such applications to be distributed under the GPL.
# Any questions regarding the licensing of RPM should be addressed to
# Erik Troan <ewt@redhat.com>.
# a simple script to print the proper name for perl libraries.
# To save development time I do not parse the perl grammmar but
# instead just lex it looking for what I want. I take special care to
# ignore comments and pod's.
# it would be much better if perl could tell us the proper name of a
# given script.
# The filenames to scan are either passed on the command line or if
# that is empty they are passed via stdin.
# If there are lines in the file which match the pattern
# (m/^\s*\$VERSION\s*=\s+/)
# then these are taken to be the version numbers of the modules.
# If there are strings in the file which match the pattern
# m/^\s*\$RPM_Provides\s*=\s*["'](.*)['"]/i
# then these are treated as additional names which are provided by the
# file and are printed as well.
# The RPM_PERL_LIB_PATH environment variable, if set, must contain the list of
# absolute paths, separated by colons, spaces or commas. These paths are
# considered as library paths used to determine relative names of provided
# perl files. If RPM_PERL_LIB_PATH is not set, paths from @INC Perl variable
# are used instead.
# by Ken Estes Mail.com kestes@staff.mail.com
# modified by Mikhail Zabaluev <mookid@mu.ru>
require v5.6.0;
use Safe;
use strict;
use vars qw(%provide @perl_inc);
# obtain the list of library directories. If not provided, use @INC
if (exists $ENV{RPM_PERL_LIB_PATH}) {
@perl_inc = split(/[:,\s]+/, $ENV{RPM_PERL_LIB_PATH});
}
else {
@perl_inc = grep { m|^/| } @INC;
}
# Sort @perl_inc descending by length to search for longest prefix rapidly.
@perl_inc = sort { length($b) <=> length($a) } @perl_inc;
# Prepend $RPM_BUILD_ROOT to paths.
my $buildroot = $ENV{RPM_BUILD_ROOT};
@perl_inc = map { "${buildroot}$_" } @perl_inc;
# process files
if (@ARGV) {
foreach (@ARGV) {
process_file($_);
}
} else {
# notice we are passed a list of filenames NOT as common in unix the
# contents of the file.
foreach (<>) {
process_file($_);
}
}
# print out sorted results
foreach my $module (sort keys %provide) {
my $version = $provide{$module};
if (length($version) == 0) {
print "perl($module)\n";
} else {
print "perl($module) = $version\n";
if ($version =~ /^1:(.*)/) {
# provide an additional epoch 0 version converted using Perl's rules
my $fpver = 0;
my $ratio = 1;
my @series = split(/\./, $1);
for (@series) {
$fpver += $_ * $ratio;
$ratio *= 0.001;
}
my $fdigits = $#series * 3;
printf("perl($module) = 0:%.${fdigits}f\n", $fpver);
}
}
}
exit 0;
sub process_file {
my ($file) = @_;
chomp $file;
# find the longest matching prefix among Perl library search directories
my $prefix = '';
foreach (@perl_inc) {
if (substr($file, 0, length($_)) eq $_) {
$prefix = $_;
last;
}
}
return if $prefix eq '';
# get path to the module file without prefix
my $module_file = substr($file, length($prefix));
$module_file =~ s{^/}{};
$provide{$module_file} = undef;
return if $module_file !~ /\.pm$/;
# try to extract version number for this package
open(FILE, "<$file")||
die("$0: Could not open file: '$file' : $!\n");
my $inpackage = 0;
while (<FILE>) {
# skip the documentation
# we should not need to have item in this if statement (it
# properly belongs in the over/back section) but people do not
# read the perldoc.
if ((m/^=(head[12]|pod|over|item|for|begin)/) .. (m/^=(cut)/)) {
next;
}
# skip the data section
if (m/^__(DATA|END)__$/) {
last;
}
# not everyone puts the package name of the file as the first
# package name so we browse through all namespaces
if (m/^\s*package\s+([\w:']+)\s*;/) {
$inpackage = (module_filename($1) eq $module_file)? 1 : 0;
next;
}
# after we found the package name take the first assignment to
# $VERSION as the version number. Exporter requires that the
# variable be called VERSION so we are safe.
if ($inpackage &&
s/^([\s(]*)(our\s*)?\$VERSION\s*=/$1\$VERSION =/) {
$provide{$module_file} = extract_version($_);
next;
}
# also consider version initializations with explicit package specification
if (s/^([\s(]*)(our\s*)?\$([\w:']+)::VERSION\s*=/$1\$VERSION =/) {
if (module_filename($3) eq $module_file) {
$provide{$module_file} = extract_version($_);
}
next;
}
# Each keyword can appear multiple times. Don't
# bother with datastructures to store these strings,
# if we need to print it print it now.
if ( m/^\s*\$RPM_Provides\s*=\s*["'](.*)['"]/i) {
foreach (split(/\s+/, $1)) {
print "$_\n";
}
}
}
close(FILE)||
die("$0: Could not close file: '$file' : $!\n");
return ;
}
# module_filename($name) -
# converts module name to relative file path
sub module_filename {
my $name = shift;
$name =~ s{::|'}{/}g;
return $name . '.pm';
}
# extract_version -
# this subroutine tries to evaluate line containing assignment to $VERSION
# in order to achieve version number
sub extract_version {
my $line = shift;
# Try to evaluate the assignment to get the value of $VERSION.
# It is usually computed without using data external to the expression,
# so we would have no problems.
local $SIG{__WARN__} = sub { };
my $safe = new Safe;
$safe->permit_only(qw(:base_core :base_mem :base_loop :base_orig entereval));
my $version = $safe->reval("$line; \$VERSION;");
return undef if $@ || length($version) == 0;
if ($version =~ s/^\s*(\d[\d_]*(\.[\d_]*)?|\.[\d_]+)/$1/) {
# plain old numeric version
return '0:' . $version;
}
else {
# Supposedly, a new style version evaluated as a string constant.
# Return an epoch 1 version
return sprintf('1:%vd', $version);
}
return undef;
}
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [devel] autodeps
2000-11-24 21:07 [devel] autodeps Mikhail Zabaluev
@ 2000-11-25 16:00 ` Dmitry V. Levin
2000-11-25 18:18 ` Mikhail Zabaluev
0 siblings, 1 reply; 5+ messages in thread
From: Dmitry V. Levin @ 2000-11-25 16:00 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 1985 bytes --]
Greetings!
On Sat, Nov 25, 2000 at 12:07:46AM +0300, Mikhail Zabaluev wrote:
> Обнаружил, в чем проблема с 'AutoReqProv: perl' в rpm. Скрипт
> find-provides слишком полагается на суждение программы file о том, что
> есть perl script. Та, на самом деле, почти никогда не скажет такого о
> модуле, который не начинается со строки типа '#!/usr/bin/perl'.
> file-3.33-1mdk вообще считает многие модули какими-то файлами для
> palmtop'а Newton, даже не текстовыми! Пришлось отучать.
А не станет ли теперь perl-файлов больше, чем есть на самом деле?
Слабо file-3.33 зафиксить? :)
> Прилагаю патч для find-{provides,requires} и снова perl.prov - там нужно
> было добавить содержимое RPM_BUILD_ROOT ко всем путям поиска.
>
> Следует заметить, что скриптам perl.prov и perl.req лучше давать весь
> список файлов зараз - так _намного_ быстрее.
А как быть с именами файлов, содержащими символы из IFS?
> Еще есть предложения:
> - добавить еще один псевдоним для значения по умолчанию Auto{Req,Prov} -
> 'default', чтобы можно было писать 'AutoReqProv: default, perl'
> или 'AutoReqProv: default, noshell';
Написано ведь в /usr/share/doc/rpm-3.0.6/README.ipl, строка 52:
+ yes, true - enable lookup using default methods (see rcfiles for details).
Пример использования (ncurses.spec):
AutoReq: yes, noshell
Добавить еще один синоним? :)
> - реализовать подстановку переменной окружения RPM_PERL_LIB_PATH для
> perl.prov из макроса.
А так эта переменная до скрипта не доходит?
Regards,
Dmitry
+-------------------------------------------------------------------------+
Dmitry V. Levin mailto://ldv@fandra.org
Software Engineer PGP pubkey http://www.fandra.org/users/ldv/pgpkeys.html
IPLabs Linux Team http://linux.iplabs.ru
Fandra Project http://www.fandra.org
+-------------------------------------------------------------------------+
UNIX is user friendly. It's just very selective about who it's friends are.
[-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [devel] autodeps
2000-11-25 16:00 ` Dmitry V. Levin
@ 2000-11-25 18:18 ` Mikhail Zabaluev
2000-11-26 23:59 ` Dmitry V. Levin
0 siblings, 1 reply; 5+ messages in thread
From: Mikhail Zabaluev @ 2000-11-25 18:18 UTC (permalink / raw)
To: devel
Hello Dmitry,
On Sat, Nov 25, 2000 at 19:00 +0300, Dmitry V. Levin wrote:
>
> Greetings!
>
> On Sat, Nov 25, 2000 at 12:07:46AM +0300, Mikhail Zabaluev wrote:
> > Обнаружил, в чем проблема с 'AutoReqProv: perl' в rpm. Скрипт
> > find-provides слишком полагается на суждение программы file о том, что
> > есть perl script. Та, на самом деле, почти никогда не скажет такого о
> > модуле, который не начинается со строки типа '#!/usr/bin/perl'.
> > file-3.33-1mdk вообще считает многие модули какими-то файлами для
> > palmtop'а Newton, даже не текстовыми! Пришлось отучать.
>
> А не станет ли теперь perl-файлов больше, чем есть на самом деле?
> Слабо file-3.33 зафиксить? :)
Если и будут какие-то левые файлы, проверки на синтаксис в скриптах
достаточно тщательные. Единственная актуальная возможность ложного
срабатывания - это если в библиотечных каталогах Perl вдруг окажутся
файлы с суффиксами .pl, .pm или .ph, не являющиеся perl-скриптами - тогда
perl.prov запишет их в provides. Представить себе такое я не могу.
Насчет file и magic будем посмотреть. Конечно, такие одиозные случаи, как
"package - значит, пакет для Newton", нужно лечить.
> > Прилагаю патч для find-{provides,requires} и снова perl.prov - там нужно
> > было добавить содержимое RPM_BUILD_ROOT ко всем путям поиска.
> >
> > Следует заметить, что скриптам perl.prov и perl.req лучше давать весь
> > список файлов зараз - так _намного_ быстрее.
>
> А как быть с именами файлов, содержащими символы из IFS?
Подавайте на стандартный ввод как отдельные строки. Думаю, никому не
придет в голову включать line feed в имя файла.
>
> > Еще есть предложения:
> > - добавить еще один псевдоним для значения по умолчанию Auto{Req,Prov} -
> > 'default', чтобы можно было писать 'AutoReqProv: default, perl'
> > или 'AutoReqProv: default, noshell';
>
> Написано ведь в /usr/share/doc/rpm-3.0.6/README.ipl, строка 52:
> + yes, true - enable lookup using default methods (see rcfiles for details).
>
> Пример использования (ncurses.spec):
> AutoReq: yes, noshell
>
> Добавить еще один синоним? :)
Ну, как semantic sugar :) Можно и обойтись, конечно.
> > - реализовать подстановку переменной окружения RPM_PERL_LIB_PATH для
> > perl.prov из макроса.
>
> А так эта переменная до скрипта не доходит?
Где прикажете ее устанавливать? Если извне пакета, то я так не играю :)
--
Stay tuned,
MhZ mailto:mookid@sigent.ru
-----------
Never buy what you do not want because it is cheap; it will be dear to you.
-- Thomas Jefferson
_______________________________________________
Devel mailing list
Devel@linux.iplabs.ru
http://www.logic.ru/mailman/listinfo/devel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [devel] autodeps
2000-11-25 18:18 ` Mikhail Zabaluev
@ 2000-11-26 23:59 ` Dmitry V. Levin
2000-11-27 11:12 ` Mikhail Zabaluev
0 siblings, 1 reply; 5+ messages in thread
From: Dmitry V. Levin @ 2000-11-26 23:59 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 3058 bytes --]
On Sat, Nov 25, 2000 at 09:18:48PM +0300, Mikhail Zabaluev wrote:
> > > Обнаружил, в чем проблема с 'AutoReqProv: perl' в rpm. Скрипт
> > > find-provides слишком полагается на суждение программы file о том, что
> > > есть perl script. Та, на самом деле, почти никогда не скажет такого о
> > > модуле, который не начинается со строки типа '#!/usr/bin/perl'.
> > > file-3.33-1mdk вообще считает многие модули какими-то файлами для
> > > palmtop'а Newton, даже не текстовыми! Пришлось отучать.
> >
> > А не станет ли теперь perl-файлов больше, чем есть на самом деле?
> > Слабо file-3.33 зафиксить? :)
>
> Если и будут какие-то левые файлы, проверки на синтаксис в скриптах
> достаточно тщательные. Единственная актуальная возможность ложного
> срабатывания - это если в библиотечных каталогах Perl вдруг окажутся
> файлы с суффиксами .pl, .pm или .ph, не являющиеся perl-скриптами - тогда
> perl.prov запишет их в provides. Представить себе такое я не могу.
> Насчет file и magic будем посмотреть. Конечно, такие одиозные случаи, как
> "package - значит, пакет для Newton", нужно лечить.
Поищем доктора? :)
> > > Прилагаю патч для find-{provides,requires} и снова perl.prov - там нужно
> > > было добавить содержимое RPM_BUILD_ROOT ко всем путям поиска.
> > >
> > > Следует заметить, что скриптам perl.prov и perl.req лучше давать весь
> > > список файлов зараз - так _намного_ быстрее.
> >
> > А как быть с именами файлов, содержащими символы из IFS?
>
> Подавайте на стандартный ввод как отдельные строки. Думаю, никому не
> придет в голову включать line feed в имя файла.
Так он принимает и stdin?
Действительно, в комментарии об этом написано.
Ok, так и будет.
> > > Еще есть предложения:
> > > - добавить еще один псевдоним для значения по умолчанию Auto{Req,Prov} -
> > > 'default', чтобы можно было писать 'AutoReqProv: default, perl'
> > > или 'AutoReqProv: default, noshell';
> >
> > Написано ведь в /usr/share/doc/rpm-3.0.6/README.ipl, строка 52:
> > + yes, true - enable lookup using default methods (see rcfiles for details).
> >
> > Пример использования (ncurses.spec):
> > AutoReq: yes, noshell
> >
> > Добавить еще один синоним? :)
>
> Ну, как semantic sugar :) Можно и обойтись, конечно.
ok.
> > > - реализовать подстановку переменной окружения RPM_PERL_LIB_PATH для
> > > perl.prov из макроса.
> >
> > А так эта переменная до скрипта не доходит?
>
> Где прикажете ее устанавливать? Если извне пакета, то я так не играю :)
Тогда предлагайте синтаксис (имена макросов, которые это будут делать).
Regards,
Dmitry
+-------------------------------------------------------------------------+
Dmitry V. Levin mailto://ldv@fandra.org
Software Engineer PGP pubkey http://www.fandra.org/users/ldv/pgpkeys.html
IPLabs Linux Team http://linux.iplabs.ru
Fandra Project http://www.fandra.org
+-------------------------------------------------------------------------+
UNIX is user friendly. It's just very selective about who it's friends are.
[-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [devel] autodeps
2000-11-26 23:59 ` Dmitry V. Levin
@ 2000-11-27 11:12 ` Mikhail Zabaluev
0 siblings, 0 replies; 5+ messages in thread
From: Mikhail Zabaluev @ 2000-11-27 11:12 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 1278 bytes --]
Hello Dmitry,
On Mon, Nov 27, 2000 at 02:59 +0300, Dmitry V. Levin wrote:
>
> > Если и будут какие-то левые файлы, проверки на синтаксис в скриптах
> > достаточно тщательные. Единственная актуальная возможность ложного
> > срабатывания - это если в библиотечных каталогах Perl вдруг окажутся
> > файлы с суффиксами .pl, .pm или .ph, не являющиеся perl-скриптами - тогда
> > perl.prov запишет их в provides. Представить себе такое я не могу.
> > Насчет file и magic будем посмотреть. Конечно, такие одиозные случаи, как
> > "package - значит, пакет для Newton", нужно лечить.
>
> Поищем доктора? :)
Обойдемся примочками, см. attachment :)
> > > > - реализовать подстановку переменной окружения RPM_PERL_LIB_PATH для
> > > > perl.prov из макроса.
> > >
> > > А так эта переменная до скрипта не доходит?
> >
> > Где прикажете ее устанавливать? Если извне пакета, то я так не играю :)
> Тогда предлагайте синтаксис (имена макросов, которые это будут делать).
%define perl_lib_path /path1 /path2
Варианты разделителей - whitespace, запятые, двоеточия.
--
Stay tuned,
MhZ mailto:mookid@sigent.ru
-----------
modem, adj.:
Up-to-date, new-fangled, as in "Thoroughly Modem Millie." An
unfortunate byproduct of kerning.
[That's sic!]
[-- Attachment #2: file-3.33-newton.patch --]
[-- Type: text/plain, Size: 724 bytes --]
--- magic.orig Fri Nov 24 20:37:55 2000
+++ magic Mon Nov 27 14:03:34 2000
@@ -285,9 +285,15 @@
# magic for Newton PDA package formats
# from Ruda Moura <ruda@helllabs.org>
-0 string package Newton package,
->7 byte 48 NOS 1.x,
->7 byte 49 NOS 2.x,
+# fixed by Mikhail Zabaluev <mookid@sigent.ru>
+0 string package0 Newton package, NOS 1.x,
+>12 belong &0x80000000 AutoRemove,
+>12 belong &0x40000000 CopyProtect,
+>12 belong &0x10000000 NoCompression,
+>12 belong &0x04000000 Relocation,
+>12 belong &0x02000000 UseFasterCompression,
+>16 belong x version %d
+0 string package1 Newton package, NOS 2.x,
>12 belong &0x80000000 AutoRemove,
>12 belong &0x40000000 CopyProtect,
>12 belong &0x10000000 NoCompression,
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2000-11-27 11:12 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-11-24 21:07 [devel] autodeps Mikhail Zabaluev
2000-11-25 16:00 ` Dmitry V. Levin
2000-11-25 18:18 ` Mikhail Zabaluev
2000-11-26 23:59 ` Dmitry V. Levin
2000-11-27 11:12 ` Mikhail Zabaluev
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