diff --git a/.fmf/version b/.fmf/version deleted file mode 100644 index d00491f..0000000 --- a/.fmf/version +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/.gitignore b/.gitignore index 58dd8ea..ced5e17 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,3 @@ /pyparted-3.11.7.tar.gz.asc /pyparted-3.12.0.tar.gz /pyparted-3.12.0.tar.gz.asc -/pyparted-3.13.0.tar.gz -/pyparted-3.13.0.tar.gz.asc diff --git a/plans/run-tests.fmf b/plans/run-tests.fmf deleted file mode 100644 index cf8a582..0000000 --- a/plans/run-tests.fmf +++ /dev/null @@ -1,9 +0,0 @@ -summary: Run pyparted tests -prepare: - how: install - package: - - python3-pyparted -execute: - script: | - fallocate -l 1G $PWD/disk.img - ./tests/scripts/pyparted-tests $PWD/disk.img diff --git a/pyparted-3.12.0-gpt-disktype-test.patch b/pyparted-3.12.0-gpt-disktype-test.patch new file mode 100644 index 0000000..5f27612 --- /dev/null +++ b/pyparted-3.12.0-gpt-disktype-test.patch @@ -0,0 +1,12 @@ +diff -up pyparted-3.12.0/tests/test__ped_disktype.py.orig pyparted-3.12.0/tests/test__ped_disktype.py +--- pyparted-3.12.0/tests/test__ped_disktype.py.orig 2023-03-02 09:08:37.322713489 -0500 ++++ pyparted-3.12.0/tests/test__ped_disktype.py 2023-03-02 09:10:06.248488694 -0500 +@@ -96,7 +96,7 @@ class DiskTypeStrTestCase(RequiresDiskTy + self.assertEqual(str(self.disktype['amiga']), '_ped.DiskType instance --\n name: amiga features: 2') + + if hasattr(_ped, "DISK_TYPE_PARTITION_TYPE_UUID"): +- self.assertEqual(str(self.disktype['gpt']), '_ped.DiskType instance --\n name: gpt features: 10') ++ self.assertEqual(str(self.disktype['gpt']), '_ped.DiskType instance --\n name: gpt features: 58') + else: + self.assertEqual(str(self.disktype['gpt']), '_ped.DiskType instance --\n name: gpt features: 2') + diff --git a/pyparted-3.12.0-partition-types.patch b/pyparted-3.12.0-partition-types.patch new file mode 100644 index 0000000..075c18e --- /dev/null +++ b/pyparted-3.12.0-partition-types.patch @@ -0,0 +1,85 @@ +diff -up pyparted-3.12.0/src/parted/__init__.py.orig pyparted-3.12.0/src/parted/__init__.py +--- pyparted-3.12.0/src/parted/__init__.py.orig 2022-03-07 12:38:56.000000000 -0500 ++++ pyparted-3.12.0/src/parted/__init__.py 2022-06-21 15:05:10.318939409 -0400 +@@ -217,6 +217,14 @@ from _ped import DISK_GPT_PMBR_BOOT + from _ped import DISK_TYPE_EXTENDED + from _ped import DISK_TYPE_PARTITION_NAME + ++if hasattr(_ped, 'DISK_TYPE_PARTITION_TYPE_ID'): ++ # pylint: disable=E0611 ++ from _ped import DISK_TYPE_PARTITION_TYPE_ID ++ ++if hasattr(_ped, 'DISK_TYPE_PARTITION_TYPE_UUID'): ++ # pylint: disable=E0611 ++ from _ped import DISK_TYPE_PARTITION_TYPE_UUID ++ + from _ped import EXCEPTION_TYPE_INFORMATION + from _ped import EXCEPTION_TYPE_WARNING + from _ped import EXCEPTION_TYPE_ERROR +diff -up pyparted-3.12.0/src/_pedmodule.c.orig pyparted-3.12.0/src/_pedmodule.c +--- pyparted-3.12.0/src/_pedmodule.c.orig 2022-03-07 12:49:11.000000000 -0500 ++++ pyparted-3.12.0/src/_pedmodule.c 2022-06-21 15:04:57.863977820 -0400 +@@ -685,6 +685,14 @@ MOD_INIT(_ped) { + PyModule_AddIntConstant(m, "DISK_TYPE_EXTENDED", PED_DISK_TYPE_EXTENDED); + PyModule_AddIntConstant(m, "DISK_TYPE_PARTITION_NAME", PED_DISK_TYPE_PARTITION_NAME); + ++#if PED_DISK_TYPE_LAST_FEATURE > 2 ++ PyModule_AddIntConstant(m, "DISK_TYPE_PARTITION_TYPE_ID", PED_DISK_TYPE_PARTITION_TYPE_ID); ++#endif ++ ++#if PED_DISK_TYPE_LAST_FEATURE > 4 ++ PyModule_AddIntConstant(m, "DISK_TYPE_PARTITION_TYPE_UUID", PED_DISK_TYPE_PARTITION_TYPE_UUID); ++#endif ++ + /* add PedFileSystemType as _ped.FileSystemType */ + if (PyType_Ready(&_ped_FileSystemType_Type_obj) < 0) + return MOD_ERROR_VAL; +diff -up pyparted-3.12.0/tests/test__ped_disktype.py.orig pyparted-3.12.0/tests/test__ped_disktype.py +--- pyparted-3.12.0/tests/test__ped_disktype.py.orig 2018-01-12 13:31:40.000000000 -0500 ++++ pyparted-3.12.0/tests/test__ped_disktype.py 2022-06-21 15:04:57.863977820 -0400 +@@ -63,11 +63,22 @@ class DiskTypeCheckFeatureTestCase(Requi + self.assertTrue(self.disktype[name].check_feature(_ped.DISK_TYPE_EXTENDED)) + self.assertFalse(self.disktype[name].check_feature(_ped.DISK_TYPE_PARTITION_NAME)) + ++ if hasattr(_ped, "DISK_TYPE_PARTITION_TYPE_ID"): ++ self.assertTrue(self.disktype[name].check_feature(_ped.DISK_TYPE_PARTITION_TYPE_ID)) ++ ++ if hasattr(_ped, "DISK_TYPE_PARTITION_TYPE_UUID"): ++ self.assertFalse(self.disktype[name].check_feature(_ped.DISK_TYPE_PARTITION_TYPE_UUID)) ++ + # The following types support DISK_TYPE_PARTITION_NAME + for name in ['amiga', 'gpt', 'mac', 'pc98']: + self.assertFalse(self.disktype[name].check_feature(_ped.DISK_TYPE_EXTENDED)) + self.assertTrue(self.disktype[name].check_feature(_ped.DISK_TYPE_PARTITION_NAME)) + ++ # The following types support DISK_TYPE_PARTITION_TYPE_UUID ++ for name in ['gpt']: ++ if hasattr(_ped, "DISK_TYPE_PARTITION_TYPE_UUID"): ++ self.assertTrue(self.disktype[name].check_feature(_ped.DISK_TYPE_PARTITION_TYPE_UUID)) ++ + # The following types support all features + for name in ['dvh']: + self.assertTrue(self.disktype[name].check_feature(_ped.DISK_TYPE_EXTENDED)) +@@ -75,11 +86,20 @@ class DiskTypeCheckFeatureTestCase(Requi + + class DiskTypeStrTestCase(RequiresDiskTypes): + def runTest(self): +- self.assertEqual(str(self.disktype['msdos']), '_ped.DiskType instance --\n name: msdos features: 1') ++ if hasattr(_ped, "DISK_TYPE_PARTITION_TYPE_ID"): ++ self.assertEqual(str(self.disktype['msdos']), '_ped.DiskType instance --\n name: msdos features: 5') ++ else: ++ self.assertEqual(str(self.disktype['msdos']), '_ped.DiskType instance --\n name: msdos features: 1') ++ + self.assertEqual(str(self.disktype['aix']), '_ped.DiskType instance --\n name: aix features: 0') + self.assertEqual(str(self.disktype['sun']), '_ped.DiskType instance --\n name: sun features: 0') + self.assertEqual(str(self.disktype['amiga']), '_ped.DiskType instance --\n name: amiga features: 2') +- self.assertEqual(str(self.disktype['gpt']), '_ped.DiskType instance --\n name: gpt features: 2') ++ ++ if hasattr(_ped, "DISK_TYPE_PARTITION_TYPE_UUID"): ++ self.assertEqual(str(self.disktype['gpt']), '_ped.DiskType instance --\n name: gpt features: 10') ++ else: ++ self.assertEqual(str(self.disktype['gpt']), '_ped.DiskType instance --\n name: gpt features: 2') ++ + self.assertEqual(str(self.disktype['mac']), '_ped.DiskType instance --\n name: mac features: 2') + self.assertEqual(str(self.disktype['bsd']), '_ped.DiskType instance --\n name: bsd features: 0') + self.assertEqual(str(self.disktype['pc98']), '_ped.DiskType instance --\n name: pc98 features: 2') diff --git a/pyparted.spec b/pyparted.spec index ad79d71..63d57e3 100644 --- a/pyparted.spec +++ b/pyparted.spec @@ -1,119 +1,164 @@ -Summary: Python module for GNU parted -Name: pyparted -Epoch: 1 -Version: 3.13.0 -Release: 17%{?dist} -License: GPL-2.0-or-later -URL: https://github.com/dcantrell/pyparted +%if 0%{?rhel} +%if %{rhel} <= 7 +# disable python3 by default +%bcond_with python3 +%else +%bcond_without python3 +%endif -Source0: https://github.com/dcantrell/pyparted/releases/download/v%{version}/%{name}-%{version}.tar.gz -Source1: https://github.com/dcantrell/pyparted/releases/download/v%{version}/%{name}-%{version}.tar.gz.asc -Source2: keyring.gpg -Source3: trustdb.gpg +%if %{rhel} > 7 +# disable python2 by default +%bcond_with python2 +%else +%bcond_without python2 +%endif +%endif + +%if 0%{?fedora} +%if %{fedora} < 23 +# disable python3 by default +%bcond_with python3 +%else +%bcond_without python3 +%endif + +%if %{fedora} > 31 +# disable python2 by default +%bcond_with python2 +%else +%bcond_without python2 +%endif +%endif + +Summary: Python module for GNU parted +Name: pyparted +Epoch: 1 +Version: 3.12.0 +Release: 8%{?dist} +License: GPL-2.0-or-later +URL: https://github.com/dcantrell/pyparted + +Source0: https://github.com/dcantrell/pyparted/releases/download/v%{version}/%{name}-%{version}.tar.gz +Source1: https://github.com/dcantrell/pyparted/releases/download/v%{version}/%{name}-%{version}.tar.gz.asc +Source2: keyring.gpg +Source3: trustdb.gpg + +# Support new disk type features from parted 3.5: +# https://bugzilla.redhat.com/show_bug.cgi?id=2098792 +# https://github.com/dcantrell/pyparted/issues/91 +Patch0: pyparted-3.12.0-partition-types.patch + +Patch1: pyparted-3.12.0-gpt-disktype-test.patch BuildRequires: make BuildRequires: gcc -BuildRequires: parted-devel >= 3.4 +BuildRequires: parted-devel >= 3.3 BuildRequires: pkgconfig BuildRequires: e2fsprogs BuildRequires: gnupg2 -BuildRequires: python3-devel -BuildRequires: python3-setuptools -%description -Python module for the parted library. It is used for manipulating +%if %{with python3} +BuildRequires: python3-devel +BuildRequires: python3-six +BuildRequires: python3-setuptools +%endif + +%if %{with python2} +BuildRequires: python2-devel +BuildRequires: python2-six +%endif + +%global _description\ +Python module for the parted library. It is used for manipulating\ partition tables. +%description %_description + +%if %{with python2} +%package -n python2-pyparted +Summary: %summary +%{?python_provide:%python_provide python2-pyparted} +# Remove before F30 +Provides: pyparted = %{epoch}:%{version}-%{release} +Provides: pyparted%{?_isa} = %{epoch}:%{version}-%{release} +Obsoletes: pyparted < %{epoch}:%{version}-%{release} + +%description -n python2-pyparted %_description +%endif + +%if %{with python3} %package -n python3-pyparted Summary: Python 3 module for GNU parted %description -n python3-pyparted Python module for the parted library. It is used for manipulating partition tables. This package provides Python 3 bindings for parted. +%endif %prep # Verify source archive signature gpg --no-default-keyring --keyring %{SOURCE2} --trustdb-name %{SOURCE3} --verify %{SOURCE1} %{SOURCE0} || exit 1 -%autosetup +%setup -q +%patch0 -p1 +%patch1 -p1 + +%if %{with python3} +everything=$(ls) +mkdir -p py3dir +cp -a $everything py3dir +%endif %build -%make_build CFLAGS="%{optflags} -fcommon" +%if %{with python2} +PYTHON=python2 %make_build CFLAGS="%{optflags} -fcommon" +%endif + +%if %{with python3} +pushd py3dir +PYTHON=python3 %make_build CFLAGS="%{optflags} -fcommon" +popd +%endif %check -make test +%if %{with python2} +PYTHON=python2 make test +%endif + +%if %{with python3} +pushd py3dir +PYTHON=python3 make test +popd +%endif %install -%make_install +%if %{with python2} +PYTHON=python2 %make_install +%endif +%if %{with python3} +pushd py3dir +PYTHON=python3 %make_install +popd +%endif + +%if %{with python2} +%files -n python2-pyparted +%doc AUTHORS COPYING NEWS README TODO +%{python2_sitearch}/_ped.so +%{python2_sitearch}/parted +%{python2_sitearch}/%{name}-%{version}-*.egg-info +%endif + +%if %{with python3} %files -n python3-pyparted -%doc AUTHORS HACKING NEWS README.md RELEASE TODO -%license LICENSE +%doc AUTHORS COPYING NEWS README TODO %{python3_sitearch}/_ped.*.so %{python3_sitearch}/parted %{python3_sitearch}/%{name}-%{version}-*.egg-info +%endif %changelog -* Wed Jul 22 2026 Python Maint - 1:3.13.0-17 -- Rebuilt for Python 3.15.0b4 ABI change - -* Thu Jul 16 2026 Fedora Release Engineering - 1:3.13.0-16 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild - -* Wed Jun 03 2026 Python Maint - 1:3.13.0-15 -- Rebuilt for Python 3.15 - -* Sat Jan 17 2026 Fedora Release Engineering - 1:3.13.0-14 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild - -* Fri Sep 19 2025 Python Maint - 1:3.13.0-13 -- Rebuilt for Python 3.14.0rc3 bytecode - -* Fri Aug 15 2025 Python Maint - 1:3.13.0-12 -- Rebuilt for Python 3.14.0rc2 bytecode - -* Fri Jul 25 2025 Fedora Release Engineering - 1:3.13.0-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Sun Jun 15 2025 Yaakov Selkowitz - 1:3.13.0-10 -- Drop unused six dependency - -* Mon Jun 02 2025 Python Maint - 1:3.13.0-9 -- Rebuilt for Python 3.14 - -* Sat Jan 18 2025 Fedora Release Engineering - 1:3.13.0-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Fri Jul 19 2024 Fedora Release Engineering - 1:3.13.0-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Fri Jun 07 2024 Python Maint - 1:3.13.0-6 -- Rebuilt for Python 3.13 - -* Fri Jan 26 2024 Fedora Release Engineering - 1:3.13.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Sun Jan 21 2024 Fedora Release Engineering - 1:3.13.0-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Fri Jul 21 2023 Fedora Release Engineering - 1:3.13.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Thu Jun 22 2023 Python Maint - 1:3.13.0-2 -- Rebuilt for Python 3.12 - -* Wed Jun 21 2023 David Cantrell - 1:3.13.0-1 -- Upgrade to pyparted-3.13.0 - -* Thu Jun 15 2023 Python Maint - 1:3.12.0-11 -- Rebuilt for Python 3.12 - -* Wed Jun 14 2023 David Cantrell - 1:3.12.0-10 -- Use non-deprecated syntax for the %%patch macros - -* Tue Jun 13 2023 Python Maint - 1:3.12.0-9 -- Rebuilt for Python 3.12 - * Thu Mar 02 2023 David Cantrell - 1:3.12.0-8 - Fix FTBFS with _ped.disktype test case for gpt (#2171656) - Update License tag to SPDX expression diff --git a/sources b/sources index 39be172..7f89792 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -SHA512 (pyparted-3.13.0.tar.gz) = a9162afdbee48de5474de98ae8c08df028d485e122fcafae8421dddd47c9ed00d8dd9f40d854b14d4582483d8ea3469128a912491371385e4f18a0dbbbafbfd5 -SHA512 (pyparted-3.13.0.tar.gz.asc) = 6f3e973b52584450c3eed97d64266df832d8820a6a72f731fbb9fbd9be06f93f2d53b47bcae01b78a831e3e3cedca3ae8629dc5f9fe35dcc3ed11226a11fd952 +SHA512 (pyparted-3.12.0.tar.gz) = 0179e5334be8c04287b10b47d407ad339933cd3e20514d2142fe968acf8a36c40e541ee5165e2b3699a40b133d8f1948d8d12ccf307d3a1736090fb33f28b7e7 +SHA512 (pyparted-3.12.0.tar.gz.asc) = 452d386fbc8b84fa0dc186bb75c6c12eb051c8a37575e5a3a0cf504d13c4b2a0134d7e486928f9af7d142d25802bda05c97fd95ff80721ae6f6c0abedb8b1614 diff --git a/tests/scripts/pyparted-tests b/tests/scripts/pyparted-tests deleted file mode 100755 index 8edcca1..0000000 --- a/tests/scripts/pyparted-tests +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/python3 - -import parted -import sys - - -def init_disk(disk_img): - # Make a disklabel (failures here will raise an error) - dev = parted.getDevice(disk_img) - disk = parted.freshDisk(dev, "gpt") - - # Make a partition - geom = parted.Geometry(device=dev, - start=2048, - end=50*2048) - fs = parted.FileSystem(type="ext4", geometry=geom) - part = parted.Partition(disk=disk, - type=parted.PARTITION_NORMAL, - fs=fs, - geometry=geom) - disk.addPartition(partition=part, - constraint=dev.optimalAlignedConstraint) - part.setFlag(parted.PARTITION_BOOT) - disk.commit() - -def read_disk(disk_img): - # Read the disk and check the partitions - dev = parted.getDevice(disk_img) - disk = parted.newDisk(dev) - - if dev.length == 0: - print("ERROR: Disk has no length", file=sys.stderr) - sys.exit(1) - - if len(disk.partitions) != 1: - print("ERROR: Wrong number of partitions", file=sys.stderr) - sys.exit(1) - - part = disk.partitions[0] - if part.geometry.end != 50*2048: - print("ERROR: Partition is wrong length", file=sys.stderr) - sys.exit(1) - - if part.geometry.start != 2048: - print("ERROR: Parition doesn't start at sector 2048", file=sys.stderr) - sys.exit(1) - - -def remove_partition(disk_img): - # Remove partition and check disk - dev = parted.getDevice(disk_img) - disk = parted.newDisk(dev) - - if len(disk.partitions) != 1: - print("ERROR: Wrong number of partitions", file=sys.stderr) - sys.exit(1) - - disk.removePartition(partition=disk.partitions[0]) - disk.commit() - - dev = parted.getDevice(disk_img) - disk = parted.newDisk(dev) - - if len(disk.partitions) != 0: - print("ERROR: Failed to delete partition", file=sys.stderr) - sys.exit(1) - - -def main(disk_img): - print(f"Running tests on {disk_img}") - - try: - init_disk(disk_img) - read_disk(disk_img) - remove_partition(disk_img) - except Exception as e: - print(f"ERROR: {str(e)}", file=sys.stderr) - sys.exit(1) - - print("PASS", file=sys.stderr) - sys.exit(0) - -if __name__ == '__main__': - if len(sys.argv) < 2: - print("Usage: %s " % sys.argv[0], file=sys.stderr) - sys.exit(1) - - main(sys.argv[1]) diff --git a/tests/scripts/run_tests.sh b/tests/scripts/run_tests.sh new file mode 100755 index 0000000..21804db --- /dev/null +++ b/tests/scripts/run_tests.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +PATH=/usr/bin +TMPDIR="$(mktemp -d)" +CWD="$(pwd)" + +PACKAGE=pyparted +BRANCH= + +# clone the dist-git tree for this package +cd ${TMPDIR} +fedpkg co ${PACKAGE} +cd ${PACKAGE} +[ -z "${BRANCH}" ] || fedpkg switch-branch ${BRANCH} +fedpkg prep + +# scramble together the extracted source tree name +SRCDIR="${PACKAGE}-$(grep Version: ${PACKAGE}.spec | cut -d ' ' -f 2)" + +# run the tests +cd ${SRCDIR} +#make check # this runs pylint, which is sometimes wrong/noisy +make test +RET=$? + +# clean up and exit +cd ${CWD} +rm -rf ${TMPDIR} +exit ${RET} diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..171d4d0 --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,15 @@ +--- + +- hosts: localhost + roles: + - role: standard-test-basic + tags: + - classic + + required_packages: + - fedpkg + + tests: + - simple: + dir: scripts/ + run: ./run_tests.sh