ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Igor Vlasenko <vlasenko@imath.kiev.ua>
To: devel@lists.altlinux.org
Subject: [devel] I: embedded language for src.rpm/spec file editing (part III)
Date: Sun, 6 Nov 2011 18:57:02 +0200
Message-ID: <20111106165701.GA23956@dad.imath.kiev.ua> (raw)

Уважаемые коллеги, продолжение вводной документации.

=== Работаем с секциями ===

==== Работа с тегами ====

Методы 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.



                 reply	other threads:[~2011-11-06 16:57 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=20111106165701.GA23956@dad.imath.kiev.ua \
    --to=vlasenko@imath.kiev.ua \
    --cc=devel@lists.altlinux.org \
    /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