From f8a24e0ba6f0a677b7b4626b6a1085ba966b0959 Mon Sep 17 00:00:00 2001 From: Marcin Krol Date: Thu, 29 Oct 2020 22:29:53 +0100 Subject: [PATCH] - merged PLD changes --- adapter.awk | 2327 ------------------------------------------ adapter.sh | 325 ------ bash-prompt.sh | 121 +++ builder.sh | 638 ++++++------ dropin | 4 + kde4send2builders.sh | 205 ---- pldnotify.awk | 788 -------------- relup.sh | 27 +- repackage.sh | 2 +- rpm-build-tools.spec | 37 +- shrc.sh | 252 ++--- teeboth | 2 +- 12 files changed, 576 insertions(+), 4152 deletions(-) delete mode 100644 adapter.awk delete mode 100755 adapter.sh create mode 100644 bash-prompt.sh create mode 100755 dropin delete mode 100755 kde4send2builders.sh delete mode 100755 pldnotify.awk diff --git a/adapter.awk b/adapter.awk deleted file mode 100644 index adbe5ae..0000000 --- a/adapter.awk +++ /dev/null @@ -1,2327 +0,0 @@ -#!/usr/bin/gawk -f -# -# Adapter adapts .spec files for PLD Linux. -# -# Copyright (C) 1999-2013 PLD-Team -# Authors: -# Michał Kuratczyk -# Sebastian Zagrodzki -# Tomasz Kłoczko -# Artur Frysiak -# Michal Kochanowicz -# Jakub Bogusz -# Elan Ruusamäe -# -# See git log adapter{,.awk} for list of contributors -# -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # - -# TODO -# - really long sourceX make preamble sorting totally fcked up (try snake.spec r1.1) -# - parse ../PLD-doc/BuildRequires.txt and setup proper BR epoches? -# - add "-nc" option to skip CVS interaction -# - sort Summary(XX) -# - sort Requires, BuildRequires -# - check if %description (lang=C) contains 8bit -# - desc wrapping is totally fucked up on global.spec,1.25, dosemu.spec,1.115- -# - it should change: /%source([0-9]+)/i to %{SOURCE\1} -# - extra quote on LDFLAGS line: https://bugs.launchpad.net/pld-linux/+bug/385836 -# - %{with_foo:%attr()...} gets converted to %attr() %{with_foo:...} [vlc.spec] -# - 'R: foo ' (with traliling space) gets coverted to "R: foo\nR: " [vlc.spec @ 1.199 ] - -BEGIN { - RPM_SECTIONS = "package|build|changelog|clean|description|install|post|posttrans|postun|pre|prep|pretrans|preun|triggerin|triggerpostun|triggerun|verifyscript|check" - SECTIONS = "^%(" RPM_SECTIONS ")" - - rev = "1.514" - VERSION = "0.36/" rev - - PREAMBLE_TAGS = "(R|BR|Summary|Name|Version|Release|Epoch|License|Group|URL|BuildArch|BuildRoot|Obsoletes|Conflicts|Provides|ExclusiveArch|ExcludeArch|Pre[Rr]eq|(Build)?Requires|Suggests|Auto(Req|Prov))" - - usedigest = 0 # Enable to switch to rpm 4.4.6+ md5 digests - - preamble = 1 # Is it part of preamble? Default - yes - bod = 0 # Beginning of %description - tw = 70 # Descriptions width - - b_idx = 0 # index of BR/R arrays - BR_count = 0 # number of additional BuildRequires - - # If variable removed, then 1 (for removing it from export) - removed["LDFLAGS"] = 0 - removed["CFLAGS"] = 0 - removed["CXXFLAGS"] = 0 - - # If 1, we are inside of comment block (started with /^#%/) - comment_block = 0 - - import_rpm_macros() - - packages_dir = topdir - groups_file = packages_dir "/../rpm-build-tools/rpm.groups" - - system("[ -d ../PLD-doc ] && cd ../PLD-doc && ([ -f BuildRequires.txt ] || cvs up BuildRequires.txt >/dev/null)"); -} - -# If the latest line matched /%files/ -defattr == 1 { - if (ENVIRON["SKIP_DEFATTR"] != 1) { - if ($0 !~ /defattr/) { # If no %defattr - print "%defattr(644,root,root,755)" # Add it - } else { - $0 = "%defattr(644,root,root,755)" # Correct mistakes (if any) - } - } - defattr = 0 -} - -# call mktemp(1) and return the value -function mktemp(template, tmp) { - "mktemp " template | getline tmp - return tmp -} - -function b_makekey(a, b, s) { - s = a "" b; - # kill bcond - gsub(/[#%]+{[!?]+[_a-zA-Z0-9]+:/, "", s); - - # kill commented out items - gsub(/^#[ \t]*/, "", s); - - # force order - gsub(/^Summary\(/, "11Summary(", s); - gsub(/^Summary/, "10Summary", s); - - gsub(/^Name/, "2Name", s); - gsub(/^Version/, "3Version", s); - gsub(/^Release/, "4Release", s); - gsub(/^Epoch/, "5Epoch", s); - gsub(/^License/, "5License", s); - gsub(/^Group/, "6Group", s); - gsub(/^URL/, "7URL", s); - - gsub(/^BuildRequires/, "B1BuildRequires", s); - gsub(/^BuildConflicts/, "B2BuildConflicts", s); - - gsub(/^Suggests/, "X1Suggests", s); - gsub(/^Provides/, "X2Provides", s); - gsub(/^Obsoletes/, "X3Obsoletes", s); - gsub(/^Conflicts/, "X4Conflicts", s); - gsub(/^BuildArch/, "X5BuildArch", s); - gsub(/^ExclusiveArch/, "X6ExclusiveArch", s); - gsub(/^ExcludeArch/, "X7ExcludeArch", s); - gsub(/^BuildRoot/, "X9BuildRoot", s); - - gsub(/^AutoProv/, "Xx1AutoProv", s); - gsub(/^AutoReq/, "Xx2AutoReq", s); - -# printf("%s -> %s\n", a""b, s); - return s; -} - -# Comments -/^#/ && (description == 0) { - if (/This file does not like to be adapterized!/) { - print # print this message - while (getline) # print the rest of spec as it is - print - do_not_touch_anything = 1 # do not touch anything in END() - exit(rc = 0) - } - - # Generally, comments are printed without touching - sub(/[ \t]+$/, "") - - if (/#[ \t]*Source.*md5/) { - if (usedigest == 1) { - sub(/^#[ \t]*Source/, "BuildRequires:\tdigest(%SOURCE", $0) - sub(/-md5[ \t]*:[ \t]*/, ") = ", $0) - } - print $0 - next - } -} - -/^%define/ { - # Remove defining _applnkdir (this macro has been included in rpm-3.0.4) - if ($2 == "_applnkdir") { - next - } - - # FIXME: this section will likely never match after cvs->git migration - if ($2 == "date") { - if (did_files == 0) { - print "%files" - print "" - did_files = 1 - } - } - - # Do not add %define of _prefix if it already is. - if ($2 ~ /^_prefix/) { - sub("^"prefix, $3, bindir) - sub("^"prefix, $3, sbindir) - sub("^"prefix, $3, libdir) - sub("^"prefix, $3, datadir) - sub("^"prefix, $3, includedir) - prefix = $3 - } - - if ($2 ~ /_bindir/ && !/_sbindir/) - bindir = $3 - if ($2 ~ /_sbindir/) - sbindir = $3 - if ($2 ~ /_libdir/) { - if ($3 ~ /^%\(/) { - # TODO: should escape for latter checks like: ($c ~ sysconfdir "/{?cron.") - libdir = "%%%%%%%%%%%%%%" - } else { - libdir = $3 - } - } - if ($2 ~ /_sysconfdir/) { - if ($3 ~ /^%\(/) { - # TODO: should escape for latter checks like: ($c ~ sysconfdir "/{?cron.") - sysconfdir = "%%%%%%%%%%%%%%" - } else { - sysconfdir = $3 - } - } - if ($2 ~ /_datadir/) { - if ($3 ~ /^%\(/) { - # TODO: should escape for latter checks like: ($c ~ sysconfdir "/{?cron.") - datadir = "%%%%%%%%%%%%%%" - } else { - datadir = $3 - } - } - if ($2 ~ /_includedir/) - includedir = $3 - if ($2 ~ /_mandir/) - mandir = $3 - if ($2 ~ /_infodir/) - infodir = $3 - if ($2 ~ /_docdir/) - docdir = $3 - - # version related macros - if ($2 ~ /^_beta$/) - _beta = $3 - if ($2 ~ /^_rc$/) - _rc = $3 - if ($2 ~ /^_pre$/) - _pre = $3 - if ($2 ~ /^_snap$/) - _snap = $3 - if ($2 ~ /^subver$/) - subver = $3 - - # these are used usually when adapterizing external spec - if ($2 ~ /^name$/) - name = $3 - if ($2 ~ /^version$/) - version = $3 - if ($2 ~ /^release$/) - release = $3 - - if ($2 ~ /^mod_name$/) - mod_name = $3 - if ($2 ~ /^_?pearname$/) - pearname = $3 - if ($2 ~ /^_class$/) - pear_class = $3 - if ($2 ~ /^_subclass$/) - pear_subclass = $3 - - # kill the _class and _subclass pear macros - if ($2 == "_pearname" || $2 == "pearname") { - if (pear_class) { - gsub("%{_class}", pear_class, $3); - } - if (pear_subclass) { - gsub("%{_subclass}", pear_subclass, $3); - } - } - - sub(/[ \t]+$/, ""); - # do nothing further, otherwise adapter thinks we're at preamble - print - next -} - -# Obsolete -/^%include.*\/usr\/lib\/rpm\/macros\.python$/ { - next -} - -################ -# %description # -################ -/^%description/, (!/^%description/ && $0 ~ SECTIONS) { - preamble = 0 - - if (/^%description/) { - bod++ - format_line = "" - format_indent = -1 - } - - # Format description - if (ENVIRON["SKIP_DESC"] != 1 && description == 1 && !/^%[a-z]+/ && !/^%description/) { - if (/^[ \t]*$/) { - format_flush(format_line, format_indent) - print "" - format_line = "" - format_indent = -1 - } else if (/^[ \t]*[-\*][ \t]*/) { - format_flush(format_line, format_indent) - match($0, /^[ \t]*/) - format_indent = RLENGTH - match($0, /^[ \t]*[-\*][ \t]/) - format_line = substr($0, RLENGTH) - } else - format_line = format_line " " $0 - next - } - - if (/^%[a-z]+/ && (!/^%description/ || bod == 2)) { - if (NF > 3 && $2 == "-l") { - ll = $1 - for (i = 4; i <= NF; i++) - ll = ll " " $i - $0 = ll " -l " $3 - } - format_flush(format_line, format_indent) - if (bod == 2) { - bod = 1 - description = 1 - } else { - bod = 0 - description = 0 - } - } else - description = 1 -} - -######### -# %prep # -######### -/^%prep/, (!/^%prep/ && $0 ~ SECTIONS) { - preamble = 0 - did_prep = 1 - - use_macros() - - # Add '-q' to %setup - if (/^%setup/ && !/-q/) { - sub(/^%setup/, "%setup -q") - } - - if (/^%setup/ && name != "setup") { - $0 = fixedsub(name, "%{name}", $0); - $0 = fixedsub(version, "%{version}", $0); - if (_beta) { - $0 = fixedsub(_beta, "%{_beta}", $0); - } - if (_rc) { - $0 = fixedsub(_rc, "%{_rc}", $0); - } - if (_pre) { - $0 = fixedsub(_pre, "%{_pre}", $0); - } - if (_snap) { - $0 = fixedsub(_snap, "%{_snap}", $0); - } - if (subver) { - $0 = fixedsub(subver, "%{subver}", $0); - } - } - - if (/^%setup/ && /-n %{name}-%{version}( |$)/) { - $0 = fixedsub(" -n %{name}-%{version}", "", $0) - } - sub("^%patch ", "%patch0 "); - - # fedora extras - if (/^%apply/) { - sub("^%apply -n", "%patch"); - } - - # invalid in %prep - sub("^rm -rf \$RPM_BUILD_ROOT.*", ""); -} - -########## -# %build # -########## -/^%build/, (!/^%build/ && $0 ~ SECTIONS) { - preamble = 0 - - if (did_prep == 0) { - print "%prep" - print "" - did_prep = 1 - } - - use_macros() - use_tabs() - - if (/^automake$/) - sub(/$/, " -a -c") - - if (/LDFLAGS/) { - if (/LDFLAGS="-s"/) { - removed["LDFLAGS"] = 1 - next - } else { - split($0, tmp, "LDFLAGS=") - count = split(tmp[2], flags, "\"") - if (flags[1] != "" && flags[1] !~ "!?debug") { - sub(/-s[" ]?/, "%{rpmldflags} ", flags[1]) - $0 = tmp[1] line[1] "LDFLAGS=" flags[1] "\"" - for (i = 2; i < count; i++) - $0 = $0 flags[i] "\"" - } - } - } - - if (/CFLAGS=/) - if (cflags("CFLAGS") == 0) - next - - if (/CXXFLAGS=/) - if (cflags("CXXFLAGS") == 0) - next - - if (/^export /) { - if (removed["LDFLAGS"]) - sub(" LDFLAGS", "") - if (removed["CFLAGS"]) - sub(" CFLAGS", "") - if (removed["CXXFLAGS"]) - sub(" CXXFLAGS", "") - # Is there still something? - if (/^export[ ]*$/) - next - } - - # quote CC - if (/CC=%{__cc} /) { - sub("CC=%{__cc}", "CC=\"%{__cc}\"") - } - - # use PLD Linux macros - $0 = fixedsub("glib-gettextize --copy --force","%{__glib_gettextize}", $0); - $0 = fixedsub("intltoolize --copy --force", "%{__intltoolize}", $0); - $0 = fixedsub("automake --add-missing --copy", "%{__automake}", $0); - $0 = fixedsub("automake -a --foreign --copy", "%{__automake}", $0); - $0 = fixedsub("automake -a -c --foreign", "%{__automake}", $0); - $0 = fixedsub("automake -a -c", "%{__automake}", $0); - $0 = fixedsub("libtoolize --force --automake --copy", "%{__libtoolize}", $0); - $0 = fixedsub("libtoolize -c -f --automake", "%{__libtoolize}", $0); - - sub(/^aclocal$/, "%{__aclocal}"); - sub(/^autoheader$/, "%{__autoheader}"); - sub(/^autoconf$/, "%{__autoconf}"); - sub(/^automake$/, "%{__automake}"); - sub(/^libtoolize$/, "%{__libtoolize}"); - - # atrpms - $0 = fixedsub("%perl_configure", "%{__perl} Makefile.PL \\\n\tINSTALLDIRS=vendor", $0); - $0 = fixedsub("%perl_makecheck", "%{?with_tests:%{__make} test}", $0); - - # alt linux - $0 = fixedsub("%make_build", "%{__make}", $0); -} - -########## -# %clean # -########## -/^%clean/, (!/^%clean/ && $0 ~ SECTIONS) { - did_clean = 1 - - use_macros() -} - -############ -# %install # -############ -/^%install/, (!/^%install/ && $0 ~ SECTIONS) { - - preamble = 0 - - # foreign rpms - sub("^%{__rm} -rf %{buildroot}", "rm -rf $RPM_BUILD_ROOT") - sub("%buildroot", "$RPM_BUILD_ROOT"); - sub("%{buildroot}", "$RPM_BUILD_ROOT"); - - if (/^[ \t]*rm([ \t]+-[rf]+)*[ \t]+(\${?RPM_BUILD_ROOT}?|%{?buildroot}?)/ && did_rmroot==0) { - did_rmroot=1 - print "rm -rf $RPM_BUILD_ROOT" - next - } - - if (!/^(#?[ \t]*)$/ && !/^%install/ && did_rmroot==0) { - print "rm -rf $RPM_BUILD_ROOT" - did_rmroot=1 - } - - if (tmpdir) { - buildroot = tmpdir "/" name "-" version "-root-" ENVIRON["USER"] - gsub(buildroot, "$RPM_BUILD_ROOT") - } - - if (!/%{_lib}/) { - sub("\$RPM_BUILD_ROOT/%", "$RPM_BUILD_ROOT%") - } - - use_macros() - - # 'install -d' instead 'mkdir -p' - if (/mkdir -p/) - sub(/mkdir -p/, "install -d") - - # cp -a already implies cp -r - sub(/^cp -ar/, "cp -a") - - # No '-u root' or '-g root' for 'install' - if (/^install/ && /-[ug][ \t]*root/) - gsub(/-[ug][ \t]*root /, "") - - if (/^install/ && /-m[ \t]*[0-9]+/) - gsub(/-m[ \t]*[0-9]+ /, "") - - # No lines contain 'chown' or 'chgrp' if owner/group is 'root' - if (($1 ~ /chown/ && $2 ~ /root\.root/) || ($1 ~ /chgrp/ && $2 ~ /root/)) - next - - # No lines contain 'chmod' if it sets the modes to '644' - if ($1 ~ /chmod/ && $2 ~ /644/) - next - - # atrpms - $0 = fixedsub("%perl_makeinstall", "%{__make} pure_install \\\n\tDESTDIR=$RPM_BUILD_ROOT", $0); - - # alt linux - $0 = fixedsub("%make_install DESTDIR=$RPM_BUILD_ROOT install", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT", $0); -} - -########## -# %files # -########## -/^%files/, (!/^%files/ && $0 ~ SECTIONS) { - preamble = 0 - did_files = 1 - - if ($0 ~ /^%files/) - defattr = 1 - - if (!use_files_macros()) { - next - } -} - -########### -# SCRIPTS # -########### -/^%pre/, (!/^%pre/ && $0 ~ SECTIONS) { - preamble = 0 - - if (gsub("/usr/sbin/useradd", "%useradd")) { - sub(" 2> /dev/null \|\| :", ""); - sub(" >/dev/null 2>&1 \|\|:", ""); - } - - # fedora extras macros - if (/%__fe_useradd/) { - sub("%__fe_useradd", "%useradd -u "); - sub(" 2> /dev/null \|\| :", ""); - sub(" >/dev/null 2>&1 \|\|:", ""); - sub(" &>/dev/null \\|\\| :", ""); - } - - if (/%__fe_groupadd/) { - sub("%__fe_groupadd", "%groupadd -g "); - sub(" &>/dev/null \\|\\| :", ""); - } - - # %useradd and %groupadd may not be wrapped - if (/%(useradd|groupadd).*\\$/) { - a = $0; getline; - sub(/^[\s\t]*/, ""); - $0 = substr(a, 1, length(a) - 1) $0; - } - use_script_macros() -} - -/^%post/, (!/^%post/ && $0 ~ SECTIONS) { - preamble = 0 - - # fedora extras macros - sub("%__chkconfig", "/sbin/chkconfig"); - - sub("update-desktop-database &> /dev/null \\|\\| :", "%update_desktop_database"); - sub("touch --no-create %{_datadir}/icons/hicolor", "%update_icon_cache_post hicolor"); - sub("if \\[ -x %{_bindir}/gtk-update-icon-cache \\]; then\n\t%{_bindir}/gtk-update-icon-cache -q %{_datadir}/icons/hicolor \|\| :\nfi", ""); - - sub("export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`", "") - if (/gconftool-2 --makefile-install-rule/) { - sub("gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/", "%gconf_schema_install ") - sub("> /dev/null", ""); - } - - use_macros() -} -/^%preun/, (!/^%preun/ && $0 ~ SECTIONS) { - preamble = 0 - use_macros() -} -/^%postun/, (!/^%postun/ && $0 ~ SECTIONS) { - preamble = 0 - - # fedora extras macros - if (/%__fe_userdel|%__fe_groupdel/) { - sub("%__fe_groupdel", "%groupremove"); - sub("%__fe_userdel", "%userremove"); - sub(" &>/dev/null \\|\\| :", ""); - } - - use_script_macros() -} -/^%triggerin/, (!/^%triggerin/ && $0 ~ SECTIONS) { - preamble = 0 - use_script_macros() -} -/^%triggerun/, (!/^%triggerun/ && $0 ~ SECTIONS) { - preamble = 0 - use_script_macros() -} -/^%triggerpostun/, (!/^%triggerpostun/ && $0 ~ SECTIONS) { - preamble = 0 - use_script_macros() -} -/^%pretrans/, (!/^%pretrans/ && $0 ~ SECTIONS) { - preamble = 0 - use_script_macros() -} -/^%posttrans/, (!/^%posttrans/ && $0 ~ SECTIONS) { - preamble = 0 - use_script_macros() -} -/^%verifyscript/, (!/^%verifyscript/ && $0 ~ SECTIONS) { - preamble = 0 - use_script_macros() -} -/^%check/, (!/^%check/ && $0 ~ SECTIONS) { - preamble = 0 - use_script_macros() -} - -############# -# PREAMBLES # -############# -preamble == 1 { - # There should not be a space after the name of field - # and before the colon. - sub(/[ \t]*:/, ":") - - if (/^%perl_module_wo_prefix/) { - name = $2 - version = $3 - release = "0." fixedsub(".%{disttag}.at", "", $4) - } - - # deprecated. currently just resolves to name in $2 - if (/^%pyrequires_eq.+/) { - $1 = "Requires:"; - } - - # F<16 had requires(hint) - if (/^Requires\(hint\):/) { - $1 = "Suggests:"; - } - - field = tolower($1) - if (field ~ /summary:/ && !/etc\.$/ && !/Inc\.$/) { - sub(/\.$/, "", $0); - } - if (field ~ /group(\([^)]+\)):/) { - next - } - - if (field == "group:") { - format_preamble() - group = $0; - sub(/^[^ \t]*[ \t]*/, "", group); - group = replace_groupnames(group); - $0 = "Group:\t\t" group - - byl_plik_z_groupmi = 0 - byl_opis_grupy = 0 - while ((getline linia_grup < groups_file) > 0) { - byl_plik_z_groupmi = 1 - if (linia_grup == group) { - byl_opis_grupy = 1 - break - } - } - - if (!byl_plik_z_groupmi) - print "######\t\t" groups_file ": no such file" - else if (!byl_opis_grupy) - print "######\t\t" "Unknown group!" - - close(groups_file) - did_groups = 1 - } - - if (field == "prereq:") { - sub(/Pre[Rr]eq:/, "Requires:", $1); - } - - # split (build)requires, obsoletes on commas - if (field ~ /(obsoletes|requires|provides|conflicts|suggests):/ && NF > 2) { - value = substr($0, index($0, $2)); - $0 = format_requires($1, value); - } - - # BR: tar (and others) is to common (rpm-build requires it) - if (field == "buildrequires:") { - l = substr($0, index($0, $2)); - if (l == "awk" || - l == "binutils" || - l == "bzip2" || - l == "cpio" || - l == "diffutils" || - l == "elfutils" || - l == "fileutils" || - l == "findutils" || - l == "glibc-devel" || - l == "grep" || - l == "gzip" || - l == "make" || - l == "patch" || - l == "sed" || - l == "sh-utils" || - l == "tar" || - l == "textutils") { - next - } - - replace_requires(field); - } - - if (field == "requires:" || field ~ /^requires\(/) { - replace_requires(field); - } - - - # obsolete/unwanted tags - if (field ~ /vendor:|packager:|distribution:|docdir:|prefix:|icon:|author:|author-email:|metadata-version:/) { - next - } - - if (field ~ /buildroot:/) { - $0 = $1 "%{tmpdir}/%{name}-%{version}-root-%(id -u -n)" - did_build_root = 1 - } - - # Use "License" instead of "Copyright" if it is (L)GPL or BSD - if (field ~ /copyright:/ && $2 ~ /GPL|BSD/) { - $1 = "License:" - } - - # ease updating from debian .dsc - if (field ~ /homepage:/) { - $1 = "URL:" - } - - # suse - if (field ~ /recommends:/) { - $1 = "Suggests:" - } - - if ($3 == "==" && $1 !~ /%/) { - $3 = "=" - } - - if (field ~ /license:/) { - l = substr($0, index($0, $2)); - if (l == "Python Software Foundation License") { - l = "PSF" - } - if (l == "Apache License 2.0" || \ - l == "Apache 2.0" || \ - l == "Apache License Version 2.0" || \ - l == "Apache License, Version 2.0" || \ - l == "Apache Software License v2" || \ - l == "ASL 2.0" \ - ) { - l = "Apache v2.0" - } - if (l == "Apache Group License" || l == "Apache Software License" || l == "Apache License") { - l = "Apache" - } - if (l == "Apache-style License" || l == "Apache-style Software License") { - l = "Apache-like" - } - if (l == "Apache Software License 1.1" || l == "Apache 1.1") { - l = "Apache v1.1" - } - if (l == "GPLv2") { - l = "GPL v2" - } - if (l == "GPLv2+") { - l = "GPL v2+" - } - if (l == "GPL v2 or later") { - l = "GPL v2+" - } - if (l == "LGPL v2.0 only") { - l = "LGPL v2" - } - if (l == "LGPLv2+") { - l = "LGPL v2+" - } - if (l == "GPLv3") { - l = "GPL v3" - } - if (l == "GPLv3+") { - l = "GPL v3+" - } - if (l == "MPLv1.1") { - l = "MPL v1.1" - } - $0 = "License:\t" l; - } - - - if (field ~ /name:/) { - if ($2 == "%{name}" && name) { - $2 = name - } - name = $2 - name_seen = 1; - } - - if (field ~ /version:/) { - if ($2 == "%{version}" && version) { - $2 = version - } - version = $2 - version_seen = 1; - } - - if (field ~ /release:/) { - if ($2 == "%{release}" && release) { - $2 = release - } - sub(/%atrelease /, "0.", $0) - release = $2 - release_seen = 1; - } - - - if (field ~ /serial:/) - $1 = "Epoch:" - - if (field ~ /home-page:/) - $1 = "URL:" - - # proper caps - if (field ~ /^url:$/) - $1 = "URL:" - - if (field ~ /^patch/) - $1 = "Patch" substr(field, 6); - - if (field ~ /^description:$/) - $1 = "\n%description\n" - - # Use %{name} and %{version} in the filenames in "Source:" - if (field ~ /^source/ || field ~ /patch/) { - n = split($2, url, /\//) - if (url[n] ~ /\.gz$/) { - url[n+1] = ".gz" url[n+1] - sub(/\.gz$/,"",url[n]) - } - if (url[n] ~ /\.zip$/) { - url[n+1] = ".zip" url[n+1] - sub(/\.zip$/,"",url[n]) - } - if (url[n] ~ /\.tar$/) { - url[n+1] = ".tar" url[n+1] - sub(/\.tar$/,"",url[n]) - } - if (url[n] ~ /\.patch$/) { - url[n+1] = ".patch" url[n+1] - sub(/\.patch$/,"",url[n]) - } - if (url[n] ~ /\.bz2$/) { - url[n+1] = ".bz2" url[n+1] - sub(/\.bz2$/,"",url[n]) - } - if (url[n] ~ /\.logrotate$/) { - url[n+1] = ".logrotate" url[n+1] - sub(/\.logrotate$/,"",url[n]) - } - if (url[n] ~ /\.pamd$/) { - url[n+1] = ".pamd" url[n+1] - sub(/\.pamd$/,"",url[n]) - } - - # allow %{name} only in last url component - s = "" - for (i = 1; i <= n; i++) { - url[i] = fixedsub("%{name}", name, url[i]) - if (s) { - s = s "/" url[i] - } else { - s = url[i] - } - } - $2 = s url[n+1] - - filename = url[n] - if (name) { - url[n] = fixedsub(name, "%{name}", url[n]) - } - if (field ~ /source/) { - if (version) { - url[n] = fixedsub(version, "%{version}", url[n]) - } - if (_beta) { - url[n] = fixedsub(_beta, "%{_beta}", url[n]) - } - if (_rc) { - url[n] = fixedsub(_rc, "%{_rc}", url[n]) - } - if (_pre) { - url[n] = fixedsub(_pre, "%{_pre}", url[n]) - } - if (_snap) { - url[n] = fixedsub(_snap, "%{_snap}", url[n]) - } - if (subver) { - url[n] = fixedsub(subver, "%{subver}", url[n]) - } - } - # assigning to $2 kills preamble formatting - $2 = fixedsub(filename, url[n], $2) - - $2 = unify_url($2) - } - - - if (field ~ /^source:/) - $1 = "Source0:" - - if (field ~ /^patch:/) - $1 = "Patch0:" - - kill_preamble_macros(); - format_preamble() - - if (field ~ /requires/) { - # atrpms - $0 = fixedsub("%{eversion}", "%{epoch}:%{version}-%{release}", $0); - } -} - -/^%bcond_/ { - # do nothing - print - next -} - -# sort BR/R! -# -# NOTES: -# - mixing BR/R and anything else confuses this (all will be sorted together) -# so don't do that. -# - comments leading the BR/R can not be associated, -# so don't adapterize when the BR/R are mixed with comments -ENVIRON["SKIP_SORTBR"] != 1 && preamble == 1 && $0 ~ PREAMBLE_TAGS ":", $0 ~ PREAMBLE_TAGS ":"{ - if ($1 ~ /Pre[Rr]eq:/) { - sub(/Pre[Rr]eq:/, "Requires:", $1); - } - if ($1 == "BR:" ) { - $1 = "BuildRequires:" - } - if ($1 == "R:" ) { - $1 = "Requires:" - } - format_preamble() -# kill_preamble_macros(); # breaks tabbing - - b_idx++; - l = substr($0, index($0, $2)); - b_ktmp = b_makekey($1, l); - b_key[b_idx] = b_ktmp; - b_val[b_ktmp] = $0; - - next; -} - -preamble == 1 { - if (b_idx > 0) { - isort(b_key, b_idx); - for (i = 1; i <= b_idx; i++) { - v = b_val[b_key[i]]; - sub(/[ \t]+$/, "", v); - print "" v; - } - b_idx = 0 - } -} - -# main() ;-) -{ - preamble = 1 - - sub(/[ \t]+$/, "") - print - - if (name_seen == 0 && name) { - print "Name:\t\t" name - name_seen = 1 - } - - if (version_seen == 0 && version) { - print "Version:\t" version - version_seen = 1 - } - - if (release_seen == 0 && release) { - print "Release:\t" release - release_seen = 1 - } - - if (did_build_root == 0) { -# print "BuildRoot:\t%{tmpdir}/%{name}-%{version}-root-%(id -u -n)" - did_build_root = 1 - } - if (did_groups == 0) { -# print "Group:\t\tunknown" - did_groups = 1 - } -} - - -END { - if (do_not_touch_anything) { - exit(rc) - } - - # TODO: need to output these in proper place - if (BR_count > 0) { - for (i = 0; i <= BR_count; i++) { - print BR[i]; - } - } - - if (did_clean == 0) { - print "" - print "%clean" - print "rm -rf $RPM_BUILD_ROOT" - } -} - -# substitutes fixed strings (not regexps) -function fixedsub(s1,s2,t, ind) { - if (ind = index(t,s1)) - t = substr(t, 1, ind-1) s2 substr(t, ind+length(s1)) - return t -} - -# replace s with s2 if it equals to s1 -function replace(s, s1, s2) { - if (s == s1) { - return s2; - } else { - return s; - } -} - -# There should be one or two tabs after the colon. -function format_preamble() -{ - if (/^#/ || /^%bcond_with/) { - return; - } - sub(/:[ \t]*/, ":") - if (match($0, /[A-Za-z0-9(),#_ \t.-]+[ \t]*:[ \t]*/) == 1) { - if (RLENGTH < 8) { - sub(/:/, ":\t\t") - } else { - sub(/:/, ":\t") - } - } -} - -# Replace directly specified directories with macros -function use_macros() -{ - # -m, --skip-macros, --no-macros -- skip macros subst - if (ENVIRON["SKIP_MACROS"]) { - return - } - - # leave inline sed lines alone - if (/(%{__sed}|sed) -i -e/) { - return; - } - - sub("%{_defaultdocdir}", "%{_docdir}"); - sub("%{_datadir}/doc", "%{_docdir}"); - sub("%{_bindir}/perl", "%{__perl}"); - sub("%{_bindir}/python", "%{__python}"); - - gsub(infodir, "%{_infodir}") - - gsub(perl_sitearch, "%{perl_sitearch}") - gsub(perl_archlib, "%{perl_archlib}") - gsub(perl_privlib, "%{perl_privlib}") - gsub(perl_vendorlib, "%{perl_vendorlib}") - gsub(perl_vendorarch, "%{perl_vendorarch}") - gsub(perl_sitelib, "%{perl_sitelib}") - - gsub(py_sitescriptdir, "%{py_sitescriptdir}") - gsub(py_sitedir, "%{py_sitedir}") - gsub(py_scriptdir, "%{py_scriptdir}") - - gsub(py3_sitescriptdir, "%{py3_sitescriptdir}") - gsub(py3_sitedir, "%{py3_sitedir}") - gsub(py3_scriptdir, "%{py3_scriptdir}") - gsub("%{python3_sitelib}", "%{py3_sitescriptdir}") - gsub("%{python3_version}", "%{py3_ver}") - - gsub(ruby_archdir, "%{ruby_archdir}") - gsub(ruby_libdir, "%{ruby_libdir}") - - gsub(ruby_sitearchdir, "%{ruby_sitearchdir}") - gsub(ruby_sitelibdir, "%{ruby_sitelibdir}") - gsub(ruby_sitedir, "%{ruby_sitedir}") - gsub(ruby_vendorarchdir, "%{ruby_vendorarchdir}") - gsub(ruby_vendorlibdir, "%{ruby_vendorlibdir}") - gsub(ruby_vendordir, "%{ruby_vendordir}") - gsub(ruby_rubylibdir, "%{ruby_rubylibdir}") # deprecated - gsub(ruby_rdocdir, "%{ruby_rdocdir}") - gsub(ruby_ridir, "%{ruby_ridir}") - - gsub("%{_unitdir}", "%{systemdunitdir}") - gsub(systemdunitdir, "%{systemdunitdir}") - gsub(systemdtmpfilesdir, "%{systemdtmpfilesdir}") - - gsub("%{_datadir}/applications", "%{_desktopdir}") - gsub("%{_datadir}/pixmaps", "%{_pixmapsdir}") - gsub("%{_datadir}/java", "%{_javadir}") - - gsub("%{_libdir}/pkgconfig", "%{_pkgconfigdir}") - gsub(pkgconfigdir, "%{_pkgconfigdir}") - - gsub("%{_datadir}/pkgconfig", "%{_npkgconfigdir}") - gsub(npkgconfigdir, "%{_npkgconfigdir}") - - gsub("%{_datadir}/locale", "%{_localedir}") - gsub(localedir, "%{_localedir}") - - gsub(libdir, "%{_libdir}") - gsub(javadir, "%{_javadir}") - - gsub(bindir, "%{_bindir}") - gsub("%{prefix}/bin", "%{_bindir}") - if (prefix"/bin" == bindir) - gsub("%{_prefix}/bin", "%{_bindir}") - - for (c = 1; c <= NF; c++) { - if ($c ~ sbindir "/fix-info-dir") - continue; - if ($c ~ sbindir "/webapp") - continue; - if ($c ~ sbindir "/ldconfig") - continue; - if ($c ~ sbindir "/chsh") - continue; - if ($c ~ sbindir "/usermod") - continue; - if ($c ~ sbindir "/chkconfig") - continue; - if ($c ~ sbindir "/installzope(product|3package)") - continue; - gsub(sbindir, "%{_sbindir}", $c) - } - - gsub("%{prefix}/sbin", "%{_sbindir}") - if (prefix"/sbin" == sbindir) { - gsub("%{_prefix}/sbin", "%{_sbindir}") - } - - for (c = 1; c <= NF; c++) { - if ($c ~ sysconfdir "/{?cron.") - continue; - if ($c ~ sysconfdir "/{?crontab.d") - continue; - if ($c ~ sysconfdir "/{?env.d") - continue; - if ($c ~ sysconfdir "/{?modprobe.(d|conf)") - continue; - if ($c ~ sysconfdir "/{?udev") - continue; - if ($c ~ sysconfdir "/{?hotplug") - continue; - if ($c ~ sysconfdir "/{?logrotate.d") - continue; - if ($c ~ sysconfdir "/{?pam.d") - continue; - if ($c ~ sysconfdir "/{?profile.d") - continue; - if ($c ~ sysconfdir "/{?rc.d") - continue; - if ($c ~ sysconfdir "/{?security") - continue; - if ($c ~ sysconfdir "/{?skel") - continue; - if ($c ~ sysconfdir "/{?sysconfig") - continue; - if ($c ~ sysconfdir "/{?shrc.d") - continue; - if ($c ~ sysconfdir "/{?certs") - continue; - if ($c ~ sysconfdir "/{?X11") - continue; - if ($c ~ sysconfdir "/{?ld.so.conf.d") - continue; - if ($c ~ sysconfdir "/{?rpm") - continue; - if ($c ~ sysconfdir "/{?bash_completion.d") - continue; - if ($c ~ sysconfdir "/{?samba") - continue; - if ($c ~ sysconfdir "/{?xdg") - continue; - if ($c ~ sysconfdir "/shells") - continue; - if ($c ~ sysconfdir "/inittab") - continue; - if ($c ~ sysconfdir "/init") - continue; - if ($c ~ sysconfdir "/ppp") - continue; - if ($c ~ sysconfdir "/dbus-1") - continue; - if ($c ~ sysconfdir "/tmpwatch") - continue; - if ($c ~ sysconfdir "/acpi") - continue; - if ($c ~ sysconfdir "/apm") - continue; - if ($c ~ sysconfdir "/modules-load\.d") - continue; - gsub(sysconfdir, "%{_sysconfdir}", $c) - } - - gsub(docdir, "%{_docdir}") - - gsub(kdedocdir, "%{_kdedocdir}") - - gsub(gtkdocdir, "%{_gtkdocdir}") - gsub("%{_docdir}/gtk-doc/html", "%{_gtkdocdir}") - - gsub(php_pear_dir, "%{php_pear_dir}") - gsub(php_data_dir, "%{php_data_dir}") - - for (c = 1; c <= NF; c++) { - if ($c ~ datadir "/automake") - continue; - if ($c ~ datadir "/unsermake") - continue; - if ($c ~ datadir "/file/magic.mime") - continue; - gsub(datadir, "%{_datadir}", $c) - } - - gsub("%{prefix}/share", "%{_datadir}") - if (prefix"/share" == datadir) - gsub("%{_prefix}/share", "%{_datadir}") - - # CFLAGS="-I/usr/include/ncurses is usually correct. - if (!/-I\/usr\/include/) { - gsub(includedir, "%{_includedir}") - } - - gsub("%{prefix}/include", "%{_includedir}") - if (prefix"/include" == includedir) { - gsub("%{_prefix}/include", "%{_includedir}") - } - - gsub(mandir, "%{_mandir}") - if ($0 !~ "%{_datadir}/manual") { - gsub("%{_datadir}/man", "%{_mandir}") - } - gsub("%{_prefix}/share/man", "%{_mandir}") - gsub("%{prefix}/share/man", "%{_mandir}") - gsub("%{prefix}/man", "%{_mandir}") - gsub("%{_prefix}/man", "%{_mandir}") - - gsub(infodir, "%{_infodir}") - gsub("%{prefix}/info", "%{_infodir}") - gsub("%{_prefix}/info", "%{_infodir}") - - if (prefix !~ "/X11R6") { - gsub("%{_datadir}/aclocal", "%{_aclocaldir}") - } - - gsub(examplesdir, "%{_examplesdir}") - - if (prefix != "/") { - # leave --with-foo=/usr alone - if ($0 !~ "--with.*=.*" prefix) { - for (c = 1; c <= NF; c++) { - if ($c ~ prefix "/sbin/fix-info-dir") - continue; - if ($c ~ prefix "/sbin/webapp") - continue; - if ($c ~ prefix "/sbin/chsh") - continue; - if ($c ~ prefix "/sbin/usermod") - continue; - if ($c ~ prefix "/sbin/installzope(product|3package)") - continue; - if ($c ~ prefix "/share/automake") - continue; - if ($c ~ prefix "/share/unsermake") - continue; - if ($c ~ prefix "/lib/sendmail") - continue; - if ($c ~ prefix "/lib/pkgconfig") - continue; - - # CFLAGS="-I/usr..." is usually correct. - if (/-I\/usr/) - continue; - # same for LDFLAGS="-L/usr..." - if (/-L\/usr/) - continue; - - gsub(prefix, "%{_prefix}", $c) - } - } - gsub("%{prefix}", "%{_prefix}") - } - - # replace back - gsub("%{_includedir}/ncurses", "/usr/include/ncurses") - gsub("%{_includedir}/freetype", "/usr/include/freetype") - - gsub("%{PACKAGE_VERSION}", "%{version}") - gsub("%{PACKAGE_NAME}", "%{name}") - - gsub("^make$", "%{__make}") - gsub("^make ", "%{__make} ") - gsub("^gcc ", "%{__cc} ") - gsub("^rm --interactive=never ", "%{__rm} ") - - # fedora - gsub("%{ruby_sitearch}", "%{ruby_sitearchdir}") - gsub("%{python_sitearch}", "%{py_sitedir}") - gsub("%{python_sitelib}", "%{py_sitescriptdir}") - - # alt linux - gsub("%_man1dir", "%{_mandir}/man1") - - # mandrake specs - gsub("^%make$", "%{__make}") - gsub("^%make ", "%{__make} ") - gsub("^%makeinstall_std", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT") - gsub("^%{makeinstall}", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT") - gsub("^%makeinstall", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT") - gsub("^%{__rm} -rf %{buildroot}", "rm -rf $RPM_BUILD_ROOT") - gsub("^%{__install}", "install") - gsub("%optflags", "%{rpmcflags}") - gsub("%{compat_perl_vendorarch}", "%{perl_vendorarch}") - - gsub("^%{__make} install DESTDIR=\$RPM_BUILD_ROOT", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT") - gsub("^fix-info-dir$", "[ ! -x /usr/sbin/fix-info-dir ] || /usr/sbin/fix-info-dir -c %{_infodir} >/dev/null 2>\\&1") - $0 = fixedsub("%buildroot", "$RPM_BUILD_ROOT", $0) - $0 = fixedsub("%{buildroot}", "$RPM_BUILD_ROOT", $0) - $0 = fixedsub("CXXFLAGS=%{rpmcflags} %configure", "CXXFLAGS=%{rpmcflags}\n%configure", $0); - $0 = fixedsub("%__install", "install", $0); - - # split configure line to multiple lines - if (/%configure +$/) { - sub( / +$/, "" ); - } else if (/%configure / && !/\\$/) { - $0 = format_configure($0); - } - - gsub("%_bindir", "%{_bindir}") - gsub("%_datadir", "%{_datadir}") - gsub("%_iconsdir", "%{_iconsdir}") - gsub("%_sbindir", "%{_sbindir}") - gsub("%_mandir", "%{_mandir}") - gsub("%name", "%{name}") - gsub(/%__rm/, "rm"); - gsub(/%__mkdir_p/, "install -d"); - gsub(/%__cp/, "cp"); - gsub(/%__ln_s/, "ln -s"); - gsub(/%__sed/, "%{__sed}"); - gsub(/%__cat/, "cat"); - gsub(/%__chmod/, "chmod"); - - gsub("/usr/src/linux", "%{_kernelsrcdir}") - gsub("%{_prefix}/src/linux", "%{_kernelsrcdir}") - - if (/^ant / || /^%{ant}/) { - sub(/^ant/, "%ant") - sub(/^%{ant}/, "%ant") - add_br("BuildRequires: jpackage-utils"); - add_br("BuildRequires: rpmbuild(macros) >= 1.300"); - } - - $0 = fixedsub("%(%{__cc} -dumpversion)", "%{cc_version}", $0); - $0 = fixedsub("%(%{__cxx} -dumpversion)", "%{cxx_version}", $0); - - # kill the _class and _subclass pear macros - if (pear_class) { - gsub("%{_class}", pear_class); - } - if (pear_subclass) { - gsub("%{_subclass}", pear_subclass); - } -} - -function format_configure(line, n, a, s) { - n = split(line, a, / /); - s = a[1] " \\\n"; - for (i = 2; i <= n; i++) { - s = s "\t" a[i] " \\\n" - } - return s -} - - -# insertion sort of A[1..n] -# copied from mawk manual -function isort(A,n, i,j,hold) { - for (i = 2; i <= n; i++) { - hold = A[j = i] - while (A[j-1] > hold) { - j-- ; A[j+1] = A[j] - } - A[j] = hold - } - # sentinel A[0] = "" will be created if needed -} - - -function use_files_macros( i, n, t, a, l) -{ - use_macros() - - # skip comments - if (/^#/) { - return 1; - } - - sub("^%doc %{_mandir}", "%{_mandir}") - - gsub("^%{_sbindir}", "%attr(755,root,root) %{_sbindir}") - gsub("^%{_bindir}", "%attr(755,root,root) %{_bindir}") - - # uid/gid nobody is not valid in %files - if (/%attr([^)]*nobody[^)]*)/ && !/FIXME/) { - $0 = $0 " # FIXME nobody user/group can't own files! -adapter.awk" - } - - # s[gu]id programs with globs are evil - if (/%attr\([246]...,.*\*/ && !/FIXME/) { - $0 = $0 " # FIXME no globs for suid/sgid files" - } - - # replace back - gsub("%{_sysconfdir}/cron\.d", "/etc/cron.d") - gsub("%{_sysconfdir}/crontab\.d", "/etc/crontab.d") - gsub("%{_sysconfdir}/logrotate\.d", "/etc/logrotate.d") - gsub("%{_sysconfdir}/pam\.d", "/etc/pam.d") - gsub("%{_sysconfdir}/profile\.d", "/etc/profile.d") - gsub("%{_sysconfdir}/rc\.d", "/etc/rc.d") - gsub("%{_sysconfdir}/security", "/etc/security") - gsub("%{_sysconfdir}/skel", "/etc/skel") - gsub("%{_sysconfdir}/sysconfig", "/etc/sysconfig") - gsub("%{_sysconfdir}/certs", "/etc/certs") - gsub("%{_sysconfdir}/init.d", "/etc/init.d") - gsub("%{_sysconfdir}/dbus-1", "/etc/dbus-1") - gsub("%{_sysconfdir}/pki", "/etc/pki") - gsub("%{_sysconfdir}/tmpwatch", "/etc/tmpwatch") - - # /etc/init.d -> /etc/rc.d/init.d - if (!/^\/etc\/init\.d$/) { - gsub("/etc/init.d", "/etc/rc.d/init.d") - } - - if (/\/etc\/rc\.d\/init\.d\// && !/functions/) { - if (!/%attr.*\/etc\/rc\.d\/init\.d/) { - $0 = "%attr(754,root,root) " $0 - } - if (/^%attr.*\/etc\/rc\.d\/init\.d/ && !/^%attr\(754 *,/) { - gsub("^%attr\\(... *,", "%attr(754,"); - } - } - - if (/lib.+\.so\b/ && !/\.so$/ && !/^%attr.*/ && !/%exclude/) { - $0 = "%attr(755,root,root) " $0 - } - - if (/%{perl_vendorarch}.*\.so$/ && !/^%attr.*/) { - $0 = "%attr(755,root,root) " $0 - } - - # remove attrs from man pages - if (/%{_mandir}/ && /^%attr/) { - sub("^%attr\\(.*\\) *", ""); - } - - # /etc/sysconfig files - # %attr(640,root,root) %config(noreplace) %verify(not size mtime md5) /etc/sysconfig/* - # attr not required, allow default 644 attr - if (!/network-scripts/ && !/%dir/ && !/\.d$/ && !/functions/ && !/\/etc\/sysconfig\/wmstyle/) { - if (/\/etc\/sysconfig\// && /%config/ && !/%config\(noreplace/) { - gsub("%config", "%config(noreplace)") - } - - if (/\/etc\/sysconfig\// && !/%config\(noreplace/) { - $NF = "%config(noreplace) " $NF - } - - if (/\/etc\/sysconfig\// && /%attr\(755/) { - gsub("^%attr\\(... *,", "%attr(640,"); - } - - if (/\/etc\/sysconfig\// && !/%verify/) { - gsub("/etc/sysconfig", "%verify(not size mtime md5) /etc/sysconfig"); - } - } - - # kill leading zeros - if (/%attr\(0[1-9]/) { - gsub("%attr\\(0", "%attr(") - } - - # kill leading whitespace - gsub(/^ +/, ""); - - # kill default attrs - gsub(/%dir %attr\(755,root,root\)/, "%dir"); - gsub(/%attr\(755,root,root\) %dir/, "%dir"); - if (!/%dir/) { - gsub(/%attr\(644,root,root\) /, ""); - } - - # sort %verify attrs - if (match($0, /%verify\(not([^)]+)\)/)) { - t = substr($0, RSTART, RLENGTH) - # kill commas: %verify(not,md5,size,mtime) - gsub(/,/, " ", t); - - gsub(/^%verify\(not |\)$/, "", t) - n = split(t, a, / /) - isort(a, n) - - s = "%verify(not" - for (i = 1 ; i <= n; i++) { - s = s " " a[i] - } - s = s ")" - - gsub(/%verify\(not[^)]+\)/, s) - } - - if (/%{_mandir}/) { - gsub("\.gz$", "*") - gsub("%ext_man$", "*") - } - - # locale dir and no %lang -> bad - if (/%{_datadir}\/locale\/.*\// && !/%(dir|lang)/) { - $(NF + 1) = "# FIXME consider using %find_lang" - } - - # python egg-infos - if (match($0, "^%{py_site(script)?dir}/.+-py"py_ver".egg-info$")) { - # tests: - #%{py_sitedir}/*-py2.4.egg-info - #%{py_sitescriptdir}/GnuPGInterface-%{version}-py2.4.egg-info - #%{py_sitescriptdir}/python_mpd-%{version}-py2.4.egg-info - #%{py_sitescriptdir}/mechanize-0.1.6b-py2.4.egg-info - - l = index($0, "/"); - t = substr($0, 0, l); - s = substr($0, l + 1, RLENGTH - l - length("-py"py_ver".egg-info")); - if (match(s, "[^-]+$")) { - if (RSTART > 1) { - s = substr(s, 0, RSTART - 1); - } - print "%if \"%{py_ver}\" > \"2.4\"" - gsub(t "/.+.egg-info", t "/" s "-*.egg-info"); - print - print "%endif" - return 0; - } - } - - # atrpms - $0 = fixedsub("%{perl_man1dir}", "%{_mandir}/man1", $0); - $0 = fixedsub("%{perl_man3dir}", "%{_mandir}/man3", $0); - $0 = fixedsub("%{perl_bin}", "%{_bindir}", $0); - - gsub(libdir "/pkgconfig", "%{_pkgconfigdir}"); - gsub("%{_libdir}/pkgconfig", "%{_pkgconfigdir}"); - gsub("%{_prefix}/lib/pkgconfig", "%{_pkgconfigdir}"); - - gsub("%{_datadir}/applications", "%{_desktopdir}"); - gsub("%{_datadir}/icons", "%{_iconsdir}"); - gsub("%{_datadir}/pixmaps", "%{_pixmapsdir}"); - gsub("%{_datadir}/pear", "%{php_pear_dir}"); - gsub("%{_datadir}/php", "%{php_data_dir}"); - - return 1 -} - -function use_script_macros() -{ - if (gsub("/sbin/service", "%service")) { - sub(" >/dev/null 2>&1 \|\|:", ""); - sub(" 2> /dev/null \|\| :", ""); - } -} - -function fill(ch, n, i) { - for (i = 0; i < n; i++) - printf("%c", ch) -} - -function format_flush(line, indent, newline, word, first_word) { - first_word = 1 - if (format_indent == -1) - newline = "" - else - newline = fill(" ", format_indent) "- " - - while (match(line, /[^\t ]+/)) { - word = substr(line, RSTART, RLENGTH) - if (length(newline) + length(word) + 1 > tw) { - print newline - - if (format_indent == -1) - newline = "" - else - newline = fill(" ", format_indent + 2) - first_word = 1 - } - - if (first_word) { - newline = newline word - first_word = 0 - } else - newline = newline " " word - - line = substr(line, RSTART + RLENGTH) - } - if (newline ~ /[^\t ]/) { - print newline - } -} - -function cflags(var) -{ - if ($0 == var "=\"$RPM_OPT_FLAGS\"") { - removed[var] = 1 - return 0 - } - - if (!/!\?debug/) - sub("\$RPM_OPT_FLAGS", "%{rpmcflags}") - return 1 -} - -# return whole matched pattern -function matchstr(str, pat) -{ - match(str, "[^/]+$"); - return substr(str, RSTART, RLENGTH); -} - -function unify_url(url) -{ - - # sourceforge urls - # Docs about sourceforge mirror system: http://sourceforge.net/apps/trac/sourceforge/wiki/Mirrors - - # 1. unify domains - sub("^http://prdownloads\.sourceforge\.net/", "http://downloads.sourceforge.net/", url) - sub("^http://download\.sf\.net/", "http://downloads.sourceforge.net/", url) - sub("^http://download\.sourceforge\.net/", "http://downloads.sourceforge.net/", url) - sub("^http://dl\.sourceforge\.net/", "http://downloads.sourceforge.net/", url) - sub("^http://.*\.dl\.sourceforge\.net/", "http://downloads.sourceforge.net/", url) - sub("^http://dl\.sf\.net/", "http://downloads.sourceforge.net/", url) - sub("^http://downloads\.sourceforge\.net/sourceforge/", "http://downloads.sourceforge.net/", url) - - # 3. unify urls - if (url ~ /sourceforge.net/) { - sub("[?&]big_mirror=.*$", "", url); - sub("[?&]modtime=.*$", "", url); - sub("[?]use_mirror=.*$", "", url); - sub("[?]download$", "", url); - sub("/download$", "", url); - } - - # SF: new style urls, strip "files/" between and prepend dl. - if (match(url, "^http://sourceforge.net/projects/[^/]+/files/")) { - url = substr(url, 1, RLENGTH - length("files/")) substr(url, RSTART + RLENGTH); - sub("^http://sourceforge.net/projects/", "http://downloads.sourceforge.net/project/", url); - } - - # SF unify: http://downloads.sourceforge.net/PROJECT/TARBALL - # http://downloads.sourceforge.net/project/PROJECT/FILE/VERSION/%{name}-%{version}.zip - if (match(url, "^http://downloads.sourceforge.net/project/[^/]+")) { - url = sprintf("http://downloads.sourceforge.net/%s/%s", substr(url, 42, RLENGTH - 41), matchstr(url, "[^/]+$")); - } - - sub("^ftp://ftp\.gnome\.org/", "http://ftp.gnome.org/", url) - sub("^http://ftp\.gnome\.org/pub/gnome/", "http://ftp.gnome.org/pub/GNOME/", url) - - # apache urls - sub("^http://apache.zone-h.org/", "http://www.apache.org/dist/", url) - - # gnu.org - sub("^ftp://ftp\.gnu\.org/", "http://ftp.gnu.org/", url) - sub("^http://ftp\.gnu\.org/pub/gnu/", "http://ftp.gnu.org/gnu/", url) - - # debian.org - sub("^ftp://ftp\.[^.]+\.debian\.org/", "ftp://ftp.debian.org/", url) - sub("^http://ftp\.[^.]+\.debian\.org/", "ftp://ftp.debian.org/", url) - sub("^ftp://ftp\.debian\.org/pub/debian/", "ftp://ftp.debian.org/debian/", url) - - return url -} - -function demacroize(str) -{ - if (mod_name) { - sub("%{mod_name}", mod_name, str); - } - if (pearname) { - sub("%{_pearname}", pearname, str); - } - if (pearname) { - sub("%{pearname}", pearname, str); - } - if (name) { - sub("%{name}", name, str); - } - if (version) { - sub("%{version}", version, str); - } - if (_beta) { - sub("%{_beta}", _beta, str); - } - if (_rc) { - sub("%{_rc}", _rc, str); - } - if (_pre) { - sub("%{_pre}", _pre, str); - } - if (_snap) { - sub("%{_snap}", _snap, str); - } - if (subver) { - sub("%{subver}", subver, str); - } - return str; -} - -function kill_preamble_macros() -{ - if ($1 ~ /^Obsoletes:/) { - # NB! assigning $2 a value breaks tabbing - $2 = demacroize($2); - } - if ($1 ~ /^URL:/) { - # NB! assigning $2 a value breaks tabbing - $2 = demacroize($2); - $2 = unify_url($2) - } - - # fedora extras - if (/%{\?FE_USERADD_REQ}/) { - $0 = ""; - print "BuildRequires: rpmbuild(macros) >= 1.202" - print "Provides: user(xxx)" - print "Requires(postun): /usr/sbin/userdel" - print "Requires(pre): /bin/id" - print "Requires(pre): /usr/sbin/useradd" - } -} - -function get_epoch(pkg, ver, epoch) -{ - return -# should parse the BR lines more adequately: -# freetype = 2.0.0 -> correct -# freetype = 2.1.9 -> with epoch 1, as epoch 1 was added in 2.1.7 - - shell = "grep -o '^" pkg ":[^:]\+' ../PLD-doc/BuildRequires.txt | awk '{print $NF}'"; - shell | getline epoch; - return epoch; -} - -function format_requires(tag, value, n, p, i, deps, ndeps) { - # skip any formatting for commented out items or some weird macros - if (/^#/ || /%\(/) { - return tag "\t" value - } - n = split(value, p, / *,? */); - for (i = 1; i <= n; i++) { - if (p[i+1] ~ /[<=>]/) { - # add epoch if the version doesn't have it but BuildRequires.txt has - if (p[i] ~ /^[a-z]/ && p[i+2] !~ /^[0-9]+:/) { - epoch = get_epoch(p[i], p[i+2]) - if (epoch) { - p[i+2] = epoch ":" p[i+2]; - } - } - deps[ndeps++] = p[i] " " p[i+1] " " p[i+2]; - i += 2; - } else { - deps[ndeps++] = p[i]; - } - } - s = "" - for (i in deps) { - s = s sprintf("%s\t%s\n", tag, deps[i]); - } - return substr(s, 1, length(s)-1); -} - -function use_tabs() -{ - # reverse vim: ts=4 sw=4 et - gsub(/ /, "\t"); -} - -function add_br(br) -{ - BR[BR_count++] = br -} - -# Load rpm macros -# you should update the list also in adapter when making changes here -function import_rpm_macros( v) { - # File with rpm groups - topdir = ENVIRON["_topdir"] - - if (!topdir) { - print "adapter.awk should not not be invoked directly, but via adapter script" > "/dev/stderr" - do_not_touch_anything = 1 - exit(rc = 1); - } - - # update this version dep each time some new macro export is added - v = 1.49 - if (!ENVIRON["ADAPTER_REVISION"] || ENVIRON["ADAPTER_REVISION"] < v) { - printf("adapter shell script is outdated: Need %s, got %s. Please update it.\n", v, ENVIRON["ADAPTER_REVISION"]) > "/dev/stderr" - do_not_touch_anything = 1 - exit(rc = 1); - } - - prefix = ENVIRON["_prefix"] - bindir = ENVIRON["_bindir"] - sbindir = ENVIRON["_sbindir"] - libdir = ENVIRON["_libdir"] - sysconfdir = ENVIRON["_sysconfdir"] - datadir = ENVIRON["_datadir"] - includedir = ENVIRON["_includedir"] - mandir = ENVIRON["_mandir"] - infodir = ENVIRON["_infodir"] - examplesdir = ENVIRON["_examplesdir"] - docdir = ENVIRON["_defaultdocdir"] - kdedocdir = ENVIRON["_kdedocdir"] - gtkdocdir = ENVIRON["_gtkdocdir"] - desktopdir = ENVIRON["_desktopdir"] - pixmapsdir = ENVIRON["_pixmapsdir"] - javadir = ENVIRON["_javadir"] - pkgconfigdir = ENVIRON["_pkgconfigdir"] - npkgconfigdir = ENVIRON["_npkgconfigdir"] - localedir = ENVIRON["_localedir"] - - perl_sitearch = ENVIRON["perl_sitearch"] - perl_archlib = ENVIRON["perl_archlib"] - perl_privlib = ENVIRON["perl_privlib"] - perl_vendorlib = ENVIRON["perl_vendorlib"] - perl_vendorarch = ENVIRON["perl_vendorarch"] - perl_sitelib = ENVIRON["perl_sitelib"] - - py_sitescriptdir = ENVIRON["py_sitescriptdir"] - py_sitedir = ENVIRON["py_sitedir"] - py_scriptdir = ENVIRON["py_scriptdir"] - py_ver = ENVIRON["py_ver"] - - py3_sitescriptdir = ENVIRON["py3_sitescriptdir"] - py3_sitedir = ENVIRON["py3_sitedir"] - py3_scriptdir = ENVIRON["py3_scriptdir"] - py3_ver = ENVIRON["py3_ver"] - - ruby_archdir = ENVIRON["ruby_archdir"] - ruby_libdir = ENVIRON["ruby_libdir"] - ruby_sitedir = ENVIRON["ruby_sitedir"] - ruby_sitearchdir = ENVIRON["ruby_sitearchdir"] - ruby_sitelibdir = ENVIRON["ruby_sitelibdir"] - ruby_vendordir = ENVIRON["ruby_vendordir"] - ruby_vendorarchdir = ENVIRON["ruby_vendorarchdir"] - ruby_vendorlibdir = ENVIRON["ruby_vendorlibdir"] - ruby_rubylibdir = ENVIRON["ruby_rubylibdir"] # deprecated - ruby_rdocdir = ENVIRON["ruby_rdocdir"] - ruby_ridir = ENVIRON["ruby_ridir"] - - php_pear_dir = ENVIRON["php_pear_dir"] - php_data_dir = ENVIRON["php_data_dir"] - tmpdir = ENVIRON["tmpdir"] - - systemdunitdir = ENVIRON["systemdunitdir"] - systemdtmpfilesdir = ENVIRON["systemdtmpfilesdir"] -} - -# php virtual deps as discussed in devel-en -function replace_php_virtual_deps(field) { - pkg = $2 -# if (pkg == "php-program") { -# $0 = $1 "\t/usr/bin/php" -# return -# } - - if (field == "requires:") { - if (pkg ~ /^php-(bcmath|bz2|calendar|ctype|curl|dba|date|dom|enchant|exif|fileinfo|filter|fpm|ftp|gd|gettext|gmp|hash|iconv|imap|interbase|intl|json|ldap|mbstring|mcrypt|mssql|mysql|mysqli|odbc|openssl|pcntl|pcre|pdo|pdo-dblib|pdo-firebird|pdo-mysql|pdo-odbc|pdo-pgsql|pdo-sqlite|pgsql|phar|posix|pspell|readline|recode|session|shmop|simplexml|snmp|soap|sockets|spl|sqlite|sqlite3|sybase-ct|sysvmsg|sysvsem|sysvshm|tidy|tokenizer|wddx|xml|xmlreader|xmlrpc|xmlwriter|xsl|zip|zlib)/) { - sub(/^php-/, "php(", pkg); - sub(/$/, ")", pkg); - $2 = pkg - } - } - - if (pkg == "php" || pkg == "php-common") { - $2 = "php(core)"; - if ($4 ~ /^[0-9]:/) { - $4 = substr($4, 3); - } - } - - if (pkg == "php4") { - $2 = "webserver(php)"; - if ($4 ~ /^[0-9]:/) { - $4 = substr($4, 3); - } - } -} - -# {{{ replace_groupnames(group) -function replace_groupnames(group) { - group = replace(group, "Amusements/Games", "Applications/Games"); - group = replace(group, "Amusements/Games/Strategy/Real Time", "X11/Applications/Games/Strategy"); - group = replace(group, "Application/Multimedia", "Applications/Multimedia"); - group = replace(group, "Application/System", "Applications/System"); - group = replace(group, "Applications/Compilers", "Development/Languages"); - group = replace(group, "Applications/Daemons", "Daemons"); - group = replace(group, "Applications/Internet", "Applications/Networking"); - group = replace(group, "Applications/Internet/Peer to Peer", "Applications/Networking"); - group = replace(group, "Applications/Productivity", "X11/Applications"); - group = replace(group, "Applications/Security", "Applications/System"); - group = replace(group, "Applications/Web", "Applications/WWW"); - group = replace(group, "Database", "Applications/Databases"); - group = replace(group, "Development/C", "Development/Libraries"); - group = replace(group, "Development/Code Generators", "Development"); - group = replace(group, "Development/Docs", "Documentation"); - group = replace(group, "Development/Documentation", "Documentation"); - group = replace(group, "Development/Java", "Development/Languages/Java"); - group = replace(group, "Development/Languages/C and C++", "Libraries"); - group = replace(group, "Development/Languages/Other", "Development/Languages");; - group = replace(group, "Development/Languages/Ruby", "Development/Languages"); - group = replace(group, "Development/Libraries/C and C++", "Development/Libraries"); - group = replace(group, "Development/Libraries/Java", "Development/Languages/Java"); - group = replace(group, "Development/Libraries/Python", "Development/Languages/Python"); - group = replace(group, "Development/Libraries/TCL", "Development/Languages/Tcl");; - group = replace(group, "Development/Other", "Development"); - group = replace(group, "Development/Python", "Development/Languages/Python"); - group = replace(group, "Development/Testing", "Development"); - group = replace(group, "Editors", "Applications/Text"); - group = replace(group, "Emulators", "Applications/Emulators"); - group = replace(group, "File tools", "Applications/File"); - group = replace(group, "Games", "Applications/Games"); - group = replace(group, "Library/Development", "Development/Libraries"); - group = replace(group, "Networking/Deamons", "Networking/Daemons"); - group = replace(group, "Networking/Mail", "Applications/Mail"); - group = replace(group, "Networking/Other", "Networking"); - group = replace(group, "Productivity/Databases/Servers", "Applications/Databases"); - group = replace(group, "Productivity/Multimedia/Other", "X11/Applications/Multimedia"); - group = replace(group, "Productivity/Networking/Web/Servers", "Networking/Daemons/HTTP");; - group = replace(group, "Python/Libraries", "Libraries/Python"); - group = replace(group, "Shells", "Applications/Shells"); - group = replace(group, "System Environment/Base", "Base"); - group = replace(group, "System Environment/Daemons", "Daemons"); - group = replace(group, "System Environment/Kernel", "Base/Kernel"); - group = replace(group, "System Environment/Libraries", "Libraries"); - group = replace(group, "System Tools", "Applications/System"); - group = replace(group, "System", "Base"); - group = replace(group, "System/Base", "Base"); - group = replace(group, "System/Kernel and hardware", "Base/Kernel"); - group = replace(group, "System/Libraries", "Libraries"); - group = replace(group, "System/Servers", "Daemons"); - group = replace(group, "Text Processing/Markup/HTML", "Applications/Text"); - group = replace(group, "Text Processing/Markup/XML", "Applications/Text"); - group = replace(group, "Text tools", "Applications/Text"); - group = replace(group, "User Interface/Desktops", "X11/Applications"); - group = replace(group, "User Interface/X", "X11/Applications"); - group = replace(group, "Utilities/System", "Applications/System"); - group = replace(group, "Web/Database", "Applications/WWW"); - group = replace(group, "X11/GNOME", "X11/Applications"); - group = replace(group, "X11/GNOME/Applications", "X11/Applications"); - group = replace(group, "X11/GNOME/Development/Libraries", "X11/Development/Libraries"); - group = replace(group, "X11/Games", "X11/Applications/Games"); - group = replace(group, "X11/Games/Strategy", "X11/Applications/Games/Strategy"); - group = replace(group, "X11/Library", "X11/Libraries"); - group = replace(group, "X11/Utilities", "X11/Applications"); - group = replace(group, "X11/XFree86", "X11"); - group = replace(group, "X11/Xserver", "X11/Servers"); - - return group; -} -# }}} - -# {{{ replace_pkgconfig(pkg) -function replace_pkgconfig(pkg, cmd, path, n, i, line) { - n = split("/usr/lib64/pkgconfig /usr/lib/pkgconfig /usr/share/pkgconfig", path, / /); - for (i = 1; i <= n; i++) { - cmd = "rpm -qf --qf '%{N}' " path[i] "/" pkg ".pc"; - # Getline returns 0 on end-of-file, -1 on error, otherwise 1. - if ((cmd | getline line) <= 0) { - continue; - } - - if (line !~ /No such file or directory/) { - # @modifies global $2 - $2 = line; - return - } - } -} -# }}} - -# {{{ replace_pythonegg(pkg) -function replace_pythonegg(pkg, cmd, line) { - cmd = "rpm -q --qf '%{N}' --whatprovides 'pythonegg(" pkg ")'"; - # Getline returns 0 on end-of-file, -1 on error, otherwise 1. - if ((cmd | getline line) <= 0) { - return; - } - - if (line !~ /no package provides/) { - # @modifies global $2 - $2 = line; - return; - } -} -# }}} - -function replace_requires(field, pkg) { - # pkg-config -> package names - if (match($2, /pkgconfig\(([^)]+)\)/)) { - pkg = substr($2, RSTART + 10, RLENGTH - 11); - replace_pkgconfig(pkg); - } - - # pythonegg -> package names - if (match($2, /pythonegg\(([^)]+)\)/)) { - pkg = substr($2, RSTART + 10, RLENGTH - 11); - replace_pythonegg(pkg); - } - - sub(/^python-setuptools-devel$/, "python-distribute", $2); - sub(/^gcc-g77/, "gcc-fortran", $2); - - # use virtual, not package name - sub(/^rpm-build-macros$/, "rpmbuild(macros)", $2); - - # bad package.xml, see http://pear.php.net/bugs/bug.php?id=17779 - sub(/^php-php-gtk/, "php-gtk2", $2); - - # {{{ jpackages / fedora java packages - sub(/^antlr3$/, "java-antlr3", $2); - sub(/^aqute-bnd$/, "java-bnd", $2); - sub(/^avalon-framework$/, "java-avalon-framework", $2); - sub(/^avalon-logkit$/, "java-avalon-logkit", $2); - sub(/^axis$/, "java-axis", $2); - sub(/^bouncycastle$/, "java-bcprov", $2); - sub(/^bouncycastle-mail$/, "java-bcmail", $2); - sub(/^bouncycastle-pg$/, "java-bcpg", $2); - sub(/^bouncycastle-tsp$/, "java-bctsp", $2); - sub(/^bsf$/, "java-bsf", $2); - sub(/^dom4j$/, "java-dom4j", $2); - sub(/^flute$/, "java-flute", $2); - sub(/^gnu-regexp$/, "java-gnu-regexp", $2); - sub(/^gnu.regexp$/, "java-gnu-regexp", $2); - sub(/^hamcrest$/, "java-hamcrest", $2); - sub(/^itext$/, "java-itext", $2); - sub(/^jaas$/, "java(jaas)", $2); - sub(/^jaf$/, "java(jaf)", $2); - sub(/^jakarta-ant$/, "ant", $2); - sub(/^jakarta-commons-codec$/, "java-commons-codec", $2); - sub(/^jakarta-commons-httpclient$/, "java-commons-httpclient", $2); - sub(/^jakarta-commons-logging$/, "java-commons-logging", $2); - sub(/^jakarta-log4j$/, "java-log4j", $2); - sub(/^jakarta-oro$/, "java-oro", $2); - sub(/^jakarta-servletapi$/, "java(servlet)", $2); - sub(/^java-devel$/, "jdk", $2); - sub(/^java\(JSP\)$/, "java(jsp)", $2); - sub(/^java\(JavaServerFaces\)$/, "java(javaserverfaces)", $2); - sub(/^java\(Portlet\)$/, "java(portlet)", $2); - sub(/^java\(Servlet\)$/, "java(servlet)", $2); - sub(/^javamail$/, "java(javamail)", $2); - sub(/^jaxp$/, "java(jaxp)", $2); - sub(/^jaxp_parser_impl$/, "java(jaxp_parser_impl)", $2); - sub(/^jaxp_transform_impl$/, "java(jaxp_transform_impl)", $2); - sub(/^jce$/, "java(jce)", $2); - sub(/^jcommon$/, "java-jcommon", $2); - sub(/^jdbc-stdext$/, "java(jdbc-stdext)", $2); - sub(/^jdepend$/, "java-jdepend", $2); - sub(/^jfreechart$/, "java-jfreechart", $2); - sub(/^jmx$/, "java(jmx)", $2); - sub(/^jndi$/, "java(jndi)", $2); - sub(/^jsch$/, "java-jsch", $2); - sub(/^jsse$/, "java(jsse)", $2); - sub(/^jta$/, "java(jta)", $2); - sub(/^junit$/, "java-junit", $2); - sub(/^junit4$/, "java-junit", $2); - sub(/^ldapjdk$/, "ldapsdk", $2); - sub(/^libbase$/, "java-libbase", $2); - sub(/^libfonts$/, "java-libfonts", $2); - sub(/^libformula$/, "java-libformula", $2); - sub(/^liblayout$/, "java-liblayout", $2); - sub(/^libloader$/, "java-libloader", $2); - sub(/^librepository$/, "java-librepository", $2); - sub(/^libserializer$/, "java-libserializer", $2); - sub(/^log4j$/, "java-log4j", $2); - sub(/^logging-log4j$/, "java-log4j", $2); - sub(/^oro$/, "java-oro", $2); - sub(/^pdf-renderer$/, "java-pdf-renderer", $2); - sub(/^pentaho-libxml$/, "java-libxml", $2); - sub(/^rhino$/, "java-rhino", $2); - sub(/^sac$/, "java-sac", $2); - sub(/^saxon-scripts$/, "saxon", $2); - sub(/^servlet$/, "java(servlet)", $2); - sub(/^uddi4j$/, "java-uddi4j", $2); - sub(/^ws-jaxme$/, "java-jaxme", $2); - sub(/^wsdl4j$/, "java-wsdl4j", $2); - sub(/^xalan-j$/, "java-xalan", $2); - sub(/^xalan-j2$/, "java-xalan", $2); - sub(/^xerces-j$/, "java-xerces", $2); - sub(/^xerces-j2$/, "java-xerces", $2); - sub(/^xml-commons-apis$/, "java-xml-commons", $2); - sub(/^xml-commons-resolver$/, "java-xml-commons-resolver", $2); - sub(/^xmldb-api$/, "java-xmldb", $2); - sub(/^xmldb-api-sdk$/, "java-xmldb-sdk", $2); - # }}} - - # {{{ fedora / redhat - sub(/^Django$/, "python-django", $2); - sub(/^GitPython$/, "python-git", $2); - sub(/^MySQL-python$/, "python-MySQLdb", $2); - sub(/^NetworkManager-glib-devel$/, "NetworkManager-devel", $2); - sub(/^PyQt4-devel$/, "python-PyQt4-devel", $2); - sub(/^PyQwt-devel$/, "python-PyQwt-devel", $2); - sub(/^PyYAML$/, "python-PyYAML", $2); - sub(/^ccid$/, "pcsc-driver-ccid", $2); - sub(/^chkconfig$/, "/sbin/chkconfig", $2); - sub(/^db4-devel$/, "db-devel", $2); - sub(/^dbus-python$/, "python-dbus", $2); - sub(/^desktop-notification-daemon$/, "dbus(org.freedesktop.Notifications)", $2); - sub(/^device-mapper-multipath$/, "multipath-tools", $2); - sub(/^django-tagging$/, "python-django_tagging", $2); - sub(/^elfutils-libelf-devel$/, "elfutils-devel", $2); - sub(/^file-devel$/, "libmagic-devel", $2); - sub(/^freetype2-devel$/, "freetype-devel", $2); - sub(/^fuse-devel$/, "libfuse-devel", $2); - sub(/^gamin-python$/, "python-gamin", $2); - sub(/^gcc-c\+\+$/, "libstdc++-devel", $2); - sub(/^gnome-desktop3-devel$/, "gnome-desktop-devel", $2); - sub(/^gnome-python2-extras$/, "python-gnome-extras", $2); - sub(/^gnome-python2-gconf$/, "python-gnome-gconf", $2); - sub(/^gnome-python2-gnomekeyring$/, "python-gnome-desktop-keyring", $2); - sub(/^gnome-python2-gtkspell$/, "python-gnome-extras-gtkspell", $2); - sub(/^gtk-sharp2-devel$/, "dotnet-gtk-sharp2-devel", $2); - sub(/^gtk2$/, "gtk+2", $2); - sub(/^gtk2-devel$/, "gtk+2-devel", $2); - sub(/^gtk3$/, "gtk+3", $2); - sub(/^gtk3-devel$/, "gtk+3-devel", $2); - sub(/^initscripts$/, "rc-scripts", $2); - sub(/^iproute$/, "iproute2", $2); - sub(/^iscsi-initiator-utils$/, "open-iscsi", $2); - sub(/^keyutils-libs-devel$/, "keyutils-devel", $2); - sub(/^libSM-devel$/, "xorg-lib-libSM-devel", $2); - sub(/^libX11-devel$/, "xorg-lib-libX11-devel", $2); - sub(/^libXScrnSaver-devel$/, "xorg-lib-libXScrnSaver-devel", $2); - sub(/^libXau-devel$/, "xorg-lib-libXau-devel", $2); - sub(/^libXcomposite-devel$/, "xorg-lib-libXcomposite-devel", $2); - sub(/^libXcursor-devel$/, "xorg-lib-libXcursor-devel", $2); - sub(/^libXdamage-devel$/, "xorg-lib-libXdamage-devel", $2); - sub(/^libXext-devel$/, "xorg-lib-libXext-devel", $2); - sub(/^libXft-devel$/, "xorg-lib-libXft-devel", $2); - sub(/^libXinerama-devel$/, "xorg-lib-libXinerama-devel", $2); - sub(/^libXrandr-devel$/, "xorg-lib-libXrandr-devel", $2); - sub(/^libXrender-devel$/, "xorg-lib-libXrender-devel", $2); - sub(/^libXt-devel$/, "xorg-lib-libXt-devel", $2); - sub(/^libXtst-devel$/, "xorg-lib-libXtst-devel", $2); - sub(/^libXv-devel$/, "xorg-lib-libXv-devel", $2); - sub(/^libXxf86misc-devel$/, "xorg-lib-libXxf86misc-devel", $2); - sub(/^libXxf86vm-devel$/, "xorg-lib-libXxf86vm-devel", $2); - sub(/^libacl-devel$/, "acl-devel", $2); - sub(/^libcurl-devel$/, "curl-devel", $2); - sub(/^libgudev1-devel$/, "udev-glib-devel", $2); - sub(/^libmx-devel$/, "mx-devel", $2); - sub(/^libselinux-python$/, "python-selinux", $2); - sub(/^libsrtp-devel$/, "srtp-devel", $2); - sub(/^libtdb$/, "tdb", $2); - sub(/^libtdb-devel$/, "tdb-devel", $2); - sub(/^libtevent$/, "tevent", $2); - sub(/^libtevent-devel$/, "tevent-devel", $2); - sub(/^libusb1-devel$/, "libusb-devel", $2); - sub(/^libuser-python$/, "python-libuser", $2); - sub(/^libxkbfile-devel$/, "xorg-lib-libxkbfile", $2); - sub(/^mod_wsgi$/, "apache-mod_wsgi", $2); - sub(/^newt-python$/, "python-snack", $2); - sub(/^notify-python$/, "python-pynotify", $2); - sub(/^pcsc-lite-ccid$/, "pcsc-driver-ccid", $2); - sub(/^pulseaudio-libs-devel$/, "pulseaudio-devel", $2); - sub(/^pyOpenSSL$/, "python-pyOpenSSL", $2); - sub(/^pycairo$/, "python-pycairo", $2); - sub(/^pyflakes$/, "python-pyflakes", $2); - sub(/^pygobject2$/, "python-pygobject", $2); - sub(/^pygobject3$/, "python-pygobject3", $2); - sub(/^pygobject3-devel$/, "python-pygobject3-common-devel", $2); - sub(/^pygtk2$/, "python-pygtk", $2); - sub(/^pygtk2-devel$/, "python-pygtk-devel", $2); - sub(/^pygtk2-libglade$/, "python-pygtk-glade", $2); - sub(/^pykickstart$/, "python-pykickstart", $2); - sub(/^pyparsing$/, "python-pyparsing", $2); - sub(/^pyparted$/, "python-parted", $2); - sub(/^pysvn$/, "python-pysvn", $2); - sub(/^pytalloc$/, "python-talloc", $2); - sub(/^pytalloc-devel$/, "python-talloc-devel", $2); - sub(/^pytest$/, "python-pytest", $2); - sub(/^python-cups$/, "python-pycups", $2); - sub(/^python-enchant$/, "python-pyenchant", $2); - sub(/^python-imaging$/, "python-PIL", $2); - sub(/^python-imaging-tk$/, "python-PIL-tk", $2); - sub(/^python-newt$/, "python-snack", $2); - sub(/^python-pygtk$/, "python-pygtk-gtk", $2); - sub(/^python-recaptcha-client$/, "python-recaptcha", $2); - sub(/^python-twisted-core$/, "python-TwistedCore", $2); - sub(/^python-twisted-core$/, "python-TwistedCore", $2); - sub(/^python-twisted-names$/, "python-TwistedNames", $2); - sub(/^python2-devel$/, "python-devel", $2); - sub(/^pytz$/, "python-pytz", $2); - sub(/^pyxdg$/, "python-pyxdg", $2); - sub(/^qt4-devel$/, "qt4-build", $2); - sub(/^qt4-webkit-devel$/, "QtWebKit-devel", $2); - sub(/^qtlockedfile-devel$/, "QtLockedFile-devel", $2); - sub(/^qtsingleapplication-devel$/, "QtSingleApplication-devel", $2); - sub(/^rpm-python$/, "python-rpm", $2); - sub(/^sip-devel$/, "python-sip-devel", $2); - sub(/^tftp-server$/, "tftpdaemon", $2); - sub(/^tkinter$/, "python-tkinter", $2); - sub(/^urw-fonts$/, "fonts-Type1-urw", $2); - sub(/^webkitgtk3-devel$/, "gtk-webkit3-devel", $2); - sub(/^xapian-bindings-python$/, "python-xapian", $2); - sub(/^xorg-x11-server-sdk$/, "xorg-xserver-server-devel", $2); - # }}} - - # {{{ mandriva - sub(/^python-gobject-devel$/, "python-pygobject-devel", $2); - sub(/^python-pyrex$/, "python-Pyrex", $2); - sub(/^webkitgtk-devel$/, "gtk-webkit-devel", $2); - sub(/^python-curl$/, "python-pycurl", $2); - sub(/^python-webkitgtk$/, "python-pywebkitgtk", $2); - sub(/^pygtk2.0$/, "python-pygtk-gtk", $2); - sub(/^gnome-python-gconf$/, "python-gnome-gconf", $2); - # }}} - - # {{{ debian / ubuntu - sub(/^blkid-dev$/, "libblkid-devel", $2); - sub(/^ext2fs-dev$/, "e2fsprogs-devel", $2); - sub(/^libao-dev$/, "libao-devel", $2); - sub(/^libboost-filesystem[0-9.]+-dev$/, "boost-devel", $2); - sub(/^libboost-program-options[0-9.]+-dev$/, "boost-devel", $2); - sub(/^libboost-regex[0-9.]+-dev$/, "boost-devel", $2); - sub(/^libboost-thread[0-9.]+-dev$/, "boost-devel", $2); - sub(/^libcurl4-openssl-dev$/, "curl-devel", $2); - sub(/^libdnet-dev$/, "libdnet-devel", $2); - sub(/^libesd0-dev$/, "esound-devel", $2); - sub(/^libfishsound1-dev$/, "libfishsound-devel", $2); - sub(/^libgconf2-dev$/, "GConf2-devel", $2); - sub(/^libgl1-mesa-dev$/, "OpenGL-devel", $2); - sub(/^libgl1-mesa-dri$/, "OpenGL", $2); - sub(/^libglib2.0-dev$/, "glib2-devel", $2); - sub(/^libglu1-mesa-dev$/, "OpenGL-GLU-devel", $2); - sub(/^libgtk2.0-dev$/, "gtk+2-devel", $2); - sub(/^libhunspell-dev$/, "hunspell-devel", $2); - sub(/^libmcrypt-dev$/, "libmcrypt-devel", $2); - sub(/^libmhash-dev$/, "mhash-devel", $2); - sub(/^liboggz1-dev$/, "libggz-devel", $2); - sub(/^libpango1.0-dev$/, "pango-devel", $2); - sub(/^libqt4-dev$/, "qt4-build", $2); - sub(/^libshout3-dev$/, "libshout-devel", $2); - sub(/^libslp-dev$/, "openslp-devel", $2); - sub(/^libsndfile1-dev$/, "libsndfile-devel", $2); - sub(/^libspeex-dev$/, "speex-devel", $2); - sub(/^libssl-dev$/, "openssl-devel", $2); - sub(/^libvorbis-dev$/, "libvorbis-devel", $2); - sub(/^libxslt1-dev$/, "libxslt-devel", $2); - sub(/^libxss-dev$/, "xorg-lib-libXScrnSaver-devel", $2); - sub(/^mesa-common-dev$/, "OpenGL-devel", $2); - sub(/^libudev$/, "udev-libs", $2); - sub(/^tcp_wrappers-devel$/, "libwrap-devel", $2); - sub(/^vala-tools$/, "vala", $2); - sub(/^vala-devel$/, "vala", $2); - # }}} - - # {{{ altlinux - sub(/^libatk-devel$/, "atk-devel", $2); - sub(/^libgit-devel$/, "git-core-devel", $2); - sub(/^libgtk\+2-devel$/, "gtk+2-devel", $2); - sub(/^libncurses-devel$/, "ncurses-devel", $2); - sub(/^libncursesxx-devel$/, "ncurses-c++-devel", $2); - sub(/^libpango-devel$/, "pango-devel", $2); - sub(/^libpcre-devel$/, "pcre-devel", $2); - sub(/^libpopt-devel$/, "popt-devel", $2); - sub(/^libssl-devel$/, "openssl-devel", $2); - # }}} - - # {{{ suse/opensuse - sub(/^alsa-devel$/, "alsa-lib-devel", $2); - sub(/^gtk-sharp2$/, "dotnet-gtk-sharp2", $2); - sub(/^gtkmm2-devel$/, "gtkmm-devel", $2); - sub(/^libexpat-devel$/, "expat-devel", $2); - sub(/^libffmpeg-devel$/, "ffmpeg-devel", $2); - sub(/^libopenssl-devel$/, "openssl-devel", $2); - sub(/^libpulse-devel$/, "pulseaudio-devel", $2); - sub(/^monodoc-core$/, "mono-monodoc", $2); - sub(/^python-cairo$/, "python-pycairo", $2); - sub(/^python-gobject$/, "python-pygobject", $2); - sub(/^python-gstreamer-0_10$/, "python-gstreamer", $2); - sub(/^python-gtk$/, "python-pygtk-gtk", $2); - sub(/^python-xdg$/, "python-pyxdg", $2); - # }}} - - replace_php_virtual_deps(field) -} - -# vim:ts=4:sw=4 fdm=marker diff --git a/adapter.sh b/adapter.sh deleted file mode 100755 index d5c7866..0000000 --- a/adapter.sh +++ /dev/null @@ -1,325 +0,0 @@ -#!/bin/sh -# -# Authors: -# Michał Kuratczyk -# Sebastian Zagrodzki -# Tomasz Kłoczko -# Artur Frysiak -# Michal Kochanowicz -# Elan Ruusamäe -# -# See cvs log adapter{,.awk} for list of contributors -# -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # - -REVISION=1.50 -VERSION="v0.35/$REVISION" -VERSIONSTRING="\ -Adapter adapts .spec files for PLD Linux. -$VERSION (C) 1999-2013 Free Penguins". - -PROGRAM=${0##*/} -dir=$(d=$0; [ -L "$d" ] && d=$(readlink -f "$d"); dirname "$d") -adapter=$dir/adapter.awk -usage="Usage: $PROGRAM [FLAGS] SPECFILEs - --s|--no-sort|--skip-sort - skip BuildRequires, Requires sorting --m|--no-macros|--skip-macros - skip use_macros() substitutions --d|--skip-desc - skip desc wrapping --a|--skip-defattr - skip %defattr corrections --o - do not do any diffing, just dump the output -" - -if [ ! -x /usr/bin/getopt ]; then - echo >&2 "You need to install util-linux to use adapter" - exit 1 -fi - -if [ ! -x /usr/bin/patch ]; then - echo >&2 "You need to install patch to use adapter" - exit 1 -fi - -[ -n "$PAGER" ] || PAGER="/usr/bin/less -r" - -if [ -n "$CONFIG_DIR" ]; then - USER_CFG="$CONFIG_DIR/.adapterrc" -elif [ -n "$HOME_ETC" ]; then - USER_CFG="$HOME_ETC/.adapterrc" -else - USER_CFG=~/.adapterrc -fi - -[ -f $USER_CFG ] && . $USER_CFG - -t=$(getopt -o hsomdaV --long help,version,sort,sort-br,no-macros,skip-macros,skip-desc,skip-defattr -n "$PROGRAM" -- "$@") || exit $? -eval set -- "$t" - -while :; do - case "$1" in - -h|--help) - echo 2>&1 "$usage" - exit 1 - ;; - -s|--no-sort|--skip-sort) - export SKIP_SORTBR=1 - ;; - -m|--no-macros|--skip-macros) - export SKIP_MACROS=1 - ;; - -d|--skip-desc) - export SKIP_DESC=1 - ;; - -a|--skip-defattr) - export SKIP_DEFATTR=1 - ;; - -V|--version) - echo "$VERSIONSTRING" - exit 0 - ;; - -o) - outputonly=1 - ;; - --) - shift - break - ;; - *) - echo >&2 "$PROGRAM: Internal error: \`$1' not recognized!" - exit 1 - ;; - esac - shift -done - -diffcol() -{ - # vim like diff colourization -LC_ALL=en_US.UTF-8 gawk ' { - split( $0, S, /\t/ ); - $0 = S[ 1 ]; - for ( i = 2; i in S; i++ ) { - spaces = 7 - ( (length( $0 ) - 1) % 8 ); - $0 = $0 "\xE2\x9E\x94"; - for ( y = 0; y < spaces; y++ ) - $0 = $0 "\xE2\x87\xBE"; - $0 = $0 S[ i ]; - } - gsub( /\033/, "\033[44m^[\033[49m" ); - cmd = ""; - if ( sub( /^ /, "" ) ) - cmd = " "; - sub( /(\xE2\x9E\x94(\xE2\x87\xBE)*| )+$/, "\033[31;41m&\033[39;49m" ); - gsub( /\xE2\x9E\x94(\xE2\x87\xBE)*/, "\033[7m&\033[27m" ); - gsub( /\xE2\x87\xBE/, " " ); - # uncomment if you do not like utf-8 arrow - # gsub( /\xE2\x9E\x94/, ">" ); - $0 = cmd $0; - gsub( /\007/, "\033[44m^G\033[49m" ); - gsub( /\r/, "\033[44m^M\033[49m" ); -} -/^(Index:|diff|---|\+\+\+) / { $0 = "\033[32m" $0 } -/^@@ / { $0 = "\033[33m" $0 } -/^-/ { $0 = "\033[35m" $0 } -/^+/ { $0 = "\033[36m" $0 } -{ $0 = $0 "\033[0m"; print } -' "$@" -} - -diff2hunks() -{ - # diff2hunks orignally by dig - perl -e ' -#! /usr/bin/perl -w - -use strict; - -for my $filename (@ARGV) { - my $counter = 1; - my $fh; - open $fh, "<", $filename or die "$filename: open for reading: $!"; - my @lines = <$fh>; - my @hunks; - my @curheader; - for my $i (0 ... $#lines) { - next unless $lines[$i] =~ m/^\@\@ /; - if ($i >= 2 and $lines[$i - 2] =~ m/^--- / and $lines[$i - 1] =~ m/^\+\+\+ /) { - @curheader = @lines[$i - 2 ... $i - 1]; - } - next unless @curheader; - my $j = $i + 1; - while ($j < @lines and $lines[$j] !~ m/^\@\@ /) {$j++} - $j -= 2 - if $j >= 3 and $j < @lines - and $lines[$j - 2] =~ m/^--- / - and $lines[$j - 1] =~ m/^\+\+\+ /; - $j--; - $j-- until $lines[$j] =~ m/^[ @+-]/; - my $hunkfilename = $filename; - $hunkfilename =~ s/((\.(pat(ch)?|diff?))?)$/"-".sprintf("%03i",$counter++).$1/ei; - my $ofh; - open $ofh, ">", $hunkfilename or die "$hunkfilename: open for writing: $!"; - print $ofh @curheader, @lines[$i ... $j]; - close $ofh; - } -} -' "$@" -} - -# import selected macros for adapter.awk -# you should update the list also in adapter.awk when making changes here -import_rpm_macros() { - macros=" - _topdir - _prefix - _bindir - _sbindir - _libdir - _sysconfdir - _datadir - _includedir - _mandir - _infodir - _examplesdir - _defaultdocdir - _kdedocdir - _gtkdocdir - _desktopdir - _pixmapsdir - _javadir - _pkgconfigdir - _npkgconfigdir - _localedir - - perl_sitearch - perl_archlib - perl_privlib - perl_vendorlib - perl_vendorarch - perl_sitelib - - py_sitescriptdir - py_sitedir - py_scriptdir - py_ver - - py3_sitescriptdir - py3_sitedir - py3_scriptdir - py3_ver - - ruby_archdir - ruby_libdir - ruby_sitedir - ruby_sitearchdir - ruby_sitelibdir - ruby_vendordir - ruby_vendorarchdir - ruby_vendorlibdir - ruby_rubylibdir - ruby_rdocdir - ruby_ridir - - php_pear_dir - php_data_dir - tmpdir - - systemdunitdir - systemdtmpfilesdir -" - eval_expr="" - for macro in $macros; do - eval_expr="$eval_expr\nexport $macro='%{$macro}'" - done - - - # get cvsaddress for changelog section - # using rpm macros as too lazy to add ~/.adapterrc parsing support. - eval_expr="$eval_expr - export _cvsmaildomain='%{?_cvsmaildomain}%{!?_cvsmaildomain:@pld-linux.org}' - export _cvsmailfeedback='%{?_cvsmailfeedback}%{!?_cvsmailfeedback:PLD Team }' - " - - export ADAPTER_REVISION=$REVISION - - eval $(rpm --eval "$(echo -e $eval_expr)") -} - -adapterize() { - local SPECFILE="$1" - [ -f "$SPECFILE" ] || SPECFILE="$(basename $SPECFILE .spec).spec" - - local workdir - workdir=$(mktemp -d ${TMPDIR:-/tmp}/adapter-XXXXXX) || exit $? - awk=gawk - - local tmp=$workdir/$(basename $SPECFILE) || exit $? - - import_rpm_macros - - LC_ALL=en_US.UTF-8 $awk -f $adapter $SPECFILE > $tmp || exit $? - - if [ "$outputonly" = 1 ]; then - cat $tmp - - elif [ "$(diff --brief $SPECFILE $tmp)" ]; then - diff -u $SPECFILE $tmp > $tmp.diff - if [ -t 1 ]; then - diffcol $tmp.diff | $PAGER - while : ; do - echo -n "Accept? (Yes, No, Confirm each chunk)? " - read ans - case "$ans" in - [yYoO]) # y0 mama - mv -f $tmp $SPECFILE - echo "Ok, adapterized." - break - ;; - [cC]) # confirm each chunk - diff2hunks $tmp.diff - for t in $(ls $tmp-*.diff); do - diffcol $t | $PAGER - echo -n "Accept? (Yes, [N]o, Quit)? " - read ans - case "$ans" in - [yYoO]) # y0 mama - patch -p0 < $t - ;; - [Q]) # Abort - break - ;; - esac - done - break - ;; - [QqnNsS]) - echo "Ok, exiting." - break - ;; - esac - done - else - cat $tmp.diff - fi - else - echo "The spec $SPECFILE is perfect ;)" - fi - - rm -rf $workdir -} - -if [ $# -eq 0 ]; then - echo "$usage" - exit 1 -fi - -for SPECFILE in "$@"; do - adapterize $SPECFILE -done - -# vim: ts=4:sw=4 diff --git a/bash-prompt.sh b/bash-prompt.sh new file mode 100644 index 0000000..5eec276 --- /dev/null +++ b/bash-prompt.sh @@ -0,0 +1,121 @@ +# NOTE: +# This code is known to work with bash + +# the code below requires bash 4.x, skip if earlier +test ${BASH_VERSION%%.*} -lt 4 && return 1 + +# To use it, source this file and set $PROMPT_COMMAND env var: +# PROMPT_COMMAND=__bash_prompt_command + +# +# A colorized bash prompt +# - shows current branch +# - shows if branch is up to date/ahead/behind +# - shows if last command exited with error (red) +# +__bash_prompt_command() { + local previous_return_value=$? + + local RED="\[\033[0;31m\]" + local YELLOW="\[\033[0;33m\]" + local GREEN="\[\033[0;32m\]" + local BLUE="\[\033[0;34m\]" + local LIGHT_RED="\[\033[1;31m\]" + local LIGHT_GREEN="\[\033[1;32m\]" + local WHITE="\[\033[1;37m\]" + local LIGHT_GRAY="\[\033[0;37m\]" + local COLOR_NONE="\[\e[0m\]" + + # if we are in rpm subdir and have exactly one .spec in the dir, include package version + __package_update_rpmversion + local rpmver=$(__package_rpmversion) + + local prompt="${BLUE}[${RED}\w${GREEN}${rpmver:+($rpmver)}$(__bash_parse_git_branch)${BLUE}]${COLOR_NONE} " + if [ $previous_return_value -eq 0 ]; then + PS1="${prompt}➔ " + else + PS1="${prompt}${RED}➔${COLOR_NONE} " + fi +} + +# helper for __bash_prompt_command +# command line (git) coloring +# note we use "\" here to avoid any "git" previous alias/func +__bash_parse_git_branch() { + # not in git dir. return early + git rev-parse --git-dir &> /dev/null || return + + local state remote branch base local + + # without branch, nothing is shown; don't bother further + branch=$(git symbolic-ref --short HEAD 2>/dev/null) || return + + if [ -n "$(git status -s 2> /dev/null)" ]; then + state="${RED}★" + fi + + # http://stackoverflow.com/a/3278427 + remote=$(git rev-parse '@{u}' 2>/dev/null) + base=$(git merge-base @ '@{u}' 2>/dev/null) + if [[ -n "$remote" && -n "$base" ]]; then + local=$(git rev-parse @) + + if [[ $local = $remote ]]; then + remote="" + elif [[ $local = $base ]]; then + remote="${YELLOW}↓" + elif [[ $remote = $base ]]; then + remote="${YELLOW}↑" + else + remote="${YELLOW}↕" + fi + else + remote="" + fi + + echo " (${branch})${remote}${state}" +} + +# cache requires bash 4.x +declare -A __package_update_rpmversion_cache=() +__package_update_rpmversion() { + # extract vars from cache + set -- ${__package_update_rpmversion_cache[$PWD]} + local specfile=$1 version=$2 mtime=$3 + + # invalidate cache + if [ -f "$specfile" ]; then + local stat + stat=$(stat -c %Y $specfile) + if [ $mtime ] && [ $stat -gt $mtime ]; then + unset version + fi + mtime=$stat + else + # reset cache, .spec may be renamed + unset version specfile + fi + + # we have cached version + test -n "$version" && return + + # needs to be one file + specfile=${specfile:-$(\ls *.spec 2>/dev/null)} + if [ ! -f "$specfile" ]; then + unset __package_update_rpmversion_cache[$PWD] + return + fi + + mtime=${mtime:-$(stat -c %Y $specfile)} + + # give only first version (ignore subpackages) + version=$(rpm --define "_specdir $PWD" --specfile $specfile -q --qf '%{VERSION}\n' | head -n1) + __package_update_rpmversion_cache[$PWD]="$specfile ${version:-ERR} $mtime" +} + +__package_rpmversion() { + # extract vars from cache + set -- ${__package_update_rpmversion_cache[$PWD]} + # print version + echo $2 +} diff --git a/builder.sh b/builder.sh index 056cdf4..bbeb418 100755 --- a/builder.sh +++ b/builder.sh @@ -35,11 +35,10 @@ PROGRAM=${0##*/} APPDIR=$(d=$0; [ -L "$d" ] && d=$(readlink -f "$d"); dirname "$d") -RCSID='$Id: builder,v 1.645 2011/02/13 17:54:10 glen Exp $' r=${RCSID#* * } rev=${r%% *} -VERSION="v0.35/$rev" +VERSION="v0.35" VERSIONSTRING="\ Build package utility from PLD Linux Packages repository -$VERSION (C) 1999-2013 Free Penguins". +$VERSION (C) 1999-2016 Free Penguins". CLEAN_PATH="/bin:/usr/bin:/usr/sbin:/sbin:/usr/X11R6/bin" @@ -77,11 +76,12 @@ DATE=`date +%Y-%m-%d_%H-%M-%S` # target arch, can also be used for log file naming TARGET=$(rpm -E %{_target}) +# Note the *single* quotes, this allows using shell variables expanded at build time # Example: LOGFILE='../log.$PACKAGE_NAME' # Example: LOGFILE='../LOGS/log.$PACKAGE_NAME.$DATE' # Example: LOGFILE='$PACKAGE_NAME/$PACKAGE_NAME.$DATE.log' # Example: LOGFILE='$PACKAGE_NAME.$DATE.log' -# Yes, you can use variable name! Note _single_ quotes! +# Example: LOGFILE='.log.$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_RELEASE.$TARGET.$DATE' LOGFILE='' # use teeboth Perl wrapper @@ -111,10 +111,10 @@ PACKAGE_VERSION="" PACKAGE_NAME="" ASSUMED_NAME="" PROTOCOL="http" +IPOPT="" # use lftp by default when available -USE_LFTP= -lftp --version > /dev/null 2>&1 && USE_LFTP=yes +test -z "${USE_LFTP+x}" && lftp --version > /dev/null 2>&1 && USE_LFTP=yes PARALLEL_DOWNLOADS=10 WGET_RETRIES=${MAX_WGET_RETRIES:-0} @@ -194,8 +194,9 @@ fi #GROUP_BCONDS="yes" #LOGFILE='../LOGS/log.$PACKAGE_NAME.$DATE' #TITLECHANGE=no -# -SU_SUDO="" + +SU_SUDO="sudo" + if [ -n "$HOME_ETC" ]; then USER_CFG="$HOME_ETC/.builderrc" BUILDER_MACROS="$HOME_ETC/.builder-rpmmacros" @@ -215,37 +216,19 @@ if [ "$SCHEDTOOL" = "auto" ]; then fi if [ -n "$USE_PROZILLA" ]; then - GETURI="proz --no-getch -r -P ./ -t$WGET_RETRIES $PROZILLA_OPTS" - GETURI2="$GETURI" - OUTFILEOPT="-O" + GETURI=download_proz elif [ -n "$USE_AXEL" ]; then - GETURI="axel -a $AXEL_OPTS" - GETURI2="$GETURI" - OUTFILEOPT="-o" + GETURI=download_axel elif [ -n "$USE_LFTP" ]; then GETURI=download_lftp - GETURI2=$GETURI - OUTFILEOPT="" else - wget --help 2>&1 | grep -q -- ' --no-check-certificate ' && WGET_OPTS="$WGET_OPTS --no-check-certificate" - wget --help 2>&1 | grep -q -- ' --inet ' && WGET_OPTS="$WGET_OPTS --inet" - wget --help 2>&1 | grep -q -- ' --retry-connrefused ' && WGET_OPTS="$WGET_OPTS --retry-connrefused" - WGET_OPTS="$WGET_OPTS --user-agent=$USER_AGENT" - - GETURI="wget --passive-ftp -c -nd -t$WGET_RETRIES $WGET_OPTS" - GETURI2="wget -c -nd -t$WGET_RETRIES $WGET_OPTS" - OUTFILEOPT="-O" + GETURI=download_wget fi -GETLOCAL="cp -a" +GETLOCAL=${GETLOCAL:-cp -a} -if rpm --version 2>&1 | grep -q '4.0.[0-2]'; then - RPM="rpm" - RPMBUILD="rpm" -else - RPM="rpm" - RPMBUILD="rpmbuild" -fi +RPM="rpm" +RPMBUILD="rpmbuild" # # sanity checks @@ -257,9 +240,10 @@ if [ -d $HOME/rpm/SOURCES ]; then fi POLDEK_INDEX_DIR="$($RPM --eval %_rpmdir)/" -POLDEK_CMD="$SU_SUDO /usr/bin/poldek --noask" +POLDEK_CMD="$SU_SUDO /usr/bin/poldek" # TODO: add teeboth +# TODO: what this function does? run_poldek() { RES_FILE=$(tempfile) if [ -n "$LOGFILE" ]; then @@ -267,11 +251,11 @@ run_poldek() { if [ -n "$LASTLOG_FILE" ]; then echo "LASTLOG=$LOG" > $LASTLOG_FILE fi - (${NICE_COMMAND} ${POLDEK_CMD} `while test $# -gt 0; do echo "$1 ";shift;done` ; echo $? > ${RES_FILE})|tee -a $LOG + (${NICE_COMMAND} ${POLDEK_CMD} --noask `while test $# -gt 0; do echo "$1 ";shift;done` ; echo $? > ${RES_FILE})|tee -a $LOG # FIXME $exit_pldk undefined return $exit_pldk else - (${NICE_COMMAND} ${POLDEK_CMD} `while test $# -gt 0; do echo "$1 ";shift;done` ; echo $? > ${RES_FILE}) 1>&2 >/dev/null + (${NICE_COMMAND} ${POLDEK_CMD} --noask `while test $# -gt 0; do echo "$1 ";shift;done` ; echo $? > ${RES_FILE}) 1>&2 >/dev/null return `cat ${RES_FILE}` rm -rf ${RES_FILE} fi @@ -280,12 +264,54 @@ run_poldek() { #--------------------------------------------- # functions +download_prozilla() { + local outfile=$1 url=$2 retval + + proz --no-getch -r -P ./ -t$WGET_RETRIES $PROZILLA_OPTS -O "$outfile" "$url" + retval=$? + + return $retval +} + +download_axel() { + local outfile=$1 url=$2 retval + + axel -a $AXEL_OPTS -o "$outfile" "$url" + retval=$? + + return $retval +} + +download_wget() { + local outfile=$1 url=$2 retval wget_help + if [ -z "${WGET_OPTS_SET+x}" ]; then + wget_help="$(wget --help 2>&1)" + echo "$wget_help" | grep -q -- ' --no-check-certificate ' && WGET_OPTS="$WGET_OPTS --no-check-certificate" + echo "$wget_help" | grep -q -- ' --inet ' && WGET_OPTS="$WGET_OPTS --inet" + echo "$wget_help" | grep -q -- ' --retry-connrefused ' && WGET_OPTS="$WGET_OPTS --retry-connrefused" + echo "$wget_help" | grep -q -- ' --no-iri ' && WGET_OPTS="$WGET_OPTS --no-iri" + WGET_OPTS="-c -nd -t$WGET_RETRIES $WGET_OPTS --user-agent=$USER_AGENT $IPOPT --passive-ftp" + WGET_OPTS_SET=1 + fi + + wget $WGET_OPTS -O "$outfile" "$url" + retval=$? + if [ $retval -ne 0 ]; then + if [ "`echo $url | grep -E 'ftp://'`" ]; then + ${GETURI} -O "$outfile" "$url" + retval=$? + fi + fi + return $retval +} + download_lftp() { local outfile=$1 url=$2 retval tmpfile - # TODO: use mktemp - tmpfile=$outfile.tmp + tmpfile=$(tempfile) || exit 1 lftp -c " $([ "$DEBUG" = "yes" ] && echo "debug 5;") + $([ "$IPOPT" = "-4" ] && echo "set dns:order \"inet\";") + $([ "$IPOPT" = "-6" ] && echo "set dns:order \"inet6\";") set ssl:verify-certificate no; set net:max-retries $WGET_RETRIES; set http:user-agent \"$USER_AGENT\"; @@ -459,7 +485,8 @@ Usage: builder [--all-branches] [-D|--debug] [-V|--version] [--short-version] [ constructions. Set GROUP_BCONDS to yes to make use of it. --target , --target= - build for platform . ---init-rpm-dir - initialize ~/rpm directory structure +--init-rpm-dir, --init + - initialize ~/rpm directory structure --git-pld - force use of PLD git and distfiles --git-tld - force use of TLD git and distfiles (note: it will fall back to PLD git/df if package doesn't exist in TLD git) @@ -471,15 +498,17 @@ Usage: builder [--all-branches] [-D|--debug] [-V|--version] [--short-version] [ # create tempfile. as secure as possible tempfile() { - mktemp --tmpdir -t builder.$PACKAGE_NAME.XXXXXX || ${TMPDIR:-/tmp}/builder.$RANDOM.$$ + local prefix=builder.$PACKAGE_NAME${1:+.$1} + mktemp --tmpdir -t $prefix.XXXXXX || echo ${TMPDIR:-/tmp}/$prefix.$RANDOM.$$ } tempdir() { - mktemp --tmpdir -d builder.$PACKAGE_NAME.XXXXXX + local prefix=builder.$PACKAGE_NAME${1:+.$1} + mktemp --tmpdir -d $prefix.XXXXXX } # inserts git log instead of %changelog -# outputs name of modified file created by tempfile +# @output directory containing modified specfile insert_gitlog() { local SPECFILE=$1 specdir=$(tempdir) gitlog=$(tempfile) speclog=$(tempfile) @@ -499,7 +528,7 @@ insert_gitlog() { done > $gitlog # add link to full git logs - local giturl="http://git.tld-linux.org/?p=packages/$PACKAGE_NAME.git;a=log" + local giturl="http://git.tld-linux.org/?p=packages/${SPECFILE%.spec}.git;a=log" if [ -n "$CVSTAG" ]; then giturl="$giturl;h=$CVSTAG" fi @@ -547,14 +576,30 @@ teeboth() { # common changes: # - perl(Package::Name) -> perl-Package-Name depspecname() { - local package="$1" + local DEPS + + if [ $# -gt 0 ]; then + DEPS="$@" + else + DEPS=$(cat) + fi + + echo "$DEPS" | tr ' ' '\n' | sed -re ' + # perl virtual deps + /perl\(.*\)/{ + s/perl\((.*)\)/perl-\1/ + s/::/-/g + } - package=$(echo "$package" | sed -e '/perl(.*)/{s,perl(\(.*\)),perl-\1,;s,::,-,g};' -e 's/-\(devel\|static\)$//' ) - echo "$package" + s/apache\(EAPI\)-devel/apache-devel/ + + s/db-devel/db5.3-devel/ + s/libjpeg-devel/libjpeg-turbo-devel/ + ' } update_shell_title() { - [ -t 1 ] || return + [ -t 2 ] || return local len=${COLUMNS:-80} local msg="$(echo "$*" | cut -c-$len)" @@ -602,11 +647,6 @@ set_spec_target() { # runs rpm with minimal macroset minirpm() { - # we reset macros not to contain macros.build as all the %() macros are - # executed here, while none of them are actually needed. - # at the time of this writing macros.build + macros contained 70 "%(...)" macros. - safe_macrofiles=$(rpm $TARGET_SWITCH --showrc | awk -F: '/^macrofiles/ { gsub(/^macrofiles[ \t]+:/, "", $0); gsub(/:.*macros.build:/, ":", $0); print $0 } ') - # TODO: move these to /usr/lib/rpm/macros cat > $BUILDER_MACROS <<'EOF' %x8664 x86_64 amd64 ia32e @@ -659,7 +699,7 @@ minirpm() { %remove_etc_shells(p) %{p:} %lua_add_etc_shells() %{nil} %lua_remove_etc_shells() %{nil} -%required_jdk %{nil} +%required_jdk jdk %buildrequires_jdk %{nil} %pear_package_print_optionalpackages %{nil} EOF @@ -669,7 +709,12 @@ EOF %_sourcedir ./ EOF fi - eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --macros "$safe_macrofiles:$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1 + if rpm --version 2>&1 | grep -qE '5\.[0-9]+\.[0-9]+'; then + safe_macrofiles=$(rpm $TARGET_SWITCH --showrc | awk -F: '/^macrofiles/ { gsub(/^macrofiles[ \t]+:/, "", $0); print $0 } ') + eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --macros "$safe_macrofiles:$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1 + else + eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --load "$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1 + fi } cache_rpm_dump() { @@ -783,6 +828,13 @@ parse_spec() { update_shell_title "parse_spec: OK!" } +# aborts program abnormally +die() { + local rc=${2:-1} + echo >&2 "$PROGRAM: ERROR: $*" + exit $rc +} + Exit_error() { if [ -n "$DEBUG" ]; then set -x @@ -801,7 +853,11 @@ Exit_error() { exit 2 ;; "err_no_spec_in_repo" ) remove_build_requires - echo >&2 "Error: spec file not stored in PLD repo." + echo >&2 "Error: spec file not stored in repository." + if [ -n "$2" ]; then + echo >&2 "Tried: $2" + fi + exit 3 ;; "err_no_source_in_repo" ) remove_build_requires @@ -878,8 +934,10 @@ init_builder() { PACKAGE_DIR=$REPO_DIR/$ASSUMED_NAME fi else - REPO_DIR="." - PACKAGE_DIR="." + TOP_DIR=$(pwd) + PACKAGE_DIR=$TOP_DIR + REPO_DIR=$PACKAGE_DIR + RPMBUILDOPTS="$RPMBUILDOPTS --define '_topdir $TOP_DIR' --define '_builddir %_topdir' --define '_rpmdir %_topdir' --define '_srcrpmdir %_topdir'" fi export GIT_WORK_TREE=$PACKAGE_DIR export GIT_DIR=$PACKAGE_DIR/.git @@ -918,10 +976,17 @@ create_git_repo() { fi [ -d "$ASSUMED_NAME/.git" ] || NEW_REPO=yes ssh $GIT_PUSH create ${ASSUMED_NAME} || Exit_error err_cvs_add_failed + ( + set -e git init - git remote add $REMOTE_PLD ${GIT_SERVER}/${PACKAGES_DIR}/${ASSUMED_NAME}.git && \ - git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/${PACKAGES_DIR}/${ASSUMED_NAME} \ - || Exit_error err_remote_problem $REMOTE_PLD + git remote add $REMOTE_PLD ${GIT_SERVER}/${PACKAGES_DIR}/${ASSUMED_NAME}.git + git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/${PACKAGES_DIR}/${ASSUMED_NAME} + + git config --local push.default current + git config --local branch.master.remote $REMOTE_PLD + git config --local branch.master.merge refs/heads/master + ) + test $? = 0 || Exit_error err_remote_problem $REMOTE_PLD } get_spec() { @@ -938,7 +1003,7 @@ get_spec() { if [ "$NOCVSSPEC" != "yes" ]; then if [ -z "$DEPTH" ]; then if [ -d "$PACKAGE_DIR/.git" ]; then - git fetch $REMOTE_PLD || Exit_error err_no_spec_in_repo + git fetch $IPOPT $REMOTE_PLD || Exit_error err_no_spec_in_repo elif [ "$ADD_PACKAGE_CVS" = "yes" ]; then if [ ! -r "$PACKAGE_DIR/$SPECFILE" ]; then echo "ERROR: No package to add ($PACKAGE_DIR/$SPECFILE)" >&2 @@ -948,13 +1013,16 @@ get_spec() { else ( unset GIT_WORK_TREE - git clone -o $REMOTE_PLD ${GIT_SERVER}/${PACKAGES_DIR}/${ASSUMED_NAME}.git || { + git clone $IPOPT -o $REMOTE_PLD ${GIT_SERVER}/${PACKAGES_DIR}/${ASSUMED_NAME}.git || { # softfail if new package, i.e not yet added to PLD rep [ ! -f "$PACKAGE_DIR/$SPECFILE" ] && Exit_error err_no_spec_in_repo - echo "Warning: package not in CVS - assuming new package" + echo "Warning: package not in Git - assuming new package" NOCVSSPEC="yes" } - git config --local --add "remote.$REMOTE_PLD.fetch" 'refs/notes/*:refs/notes/*' + git config --local --add "remote.$REMOTE_PLD.fetch" 'refs/notes/*:refs/notes/*' + git config --local --add "remote.$REMOTE_PLD.push" 'refs/notes/*:refs/notes/*' + git config --local --add "remote.$REMOTE_PLD.push" HEAD + git config --local push.default current git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/${PACKAGES_DIR}/${ASSUMED_NAME} ) fi @@ -965,7 +1033,10 @@ get_spec() { fi git init git remote add $REMOTE_PLD ${GIT_SERVER}/${PACKAGES_DIR}/${ASSUMED_NAME}.git - git config --local --add "remote.$REMOTE_PLD.fetch" 'refs/notes/*:refs/notes/*' + git config --local --add "remote.$REMOTE_PLD.fetch" 'refs/notes/*:refs/notes/*' + git config --local --add "remote.$REMOTE_PLD.push" 'refs/heads/*:refs/remotes/origin/*' + git config --local --add "remote.$REMOTE_PLD.push" HEAD + git config --local push.default current git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/${PACKAGES_DIR}/${ASSUMED_NAME} CVSTAG=${CVSTAG:-"master"} fi @@ -973,19 +1044,19 @@ get_spec() { if [ -z "$ALL_BRANCHES" ]; then refs="${CVSTAG}:remotes/${REMOTE_PLD}/${CVSTAG}" fi - git fetch $DEPTH $REMOTE_PLD $refs || { + git fetch $IPOPT $DEPTH $REMOTE_PLD $refs || { echo >&2 "Error: branch $CVSTAG does not exist" exit 3 } fi - git fetch $REMOTE_PLD 'refs/notes/*:refs/notes/*' + git fetch $IPOPT $REMOTE_PLD 'refs/notes/*:refs/notes/*' cvsignore_df .gitignore # add default log format to .gitignore if it is relative to package dir if [ -n "$LOGFILE" -a "$LOGFILE" = "${LOGFILE##*/}" ]; then # substitute known "macros" to glob - local logfile=$(echo "$LOGFILE" | sed -e 's,\$\(PACKAGE_NAME\|DATE\|TARGET\),*,g') + local logfile=$(echo "$LOGFILE" | sed -r -e 's,\$(PACKAGE_(NAME|VERSION|RELEASE)|DATE|TARGET),*,g') if [ "$logfile" ]; then cvsignore_df "$logfile" fi @@ -993,7 +1064,7 @@ get_spec() { # create symlinks for tools if [ "$SYMLINK_TOOLS" != "no" -a -d "$PACKAGE_DIR" ]; then - for a in dropin md5 adapter builder {relup,compile,repackage,rsync,pearize}.sh pldnotify.awk; do + for a in dropin md5 builder {relup,compile,repackage,rsync,pearize}.sh; do # skip tools that don't exist in top dir [ -f $a ] || continue # skip tools that already exist @@ -1007,7 +1078,7 @@ get_spec() { if [ -n "$CVSTAG" ]; then local _rev=$(get_pkgrev "$CVSTAG") echo "$_rev" | grep -q -E "^ERROR$" || CVSTAG="$_rev" - if git rev-parse --verify -q "$CVSTAG"; then + if git rev-parse --verify -q "$CVSTAG" >/dev/null; then git checkout "$CVSTAG" -- elif git rev-parse --verify -q "refs/remotes/${REMOTE_PLD}/$CVSTAG"; then git checkout -t "refs/remotes/${REMOTE_PLD}/$CVSTAG" > /dev/null @@ -1015,7 +1086,8 @@ get_spec() { if [ $(git rev-parse "$CVSTAG") != $(git rev-parse HEAD) ]; then Exit_error "err_no_checkut" "$CVSTAG" fi - git merge --ff-only '@{u}' + + git merge --ff-only '@{u}' git symbolic-ref -q HEAD > /dev/null && [ "$NOCVSSPEC" != "yes" ] && if [ -n "$CVSDATE" ]; then git checkout $(git rev-list -n1 --before="'$CVSDATE'" $CVSTAG) || exit 1 @@ -1023,7 +1095,7 @@ get_spec() { fi if [ ! -f "$PACKAGE_DIR/$SPECFILE" ]; then - Exit_error err_no_spec_in_repo + Exit_error err_no_spec_in_repo "$PACKAGE_DIR/$SPECFILE" fi if [ "$CHMOD" = "yes" -a -n "$SPECFILE" ]; then @@ -1035,15 +1107,22 @@ get_spec() { set_spec_target } +# find mirrors in this order. first match wins: +# - package dir (~/rpm/packages/foo) +# - repository dir (~/rpm/packages) +# - tools dir dir (~/rpm/packages/rpm-build-tools) find_mirror() { - cd "$REPO_DIR" local url="$1" - if [ ! -f "mirrors" ] ; then - ln -s ../rpm-build-tools/mirrors . - fi - IFS="|" + update_shell_title "find_mirror[$url][$REPO_DIR]" + + # NOTE: as while loop runs in subshell, + # we use exit 2 to indicate that the match was found + # otherwise we end up outputing mirror url and origin url. + local origin mirror name rest ol prefix + IFS="|" + cat "$PACKAGE_DIR/mirrors" "$REPO_DIR/mirrors" "$REPO_DIR/../rpm-build-tools/mirrors" /dev/null 2>/dev/null | \ while read origin mirror name rest; do # skip comments and empty lines if [ -z "$origin" ] || [ "${origin#\#}" != "$origin" ]; then @@ -1054,10 +1133,9 @@ find_mirror() { if [ "$prefix" = "$origin" ] ; then suffix=$(echo "$url" | cut -b $((ol+1))-) echo -n "$mirror$suffix" - return 0 + exit 2 fi - done < mirrors - echo "$url" + done && echo "$url" } # Warning: unpredictable results if same URL used twice @@ -1136,7 +1214,7 @@ cvsignore_df() { if [ "$CVSIGNORE_DF" != "yes" ]; then return fi - cvsignore=${PACKAGE_DIR}/.gitignore + local cvsignore=${PACKAGE_DIR}/.git/info/exclude # add only if not yet there if ! awk -vf="$1" -vc=1 '$0 == f { c = 0 } END { exit c }' $cvsignore 2>/dev/null; then @@ -1305,11 +1383,7 @@ get_files() { uri="df: $uri" fi update_shell_title "${GETURI%% *}: $uri" - ${GETURI} ${OUTFILEOPT} "$target" "$url" || \ - if [ "`echo $url | grep -E 'ftp://'`" ]; then - update_shell_title "${GETURI2%% *}: $url" - ${GETURI2} ${OUTFILEOPT} "$target" "$url" - fi + ${GETURI} "$target" "$url" fi if [ -s "$target" ]; then @@ -1327,11 +1401,7 @@ get_files() { im="$i" fi update_shell_title "${GETURI%% *}: $im" - ${GETURI} ${OUTFILEOPT} "$target" "$im" || \ - if [ "`echo $im | grep -E 'ftp://'`" ]; then - update_shell_title "${GETURI2%% *}: $im" - ${GETURI2} ${OUTFILEOPT} "$target" "$im" - fi + ${GETURI} "$target" "$im" test -s "$target" || rm -f "$target" fi @@ -1356,11 +1426,7 @@ get_files() { FROM_DISTFILES=2 rm -f $target update_shell_title "${GETURI%% *}: $url" - ${GETURI} ${OUTFILEOPT} "$target" "$url" || \ - if [ "`echo $url | grep -E 'ftp://'`" ]; then - update_shell_title "${GETURI2%% *}: $url" - ${GETURI2} ${OUTFILEOPT} "$target" "$url" - fi + ${GETURI} "$target" "$url" test -s "$target" || rm -f "$target" fi done @@ -1443,7 +1509,7 @@ tag_files() { if tag_exist $_tag || [ -n "$CVS_FORCE" ]; then update_shell_title "tag sources: $_tag" git $OPTIONS $_tag || exit - git push $CVS_FORCE $REMOTE_PLD tag $_tag || Exit_error err_remote_problem $REMOTE_PLD + git push $IPOPT $CVS_FORCE $REMOTE_PLD tag $_tag || Exit_error err_remote_problem $REMOTE_PLD else echo "Tag $_tag already exists and points to the same commit" fi @@ -1547,50 +1613,61 @@ set_version() { " $specfile } +# try to upgrade .spec to new version +# if --upgrade-version is specified, use that as new version, otherwise invoke pldnotify to find new version +# +# return 1: if .spec was updated +# return 0: no changes to .spec +# exit 1 in case of error try_upgrade() { - if [ -n "$TRY_UPGRADE" ]; then - local TNOTIFY TNEWVER TOLDVER - update_shell_title "build_package: try_upgrade" + if [ -z "$TRY_UPGRADE" ]; then + return 0 + fi - cd "$PACKAGE_DIR" - - if [ "$UPGRADE_VERSION" ]; then - TNEWVER=$UPGRADE_VERSION - else - if [ -n "$FLOAT_VERSION" ]; then - TNOTIFY=$($APPDIR/pldnotify.awk ${BE_VERBOSE:+-vDEBUG=1} $SPECFILE -n) || exit 1 - else - TNOTIFY=$($APPDIR/pldnotify.awk ${BE_VERBOSE:+-vDEBUG=1} $SPECFILE) || exit 1 - fi + local TNOTIFY TNEWVER TOLDVER + update_shell_title "build_package: try_upgrade" - # pldnotify.awk does not set exit codes, but it has match for ERROR - # in output which means so. - if [[ "$TNOTIFY" = *ERROR* ]]; then - echo >&2 "$TNOTIFY" - exit 1 - fi + cd "$PACKAGE_DIR" - TNEWVER=$(echo $TNOTIFY | awk '{ match($4,/\[NEW\]/); print $5 }') + if [ "$UPGRADE_VERSION" ]; then + TNEWVER=$UPGRADE_VERSION + echo "Updating spec file to version $TNEWVER" + else + if [ -n "$FLOAT_VERSION" ]; then + TNOTIFY=$(pldnotify ${BE_VERBOSE:+-vDEBUG=1} $SPECFILE -n) || exit 1 + else + TNOTIFY=$(pldnotify ${BE_VERBOSE:+-vDEBUG=1} $SPECFILE) || exit 1 fi - if [ -n "$TNEWVER" ]; then - TOLDVER=`echo $TNOTIFY | awk '{ print $3; }'` - echo "New version found, updating spec file from $TOLDVER to version $TNEWVER" - if [ "$REVERT_BROKEN_UPGRADE" = "yes" ]; then - cp -f $SPECFILE $SPECFILE.bak - fi - chmod +w $SPECFILE - set_release $SPECFILE $PACKAGE_RELEASE 1 - set_version $SPECFILE $PACKAGE_VERSION $TNEWVER - parse_spec - if [ "$PACKAGE_VERSION" != "$TNEWVER" ]; then - echo >&2 "Upgrading version failed, you need to update spec yourself" - exit 1 - fi - return 1 + # pldnotify does not set exit codes, but it has match for ERROR + # in output which means so. + if [[ "$TNOTIFY" = *ERROR* ]]; then + echo >&2 "$TNOTIFY" + exit 1 fi + + TOLDVER=`echo $TNOTIFY | awk '{ print $3; }'` + echo "New version found, updating spec file from $TOLDVER to version $TNEWVER" + + TNEWVER=$(echo $TNOTIFY | awk '{ match($4,/\[NEW\]/); print $5 }') + fi + + if [ -z "$TNEWVER" ]; then + return 0 + fi + + if [ "$REVERT_BROKEN_UPGRADE" = "yes" ]; then + cp -f $SPECFILE $SPECFILE.bak fi - return 0 + chmod +w $SPECFILE + set_version $SPECFILE $PACKAGE_VERSION $TNEWVER + set_release $SPECFILE $PACKAGE_RELEASE 1 + parse_spec + if [ "$PACKAGE_VERSION" != "$TNEWVER" ]; then + echo >&2 "Upgrading version failed, you need to update spec yourself" + exit 1 + fi + return 1 } build_package() { @@ -1634,9 +1711,21 @@ build_package() { fi fi + # unset these, should not be exposed to builder shell! + unset GIT_WORK_TREE GIT_DIR + # these are set by jenkins + unset GIT_PREVIOUS_COMMIT GIT_URL GIT_PREVIOUS_SUCCESSFUL_COMMIT GIT_BRANCH GIT_COMMIT + # this may be set by user + unset GIT_SSH + # may be set by user + unset GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_TESTING_PORCELAIN_COMMAND_LIST + # fail if something still set + env | grep ^GIT_ && Exit_error err_build_fail + local specdir=$(insert_gitlog $SPECFILE) + ulimit -c unlimited # FIXME: eval here is exactly why? - PATH=$CLEAN_PATH eval teeboth "'$logfile'" ${NICE_COMMAND} $RPMBUILD $TARGET_SWITCH $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $RPMBUILDOPTS $BCOND --define \'_specdir $PACKAGE_DIR\' --define \'_sourcedir $PACKAGE_DIR\' $specdir/$SPECFILE + PATH=$CLEAN_PATH eval teeboth "'$logfile'" ${TIME_COMMAND} ${NICE_COMMAND} $RPMBUILD $TARGET_SWITCH $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $RPMBUILDOPTS $BCOND --define \'_specdir $PACKAGE_DIR\' --define \'_sourcedir $PACKAGE_DIR\' $specdir/$SPECFILE retval=$? rm -r $specdir @@ -1789,13 +1878,13 @@ run_sub_builder() { package_name="${1}" update_shell_title "run_sub_builder $package_name" # - # No i tutaj bym chcia³ zrobiæ sztuczn± inteligencjê, która spróbuje tego - # pakieta zbudowaæ. Aktualnie niewiele dziala, bo generalnie nie widze do + # No i tutaj bym chciał zrobić sztuczną inteligencję, która spróbuje tego + # pakieta zbudować. Aktualnie niewiele dziala, bo generalnie nie widze do # konca algorytmu... Ale damy rade. :) Na razie po prostu sie wyjebie tak samo # jakby nie bylo tego kawalka kodu. # - # Update: Poprawi³em parê rzeczy i zaczê³o generowaæ pakiety spoza zadanej listy. - # Jednym s³owem budowanie niespoldkowanych zale¿no¶ci dzia³a w paru przypadkach. + # Update: Poprawiłem parę rzeczy i zaczęło generować pakiety spoza zadanej listy. + # Jednym słowem budowanie niespoldkowanych zależności działa w paru przypadkach. # # # y0shi. @@ -1820,6 +1909,46 @@ run_sub_builder() { NOT_INSTALLED_PACKAGES="$NOT_INSTALLED_PACKAGES $package_name" } +# install package with poldek +# @return exit code from poldek +# +# this requires following sudo rules: +# - poldek --noask --caplookup -ug +poldek_install() { + LANG=C $POLDEK_CMD --noask --caplookup --uniq -ug "$@" +} + +# install packages +# +# this requires following sudo rules: +# - poldek -q --update --upa +install_packages() { + # sync poldek indexes once per invocation + if [ -z "$package_indexes_updated" ]; then + update_shell_title "poldek: update indexes" + $POLDEK_CMD -q --update --upa --mo=nodesc + package_indexes_updated=true + fi + + update_shell_title "install packages: $*" + poldek_install "$@" && return + + # retry install, install packages one by one + # this is slower one + local rc=0 package + for package in $*; do + package=$(depspecname $package) + update_shell_title "install package: $package" + poldek_install "$package" || rc=$? + done + return $rc +} + +uninstall_packages() { + update_shell_title "uninstall packages: $*" + $POLDEK_CMD --noask --nofollow -ev "$@" +} + spawn_sub_builder() { package_name="${1}" update_shell_title "spawn_sub_builder $package_name" @@ -1882,25 +2011,25 @@ display_branches() { git branch -r 2>/dev/null | grep "^ ${REMOTE_PLD}" | grep -v ${REMOTE_PLD}/HEAD | sed "s#^ *${REMOTE_PLD}/##" | xargs } -# checks a given list of packages/files/provides agains current rpmdb. +# checks a given list of packages/files/provides against current rpmdb. # outputs all dependencies which current rpmdb doesn't satisfy. # input can be either STDIN or parameters _rpm_prov_check() { - local DEPS + local deps out if [ $# -gt 0 ]; then - DEPS="$@" + deps="$@" else - DEPS=$(cat) + deps=$(cat) fi - DEPS=$(LANG=C rpm -q --whatprovides $DEPS 2>&1 | awk '/^(error:|no package provides)/ { print }') + out=$(LC_ALL=C rpm -q --whatprovides $deps 2>&1) # packages - echo "$DEPS" | awk '/^no package provides/ { print $NF }' + echo "$out" | awk '/^no package provides/ { print $NF }' # other deps (files) - echo "$DEPS" | awk -F: '/^error:.*No such file/{o = $2; gsub("^ file ", "", o); print o}' + echo "$out" | sed -rne 's/file (.*): No such file or directory/\1/p' } # checks if given package/files/provides exists in rpmdb. @@ -1920,44 +2049,26 @@ _rpm_cnfl_check() { # install deps via information from 'rpm-getdeps' or 'rpm --specsrpm' install_build_requires_rpmdeps() { + local DEPS CNFL if [ "$FETCH_BUILD_REQUIRES_RPMGETDEPS" = "yes" ]; then # TODO: Conflicts list doesn't check versions - local CNFL=$(rpm-getdeps $BCOND $SPECFILE 2> /dev/null | awk '/^\-/ { print $3 } ' | _rpm_cnfl_check | xargs) - local DEPS=$(rpm-getdeps $BCOND $SPECFILE 2> /dev/null | awk '/^\+/ { print $3 } ' | _rpm_prov_check | xargs) + CNFL=$(eval rpm-getdeps $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '/^\-/ { print $3 } ' | _rpm_cnfl_check | xargs) + DEPS=$(eval rpm-getdeps $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '/^\+/ { print $3 } ' | _rpm_prov_check | xargs) fi if [ "$FETCH_BUILD_REQUIRES_RPMSPECSRPM" = "yes" ]; then - local CNFL=$(rpm -q --specsrpm --conflicts $BCOND $SPECFILE | awk '{print $1}' | _rpm_cnfl_check | xargs) - local DEPS=$(rpm -q --specsrpm --requires $BCOND $SPECFILE | awk '{print $1}' | _rpm_prov_check | xargs) + CNFL=$(eval rpm -q --specsrpm --conflicts $BCOND $RPMOPTS $SPECFILE | awk '{print $1}' | _rpm_cnfl_check | xargs) + DEPS=$(eval rpm -q --specsrpm --requires $BCOND $RPMOPTS $SPECFILE | awk '{print $1}' | _rpm_prov_check | xargs) fi - if [ -n "$CNFL" ] || [ -n "$DEPS" ]; then - echo "fetch BuildRequires: install [$DEPS]; remove [$CNFL]" - update_shell_title "poldek: install [$DEPS]; remove [$CNFL]" - $SU_SUDO /usr/bin/poldek -q --update || $SU_SUDO /usr/bin/poldek -q --upa - fi if [ -n "$CNFL" ]; then - update_shell_title "uninstall conflicting packages: $CNFL" - echo "Trying to uninstall conflicting packages ($CNFL):" - $SU_SUDO /usr/bin/poldek --noask --nofollow -ev $CNFL - fi - - while [ "$DEPS" ]; do - update_shell_title "install deps: $DEPS" - echo "Trying to install dependencies ($DEPS):" - local log=.${SPECFILE}_poldek.log - LANG=C $SU_SUDO /usr/bin/poldek --noask --caplookup -uGqQ $DEPS | tee $log - failed=$(awk '/^error:/{a=$2; sub(/^error: /, "", a); sub(/:$/, "", a); print a}' $log) - rm -f $log - local ok - if [ -n "$failed" ]; then - for package in $failed; do - spawn_sub_builder -bb $(depspecname $package) && ok="$ok $package" - done - DEPS="$ok" - else - DEPS="" - fi - done + echo "Uninstall conflicting packages: $CNFL" + uninstall_packages $CNFL + fi + + if [ -n "$DEPS" ]; then + echo "Install dependencies: $DEPS" + install_packages $DEPS + fi } fetch_build_requires() @@ -1972,149 +2083,17 @@ fetch_build_requires() return fi - # XXX is this ugliest code written in human history still needed? - echo "All packages installed by fetch_build_requires() are written to:" - echo "`pwd`/.${SPECFILE}_INSTALLED_PACKAGES" - echo "" - echo "If anything fails, you may get rid of them by executing:" - echo "poldek -e \`cat `pwd`/.${SPECFILE}_INSTALLED_PACKAGES\`" - echo "" - echo > `pwd`/.${SPECFILE}_INSTALLED_PACKAGES - for package_item in $(cat $SPECFILE | grep -B100000 ^%changelog|grep -v ^#|grep BuildRequires|grep -v ^-|sed -e "s/^.*BuildRequires://g"|awk '{print $1}'|sed -e s,perl\(,perl-,g -e s,::,-,g -e s,\(.*\),,g -e s,%{,,g -e s,},,g|grep -v OpenGL-devel|sed -e s,sh-utils,coreutils,g -e s,fileutils,coreutils,g -e s,textutils,coreutils,g -e s,kgcc_package,gcc,g -e s,\),,g) - do - package_item=$(echo $package_item|sed -e s,rpmbuild,rpm-build,g |sed -e s,__perl,perl,g |sed -e s,gasp,binutils-gasp,g -e s,binutils-binutils,binutils,g -e s,apxs,apache,g|sed -e s,apache\(EAPI\)-devel,apache-devel,g -e s,kernel-headers\(netfilter\),kernel-headers,g -e s,awk,mawk,g -e s,mmawk,mawk,g -e s,motif,openmotif,g -e s,openopenmotif,openmotif,g) - GO="yes" - package=$(basename "$package_item"|sed -e "s/}$//g") - COND_ARCH_TST=$(cat $SPECFILE|grep -B1 BuildRequires|grep -B1 $package|grep ifarch|sed -e "s/^.*ifarch//g") - mach=$(uname -m) - - COND_TST=`cat $SPECFILE|grep BuildRequires|grep "$package"` - if `echo $COND_TST|grep -q '^BuildRequires:'`; then - if [ "$COND_ARCH_TST" != "" ] && [ "`echo $COND_ARCH_TST|sed -e "s/i.86/ix86/g"`" != "`echo $mach|sed -e "s/i.86/ix86/g"`" ]; then - GO="yes" - fi - # bcond: - else - COND_NAME=`echo $COND_TST|sed -e s,:BuildRequires:.*$,,g` - GO="" - # %{without} - if `echo $COND_TST|grep -q 'without_'`; then - COND_NAME=`echo $COND_NAME|sed -e s,^.*without_,,g` - if `echo $COND_TST|grep -q !`; then - COND_STATE="with" - else - COND_STATE="wout" - fi - COND_WITH=`echo $AVAIL_BCONDS_WITH|grep "<$COND_NAME>"` - COND_WITHOUT=`echo $AVAIL_BCONDS_WITHOUT|grep "<$COND_NAME>"` - if [ -n "$COND_WITHOUT" ] || [ -z "$COND_WITH" ]; then - COND_ARGV="wout" - else - COND_ARGV="with" - fi - # %{with} - elif `echo $COND_TST|grep -q 'with_'`; then - COND_NAME=`echo $COND_NAME|sed -e s,^.*with_,,g` - if `echo $COND_TST|grep -q !`; then - COND_STATE="wout" - else - COND_STATE="with" - fi - COND_WITH=`echo $AVAIL_BCONDS_WITH|grep "<$COND_NAME>"` - COND_WITHOUT=`echo $AVAIL_BCONDS_WITHOUT|grep "<$COND_NAME>"` - if [ -n "$COND_WITH" ] || [ -z "$COND_WITHOUT" ]; then - COND_ARGV="with" - else - COND_ARGV="wout" - fi - fi - RESULT="${COND_STATE}-${COND_ARGV}" - case "$RESULT" in - "with-wout" | "wout-with" ) - GO="" - ;; - "wout-wout" | "with-with" ) - GO="yes" - ;; - * ) - echo "Action '$RESULT' was not defined for package '$package_item'" - GO="yes" - ;; - esac - fi + die "need rpm-getdeps tool" +} - if [ "$GO" = "yes" ]; then - if [ "`rpm -q $package|sed -e "s/$package.*/$package/g"`" != "$package" ]; then - echo "Testing if $package has subrequirements..." - run_poldek -t -i $package --dumpn=".$package-req.txt" - if [ -f ".$package-req.txt" ]; then - for package_name in `cat ".$package-req.txt"|grep -v ^#` - do - if [ "$package_name" = "$package" ]; then - echo "Installing BuildRequired package:\t$package_name" - update_shell_title "Installing BuildRequired package: ${package_name}" - install_required_packages $package - else - echo "Installing (sub)Required package:\t$package_name" - update_shell_title "Installing (sub)Required package: ${package_name}" - install_required_packages $package_name - fi - case $? in - 0) - INSTALLED_PACKAGES="$package_name $INSTALLED_PACKAGES" - echo $package_name >> `pwd`/.${SPECFILE}_INSTALLED_PACKAGES - ;; - *) - echo "Attempting to run spawn sub - builder..." - echo "Package installation failed:\t$package_name" - run_sub_builder $package_name - if [ $? -eq 0 ]; then - install_required_packages $package_name - case $? in - 0) - INSTALLED_PACKAGES="$package_name $INSTALLED_PACKAGES" - echo $package_name >> `pwd`/.${SPECFILE}_INSTALLED_PACKAGES - ;; - *) - NOT_INSTALLED_PACKAGES="$package_name $NOT_INSTALLED_PACKAGES" - ;; - esac - fi - ;; - esac - done - rm -f ".$package-req.txt" - else - echo "Attempting to run spawn sub - builder..." - echo "Package installation failed:\t$package" - run_sub_builder $package - if [ $? -eq 0 ]; then - install_required_packages $package - case $? in - 0) - INSTALLED_PACKAGES="$package_name $INSTALLED_PACKAGES" - echo $package_name >> `pwd`/.${SPECFILE}_INSTALLED_PACKAGES - ;; - *) - NOT_INSTALLED_PACKAGES="$package_name $NOT_INSTALLED_PACKAGES" - ;; - esac - fi - fi - else - echo "Package $package is already installed. BuildRequirement satisfied." - fi - fi - done - if [ "$NOT_INSTALLED_PACKAGES" != "" ]; then - echo >&2 "Unable to install following packages and their dependencies:" - for pkg in "$NOT_INSTALLED_PACKAGES" - do - echo $pkg - done - remove_build_requires - exit 8 - fi +init_repository() { + local remoterepo=$1 + local localrepo=$2 + + if [ ! -e $localrepo ]; then + git clone $IPOPT -o $REMOTE_PLD ${GIT_SERVER}/$remoterepo $localrepo + git --git-dir=$localrepo/.git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/$remoterepo + fi } init_rpm_dir() { @@ -2122,16 +2101,16 @@ init_rpm_dir() { local rpmdir=$(eval $RPM $RPMOPTS --eval '%{_rpmdir}') local buildir=$(eval $RPM $RPMOPTS --eval '%{_builddir}') local srpmdir=$(eval $RPM $RPMOPTS --eval '%{_srcrpmdir}') + local TEMPLATES=template-specs local tmp echo "Initializing rpm directories to $TOP_DIR from $GIT_SERVER" mkdir -p $TOP_DIR $rpmdir $buildir $srpmdir cd "$TOP_DIR" - if [ ! -e ../rpm-build-tools ]; then - git clone ${GIT_SERVER}/${PACKAGES_DIR}/rpm-build-tools.git ../rpm-build-tools - fi - for a in adapter builder fetchsrc_request compile repackage; do + init_repository ${PACKAGES_DIR}/rpm-build-tools.git ../rpm-build-tools + init_repository projects/$TEMPLATES ../$TEMPLATES + for a in builder fetchsrc_request compile repackage; do ln -sf ../rpm-build-tools/${a}.sh $a done for a in md5; do @@ -2160,12 +2139,15 @@ if [ $# = 0 ]; then exit 1 fi +# stuff global $BUILDER_OPTS from env as args +if [ "$BUILDER_OPTS" ]; then + set -- "$BUILDER_OPTS" "$@" +fi + while [ $# -gt 0 ]; do case "${1}" in -4|-6) - # NOTE: we should be fetcher specific, like fille WGET_OPTS, but - # unfortunately $GETURI is already formed - GETURI="$GETURI $1" + IPOPT="${1}" shift ;; -5 | --update-md5) @@ -2393,7 +2375,7 @@ while [ $# -gt 0 ]; do -Upi | --update-poldek-indexes ) UPDATE_POLDEK_INDEXES="yes" shift ;; - --init-rpm-dir) + --init-rpm-dir|--init) COMMAND="init_rpm_dir" shift ;; -u | --try-upgrade ) @@ -2418,7 +2400,7 @@ while [ $# -gt 0 ]; do ;; --alt_kernel) shift - RPMOPTS="${RPMOPTS} --define \"alt_kernel $1\"" + RPMOPTS="${RPMOPTS} --define \"alt_kernel $1\" --define \"build_kernels $1\"" shift ;; --short-circuit) @@ -2519,6 +2501,9 @@ else NICE_COMMAND="nice -n ${DEF_NICE_LEVEL}" fi +# see time(1) for output format that could be used +TIME_COMMAND="time -p" + update_shell_title "$COMMAND" case "$COMMAND" in "show_bconds") @@ -2694,6 +2679,7 @@ case "$COMMAND" in fi get_files $SOURCES $PATCHES check_md5 $SOURCES + fetch_build_requires ;; "update_md5" ) init_builder diff --git a/dropin b/dropin new file mode 100755 index 0000000..f5697cf --- /dev/null +++ b/dropin @@ -0,0 +1,4 @@ +#!/bin/sh +echo Uploading $* +chmod 644 "$@" +scp -Bp "$@" dropin@dropin.tld-linux.org: diff --git a/kde4send2builders.sh b/kde4send2builders.sh deleted file mode 100755 index 5a42d93..0000000 --- a/kde4send2builders.sh +++ /dev/null @@ -1,205 +0,0 @@ -#!/bin/sh -# Authors: -# - Bartosz Świątek (shadzik@tld-linux.org) -# -# helps sending kde4 specs in proper order with or without autotags - -usage() { - echo "Usage: $0 OPTIONS SPECS" - echo "" - echo "Where OPTIONS are:" - echo "" - echo " -d --distro VALUE" - echo " set distro, probably th or ti will fit the most" - echo " -at --with-auto-tag" - echo " send with current autotag, default no" - echo " -b --builder VALUE" - echo " choose a particular builder, default all" - echo " -p --priority VALUE (default: 2)" - echo " -s --skip-fetch-tags (default: no)" - echo " skip git fetch --tags when getting autotag" - echo " -h --help" - echo " show this help" - echo "" - echo "Choose SPECS out of:" - echo "" - echo "all - all * (libs, base, other, koffice, l10n)" - echo "libs - kdelibs and kdepimlibs" - echo "base - kdebase* oxygen-icons" - echo "other - all other * except libs and base" - echo "koffice - koffice" - echo "l10n - l10n" - echo "kdevelop - devplatform, kdevelop-*" - echo "almost-all - all but koffice and l10n" - echo "" - exit 0 -} - -DIST= -ATAG=no -SENDPRIO= -BUILDER= -PRIO=2 -SKIPFETCHTAGS=0 -#SPECDIR=$(rpm -E %_specdir) -SPECDIR=~/rpm - -LIBS="kdelibs.spec kdepimlibs.spec" -BASE="kactivities oxygen-icons.spec kde-workspace.spec kde-runtime.spec kde-baseapps.spec kde-wallpapers.spec" -OTHER="jovie.spec \ -kaccessible.spec \ -kmouth.spec \ -kmousetool.spec \ -kmag.spec \ -ark.spec \ -filelight.spec \ -kcalc.spec \ -kcharselect.spec \ -kdf.spec \ -kfloppy.spec \ -kgpg.spec \ -kremotecontrol.spec \ -ktimer.spec \ -kwallet.spec \ -superkaramba.spec \ -sweeper.spec \ -python-PyKDE4.spec \ -kdeadmin.spec \ -libkexiv2.spec \ -kdeartwork.spec \ -kdegames.spec \ -kdemultimedia.spec \ -kdenetwork.spec \ -kdepim-runtime.spec \ -kdepim.spec -marble.spec \ -kdeplasma-addons.spec \ -kdewebdev.spec \ -libkdcraw.spec \ -libkdeedu.spec \ -libkipi.spec \ -libksane.spec \ -gwenview.spec \ -analitza.spec \ -kalgebra.spec \ -kamera.spec \ -kate.spec \ -kcolorchooser.spec \ -kgamma.spec \ -kolourpaint.spec \ -konsole.spec \ -kruler.spec \ -ksnapshot.spec \ -okular.spec \ -kdegraphics-mobipocket.spec \ -kdegraphics-strigi-analyzer.spec \ -kdegraphics-thumbnailers.spec \ -svgpart.spec \ -ksaneplugin.spec \ -kdetoys.spec" -KOFFICE="koffice.spec koffice-l10n.spec" -L10N="l10n.spec" -KDEVELOP="kdevplatform.spec \ -kdevelop.spec -kdevelop-plugin-php.spec" - -while [ $# -gt 0 ]; do - case "$1" in - --distro | -d ) - DIST=$2 - shift - ;; - - --with-auto-tag | -at ) - ATAG=yes - ;; - - --builder | -b ) - BUILDER="$BUILDER $2" - shift - ;; - - --priority | -p ) - PRIO=$2 - shift - ;; - - --skip-fetch-tags | -s ) - SKIPFETCHTAGS=1 - ;; - - --help | -h ) - usage - ;; - - -* ) - die "Unknow option: $1" - ;; - - *:* | * ) - specs="$specs $1" - ;; - esac - shift -done - -specs=`for s in $specs; do - case "$s" in - all) # all kde4 specs - echo $LIBS $BASE $OTHER $KOFFICE $L10N - ;; - libs) # kde4 libs, libs-experimental and pimlibs - echo $LIBS - ;; - base) # kdebase-* - echo $BASE - ;; - other) # * - echo $OTHER - ;; - koffice) # koffice - echo $KOFFICE - ;; - l10n) # l10n - echo $L10N - ;; - kdevelop) # kdevplatform and kdevelop-* - echo $KDEVELOP - ;; - almost-all) # all but koffice and l10n - echo $LIBS $BASE $OTHER - ;; - *) # not listed ones - echo $s - ;; - esac -done` - -if [ "$DIST" == "ti-dev" ]; then - disttag="ti" -else - disttag=$DIST -fi - -if [ "$ATAG" == "yes" ]; then - for spec in $specs; do - PKG=$(echo $spec |sed -e 's/.spec//g') - if [ ! -d $PKG ]; then - git clone git@git.tld-linux.org:packages/${PKG} - fi - if [ $SKIPFETCHTAGS -lt 1 ]; then - LAST_AUTOTAG=$(cd $PKG && git fetch -q --tags && git tag |tail -n 1) - else - LAST_AUTOTAG=$(cd $PKG && git tag |tail -n 1) - fi - sleep 1 - SENDPRIO="$SENDPRIO $spec:$LAST_AUTOTAG " - done -else - SENDPRIO=$specs -fi - -dir=$(dirname "$0") -exec sh $dir/make-request.sh ${DIST:+-d $DIST} ${BUILDER:+-b "$BUILDER"} -p $PRIO -r $SENDPRIO -echo >&2 "Failed to execute ./make-request.sh!" -exit 1 diff --git a/pldnotify.awk b/pldnotify.awk deleted file mode 100755 index d6192e7..0000000 --- a/pldnotify.awk +++ /dev/null @@ -1,788 +0,0 @@ -#!/bin/awk -f -# -# Copyright (C) 2000-2013 PLD-Team -# Authors: -# Sebastian Zagrodzki -# Jacek Konieczny -# Andrzej Krzysztofowicz -# Jakub Bogusz -# Elan Ruusamäe -# -# See cvs log pldnotify.awk for list of contributors -# -# TODO: -# - "SourceXDownload" support (use given URLs if present instead of cut-down SourceX URLs) -# - "SourceXActiveFTP" support -# - support debian/watch http://wiki.debian.org/debian/watch/ - -# NOTE: -# to test run this, run: -# $ awk -vDEBUG=1 pldnotify.awk < specfile -# -# To get full out of it, you need to have following tools installed: -# - perl, sed, wget, coreutils, util-linux -# - perl-HTML-Tree (HTML::TreeBuilder module) for better links parser (-vUSE_PERL=0 to disable) -# - pear (php-pear-PEAR) for php-pear package updates -# - npm for nodejs packages -# - gem (ruby-rubygems) for ruby/rubygem packages -# -# Additionally "mirrors" file in current dir, controls local mirrors you prefer - -function d(s) { - if (!DEBUG) { - return - } - -# print strftime("%Y-%m-%d %H:%M:%S ") s >> "/dev/stderr" - print s >> "/dev/stderr" -} - -function fixedsub(s1,s2,t, ind) { -# substitutes fixed strings (not regexps) - if (ind = index(t,s1)) { - t = substr(t, 1, ind-1) s2 substr(t, ind+length(s1)) - } - return t -} - -function ispre(s) { - if ((s~"pre")||(s~"PRE")||(s~"beta")||(s~"BETA")||(s~"alpha")||(s~"ALPHA")||(s~"rc")||(s~"RC")) { - d("pre-version") - return 1 - } else { - return 0 - } -} - -function compare_ver(v1,v2) { -# compares version numbers - while (match(v1,/[a-zA-Z][0-9]|[0-9][a-zA-Z]/)) - v1=(substr(v1,1,RSTART) "." substr(v1,RSTART+RLENGTH-1)) - while (match(v2,/[a-zA-Z][0-9]|[0-9][a-zA-Z]/)) - v2=(substr(v2,1,RSTART) "." substr(v2,RSTART+RLENGTH-1)) - sub("^0*","",v1) - sub("^0*","",v2) - gsub("\.0*",".",v1) - gsub("\.0*",".",v2) - d("v1 == " v1) - d("v2 == " v2) - count=split(v1,v1a,"\.") - count2=split(v2,v2a,"\.") - - if (countlength(v1a[i])) - return 1 - else if (v2a[i]>v1a[i]) - return 1 - else if (length(v1a[i])>length(v2a[i])) - return 0 - else if (v1a[i]>v2a[i]) - return 0 - } else if ((v1a[i]~/[A-Za-z]/)&&(v2a[i]~/[A-Za-z]/)) { - if (v2a[i]>v1a[i]) - return 1 - else if (v1a[i]>v2a[i]) - return 0 - } else if (ispre(v1a[i]) == 1) - return 1 - else - return 0 - } - if ((count2==mincount)&&(count!=count2)) { - for (i=count2+1; i<=count; i++) - if (ispre(v1a[i]) == 1) - return 1 - return 0 - } else if (count!=count2) { - for (i=count+1; i<=count2; i++) - if (ispre(v2a[i]) == 1) - return 0 - return 1 - } - return 0 -} - -function compare_ver_dec(v1,v2) { -# compares version numbers as decimal floats - while (match(v1,/[0-9][a-zA-Z]/)) - v1=(substr(v1,1,RSTART) "." substr(v1,RSTART+RLENGTH-1)) - while (match(v2,/[0-9][a-zA-Z]/)) - v2=(substr(v2,1,RSTART) "." substr(v2,RSTART+RLENGTH-1)) - sub("^0*","",v1) - sub("^0*","",v2) - d("v1 == " v1) - d("v2 == " v2) - count=split(v1,v1a,"\.") - count2=split(v2,v2a,"\.") - - if (count0+("." v1a[i])) - return 1 - else if (0+("." v1a[i])>0+("." v2a[i])) - return 0 - } else { - if (length(v2a[i])>length(v1a[i])) - return 1 - else if (v2a[i]>v1a[i]) - return 1 - else if (length(v1a[i])>length(v2a[i])) - return 0 - else if (v1a[i]>v2a[i]) - return 0 - } - } else if ((v1a[i]~/[A-Za-z]/)&&(v2a[i]~/[A-Za-z]/)) { - if (v2a[i]>v1a[i]) - return 1 - else if (v1a[i]>v2a[i]) - return 0 - } else if (ispre(v1a[i]) == 1) - return 1 - else - return 0 - } - if ((count2==mincount)&&(count!=count2)) { - for (i=count2+1; i<=count; i++) - if (ispre(v1a[i]) == 1) - return 1 - return 0 - } else if (count!=count2) { - for (i=count+1; i<=count2; i++) - if (ispre(v2a[i]) == 1) - return 0 - return 1 - } - return 0 -} - -function link_seen(link) { - for (seenlink in frameseen) { - if (seenlink == link) { - d("Link: [" link "] seen already, skipping...") - return 1 - } - } - frameseen[link]=1 - return 0 -} - -function mktemp( _cmd, _tmpfile) { - _cmd = "mktemp /tmp/XXXXXX" - _cmd | getline _tmpfile - close(_cmd) - return _tmpfile -} - -# fix link to artificial one that will be recognized rest of this script -function postfix_link(url, link, oldlink) { - oldlink = link - if ((url ~/^(http|https):\/\/github.com\//) && (link ~ /.*\/tarball\//)) { - gsub(".*\/tarball\/", "", link) - link = link ".tar.gz" - } - if (oldlink != link) { - d("POST FIXED URL [ " oldlink " ] to [ " link " ]") - } - return link -} - -# use perl HTML::TreeBuilder module to extract links from html -# it returns TAGNAME LINK in output which is pretty stright forward to parse in awk -function extract_links_cmd(tmpfile) { - return "perl -MHTML::TreeBuilder -e ' \ - my $content = join q//, <>; \ - my $root = new HTML::TreeBuilder; \ - $root->parse($content); \ - \ - my %links = (); \ - for (@{$root->extract_links(qw(a iframe))}) { \ - my($link, $element, $attr, $tag) = @$_; \ - $links{$link} = $tag; \ - } \ - \ - while (my($link, $tag) = each %links) { \ - print $tag, q/ /, $link, $/; \ - } \ - ' " tmpfile -} - -# get all tags from specified URL -function get_links(url,filename, errno,link,oneline,retval,odp,wholeodp,lowerodp,tmpfile,cmd) { - - wholeerr="" - - tmpfile = mktemp() - tmpfileerr = mktemp() - - if (url ~ /^http:\/\/(download|dl)\.(sf|sourceforge)\.net\//) { - # http://downloads.sourceforge.net/project/mediainfo/source/mediainfo/ - gsub("^http://(download|dl)\.(sf|sourceforge)\.net/", "", url) - - gsub("/.*", "", url) - url = "http://sourceforge.net/projects/" url "/files/" - d("sf url, mungled url to: " url) - } - - if (url ~ /^http:\/\/(.*)\.googlecode\.com\/files\//) { - gsub("^http://", "", url) - gsub("\..*", "", url) - url = "http://code.google.com/p/" url "/downloads/list" - d("googlecode url, mungled url to: " url) - } - - if (url ~ /^http:\/\/pecl.php.net\/get\//) { - gsub("-.*", "", filename) - url = "http://pecl.php.net/package/" filename - d("pecl.php.net url, mungled url to: " url) - } - - if (url ~ /^(http|ftp):\/\/mysql.*\/Downloads\/MySQL-5.1\//) { - url = "http://dev.mysql.com/downloads/mysql/5.1.html#source" - d("mysql 5.1 url, mungled url to: " url) - } - - if (url ~/^(http|https):\/\/launchpad\.net\/(.*)\//) { - gsub("^(http|https):\/\/launchpad\.net\/", "", url) - gsub("\/.*/", "", url) - url = "https://code.launchpad.net/" url "/+download" - d("main launchpad url, mungled url to: " url) - } - - if (url ~/^(http|https):\/\/edge\.launchpad\.net\/(.*)\//) { - gsub("^(http|https):\/\/edge\.launchpad\.net\/", "", url) - gsub("\/.*/", "", url) - url = "https://edge.launchpad.net/" url "/+download" - d("edge launchpad url, mungled url to: " url) - } - - if (url ~/^(http|https):\/\/github.com\/.*\/(.*)\/tarball\//) { - gsub("\/tarball\/.*", "/downloads", url) - d("github tarball url, mungled url to: " url) - } - - if (url ~/^(http|https):\/\/github.com\/.*\/(.*)\/archive\//) { - gsub("\/archive\/.*", "/tags", url) - d("github archive url, mungled url to: " url) - } - - # https://bitbucket.org/logilab/pylint/get/tip.tar.bz2 -> https://bitbucket.org/logilab/pylint/downloads - if (url ~/^(http|https):\/\/bitbucket.org\/.*\/get\/.*/) { - gsub("\/get\/.*", "/downloads", url) - d("github bitbucket url, mungled url to: " url) - } - - if (url ~/^(http|https):\/\/cgit\..*\/(.*)\/snapshot\//) { - gsub("\/snapshot\/.*", "/", url) - d("cgit snapshot tarball url, mungled url to: " url) - } - - if (url ~/^(http|https):\/\/www2\.aquamaniac\.de\/sites\/download\//) { - url = "http://www2.aquamaniac.de/sites/download/packages.php" - d("aquamaniac.de tarball url, mungled url to: " url) - } - - if (url ~/^(http|https):\/\/www.process-one.net\/downloads\/ejabberd\//) { - url = "http://www.process-one.net/en/ejabberd/archive/" - d("ejabberd tarball url, mungled url to: " url) - } - - if (url ~/^(http|https):\/\/llvm.org\/releases\//) { - url = "http://llvm.org/releases/download.html" - d("llvm tarball url, mungled url to: " url) - } - - if (url ~/^(http|https):\/\/download\.owncloud\.org\/community\//) { - url = "http://owncloud.org/changelog/" - d("owncloud tarball url, mungled url to: " url) - } - - d("Retrieving: " url) - user_agent = "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100129 PLD/3.0 (Th) Iceweasel/3.6" - cmd = "wget -t 2 -T 45 --user-agent \"" user_agent "\" -nv -O - \"" url "\" --passive-ftp --no-check-certificate > " tmpfile " 2> " tmpfileerr - d("Execute: " cmd) - errno = system(cmd) - d("Execute done") - - if (errno != 0) { - d("Reading failure response...") - wholeerr = "" - while (getline oneline < tmpfileerr) - wholeerr = (wholeerr " " oneline) - d("Error Response: " wholeerr) - - system("rm -f " tmpfile) - system("rm -f " tmpfileerr) - retval = ("WGET ERROR: " errno ": " wholeerr) - return retval - } - system("rm -f " tmpfileerr) - - urldir = url; - sub(/[^\/]+$/, "", urldir) - -if (USE_PERL) { - cmd = extract_links_cmd(tmpfile) - while (cmd | getline) { - tag = $1 - link = substr($0, length(tag) + 2) - - if (tag == "iframe") { - d("Frame: " link) - if (url !~ /\//) { - link = (urldir link) - d("Frame->: " link) - } - - if (link_seen(link)) { - continue - } - retval = (retval " " get_links(link)) - } - - if (link_seen(link)) { - continue - } - - retval = (retval " " link) - d("href(): " link) - } - close(cmd) - system("rm -f " tmpfile) - - d("Returning: [" retval "]") - return retval -} - - wholeodp = "" - d("Reading success response...") - while (getline oneline < tmpfile) { - wholeodp = (wholeodp " " oneline) -# d("Response: " wholeodp) - } - d("Reponse read done...") - system("rm -f " tmpfile) - - while (match(wholeodp, /<([aA]|[fF][rR][aA][mM][eE])[ \t][^>]*>/) > 0) { - d("Processing links...") - odp = substr(wholeodp,RSTART,RLENGTH); - wholeodp = substr(wholeodp,RSTART+RLENGTH); - - lowerodp = tolower(odp); - if (lowerodp ~ /: " newurl) - } - - if (link_seen(newurl)) { - newurl = "" - continue - } - - retval = (retval " " get_links(newurl)) - } else if (lowerodp ~ /href=[ \t]*"[^"]*"/) { - sub(/[hH][rR][eE][fF]=[ \t]*"/,"href=\"",odp) - match(odp,/href="[^"]*"/) - link=substr(odp,RSTART,RLENGTH) - odp=substr(odp,1,RSTART) substr(odp,RSTART+RLENGTH) - link=substr(link,7,length(link)-7) - link=postfix_link(url, link) - - if (link_seen(link)) { - link="" - continue - } - - # link ends with at least 2 digit version - mlink = "" - if (link ~ /^.*\/[v]*[0-9\.]+[0-9]\/$/) - mlink = get_links(link) - - retval = (retval " " link " " mlink) - d("href(\"\"): " link) - } else if (lowerodp ~ /href=[ \t]*'[^']*'/) { - sub(/[hH][rR][eE][fF]=[ \t]*'/,"href='",odp) - match(odp,/href='[^']*'/) - link=substr(odp,RSTART,RLENGTH) - odp=substr(odp,1,RSTART) substr(odp,RSTART+RLENGTH) - link=substr(link,7,length(link)-7) - link=postfix_link(url, link) - - if (link_seen(link)) { - link="" - continue - } - - retval = (retval " " link) - d("href(''): " link) - } else if (lowerodp ~ /href=[ \t]*[^ \t>]*/) { - sub(/[hH][rR][eE][fF]=[ \t]*/,"href=",odp) - match(odp,/href=[^ \t>]*/) - link=substr(odp,RSTART,RLENGTH) - odp=substr(odp,1,RSTART) substr(odp,RSTART+RLENGTH) - link=substr(link,6,length(link)-5) - - if (link_seen(link)) { - link="" - continue - } - - retval = (retval " " link) - d("href(): " link) - } else { - # but not href - skip - d("skipping without href: " odp) - } - } - - d("Returning: [" retval "]") - return retval -} - -function subst_defines(var,defs) { -# substitute all possible RPM macros - while ((var ~ /%{.*}/) || (var ~ /%[A-Za-z0-9_]+/)) { - oldvar=var - for (j in defs) { - gsub("%{" j "}", defs[j], var) - gsub("%" j , defs[j], var) - } - if (var==oldvar) { - if (DEBUG) { - for (i in defs) { - d(i " == " defs[i]) - } - } - return var - } - } - return var -} - -function find_mirror(url) { - - while (succ = (getline line < "mirrors")) { - if (succ==-1) { return url } - nf=split(line,fields,"|") - if (nf>1){ - origin=fields[1] - mirror=fields[2] - mname=fields[3] - prefix=substr(url,1,length(origin)) - if (prefix==origin){ - d("Mirror found at " mname) - close("mirrors") - return mirror substr(url,length(origin)+1) - } - } - } - - return url -} - -# fetches file list, and compares version numbers -function process_source(number, lurl, name, version) { - d("Processing " lurl) - - if (index(lurl, version) == 0) { - d("There is no version number ["version"] in ["lurl"]") - return 0 - } - - sub("://",":",lurl) - sub("/",":/",lurl) - gsub("[^/]*$",":&",lurl) - split(lurl,url,":") - acc=url[1] - host=url[2] - dir=url[3] - filename=url[4] - - if (index(dir,version)) { - # directory name as version maching mode: - # if /something/version/name-version.tarball then check - # in /something/ looking for newer directory - dir=substr(dir,1,index(dir,version)-1) - sub("[^/]*$","",dir) - sub("(\.tar\.(bz|bz2|gz|lzma|xz)|zip)$","",filename) - } - - d("Will check a directory: " dir) - d("and a file: " filename) - - filenameexp=filename - gsub("[+]","\\+",filenameexp) - sub(version,"[A-Za-z0-9.]+",filenameexp) - gsub("[.]","\\.",filenameexp) - sub("\.(bz|bz2|gz|lzma|xz|zip)$",".(bz|bz2|gz|lzma|xz|zip)",filenameexp) - d("Expression: " filenameexp) - match(filename,version) - prever=substr(filename,1,RSTART-1) - postver=substr(filename,RSTART+RLENGTH) - d("Before number: " prever) - d("and after: " postver) - newurl=find_mirror(acc "://" host dir) - #print acc "://" host dir - #newurl=url[1]"://"url[2]url[3]url[4] - #newurl=acc "://" host dir filename - d("Looking at " newurl) - - references=0 - finished=0 - oldversion=version - odp = get_links(newurl, filename) - if( odp ~ "ERROR: ") { - print name "(" number ") " odp - } else { - d("WebPage downloaded") - c=split(odp,linki) - for (nr=1; nr<=c; nr++) { - addr=linki[nr] - - d("Found link: " addr) - - # github has very different tarball links that clash with this safe check - if (!(newurl ~/^(http|https):\/\/github.com\/.*\/tarball/)) { - if (addr ~ "[-_.0-9A-Za-z~]" filenameexp) { - continue - } - } - - if (addr ~ filenameexp) { - match(addr,filenameexp) - newfilename=substr(addr,RSTART,RLENGTH) - d("Hypothetical new: " newfilename) - newfilename=fixedsub(prever,"",newfilename) - newfilename=fixedsub(postver,"",newfilename) - d("Version: " newfilename) - if (newfilename ~ /\.(asc|sig|pkg|bin|binary|built)$/) continue - # strip ending (happens when in directiory name as version matching mode) - sub("(\.tar\.(bz|bz2|gz|lzma|xz)|zip)$","",newfilename) - if (NUMERIC) { - if ( compare_ver_dec(version, newfilename)==1 ) { - d("Yes, there is new one") - version=newfilename - finished=1 - } - } else if ( compare_ver(version, newfilename)==1 ) { - d("Yes, there is new one") - version=newfilename - finished=1 - } - } - } - if (finished == 0) - print name "(" number ") seems ok: " oldversion - else - print name "(" number ") [OLD] " oldversion " [NEW] " version - } -} - -function rss_upgrade(name, ver, url, regex, cmd) { - regex = "s/.*" regex "<\/title>.*/\\1/p" - cmd = "wget -t 2 -T 45 -q -O - " url " | sed -nre '" regex "' | head -n1" - - d("rss_upgrade_cmd: " cmd) - cmd | getline ver - close(cmd) - - return ver -} - -# check for ZF upgrade from rss -function zf_upgrade(name, ver) { - return rss_upgrade(name, ver, \ - "http://devzone.zend.com/tag/Zend_Framework_Management/format/rss2.0", \ - "Zend Framework ([^\\s]+) Released" \ - ); -} - -function hudson_upgrade(name, ver) { - return rss_upgrade(name, ver, \ - "https://hudson.dev.java.net/servlets/ProjectRSS?type=news", \ - "Hudson ([0-9.]+) released" \ - ); -} - -# upgrade check for pear package using PEAR CLI -function pear_upgrade(name, ver, cmd) { - sub(/^php-pear-/, "", name); - - cmd = "pear remote-info " name " | awk '/^Latest/{print $NF}'" - d("PEAR: " cmd) - cmd | getline ver - close(cmd) - - return ver -} - -function vim_upgrade(name, ver, cmd) { - # %patchset_source -f ftp://ftp.vim.org/pub/editors/vim/patches/7.2/7.2.%03g 1 %{patchlevel} - cmd = "wget -q -O - ftp://ftp.vim.org/pub/editors/vim/patches/" DEFS["ver"] "/MD5SUMS|grep -vF .gz|tail -n1|awk '{print $2}'" - d("VIM: " cmd) - cmd | getline ver - close(cmd) - return ver -} - -function nodejs_upgrade(name, ver, cmd) { - d("NODEJS " name " (as " DEFS["pkg"] ") " ver); - if (DEFS["pkg"]) { - cmd = "npm info " DEFS["pkg"] " dist-tags.latest" - } else { - cmd = "npm info " name " dist-tags.latest" - } - cmd | getline ver - close(cmd) - - return ver -} - -function rubygem_upgrade(name, ver, cmd, pkg) { - if (DEFS["gem_name"]) { - pkg = DEFS["gem_name"]; - - } else if (DEFS["gemname"]) { - pkg = DEFS["gemname"]; - - } else if (DEFS["pkgname"]) { - pkg = DEFS["pkgname"]; - - } else { - pkg = name; - gsub(/^ruby-/, "", pkg); - } - - cmd = "gem list --remote '^" pkg "$' | awk '/" pkg "/ {v=$2; sub(/\(/, \"\", v); print v}'" - d("RUBYGEM " name " (as " pkg ") " ver ": " cmd); - cmd | getline ver - - close(cmd) - - return ver -} - -function chrome_upgrade(name, ver, cmd, sourceurl) { - sourceurl = "http://dl.google.com/linux/chrome/rpm/stable/x86_64/repodata/primary.xml.gz" - cmd = "curl -s " sourceurl " | zcat | perl -ne 'm{<name>google-chrome-" DEFS["state"] "</name>} and m{<version .*ver=.([\d.]+)} and print $1'" - d("CHROME " cmd); - cmd | getline ver - close(cmd) - - return ver -} - -function process_data(name, ver, rel, src, nver) { - if (name ~ /^php-pear-/) { - nver = pear_upgrade(name, ver); - } else if (name == "ZendFramework") { - nver = zf_upgrade(name, ver); - } else if (name == "hudson") { - nver = hudson_upgrade(name, ver); - } else if (name == "vim") { - nver = vim_upgrade(name, ver); - } else if (name == "google-chrome") { - nver = chrome_upgrade(name, ver); - } else if (name ~ "^nodejs-") { - nver = nodejs_upgrade(name, ver); - } else if (name ~ "^ruby-") { - nver = rubygem_upgrade(name, ver); - } - - if (nver) { - if (compare_ver(ver, nver)) { - print name " [OLD] " ver " [NEW] " nver - } else { - print name " seems ok: " ver - } - return; - } - - if (name == "xulrunner") { - ver = subst_defines(DEFS["firefox_ver"], DEFS) - d("package xulrunner, change version to firefox ["ver"]") - } - -# this function checks if substitutions were valid, and if true: -# processes each URL and tries to get current file list - for (i in src) { - if (src[i] ~ /%{nil}/) { - gsub(/\%\{nil\}/, "", src[i]) - } - if ( src[i] !~ /%{.*}/ && src[i] !~ /%[A-Za-z0-9_]/ ) { - d("Source: " src[i]) - process_source(i, src[i], name, ver) - } else { - print FNAME ":" i ": impossible substitution: " src[i] - } - } -} - -BEGIN { - # if you want to use DEBUG, run script with "-v DEBUG=1" - # or uncomment the line below - # DEBUG = 1 - - errno=system("wget --help > /dev/null 2>&1") - if (errno && errno != 3) { - print "No wget installed!" - exit 1 - } - if (ARGC>=3 && ARGV[2]=="-n") { - NUMERIC=1 - for (i=3; i<ARGC; i++) ARGV[i-1]=ARGV[i] - ARGC=ARGC-1 - } -} - -FNR==1 { - if ( ARGIND != 1 ) { - # clean frameseen for each ARG - for (i in frameseen) { - delete frameseen[i] - } - frameseen[0] = 1 - - process_data(NAME,VER,REL,SRC) - NAME="" ; VER="" ; REL="" - for (i in DEFS) delete DEFS[i] - for (i in SRC) delete SRC[i] - } - FNAME=FILENAME - DEFS["_alt_kernel"]="" - DEFS["20"]="\\ " - DEFS["nil"]="" -} - -/^[Uu][Rr][Ll]:/&&(URL=="") { URL=subst_defines($2,DEFS) ; DEFS["url"]=URL } -/^[Nn]ame:/&&(NAME=="") { NAME=subst_defines($2,DEFS) ; DEFS["name"]=NAME } -/^[Vv]ersion:/&&(VER=="") { VER=subst_defines($2,DEFS) ; DEFS["version"]=VER } -/^[Rr]elease:/&&(REL=="") { REL=subst_defines($2,DEFS) ; DEFS["release"]=REL } -/^[Ss]ource[0-9]*:/ { if (/(ftp|http|https):\/\//) SRC[FNR]=subst_defines($2,DEFS) } -/%define/ { DEFS[$2]=subst_defines($3,DEFS) } - -END { - process_data(NAME,VER,REL,SRC) -} diff --git a/relup.sh b/relup.sh index 9a07402..7557ba6 100755 --- a/relup.sh +++ b/relup.sh @@ -77,6 +77,8 @@ bump_release() { package_name() { local specfile="${1%/}" package + # strip branch + specfile=${specfile%:*} # basename specfile=${specfile##*/} # strip .spec @@ -85,6 +87,18 @@ package_name() { echo $package } +get_branch() { + local specfile="${1%/}" branch + + branch=${specfile#*:} + + if [ "$branch" != "$specfile" ]; then + echo "$branch" + else + echo "" + fi +} + if [ ! -x /usr/bin/getopt ]; then echo >&1 "You need to install util-linux to use relup.sh" exit 1 @@ -135,6 +149,7 @@ n="${n%%n}" cd "$topdir" for pkg in "$@"; do + branch=$(get_branch "$pkg") # pkg: package %{name} pkg=$(package_name "$pkg") @@ -149,13 +164,21 @@ for pkg in "$@"; do specname=${spec##*/} # start real work - echo "$pkg ..." + if [ -n "$branch" ]; then + echo "$pkg:$branch ..." + else + echo "$pkg ..." + fi # get package [ "$get" = 1 -a -d "$pkgdir" ] && continue if [ "$update" = "1" -o "$get" = "1" ]; then - ./builder -g -ns "$spec" + if [ -n "$branch" ]; then + ./builder -g -ns "$spec" -r $branch + else + ./builder -g -ns "$spec" + fi fi [ "$get" = 1 ] && continue diff --git a/repackage.sh b/repackage.sh index 5dfe9c3..96a4fd9 100755 --- a/repackage.sh +++ b/repackage.sh @@ -83,7 +83,7 @@ rpmbuild() { --define '__spec_clean_body %{nil}' \ --define '_enable_debug_packages 0' \ ${bb+$(skip_dep_generators)} \ - ${bb+--define '%py_postclean() %{nil}'} \ + ${bb+--define '%py_postclean(-x:) %{nil}'} \ $a || exit } diff --git a/rpm-build-tools.spec b/rpm-build-tools.spec index 9388165..edf0a6c 100644 --- a/rpm-build-tools.spec +++ b/rpm-build-tools.spec @@ -5,27 +5,29 @@ Summary(pt_BR.UTF-8): Scripts e programas executáveis usados para construir pac Summary(ru.UTF-8): Скрипты и утилиты, необходимые для сборки пакетов Summary(uk.UTF-8): Скрипти та утиліти, необхідні для побудови пакетів Name: rpm-build-tools -Version: 4.5 -Release: 12 +Version: 4.9 +Release: 7 License: GPL Group: Applications/File -Group: Base Source0: builder.sh -Source1: adapter.awk -Source2: adapter.sh -Source3: pldnotify.awk Source4: shrc.sh +Source5: bash-prompt.sh +Source6: dropin BuildRequires: sed >= 4.0 Requires: gawk >= 3.1.7 Requires: git-core >= 1.7 Requires: grep Requires: less +Requires: openssh-clients Requires: perl-base Requires: rpm-build -Requires: rpmbuild(macros) >= 1.539 +Requires: rpmbuild(macros) >= 1.651 Requires: sed >= 4.0 +Requires: time Requires: util-linux Requires: wget +Suggests: adapter +Suggests: pldnotify Suggests: rpm-specdump >= 0.3 Suggests: schedtool Suggests: vim-syntax-spec @@ -58,23 +60,17 @@ construir pacotes usando o RPM. %prep %setup -qcT -cp -p %{SOURCE0} %{SOURCE2} . -cp -p %{SOURCE1} adapter.awk -cp -p %{SOURCE3} pldnotify.awk +cp -p %{SOURCE0} . -%{__sed} -i -e 's,^adapter=.*/adapter.awk,adapter=%{_libdir}/adapter.awk,' adapter.sh - -%{__sed} -i -e '/^VERSION=/s,\([^/]\+\)/.*",\1-RELEASE",' builder.sh adapter.sh -%{__sed} -i -e '/\tRCSID =/,/^\trev =/d;/\tVERSION = /s,\([^/]\+\)/.*,\1-RELEASE",' adapter.awk +%{__sed} -i -e '/^VERSION=/s,\([^/]\+\)/.*",\1-RELEASE",' builder.sh %install rm -rf $RPM_BUILD_ROOT install -d $RPM_BUILD_ROOT{%{_bindir},%{_libdir},/etc/shrc.d} -cp -p adapter.awk $RPM_BUILD_ROOT%{_libdir}/adapter.awk -install -p pldnotify.awk $RPM_BUILD_ROOT%{_bindir} install -p builder.sh $RPM_BUILD_ROOT%{_bindir}/builder -install -p adapter.sh $RPM_BUILD_ROOT%{_bindir}/adapter +install -p %{SOURCE6} $RPM_BUILD_ROOT%{_bindir} install -p %{SOURCE4} $RPM_BUILD_ROOT/etc/shrc.d/rpm-build.sh +install -p %{SOURCE5} $RPM_BUILD_ROOT%{_libdir}/bash-prompt.sh %clean rm -rf $RPM_BUILD_ROOT @@ -82,7 +78,6 @@ rm -rf $RPM_BUILD_ROOT %files %defattr(644,root,root,755) %attr(755,root,root) %{_bindir}/builder -%attr(755,root,root) %{_bindir}/adapter -%attr(755,root,root) %{_bindir}/pldnotify.awk -/etc/shrc.d/rpm-build.sh -%{_libdir}/adapter.awk +%attr(755,root,root) %{_bindir}/dropin +%config(noreplace) %verify(not md5 mtime size) /etc/shrc.d/rpm-build.sh +%{_libdir}/bash-prompt.sh diff --git a/shrc.sh b/shrc.sh index 8e36984..b84d622 100755 --- a/shrc.sh +++ b/shrc.sh @@ -1,22 +1,88 @@ # shell aliases and functions for PLD Developer # set $dist, used by functions below +[ -n "$dist" ] || dist=$(lsb_release -sc 2>/dev/null | tr 'A-Z' 'a-z') [ -n "$dist" ] || dist=$(awk '/PLD Linux/ {print tolower($NF)}' /etc/pld-release 2>/dev/null | tr -d '()') -case "$dist" in -ac|th|ti) - ;; -*) - # invalid one ;) - dist= -esac +alias q='rpm -q --qf "%{N}-%|E?{%{E}:}|%{V}-%{R}.%{ARCH}\n"' +alias adif="dif -x '*.m4' -x ltmain.sh -x install-sh -x depcomp -x 'Makefile.in' -x compile -x 'config.*' -x configure -x missing -x mkinstalldirs -x autom4te.cache" +alias pclean="sed -i~ -e '/^\(?\|=\+$\|unchanged:\|diff\|only\|Only\|Tylko\|Binary files\|Files\|Common\|index \|Index:\|RCS file\|retrieving\)/d'" -if [ "$dist" ]; then +# undo spec utf8 +# note: it will do it blindly, so any lang other than -pl is most likely broken +specutfundo() { + local spec="$1" + iconv -futf8 -tlatin2 "$spec" > m + sed -e 's/\.UTF-8//' m > "$spec" + rm -f m +} -alias ipoldek-$dist="poldek -q --sn $dist --cmd" -alias $dist-provides="ipoldek-$dist what-provides" -alias $dist-verify=dist-verify -alias $dist-requires=dist-requires +# merges two patches +# requires: patchutils +pmerge() { + combinediff -p1 $1 $2 > m.patch || return + pclean m.patch + dif $1 m.patch +} + +# downloads sourceforge url from specific mirror +sfget() { + local url="$1" + url="${url%?download}" + url="${url%?use_mirror=*}" + url="${url#http://downloads.}" + url="http://dl.${url#http://prdownloads.}" + # use mirror + local mirror="http://nchc.dl.sourceforge.net" + url="$mirror/sourceforge/${url#http://dl.sourceforge.net/}" + wget -c "$url" +} + +dif() { + if [ -t 1 ]; then + diff -ur -x .svn -x .git -x .bzr -x CVS "$@" | diffcol | less -R + else + diff -ur -x .svn -x .git -x .bzr -x CVS "$@" + fi +} + +diffcol() { +sed -e ' + s,,^[,g; + s,,^G,g; + s,^\(Index:\|diff\|---\|+++\) .*$,&,; + s,^@@ ,&,; + s,^-,&,; + s,^+,&,; + s,\r,^M,g; + s, , ,g; + s,\([^[:space:]]\)\([[:space:]]\+\)$,\1\2,g; + s,$,, +' ${1:+"$@"} +} + +# does diff between FILE~ and FILE +# the diff can be applied with patch -p1 +d() { + local file="$1" dir + shift + if [[ "$file" = /* ]]; then + # full path -- no idea where to strip + dir=. + diff=$file + else + # relative path -- keep one path component from current dir + dir=.. + diff=${PWD##*/}/${file} + fi + + (builtin cd "$dir"; dif $diff{~,} "$@") +} + +# spec name from NVR +rpm2spec() { + sed -re 's,^(.+)-[^-]+-[^-]+$,\1.spec,' +} # move AC-branch tag to current checkout # if AC-branch as branch exists, it is first removed @@ -40,14 +106,24 @@ ac-tag() { git push -f origin $branch } -# undo spec utf8 -# note: it will do it blindly, so any lang other than -pl is most likely broken -specutfundo() { - local spec="$1" - iconv -futf8 -tlatin2 "$spec" > m - sed -e 's/\.UTF-8//' m > "$spec" - rm -f m -} +###### functions/aliases below require $dist to be set ###### + +case "$dist" in +ac|th|ti) + ;; +*) + # invalid one ;) + dist= +esac + +if [ -z "$dist" ]; then + return +fi + +alias ipoldek-$dist="poldek -q --sn $dist --cmd" +alias $dist-provides="ipoldek-$dist what-provides" +alias $dist-verify=dist-verify +alias $dist-requires=dist-requires dist-requires() { local opts deps @@ -189,139 +265,3 @@ get-buildlog() { done } -fi # no $dist set - -alias adif="dif -x '*.m4' -x ltmain.sh -x install-sh -x depcomp -x 'Makefile.in' -x compile -x 'config.*' -x configure -x missing -x mkinstalldirs -x autom4te.cache" -alias pclean="sed -i~ -e '/^\(?\|=\+$\|unchanged:\|diff\|only\|Only\|Tylko\|Files\|Common\|Index:\|RCS file\|retrieving\)/d'" - -# makes diff from PLD CVS urls -# requires: cvs, tee -urldiff() { - local url="$1" - if [ -z "$url" ]; then - echo >&2 "Reading STDIN" - read url - fi - - echo >&2 "Process $url" - local file="$url" - file=${file#*SPECS/} - file=${file#*SOURCES/} - file=${file##*/} - local r1=${file#*r1=} - local r2=${r1#*r2=} - r2=${r2%%[&;]*} - r1=${r1%%[&;]*} - file=${file%\?*} - file=${file%.diff} - - echo >&2 "$file: $r1 -> $r2" - - if [ -t 1 ]; then - cvs diff -u -r$r1 -r$r2 $file | tee m.patch | diffcol - else - cvs diff -u -r$r1 -r$r2 $file - fi -} - -# makes diff from kde svn path -# requires: wget, tee -kdediff() { - local url="$1" r1 r2 - # --- branches/KDE/3.5/kdepim/kpilot/conduits/vcalconduit/vcalRecord.cc #624744:624745 - url=${url#*--- } - echo >&2 "Process $url" - r1=${url#*#} - r2=${r1#*:} - r1=${r1%:*} - - # http://websvn.kde.org/branches/KDE/3.5/kdepim/kpilot/conduits/vcalconduit/vcalRecord.cc?rev=624745&r1=612579&r2=624745&makepatch=1&diff_format=u - # http://websvn.kde.org/branches/KDE/3.5/kdenetwork/kopete/protocols/oscar/aim/aimcontact.cpp?r1=609808&r2=673027&view=patch - url=http://websvn.kde.org/${url% *} - url="$url?r1=$r1&r2=$r2&view=patch" - - if [ -t 1 ]; then - wget "$url" -O -| tee m.patch | diffcol - else - wget "$url" -O - - fi -} - -# merges two patches -# requires: patchutils -pmerge() { - combinediff -p1 $1 $2 > m.patch || return - pclean m.patch - dif $1 m.patch -} - -# downloads sourceforge url from specific mirror -sfget() { - local url="$1" - url="${url%?download}" - url="${url%?use_mirror=*}" - url="${url#http://downloads.}" - url="http://dl.${url#http://prdownloads.}" - # use mirror - local mirror="http://nchc.dl.sourceforge.net" - url="$mirror/sourceforge/${url#http://dl.sourceforge.net/}" - wget -c "$url" -} - -dif() { - if [ -t 1 ]; then - diff -ur -x .svn -x .git -x .bzr -x CVS "$@" | diffcol | less -R - else - diff -ur -x .svn -x .git -x .bzr -x CVS "$@" - fi -} - -diffcol() { -sed -e ' - s,,^[,g; - s,,^G,g; - s,^\(Index:\|diff\|---\|+++\) .*$,&,; - s,^@@ ,&,; - s,^-,&,; - s,^+,&,; - s,\r,^M,g; - s, , ,g; - s,\([^[:space:]]\)\([[:space:]]\+\)$,\1\2,g; - s,$,, -' ${1:+"$@"} -} - -# does diff between FILE~ and FILE -# the diff can be applied with patch -p1 -d() { - local file="$1" - local dir diff - if [[ "$file" = /* ]]; then - # full path -- no idea where to strip - dir=. - diff=$file - else - # relative path -- keep one path component from current dir - dir=.. - diff=${PWD##*/}/${file} - fi - - (builtin cd "$dir"; dif $diff{~,}) -} - -# spec name from NVR -rpm2spec() { - sed -re 's,^(.+)-[^-]+-[^-]+$,\1.spec,' -} - -rpmb() { - local SPEC SPECDIR arg - for arg in "$@"; do - case "$arg" in - *.spec) SPEC="$arg" - ;; - esac - done - SPECDIR=$(dirname "$(pwd)/${SPEC:-.}") - command rpmbuild --define "_specdir $SPECDIR" --define "_sourcedir $SPECDIR" "$@" -} diff --git a/teeboth b/teeboth index 5c3f5c0..459e0c8 100755 --- a/teeboth +++ b/teeboth @@ -53,7 +53,7 @@ sethandle( \*child_err ); while ( $alive ) { foreach my $h ( $select->can_read() ) { - sysread $h, $_, 1024; + sysread $h, $_, 102400; print $fout $_ if $fout; if ( $interactive && $h == \*child_err ) { print "\033[31m$_\033[0m"; -- 2.44.0