[devel] I: embedded language for src.rpm/spec file editing (part III)
Igor Vlasenko
vlasenko на imath.kiev.ua
Вс Ноя 6 16:57:02 UTC 2011
Уважаемые коллеги, продолжение вводной документации.
=== Работаем с секциями ===
==== Работа с тегами ====
Методы get_tag/set_tag/clear_tag позволяют работать с тегами (ключевые
слова, оканчивающиеся на ":" : Name, Version, Release, Source3, ...).
У get_tag есть опция RAW=>1; с этой опцией get_tag возвращает значение
так, как оно записано в spec-файле, без нее - с раскрытыми макросами.
Пример: добавить путь из тега URL: в тег Source:
(если в spec-файлe написано Source0:, то добавлено будет в Source0:)
use File::Basename;
push @SPECHOOKS,
sub {
my ($spec, $parent) = @_;
my $section=$spec->get_main_section;
my $urlprefix=dirname($section->get_tag('URL', RAW=>1));
$section->set_tag('Source',$urlprefix.'/'.$section->get_tag('Source', RAW=>1));
};
==== Работа с телом секции ====
* Метод push_body нам уже знаком, аккуратно вставить в конец секции,
отступая от конца пустые строки, условные макросы %if,...
* Метод unshift_body: вставить в начало секции, после заголовка секции.
Пример: вставить в spec-файл %define _unpackaged_files_terminate_build 1.
* Метод match_body: проверить, не встречается ли в секции заданное
регулярное выражение.
Пример: Если в спек-файле не определен макрос
_unpackaged_files_terminate_build, добавить его.
push @SPECHOOKS,
sub {
my ($spec, $parent) = @_;
my $section=$spec->get_main_section;
$section->unshift_body('# better safe than sorry
%define _unpackaged_files_terminate_build 1
') unless $section->match(qr'\%define\s+_unpackaged_files_terminate_build');
};
* Метод subst_body: заменить регулярное выражение old text новым
текстом new text во всех строчках данной секции.
$section->subst_body(qr'old text','new text');
Пример: поменять во всех секциях, кроме %changelog, %{macros1} на %{macros2}.
push @SPECHOOKS,
sub {
my ($spec, $parent) = @_;
foreach my $section ($spec->get_sections) {
next if $section->get_type eq 'changelog';
$section->subst_body(qr'(?<!%)\%{macros1}','%{macros2}');
$section->subst_body(qr'(?<!%)\%macros1','%macros2');
}
};
* Метод subst_body_if: заменить регулярное выражение old text новым
текстом new text в строчках данной секции, которые подпадают под
регулярное выражение 'anchor'.
$section->subst_body_if(qr'anchor', qr'old text','new text');
Пример: поменять во всех секциях package во всех тегах Requires:
и BuildRequires: bar-devel на libbar2-devel
push @SPECHOOKS,
sub {
my ($spec, $parent) = @_;
foreach my $section ($spec->get_sections) {
next if $section->get_type ne 'package';
$section->subst_body_if(qr'Requires:',qr'bar-devel','libbar2-devel');
}
};
* Метод exclude_body: убрать из секции строку, которая попадает под
заданное регулярное выражение.
Пример: убрать из секции %post устаревший макрос %update_desktopdb
$spec->get_section('post','')->exclude_body(qr'\%update_desktopdb');
Для пользователей, которые хорошо знакомы с perl, есть методы
map_body и visit_body. Аргументом для них является ссылка на функцию,
в которую метод построчно передает тело секции в специальной
переменной perl $_.
* Метод map_body -- функция пользователя возвращает измененную строку
в той же специальной переменной perl $_, в которой было оригинальное значение.
Пример: реализация subst_body_if через map_body
$section->map_body(sub {s/old text/new text/ if /anchor/});
* Метод visit_body -- то же, что и map_body, но возвращаемые значения
игнорируются, тело секции не меняется.
Пример: реализация match_body через visit_body
my $match_found=0;
$section->visit_body(sub {$match_found=1 if /pattern/});
====
Это, конечно, не вся функциональность.
API еще в разработке, и я упомянул только самую стабильную его часть.
Но представление о возможностях и первое знакомство это введение дает.
--
Dr. Igor Vlasenko
--------------------
Topology Department
Institute of Math
Kiev, Ukraine
--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Подробная информация о списке рассылки Devel