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