openSUSE Commits
Threads by month
- ----- 2025 -----
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
January 2025
- 1 participants
- 989 discussions
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package operator-sdk for openSUSE:Factory checked in at 2025-01-15 17:44:33
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/operator-sdk (Old)
and /work/SRC/openSUSE:Factory/.operator-sdk.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "operator-sdk"
Wed Jan 15 17:44:33 2025 rev:12 rq:1237984 version:1.39.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/operator-sdk/operator-sdk.changes 2025-01-12 11:29:00.531091115 +0100
+++ /work/SRC/openSUSE:Factory/.operator-sdk.new.1881/operator-sdk.changes 2025-01-15 17:44:35.856154474 +0100
@@ -1,0 +2,9 @@
+Wed Jan 15 07:07:08 UTC 2025 - opensuse_buildservice(a)ojkastl.de
+
+- Update to version 1.39.1:
+ * Release v1.39.1 (#6896)
+ * fix constant reconcilation issue in helm controller (#6895)
+ * fix constant reconcilation issue in helm controller (#6892)
+ * re-generate scaffolding post release (#6893)
+
+-------------------------------------------------------------------
Old:
----
operator-sdk-1.39.0.obscpio
New:
----
operator-sdk-1.39.1.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ operator-sdk.spec ++++++
--- /var/tmp/diff_new_pack.VJYiTL/_old 2025-01-15 17:44:38.864279023 +0100
+++ /var/tmp/diff_new_pack.VJYiTL/_new 2025-01-15 17:44:38.868279189 +0100
@@ -17,7 +17,7 @@
Name: operator-sdk
-Version: 1.39.0
+Version: 1.39.1
Release: 0
Summary: CLI for installing the Operator Lifecycle Manager
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.VJYiTL/_old 2025-01-15 17:44:38.896280348 +0100
+++ /var/tmp/diff_new_pack.VJYiTL/_new 2025-01-15 17:44:38.900280514 +0100
@@ -3,7 +3,7 @@
<param name="url">https://github.com/operator-framework/operator-sdk</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="revision">v1.39.0</param>
+ <param name="revision">v1.39.1</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="changesgenerate">enable</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.VJYiTL/_old 2025-01-15 17:44:38.920281342 +0100
+++ /var/tmp/diff_new_pack.VJYiTL/_new 2025-01-15 17:44:38.924281508 +0100
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/operator-framework/operator-sdk</param>
- <param name="changesrevision">d5cc16b9818671fc3e23f94037d257cb2f6d6675</param></service></servicedata>
+ <param name="changesrevision">b8a728e15447465a431343a664e9a27ff9db655e</param></service></servicedata>
(No newline at EOF)
++++++ operator-sdk-1.39.0.obscpio -> operator-sdk-1.39.1.obscpio ++++++
/work/SRC/openSUSE:Factory/operator-sdk/operator-sdk-1.39.0.obscpio /work/SRC/openSUSE:Factory/.operator-sdk.new.1881/operator-sdk-1.39.1.obscpio differ: char 50, line 1
++++++ operator-sdk.obsinfo ++++++
--- /var/tmp/diff_new_pack.VJYiTL/_old 2025-01-15 17:44:38.960282998 +0100
+++ /var/tmp/diff_new_pack.VJYiTL/_new 2025-01-15 17:44:38.960282998 +0100
@@ -1,5 +1,5 @@
name: operator-sdk
-version: 1.39.0
-mtime: 1736540757
-commit: d5cc16b9818671fc3e23f94037d257cb2f6d6675
+version: 1.39.1
+mtime: 1736873912
+commit: b8a728e15447465a431343a664e9a27ff9db655e
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/operator-sdk/vendor.tar.gz /work/SRC/openSUSE:Factory/.operator-sdk.new.1881/vendor.tar.gz differ: char 5, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package okteto for openSUSE:Factory checked in at 2025-01-15 17:44:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/okteto (Old)
and /work/SRC/openSUSE:Factory/.okteto.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "okteto"
Wed Jan 15 17:44:09 2025 rev:94 rq:1237980 version:3.3.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/okteto/okteto.changes 2025-01-12 11:27:49.668175026 +0100
+++ /work/SRC/openSUSE:Factory/.okteto.new.1881/okteto.changes 2025-01-15 17:44:13.767239894 +0100
@@ -1,0 +2,6 @@
+Wed Jan 15 06:56:26 UTC 2025 - opensuse_buildservice(a)ojkastl.de
+
+- Update to version 3.3.1:
+ * fix divert with docker compose (#4651) (#4653)
+
+-------------------------------------------------------------------
Old:
----
okteto-3.3.0.obscpio
New:
----
okteto-3.3.1.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ okteto.spec ++++++
--- /var/tmp/diff_new_pack.B51l5J/_old 2025-01-15 17:44:14.971289748 +0100
+++ /var/tmp/diff_new_pack.B51l5J/_new 2025-01-15 17:44:14.971289748 +0100
@@ -17,7 +17,7 @@
Name: okteto
-Version: 3.3.0
+Version: 3.3.1
Release: 0
Summary: Develop your applications directly in your Kubernetes Cluster
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.B51l5J/_old 2025-01-15 17:44:15.007291238 +0100
+++ /var/tmp/diff_new_pack.B51l5J/_new 2025-01-15 17:44:15.007291238 +0100
@@ -3,8 +3,8 @@
<param name="url">https://github.com/okteto/okteto</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="revision">3.3.0</param>
- <param name="match-tag">3.3.0</param>
+ <param name="revision">3.3.1</param>
+ <param name="match-tag">3.3.1</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>
</service>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.B51l5J/_old 2025-01-15 17:44:15.027292067 +0100
+++ /var/tmp/diff_new_pack.B51l5J/_new 2025-01-15 17:44:15.035292397 +0100
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/okteto/okteto</param>
- <param name="changesrevision">51a24df5d77af855c8f0b8f5ace6956c756993d1</param></service></servicedata>
+ <param name="changesrevision">40d347b523a60488ef5dc39babd192b40a0b1242</param></service></servicedata>
(No newline at EOF)
++++++ okteto-3.3.0.obscpio -> okteto-3.3.1.obscpio ++++++
/work/SRC/openSUSE:Factory/okteto/okteto-3.3.0.obscpio /work/SRC/openSUSE:Factory/.okteto.new.1881/okteto-3.3.1.obscpio differ: char 49, line 1
++++++ okteto.obsinfo ++++++
--- /var/tmp/diff_new_pack.B51l5J/_old 2025-01-15 17:44:15.067293723 +0100
+++ /var/tmp/diff_new_pack.B51l5J/_new 2025-01-15 17:44:15.071293888 +0100
@@ -1,5 +1,5 @@
name: okteto
-version: 3.3.0
-mtime: 1736424518
-commit: 51a24df5d77af855c8f0b8f5ace6956c756993d1
+version: 3.3.1
+mtime: 1736880195
+commit: 40d347b523a60488ef5dc39babd192b40a0b1242
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/okteto/vendor.tar.gz /work/SRC/openSUSE:Factory/.okteto.new.1881/vendor.tar.gz differ: char 5, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package aerc for openSUSE:Factory checked in at 2025-01-15 17:44:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/aerc (Old)
and /work/SRC/openSUSE:Factory/.aerc.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "aerc"
Wed Jan 15 17:44:08 2025 rev:14 rq:1237950 version:0.19.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/aerc/aerc.changes 2024-07-30 11:57:30.384895794 +0200
+++ /work/SRC/openSUSE:Factory/.aerc.new.1881/aerc.changes 2025-01-15 17:44:11.087128926 +0100
@@ -1,0 +2,72 @@
+Tue Jan 14 23:37:03 UTC 2025 - Hannes Braun <apple.hannes(a)gmail.com> - 0.19.0
+
+- Update to upstream version 0.19.0
+ * New :redraw command to force a repaint of the screen.
+ * New head and tail templates functions for strings.
+ * New {{.AccountFrom}} template variable.
+ * Replying to all will include the Sender in Cc.
+ * Add -b flag to the :view command to open messages in a background tab.
+ * AERC_ACCOUNT and AERC_FOLDER are now available in the signature command
+ environment.
+ * Filters will receive the actual COLUMNS and LINES values.
+ * The :forward command now sets the forwarded flag.
+ * Forwarded messages can now be searched for and filtered in notmuch and
+ maildir.
+ * Forwarded messages can be styled differently in the message list.
+ * Forwarded messages can be identified with the {{.IsForwarded}} template.
+ * The :flag command now sets/unsets/toggle the forwarded tag.
+ * The notmuch backend now honors the forwarded flag, setting the "passed" tag.
+ * The maildir backend now honors the forwarded/passed flag.
+ * Auto-switch projects based on the message subject for the :patch command.
+ * New :echo command that prints its arguments with templates resolved.
+ * New use-envelope-from option in accounts.conf.
+ * Command completion now displays descriptions next to completion items.
+ * New completion_description style object in style sets used for rendering
+ completion item descriptions.
+ * :import-mbox can now import data from an URL.
+ * Dynamic message list style can now match on multiple email headers.
+ * The JMAP backend now supports full thread fetching and caching
+ (limited within a single mailbox).
+ * :expand-folder and :collapse-folder can now act on a non selected folder.
+ * Filters commands can now provide their own paging by prefixing them with a
+ "!" character. Doing so will disable the configured [viewer].pager and
+ connect them directly to the terminal.
+ * Reply to addresses in From and Reply-To headers with ":reply -f".
+ * Fixed builtin calendar filter showing empty attendee list.
+ * Terminal-based pinentry programs (e.g. pinentry-curses) now work properly.
+ * Notmuch searches which explicitly contain tags from exclude-tags now return
+ messages.
+ * Invitations now honor the -a flag for :send.
+ * Remove unwanted less than symbol from In-Reply-To header when Message-ID
+ uses folding.
+ * Aliases are now taken into account correctly when replying to own messages
+ such as from the Sent folder or via a mailing list.
+ * Some SMTP servers do not strip Bcc headers. aerc now removes them before
+ sending emails to avoid leaking private information. A new strip-bcc = false
+ option can be used in accounts.conf to revert to previous behaviour
+ (preserve Bcc headers in outgoing messages).
+ * There should no longer be any duplicates in recipient lists when replying.
+ * GPG signatures and encrypted parts now use CRLF line endings as required by
+ RFC 5322.
+ * Template function quote only prefixes with a space if at quote depth 1.
+ * Templates passed to the :reply command using the `-T` flag can now make use
+ of {{.OriginalText}}.
+ * The location of the command history file has changed to
+ ${XDG_STATE_HOME:-$HOME/.local/state}/aerc/history.
+ * Tab completions for text fields are run asynchronously. In-flight requests
+ are cancelled when new input arrives.
+ * Path completion now uses the normal filtering mechanism, respecting case
+ sensitivity and the fuzzy completion option.
+ * The html filter is now enabled by default, making w3m a weak runtime
+ dependency. If it is not installed, viewing HTML emails will fail with an
+ explicit error.
+ * The default text/html filter will now run w3m in interactive mode.
+ * The builtin html and html-unsafe filters can now take additional arguments
+ that will be passed to w3m. This can be used to enable inline images when
+ viewing text/html parts (e.g.: text/html = ! html-unsafe -sixel).
+ * The templates exec commands is now executed with the filters exec $PATH
+ similar to filter commands.
+ * The default quoted_reply template now converts text/html parts to plain text
+ before quoting them.
+
+-------------------------------------------------------------------
Old:
----
aerc-0.18.2.tar.gz
New:
----
aerc-0.19.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ aerc.spec ++++++
--- /var/tmp/diff_new_pack.2Xdkpn/_old 2025-01-15 17:44:12.543189213 +0100
+++ /var/tmp/diff_new_pack.2Xdkpn/_new 2025-01-15 17:44:12.547189379 +0100
@@ -1,7 +1,7 @@
#
# spec file for package aerc
#
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
# Copyright (c) 2023 Hannes Braun
#
# All modifications and additions to the file contributed by third parties
@@ -18,7 +18,7 @@
Name: aerc
-Version: 0.18.2
+Version: 0.19.0
Release: 0
Summary: An email client for terminals
License: GPL-3.0-or-later
@@ -33,8 +33,8 @@
BuildRequires: notmuch-devel >= 0.37
BuildRequires: scdoc
BuildRequires: zstd
-Recommends: dante
-Recommends: w3m
+Requires: dante
+Requires: w3m
%description
aerc is an email client that runs in terminals.
++++++ aerc-0.18.2.tar.gz -> aerc-0.19.0.tar.gz ++++++
++++ 15833 lines of diff (skipped)
++++++ vendor.tar.zst ++++++
++++ 137732 lines of diff (skipped)
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-pyscard for openSUSE:Factory checked in at 2025-01-15 17:44:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pyscard (Old)
and /work/SRC/openSUSE:Factory/.python-pyscard.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pyscard"
Wed Jan 15 17:44:05 2025 rev:22 rq:1237933 version:2.2.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pyscard/python-pyscard.changes 2024-10-21 16:26:53.310682073 +0200
+++ /work/SRC/openSUSE:Factory/.python-pyscard.new.1881/python-pyscard.changes 2025-01-15 17:44:08.303013652 +0100
@@ -1,0 +2,7 @@
+Tue Jan 14 19:57:53 UTC 2025 - Martin Hauke <mardnh(a)gmx.de>
+
+- Update to version 2.2.1
+ * waitforcardevent(): do not miss events between 2 calls.
+ * Test, fix, and simplify ATR parsing.
+
+-------------------------------------------------------------------
Old:
----
pyscard-2.2.0.tar.gz
New:
----
pyscard-2.2.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pyscard.spec ++++++
--- /var/tmp/diff_new_pack.yWb4bf/_old 2025-01-15 17:44:09.323055886 +0100
+++ /var/tmp/diff_new_pack.yWb4bf/_new 2025-01-15 17:44:09.327056051 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-pyscard
#
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
# Copyright (c) 2011 LISA GmbH, Bingen, Germany.
#
# All modifications and additions to the file contributed by third parties
@@ -19,7 +19,7 @@
%define modname pyscard
Name: python-pyscard
-Version: 2.2.0
+Version: 2.2.1
Release: 0
Summary: Python module adding smart card support
License: LGPL-2.0-or-later
++++++ pyscard-2.2.0.tar.gz -> pyscard-2.2.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyscard-2.2.0/ACKS new/pyscard-2.2.1/ACKS
--- old/pyscard-2.2.0/ACKS 2024-10-02 21:32:52.000000000 +0200
+++ new/pyscard-2.2.1/ACKS 2024-11-18 14:18:38.000000000 +0100
@@ -11,12 +11,29 @@
Antonio Aranda
Frank Aune
Michel Beziat
+Peter Bittner
+Mark Bokil
Mattias Brändström
+Dave Cahill
+Eduardo Castellanos
+Norman Denayer
+Stefan Droege
Luc Duche
+Jonathan Giannuzzi
+Kevin Griffin
Nodir Gulyamov
+Max Hausch
+Merrick Heley
Yong David Huang
+Valdur Kana
+Kristiine
Adam Laurie
+Kurt McKee
+Elouan Petereau
Henryk Plotz
+Chris Post
Michael Roehner
Ludovic Rousseau
David Wagner
+Harald Welte
+Alex Willmer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyscard-2.2.0/ChangeLog new/pyscard-2.2.1/ChangeLog
--- old/pyscard-2.2.0/ChangeLog 2024-10-20 15:57:31.000000000 +0200
+++ new/pyscard-2.2.1/ChangeLog 2025-01-12 15:48:05.000000000 +0100
@@ -1,7 +1,16 @@
+2.2.1 (January 2025)
+====================
+- patches from Ludovic Rousseau
+ * waitforcardevent(): do not miss events between 2 calls
+ * Use Windows locale to decode Unicode text
+ * ACKS: add missing contributors
+- patches from Kurt McKee
+ * Test, fix, and simplify ATR parsing
+
2.2.0 (October 2024)
====================
- patches from Ludovic Rousseau
- * PCSCCardRequest:
+ * PCSCCardRequest:
- handle KeyboardInterrupt in waitforcard() & waitforcardevent()
- use a local PC/SC context to avoid locks
* smartcard.util.padd(): do NOT modify the input parameter
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyscard-2.2.0/PKG-INFO new/pyscard-2.2.1/PKG-INFO
--- old/pyscard-2.2.0/PKG-INFO 2024-10-20 16:07:11.435020200 +0200
+++ new/pyscard-2.2.1/PKG-INFO 2025-01-12 15:49:38.694440400 +0100
@@ -1,9 +1,9 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.2
Name: pyscard
-Version: 2.2.0
+Version: 2.2.1
Summary: Smartcard module for Python.
Home-page: https://github.com/LudovicRousseau/pyscard
-Download-URL: https://sourceforge.net/projects/pyscard/files/pyscard/pyscard%202.2.0/pysc…
+Download-URL: https://sourceforge.net/projects/pyscard/files/pyscard/pyscard%202.2.1/pysc…
Author: Ludovic Rousseau
Author-email: ludovic.rousseau(a)free.fr
Platform: linux
@@ -25,5 +25,16 @@
Requires-Dist: typing_extensions; python_version == "3.9"
Provides-Extra: gui
Requires-Dist: wxPython; extra == "gui"
+Dynamic: author
+Dynamic: author-email
+Dynamic: classifier
+Dynamic: description
+Dynamic: download-url
+Dynamic: home-page
+Dynamic: platform
+Dynamic: provides-extra
+Dynamic: requires-dist
+Dynamic: requires-python
+Dynamic: summary
Smartcard package for Python
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyscard-2.2.0/setup.py new/pyscard-2.2.1/setup.py
--- old/pyscard-2.2.0/setup.py 2024-10-20 15:34:20.000000000 +0200
+++ new/pyscard-2.2.1/setup.py 2025-01-12 15:48:05.000000000 +0100
@@ -64,7 +64,7 @@
except:
platform_include_dirs = ["/usr/include/PCSC", "/usr/local/include/PCSC"]
-VERSION_INFO = (2, 2, 0, 0)
+VERSION_INFO = (2, 2, 1, 0)
VERSION_STR = "%i.%i.%i" % VERSION_INFO[:3]
VERSION_ALT = "%i,%01i,%01i,%04i" % VERSION_INFO
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyscard-2.2.0/src/pyscard.egg-info/PKG-INFO new/pyscard-2.2.1/src/pyscard.egg-info/PKG-INFO
--- old/pyscard-2.2.0/src/pyscard.egg-info/PKG-INFO 2024-10-20 16:07:11.000000000 +0200
+++ new/pyscard-2.2.1/src/pyscard.egg-info/PKG-INFO 2025-01-12 15:49:38.000000000 +0100
@@ -1,9 +1,9 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.2
Name: pyscard
-Version: 2.2.0
+Version: 2.2.1
Summary: Smartcard module for Python.
Home-page: https://github.com/LudovicRousseau/pyscard
-Download-URL: https://sourceforge.net/projects/pyscard/files/pyscard/pyscard%202.2.0/pysc…
+Download-URL: https://sourceforge.net/projects/pyscard/files/pyscard/pyscard%202.2.1/pysc…
Author: Ludovic Rousseau
Author-email: ludovic.rousseau(a)free.fr
Platform: linux
@@ -25,5 +25,16 @@
Requires-Dist: typing_extensions; python_version == "3.9"
Provides-Extra: gui
Requires-Dist: wxPython; extra == "gui"
+Dynamic: author
+Dynamic: author-email
+Dynamic: classifier
+Dynamic: description
+Dynamic: download-url
+Dynamic: home-page
+Dynamic: platform
+Dynamic: provides-extra
+Dynamic: requires-dist
+Dynamic: requires-python
+Dynamic: summary
Smartcard package for Python
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyscard-2.2.0/src/smartcard/ATR.py new/pyscard-2.2.1/src/smartcard/ATR.py
--- old/pyscard-2.2.0/src/smartcard/ATR.py 2024-10-20 15:28:52.000000000 +0200
+++ new/pyscard-2.2.1/src/smartcard/ATR.py 2024-10-20 22:35:42.000000000 +0200
@@ -22,14 +22,22 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
"""
+from __future__ import annotations
+
+import functools
+import operator
+import warnings
+
from smartcard.Exceptions import SmartcardException
-from smartcard.util import toHexString
class ATR:
- """ATR class."""
+ """Parse and represent Answer to Reset sequences.
- clockrateconversion = [
+ Answer to Reset sequences are defined in ISO 7816-3, section 8.
+ """
+
+ clockrateconversion: list[int | str] = [
372,
372,
558,
@@ -47,7 +55,7 @@
"RFU",
"RFU",
]
- bitratefactor = [
+ bitratefactor: list[int | str] = [
"RFU",
1,
2,
@@ -65,21 +73,11 @@
"RFU",
"RFU",
]
- currenttable = [25, 50, 100, "RFU"]
-
- def __init__(self, atr):
- """Construct a new atr from atr."""
- self.atr = atr
- self.__initInstance__()
+ currenttable: list[int | str] = [25, 50, 100, "RFU"]
- def __checksyncbyte__(self):
- """Check validity of TS."""
- if not 0x3B == self.atr[0] and not 0x03F == self.atr[0]:
- raise SmartcardException("invalid TS 0x%-0.2x" % self.atr[0])
+ def __init__(self, atr: list[int]) -> None:
+ """Parse ATR and initialize members:
- def __initInstance__(self):
- """
- Parse ATR and initialize members:
- TS: initial character
- T0: format character
- TA[n], TB[n], TC[n], TD[n], for n=0,1,...: protocol parameters
@@ -96,7 +94,13 @@
- II: maximum programming current factor
- N: extra guard time
"""
- self.__checksyncbyte__()
+
+ if len(atr) < 2:
+ raise SmartcardException(f"ATR sequences must be at least 2 bytes long")
+ if atr[0] not in {0x3B, 0x3F}:
+ raise SmartcardException(f"invalid TS 0x{atr[0]:02x}")
+
+ self.atr = atr
# initial character
self.TS = self.atr[0]
@@ -108,244 +112,223 @@
self.K = self.T0 & 0x0F
# initialize optional characters lists
- self.TA = []
- self.TB = []
- self.TC = []
- self.TD = []
- self.Y = []
- self.hasTA = []
- self.hasTB = []
- self.hasTC = []
- self.hasTD = []
-
- TD = self.T0
- hasTD = 1
- n = 0
+ self.TA: list[None | int] = []
+ self.TB: list[None | int] = []
+ self.TC: list[None | int] = []
+ self.TD: list[None | int] = []
+ self.Y: list[int] = []
+
+ td: None | int = self.T0
offset = 1
- self.interfaceBytesCount = 0
- while hasTD:
- self.Y += [TD >> 4 & 0x0F]
-
- self.hasTD += [(self.Y[n] & 0x08) != 0]
- self.hasTC += [(self.Y[n] & 0x04) != 0]
- self.hasTB += [(self.Y[n] & 0x02) != 0]
- self.hasTA += [(self.Y[n] & 0x01) != 0]
+ while td is not None:
+ self.Y.append(td >> 4 & 0x0F)
self.TA += [None]
self.TB += [None]
self.TC += [None]
self.TD += [None]
- if self.hasTA[n]:
- self.TA[n] = self.atr[offset + self.hasTA[n]]
- if self.hasTB[n]:
- self.TB[n] = self.atr[offset + self.hasTA[n] + self.hasTB[n]]
- if self.hasTC[n]:
- self.TC[n] = self.atr[
- offset + self.hasTA[n] + self.hasTB[n] + self.hasTC[n]
- ]
- if self.hasTD[n]:
- self.TD[n] = self.atr[
- offset
- + self.hasTA[n]
- + self.hasTB[n]
- + self.hasTC[n]
- + self.hasTD[n]
- ]
-
- self.interfaceBytesCount += (
- self.hasTA[n] + self.hasTB[n] + self.hasTC[n] + self.hasTD[n]
- )
- TD = self.TD[n]
- hasTD = self.hasTD[n]
- offset = (
- offset + self.hasTA[n] + self.hasTB[n] + self.hasTC[n] + self.hasTD[n]
- )
- n = n + 1
+ if self.Y[-1] & 0x01: # TA
+ offset += 1
+ self.TA[-1] = self.atr[offset]
+ if self.Y[-1] & 0x02: # TB
+ offset += 1
+ self.TB[-1] = self.atr[offset]
+ if self.Y[-1] & 0x04: # TC
+ offset += 1
+ self.TC[-1] = self.atr[offset]
+ if self.Y[-1] & 0x08: # TD
+ offset += 1
+ self.TD[-1] = self.atr[offset]
+
+ td = self.TD[-1]
+
+ self.interfaceBytesCount = offset - 1
# historical bytes
self.historicalBytes = self.atr[offset + 1 : offset + 1 + self.K]
# checksum
+ self.TCK: int | None = None
+ self.checksumOK: bool | None = None
self.hasChecksum = len(self.atr) == offset + 1 + self.K + 1
if self.hasChecksum:
self.TCK = self.atr[-1]
- checksum = 0
- for b in self.atr[1:]:
- checksum = checksum ^ b
- self.checksumOK = checksum == 0
- else:
- self.TCK = None
+ self.checksumOK = functools.reduce(operator.xor, self.atr[1:]) == 0
# clock-rate conversion factor
- if self.hasTA[0]:
+ self.FI: int | None = None
+ if self.TA[0] is not None:
self.FI = self.TA[0] >> 4 & 0x0F
- else:
- self.FI = None
# bit-rate adjustment factor
- if self.hasTA[0]:
+ self.DI: int | None = None
+ if self.TA[0] is not None:
self.DI = self.TA[0] & 0x0F
- else:
- self.DI = None
# maximum programming current factor
- if self.hasTB[0]:
+ self.II: int | None = None
+ if self.TB[0] is not None:
self.II = self.TB[0] >> 5 & 0x03
- else:
- self.II = None
# programming voltage factor
- if self.hasTB[0]:
+ self.PI1: int | None = None
+ if self.TB[0] is not None:
self.PI1 = self.TB[0] & 0x1F
- else:
- self.PI1 = None
# extra guard time
self.N = self.TC[0]
- def getChecksum(self):
+ @property
+ def hasTA(self) -> list[bool]:
+ """Deprecated. Replace usage with `ATR.TA[i] is not None`."""
+
+ warnings.warn("Replace usage with `ATR.TA[i] is not None`", DeprecationWarning)
+ return [ta is not None for ta in self.TA]
+
+ @property
+ def hasTB(self) -> list[bool]:
+ """Deprecated. Replace usage with `ATR.TB[i] is not None`."""
+
+ warnings.warn("Replace usage with `ATR.TB[i] is not None`", DeprecationWarning)
+ return [tb is not None for tb in self.TB]
+
+ @property
+ def hasTC(self) -> list[bool]:
+ """Deprecated. Replace usage with `ATR.TC[i] is not None`."""
+
+ warnings.warn("Replace usage with `ATR.TC[i] is not None`", DeprecationWarning)
+ return [tc is not None for tc in self.TC]
+
+ @property
+ def hasTD(self) -> list[bool]:
+ """Deprecated. Replace usage with `ATR.TD[i] is not None`."""
+
+ warnings.warn("Replace usage with `ATR.TD[i] is not None`", DeprecationWarning)
+ return [td is not None for td in self.TD]
+
+ def getChecksum(self) -> int | None:
"""Return the checksum of the ATR. Checksum is mandatory only
for T=1."""
return self.TCK
- def getHistoricalBytes(self):
+ def getHistoricalBytes(self) -> list[int]:
"""Return historical bytes."""
return self.historicalBytes
- def getHistoricalBytesCount(self):
+ def getHistoricalBytesCount(self) -> int:
"""Return count of historical bytes."""
return len(self.historicalBytes)
- def getInterfaceBytesCount(self):
+ def getInterfaceBytesCount(self) -> int:
"""Return count of interface bytes."""
return self.interfaceBytesCount
- def getTA1(self):
+ def getTA1(self) -> int | None:
"""Return TA1 byte."""
return self.TA[0]
- def getTB1(self):
+ def getTB1(self) -> int | None:
"""Return TB1 byte."""
return self.TB[0]
- def getTC1(self):
+ def getTC1(self) -> int | None:
"""Return TC1 byte."""
return self.TC[0]
- def getTD1(self):
+ def getTD1(self) -> int | None:
"""Return TD1 byte."""
return self.TD[0]
- def getBitRateFactor(self):
+ def getBitRateFactor(self) -> int | str:
"""Return bit rate factor."""
if self.DI is not None:
return ATR.bitratefactor[self.DI]
- else:
- return 1
+ return 1
- def getClockRateConversion(self):
+ def getClockRateConversion(self) -> int | str:
"""Return clock rate conversion."""
if self.FI is not None:
return ATR.clockrateconversion[self.FI]
- else:
- return 372
+ return 372
- def getProgrammingCurrent(self):
+ def getProgrammingCurrent(self) -> int | str:
"""Return maximum programming current."""
if self.II is not None:
return ATR.currenttable[self.II]
- else:
- return 50
+ return 50
- def getProgrammingVoltage(self):
+ def getProgrammingVoltage(self) -> int:
"""Return programming voltage."""
if self.PI1 is not None:
return 5 * (1 + self.PI1)
- else:
- return 5
+ return 5
- def getGuardTime(self):
+ def getGuardTime(self) -> int | None:
"""Return extra guard time."""
return self.N
- def getSupportedProtocols(self):
+ def getSupportedProtocols(self) -> dict[str, bool]:
"""Returns a dictionary of supported protocols."""
- protocols = {}
+ protocols: dict[str, bool] = {}
for td in self.TD:
if td is not None:
- strprotocol = "T=%d" % (td & 0x0F)
- protocols[strprotocol] = True
- if not self.hasTD[0]:
+ protocols[f"T={td & 0x0F}"] = True
+ if self.TD[0] is None:
protocols["T=0"] = True
return protocols
- def isT0Supported(self):
+ def isT0Supported(self) -> bool:
"""Return True if T=0 is supported."""
- protocols = self.getSupportedProtocols()
- return "T=0" in protocols
+ return "T=0" in self.getSupportedProtocols()
- def isT1Supported(self):
+ def isT1Supported(self) -> bool:
"""Return True if T=1 is supported."""
- protocols = self.getSupportedProtocols()
- return "T=1" in protocols
+ return "T=1" in self.getSupportedProtocols()
- def isT15Supported(self):
+ def isT15Supported(self) -> bool:
"""Return True if T=15 is supported."""
- protocols = self.getSupportedProtocols()
- return "T=15" in protocols
+ return "T=15" in self.getSupportedProtocols()
- def dump(self):
- """Dump the details of an ATR."""
+ def render(self) -> str:
+ """Render the ATR to a readable format."""
- for i in range(0, len(self.TA)):
- if self.TA[i] is not None:
- print("TA%d: %x" % (i + 1, self.TA[i]))
- if self.TB[i] is not None:
- print("TB%d: %x" % (i + 1, self.TB[i]))
- if self.TC[i] is not None:
- print("TC%d: %x" % (i + 1, self.TC[i]))
- if self.TD[i] is not None:
- print("TD%d: %x" % (i + 1, self.TD[i]))
-
- print("supported protocols " + ",".join(self.getSupportedProtocols()))
- print("T=0 supported: " + str(self.isT0Supported()))
- print("T=1 supported: " + str(self.isT1Supported()))
-
- if self.getChecksum():
- print("checksum: %d" % self.getChecksum())
-
- print("\tclock rate conversion factor: " + str(self.getClockRateConversion()))
- print("\tbit rate adjustment factor: " + str(self.getBitRateFactor()))
-
- print("\tmaximum programming current: " + str(self.getProgrammingCurrent()))
- print("\tprogramming voltage: " + str(self.getProgrammingVoltage()))
-
- print("\tguard time: " + str(self.getGuardTime()))
-
- print("nb of interface bytes: %d" % self.getInterfaceBytesCount())
- print("nb of historical bytes: %d" % self.getHistoricalBytesCount())
-
- def __str__(self):
- """Returns a string representation of the ATR as a stream of bytes."""
- return toHexString(self.atr)
-
-
-if __name__ == "__main__":
- """Small sample illustrating the use of ATR."""
-
- atrs = [
- [0x3F, 0x65, 0x25, 0x00, 0x2C, 0x09, 0x69, 0x90, 0x00],
- [0x3F, 0x65, 0x25, 0x08, 0x93, 0x04, 0x6C, 0x90, 0x00],
- [0x3B, 0x16, 0x94, 0x7C, 0x03, 0x01, 0x00, 0x00, 0x0D],
- [0x3B, 0x65, 0x00, 0x00, 0x9C, 0x11, 0x01, 0x01, 0x03],
- [0x3B, 0xE3, 0x00, 0xFF, 0x81, 0x31, 0x52, 0x45, 0xA1, 0xA2, 0xA3, 0x1B],
- [0x3B, 0xE5, 0x00, 0x00, 0x81, 0x21, 0x45, 0x9C, 0x10, 0x01, 0x00, 0x80, 0x0D],
- ]
+ lines: list[str] = []
+ enumerated_tx_values = enumerate(zip(self.TA, self.TB, self.TC, self.TD), 1)
+ for i, (ta, tb, tc, td) in enumerated_tx_values:
+ if ta is not None:
+ lines.append(f"TA{i}: {ta:x}")
+ if tb is not None:
+ lines.append(f"TB{i}: {tb:x}")
+ if tc is not None:
+ lines.append(f"TC{i}: {tc:x}")
+ if td is not None:
+ lines.append(f"TD{i}: {td:x}")
+
+ lines.append(f"supported protocols {','.join(self.getSupportedProtocols())}")
+ lines.append(f"T=0 supported: {self.isT0Supported()}")
+ lines.append(f"T=1 supported: {self.isT1Supported()}")
+
+ if self.getChecksum() is not None:
+ lines.append(f"checksum: {self.getChecksum()}")
+
+ lines.append(f"\tclock rate conversion factor: {self.getClockRateConversion()}")
+ lines.append(f"\tbit rate adjustment factor: {self.getBitRateFactor()}")
+ lines.append(f"\tmaximum programming current: {self.getProgrammingCurrent()}")
+ lines.append(f"\tprogramming voltage: {self.getProgrammingVoltage()}")
+ lines.append(f"\tguard time: {self.getGuardTime()}")
+ lines.append(f"nb of interface bytes: {self.getInterfaceBytesCount()}")
+ lines.append(f"nb of historical bytes: {self.getHistoricalBytesCount()}")
+
+ return "\n".join(lines)
+
+ def dump(self) -> None:
+ """Deprecated. Replace usage with `print(ATR.render())`"""
+
+ warnings.warn("Replace usage with `print(ATR.render())`", DeprecationWarning)
+ print(self.render())
+
+ def __str__(self) -> str:
+ """Render the ATR as a space-separated string of uppercase hexadecimal pairs."""
- for atr in atrs:
- a = ATR(atr)
- print(80 * "-")
- print(a)
- a.dump()
- print(toHexString(a.getHistoricalBytes()))
+ return bytes(self.atr).hex(" ").upper()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyscard-2.2.0/src/smartcard/CardMonitoring.py new/pyscard-2.2.1/src/smartcard/CardMonitoring.py
--- old/pyscard-2.2.0/src/smartcard/CardMonitoring.py 2024-10-02 21:32:52.000000000 +0200
+++ new/pyscard-2.2.1/src/smartcard/CardMonitoring.py 2025-01-07 21:43:07.000000000 +0100
@@ -157,7 +157,7 @@
"""Runs until stopEvent is notified, and notify
observers of all card insertion/removal.
"""
- self.cardrequest = CardRequest(timeout=10)
+ self.cardrequest = CardRequest(timeout=60)
while self.stopEvent.is_set() != 1:
try:
currentcards = self.cardrequest.waitforcardevent()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyscard-2.2.0/src/smartcard/pcsc/PCSCCardRequest.py new/pyscard-2.2.1/src/smartcard/pcsc/PCSCCardRequest.py
--- old/pyscard-2.2.0/src/smartcard/pcsc/PCSCCardRequest.py 2024-10-20 15:29:45.000000000 +0200
+++ new/pyscard-2.2.1/src/smartcard/pcsc/PCSCCardRequest.py 2025-01-07 21:43:07.000000000 +0100
@@ -302,7 +302,6 @@
"""Wait for card insertion or removal."""
AbstractCardRequest.waitforcardevent(self)
presentcards = []
- readerstates = {}
startDate = datetime.now()
eventfound = False
@@ -310,6 +309,9 @@
previous_readernames = self.getReaderNames()
while not eventfound:
+ # get states from previous run
+ readerstates = self.readerstates
+
# reinitialize at each iteration just in case a new reader appeared
_readernames = self.getReaderNames()
readernames = _readernames
@@ -318,35 +320,60 @@
# add PnP special reader
readernames.append("\\\\?PnP?\\Notification")
- readerstates = {}
- for reader in readernames:
- # create a dictionary entry for new readers
- readerstates[reader] = (reader, SCARD_STATE_UNAWARE)
-
- hresult, newstates = SCardGetStatusChange(
- self.hcontext, 0, list(readerstates.values())
- )
+ # first call?
+ if len(readerstates) == 0:
+ # init
+ for reader in readernames:
+ # create a dictionary entry for new readers
+ readerstates[reader] = (reader, SCARD_STATE_UNAWARE)
+
+ hresult, newstates = SCardGetStatusChange(
+ self.hcontext, 0, list(readerstates.values())
+ )
# check if a new reader with a card has just been connected
- for state in newstates:
- readername, eventstate, _ = state
+ for reader in _readernames:
+ # is the reader a new one?
+ if reader not in readerstates:
+ # create a dictionary entry for new reader
+ readerstates[reader] = (reader, SCARD_STATE_UNAWARE)
+
+ hresult, newstates = SCardGetStatusChange(
+ self.hcontext, 0, list(readerstates.values())
+ )
+
+ # added reader is the last one (index is -1)
+ _, state, _ = newstates[-1]
+ if state & SCARD_STATE_PRESENT:
+ eventfound = True
- # the reader is a new one
- if readername not in previous_readernames:
- if eventstate & SCARD_STATE_PRESENT:
+ # check if a reader has been removed
+ to_remove = []
+ for reader in readerstates:
+ if reader not in readernames:
+ _, state = readerstates[reader]
+ # was the card present?
+ if state & SCARD_STATE_PRESENT:
eventfound = True
+ to_remove.append(reader)
+
+ if to_remove:
+ for reader in to_remove:
+ # remove reader
+ del readerstates[reader]
+
+ # get newstates with new reader list
+ hresult, newstates = SCardGetStatusChange(
+ self.hcontext, 0, list(readerstates.values())
+ )
+
if eventfound:
break
- # update previous readers list
+ # update previous readers list (without PnP special reader)
previous_readernames = _readernames
- # update readerstate
- for state in newstates:
- readername, eventstate, atr = state
- readerstates[readername] = (readername, eventstate)
-
# wait for card insertion
self.readerstates = readerstates
waitThread = threading.Thread(target=self.getStatusChange)
@@ -401,31 +428,17 @@
for state in newstates:
readername, eventstate, atr = state
- # ignore Pnp reader
+ # ignore PnP reader
if readername == "\\\\?PnP?\\Notification":
continue
- _, oldstate = readerstates[readername]
-
- # the status can change on a card already inserted, e.g.
- # unpowered, in use, ... Clear the state changed bit if
- # the card was already inserted and is still inserted
- if (
- oldstate & SCARD_STATE_PRESENT
- and eventstate & (SCARD_STATE_CHANGED | SCARD_STATE_PRESENT)
- == SCARD_STATE_CHANGED | SCARD_STATE_PRESENT
- ):
- eventstate = eventstate & (0xFFFFFFFF ^ SCARD_STATE_CHANGED)
-
if eventstate & SCARD_STATE_CHANGED:
- if (
- # a reader or a card has been removed
- oldstate & SCARD_STATE_PRESENT
- or
- # a card has been inserted
- eventstate & SCARD_STATE_PRESENT
- ):
- eventfound = True
+ eventfound = True
+
+ # update readerstates for next SCardGetStatusChange() call
+ self.readerstates = {}
+ for reader, state, atr in newstates:
+ self.readerstates[reader] = (reader, state)
# return all the cards present
for state in newstates:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyscard-2.2.0/src/smartcard/scard/helpers.c new/pyscard-2.2.1/src/smartcard/scard/helpers.c
--- old/pyscard-2.2.0/src/smartcard/scard/helpers.c 2024-10-02 21:32:52.000000000 +0200
+++ new/pyscard-2.2.1/src/smartcard/scard/helpers.c 2025-01-07 21:43:07.000000000 +0100
@@ -309,7 +309,7 @@
if( NULL!=source )
{
#if (PY_MAJOR_VERSION >= 3) && defined(WIN32)
- pystr = PyUnicode_Decode( source, strlen(source), "cp1250" , NULL);
+ pystr = PyUnicode_DecodeLocale(source, NULL);
#else
pystr = PyString_FromString( source );
#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyscard-2.2.0/test/test_ATR.py new/pyscard-2.2.1/test/test_ATR.py
--- old/pyscard-2.2.0/test/test_ATR.py 2024-10-20 15:28:52.000000000 +0200
+++ new/pyscard-2.2.1/test/test_ATR.py 2024-10-20 22:35:42.000000000 +0200
@@ -1,3 +1,6 @@
+import re
+import textwrap
+
import pytest
from smartcard.ATR import ATR
@@ -7,142 +10,173 @@
def test_atr1(capsys):
atr = [0x3F, 0x65, 0x25, 0x00, 0x2C, 0x09, 0x69, 0x90, 0x00]
- data_out = """TB1: 25
-TC1: 0
-supported protocols T=0
-T=0 supported: True
-T=1 supported: False
-\tclock rate conversion factor: 372
-\tbit rate adjustment factor: 1
-\tmaximum programming current: 50
-\tprogramming voltage: 30
-\tguard time: 0
-nb of interface bytes: 2
-nb of historical bytes: 5
-"""
+ data_out = textwrap.dedent(
+ """\
+ TB1: 25
+ TC1: 0
+ supported protocols T=0
+ T=0 supported: True
+ T=1 supported: False
+ \tclock rate conversion factor: 372
+ \tbit rate adjustment factor: 1
+ \tmaximum programming current: 50
+ \tprogramming voltage: 30
+ \tguard time: 0
+ nb of interface bytes: 2
+ nb of historical bytes: 5
+ """
+ )
a = ATR(atr)
- a.dump()
+ with pytest.warns(DeprecationWarning, match=re.escape("print(ATR.render())")):
+ a.dump()
stdout, _ = capsys.readouterr()
assert stdout == data_out
def test_atr2(capsys):
atr = [0x3F, 0x65, 0x25, 0x08, 0x93, 0x04, 0x6C, 0x90, 0x00]
- data_out = """TB1: 25
-TC1: 8
-supported protocols T=0
-T=0 supported: True
-T=1 supported: False
-\tclock rate conversion factor: 372
-\tbit rate adjustment factor: 1
-\tmaximum programming current: 50
-\tprogramming voltage: 30
-\tguard time: 8
-nb of interface bytes: 2
-nb of historical bytes: 5
-"""
+ data_out = textwrap.dedent(
+ """\
+ TB1: 25
+ TC1: 8
+ supported protocols T=0
+ T=0 supported: True
+ T=1 supported: False
+ \tclock rate conversion factor: 372
+ \tbit rate adjustment factor: 1
+ \tmaximum programming current: 50
+ \tprogramming voltage: 30
+ \tguard time: 8
+ nb of interface bytes: 2
+ nb of historical bytes: 5
+ """
+ )
a = ATR(atr)
- a.dump()
-
+ with pytest.warns(DeprecationWarning, match=re.escape("print(ATR.render())")):
+ a.dump()
stdout, _ = capsys.readouterr()
assert stdout == data_out
def test_atr3(capsys):
atr = [0x3B, 0x16, 0x94, 0x7C, 0x03, 0x01, 0x00, 0x00, 0x0D]
- data_out = """TA1: 94
-supported protocols T=0
-T=0 supported: True
-T=1 supported: False
-\tclock rate conversion factor: 512
-\tbit rate adjustment factor: 8
-\tmaximum programming current: 50
-\tprogramming voltage: 5
-\tguard time: None
-nb of interface bytes: 1
-nb of historical bytes: 6
-"""
+ data_out = textwrap.dedent(
+ """\
+ TA1: 94
+ supported protocols T=0
+ T=0 supported: True
+ T=1 supported: False
+ \tclock rate conversion factor: 512
+ \tbit rate adjustment factor: 8
+ \tmaximum programming current: 50
+ \tprogramming voltage: 5
+ \tguard time: None
+ nb of interface bytes: 1
+ nb of historical bytes: 6
+ """
+ )
a = ATR(atr)
- a.dump()
+ with pytest.warns(DeprecationWarning, match=re.escape("print(ATR.render())")):
+ a.dump()
stdout, _ = capsys.readouterr()
assert stdout == data_out
def test_atr4(capsys):
atr = [0x3B, 0x65, 0x00, 0x00, 0x9C, 0x11, 0x01, 0x01, 0x03]
- data_out = """TB1: 0
-TC1: 0
-supported protocols T=0
-T=0 supported: True
-T=1 supported: False
-\tclock rate conversion factor: 372
-\tbit rate adjustment factor: 1
-\tmaximum programming current: 25
-\tprogramming voltage: 5
-\tguard time: 0
-nb of interface bytes: 2
-nb of historical bytes: 5
-"""
+ data_out = textwrap.dedent(
+ """\
+ TB1: 0
+ TC1: 0
+ supported protocols T=0
+ T=0 supported: True
+ T=1 supported: False
+ \tclock rate conversion factor: 372
+ \tbit rate adjustment factor: 1
+ \tmaximum programming current: 25
+ \tprogramming voltage: 5
+ \tguard time: 0
+ nb of interface bytes: 2
+ nb of historical bytes: 5
+ """
+ )
a = ATR(atr)
- a.dump()
+ with pytest.warns(DeprecationWarning, match=re.escape("print(ATR.render())")):
+ a.dump()
stdout, _ = capsys.readouterr()
assert stdout == data_out
def test_atr5(capsys):
atr = [0x3B, 0xE3, 0x00, 0xFF, 0x81, 0x31, 0x52, 0x45, 0xA1, 0xA2, 0xA3, 0x1B]
- data_out = """TB1: 0
-TC1: ff
-TD1: 81
-TD2: 31
-TA3: 52
-TB3: 45
-supported protocols T=1
-T=0 supported: False
-T=1 supported: True
-checksum: 27
-\tclock rate conversion factor: 372
-\tbit rate adjustment factor: 1
-\tmaximum programming current: 25
-\tprogramming voltage: 5
-\tguard time: 255
-nb of interface bytes: 6
-nb of historical bytes: 3
-"""
+ data_out = textwrap.dedent(
+ """\
+ TB1: 0
+ TC1: ff
+ TD1: 81
+ TD2: 31
+ TA3: 52
+ TB3: 45
+ supported protocols T=1
+ T=0 supported: False
+ T=1 supported: True
+ checksum: 27
+ \tclock rate conversion factor: 372
+ \tbit rate adjustment factor: 1
+ \tmaximum programming current: 25
+ \tprogramming voltage: 5
+ \tguard time: 255
+ nb of interface bytes: 6
+ nb of historical bytes: 3
+ """
+ )
a = ATR(atr)
- a.dump()
+ with pytest.warns(DeprecationWarning, match=re.escape("print(ATR.render())")):
+ a.dump()
stdout, _ = capsys.readouterr()
assert stdout == data_out
def test_atr6(capsys):
atr = [0x3B, 0xE5, 0x00, 0x00, 0x81, 0x21, 0x45, 0x9C, 0x10, 0x01, 0x00, 0x80, 0x0D]
- data_out = """TB1: 0
-TC1: 0
-TD1: 81
-TD2: 21
-TB3: 45
-supported protocols T=1
-T=0 supported: False
-T=1 supported: True
-checksum: 13
-\tclock rate conversion factor: 372
-\tbit rate adjustment factor: 1
-\tmaximum programming current: 25
-\tprogramming voltage: 5
-\tguard time: 0
-nb of interface bytes: 5
-nb of historical bytes: 5
-"""
- a = ATR(atr)
- a.dump()
+ data_out = textwrap.dedent(
+ """\
+ TB1: 0
+ TC1: 0
+ TD1: 81
+ TD2: 21
+ TB3: 45
+ supported protocols T=1
+ T=0 supported: False
+ T=1 supported: True
+ checksum: 13
+ \tclock rate conversion factor: 372
+ \tbit rate adjustment factor: 1
+ \tmaximum programming current: 25
+ \tprogramming voltage: 5
+ \tguard time: 0
+ nb of interface bytes: 5
+ nb of historical bytes: 5
+ """
+ )
+ a = ATR(atr)
+ with pytest.warns(DeprecationWarning, match=re.escape("print(ATR.render())")):
+ a.dump()
stdout, _ = capsys.readouterr()
assert stdout == data_out
-def test_atr_ts():
- atr = [0x42]
- with pytest.raises(SmartcardException):
+(a)pytest.mark.parametrize(
+ "ts",
+ (
+ pytest.param("0x42", id="numeric"),
+ pytest.param("0xaa", id="lowercase"),
+ pytest.param("0x00", id="zero padding"),
+ ),
+)
+def test_invalid_ts(ts: str):
+ atr = [int(ts[2:], 16), 0x00]
+ with pytest.raises(SmartcardException, match=f"invalid TS {ts}"):
ATR(atr)
@@ -172,3 +206,210 @@
"""
assert len(getattr(ATR, field)) == expected_length
+
+
+(a)pytest.mark.parametrize(
+ "atr,",
+ (
+ pytest.param([], id="ATR is too short (0 bytes)"),
+ pytest.param([0x3B], id="ATR is too short (1 byte, valid TS)"),
+ ),
+)
+def test_invalid_atr_lengths(atr: list[int]):
+ """Verify that short ATRs raise exceptions."""
+
+ with pytest.raises(SmartcardException, match="at least 2 bytes"):
+ ATR(atr)
+
+
+(a)pytest.mark.parametrize("ts", (0x3B, 0x3F))
+def test_2_bytes(ts):
+ """Verify that a completely empty ATR parses well."""
+
+ atr = ATR([ts, 0b0000_0000])
+ # |||| `-- no historical bytes
+ # |||`-- no TA
+ # ||`-- no TB
+ # |`-- no TC
+ # `-- no TD
+ assert atr.getTA1() is None
+ assert atr.getTB1() is None
+ assert atr.II is None
+ assert atr.PI1 is None
+ assert atr.getTC1() is None
+ assert atr.getTD1() is None
+ assert atr.getChecksum() is None
+ assert atr.getGuardTime() is None
+ assert atr.getHistoricalBytesCount() == 0
+ assert atr.getHistoricalBytes() == []
+ assert atr.getInterfaceBytesCount() == 0
+
+ # Default values
+ assert atr.getBitRateFactor() == 1
+ assert atr.getClockRateConversion() == 372
+ assert atr.getProgrammingCurrent() == 50
+ assert atr.getProgrammingVoltage() == 5
+
+ # Protocols
+ assert len(atr.getSupportedProtocols()) == 1
+ assert "T=0" in atr.getSupportedProtocols()
+ assert atr.isT0Supported() is True
+ assert atr.isT1Supported() is False
+ assert atr.isT15Supported() is False
+
+ # Rendering
+ expected_rendering = textwrap.dedent(
+ """\
+ supported protocols T=0
+ T=0 supported: True
+ T=1 supported: False
+ \tclock rate conversion factor: 372
+ \tbit rate adjustment factor: 1
+ \tmaximum programming current: 50
+ \tprogramming voltage: 5
+ \tguard time: None
+ nb of interface bytes: 0
+ nb of historical bytes: 0
+ """.rstrip()
+ )
+ assert atr.render() == expected_rendering
+
+ # Warnings
+ with pytest.warns(DeprecationWarning, match="ATR.TA"):
+ assert atr.hasTA == [False]
+ with pytest.warns(DeprecationWarning, match="ATR.TB"):
+ assert atr.hasTB == [False]
+ with pytest.warns(DeprecationWarning, match="ATR.TC"):
+ assert atr.hasTC == [False]
+ with pytest.warns(DeprecationWarning, match="ATR.TD"):
+ assert atr.hasTD == [False]
+
+
+def test_only_ta1():
+ """Verify that TA1 can be conveyed standalone."""
+
+ atr = ATR([0x3B, 0b0001_0000, 0xA7])
+ # `-- only enable TA
+ assert atr.TA == [0xA7]
+ assert "TA1: a7\n" in atr.render()
+ with pytest.warns(DeprecationWarning, match="ATR.TA"):
+ assert atr.hasTA == [True]
+ # TA1 affects these values
+ assert atr.getClockRateConversion() == 768
+ assert atr.getBitRateFactor() == 64
+ # Sanity check
+ assert atr.TB == atr.TC == atr.TD == [None]
+ assert atr.N is None
+ assert atr.getInterfaceBytesCount() == 1
+ assert atr.getHistoricalBytesCount() == 0
+ assert atr.hasChecksum is False
+ assert atr.checksumOK is None
+ assert atr.getChecksum() is None
+
+
+def test_only_tb1():
+ """Verify that TB1 can be conveyed standalone.
+
+ TB1 and TB2 are deprecated in ISO 7816-3 2006, so no values are checked here.
+ """
+
+ atr = ATR([0x3B, 0b0010_0000, 0b0_10_11111])
+ # `-- only enable TB
+ assert atr.TB == [0b0_10_11111]
+ assert "TB1: 5f\n" in atr.render()
+ with pytest.warns(DeprecationWarning, match="ATR.TB"):
+ assert atr.hasTB == [True]
+ # TB1 affects these values
+ assert atr.II == 0b10
+ assert atr.PI1 == 0b11111
+ assert atr.getProgrammingVoltage() != 5
+ assert atr.getProgrammingCurrent() != 50
+ # Sanity check
+ assert atr.TA == atr.TC == atr.TD == [None]
+ assert atr.N is None
+ assert atr.getInterfaceBytesCount() == 1
+ assert atr.getHistoricalBytesCount() == 0
+ assert atr.hasChecksum is False
+ assert atr.checksumOK is None
+ assert atr.getChecksum() is None
+
+
+def test_only_tc1():
+ """Verify that TC1 can be conveyed standalone."""
+
+ atr = ATR([0x3B, 0b0100_0000, 0xC1])
+ # `-- only enable TC
+ assert atr.TC == [0xC1]
+ assert "TC1: c1\n" in atr.render()
+ with pytest.warns(DeprecationWarning, match="ATR.TC"):
+ assert atr.hasTC == [True]
+ # TC1 affects these values
+ assert atr.N == 0xC1
+ # Sanity check
+ assert atr.TA == atr.TB == atr.TD == [None]
+ assert atr.getInterfaceBytesCount() == 1
+ assert atr.getHistoricalBytesCount() == 0
+ assert atr.hasChecksum is False
+ assert atr.checksumOK is None
+ assert atr.getChecksum() is None
+
+
+def test_only_td1():
+ """Verify that TD1 can be conveyed standalone."""
+
+ atr = ATR([0x3B, 0b1000_0000, 0x00])
+ # `-- only enable TD
+ assert atr.TD == [0x00, None]
+ assert atr.isT0Supported() is True
+ assert atr.isT1Supported() is False
+ assert atr.isT15Supported() is False
+ assert "TD1: 0\n" in atr.render()
+ with pytest.warns(DeprecationWarning, match="ATR.TD"):
+ assert atr.hasTD == [True, False]
+ # Sanity check
+ assert atr.TA == atr.TB == atr.TC == [None, None]
+ assert atr.N is None
+ assert atr.getHistoricalBytesCount() == 0
+ assert atr.hasChecksum is False
+ assert atr.checksumOK is None
+ assert atr.getChecksum() is None
+
+
+def test_historical_bytes():
+ """Verify that historical bytes can be conveyed standalone."""
+
+ atr = ATR([0x3B, 0x0F, *list(range(15))])
+ # `-- indicate 15 historical bytes
+ assert atr.K == 15
+ assert atr.getHistoricalBytesCount() == 15
+ assert atr.getHistoricalBytes() == list(range(15))
+ # Sanity check
+ assert atr.TA == atr.TB == atr.TC == atr.TD == [None]
+ assert atr.N is None
+ assert atr.hasChecksum is False
+ assert atr.checksumOK is None
+ assert atr.getChecksum() is None
+
+
+(a)pytest.mark.parametrize("ts", (0x3B, 0x3F))
+(a)pytest.mark.parametrize("atr_bytes", ([0x00, 0x00], [0x1, 0xFE, 0xFF]))
+def test_valid_checksums(ts, atr_bytes):
+ """Verify behavior of valid checksums."""
+
+ atr = ATR([ts] + atr_bytes)
+ assert atr.hasChecksum is True
+ assert atr.checksumOK is True
+ assert atr.getChecksum() == atr_bytes[-1]
+ assert f"checksum: {atr_bytes[-1]}\n" in atr.render()
+
+
+(a)pytest.mark.parametrize("ts", (0x3B, 0x3F))
+(a)pytest.mark.parametrize("atr_bytes", ([0x00, 0x01], [0x01, 0xFE, 0x0]))
+def test_invalid_checksums(ts, atr_bytes):
+ """Verify behavior of invalid checksums."""
+
+ atr = ATR([ts] + atr_bytes)
+ assert atr.hasChecksum is True
+ assert atr.checksumOK is False
+ assert atr.getChecksum() == atr_bytes[-1]
+ assert f"checksum: {atr_bytes[-1]:x}\n" in atr.render()
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ibus-typing-booster for openSUSE:Factory checked in at 2025-01-15 17:43:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ibus-typing-booster (Old)
and /work/SRC/openSUSE:Factory/.ibus-typing-booster.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ibus-typing-booster"
Wed Jan 15 17:43:44 2025 rev:141 rq:1237938 version:2.27.8
Changes:
--------
--- /work/SRC/openSUSE:Factory/ibus-typing-booster/ibus-typing-booster.changes 2025-01-09 15:12:07.799977950 +0100
+++ /work/SRC/openSUSE:Factory/.ibus-typing-booster.new.1881/ibus-typing-booster.changes 2025-01-15 17:43:52.658365894 +0100
@@ -1,0 +2,8 @@
+Tue Jan 14 20:32:40 UTC 2025 - maiku.fabian(a)gmail.com
+
+- Update to 2.27.8
+- Make code to support multiple m17n candidates better readable using a NamedTuple
+ (Related: https://github.com/mike-fabian/ibus-typing-booster/issues/523)
+- Translation update from Weblate (it 100%, pt 94.4%)
+
+-------------------------------------------------------------------
Old:
----
ibus-typing-booster-2.27.7.tar.gz
New:
----
ibus-typing-booster-2.27.8.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ibus-typing-booster.spec ++++++
--- /var/tmp/diff_new_pack.RidN6q/_old 2025-01-15 17:43:53.478399847 +0100
+++ /var/tmp/diff_new_pack.RidN6q/_new 2025-01-15 17:43:53.482400012 +0100
@@ -17,7 +17,7 @@
Name: ibus-typing-booster
-Version: 2.27.7
+Version: 2.27.8
Release: 0
Summary: An input completion utility
License: GPL-3.0-or-later
++++++ ibus-typing-booster-2.27.7.tar.gz -> ibus-typing-booster-2.27.8.tar.gz ++++++
/work/SRC/openSUSE:Factory/ibus-typing-booster/ibus-typing-booster-2.27.7.tar.gz /work/SRC/openSUSE:Factory/.ibus-typing-booster.new.1881/ibus-typing-booster-2.27.8.tar.gz differ: char 18, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package gdu for openSUSE:Factory checked in at 2025-01-15 17:43:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gdu (Old)
and /work/SRC/openSUSE:Factory/.gdu.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gdu"
Wed Jan 15 17:43:36 2025 rev:4 rq:1237926 version:5.30.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/gdu/gdu.changes 2024-12-20 23:12:40.773566512 +0100
+++ /work/SRC/openSUSE:Factory/.gdu.new.1881/gdu.changes 2025-01-15 17:43:39.849835563 +0100
@@ -1,0 +2,45 @@
+Tue Jan 14 17:21:50 UTC 2025 - Jeff Kowalczyk <jkowalczyk(a)suse.com>
+
+- Packaging improvements:
+ * Use a BUILD_DATE suitable to preserve reproducible builds
+ * BUILD_DATE is used in bespoke LDFLAGS arg to go build expected
+ by gdu --version output
+
+-------------------------------------------------------------------
+Tue Jan 14 05:56:02 UTC 2025 - Jeff Kowalczyk <jkowalczyk(a)suse.com>
+
+- Packaging improvements:
+ * Update to BuildRequires: golang(API) >= 1.21 matching go.mod
+ * Move ldflags metadata out of ppc64 buildmode PIE conditional
+
+-------------------------------------------------------------------
+Tue Dec 31 17:10:40 UTC 2024 - RN <R_Nik_C(a)proton.me>
+
+- Version 5.30.1
+ * fix: set default colors when config file does not exist
+- Version 5.30.0
+ * feat: show top largest files using `-t` or `--top` option in
+ (gh#dundee/gdu#391)
+ * feat: introduce more style options in (gh#dundee/gdu#396)
+
+-------------------------------------------------------------------
+Tue Dec 24 11:25:43 UTC 2024 - Timo Schwaak <opensuse(a)tschwaak.de>
+
+- gdu version output is incomplete when built with normal go build.
+ Add ldflags to populate metadata needed by bespoke version
+ reporting implementation. Changelog comments by Jeff Kowalczyk:
+ * gdu --version ouput with package version 5.29.0:
+ Version: development
+ Built time:
+ Built user:
+ * Upstream code has a package build/build.go with an
+ implementation managng the above output.
+ * Generally we want to remove uses of ldflags for bespoke build
+ metadata where possible. In this case, give gdu what it
+ expects for now.
+ * go1.24+ will have better main module version information in
+ output of go version -m binaryname. Perhaps that facility and
+ contacting gdu upstream about the issue will allow us to remove
+ the ldflags usage from our packaging in the future.
+
+-------------------------------------------------------------------
@@ -9 +53,0 @@
-
Old:
----
gdu-5.29.0.tar.gz
New:
----
gdu-5.30.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ gdu.spec ++++++
--- /var/tmp/diff_new_pack.JoKLDm/_old 2025-01-15 17:43:41.885919866 +0100
+++ /var/tmp/diff_new_pack.JoKLDm/_new 2025-01-15 17:43:41.897920363 +0100
@@ -1,7 +1,7 @@
#
# spec file for package gdu
#
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: gdu
-Version: 5.29.0
+Version: 5.30.1
Release: 0
Summary: Fast disk usage analyzer with console interface
License: MIT
@@ -26,7 +26,7 @@
Source1: vendor.tar.zstd
BuildRequires: gzip
BuildRequires: zstd
-BuildRequires: golang(API) >= 1.20
+BuildRequires: golang(API) >= 1.21
%description
Fast disk usage analyzer with console interface. Gdu is intended
@@ -41,7 +41,13 @@
%ifnarch ppc64
export GOFLAGS="-buildmode=pie"
%endif
-go build ./cmd/%{name}
+# construct a BUILD_DATE compatible with reproducible builds
+DATE_FMT="+%%Y-%%m-%%dT%%H:%%M:%%SZ"
+BUILD_DATE=$(date -u -d "@${SOURCE_DATE_EPOCH}" "${DATE_FMT}" 2>/dev/null || date -u -r "${SOURCE_DATE_EPOCH}" "${DATE_FMT}" 2>/dev/null || date -u "${DATE_FMT}")
+# populate LDFLAGS -X metadata for bespoke gdu version output
+# Not best practice for Go apps but gdu assumes this data is present
+LDFLAGS="-X github.com/dundee/gdu/v5/build.Version=%{version} -X 'github.com/dundee/gdu/v5/build.Time=${BUILD_DATE}' -X github.com/dundee/gdu/v5/build.User=OBS"
+go build -ldflags "$LDFLAGS" ./cmd/%{name}
# compress upstream provided man page
gzip %{name}.1
++++++ gdu-5.29.0.tar.gz -> gdu-5.30.1.tar.gz ++++++
++++ 1754 lines of diff (skipped)
++++++ vendor.tar.zstd ++++++
Binary files /var/tmp/diff_new_pack.JoKLDm/_old and /var/tmp/diff_new_pack.JoKLDm/_new differ
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package matrix-synapse for openSUSE:Factory checked in at 2025-01-15 17:43:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/matrix-synapse (Old)
and /work/SRC/openSUSE:Factory/.matrix-synapse.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "matrix-synapse"
Wed Jan 15 17:43:19 2025 rev:119 rq:1237892 version:1.122.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/matrix-synapse/matrix-synapse.changes 2024-12-11 21:10:20.660012879 +0100
+++ /work/SRC/openSUSE:Factory/.matrix-synapse.new.1881/matrix-synapse.changes 2025-01-15 17:43:23.217146896 +0100
@@ -1,0 +2,75 @@
+Tue Jan 14 17:11:47 UTC 2025 - Marcus Rueckert <mrueckert(a)suse.de>
+
+- Update to 1.122.0
+ Please note that this version of Synapse drops support for
+ PostgreSQL 11 and 12. The minimum version of PostgreSQL supported
+ is now version 13.
+
+ - Deprecations and Removals
+ - Remove support for PostgreSQL 11 and 12. Contributed by @clokep. (#18034)
+ - Features
+ - Added the email.tlsname config option. This allows specifying
+ the domain name used to validate the SMTP server's TLS
+ certificate separately from the email.smtp_host to connect
+ to. (#17849)
+ - Module developers will have access to the user ID of the
+ requester when adding check_username_for_spam callbacks to
+ spam_checker_module_callbacks. Contributed by
+ Wilson(a)Pangea.chat. (#17916)
+ - Add endpoints to the Admin API to fetch the number of invites
+ the provided user has sent after a given timestamp, fetch the
+ number of rooms the provided user has joined after a given
+ timestamp, and get report IDs of event reports against a
+ provided user (i.e. where the user was the sender of the
+ reported event). (#17948)
+ - Support stable account suspension from MSC3823. (#17964)
+ - Add macaroon_secret_key_path config option. (#17983)
+ - Bugfixes
+ - Fix bug when rejecting withdrew invite with a
+ third_party_rules module, where the invite would be stuck for
+ the client. (#17930)
+ - Properly purge state groups tables when purging a room with
+ the Admin API. (#18024)
+ - Fix a bug preventing the admin redaction endpoint from
+ working on messages from remote users. (#18029, #18043)
+ - Improved Documentation
+ - Update synapse.app.generic_worker documentation to only
+ recommend GET requests for stream writer routes by default,
+ unless the worker is also configured as a stream writer.
+ Contributed by @evoL. (#17954)
+ - Add documentation for the previously-undocumented
+ last_seen_ts query parameter to the query user Admin API.
+ (#17976)
+ - Improve documentation for the TaskScheduler class. (#17992)
+ - Fix example in reverse proxy docs to include server port.
+ (#17994)
+ - Update Alpine Linux Synapse Package Maintainer within the
+ installation instructions. (#17846)
+ - Internal Changes
+ - Add RoomID & EventID rust types. (#17996)
+ - Fix various type errors across the codebase. (#17998)
+ - Disable DB statement timeout when doing a room purge since it
+ can be quite long. (#18017)
+ - Remove some remaining uses of
+ twisted.internet.defer.returnValue. Contributed by Colin
+ Watson. (#18020)
+ - Refactor get_profile to no longer include fields with a value
+ of None. (#18063)
+ - Updates to locked dependencies
+ - Bump anyhow from 1.0.93 to 1.0.95. (#18012, #18045)
+ - Bump authlib from 1.3.2 to 1.4.0. (#18048)
+ - Bump dawidd6/action-download-artifact from 6 to 7. (#17981)
+ - Bump http from 1.1.0 to 1.2.0. (#18013)
+ - Bump mypy from 1.11.2 to 1.12.1. (#17999)
+ - Bump mypy-zope from 1.0.8 to 1.0.9. (#18047)
+ - Bump pillow from 10.4.0 to 11.0.0. (#18015)
+ - Bump pydantic from 2.9.2 to 2.10.3. (#18014)
+ - Bump pyicu from 2.13.1 to 2.14. (#18060)
+ - Bump pyo3 from 0.23.2 to 0.23.3. (#18001)
+ - Bump python-multipart from 0.0.16 to 0.0.18. (#17985)
+ - Bump sentry-sdk from 2.17.0 to 2.19.2. (#18061)
+ - Bump serde from 1.0.215 to 1.0.217. (#18031, #18059)
+ - Bump serde_json from 1.0.133 to 1.0.134. (#18044)
+ - Bump twine from 5.1.1 to 6.0.1. (#18049)
+
+-------------------------------------------------------------------
Old:
----
matrix-synapse-1.121.0.obscpio
New:
----
matrix-synapse-1.122.0.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ matrix-synapse-test.spec ++++++
--- /var/tmp/diff_new_pack.6DQGy9/_old 2025-01-15 17:43:25.357235506 +0100
+++ /var/tmp/diff_new_pack.6DQGy9/_new 2025-01-15 17:43:25.357235506 +0100
@@ -1,7 +1,7 @@
#
# spec file for package matrix-synapse-test
#
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -27,7 +27,7 @@
%define pkgname matrix-synapse
Name: %{pkgname}-test
-Version: 1.121.0
+Version: 1.122.0
Release: 0
Summary: Test package for %{pkgname}
License: AGPL-3.0-or-later
++++++ matrix-synapse.spec ++++++
--- /var/tmp/diff_new_pack.6DQGy9/_old 2025-01-15 17:43:25.389236831 +0100
+++ /var/tmp/diff_new_pack.6DQGy9/_new 2025-01-15 17:43:25.389236831 +0100
@@ -1,7 +1,7 @@
#
# spec file for package matrix-synapse
#
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -22,7 +22,7 @@
%if %{with use_poetry_for_dependencies}
%global Twisted_version 24.7.0
%global Jinja2_version 3.1.4
-%global Pillow_version 10.4.0
+%global Pillow_version 11.0.0
%global PyYAML_version 6.0.2
%global attrs_version 23.2.0
%global bcrypt_version 4.2.0
@@ -58,9 +58,11 @@
%global packaging_version 24.0
%global psycopg2_version 2.9.9
%global pysaml2_version 7.5.0
+# TODO: 1.4.0
%global Authlib_version 1.3.2
%global lxml_version 5.3.0
-%global sentry_sdk_version 2.13.0
+# TODO: 2.19.2
+%global sentry_sdk_version 2.19.0
%global PyJWT_version 2.6.0
%global jaeger_client_version 4.8.0
%global opentracing_version 2.4.0
@@ -154,7 +156,7 @@
%define pkgname matrix-synapse
%define eggname matrix_synapse
Name: %{pkgname}
-Version: 1.121.0
+Version: 1.122.0
Release: 0
Summary: Matrix protocol reference homeserver
License: AGPL-3.0-or-later
++++++ _service ++++++
--- /var/tmp/diff_new_pack.6DQGy9/_old 2025-01-15 17:43:25.449239315 +0100
+++ /var/tmp/diff_new_pack.6DQGy9/_new 2025-01-15 17:43:25.453239481 +0100
@@ -4,11 +4,11 @@
<param name="versionformat">@PARENT_TAG@</param>
<param name="url">https://github.com/element-hq/synapse.git</param>
<param name="scm">git</param>
- <param name="revision">v1.121.0</param>
+ <param name="revision">v1.122.0</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="versionrewrite-replacement">\1</param>
<!--
- <param name="revision">v1.122.0rc1</param>
+ <param name="revision">v1.123.0rc1</param>
<param name="versionrewrite-pattern">v([\.\d]+)(rc.*)</param>
<param name="versionrewrite-replacement">\1~\2</param>
-->
++++++ matrix-synapse-1.121.0.obscpio -> matrix-synapse-1.122.0.obscpio ++++++
/work/SRC/openSUSE:Factory/matrix-synapse/matrix-synapse-1.121.0.obscpio /work/SRC/openSUSE:Factory/.matrix-synapse.new.1881/matrix-synapse-1.122.0.obscpio differ: char 49, line 1
++++++ matrix-synapse.obsinfo ++++++
--- /var/tmp/diff_new_pack.6DQGy9/_old 2025-01-15 17:43:25.517242131 +0100
+++ /var/tmp/diff_new_pack.6DQGy9/_new 2025-01-15 17:43:25.521242296 +0100
@@ -1,5 +1,5 @@
name: matrix-synapse
-version: 1.121.0
-mtime: 1733926839
-commit: 737f6c73f7ccb611c271fd568a6af0a7c705619d
+version: 1.122.0
+mtime: 1736864615
+commit: 5c736cd2af3eb9e1264d439c274d608f6ffc6a83
++++++ vendor.tar.zst ++++++
++++ 787983 lines of diff (skipped)
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package nethack for openSUSE:Factory checked in at 2025-01-15 17:42:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/nethack (Old)
and /work/SRC/openSUSE:Factory/.nethack.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "nethack"
Wed Jan 15 17:42:59 2025 rev:5 rq:1237881 version:3.4.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/nethack/nethack.changes 2025-01-09 15:11:21.958079049 +0100
+++ /work/SRC/openSUSE:Factory/.nethack.new.1881/nethack.changes 2025-01-15 17:43:02.296280680 +0100
@@ -1,0 +2,41 @@
+Mon Jan 13 17:02:12 UTC 2025 - Thomas Zimmermann <tzimmermann(a)suse.com>
+
+- Add an interesting and meaningful description to the package.
+
+- Clarify package summary.
+
+- Link to HTTPS URL.
+
+-------------------------------------------------------------------
+Sun Jan 12 16:48:36 UTC 2025 - Thomas Zimmermann <tzimmermann(a)suse.com>
+
+- Filter no-%check-section rpmlint warnings. There are no test cases
+ for NetHack. (W: no-%check-section)
+
+-------------------------------------------------------------------
+Sun Jan 12 16:43:56 UTC 2025 - Thomas Zimmermann <tzimmermann(a)suse.com>
+
+- Filter zero-length rpmlint warnings. Several files are required to
+ by empty. Filter them from the RPM linter. (E: zero-length)
+
+-------------------------------------------------------------------
+Sun Jan 12 16:30:02 UTC 2025 - Thomas Zimmermann <tzimmermann(a)suse.com>
+
+- Do not install documentation files. We package these files from the
+ dource directory No need to copy them into the build root.
+
+-------------------------------------------------------------------
+Sat Jan 11 17:16:16 UTC 2025 - Thomas Zimmermann <tzimmermann(a)suse.com>
+
+- Set file attributes in %files section. It is not possible to use
+ 'make install' for this package, so we have to install all files
+ manually. Resolve the hodgepotch of install and %attr commands by
+ setting all file attributes in the %files section.
+
+-------------------------------------------------------------------
+Sat Jan 11 17:13:02 UTC 2025 - Thomas Zimmermann <tzimmermann(a)suse.com>
+
+- Do not install /etc/nethack directory. We do not packaged it and it
+ does not contain any files.
+
+-------------------------------------------------------------------
New:
----
nethack-rpmlintrc
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ nethack.spec ++++++
--- /var/tmp/diff_new_pack.v33dLW/_old 2025-01-15 17:43:04.644377902 +0100
+++ /var/tmp/diff_new_pack.v33dLW/_new 2025-01-15 17:43:04.656378399 +0100
@@ -19,11 +19,12 @@
Name: nethack
Version: 3.4.3
Release: 0
-Summary: Character Based RPG
+Summary: Turn-based role-playing game
License: NGPL
Group: Amusements/Games/RPG
-URL: http://www.nethack.org/
+URL: https://www.nethack.org
Source0: nethack-343-src.tar.bz2
+Source1: nethack-rpmlintrc
# PATCH-FIX-OPENSUSE nethack-config.patch Adapt build to openSUSE systems
Patch0: nethack-config.patch
# PATCH-FIX-OPENSUSE nethack-decl.patch Do not redeclare system interfaces
@@ -47,8 +48,10 @@
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
-This RPG is somewhat cryptic with its character based output. But a
-true fan knows and appreciates its complexity and possibilities.
+NetHack is a turn-based role-playing game with complex game mechanics.
+Descent into the Maze of Menace and retrieve the Amulet of Yendor. Play
+as different character classes, such as fighter, wizard, rogue and others.
+Persist against various monsters and defeat the Wizard of Yendor.
This package contains the text interface.
@@ -93,32 +96,25 @@
install -d %{buildroot}%{_datadir}/games/nethack
install -d %{buildroot}/%{_mandir}/man6/
# game directory
-install -m 775 -d %{buildroot}%{_localstatedir}/games/nethack/
-install -m 775 -d %{buildroot}%{_localstatedir}/games/nethack/save/
+install -d %{buildroot}%{_localstatedir}/games/nethack/
+install -d %{buildroot}%{_localstatedir}/games/nethack/save/
for file in logfile paniclog perm record ; do
touch %{buildroot}%{_localstatedir}/games/nethack/$file
- chmod 0664 %{buildroot}%{_localstatedir}/games/nethack/$file
done
# binaries
-install -m 2755 src/nethack %{buildroot}%{_prefix}/lib/nethack/
+install src/nethack %{buildroot}%{_prefix}/lib/nethack/
# options
-install -m 644 dat/options %{buildroot}%{_prefix}/lib/nethack/
+install dat/options %{buildroot}%{_prefix}/lib/nethack/
# man pages
-install -m 644 doc/{nethack,lev_comp,dlb,dgn_comp,recover}.6 %{buildroot}/%{_mandir}/man6/
-# doc
-install -d %{buildroot}/%{_docdir}/nethack
-install doc/fixes* %{buildroot}/%{_docdir}/nethack
-install doc/Guidebook.{ps,txt} %{buildroot}/%{_docdir}/nethack
+install doc/{nethack,lev_comp,dlb,dgn_comp,recover}.6 %{buildroot}/%{_mandir}/man6/
# common data
-install -m0644 dat/nhdat %{buildroot}%{_datadir}/games/nethack/
-install -m0644 dat/license %{buildroot}%{_datadir}/games/nethack/
-# configs
-install -m0755 -d %{buildroot}%{_sysconfdir}/nethack
+install dat/nhdat %{buildroot}%{_datadir}/games/nethack/
+install dat/license %{buildroot}%{_datadir}/games/nethack/
# main launcher script
install -d %{buildroot}%{_bindir}
-install -m0755 sys/unix/nethack.sh %{buildroot}%{_bindir}/nethack
+install sys/unix/nethack.sh %{buildroot}%{_bindir}/nethack
# utils
-install -m 755 util/{dgn_comp,dlb,lev_comp,makedefs,recover} %{buildroot}%{_prefix}/lib/nethack/
+install util/{dgn_comp,dlb,lev_comp,makedefs,recover} %{buildroot}%{_prefix}/lib/nethack/
%fdupes -s %{buildroot}%{_datadir}/games/nethack/license
@@ -129,26 +125,28 @@
%verify_permissions -e /usr/lib/nethack/nethack
%files
+%defattr(0644,root,root)
%license dat/license
%doc doc/fixes*
%doc doc/Guidebook.ps
%doc doc/Guidebook.txt
-%defattr(-,root,root)
-%verify(not mode) %attr(0755,games,games) %{_prefix}/lib/nethack/nethack
-%{_prefix}/lib/nethack/options
-%dir %{_prefix}/lib/nethack
-%{_datadir}/games/nethack
-%{_prefix}/lib/nethack/dgn_comp
-%{_prefix}/lib/nethack/dlb
-%{_prefix}/lib/nethack/lev_comp
-%{_prefix}/lib/nethack/makedefs
-%{_prefix}/lib/nethack/recover
+%attr(0755,-,-) %{_bindir}/nethack
%{_mandir}/man6/*
+%dir %{_datadir}/games/nethack
+%{_datadir}/games/nethack/license
+%{_datadir}/games/nethack/nhdat
+%dir %{_prefix}/lib/nethack
+%attr(0755,-,-) %{_prefix}/lib/nethack/dgn_comp
+%attr(0755,-,-) %{_prefix}/lib/nethack/dlb
+%attr(0755,-,-) %{_prefix}/lib/nethack/lev_comp
+%attr(0755,-,-) %{_prefix}/lib/nethack/makedefs
+%attr(0755,-,-) %{_prefix}/lib/nethack/nethack
+%attr(0755,-,-) %{_prefix}/lib/nethack/recover
+%{_prefix}/lib/nethack/options
%dir %attr(0770,games,games) %{_localstatedir}/games/nethack
%dir %attr(0770,games,games) %{_localstatedir}/games/nethack/save
%config(noreplace) %attr(0660,games,games) %{_localstatedir}/games/nethack/logfile
%config(noreplace) %attr(0660,games,games) %{_localstatedir}/games/nethack/paniclog
%config(noreplace) %attr(0660,games,games) %{_localstatedir}/games/nethack/record
%attr(0660,games,games) %{_localstatedir}/games/nethack/perm
-%{_bindir}/nethack
++++++ nethack-rpmlintrc ++++++
# no testsuite available
addFilter("no-%check-section")
# empty files required in package
addFilter("zero-length /var/games/nethack/logfile")
addFilter("zero-length /var/games/nethack/paniclog")
addFilter("zero-length /var/games/nethack/perm")
addFilter("zero-length /var/games/nethack/record")
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python3-pyside6 for openSUSE:Factory checked in at 2025-01-15 17:42:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python3-pyside6 (Old)
and /work/SRC/openSUSE:Factory/.python3-pyside6.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python3-pyside6"
Wed Jan 15 17:42:44 2025 rev:39 rq:1237713 version:6.8.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python3-pyside6/python3-pyside6.changes 2024-11-14 16:09:23.096521203 +0100
+++ /work/SRC/openSUSE:Factory/.python3-pyside6.new.1881/python3-pyside6.changes 2025-01-15 17:42:49.751761281 +0100
@@ -1,0 +2,10 @@
+Tue Jan 14 09:31:54 UTC 2025 - Christophe Marin <christophe(a)krop.fr>
+
+- Update to 6.8.1.1. Check the installed changes-6.8.1 file for the
+ full list of changes
+- Drop patches, merged upstream:
+ * 0001-PySide6-Documentation-Name-the-.rst-doc-files-accord.patch
+ * 0001-build-Install-module-doc-snippet-files.patch
+- Drop 0001-signature-Fix-pointers-to-signature-bytes-with-the-h.patch
+
+-------------------------------------------------------------------
Old:
----
0001-PySide6-Documentation-Name-the-.rst-doc-files-accord.patch
0001-build-Install-module-doc-snippet-files.patch
0001-signature-Fix-pointers-to-signature-bytes-with-the-h.patch
pyside-setup-everywhere-src-6.8.0.tar.xz
New:
----
pyside-setup-everywhere-src-6.8.1.1.tar.xz
BETA DEBUG BEGIN:
Old:- Drop patches, merged upstream:
* 0001-PySide6-Documentation-Name-the-.rst-doc-files-accord.patch
* 0001-build-Install-module-doc-snippet-files.patch
Old: * 0001-PySide6-Documentation-Name-the-.rst-doc-files-accord.patch
* 0001-build-Install-module-doc-snippet-files.patch
- Drop 0001-signature-Fix-pointers-to-signature-bytes-with-the-h.patch
Old: * 0001-build-Install-module-doc-snippet-files.patch
- Drop 0001-signature-Fix-pointers-to-signature-bytes-with-the-h.patch
BETA DEBUG END:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python3-pyside6.spec ++++++
--- /var/tmp/diff_new_pack.W6XFMG/_old 2025-01-15 17:42:51.027814115 +0100
+++ /var/tmp/diff_new_pack.W6XFMG/_new 2025-01-15 17:42:51.031814281 +0100
@@ -17,7 +17,7 @@
%define tar_name pyside-setup-everywhere-src
-%define short_version 6.8.0
+%define tar_version 6.8.1.1
%global flavor @BUILD_FLAVOR@%{nil}
%if "%flavor" == ""
@@ -43,21 +43,16 @@
%endif
Name: %{mypython}-%{pyside_flavor}
-Version: 6.8.0.2
+Version: 6.8.1
Release: 0
Summary: Python bindings for Qt 6
License: LGPL-3.0-only OR (GPL-2.0-only OR GPL-3.0-or-later) AND GPL-2.0-only AND GPL-3.0-only WITH Qt-GPL-exception-1.0
URL: https://www.qt.io
-Source: https://download.qt.io/official_releases/QtForPython/pyside6/PySide6-%{vers…
+Source: https://download.qt.io/official_releases/QtForPython/pyside6/PySide6-%{vers…
# PATCH-FIX-OPENSUSE
Patch0: 0001-Always-link-to-python-libraries.patch
# PATCH-FIX-UPSTREAM https://codereview.qt-project.org/c/pyside/pyside-setup/+/567559
Patch1: fix-pytest-qt.patch
-# PATCH-FIX-UPSTREAM
-Patch2: 0001-signature-Fix-pointers-to-signature-bytes-with-the-h.patch
-# PATCH-FIX-UPSTREAM
-Patch3: 0001-PySide6-Documentation-Name-the-.rst-doc-files-accord.patch
-Patch4: 0001-build-Install-module-doc-snippet-files.patch
# SECTION common_dependencies
BuildRequires: clang-devel
BuildRequires: %{mypython}-Sphinx
@@ -76,10 +71,7 @@
# /SECTION
%if "%{pyside_flavor}" == "pyside6"
# For the registry_existence test
-%if 0%{?suse_version} > 1500 || 0%{?sle_version} > 150500
-# Not available in 15.5
BuildRequires: %{mypython}-distro
-%endif
BuildRequires: %{mypython}-shiboken6-devel = %{version}
# SECTION test_dependencies
BuildRequires: Mesa-dri
@@ -169,7 +161,7 @@
Python bindings for the Qt cross-platform application and UI framework
%prep
-%autosetup -p1 -n %{tar_name}-%{short_version}
+%autosetup -p1 -n %{tar_name}-%{version}
# Restore 6.6.1 RPATH value. rpmlint will complain otherwise
sed -i 's#${base}/../shiboken6/##' sources/pyside6/CMakeLists.txt
@@ -270,10 +262,6 @@
%ifarch aarch64
ctest_exclude_regex="$ctest_exclude_regex|registry_existence_test|QtWebEngineCore_web_engine_custom_scheme|QtWebEngineCore_qwebenginecookiestore_test|pysidetest_new_inherited_functions_test|QtWidgets_bug_668|QtWidgets_bug_728"
%endif
-# python311-distro is unavailable in 15.5, skip registry_existence_test
-%if 0%{?sle_version} == 150500
-ctest_exclude_regex="$ctest_exclude_regex|registry_existence_test"
-%endif
%endif
pushd sources/%{pyside_flavor}
++++++ pyside-setup-everywhere-src-6.8.0.tar.xz -> pyside-setup-everywhere-src-6.8.1.1.tar.xz ++++++
/work/SRC/openSUSE:Factory/python3-pyside6/pyside-setup-everywhere-src-6.8.0.tar.xz /work/SRC/openSUSE:Factory/.python3-pyside6.new.1881/pyside-setup-everywhere-src-6.8.1.1.tar.xz differ: char 27, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package libeconf for openSUSE:Factory checked in at 2025-01-15 17:42:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libeconf (Old)
and /work/SRC/openSUSE:Factory/.libeconf.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libeconf"
Wed Jan 15 17:42:34 2025 rev:33 rq:1237365 version:0.7.7
Changes:
--------
--- /work/SRC/openSUSE:Factory/libeconf/libeconf.changes 2024-12-15 12:34:19.451052819 +0100
+++ /work/SRC/openSUSE:Factory/.libeconf.new.1881/libeconf.changes 2025-01-15 17:42:39.695344569 +0100
@@ -1,0 +2,6 @@
+Mon Jan 13 09:44:55 UTC 2025 - schubi(a)suse.com
+
+- Update to version 0.7.7:
+ * Additional fix for parsing empty config files (bsc#1234405).
+
+-------------------------------------------------------------------
python-libeconf.changes: same change
Old:
----
libeconf-0.7.6.tar.xz
New:
----
libeconf-0.7.7.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ libeconf.spec ++++++
--- /var/tmp/diff_new_pack.jVs7Kc/_old 2025-01-15 17:42:41.515420010 +0100
+++ /var/tmp/diff_new_pack.jVs7Kc/_new 2025-01-15 17:42:41.515420010 +0100
@@ -1,7 +1,7 @@
#
# spec file for package libeconf
#
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
%define lname libeconf0
Name: libeconf
-Version: 0.7.6
+Version: 0.7.7
Release: 0
Summary: Enhanced config file parser ala systemd
License: MIT
++++++ python-libeconf.spec ++++++
--- /var/tmp/diff_new_pack.jVs7Kc/_old 2025-01-15 17:42:41.543421170 +0100
+++ /var/tmp/diff_new_pack.jVs7Kc/_new 2025-01-15 17:42:41.547421336 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-libeconf
#
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
%{?sle15_python_module_pythons}
%define skip_python39 1
Name: python-libeconf
-Version: 0.7.6
+Version: 0.7.7
Release: 0
Summary: Python bindings for libeconf
License: MIT
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.jVs7Kc/_old 2025-01-15 17:42:41.615424154 +0100
+++ /var/tmp/diff_new_pack.jVs7Kc/_new 2025-01-15 17:42:41.619424320 +0100
@@ -1,7 +1,7 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/openSUSE/libeconf.git</param>
- <param name="changesrevision">acbf7e06de84ea289fd4d3dd189d7e36c49c09ae</param>
+ <param name="changesrevision">8d6e8917bc359823862225816a181f9f322a8d99</param>
</service>
</servicedata>
(No newline at EOF)
++++++ libeconf-0.7.6.tar.xz -> libeconf-0.7.7.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libeconf-0.7.6/CMakeLists.txt new/libeconf-0.7.7/CMakeLists.txt
--- old/libeconf-0.7.6/CMakeLists.txt 2024-12-13 13:28:58.000000000 +0100
+++ new/libeconf-0.7.7/CMakeLists.txt 2025-01-13 10:32:41.000000000 +0100
@@ -3,7 +3,7 @@
# Ensure built-in policies from CMake are used, (e.g. improved policies for macOS)
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
-project(libeconf VERSION 0.7.6
+project(libeconf VERSION 0.7.7
DESCRIPTION "Enhanced config file parser, which merges config files placed in several locations into one."
LANGUAGES C
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libeconf-0.7.6/NEWS new/libeconf-0.7.7/NEWS
--- old/libeconf-0.7.6/NEWS 2024-12-13 13:28:58.000000000 +0100
+++ new/libeconf-0.7.7/NEWS 2025-01-13 10:32:41.000000000 +0100
@@ -1,3 +1,6 @@
+Version 0.7.7
+* Additional fix for parsing empty config files (bsc#1234405).
+
Version 0.7.6
* Do not parse files with name "." and ".." (bsc#1234405).
* Fixed memory leak in econftool.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libeconf-0.7.6/lib/libeconf.c new/libeconf-0.7.7/lib/libeconf.c
--- old/libeconf-0.7.6/lib/libeconf.c 2024-12-13 13:28:58.000000000 +0100
+++ new/libeconf-0.7.7/lib/libeconf.c 2025-01-13 10:32:41.000000000 +0100
@@ -293,6 +293,14 @@
(*merged_file)->delimiter = usr_file->delimiter;
(*merged_file)->comment = usr_file->comment;
(*merged_file)->path = NULL;
+ (*merged_file)->length = 0;
+ (*merged_file)->alloc_length = 0;
+ (*merged_file)->file_entry = NULL;
+ if((etc_file->length + usr_file->length)<= 0) {
+ /* nothing to merge */
+ return ECONF_SUCCESS;
+ }
+
struct file_entry *fe =
malloc((etc_file->length + usr_file->length) * sizeof(struct file_entry));
if (fe == NULL)
@@ -316,7 +324,6 @@
etc_file, merge_length);
(*merged_file)->length = merge_length;
(*merged_file)->alloc_length = merge_length;
-
(*merged_file)->file_entry = fe;
return ECONF_SUCCESS;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libeconf-0.7.6/lib/mergefiles.c new/libeconf-0.7.7/lib/mergefiles.c
--- old/libeconf-0.7.6/lib/mergefiles.c 2024-12-13 13:28:58.000000000 +0100
+++ new/libeconf-0.7.7/lib/mergefiles.c 2025-01-13 10:32:41.000000000 +0100
@@ -214,8 +214,7 @@
*/
while (*double_key_files) {
char * compare_file = basename((*double_key_files)->path);
- if (strcmp(current_file, ".") != 0 && strcmp(current_file, "..") &&
- strcmp(current_file, compare_file) == 0) {
+ if (strcmp(current_file, compare_file) == 0) {
break;
}
double_key_files++;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libeconf-0.7.6/meson.build new/libeconf-0.7.7/meson.build
--- old/libeconf-0.7.6/meson.build 2024-12-13 13:28:58.000000000 +0100
+++ new/libeconf-0.7.7/meson.build 2025-01-13 10:32:41.000000000 +0100
@@ -7,7 +7,7 @@
'b_pie=true',
'warning_level=3',],
license : 'MIT',
- version : '0.7.6',
+ version : '0.7.7',
)
cc = meson.get_compiler('c')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libeconf-0.7.6/tests/meson.build new/libeconf-0.7.7/tests/meson.build
--- old/libeconf-0.7.6/tests/meson.build 2024-12-13 13:28:58.000000000 +0100
+++ new/libeconf-0.7.7/tests/meson.build 2025-01-13 10:32:41.000000000 +0100
@@ -140,6 +140,14 @@
c_args: ['-DTESTSDIR="' + testdir + 'tst-uapi-pam_env-data' + '"'], dependencies : libeconf_dep)
test('tst-uapi-pam_env', tst_uapi_pam_env_exe)
+tst_uapi_empty_dot_d_dir_exe = executable('tst-uapi-empty_dot_d_dir', 'tst-uapi-empty_dot_d_dir.c',
+ c_args: ['-DTESTSDIR="' + testdir + 'tst-uapi-empty_dot_d_dir' + '"'], dependencies : libeconf_dep)
+test('tst-uapi-empty_dot_d_dir', tst_uapi_empty_dot_d_dir_exe)
+
+tst_uapi_empty_dot_d_dir2_exe = executable('tst-uapi-empty_dot_d_dir2', 'tst-uapi-empty_dot_d_dir2.c',
+ c_args: ['-DTESTSDIR="' + testdir + 'tst-uapi-empty_dot_d_dir2' + '"'], dependencies : libeconf_dep)
+test('tst-uapi-empty_dot_d_dir2', tst_uapi_empty_dot_d_dir2_exe)
+
tst_parse_error_exe = executable('tst-parse-error', 'tst-parse-error.c', c_args: test_args, dependencies : libeconf_dep)
test('tst-parse-error', tst_parse_error_exe)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libeconf-0.7.6/tests/tst-uapi-empty_dot_d_dir.c new/libeconf-0.7.7/tests/tst-uapi-empty_dot_d_dir.c
--- old/libeconf-0.7.6/tests/tst-uapi-empty_dot_d_dir.c 1970-01-01 01:00:00.000000000 +0100
+++ new/libeconf-0.7.7/tests/tst-uapi-empty_dot_d_dir.c 2025-01-13 10:32:41.000000000 +0100
@@ -0,0 +1,65 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include "libeconf.h"
+bool callback_without_error(const char *filename, const void *data);
+bool callback_with_error(const char *filename, const void *data);
+
+/* Test case:
+ /etc/environment which is empty
+ /usr/etc/environment.d/a.conf which is empty
+ /usr/etc/environment.d/b.conf which is empty
+ /usr/etc/environment.d/c.conf which is empty
+
+ libeconf should have none entry.
+*/
+
+int
+main(void)
+{
+ econf_file *key_file = NULL;
+ int retval = 0;
+ econf_err error;
+ char **keys;
+ size_t key_number;
+
+ if ((error = econf_newKeyFile_with_options(&key_file, "ROOT_PREFIX="TESTSDIR)))
+ {
+ fprintf (stderr, "ERROR: couldn't allocate new file: %s\n",
+ econf_errString(error));
+ return 1;
+ }
+
+ error = econf_readConfig (&key_file,
+ NULL,
+ "/usr/etc",
+ "environment",
+ "", "=", "#");
+
+ if (error)
+ {
+ fprintf (stderr, "ERROR: econf_readConfig: %s\n",
+ econf_errString(error));
+ return 1;
+ }
+
+
+ error = econf_getKeys(key_file, NULL, &key_number, &keys);
+ if (error != ECONF_NOKEY)
+ {
+ fprintf (stderr, "Getting all keys should return error ECONF_NOKEY: %s\n", econf_errString(error));
+ return 1;
+ }
+ if (key_number != 0)
+ {
+ fprintf (stderr, "Key Number should be 0: %ld\n", key_number);
+ return 1;
+ }
+
+ econf_free (key_file);
+
+ return retval;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libeconf-0.7.6/tests/tst-uapi-empty_dot_d_dir2/usr/etc/environment.d/c.conf new/libeconf-0.7.7/tests/tst-uapi-empty_dot_d_dir2/usr/etc/environment.d/c.conf
--- old/libeconf-0.7.6/tests/tst-uapi-empty_dot_d_dir2/usr/etc/environment.d/c.conf 1970-01-01 01:00:00.000000000 +0100
+++ new/libeconf-0.7.7/tests/tst-uapi-empty_dot_d_dir2/usr/etc/environment.d/c.conf 2025-01-13 10:32:41.000000000 +0100
@@ -0,0 +1,6 @@
+#
+# This file is parsed by pam_env module
+#
+# Syntax: simple "KEY=VAL" pairs on seperate lines
+#
+Y2STYLE=dark.qss
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libeconf-0.7.6/tests/tst-uapi-empty_dot_d_dir2.c new/libeconf-0.7.7/tests/tst-uapi-empty_dot_d_dir2.c
--- old/libeconf-0.7.6/tests/tst-uapi-empty_dot_d_dir2.c 1970-01-01 01:00:00.000000000 +0100
+++ new/libeconf-0.7.7/tests/tst-uapi-empty_dot_d_dir2.c 2025-01-13 10:32:41.000000000 +0100
@@ -0,0 +1,84 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include "libeconf.h"
+bool callback_without_error(const char *filename, const void *data);
+bool callback_with_error(const char *filename, const void *data);
+
+/* Test case:
+
+ /etc/environment which is empty
+ /usr/etc/environment.d/a.conf which is empty
+ /usr/etc/environment.d/b.conf which is empty
+ /usr/etc/environment.d/c.conf which is NOT empty
+
+ libeconf should read these files and return one entry.
+*/
+
+static int
+check_key(econf_file *key_file, char *key, char *expected_val)
+{
+ char *val = NULL;
+ econf_err error = econf_getStringValue (key_file, "", key, &val);
+ if (expected_val == NULL)
+ {
+ if (val == NULL)
+ return 0;
+
+ fprintf (stderr, "ERROR: %s has value \"%s\"\n", key, val);
+ return 1;
+ }
+ if (val == NULL || strlen(val) == 0)
+ {
+ fprintf (stderr, "ERROR: %s returns nothing! (%s)\n", key,
+ econf_errString(error));
+ return 1;
+ }
+ if (strcmp (val, expected_val) != 0)
+ {
+ fprintf (stderr, "ERROR: %s is not \"%s\"\n", key, expected_val);
+ return 1;
+ }
+
+ printf("Ok: %s=%s\n", key, val);
+ free (val);
+ return 0;
+}
+
+int
+main(void)
+{
+ econf_file *key_file = NULL;
+ int retval = 0;
+ econf_err error;
+
+ if ((error = econf_newKeyFile_with_options(&key_file, "ROOT_PREFIX="TESTSDIR)))
+ {
+ fprintf (stderr, "ERROR: couldn't allocate new file: %s\n",
+ econf_errString(error));
+ return 1;
+ }
+
+ error = econf_readConfig (&key_file,
+ NULL,
+ "/usr/etc",
+ "environment",
+ "", "=", "#");
+
+ if (error)
+ {
+ fprintf (stderr, "ERROR: econf_readConfig: %s\n",
+ econf_errString(error));
+ return 1;
+ }
+
+ if (check_key(key_file, "Y2STYLE", "dark.qss") != 0)
+ retval = 1;
+
+ econf_free (key_file);
+
+ return retval;
+}
1
0