Compare commits

...
14 Commits
Author SHA1 Message Date
Fedora Release Engineering 026974d82c Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild 2026-01-17 11:29:30 +00:00
Fabio Valentini 62a3f4726e Revert to last stable release; Fixes RHBZ#2387173
The bump to a git snapshot of upstream commit 83b35ac was never
built except during the F43 mass rebuild, and actually introduced
regressions.
2025-08-09 17:24:22 +02:00
Mark Wielaard 1b8f9ed759 Fix F43 FTBFS - Add BuildRequires for autoreconf
Patch1002 needs autoreconf, see %build.
Add autoconf and automake BuildRequires.

Resolves: #2385580
rpmdevtools: FTBFS in Fedora rawhide/f43
https://bugzilla.redhat.com/show_bug.cgi?id=2385580
2025-08-04 22:23:25 +02:00
Fedora Release Engineering 6ce9455bd6 Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild 2025-07-25 12:07:10 +00:00
Jens Petersen 2e6a03f01b update to latest git 83b35ac changes 2025-01-23 16:10:01 +08:00
Fedora Release Engineering 866bfe8ed5 Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild 2025-01-18 22:43:28 +00:00
Fedora Release Engineering 60f1fea2fb Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild 2024-07-19 18:49:52 +00:00
Fedora Release Engineering dd63de6d12 Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-26 16:21:43 +00:00
Fedora Release Engineering 401ab23b44 Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-22 11:59:47 +00:00
Petr Písař dc545ca948 Convert a license tag to SPDX format 2023-08-25 10:27:18 +02:00
Fedora Release Engineering 3f4f7d2e30 Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-07-21 17:05:42 +00:00
Yaakov Selkowitz 302155c304 Import C9S changes
This drops the unwanted fakeroot and python3-progressbar2 dependencies
from RHEL/ELN builds, and also removes obsolete F<36 conditionals.
2023-04-18 22:53:08 -04:00
Fedora Release Engineering af0e25c44d Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-01-20 19:57:40 +00:00
Troy Dawson 6331051938 Fix bad conditional 2022-10-13 09:33:54 -07:00
4 changed files with 755 additions and 20 deletions
+531
View File
@@ -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 doesnt 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
+133
View File
@@ -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()
+21
View File
@@ -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 \
+70 -20
View File
@@ -1,17 +1,23 @@
Name: rpmdevtools Name: rpmdevtools
Version: 9.6 Version: 9.6
Release: 2%{?dist} Release: 14%{?dist}
Summary: RPM Development Tools Summary: RPM Development Tools
# rpmdev-setuptree is GPLv2, everything else GPLv2+ # rpmdev-md5 and rpmdev-setuptree are GPL-2.0-only,
License: GPLv2+ and GPLv2 # everything else is GPL-2.0-or-later.
License: GPL-2.0-or-later AND GPL-2.0-only
URL: https://pagure.io/rpmdevtools URL: https://pagure.io/rpmdevtools
Source0: https://releases.pagure.org/rpmdevtools/%{name}-%{version}.tar.xz Source0: https://releases.pagure.org/rpmdevtools/%{name}-%{version}.tar.xz
Source1: progressbar.py
# Fedora-specific downstream patches # Fedora-specific downstream patches
## Force legacy datestamp by default until rhbz#1715412 is resolved ## Force legacy datestamp by default until rhbz#1715412 is resolved
Patch1001: 0001-Force-legacy-datestamp-while-RHBZ-1715412-is-still-a.patch 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 BuildArch: noarch
# help2man, pod2man, *python for creating man pages # help2man, pod2man, *python for creating man pages
BuildRequires: make BuildRequires: make
@@ -21,38 +27,37 @@ BuildRequires: perl-generators
# python dependencies for spectool # python dependencies for spectool
# spectool is executed for creating man page # spectool is executed for creating man page
BuildRequires: python3-devel BuildRequires: python3-devel
%if ! 0%{?rhel}
BuildRequires: python3dist(progressbar2) BuildRequires: python3dist(progressbar2)
%endif
BuildRequires: python3dist(requests) BuildRequires: python3dist(requests)
BuildRequires: python3dist(rpm) BuildRequires: python3dist(rpm)
# emacs-common >= 1:22.3-3 for macros.emacs # emacs-common >= 1:22.3-3 for macros.emacs
BuildRequires: emacs-common >= 1:22.3-3 BuildRequires: emacs-common >= 1:22.3-3
BuildRequires: bash-completion BuildRequires: bash-completion
%if 0%{?fedora} && 0%{?fedora} < 36
# xemacs-common >= 21.5.29-8 for macros.xemacs
BuildRequires: xemacs-common >= 21.5.29-8
%endif
Requires: curl Requires: curl
Requires: diffutils Requires: diffutils
%if ! 0%{?rhel}
Requires: fakeroot Requires: fakeroot
%endif
Requires: file Requires: file
Requires: findutils Requires: findutils
Requires: gawk Requires: gawk
Requires: grep Requires: grep
Requires: rpm-build >= 4.4.2.3 Requires: rpm-build >= 4.4.2.3
Requires: python3dist(argcomplete) Requires: python3dist(argcomplete)
%if ! 0%{?rhel}
Requires: python3dist(progressbar2) Requires: python3dist(progressbar2)
%endif
Requires: python3dist(requests) Requires: python3dist(requests)
Requires: python3dist(rpm) Requires: python3dist(rpm)
Requires: sed Requires: sed
Requires: emacs-filesystem Requires: emacs-filesystem
%if 0%{?fedora} && 0%{?fedora} < 36
Requires: xemacs-filesystem
%endif
# Optionally support rpmautospec # Optionally support rpmautospec
Recommends: python%{python3_version}dist(rpmautospec) Recommends: python%{python3_version}dist(rpmautospec)
%description %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. development of RPM packages.
rpmdev-setuptree Create RPM build tree within user's home directory rpmdev-setuptree Create RPM build tree within user's home directory
rpmdev-diff Diff contents of two archives rpmdev-diff Diff contents of two archives
@@ -70,10 +75,22 @@ rpmdev-bumpspec Bump revision in specfile
%prep %prep
%autosetup -p1 %autosetup -N
%autopatch -p1 %{!?rhel:-M2000}
grep -lF "%{_bindir}/python " * \ grep -lF "%{_bindir}/python " * \
| xargs sed -i -e "s|%{_bindir}/python |%{_bindir}/python3 |" | 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 %build
%configure --libdir=%{_prefix}/lib %configure --libdir=%{_prefix}/lib
@@ -87,11 +104,7 @@ echo %%{_datadir}/bash-completion > %{name}.files
[ -d %{buildroot}%{_sysconfdir}/bash_completion.d ] && \ [ -d %{buildroot}%{_sysconfdir}/bash_completion.d ] && \
echo %%{_sysconfdir}/bash_completion.d > %{name}.files echo %%{_sysconfdir}/bash_completion.d > %{name}.files
%if 0%{?fedora} && 0%{?fedora} < 36
for dir in %{_emacs_sitestartdir} %{_xemacs_sitestartdir} ; do
%else
for dir in %{_emacs_sitestartdir} ; do for dir in %{_emacs_sitestartdir} ; do
%endif
install -dm 755 %{buildroot}$dir install -dm 755 %{buildroot}$dir
ln -s %{_datadir}/rpmdevtools/rpmdev-init.el %{buildroot}$dir ln -s %{_datadir}/rpmdevtools/rpmdev-init.el %{buildroot}$dir
touch %{buildroot}$dir/rpmdev-init.elc touch %{buildroot}$dir/rpmdev-init.elc
@@ -101,6 +114,11 @@ done
ln -sr %{buildroot}%{_bindir}/rpmdev-spectool %{buildroot}%{_bindir}/spectool ln -sr %{buildroot}%{_bindir}/rpmdev-spectool %{buildroot}%{_bindir}/spectool
echo ".so man1/rpmdev-spectool.1" > %{buildroot}%{_mandir}/man1/spectool.1 echo ".so man1/rpmdev-spectool.1" > %{buildroot}%{_mandir}/man1/spectool.1
%if 0%{?rhel}
cp %{SOURCE1} %{buildroot}%{_datadir}/rpmdevtools/
%py_byte_compile %{python3} %{buildroot}%{_datadir}/rpmdevtools/
%endif
%files -f %{name}.files %files -f %{name}.files
%license COPYING %license COPYING
@@ -110,14 +128,46 @@ echo ".so man1/rpmdev-spectool.1" > %{buildroot}%{_mandir}/man1/spectool.1
%{_bindir}/* %{_bindir}/*
%{_emacs_sitestartdir}/rpmdev-init.el %{_emacs_sitestartdir}/rpmdev-init.el
%ghost %{_emacs_sitestartdir}/rpmdev-init.elc %ghost %{_emacs_sitestartdir}/rpmdev-init.elc
%if 0%{?fedora} && 0%{fedora} < 36
%{_xemacs_sitestartdir}/rpmdev-init.el
%ghost %{_xemacs_sitestartdir}/rpmdev-init.elc
%endif
%{_mandir}/man[18]/*.[18]* %{_mandir}/man[18]/*.[18]*
%changelog %changelog
* Sat Jan 17 2026 Fedora Release Engineering <releng@fedoraproject.org> - 9.6-14
- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild
* Sat Aug 09 2025 Fabio Valentini <decathorpe@gmail.com> - 9.6-13
- Revert to last stable release
* Mon Aug 04 2025 Mark Wielaard <mjw@fedoraproject.org> - 9.6-12.git83b35ac
- Add BuildRequires for autoreconf, fixes rhbz#2385580
* Fri Jul 25 2025 Fedora Release Engineering <releng@fedoraproject.org> - 9.6-11.git83b35ac
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
* Thu Jan 23 2025 Jens Petersen <petersen@redhat.com> - 9.6-10.git83b35ac
- update to latest git 83b35ac changes
* Sat Jan 18 2025 Fedora Release Engineering <releng@fedoraproject.org> - 9.6-9
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
* Fri Jul 19 2024 Fedora Release Engineering <releng@fedoraproject.org> - 9.6-8
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Fri Jan 26 2024 Fedora Release Engineering <releng@fedoraproject.org> - 9.6-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Mon Jan 22 2024 Fedora Release Engineering <releng@fedoraproject.org> - 9.6-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Fri Aug 25 2023 Petr Pisar <ppisar@redhat.com> - 9.6-5
- Convert a license tag to SPDX format
* Fri Jul 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 9.6-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Fri Jan 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 9.6-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Sat Jul 23 2022 Fedora Release Engineering <releng@fedoraproject.org> - 9.6-2 * Sat Jul 23 2022 Fedora Release Engineering <releng@fedoraproject.org> - 9.6-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild