openSUSE Commits
Threads by month
- ----- 2024 -----
- 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
October 2019
- 1 participants
- 2293 discussions
Hello community,
here is the log from the commit of package qimgv for openSUSE:Factory checked in at 2019-10-02 11:59:13
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/qimgv (Old)
and /work/SRC/openSUSE:Factory/.qimgv.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "qimgv"
Wed Oct 2 11:59:13 2019 rev:11 rq:734242 version:0.8.5
Changes:
--------
--- /work/SRC/openSUSE:Factory/qimgv/qimgv.changes 2019-09-23 12:39:51.533585861 +0200
+++ /work/SRC/openSUSE:Factory/.qimgv.new.2352/qimgv.changes 2019-10-02 11:59:16.742972740 +0200
@@ -1,0 +2,9 @@
+Tue Oct 1 07:53:33 UTC 2019 - Luigi Baldoni <aloisio(a)gmx.com>
+
+- Update to version 0.8.5
+ * Crop: change behavior to match older versions
+ * VideoControls: fix overlapping with panel
+ * FolderView: scrollbar is now easier to hit while in fullscreen
+ * Fix opening videos without correct mime type
+
+-------------------------------------------------------------------
Old:
----
qimgv-0.8.4.tar.gz
New:
----
qimgv-0.8.5.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ qimgv.spec ++++++
--- /var/tmp/diff_new_pack.XhhHqs/_old 2019-10-02 11:59:17.318971263 +0200
+++ /var/tmp/diff_new_pack.XhhHqs/_new 2019-10-02 11:59:17.318971263 +0200
@@ -17,7 +17,7 @@
Name: qimgv
-Version: 0.8.4
+Version: 0.8.5
Release: 0
Summary: Qt5 image viewer
License: GPL-3.0-only
++++++ qimgv-0.8.4.tar.gz -> qimgv-0.8.5.tar.gz ++++++
++++ 2419 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package python-pyfg for openSUSE:Factory checked in at 2019-10-02 11:59:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pyfg (Old)
and /work/SRC/openSUSE:Factory/.python-pyfg.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pyfg"
Wed Oct 2 11:59:04 2019 rev:2 rq:734235 version:0.50
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pyfg/python-pyfg.changes 2019-09-30 16:03:36.712543919 +0200
+++ /work/SRC/openSUSE:Factory/.python-pyfg.new.2352/python-pyfg.changes 2019-10-02 11:59:06.958997815 +0200
@@ -1,0 +2,5 @@
+Tue Oct 1 06:33:23 UTC 2019 - Jan Engelhardt <jengelh(a)inai.de>
+
+- Generalize description, trim bias.
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pyfg.spec ++++++
--- /var/tmp/diff_new_pack.kwCuRA/_old 2019-10-02 11:59:07.634996083 +0200
+++ /var/tmp/diff_new_pack.kwCuRA/_new 2019-10-02 11:59:07.634996083 +0200
@@ -39,11 +39,11 @@
%python_subpackages
%description
-This API allows you to interact with a device runnine FortiOS in a sane way.
-With this API you can:
+This API allows interacting with a device running FortiOS.
+With this API, one can:
* Connect to the device, retrieve the running config (the entire config or
- some blocks, whatever you want) and build a model
+ some blocks) and build a model
* Build the same model from a file
* Do changes in the candidate configuration locally
* Create a candidate configuration from a file
@@ -52,9 +52,7 @@
the candidate configuration
%prep
-%setup -q -n pyfg-%{version}
-%patch0 -p1
-%patch1 -p1
+%autosetup -n pyfg-%{version} -p1
%build
%python_build
1
0
Hello community,
here is the log from the commit of package ocamlify for openSUSE:Factory checked in at 2019-10-02 11:59:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ocamlify (Old)
and /work/SRC/openSUSE:Factory/.ocamlify.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ocamlify"
Wed Oct 2 11:59:01 2019 rev:3 rq:734232 version:0.0.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/ocamlify/ocamlify.changes 2017-08-18 15:02:36.357343471 +0200
+++ /work/SRC/openSUSE:Factory/.ocamlify.new.2352/ocamlify.changes 2019-10-02 11:59:04.759003454 +0200
@@ -1,0 +2,5 @@
+Mon Sep 23 16:35:39 UTC 2019 - ohering(a)suse.de
+
+- Refresh setup.ml with ocamlify.patch
+
+-------------------------------------------------------------------
New:
----
ocamlify.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ocamlify.spec ++++++
--- /var/tmp/diff_new_pack.aS8N9E/_old 2019-10-02 11:59:05.263002162 +0200
+++ /var/tmp/diff_new_pack.aS8N9E/_new 2019-10-02 11:59:05.267002152 +0200
@@ -26,7 +26,7 @@
Url: http://forge.ocamlcore.org/projects/ocamlify/
Source0: %{name}-%{version}.tar.xz
-BuildRoot: %{_tmppath}/%{name}-%{version}-build
+Patch0: ocamlify.patch
BuildRequires: ocaml
BuildRequires: ocaml-ocamlbuild
@@ -40,7 +40,7 @@
code.
%prep
-%setup
+%autosetup -p1
%build
%ocaml_oasis_configure --enable-docs
@@ -51,8 +51,7 @@
%ocaml_oasis_findlib_install
%files
-%defattr(-,root,root,-)
-%doc COPYING.txt
+%license COPYING.txt
%{_bindir}/*
%changelog
++++++ ocamlify.patch ++++++
++++ 10585 lines (skipped)
1
0
Hello community,
here is the log from the commit of package hwloc for openSUSE:Factory checked in at 2019-10-02 11:58:56
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/hwloc (Old)
and /work/SRC/openSUSE:Factory/.hwloc.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hwloc"
Wed Oct 2 11:58:56 2019 rev:13 rq:734220 version:2.0.4
Changes:
--------
--- /work/SRC/openSUSE:Factory/hwloc/hwloc.changes 2017-11-23 09:44:05.225230200 +0100
+++ /work/SRC/openSUSE:Factory/.hwloc.new.2352/hwloc.changes 2019-10-02 11:59:00.363014721 +0200
@@ -1,0 +2,41 @@
+Tue Aug 27 08:36:28 UTC 2019 - Thomas Blume <thomas.blume(a)suse.com>
+
+- update to latest released upstream version 2.0.4 (jsc#SLE-8583)
+
+* Add support for Linux 5.3 new sysfs cpu topology files with Die information.
+* Add support for Intel v2 Extended Topology Enumeration in the x86 backend.
+* Tiles, Modules and Dies are exposed as Groups for now.
+ + HWLOC_DONT_MERGE_DIE_GROUPS=1 may be set in the environment to prevent
+ Die groups from being automatically merged with identical parent or children.
+* Ignore NUMA node information from AMD topoext in the x86 backend,
+ unless HWLOC_X86_TOPOEXT_NUMANODES=1 is set in the environment.
+* Group objects have a new "dont_merge" attribute to prevent them from
+ being automatically merged with identical parent or children.
+* Fix build on Cygwin, thanks to Marco Atzeri for the patches.
+* Fix a corner case of hwloc_topology_restrict() where children would
+ become out-of-order.
+* Fix the return length of export_xmlbuffer() functions to always
+ include the ending \0.
+* Fix lstopo --children-order argument parsing.
+* Add support for Hygon Dhyana processors in the x86 backend,
+ thanks to Pu Wen for the patch.
+* Fix symbol renaming to also rename internal components,
+ thanks to Evan Ramos for the patch.
+* Fix build on HP-UX, thanks to Richard Lloyd for reporting the issues.
+* Detect PCI link speed without being root on Linux >= 4.13.
+* Add HWLOC_VERSION* macros to the public headers,
+ thanks to Gilles Gouaillardet for the suggestion.
+* Bump the library soname to 15:0:0 to avoid conflicts with hwloc 1.11.x
+ releases. The hwloc 2.0.0 soname was buggy (12:0:0), applications will
+ have to be recompiled.
+* Serialize pciaccess discovery to fix concurrent topology loads in
+ multiple threads.
+* Fix hwloc-dump-hwdata to only process SMBIOS information that correspond
+ to the KNL and KNM configuration.
+* Add a heuristic for guessing KNL/KNM memory and cluster modes when
+ hwloc-dump-hwdata could not run as root earlier.
+* Add --no-text lstopo option to remove text from some boxes in the
+ graphical output. Mostly useful for removing Group labels.
+* Some minor fixes to memory binding.
+
+-------------------------------------------------------------------
Old:
----
hwloc-1.11.8.tar.gz
New:
----
hwloc-2.0.4.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ hwloc.spec ++++++
--- /var/tmp/diff_new_pack.MeEjHD/_old 2019-10-02 11:59:00.927013275 +0200
+++ /var/tmp/diff_new_pack.MeEjHD/_new 2019-10-02 11:59:00.927013275 +0200
@@ -1,7 +1,7 @@
#
# spec file for package hwloc
#
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,24 +12,19 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
-%global lname libhwloc5
-%if ! 0%{?is_opensuse}
-%define version_prefix 2.0.0.
-%endif
-%define mainversion 1.11.8
+%global lname libhwloc15
Name: hwloc
-Version: %{?version_prefix}%{?mainversion}
+Version: 2.0.4
Release: 0
Summary: Portable Hardware Locality
License: BSD-3-Clause
Group: Productivity/Clustering/Computing
Url: http://www.open-mpi.org/projects/hwloc/
-#Source0: %{name}-%{version}.tar.xz
-Source0: https://github.com/open-mpi/hwloc/archive/%{name}-%{mainversion}.tar.gz
+Source0: https://download.open-mpi.org/release/hwloc/v2.0/%{name}-%{version}.tar.bz2
BuildRequires: autoconf
BuildRequires: automake
BuildRequires: doxygen
@@ -109,7 +104,7 @@
This package contains the documentation for hwloc.
%prep
-%setup -q -n %{name}-%{name}-%{mainversion}
+%setup -q -n %{name}-%{version}
%build
autoreconf -fvi
@@ -181,10 +176,13 @@
%defattr(-, root, root, -)
%dir %{_datadir}/hwloc
%{_datadir}/hwloc/hwloc.dtd
+%{_datadir}/hwloc/hwloc2-diff.dtd
+%{_datadir}/hwloc/hwloc2.dtd
%{_datadir}/hwloc/hwloc-valgrind.supp
%files doc
%defattr(-, root, root, -)
-%doc ./doc/images/*.pdf
+%doc ./doc/doxygen-doc/html/*
+%{_mandir}/man3/*
%changelog
++++++ hwloc-1.11.8.tar.gz -> hwloc-2.0.4.tar.bz2 ++++++
++++ 311355 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package openSUSE-release-tools for openSUSE:Factory checked in at 2019-10-02 11:58:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/openSUSE-release-tools (Old)
and /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openSUSE-release-tools"
Wed Oct 2 11:58:52 2019 rev:225 rq:734219 version:20190930.3d04dde8
Changes:
--------
--- /work/SRC/openSUSE:Factory/openSUSE-release-tools/openSUSE-release-tools.changes 2019-09-30 15:59:31.693195983 +0200
+++ /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new.2352/openSUSE-release-tools.changes 2019-10-02 11:58:55.807026397 +0200
@@ -1,0 +2,6 @@
+Mon Sep 30 07:56:16 UTC 2019 - opensuse-releaseteam(a)opensuse.org
+
+- Update to version 20190930.3d04dde8:
+ * check_source: avoid crash if filename is not set
+
+-------------------------------------------------------------------
Old:
----
openSUSE-release-tools-20190927.6cbf1e6a.obscpio
New:
----
openSUSE-release-tools-20190930.3d04dde8.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ openSUSE-release-tools.spec ++++++
--- /var/tmp/diff_new_pack.GZ2tmb/_old 2019-10-02 11:58:57.199022830 +0200
+++ /var/tmp/diff_new_pack.GZ2tmb/_new 2019-10-02 11:58:57.199022830 +0200
@@ -20,7 +20,7 @@
%define source_dir openSUSE-release-tools
%define announcer_filename factory-package-news
Name: openSUSE-release-tools
-Version: 20190927.6cbf1e6a
+Version: 20190930.3d04dde8
Release: 0
Summary: Tools to aid in staging and release work for openSUSE/SUSE
License: GPL-2.0-or-later AND MIT
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.GZ2tmb/_old 2019-10-02 11:58:57.247022707 +0200
+++ /var/tmp/diff_new_pack.GZ2tmb/_new 2019-10-02 11:58:57.247022707 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/openSUSE/openSUSE-release-tools.git</param>
- <param name="changesrevision">101a4c8646a030af471de068040a65624d1fb64c</param>
+ <param name="changesrevision">3d04dde8c03d5cf92c8f5d13e5c2c1162dc733dc</param>
</service>
</servicedata>
++++++ openSUSE-release-tools-20190927.6cbf1e6a.obscpio -> openSUSE-release-tools-20190930.3d04dde8.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20190927.6cbf1e6a/check_source.py new/openSUSE-release-tools-20190930.3d04dde8/check_source.py
--- old/openSUSE-release-tools-20190927.6cbf1e6a/check_source.py 2019-09-27 12:13:53.000000000 +0200
+++ new/openSUSE-release-tools-20190930.3d04dde8/check_source.py 2019-09-30 09:55:23.000000000 +0200
@@ -150,7 +150,7 @@
shutil.rmtree(os.path.join(target_package, '.osc'))
new_info = self.package_source_parse(source_project, source_package, source_revision)
- if not new_info['filename'].endswith('.kiwi') and new_info['name'] != target_package:
+ if not new_info.get('filename', '').endswith('.kiwi') and new_info['name'] != target_package:
shutil.rmtree(dir)
self.review_messages['declined'] = "A package submitted as %s has to build as 'Name: %s' - found Name '%s'" % (target_package, target_package, new_info['name'])
return False
++++++ openSUSE-release-tools.obsinfo ++++++
--- /var/tmp/diff_new_pack.GZ2tmb/_old 2019-10-02 11:58:57.851021158 +0200
+++ /var/tmp/diff_new_pack.GZ2tmb/_new 2019-10-02 11:58:57.855021148 +0200
@@ -1,5 +1,5 @@
name: openSUSE-release-tools
-version: 20190927.6cbf1e6a
-mtime: 1569579233
-commit: 6cbf1e6ac27e150c1c69c49450ce901dade35153
+version: 20190930.3d04dde8
+mtime: 1569830123
+commit: 3d04dde8c03d5cf92c8f5d13e5c2c1162dc733dc
1
0
Hello community,
here is the log from the commit of package impressive for openSUSE:Factory checked in at 2019-10-02 11:58:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/impressive (Old)
and /work/SRC/openSUSE:Factory/.impressive.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "impressive"
Wed Oct 2 11:58:49 2019 rev:2 rq:734218 version:0.12.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/impressive/impressive.changes 2019-06-19 21:13:45.690823461 +0200
+++ /work/SRC/openSUSE:Factory/.impressive.new.2352/impressive.changes 2019-10-02 11:58:51.727036854 +0200
@@ -1,0 +2,21 @@
+Tue Oct 1 06:54:04 UTC 2019 - Jan Engelhardt <jengelh(a)inai.de>
+
+- Fix description typography. Drop redundant %attr.
+
+-------------------------------------------------------------------
+Mon Sep 30 14:22:18 UTC 2019 - Christophe Giboudeaux <christophe(a)krop.fr>
+
+- Update to 0.12.1:
+ * fixed crash in crash reporter with recent Pillow versions
+ * fixed crash with recent PyGame versions when non-latin characters appeared
+ in slide titles
+ * fixed page rotation
+ * fixed -x/--fade mode
+ * fixed directory playback mode
+ * basic Raspberry Pi 4 compatibility (untested; requires X11)
+ * more robust PDF hyperlink parser (page boxes can now be PDF references)
+ * added option to temporarily inhibit automatic slideshows
+ * default keybinding: [A] key, actions: auto-start, auto-stop, auto-toggle
+- Run spec-cleaner
+
+-------------------------------------------------------------------
Old:
----
Impressive-0.12.0.tar.gz
New:
----
Impressive-0.12.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ impressive.spec ++++++
--- /var/tmp/diff_new_pack.CqAZPN/_old 2019-10-02 11:58:52.771034178 +0200
+++ /var/tmp/diff_new_pack.CqAZPN/_new 2019-10-02 11:58:52.775034168 +0200
@@ -1,7 +1,7 @@
#
# spec file for package impressive
#
-# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,35 +12,35 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
%define dist_name Impressive
Name: impressive
-Version: 0.12.0
+Version: 0.12.1
Release: 0
-Summary: A PDF and image viewer optimized for presentations
-License: GPL-2.0
+Summary: PDF and image viewer optimized for presentations
+License: GPL-2.0-only
Group: Productivity/Office/Other
-Url: http://impressive.sourceforge.net/
+URL: http://impressive.sourceforge.net/
Source0: http://downloads.sourceforge.net/project/%{name}/%{dist_name}/%{version}/%{…
Requires: ghostscript
Requires: python-imaging
Requires: python-opengl
Requires: python-pygame
Recommends: mupdf
-BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildArch: noarch
%description
-A DRI accelerated pdf documents viewer with 3D
-effects. Currently, it only supports keyboard
-commands (not mouse) and a single 3D cube effect.
+A DRI accelerated PDF document viewer with 3D effects. Currently, it only
+supports keyboard commands (not mouse) and a single 3D cube effect.
%prep
%setup -q -n %{dist_name}-%{version}
+sed -i 's/env python2/python/' impressive.py
+
%build
%install
@@ -49,12 +49,12 @@
install -d -m 755 %{buildroot}%{_mandir}/man1
install -m 755 %{name}.py %{buildroot}%{_bindir}/%{name}
-gzip -9 %{name}.1 &&
-install -m 644 %{name}.1.gz %{buildroot}%{_mandir}/man1
+gzip -9c <%{name}.1 >%{buildroot}%{_mandir}/man1/%{name}.1.gz
%files
-%defattr(-,root,root,-)
-%attr(0755,root,root)%{_bindir}/%{name}
-%doc %{_mandir}/man1/%{name}.1.gz
+%license license.txt
+%doc changelog.txt
+%{_bindir}/%{name}
+%{_mandir}/man1/%{name}.1%{?ext_man}
%changelog
++++++ Impressive-0.12.0.tar.gz -> Impressive-0.12.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Impressive-0.12.0/changelog.txt new/Impressive-0.12.1/changelog.txt
--- old/Impressive-0.12.0/changelog.txt 2018-02-04 21:31:39.000000000 +0100
+++ new/Impressive-0.12.1/changelog.txt 2019-08-28 22:10:44.000000000 +0200
@@ -1,3 +1,15 @@
+0.12.1 [2019-08-28]
+- fixed crash in crash reporter with recent Pillow versions
+- fixed crash with recent PyGame versions when non-latin characters appeared
+ in slide titles
+- fixed page rotation
+- fixed -x/--fade mode
+- fixed directory playback mode
+- basic Raspberry Pi 4 compatibility (untested; requires X11)
+- more robust PDF hyperlink parser (page boxes can now be PDF references)
+- added option to temporarily inhibit automatic slideshows
+ - default keybinding: [A] key, actions: auto-start, auto-stop, auto-toggle
+
0.12.0 [2018-02-04]
- many zoom mode related changes
- box-zoom mode: use Ctrl+LMB-drag to draw a box and zoom it to fit
Binary files old/Impressive-0.12.0/demo.pdf and new/Impressive-0.12.1/demo.pdf differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Impressive-0.12.0/impressive.1 new/Impressive-0.12.1/impressive.1
--- old/Impressive-0.12.0/impressive.1 2018-02-04 21:31:39.000000000 +0100
+++ new/Impressive-0.12.1/impressive.1 2019-08-28 22:10:44.000000000 +0200
@@ -1,5 +1,5 @@
.\" generated by KeyJ's html2man.py version 0.1.1
-.TH IMPRESSIVE 1 2018-02-04 "Martin J. Fiedler" "Impressive Documentation">
+.TH IMPRESSIVE 1 2019-08-28 "Martin J. Fiedler" "Impressive Documentation">
.SH "NAME"
Impressive \- presentation tool with eye candy
.SH "SYNOPSIS"
@@ -666,6 +666,16 @@
.RE
.PP
.br
+\fBA\fR key
+.RS
+Toggle automatic slideshow mode.
+.br
+If an automatic presentation has been started with the \fB\-a\fR/\:\fB\-\-auto\fR option, it is temporarily disabled until this key is pressed again. It is not automatically re\-enabled after changing the page. If the \fB\-a\fR/\:\fB\-\-auto\fR has not been used, an automatic presentation with a timeout of 30 seconds is started when this key is pressed for the first time.
+.br
+Note that if a page has a \fBtimeout\fR PageProp, the specified timeout is \fIalways\fR in effect when the page is entered, even if the automatic slideshow is otherwise disabled.
+.RE
+.PP
+.br
\fBS\fR key
.RS
Save the info script associated with the current presentation. The main purpose for this is to permanently save highlight boxes or keyboard shortcuts, so they will be restored the next time this presentation is started.
@@ -857,6 +867,26 @@
The following list describes all actions supported by Impressive, together with the conditions under which they will match. Note that most actions will not match in overview mode and during video playback, unless mentioned otherwise in the description.
.PP
.br
+\fBauto\-start\fR
+.RS
+(Re\-)enable automatic presentation mode. If the current page has no \fBtimeout\fR PageProp and no \fB\-a\fR/\:\fB\-\-auto\fR option has been specified, an automatic presentation is started with a 30\-second page interval.
+.RE
+.PP
+.br
+\fBauto\-stop\fR
+.RS
+Disable automatic presentation mode. If the current page has a \fBtimeout\fR PageProp or an \fB\-a\fR/\:\fB\-\-auto\fR option has been specified, the timeout for the current page is stopped.
+.br
+The automatic presentation stays disabled after changing pages, unless a \fBtimeout\fR PageProp is specified for the target page, which will take precedence over the otherwise disabled automatic presentation mode.
+.RE
+.PP
+.br
+\fBauto\-toggle\fR
+.RS
+Disables or (re\-)enables automatic presentations, depending on the current state.
+.RE
+.PP
+.br
\fBbox\-add\fR
.RS
Draw a highlight box if the mouse has been moved since the button has been pressed down. This action must only be bound to a mouse button event, otherwise it will not function properly.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Impressive-0.12.0/impressive.html new/Impressive-0.12.1/impressive.html
--- old/Impressive-0.12.0/impressive.html 2018-02-04 21:31:39.000000000 +0100
+++ new/Impressive-0.12.1/impressive.html 2019-08-28 22:10:44.000000000 +0200
@@ -13,12 +13,12 @@
<!--VERSION-->
<p style="text-indent:0;">
<a href="http://impressive.sourceforge.net/">http://impressive.sourceforge.net/</a><br />
-<b>Version:</b> 0.12.0<br />
+<b>Version:</b> 0.12.1<br />
<b>Author:</b> <a href="mailto:martin.fiedler@gmx.net">Martin J. Fiedler</a><br />
-<b>Last updated:</b> 2018-02-04</p>
+<b>Last updated:</b> 2019-08-28</p>
<!--END-->
<!--man
-.TH IMPRESSIVE 1 2018-02-04 "Martin J. Fiedler" "Impressive Documentation">
+.TH IMPRESSIVE 1 2019-08-28 "Martin J. Fiedler" "Impressive Documentation">
.SH "NAME"
Impressive \- presentation tool with eye candy
.SH "SYNOPSIS"
@@ -104,18 +104,22 @@
<p>Impressive runs on Rasbperry Pi Single-Board Computers with bearable performance, if the following notes are taken into consideration:</p>
<ul>
+<li>On Raspberry Pi generations 1, 2 and 3:<ul>
<li>Overscan must be off (set <code>disable_overscan=1</code> in <code>/boot/config.txt</code>, or run <code>raspi-config</code> → Advanced Menu → Overscan).</li>
<li>The classic Broadcom OpenGL ES driver stack must be used, <strong>not</strong> the Fake-KMS or Full-KMS Mesa drivers (disable <code>dtoverlay=vc4-</code>(<code>f</code>)<code>kms-v3d</code> in <code>/boot/config.txt</code>, or run <code>raspi-config</code> → Advanced Menu → GL Driver → Legacy: Original non-GL desktop driver).</li>
<li>Doesn't require X11 – can also be run from a normal text console in Raspbian Lite.</li>
<li>Can be run from X11, but only in fullscreen mode.</li>
+</ul></li>
+<li>On the Raspberry Pi 4, Impressive behaves like the desktop version.<ul>
+<li>Must be run from X11, can use windowed mode.</li></ul></li>
<li>Video playback uses omxplayer instead of MPlayer. This has the following advantages and drawbacks:<ul>
<li>Only H.264 and (if licensed on the specific device) MPEG-2 video codecs are supported.</li>
-<li>These are, howver, hardware-decoded with full performance.</li>
+<li>These are, however, hardware-decoded with full performance.</li>
<li>Fine-grained seeking (1 second / 10 second) is not supported. 1-second seek operations are ignored, 10-second seek maps to 30-second seek.</li>
</ul></li>
<li>Since microSD storage is <em>very</em> slow on the Raspberry Pi, consider using the <code>-cz</code>/<code>--cache compressed</code> option for better performance. This will consume more RAM though, which is also a scarce resource on the device, but typical presentation slides with uniformly colored backgrounds compress very well and shouldn't be a problem.</li>
</ul>
-<p>Using Impressive, it is possible to convert a Raspberry Pi into an automated »digital signage« system, i.e. a system with the sole purpose of repeatedly showing a single presentation, which can consist of one or more PDF files, image files, or videos. Currently, there's no automated installation for this mode; however the following script (which is included in an SVN checkout as well) contains the necessary code and installation instructions (for advanced users):<br />
+<p>Using Impressive, it is possible to convert a Raspberry Pi 1 to 3 into an automated »digital signage« system, i.e. a system with the sole purpose of repeatedly showing a single presentation, which can consist of one or more PDF files, image files, or videos. Currently, there's no automated installation for this mode; however the following script (which is included in an SVN checkout as well) contains the necessary code and installation instructions (for advanced users):<br />
<a style="margin-left:32px;" href="https://svn.emphy.de/impressive/trunk/impressive/boot_impressive.sh">https://svn.emphy.de/impressive/trunk/impressive/boot_impressive.sh</a></p>
<!-------------------------------------------------------------------------------->
@@ -461,6 +465,11 @@
<dt><strong>RMB</strong> (right mouse button) over a highlight box</dt>
<dd>If the right mouse button is clicked while the mouse cursor is above a highlight box, the box will be removed. If the last box on a page is removed, the page will turn bright and sharp again.</dd>
+<dt><strong>A</strong> key</dt>
+<dd>Toggle automatic slideshow mode.<br />
+If an automatic presentation has been started with the <code>-a</code>/<code>--auto</code> option, it is temporarily disabled until this key is pressed again. It is not automatically re-enabled after changing the page. If the <code>-a</code>/<code>--auto</code> has not been used, an automatic presentation with a timeout of 30 seconds is started when this key is pressed for the first time.<br />
+Note that if a page has a <code>timeout</code> PageProp, the specified timeout is <em>always</em> in effect when the page is entered, even if the automatic slideshow is otherwise disabled.</dd>
+
<dt><strong>S</strong> key</dt>
<dd>Save the info script associated with the current presentation. The main purpose for this is to permanently save highlight boxes or keyboard shortcuts, so they will be restored the next time this presentation is started.</dd>
@@ -568,6 +577,16 @@
<p>The following list describes all actions supported by Impressive, together with the conditions under which they will match. Note that most actions will not match in overview mode and during video playback, unless mentioned otherwise in the description.</p><dl>
+<dt><code>auto-start</code></dt>
+<dd>(Re-)enable automatic presentation mode. If the current page has no <code>timeout</code> PageProp and no <code>-a</code>/<code>--auto</code> option has been specified, an automatic presentation is started with a 30-second page interval.</dd>
+
+<dt><code>auto-stop</code></dt>
+<dd>Disable automatic presentation mode. If the current page has a <code>timeout</code> PageProp or an <code>-a</code>/<code>--auto</code> option has been specified, the timeout for the current page is stopped.<br />
+The automatic presentation stays disabled after changing pages, unless a <code>timeout</code> PageProp is specified for the target page, which will take precedence over the otherwise disabled automatic presentation mode.</dd>
+
+<dt><code>auto-toggle</code></dt>
+<dd>Disables or (re-)enables automatic presentations, depending on the current state.</dd>
+
<dt><code>box-add</code></dt>
<dd>Draw a highlight box if the mouse has been moved since the button has been pressed down. This action must only be bound to a mouse button event, otherwise it will not function properly.</dd>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Impressive-0.12.0/impressive.py new/Impressive-0.12.1/impressive.py
--- old/Impressive-0.12.0/impressive.py 2018-02-04 21:31:39.000000000 +0100
+++ new/Impressive-0.12.1/impressive.py 2019-08-28 22:10:44.000000000 +0200
@@ -2,7 +2,7 @@
# -*- coding: iso-8859-1 -*-
#
# Impressive, a fancy presentation tool
-# Copyright (C) 2005-2014 Martin J. Fiedler <martin.fiedler(a)gmx.net>
+# Copyright (C) 2005-2019 Martin J. Fiedler <martin.fiedler(a)gmx.net>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2, as
@@ -18,8 +18,8 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
__title__ = "Impressive"
-__version__ = "0.12.0"
-__rev__ = 235
+__version__ = "0.12.1"
+__rev__ = 246
__author__ = "Martin J. Fiedler"
__email__ = "martin.fiedler(a)gmx.net"
__website__ = "http://impressive.sourceforge.net/"
@@ -72,7 +72,8 @@
EnableOverview = True
InitialPage = None
Wrap = False
-AutoAdvance = None
+AutoAdvanceTime = 30000
+AutoAdvanceEnabled = False
AutoAutoAdvance = False
RenderToDirectory = None
Rotation = 0
@@ -376,7 +377,15 @@
pygame.quit()
def SetWindowTitle(self, text):
- pygame.display.set_caption(text, __title__)
+ if not isinstance(text, unicode):
+ try:
+ text = unicode(text, 'utf-8')
+ except UnicodeDecodeError:
+ text = unicode(text, 'windows-1252', 'replace')
+ try:
+ pygame.display.set_caption(text, __title__)
+ except UnicodeEncodeError:
+ pygame.display.set_caption(text.encode('utf-8'), __title__)
def GetWindowID(self):
return pygame.display.get_wm_info()['window']
@@ -538,6 +547,10 @@
return Platform_PyGame.GetScreenSize(self)
+class Platform_RasPi4(Platform_Unix):
+ use_omxplayer = True
+
+
class Platform_EGL(Platform_Unix):
name = 'egl'
egllib = "EGL"
@@ -706,7 +719,16 @@
libbcm_host = ctypes.util.find_library("bcm_host")
if libbcm_host:
- Platform = Platform_BCM2835(libbcm_host)
+ try:
+ with open("/sys/firmware/devicetree/base/model") as f:
+ model = f.read()
+ except EnvironmentError:
+ model = ""
+ m = re.search(r'pi\s*(\d+)', model, flags=re.I)
+ if m and (int(m.group(1)) >= 4):
+ Platform = Platform_RasPi4()
+ else:
+ Platform = Platform_BCM2835(libbcm_host)
elif os.name == "nt":
Platform = Platform_Win32()
else:
@@ -2544,6 +2566,12 @@
raise PDFError, "object does not match the intended type"
return data
+ def resolve(self, obj):
+ if isinstance(obj, PDFref):
+ return self.getobj(obj)
+ else:
+ return obj
+
def parse_xref_section(self, start, count):
xref = {}
for obj in xrange(start, start + count):
@@ -2600,7 +2628,7 @@
self.page_count = page
self.obj2page[obj] = page
self.page2obj[page] = obj
- self.box[page] = node.get('CropBox', cbox) or node.get('MediaBox', mbox)
+ self.box[page] = self.resolve(node.get('CropBox', cbox) or node.get('MediaBox', mbox))
self.rotate[page] = node.get('Rotate', rotate)
self.annots[page] = [a.ref for a in anode]
except (KeyError, TypeError, ValueError):
@@ -3267,6 +3295,11 @@
print >>sys.stderr, " Display of PDF files will not be supported."
+def ApplyRotation(img, rot):
+ rot = (rot or 0) & 3
+ if not rot: return img
+ return img.transpose({1:Image.ROTATE_270, 2:Image.ROTATE_180, 3:Image.ROTATE_90}[rot])
+
# generate a dummy image
def DummyPage():
img = Image.new('RGB', (ScreenWidth, ScreenHeight))
@@ -3325,7 +3358,7 @@
return DummyPage()
# apply rotation
- if rot: img = img.rotate(90 * (4 - rot))
+ img = ApplyRotation(img, rot)
# compute final output image size based on PAR
if not parscale:
@@ -3410,11 +3443,7 @@
return DummyPage()
# apply rotation
- rot = GetPageProp(page, 'rotate')
- if rot is None:
- rot = Rotation
- if rot:
- img = img.rotate(90 * (4 - rot))
+ img = ApplyRotation(img, GetPageProp(page, 'rotate', Rotation))
# determine destination size
newsize = ZoomToFit((img.size[0], int(img.size[1] * PAR + 0.5)),
@@ -4307,7 +4336,7 @@
PageEnterTime = Platform.GetTicks() - StartTime
IsZoomed = 0 # no, we don't have a pre-zoomed image right now
WantStatus = False # don't show status unless it's changed interactively
- PageTimeout = AutoAdvance
+ PageTimeout = AutoAdvanceTime if AutoAdvanceEnabled else 0
shown = GetPageProp(Pcurrent, '_shown', 0)
try:
os.chdir(os.path.dirname(GetPageProp(Pcurrent, '_file')))
@@ -4940,6 +4969,7 @@
f = fullscreen
tab = overview-enter, overview-exit
s = save
+ a = auto-toggle
t = time-toggle
r = time-reset
c = box-clear
@@ -5650,6 +5680,33 @@
"fade to a white screen"
FadeMode(1.0)
+ def _auto_stop(self):
+ "stop automatic slideshow"
+ global AutoAdvanceEnabled, PageTimeout
+ AutoAdvanceEnabled = False
+ PageTimeout = 0
+ Platform.ScheduleEvent('$page-timeout', 0)
+ if AutoAdvanceProgress:
+ DrawCurrentPage()
+ def _auto_start(self):
+ "start or resume automatic slideshow"
+ global AutoAdvanceEnabled, PageTimeout
+ AutoAdvanceEnabled = True
+ PageTimeout = AutoAdvanceTime
+ if (GetPageProp(Pcurrent, '_shown') == 1) or Wrap:
+ PageTimeout = GetPageProp(Pcurrent, 'timeout', PageTimeout)
+ dt = PageTimeout - (Platform.GetTicks() - PageEnterTime)
+ if dt > 0:
+ Platform.ScheduleEvent('$page-timeout', dt)
+ else:
+ TransitionTo(GetNextPage(Pcurrent, 1))
+ def _auto_toggle(self):
+ "toggle automatic slideshow"
+ if AutoAdvanceEnabled:
+ self._auto_stop()
+ else:
+ self._auto_start()
+
def _time_toggle(self):
"toggle time display and/or time tracking mode"
global TimeDisplay
@@ -5807,7 +5864,7 @@
print >>sys.stderr, "Warning: input file `%s' has unrecognized file type" % name
elif os.path.isdir(name):
- images = [os.path.join(name, f) for f in os.listdir(name) if IsImageFileName(f)]
+ images = [os.path.join(name, f) for f in os.listdir(name) if IsImageFile(f)]
images.sort(lambda a, b: cmp(a.lower(), b.lower()))
if not images:
print >>sys.stderr, "Warning: no image files in directory `%s'" % name
@@ -5838,7 +5895,7 @@
global PAR, DAR, TempFileName, Bare, MaxZoomFactor
global BackgroundRendering, FileStats, RTrunning, RTrestart, StartTime
global CursorImage, CursorVisible, InfoScriptPath
- global HalfScreen, AutoAdvance, WindowPos
+ global HalfScreen, AutoAdvanceTime, AutoAdvanceEnabled, WindowPos
global BoxFadeDarknessBase, BoxZoomDarknessBase, SpotRadiusBase
global BoxIndexBuffer, UseBlurShader
@@ -6189,8 +6246,9 @@
time_left -= GetPageProp(p, 'transtime', TransitionDuration)
p = pnext
if pages and (time_left >= pages):
- AutoAdvance = time_left / pages
- print >>sys.stderr, "Setting auto-advance timeout to %.1f seconds." % (0.001 * AutoAdvance)
+ AutoAdvanceTime = time_left / pages
+ AutoAdvanceEnabled = True
+ print >>sys.stderr, "Setting auto-advance timeout to %.1f seconds." % (0.001 * AutoAdvanceTime)
else:
print >>sys.stderr, "Warning: Could not determine auto-advance timeout automatically."
@@ -6235,7 +6293,8 @@
# prebuffer current and next page
Pnext = 0
RenderPage(Pcurrent, Tcurrent)
- DrawCurrentPage()
+ if not FadeInOut:
+ DrawCurrentPage()
PageEntered(update_time=False)
PreloadNextPage(GetNextPage(Pcurrent, 1))
@@ -6332,7 +6391,14 @@
print >>sys.stderr, "Impressive version:", __version__
print >>sys.stderr, "Python version:", sys.version
print >>sys.stderr, "PyGame version:", pygame.__version__
- print >>sys.stderr, "PIL version:", Image.VERSION
+ if hasattr(Image, "__version__"): # Pillow >= 5.2
+ print >>sys.stderr, "PIL version: Pillow", Image.__version__
+ elif hasattr(Image, "PILLOW_VERSION"): # Pillow < 7.0
+ print >>sys.stderr, "PIL version: Pillow", Image.PILLOW_VERSION
+ elif hasattr(Image, "VERSION"): # classic PIL or Pillow 1.x
+ print >>sys.stderr, "PIL version: classic", Image.VERSION
+ else:
+ print >>sys.stderr, "PIL version: unknown"
if PDFRenderer:
print >>sys.stderr, "PDF renderer:", PDFRenderer.name
else:
@@ -6396,28 +6462,28 @@
Usage: """+os.path.basename(sys.argv[0])+""" [OPTION...] <INPUT(S)...>
-You may either play a PDF file, a directory containing image files or
-individual image files.
+Inputs may be PDF files, image files, video files or directories
+containing image files.
Input options:
+ -h, --help show this help text and exit
-r, --rotate <n> rotate pages clockwise in 90-degree steps
--scale scale images to fit screen (not used in PDF mode)
--supersample use supersampling (only used in PDF mode)
-s --supersample for PDF files, --scale for image files
-I, --script <path> set the path of the info script
- -u, --poll <seconds> check periodically if the source file has been
- updated and reload it if it did
+ -u, --poll <seconds> check periodically if the source files have been
+ updated and reload them if they did
-X, --shuffle put input files into random order
- -h, --help show this help text and exit
Output options:
- -o, --output <dir> don't display the presentation, only render to .png
--fullscreen start in fullscreen mode
-ff, --fake-fullscreen start in "fake fullscreen" mode
-f, --windowed start in windowed mode
-g, --geometry <WxH> set window size or fullscreen resolution
-A, --aspect <X:Y> adjust for a specific display aspect ratio (e.g. 5:4)
-G, --gamma <G[:BL]> specify startup gamma and black level
+ -o, --output <dir> don't display the presentation, only render to .png
Page options:
-i, --initialpage <n> start with page <n>
@@ -6442,33 +6508,33 @@
-z, --zoom <factor> set zoom factor (default: 2.0)
--maxzoom <factor> maximum factor to render high-resolution zoom
-x, --fade fade in at start and fade out at end
- --spot-radius <px> set the initial radius of the spotlight, in pixels
--invert display slides in inverted colors
+ --noblur use legacy blur implementation
+ --spot-radius <px> set the initial radius of the spotlight, in pixels
--min-box-size <x> set minimum size of a highlight box, in pixels
--box-edge <px> size of highlight box borders, in pixels
--zbox-edge <px> size of zoom box borders, in pixels
--darkness <p> set highlight box mode darkness to <p> percent
--zoomdarkness <p> set box-zoom mode darkness to <p> percent
- --noblur use legacy blur implementation
Timing options:
- -M, --minutes display time in minutes, not seconds
- --clock show current time instead of time elapsed
- --tracking enable time tracking mode
- --time-display enable time display (implies --tracking)
-a, --auto <seconds> automatically advance to next page after some seconds
-d, --duration <time> set the desired duration of the presentation and show
a progress bar at the bottom of the screen
-y, --auto-auto if a duration is set, set the default time-out so
that it will be reached exactly
+ -q, --page-progress shows a progress bar based on the position in the
+ presentation (based on pages, not time)
-k, --auto-progress shows a progress bar for each page for auto-advance
+ --time-display enable time display (implies --tracking)
+ --tracking enable time tracking mode
+ --clock show current time instead of time elapsed
+ -M, --minutes display time in minutes, not seconds
-T, --transtime <ms> set transition duration in milliseconds
-D, --mousedelay <ms> set mouse hide delay for fullscreen mode (in ms)
(0 = show permanently, 1 = don't show at all)
-B, --boxfade <ms> set highlight box fade duration in milliseconds
-Z, --zoomtime <ms> set zoom animation duration in milliseconds
- -q, --page-progress shows a progress bar based on the position in the
- presentation (based on pages, not time)
Control options:
--control-help display help about control configuration and exit
@@ -6478,9 +6544,9 @@
-W, --nowheel disable page navigation via mouse wheel, zoom instead
--noquit disable single-key shortcuts that quit the program
--evtest run Impressive in event test mode
- --bare don't use any special features (hyperlinks etc.)
Advanced options:
+ --bare don't use any special features (hyperlinks etc.)
-c, --cache <mode> set page cache mode:
-c none = disable caching completely
-c memory = store cache in RAM, uncompressed
@@ -6492,8 +6558,8 @@
-P, --renderer <path> set path to PDF renderer executable (GhostScript,
Xpdf/Poppler pdftoppm, or MuPDF mudraw/pdfdraw)
-V, --overscan <px> render PDF files <px> pixels larger than the screen
- --nologo disable startup logo and version number display
-H, --half-screen show OSD on right half of the screen only
+ --nologo disable startup logo and version number display
-v, --verbose (slightly) more verbose operation
For detailed information, visit""", __website__
@@ -6625,14 +6691,15 @@
global FileName, FileList, Fullscreen, Scaling, Supersample, CacheMode
global TransitionDuration, MouseHideDelay, BoxFadeDuration, ZoomDuration
global ScreenWidth, ScreenHeight, InitialPage, Wrap, TimeTracking
- global AutoAdvance, RenderToDirectory, Rotation, DAR, Verbose
+ global AutoAdvanceTime, AutoAdvanceEnabled, AutoAutoAdvance
+ global RenderToDirectory, Rotation, DAR, Verbose
global BackgroundRendering, UseAutoScreenSize, PollInterval, CacheFileName
global PageRangeStart, PageRangeEnd, FontList, FontSize, Gamma, BlackLevel
global EstimatedDuration, CursorImage, CursorHotspot, MinutesOnly, Overscan
global PDFRendererPath, InfoScriptPath, EventTestMode, EnableCursor
global AutoOverview, DefaultZoomFactor, FadeInOut, ShowLogo, Shuffle
global QuitAtEnd, ShowClock, HalfScreen, SpotRadius, InvertPages
- global MinBoxSize, AutoAutoAdvance, AutoAdvanceProgress, BoxFadeDarkness
+ global MinBoxSize, AutoAdvanceProgress, BoxFadeDarkness
global WindowPos, FakeFullscreen, UseBlurShader, Bare, EnableOverview
global PageProgress, BoxZoomDarkness, MaxZoomFactor, BoxEdgeSize
global TimeDisplay, MouseWheelZoom, ZoomBoxEdgeSize
@@ -6784,8 +6851,12 @@
opterr("invalid parameter for --duration")
if opt in ("-a", "--auto"):
try:
- AutoAdvance = int(float(arg) * 1000)
- assert (AutoAdvance > 0) and (AutoAdvance <= 86400000)
+ if arg.lower().strip('.') in ("0", "00", "off", "none", "false"):
+ AutoAdvanceEnabled = False
+ else:
+ AutoAdvanceTime = int(float(arg) * 1000)
+ assert (AutoAdvanceTime > 0) and (AutoAdvanceTime <= 86400000)
+ AutoAdvanceEnabled = True
except:
opterr("invalid parameter for --auto")
if opt in ("-T", "--transtime"):
1
0
Hello community,
here is the log from the commit of package python-sentry-sdk for openSUSE:Factory checked in at 2019-10-02 11:58:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-sentry-sdk (Old)
and /work/SRC/openSUSE:Factory/.python-sentry-sdk.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-sentry-sdk"
Wed Oct 2 11:58:46 2019 rev:5 rq:734168 version:0.12.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-sentry-sdk/python-sentry-sdk.changes 2019-08-24 18:49:26.365739730 +0200
+++ /work/SRC/openSUSE:Factory/.python-sentry-sdk.new.2352/python-sentry-sdk.changes 2019-10-02 11:58:46.635049904 +0200
@@ -1,0 +2,35 @@
+Mon Sep 30 22:28:19 UTC 2019 - Jimmy Berry <jberry(a)suse.com>
+
+- Add pytest.ini source to ignore deprecation warning from eventlet
+- Disable %check since pytest does not want to follow documentation
+
+-------------------------------------------------------------------
+Mon Sep 30 22:07:37 UTC 2019 - Jimmy Berry <jberry(a)suse.com>
+
+- Update to 0.12.2
+ - Temporarily remove sending of SQL parameters (as part of
+ breadcrumbs or spans for APM) to Sentry to avoid memory
+ consumption issues.
+ - Fix a crash with ASGI (Django Channels) when the ASGI request
+ type is neither HTTP nor Websockets.
+
+-------------------------------------------------------------------
+Thu Sep 19 13:34:03 UTC 2019 - Jimmy Berry <jberry(a)suse.com>
+
+- Update to 0.12.0
+ - Fix a bug where the response object for httplib (or requests)
+ was held onto for an unnecessarily long amount of time.
+ - APM: Add spans for more methods on subprocess.Popen objects.
+ - APM: Add spans for Django middlewares.
+ - APM: Add spans for ASGI requests.
+
+-------------------------------------------------------------------
+Fri Aug 30 15:36:40 UTC 2019 - Jimmy Berry <jberry(a)suse.com>
+
+- Update to 0.11.2
+ - fixed shutdown bug while runnign under eventlet
+ - added missing data to Redis breadcrumbs
+- Include build requirement on python eventlet module for the tests
+ while exclusing a subset of new tests
+
+-------------------------------------------------------------------
Old:
----
python-sentry-sdk-0.11.1.tar.gz
New:
----
pytest.ini
python-sentry-sdk-0.12.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-sentry-sdk.spec ++++++
--- /var/tmp/diff_new_pack.7OiieE/_old 2019-10-02 11:58:47.187048490 +0200
+++ /var/tmp/diff_new_pack.7OiieE/_new 2019-10-02 11:58:47.191048479 +0200
@@ -18,13 +18,14 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-sentry-sdk
-Version: 0.11.1
+Version: 0.12.2
Release: 0
Summary: Python SDK for Sentry.io
License: BSD-2-Clause
Group: Development/Languages/Python
URL: https://github.com/getsentry/sentry-python
Source0: https://github.com/getsentry/sentry-python/archive/%{version}/%{name}-%{ver…
+Source1: pytest.ini
BuildRequires: %{python_module Flask >= 0.8}
BuildRequires: %{python_module blinker >= 1.1}
BuildRequires: %{python_module bottle >= 0.12.13}
@@ -43,6 +44,7 @@
BuildArch: noarch
# SECTION test requirements
BuildRequires: %{python_module Werkzeug}
+BuildRequires: %{python_module eventlet}
BuildRequires: %{python_module gevent}
BuildRequires: %{python_module hypothesis}
BuildRequires: %{python_module pyramid}
@@ -73,8 +75,14 @@
%check
export PYTHONDONTWRITEBYTECODE=1
-# the two tests fail in obs
-%pytest -k 'not (test_scope_initialized_before_client or test_configure_scope_unavailable or test_gevent_is_not_patched)'
+export PYTEST_ADDOPTS="-W ignore::DeprecationWarning"
+
+cp %{SOURCE1} .
+
+# a subset of tests fail on OBS
+# - test_transport_works eventlet parameterized tests fail
+# TODO disable since pytest does not respect filters
+# %%pytest -k 'not (test_scope_initialized_before_client or test_configure_scope_unavailable or test_thread_local_is_patched or test_leaks or test_transport_works or test_iter_stacktraces)'
%files %{python_files}
%doc README.md CHANGES.md
++++++ pytest.ini ++++++
[pytest]
# from eventlet/patcher.py
filterwarnings =
ignore:the imp module is deprecated.*:DeprecationWarning
++++++ python-sentry-sdk-0.11.1.tar.gz -> python-sentry-sdk-0.12.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/CHANGES.md new/sentry-python-0.12.2/CHANGES.md
--- old/sentry-python-0.11.1/CHANGES.md 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/CHANGES.md 2019-09-21 00:41:31.000000000 +0200
@@ -27,6 +27,28 @@
A major release `N` implies the previous release `N-1` will no longer receive updates. We generally do not backport bugfixes to older versions unless they are security relevant. However, feel free to ask for backports of specific commits on the bugtracker.
+## 0.12.2
+
+* Fix a crash with ASGI (Django Channels) when the ASGI request type is neither HTTP nor Websockets.
+
+## 0.12.1
+
+* Temporarily remove sending of SQL parameters (as part of breadcrumbs or spans for APM) to Sentry to avoid memory consumption issues.
+
+## 0.12.0
+
+* Sentry now has a [Discord server](https://discord.gg/cWnMQeA)! Join the server to get involved into SDK development and ask questions.
+* Fix a bug where the response object for httplib (or requests) was held onto for an unnecessarily long amount of time.
+* APM: Add spans for more methods on `subprocess.Popen` objects.
+* APM: Add spans for Django middlewares.
+* APM: Add spans for ASGI requests.
+* Automatically inject the ASGI middleware for Django Channels 2.0. This will **break your Channels 2.0 application if it is running on Python 3.5 or 3.6** (while previously it would "only" leak a lot of memory for each ASGI request). **Install `aiocontextvars` from PyPI to make it work again.**
+
+## 0.11.2
+
+* Fix a bug where the SDK would throw an exception on shutdown when running under eventlet.
+* Add missing data to Redis breadcrumbs.
+
## 0.11.1
* Remove a faulty assertion (observed in environment with Django Channels and ASGI).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/CONTRIBUTING.md new/sentry-python-0.12.2/CONTRIBUTING.md
--- old/sentry-python-0.11.1/CONTRIBUTING.md 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/CONTRIBUTING.md 2019-09-21 00:41:31.000000000 +0200
@@ -4,6 +4,10 @@
install -e .` into some virtualenv, edit the sourcecode and test out your
changes manually.
+## Community
+
+The public-facing channels for support and development of Sentry SDKs can be found on [Discord](https://discord.gg/Ww9hbqr).
+
## Running tests and linters
Make sure you have `virtualenv` installed, and the Python versions you care
@@ -48,6 +52,8 @@
* One code example with basic setup.
+ * Make sure to add integration page to `python/index.md` (people forget to do that all the time).
+
Tip: Put most relevant parts wrapped in `<!--WIZARD-->..<!--ENDWIZARD-->` tags for usage from within the Sentry UI.
3. Merge docs after new version has been released (auto-deploys on merge).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/Makefile new/sentry-python-0.12.2/Makefile
--- old/sentry-python-0.11.1/Makefile 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/Makefile 2019-09-21 00:41:31.000000000 +0200
@@ -54,6 +54,11 @@
@$(VENV_PATH)/bin/sphinx-build -W -b html docs/ docs/_build
.PHONY: apidocs
+apidocs-hotfix: apidocs
+ @$(VENV_PATH)/bin/pip install ghp-import
+ @$(VENV_PATH)/bin/ghp-import -pf docs/_build
+.PHONY: apidocs-hotfix
+
install-zeus-cli:
npm install -g @zeus-ci/cli
.PHONY: install-zeus-cli
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/README.md new/sentry-python-0.12.2/README.md
--- old/sentry-python-0.11.1/README.md 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/README.md 2019-09-21 00:41:31.000000000 +0200
@@ -8,6 +8,7 @@
[![Build Status](https://travis-ci.com/getsentry/sentry-python.svg?branch=master)](h…
[![PyPi page link -- version](https://img.shields.io/pypi/v/sentry-sdk.svg)](https://pypi.python…
+[![Discord](https://img.shields.io/discord/621778831602221064)](https://discord.gg/cWnMQeA)
This is the next line of the Python SDK for [Sentry](http://sentry.io/), intended to replace the `raven` package on PyPI.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/docs/api.rst new/sentry-python-0.12.2/docs/api.rst
--- old/sentry-python-0.11.1/docs/api.rst 1970-01-01 01:00:00.000000000 +0100
+++ new/sentry-python-0.12.2/docs/api.rst 2019-09-21 00:41:31.000000000 +0200
@@ -0,0 +1,9 @@
+========
+Main API
+========
+
+.. inherited-members necessary because of hack for Client and init methods
+
+.. automodule:: sentry_sdk
+ :members:
+ :inherited-members:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/docs/conf.py new/sentry-python-0.12.2/docs/conf.py
--- old/sentry-python-0.11.1/docs/conf.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/docs/conf.py 2019-09-21 00:41:31.000000000 +0200
@@ -22,7 +22,7 @@
copyright = u"2019, Sentry Team and Contributors"
author = u"Sentry Team and Contributors"
-release = "0.11.1"
+release = "0.12.2"
version = ".".join(release.split(".")[:2]) # The short X.Y version.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/docs/index.rst new/sentry-python-0.12.2/docs/index.rst
--- old/sentry-python-0.11.1/docs/index.rst 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/docs/index.rst 2019-09-21 00:41:31.000000000 +0200
@@ -6,8 +6,6 @@
<https://sentry.io/for/python/>`_. For full documentation and other resources
visit the `GitHub repository <https://github.com/getsentry/sentry-python>`_.
-.. inherited-members necessary because of hack for Client and init methods
-
-.. automodule:: sentry_sdk
- :members:
- :inherited-members:
+.. toctree::
+ api
+ integrations
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/docs/integrations.rst new/sentry-python-0.12.2/docs/integrations.rst
--- old/sentry-python-0.11.1/docs/integrations.rst 1970-01-01 01:00:00.000000000 +0100
+++ new/sentry-python-0.12.2/docs/integrations.rst 2019-09-21 00:41:31.000000000 +0200
@@ -0,0 +1,14 @@
+============
+Integrations
+============
+
+Logging
+=======
+
+.. module:: sentry_sdk.integrations.logging
+
+.. autofunction:: ignore_logger
+
+.. autoclass:: EventHandler
+
+.. autoclass:: BreadcrumbHandler
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/consts.py new/sentry-python-0.12.2/sentry_sdk/consts.py
--- old/sentry-python-0.11.1/sentry_sdk/consts.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/consts.py 2019-09-21 00:41:31.000000000 +0200
@@ -49,6 +49,7 @@
# DO NOT ENABLE THIS RIGHT NOW UNLESS YOU WANT TO EXCEED YOUR EVENT QUOTA IMMEDIATELY
traces_sample_rate=0.0, # type: float
traceparent_v2=False, # type: bool
+ _experiments={}, # type: Dict[str, Any]
):
# type: (...) -> None
pass
@@ -71,7 +72,7 @@
del _get_default_options
-VERSION = "0.11.1"
+VERSION = "0.12.2"
SDK_INFO = {
"name": "sentry.python",
"version": VERSION,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/hub.py new/sentry-python-0.12.2/sentry_sdk/hub.py
--- old/sentry-python-0.11.1/sentry_sdk/hub.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/hub.py 2019-09-21 00:41:31.000000000 +0200
@@ -450,7 +450,10 @@
span.sampled = random.random() < sample_rate
if span.sampled:
- span.init_finished_spans()
+ max_spans = (
+ client and client.options["_experiments"].get("max_spans") or 1000
+ )
+ span.init_finished_spans(maxlen=max_spans)
return span
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/integrations/asgi.py new/sentry-python-0.12.2/sentry_sdk/integrations/asgi.py
--- old/sentry-python-0.11.1/sentry_sdk/integrations/asgi.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/integrations/asgi.py 2019-09-21 00:41:31.000000000 +0200
@@ -10,10 +10,28 @@
from sentry_sdk._types import MYPY
from sentry_sdk.hub import Hub, _should_send_default_pii
from sentry_sdk.integrations._wsgi_common import _filter_headers
-from sentry_sdk.utils import transaction_from_function
+from sentry_sdk.utils import ContextVar, event_from_exception, transaction_from_function
+from sentry_sdk.tracing import Span
if MYPY:
from typing import Dict
+ from typing import Any
+
+
+_asgi_middleware_applied = ContextVar("sentry_asgi_middleware_applied")
+
+
+def _capture_exception(hub, exc):
+ # type: (Hub, Any) -> None
+
+ # Check client here as it might have been unset while streaming response
+ if hub.client is not None:
+ event, hint = event_from_exception(
+ exc,
+ client_options=hub.client.options,
+ mechanism={"type": "asgi", "handled": False},
+ )
+ hub.capture_event(event, hint=hint)
class SentryAsgiMiddleware:
@@ -35,20 +53,39 @@
return self._run_app(scope, lambda: self.app(scope, receive, send))
async def _run_app(self, scope, callback):
- hub = Hub.current
- with Hub(hub) as hub:
- with hub.configure_scope() as sentry_scope:
- sentry_scope._name = "asgi"
- sentry_scope.transaction = scope.get("path") or "unknown asgi request"
-
- processor = functools.partial(self.event_processor, asgi_scope=scope)
- sentry_scope.add_event_processor(processor)
-
- try:
- await callback()
- except Exception as exc:
- hub.capture_exception(exc)
- raise exc from None
+ if _asgi_middleware_applied.get(False):
+ return await callback()
+
+ _asgi_middleware_applied.set(True)
+ try:
+ hub = Hub(Hub.current)
+ with hub:
+ with hub.configure_scope() as sentry_scope:
+ sentry_scope.clear_breadcrumbs()
+ sentry_scope._name = "asgi"
+ processor = functools.partial(
+ self.event_processor, asgi_scope=scope
+ )
+ sentry_scope.add_event_processor(processor)
+
+ if scope["type"] in ("http", "websocket"):
+ span = Span.continue_from_headers(dict(scope["headers"]))
+ span.op = "{}.server".format(scope["type"])
+ else:
+ span = Span()
+ span.op = "asgi.server"
+
+ span.set_tag("asgi.type", scope["type"])
+ span.transaction = "generic ASGI request"
+
+ with hub.start_span(span) as span:
+ try:
+ return await callback()
+ except Exception as exc:
+ _capture_exception(hub, exc)
+ raise exc from None
+ finally:
+ _asgi_middleware_applied.set(False)
def event_processor(self, event, hint, asgi_scope):
request_info = event.setdefault("request", {})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/integrations/beam.py new/sentry-python-0.12.2/sentry_sdk/integrations/beam.py
--- old/sentry-python-0.11.1/sentry_sdk/integrations/beam.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/integrations/beam.py 2019-09-21 00:41:31.000000000 +0200
@@ -79,7 +79,15 @@
process_func = getattr(self, func_name)
setattr(self, func_name, _wrap_task_call(process_func))
setattr(self, wrapped_func, process_func)
- return getfullargspec(process_func)
+
+ # getfullargspec is deprecated in more recent beam versions and get_function_args_defaults
+ # (which uses Signatures internally) should be used instead.
+ try:
+ from apache_beam.transforms.core import get_function_args_defaults
+
+ return get_function_args_defaults(process_func)
+ except ImportError:
+ return getfullargspec(process_func)
setattr(_inspect, USED_FUNC, True)
return _inspect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/integrations/django/__init__.py new/sentry-python-0.12.2/sentry_sdk/integrations/django/__init__.py
--- old/sentry-python-0.11.1/sentry_sdk/integrations/django/__init__.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/integrations/django/__init__.py 2019-09-21 00:41:31.000000000 +0200
@@ -9,6 +9,7 @@
from django.core import signals # type: ignore
from sentry_sdk._types import MYPY
+from sentry_sdk.utils import HAS_REAL_CONTEXTVARS
if MYPY:
from typing import Any
@@ -48,6 +49,7 @@
from sentry_sdk.integrations._wsgi_common import RequestExtractor
from sentry_sdk.integrations.django.transactions import LEGACY_RESOLVER
from sentry_sdk.integrations.django.templates import get_template_frame_from_exception
+from sentry_sdk.integrations.django.middleware import patch_django_middlewares
if DJANGO_VERSION < (1, 10):
@@ -68,9 +70,10 @@
identifier = "django"
transaction_style = None
+ middleware_spans = None
- def __init__(self, transaction_style="url"):
- # type: (str) -> None
+ def __init__(self, transaction_style="url", middleware_spans=True):
+ # type: (str, bool) -> None
TRANSACTION_STYLE_VALUES = ("function_name", "url")
if transaction_style not in TRANSACTION_STYLE_VALUES:
raise ValueError(
@@ -78,6 +81,7 @@
% (transaction_style, TRANSACTION_STYLE_VALUES)
)
self.transaction_style = transaction_style
+ self.middleware_spans = middleware_spans
@staticmethod
def setup_once():
@@ -98,9 +102,9 @@
if Hub.current.get_integration(DjangoIntegration) is None:
return old_app(self, environ, start_response)
- return SentryWsgiMiddleware(lambda *a, **kw: old_app(self, *a, **kw))(
- environ, start_response
- )
+ bound_old_app = old_app.__get__(self, WSGIHandler)
+
+ return SentryWsgiMiddleware(bound_old_app)(environ, start_response)
WSGIHandler.__call__ = sentry_patched_wsgi_handler
@@ -208,6 +212,9 @@
id(value),
)
+ _patch_channels()
+ patch_django_middlewares()
+
_DRF_PATCHED = False
_DRF_PATCH_LOCK = threading.Lock()
@@ -266,6 +273,38 @@
APIView.initial = sentry_patched_drf_initial
+def _patch_channels():
+ try:
+ from channels.http import AsgiHandler # type: ignore
+ except ImportError:
+ return
+
+ if not HAS_REAL_CONTEXTVARS:
+ # We better have contextvars or we're going to leak state between
+ # requests.
+ raise RuntimeError(
+ "We detected that you are using Django channels 2.0. To get proper "
+ "instrumentation for ASGI requests, the Sentry SDK requires "
+ "Python 3.7+ or the aiocontextvars package from PyPI."
+ )
+
+ from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
+
+ old_app = AsgiHandler.__call__
+
+ def sentry_patched_asgi_handler(self, receive, send):
+ if Hub.current.get_integration(DjangoIntegration) is None:
+ return old_app(receive, send)
+
+ middleware = SentryAsgiMiddleware(
+ lambda _scope: old_app.__get__(self, AsgiHandler)
+ )
+
+ return middleware(self.scope)(receive, send)
+
+ AsgiHandler.__call__ = sentry_patched_asgi_handler
+
+
def _make_event_processor(weak_request, integration):
# type: (Callable[[], WSGIRequest], DjangoIntegration) -> Callable
def event_processor(event, hint):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/integrations/django/middleware.py new/sentry-python-0.12.2/sentry_sdk/integrations/django/middleware.py
--- old/sentry-python-0.11.1/sentry_sdk/integrations/django/middleware.py 1970-01-01 01:00:00.000000000 +0100
+++ new/sentry-python-0.12.2/sentry_sdk/integrations/django/middleware.py 2019-09-21 00:41:31.000000000 +0200
@@ -0,0 +1,106 @@
+"""
+Create spans from Django middleware invocations
+"""
+
+from functools import wraps
+
+from django import VERSION as DJANGO_VERSION # type: ignore
+
+from sentry_sdk import Hub
+from sentry_sdk.utils import ContextVar, transaction_from_function
+
+_import_string_should_wrap_middleware = ContextVar(
+ "import_string_should_wrap_middleware"
+)
+
+if DJANGO_VERSION < (1, 7):
+ import_string_name = "import_by_path"
+else:
+ import_string_name = "import_string"
+
+
+def patch_django_middlewares():
+ from django.core.handlers import base
+
+ old_import_string = getattr(base, import_string_name)
+
+ def sentry_patched_import_string(dotted_path):
+ rv = old_import_string(dotted_path)
+
+ if _import_string_should_wrap_middleware.get(None):
+ rv = _wrap_middleware(rv, dotted_path)
+
+ return rv
+
+ setattr(base, import_string_name, sentry_patched_import_string)
+
+ old_load_middleware = base.BaseHandler.load_middleware
+
+ def sentry_patched_load_middleware(self):
+ _import_string_should_wrap_middleware.set(True)
+ try:
+ return old_load_middleware(self)
+ finally:
+ _import_string_should_wrap_middleware.set(False)
+
+ base.BaseHandler.load_middleware = sentry_patched_load_middleware
+
+
+def _wrap_middleware(middleware, middleware_name):
+ from sentry_sdk.integrations.django import DjangoIntegration
+
+ def _get_wrapped_method(old_method):
+ @wraps(old_method)
+ def sentry_wrapped_method(*args, **kwargs):
+ hub = Hub.current
+ integration = hub.get_integration(DjangoIntegration)
+ if integration is None or not integration.middleware_spans:
+ return old_method(*args, **kwargs)
+
+ function_name = transaction_from_function(old_method)
+
+ description = middleware_name
+ function_basename = getattr(old_method, "__name__", None)
+ if function_basename:
+ description = "{}.{}".format(description, function_basename)
+
+ with hub.start_span(
+ op="django.middleware", description=description
+ ) as span:
+ span.set_tag("django.function_name", function_name)
+ span.set_tag("django.middleware_name", middleware_name)
+ return old_method(*args, **kwargs)
+
+ return sentry_wrapped_method
+
+ class SentryWrappingMiddleware(object):
+ def __init__(self, *args, **kwargs):
+ self._inner = middleware(*args, **kwargs)
+ self._call_method = None
+
+ # We need correct behavior for `hasattr()`, which we can only determine
+ # when we have an instance of the middleware we're wrapping.
+ def __getattr__(self, method_name):
+ if method_name not in (
+ "process_request",
+ "process_view",
+ "process_template_response",
+ "process_response",
+ "process_exception",
+ ):
+ raise AttributeError()
+
+ old_method = getattr(self._inner, method_name)
+ rv = _get_wrapped_method(old_method)
+ self.__dict__[method_name] = rv
+ return rv
+
+ def __call__(self, *args, **kwargs):
+ if self._call_method is None:
+ self._call_method = _get_wrapped_method(self._inner.__call__)
+ return self._call_method(*args, **kwargs)
+
+ if hasattr(middleware, "__name__"):
+ SentryWrappingMiddleware.__name__ = middleware.__name__
+
+ return SentryWrappingMiddleware
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/integrations/logging.py new/sentry-python-0.12.2/sentry_sdk/integrations/logging.py
--- old/sentry-python-0.11.1/sentry_sdk/integrations/logging.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/integrations/logging.py 2019-09-21 00:41:31.000000000 +0200
@@ -27,12 +27,16 @@
_IGNORED_LOGGERS = set(["sentry_sdk.errors"])
-def ignore_logger(name):
- # type: (str) -> None
+def ignore_logger(
+ name # type: str
+):
+ # type: (...) -> None
"""This disables recording (both in breadcrumbs and as events) calls to
a logger of a specific name. Among other uses, many of our integrations
use this to prevent their actions being recorded as breadcrumbs. Exposed
to users as a way to quiet spammy loggers.
+
+ :param name: The name of the logger to ignore (same string you would pass to ``logging.getLogger``).
"""
_IGNORED_LOGGERS.add(name)
@@ -146,6 +150,12 @@
class EventHandler(logging.Handler, object):
+ """
+ A logging handler that emits Sentry events for each log record
+
+ Note that you do not have to use this class if the logging integration is enabled, which it is by default.
+ """
+
def emit(self, record):
# type: (LogRecord) -> Any
with capture_internal_exceptions():
@@ -204,6 +214,12 @@
class BreadcrumbHandler(logging.Handler, object):
+ """
+ A logging handler that records breadcrumbs for each log record.
+
+ Note that you do not have to use this class if the logging integration is enabled, which it is by default.
+ """
+
def emit(self, record):
# type: (LogRecord) -> Any
with capture_internal_exceptions():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/integrations/modules.py new/sentry-python-0.12.2/sentry_sdk/integrations/modules.py
--- old/sentry-python-0.11.1/sentry_sdk/integrations/modules.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/integrations/modules.py 2019-09-21 00:41:31.000000000 +0200
@@ -46,6 +46,11 @@
@add_global_event_processor
def processor(event, hint):
# type: (Event, Any) -> Dict[str, Any]
- if Hub.current.get_integration(ModulesIntegration) is not None:
- event["modules"] = dict(_get_installed_modules())
+ if event.get("type") == "transaction":
+ return event
+
+ if Hub.current.get_integration(ModulesIntegration) is None:
+ return event
+
+ event["modules"] = dict(_get_installed_modules())
return event
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/integrations/redis.py new/sentry-python-0.12.2/sentry_sdk/integrations/redis.py
--- old/sentry-python-0.11.1/sentry_sdk/integrations/redis.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/integrations/redis.py 2019-09-21 00:41:31.000000000 +0200
@@ -33,6 +33,9 @@
description = " ".join(description_parts)
with hub.start_span(op="redis", description=description) as span:
+ if name:
+ span.set_tag("redis.command", name)
+
if name and args and name.lower() in ("get", "set", "setex", "setnx"):
span.set_tag("redis.key", args[0])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/integrations/stdlib.py new/sentry-python-0.12.2/sentry_sdk/integrations/stdlib.py
--- old/sentry-python-0.11.1/sentry_sdk/integrations/stdlib.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/integrations/stdlib.py 2019-09-21 00:41:31.000000000 +0200
@@ -184,10 +184,41 @@
with hub.start_span(op="subprocess", description=description) as span:
span.set_data("subprocess.cwd", cwd)
- return old_popen_init(self, *a, **kw)
+ rv = old_popen_init(self, *a, **kw)
+
+ span.set_tag("subprocess.pid", self.pid)
+ return rv
subprocess.Popen.__init__ = sentry_patched_popen_init # type: ignore
+ old_popen_wait = subprocess.Popen.wait
+
+ def sentry_patched_popen_wait(self, *a, **kw):
+ hub = Hub.current
+
+ if hub.get_integration(StdlibIntegration) is None:
+ return old_popen_wait(self, *a, **kw)
+
+ with hub.start_span(op="subprocess.wait") as span:
+ span.set_tag("subprocess.pid", self.pid)
+ return old_popen_wait(self, *a, **kw)
+
+ subprocess.Popen.wait = sentry_patched_popen_wait # type: ignore
+
+ old_popen_communicate = subprocess.Popen.communicate
+
+ def sentry_patched_popen_communicate(self, *a, **kw):
+ hub = Hub.current
+
+ if hub.get_integration(StdlibIntegration) is None:
+ return old_popen_communicate(self, *a, **kw)
+
+ with hub.start_span(op="subprocess.communicate") as span:
+ span.set_tag("subprocess.pid", self.pid)
+ return old_popen_communicate(self, *a, **kw)
+
+ subprocess.Popen.communicate = sentry_patched_popen_communicate # type: ignore
+
def get_subprocess_traceparent_headers():
return EnvironHeaders(os.environ, prefix="SUBPROCESS_")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/integrations/wsgi.py new/sentry-python-0.12.2/sentry_sdk/integrations/wsgi.py
--- old/sentry-python-0.11.1/sentry_sdk/integrations/wsgi.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/integrations/wsgi.py 2019-09-21 00:41:31.000000000 +0200
@@ -2,7 +2,11 @@
import sys
from sentry_sdk.hub import Hub, _should_send_default_pii
-from sentry_sdk.utils import capture_internal_exceptions, event_from_exception
+from sentry_sdk.utils import (
+ ContextVar,
+ capture_internal_exceptions,
+ event_from_exception,
+)
from sentry_sdk._compat import PY2, reraise, iteritems
from sentry_sdk.tracing import Span
from sentry_sdk.integrations._wsgi_common import _filter_headers
@@ -26,6 +30,9 @@
E = TypeVar("E")
+_wsgi_middleware_applied = ContextVar("sentry_wsgi_middleware_applied")
+
+
if PY2:
def wsgi_decoding_dance(s, charset="utf-8", errors="replace"):
@@ -83,27 +90,36 @@
def __call__(self, environ, start_response):
# type: (Dict[str, str], Callable) -> _ScopedResponse
- hub = Hub(Hub.current)
+ if _wsgi_middleware_applied.get(False):
+ return self.app(environ, start_response)
- with hub:
- with capture_internal_exceptions():
- with hub.configure_scope() as scope:
- scope.clear_breadcrumbs()
- scope._name = "wsgi"
- scope.add_event_processor(_make_wsgi_event_processor(environ))
-
- span = Span.continue_from_environ(environ)
- span.op = "http.server"
- span.transaction = "generic WSGI request"
-
- with hub.start_span(span) as span:
- try:
- rv = self.app(
- environ,
- functools.partial(_sentry_start_response, start_response, span),
- )
- except BaseException:
- reraise(*_capture_exception(hub))
+ _wsgi_middleware_applied.set(True)
+ try:
+ hub = Hub(Hub.current)
+
+ with hub:
+ with capture_internal_exceptions():
+ with hub.configure_scope() as scope:
+ scope.clear_breadcrumbs()
+ scope._name = "wsgi"
+ scope.add_event_processor(_make_wsgi_event_processor(environ))
+
+ span = Span.continue_from_environ(environ)
+ span.op = "http.server"
+ span.transaction = "generic WSGI request"
+
+ with hub.start_span(span) as span:
+ try:
+ rv = self.app(
+ environ,
+ functools.partial(
+ _sentry_start_response, start_response, span
+ ),
+ )
+ except BaseException:
+ reraise(*_capture_exception(hub))
+ finally:
+ _wsgi_middleware_applied.set(False)
return _ScopedResponse(hub, rv)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/scope.py new/sentry-python-0.12.2/sentry_sdk/scope.py
--- old/sentry-python-0.11.1/sentry_sdk/scope.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/scope.py 2019-09-21 00:41:31.000000000 +0200
@@ -195,6 +195,13 @@
:param func: This function behaves like `before_send.`
"""
+ if len(self._event_processors) > 20:
+ logger.warning(
+ "Too many event processors on scope! Clearing list to free up some memory: %r",
+ self._event_processors,
+ )
+ del self._event_processors[:]
+
self._event_processors.append(func)
def add_error_processor(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/tracing.py new/sentry-python-0.12.2/sentry_sdk/tracing.py
--- old/sentry-python-0.11.1/sentry_sdk/tracing.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/tracing.py 2019-09-21 00:41:31.000000000 +0200
@@ -64,6 +64,31 @@
yield k[len(self.prefix) :]
+class _SpanRecorder(object):
+ __slots__ = ("maxlen", "finished_spans", "open_span_count")
+
+ def __init__(self, maxlen):
+ # type: (int) -> None
+ self.maxlen = maxlen
+ self.open_span_count = 0 # type: int
+ self.finished_spans = [] # type: List[Span]
+
+ def start_span(self, span):
+ # type: (Span) -> None
+
+ # This is just so that we don't run out of memory while recording a lot
+ # of spans. At some point we just stop and flush out the start of the
+ # trace tree (i.e. the first n spans with the smallest
+ # start_timestamp).
+ self.open_span_count += 1
+ if self.open_span_count > self.maxlen:
+ span._span_recorder = None
+
+ def finish_span(self, span):
+ # type: (Span) -> None
+ self.finished_spans.append(span)
+
+
class Span(object):
__slots__ = (
"trace_id",
@@ -78,7 +103,7 @@
"timestamp",
"_tags",
"_data",
- "_finished_spans",
+ "_span_recorder",
"hub",
"_context_manager_state",
)
@@ -107,16 +132,18 @@
self.hub = hub
self._tags = {} # type: Dict[str, str]
self._data = {} # type: Dict[str, Any]
- self._finished_spans = None # type: Optional[List[Span]]
self.start_timestamp = datetime.now()
#: End timestamp of span
self.timestamp = None # type: Optional[datetime]
- def init_finished_spans(self):
- # type: () -> None
- if self._finished_spans is None:
- self._finished_spans = []
+ self._span_recorder = None # type: Optional[_SpanRecorder]
+
+ def init_finished_spans(self, maxlen):
+ # type: (int) -> None
+ if self._span_recorder is None:
+ self._span_recorder = _SpanRecorder(maxlen)
+ self._span_recorder.start_span(self)
def __repr__(self):
# type: () -> str
@@ -162,7 +189,8 @@
sampled=self.sampled,
**kwargs
)
- rv._finished_spans = self._finished_spans
+
+ rv._span_recorder = self._span_recorder
return rv
@classmethod
@@ -191,7 +219,7 @@
if traceparent.startswith("00-") and traceparent.endswith("-00"):
traceparent = traceparent[3:-3]
- match = _traceparent_header_format_re.match(traceparent)
+ match = _traceparent_header_format_re.match(str(traceparent))
if match is None:
return None
@@ -252,11 +280,13 @@
self.timestamp = datetime.now()
- if self._finished_spans is not None:
- self._finished_spans.append(self)
-
_maybe_create_breadcrumbs_from_span(hub, self)
+ if self._span_recorder is None:
+ return None
+
+ self._span_recorder.finish_span(self)
+
if self.transaction is None:
# If this has no transaction set we assume there's a parent
# transaction for this span that would be flushed out eventually.
@@ -285,7 +315,9 @@
"timestamp": self.timestamp,
"start_timestamp": self.start_timestamp,
"spans": [
- s.to_json() for s in (self._finished_spans or ()) if s is not self
+ s.to_json()
+ for s in self._span_recorder.finished_spans
+ if s is not self
],
}
)
@@ -354,11 +386,19 @@
executemany, # type: bool
):
# type: (...) -> Generator[Span, None, None]
- if not params_list or params_list == [None]:
- params_list = None
- if paramstyle == "pyformat":
- paramstyle = "format"
+ # TODO: Bring back capturing of params by default
+ if hub.client and hub.client.options["_experiments"].get(
+ "record_sql_params", False
+ ):
+ if not params_list or params_list == [None]:
+ params_list = None
+
+ if paramstyle == "pyformat":
+ paramstyle = "format"
+ else:
+ params_list = None
+ paramstyle = None
query = _format_sql(cursor, query)
@@ -394,18 +434,21 @@
def _maybe_create_breadcrumbs_from_span(hub, span):
# type: (sentry_sdk.Hub, Span) -> None
if span.op == "redis":
- hub.add_breadcrumb(type="redis", category="redis", data=span._tags)
+ hub.add_breadcrumb(
+ message=span.description, type="redis", category="redis", data=span._tags
+ )
elif span.op == "http" and span.is_success():
hub.add_breadcrumb(
type="http",
category="httplib",
data=span._data,
- hint={"httplib_response": span._data.get("httplib_response")},
+ hint={"httplib_response": span._data.pop("httplib_response", None)},
)
elif span.op == "subprocess":
hub.add_breadcrumb(
type="subprocess",
category="subprocess",
+ message=span.description,
data=span._data,
- hint={"popen_instance": span._data.get("popen_instance")},
+ hint={"popen_instance": span._data.pop("popen_instance", None)},
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/sentry_sdk/worker.py new/sentry-python-0.12.2/sentry_sdk/worker.py
--- old/sentry-python-0.11.1/sentry_sdk/worker.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/sentry_sdk/worker.py 2019-09-21 00:41:31.000000000 +0200
@@ -45,16 +45,33 @@
# type: (float) -> bool
deadline = time() + timeout
queue = self._queue
- queue.all_tasks_done.acquire() # type: ignore
+
+ real_all_tasks_done = getattr(
+ queue, "all_tasks_done", None
+ ) # type: Optional[Any]
+ if real_all_tasks_done is not None:
+ real_all_tasks_done.acquire()
+ all_tasks_done = real_all_tasks_done # type: Optional[Any]
+ elif queue.__module__.startswith("eventlet."):
+ all_tasks_done = getattr(queue, "_cond", None)
+ else:
+ all_tasks_done = None
+
try:
while queue.unfinished_tasks: # type: ignore
delay = deadline - time()
if delay <= 0:
return False
- queue.all_tasks_done.wait(timeout=delay) # type: ignore
+ if all_tasks_done is not None:
+ all_tasks_done.wait(timeout=delay)
+ else:
+ # worst case, we just poll the number of remaining tasks
+ sleep(0.1)
+
return True
finally:
- queue.all_tasks_done.release() # type: ignore
+ if real_all_tasks_done is not None:
+ real_all_tasks_done.release() # type: ignore
def start(self):
# type: () -> None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/setup.py new/sentry-python-0.12.2/setup.py
--- old/sentry-python-0.11.1/setup.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/setup.py 2019-09-21 00:41:31.000000000 +0200
@@ -12,7 +12,7 @@
setup(
name="sentry-sdk",
- version="0.11.1",
+ version="0.12.2",
author="Sentry Team and Contributors",
author_email="hello(a)getsentry.com",
url="https://github.com/getsentry/sentry-python",
@@ -23,7 +23,7 @@
package_data={"sentry_sdk": ["py.typed"]},
zip_safe=False,
license="BSD",
- install_requires=["urllib3", "certifi"],
+ install_requires=["urllib3>=1.9", "certifi"],
extras_require={
"flask": ["flask>=0.8", "blinker>=1.1"],
"bottle": ["bottle>=0.12.13"],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/test-requirements.txt new/sentry-python-0.12.2/test-requirements.txt
--- old/sentry-python-0.11.1/test-requirements.txt 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/test-requirements.txt 2019-09-21 00:41:31.000000000 +0200
@@ -2,7 +2,8 @@
pytest==3.7.3
pytest-xdist==1.23.0
tox==3.7.0
-Werkzeug==0.14.1
+Werkzeug==0.15.3
pytest-localserver==0.4.1
pytest-cov==2.6.0
gevent
+eventlet
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/conftest.py new/sentry-python-0.12.2/tests/conftest.py
--- old/sentry-python-0.11.1/tests/conftest.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/conftest.py 2019-09-21 00:41:31.000000000 +0200
@@ -4,6 +4,9 @@
import pytest
+import gevent
+import eventlet
+
import sentry_sdk
from sentry_sdk._compat import reraise, string_types, iteritems
from sentry_sdk.transport import Transport
@@ -100,6 +103,9 @@
if "Something has already installed a non-asyncio" in str(warning.message):
continue
+ if "dns.hash" in str(warning.message) or "dns/namedict" in warning.filename:
+ continue
+
raise AssertionError(warning)
@@ -235,3 +241,29 @@
def read_flush(self):
assert self.file.readline() == b"flush\n"
+
+
+# scope=session ensures that fixture is run earlier
+(a)pytest.fixture(scope="session", params=[None, "eventlet", "gevent"])
+def maybe_monkeypatched_threading(request):
+ if request.param == "eventlet":
+ try:
+ eventlet.monkey_patch()
+ except AttributeError as e:
+ if "'thread.RLock' object has no attribute" in str(e):
+ # https://bitbucket.org/pypy/pypy/issues/2962/gevent-cannot-patch-rlock-under…
+ pytest.skip("https://github.com/eventlet/eventlet/issues/546")
+ else:
+ raise
+ elif request.param == "gevent":
+ try:
+ gevent.monkey.patch_all()
+ except Exception as e:
+ if "_RLock__owner" in str(e):
+ pytest.skip("https://github.com/gevent/gevent/issues/1380")
+ else:
+ raise
+ else:
+ assert request.param is None
+
+ return request.param
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/asgi/test_asgi.py new/sentry-python-0.12.2/tests/integrations/asgi/test_asgi.py
--- old/sentry-python-0.11.1/tests/integrations/asgi/test_asgi.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/asgi/test_asgi.py 2019-09-21 00:41:31.000000000 +0200
@@ -33,7 +33,7 @@
events = capture_events()
client = TestClient(app)
- response = client.get("/sync-message?foo=bar")
+ response = client.get("/sync-message?foo=bar", headers={"Foo": u"ä"})
assert response.status_code == 200
@@ -46,6 +46,7 @@
"connection",
"host",
"user-agent",
+ "foo",
}
assert event["request"]["query_string"] == "foo=bar"
assert event["request"]["url"].endswith("/sync-message")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/django/channels/test_channels.py new/sentry-python-0.12.2/tests/integrations/django/channels/test_channels.py
--- old/sentry-python-0.11.1/tests/integrations/django/channels/test_channels.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/django/channels/test_channels.py 2019-09-21 00:41:31.000000000 +0200
@@ -3,6 +3,7 @@
from channels.testing import HttpCommunicator
+from sentry_sdk import capture_message
from sentry_sdk.integrations.django import DjangoIntegration
from tests.integrations.django.myapp.asgi import application
@@ -32,3 +33,7 @@
"query_string": "test=query",
"url": "/view-exc",
}
+
+ capture_message("hi")
+ event = events[-1]
+ assert "request" not in event
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/django/myapp/asgi.py new/sentry-python-0.12.2/tests/integrations/django/myapp/asgi.py
--- old/sentry-python-0.11.1/tests/integrations/django/myapp/asgi.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/django/myapp/asgi.py 2019-09-21 00:41:31.000000000 +0200
@@ -12,8 +12,4 @@
)
django.setup()
-
-from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
-
application = get_default_application()
-application = SentryAsgiMiddleware(application)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/django/myapp/urls.py new/sentry-python-0.12.2/tests/integrations/django/myapp/urls.py
--- old/sentry-python-0.11.1/tests/integrations/django/myapp/urls.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/django/myapp/urls.py 2019-09-21 00:41:31.000000000 +0200
@@ -35,6 +35,11 @@
path("classbased", views.ClassBasedView.as_view(), name="classbased"),
path("post-echo", views.post_echo, name="post_echo"),
path("template-exc", views.template_exc, name="template_exc"),
+ path(
+ "permission-denied-exc",
+ views.permission_denied_exc,
+ name="permission_denied_exc",
+ ),
]
@@ -50,6 +55,13 @@
)
)
urlpatterns.append(path("rest-hello", views.rest_hello, name="rest_hello"))
+ urlpatterns.append(
+ path(
+ "rest-permission-denied-exc",
+ views.rest_permission_denied_exc,
+ name="rest_permission_denied_exc",
+ )
+ )
except AttributeError:
pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/django/myapp/views.py new/sentry-python-0.12.2/tests/integrations/django/myapp/views.py
--- old/sentry-python-0.11.1/tests/integrations/django/myapp/views.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/django/myapp/views.py 2019-09-21 00:41:31.000000000 +0200
@@ -1,5 +1,6 @@
from django.contrib.auth import login
from django.contrib.auth.models import User
+from django.core.exceptions import PermissionDenied
from django.http import HttpResponse, HttpResponseServerError, HttpResponseNotFound
from django.shortcuts import render
from django.views.generic import ListView
@@ -20,6 +21,10 @@
def rest_hello(request):
return HttpResponse("ok")
+ @api_view(["GET"])
+ def rest_permission_denied_exc(request):
+ raise PermissionDenied("bye")
+
except ImportError:
pass
@@ -73,3 +78,7 @@
def template_exc(request, *args, **kwargs):
return render(request, "error.html")
+
+
+def permission_denied_exc(*args, **kwargs):
+ raise PermissionDenied("bye")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/django/test_basic.py new/sentry-python-0.12.2/tests/integrations/django/test_basic.py
--- old/sentry-python-0.11.1/tests/integrations/django/test_basic.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/django/test_basic.py 2019-09-21 00:41:31.000000000 +0200
@@ -2,6 +2,7 @@
import json
from werkzeug.test import Client
+from django import VERSION as DJANGO_VERSION
from django.contrib.auth.models import User
from django.core.management import execute_from_command_line
from django.db.utils import OperationalError, ProgrammingError, DataError
@@ -56,7 +57,7 @@
assert event["request"] == {
"cookies": {},
"env": {"SERVER_NAME": "localhost", "SERVER_PORT": "80"},
- "headers": {"Content-Length": "0", "Content-Type": "", "Host": "localhost"},
+ "headers": {"Host": "localhost"},
"method": "GET",
"query_string": "",
"url": "http://localhost/message",
@@ -135,7 +136,7 @@
assert event["level"] == "error"
assert event["request"] == {
"env": {"SERVER_NAME": "localhost", "SERVER_PORT": "80"},
- "headers": {"Content-Length": "0", "Content-Type": "", "Host": "localhost"},
+ "headers": {"Host": "localhost"},
"method": "POST",
"query_string": "",
"url": "http://localhost/404",
@@ -169,7 +170,9 @@
sentry_init(
integrations=[DjangoIntegration()] if with_integration else [],
send_default_pii=True,
+ _experiments={"record_sql_params": True},
)
+
from django.db import connection
sql = connection.cursor()
@@ -192,7 +195,11 @@
@pytest.mark.django_db
def test_sql_dict_query_params(sentry_init, capture_events):
- sentry_init(integrations=[DjangoIntegration()], send_default_pii=True)
+ sentry_init(
+ integrations=[DjangoIntegration()],
+ send_default_pii=True,
+ _experiments={"record_sql_params": True},
+ )
from django.db import connections
@@ -229,7 +236,11 @@
)
@pytest.mark.django_db
def test_sql_psycopg2_string_composition(sentry_init, capture_events, query):
- sentry_init(integrations=[DjangoIntegration()], send_default_pii=True)
+ sentry_init(
+ integrations=[DjangoIntegration()],
+ send_default_pii=True,
+ _experiments={"record_sql_params": True},
+ )
from django.db import connections
if "postgres" not in connections:
@@ -253,7 +264,11 @@
@pytest.mark.django_db
def test_sql_psycopg2_placeholders(sentry_init, capture_events):
- sentry_init(integrations=[DjangoIntegration()], send_default_pii=True)
+ sentry_init(
+ integrations=[DjangoIntegration()],
+ send_default_pii=True,
+ _experiments={"record_sql_params": True},
+ )
from django.db import connections
if "postgres" not in connections:
@@ -479,3 +494,69 @@
assert event["exception"]["values"][0]["mechanism"]["type"] == "django"
assert event["request"] == event_request(route)
+
+
+(a)pytest.mark.parametrize(
+ "endpoint", ["rest_permission_denied_exc", "permission_denied_exc"]
+)
+def test_does_not_capture_403(sentry_init, client, capture_events, endpoint):
+ if endpoint == "rest_permission_denied_exc":
+ pytest.importorskip("rest_framework")
+
+ sentry_init(integrations=[DjangoIntegration()])
+ events = capture_events()
+
+ _content, status, _headers = client.get(reverse(endpoint))
+ assert status.lower() == "403 forbidden"
+
+ assert not events
+
+
+def test_middleware_spans(sentry_init, client, capture_events):
+ sentry_init(
+ integrations=[DjangoIntegration()],
+ traces_sample_rate=1.0,
+ _experiments={"record_sql_params": True},
+ )
+ events = capture_events()
+
+ _content, status, _headers = client.get(reverse("message"))
+
+ message, transaction = events
+
+ assert message["message"] == "hi"
+
+ for middleware in transaction["spans"]:
+ assert middleware["op"] == "django.middleware"
+
+ if DJANGO_VERSION >= (1, 10):
+ reference_value = [
+ "tests.integrations.django.myapp.settings.TestMiddleware.__call__",
+ "django.contrib.auth.middleware.AuthenticationMiddleware.__call__",
+ "django.contrib.sessions.middleware.SessionMiddleware.__call__",
+ ]
+ else:
+ reference_value = [
+ "django.contrib.sessions.middleware.SessionMiddleware.process_request",
+ "django.contrib.auth.middleware.AuthenticationMiddleware.process_request",
+ "tests.integrations.django.myapp.settings.TestMiddleware.process_request",
+ "tests.integrations.django.myapp.settings.TestMiddleware.process_response",
+ "django.contrib.sessions.middleware.SessionMiddleware.process_response",
+ ]
+
+ assert [t["description"] for t in transaction["spans"]] == reference_value
+
+
+def test_middleware_spans_disabled(sentry_init, client, capture_events):
+ sentry_init(
+ integrations=[DjangoIntegration(middleware_spans=False)], traces_sample_rate=1.0
+ )
+ events = capture_events()
+
+ _content, status, _headers = client.get(reverse("message"))
+
+ message, transaction = events
+
+ assert message["message"] == "hi"
+
+ assert not transaction["spans"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/pyramid/test_pyramid.py new/sentry-python-0.12.2/tests/integrations/pyramid/test_pyramid.py
--- old/sentry-python-0.11.1/tests/integrations/pyramid/test_pyramid.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/pyramid/test_pyramid.py 2019-09-21 00:41:31.000000000 +0200
@@ -101,7 +101,7 @@
assert event["message"] == "yoo"
assert event["request"] == {
"env": {"SERVER_NAME": "localhost", "SERVER_PORT": "80"},
- "headers": {"Content-Length": "0", "Content-Type": "", "Host": "localhost"},
+ "headers": {"Host": "localhost"},
"method": "GET",
"query_string": "",
"url": "http://localhost/message/yoo",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/redis/test_redis.py new/sentry-python-0.12.2/tests/integrations/redis/test_redis.py
--- old/sentry-python-0.11.1/tests/integrations/redis/test_redis.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/redis/test_redis.py 2019-09-21 00:41:31.000000000 +0200
@@ -18,7 +18,8 @@
assert crumb == {
"category": "redis",
- "data": {"redis.key": "foobar"},
+ "message": "GET 'foobar'",
+ "data": {"redis.key": "foobar", "redis.command": "GET"},
"timestamp": crumb["timestamp"],
"type": "redis",
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/requests/test_requests.py new/sentry-python-0.12.2/tests/integrations/requests/test_requests.py
--- old/sentry-python-0.11.1/tests/integrations/requests/test_requests.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/requests/test_requests.py 2019-09-21 00:41:31.000000000 +0200
@@ -23,5 +23,4 @@
"method": "GET",
"status_code": 418,
"reason": "I'M A TEAPOT",
- "httplib_response": crumb["data"]["httplib_response"],
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/sqlalchemy/test_sqlalchemy.py new/sentry-python-0.12.2/tests/integrations/sqlalchemy/test_sqlalchemy.py
--- old/sentry-python-0.11.1/tests/integrations/sqlalchemy/test_sqlalchemy.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/sqlalchemy/test_sqlalchemy.py 2019-09-21 00:41:31.000000000 +0200
@@ -8,7 +8,9 @@
def test_orm_queries(sentry_init, capture_events):
- sentry_init(integrations=[SqlalchemyIntegration()])
+ sentry_init(
+ integrations=[SqlalchemyIntegration()], _experiments={"record_sql_params": True}
+ )
events = capture_events()
Base = declarative_base()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/stdlib/test_httplib.py new/sentry-python-0.12.2/tests/integrations/stdlib/test_httplib.py
--- old/sentry-python-0.11.1/tests/integrations/stdlib/test_httplib.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/stdlib/test_httplib.py 2019-09-21 00:41:31.000000000 +0200
@@ -1,3 +1,6 @@
+import platform
+import sys
+
import pytest
try:
@@ -32,7 +35,6 @@
"method": "GET",
"status_code": 200,
"reason": "OK",
- "httplib_response": crumb["data"]["httplib_response"],
}
@@ -62,9 +64,11 @@
"status_code": 200,
"reason": "OK",
"extra": "foo",
- "httplib_response": crumb["data"]["httplib_response"],
}
+ if platform.python_implementation() != "PyPy":
+ assert sys.getrefcount(response) == 2
+
def test_httplib_misuse(sentry_init, capture_events):
"""HTTPConnection.getresponse must be called after every call to
@@ -104,5 +108,4 @@
"method": "GET",
"status_code": 200,
"reason": "OK",
- "httplib_response": crumb["data"]["httplib_response"],
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/stdlib/test_subprocess.py new/sentry-python-0.12.2/tests/integrations/stdlib/test_subprocess.py
--- old/sentry-python-0.11.1/tests/integrations/stdlib/test_subprocess.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/stdlib/test_subprocess.py 2019-09-21 00:41:31.000000000 +0200
@@ -38,11 +38,12 @@
True,
marks=pytest.mark.skipif(
platform.python_implementation() == "PyPy",
- reason="https://github.com/getsentry/sentry-python/pull/449",
+ reason="https://bitbucket.org/pypy/pypy/issues/3050/subprocesspopen-only-accepts-se…",
),
),
False,
],
+ ids=("as_iterator", "as_list"),
)
@pytest.mark.parametrize("env_mapping", [None, os.environ, ImmutableDict(os.environ)])
@pytest.mark.parametrize("with_cwd", [True, False])
@@ -126,20 +127,48 @@
assert crumb == {
"category": "subprocess",
"data": data,
+ "message": crumb["message"],
"timestamp": crumb["timestamp"],
"type": "subprocess",
}
+ if not iterator:
+ assert crumb["message"].startswith(sys.executable + " ")
+
assert transaction_event["type"] == "transaction"
- subprocess_span, = transaction_event["spans"]
+ subprocess_init_span, subprocess_wait_span, subprocess_communicate_span = transaction_event[
+ "spans"
+ ]
+
+ assert subprocess_init_span["op"] == "subprocess"
+ assert subprocess_communicate_span["op"] == "subprocess.communicate"
+ assert subprocess_wait_span["op"] == "subprocess.wait"
+
+ # span hierarchy
+ assert (
+ subprocess_wait_span["parent_span_id"] == subprocess_communicate_span["span_id"]
+ )
+ assert (
+ subprocess_communicate_span["parent_span_id"]
+ == subprocess_init_span["parent_span_id"]
+ == transaction_event["contexts"]["trace"]["span_id"]
+ )
+
+ # common data
+ assert (
+ subprocess_init_span["tags"]["subprocess.pid"]
+ == subprocess_wait_span["tags"]["subprocess.pid"]
+ == subprocess_communicate_span["tags"]["subprocess.pid"]
+ )
- assert subprocess_span["data"] == data
+ # data of init span
+ assert subprocess_init_span["data"] == data
if iterator:
- assert "iterator" in subprocess_span["description"]
- assert subprocess_span["description"].startswith("<")
+ assert "iterator" in subprocess_init_span["description"]
+ assert subprocess_init_span["description"].startswith("<")
else:
- assert sys.executable + " -c" in subprocess_span["description"]
+ assert sys.executable + " -c" in subprocess_init_span["description"]
def test_subprocess_invalid_args(sentry_init):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/integrations/wsgi/test_wsgi.py new/sentry-python-0.12.2/tests/integrations/wsgi/test_wsgi.py
--- old/sentry-python-0.11.1/tests/integrations/wsgi/test_wsgi.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/integrations/wsgi/test_wsgi.py 2019-09-21 00:41:31.000000000 +0200
@@ -49,7 +49,7 @@
assert event["request"] == {
"env": {"SERVER_NAME": "localhost", "SERVER_PORT": "80"},
- "headers": {"Content-Length": "0", "Content-Type": "", "Host": "localhost"},
+ "headers": {"Host": "localhost"},
"method": "GET",
"query_string": "",
"url": "http://localhost/",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/test_tracing.py new/sentry-python-0.12.2/tests/test_tracing.py
--- old/sentry-python-0.11.1/tests/test_tracing.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/test_tracing.py 2019-09-21 00:41:31.000000000 +0200
@@ -127,3 +127,18 @@
gc.collect()
assert len(references) == expected_refcount
+
+
+def test_span_trimming(sentry_init, capture_events):
+ sentry_init(traces_sample_rate=1.0, _experiments={"max_spans": 3})
+ events = capture_events()
+
+ with Hub.current.start_span(transaction="hi"):
+ for i in range(10):
+ with Hub.current.start_span(op="foo{}".format(i)):
+ pass
+
+ event, = events
+ span1, span2 = event["spans"]
+ assert span1["op"] == "foo0"
+ assert span2["op"] == "foo1"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/test_transport.py new/sentry-python-0.12.2/tests/test_transport.py
--- old/sentry-python-0.11.1/tests/test_transport.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/test_transport.py 2019-09-21 00:41:31.000000000 +0200
@@ -22,8 +22,19 @@
@pytest.mark.parametrize("debug", (True, False))
-def test_transport_works(httpserver, request, capsys, caplog, debug, make_client):
+(a)pytest.mark.parametrize("client_flush_method", ["close", "flush"])
+def test_transport_works(
+ httpserver,
+ request,
+ capsys,
+ caplog,
+ debug,
+ make_client,
+ client_flush_method,
+ maybe_monkeypatched_threading,
+):
httpserver.serve_content("ok", 200)
+
caplog.set_level(logging.DEBUG)
client = make_client(
@@ -34,7 +45,8 @@
add_breadcrumb(level="info", message="i like bread", timestamp=datetime.now())
capture_message("löl")
- client.close()
+
+ getattr(client, client_flush_method)()
out, err = capsys.readouterr()
assert not err and not out
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tests/utils/test_contextvars.py new/sentry-python-0.12.2/tests/utils/test_contextvars.py
--- old/sentry-python-0.11.1/tests/utils/test_contextvars.py 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tests/utils/test_contextvars.py 2019-09-21 00:41:31.000000000 +0200
@@ -1,37 +1,18 @@
import random
import time
-import pytest
-import gevent
-
from sentry_sdk.utils import _is_threading_local_monkey_patched
-def try_gevent_patch_all():
- try:
- gevent.monkey.patch_all()
- except Exception as e:
- if "_RLock__owner" in str(e):
- pytest.skip("https://github.com/gevent/gevent/issues/1380")
- else:
- raise
-
-
-def test_gevent_is_patched():
- try_gevent_patch_all()
- assert _is_threading_local_monkey_patched()
-
-
-def test_gevent_is_not_patched():
- assert not _is_threading_local_monkey_patched()
-
+def test_thread_local_is_patched(maybe_monkeypatched_threading):
+ if maybe_monkeypatched_threading is None:
+ assert not _is_threading_local_monkey_patched()
+ else:
+ assert _is_threading_local_monkey_patched()
-(a)pytest.mark.parametrize("with_gevent", [True, False])
-def test_leaks(with_gevent):
- if with_gevent:
- try_gevent_patch_all()
+def test_leaks(maybe_monkeypatched_threading):
import threading
# Need to explicitly call _get_contextvars because the SDK has already
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sentry-python-0.11.1/tox.ini new/sentry-python-0.12.2/tox.ini
--- old/sentry-python-0.11.1/tox.ini 2019-08-19 12:46:07.000000000 +0200
+++ new/sentry-python-0.12.2/tox.ini 2019-09-21 00:41:31.000000000 +0200
@@ -32,8 +32,8 @@
{pypy,py2.7,py3.5,py3.6,py3.7,py3.8}-celery-{4.1,4.2,4.3}
{pypy,py2.7}-celery-3
- {py2.7,py3.6}-beam-{12,13,master}
- py3.7-beam-{12,13}
+ py2.7-beam-{12,13}
+ py3.7-beam-{12,13, master}
# The aws_lambda tests deploy to the real AWS and have their own matrix of Python versions.
py3.7-aws_lambda
1
0
Hello community,
here is the log from the commit of package python-openqa_review for openSUSE:Factory checked in at 2019-10-02 11:58:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-openqa_review (Old)
and /work/SRC/openSUSE:Factory/.python-openqa_review.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-openqa_review"
Wed Oct 2 11:58:42 2019 rev:28 rq:734161 version:1.15.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-openqa_review/python-openqa_review.changes 2018-12-24 11:47:48.209112150 +0100
+++ /work/SRC/openSUSE:Factory/.python-openqa_review.new.2352/python-openqa_review.changes 2019-10-02 11:58:45.291053349 +0200
@@ -1,0 +2,23 @@
+Mon Sep 30 21:06:47 UTC 2019 - okurz(a)suse.com
+
+- Update to version 1.15.0:
+ * Fix new style check Q003 about quotes
+ * Update tested python versions to 3.6 (Leap), 3.7 (Tumbleweed)
+ * Use consistent single-tick default quoting style
+ * Also skip output of "Skipped tests" when option for skipping empty is enabled
+ * Fix superfluous blank line in output after "Skipped tests"
+ * Fix deprecation warning about "log.warn"
+ * Delete superfluous blank line
+ * Use same text format for "Skipped tests" as for "issues" and "bugs"
+ * Fix all style issues introduced by PR #119 and #121
+ * Fix tests for pika 1.0
+ * Skipped tests includes links
+ * Fix output of 'type' for debugging
+ * Another try to fix ASCII encoding errors in python2
+ * Add testdata for unicode signs *everywhere*
+ * Fix sporadic ASCII encoding errors in python2 on complete report
+ * openqa-review-daily-email: Save time by skipping report-links
+ * openqa-review-daily-email: Allow to override the temporary output directory
+ * Fix style for flake 3.7.5
+
+-------------------------------------------------------------------
Old:
----
python-openqa_review-1.14.1.obscpio
New:
----
python-openqa_review-1.15.0.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-openqa_review.spec ++++++
--- /var/tmp/diff_new_pack.YS9CiG/_old 2019-10-02 11:58:46.083051319 +0200
+++ /var/tmp/diff_new_pack.YS9CiG/_new 2019-10-02 11:58:46.087051309 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -31,7 +31,7 @@
%define binaries openqa-review openqa-review-daily-email openqa-review-sles-ha tumblesle-release openqa-review-functional_yast_concise
%define oldpython python
Name: python-%{short_name}%{?name_ext}
-Version: 1.14.1
+Version: 1.15.0
Release: 0
Summary: A review helper script for openQA
License: MIT
++++++ python-openqa_review-1.14.1.obscpio -> python-openqa_review-1.15.0.obscpio ++++++
++++ 11784 lines of diff (skipped)
++++++ python-openqa_review.obsinfo ++++++
--- /var/tmp/diff_new_pack.YS9CiG/_old 2019-10-02 11:58:46.447050386 +0200
+++ /var/tmp/diff_new_pack.YS9CiG/_new 2019-10-02 11:58:46.447050386 +0200
@@ -1,5 +1,5 @@
name: python-openqa_review
-version: 1.14.1
-mtime: 1545125551
-commit: bb61b9a83b63ccf21478a12128bd4ac042963b44
+version: 1.15.0
+mtime: 1569877106
+commit: a28a115190a55cfee6db7d23540a0c7b34e141d3
1
0
Hello community,
here is the log from the commit of package strawberry for openSUSE:Factory checked in at 2019-10-02 11:58:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/strawberry (Old)
and /work/SRC/openSUSE:Factory/.strawberry.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "strawberry"
Wed Oct 2 11:58:39 2019 rev:15 rq:734155 version:0.6.5
Changes:
--------
--- /work/SRC/openSUSE:Factory/strawberry/strawberry.changes 2019-09-26 20:40:59.850580411 +0200
+++ /work/SRC/openSUSE:Factory/.strawberry.new.2352/strawberry.changes 2019-10-02 11:58:41.891062063 +0200
@@ -1,0 +2,11 @@
+Mon Sep 30 20:12:01 UTC 2019 - Jonas Kvinge <jonas(a)jkvinge.net>
+
+- Update to version 0.6.5
+ + Fixed scrobbler not to send scrobbles multiple times when metadata is updated
+ + Fixed Listenbrainz scrobbler not to send "various artists" as album artist
+ + Fixed missing cover image in OSD pretty reposition image
+ + Fixed OSD pretty upper left positioning
+ + Fixed OSD pretty positioning on Windows on screens with negative geometry
+ + Fixed appdata file to pass full validation
+
+-------------------------------------------------------------------
Old:
----
strawberry-0.6.4.tar.xz
New:
----
strawberry-0.6.5.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ strawberry.spec ++++++
--- /var/tmp/diff_new_pack.bN45MB/_old 2019-10-02 11:58:42.619060197 +0200
+++ /var/tmp/diff_new_pack.bN45MB/_new 2019-10-02 11:58:42.619060197 +0200
@@ -17,7 +17,7 @@
Name: strawberry
-Version: 0.6.4
+Version: 0.6.5
Release: 0
Summary: A music player and music collection organizer
License: GPL-3.0-or-later
++++++ strawberry-0.6.4.tar.xz -> strawberry-0.6.5.tar.xz ++++++
/work/SRC/openSUSE:Factory/strawberry/strawberry-0.6.4.tar.xz /work/SRC/openSUSE:Factory/.strawberry.new.2352/strawberry-0.6.5.tar.xz differ: char 26, line 1
1
0
Hello community,
here is the log from the commit of package libchipcard for openSUSE:Factory checked in at 2019-10-02 11:58:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libchipcard (Old)
and /work/SRC/openSUSE:Factory/.libchipcard.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libchipcard"
Wed Oct 2 11:58:36 2019 rev:19 rq:734154 version:5.0.99
Changes:
--------
--- /work/SRC/openSUSE:Factory/libchipcard/libchipcard.changes 2019-04-25 17:59:27.040864381 +0200
+++ /work/SRC/openSUSE:Factory/.libchipcard.new.2352/libchipcard.changes 2019-10-02 11:58:37.499073319 +0200
@@ -1,0 +2,6 @@
+Mon Sep 30 16:04:48 UTC 2019 - wbauer(a)tmo.at
+
+- Don't hardcode gwenhywfar-plugins version in the filelist, to fix
+ build with newer gwenhywfar
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ libchipcard.spec ++++++
--- /var/tmp/diff_new_pack.BwheOA/_old 2019-10-02 11:58:38.099071781 +0200
+++ /var/tmp/diff_new_pack.BwheOA/_new 2019-10-02 11:58:38.103071771 +0200
@@ -116,8 +116,8 @@
# Own dirs to fix build.
%dir %{_libdir}/gwenhywfar/
%dir %{_libdir}/gwenhywfar/plugins/
-%dir %{_libdir}/gwenhywfar/plugins/60
-%{_libdir}/gwenhywfar/plugins/60/ct
+%dir %{_libdir}/gwenhywfar/plugins/*
+%{_libdir}/gwenhywfar/plugins/*/ct
%config %{_sysconfdir}/chipcard
%files -n libchipcard6
1
0