openSUSE Commits
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
February 2020
- 1 participants
- 4649 discussions
Hello community,
here is the log from the commit of package 000product for openSUSE:Leap:15.2 checked in at 2020-02-29 23:26:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/000product (Old)
and /work/SRC/openSUSE:Leap:15.2/.000product.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "000product"
Sat Feb 29 23:26:12 2020 rev:1416 rq: version:unknown
Changes:
--------
New Changes file:
NO CHANGES FILE!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
openSUSE-cd-mini-x86_64.kiwi: same change
openSUSE-dvd5-dvd-x86_64.kiwi: same change
openSUSE-ftp-ftp-x86_64.kiwi: same change
stub.kiwi: same change
++++++ unsorted.yml ++++++
--- /var/tmp/diff_new_pack.vJK9xz/_old 2020-02-29 23:26:14.197150697 +0100
+++ /var/tmp/diff_new_pack.vJK9xz/_new 2020-02-29 23:26:14.197150697 +0100
@@ -5252,6 +5252,8 @@
- gspell
- gspell-devel
- gssdp-utils
+ - gssntlmssp
+ - gssntlmssp-devel
- gssproxy
- gst123
- gstreamer-1_0-plugins-buzztrax
@@ -6508,6 +6510,7 @@
- junitperf-javadoc
- jvnet-parent
- jvyamlb
+ - jwt_verify_lib-source
- jxrlib
- jxrlib-devel
- jython
@@ -10572,7 +10575,7 @@
- libmateweather1
- libmateweather1-32bit
- libmatio-devel
- - libmatio4
+ - libmatio9
- libmatroska-devel
- libmatroska6-32bit
- libmaxminddb-devel
@@ -11415,6 +11418,8 @@
- libpromises3
- libprotobuf-c-devel
- libprotobuf-lite20-32bit
+ - libprotobuf-mutator-devel
+ - libprotobuf-mutator0
- libprotobuf-nanopb0
- libprotobuf20-32bit
- libprotoc20
@@ -11738,6 +11743,9 @@
- libraft0
- libraptor-devel
- libraptor2-0-32bit
+ - libraqm-devel
+ - libraqm-doc
+ - libraqm0
- librasqal-devel
- librasqal-devel-doc
- librasqal3-32bit
@@ -11979,6 +11987,7 @@
- librtaudio6
- librtlsdr0
- librtmidi4
+ - librtr0
- librttr_core0_9_6
- librubberband-devel
- librubberband2
@@ -12775,7 +12784,7 @@
- libvncserver0
- libvoikko-devel
- libvoikko1-32bit
- - libvolk2_1
+ - libvolk2_2_1
- libvorbis-devel
- libvorbis-devel-32bit
- libvorbis-doc
@@ -15026,6 +15035,7 @@
- nfacct
- nfc-eventd
- nfcutils
+ - nfdump
- nfoview
- nfoview-lang
- nfs-doc
@@ -19695,7 +19705,6 @@
- python2-flask-jwt-extended
- python2-flask-peewee
- python2-flatbuffers
- - python2-flatdict
- python2-flexmock
- python2-flexx
- python2-flickrapi
@@ -23846,6 +23855,9 @@
- rtmidi-devel
- rtorrent
- rtorrent-vim
+ - rtr-tools
+ - rtrlib-devel
+ - rtrlib-devel-doc
- rttr-devel
- rttr-devel-doc
- rubber
@@ -23911,8 +23923,11 @@
- ruby2.5-rubygem-activesupport-doc-5_0
- ruby2.5-rubygem-activesupport-doc-5_1
- ruby2.5-rubygem-addressable
+ - ruby2.5-rubygem-addressable-2_3
- ruby2.5-rubygem-addressable-doc
+ - ruby2.5-rubygem-addressable-doc-2_3
- ruby2.5-rubygem-addressable-testsuite
+ - ruby2.5-rubygem-addressable-testsuite-2_3
- ruby2.5-rubygem-airbrussh
- ruby2.5-rubygem-airbrussh-doc
- ruby2.5-rubygem-amq-protocol
@@ -23978,8 +23993,11 @@
- ruby2.5-rubygem-cfa_grub2-doc
- ruby2.5-rubygem-cheetah-doc
- ruby2.5-rubygem-childprocess-0_6
+ - ruby2.5-rubygem-childprocess-2.0
- ruby2.5-rubygem-childprocess-doc-0_6
+ - ruby2.5-rubygem-childprocess-doc-2.0
- ruby2.5-rubygem-childprocess-testsuite-0_6
+ - ruby2.5-rubygem-childprocess-testsuite-2.0
- ruby2.5-rubygem-coderay
- ruby2.5-rubygem-coderay-doc
- ruby2.5-rubygem-coercible
@@ -24167,6 +24185,8 @@
- ruby2.5-rubygem-jbuilder
- ruby2.5-rubygem-jbuilder-doc
- ruby2.5-rubygem-jbuilder-testsuite
+ - ruby2.5-rubygem-jekyll-watch
+ - ruby2.5-rubygem-jekyll-watch-doc
- ruby2.5-rubygem-jquery-rails
- ruby2.5-rubygem-jquery-rails-doc
- ruby2.5-rubygem-jquery-rails-testsuite
@@ -24417,6 +24437,8 @@
- ruby2.5-rubygem-ronn
- ruby2.5-rubygem-ronn-doc
- ruby2.5-rubygem-ronn-testsuite
+ - ruby2.5-rubygem-rouge-1
+ - ruby2.5-rubygem-rouge-doc-1
- ruby2.5-rubygem-rspec
- ruby2.5-rubygem-rspec-3_5
- ruby2.5-rubygem-rspec-core
@@ -24551,8 +24573,11 @@
- ruby2.5-rubygem-turbolinks-source
- ruby2.5-rubygem-turbolinks-source-doc
- ruby2.5-rubygem-tzinfo
+ - ruby2.5-rubygem-tzinfo-1.2
- ruby2.5-rubygem-tzinfo-doc
+ - ruby2.5-rubygem-tzinfo-doc-1.2
- ruby2.5-rubygem-tzinfo-testsuite
+ - ruby2.5-rubygem-tzinfo-testsuite-1.2
- ruby2.5-rubygem-uglifier
- ruby2.5-rubygem-uglifier-doc
- ruby2.5-rubygem-unf
@@ -25671,6 +25696,7 @@
- terminus-lang
- termsyn-bitmap-fonts
- terraform
+ - terraform-provider-openstack
- teseq
- tesla-polyglot
- tesla-polyglot-atom
@@ -32447,6 +32473,7 @@
- tntdb-postgresql
- tntdb-replicate
- tntdb-sqlite
+ - toilet
- tolua
- toluapp-5.1
- toluapp-5.3
1
0
Hello community,
here is the log from the commit of package 000release-packages for openSUSE:Leap:15.2 checked in at 2020-02-29 23:26:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/000release-packages (Old)
and /work/SRC/openSUSE:Leap:15.2/.000release-packages.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "000release-packages"
Sat Feb 29 23:26:10 2020 rev:868 rq: version:unknown
Changes:
--------
New Changes file:
NO CHANGES FILE!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
openSUSE-release.spec: same change
stub.spec: same change
++++++ weakremovers.inc ++++++
--- /var/tmp/diff_new_pack.kHHenV/_old 2020-02-29 23:26:11.909146041 +0100
+++ /var/tmp/diff_new_pack.kHHenV/_new 2020-02-29 23:26:11.913146050 +0100
@@ -5674,6 +5674,7 @@
Provides: weakremover(liblibkremotecontrol1)
Provides: weakremover(liblibmanette-0_2)
Provides: weakremover(liblouis14)
+Provides: weakremover(libmatio4)
Provides: weakremover(libmbedcrypto1)
Provides: weakremover(libmbedcrypto1-32bit)
Provides: weakremover(libmbedtls10)
@@ -5791,6 +5792,7 @@
Provides: weakremover(libvarnishapi1)
Provides: weakremover(libvolk1_4)
Provides: weakremover(libvolk2_0)
+Provides: weakremover(libvolk2_1)
Provides: weakremover(libwebp6)
Provides: weakremover(libwebp6-32bit)
Provides: weakremover(libwebpdecoder2)
@@ -5948,6 +5950,7 @@
Provides: weakremover(python2-django-registration)
Provides: weakremover(python2-django-rest-knox)
Provides: weakremover(python2-djet)
+Provides: weakremover(python2-flatdict)
Provides: weakremover(python2-gdata)
Provides: weakremover(python2-libewf)
Provides: weakremover(python2-libvirt-python)
@@ -13233,7 +13236,6 @@
Provides: weakremover(python-mistune)
Provides: weakremover(python-openqa_review)
Provides: weakremover(python-py)
-Provides: weakremover(python-s3transfer)
Provides: weakremover(python-setuptools_scm)
Provides: weakremover(python-six)
Provides: weakremover(python-snowballstemmer)
1
0
Hello community,
here is the log from the commit of package 000product for openSUSE:Factory checked in at 2020-02-29 23:17:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/000product (Old)
and /work/SRC/openSUSE:Factory/.000product.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "000product"
Sat Feb 29 23:17:08 2020 rev:2142 rq: version:unknown
Changes:
--------
New Changes file:
NO CHANGES FILE!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ openSUSE-Addon-NonOss-ftp-ftp-i586_x86_64.kiwi ++++++
--- /var/tmp/diff_new_pack.Tfn1wc/_old 2020-02-29 23:17:12.352046810 +0100
+++ /var/tmp/diff_new_pack.Tfn1wc/_new 2020-02-29 23:17:12.356046818 +0100
@@ -1,4 +1,4 @@
-<image name="OBS__openSUSE-Addon-NonOss___20200228" schemaversion="4.1">
+<image name="OBS__openSUSE-Addon-NonOss___20200229" schemaversion="4.1">
<description type="system">
<author>The SUSE Team</author>
<contact>build(a)opensuse.org</contact>
@@ -36,11 +36,11 @@
<productvar name="SEPARATE_MEDIA">true</productvar>
<productvar name="SHA1OPT">-x -2</productvar>
<productvar name="VENDOR">openSUSE</productvar>
- <productvar name="VERSION">20200228</productvar>
+ <productvar name="VERSION">20200229</productvar>
<productinfo name="CONTENTSTYLE">11</productinfo>
- <productinfo name="DISTRO">cpe:/o:opensuse:opensuse-addon-nonoss:20200228,openSUSE NonOSS Addon</productinfo>
+ <productinfo name="DISTRO">cpe:/o:opensuse:opensuse-addon-nonoss:20200229,openSUSE NonOSS Addon</productinfo>
<productinfo name="LINGUAS">af ar be_BY bg br ca cy el et ga gl gu_IN he hi_IN hr ka km ko lt mk nn pa_IN rw sk sl sr_CS ss st tg th tr uk ve vi xh zu </productinfo>
- <productinfo name="REPOID">obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE-Addon-NonOss/2020… obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE-Addon-NonOss/2020…</productinfo>
+ <productinfo name="REPOID">obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE-Addon-NonOss/2020… obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE-Addon-NonOss/2020…</productinfo>
<productinfo name="VENDOR">openSUSE</productinfo>
<productoption name="INI_DIR">/usr/share/kiwi/modules/plugins/openSUSE</productoption>
<productoption name="PLUGIN_DIR">/usr/share/kiwi/modules/plugins/openSUSE</productoption>
++++++ openSUSE-MicroOS-dvd5-dvd-x86_64.kiwi ++++++
--- /var/tmp/diff_new_pack.Tfn1wc/_old 2020-02-29 23:17:12.376046860 +0100
+++ /var/tmp/diff_new_pack.Tfn1wc/_new 2020-02-29 23:17:12.380046868 +0100
@@ -1,4 +1,4 @@
-<image name="OBS__openSUSE-MicroOS___20200228" schemaversion="4.1">
+<image name="OBS__openSUSE-MicroOS___20200229" schemaversion="4.1">
<description type="system">
<author>The SUSE Team</author>
<contact>build(a)opensuse.org</contact>
@@ -35,11 +35,11 @@
<productvar name="SEPARATE_MEDIA">true</productvar>
<productvar name="SHA1OPT">-x -2</productvar>
<productvar name="VENDOR">openSUSE</productvar>
- <productvar name="VERSION">20200228</productvar>
+ <productvar name="VERSION">20200229</productvar>
<productinfo name="CONTENTSTYLE">11</productinfo>
- <productinfo name="DISTRO">cpe:/o:opensuse:opensuse-microos:20200228,openSUSE MicroOS</productinfo>
+ <productinfo name="DISTRO">cpe:/o:opensuse:opensuse-microos:20200229,openSUSE MicroOS</productinfo>
<productinfo name="LINGUAS">en_US </productinfo>
- <productinfo name="REPOID">obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE-MicroOS/20200228/…</productinfo>
+ <productinfo name="REPOID">obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE-MicroOS/20200229/…</productinfo>
<productinfo name="VENDOR">openSUSE</productinfo>
<productoption name="INI_DIR">/usr/share/kiwi/modules/plugins/openSUSE</productoption>
<productoption name="PLUGIN_DIR">/usr/share/kiwi/modules/plugins/openSUSE</productoption>
@@ -344,6 +344,7 @@
<repopackage name="ksysguard5" arch="x86_64"/>
<repopackage name="ktexteditor" arch="x86_64"/>
<repopackage name="kubic-locale-archive" arch="x86_64"/>
+ <repopackage name="kuserfeedback-imports" arch="x86_64"/>
<repopackage name="kwalletd5" arch="x86_64"/>
<repopackage name="kwalletmanager5" arch="x86_64"/>
<repopackage name="kwayland" arch="x86_64"/>
@@ -687,6 +688,8 @@
<repopackage name="libKScreenLocker5" arch="x86_64"/>
<repopackage name="libksysguard5" arch="x86_64"/>
<repopackage name="libksysguard5-helper" arch="x86_64"/>
+ <repopackage name="libKUserFeedbackCore1" arch="x86_64"/>
+ <repopackage name="libKUserFeedbackWidgets1" arch="x86_64"/>
<repopackage name="libkwalletbackend5-5" arch="x86_64"/>
<repopackage name="liblcms2-2" arch="x86_64"/>
<repopackage name="libldap-2_4-2" arch="x86_64"/>
++++++ openSUSE-MicroOS-dvd5-kubic-dvd-x86_64.kiwi ++++++
++++ 1380 lines (skipped)
++++ between /work/SRC/openSUSE:Factory/000product/openSUSE-MicroOS-dvd5-kubic-dvd-x86_64.kiwi
++++ and /work/SRC/openSUSE:Factory/.000product.new.26092/openSUSE-MicroOS-dvd5-kubic-dvd-x86_64.kiwi
++++++ openSUSE-cd-mini-i586.kiwi ++++++
--- /var/tmp/diff_new_pack.Tfn1wc/_old 2020-02-29 23:17:12.424046959 +0100
+++ /var/tmp/diff_new_pack.Tfn1wc/_new 2020-02-29 23:17:12.424046959 +0100
@@ -1,4 +1,4 @@
-<image name="OBS__openSUSE___20200228" schemaversion="4.1">
+<image name="OBS__openSUSE___20200229" schemaversion="4.1">
<description type="system">
<author>The SUSE Team</author>
<contact>build(a)opensuse.org</contact>
@@ -32,11 +32,11 @@
<productvar name="SEPARATE_MEDIA">true</productvar>
<productvar name="SHA1OPT">-x -2</productvar>
<productvar name="VENDOR">openSUSE</productvar>
- <productvar name="VERSION">20200228</productvar>
+ <productvar name="VERSION">20200229</productvar>
<productinfo name="CONTENTSTYLE">11</productinfo>
- <productinfo name="DISTRO">cpe:/o:opensuse:opensuse:20200228,openSUSE Tumbleweed</productinfo>
+ <productinfo name="DISTRO">cpe:/o:opensuse:opensuse:20200229,openSUSE Tumbleweed</productinfo>
<productinfo name="LINGUAS">cs da de el en en_GB en_US es fr hu it ja pl pt pt_BR ru zh zh_CN zh_TW </productinfo>
- <productinfo name="REPOID">obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE/20200228/i586</productinfo>
+ <productinfo name="REPOID">obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE/20200229/i586</productinfo>
<productinfo name="VENDOR">openSUSE</productinfo>
<productoption name="INI_DIR">/usr/share/kiwi/modules/plugins/openSUSE</productoption>
<productoption name="PLUGIN_DIR">/usr/share/kiwi/modules/plugins/openSUSE</productoption>
++++++ openSUSE-cd-mini-x86_64.kiwi ++++++
--- /var/tmp/diff_new_pack.Tfn1wc/_old 2020-02-29 23:17:12.448047009 +0100
+++ /var/tmp/diff_new_pack.Tfn1wc/_new 2020-02-29 23:17:12.448047009 +0100
@@ -1,4 +1,4 @@
-<image name="OBS__openSUSE___20200228" schemaversion="4.1">
+<image name="OBS__openSUSE___20200229" schemaversion="4.1">
<description type="system">
<author>The SUSE Team</author>
<contact>build(a)opensuse.org</contact>
@@ -35,11 +35,11 @@
<productvar name="SEPARATE_MEDIA">true</productvar>
<productvar name="SHA1OPT">-x -2</productvar>
<productvar name="VENDOR">openSUSE</productvar>
- <productvar name="VERSION">20200228</productvar>
+ <productvar name="VERSION">20200229</productvar>
<productinfo name="CONTENTSTYLE">11</productinfo>
- <productinfo name="DISTRO">cpe:/o:opensuse:opensuse:20200228,openSUSE Tumbleweed</productinfo>
+ <productinfo name="DISTRO">cpe:/o:opensuse:opensuse:20200229,openSUSE Tumbleweed</productinfo>
<productinfo name="LINGUAS">cs da de el en en_GB en_US es fr hu it ja pl pt pt_BR ru zh zh_CN zh_TW </productinfo>
- <productinfo name="REPOID">obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE/20200228/x86_64</productinfo>
+ <productinfo name="REPOID">obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE/20200229/x86_64</productinfo>
<productinfo name="VENDOR">openSUSE</productinfo>
<productoption name="INI_DIR">/usr/share/kiwi/modules/plugins/openSUSE</productoption>
<productoption name="PLUGIN_DIR">/usr/share/kiwi/modules/plugins/openSUSE</productoption>
++++++ openSUSE-dvd5-dvd-i586.kiwi ++++++
++++ 1153 lines (skipped)
++++ between /work/SRC/openSUSE:Factory/000product/openSUSE-dvd5-dvd-i586.kiwi
++++ and /work/SRC/openSUSE:Factory/.000product.new.26092/openSUSE-dvd5-dvd-i586.kiwi
openSUSE-dvd5-dvd-x86_64.kiwi: same change
++++++ openSUSE-ftp-ftp-i586_x86_64.kiwi ++++++
--- /var/tmp/diff_new_pack.Tfn1wc/_old 2020-02-29 23:17:12.520047158 +0100
+++ /var/tmp/diff_new_pack.Tfn1wc/_new 2020-02-29 23:17:12.520047158 +0100
@@ -1,4 +1,4 @@
-<image name="OBS__openSUSE___20200228" schemaversion="4.1">
+<image name="OBS__openSUSE___20200229" schemaversion="4.1">
<description type="system">
<author>The SUSE Team</author>
<contact>build(a)opensuse.org</contact>
@@ -24,7 +24,7 @@
<productvar name="DISTNAME">openSUSE</productvar>
<productvar name="FLAVOR">ftp</productvar>
<productvar name="MAKE_LISTINGS">true</productvar>
- <productvar name="MEDIUM_NAME">openSUSE-20200228-i586-x86_64</productvar>
+ <productvar name="MEDIUM_NAME">openSUSE-20200229-i586-x86_64</productvar>
<productvar name="MULTIPLE_MEDIA">true</productvar>
<productvar name="PRODUCT_DIR">/</productvar>
<productvar name="PRODUCT_NAME">$DISTNAME-$FLAVOR</productvar>
@@ -36,11 +36,11 @@
<productvar name="SEPARATE_MEDIA">true</productvar>
<productvar name="SHA1OPT">-x -2</productvar>
<productvar name="VENDOR">openSUSE</productvar>
- <productvar name="VERSION">20200228</productvar>
+ <productvar name="VERSION">20200229</productvar>
<productinfo name="CONTENTSTYLE">11</productinfo>
- <productinfo name="DISTRO">cpe:/o:opensuse:opensuse:20200228,openSUSE Tumbleweed</productinfo>
+ <productinfo name="DISTRO">cpe:/o:opensuse:opensuse:20200229,openSUSE Tumbleweed</productinfo>
<productinfo name="LINGUAS">cs da de el en en_GB en_US es fr hu it ja pl pt pt_BR ru zh zh_CN zh_TW </productinfo>
- <productinfo name="REPOID">obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE/20200228/i586 obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE/20200228/x86_64</productinfo>
+ <productinfo name="REPOID">obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE/20200229/i586 obsproduct://build.opensuse.org/openSUSE:Factory/openSUSE/20200229/x86_64</productinfo>
<productinfo name="VENDOR">openSUSE</productinfo>
<productoption name="DEBUGMEDIUM">2</productoption>
<productoption name="INI_DIR">/usr/share/kiwi/modules/plugins/openSUSE</productoption>
++++++ dvd.group ++++++
++++ 1680 lines (skipped)
++++ between /work/SRC/openSUSE:Factory/000product/dvd.group
++++ and /work/SRC/openSUSE:Factory/.000product.new.26092/dvd.group
++++++ openSUSE-Addon-NonOss.product ++++++
--- /var/tmp/diff_new_pack.Tfn1wc/_old 2020-02-29 23:17:12.632047389 +0100
+++ /var/tmp/diff_new_pack.Tfn1wc/_new 2020-02-29 23:17:12.636047398 +0100
@@ -4,7 +4,7 @@
<product>
<vendor>openSUSE</vendor>
<name>openSUSE-Addon-NonOss</name>
- <version>20200228</version>
+ <version>20200229</version>
<release>0</release>
<summary>openSUSE NonOSS Addon</summary>
<shortsummary>non oss addon</shortsummary>
++++++ openSUSE-MicroOS.product ++++++
--- /var/tmp/diff_new_pack.Tfn1wc/_old 2020-02-29 23:17:12.644047414 +0100
+++ /var/tmp/diff_new_pack.Tfn1wc/_new 2020-02-29 23:17:12.644047414 +0100
@@ -6,7 +6,7 @@
<name>openSUSE-MicroOS</name>
<releasepkgname>openSUSE-MicroOS-release</releasepkgname>
<endoflife/>
- <version>20200228</version>
+ <version>20200229</version>
<!-- release is no longer optional -->
<release>0</release>
<productline>openSUSE-MicroOS</productline>
++++++ openSUSE.product ++++++
--- /var/tmp/diff_new_pack.Tfn1wc/_old 2020-02-29 23:17:12.664047455 +0100
+++ /var/tmp/diff_new_pack.Tfn1wc/_new 2020-02-29 23:17:12.664047455 +0100
@@ -4,7 +4,7 @@
<product>
<vendor>openSUSE</vendor>
<name>openSUSE</name>
- <version>20200228</version>
+ <version>20200229</version>
<release>0</release>
<productline>openSUSE</productline>
++++++ opensuse_kubic.group ++++++
++++ 1253 lines (skipped)
++++ between /work/SRC/openSUSE:Factory/000product/opensuse_kubic.group
++++ and /work/SRC/openSUSE:Factory/.000product.new.26092/opensuse_kubic.group
++++++ opensuse_microos.group ++++++
--- /var/tmp/diff_new_pack.Tfn1wc/_old 2020-02-29 23:17:12.712047555 +0100
+++ /var/tmp/diff_new_pack.Tfn1wc/_new 2020-02-29 23:17:12.716047563 +0100
@@ -416,6 +416,7 @@
<package name="ksysguard5" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="ktexteditor" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="kubic-locale-archive" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-base -->
+ <package name="kuserfeedback-imports" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="kwalletd5" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="kwalletmanager5" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="kwayland" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
@@ -497,6 +498,8 @@
<package name="libKF5WindowSystem5" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="libKF5XmlGui5" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="libKScreenLocker5" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
+ <package name="libKUserFeedbackCore1" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
+ <package name="libKUserFeedbackWidgets1" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="libLLVM9" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="libQt5Concurrent5" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="libQt5Core5" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
@@ -875,7 +878,7 @@
<package name="libpulse-mainloop-glib0" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="libpulse0" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="libpwquality1" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
- <package name="libpython3_7m1_0" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-base -->
+ <package name="libpython3_7m1_0" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-apparmor -->
<package name="libqalculate21" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="libqca-qt5" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="libqt5-qdbus" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
@@ -1173,7 +1176,7 @@
<package name="pulseaudio-module-zeroconf" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="pulseaudio-utils" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
<package name="purpose" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-desktop-kde -->
- <package name="python-rpm-macros" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-base -->
+ <package name="python-rpm-macros" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-apparmor -->
<package name="python3" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-apparmor -->
<package name="python3-Babel" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-cloud -->
<package name="python3-Jinja2" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-cloud -->
@@ -1185,7 +1188,7 @@
<package name="python3-asn1crypto" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-cloud -->
<package name="python3-attrs" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-cloud -->
<package name="python3-audit" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-selinux -->
- <package name="python3-base" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-base -->
+ <package name="python3-base" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-apparmor -->
<package name="python3-blinker" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-cloud -->
<package name="python3-certifi" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-cloud -->
<package name="python3-cffi" supportstatus="unsupported"/> <!-- reason: opensuse_microos:patterns-microos-cloud -->
++++++ unsorted.yml ++++++
++++ 1461 lines (skipped)
++++ between /work/SRC/openSUSE:Factory/000product/unsorted.yml
++++ and /work/SRC/openSUSE:Factory/.000product.new.26092/unsorted.yml
1
0
Hello community,
here is the log from the commit of package 000release-packages for openSUSE:Factory checked in at 2020-02-29 23:17:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/000release-packages (Old)
and /work/SRC/openSUSE:Factory/.000release-packages.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "000release-packages"
Sat Feb 29 23:17:04 2020 rev:471 rq: version:unknown
Changes:
--------
New Changes file:
NO CHANGES FILE!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ openSUSE-Addon-NonOss-release.spec ++++++
--- /var/tmp/diff_new_pack.3kMJSQ/_old 2020-02-29 23:17:06.780035284 +0100
+++ /var/tmp/diff_new_pack.3kMJSQ/_new 2020-02-29 23:17:06.800035326 +0100
@@ -1,5 +1,5 @@
#
-# spec file for package openSUSE-Addon-NonOss-release (Version 20200228)
+# spec file for package openSUSE-Addon-NonOss-release (Version 20200229)
#
# Copyright (c) 2020 openSUSE.
#
@@ -16,16 +16,16 @@
Name: openSUSE-Addon-NonOss-release
%define product openSUSE-Addon-NonOss
Summary: openSUSE NonOSS Addon%{?betaversion: %{betaversion}}
-Version: 20200228
+Version: 20200229
Release: 0
License: BSD-3-Clause
Group: System/Fhs
Provides: %name-%version
Provides: product() = openSUSE-Addon-NonOss
-Provides: product(openSUSE-Addon-NonOss) = 20200228-0
+Provides: product(openSUSE-Addon-NonOss) = 20200229-0
Provides: product-label() = non%20oss%20addon
-Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aopensuse%2Daddon%2Dnonoss%3A20200228
+Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aopensuse%2Daddon%2Dnonoss%3A20200229
AutoReqProv: on
@@ -49,10 +49,10 @@
<product schemeversion="0">
<vendor>openSUSE</vendor>
<name>openSUSE-Addon-NonOss</name>
- <version>20200228</version>
+ <version>20200229</version>
<release>0</release>
<arch>%{_target_cpu}</arch>
- <cpeid>cpe:/o:opensuse:opensuse-addon-nonoss:20200228</cpeid>
+ <cpeid>cpe:/o:opensuse:opensuse-addon-nonoss:20200229</cpeid>
<register>
<pool>
</pool>
++++++ openSUSE-MicroOS-release.spec ++++++
--- /var/tmp/diff_new_pack.3kMJSQ/_old 2020-02-29 23:17:06.848035425 +0100
+++ /var/tmp/diff_new_pack.3kMJSQ/_new 2020-02-29 23:17:06.856035442 +0100
@@ -17,7 +17,7 @@
Name: openSUSE-MicroOS-release
-Version: 20200228
+Version: 20200229
Release: 0
Summary: openSUSE MicroOS
License: GPL-2.0-or-later
@@ -43,9 +43,9 @@
ExclusiveArch: %ix86 x86_64 ppc64le s390x aarch64 %arm
Provides: %name-%version
Provides: product() = openSUSE-MicroOS
-Provides: product(openSUSE-MicroOS) = 20200228-0
+Provides: product(openSUSE-MicroOS) = 20200229-0
Provides: product-label() = openSUSE%20MicroOS
-Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aopensuse%2Dmicroos%3A20200228
+Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aopensuse%2Dmicroos%3A20200229
Provides: product-url(releasenotes) = http%3A%2F%2Fdoc.opensuse.org%2Frelease%2Dnotes%2Fx86_64%2FopenSUSE%2FTumbleweed%2Frelease%2Dnotes%2DopenSUSE.rpm
Provides: product-endoflife()
Requires: product_flavor(openSUSE-MicroOS)
@@ -61,7 +61,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(dvd)
-Provides: product_flavor(openSUSE-MicroOS) = 20200228-0
+Provides: product_flavor(openSUSE-MicroOS) = 20200229-0
Summary: openSUSE MicroOS%{?betaversion: %{betaversion}}
%description dvd
@@ -77,7 +77,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(kubic-dvd)
-Provides: product_flavor(openSUSE-MicroOS) = 20200228-0
+Provides: product_flavor(openSUSE-MicroOS) = 20200229-0
Summary: openSUSE MicroOS%{?betaversion: %{betaversion}}
%description kubic-dvd
@@ -93,7 +93,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance)
-Provides: product_flavor(openSUSE-MicroOS) = 20200228-0
+Provides: product_flavor(openSUSE-MicroOS) = 20200229-0
Summary: openSUSE MicroOS%{?betaversion: %{betaversion}}
%description appliance
@@ -109,7 +109,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-kubic)
-Provides: product_flavor(openSUSE-MicroOS) = 20200228-0
+Provides: product_flavor(openSUSE-MicroOS) = 20200229-0
Summary: openSUSE MicroOS%{?betaversion: %{betaversion}}
%description appliance-kubic
@@ -167,11 +167,11 @@
<product schemeversion="0">
<vendor>openSUSE</vendor>
<name>openSUSE-MicroOS</name>
- <version>20200228</version>
+ <version>20200229</version>
<release>0</release>
<endoflife></endoflife>
<arch>%{_target_cpu}</arch>
- <cpeid>cpe:/o:opensuse:opensuse-microos:20200228</cpeid>
+ <cpeid>cpe:/o:opensuse:opensuse-microos:20200229</cpeid>
<productline>openSUSE-MicroOS</productline>
<register>
<pool>
++++++ openSUSE-release.spec ++++++
--- /var/tmp/diff_new_pack.3kMJSQ/_old 2020-02-29 23:17:06.904035541 +0100
+++ /var/tmp/diff_new_pack.3kMJSQ/_new 2020-02-29 23:17:06.916035566 +0100
@@ -20,7 +20,7 @@
#define betaversion %{nil}
%define codename Tumbleweed
Name: openSUSE-release
-Version: 20200228
+Version: 20200229
Release: 0
# 0 is the product release, not the build release of this package
Summary: openSUSE Tumbleweed
@@ -183,7 +183,7 @@
%include %{SOURCE100}
Provides: %name-%version
Provides: product() = openSUSE
-Provides: product(openSUSE) = 20200228-0
+Provides: product(openSUSE) = 20200229-0
%ifarch x86_64
Provides: product-register-target() = openSUSE%2DTumbleweed%2Dx86_64
%endif
@@ -197,7 +197,7 @@
Provides: product-register-target() = openSUSE%2DTumbleweed%2Daarch64
%endif
Provides: product-label() = openSUSE
-Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aopensuse%3A20200228
+Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aopensuse%3A20200229
Provides: product-url(releasenotes) = http%3A%2F%2Fdoc.opensuse.org%2Frelease%2Dnotes%2Fx86_64%2FopenSUSE%2FTumbleweed%2Frelease%2Dnotes%2DopenSUSE.rpm
Provides: product-url(repository) = http%3A%2F%2Fdownload.opensuse.org%2Ftumbleweed%2Frepo%2Foss%2F
Requires: product_flavor(openSUSE)
@@ -211,7 +211,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(ftp)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description ftp
@@ -226,7 +226,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(mini)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description mini
@@ -241,7 +241,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(dvd)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description dvd
@@ -256,7 +256,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(livecd-kde)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description livecd-kde
@@ -271,7 +271,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(livecd-x11)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description livecd-x11
@@ -286,7 +286,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(livecd-gnome)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description livecd-gnome
@@ -301,7 +301,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(livecd-xfce)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description livecd-xfce
@@ -316,7 +316,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(usb-kde)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description usb-kde
@@ -331,7 +331,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(usb-gnome)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description usb-gnome
@@ -346,7 +346,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(usb-x11)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description usb-x11
@@ -361,7 +361,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance
@@ -376,7 +376,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-docker)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-docker
@@ -391,7 +391,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-kvm)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-kvm
@@ -406,7 +406,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-vmware)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-vmware
@@ -421,7 +421,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-openstack)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-openstack
@@ -436,7 +436,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-hyperv)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-hyperv
@@ -451,7 +451,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-vagrant)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-vagrant
@@ -466,7 +466,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-wsl)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-wsl
@@ -481,7 +481,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-custom)
-Provides: product_flavor(openSUSE) = 20200228-0
+Provides: product_flavor(openSUSE) = 20200229-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-custom
@@ -555,10 +555,10 @@
<product schemeversion="0">
<vendor>openSUSE</vendor>
<name>openSUSE</name>
- <version>20200228</version>
+ <version>20200229</version>
<release>0</release>
<arch>%{_target_cpu}</arch>
- <cpeid>cpe:/o:opensuse:opensuse:20200228</cpeid>
+ <cpeid>cpe:/o:opensuse:opensuse:20200229</cpeid>
<productline>openSUSE</productline>
<register>
<pool>
++++++ weakremovers.inc ++++++
--- /var/tmp/diff_new_pack.3kMJSQ/_old 2020-02-29 23:17:07.140036029 +0100
+++ /var/tmp/diff_new_pack.3kMJSQ/_new 2020-02-29 23:17:07.148036045 +0100
@@ -8302,11 +8302,6 @@
Provides: weakremover(colorblind-devel)
Provides: weakremover(comix)
Provides: weakremover(comix-lang)
-Provides: weakremover(compicc)
-Provides: weakremover(compiz-emerald-themes)
-Provides: weakremover(compiz-plugins-experimental)
-Provides: weakremover(compiz-plugins-experimental-devel)
-Provides: weakremover(compiz-plugins-experimental-lang)
Provides: weakremover(container-feeder)
Provides: weakremover(containerd-kubic-test)
Provides: weakremover(containerd-test)
@@ -12903,6 +12898,8 @@
Provides: weakremover(ibus-table-zhengma)
Provides: weakremover(ibus-table-zhuyin)
Provides: weakremover(ibus-table-ziranma)
+Provides: weakremover(iceWMCP)
+Provides: weakremover(iceWMCP-addons)
Provides: weakremover(icedax)
Provides: weakremover(icinga)
Provides: weakremover(icinga-devel)
@@ -12939,6 +12936,7 @@
Provides: weakremover(ipsec-tools)
Provides: weakremover(irqd)
Provides: weakremover(ivtv-firmware)
+Provides: weakremover(iwscanner)
Provides: weakremover(jag)
Provides: weakremover(jag-data)
Provides: weakremover(jag-level-editor)
@@ -12981,6 +12979,7 @@
Provides: weakremover(jovie)
Provides: weakremover(julia-examples)
Provides: weakremover(jupyter-ipykernel-doc)
+Provides: weakremover(jupyter-jupyter_core-doc)
Provides: weakremover(kaccessible)
Provides: weakremover(kadu-anonymous_check)
Provides: weakremover(kadu-completion)
@@ -14425,6 +14424,7 @@
Provides: weakremover(libgsoap-2_8_94)
Provides: weakremover(libgsoap-2_8_95)
Provides: weakremover(libgsoap-2_8_96)
+Provides: weakremover(libgsoap-2_8_97)
Provides: weakremover(libgspell-1-1)
Provides: weakremover(libgssdp-1_0-3)
Provides: weakremover(libgstbadallocators-1_0-0)
@@ -14599,6 +14599,7 @@
Provides: weakremover(libimaevm0)
Provides: weakremover(libiniparser0)
Provides: weakremover(libinstpatch-1_0-0)
+Provides: weakremover(libinstpatch-1_0-1)
Provides: weakremover(libipset11)
Provides: weakremover(libipset3)
Provides: weakremover(libiptc0)
@@ -14921,6 +14922,8 @@
Provides: weakremover(libopenblas_0_3_5-gnu-hpc-devel)
Provides: weakremover(libopenblas_0_3_6-gnu-hpc)
Provides: weakremover(libopenblas_0_3_6-gnu-hpc-devel)
+Provides: weakremover(libopenblas_0_3_7-gnu-hpc)
+Provides: weakremover(libopenblas_0_3_7-gnu-hpc-devel)
Provides: weakremover(libopenct1)
Provides: weakremover(libopencv3_2)
Provides: weakremover(libopencv3_3)
@@ -16217,6 +16220,7 @@
Provides: weakremover(openblas_0_3_4-gnu-hpc-devel-static)
Provides: weakremover(openblas_0_3_5-gnu-hpc-devel-static)
Provides: weakremover(openblas_0_3_6-gnu-hpc-devel-static)
+Provides: weakremover(openblas_0_3_7-gnu-hpc-devel-static)
Provides: weakremover(openct)
Provides: weakremover(openct-devel)
Provides: weakremover(openfst)
@@ -22146,8 +22150,6 @@
Provides: weakremover(shared-desktop-ontologies-devel)
Provides: weakremover(silc-toolkit)
Provides: weakremover(silc-toolkit-devel)
-Provides: weakremover(simple-ccsm)
-Provides: weakremover(simple-ccsm-lang)
Provides: weakremover(singularity-devel)
Provides: weakremover(skelcd-control-CAASP)
Provides: weakremover(skeletons)
@@ -23237,6 +23239,7 @@
Provides: weakremover(libigdgmm5)
Provides: weakremover(libigdgmm9)
Provides: weakremover(libiniparser0-32bit)
+Provides: weakremover(libinstpatch-1_0-1-32bit)
Provides: weakremover(libinvm-cim-devel)
Provides: weakremover(libinvm-cim1)
Provides: weakremover(libinvm-cli-devel)
@@ -23345,6 +23348,8 @@
Provides: weakremover(libobjc4-gcc8-32bit)
Provides: weakremover(libopae-c0)
Provides: weakremover(libopenbabel4-32bit)
+Provides: weakremover(libopenblas-pthreads_0_3_7-gnu-hpc)
+Provides: weakremover(libopenblas-pthreads_0_3_7-gnu-hpc-devel)
Provides: weakremover(libopencensus-cpp0)
Provides: weakremover(libopenct1-32bit)
Provides: weakremover(libopensm5-32bit)
@@ -23551,6 +23556,7 @@
Provides: weakremover(mvapich2-psm2_2_3_2-gnu-hpc-doc)
Provides: weakremover(mvapich2-psm2_2_3_2-gnu-hpc-macros-devel)
Provides: weakremover(odp-example)
+Provides: weakremover(openblas-pthreads_0_3_7-gnu-hpc-devel-static)
Provides: weakremover(opencensus-cpp-devel)
Provides: weakremover(openct-32bit)
Provides: weakremover(openmpi-libs-32bit)
1
0
Hello community,
here is the log from the commit of package gnuhealth for openSUSE:Factory checked in at 2020-02-29 21:25:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gnuhealth (Old)
and /work/SRC/openSUSE:Factory/.gnuhealth.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gnuhealth"
Sat Feb 29 21:25:03 2020 rev:36 rq:780497 version:3.6.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/gnuhealth/gnuhealth.changes 2019-12-04 14:19:43.510405011 +0100
+++ /work/SRC/openSUSE:Factory/.gnuhealth.new.26092/gnuhealth.changes 2020-02-29 21:25:17.662609101 +0100
@@ -1,0 +2,9 @@
+Fri Feb 28 11:24:46 UTC 2020 - Axel Braun <axel.braun(a)gmx.de>
+
+- version 3.6.3
+* GH HMIS server. task #15562: Include coronavirus COVID-19 in ICD10 codes
+* GH HMIS server. bug #57695: Traceback when creating a page of life associated to an empty evaluation
+* GH HMIS server. task #15561: Werkzeug 1.0 is not compatible with Trytond 5.0
+* shebang.diff to fix /usr/bin/env
+
+-------------------------------------------------------------------
Old:
----
gnuhealth-3.6.2.tar.gz
New:
----
gnuhealth-3.6.3.tar.gz
shebang.diff
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ gnuhealth.spec ++++++
--- /var/tmp/diff_new_pack.V98sgb/_old 2020-02-29 21:25:20.678615069 +0100
+++ /var/tmp/diff_new_pack.V98sgb/_new 2020-02-29 21:25:20.678615069 +0100
@@ -1,8 +1,8 @@
#
# spec file for package gnuhealth
#
-# Copyright (c) 2019 SUSE LLC
-# Copyright (c) 2014-2019 Dr. Axel Braun
+# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2014-2020 Dr. Axel Braun
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -21,11 +21,11 @@
%define majorver 3.6
Name: gnuhealth
-Version: %{majorver}.2
+Version: %{majorver}.3
Release: 0
# List of additional build dependencies
-###ildRequires: fdupes
+BuildRequires: fdupes
BuildRequires: python3-rpm-macros
BuildRequires: python3-setuptools
@@ -41,7 +41,7 @@
Source4: gnuhealth-webdav@.service
Source5: openSUSE-gnuhealth-setup
Source6: gnuhealth
-##atch0: bug_57292.diff
+Patch0: shebang.diff
##atch1: xmlfix.diff
##atch2: demo.diff
@@ -106,7 +106,7 @@
%prep
%setup -q -n %{name}-%{version}
-##atch0 -p1
+%patch0 -p1
##atch1 -p1
##atch2 -p1
cp %{S:1} .
@@ -141,7 +141,7 @@
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/tryton
-####ython_expand %fdupes %{buildroot}%{$python_sitelib}
+%python_expand %fdupes %{buildroot}%{$python_sitelib}
%pre
#Write environment changes to /etc/bash.bashrc.local
++++++ gnuhealth-3.6.2.tar.gz -> gnuhealth-3.6.3.tar.gz ++++++
/work/SRC/openSUSE:Factory/gnuhealth/gnuhealth-3.6.2.tar.gz /work/SRC/openSUSE:Factory/.gnuhealth.new.26092/gnuhealth-3.6.3.tar.gz differ: char 6, line 1
++++++ shebang.diff ++++++
diff -U 3 -dHrN -- a/gnuhealth-control b/gnuhealth-control
--- a/gnuhealth-control 2019-11-20 09:16:02.000000000 +0100
+++ b/gnuhealth-control 2020-01-15 08:21:34.600157124 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/bin/bash
# gnuhealth-control
# The GNU Health control center
diff -U 3 -dHrN -- a/health/setup.py b/health/setup.py
--- a/health/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health/setup.py 2020-01-15 08:25:35.736164023 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011-2020 GNU Solidario <health(a)gnusolidario.org>
diff -U 3 -dHrN -- a/health_archives/setup.py b/health_archives/setup.py
--- a/health_archives/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_archives/setup.py 2020-01-15 08:26:14.464165130 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2008-2020 Luis Falcon <lfalcon(a)gnusolidario.org>
# Copyright (C) 2011-2020 GNU Solidario <health(a)gnusolidario.org>
diff -U 3 -dHrN -- a/health_caldav/setup.py b/health_caldav/setup.py
--- a/health_caldav/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_caldav/setup.py 2020-02-27 19:27:33.986769709 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
from setuptools import setup
import re
diff -U 3 -dHrN -- a/health_calendar/setup.py b/health_calendar/setup.py
--- a/health_calendar/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_calendar/setup.py 2020-01-15 08:27:24.576167136 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_crypto/setup.py b/health_crypto/setup.py
--- a/health_crypto/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_crypto/setup.py 2020-01-15 16:58:43.120008340 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2008-2020 Luis Falcon <lfalcon(a)gnusolidario.org>
# Copyright (C) 2011-2020 GNU Solidario <health(a)gnusolidario.org>
diff -U 3 -dHrN -- a/health_crypto_lab/setup.py b/health_crypto_lab/setup.py
--- a/health_crypto_lab/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_crypto_lab/setup.py 2020-02-27 19:51:59.046896500 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_disability/setup.py b/health_disability/setup.py
--- a/health_disability/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_disability/setup.py 2020-02-27 19:52:17.218993066 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_ems/setup.py b/health_ems/setup.py
--- a/health_ems/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_ems/setup.py 2020-02-27 19:52:36.187094243 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_federation/setup.py b/health_federation/setup.py
--- a/health_federation/setup.py 2019-11-20 09:17:59.000000000 +0100
+++ b/health_federation/setup.py 2020-02-27 19:52:53.827188678 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_genetics/setup.py b/health_genetics/setup.py
--- a/health_genetics/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_genetics/setup.py 2020-02-27 19:53:22.659343707 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011-2020 GNU Solidario <health(a)gnusolidario.org>
diff -U 3 -dHrN -- a/health_genetics_uniprot/setup.py b/health_genetics_uniprot/setup.py
--- a/health_genetics_uniprot/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_genetics_uniprot/setup.py 2020-02-27 19:53:36.787419962 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011-2020 GNU Solidario <health(a)gnusolidario.org>
diff -U 3 -dHrN -- a/health_gyneco/setup.py b/health_gyneco/setup.py
--- a/health_gyneco/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_gyneco/setup.py 2020-02-27 19:53:52.763506413 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011-2020 GNU Solidario <health(a)gnusolidario.org>
diff -U 3 -dHrN -- a/health_history/setup.py b/health_history/setup.py
--- a/health_history/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_history/setup.py 2020-02-27 19:54:17.283639527 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_icd10/setup.py b/health_icd10/setup.py
--- a/health_icd10/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_icd10/setup.py 2020-02-27 19:54:49.907817420 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_icd10pcs/setup.py b/health_icd10pcs/setup.py
--- a/health_icd10pcs/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_icd10pcs/setup.py 2020-02-27 19:55:07.219912165 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_icd9procs/setup.py b/health_icd9procs/setup.py
--- a/health_icd9procs/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_icd9procs/setup.py 2020-02-27 19:54:36.887746320 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_icpm/setup.py b/health_icpm/setup.py
--- a/health_icpm/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_icpm/setup.py 2020-02-27 19:55:24.908009203 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_icu/setup.py b/health_icu/setup.py
--- a/health_icu/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_icu/setup.py 2020-02-27 19:55:39.808091133 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_imaging/setup.py b/health_imaging/setup.py
--- a/health_imaging/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_imaging/setup.py 2020-02-27 19:55:58.520194252 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_inpatient/setup.py b/health_inpatient/setup.py
--- a/health_inpatient/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_inpatient/setup.py 2020-02-27 19:56:11.664266833 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_inpatient_calendar/setup.py b/health_inpatient_calendar/setup.py
--- a/health_inpatient_calendar/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_inpatient_calendar/setup.py 2020-02-27 19:56:25.716344558 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_insurance/setup.py b/health_insurance/setup.py
--- a/health_insurance/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_insurance/setup.py 2020-02-27 19:56:43.892445292 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_iss/setup.py b/health_iss/setup.py
--- a/health_iss/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_iss/setup.py 2020-02-27 19:56:57.320519846 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_lab/setup.py b/health_lab/setup.py
--- a/health_lab/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_lab/setup.py 2020-02-27 19:57:52.580827797 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_lifestyle/setup.py b/health_lifestyle/setup.py
--- a/health_lifestyle/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_lifestyle/setup.py 2020-02-27 19:58:09.516922524 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_mdg6/setup.py b/health_mdg6/setup.py
--- a/health_mdg6/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_mdg6/setup.py 2020-02-27 19:58:22.812997001 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_ntd/setup.py b/health_ntd/setup.py
--- a/health_ntd/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_ntd/setup.py 2020-02-27 19:58:36.285072558 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_ntd_chagas/setup.py b/health_ntd_chagas/setup.py
--- a/health_ntd_chagas/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_ntd_chagas/setup.py 2020-02-27 19:58:49.705147916 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_ntd_dengue/setup.py b/health_ntd_dengue/setup.py
--- a/health_ntd_dengue/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_ntd_dengue/setup.py 2020-02-27 19:59:01.953216769 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_nursing/setup.py b/health_nursing/setup.py
--- a/health_nursing/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_nursing/setup.py 2020-02-27 19:59:18.989312662 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_ophthalmology/setup.py b/health_ophthalmology/setup.py
--- a/health_ophthalmology/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_ophthalmology/setup.py 2020-02-27 19:59:32.617389467 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_orthanc/setup.py b/health_orthanc/setup.py
--- a/health_orthanc/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_orthanc/setup.py 2020-02-27 19:59:44.673457486 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011-2020 GNU Solidario <health(a)gnusolidario.org>
diff -U 3 -dHrN -- a/health_pediatrics/setup.py b/health_pediatrics/setup.py
--- a/health_pediatrics/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_pediatrics/setup.py 2020-02-27 20:00:00.521546993 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_pediatrics_growth_charts/setup.py b/health_pediatrics_growth_charts/setup.py
--- a/health_pediatrics_growth_charts/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_pediatrics_growth_charts/setup.py 2020-02-27 20:00:17.993645808 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_pediatrics_growth_charts_who/setup.py b/health_pediatrics_growth_charts_who/setup.py
--- a/health_pediatrics_growth_charts_who/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_pediatrics_growth_charts_who/setup.py 2020-02-27 20:00:39.961770229 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_profile/setup.py b/health_profile/setup.py
--- a/health_profile/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_profile/setup.py 2020-02-27 20:00:58.613876020 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_qrcodes/setup.py b/health_qrcodes/setup.py
--- a/health_qrcodes/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_qrcodes/setup.py 2020-02-27 20:01:12.265953541 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_reporting/setup.py b/health_reporting/setup.py
--- a/health_reporting/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_reporting/setup.py 2020-02-27 20:01:27.962042755 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_services/setup.py b/health_services/setup.py
--- a/health_services/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_services/setup.py 2020-02-27 20:01:48.934162095 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_services_lab/setup.py b/health_services_lab/setup.py
--- a/health_services_lab/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_services_lab/setup.py 2020-02-27 20:02:00.346227101 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_socioeconomics/setup.py b/health_socioeconomics/setup.py
--- a/health_socioeconomics/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_socioeconomics/setup.py 2020-02-27 20:02:19.330335339 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_stock/setup.py b/health_stock/setup.py
--- a/health_stock/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_stock/setup.py 2020-02-27 20:02:32.926412935 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_surgery/setup.py b/health_surgery/setup.py
--- a/health_surgery/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_surgery/setup.py 2020-02-27 20:02:48.950504462 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/health_webdav3_server/bin/gnuhealth-webdav-server b/health_webdav3_server/bin/gnuhealth-webdav-server
--- a/health_webdav3_server/bin/gnuhealth-webdav-server 2019-11-04 21:16:31.000000000 +0100
+++ b/health_webdav3_server/bin/gnuhealth-webdav-server 2020-01-15 08:22:03.868157962 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python3
+#!/usr/bin/python3
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import sys
diff -U 3 -dHrN -- a/health_webdav3_server/setup.py b/health_webdav3_server/setup.py
--- a/health_webdav3_server/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_webdav3_server/setup.py 2020-02-27 20:03:04.450593075 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2017-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2017-2020 GNU Solidario <health(a)gnusolidario.org>
diff -U 3 -dHrN -- a/health_who_essential_medicines/setup.py b/health_who_essential_medicines/setup.py
--- a/health_who_essential_medicines/setup.py 2019-11-20 09:16:02.000000000 +0100
+++ b/health_who_essential_medicines/setup.py 2020-02-27 20:03:19.786680820 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (C) 2011-2020 Luis Falcon <falcon(a)gnuhealth.org>
# Copyright (C) 2011 Cédric Krier
diff -U 3 -dHrN -- a/scripts/demo/install_demo_database.sh b/scripts/demo/install_demo_database.sh
--- a/scripts/demo/install_demo_database.sh 2019-11-04 18:59:44.000000000 +0100
+++ b/scripts/demo/install_demo_database.sh 2020-01-15 08:21:48.320157517 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/bin/bash
# Script to download/unpack and locally install the GNU Health demo database
URL="https://www.gnuhealth.org/downloads/postgres_dumps/gnuhealth-$1-demo.sql.gz"
1
0
Hello community,
here is the log from the commit of package opi for openSUSE:Factory checked in at 2020-02-29 21:24:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/opi (Old)
and /work/SRC/openSUSE:Factory/.opi.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "opi"
Sat Feb 29 21:24:58 2020 rev:10 rq:780487 version:0.8.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/opi/opi.changes 2019-11-08 15:28:31.127178158 +0100
+++ /work/SRC/openSUSE:Factory/.opi.new.26092/opi.changes 2020-02-29 21:25:15.534604889 +0100
@@ -1,0 +2,7 @@
+Sat Feb 29 12:46:19 UTC 2020 - Yunhe Guo <i(a)guoyunhe.me>
+
+- Version 0.8.0
+ * Changed
+ - Type number 0 to exit
+
+-------------------------------------------------------------------
Old:
----
opi-0.7.1.tar.gz
New:
----
opi-0.8.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ opi.spec ++++++
--- /var/tmp/diff_new_pack.EvMit0/_old 2020-02-29 21:25:15.982605776 +0100
+++ /var/tmp/diff_new_pack.EvMit0/_new 2020-02-29 21:25:15.986605784 +0100
@@ -1,7 +1,7 @@
#
# spec file for package opi
#
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: opi
-Version: 0.7.1
+Version: 0.8.0
Release: 0
Summary: OBS Package Installer (CLI)
License: GPL-3.0-only
++++++ opi-0.7.1.tar.gz -> opi-0.8.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opi-0.7.1/CHANGELOG.md new/opi-0.8.0/CHANGELOG.md
--- old/opi-0.7.1/CHANGELOG.md 2019-11-08 12:13:54.000000000 +0100
+++ new/opi-0.8.0/CHANGELOG.md 2020-02-29 13:43:04.000000000 +0100
@@ -7,6 +7,12 @@
## [Unreleased]
+## [0.8.0]
+
+### Changed
+
+- Type number `0` to exit [#26](https://github.com/openSUSE-zh/opi/pulls/26)
+
## [0.7.1]
### Fixed
@@ -111,7 +117,8 @@
- Choose package and install
- Keep or remove repository after installation
-[Unreleased]: https://github.com/openSUSE-zh/opi/compare/v0.7.1...HEAD
+[Unreleased]: https://github.com/openSUSE-zh/opi/compare/v0.8.0...HEAD
+[0.8.0]: https://github.com/openSUSE-zh/opi/compare/v0.7.1...v0.8.0
[0.7.1]: https://github.com/openSUSE-zh/opi/compare/v0.7.0...v0.7.1
[0.7.0]: https://github.com/openSUSE-zh/opi/compare/v0.6.0...v0.7.0
[0.6.0]: https://github.com/openSUSE-zh/opi/compare/v0.5.2...v0.6.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opi-0.7.1/opi new/opi-0.8.0/opi
--- old/opi-0.7.1/opi 2019-11-08 12:13:54.000000000 +0100
+++ new/opi-0.8.0/opi 2020-02-29 13:43:04.000000000 +0100
@@ -192,7 +192,7 @@
my $min = shift;
my $max = shift;
my $message = shift;
- print $message || "Choose a number: ";
+ print $message || "Choose a number(0 to quit): ";
my $typed_number = <STDIN>;
chomp $typed_number;
if ($typed_number =~ /^(\d+)$/) {
@@ -201,7 +201,9 @@
return $typed_number;
}
}
-
+ if ($typed_number eq 0) {
+ exit;
+ }
return type_a_number($min, $max, "Number must be between $min and $max. Please try again: ");
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opi-0.7.1/proxy/index.php new/opi-0.8.0/proxy/index.php
--- old/opi-0.7.1/proxy/index.php 2019-11-08 12:13:54.000000000 +0100
+++ new/opi-0.8.0/proxy/index.php 2020-02-29 13:43:04.000000000 +0100
@@ -2,7 +2,6 @@
# Test it with `php -S localhost:8000 index.php`
-require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/config.php';
# TODO add API rate limits.
1
0
Hello community,
here is the log from the commit of package rdiff-backup for openSUSE:Factory checked in at 2020-02-29 21:24:56
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rdiff-backup (Old)
and /work/SRC/openSUSE:Factory/.rdiff-backup.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rdiff-backup"
Sat Feb 29 21:24:56 2020 rev:2 rq:780486 version:1.9.1~b0
Changes:
--------
--- /work/SRC/openSUSE:Factory/rdiff-backup/rdiff-backup.changes 2020-02-03 11:14:26.165878829 +0100
+++ /work/SRC/openSUSE:Factory/.rdiff-backup.new.26092/rdiff-backup.changes 2020-02-29 21:25:14.442602728 +0100
@@ -1,0 +2,20 @@
+Sun Feb 23 10:36:23 UTC 2020 - Stefan Seyfried <seife+obs(a)b1-systems.com>
+
+- update to 1.9.1b0, third beta before 2.0.0:
+ * avoid double unquoting of increment file infos, closes #266
+ * fix some ugly bytes output in strings, closes #238
+ * improved hardink handling, Closes #239
+ * add support for SOURCE_DATE_EPOCH to override the build date
+ * add efficient sparse file handling
+- remove all (upstreamed) patches:
+ * 0001-handle-sparse-files-efficiently.patch
+ * Hardlink.py.revised-1.4.0.patch
+ * compare.py-1.4.0.patch
+ * rdiff-backup-1.9-reproducible.diff
+
+-------------------------------------------------------------------
+Fri Feb 7 08:58:30 UTC 2020 - Stefan Seyfried <seife+obs(a)b1-systems.com>
+
+- add rdiff-backup-1.9-reproducible.diff for reproducible build
+
+-------------------------------------------------------------------
Old:
----
0001-handle-sparse-files-efficiently.patch
Hardlink.py.revised-1.4.0.patch
compare.py-1.4.0.patch
rdiff-backup-1.9.0b0.tar.gz
New:
----
rdiff-backup-1.9.1b0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ rdiff-backup.spec ++++++
--- /var/tmp/diff_new_pack.p1mCJK/_old 2020-02-29 21:25:15.182604193 +0100
+++ /var/tmp/diff_new_pack.p1mCJK/_new 2020-02-29 21:25:15.186604201 +0100
@@ -18,23 +18,14 @@
Name: rdiff-backup
-Version: 1.9.0~b0
-%define _beta 1.9.0b0
+Version: 1.9.1~b0
+%define _beta 1.9.1b0
Release: 0
Summary: Convenient and transparent local/remote incremental mirror/backup
License: GPL-2.0-or-later
Group: Productivity/Archiving/Backup
Url: https://rdiff-backup.net/
Source0: https://github.com/rdiff-backup/rdiff-backup/releases/download/v%{_beta}/rd…
-# https://github.com/rdiff-backup/rdiff-backup/pull/248
-# PATCH-FEATURE-UPSTREAM 0001-handle-sparse-files-efficiently.patch -- seife+obs(a)b1-systems.com
-Patch1: 0001-handle-sparse-files-efficiently.patch
-# in order not stumble on handle hardlinks, these two patches are necessary
-# http://savannah.nongnu.org/bugs/?26848
-# https://github.com/rdiff-backup/rdiff-backup/pull/240
-# PATCH-FEATURE-UPSTREAM Hardlink.py.revised-patch compare.py.patch -- hpj(a)urpla.net
-Patch2: Hardlink.py.revised-1.4.0.patch
-Patch3: compare.py-1.4.0.patch
#
BuildRequires: librsync-devel
BuildRequires: python3-devel
++++++ rdiff-backup-1.9.0b0.tar.gz -> rdiff-backup-1.9.1b0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/.travis.yml new/rdiff-backup-1.9.1b0/.travis.yml
--- old/rdiff-backup-1.9.0b0/.travis.yml 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/.travis.yml 2020-02-23 09:20:37.000000000 +0100
@@ -12,22 +12,89 @@
- 3.7
- 3.8
+#=== DEPLOYMENTS ===
+# - everything to GitHub releases
+# - wheels to PyPI (if tag looks like an alpha, beta, rc or final release)
+# - sdist to PyPI (if tag looks like an alpha, beta, rc or final release)
+# - wheels to Test PyPI (if tag looks like a development release)
+# - sdist to Test PyPI (if tag looks like a development release)
+
deploy:
- provider: releases
- file_glob: true
- file: dist/*.*
- skip_cleanup: true
- draft: true
- token:
- secure: V1Ad29+3lIQB1Sxqt8RiNKwferucTIr2mJo1Ka0m8Y1GdscP0ZkvHN4Vzjb0hts+lap8cU24tJ1zq9k22bdsNmoS3/YEg7fwbQSOPCJSYbjwMQeitDc1NP3u1mp5LWiEnQ7cflalIkmWUVpwGbwPSnUQdW3JyheUm4DP6jndGHmv3sC2r4WtZDkVY44SI5OGjvOTStTLnXhVlwXMIBKzw+o9BNdmIcpRvI3UTR+C9mA2yoNE7qgpzALZ4qn7qAmTMJzcVQb22yVZqXVCF8VD72Z66GHx75aatMmsJ/2isOEap19sVYt03fY8lchsTUsdRRCAIInxUvbdfgaEoBWj8Vfv2r/vm5DgWh93amv1RkJdmAYAMTGZG/k20vd7N+sNGKCdAF0W8hj5kriGkNnSQg7dFd+NWrF3pX9XcUkT9IGzv5eT5eYeS+yzgB3YPy8qGKwF5dRkRf7Ylw68j8YOly40rAAfgEx/pcFlYrJh62LDPr5RNhKA679+9UAp0rgkiszNH327bj1i0drqeDIhJAZSXw86B8tJZI1JRBVllKNbwDc5GRFNyms4+pvKCO+lAy5Pcn0bQMUq49qxDsdnM1t2RISivWy5CdkOTNW5WYglhovOSoA8/NjcxmsOpOazCaENEvsB3AogI+LRmpZ7lUZKxjaILuVUM2rwXlKxFB0=
- on:
- tags: true
- all_branches: true
- condition: $MAKE_STEP == ?dist*
+ - provider: releases
+ file_glob: true
+ file: dist/*.*
+ skip_cleanup: true
+ draft: true
+ token:
+ secure: V1Ad29+3lIQB1Sxqt8RiNKwferucTIr2mJo1Ka0m8Y1GdscP0ZkvHN4Vzjb0hts+lap8cU24tJ1zq9k22bdsNmoS3/YEg7fwbQSOPCJSYbjwMQeitDc1NP3u1mp5LWiEnQ7cflalIkmWUVpwGbwPSnUQdW3JyheUm4DP6jndGHmv3sC2r4WtZDkVY44SI5OGjvOTStTLnXhVlwXMIBKzw+o9BNdmIcpRvI3UTR+C9mA2yoNE7qgpzALZ4qn7qAmTMJzcVQb22yVZqXVCF8VD72Z66GHx75aatMmsJ/2isOEap19sVYt03fY8lchsTUsdRRCAIInxUvbdfgaEoBWj8Vfv2r/vm5DgWh93amv1RkJdmAYAMTGZG/k20vd7N+sNGKCdAF0W8hj5kriGkNnSQg7dFd+NWrF3pX9XcUkT9IGzv5eT5eYeS+yzgB3YPy8qGKwF5dRkRf7Ylw68j8YOly40rAAfgEx/pcFlYrJh62LDPr5RNhKA679+9UAp0rgkiszNH327bj1i0drqeDIhJAZSXw86B8tJZI1JRBVllKNbwDc5GRFNyms4+pvKCO+lAy5Pcn0bQMUq49qxDsdnM1t2RISivWy5CdkOTNW5WYglhovOSoA8/NjcxmsOpOazCaENEvsB3AogI+LRmpZ7lUZKxjaILuVUM2rwXlKxFB0=
+ on:
+ tags: true
+ all_branches: true
+ condition: $MAKE_STEP == ?dist*
+ # we use beta/alpha/rc/final version tags to release to pypi.org
+ - provider: pypi
+ user: "__token__"
+ password:
+ secure: QGprJSAZR3X88Ir4qpJpNdel5m6CngEtYlD2DAgwRuyPHClhMhXcayB7NbRqACRdtsqBBdQHSOnPO6jBcrhvTIeFbyhiSWZKME113yn4RFD3E+z/p8otb02Lk0DvFTakeC2qxsJ1nlwxGte7qT5Ac9dL7U5O3SSlWNoq2c3QmoD/d+fVdtjf6tp4QywlOIr4Jyx2WWFBQDSQB2cjY7YfwgcQchXkOoVog83dUID4pTh15HlM1Q9E8k0EKueGrDVkS3hhlbPimv1C1coM/IAIAXaTSR1AZZCZELsVSbBOW1hMaAL4MPpr9ekKx/eErnZiIkCuovBTk0XKvzfOyPluFjnuxazKWH9EU5WutCzfxtXh29fLNLYKaqalgjI024kvzTxVFtxJFvCcnhEjcqgs6sxh4nrzAosK163LViFRlJjgbT+2kVgeWiA51fjFTdIj0ep3/NMN8SgvSWQu7SRA8Vtxx9NLzTu57QPKZdRLOW98XUnnSwWPvFymNJ3JHQtp3tsRvTaLcbECvpI82bQa/9+MEszGXwm5TdM3Ogie7OUgDReq6fYbSCYXli5800QwA8Zj6zwJH2qG7l2VAPm0Gd0O9RPP/U2DCxDVAHPDV8VYzKsLWeCQ0Rsxz0S0d1r1Vss15rZ/C/RaCXUJB9ba4F1uRMh4l8Jm4/eSAcuAryI=
+ distributions: bdist_wheel
+ skip_existing: true
+ skip_cleanup: true
+ on:
+ tags: true
+ all_branches: true
+ condition: $MAKE_STEP =~ ^(bdist_wheel)$ && $TRAVIS_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+((a|b|rc)[0-9]+)?$
+ # TODO add |bdist_win to release also Windows wheel
+ - provider: pypi
+ user: "__token__"
+ password:
+ secure: QGprJSAZR3X88Ir4qpJpNdel5m6CngEtYlD2DAgwRuyPHClhMhXcayB7NbRqACRdtsqBBdQHSOnPO6jBcrhvTIeFbyhiSWZKME113yn4RFD3E+z/p8otb02Lk0DvFTakeC2qxsJ1nlwxGte7qT5Ac9dL7U5O3SSlWNoq2c3QmoD/d+fVdtjf6tp4QywlOIr4Jyx2WWFBQDSQB2cjY7YfwgcQchXkOoVog83dUID4pTh15HlM1Q9E8k0EKueGrDVkS3hhlbPimv1C1coM/IAIAXaTSR1AZZCZELsVSbBOW1hMaAL4MPpr9ekKx/eErnZiIkCuovBTk0XKvzfOyPluFjnuxazKWH9EU5WutCzfxtXh29fLNLYKaqalgjI024kvzTxVFtxJFvCcnhEjcqgs6sxh4nrzAosK163LViFRlJjgbT+2kVgeWiA51fjFTdIj0ep3/NMN8SgvSWQu7SRA8Vtxx9NLzTu57QPKZdRLOW98XUnnSwWPvFymNJ3JHQtp3tsRvTaLcbECvpI82bQa/9+MEszGXwm5TdM3Ogie7OUgDReq6fYbSCYXli5800QwA8Zj6zwJH2qG7l2VAPm0Gd0O9RPP/U2DCxDVAHPDV8VYzKsLWeCQ0Rsxz0S0d1r1Vss15rZ/C/RaCXUJB9ba4F1uRMh4l8Jm4/eSAcuAryI=
+ distributions: sdist
+ skip_existing: true
+ skip_cleanup: true
+ on:
+ tags: true
+ all_branches: true
+ condition: $MAKE_STEP == sdist && $TRAVIS_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+((a|b|rc)[0-9]+)?$
+ # we use dev version tags to release to test.pypi.org
+ - provider: pypi
+ user: "__token__"
+ password:
+ secure: KYfWfkPfllpPq+qkAXiX5KEPNrPu/L46DkZ1H6VWE69zQMuuTdlfC4UiQ28tt5HeeFt7Wxnn1JlfWuaFhIZx+xMa3oa3ln9BINXZmfMUcX6xpK5Uegtd8Y0ywiZJsd5PN1ZmthfgWTLJ9mJydYb13OpgzNxqpO9eiYz/4xpnSm7zG5OYfmzt5gR+CbzIEcL0VS15Os7i/aCEes32HNcqyl4Dwx7mJ0lFgzRTChYTzsifrtD4XmH6p5H+WrPIx336Wz/8jrBgcM20kXwHiyWGjg7gnWCx8+fcPhHWa0e3iC48KoSd3ixeK1QyrPt2jbUtuMmB6x5yM/fxloWyMCj8W0jU1jJgzrZA3TzV2EPym54BoDz2lZ1xTeAxeCk1nYcA6wT6Xea6MwSGTvV/qPLEnXIafEt9bcD0ox+JfCjNVrw3baQqnwAWnyKCFKYJ3IHJCXz23J26pLlv10DgEtxI5/U2nUU/Nx9f/fJn/CJlz1X1TOFygqPICoUSE3t4jsqbLbA48UJz6fZnzSwFO2FN+wGUqudq/JkAaRcLu4/W+1f4HrQ5UVk8Ql4wDUS3iBr8FYsQ+S8fxvHRJGaCVSO1KCUcX//DHV3iB2VwDNHiD8zF3FtRuyODpFbo5BlL3eIX5w1dCTx/6SgDpNb/PofkQdaHi6woIzX+8zoymMT+4QA=
+ distributions: bdist_wheel
+ skip_existing: true
+ skip_cleanup: true
+ server: https://test.pypi.org/legacy/
+ # FIXME workaround to make deploy possibly work under Windows, remove once released
+ edge:
+ source: native-api/dpl
+ branch: z-quotes
+ on:
+ tags: true
+ all_branches: true
+ condition: $MAKE_STEP =~ ^(bdist_wheel)$ && $TRAVIS_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+((a|b|rc)[0-9]+)?\.dev[0-9]+$
+ # TODO add |bdist_win to release also Windows wheel
+ - provider: pypi
+ user: "__token__"
+ password:
+ secure: KYfWfkPfllpPq+qkAXiX5KEPNrPu/L46DkZ1H6VWE69zQMuuTdlfC4UiQ28tt5HeeFt7Wxnn1JlfWuaFhIZx+xMa3oa3ln9BINXZmfMUcX6xpK5Uegtd8Y0ywiZJsd5PN1ZmthfgWTLJ9mJydYb13OpgzNxqpO9eiYz/4xpnSm7zG5OYfmzt5gR+CbzIEcL0VS15Os7i/aCEes32HNcqyl4Dwx7mJ0lFgzRTChYTzsifrtD4XmH6p5H+WrPIx336Wz/8jrBgcM20kXwHiyWGjg7gnWCx8+fcPhHWa0e3iC48KoSd3ixeK1QyrPt2jbUtuMmB6x5yM/fxloWyMCj8W0jU1jJgzrZA3TzV2EPym54BoDz2lZ1xTeAxeCk1nYcA6wT6Xea6MwSGTvV/qPLEnXIafEt9bcD0ox+JfCjNVrw3baQqnwAWnyKCFKYJ3IHJCXz23J26pLlv10DgEtxI5/U2nUU/Nx9f/fJn/CJlz1X1TOFygqPICoUSE3t4jsqbLbA48UJz6fZnzSwFO2FN+wGUqudq/JkAaRcLu4/W+1f4HrQ5UVk8Ql4wDUS3iBr8FYsQ+S8fxvHRJGaCVSO1KCUcX//DHV3iB2VwDNHiD8zF3FtRuyODpFbo5BlL3eIX5w1dCTx/6SgDpNb/PofkQdaHi6woIzX+8zoymMT+4QA=
+ distributions: sdist
+ skip_existing: true
+ skip_cleanup: true
+ server: https://test.pypi.org/legacy/
+ # FIXME workaround to make deploy possibly work under Windows, remove once released
+ edge:
+ source: native-api/dpl
+ branch: z-quotes
+ on:
+ tags: true
+ all_branches: true
+ condition: $MAKE_STEP == sdist && $TRAVIS_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+((a|b|rc)[0-9]+)?\.dev[0-9]+$
+
+#=== ADDITIONAL JOBS ===
jobs:
include:
- # Build and deploy Windows executable
+ #--- Build and deploy Windows executable ---
- os: windows
language: shell
env: MAKE_STEP=bdist_win
@@ -43,7 +110,7 @@
- pyenv local $pyver
- python --version
install:
- - pip install --upgrade tox pywin32 setuptools-scm PyInstaller
+ - pip install --upgrade tox pywin32 setuptools-scm PyInstaller wheel
- pyenv rehash
- git clone -b v2.2.1 https://github.com/librsync/librsync.git $HOME/.librsync
- export LIBRSYNC_DIR=$HOME/librsync
@@ -53,7 +120,7 @@
- cmake --install . --config Release
- popd
script:
- - python setup.py bdist
+ - python setup.py bdist_wheel
- vername=rdiff-backup-`python setup.py --version`
- PyInstaller --onefile --distpath build/$vername --paths=build/lib.win32-$pyverbrief --add-data=src/rdiff_backup.egg-info/PKG-INFO\;rdiff_backup.egg-info --console build/scripts-$pyverbrief/rdiff-backup
before_deploy:
@@ -61,7 +128,11 @@
- pushd build
- 7z a -tzip ../dist/$vername.win32exe.zip $vername
- popd
- # Build and deploy Linux wheels using manylinux Docker containers
+
+ #--- Build and deploy Linux wheels using manylinux Docker containers ---
+ # - build manylinux2010 (and manylinux1) x64
+ # - build manylinux2010 i686
+ # - build manylinux2014 x64
# avoiding manylinux2014_i686 because it does not provide librsync-devel
- os: linux
sudo: required
@@ -98,9 +169,11 @@
script:
- docker run --rm -e PLAT=$PLAT -v `pwd`:/io $DOCKER_IMAGE $PRE_CMD /io/tools/build_wheels.sh
- ls dist/
+
+ #--- Build Debian packages ---
- os: linux
language: shell
- env: MAKE_STEP=bdist_deb RUN_COMMAND=
+ env: MAKE_STEP=dist_deb RUN_COMMAND=
addons:
apt:
packages: # make sure these match debian/control contents
@@ -120,8 +193,8 @@
script:
- make $MAKE_STEP
- cat ../*.changes
- - mkdir -vp dist
- - cp -v ../*.* dist/
+
+ #--- Build and deploy Debian packages ---
- os: linux
env: MAKE_STEP=sdist RUN_COMMAND=
install:
@@ -135,7 +208,7 @@
only:
- master
- /_$/ # put an underscore at the end of the branch name to force building
- - /^v\d+\.\d+\.\d+[a-z]?[0-9]?$/ # we need to whitelist tags or nothing will happen
+ - /^v\d+\.\d+\.\d+((a|b|rc)[0-9])?(\.dev[0-9]+)?$/ # we need to whitelist tags or nothing will happen PEP440
addons:
apt:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/CHANGELOG new/rdiff-backup-1.9.1b0/CHANGELOG
--- old/rdiff-backup-1.9.0b0/CHANGELOG 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/CHANGELOG 2020-02-23 09:20:37.000000000 +0100
@@ -1,13 +1,42 @@
-New in v2.0.0 (????/??/??)
---------------------------
+New in v1.9.1b0 (2020-02-23)
+----------------------------
+
+## Changes
+
+* FIX: remove too specific Debian packages from GitHub deployment, closes #263
+* NEW: add a new tool to help generate the changelog (description in DEVELOP.md)
+* DOC: new release rules and procedure added to docs/DEVELOP.md
+* FIX: avoid double unquoting of increment file infos, closes #266
+* FIX: versioning of Debian packages follows without glitch the overall tag based versioning.
+* DEV: automate via Travis deployment pipeline release to PyPI and Test PyPI.
+* FIX: remove some more ugly bytes output in strings using _safe_str, closes #238
+* FIX: added and moved hardlinks were not correctly counted and restored, Closes #239
+* FIX: rdiff-backup complained about missing SHA checksums of hardlinks, Closes #78
+* FIX: avoid int is not iterable error when calling remote command on Windows
+* DEV: flake8 checks only setup.py, src, testing and tools code.
+* NEW: add support for SOURCE_DATE_EPOCH to override the build date, making reproducible builds possible.
+* NEW: sparse files are handled more efficiently, if not compressed and depending on file system
+
+## Authors
+
+* Bernhard M. Wiedemann
+* Eric L
+* Otto Kekäläinen
+* Patrik Dufresne
+* Stefan Seyfried
+* zjw
+
+
+New in v1.9.0b0 (2020-01-31)
+----------------------------
Different bug fixes, improvements in code and documentation - too many to list
(Andreas Olsson, Andrew Foster, Arrigo Marchiori, bigbear3001, davekempe,
David I. Lehn, elMor3no, Eric Lavarde, Frank Crawford, Jiri Lunacek, joshn, Josh Soref,
-mestre, Oliver Lowe, orangenschalen, Otto Kek�l�inen, owsla, Patrik Dufresne, Reio Remma,
+mestre, Oliver Lowe, orangenschalen, Otto Kekäläinen, owsla, Patrik Dufresne, Reio Remma,
Rodrigo Silva, Stefan Seyfried, Wes Cilldhaire, zjw)
-Add automated of different package formats (Otto Kek�l�inen, Arrigo Marchiori, Eric Lavarde)
+Add automated of different package formats (Otto Kekäläinen, Arrigo Marchiori, Eric Lavarde)
Add RDIFF_BACKUP_VERBOSITY environment variable (Eric Lavarde)
@@ -866,7 +895,7 @@
Kaltenecker for bug report.
Fixed error when --restrict path given with trailing backslash. Bug
-report by �ke Br�nnstr�m.
+report by Åke Brännström.
Fixed many functions like --list-increments, --remove-older-than,
etc. which previously didn't work with filename quoting. Thanks to
@@ -1233,7 +1262,7 @@
--windows-mode is now short for --windows-time-format --chars-to-quote
A-Z: --no-hard-links --exclude-special-files. Thanks to Paul-Erik
-T�rr�nen for some helpful windows info.
+Törrönen for some helpful windows info.
Multiple --include and --exclude statements can now be given in a
single file. See the documentation on
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/Makefile new/rdiff-backup-1.9.1b0/Makefile
--- old/rdiff-backup-1.9.0b0/Makefile 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/Makefile 2020-02-23 09:20:37.000000000 +0100
@@ -50,8 +50,8 @@
# Prepare wheel for deployment.
${RUN_COMMAND} ./setup.py sdist
-bdist_deb:
- ${RUN_COMMAND} gbp buildpackage -us -uc
+dist_deb:
+ ${RUN_COMMAND} debian/autobuild.sh
container:
# Build development image
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/PKG-INFO new/rdiff-backup-1.9.1b0/PKG-INFO
--- old/rdiff-backup-1.9.0b0/PKG-INFO 2020-01-31 21:51:35.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/PKG-INFO 2020-02-23 09:20:42.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.2
Name: rdiff-backup
-Version: 1.9.0b0
+Version: 1.9.1b0
Summary: Backup and Restore utility, easy to use, efficient, locally and remotely usable
Home-page: https://rdiff-backup.net/
Author: The rdiff-backup project
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/README.md new/rdiff-backup-1.9.1b0/README.md
--- old/rdiff-backup-1.9.0b0/README.md 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/README.md 2020-02-23 09:20:37.000000000 +0100
@@ -58,14 +58,15 @@
#### On Windows
-Just drop the binary `rdiff-backup-VERSION-PLATFORM.exe`, possibly renamed to `rdiff-backup`,
-somewhere in your PATH and it should work, as it comes with all dependencies included.
+Just download and unpack the file `rdiff-backup-VERSION.winBITS.zip`
+available as _asset_ attached to one of the releases available in the
+[releases section](https://github.com/rdiff-backup/rdiff-backup/releases) and
+drop the binary `rdiff-backup.exe` somewhere in your PATH and it should work,
+as it comes with all dependencies included.
For remote operations, you will need to have an SSH package installed (also on Linux but it is
generally more obvious).
-> **NOTE:** for now the documentation under Windows is available online from the [documentation folder](docs/).
-
### From source code
This is an advanced topic, but necessary for platforms like MacOS X and FreeBSD, and
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/debian/autobuild.sh new/rdiff-backup-1.9.1b0/debian/autobuild.sh
--- old/rdiff-backup-1.9.0b0/debian/autobuild.sh 1970-01-01 01:00:00.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/debian/autobuild.sh 2020-02-23 09:20:37.000000000 +0100
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+# Automatically update changelog with new version number
+VERSION="$(./setup.py --version)"
+dch -b -v "${VERSION}" "Automatic build"
+
+# Build package ignoring the modified changelog
+gbp buildpackage -us -uc --git-ignore-new
+
+# Reset debian/changelog
+git checkout debian/changelog
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/debian/changelog new/rdiff-backup-1.9.1b0/debian/changelog
--- old/rdiff-backup-1.9.0b0/debian/changelog 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/debian/changelog 2020-02-23 09:20:37.000000000 +0100
@@ -1,4 +1,4 @@
-rdiff-backup (1.4.0b1) unstable; urgency=medium
+rdiff-backup (1.9.0b0) unstable; urgency=medium
* Initial changelog entry for native rdiff-backup packaging.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/debian/rules new/rdiff-backup-1.9.1b0/debian/rules
--- old/rdiff-backup-1.9.0b0/debian/rules 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/debian/rules 2020-02-23 09:20:37.000000000 +0100
@@ -1,10 +1,4 @@
#!/usr/bin/make -f
-# Get VERSION from the string in PKG_INFO as generated by the current build
-VERSION := $(shell grep '^Version:' src/rdiff_backup.egg-info/PKG-INFO | cut -d ' ' -f 2)
-
%:
dh $@ --buildsystem=pybuild --with python3
-
-override_dh_gencontrol:
- dh_gencontrol -- -v${VERSION}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/docs/DEVELOP.md new/rdiff-backup-1.9.1b0/docs/DEVELOP.md
--- old/rdiff-backup-1.9.0b0/docs/DEVELOP.md 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/docs/DEVELOP.md 2020-02-23 09:20:37.000000000 +0100
@@ -10,7 +10,8 @@
git clone https://github.com/rdiff-backup/rdiff-backup.git
> **NOTE:** If you plan to provide your own code, you should first fork
-our repo and clone your own forked repo. How is described at
+our repo and clone your own forked repo (probably using ssh not https).
+How is described at
https://help.github.com/en/github/collaborating-with-issues-and-pull-reques…
@@ -18,9 +19,9 @@
- Before committing to a lot of writing or coding, please file an issue on Github and discuss your plans and gather feedback. Eventually it will be much easier to merge your change request if the idea and design has been agreed upon, and there will be less work for you as a contributor if you implement your idea along the correct lines to begin with.
- Please check out [existing issues](https://github.com/rdiff-backup/rdiff-backup/issues) and [existing merge requests](https://github.com/rdiff-backup/rdiff-backup/pulls) and browse the [git history](https://github.com/rdiff-backup/rdiff-backup/commits/master) to see if somebody already tried to address the thing you have are interested in. It might provide useful insight why the current state is as it is.
-- Changes can be submitted using the typical Github workflow: clone this repository, make your changes, test and verify, and submit a Pull Request.
-- Each change (= pull request) should focus on some topic and resist changing anything else. Keeping the scope clear also makes it easier to review the pull request. A good pull request has only one or a few commits, with each commit having a good commit subject and if needed also a body that explains the change.
-- For all code changes, please remember also to include inline comments and update tests where needed.
+- Changes can be submitted using the typical Github workflow: clone this repository, make your changes, test and verify, and submit a Pull Request (PR).
+- For all code changes, please remember also to include inline comments and
+ update tests where needed.
### License
@@ -35,6 +36,11 @@
and the code and other contents to be of good quality and a reasonable
foundation for them to continue development on.
+Each PR focuses on some topic and resist changing anything else. Keeping the
+scope clear also makes it easier to review the pull request. A good pull
+request has only one or a few commits, with each commit having a good commit
+subject and if needed also a body that explains the change.
+
Each pull request has only one author, but anybody can give feedback. The
original author should be given time to address the feedback – reviewers should
not do the fixes for the author, but instead let the author keep the authorship.
@@ -42,15 +48,25 @@
been merged, or even in parallel if the changes are in different files or at
least on different lines and do not cause merge conflicts if worked on.
-If a pull requests for whatever reason is not quickly merged, should it be
-refreshed by [rebasing](https://git-scm.com/docs/git-rebase) it on latest
-upstream master.
+It is the responsibility of the PR author to keep it without conflict with
+master (e.g. if not quickly merged) and overall to support the review process.
Ideally each pull request gets some feedback within 24 hours from it having been
filed, and is merged within days or a couple of weeks. Each author should
facilitate quick reviews and merges by making clean and neat commits and pull
requests that are quick to review and do not spiral out in long discussions.
+If something is of interest for the changelog, prefix the statement in the
+commit body with a three uppercase letters and a column; which acronym is
+not that important but here is a list of recommended ones (see the release
+section to understand why it's important):
+
+* FIX: for a bug fix
+* NEW: for a new feature
+* CHG: for a change requesting consideration when upgrading
+* DOC: for documentation aspects
+* WEB: anything regarding the website
+
#### Merging changes to master
Currently the rdiff-backup Github repository is configured so that merging a
@@ -64,6 +80,12 @@
standards and have a track record of meaningful contributions over several
months.
+It is the responsibility of the merging developer to make sure that the PR
+is _squashed_ and that the squash commit message helps the release process
+with the right description and 3-capital-letters prefix (it is still the
+obligation of the PR author to provide enough information in their commit
+messages).
+
### Coding style
This project is written in Python, and must follow the official [PEP 8 coding
@@ -286,3 +308,136 @@
rdiff-backup -v9 localhost::/sourcedir /backupdir 2>&1 | awk \
'/^2019-09-16/ { if (line) print line; line = $0 } ! /^2019-09-16/ { line = line " ## " $0 }' \
| sort | sed 's/ ## /\n/g'
+
+### Debug iterators
+
+When debugging, the fact that rdiff-backup uses a lot of iterators makes it
+rather complex to understand what's happening. It would sometimes make it
+easier to have a list to study at once of iterating painfully through each
+_but_ if you simply use `p list(some_iter_var)`, you basically run through
+the iterator and it's lost for the program, which can only fail.
+
+The solution is to use `itertools.tee`, create a copy of the iterator and
+print the copy, e.g.:
+
+```
+(Pdb) import itertools
+(Pdb) inc_pair_iter,mycopy = itertools.tee(inc_pair_iter)
+(Pdb) p list(map(lambda x: [str(x[0]),list(map(str,x[1]))], mycopy))
+[... whatever output ...]
+```
+
+Assuming the iteration has no side effects, the initial variable `inc_pair_iter`
+is still valid for the rest of the program, whereas the `mycopy` is "dried out"
+(but you can repeat the `tee` operation as often as you want).
+
+## RELEASING
+
+We use [Travis CI](https://travis-ci.org) to release automatically, as setup in the [Travis configuration file](../.travis.yml).
+
+The following rules apply:
+
+* each modification to master happens through a Pull Request (PR) which triggers
+ a pipeline job, which must be succesful for the merge to have a chance to
+ happen. Such PR jobs will _not_ trigger a release.
+* GitHub releases are generated as draft only on Git tags looking like a release.
+ The release manager reviews then the draft release, names and describes it
+ before they makes it visible. An automated Pypi release is foreseen but not
+ yet implemented.
+* If you need to trigger a job for test purposes (e.g. because you changed
+ something to the pipeline), create a branch or a tag with an underscore at
+ the end of their name. Just make sure that you remove such tags, and
+ potential draft releases, after usage.
+* If you want, again for test purposes, to trigger a PyPI deployment towards
+ test.pypi.org, tag the commit before you push it with a development release
+ tag, like `vA.B.CbD.devN`, then explicitly push the tag and the branch at
+ the same time e.g. with `git push origin vA.B.CbD.devN myname-mybranch`.
+
+> **TIP:** Travis will not trigger again on a commit which has already gone
+ through the pipeline, even if you add a tag. This applies especially
+ to PR commits merged to master without squashing.
+
+Given the above rules, a release cycle looks roughly as follows:
+
+1. Call `./tools/get_changelog_since.sh PREVIOUSTAG` to get a list of changes
+ (see above) since the last release and a sorted and unique list of authors,
+ on which basis you can extend the [CHANGELOG](../CHANGELOG) for the
+ new release.
+ **IMPORTANT:** make sure that the PR is squashed or you won't be able to
+ trigger the release pipeline via a tag on master.
+2. Make sure you have the latest master commits with
+ `git checkout master && git pull --prune`.
+3. Tag the last commit with `git tag vX.Y.ZbN` (beta) or `git tag vX.y.Z" (stable).
+4. Push the tag to GitHub with `git push --tags`.
+5. You won't see anything in GitHub at first and need to go directly to
+ [Travis builds](https://travis-ci.org/rdiff-backup/rdiff-backup/builds) to
+ verify that the pipeline has started.
+6. If everything goes well, you should see the
+ [new draft release](https://github.com/rdiff-backup/rdiff-backup/releases)
+ with all assets (aka packages) attached to it after all jobs have finished
+ in Travis.
+7. Give the release a title and description and save it to make it visible to
+ everybody.
+8. You'll get a notification e-mail telling you that rdiff-backup-admin has
+ released a new version.
+9. Use this e-mail to inform the [rdiff-backup users](rdiff-backup-users(a)nongnu.org).
+
+> **IMPORTANT:** if not everything goes well, remove the tag both locally with
+ `git tag -d TAG` and remotely with `git push -d origin TAG`.
+ Then fix the issue with a new PR and start from the beginning.
+
+> **TIP:** the PyPI deploy pipeline is for now broken under Windows on Travis-CI.
+ You may download the Windows wheel(s) from GitHub and upload them to
+ PyPI from the command line using twine:
+ `twine upload [--repository-url https://test.pypi.org/legacy/] dist/rdiff\_backup-*-win32.whl`
+
+The following sub-chapters list some learnings and specifities in case you need to modify the pipeline.
+
+### Install the Travis client locally
+
+See https://github.com/travis-ci/travis.rb for details, here only the gist of it:
+
+```
+ruby -v # version >= 2
+dnf install rubygems # or zipper, apt, yum...
+gem install travis # as non-root keeps everybody more happy
+travis version # 1.8.10 -> all OK
+```
+
+> **NOTE:** installing travis gem also pulls the dependencies multipart-post, faraday, faraday_middleware, highline, backports, net-http-pipeline, net-http-persistent, addressable, multi_json, gh, launchy, ethon, typhoeus, websocket, pusher-client. You might want to install some of them via your preferred package manager instead.
+
+### Create an OAuth key
+
+Use the travis client to generate a secure API key (you can throw away other changes to the `.travis.yml` file). You will need the password of the rdiff-backup-admin, hence only project admins can generate it:
+
+```
+$ travis setup releases
+Detected repository as rdiff-backup/rdiff-backup, is this correct? |yes|
+Username: rdiff-backup-admin
+Password for rdiff-backup-admin: ********************
+File to Upload: dist/*
+Deploy only from rdiff-backup/rdiff-backup? |yes|
+Encrypt API key? |yes|
+```
+
+The key to add looks then as follows for GitHub deployment (the concrete key shown here isn't valid though):
+
+```
+deploy:
+ provider: releases
+ api_key:
+ secure: lqg+HZoy68WudiogbEnOmhxfw9zEJhPOyM4bLJdU2lRBlUZbf0uFvpVJdJqPB7rovKpDknapg4xdXdpbLbD0r/PwsSI9UyFLmyhGn24pnSlrFFjFm2AIQQJUMiCcqsPqNc7fXNMC1BwuM1/RjO3hIxfPxI+A9MSVqW3qhzmerOKXeKFiOLXJ0FkTomRdWGhCEafWO1Ibz5O2d5psK1N/r1ni8kv+E6GPjHk54vmKNcFg8uB7+cPs7ONtW2F+M/h12UVZkC+hy8Bss+esQIMYdVLW5JkKSFfNwKs57qDYYd0lWLzMRti+S+0k/1O6l51BzLY61C4FlRwrMWAy4HIYn5ui39GXIYtGXq9zW+EpYvqTsar+KDU+DGzsr+hAt+eCQpbmZ2SpA7B8Mb3x+BwAcEkvCql789FhWCOd3arUm3H6Ng6yNt50crafJeboHhmitgFQ9uTM7AnXwMnIYVkl6IAZlPkIj20TF1JSdmzpPG2jEJATsMybCuaAuS+ngq4DnJ1axGcclIr4AY9RkSI8EVrL1HTcVLaIH0JnWdO/YC7DSZloC0oswbch1qaW3WsWkJspeaLRvochyFYsatAbvZ46Mzt5uuJUPtSNUVizeb7kBhVGzLVYIepd5XYPgc3Qxp23hu2k9lwg4vjq8WFegC5a34SW/zEZeuFP3HTnD+4=
+```
+
+### Delete draft releases
+
+Because there is one draft release created for each pipeline job, it can be quite a lot when one tests the release pipeline. The GitHub WebUI requires quite a lot of clicks to delete them. A way to simplify (a bit) the deletion is to install the command line tool `hub` and call the following command:
+
+```
+hub release --include-drafts -f '%U %S %cr%n' | \
+ awk '$2 == "draft" && $4 == "days" && $3 > 2 {print $1}' | xargs firefox
+```
+
+the `2` compared to `$3` is the number of days, so that you get one tab opened in firefox for each draft release, so that you only need 2 clicks and one Ctrl+W (close the tab) to delete those releases.
+
+> **NOTE:** deletion directly using hub isn't possible as it only supports tags and not release IDs. Drafts do NOT have tags...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/setup.py new/rdiff-backup-1.9.1b0/setup.py
--- old/rdiff-backup-1.9.0b0/setup.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/setup.py 2020-02-23 09:20:37.000000000 +0100
@@ -88,9 +88,10 @@
def run(self):
if DEBUG:
self.debug_print(self.distribution.dump_option_dicts())
+ build_time = int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))
replacement_dict = {
"version": self.distribution.get_version(),
- "month_year": time.strftime("%B %Y", time.localtime(time.time()))
+ "month_year": time.strftime("%B %Y", time.gmtime(build_time))
}
for template in self.template_files:
self.make_file(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff-backup-statistics new/rdiff-backup-1.9.1b0/src/rdiff-backup-statistics
--- old/rdiff-backup-1.9.0b0/src/rdiff-backup-statistics 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff-backup-statistics 2020-02-23 09:20:37.000000000 +0100
@@ -78,13 +78,13 @@
os.path.join(os.fsencode(args[0]), b"rdiff-backup-data"),
)
if not Globals.rbdir.isdir():
- sys.exit("Directory %a not found" % (Globals.rbdir.path,))
+ sys.exit("Directory %s not found" % (Globals.rbdir.get_safepath(),))
def system(cmd):
sys.stdout.flush()
if os.system(cmd):
- sys.exit("Error running command '%a'\n" % (cmd,))
+ sys.exit("Error running command '%s'\n" % _safe_str(cmd))
class StatisticsRPaths:
@@ -125,7 +125,7 @@
result.append((session_dict[time], filestat_dict[time]))
else:
sys.stderr.write(
- "No file_statistics to match %a\n" % (session_dict[time].path,)
+ "No file_statistics to match '%s'\n" % session_dict[time].get_safepath()
)
return result
@@ -284,7 +284,7 @@
continue
match = r.match(line)
if not match:
- sys.stderr.write("Error parsing line: %a\n" % (line,))
+ sys.stderr.write("Error parsing line: %s\n" % _safe_str(line))
continue
filename = match.group(1)
@@ -521,6 +521,14 @@
Globals.rbdir = FilenameMapping.get_quotedrpath(Globals.rbdir)
+def _safe_str(cmd):
+ """Transform bytes into string without risk of conversion error"""
+ if isinstance(cmd, str):
+ return cmd
+ else:
+ return str(cmd, errors='replace')
+
+
def Main():
Time.setcurtime()
parse_args()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup/FilenameMapping.py new/rdiff-backup-1.9.1b0/src/rdiff_backup/FilenameMapping.py
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup/FilenameMapping.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup/FilenameMapping.py 2020-02-23 09:20:37.000000000 +0100
@@ -48,6 +48,14 @@
pass
+def _safe_str(cmd):
+ """Transform bytes into string without risk of conversion error"""
+ if isinstance(cmd, str):
+ return cmd
+ else:
+ return str(cmd, errors='replace')
+
+
def set_init_quote_vals():
"""Set quoting value from Globals on all conns"""
for conn in Globals.connections:
@@ -60,7 +68,7 @@
chars_to_quote = Globals.chars_to_quote
if len(Globals.quoting_char) != 1:
log.Log.FatalError("Expected single character for quoting char,"
- "got '%a' instead" % (Globals.quoting_char, ))
+ "got '%s' instead." % _safe_str(Globals.quoting_char))
quoting_char = Globals.quoting_char
init_quoting_regexps()
@@ -69,7 +77,7 @@
"""Compile quoting regular expressions"""
global chars_to_quote_regexp, unquoting_regexp
assert chars_to_quote and isinstance(chars_to_quote, bytes), \
- "Chars to quote are wrong: %a" % chars_to_quote
+ "Chars to quote are wrong: '%s'." % _safe_str(chars_to_quote)
try:
chars_to_quote_regexp = re.compile(b"[%b]|%b" %
(chars_to_quote, quoting_char), re.S)
@@ -125,11 +133,11 @@
def unquote_single(match):
"""Unquote a single quoted character"""
if not len(match.group()) == 4:
- raise QuotingException("Quoted group wrong size: %a" % match.group())
+ raise QuotingException("Quoted group wrong size: '%s'." % _safe_str(match.group()))
try:
return os.fsencode(chr(int(match.group()[1:])))
except ValueError:
- raise QuotingException("Quoted out of range: %a" % match.group())
+ raise QuotingException("Quoted out of range: '%s'." % _safe_str(match.group()))
class QuotedRPath(rpath.RPath):
@@ -183,8 +191,6 @@
self.inc_timestr = unquote(temp_rp.inc_timestr)
else:
result = rpath.RPath.isincfile(self)
- if result:
- self.inc_basestr = unquote(self.inc_basestr)
return result
def get_path(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup/Hardlink.py new/rdiff-backup-1.9.1b0/src/rdiff_backup/Hardlink.py
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup/Hardlink.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup/Hardlink.py 2020-02-23 09:20:37.000000000 +0100
@@ -105,7 +105,14 @@
or src_rorp.getnumlinks() == dest_rorp.getnumlinks() == 1):
return 1 # Hard links don't apply
- if src_rorp.getnumlinks() < dest_rorp.getnumlinks():
+ """The sha1 of linked files is only stored in the metadata of the first
+ linked file on the dest side. If the first linked file on the src side is
+ deleted, then the sha1 will also be deleted on the dest side, so we test for this
+ & report not equal so that another sha1 will be stored with the next linked
+ file on the dest side"""
+ if (not islinked(src_rorp) and not dest_rorp.has_sha1()):
+ return 0
+ if src_rorp.getnumlinks() != dest_rorp.getnumlinks():
return 0
src_key = get_inode_key(src_rorp)
index, remaining, dest_key, digest = _inode_index[src_key]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup/SetConnections.py new/rdiff-backup-1.9.1b0/src/rdiff_backup/SetConnections.py
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup/SetConnections.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup/SetConnections.py 2020-02-23 09:20:37.000000000 +0100
@@ -151,7 +151,7 @@
try:
return __cmd_schema % host_info
except TypeError:
- Log.FatalError("Invalid remote schema:\n\n%a\n" % __cmd_schema)
+ Log.FatalError("Invalid remote schema:\n\n%s\n" % _safe_str(__cmd_schema))
def init_connection(remote_cmd):
@@ -165,15 +165,23 @@
if not remote_cmd:
return Globals.local_connection
- Log("Executing %a" % remote_cmd, 4)
+ Log("Executing %s" % _safe_str(remote_cmd), 4)
try:
# we need buffered read on SSH communications, hence using
# default value for bufsize parameter
- process = subprocess.Popen(
- remote_cmd,
- shell=True,
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE)
+ if os.name == 'nt':
+ # FIXME workaround because python 3.7 doesn't yet accept bytes
+ process = subprocess.Popen(
+ os.fsdecode(remote_cmd),
+ shell=True,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE)
+ else:
+ process = subprocess.Popen(
+ remote_cmd,
+ shell=True,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE)
(stdin, stdout) = (process.stdin, process.stdout)
except OSError:
(stdin, stdout) = (None, None)
@@ -196,13 +204,13 @@
Couldn't start up the remote connection by executing
- %a
+ %s
Remember that, under the default settings, rdiff-backup must be
installed in the PATH on the remote system. See the man page for more
information on this. This message may also be displayed if the remote
version of rdiff-backup is quite different from the local version (%s).""" %
- (exception, remote_cmd, Globals.version))
+ (exception, _safe_str(remote_cmd), Globals.version))
except OverflowError:
Log.FatalError(
"""Integer overflow while attempting to establish the
@@ -213,10 +221,11 @@
Please make sure that nothing is printed (e.g., by your login shell) when this
command executes. Try running this command:
- %a
+ %s
which should only print out the text: rdiff-backup <version>""" %
- (remote_cmd, remote_cmd.replace(b"--server", b"--version")))
+ (_safe_str(remote_cmd),
+ _safe_str(remote_cmd.replace(b"--server", b"--version"))))
if remote_version != Globals.version:
Log(
@@ -320,3 +329,11 @@
""" % (Globals.version, version))
else:
print("Server OK")
+
+
+def _safe_str(cmd):
+ """Transform bytes into string without risk of conversion error"""
+ if isinstance(cmd, str):
+ return cmd
+ else:
+ return str(cmd, errors='replace')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup/compare.py new/rdiff-backup-1.9.1b0/src/rdiff_backup/compare.py
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup/compare.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup/compare.py 2020-02-23 09:20:37.000000000 +0100
@@ -24,7 +24,7 @@
"""
import os
-from . import Globals, restore, rorpiter, log, backup, rpath, hash, robust
+from . import Globals, restore, rorpiter, log, backup, rpath, hash, robust, Hardlink
def Compare(src_rp, mirror_rp, inc_rp, compare_time):
@@ -84,7 +84,8 @@
for repo_rorp in repo_iter:
if not repo_rorp.isreg():
continue
- if not repo_rorp.has_sha1():
+ verify_sha1 = get_hash(repo_rorp)
+ if not verify_sha1:
log.Log(
"Warning: Cannot find SHA1 digest for file %s,\n"
"perhaps because this feature was added in v1.1.1" %
@@ -92,7 +93,7 @@
continue
fp = RepoSide.rf_cache.get_fp(base_index + repo_rorp.index, repo_rorp)
computed_hash = hash.compute_sha1_fp(fp)
- if computed_hash == repo_rorp.get_sha1():
+ if computed_hash == verify_sha1:
log.Log(
"Verified SHA1 digest of %s" % repo_rorp.get_safeindexpath(),
5)
@@ -103,13 +104,27 @@
"doesn't match recorded digest of\n %s\n"
"Your backup repository may be corrupted!" %
(repo_rorp.get_safeindexpath(), computed_hash,
- repo_rorp.get_sha1()), 2)
+ verify_sha1), 2)
RepoSide.close_rf_cache()
if not bad_files:
log.Log("Every file verified successfully.", 3)
return bad_files
+def get_hash(repo_rorp):
+ """ Try to get a sha1 digest from the repository. If hardlinks
+ are saved in the metadata, get the sha1 from the first hardlink """
+ Hardlink.add_rorp(repo_rorp)
+ if Hardlink.islinked(repo_rorp):
+ verify_sha1 = Hardlink.get_sha1(repo_rorp)
+ elif repo_rorp.has_sha1():
+ verify_sha1 = repo_rorp.get_sha1()
+ else:
+ verify_sha1 = None
+ Hardlink.del_rorp(repo_rorp)
+ return verify_sha1
+
+
def print_reports(report_iter):
"""Given an iter of CompareReport objects, print them to screen"""
assert not Globals.server
@@ -232,13 +247,14 @@
def hashes_changed(src_rp, mir_rorp):
"""Return 0 if their data hashes same, 1 otherwise"""
- if not mir_rorp.has_sha1():
+ verify_sha1 = get_hash(mir_rorp)
+ if not verify_sha1:
log.Log(
"Warning: Metadata file has no digest for %s, "
"unable to compare." % (mir_rorp.get_safeindexpath(), ), 2)
return 0
elif (src_rp.getsize() == mir_rorp.getsize()
- and hash.compute_sha1(src_rp) == mir_rorp.get_sha1()):
+ and hash.compute_sha1(src_rp) == verify_sha1):
return 0
return 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup/eas_acls.py new/rdiff-backup-1.9.1b0/src/rdiff_backup/eas_acls.py
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup/eas_acls.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup/eas_acls.py 2020-02-23 09:20:37.000000000 +0100
@@ -236,8 +236,16 @@
def join_ea_iter(rorp_iter, ea_iter):
"""Update a rorp iter by adding the information from ea_iter"""
+
+ def _safe_str(cmd):
+ """Transform bytes into string without risk of conversion error"""
+ if isinstance(cmd, str):
+ return cmd
+ else:
+ return str(cmd, errors='replace')
+
for rorp, ea in rorpiter.CollateIterators(rorp_iter, ea_iter):
- assert rorp, "Missing rorp for index %a" % (ea.index, )
+ assert rorp, "Missing rorp for index '%s'." % _safe_str(ea.index)
if not ea:
ea = ExtendedAttributes(rorp.index)
rorp.set_ea(ea)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup/longname.py new/rdiff-backup-1.9.1b0/src/rdiff_backup/longname.py
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup/longname.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup/longname.py 2020-02-23 09:20:37.000000000 +0100
@@ -106,7 +106,7 @@
free_name_counter = scan_next_free()
filename = b'%i' % free_name_counter
rp = get_long_rp(filename)
- assert not rp.lstat(), "Unexpected file at %a found" % (rp.path, )
+ assert not rp.lstat(), "Unexpected file at '%s' found" % rp.get_safepath()
free_name_counter += 1
write_next_free(free_name_counter)
return filename
@@ -267,11 +267,18 @@
def update_rf(rf, rorp, mirror_root):
"""Return new or updated restorefile based on alt name info in rorp"""
+ def _safe_str(cmd):
+ """Transform bytes into string without risk of conversion error"""
+ if isinstance(cmd, str):
+ return cmd
+ else:
+ return str(cmd, errors='replace')
+
def update_incs(rf, inc_base):
"""Swap inclist in rf with those with base inc_base and return"""
log.Log(
- "Restoring with increment base %a for file %s" %
- (inc_base, rorp.get_safeindexpath()), 6)
+ "Restoring with increment base %s for file %s" %
+ (_safe_str(inc_base), rorp.get_safeindexpath()), 6)
rf.inc_rp = get_long_rp(inc_base)
rf.inc_list = get_inclist(inc_base)
rf.set_relevant_incs()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup/restore.py new/rdiff-backup-1.9.1b0/src/rdiff_backup/restore.py
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup/restore.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup/restore.py 2020-02-23 09:20:37.000000000 +0100
@@ -28,7 +28,10 @@
def Restore(mirror_rp, inc_rpath, target, restore_to_time):
- """Recursively restore mirror and inc_rpath to target at rest_time"""
+ """Recursively restore mirror and inc_rpath to target at restore_to_time
+ in epoch format"""
+
+ # Store references to classes over the connection
MirrorS = mirror_rp.conn.restore.MirrorStruct
TargetS = target.conn.restore.TargetStruct
@@ -441,6 +444,11 @@
self.inc_rp, self.inc_list = inc_rp, inc_list
self.set_relevant_incs()
+ def __str__(self):
+ return "Index: %s, Mirror: %s, Increment: %s\nIncList: %s\nIncRel: %s" % (
+ self.index, self.mirror_rp, self.inc_rp,
+ list(map(str, self.inc_list)), list(map(str, self.relevant_incs)))
+
def relevant_incs_string(self):
"""Return printable string of relevant incs, used for debugging"""
inc_header = ["---- Relevant incs for %s" % ("/".join(self.index), )]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup/rpath.py new/rdiff-backup-1.9.1b0/src/rdiff_backup/rpath.py
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup/rpath.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup/rpath.py 2020-02-23 09:20:37.000000000 +0100
@@ -67,11 +67,32 @@
def copyfileobj(inputfp, outputfp):
"""Copies file inputfp to outputfp in blocksize intervals"""
blocksize = Globals.blocksize
+
+ sparse = False
+ """Negative seeks are not supported by GzipFile"""
+ compressed = False
+ if isinstance(outputfp, gzip.GzipFile):
+ compressed = True
+
while 1:
inbuf = inputfp.read(blocksize)
if not inbuf:
break
- outputfp.write(inbuf)
+
+ buflen = len(inbuf)
+ if not compressed and inbuf == b"\x00" * buflen:
+ outputfp.seek(buflen, os.SEEK_CUR)
+ # flag sparse=True, that we seek()ed, but have not written yet
+ # The filesize is wrong until we write
+ sparse = True
+ else:
+ outputfp.write(inbuf)
+ # We wrote, so clear sparse.
+ sparse = False
+
+ if sparse:
+ outputfp.seek(-1, os.SEEK_CUR)
+ outputfp.write(b"\x00")
def cmpfileobj(fp1, fp2):
@@ -145,7 +166,7 @@
elif rpin.issock():
rpout.mksock()
else:
- raise RPathException("File %a has unknown type" % rpin.path)
+ raise RPathException("File '%s' has unknown type." % rpin.get_safepath())
def copy_reg_file(rpin, rpout, compress=0):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup/selection.py new/rdiff-backup-1.9.1b0/src/rdiff_backup/selection.py
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup/selection.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup/selection.py 2020-02-23 09:20:37.000000000 +0100
@@ -709,11 +709,19 @@
def glob_get_prefix_res(self, glob_str):
"""Return list of regexps equivalent to prefixes of glob_str"""
+
+ def _safe_str(cmd):
+ """Transform bytes into string without risk of conversion error"""
+ if isinstance(cmd, str):
+ return cmd
+ else:
+ return str(cmd, errors='replace')
+
glob_parts = glob_str.split(b"/")
if b"" in glob_parts[1:
-1]: # "" OK if comes first or last, as in /foo/
raise GlobbingError(
- "Consecutive '/'s found in globbing string %a" % glob_str)
+ "Consecutive '/'s found in globbing string %s" % _safe_str(glob_str))
prefixes = [
b"/".join(glob_parts[:i + 1]) for i in range(len(glob_parts))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup/win_acls.py new/rdiff-backup-1.9.1b0/src/rdiff_backup/win_acls.py
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup/win_acls.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup/win_acls.py 2020-02-23 09:20:37.000000000 +0100
@@ -230,10 +230,18 @@
return os.fsdecode(self.__bytes__())
def from_string(self, acl_str):
+
+ def _safe_str(cmd):
+ """Transform bytes into string without risk of conversion error"""
+ if isinstance(cmd, str):
+ return cmd
+ else:
+ return str(cmd, errors='replace')
+
lines = acl_str.splitlines()
if len(lines) != 2 or not lines[0][:8] == b"# file: ":
raise metadata.ParsingError(
- "Bad record beginning: %a" % lines[0][:8])
+ "Bad record beginning: %s" % _safe_str(lines[0][:8]))
filename = lines[0][8:]
if filename == b'.':
self.index = ()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup.egg-info/PKG-INFO new/rdiff-backup-1.9.1b0/src/rdiff_backup.egg-info/PKG-INFO
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup.egg-info/PKG-INFO 2020-01-31 21:51:35.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup.egg-info/PKG-INFO 2020-02-23 09:20:42.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.2
Name: rdiff-backup
-Version: 1.9.0b0
+Version: 1.9.1b0
Summary: Backup and Restore utility, easy to use, efficient, locally and remotely usable
Home-page: https://rdiff-backup.net/
Author: The rdiff-backup project
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/src/rdiff_backup.egg-info/SOURCES.txt new/rdiff-backup-1.9.1b0/src/rdiff_backup.egg-info/SOURCES.txt
--- old/rdiff-backup-1.9.0b0/src/rdiff_backup.egg-info/SOURCES.txt 2020-01-31 21:51:35.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/src/rdiff_backup.egg-info/SOURCES.txt 2020-02-23 09:20:42.000000000 +0100
@@ -11,6 +11,7 @@
tox_dist.ini
tox_root.ini
tox_slow.ini
+debian/autobuild.sh
debian/changelog
debian/compat
debian/control
@@ -106,6 +107,7 @@
testing/timetest.py
testing/user_grouptest.py
tools/build_wheels.sh
+tools/get_changelog_since.sh
tools/rdiff-backup.spec.template
tools/rdiff-backup.spec.template-fedora
tools/setup-testfiles.sh
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/testing/commontest.py new/rdiff-backup-1.9.1b0/testing/commontest.py
--- old/rdiff-backup-1.9.0b0/testing/commontest.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/testing/commontest.py 2020-02-23 09:20:37.000000000 +0100
@@ -8,7 +8,7 @@
# Avoid circularities
from rdiff_backup.log import Log
from rdiff_backup import Globals, Hardlink, SetConnections, Main, \
- selection, rpath, eas_acls, rorpiter, Security
+ selection, rpath, eas_acls, rorpiter, Security, hash
RBBin = os.fsencode(shutil.which("rdiff-backup"))
@@ -286,15 +286,49 @@
return src_select.set_iter(), dest_select.set_iter()
- def preprocess(src_rorp, dest_rorp):
- """Initially process src and dest_rorp"""
- if compare_hardlinks and src_rorp:
- Hardlink.add_rorp(src_rorp, dest_rorp)
-
- def postprocess(src_rorp, dest_rorp):
- """After comparison, process src_rorp and dest_rorp"""
- if compare_hardlinks and src_rorp:
- Hardlink.del_rorp(src_rorp)
+ def hardlink_rorp_eq(src_rorp, dest_rorp):
+ Hardlink.add_rorp(dest_rorp)
+ Hardlink.add_rorp(src_rorp, dest_rorp)
+ rorp_eq = Hardlink.rorp_eq(src_rorp, dest_rorp)
+ if not src_rorp.isreg() or not dest_rorp.isreg() or src_rorp.getnumlinks() == dest_rorp.getnumlinks() == 1:
+ if not rorp_eq:
+ Log("Hardlink compare error with when no links exist exist", 3)
+ Log("%s: %s" % (src_rorp.index, Hardlink.get_inode_key(src_rorp)), 3)
+ Log("%s: %s" % (dest_rorp.index, Hardlink.get_inode_key(dest_rorp)), 3)
+ return 0
+ elif src_rorp.getnumlinks() > 1 and not Hardlink.islinked(src_rorp):
+ if rorp_eq:
+ Log("Hardlink compare error with first linked src_rorp and no dest_rorp sha1", 3)
+ Log("%s: %s" % (src_rorp.index, Hardlink.get_inode_key(src_rorp)), 3)
+ Log("%s: %s" % (dest_rorp.index, Hardlink.get_inode_key(dest_rorp)), 3)
+ return 0
+ hash.compute_sha1(dest_rorp)
+ rorp_eq = Hardlink.rorp_eq(src_rorp, dest_rorp)
+ if src_rorp.getnumlinks() != dest_rorp.getnumlinks():
+ if rorp_eq:
+ Log("Hardlink compare error with first linked src_rorp, with dest_rorp sha1, and with differing link counts", 3)
+ Log("%s: %s" % (src_rorp.index, Hardlink.get_inode_key(src_rorp)), 3)
+ Log("%s: %s" % (dest_rorp.index, Hardlink.get_inode_key(dest_rorp)), 3)
+ return 0
+ elif not rorp_eq:
+ Log("Hardlink compare error with first linked src_rorp, with dest_rorp sha1, and with equal link counts", 3)
+ Log("%s: %s" % (src_rorp.index, Hardlink.get_inode_key(src_rorp)), 3)
+ Log("%s: %s" % (dest_rorp.index, Hardlink.get_inode_key(dest_rorp)), 3)
+ return 0
+ elif src_rorp.getnumlinks() != dest_rorp.getnumlinks():
+ if rorp_eq:
+ Log("Hardlink compare error with non-first linked src_rorp and with differing link counts", 3)
+ Log("%s: %s" % (src_rorp.index, Hardlink.get_inode_key(src_rorp)), 3)
+ Log("%s: %s" % (dest_rorp.index, Hardlink.get_inode_key(dest_rorp)), 3)
+ return 0
+ elif not rorp_eq:
+ Log("Hardlink compare error with non-first linked src_rorp and with equal link counts", 3)
+ Log("%s: %s" % (src_rorp.index, Hardlink.get_inode_key(src_rorp)), 3)
+ Log("%s: %s" % (dest_rorp.index, Hardlink.get_inode_key(dest_rorp)), 3)
+ return 0
+ Hardlink.del_rorp(src_rorp)
+ Hardlink.del_rorp(dest_rorp)
+ return 1
def equality_func(src_rorp, dest_rorp):
"""Combined eq func returns true if two files compare same"""
@@ -307,10 +341,7 @@
if not src_rorp.equal_verbose(dest_rorp,
compare_ownership=compare_ownership):
return 0
- if compare_hardlinks and not Hardlink.rorp_eq(src_rorp, dest_rorp):
- Log("Hardlink compare failure", 3)
- Log("%s: %s" % (src_rorp.index, Hardlink.get_inode_key(src_rorp)), 3)
- Log("%s: %s" % (dest_rorp.index, Hardlink.get_inode_key(dest_rorp)), 3)
+ if compare_hardlinks and not hardlink_rorp_eq(src_rorp, dest_rorp):
return 0
if compare_eas and not eas_acls.ea_compare_rps(src_rorp, dest_rorp):
Log(
@@ -332,10 +363,8 @@
reset_hardlink_dicts()
src_iter, dest_iter = get_selection_functions()
for src_rorp, dest_rorp in rorpiter.Collate2Iters(src_iter, dest_iter):
- preprocess(src_rorp, dest_rorp)
if not equality_func(src_rorp, dest_rorp):
return 0
- postprocess(src_rorp, dest_rorp)
return 1
def rbdir_equal(src_rorp, dest_rorp):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/testing/hardlinktest.py new/rdiff-backup-1.9.1b0/testing/hardlinktest.py
--- old/rdiff-backup-1.9.0b0/testing/hardlinktest.py 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/testing/hardlinktest.py 2020-02-23 09:20:37.000000000 +0100
@@ -4,7 +4,7 @@
from commontest import abs_test_dir, abs_output_dir, old_test_dir, re_init_rpath_dir, \
CompareRecursive, BackupRestoreSeries, InternalBackup, InternalRestore, \
MakeOutputDir, reset_hardlink_dicts
-from rdiff_backup import Globals, Hardlink, selection, rpath
+from rdiff_backup import Globals, Hardlink, selection, rpath, restore, metadata
class HardlinkTest(unittest.TestCase):
@@ -21,6 +21,8 @@
hlinks_rp1copy = rpath.RPath(Globals.local_connection, hlinks_dir1copy)
hlinks_rp2 = rpath.RPath(Globals.local_connection, hlinks_dir2)
hlinks_rp3 = rpath.RPath(Globals.local_connection, hlinks_dir3)
+ hello_str = "Hello, world!"
+ hello_str_hash = "943a702d06f34599aee1f8da8ef9f7296031d699"
def testEquality(self):
"""Test rorp_eq function in conjunction with CompareRecursive"""
@@ -156,6 +158,212 @@
assert hlout2.getinode() == hlout3.getinode()
assert hlout1.getinode() != hlout2.getinode()
+ def extract_metadata(self, metadata_rp):
+ """Return lists of hashes and hardlink counts in the metadata_rp"""
+ hashes = []
+ link_counts = []
+ comp = metadata_rp.isinccompressed()
+ extractor = metadata.RorpExtractor(metadata_rp.open("r", comp))
+ for rorp in extractor.iterate():
+ link_counts.append(rorp.getnumlinks())
+ if rorp.has_sha1():
+ hashes.append(rorp.get_sha1())
+ else:
+ hashes.append(None)
+ return (hashes, link_counts)
+
+ def test_adding_hardlinks(self):
+ """Test the addition of a new hardlinked file.
+
+ This test is directed at some previously buggy code that 1) failed to
+ keep the correct number of hardlinks in the mirror metadata, and 2)
+ failed to restore hardlinked files so that they are linked the same as
+ when they were backed up. One of the conditions that triggered these
+ bugs included adding a new hardlinked file somewhere in the middle of a
+ list of previously linked files. The bug was originally reported here:
+ https://savannah.nongnu.org/bugs/?26848
+ """
+
+ # Setup initial backup
+ MakeOutputDir()
+ output = rpath.RPath(Globals.local_connection, abs_output_dir)
+ hlsrc_dir = os.path.join(abs_test_dir, b"src_hardlink")
+
+ hlsrc = rpath.RPath(Globals.local_connection, hlsrc_dir)
+ if hlsrc.lstat():
+ hlsrc.delete()
+ hlsrc.mkdir()
+ hlsrc_sub = hlsrc.append("subdir")
+ hlsrc_sub.mkdir()
+ hl_file1 = hlsrc_sub.append("hardlink1")
+ hl_file1.write_string(self.hello_str)
+ hl_file3 = hlsrc_sub.append("hardlink3")
+ hl_file3.hardlink(hl_file1.path)
+
+ InternalBackup(1, 1, hlsrc.path, output.path, 10000)
+ out_subdir = output.append("subdir")
+ assert out_subdir.append("hardlink1").getinode() == \
+ out_subdir.append("hardlink3").getinode()
+
+ # validate that hashes and link counts are correctly saved in metadata
+ meta_prefix = rpath.RPath(
+ Globals.local_connection,
+ os.path.join(abs_output_dir, b"rdiff-backup-data",
+ b"mirror_metadata"))
+ incs = restore.get_inclist(meta_prefix)
+ assert len(incs) == 1
+ metadata_rp = incs[0]
+ hashes, link_counts = self.extract_metadata(metadata_rp)
+ # hashes for ., ./subdir, ./subdir/hardlink1, ./subdir/hardlink3
+ expected_hashes = [None, None, self.hello_str_hash, None]
+ assert expected_hashes == hashes, (expected_hashes, hashes)
+ expected_link_counts = [1, 1, 2, 2]
+ assert expected_link_counts == link_counts, (expected_link_counts, link_counts)
+
+ # Create a new hardlinked file between "hardlink1" and "hardlink3" and perform another backup
+ hl_file2 = hlsrc_sub.append("hardlink2")
+ hl_file2.hardlink(hl_file1.path)
+
+ InternalBackup(1, 1, hlsrc.path, output.path, 20000)
+ assert out_subdir.append("hardlink1").getinode() == \
+ out_subdir.append("hardlink2").getinode()
+ assert out_subdir.append("hardlink1").getinode() == \
+ out_subdir.append("hardlink3").getinode()
+
+ # validate that hashes and link counts are correctly saved in metadata
+ incs = restore.get_inclist(meta_prefix)
+ assert len(incs) == 2
+ if incs[0].getinctype() == b'snapshot':
+ metadata_rp = incs[0]
+ else:
+ metadata_rp = incs[1]
+ hashes, link_counts = self.extract_metadata(metadata_rp)
+ # hashes for ., ./subdir/, ./subdir/hardlink1, ./subdir/hardlink2, ./subdir/hardlink3
+ expected_hashes = [None, None, self.hello_str_hash, None, None]
+ assert expected_hashes == hashes, (expected_hashes, hashes)
+ expected_link_counts = [1, 1, 3, 3, 3]
+ # The following assertion would fail as a result of bugs that are now fixed
+ assert expected_link_counts == link_counts, (expected_link_counts, link_counts)
+
+ # Now try restoring, still checking hard links.
+ sub_path = os.path.join(abs_output_dir, b"subdir")
+ restore_path = os.path.join(abs_test_dir, b"hl_restore")
+ restore_dir = rpath.RPath(Globals.local_connection, restore_path)
+ hlrestore_file1 = restore_dir.append("hardlink1")
+ hlrestore_file2 = restore_dir.append("hardlink2")
+ hlrestore_file3 = restore_dir.append("hardlink3")
+
+ if restore_dir.lstat():
+ restore_dir.delete()
+ InternalRestore(1, 1, sub_path, restore_path, 10000)
+ for rp in [hlrestore_file1, hlrestore_file3]:
+ rp.setdata()
+ assert hlrestore_file1.getinode() == hlrestore_file3.getinode()
+
+ if restore_dir.lstat():
+ restore_dir.delete()
+ InternalRestore(1, 1, sub_path, restore_path, 20000)
+ for rp in [hlrestore_file1, hlrestore_file2, hlrestore_file3]:
+ rp.setdata()
+ assert hlrestore_file1.getinode() == hlrestore_file2.getinode()
+ # The following assertion would fail as a result of bugs that are now fixed
+ assert hlrestore_file1.getinode() == hlrestore_file3.getinode()
+
+ def test_moving_hardlinks(self):
+ """Test moving the first hardlinked file in a series to later place in the series.
+
+ This test is directed at some previously buggy code that failed to
+ always keep a sha1 hash in the metadata for the first (and only the
+ first) file among a series of linked files. The condition that
+ triggered this bug involved removing the first file from a list of
+ linked files, while also adding a new file at some later position in
+ the list. The total number of hardlinked files in the list remains
+ unchanged. None of the files had a sha1 hash saved in its metadata.
+ The bug was originally reported here:
+ https://savannah.nongnu.org/bugs/?26848
+ """
+
+ # Setup initial backup
+ MakeOutputDir()
+ output = rpath.RPath(Globals.local_connection, abs_output_dir)
+ hlsrc_dir = os.path.join(abs_test_dir, b"src_hardlink")
+
+ hlsrc = rpath.RPath(Globals.local_connection, hlsrc_dir)
+ if hlsrc.lstat():
+ hlsrc.delete()
+ hlsrc.mkdir()
+ hlsrc_sub = hlsrc.append("subdir")
+ hlsrc_sub.mkdir()
+ hl_file1 = hlsrc_sub.append("hardlink1")
+ hl_file1.write_string(self.hello_str)
+ hl_file2 = hlsrc_sub.append("hardlink2")
+ hl_file2.hardlink(hl_file1.path)
+
+ InternalBackup(1, 1, hlsrc.path, output.path, 10000)
+ out_subdir = output.append("subdir")
+ assert out_subdir.append("hardlink1").getinode() == \
+ out_subdir.append("hardlink2").getinode()
+
+ # validate that hashes and link counts are correctly saved in metadata
+ meta_prefix = rpath.RPath(
+ Globals.local_connection,
+ os.path.join(abs_output_dir, b"rdiff-backup-data",
+ b"mirror_metadata"))
+ incs = restore.get_inclist(meta_prefix)
+ assert len(incs) == 1
+ metadata_rp = incs[0]
+ hashes, link_counts = self.extract_metadata(metadata_rp)
+ # hashes for ., ./subdir, ./subdir/hardlink1, ./subdir/hardlink3
+ expected_hashes = [None, None, self.hello_str_hash, None]
+ assert expected_hashes == hashes, (expected_hashes, hashes)
+ expected_link_counts = [1, 1, 2, 2]
+ assert expected_link_counts == link_counts, (expected_link_counts, link_counts)
+
+ # Move the first hardlinked file to be last
+ hl_file3 = hlsrc_sub.append("hardlink3")
+ rpath.rename(hl_file1, hl_file3)
+
+ InternalBackup(1, 1, hlsrc.path, output.path, 20000)
+ assert out_subdir.append("hardlink2").getinode() == \
+ out_subdir.append("hardlink3").getinode()
+
+ # validate that hashes and link counts are correctly saved in metadata
+ incs = restore.get_inclist(meta_prefix)
+ assert len(incs) == 2
+ if incs[0].getinctype() == b'snapshot':
+ metadata_rp = incs[0]
+ else:
+ metadata_rp = incs[1]
+ hashes, link_counts = self.extract_metadata(metadata_rp)
+ # hashes for ., ./subdir/, ./subdir/hardlink2, ./subdir/hardlink3
+ expected_hashes = [None, None, self.hello_str_hash, None]
+ # The following assertion would fail as a result of bugs that are now fixed
+ assert expected_hashes == hashes, (expected_hashes, hashes)
+ expected_link_counts = [1, 1, 2, 2]
+ assert expected_link_counts == link_counts, (expected_link_counts, link_counts)
+
+ # Now try restoring, still checking hard links.
+ sub_path = os.path.join(abs_output_dir, b"subdir")
+ restore_path = os.path.join(abs_test_dir, b"hl_restore")
+ restore_dir = rpath.RPath(Globals.local_connection, restore_path)
+ hlrestore_file1 = restore_dir.append("hardlink1")
+ hlrestore_file2 = restore_dir.append("hardlink2")
+ hlrestore_file3 = restore_dir.append("hardlink3")
+
+ if restore_dir.lstat():
+ restore_dir.delete()
+ InternalRestore(1, 1, sub_path, restore_path, 10000)
+ for rp in [hlrestore_file1, hlrestore_file2]:
+ rp.setdata()
+ assert hlrestore_file1.getinode() == hlrestore_file2.getinode()
+
+ if restore_dir.lstat():
+ restore_dir.delete()
+ InternalRestore(1, 1, sub_path, restore_path, 20000)
+ for rp in [hlrestore_file2, hlrestore_file3]:
+ rp.setdata()
+ assert hlrestore_file2.getinode() == hlrestore_file3.getinode()
+
if __name__ == "__main__":
unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/tools/get_changelog_since.sh new/rdiff-backup-1.9.1b0/tools/get_changelog_since.sh
--- old/rdiff-backup-1.9.0b0/tools/get_changelog_since.sh 1970-01-01 01:00:00.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/tools/get_changelog_since.sh 2020-02-23 09:20:37.000000000 +0100
@@ -0,0 +1,25 @@
+#!/bin/sh
+# get a list of changes and authors since a give revision tag in Git
+
+if [[ -z "${1}" ]]
+then
+ echo "Usage: $0 <Git-Tag>" >&2
+ echo " outputs changes marked with 'XYZ:' and a unique list of authors since the tagged release" >&2
+ exit 1
+fi
+RELTAG="${1}"
+
+echo "(make sure the version is the next correct one)"
+echo
+echo "New in v$($(dirname $0)/../setup.py --version) ($(date -I))"
+echo "----------------------------"
+
+echo -e "\n## Changes\n"
+git log ${RELTAG}.. |
+ sed -n '/^ *[A-Z][A-Z][A-Z]: / s/^ */* /p'
+
+echo -e "\n## Authors\n"
+git log ${RELTAG}.. |
+ awk -F': *| *<' '$1 == "Author" { print "* " $2 }' | sort -u
+
+echo
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rdiff-backup-1.9.0b0/tox.ini new/rdiff-backup-1.9.1b0/tox.ini
--- old/rdiff-backup-1.9.0b0/tox.ini 2020-01-31 21:51:30.000000000 +0100
+++ new/rdiff-backup-1.9.1b0/tox.ini 2020-02-23 09:20:37.000000000 +0100
@@ -58,7 +58,7 @@
deps =
flake8
commands =
- flake8 .
+ flake8 setup.py src testing tools
[flake8]
ignore =
1
0
Hello community,
here is the log from the commit of package wine for openSUSE:Factory checked in at 2020-02-29 21:24:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/wine (Old)
and /work/SRC/openSUSE:Factory/.wine.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "wine"
Sat Feb 29 21:24:51 2020 rev:300 rq:780477 version:5.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/wine/wine.changes 2020-02-18 10:38:31.676714664 +0100
+++ /work/SRC/openSUSE:Factory/.wine.new.26092/wine.changes 2020-02-29 21:25:07.406588805 +0100
@@ -1,0 +2,10 @@
+Sat Feb 29 08:30:58 UTC 2020 - Marcus Meissner <meissner(a)suse.com>
+
+- Updated to 5.3 development release
+ - More work towards Ucrtbase runtime support.
+ - Full support for Unicode normalization.
+ - Improvements in Shell Folders handling.
+ - Various bug fixes.
+- update staging to 5.3 release
+
+-------------------------------------------------------------------
Old:
----
wine-5.2.tar.xz
wine-5.2.tar.xz.sign
wine-staging-5.2.tar.xz
New:
----
wine-5.3.tar.xz
wine-5.3.tar.xz.sign
wine-staging-5.3.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ wine.spec ++++++
--- /var/tmp/diff_new_pack.YQdXOH/_old 2020-02-29 21:25:09.950593839 +0100
+++ /var/tmp/diff_new_pack.YQdXOH/_new 2020-02-29 21:25:09.954593847 +0100
@@ -29,8 +29,8 @@
%endif
# needs to be on top due to usage of %version macro below
-%define realver 5.2
-Version: 5.2
+%define realver 5.3
+Version: 5.3
Release: 0
%if "%{flavor}" != ""
@@ -157,7 +157,7 @@
ExclusiveArch: %{ix86} x86_64 ppc %arm aarch64
%if %{staging}
# upstream patch target version
-%define staging_version 5.2
+%define staging_version 5.3
Source100: wine-staging-%{staging_version}.tar.xz
BuildRequires: gtk3-devel
BuildRequires: libOSMesa-devel
++++++ _service ++++++
--- /var/tmp/diff_new_pack.YQdXOH/_old 2020-02-29 21:25:09.994593926 +0100
+++ /var/tmp/diff_new_pack.YQdXOH/_new 2020-02-29 21:25:09.994593926 +0100
@@ -3,7 +3,7 @@
<param name="versionformat">@PARENT_TAG@</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="url">https://github.com/wine-staging/wine-staging.git</param>
- <param name="revision">refs/tags/v5.2</param>
+ <param name="revision">refs/tags/v5.3</param>
<param name="match-tag">v*.*</param>
<param name="scm">git</param>
</service>
++++++ wine-5.2.tar.xz -> wine-5.3.tar.xz ++++++
/work/SRC/openSUSE:Factory/wine/wine-5.2.tar.xz /work/SRC/openSUSE:Factory/.wine.new.26092/wine-5.3.tar.xz differ: char 26, line 1
++++++ wine-staging-5.2.tar.xz -> wine-staging-5.3.tar.xz ++++++
/work/SRC/openSUSE:Factory/wine/wine-staging-5.2.tar.xz /work/SRC/openSUSE:Factory/.wine.new.26092/wine-staging-5.3.tar.xz differ: char 26, line 1
1
0
Hello community,
here is the log from the commit of package geany-plugins for openSUSE:Factory checked in at 2020-02-29 21:24:47
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/geany-plugins (Old)
and /work/SRC/openSUSE:Factory/.geany-plugins.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "geany-plugins"
Sat Feb 29 21:24:47 2020 rev:29 rq:780394 version:1.36
Changes:
--------
--- /work/SRC/openSUSE:Factory/geany-plugins/geany-plugins.changes 2020-02-06 13:09:12.188368069 +0100
+++ /work/SRC/openSUSE:Factory/.geany-plugins.new.26092/geany-plugins.changes 2020-02-29 21:25:04.514583081 +0100
@@ -1,0 +2,5 @@
+Fri Feb 21 15:41:39 CET 2020 - Matej Cepl <mcepl(a)suse.com>
+
+- Switch off building with PyGtk (as it is Python 2-based).
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ geany-plugins.spec ++++++
--- /var/tmp/diff_new_pack.u69dfk/_old 2020-02-29 21:25:05.234584506 +0100
+++ /var/tmp/diff_new_pack.u69dfk/_new 2020-02-29 21:25:05.234584506 +0100
@@ -43,7 +43,11 @@
BuildRequires: libwnck2-devel
BuildRequires: lua51-devel
BuildRequires: pkgconfig
-BuildRequires: python-gtk-devel
+BuildRequires: python-rpm-macros
+# We cannot use pygtk anymore, as it is Python 2-based.
+# Unless geany-plugins switches to PyGObject, we cannot have Gnome
+# plugins here.
+# BuildRequires: python-gtk-devel
BuildRequires: vala
BuildRequires: pkgconfig(enchant) >= 1.3
BuildRequires: pkgconfig(geany) >= 1.26
@@ -79,10 +83,6 @@
%make_install
install -d -m755 %{buildroot}%{python_sitearch}
-pushd %{buildroot}%{python_sitearch}
-%py_compile .
-popd
-
find %{buildroot} -type f -name "*.la" -delete -print
find %{buildroot} -size 0 -delete
%fdupes %{buildroot}%{_docdir}/%{name}
1
0
Hello community,
here is the log from the commit of package openfortivpn for openSUSE:Factory checked in at 2020-02-29 21:24:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/openfortivpn (Old)
and /work/SRC/openSUSE:Factory/.openfortivpn.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openfortivpn"
Sat Feb 29 21:24:45 2020 rev:8 rq:780376 version:1.12.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/openfortivpn/openfortivpn.changes 2019-12-03 12:43:05.346121004 +0100
+++ /work/SRC/openSUSE:Factory/.openfortivpn.new.26092/openfortivpn.changes 2020-02-29 21:25:01.666577445 +0100
@@ -1,0 +2,19 @@
+Thu Feb 27 15:14:15 UTC 2020 - Martin Hauke <mardnh(a)gmx.de>
+
+- Update to version 1.12.0
+ * fix CVE-2020-7043: TLS Certificate CommonName NULL Byte
+ Vulnerability
+ * fix CVE-2020-7042: use of uninitialized memory in
+ X509_check_host
+ * fix CVE-2020-7041: incorrect use of X509_check_host
+ (regarding return value).
+ * always hide cleartest password in -vv output
+ * add a clear warning about sensitive information in the debug
+ output
+ * add a hint in debug output when password is read from config
+ file
+ * fix segfault when connecting with empty password
+ * use resolvconf if available to update resolv.conf file
+ * replace semicolon by space in dns-suffix string
+
+-------------------------------------------------------------------
Old:
----
openfortivpn-1.11.0.tar.gz
New:
----
openfortivpn-1.12.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ openfortivpn.spec ++++++
--- /var/tmp/diff_new_pack.F08wRw/_old 2020-02-29 21:25:02.666579424 +0100
+++ /var/tmp/diff_new_pack.F08wRw/_new 2020-02-29 21:25:02.670579432 +0100
@@ -1,7 +1,7 @@
#
# spec file for package openfortivpn
#
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: openfortivpn
-Version: 1.11.0
+Version: 1.12.0
Release: 0
Summary: Client for PPP+SSL VPN tunnel services
License: GPL-3.0-or-later
++++++ openfortivpn-1.11.0.tar.gz -> openfortivpn-1.12.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/.github/SECURITY.md new/openfortivpn-1.12.0/.github/SECURITY.md
--- old/openfortivpn-1.11.0/.github/SECURITY.md 1970-01-01 01:00:00.000000000 +0100
+++ new/openfortivpn-1.12.0/.github/SECURITY.md 2020-02-26 17:02:52.000000000 +0100
@@ -0,0 +1,14 @@
+# Security Policy
+
+## Supported Versions
+
+Use this section to tell people about which versions of your project are
+currently being supported with security updates.
+
+| Version | Supported |
+| ----------------------- | ------------------ |
+| latest stable release | :white_check_mark: |
+
+## Reporting a Vulnerability
+
+Send an email to security(a)openfortivpn.org.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/CHANGELOG.md new/openfortivpn-1.12.0/CHANGELOG.md
--- old/openfortivpn-1.11.0/CHANGELOG.md 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/CHANGELOG.md 2020-02-26 17:02:52.000000000 +0100
@@ -14,6 +14,18 @@
This high level changelog is usually updated when a release is tagged.
On the master branch there may be changes that are not (yet) described here.
+### 1.12.0
+
+* [-] fix CVE-2020-7043: TLS Certificate CommonName NULL Byte Vulnerability
+* [-] fix CVE-2020-7042: use of uninitialized memory in X509_check_host
+* [-] fix CVE-2020-7041: incorrect use of X509_check_host (regarding return value).
+* [-] always hide cleartest password in -vv output
+* [+] add a clear warning about sensitive information in the debug output
+* [+] add a hint in debug output when password is read from config file
+* [-] fix segfault when connecting with empty password
+* [+] use resolvconf if available to update resolv.conf file
+* [~] replace semicolon by space in dns-suffix string
+
### 1.11.0
* [+] allow to connect with empty password (and with smartcard instead of username)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/Makefile.am new/openfortivpn-1.12.0/Makefile.am
--- old/openfortivpn-1.11.0/Makefile.am 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/Makefile.am 2020-02-26 17:02:52.000000000 +0100
@@ -5,11 +5,14 @@
src/http.c src/http.h src/io.c src/io.h src/ipv4.c \
src/ipv4.h src/log.c src/log.h src/tunnel.c \
src/tunnel.h src/main.c src/ssl.h src/xml.c \
- src/xml.h src/userinput.c src/userinput.h
+ src/xml.h src/userinput.c src/userinput.h \
+ src/openssl_hostname_validation.c \
+ src/openssl_hostname_validation.h
openfortivpn_CFLAGS = -Wall -pedantic -std=gnu99
openfortivpn_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\" \
-DPPP_PATH=\"@PPP_PATH@\" \
- -DNETSTAT_PATH=\"@NETSTAT_PATH@\"
+ -DNETSTAT_PATH=\"@NETSTAT_PATH@\" \
+ -DRESOLVCONF_PATH=\"@RESOLVCONF_PATH@\"
openfortivpn_CPPFLAGS += $(OPENSSL_CFLAGS) $(LIBSYSTEMD_CFLAGS)
openfortivpn_LDADD = $(OPENSSL_LIBS) $(LIBSYSTEMD_LIBS)
@@ -26,7 +29,8 @@
mkdir -p $(DESTDIR)$(sysconfdir)/openfortivpn ; \
cp -a $(DESTDIR)$(datadir)/config.template \
$(DESTDIR)$(sysconfdir)/openfortivpn/config ; \
- fi
+ sed -i 's/^/# /' $(DESTDIR)$(sysconfdir)/openfortivpn/config ; \
+ fi
dist_man_MANS = doc/openfortivpn.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/README.md new/openfortivpn-1.12.0/README.md
--- old/openfortivpn-1.11.0/README.md 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/README.md 2020-02-26 17:02:52.000000000 +0100
@@ -86,10 +86,10 @@
* [openSUSE / SLE](https://software.opensuse.org/package/openfortivpn)
* [Gentoo](https://packages.gentoo.org/packages/net-vpn/openfortivpn)
* [NixOS](https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/networking/o…
-* [Arch Linux](https://aur.archlinux.org/packages/openfortivpn)
+* [Arch Linux](https://www.archlinux.org/packages/community/x86_64/openfortivpn)
* [Debian (testing)](https://packages.debian.org/buster/openfortivpn)
* [Ubuntu (bionic and later)](https://packages.ubuntu.com/search?keywords=openfortivpn) and [pre-bionic (ppa)](https://launchpad.net/~ar-lex/+archive/ubuntu/fortisslvpn)
-* [Solus](https://packages.solus-project.com/unstable/o/openfortivpn/)
+* [Solus](https://dev.getsol.us/source/openfortivpn/)
On macOS both [Homebrew](http://brewformulas.org/Openfortivpn) and
[MacPorts](https://www.macports.org/ports.php?by=name&substr=openfortivpn)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/configure.ac new/openfortivpn-1.12.0/configure.ac
--- old/openfortivpn-1.11.0/configure.ac 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/configure.ac 2020-02-26 17:02:52.000000000 +0100
@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.63])
-AC_INIT([openfortivpn], [1.11.0])
+AC_INIT([openfortivpn], [1.12.0])
AC_CONFIG_SRCDIR([src/main.c])
AM_INIT_AUTOMAKE([foreign subdir-objects])
@@ -226,20 +226,19 @@
])
)
AS_IF([test "x$with_rt_dst" = "x" ], [
-AC_MSG_CHECKING(whether rtentry is available and has rt_dst )
-AC_TRY_RUN([
+AC_MSG_CHECKING(whether rtentry is available and has rt_dst)
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
#include <sys/types.h>
#include <sys/socket.h>
#include <net/route.h>
static inline struct sockaddr_in *cast_addr(struct sockaddr *addr)
{
- return (struct sockaddr_in *) addr;
+ return (struct sockaddr_in *) addr;
}
+],[
struct rtentry route;
-int main() {
- cast_addr(&(&route)->rt_dst)->sin_family = AF_INET;
- return (cast_addr(&(&route)->rt_dst)->sin_family == AF_INET) ? 0 : 1; }
-], [
+cast_addr(&(&route)->rt_dst)->sin_family = AF_INET;
+])],[
AC_DEFINE(HAVE_RT_ENTRY_WITH_RT_DST)
AC_MSG_RESULT(yes)
], AC_MSG_RESULT(no) )
@@ -247,6 +246,7 @@
NETSTAT_PATH=""
PPP_PATH=""
+RESOLVCONF_PATH=""
# prepare possibility to override default locations
AC_ARG_WITH([netstat],
@@ -274,6 +274,12 @@
with_pppd="no"
])
)
+# resolvconf if present
+AC_ARG_WITH([resolvconf],
+ AS_HELP_STRING([--with-resolvconf],
+ [Set the path to the resolvconf executable]),
+ RESOLVCONF_PATH="$withval"
+)
# override for /proc/net/route detection
AC_ARG_ENABLE([proc],
@@ -350,6 +356,8 @@
with_ppp="no"
])
+AC_PATH_PROG(RESOLVCONF_PATH, [resolvconf], [/sbin/resolvconf], "$PATH:/sbin:/usr/sbin")
+
AS_IF([test "x$with_ppp" = "xyes"], [
AC_DEFINE(HAVE_USR_SBIN_PPP, 1)
AC_MSG_NOTICE([HAVE_USR_SBIN_PPP... 1])
@@ -380,5 +388,10 @@
AC_MSG_NOTICE([NETSTAT_PATH...] $NETSTAT_PATH)
])
+AC_SUBST(RESOLVCONF_PATH)
+AS_IF([test "x$RESOLVCONF_PATH" != "x" ], [
+ AC_MSG_NOTICE([RESOLVCONF_PATH...] $RESOLVCONF_PATH)
+])
+
AC_CONFIG_COMMANDS([timestamp], [touch src/.dirstamp])
AC_OUTPUT(Makefile)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/doc/openfortivpn.1.in new/openfortivpn-1.12.0/doc/openfortivpn.1.in
--- old/openfortivpn-1.11.0/doc/openfortivpn.1.in 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/doc/openfortivpn.1.in 2020-02-26 17:02:52.000000000 +0100
@@ -1,4 +1,4 @@
-.TH OPENFORTIVPN 1 "November 27, 2019" ""
+.TH OPENFORTIVPN 1 "December 11, 2019" ""
.SH NAME
openfortivpn \- Client for PPP+SSL VPN tunnel services
@@ -92,13 +92,14 @@
.TP
\fB\-\-set\-dns=\fI<bool>\fR, \fB\-\-no\-dns\fR
Set if openfortivpn should add DNS name servers in /etc/resolv.conf when
-tunnel is up. If used multiple times, the last one takes priority.
+tunnel is up. Also a dns\-suffix may be received from the peer and added
+to /etc/resolv.conf in the turn of adding the name servers.
+resolvconf is instructed to do the update of the resolv.conf file
+if it is installed, otherwise openfortivpn prepends its changes
+to the existing content of the resolv.conf file.
Note that there may be other mechanisms to update /etc/resolv.conf,
e.g., \fB\-\-pppd\-use\-peerdns\fR in conjunction with an ip-up-script,
which may require that openfortivpn is called with \fB\-\-no\-dns\fR.
-Also a dns\-suffix may be received from the peer and added to
-/etc/resolv.conf in the turn of adding the name servers.
-
\fB\-\-no\-dns\fR is the same as \fB\-\-set\-dns=\fI0\fR.
.TP
\fB\-\-ca\-file=\fI<file>\fR
@@ -131,8 +132,8 @@
\fB\-\-trusted\-cert=\fI<digest>\fR
Trust a given gateway. If classical SSL certificate validation fails, the
gateway certificate will be matched against this value. \fI<digest>\fR is the
-X509 certificate's sha256 sum. This option can be used multiple times to trust
-several certificates.
+X509 certificate's sha256 sum. The certificate has to be encoded in DER form.
+This option can be used multiple times to trust several certificates.
.TP
\fB\-\-insecure\-ssl\fR
Do not disable insecure SSL protocols/ciphers.
@@ -150,7 +151,8 @@
.TP
\fB\-\-use\-peer\-dns=\fI<bool>\fR, \fB\-\-pppd\-no\-peerdns\fR
Whether to ask peer ppp server for DNS server addresses and let pppd
-rewrite /etc/resolv.conf. If the DNS server addresses are requested,
+rewrite /etc/resolv.conf. There is no mechanism to tell the dns\-suffix
+to pppd. If the DNS server addresses are requested,
also \fB\-\-set\-dns=\fI1\fR may race with the mechanisms in pppd.
\fB\-\-pppd\-no\-peerdns\fR is the same as \fB\-\-pppd\-use\-peerdns=\fI0\fR.
@@ -264,13 +266,17 @@
.br
# otp\-prompt = Please
.br
+# pinentry = pinentry program
+.br
user\-cert = @SYSCONFDIR@/openfortivpn/user\-cert.pem
.br
+# user\-cert = pkcs1: # use smartcard as client certificate
+.br
user\-key = @SYSCONFDIR@/openfortivpn/user\-key.pem
.br
# the sha256 digest of the trusted host certs obtained by
.br
-# openssl dgst -sha256 server\-cert.pem:
+# openssl dgst -sha256 server\-cert.crt:
.br
trusted\-cert = certificatedigest4daa8c5fe6c...
.br
@@ -315,3 +321,5 @@
cipher\-list = HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4
.br
persistent = 0
+.br
+seclevel-1 = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/etc/openfortivpn/config.template new/openfortivpn-1.12.0/etc/openfortivpn/config.template
--- old/openfortivpn-1.11.0/etc/openfortivpn/config.template 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/etc/openfortivpn/config.template 2020-02-26 17:02:52.000000000 +0100
@@ -1,5 +1,6 @@
-# config file for openfortivpn, see man openfortivpn(1)
-host =
-port =
-username =
-password =
+### config file for openfortivpn, see man openfortivpn(1) ###
+
+host = vpn.example.org
+port = 443
+username = vpnuser
+password = VPNpassw0rd
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/src/config.c new/openfortivpn-1.12.0/src/config.c
--- old/openfortivpn-1.11.0/src/config.c 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/src/config.c 2020-02-26 17:02:52.000000000 +0100
@@ -108,7 +108,7 @@
else if (isdigit(str[0]) == 0)
return -1;
- long int i = strtol(str, NULL, 0);
+ long i = strtol(str, NULL, 0);
if (i < 0 || i > 1)
return -1;
return i;
@@ -122,9 +122,8 @@
*/
int parse_min_tls(const char *str)
{
- if (str[0] != '1' || str[1] != '.' || str[2] == 0 || str[3] != 0) {
+ if (str[0] != '1' || str[1] != '.' || str[2] == 0 || str[3] != 0)
return -1;
- }
switch (str[2]) {
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
case '0':
@@ -230,8 +229,8 @@
strncpy(cfg->gateway_host, val, FIELD_SIZE);
cfg->gateway_host[FIELD_SIZE] = '\0';
} else if (strcmp(key, "port") == 0) {
- unsigned long int port = strtoul(val, NULL, 0);
- if (port <= 0 || port > 65535) {
+ unsigned long port = strtoul(val, NULL, 0);
+ if (port == 0 || port > 65535) {
log_warn("Bad port in config file: \"%lu\".\n",
port);
continue;
@@ -249,7 +248,7 @@
free(cfg->otp_prompt);
cfg->otp_prompt = strdup(val);
} else if (strcmp(key, "otp-delay") == 0) {
- long int otp_delay = strtol(val, NULL, 0);
+ long otp_delay = strtol(val, NULL, 0);
if (otp_delay < 0 || otp_delay > UINT_MAX) {
log_warn("Bad value for otp-delay in config file: \"%s\".\n",
val);
@@ -287,7 +286,7 @@
}
cfg->half_internet_routes = half_internet_routes;
} else if (strcmp(key, "persistent") == 0) {
- unsigned long int persistent = strtoul(val, NULL, 0);
+ unsigned long persistent = strtoul(val, NULL, 0);
if (persistent > UINT_MAX) {
log_warn("Bad value for persistent in config file: \"%s\".\n",
val);
@@ -508,9 +507,8 @@
free(dst->cipher_list);
dst->cipher_list = src->cipher_list;
}
- if (src->min_tls > 0) {
+ if (src->min_tls > 0)
dst->min_tls = src->min_tls;
- }
if (src->seclevel_1 != invalid_cfg.seclevel_1)
dst->seclevel_1 = src->seclevel_1;
if (src->cert_whitelist) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/src/http.c new/openfortivpn-1.12.0/src/http.c
--- old/openfortivpn-1.11.0/src/http.c 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/src/http.c 2020-02-26 17:02:52.000000000 +0100
@@ -76,16 +76,20 @@
va_start(args, request);
length = vsnprintf(buffer, BUFSZ, request, args);
va_end(args);
- strcpy(logbuffer,buffer);
- if (loglevel <= OFV_LOG_DEBUG_DETAILS && tunnel->config->password[0]!='\0') {
- char* pwstart;
- pwstart = strstr(logbuffer, tunnel->config->password);
+ strcpy(logbuffer, buffer);
+ if (loglevel <= OFV_LOG_DEBUG_DETAILS && tunnel->config->password[0] != '\0') {
+ char *pwstart;
+ char password[3 * FIELD_SIZE + 1];
+
+ url_encode(password, tunnel->config->password);
+ pwstart = strstr(logbuffer, password);
+
if (pwstart != NULL) {
int pos, pwlen, i;
pos = pwstart - logbuffer;
pwlen = strlen(tunnel->config->password);
- for (i=pos; i<pos+pwlen; i++)
- logbuffer[i]='*';
+ for (i = pos; i < pos + pwlen; i++)
+ logbuffer[i] = '*';
}
}
@@ -94,7 +98,7 @@
else if (length >= BUFSZ)
return ERR_HTTP_TOO_LONG;
- log_debug_details("%s: \n%s\n", __func__, logbuffer);
+ log_debug_details("%s:\n%s\n", __func__, logbuffer);
while (n == 0)
n = safe_ssl_write(tunnel->ssl_handle, (uint8_t *) buffer,
@@ -162,7 +166,7 @@
(uint8_t *) buffer + bytes_read,
BUFSZ - 1 - bytes_read);
if (n > 0) {
- log_debug_details("%s: \n%s\n", __func__, buffer);
+ log_debug_details("%s:\n%s\n", __func__, buffer);
const char *eoh;
bytes_read += n;
@@ -287,15 +291,13 @@
uint32_t *response_size
)
{
- int ret = do_http_request(
- tunnel, method, uri, data, response, response_size);
+ int ret = do_http_request(tunnel, method, uri, data,
+ response, response_size);
if (ret == ERR_HTTP_SSL) {
ssl_connect(tunnel);
- ret = do_http_request(
- tunnel, method, uri, data, response,
- response_size
- );
+ ret = do_http_request(tunnel, method, uri, data,
+ response, response_size);
}
if (ret != 1)
@@ -573,19 +575,20 @@
tunnel->cookie[0] = '\0';
- if (tunnel->config->use_engine) {
+ if (tunnel->config->use_engine
+ || (username[0] == '\0' && tunnel->config->password[0] == '\0')) {
snprintf(data, sizeof(data), "cert=&nup=1");
ret = http_request(tunnel, "GET", "/remote/login",
data, &res, &response_size);
} else {
- if (tunnel->config->password == '\0') {
- snprintf(data, sizeof(data), "username=%s&realm=%s&ajax=1"
- "&redir=%%2Fremote%%2Findex&just_logged_in=1",
+ if (tunnel->config->password[0] == '\0') {
+ snprintf(data, sizeof(data),
+ "username=%s&realm=%s&ajax=1&redir=%%2Fremote%%2Findex&just_logged_in=1",
username, realm);
} else {
url_encode(password, tunnel->config->password);
- snprintf(data, sizeof(data), "username=%s&credential=%s&realm=%s&ajax=1"
- "&redir=%%2Fremote%%2Findex&just_logged_in=1",
+ snprintf(data, sizeof(data),
+ "username=%s&credential=%s&realm=%s&ajax=1&redir=%%2Fremote%%2Findex&just_logged_in=1",
username, password, realm);
}
ret = http_request(tunnel, "POST", "/remote/logincheck",
@@ -650,9 +653,8 @@
}
url_encode(tokenresponse, cfg->otp);
- snprintf(data, sizeof(data), "username=%s&realm=%s&reqid=%s"
- "&polid=%s&grp=%s&code=%s&code2="
- "&redir=%%2Fremote%%2Findex&just_logged_in=1",
+ snprintf(data, sizeof(data),
+ "username=%s&realm=%s&reqid=%s&polid=%s&grp=%s&code=%s&code2=&redir=%%2Fremote%%2Findex&just_logged_in=1",
username, realm, reqid, polid, group, tokenresponse);
delay_otp(tunnel);
@@ -722,7 +724,7 @@
if (xml_find(' ', "domain=", val, 1)) {
tunnel->ipv4.dns_suffix
= xml_get(xml_find(' ', "domain=", val, 1));
- log_debug("found dns suffix %s in xml config",
+ log_debug("found dns suffix %s in xml config\n",
tunnel->ipv4.dns_suffix);
break;
}
@@ -733,7 +735,7 @@
while ((val = xml_find('<', "dns", val, 2))) {
if (xml_find(' ', "ip=", val, 1)) {
dns_server = xml_get(xml_find(' ', "ip=", val, 1));
- log_debug("found dns server %s in xml config", dns_server);
+ log_debug("found dns server %s in xml config\n", dns_server);
if (!tunnel->ipv4.ns1_addr.s_addr)
tunnel->ipv4.ns1_addr.s_addr = inet_addr(dns_server);
else if (!tunnel->ipv4.ns2_addr.s_addr)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/src/io.c new/openfortivpn-1.12.0/src/io.c
--- old/openfortivpn-1.11.0/src/io.c 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/src/io.c 2020-02-26 17:02:52.000000000 +0100
@@ -360,16 +360,16 @@
&& pkt_data(packet)[6] == 0x03)
#define packet_is_end_negociation(packet) \
- ((packet)->len == 6 \
- && pkt_data(packet)[0] == 0x80 \
- && pkt_data(packet)[1] == 0x21 \
- && pkt_data(packet)[2] == 0x01 \
- && pkt_data(packet)[4] == 0x00 \
- && pkt_data(packet)[5] == 0x04) || \
- ((packet)-> len >= 12 \
- && pkt_data(packet)[0] == 0x80 \
- && pkt_data(packet)[1] == 0x21 \
- && pkt_data(packet)[2] == 0x02)
+ (((packet)->len == 6 \
+ && pkt_data(packet)[0] == 0x80 \
+ && pkt_data(packet)[1] == 0x21 \
+ && pkt_data(packet)[2] == 0x01 \
+ && pkt_data(packet)[4] == 0x00 \
+ && pkt_data(packet)[5] == 0x04) || \
+ ((packet)->len >= 12 \
+ && pkt_data(packet)[0] == 0x80 \
+ && pkt_data(packet)[1] == 0x21 \
+ && pkt_data(packet)[2] == 0x02))
static inline void set_tunnel_ips(struct tunnel *tunnel,
struct ppp_packet *packet)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/src/ipv4.c new/openfortivpn-1.12.0/src/ipv4.c
--- old/openfortivpn-1.11.0/src/ipv4.c 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/src/ipv4.c 2020-02-26 17:02:52.000000000 +0100
@@ -196,7 +196,7 @@
}
#else
- FILE *fp;
+ FILE * fp;
uint32_t total_bytes_read = 0;
char *saveptr3 = NULL;
@@ -317,7 +317,7 @@
#ifdef RTF_STATIC // Manually added
flag_table['S'] = RTF_STATIC & USHRT_MAX;
#endif
-#ifdef RTF_UP // Route usable
+#ifdef RTF_UP // Route usable
flag_table['U'] = RTF_UP & USHRT_MAX;
#endif
#ifdef RTF_WASCLONED // Route was generated as a result of cloning
@@ -576,7 +576,7 @@
if (err)
return err;
- if (rtfound==0) {
+ if (rtfound == 0) {
// should not occur anymore unless there is no default route
log_debug("Route not found.\n");
// at least restore input values
@@ -741,7 +741,7 @@
log_debug("ip route show %s\n", ipv4_show_route(gtw_rt));
ipv4_del_route(gtw_rt);
}
- sprintf(route_iface(gtw_rt),"!%s",tunnel->ppp_iface);
+ sprintf(route_iface(gtw_rt), "!%s", tunnel->ppp_iface);
ret = ipv4_get_route(gtw_rt);
if (ret != 0) {
log_warn("Could not get route to gateway (%s).\n",
@@ -779,8 +779,8 @@
const char *mask, const char *gw)
{
size_t l0, l1;
- const char fmt[] = ",%s/%s/%s";
- const char trigger[] = "openfortivpn";
+ static const char fmt[] = ",%s/%s/%s";
+ static const char trigger[] = "openfortivpn";
char **target = &tunnel->config->pppd_ipparam;
char *ptr;
@@ -791,7 +791,8 @@
log_info("Registering route %s/%s via %s\n", dest, mask, gw);
l0 = strlen(*target);
l1 = strlen(fmt) + strlen(dest) + strlen(mask) + strlen(gw) + 1;
- if ((ptr = realloc(*target, l0 + l1))) {
+ ptr = realloc(*target, l0 + l1);
+ if (ptr) {
*target = ptr;
snprintf(*target + l0, l1, fmt, dest, mask, gw);
} else {
@@ -1006,6 +1007,16 @@
return 0;
}
+static inline char *replace_char(char *str, char find, char replace)
+{
+ int i;
+
+ for (i = 0; i < strlen(str); i++)
+ if (str[i] == find)
+ str[i] = replace;
+ return str;
+}
+
int ipv4_add_nameservers_to_resolv_conf(struct tunnel *tunnel)
{
int ret = -1;
@@ -1013,7 +1024,8 @@
struct stat stat;
char ns1[28], ns2[28]; // 11 + 15 + 1 + 1
char dns_suffix[MAX_DOMAIN_LENGTH+8]; // 7 + MAX_DOMAIN_LENGTH + 1
- char *buffer;
+ char *buffer = NULL;
+ int use_resolvconf = 0;
tunnel->ipv4.ns1_was_there = 0;
tunnel->ipv4.ns2_was_there = 0;
@@ -1025,40 +1037,68 @@
if (tunnel->ipv4.ns2_addr.s_addr == 0)
tunnel->ipv4.ns2_was_there = -1;
- file = fopen("/etc/resolv.conf", "r+");
- if (file == NULL) {
- log_warn("Could not open /etc/resolv.conf (%s).\n",
- strerror(errno));
- return 1;
- }
+ if (access(RESOLVCONF_PATH, F_OK) == 0) {
+ int resolvconf_call_len
+ = strlen(RESOLVCONF_PATH)
+ + 20
+ + strlen(tunnel->ppp_iface);
+ char *resolvconf_call = malloc(resolvconf_call_len);
+ if (resolvconf_call == NULL) {
+ log_warn("Could not create command to run resolvconf (%s).\n",
+ strerror(errno));
+ return 1;
+ }
- if (fstat(fileno(file), &stat) == -1) {
- log_warn("Could not stat /etc/resolv.conf (%s).\n",
- strerror(errno));
- goto err_close;
- }
+ snprintf(resolvconf_call, resolvconf_call_len,
+ "%s -a \"%s.openfortivpn\"",
+ RESOLVCONF_PATH,
+ tunnel->ppp_iface);
+
+ use_resolvconf = 1;
+ log_debug("resolvconf_call: %s\n", resolvconf_call);
+ file = popen(resolvconf_call, "w");
+ free(resolvconf_call);
+ if (file == NULL) {
+ log_warn("Could not open pipe %s (%s).\n",
+ resolvconf_call,
+ strerror(errno));
+ return 1;
+ }
+ } else {
+ file = fopen("/etc/resolv.conf", "r+");
+ if (file == NULL) {
+ log_warn("Could not open /etc/resolv.conf (%s).\n",
+ strerror(errno));
+ return 1;
+ }
- if (stat.st_size == 0) {
- log_warn("Could not read /etc/resolv.conf (%s).\n",
- "Empty file");
- goto err_close;
- }
+ if (fstat(fileno(file), &stat) == -1) {
+ log_warn("Could not stat /etc/resolv.conf (%s).\n",
+ strerror(errno));
+ goto err_close;
+ }
- buffer = malloc(stat.st_size + 1);
- if (buffer == NULL) {
- log_warn("Could not read /etc/resolv.conf (%s).\n",
- strerror(errno));
- goto err_close;
- }
+ if (stat.st_size == 0) {
+ log_warn("Could not read /etc/resolv.conf (%s).\n",
+ "Empty file");
+ goto err_close;
+ }
- // Copy all file contents at once
- if (fread(buffer, stat.st_size, 1, file) != 1) {
- log_warn("Could not read /etc/resolv.conf.\n");
- goto err_free;
- }
+ buffer = malloc(stat.st_size + 1);
+ if (buffer == NULL) {
+ log_warn("Could not read /etc/resolv.conf (%s).\n",
+ strerror(errno));
+ goto err_close;
+ }
- buffer[stat.st_size] = '\0';
+ // Copy all file contents at once
+ if (fread(buffer, stat.st_size, 1, file) != 1) {
+ log_warn("Could not read /etc/resolv.conf.\n");
+ goto err_free;
+ }
+ buffer[stat.st_size] = '\0';
+ }
if (tunnel->ipv4.ns1_addr.s_addr != 0) {
strcpy(ns1, "nameserver ");
strncat(ns1, inet_ntoa(tunnel->ipv4.ns1_addr), 15);
@@ -1076,59 +1116,63 @@
if (tunnel->ipv4.dns_suffix != NULL) {
strcpy(dns_suffix, "search ");
strncat(dns_suffix, tunnel->ipv4.dns_suffix, MAX_DOMAIN_LENGTH);
+ replace_char(dns_suffix, ';', ' ');
} else {
dns_suffix[0] = '\0';
}
- for (const char *line = strtok(buffer, "\n");
- line != NULL;
- line = strtok(NULL, "\n")) {
- if (strcmp(line, ns1) == 0) {
- tunnel->ipv4.ns1_was_there = 1;
- log_debug("ns1 already present in /etc/resolv.conf.\n");
- }
- }
-
- if (tunnel->ipv4.ns1_was_there == 0)
- log_debug("Adding \"%s\", to /etc/resolv.conf.\n", ns1);
-
- for (const char *line = strtok(buffer, "\n");
- line != NULL;
- line = strtok(NULL, "\n")) {
- if (strcmp(line, ns2) == 0) {
- tunnel->ipv4.ns2_was_there = 1;
- log_debug("ns2 already present in /etc/resolv.conf.\n");
+ if (use_resolvconf == 0) {
+ for (const char *line = strtok(buffer, "\n");
+ line != NULL;
+ line = strtok(NULL, "\n")) {
+ if (strcmp(line, ns1) == 0) {
+ tunnel->ipv4.ns1_was_there = 1;
+ log_debug("ns1 already present in /etc/resolv.conf.\n");
+ }
}
- }
- if (tunnel->ipv4.ns2_was_there == 0)
- log_debug("Adding \"%s\", to /etc/resolv.conf.\n", ns2);
+ if (tunnel->ipv4.ns1_was_there == 0)
+ log_debug("Adding \"%s\", to /etc/resolv.conf.\n", ns1);
- if (dns_suffix[0] == '\0') {
- tunnel->ipv4.dns_suffix_was_there = -1;
- } else {
for (const char *line = strtok(buffer, "\n");
line != NULL;
line = strtok(NULL, "\n")) {
- if (dns_suffix[0] != '\0' && strcmp(line, dns_suffix) == 0) {
- tunnel->ipv4.dns_suffix_was_there = 1;
- log_debug("dns_suffix already present in /etc/resolv.conf.\n");
+ if (strcmp(line, ns2) == 0) {
+ tunnel->ipv4.ns2_was_there = 1;
+ log_debug("ns2 already present in /etc/resolv.conf.\n");
}
}
- }
- if (tunnel->ipv4.dns_suffix_was_there == 0)
- log_debug("Adding \"%s\", to /etc/resolv.conf.\n", dns_suffix);
+ if (tunnel->ipv4.ns2_was_there == 0)
+ log_debug("Adding \"%s\", to /etc/resolv.conf.\n", ns2);
- rewind(file);
- if (fread(buffer, stat.st_size, 1, file) != 1) {
- log_warn("Could not read /etc/resolv.conf.\n");
- goto err_free;
- }
+ if (dns_suffix[0] == '\0') {
+ tunnel->ipv4.dns_suffix_was_there = -1;
+ } else {
+ for (const char *line = strtok(buffer, "\n");
+ line != NULL;
+ line = strtok(NULL, "\n")) {
+ if (dns_suffix[0] != '\0'
+ && strcmp(line, dns_suffix) == 0) {
+ tunnel->ipv4.dns_suffix_was_there = 1;
+ log_debug("dns_suffix already present in /etc/resolv.conf.\n");
+ }
+ }
+ }
- buffer[stat.st_size] = '\0';
+ if (tunnel->ipv4.dns_suffix_was_there == 0)
+ log_debug("Adding \"%s\", to /etc/resolv.conf.\n", dns_suffix);
- rewind(file);
+ rewind(file);
+ if (fread(buffer, stat.st_size, 1, file) != 1) {
+ log_warn("Could not read /etc/resolv.conf.\n");
+ goto err_free;
+ }
+
+ buffer[stat.st_size] = '\0';
+
+ rewind(file);
+ }
if (tunnel->ipv4.ns1_was_there == 0) {
strcat(ns1, "\n");
fputs(ns1, file);
@@ -1141,14 +1185,18 @@
strcat(dns_suffix, "\n");
fputs(dns_suffix, file);
}
- fwrite(buffer, stat.st_size, 1, file);
+ if (use_resolvconf == 0)
+ fwrite(buffer, stat.st_size, 1, file);
ret = 0;
err_free:
free(buffer);
err_close:
- fclose(file);
+ if (use_resolvconf == 0)
+ fclose(file);
+ else
+ pclose(file);
return ret;
}
@@ -1160,7 +1208,35 @@
struct stat stat;
char ns1[27], ns2[27]; // 11 + 15 + 1
char dns_suffix[MAX_DOMAIN_LENGTH+8]; // 7 + MAX_DOMAIN_LENGTH + 1
- char *buffer;
+ char *buffer = NULL;
+
+
+ if (access(RESOLVCONF_PATH, F_OK) == 0) {
+ int resolvconf_call_len
+ = strlen(RESOLVCONF_PATH)
+ + 20
+ + strlen(tunnel->ppp_iface);
+ char *resolvconf_call = malloc(resolvconf_call_len);
+ if (resolvconf_call == NULL) {
+ log_warn("Could not create command to run resolvconf (%s).\n",
+ strerror(errno));
+ return ERR_IPV4_SEE_ERRNO;
+ }
+
+ snprintf(resolvconf_call,
+ resolvconf_call_len,
+ "%s -d \"%s.openfortivpn\"",
+ RESOLVCONF_PATH,
+ tunnel->ppp_iface
+ );
+
+ log_debug("resolvconf_call: %s\n", resolvconf_call);
+ ret = system(resolvconf_call);
+ free(resolvconf_call);
+ if (ret == -1)
+ return ERR_IPV4_SEE_ERRNO;
+ return 0;
+ }
file = fopen("/etc/resolv.conf", "r+");
if (file == NULL) {
@@ -1190,18 +1266,18 @@
buffer[stat.st_size] = '\0';
- ns1[0]='\0';
+ ns1[0] = '\0';
if (tunnel->ipv4.ns1_addr.s_addr != 0) {
strcpy(ns1, "nameserver ");
strncat(ns1, inet_ntoa(tunnel->ipv4.ns1_addr), 15);
}
- ns2[0]='\0';
+ ns2[0] = '\0';
if (tunnel->ipv4.ns2_addr.s_addr != 0) {
strcpy(ns2, "nameserver ");
strncat(ns2, inet_ntoa(tunnel->ipv4.ns2_addr), 15);
}
- dns_suffix[0]='\0';
- if (tunnel->ipv4.dns_suffix != NULL && tunnel->ipv4.dns_suffix[0]!='\0') {
+ dns_suffix[0] = '\0';
+ if (tunnel->ipv4.dns_suffix != NULL && tunnel->ipv4.dns_suffix[0] != '\0') {
strcpy(dns_suffix, "search ");
strncat(dns_suffix, tunnel->ipv4.dns_suffix, MAX_DOMAIN_LENGTH);
}
@@ -1216,13 +1292,13 @@
for (const char *line = strtok(buffer, "\n");
line != NULL;
line = strtok(NULL, "\n")) {
- if (ns1[0]!='\0' && strcmp(line, ns1) == 0
+ if (ns1[0] != '\0' && strcmp(line, ns1) == 0
&& (tunnel->ipv4.ns1_was_there == 0)) {
log_debug("Deleting \"%s\" from /etc/resolv.conf.\n", ns1);
- } else if (ns2[0]!='\0' && strcmp(line, ns2) == 0
+ } else if (ns2[0] != '\0' && strcmp(line, ns2) == 0
&& (tunnel->ipv4.ns2_was_there == 0)) {
log_debug("Deleting \"%s\" from /etc/resolv.conf.\n", ns2);
- } else if (dns_suffix[0]!='\0' && strcmp(line, dns_suffix) == 0
+ } else if (dns_suffix[0] != '\0' && strcmp(line, dns_suffix) == 0
&& (tunnel->ipv4.dns_suffix_was_there == 0)) {
log_debug("Deleting \"%s\" from /etc/resolv.conf.\n", dns_suffix);
} else {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/src/main.c new/openfortivpn-1.12.0/src/main.c
--- old/openfortivpn-1.11.0/src/main.c 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/src/main.c 2020-02-26 17:02:52.000000000 +0100
@@ -99,17 +99,17 @@
" -p <pass>, --password=<pass> VPN account password.\n" \
" -o <otp>, --otp=<otp> One-Time-Password.\n" \
" --otp-prompt=<prompt> Search for the OTP prompt starting with this string\n" \
-" --otp-delay=<delay> Wait <delay> seconds before sending the OTP.\n" \
+" --otp-delay=<delay> Wait <delay> seconds before sending the OTP.\n" \
" --pinentry=<program> Use the program to supply a secret instead of asking for it\n" \
-" --realm=<realm> Use specified authentication realm on VPN gateway\n" \
+" --realm=<realm> Use specified authentication realm.\n" \
+" --set-routes=[01] Set if openfortivpn should configure routes\n" \
" when tunnel is up.\n" \
-" --set-routes=[01] Set if openfortivpn should configure output routes through\n" \
-" the VPN when tunnel is up.\n" \
" --no-routes Do not configure routes, same as --set-routes=0.\n" \
" --half-internet-routes=[01] Add two 0.0.0.0/1 and 128.0.0.0/1 routes with higher\n" \
" priority instead of replacing the default route.\n" \
-" --set-dns=[01] Set if openfortivpn should add DNS name servers \n" \
-" and domain seach list in /etc/resolv.conf.\n" \
+" --set-dns=[01] Set if openfortivpn should add DNS name servers\n" \
+" and domain search list in /etc/resolv.conf.\n" \
+" If installed resolvconf is used for the update.\n" \
" --no-dns Do not reconfigure DNS, same as --set-dns=0\n" \
" --ca-file=<file> Use specified PEM-encoded certificate bundle\n" \
" instead of system-wide store to verify the gateway\n" \
@@ -407,7 +407,7 @@
}
if (strcmp(long_options[option_index].name,
"otp-delay") == 0) {
- long int otp_delay = strtol(optarg, NULL, 0);
+ long otp_delay = strtol(optarg, NULL, 0);
if (otp_delay < 0 || otp_delay > UINT_MAX) {
log_warn("Bad otp-delay option: \"%s\"\n",
optarg);
@@ -418,7 +418,7 @@
}
if (strcmp(long_options[option_index].name,
"persistent") == 0) {
- long int persistent = strtol(optarg, NULL, 0);
+ long persistent = strtol(optarg, NULL, 0);
if (persistent < 0 || persistent > UINT_MAX) {
log_warn("Bad persistent option: \"%s\"\n",
optarg);
@@ -474,6 +474,8 @@
if (cli_cfg.password != NULL && cli_cfg.password[0] != '\0')
log_warn("You should not pass the password on the command line. Type it interactively or use a config file instead.\n");
+ log_debug_all("ATTENTION: the output contains sensitive information such as the THE CLEAR TEXT PASSWORD.\n");
+
log_debug("openfortivpn " VERSION "\n");
// Load config file
@@ -485,6 +487,14 @@
log_warn("Could not load config file \"%s\" (%s).\n",
config_file, err_cfg_str(ret));
}
+ if (cfg.password != NULL && cli_cfg.password == NULL) {
+ if (cfg.password[0] == '\0')
+ log_debug("Disabled password due to empty entry in config file \"%s\"\n",
+ config_file);
+ else
+ log_debug("Loaded password from config file \"%s\"\n",
+ config_file);
+ }
// Then apply CLI config
merge_config(&cfg, &cli_cfg);
set_syslog(cfg.use_syslog);
@@ -497,7 +507,7 @@
port_str[0] = '\0';
port_str++;
cfg.gateway_port = strtol(port_str, NULL, 0);
- if (cfg.gateway_port <= 0 || cfg.gateway_port > 65535) {
+ if (cfg.gateway_port == 0 || cfg.gateway_port > 65535) {
log_error("Specify a valid port.\n");
goto user_error;
}
@@ -512,12 +522,12 @@
goto user_error;
}
// Check username
- if (cfg.username[0] == '\0' && cfg.use_engine != 1) {
- log_error("Specify an username.\n");
+ if (cfg.username[0] == '\0' && cfg.user_cert == NULL) {
+ log_error("Specify a username.\n");
goto user_error;
}
// If username but no password given, interactively ask user
- if (cfg.password == NULL && cfg.username[0] != '\0' ) {
+ if (cfg.password == NULL && cfg.username[0] != '\0') {
char *tmp_password = malloc(PWD_BUFSIZ); // allocate large buffer
read_password(cfg.pinentry, "password",
"VPN account password: ", tmp_password, PWD_BUFSIZ);
@@ -531,6 +541,8 @@
log_debug("Config username = \"%s\"\n", cfg.username);
if (cfg.password != NULL)
log_debug_all("Config password = \"%s\"\n", cfg.password);
+ else
+ cfg.password = strdup("");
if (cfg.otp[0] != '\0')
log_debug("One-time password = \"%s\"\n", cfg.otp);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/src/openssl_hostname_validation.c new/openfortivpn-1.12.0/src/openssl_hostname_validation.c
--- old/openfortivpn-1.11.0/src/openssl_hostname_validation.c 1970-01-01 01:00:00.000000000 +0100
+++ new/openfortivpn-1.12.0/src/openssl_hostname_validation.c 2020-02-26 17:02:52.000000000 +0100
@@ -0,0 +1,165 @@
+/* Obtained from: https://github.com/iSECPartners/ssl-conservatory */
+
+/*
+ * Helper functions to perform basic hostname validation using OpenSSL.
+ *
+ * Author: Alban Diquet
+ *
+ * Copyright (C) 2012, iSEC Partners.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+
+#include <strings.h>
+#include <openssl/x509v3.h>
+#include <openssl/ssl.h>
+
+#define HOSTNAME_MAX_SIZE 255
+
+#ifndef HAVE_X509_CHECK_HOST
+
+#include "openssl_hostname_validation.h"
+
+
+/**
+* Tries to find a match for hostname in the certificate's Common Name field.
+*
+* Returns MatchFound if a match was found.
+* Returns MatchNotFound if no matches were found.
+* Returns MalformedCertificate if the Common Name had a NUL character embedded in it.
+* Returns Error if the Common Name could not be extracted.
+*/
+static HostnameValidationResult matches_common_name(const char *hostname, const X509 *server_cert) {
+ int common_name_loc = -1;
+ X509_NAME_ENTRY *common_name_entry = NULL;
+ ASN1_STRING *common_name_asn1 = NULL;
+ char *common_name_str = NULL;
+
+ // Find the position of the CN field in the Subject field of the certificate
+ common_name_loc = X509_NAME_get_index_by_NID(X509_get_subject_name((X509 *) server_cert), NID_commonName, -1);
+ if (common_name_loc < 0) {
+ return Error;
+ }
+
+ // Extract the CN field
+ common_name_entry = X509_NAME_get_entry(X509_get_subject_name((X509 *) server_cert), common_name_loc);
+ if (common_name_entry == NULL) {
+ return Error;
+ }
+
+ // Convert the CN field to a C string
+ common_name_asn1 = X509_NAME_ENTRY_get_data(common_name_entry);
+ if (common_name_asn1 == NULL) {
+ return Error;
+ }
+ common_name_str = (char *) ASN1_STRING_data(common_name_asn1);
+
+ // Make sure there isn't an embedded NUL character in the CN
+ if (ASN1_STRING_length(common_name_asn1) != strlen(common_name_str)) {
+ return MalformedCertificate;
+ }
+
+ // Compare expected hostname with the CN
+ if (strcasecmp(hostname, common_name_str) == 0) {
+ return MatchFound;
+ }
+ else {
+ return MatchNotFound;
+ }
+}
+
+
+/**
+* Tries to find a match for hostname in the certificate's Subject Alternative Name extension.
+*
+* Returns MatchFound if a match was found.
+* Returns MatchNotFound if no matches were found.
+* Returns MalformedCertificate if any of the hostnames had a NUL character embedded in it.
+* Returns NoSANPresent if the SAN extension was not present in the certificate.
+*/
+static HostnameValidationResult matches_subject_alternative_name(const char *hostname, const X509 *server_cert) {
+ HostnameValidationResult result = MatchNotFound;
+ int i;
+ int san_names_nb = -1;
+ STACK_OF(GENERAL_NAME) *san_names = NULL;
+
+ // Try to extract the names within the SAN extension from the certificate
+ san_names = X509_get_ext_d2i((X509 *) server_cert, NID_subject_alt_name, NULL, NULL);
+ if (san_names == NULL) {
+ return NoSANPresent;
+ }
+ san_names_nb = sk_GENERAL_NAME_num(san_names);
+
+ // Check each name within the extension
+ for (i=0; i<san_names_nb; i++) {
+ const GENERAL_NAME *current_name = sk_GENERAL_NAME_value(san_names, i);
+
+ if (current_name->type == GEN_DNS) {
+ // Current name is a DNS name, let's check it
+ char *dns_name = (char *) ASN1_STRING_data(current_name->d.dNSName);
+
+ // Make sure there isn't an embedded NUL character in the DNS name
+ if (ASN1_STRING_length(current_name->d.dNSName) != strlen(dns_name)) {
+ result = MalformedCertificate;
+ break;
+ }
+ else { // Compare expected hostname with the DNS name
+ if (strcasecmp(hostname, dns_name) == 0) {
+ result = MatchFound;
+ break;
+ }
+ }
+ }
+ }
+ sk_GENERAL_NAME_pop_free(san_names, GENERAL_NAME_free);
+
+ return result;
+}
+
+
+/**
+* Validates the server's identity by looking for the expected hostname in the
+* server's certificate. As described in RFC 6125, it first tries to find a match
+* in the Subject Alternative Name extension. If the extension is not present in
+* the certificate, it checks the Common Name instead.
+*
+* Returns MatchFound if a match was found.
+* Returns MatchNotFound if no matches were found.
+* Returns MalformedCertificate if any of the hostnames had a NUL character embedded in it.
+* Returns Error if there was an error.
+*/
+HostnameValidationResult validate_hostname(const char *hostname, const X509 *server_cert) {
+ HostnameValidationResult result;
+
+ if((hostname == NULL) || (server_cert == NULL))
+ return Error;
+
+ // First try the Subject Alternative Names extension
+ result = matches_subject_alternative_name(hostname, server_cert);
+ if (result == NoSANPresent) {
+ // Extension was not found: try the Common Name
+ result = matches_common_name(hostname, server_cert);
+ }
+
+ return result;
+}
+
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/src/openssl_hostname_validation.h new/openfortivpn-1.12.0/src/openssl_hostname_validation.h
--- old/openfortivpn-1.11.0/src/openssl_hostname_validation.h 1970-01-01 01:00:00.000000000 +0100
+++ new/openfortivpn-1.12.0/src/openssl_hostname_validation.h 2020-02-26 17:02:52.000000000 +0100
@@ -0,0 +1,53 @@
+/* Obtained from: https://github.com/iSECPartners/ssl-conservatory */
+
+/*
+ * Helper functions to perform basic hostname validation using OpenSSL.
+ *
+ * Author: Alban Diquet
+ *
+ * Copyright (C) 2012, iSEC Partners.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#ifndef HAVE_X509_CHECK_HOST
+
+typedef enum {
+ MatchFound,
+ MatchNotFound,
+ NoSANPresent,
+ MalformedCertificate,
+ Error
+} HostnameValidationResult;
+
+/**
+* Validates the server's identity by looking for the expected hostname in the
+* server's certificate. As described in RFC 6125, it first tries to find a match
+* in the Subject Alternative Name extension. If the extension is not present in
+* the certificate, it checks the Common Name instead.
+*
+* Returns MatchFound if a match was found.
+* Returns MatchNotFound if no matches were found.
+* Returns MalformedCertificate if any of the hostnames had a NUL character embedded in it.
+* Returns Error if there was an error.
+*/
+HostnameValidationResult validate_hostname(const char *hostname, const X509 *server_cert);
+
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/src/tunnel.c new/openfortivpn-1.12.0/src/tunnel.c
--- old/openfortivpn-1.11.0/src/tunnel.c 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/src/tunnel.c 2020-02-26 17:02:52.000000000 +0100
@@ -29,6 +29,9 @@
#include "tunnel.h"
#include "http.h"
#include "log.h"
+#ifndef HAVE_X509_CHECK_HOST
+#include "openssl_hostname_validation.h"
+#endif
#include <unistd.h>
#include <fcntl.h>
@@ -61,8 +64,8 @@
#endif
struct ofv_varr {
- unsigned cap; // current capacity
- unsigned off; // next slot to write, always < max(cap - 1, 1)
+ unsigned int cap; // current capacity
+ unsigned int off; // next slot to write, always < max(cap - 1, 1)
const char **data; // NULL terminated
};
@@ -70,9 +73,9 @@
{
if (p->off + 1 >= p->cap) {
const char **ndata;
- unsigned ncap = (p->off + 1) * 2;
+ unsigned int ncap = (p->off + 1) * 2;
if (p->off + 1 >= ncap) {
- log_error("ofv_append_varr: ncap exceeded\n");
+ log_error("%s: ncap exceeded\n", __func__);
return 1;
};
ndata = realloc(p->data, ncap * sizeof(const char *));
@@ -85,17 +88,16 @@
}
}
if (p->data == NULL) {
- log_error("ofv_append_varr: NULL data\n");
+ log_error("%s: NULL data\n", __func__);
return 1;
}
- if (p->off + 1 < p->cap) {
- p->data[p->off] = x;
- p->data[++p->off] = NULL;
- return 0;
- } else {
- log_error("ofv_append_varr: cap exceeded in p\n");
+ if (p->off + 1 >= p->cap) {
+ log_error("%s: cap exceeded in p\n", __func__);
return 1;
}
+ p->data[p->off] = x;
+ p->data[++p->off] = NULL;
+ return 0;
}
static int on_ppp_if_up(struct tunnel *tunnel)
@@ -109,9 +111,8 @@
ret = ipv4_set_tunnel_routes(tunnel);
- if (ret != 0) {
+ if (ret != 0)
log_warn("Adding route table is incomplete. Please check route table.\n");
- }
}
if (tunnel->config->set_dns) {
@@ -193,11 +194,11 @@
* e.g. the name of the configuration or options
* to send interactively to ppp will be added later
*/
- const char *v[] = {
+ static const char *const v[] = {
ppp_path,
"-direct"
};
- for (unsigned i = 0; i < ARRAY_SIZE(v); i++)
+ for (unsigned int i = 0; i < ARRAY_SIZE(v); i++)
if (ofv_append_varr(&pppd_args, v[i]))
return 1;
#endif
@@ -210,7 +211,7 @@
if (ofv_append_varr(&pppd_args, tunnel->config->pppd_call))
return 1;
} else {
- const char *v[] = {
+ static const char *const v[] = {
ppp_path,
"115200", // speed
":192.0.2.1", // <local_IP_address>:<remote_IP_address>
@@ -225,7 +226,7 @@
"lcp-max-configure", "40",
"mru", "1354"
};
- for (unsigned i = 0; i < ARRAY_SIZE(v); i++)
+ for (unsigned int i = 0; i < ARRAY_SIZE(v); i++)
if (ofv_append_varr(&pppd_args, v[i]))
return 1;
}
@@ -408,12 +409,12 @@
(tunnel->config->pppd_ifname
&& strstr(ifa->ifa_name, tunnel->config->pppd_ifname)
!= NULL)
- || strstr(ifa->ifa_name, "ppp") != NULL)
+ || strstr(ifa->ifa_name, "ppp") != NULL
#endif
#if HAVE_USR_SBIN_PPP
- strstr(ifa->ifa_name, "tun") != NULL)
+ strstr(ifa->ifa_name, "tun") != NULL
#endif
- && ifa->ifa_flags& IFF_UP) {
+ ) && ifa->ifa_flags & IFF_UP) {
if (&(ifa->ifa_addr->sa_family) != NULL
&& ifa->ifa_addr->sa_family == AF_INET) {
struct in_addr if_ip_addr =
@@ -589,7 +590,7 @@
}
// detect "200"
- const char HTTP_STATUS_200[] = "200";
+ static const char HTTP_STATUS_200[] = "200";
response = strstr(request, HTTP_STATUS_200);
// detect end-of-line after "200"
@@ -611,7 +612,7 @@
* recognize a single LF as a line terminator
* and ignore the leading CR.
*/
- static const char *HTTP_EOL[] = {
+ static const char *const HTTP_EOL[] = {
"\r\n\r\n",
"\n\n"
};
@@ -654,7 +655,6 @@
char *line;
int i;
X509_NAME *subj;
- char common_name[FIELD_SIZE + 1];
SSL_set_verify(tunnel->ssl_handle, SSL_VERIFY_PEER, NULL);
@@ -668,16 +668,15 @@
#ifdef HAVE_X509_CHECK_HOST
// Use OpenSSL native host validation if v >= 1.0.2.
- if (X509_check_host(cert, common_name, FIELD_SIZE, 0, NULL))
+ // compare against gateway_host and correctly check return value
+ // to fix piror Incorrect use of X509_check_host
+ if (X509_check_host(cert, tunnel->config->gateway_host,
+ 0, 0, NULL) == 1)
cert_valid = 1;
#else
- // Use explicit Common Name check if native validation not available.
- // Note: this will ignore Subject Alternative Name fields.
- if (subj
- && X509_NAME_get_text_by_NID(subj, NID_commonName, common_name,
- FIELD_SIZE) > 0
- && strncasecmp(common_name, tunnel->config->gateway_host,
- FIELD_SIZE) == 0)
+ // Use validate_hostname form iSECPartners if native validation not available
+ // in order to avoid TLS Certificate CommonName NULL Byte Vulnerability
+ if (validate_hostname(tunnel->config->gateway_host, cert) == MatchFound)
cert_valid = 1;
#endif
@@ -831,8 +830,8 @@
return 1;
}
- EVP_PKEY *privkey = ENGINE_load_private_key(
- e, parms.uri, UI_OpenSSL(), NULL);
+ EVP_PKEY * privkey = ENGINE_load_private_key(
+ e, parms.uri, UI_OpenSSL(), NULL);
if (!privkey) {
log_error("PKCS11 ENGINE_load_private_key: %s\n",
ERR_error_string(ERR_peek_last_error(), NULL));
@@ -905,17 +904,15 @@
if (!tunnel->config->cipher_list) {
const char *cipher_list;
if (tunnel->config->seclevel_1)
- cipher_list = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4"
- "@SECLEVEL=1";
+ cipher_list = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4@SECLEVEL=1";
else
cipher_list = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4";
tunnel->config->cipher_list = strdup(cipher_list);
}
} else {
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
- if (tunnel->config->min_tls <= 0) {
+ if (tunnel->config->min_tls <= 0)
tunnel->config->min_tls = TLS1_VERSION;
- }
#endif
if (!tunnel->config->cipher_list && tunnel->config->seclevel_1) {
const char *cipher_list = "DEFAULT@SECLEVEL=1";
@@ -924,7 +921,7 @@
}
if (tunnel->config->cipher_list) {
- log_debug("Setting cipher list to: %s", tunnel->config->cipher_list);
+ log_debug("Setting cipher list to: %s\n", tunnel->config->cipher_list);
if (!SSL_set_cipher_list(tunnel->ssl_handle,
tunnel->config->cipher_list)) {
log_error("SSL_set_cipher_list failed: %s\n",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/src/tunnel.h new/openfortivpn-1.12.0/src/tunnel.h
--- old/openfortivpn-1.11.0/src/tunnel.h 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/src/tunnel.h 2020-02-26 17:02:52.000000000 +0100
@@ -75,8 +75,8 @@
struct ipv4_config ipv4;
- int (*on_ppp_if_up)(struct tunnel *);
- int (*on_ppp_if_down)(struct tunnel *);
+ int (*on_ppp_if_up)(struct tunnel *tunnel);
+ int (*on_ppp_if_down)(struct tunnel *tunnel);
};
struct token {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/tests/lint/astyle.sh new/openfortivpn-1.12.0/tests/lint/astyle.sh
--- old/openfortivpn-1.11.0/tests/lint/astyle.sh 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/tests/lint/astyle.sh 2020-02-26 17:02:52.000000000 +0100
@@ -2,7 +2,7 @@
# Copyright (C) 2015 Adrien Vergé
# Check that astyle is installed
-if ! which astyle &>/dev/null; then
+if ! command -v astyle &>/dev/null; then
echo "error: astyle is not installed" >&2
exit -1
fi
@@ -17,15 +17,15 @@
--indent=tab=8 \
--pad-header \
--align-reference=type \
- <"$file" >$tmp
+ <"$file" >"$tmp"
- if ! cmp -s "$file" $tmp; then
- echo "error: $file does not comply with coding style"
- git --no-pager diff --no-index -U0 "$file" $tmp
+ if ! cmp -s "$file" "$tmp"; then
+ echo "error: $file does not comply with coding style" >&2
+ git --no-pager diff --no-index -U0 "$file" "$tmp"
rc=1
fi
- rm $tmp
+ rm "$tmp"
done
exit $rc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/tests/lint/eol-at-eof.sh new/openfortivpn-1.12.0/tests/lint/eol-at-eof.sh
--- old/openfortivpn-1.11.0/tests/lint/eol-at-eof.sh 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/tests/lint/eol-at-eof.sh 2020-02-26 17:02:52.000000000 +0100
@@ -5,12 +5,12 @@
for file in "$@"; do
if [ "$(sed -n '$p' "$file")" = "" ]; then
- echo "$file: too many newlines at end of file"
+ echo "$file: too many newlines at end of file" >&2
rc=1
fi
if [ "$(tail -c 1 "$file")" != "" ]; then
- echo "$file: no newline at end of file"
+ echo "$file: no newline at end of file" >&2
rc=1
fi
done
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/tests/lint/line-length.py new/openfortivpn-1.12.0/tests/lint/line-length.py
--- old/openfortivpn-1.11.0/tests/lint/line-length.py 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/tests/lint/line-length.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,53 +0,0 @@
-#!/usr/bin/python3
-# -*- coding: utf-8 -*-
-# Copyright (C) 2015 Adrien Vergé
-
-import sys
-
-# Guidelines say 80, let's tolerate a bit more
-MAX = 90
-
-
-def endswithstring(line):
- """Detect lines from C source code ending with a string.
-
- Parameters
- ----------
- line : str
- Line of C source code.
-
- Returns
- -------
- bool
- True if line ends with string, False otherwise.
-
- """
- for end in ('"', '",', '");', '" \\'):
- if line.endswith(end):
- return True
- return False
-
-
-def main():
- exit_status = 0
-
- for arg in sys.argv[1:]:
- with open(arg, "r") as source_file:
- for i, line in enumerate(source_file):
- line = line.rstrip()
- # Lines that end with a string are exempted
- if endswithstring(line):
- continue
- # Replace tabs with 8 spaces
- line = line.replace("\t", " ")
- # Lines longer than MAX are reported as an error
- if len(line) > MAX:
- print("{}: {}: line too long ({} characters)"
- .format(arg, i, len(line)))
- exit_status = 1
-
- sys.exit(exit_status)
-
-
-if __name__ == "__main__":
- main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/tests/lint/line_length.py new/openfortivpn-1.12.0/tests/lint/line_length.py
--- old/openfortivpn-1.11.0/tests/lint/line_length.py 1970-01-01 01:00:00.000000000 +0100
+++ new/openfortivpn-1.12.0/tests/lint/line_length.py 2020-02-26 17:02:52.000000000 +0100
@@ -0,0 +1,53 @@
+#!/usr/bin/python3
+# -*- coding: utf-8 -*-
+# Copyright (C) 2015 Adrien Vergé
+
+import sys
+
+# Guidelines say 80, let's tolerate a bit more
+MAX = 90
+
+
+def endswithstring(line):
+ """Detect lines from C source code ending with a string.
+
+ Parameters
+ ----------
+ line : str
+ Line of C source code.
+
+ Returns
+ -------
+ bool
+ True if line ends with string, False otherwise.
+
+ """
+ for end in ('"', '",', '");', '";', '" \\'):
+ if line.endswith(end):
+ return True
+ return False
+
+
+def main():
+ exit_status = 0
+
+ for arg in sys.argv[1:]:
+ with open(arg, "r") as source_file:
+ for i, line in enumerate(source_file):
+ line = line.rstrip()
+ # Lines that end with a string are exempted
+ if endswithstring(line):
+ continue
+ # Replace tabs with 8 spaces
+ line = line.replace("\t", " ")
+ # Lines longer than MAX are reported as an error
+ if len(line) > MAX:
+ print("{}: {}: line too long ({} characters)"
+ .format(arg, i, len(line)))
+ exit_status = 1
+
+ sys.exit(exit_status)
+
+
+if __name__ == "__main__":
+ main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openfortivpn-1.11.0/tests/lint/run.sh new/openfortivpn-1.12.0/tests/lint/run.sh
--- old/openfortivpn-1.11.0/tests/lint/run.sh 2019-11-28 17:08:40.000000000 +0100
+++ new/openfortivpn-1.12.0/tests/lint/run.sh 2020-02-26 17:02:52.000000000 +0100
@@ -3,13 +3,10 @@
rc=0
-bash tests/lint/eol-at-eof.sh $(git ls-files)
-[ $? -ne 0 ] && rc=1
+./tests/lint/eol-at-eof.sh $(git ls-files | grep -v openssl_hostname_validation) || rc=1
-python3 tests/lint/line-length.py $(git ls-files '*.[ch]')
-[ $? -ne 0 ] && rc=1
+./tests/lint/line_length.py $(git ls-files '*.[ch]' | grep -v openssl_hostname_validation) || rc=1
-bash tests/lint/astyle.sh $(git ls-files '*.[ch]')
-[ $? -ne 0 ] && rc=1
+./tests/lint/astyle.sh $(git ls-files '*.[ch]' | grep -v openssl_hostname_validation) || rc=1
exit $rc
1
0