[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