From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on sa.int.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00, RCVD_IN_SORBS_WEB,SPF_PASS autolearn=no version=3.2.5 Date: Sun, 6 Nov 2011 18:57:02 +0200 From: Igor Vlasenko To: devel@lists.altlinux.org Message-ID: <20111106165701.GA23956@dad.imath.kiev.ua> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.5.21 (2010-09-15) X-imath-kiev-ua-MailScanner-Information: Please contact the ISP for more information X-imath-kiev-ua-MailScanner-ID: A923D4B001D.AE604 X-imath-kiev-ua-MailScanner: Found to be clean X-imath-kiev-ua-MailScanner-From: vlasenko@imath.kiev.ua Subject: [devel] I: embedded language for src.rpm/spec file editing (part III) X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 06 Nov 2011 16:57:10 -0000 Archived-At: List-Archive: List-Post: Уважаемые коллеги, продолжение вводной документации. === Работаем с секциями === ==== Работа с тегами ==== Методы 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'(?subst_body(qr'(?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.