diff --git a/.gitignore b/.gitignore index 4507054..dafa321 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -spectool-1.0.10.tar.bz2 -rpmdevtools-7.8.tar.xz +/*.tar.* diff --git a/0001-Force-legacy-datestamp-while-RHBZ-1715412-is-still-a.patch b/0001-Force-legacy-datestamp-while-RHBZ-1715412-is-still-a.patch new file mode 100644 index 0000000..f59bdfd --- /dev/null +++ b/0001-Force-legacy-datestamp-while-RHBZ-1715412-is-still-a.patch @@ -0,0 +1,39 @@ +From 4a4693c842b6da5d66e3a6bdb1eb7914d2402f7f Mon Sep 17 00:00:00 2001 +From: Neal Gompa +Date: Wed, 20 Jan 2021 06:50:03 -0500 +Subject: [PATCH] Force legacy datestamp while RHBZ#1715412 is still an issue + +--- + rpmdev-bumpspec | 2 +- + rpmdev-newspec.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/rpmdev-bumpspec b/rpmdev-bumpspec +index dc4eb05..3e18b41 100755 +--- a/rpmdev-bumpspec ++++ b/rpmdev-bumpspec +@@ -300,7 +300,7 @@ the Free Software Foundation; either version 2 of the License, or + parser.add_option("-n", "--new", + help="set new version and reset/set release " + "(simple spec files only)") +- parser.add_option("-D", "--legacy-datestamp", default=False, action='store_true', ++ parser.add_option("-D", "--legacy-datestamp", default=True, action='store_true', + help="use legacy datestamp for changelog entries") + parser.add_option("-d", "--datestamp", + help="changelog date string (default: today)") +diff --git a/rpmdev-newspec.in b/rpmdev-newspec.in +index 27af10f..a083dd9 100644 +--- a/rpmdev-newspec.in ++++ b/rpmdev-newspec.in +@@ -293,7 +293,7 @@ if [[ $NEWSPEC_PREFER_MACROS ]] ; then + " + fi + +-if [[ $rpmver -ge 41400 ]] && [[ -z $NEWSPEC_LEGACY_DATESTAMP ]] ; then # >= 4.14 (RHEL >= 8, Fedora >= 27) ++if [[ $rpmver -ge 41400 ]] && [[ $(/bin/false) ]] ; then # >= 4.14 (RHEL >= 8, Fedora >= 27) + chlog="s|^%changelog\\s*|%changelog\\n* $(LC_ALL=C date +'%a %b %d %T %Z %Y') $(rpmdev-packager)\\n- |Mg" + else + chlog="s|^%changelog\\s*|%changelog\\n* $(LC_ALL=C date --utc +'%a %b %d %Y') $(rpmdev-packager)\\n- |Mg" +-- +2.29.2 + diff --git a/0002-rpmdevtools-git-83b35ac.patch b/0002-rpmdevtools-git-83b35ac.patch new file mode 100644 index 0000000..ff616da --- /dev/null +++ b/0002-rpmdevtools-git-83b35ac.patch @@ -0,0 +1,531 @@ +diff --git a/Makefile.am b/Makefile.am +index bb6f7c6..d55f397 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -15,7 +15,7 @@ man8_MANS = rpmdev-rmdevelrpms.8 + dist_pkgsysconf_DATA = curlrc newspec.conf rmdevelrpms.conf \ + spectemplate-lib.spec spectemplate-minimal.spec \ + spectemplate-perl.spec spectemplate-php-pear.spec \ +- spectemplate-python.spec spectemplate-ruby.spec \ ++ spectemplate-python.spec spectemplate-pyproject.spec spectemplate-ruby.spec \ + spectemplate-ocaml.spec spectemplate-R.spec spectemplate-dummy.spec \ + template.init + +diff --git a/rpmdev-bumpspec b/rpmdev-bumpspec +index b8f4047..5a6a909 100755 +--- a/rpmdev-bumpspec ++++ b/rpmdev-bumpspec +@@ -27,8 +27,10 @@ import time + + try: + from rpmautospec import specfile_uses_rpmautospec ++ from rpmautospec.subcommands.release import calculate_release_number + except ImportError: + specfile_uses_rpmautospec = None ++ calculate_release_number = None + + __version__ = "1.0.13" + +@@ -378,19 +380,25 @@ the Free Software Foundation; either version 2 of the License, or + # Not actually a parser error, but... meh. + parser.error(e) + +- uses_rpmautospec = False ++ uses_rpmautospec_autorelease = uses_rpmautospec_autochangelog = False + if specfile_uses_rpmautospec: +- uses_rpmautospec = specfile_uses_rpmautospec( ++ uses_rpmautospec_autorelease = specfile_uses_rpmautospec( + specpath=s.filename, + check_autorelease=True, + check_autochangelog=False + ) ++ uses_rpmautospec_autochangelog = specfile_uses_rpmautospec( ++ specpath=s.filename, ++ check_autorelease=False, ++ check_autochangelog=True ++ ) + +- if uses_rpmautospec: ++ changed = False ++ if uses_rpmautospec_autorelease: + if opts.new: + print("RPMAutoSpec usage detected, only setting Version.") + changed = s.newVersion(opts.new, set_release=False) +- else: ++ elif uses_rpmautospec_autochangelog: + print("RPMAutoSpec usage detected, not changing the spec file.") + continue + else: +@@ -405,14 +413,12 @@ the Free Software Foundation; either version 2 of the License, or + + changed = True + +- # If we didn't change anything, no need to write and modify the +- # changelog. + if changed: ++ # Write out changed version or release if changed. + s.writeFile(aspec) +- else: +- continue + +- if uses_rpmautospec: ++ if uses_rpmautospec_autochangelog: ++ print("RPMAutospec %autochangelog is used, no need to add %changelog entry.") + continue + + if not s.checkChangelogPresence(): +@@ -422,6 +428,10 @@ the Free Software Foundation; either version 2 of the License, or + # Get EVR for changelog entry. + cmd = ("rpm", "-q", "--specfile", "--define", "dist %{nil}", + "--qf=%|epoch?{%{epoch}:}:{}|%{version}-%{release}\n", aspec) ++ if not opts.new and calculate_release_number and uses_rpmautospec_autorelease: ++ # Rpmautospec doesn’t see a change yet so the calculated number will be one too low. ++ release_number = calculate_release_number(aspec) + 1 ++ cmd += ("--define", "_rpmautospec_release_number {}".format(release_number)) + popen = subprocess.Popen(cmd, stdout=subprocess.PIPE) + evr = popen.communicate()[0].split(b"\n")[0] + if sys.version_info[0] > 2: +diff --git a/rpmdev-spectool b/rpmdev-spectool +index 1d57256..2c06ef8 100755 +--- a/rpmdev-spectool ++++ b/rpmdev-spectool +@@ -25,7 +25,9 @@ import os + import tempfile + import time + from collections import OrderedDict +-from typing import Optional ++from typing import Any, Callable, Dict, List, Optional ++from typing import OrderedDict as OrderedDictT ++from typing import Tuple + from urllib.parse import urlparse + + import progressbar +@@ -46,13 +48,13 @@ anything about missing sources or patches). The plan is to catch errors like + this in spectool itself and warn the user about it in the future.""" + + +-def complete_spec_paths(prefix, **kwargs): ++def complete_spec_paths(prefix, **kwargs) -> List[str]: + import glob + + return glob.glob(prefix + "*.spec") + + +-def get_args() -> dict: ++def get_args() -> Dict[str, Any]: + try: + import argcomplete + except ImportError: +@@ -191,6 +193,15 @@ def get_args() -> dict: + help="output debug info, don't clean up when done", + ) + ++ misc.add_argument( ++ "--http-header", ++ "-H", ++ action="append", ++ dest="headers", ++ default=[], ++ help="Optionally add custom headers", ++ ) ++ + specfile = parser.add_argument("specfile", action="store") + + if argcomplete: +@@ -202,17 +213,17 @@ def get_args() -> dict: + return vars(parser.parse_args()) + + +-def split_numbers(args: str) -> list: ++def split_numbers(args: str) -> List[str]: + return args.split(",") + + + # simple streamed file download progress tracker inspired by requests_download + class ProgressTracker: +- def __init__(self, progress_bar: progressbar.ProgressBar): ++ def __init__(self, progress_bar: progressbar.ProgressBar) -> None: + self.progress_bar = progress_bar + self.received = 0 + +- def on_start(self, response: requests.Response): ++ def on_start(self, response: requests.Response) -> None: + max_value = None + + if "content-length" in response.headers: +@@ -221,7 +232,7 @@ class ProgressTracker: + self.progress_bar.start(max_value=max_value) + self.received = 0 + +- def on_chunk(self, chunk: bytes): ++ def on_chunk(self, chunk: bytes) -> None: + self.received += len(chunk) + + try: +@@ -229,12 +240,13 @@ class ProgressTracker: + except ValueError: + pass + +- def on_finish(self): ++ def on_finish(self) -> None: + self.progress_bar.finish() + + + # simple streamed file download implementation inspired by requests_download +-def download(url, target, headers=None, tracker: Optional[ProgressTracker] = None): ++def download(url, target, headers=None, ++ tracker: Optional[ProgressTracker] = None) -> None: + if headers is None: + headers = {} + +@@ -263,7 +275,8 @@ def download(url, target, headers=None, tracker: Optional[ProgressTracker] = Non + tracker.on_finish() + + +-def get_file(url: str, path: str, force: bool) -> bool: ++def get_file(url: str, path: str, force: bool, ++ headers: Optional[Dict[str, str]] = None) -> bool: + if os.path.exists(path): + if force: + os.remove(path) +@@ -272,13 +285,13 @@ def get_file(url: str, path: str, force: bool) -> bool: + return False + + progress = ProgressTracker(progressbar.DataTransferBar()) +- download(url, path, tracker=progress) ++ download(url, path, tracker=progress, headers=headers) + + return True + + + class Spec: +- def __init__(self, path: str): ++ def __init__(self, path: str) -> None: + self.path = path + self.spec = rpm.spec(self.path) + +@@ -289,10 +302,10 @@ class Spec: + self.files = list(self.spec.sources) + self.files.sort(key=(lambda file: file[1])) + +- self._sources = None +- self._patches = None ++ self._sources: Optional[OrderedDictT[str, str]] = None ++ self._patches: Optional[OrderedDictT[str, str]] = None + +- def _files(self, typ) -> OrderedDict: ++ def _files(self, typ: int) -> OrderedDictT[str, str]: + # file is a 3-tuple of (path, number, type) + # type 1: source file + # type 2: patch file +@@ -305,41 +318,42 @@ class Spec: + return files + + @property +- def sources(self) -> OrderedDict: ++ def sources(self) -> OrderedDictT[str, str]: + if not self._sources: + self._sources = self._files(1) + + return self._sources + + @property +- def patches(self) -> OrderedDict: ++ def patches(self) -> OrderedDictT[str, str]: + if not self._patches: + self._patches = self._files(2) + + return self._patches + +- def print_source(self, number: int, value: str = None): ++ def print_source(self, number: str, value: Optional[str] = None) -> None: + if not value: + value = self.sources[number] + + print("Source{}: {}".format(number, value)) + +- def print_patch(self, number: int, value: str = None): ++ def print_patch(self, number: str, value: Optional[str] = None) -> None: + if not value: + value = self.patches[number] + + print("Patch{}: {}".format(number, value)) + +- def list_sources(self): ++ def list_sources(self) -> None: + for (number, value) in self.sources.items(): + self.print_source(number, value) + +- def list_patches(self): ++ def list_patches(self) -> None: + for (number, value) in self.patches.items(): + self.print_patch(number, value) + + @staticmethod +- def _get_file(value: str, directory: str, force: bool, dry: bool): ++ def _get_file(value: str, directory: str, force: bool, dry: bool, ++ headers: Optional[Dict[str, str]] = None) -> None: + parsed = urlparse(value) + + if "#" not in value: +@@ -354,19 +368,23 @@ class Spec: + return + + if parsed.scheme: ++ if dry: ++ print("Would have downloaded: {}".format(value)) ++ return None + if not dry: + path = os.path.join(directory, basename) + + try: + print("Downloading: {}".format(value)) + os.makedirs(directory, exist_ok=True) +- really = get_file(value, path, force) ++ really = get_file(value, path, force, headers=headers) + if really: + print("Downloaded: {}".format(basename)) + + except IOError as e: + print("Download failed:") + print(e) ++ raise e + + except KeyboardInterrupt: + if os.path.isfile(path): +@@ -376,28 +394,53 @@ class Spec: + print("Download cancelled.") + raise + +- else: +- print("Would have downloaded: {}".format(value)) +- +- def get_source(self, number: int, directory: str, force: bool, dry: bool, value: str = None): ++ def get_source(self, number: str, directory: str, force: bool, dry: bool, ++ value: Optional[str] = None, ++ headers: Optional[Dict[str, str]] = None) -> bool: + if not value: + value = self.sources[number] + +- self._get_file(value, directory, force, dry) ++ try: ++ self._get_file(value, directory, force, dry, headers=headers) ++ return False ++ ++ except IOError: ++ return True + +- def get_patch(self, number: int, directory: str, force: bool, dry: bool, value: str = None): ++ def get_patch(self, number: str, directory: str, force: bool, dry: bool, ++ value: Optional[str] = None, ++ headers: Optional[Dict[str, str]] = None) -> bool: + if not value: + value = self.patches[number] + +- self._get_file(value, directory, force, dry) ++ try: ++ self._get_file(value, directory, force, dry, headers=headers) ++ return False ++ ++ except IOError: ++ return True ++ ++ def get_sources(self, directory: str, force: bool, dry: bool, ++ headers: Optional[Dict[str, str]] = None): ++ failure = False + +- def get_sources(self, directory: str, force: bool, dry: bool): + for number, value in self.sources.items(): +- self.get_source(number, directory, force, dry, value) ++ if self.get_source(number, directory, force, dry, value, ++ headers=headers): ++ failure = True ++ ++ return failure ++ ++ def get_patches(self, directory: str, force: bool, dry: bool, ++ headers: Optional[Dict[str, str]] = None): ++ failure = False + +- def get_patches(self, directory: str, force: bool, dry: bool): + for number, value in self.patches.items(): +- self.get_patch(number, directory, force, dry, value) ++ if self.get_patch(number, directory, force, dry, value, ++ headers=headers): ++ failure = True ++ ++ return failure + + + def main() -> int: +@@ -484,6 +527,10 @@ def main() -> int: + if args["get_files"]: + force = args["force"] + dry = args["dry_run"] ++ headers = {} ++ for header in args["headers"]: ++ k, sep, v = header.partition(':') ++ headers[k.strip()] = v.strip() + + if args["directory"] and args["sourcedir"]: + print("Conflicting requests for download directory.") +@@ -496,18 +543,21 @@ def main() -> int: + else: + directory = os.getcwd() + ++ tasks: List[Tuple[Callable[..., bool], Tuple[Any, ...]]] = [] ++ + if args["source"]: + numbers = split_numbers(args["source"]) + + for number in numbers: + if number not in spec.sources.keys(): +- print("No patch with number '{}' found.".format(number)) ++ print("No source with number '{}' found.".format(number)) + continue + +- spec.get_source(number, directory, force, dry) ++ tasks.append((spec.get_source, (number, directory, force, dry, ++ headers))) + + elif args["sources"] and not args["patch"]: +- spec.get_sources(directory, force, dry) ++ tasks.append((spec.get_sources, (directory, force, dry, headers))) + + if args["patch"]: + numbers = split_numbers(args["patch"]) +@@ -517,10 +567,22 @@ def main() -> int: + print("No patch with number '{}' found.".format(number)) + continue + +- spec.get_patch(number, directory, force, dry) ++ tasks.append((spec.get_patch, (number, directory, force, dry, ++ headers))) + + elif args["patches"] and not args["source"]: +- spec.get_patches(directory, force, dry) ++ tasks.append((spec.get_patches, (directory, force, dry, headers))) ++ ++ failure = False ++ ++ for task, fargs in tasks: ++ fail = task(*fargs) ++ ++ if fail: ++ failure = True ++ ++ if failure: ++ return 1 + + return 0 + +diff --git a/spectemplate-cmake.spec b/spectemplate-cmake.spec +new file mode 100644 +index 0000000..0cdcbb8 +--- /dev/null ++++ b/spectemplate-cmake.spec +@@ -0,0 +1,38 @@ ++Name: ++Version: ++Release: 1%{?dist} ++Summary: ++ ++License: ++URL: ++Source0: ++ ++BuildRequires: cmake ++ ++%description ++%{summary}. ++ ++ ++%prep ++%autosetup -q ++ ++ ++%build ++%cmake ++%cmake_build ++ ++ ++%install ++%cmake_install ++ ++ ++%check ++%ctest ++ ++ ++%files ++%license add-license-file-here ++%doc add-docs-here ++ ++ ++%changelog +diff --git a/spectemplate-pyproject.spec b/spectemplate-pyproject.spec +new file mode 100644 +index 0000000..15d5a65 +--- /dev/null ++++ b/spectemplate-pyproject.spec +@@ -0,0 +1,60 @@ ++Name: python-... ++Version: ... ++Release: 1%{?dist} ++Summary: ... ++ ++License: ... ++URL: https://... ++# use a source from git forge or PyPI: ++Source: %{url}/archive/v%{version}/...-%{version}.tar.gz / %{pypi_source ...} ++ ++# for pure Python packages: ++BuildArch: noarch ++# for packages with extension modules: ++BuildRequires: gcc ++ ++BuildRequires: python3-devel ++ ++%global _description %{expand: ++...} ++ ++%description %_description ++ ++%package -n python3-... ++Summary: %{summary} ++ ++%description -n python3-... %_description ++ ++ ++%prep ++%autosetup -p1 -n ...-%{version} ++ ++ ++%generate_buildrequires ++# use the appropriate flags to get all test dependencies: ++%pyproject_buildrequires -x... / -t ++ ++ ++%build ++%pyproject_wheel ++ ++ ++%install ++%pyproject_install ++# list the installed top-level Python module names: ++%pyproject_save_files ... ++ ++ ++%check ++# testing the package is mandatory, at least somehow: ++%tox / %pytest / %pyproject_check_import ... ++ ++ ++%files -n python3-... -f %{pyproject_files} ++%doc README.* ++# only add LICENSE / COPYING if not included in %%{pyproject_files} ++%license LICENSE / COPYING ++%{_bindir}/... ++ ++ ++%changelog diff --git a/progressbar.py b/progressbar.py new file mode 100644 index 0000000..c822e29 --- /dev/null +++ b/progressbar.py @@ -0,0 +1,133 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# +# A simple text-based progress bar, compatible with the basic API of: +# https://github.com/WoLpH/python-progressbar +# +# Copyright (C) 2021 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. + + +import shutil +import sys +import time + + +class ProgressBar: + FORMAT = '{value:>10} / {max_value:<10} [{bars}]' + BARS = '= ' + SPINLEN = 5 + + def __init__(self, stream=sys.stderr, max_width=80, fps=10): + self._stream = stream + self._max_width = max_width + self._min_delay = 1 / fps + + @staticmethod + def _format_value(value): + raise NotImplementedError() + + def start(self, max_value): + self._value = 0 + self._max_value = max_value or 0 + self._status = dict() + self._spinner = 0 + self._timestamp = 0 + self.update(0) + + def update(self, value): + self._value = value + if value > self._max_value: + self._max_value = 0 + + ts = time.time() + if (ts - self._timestamp) < self._min_delay: + return + self._timestamp = ts + + status = {'value': self._format_value(value), + 'max_value': self._format_value(self._max_value) \ + if self._max_value else '???', + 'bars': ''} + + termw = min(shutil.get_terminal_size()[0], self._max_width) + nbars = max(termw - len(self.FORMAT.format(**status)), 0) + nfill = nskip = 0 + + if self._max_value: + nfill = round(nbars * value / self._max_value) + elif nbars > self.SPINLEN: + nfill = self.SPINLEN + nskip = self._spinner % (nbars - self.SPINLEN) + self._spinner = nskip + 1 + + status['bars'] = self.BARS[1] * nskip + \ + self.BARS[0] * nfill + \ + self.BARS[1] * (nbars - nfill - nskip) + + if status == self._status: + return + self._status = status + + self._stream.write('\r') + self._stream.write(self.FORMAT.format(**self._status)) + self._stream.flush() + + def finish(self): + self._max_value = self._value + self._timestamp = 0 # Force an update + self.update(self._value) + + self._stream.write('\n') + self._stream.flush() + + +class DataTransferBar(ProgressBar): + @staticmethod + def _format_value(value): + symbols = ' KMGTPEZY' + depth = 0 + max_depth = len(symbols) - 1 + unit = 1024.0 + + # 1023.95 should be formatted as 1.0 (not 1024.0) + # More info: https://stackoverflow.com/a/63839503 + thres = unit - 0.05 + + while value >= thres and depth < max_depth: + depth += 1 + value /= unit + symbol = ' %siB' % symbols[depth] if depth > 0 else '' + + return '%.1f%s' % (value, symbol) + + +if __name__ == '__main__': + # Show a dummy bar for debugging purposes + + bar = DataTransferBar() + size = 50*1024*1024 + chunk = 1024*1234 + recvd = 0 + + bar.start(size) + while recvd < (size - chunk): + recvd += chunk + bar.update(recvd) + time.sleep(0.1) + bar.update(size) + bar.finish() diff --git a/rpmdevtools-9.5-no_qa_robot.patch b/rpmdevtools-9.5-no_qa_robot.patch new file mode 100644 index 0000000..1e17765 --- /dev/null +++ b/rpmdevtools-9.5-no_qa_robot.patch @@ -0,0 +1,21 @@ +diff -up rpmdevtools-9.5/Makefile.am.orig rpmdevtools-9.5/Makefile.am +--- rpmdevtools-9.5/Makefile.am.orig 2021-12-10 11:37:29.889405680 +0100 ++++ rpmdevtools-9.5/Makefile.am 2021-12-10 11:37:34.637495820 +0100 +@@ -1,4 +1,4 @@ +-SUBDIRS = emacs qa-robot ++SUBDIRS = emacs + + pkgsysconfdir = $(sysconfdir)/rpmdevtools + bashcompdir = @bashcompdir@ +diff -up rpmdevtools-9.5/Makefile.in.orig rpmdevtools-9.5/Makefile.in +--- rpmdevtools-9.5/Makefile.in.orig 2021-12-10 11:37:31.073428158 +0100 ++++ rpmdevtools-9.5/Makefile.in 2021-12-10 11:37:38.304565439 +0100 +@@ -317,7 +317,7 @@ target_alias = @target_alias@ + top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ +-SUBDIRS = emacs qa-robot ++SUBDIRS = emacs + pkgsysconfdir = $(sysconfdir)/rpmdevtools + bin_SCRIPTS = rpmdev-newinit rpmdev-newspec rpmdev-rmdevelrpms + dist_bin_SCRIPTS = rpmdev-checksig rpmdev-diff rpmdev-extract rpmdev-md5 \ diff --git a/rpmdevtools.spec b/rpmdevtools.spec index 89c3c93..86879d9 100644 --- a/rpmdevtools.spec +++ b/rpmdevtools.spec @@ -1,45 +1,63 @@ -%global emacs_sitestart_d %{_datadir}/emacs/site-lisp/site-start.d -%global xemacs_sitestart_d %{_datadir}/xemacs/site-packages/lisp/site-start.d -%global spectool_version 1.0.10 - Name: rpmdevtools -Version: 7.8 -Release: 1%{?dist} +Version: 9.6 +Release: 13%{?dist} Summary: RPM Development Tools -Group: Development/Tools -# rpmdev-setuptree is GPLv2, everything else GPLv2+ -License: GPLv2+ and GPLv2 -URL: https://fedorahosted.org/rpmdevtools/ -Source0: https://fedorahosted.org/released/rpmdevtools/%{name}-%{version}.tar.xz -Source1: http://people.redhat.com/nphilipp/spectool/spectool-%{spectool_version}.tar.bz2 -Patch0: spectool-1.0.10-sourcenum.patch -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +# rpmdev-md5 and rpmdev-setuptree are GPL-2.0-only, +# everything else is GPL-2.0-or-later. +License: GPL-2.0-or-later AND GPL-2.0-only +URL: https://pagure.io/rpmdevtools +Source0: https://releases.pagure.org/rpmdevtools/%{name}-%{version}.tar.xz +Source1: progressbar.py + +# Fedora-specific downstream patches +## Force legacy datestamp by default until rhbz#1715412 is resolved +Patch1001: 0001-Force-legacy-datestamp-while-RHBZ-1715412-is-still-a.patch + +# RHEL-specific downstream patches +## Remove fakeroot dependency (rhbz#1905465) +Patch2001: rpmdevtools-9.5-no_qa_robot.patch BuildArch: noarch # help2man, pod2man, *python for creating man pages +BuildRequires: make BuildRequires: help2man BuildRequires: %{_bindir}/pod2man -BuildRequires: python >= 2.4 -BuildRequires: rpm-python -Provides: spectool = %{spectool_version} +BuildRequires: perl-generators +# python dependencies for spectool +# spectool is executed for creating man page +BuildRequires: python3-devel +%if ! 0%{?rhel} +BuildRequires: python3dist(progressbar2) +%endif +BuildRequires: python3dist(requests) +BuildRequires: python3dist(rpm) +# emacs-common >= 1:22.3-3 for macros.emacs +BuildRequires: emacs-common >= 1:22.3-3 +BuildRequires: bash-completion +Requires: curl Requires: diffutils +%if ! 0%{?rhel} Requires: fakeroot +%endif Requires: file Requires: findutils Requires: gawk Requires: grep -Requires: man -Requires: python >= 2.4 Requires: rpm-build >= 4.4.2.3 -Requires: rpm-python +Requires: python3dist(argcomplete) +%if ! 0%{?rhel} +Requires: python3dist(progressbar2) +%endif +Requires: python3dist(requests) +Requires: python3dist(rpm) Requires: sed -Requires: wget -# For _get_cword in bash completion snippet -Conflicts: bash-completion < 20080705 +Requires: emacs-filesystem +# Optionally support rpmautospec +Recommends: python%{python3_version}dist(rpmautospec) %description -This package contains scripts and (X)Emacs support files to aid in +This package contains scripts and Emacs support files to aid in development of RPM packages. rpmdev-setuptree Create RPM build tree within user's home directory rpmdev-diff Diff contents of two archives @@ -49,7 +67,7 @@ rpmdev-checksig Check package signatures using alternate RPM keyring rpminfo Print information about executables and libraries rpmdev-md5/sha* Display checksums of all files in an archive file rpmdev-vercmp RPM version comparison checker -spectool Expand and download sources and patches in specfiles +rpmdev-spectool Expand and download sources and patches in specfiles rpmdev-wipetree Erase all files within dirs created by rpmdev-setuptree rpmdev-extract Extract various archives, "tar xvf" style rpmdev-bumpspec Bump revision in specfile @@ -57,63 +75,267 @@ rpmdev-bumpspec Bump revision in specfile %prep -%setup -q -a 1 -cp -p spectool-%{spectool_version}/README README.spectool -cd spectool-%{spectool_version} -%patch0 -p1 -cd .. +%autosetup -N +%autopatch -p1 %{!?rhel:-M2000} +grep -lF "%{_bindir}/python " * \ +| xargs sed -i -e "s|%{_bindir}/python |%{_bindir}/python3 |" + +%if 0%{?rhel} +# Let spectool find the bundled progressbar2 implementation +cp %{SOURCE1} . +sed -i \ +'s|^\(import progressbar\)$|'\ +'import sys\n'\ +'sys.path.insert(1, "%{_datadir}/rpmdevtools")\n'\ +'\1\nsys.path.pop(1)|' \ +rpmdev-spectool +%endif %build %configure --libdir=%{_prefix}/lib -make %{?_smp_mflags} +%make_build %install -rm -rf $RPM_BUILD_ROOT +%make_install -make install DESTDIR=$RPM_BUILD_ROOT +echo %%{_datadir}/bash-completion > %{name}.files +[ -d %{buildroot}%{_sysconfdir}/bash_completion.d ] && \ +echo %%{_sysconfdir}/bash_completion.d > %{name}.files -install -pm 755 spectool-%{spectool_version}/spectool $RPM_BUILD_ROOT%{_bindir} - -for dir in %{emacs_sitestart_d} %{xemacs_sitestart_d} ; do - install -dm 755 $RPM_BUILD_ROOT$dir - ln -s %{_datadir}/rpmdevtools/rpmdev-init.el $RPM_BUILD_ROOT$dir - touch $RPM_BUILD_ROOT$dir/rpmdev-init.elc +for dir in %{_emacs_sitestartdir} ; do + install -dm 755 %{buildroot}$dir + ln -s %{_datadir}/rpmdevtools/rpmdev-init.el %{buildroot}$dir + touch %{buildroot}$dir/rpmdev-init.elc done +# For backwards compatibility +ln -sr %{buildroot}%{_bindir}/rpmdev-spectool %{buildroot}%{_bindir}/spectool +echo ".so man1/rpmdev-spectool.1" > %{buildroot}%{_mandir}/man1/spectool.1 -%clean -rm -rf $RPM_BUILD_ROOT +%if 0%{?rhel} +cp %{SOURCE1} %{buildroot}%{_datadir}/rpmdevtools/ +%py_byte_compile %{python3} %{buildroot}%{_datadir}/rpmdevtools/ +%endif -%triggerin -- emacs-common -[ -d %{emacs_sitestart_d} ] && \ - ln -sf %{_datadir}/rpmdevtools/rpmdev-init.el %{emacs_sitestart_d} || : - -%triggerin -- xemacs-common -[ -d %{xemacs_sitestart_d} ] && \ - ln -sf %{_datadir}/rpmdevtools/rpmdev-init.el %{xemacs_sitestart_d} || : - -%triggerun -- emacs-common -[ $2 -eq 0 ] && rm -f %{emacs_sitestart_d}/rpmdev-init.el* || : - -%triggerun -- xemacs-common -[ $2 -eq 0 ] && rm -f %{xemacs_sitestart_d}/rpmdev-init.el* || : - - -%files -%defattr(-,root,root,-) -%doc COPYING NEWS README* +%files -f %{name}.files +%license COPYING +%doc NEWS %config(noreplace) %{_sysconfdir}/rpmdevtools/ -%{_sysconfdir}/bash_completion.d/ %{_datadir}/rpmdevtools/ %{_bindir}/* -%ghost %{_datadir}/*emacs +%{_emacs_sitestartdir}/rpmdev-init.el +%ghost %{_emacs_sitestartdir}/rpmdev-init.elc %{_mandir}/man[18]/*.[18]* %changelog +* Sat Aug 09 2025 Fabio Valentini - 9.6-13 +- Revert to last stable release + +* Mon Aug 04 2025 Mark Wielaard - 9.6-12.git83b35ac +- Add BuildRequires for autoreconf, fixes rhbz#2385580 + +* Fri Jul 25 2025 Fedora Release Engineering - 9.6-11.git83b35ac +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + +* Thu Jan 23 2025 Jens Petersen - 9.6-10.git83b35ac +- update to latest git 83b35ac changes + +* Sat Jan 18 2025 Fedora Release Engineering - 9.6-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + +* Fri Jul 19 2024 Fedora Release Engineering - 9.6-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Fri Jan 26 2024 Fedora Release Engineering - 9.6-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Mon Jan 22 2024 Fedora Release Engineering - 9.6-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Fri Aug 25 2023 Petr Pisar - 9.6-5 +- Convert a license tag to SPDX format + +* Fri Jul 21 2023 Fedora Release Engineering - 9.6-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Fri Jan 20 2023 Fedora Release Engineering - 9.6-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Sat Jul 23 2022 Fedora Release Engineering - 9.6-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Fri Feb 04 2022 Neal Gompa - 9.6-1 +- Update to 9.6 + +* Fri Jan 21 2022 Fedora Release Engineering - 9.5-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Tue Nov 9 2021 Jerry James - 9.5-3 +- Drop XEmacs support in F36 and later + +* Fri Jul 23 2021 Fedora Release Engineering - 9.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Sat Jul 17 2021 Neal Gompa - 9.5-1 +- Update to 9.5 + +* Sat Jul 17 2021 Neal Gompa - 9.4-1 +- Update to 9.4 + +* Mon Feb 15 2021 Miro Hrončok - 9.3-5 +- Require any Python version of the Python packages + +* Wed Jan 27 2021 Fedora Release Engineering - 9.3-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Mon Jan 25 2021 Miro Hrončok - 9.3-3 +- spectool: Download text as text + +* Fri Jan 22 2021 Michal Domonkos - 9.3-2 +- Replace requests-download dependency with requests + +* Wed Jan 20 2021 Neal Gompa - 9.3-1 +- Update to 9.3 +- Force legacy datestamp by default until rhbz#1715412 is resolved + +* Mon Oct 05 2020 Neal Gompa - 9.2-1 +- Update to 9.2 + +* Thu Aug 20 2020 Neal Gompa - 9.1-1 +- Update to 9.1 + +* Wed Jul 29 2020 Fedora Release Engineering - 9.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Thu Jul 16 2020 Neal Gompa - 9.0-2 +- Backport fix for python spec template + +* Tue Jul 14 2020 Neal Gompa - 9.0-1 +- Update to 9.0 + +* Wed Mar 25 2020 Jitka Plesnikova - 8.10-11 +- Add perl dependencies needed for build + +* Thu Jan 30 2020 Fedora Release Engineering - 8.10-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Fri Jul 26 2019 Fedora Release Engineering - 8.10-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Sat Feb 02 2019 Fedora Release Engineering - 8.10-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Wed Nov 28 2018 Neal Gompa - 8.10-7 +- Fix regex substitution issues with Python 3.7 (rhbz#1651954) + +* Sun Sep 16 2018 Neal Gompa - 8.10-6 +- Fix regex related deprecation warnings (rhbz#1598089) + +* Sat Jul 14 2018 Fedora Release Engineering - 8.10-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Fri Feb 09 2018 Fedora Release Engineering - 8.10-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 8.10-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Sat Feb 11 2017 Fedora Release Engineering - 8.10-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Sat Jan 14 2017 Ville Skyttä - 8.10-1 +- Update to 8.10 + +* Mon Dec 19 2016 Miro Hrončok - 8.9-2 +- Rebuild for Python 3.6 + +* Sat Jun 25 2016 Ville Skyttä - 8.9-1 +- Update to 8.9 + +* Sat Jun 25 2016 Ville Skyttä - 8.8-1 +- Update to 8.8 + +* Fri Jun 24 2016 Petr Písař +- Add new mandatory perl build deps + +* Thu Jun 23 2016 Ville Skyttä - 8.7-1 +- Update to 8.7 +- Specfile cleanups + +* Thu Feb 04 2016 Fedora Release Engineering - 8.6-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Fri Jun 5 2015 Ville Skyttä - 8.6-2 +- Use python3 on > F-22 + +* Sun May 10 2015 Ville Skyttä - 8.6-1 +- Update to 8.6 + +* Mon Oct 20 2014 Ville Skyttä - 8.5-1 +- Update to 8.5 +- Mark COPYING as %%license where applicable + +* Sun Jun 08 2014 Fedora Release Engineering - 8.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Thu Oct 17 2013 Ville Skyttä - 8.4-2 +- Do not require devscripts in any scenario. + +* Mon Oct 7 2013 Ville Skyttä - 8.4-1 +- Update to 8.4. + +* Sun Aug 04 2013 Fedora Release Engineering - 8.3-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Wed Jul 17 2013 Petr Pisar - 8.3-4 +- Perl 5.18 rebuild + +* Thu Feb 14 2013 Fedora Release Engineering - 8.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Tue Oct 16 2012 Thomas Woerner - 8.3-2 +- xemacs is not available on RHEL (RHBZ#866841) + +* Sun Sep 2 2012 Ville Skyttä - 8.3-1 +- Update to 8.3. +- Drop specfile constructs no longer needed with Fedora's rpm. + +* Sat Jul 21 2012 Fedora Release Engineering - 8.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Sat Jan 14 2012 Fedora Release Engineering - 8.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Sat Nov 12 2011 Ville Skyttä - 8.2-1 +- Update to 8.2. + +* Tue Apr 26 2011 Ville Skyttä - 8.1-1 +- Update to 8.1. + +* Tue Mar 1 2011 Ville Skyttä - 8.0-3 +- Require xemacs-filesystem on F-15+ (#672093). + +* Wed Feb 09 2011 Fedora Release Engineering - 8.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Sun Feb 6 2011 Ville Skyttä - 8.0-1 +- Update to 8.0, fixes #519061 and #657594. + +* Mon Sep 27 2010 Ville Skyttä - 7.10-1 +- Update to 7.10, fixes #595135 and #619867. +- Patch spectool to work with specfiles containing Icon or BuildArchitectures + (#637000). + +* Thu May 20 2010 Ville Skyttä - 7.9-1 +- Update to 7.9, fixes #588313 and #589705. + +* Fri Apr 16 2010 Ville Skyttä - 7.8-2 +- Require %%{_bindir}/man instead of man (#582932). + * Tue Feb 16 2010 Ville Skyttä - 7.8-1 - Update to 7.8, fixes #562316. diff --git a/sources b/sources index ddf2c5b..4bb8a6c 100644 --- a/sources +++ b/sources @@ -1,2 +1 @@ -d193612122f297ee4b37f1b04f605768 spectool-1.0.10.tar.bz2 -a495921f4c05cc92018f61cccf6fdfbf rpmdevtools-7.8.tar.xz +SHA512 (rpmdevtools-9.6.tar.xz) = 691fec8944029dbe60cb3eab0200d1201f5aa3dd11cd49e8313ee7c1fe998237217ea9c5ae7b4a70f61f3c998093f23d26266b23f41607ddca3148d5f6b6ae06 diff --git a/spectool-1.0.10-sourcenum.patch b/spectool-1.0.10-sourcenum.patch deleted file mode 100644 index c9a0581..0000000 --- a/spectool-1.0.10-sourcenum.patch +++ /dev/null @@ -1,17 +0,0 @@ -Fix for -s x,y, -p x,y from Todd Zullinger: -https://www.redhat.com/archives/fedora-devel-list/2009-August/msg00621.html - -diff -up spectool-1.0.10/spectool~ spectool-1.0.10/spectool ---- spectool-1.0.10/spectool~ 2008-02-12 12:32:21.000000000 +0200 -+++ spectool-1.0.10/spectool 2009-08-21 02:12:56.000000000 +0300 -@@ -269,8 +269,8 @@ GetOptions ('h|help' => sub { $command = - 'v|verbose' => sub { $verbose++; }, - 'n|dryrun|dry-run' => sub { $dryrun = 1; }, - 'V|version' => sub { $command = 'version'; }, -- 's|source=i' => \@sources, -- 'p|patch=i' => \@patches, -+ 's|source=s' => \@sources, -+ 'p|patch=s' => \@patches, - 'S|sources' => sub { push @what, 'sources'; }, - 'P|patches' => sub { push @what, 'patches'; }, - 'A|all' => sub { push @what, 'all'; },