Compare commits
60 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
62a3f4726e |
||
|
|
1b8f9ed759 | ||
|
|
6ce9455bd6 | ||
|
|
2e6a03f01b | ||
|
|
866bfe8ed5 | ||
|
|
60f1fea2fb | ||
|
|
dd63de6d12 | ||
|
|
401ab23b44 | ||
|
|
dc545ca948 | ||
|
|
3f4f7d2e30 | ||
|
|
302155c304 | ||
|
|
af0e25c44d | ||
|
|
6331051938 | ||
|
|
daaa5ba8a6 | ||
|
|
d2e1b48630 | ||
|
|
ab2c7755dc | ||
|
|
02ad6bd4b1 | ||
|
|
66116af6c1 | ||
|
|
a98cb59a66 | ||
|
|
e77bf671a5 | ||
|
|
5e5734dc7e | ||
|
|
4ae7f0e5c8 | ||
|
|
26bfd64822 | ||
|
|
fe6aa3d1c8 | ||
|
|
9d1d240447 | ||
|
|
d5f84e780e | ||
|
|
a08b8cede8 | ||
|
|
7f9552cabf | ||
|
|
b679b19442 | ||
|
|
bd1538f372 | ||
|
|
97e6f2e98d | ||
|
|
6bbfd36f3c | ||
|
|
28701c0ee0 | ||
|
|
5d3221a2cc | ||
|
|
cabbc608ac | ||
|
|
acb4cf9573 | ||
|
|
6df4896829 | ||
|
|
a488e997ab | ||
|
|
e47f8797e3 | ||
|
|
f43651e736 | ||
|
|
3db610549f | ||
|
|
d65daa3d50 | ||
|
|
154304be4d | ||
|
|
98732e8e31 | ||
|
|
be5fa647cd | ||
|
|
d05045c447 | ||
|
|
0032c5270d | ||
|
|
7fba799422 | ||
|
|
4f5745c71e | ||
|
|
85d8faeb9b | ||
|
|
c257bf7df7 | ||
|
|
6c092c945e | ||
|
|
314247a49a | ||
|
|
e5fa722014 | ||
|
|
72a6c0f3cb | ||
|
|
90de409997 | ||
|
|
f5a5863426 | ||
|
|
c00eb73a5b | ||
|
|
d09042a4c7 | ||
|
|
2e66162ac5 |
6 changed files with 949 additions and 41 deletions
|
|
@ -0,0 +1,39 @@
|
|||
From 4a4693c842b6da5d66e3a6bdb1eb7914d2402f7f Mon Sep 17 00:00:00 2001
|
||||
From: Neal Gompa <ngompa13@gmail.com>
|
||||
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
|
||||
|
||||
531
0002-rpmdevtools-git-83b35ac.patch
Normal file
531
0002-rpmdevtools-git-83b35ac.patch
Normal 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 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
|
||||
133
progressbar.py
Normal file
133
progressbar.py
Normal 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
rpmdevtools-9.5-no_qa_robot.patch
Normal file
21
rpmdevtools-9.5-no_qa_robot.patch
Normal 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 \
|
||||
264
rpmdevtools.spec
264
rpmdevtools.spec
|
|
@ -1,46 +1,63 @@
|
|||
%global spectool_version 1.0.10
|
||||
|
||||
Name: rpmdevtools
|
||||
Version: 8.4
|
||||
Release: 2%{?dist}
|
||||
Version: 9.6
|
||||
Release: 13%{?dist}
|
||||
Summary: RPM 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
|
||||
# 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
|
||||
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
|
||||
%if 0%{?fedora}
|
||||
# xemacs-common >= 21.5.29-8 for macros.xemacs
|
||||
BuildRequires: xemacs-common >= 21.5.29-8
|
||||
%endif
|
||||
Provides: spectool = %{spectool_version}
|
||||
BuildRequires: bash-completion
|
||||
Requires: curl
|
||||
Requires: diffutils
|
||||
%if ! 0%{?rhel}
|
||||
Requires: fakeroot
|
||||
%endif
|
||||
Requires: file
|
||||
Requires: findutils
|
||||
Requires: gawk
|
||||
Requires: grep
|
||||
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: emacs-filesystem
|
||||
%if 0%{?fedora}
|
||||
Requires: xemacs-filesystem
|
||||
%endif
|
||||
# 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
|
||||
|
|
@ -50,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
|
||||
|
|
@ -58,46 +75,213 @@ rpmdev-bumpspec Bump revision in specfile
|
|||
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
%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
|
||||
|
||||
%if 0%{?fedora}
|
||||
for dir in %{_emacs_sitestartdir} %{_xemacs_sitestartdir} ; do
|
||||
%else
|
||||
for dir in %{_emacs_sitestartdir} ; do
|
||||
%endif
|
||||
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
|
||||
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
|
||||
|
||||
%files
|
||||
%doc COPYING NEWS
|
||||
%if 0%{?rhel}
|
||||
cp %{SOURCE1} %{buildroot}%{_datadir}/rpmdevtools/
|
||||
%py_byte_compile %{python3} %{buildroot}%{_datadir}/rpmdevtools/
|
||||
%endif
|
||||
|
||||
|
||||
%files -f %{name}.files
|
||||
%license COPYING
|
||||
%doc NEWS
|
||||
%config(noreplace) %{_sysconfdir}/rpmdevtools/
|
||||
%{_sysconfdir}/bash_completion.d/
|
||||
%{_datadir}/rpmdevtools/
|
||||
%{_bindir}/*
|
||||
%{_emacs_sitestartdir}/rpmdev-init.el
|
||||
%ghost %{_emacs_sitestartdir}/rpmdev-init.elc
|
||||
%if 0%{?fedora}
|
||||
%{_xemacs_sitestartdir}/rpmdev-init.el
|
||||
%ghost %{_xemacs_sitestartdir}/rpmdev-init.elc
|
||||
%endif
|
||||
%{_mandir}/man[18]/*.[18]*
|
||||
|
||||
|
||||
%changelog
|
||||
* 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
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||
|
||||
* Fri Feb 04 2022 Neal Gompa <ngompa@fedoraproject.org> - 9.6-1
|
||||
- Update to 9.6
|
||||
|
||||
* Fri Jan 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 9.5-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||
|
||||
* Tue Nov 9 2021 Jerry James <loganjerry@gmail.com> - 9.5-3
|
||||
- Drop XEmacs support in F36 and later
|
||||
|
||||
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 9.5-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||
|
||||
* Sat Jul 17 2021 Neal Gompa <ngompa@fedoraproject.org> - 9.5-1
|
||||
- Update to 9.5
|
||||
|
||||
* Sat Jul 17 2021 Neal Gompa <ngompa@fedoraproject.org> - 9.4-1
|
||||
- Update to 9.4
|
||||
|
||||
* Mon Feb 15 2021 Miro Hrončok <mhroncok@redhat.com> - 9.3-5
|
||||
- Require any Python version of the Python packages
|
||||
|
||||
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 9.3-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||
|
||||
* Mon Jan 25 2021 Miro Hrončok <mhroncok@redhat.com> - 9.3-3
|
||||
- spectool: Download text as text
|
||||
|
||||
* Fri Jan 22 2021 Michal Domonkos <mdomonko@redhat.com> - 9.3-2
|
||||
- Replace requests-download dependency with requests
|
||||
|
||||
* Wed Jan 20 2021 Neal Gompa <ngompa13@gmail.com> - 9.3-1
|
||||
- Update to 9.3
|
||||
- Force legacy datestamp by default until rhbz#1715412 is resolved
|
||||
|
||||
* Mon Oct 05 2020 Neal Gompa <ngompa13@gmail.com> - 9.2-1
|
||||
- Update to 9.2
|
||||
|
||||
* Thu Aug 20 2020 Neal Gompa <ngompa13@gmail.com> - 9.1-1
|
||||
- Update to 9.1
|
||||
|
||||
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 9.0-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||
|
||||
* Thu Jul 16 2020 Neal Gompa <ngompa13@gmail.com> - 9.0-2
|
||||
- Backport fix for python spec template
|
||||
|
||||
* Tue Jul 14 2020 Neal Gompa <ngompa13@gmail.com> - 9.0-1
|
||||
- Update to 9.0
|
||||
|
||||
* Wed Mar 25 2020 Jitka Plesnikova <jplesnik@redhat.com> - 8.10-11
|
||||
- Add perl dependencies needed for build
|
||||
|
||||
* Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 8.10-10
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||
|
||||
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 8.10-9
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||
|
||||
* Sat Feb 02 2019 Fedora Release Engineering <releng@fedoraproject.org> - 8.10-8
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
|
||||
|
||||
* Wed Nov 28 2018 Neal Gompa <ngompa13@gmail.com> - 8.10-7
|
||||
- Fix regex substitution issues with Python 3.7 (rhbz#1651954)
|
||||
|
||||
* Sun Sep 16 2018 Neal Gompa <ngompa13@gmail.com> - 8.10-6
|
||||
- Fix regex related deprecation warnings (rhbz#1598089)
|
||||
|
||||
* Sat Jul 14 2018 Fedora Release Engineering <releng@fedoraproject.org> - 8.10-5
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
|
||||
|
||||
* Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 8.10-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
|
||||
|
||||
* Thu Jul 27 2017 Fedora Release Engineering <releng@fedoraproject.org> - 8.10-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
|
||||
|
||||
* Sat Feb 11 2017 Fedora Release Engineering <releng@fedoraproject.org> - 8.10-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
|
||||
|
||||
* Sat Jan 14 2017 Ville Skyttä <ville.skytta@iki.fi> - 8.10-1
|
||||
- Update to 8.10
|
||||
|
||||
* Mon Dec 19 2016 Miro Hrončok <mhroncok@redhat.com> - 8.9-2
|
||||
- Rebuild for Python 3.6
|
||||
|
||||
* Sat Jun 25 2016 Ville Skyttä <ville.skytta@iki.fi> - 8.9-1
|
||||
- Update to 8.9
|
||||
|
||||
* Sat Jun 25 2016 Ville Skyttä <ville.skytta@iki.fi> - 8.8-1
|
||||
- Update to 8.8
|
||||
|
||||
* Fri Jun 24 2016 Petr Písař <ppisar@redhat.com>
|
||||
- Add new mandatory perl build deps
|
||||
|
||||
* Thu Jun 23 2016 Ville Skyttä <ville.skytta@iki.fi> - 8.7-1
|
||||
- Update to 8.7
|
||||
- Specfile cleanups
|
||||
|
||||
* Thu Feb 04 2016 Fedora Release Engineering <releng@fedoraproject.org> - 8.6-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
|
||||
|
||||
* Fri Jun 5 2015 Ville Skyttä <ville.skytta@iki.fi> - 8.6-2
|
||||
- Use python3 on > F-22
|
||||
|
||||
* Sun May 10 2015 Ville Skyttä <ville.skytta@iki.fi> - 8.6-1
|
||||
- Update to 8.6
|
||||
|
||||
* Mon Oct 20 2014 Ville Skyttä <ville.skytta@iki.fi> - 8.5-1
|
||||
- Update to 8.5
|
||||
- Mark COPYING as %%license where applicable
|
||||
|
||||
* Sun Jun 08 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 8.4-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
|
||||
|
||||
* Thu Oct 17 2013 Ville Skyttä <ville.skytta@iki.fi> - 8.4-2
|
||||
- Do not require devscripts in any scenario.
|
||||
|
||||
|
|
|
|||
2
sources
2
sources
|
|
@ -1 +1 @@
|
|||
9d1d3cc2f1108918be4766143162389a rpmdevtools-8.4.tar.xz
|
||||
SHA512 (rpmdevtools-9.6.tar.xz) = 691fec8944029dbe60cb3eab0200d1201f5aa3dd11cd49e8313ee7c1fe998237217ea9c5ae7b4a70f61f3c998093f23d26266b23f41607ddca3148d5f6b6ae06
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue