Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python310 for openSUSE:Factory checked in at 2026-04-19 14:20:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python310 (Old) and /work/SRC/openSUSE:Factory/.python310.new.11940 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python310" Sun Apr 19 14:20:56 2026 rev:76 rq:1347983 version:3.10.20 Changes: -------- --- /work/SRC/openSUSE:Factory/python310/python310.changes 2026-04-09 16:21:57.935658061 +0200 +++ /work/SRC/openSUSE:Factory/.python310.new.11940/python310.changes 2026-04-19 14:21:22.186108232 +0200 @@ -1,0 +2,15 @@ +Wed Apr 15 18:00:50 UTC 2026 - Matej Cepl <[email protected]> + +- Add CVE-2026-3446-base64-padding.patch preventing ignoring + excess Base64 data after the first padded quad (bsc#1261970, + CVE-2026-3446, gh#python/cpython#145264). + +------------------------------------------------------------------- +Wed Apr 8 16:12:36 CEST 2026 - Matej Cepl <[email protected]> + +- Rewrite structure of Python interpreter packages. + `python3*` symbols should be now provided by real python3 + packages and its subpackages instead of the virtual provides + (bsc#1258364). + +------------------------------------------------------------------- New: ---- CVE-2026-3446-base64-padding.patch ----------(New B)---------- New: - Add CVE-2026-3446-base64-padding.patch preventing ignoring excess Base64 data after the first padded quad (bsc#1261970, ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python310.spec ++++++ --- /var/tmp/diff_new_pack.hpiQZJ/_old 2026-04-19 14:21:23.446159469 +0200 +++ /var/tmp/diff_new_pack.hpiQZJ/_new 2026-04-19 14:21:23.450159631 +0200 @@ -230,6 +230,9 @@ # PATCH-FIX-UPSTREAM CVE-2026-3479-pkgutil_get_data.patch bsc#1259989 [email protected] # pkgutil.get_data() reject invalid resource arguments Patch46: CVE-2026-3479-pkgutil_get_data.patch +# PATCH-FIX-UPSTREAM CVE-2026-3446-base64-padding.patch bsc#1261970 [email protected] +# Do not ignore excess Base64 data after the first padded quad +Patch47: CVE-2026-3446-base64-padding.patch ### END OF PATCHES BuildRequires: autoconf-archive BuildRequires: automake @@ -246,8 +249,10 @@ BuildRequires: pkgconfig(uuid) BuildRequires: pkgconfig(zlib) #!BuildIgnore: gdk-pixbuf-loader-rsvg -%if 0%{?suse_version} >= 1550 +%if 0%{?suse_version} >= 1550 && %{without base} # The provider for python(abi) is in rpm-build-python +# Skip for the base flavor: rpm-build-python requires python3-base, which +# creates an unresolvable dependency loop when building python3xx-base itself. BuildRequires: rpm-build-python %endif %if 0%{?suse_version} >= 1500 && 0%{?suse_version} < 1599 @@ -286,11 +291,6 @@ Recommends: %{python_pkg_name}-dbm Recommends: %{python_pkg_name}-pip %obsolete_python_versioned -%if %{primary_interpreter} -Provides: python3 = %{python_version} -Provides: python3-readline -Provides: python3-sqlite3 -%endif %endif %description @@ -311,9 +311,6 @@ Summary: TkInter, a Python Tk Interface Requires: %{python_pkg_name} = %{version} %obsolete_python_versioned tk -%if %{primary_interpreter} -Provides: python3-tk = %{version} -%endif %description -n %{python_pkg_name}-tk Python interface to Tk. Tk is the GUI toolkit that comes with Tcl. @@ -322,9 +319,6 @@ Summary: Python Interface to the (N)Curses Library Requires: %{python_pkg_name} = %{version} %obsolete_python_versioned curses -%if %{primary_interpreter} -Provides: python3-curses -%endif %description -n %{python_pkg_name}-curses An easy to use interface to the (n)curses CUI library. CUI stands for @@ -334,9 +328,6 @@ Summary: Python Interface to the GDBM Library Requires: %{python_pkg_name} = %{version} %obsolete_python_versioned dbm -%if %{primary_interpreter} -Provides: python3-dbm -%endif %description -n %{python_pkg_name}-dbm An easy to use interface for Unix DBM databases, and more specifically, @@ -347,9 +338,6 @@ Requires: %{python_pkg_name} = %{version} Requires: %{python_pkg_name}-tk %obsolete_python_versioned idle -%if %{primary_interpreter} -Provides: python3-idle = %{version} -%endif %description -n %{python_pkg_name}-idle IDLE is a Tkinter based integrated development environment for Python. @@ -361,9 +349,6 @@ Summary: Package Documentation for Python 3 Enhances: %{python_pkg_name} = %{python_version} %obsolete_python_versioned doc -%if %{primary_interpreter} -Provides: python3-doc = %{version} -%endif %description -n %{python_pkg_name}-doc Tutorial, Global Module Index, Language Reference, Library Reference, @@ -373,9 +358,6 @@ %package -n %{python_pkg_name}-doc-devhelp Summary: Additional Package Documentation for Python 3 in devhelp format %obsolete_python_versioned doc-devhelp -%if %{primary_interpreter} -Provides: python3-doc-devhelp = %{version} -%endif %description -n %{python_pkg_name}-doc-devhelp Tutorial, Global Module Index, Language Reference, Library Reference, @@ -400,16 +382,10 @@ %obsolete_python_versioned typing # python3-xml was merged into python3, now moved into -base Provides: %{python_pkg_name}-xml = %{version} -%if %{primary_interpreter} -Provides: python3-asyncio = %{version} -Obsoletes: python3-asyncio < %{version} -Provides: python3-base = %{version} -Obsoletes: python3-base < %{version} -Provides: python3-typing = %{version} -Obsoletes: python3-typing < %{version} -Provides: python3-xml = %{version} -Obsoletes: python3-xml < %{version} -%endif +# Explicitly provided because rpm-build-python (which auto-generates this) +# cannot be installed in the base flavor build root due to a bootstrap cycle: +# rpm-build-python -> python3-base -> (this package) +Provides: python(abi) = %{python_version} %description -n %{python_pkg_name}-base Python is an interpreted, object-oriented programming language, and is @@ -428,13 +404,6 @@ Provides: %{python_pkg_name}-2to3 = %{version} Provides: %{python_pkg_name}-demo = %{version} %obsolete_python_versioned tools -%if %{primary_interpreter} -Provides: python3-2to3 = %{version} -Provides: python3-demo = %{version} -Provides: python3-tools = %{version} -Obsoletes: python3-2to3 < %{version} -Obsoletes: python3-demo < %{version} -%endif %description -n %{python_pkg_name}-tools A number of scripts that are useful for building, testing or extending Python, @@ -444,9 +413,6 @@ Summary: Include Files and Libraries Mandatory for Building Python Modules Requires: %{python_pkg_name}-base = %{version} %obsolete_python_versioned devel -%if %{primary_interpreter} -Provides: python3-devel = %{version} -%endif %description -n %{python_pkg_name}-devel The Python programming language's interpreter can be extended with @@ -464,9 +430,6 @@ Requires: %{python_pkg_name} = %{version} Requires: %{python_pkg_name}-tk = %{version} %obsolete_python_versioned testsuite -%if %{primary_interpreter} -Provides: python3-testsuite = %{version} -%endif %description -n %{python_pkg_name}-testsuite Unit tests that are useful for verifying integrity and functionality @@ -757,20 +720,12 @@ done rm -fv %{buildroot}%{dynlib nis} -# overwrite the copied binary with a link -ln -sf python%{python_version} %{buildroot}%{_bindir}/python3 - -# decide to ship python3 or just python3.X -%if !%{primary_interpreter} -# base rm %{buildroot}%{_bindir}/python3 rm %{buildroot}%{_bindir}/pydoc3 rm %{buildroot}%{_mandir}/man1/python3.1 -# devel rm %{buildroot}%{_bindir}/python3-config rm %{buildroot}%{_libdir}/libpython3.so rm %{buildroot}%{_libdir}/pkgconfig/{python3,python3-embed}.pc -%endif # link shared library instead of static library that tools expect ln -s ../../libpython%{python_abi}.so %{buildroot}%{_libdir}/python%{python_version}/config-%{python_abi}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}/libpython%{python_abi}.so @@ -803,7 +758,13 @@ find "$PDOCS" -name "*.bat" -delete # put gdb helper script into place -install -m 755 -D Tools/gdb/libpython.py %{buildroot}%{_datadir}/gdb/auto-load/%{_libdir}/libpython%{python_abi}.so.%{so_major}.%{so_minor}-gdb.py +%define gdb_help_script libpython%{python_abi}.so.%{so_major}.%{so_minor}-gdb.py +install -m 755 -D Tools/gdb/libpython.py \ + %{buildroot}%{_datadir}/gdb/auto-load/%{_libdir}/%{gdb_help_script} +# don't use %python310_fix_shebang_path to avoid circular dependency via +# python-rpm-macros +sed -i "1s@#\!.*python[^ ]*@#\!%{_bindir}/python%{python_version}@" \ + %{buildroot}%{_datadir}/gdb/auto-load/%{_libdir}/%{gdb_help_script} # install devel files to /config #cp Makefile Makefile.pre.in Makefile.pre $RPM_BUILD_ROOT%{sitedir}/config-%{python_abi}/ @@ -921,16 +882,10 @@ %files -n %{python_pkg_name}-devel %{_libdir}/libpython%{python_abi}.so -%if %{primary_interpreter} -%{_libdir}/libpython3.so -%endif %{_libdir}/pkgconfig/* %{_includedir}/python%{python_abi} %{sitedir}/config-%{python_abi}-* %{_bindir}/python%{python_abi}-config -%if %{primary_interpreter} -%{_bindir}/python3-config -%endif # Own these directories to not depend on gdb %dir %{_datadir}/gdb %dir %{_datadir}/gdb/auto-load @@ -960,9 +915,6 @@ %doc %{_docdir}/%{name}/README.rst %license LICENSE %doc %{_docdir}/%{name}/README.SUSE -%if %{primary_interpreter} -%{_mandir}/man1/python3.1%{?ext_man} -%endif %{_mandir}/man1/python%{python_version}.1%{?ext_man} # license text, not a doc because the code can use it at run-time %{sitedir}/LICENSE.txt @@ -1071,11 +1023,6 @@ # import-failed hooks %{sitedir}/_import_failed %{sitedir}/site-packages/zzzz-import-failed-hooks.pth -# symlinks -%if %{primary_interpreter} -%{_bindir}/python3 -%{_bindir}/pydoc3 -%endif # executables %attr(755, root, root) %{_bindir}/pydoc%{python_version} # %%attr(755, root, root) %%{_bindir}/python%%{python_abi} ++++++ CVE-2026-3446-base64-padding.patch ++++++ >From bd4ab523ba664863d40470cc718c566158adfa31 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <[email protected]> Date: Tue, 24 Mar 2026 01:20:26 +0200 Subject: [PATCH] [3.14] gh-145264: Do not ignore excess Base64 data after the first padded quad (GH-145267) (GH-146326) Base64 decoder (see binascii.a2b_base64(), base64.b64decode(), etc) no longer ignores excess data after the first padded quad in non-strict (default) mode. Instead, in conformance with RFC 4648, it ignores the pad character, "=", if it is present before the end of the encoded data. (cherry picked from commit 4561f6418a691b3e89aef0901f53fe0dfb7f7c0e) (cherry picked from commit e31c55121620189a0d1a07b689762d8ca9c1b7fa) Co-authored-by: Serhiy Storchaka <[email protected]> --- Lib/test/test_binascii.py | 73 +++++++ Misc/NEWS.d/next/Library/2026-02-26-20-13-16.gh-issue-145264.4pggX_.rst | 4 Modules/binascii.c | 93 +++++++--- Modules/clinic/binascii.c.h | 35 +++ 4 files changed, 174 insertions(+), 31 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2026-02-26-20-13-16.gh-issue-145264.4pggX_.rst Index: Python-3.10.20/Lib/test/test_binascii.py =================================================================== --- Python-3.10.20.orig/Lib/test/test_binascii.py 2026-04-17 17:04:14.901546479 +0200 +++ Python-3.10.20/Lib/test/test_binascii.py 2026-04-17 17:04:14.964546489 +0200 @@ -14,7 +14,6 @@ 'unhexlify', 'rledecode_hqx'] all_functions = a2b_functions + b2a_functions + ['crc32', 'crc_hqx'] - class BinASCIITest(unittest.TestCase): type2test = bytes @@ -114,6 +113,78 @@ # empty strings. TBD: shouldn't it raise an exception instead ? self.assertEqual(binascii.a2b_base64(self.type2test(fillers)), b'') + def test_base64_strict_mode(self): + # Test base64 with strict mode on + def _assertRegexTemplate(assert_regex: str, data: bytes, non_strict_mode_expected_result: bytes): + with self.assertRaisesRegex(binascii.Error, assert_regex): + binascii.a2b_base64(self.type2test(data), strict_mode=True) + self.assertEqual(binascii.a2b_base64(self.type2test(data), strict_mode=False), + non_strict_mode_expected_result) + self.assertEqual(binascii.a2b_base64(self.type2test(data)), + non_strict_mode_expected_result) + + def assertExcessData(data, non_strict_mode_expected_result: bytes): + _assertRegexTemplate(r'(?i)Excess data', data, non_strict_mode_expected_result) + + def assertNonBase64Data(data, non_strict_mode_expected_result: bytes): + _assertRegexTemplate(r'(?i)Only base64 data', data, non_strict_mode_expected_result) + + def assertLeadingPadding(data, non_strict_mode_expected_result: bytes): + _assertRegexTemplate(r'(?i)Leading padding', data, non_strict_mode_expected_result) + + def assertDiscontinuousPadding(data, non_strict_mode_expected_result: bytes): + _assertRegexTemplate(r'(?i)Discontinuous padding', data, non_strict_mode_expected_result) + + def assertExcessPadding(data, non_strict_mode_expected_result: bytes): + _assertRegexTemplate(r'(?i)Excess padding', data, non_strict_mode_expected_result) + + # Test excess data exceptions + assertExcessPadding(b'ab===', b'i') + assertExcessPadding(b'ab====', b'i') + assertNonBase64Data(b'ab==:', b'i') + assertExcessData(b'abc=a', b'i\xb7\x1a') + assertNonBase64Data(b'abc=:', b'i\xb7') + assertNonBase64Data(b'ab==\n', b'i') + assertExcessPadding(b'abc==', b'i\xb7') + assertExcessPadding(b'abc===', b'i\xb7') + assertExcessPadding(b'abc====', b'i\xb7') + assertExcessPadding(b'abc=====', b'i\xb7') + + # Test non-base64 data exceptions + assertNonBase64Data(b'\nab==', b'i') + assertNonBase64Data(b'ab:(){:|:&};:==', b'i') + assertNonBase64Data(b'a\nb==', b'i') + assertNonBase64Data(b'a\x00b==', b'i') + + # Test malformed padding + assertLeadingPadding(b'=', b'') + assertLeadingPadding(b'==', b'') + assertLeadingPadding(b'===', b'') + assertLeadingPadding(b'====', b'') + assertLeadingPadding(b'=====', b'') + assertDiscontinuousPadding(b'ab=c=', b'i\xb7') + assertDiscontinuousPadding(b'ab=ab==', b'i\xb6\x9b') + assertExcessPadding(b'abcd=', b'i\xb7\x1d') + assertExcessPadding(b'abcd==', b'i\xb7\x1d') + assertExcessPadding(b'abcd===', b'i\xb7\x1d') + assertExcessPadding(b'abcd====', b'i\xb7\x1d') + assertExcessPadding(b'abcd=====', b'i\xb7\x1d') + + def test_base64_excess_data(self): + # Test excess data exceptions + def assertExcessData(data, expected): + assert_regex = r'(?i)Excess data' + data = self.type2test(data) + with self.assertRaisesRegex(binascii.Error, assert_regex): + binascii.a2b_base64(data, strict_mode=True) + self.assertEqual(binascii.a2b_base64(data, strict_mode=False), + expected) + self.assertEqual(binascii.a2b_base64(data), expected) + + assertExcessData(b'ab==c=', b'i\xb7') + assertExcessData(b'ab==cd', b'i\xb7\x1d') + assertExcessData(b'abc=d', b'i\xb7\x1d') + def test_base64errors(self): # Test base64 with invalid padding def assertIncorrectPadding(data): Index: Python-3.10.20/Misc/NEWS.d/next/Library/2026-02-26-20-13-16.gh-issue-145264.4pggX_.rst =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ Python-3.10.20/Misc/NEWS.d/next/Library/2026-02-26-20-13-16.gh-issue-145264.4pggX_.rst 2026-04-17 17:04:14.965334091 +0200 @@ -0,0 +1,4 @@ +Base64 decoder (see :func:`binascii.a2b_base64`, :func:`base64.b64decode`, etc) no +longer ignores excess data after the first padded quad in non-strict +(default) mode. Instead, in conformance with :rfc:`4648`, section 3.3, it now ignores +the pad character, "=", if it is present before the end of the encoded data. Index: Python-3.10.20/Modules/binascii.c =================================================================== --- Python-3.10.20.orig/Modules/binascii.c 2026-04-17 17:04:14.901546479 +0200 +++ Python-3.10.20/Modules/binascii.c 2026-04-17 17:04:14.965546490 +0200 @@ -433,18 +433,25 @@ data: ascii_buffer / + * + strict_mode: bool(accept={int}) = False Decode a line of base64 data. + +strict_mode + When set to True, bytes that are not part of the base64 standard are not allowed. + The same applies to excess data after padding (= / ==). [clinic start generated code]*/ static PyObject * -binascii_a2b_base64_impl(PyObject *module, Py_buffer *data) -/*[clinic end generated code: output=0628223f19fd3f9b input=5872acf6e1cac243]*/ +binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode) +/*[clinic end generated code: output=5409557788d4f975 input=c0c15fd0f8f9a62d]*/ { assert(data->len >= 0); const unsigned char *ascii_data = data->buf; size_t ascii_len = data->len; + binascii_state *state = NULL; /* Allocate the buffer */ Py_ssize_t bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */ @@ -465,20 +472,55 @@ ** the invalid ones. */ if (this_ch == BASE64_PAD) { - if (quad_pos >= 2 && quad_pos + ++pads >= 4) { - /* A pad sequence means no more input. - ** We've already interpreted the data - ** from the quad at this point. - */ - goto done; + pads++; + if (quad_pos >= 2 && quad_pos + pads <= 4) { + continue; } - continue; + // See RFC 4648, section-3.3: "specifications MAY ignore the + // pad character, "=", treating it as non-alphabet data, if + // it is present before the end of the encoded data" and + // "the excess pad characters MAY also be ignored." + if (!strict_mode) { + continue; + } + if (quad_pos == 1) { + /* Set an error below. */ + break; + } + state = get_binascii_state(module); + if (state) { + PyErr_SetString(state->Error, + (quad_pos == 0 && i == 0) + ? "Leading padding not allowed" + : "Excess padding not allowed"); + } + goto error_end; } this_ch = table_a2b_base64[this_ch]; if (this_ch >= 64) { + // See RFC 4648, section-3.3. + if (strict_mode) { + state = get_binascii_state(module); + if (state) { + PyErr_SetString(state->Error, "Only base64 data is allowed"); + } + goto error_end; + } continue; } + + // Characters that are not '=', in the middle of the padding, are + // not allowed (except when they are). See RFC 4648, section-3.3. + if (pads && strict_mode) { + state = get_binascii_state(module); + if (state) { + PyErr_SetString(state->Error, (quad_pos + pads == 4) + ? "Excess data after padding" + : "Discontinuous padding not allowed"); + } + goto error_end; + } pads = 0; switch (quad_pos) { @@ -504,30 +546,35 @@ } } - if (quad_pos != 0) { - binascii_state *state = PyModule_GetState(module); - if (state == NULL) { - /* error already set, from PyModule_GetState */ - } else if (quad_pos == 1) { - /* - ** There is exactly one extra valid, non-padding, base64 character. - ** This is an invalid length, as there is no possible input that - ** could encoded into such a base64 string. - */ + if (quad_pos == 1) { + /* There is exactly one extra valid, non-padding, base64 character. + * * This is an invalid length, as there is no possible input that + ** could encoded into such a base64 string. + */ + state = get_binascii_state(module); + if (state) { PyErr_Format(state->Error, "Invalid base64-encoded string: " "number of data characters (%zd) cannot be 1 more " "than a multiple of 4", (bin_data - bin_data_start) / 3 * 4 + 1); - } else { + } + goto error_end; + } + + if (quad_pos != 0 && quad_pos + pads < 4) { + state = get_binascii_state(module); + if (state) { PyErr_SetString(state->Error, "Incorrect padding"); } - _PyBytesWriter_Dealloc(&writer); - return NULL; + goto error_end; } -done: return _PyBytesWriter_Finish(&writer, bin_data); + +error_end: + _PyBytesWriter_Dealloc(&writer); + return NULL; } Index: Python-3.10.20/Modules/clinic/binascii.c.h =================================================================== --- Python-3.10.20.orig/Modules/clinic/binascii.c.h 2026-04-17 17:05:53.040592728 +0200 +++ Python-3.10.20/Modules/clinic/binascii.c.h 2026-04-17 17:04:14.901546479 +0200 @@ -87,27 +87,48 @@ } PyDoc_STRVAR(binascii_a2b_base64__doc__, -"a2b_base64($module, data, /)\n" +"a2b_base64($module, data, /, *, strict_mode=False)\n" "--\n" "\n" -"Decode a line of base64 data."); +"Decode a line of base64 data.\n" +"\n" +"strict_mode\n" +" When set to True, bytes that are not part of the base64 standard are not allowed.\n" +" The same applies to excess data after padding (= / ==)."); #define BINASCII_A2B_BASE64_METHODDEF \ - {"a2b_base64", (PyCFunction)binascii_a2b_base64, METH_O, binascii_a2b_base64__doc__}, + {"a2b_base64", (PyCFunction)(void(*)(void))binascii_a2b_base64, METH_FASTCALL|METH_KEYWORDS, binascii_a2b_base64__doc__}, static PyObject * -binascii_a2b_base64_impl(PyObject *module, Py_buffer *data); +binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode); static PyObject * -binascii_a2b_base64(PyObject *module, PyObject *arg) +binascii_a2b_base64(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "strict_mode", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "a2b_base64", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; + int strict_mode = 0; - if (!ascii_buffer_converter(arg, &data)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!ascii_buffer_converter(args[0], &data)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + strict_mode = _PyLong_AsInt(args[1]); + if (strict_mode == -1 && PyErr_Occurred()) { goto exit; } - return_value = binascii_a2b_base64_impl(module, &data); +skip_optional_kwonly: + return_value = binascii_a2b_base64_impl(module, &data, strict_mode); exit: /* Cleanup for data */ ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.hpiQZJ/_old 2026-04-19 14:21:23.638167276 +0200 +++ /var/tmp/diff_new_pack.hpiQZJ/_new 2026-04-19 14:21:23.650167764 +0200 @@ -1,6 +1,6 @@ -mtime: 1775598785 -commit: 4fc13a033e0810c657738f5966755e3e5a2f0efa24bed607d38e1d5465b0afd7 +mtime: 1776458219 +commit: cf8e710a886c417bb4b2c136e2a8fc01cac6f38e333eca36fc60ab1547011bba url: https://src.opensuse.org/python-interpreters/python310.git -revision: 4fc13a033e0810c657738f5966755e3e5a2f0efa24bed607d38e1d5465b0afd7 +revision: cf8e710a886c417bb4b2c136e2a8fc01cac6f38e333eca36fc60ab1547011bba projectscmsync: https://src.opensuse.org/python-interpreters/_ObsPrj ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-04-17 22:37:34.000000000 +0200 @@ -0,0 +1,7 @@ +.osc +*.obscpio +*.osc +_build.* +.pbuild +*.rej +python310-*-build/
