Sync from SUSE:ALP:Source:Standard:1.0 SL-Micro-6.0-versioned-1726752130 revision b3eb27db2bc4d3aa2a5e211bbce3b1e9
This commit is contained in:
commit
94c33933ba
23
.gitattributes
vendored
Normal file
23
.gitattributes
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
## Default LFS
|
||||
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||
*.bsp filter=lfs diff=lfs merge=lfs -text
|
||||
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.gem filter=lfs diff=lfs merge=lfs -text
|
||||
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.jar filter=lfs diff=lfs merge=lfs -text
|
||||
*.lz filter=lfs diff=lfs merge=lfs -text
|
||||
*.lzma filter=lfs diff=lfs merge=lfs -text
|
||||
*.obscpio filter=lfs diff=lfs merge=lfs -text
|
||||
*.oxt filter=lfs diff=lfs merge=lfs -text
|
||||
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||
*.png filter=lfs diff=lfs merge=lfs -text
|
||||
*.rpm filter=lfs diff=lfs merge=lfs -text
|
||||
*.tbz filter=lfs diff=lfs merge=lfs -text
|
||||
*.tbz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||
*.ttf filter=lfs diff=lfs merge=lfs -text
|
||||
*.txz filter=lfs diff=lfs merge=lfs -text
|
||||
*.whl filter=lfs diff=lfs merge=lfs -text
|
||||
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||
*.zst filter=lfs diff=lfs merge=lfs -text
|
33
README.md
Normal file
33
README.md
Normal file
@ -0,0 +1,33 @@
|
||||
#
|
||||
# snapshot repository emulator
|
||||
#
|
||||
|
||||
This is generating a package with the goal to enforce defined
|
||||
versions of a package based on a given updateinfo.xml file.
|
||||
|
||||
Goals:
|
||||
* Do not enforce the installation of a package
|
||||
* But when installed, it must be a certain version
|
||||
|
||||
This is currently implemented via conflicts due to unknown
|
||||
reasons.
|
||||
|
||||
Shouldn't these be conditional requires instead?
|
||||
eg.:
|
||||
|
||||
Requires: abcd-1.2.3 if abcd
|
||||
|
||||
?
|
||||
|
||||
###################
|
||||
##### WARNING #####
|
||||
###################
|
||||
|
||||
Do *NOT* use this package for any image or container. You
|
||||
won't be able to build it or only for a very short time frame.
|
||||
|
||||
###################
|
||||
##### WARNING #####
|
||||
###################
|
||||
|
||||
|
7
SL-Micro-6.0-versioned-1726752130.changes
Normal file
7
SL-Micro-6.0-versioned-1726752130.changes
Normal file
@ -0,0 +1,7 @@
|
||||
-------------------------------------------------------------------
|
||||
Tue Oct 8 09:37:51 UTC 2024 - Adrian Schröter <adrian@suse.de>
|
||||
|
||||
- initial demo package jsc#SMO-333
|
||||
- python code is from Jiri, just added argument handling and
|
||||
made it executable for python3
|
||||
|
80
SL-Micro-6.0-versioned-1726752130.spec
Normal file
80
SL-Micro-6.0-versioned-1726752130.spec
Normal file
@ -0,0 +1,80 @@
|
||||
#
|
||||
# spec file for package meta-package
|
||||
#
|
||||
# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
# upon. The license for this file, and modifications and additions to the
|
||||
# file, is the same license as for the pristine package itself (unless the
|
||||
# license for the pristine package is not an Open Source License, in which
|
||||
# case the license is the MIT License). An "Open Source License" is a
|
||||
# license that conforms to the Open Source Definition (Version 1.9)
|
||||
# published by the Open Source Initiative.
|
||||
|
||||
# Please submit bugfixes or comments via http://bugs.opensuse.org/
|
||||
#
|
||||
|
||||
# The package name needs to include the version to avoid automatic updates
|
||||
%define snapshot_version 1726752130
|
||||
Name: SL-Micro-6.0-versioned-%snapshot_version
|
||||
Version: %snapshot_version
|
||||
Release: 0
|
||||
Summary: Repository snapshot enforcement
|
||||
License: GPLv2
|
||||
Source1: generate_requires.py
|
||||
Source2: README.md
|
||||
Source3: aarch64.updateinfo.xml
|
||||
Source4: s390x.updateinfo.xml
|
||||
Source5: x86_64.updateinfo.xml
|
||||
# old, not used
|
||||
Source100: generate_conflicts.py
|
||||
# just for source rpm check
|
||||
Source101: update.sh
|
||||
BuildRequires: python311
|
||||
|
||||
# generate_requires.py updateinfo.xml [not_newer_than_in_unixtime]
|
||||
%ifarch aarch64
|
||||
%( python3.11 %{S:1} %{S:3} )
|
||||
%endif
|
||||
%ifarch s390x
|
||||
%( python3.11 %{S:1} %{S:4} )
|
||||
%endif
|
||||
%ifarch x86_64
|
||||
%( python3.11 %{S:1} %{S:5} )
|
||||
%endif
|
||||
|
||||
%description
|
||||
#
|
||||
# snapshot repository emulator
|
||||
#
|
||||
|
||||
This is generating a package with the goal to enforce defined
|
||||
versions of a package based on a given updateinfo.xml file.
|
||||
|
||||
Goals:
|
||||
* Do not enforce the installation of a package
|
||||
* But when installed, it must be a certain version
|
||||
* Additional packages are still possible
|
||||
|
||||
###################
|
||||
##### WARNING #####
|
||||
###################
|
||||
|
||||
Do *NOT* use this package for any image or container. You
|
||||
won't be able to build it or only for a very short time frame.
|
||||
|
||||
###################
|
||||
##### WARNING #####
|
||||
###################
|
||||
|
||||
%prep
|
||||
%setup -c -T
|
||||
cp %{SOURCE2} .
|
||||
|
||||
%install
|
||||
|
||||
%files
|
||||
%doc README.md
|
||||
|
||||
%changelog
|
16008
aarch64.updateinfo.xml
Normal file
16008
aarch64.updateinfo.xml
Normal file
File diff suppressed because it is too large
Load Diff
71
generate_conflicts.py
Normal file
71
generate_conflicts.py
Normal file
@ -0,0 +1,71 @@
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("ERRIR: Require at least the updateinfo.xml file name")
|
||||
sys.exit(1)
|
||||
|
||||
filename = sys.argv[1]
|
||||
timestamp = None
|
||||
if len(sys.argv) > 2:
|
||||
timestamp = sys.argv[2]
|
||||
|
||||
tree = ET.parse(filename)
|
||||
root = tree.getroot()
|
||||
|
||||
package_versions = {}
|
||||
package_versions_skip = []
|
||||
|
||||
for update in root:
|
||||
patch_id = update.find("id").text
|
||||
issued_date = int(update.find('issued').attrib['date'])
|
||||
pkglist = update.find("pkglist").find("collection")
|
||||
# updates which are newer than the time stamp should be blocked (conflict of the released version)
|
||||
# if there were more patches with it, it applies to all of them
|
||||
if timestamp is None or issued_date > timestamp:
|
||||
for package in pkglist:
|
||||
name = package.attrib['name']
|
||||
version = package.attrib['version']
|
||||
release = package.attrib['release']
|
||||
package_versions_skip.append({
|
||||
"name" : name,
|
||||
"version" : version,
|
||||
"release" : release,
|
||||
})
|
||||
continue
|
||||
for package in pkglist:
|
||||
name = package.attrib['name']
|
||||
version = package.attrib['version']
|
||||
release = package.attrib['release']
|
||||
|
||||
# if there is a newer patch already known, ignore the old one
|
||||
if name in package_versions:
|
||||
if issued_date < package_versions[name]["issued"]:
|
||||
print("Older patch, skipping ", name, file=sys.stderr)
|
||||
continue
|
||||
|
||||
package_versions[name] = {
|
||||
"version" : version,
|
||||
"release" : release,
|
||||
"issued" : issued_date
|
||||
}
|
||||
|
||||
# list of conflict statements for the .spec-file
|
||||
conflicts = []
|
||||
|
||||
for package in package_versions.keys():
|
||||
older = "Conflicts: {0} < {1}-{2}".format(package, package_versions[package]["version"], package_versions[package]["release"])
|
||||
newer = "Conflicts: {0} > {1}-{2}".format(package, package_versions[package]["version"], package_versions[package]["release"])
|
||||
conflicts.append(older)
|
||||
conflicts.append(newer)
|
||||
for package in package_versions_skip:
|
||||
# if specific version is enforced, no need to additionally conflict newer releases
|
||||
if package["name"] in package_versions:
|
||||
continue
|
||||
conflict = "Conflicts: {0} = {1}-{2}".format(package["name"], package["version"], package["release"])
|
||||
conflicts.append(conflict)
|
||||
conflicts = list(dict.fromkeys(conflicts))
|
||||
conflicts.sort()
|
||||
for conflict in conflicts:
|
||||
print(conflict)
|
||||
|
55
generate_requires.py
Normal file
55
generate_requires.py
Normal file
@ -0,0 +1,55 @@
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("ERRIR: Require at least the updateinfo.xml file name")
|
||||
sys.exit(1)
|
||||
|
||||
filename = sys.argv[1]
|
||||
timestamp = None
|
||||
if len(sys.argv) > 2:
|
||||
timestamp = sys.argv[2]
|
||||
|
||||
tree = ET.parse(filename)
|
||||
root = tree.getroot()
|
||||
|
||||
package_versions = {}
|
||||
package_versions_skip = []
|
||||
|
||||
for update in root:
|
||||
patch_id = update.find("id").text
|
||||
issued_date = int(update.find('issued').attrib['date'])
|
||||
pkglist = update.find("pkglist").find("collection")
|
||||
# updates which are newer than the time stamp should be blocked (conflict of the released version)
|
||||
# if there were more patches with it, it applies to all of them
|
||||
if not timestamp is None and issued_date > timestamp:
|
||||
continue
|
||||
for package in pkglist:
|
||||
name = package.attrib['name']
|
||||
version = package.attrib['version']
|
||||
release = package.attrib['release']
|
||||
|
||||
# if there is a newer patch already known, ignore the old one
|
||||
if name in package_versions:
|
||||
if issued_date < package_versions[name]["issued"]:
|
||||
print("Older patch, skipping ", name, file=sys.stderr)
|
||||
continue
|
||||
|
||||
package_versions[name] = {
|
||||
"version" : version,
|
||||
"release" : release,
|
||||
"issued" : issued_date
|
||||
}
|
||||
|
||||
# list of require statements for the .spec-file
|
||||
lines = []
|
||||
|
||||
for package in package_versions.keys():
|
||||
requires = "Requires: ({0} = {1}-{2} if {0})".format(package, package_versions[package]["version"], package_versions[package]["release"])
|
||||
lines.append(requires)
|
||||
|
||||
lines = list(dict.fromkeys(lines))
|
||||
lines.sort()
|
||||
for line in lines:
|
||||
print(line)
|
||||
|
15849
s390x.updateinfo.xml
Normal file
15849
s390x.updateinfo.xml
Normal file
File diff suppressed because it is too large
Load Diff
12
update.sh
Normal file
12
update.sh
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
base_url="https://download.suse.de/ibs/SUSE/Products/SL-Micro/6.0"
|
||||
|
||||
for arch in x86_64 aarch64 s390x; do
|
||||
updateinfo=`curl -L -s -o - $base_url/$arch/product/repodata/repomd.xml | sed -n 's,.* href="repodata/\(.*-updateinfo.xml.zst\)".*,\1,p'`
|
||||
curl -L -s -o - $base_url/$arch/product/repodata/$updateinfo | zstdcat - > $arch.updateinfo.xml
|
||||
done
|
||||
|
||||
version=`sed -n 's,.*issued date="\([^"]*\)".*,\1,p' x86_64.updateinfo.xml | sort | tail -n 1`
|
||||
|
||||
sed -i "s,^%define snapshot_version.*,%define snapshot_version $version," *.spec
|
||||
|
16168
x86_64.updateinfo.xml
Normal file
16168
x86_64.updateinfo.xml
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user