openSUSE Commits
Threads by month
- ----- 2024 -----
- 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
July 2019
- 2 participants
- 2045 discussions
Hello community,
here is the log from the commit of package 000product for openSUSE:Factory checked in at 2019-07-05 13:49:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/000product (Old)
and /work/SRC/openSUSE:Factory/.000product.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "000product"
Fri Jul 5 13:49:22 2019 rev:1400 rq: version:unknown
Fri Jul 5 13:49:21 2019 rev:1399 rq: version:unknown
Changes:
--------
New Changes file:
NO CHANGES FILE!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
openSUSE-MicroOS-dvd5-dvd-x86_64.kiwi: same change
openSUSE-MicroOS-dvd5-kubic-dvd-x86_64.kiwi: same change
openSUSE-cd-mini-i586.kiwi: same change
openSUSE-cd-mini-x86_64.kiwi: same change
openSUSE-dvd5-dvd-i586.kiwi: same change
openSUSE-dvd5-dvd-x86_64.kiwi: same change
openSUSE-ftp-ftp-i586_x86_64.kiwi: same change
stub.kiwi: same change
++++++ openSUSE-MicroOS.product ++++++
--- /var/tmp/diff_new_pack.Sd0aCr/_old 2019-07-05 13:49:24.033516450 +0200
+++ /var/tmp/diff_new_pack.Sd0aCr/_new 2019-07-05 13:49:24.033516450 +0200
@@ -6,7 +6,7 @@
<name>openSUSE-MicroOS</name>
<releasepkgname>openSUSE-MicroOS-release</releasepkgname>
<endoflife/>
- <version>20190704</version>
+ <version>20190705</version>
<!-- release is no longer optional -->
<release>0</release>
<productline>openSUSE-MicroOS</productline>
++++++ openSUSE.product ++++++
--- /var/tmp/diff_new_pack.Sd0aCr/_old 2019-07-05 13:49:24.053516481 +0200
+++ /var/tmp/diff_new_pack.Sd0aCr/_new 2019-07-05 13:49:24.053516481 +0200
@@ -4,7 +4,7 @@
<product>
<vendor>openSUSE</vendor>
<name>openSUSE</name>
- <version>20190704</version>
+ <version>20190705</version>
<release>0</release>
<productline>openSUSE</productline>
1
0
Hello community,
here is the log from the commit of package 000product for openSUSE:Factory checked in at 2019-07-05 13:49:20
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/000product (Old)
and /work/SRC/openSUSE:Factory/.000product.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "000product"
Fri Jul 5 13:49:20 2019 rev:1398 rq: version:unknown
Changes:
--------
New Changes file:
NO CHANGES FILE!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
openSUSE-MicroOS-dvd5-dvd-x86_64.kiwi: same change
openSUSE-MicroOS-dvd5-kubic-dvd-x86_64.kiwi: same change
openSUSE-cd-mini-i586.kiwi: same change
openSUSE-cd-mini-x86_64.kiwi: same change
openSUSE-dvd5-dvd-i586.kiwi: same change
openSUSE-dvd5-dvd-x86_64.kiwi: same change
openSUSE-ftp-ftp-i586_x86_64.kiwi: same change
stub.kiwi: same change
++++++ openSUSE-Addon-NonOss.product ++++++
--- /var/tmp/diff_new_pack.HtIbUh/_old 2019-07-05 13:49:22.377513897 +0200
+++ /var/tmp/diff_new_pack.HtIbUh/_new 2019-07-05 13:49:22.377513897 +0200
@@ -4,7 +4,7 @@
<product>
<vendor>openSUSE</vendor>
<name>openSUSE-Addon-NonOss</name>
- <version>20190704</version>
+ <version>20190705</version>
<release>0</release>
<summary>openSUSE NonOSS Addon</summary>
<shortsummary>non oss addon</shortsummary>
1
0
Hello community,
here is the log from the commit of package R-base for openSUSE:Factory checked in at 2019-07-05 13:49:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/R-base (Old)
and /work/SRC/openSUSE:Factory/.R-base.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "R-base"
Fri Jul 5 13:49:14 2019 rev:67 rq:713566 version:unknown
Changes:
--------
--- /work/SRC/openSUSE:Factory/R-base/R-base.changes 2019-04-26 22:55:00.633293468 +0200
+++ /work/SRC/openSUSE:Factory/.R-base.new.4615/R-base.changes 2019-07-05 13:49:16.025504101 +0200
@@ -1,0 +2,81 @@
+Fri Jul 5 07:41:49 UTC 2019 - Detlef Steuer <detlef.steuer(a)gmx.de>
+
+- CHANGES IN R 3.6.1:
+
+ INSTALLATION on a UNIX-ALIKE:
+
+ * The default detection of the shell variable libNN is overridden
+ for derivatives of Debian Linux, some of which have started to
+ have a /usr/lib64 directory. (E.g. Ubuntu 19.04.) As before, it
+ can be specified in config.site.
+
+ UTILITIES:
+
+ * R CMD config knows the values of AR and RANLIB, often set for LTO
+ builds.
+
+ DEPRECATED AND DEFUNCT:
+
+ * The use of a character vector with .Fortran() is formally
+ deprecated and gives a non-portability warning. (It has long
+ been strongly discouraged in 'Writing R Extensions'.)
+
+ BUG FIXES:
+
+ * On Windows, GUI package installation via menuInstallPkgs() works
+ again, thanks to Len Weil's and Duncan Murdoch's PR#17556.
+
+ * R CMD check on data() fixing PR#17558 thanks to Duncan Murdoch.
+
+ * quasi(*, variance = list(..)) now works more efficiently, and
+ should work in all cases fixing PR#17560. Further, quasi(var =
+ mu(1-mu)) and quasi(var = "mu ^ 3") now work, and quasi(variance
+ = "log(mu)") now gives a correct error message.
+
+ * Creation of lazy loading database during package installation is
+ again robust to Rprofile changing the current working directory
+ (PR#17559).
+
+ * boxplot(y ~ f, horizontal=TRUE) now produces correct x- and
+ y-labels.
+
+ * rbind.data.frame() allows to keep <NA> levels from factor columns
+ (PR#17562) via new option factor.exclude.
+
+ Additionally, it works in one more case with matrix-columns which
+ had been reported on 2017-01-16 by Krzysztof Banas.
+
+ * Correct messaging in C++ pragma checks in tools code for R CMD
+ check, fixing PR#17566 thanks to Xavier Robin.
+
+ * print()ing and auto-printing no longer differs for functions with
+ a user defined print.function, thanks to Bill Dunlap's report.
+
+ * On Windows, writeClipboard(.., format = <n>) now does correctly
+ pass format to the underlying C code, thanks to a bug report
+ (with patch) by Jenny Bryan.
+
+ * as.data.frame() treats 1D arrays the same as vectors, PR#17570.
+
+ * Improvements in smoothEnds(x, *) working with NAs (towards
+ runmed() working in that case, in the next version of R).
+ * vcov(glm(<quasi>), dispersion = *) works correctly again, fixing
+ PR#17571 thanks to Pavel Krivitsky.
+
+ * R CMD INSTALL of binary packages on Windows now works also with
+ per-directory locking.
+
+ * R CMD INSTALL and install.packages() on Windows are now more
+ robust against a locked file in an earlier installation of the
+ package to be installed. The default value of option
+ install.lock on Windows has been changed to TRUE.
+
+ * On Unix alikes (when readline is active), only expand tilde (~)
+ file names starting with a tilde, instead of almost all tildes.
+
+ * In R documentation (*.Rd) files, \item [..] is no longer treated
+ specially when rendered in LaTeX and hence pdf, but rather shows
+ the brackets in all cases.
+
+
+-------------------------------------------------------------------
Old:
----
R-3.6.0.tar.bz2
New:
----
R-3.6.1.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ R-base.spec ++++++
--- /var/tmp/diff_new_pack.ksSgM2/_old 2019-07-05 13:49:16.977505569 +0200
+++ /var/tmp/diff_new_pack.ksSgM2/_new 2019-07-05 13:49:16.977505569 +0200
@@ -25,7 +25,7 @@
%define release 1
Name: R-base
-Version: 3.6.0
+Version: 3.6.1
Release: %release
%define Rversion %{version}
Source0: R-%{version}.tar.bz2
@@ -1162,7 +1162,7 @@
%package -n R-cluster
Summary: Package provides recommended R-cluster
Group: Development/Libraries/Other
-Version: 2.0.8
+Version: 2.1.0
Release: %release
Requires: R-base
@@ -1431,7 +1431,7 @@
%package -n R-nlme
Summary: Package provides recommended R-nlme
Group: Development/Libraries/Other
-Version: 3.1.139
+Version: 3.1.140
Release: %release
Requires: R-base
++++++ R-3.6.0.tar.bz2 -> R-3.6.1.tar.bz2 ++++++
/work/SRC/openSUSE:Factory/R-base/R-3.6.0.tar.bz2 /work/SRC/openSUSE:Factory/.R-base.new.4615/R-3.6.1.tar.bz2 differ: char 11, line 1
1
0
Hello community,
here is the log from the commit of package gitlint for openSUSE:Factory checked in at 2019-07-05 13:49:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gitlint (Old)
and /work/SRC/openSUSE:Factory/.gitlint.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gitlint"
Fri Jul 5 13:49:11 2019 rev:2 rq:713565 version:0.11.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/gitlint/gitlint.changes 2017-06-26 15:52:30.565578629 +0200
+++ /work/SRC/openSUSE:Factory/.gitlint.new.4615/gitlint.changes 2019-07-05 13:49:14.501501751 +0200
@@ -1,0 +2,11 @@
+Thu Jul 4 11:56:39 UTC 2019 - Rick Salevsky <rick.salevsky(a)suse.com>
+
+- Correct download target URL and fix relax-requirements.patch
+
+-------------------------------------------------------------------
+Tue Jul 2 12:12:25 UTC 2019 - Rick Salevsky <rick.salevsky(a)suse.com>
+
+- Update to v0.11.0
+ * add relax-requirements.patch to make it work with openSUSE
+
+-------------------------------------------------------------------
Old:
----
gitlint-0.8.2.tar.gz
New:
----
gitlint-0.11.0.tar.gz
relax-requirements.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ gitlint.spec ++++++
--- /var/tmp/diff_new_pack.NBj2HW/_old 2019-07-05 13:49:15.281502953 +0200
+++ /var/tmp/diff_new_pack.NBj2HW/_new 2019-07-05 13:49:15.289502966 +0200
@@ -1,7 +1,7 @@
#
-# spec file for package python-gitlint
+# spec file for package gitlint
#
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,24 +12,30 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
+#
%define modname gitlint
Name: %{modname}
-Version: 0.8.2
+Version: 0.11.0
Release: 0
-License: MIT
Summary: Git commit message linter checking
-Url: https://github.com/jorisroovers/%{modname}
+License: MIT
Group: Development/Languages/Python
-Source: https://files.pythonhosted.org/packages/source/g/%{modname}/%{modname}-%{ve…
-BuildRequires: python-rpm-macros
+Url: https://github.com/jorisroovers/%{modname}
+Source: https://pypi.io/packages/source/g/%{modname}/%{modname}-%{version}.tar.gz
+# PATCH-FIX-OPENSUSE relax-requirements.patch -- relax requirements to work with openSUSE
+Patch0: relax-requirements.patch
BuildRequires: %{python_module devel}
BuildRequires: %{python_module setuptools}
+BuildRequires: fdupes
+BuildRequires: python-rpm-macros
Requires(post): update-alternatives
Requires(postun): update-alternatives
-BuildRequires: fdupes
+Requires: python-arrow >= 0.10.0
+Requires: python-click >= 6.7
+Requires: python-sh >= 1.12.14
BuildArch: noarch
%python_subpackages
@@ -43,6 +49,7 @@
%prep
%setup -q -n %{name}-%{version}
+%patch0 -p1
%build
%python_build
++++++ gitlint-0.8.2.tar.gz -> gitlint-0.11.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/PKG-INFO new/gitlint-0.11.0/PKG-INFO
--- old/gitlint-0.8.2/PKG-INFO 2017-04-25 13:26:40.000000000 +0200
+++ new/gitlint-0.11.0/PKG-INFO 2019-03-13 14:16:59.000000000 +0100
@@ -1,13 +1,13 @@
Metadata-Version: 1.1
Name: gitlint
-Version: 0.8.2
+Version: 0.11.0
Summary: Git commit message linter written in python, checks your commit messages for style.
Home-page: https://github.com/jorisroovers/gitlint
Author: Joris Roovers
Author-email: UNKNOWN
License: MIT
Description:
- Great for use as a commit-msg git hook or as part of your gating script in a CI/CD pipeline (e.g. jenkins).
+ Great for use as a commit-msg git hook or as part of your gating script in a CI pipeline (e.g. jenkins, gitlab).
Many of the gitlint validations are based on `well-known`_ community_ `standards`_, others are based on checks that
we've found useful throughout the years. Gitlint has sane defaults, but you can also easily customize it to your
own liking.
@@ -29,12 +29,12 @@
Classifier: Development Status :: 5 - Production/Stable
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Environment :: Console
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/README.md new/gitlint-0.11.0/README.md
--- old/gitlint-0.8.2/README.md 2017-04-05 09:42:05.000000000 +0200
+++ new/gitlint-0.11.0/README.md 2019-03-13 14:11:18.000000000 +0100
@@ -5,16 +5,18 @@
[![PyPi Package](https://img.shields.io/pypi/v/gitlint.png)](https://pypi.python.or…
![Supported Python Versions](https://img.shields.io/pypi/pyversions/gitlint.svg)
-Git commit message linter written in python, checks your commit messages for style.
+Git commit message linter written in python (for Linux and Mac), checks your commit messages for style.
-**See [jorisroovers.github.io/gitlint/](http://jorisroovers.github.io/gitlint/) for full documentation.**
+**See [jorisroovers.github.io/gitlint](http://jorisroovers.github.io/gitlint/) for full documentation.**
<a href="http://jorisroovers.github.io/gitlint/" target="_blank"><img src="https://asciinema.org/a/30477.png" width="640"/></a>
## Contributing ##
All contributions are welcome and very much appreciated!
+** I'm looking for contributors that are interested in taking a more active co-maintainer role as it's becoming increasingly difficult for me to find time to maintain gitlint. Please open a PR if you're interested - Thanks! **
+
See [jorisroovers.github.io/gitlint/contributing](http://jorisroovers.github.io/gitlint/contributing) for details on
-how to get started - it's easy!
+how to get started - it's easy!
FYI, we maintain a [wishlist on our wiki](https://github.com/jorisroovers/gitlint/wiki/Wishlist).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint/__init__.py new/gitlint-0.11.0/gitlint/__init__.py
--- old/gitlint-0.8.2/gitlint/__init__.py 2017-04-25 13:03:27.000000000 +0200
+++ new/gitlint-0.11.0/gitlint/__init__.py 2019-03-13 13:53:55.000000000 +0100
@@ -1 +1 @@
-__version__ = "0.8.2"
+__version__ = "0.11.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint/cli.py new/gitlint-0.11.0/gitlint/cli.py
--- old/gitlint-0.8.2/gitlint/cli.py 2017-04-25 12:17:33.000000000 +0200
+++ new/gitlint-0.11.0/gitlint/cli.py 2019-03-13 10:29:52.000000000 +0100
@@ -1,10 +1,11 @@
# pylint: disable=bad-option-value,wrong-import-position
# We need to disable the import position checks because of the windows check that we need to do below
+import copy
import logging
import os
import platform
+import stat
import sys
-
import click
# Error codes
@@ -23,7 +24,7 @@
import gitlint
from gitlint.lint import GitLinter
from gitlint.config import LintConfigBuilder, LintConfigError, LintConfigGenerator
-from gitlint.git import GitContext, GitContextError
+from gitlint.git import GitContext, GitContextError, git_version
from gitlint import hooks
from gitlint.utils import ustr, LOG_FORMAT
@@ -46,6 +47,13 @@
root_log.setLevel(logging.ERROR)
+def log_system_info():
+ LOG.debug("Platform: %s", platform.platform())
+ LOG.debug("Python version: %s", sys.version)
+ LOG.debug("Git version: %s", git_version())
+ LOG.debug("Gitlint version: %s", gitlint.__version__)
+
+
def build_config(ctx, target, config_path, c, extra_path, ignore, verbose, silent, debug):
""" Creates a LintConfig object based on a set of commandline parameters. """
config_builder = LintConfigBuilder()
@@ -78,8 +86,6 @@
config_builder.set_option('general', 'debug', debug)
config = config_builder.build()
- if debug:
- click.echo(ustr(config), nl=True)
return config, config_builder
except LintConfigError as e:
@@ -87,6 +93,38 @@
ctx.exit(CONFIG_ERROR_CODE) # return CONFIG_ERROR_CODE on config error
+def get_stdin_data():
+ """ Helper function that returns data send to stdin or False if nothing is send """
+ # STDIN can only be 3 different types of things ("modes")
+ # 1. An interactive terminal device (i.e. a TTY -> sys.stdin.isatty() or stat.S_ISCHR)
+ # 2. A (named) pipe (stat.S_ISFIFO)
+ # 3. A regular file (stat.S_ISREG)
+ # Technically, STDIN can also be other device type like a named unix socket (stat.S_ISSOCK), but we don't
+ # support that in gitlint (at least not today).
+ #
+ # Now, the behavior that we want is the following:
+ # If someone sends something directly to gitlint via a pipe or a regular file, read it. If not, read from the
+ # local repository.
+ # Note that we don't care about whether STDIN is a TTY or not, we only care whether data is via a pipe or regular
+ # file.
+ # However, in case STDIN is not a TTY, it HAS to be one of the 2 other things (pipe or regular file), even if
+ # no-one is actually sending anything to gitlint over them. In this case, we still want to read from the local
+ # repository.
+ # To support this use-case (which is common in CI runners such as Jenkins and Gitlab), we need to actually attempt
+ # to read from STDIN in case it's a pipe or regular file. In case that fails, then we'll fall back to reading
+ # from the local repo.
+
+ mode = os.fstat(sys.stdin.fileno()).st_mode
+ stdin_is_pipe_or_file = stat.S_ISFIFO(mode) or stat.S_ISREG(mode)
+ if stdin_is_pipe_or_file:
+ input_data = sys.stdin.read()
+ # Only return the input data if there's actually something passed
+ # i.e. don't consider empty piped data
+ if input_data:
+ return ustr(input_data)
+ return False
+
+
@click.group(invoke_without_command=True, epilog="When no COMMAND is specified, gitlint defaults to 'gitlint lint'.")
@click.option('--target', type=click.Path(exists=True, resolve_path=True, file_okay=False, readable=True),
help="Path of the target git repository. [default: current working directory]")
@@ -95,31 +133,44 @@
@click.option('-c', multiple=True,
help="Config flags in format <rule>.<option>=<value> (e.g.: -c T1.line-length=80). " +
"Flag can be used multiple times to set multiple config values.") # pylint: disable=bad-continuation
-(a)click.option('--commits', default="HEAD", help="The range of commits to lint. [default: HEAD]")
+(a)click.option('--commits', default=None, help="The range of commits to lint. [default: HEAD]")
@click.option('-e', '--extra-path', help="Path to a directory or python module with extra user-defined rules",
type=click.Path(exists=True, resolve_path=True, readable=True))
@click.option('--ignore', default="", help="Ignore rules (comma-separated by id or name).")
+(a)click.option('--msg-filename', type=click.File(), help="Path to a file containing a commit-msg.")
@click.option('-v', '--verbose', count=True, default=0,
help="Verbosity, more v's for more verbose output (e.g.: -v, -vv, -vvv). [default: -vvv]", )
@click.option('-s', '--silent', help="Silent mode (no output). Takes precedence over -v, -vv, -vvv.", is_flag=True)
@click.option('-d', '--debug', help="Enable debugging output.", is_flag=True)
@click.version_option(version=gitlint.__version__)
@click.pass_context
-def cli(ctx, target, config, c, commits, extra_path, ignore, verbose, silent, debug):
+def cli( # pylint: disable=too-many-arguments
+ ctx, target, config, c, commits, extra_path, ignore, msg_filename,
+ verbose, silent, debug,
+):
""" Git lint tool, checks your git commit messages for styling issues """
- if debug:
- logging.getLogger("gitlint").setLevel(logging.DEBUG)
+ try:
+ if debug:
+ logging.getLogger("gitlint").setLevel(logging.DEBUG)
+
+ log_system_info()
+
+ # Get the lint config from the commandline parameters and
+ # store it in the context (click allows storing an arbitrary object in ctx.obj).
+ config, config_builder = build_config(ctx, target, config, c, extra_path, ignore, verbose, silent, debug)
+
+ LOG.debug(u"Configuration\n%s", ustr(config))
- # Get the lint config from the commandline parameters and
- # store it in the context (click allows storing an arbitrary object in ctx.obj).
- config, config_builder = build_config(ctx, target, config, c, extra_path, ignore, verbose, silent, debug)
-
- ctx.obj = (config, config_builder, commits)
-
- # If no subcommand is specified, then just lint
- if ctx.invoked_subcommand is None:
- ctx.invoke(lint)
+ ctx.obj = (config, config_builder, commits, msg_filename)
+
+ # If no subcommand is specified, then just lint
+ if ctx.invoked_subcommand is None:
+ ctx.invoke(lint)
+
+ except GitContextError as e:
+ click.echo(ustr(e))
+ ctx.exit(GIT_CONTEXT_ERROR_CODE)
@cli.command("lint")
@@ -127,23 +178,30 @@
def lint(ctx):
""" Lints a git repository [default command] """
lint_config = ctx.obj[0]
- try:
- if sys.stdin.isatty():
- # If target has not been set explicitly before, fallback to the current directory
- gitcontext = GitContext.from_local_repository(lint_config.target, ctx.obj[2])
- else:
- stdin_str = ustr(sys.stdin.read())
- gitcontext = GitContext.from_commit_msg(stdin_str)
- except GitContextError as e:
- click.echo(ustr(e))
- ctx.exit(GIT_CONTEXT_ERROR_CODE)
+ msg_filename = ctx.obj[3]
+
+ # Let's determine where our input data is coming from:
+ # Order of precedence:
+ # 1. Any data specified via --msg-filename
+ # 2. Any data sent to stdin
+ # 3. Fallback to reading from local repository
+ stdin_input = get_stdin_data()
+ if msg_filename:
+ LOG.debug("Attempting to read from --msg-filename.")
+ gitcontext = GitContext.from_commit_msg(ustr(msg_filename.read()))
+ elif stdin_input:
+ LOG.debug("No --msg-filename flag. Attempting to read from stdin.")
+ gitcontext = GitContext.from_commit_msg(stdin_input)
+ else:
+ LOG.debug("No --msg-filename flag, no or empty data passed to stdin. Attempting to read from the local repo.")
+ gitcontext = GitContext.from_local_repository(lint_config.target, ctx.obj[2])
number_of_commits = len(gitcontext.commits)
# Exit if we don't have commits in the specified range. Use a 0 exit code, since a popular use-case is one
# where users are using --commits in a check job to check the commit messages inside a CI job. By returning 0, we
# ensure that these jobs don't fail if for whatever reason the specified commit range is empty.
if number_of_commits == 0:
- click.echo(u'No commits in range "{0}".'.format(ctx.obj[2]))
+ LOG.debug(u'No commits in range "%s"', ctx.obj[2])
ctx.exit(0)
general_config_builder = ctx.obj[1]
@@ -153,13 +211,16 @@
first_violation = True
exit_code = 0
for commit in gitcontext.commits:
- # Build a config_builder and linter taking into account the commit specific config (if any)
+ # Build a config_builder taking into account the commit specific config (if any)
config_builder = general_config_builder.clone()
config_builder.set_config_from_commit(commit)
- lint_config = config_builder.build(lint_config)
- linter = GitLinter(lint_config)
+
+ # Create a deepcopy from the original config, so we have a unique config object per commit
+ # This is important for configuration rules to be able to modifying the config on a per commit basis
+ commit_config = config_builder.build(copy.deepcopy(lint_config))
# Actually do the linting
+ linter = GitLinter(commit_config)
violations = linter.lint(commit)
# exit code equals the total number of violations in all commits
exit_code += len(violations)
@@ -234,4 +295,5 @@
# Let's Party!
setup_logging()
if __name__ == "__main__":
- cli() # pragma: no cover, # pylint: disable=no-value-for-parameter
+ # pylint: disable=no-value-for-parameter
+ cli() # pragma: no cover
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint/config.py new/gitlint-0.11.0/gitlint/config.py
--- old/gitlint-0.8.2/gitlint/config.py 2017-04-25 11:04:57.000000000 +0200
+++ new/gitlint-0.11.0/gitlint/config.py 2019-03-13 13:17:13.000000000 +0100
@@ -46,7 +46,9 @@
"""
# Default tuple of rule classes (tuple because immutable).
- default_rule_classes = (rules.TitleMaxLength,
+ default_rule_classes = (rules.IgnoreByTitle,
+ rules.IgnoreByBody,
+ rules.TitleMaxLength,
rules.TitleTrailingWhitespace,
rules.TitleLeadingWhitespace,
rules.TitleTrailingPunctuation,
@@ -59,13 +61,16 @@
rules.BodyTrailingWhitespace,
rules.BodyHardTab,
rules.BodyFirstLineEmpty,
- rules.BodyChangedFileMention)
+ rules.BodyChangedFileMention,
+ rules.AuthorValidEmail)
def __init__(self):
# Use an ordered dict so that the order in which rules are applied is always the same
self._rules = OrderedDict([(rule_cls.id, rule_cls()) for rule_cls in self.default_rule_classes])
self._verbosity = options.IntOption('verbosity', 3, "Verbosity")
self._ignore_merge_commits = options.BoolOption('ignore-merge-commits', True, "Ignore merge commits")
+ self._ignore_fixup_commits = options.BoolOption('ignore-fixup-commits', True, "Ignore fixup commits")
+ self._ignore_squash_commits = options.BoolOption('ignore-squash-commits', True, "Ignore squash commits")
self._debug = options.BoolOption('debug', False, "Enable debug mode")
self._extra_path = None
target_description = "Path of the target git repository (default=current working directory)"
@@ -103,6 +108,24 @@
return self._ignore_merge_commits.set(value)
@property
+ def ignore_fixup_commits(self):
+ return self._ignore_fixup_commits.value
+
+ @ignore_fixup_commits.setter
+ @handle_option_error
+ def ignore_fixup_commits(self, value):
+ return self._ignore_fixup_commits.set(value)
+
+ @property
+ def ignore_squash_commits(self):
+ return self._ignore_squash_commits.value
+
+ @ignore_squash_commits.setter
+ @handle_option_error
+ def ignore_squash_commits(self, value):
+ return self._ignore_squash_commits.set(value)
+
+ @property
def debug(self):
return self._debug.value
@@ -202,8 +225,9 @@
# only allow setting general options that exist and don't start with an underscore
if not hasattr(self, attr_name) or attr_name[0] == "_":
raise LintConfigError(u"'{0}' is not a valid gitlint option".format(option_name))
- else:
- setattr(self, attr_name, option_value)
+
+ # else:
+ setattr(self, attr_name, option_value)
def __eq__(self, other):
return isinstance(other, LintConfig) and \
@@ -212,6 +236,8 @@
self.target == other.target and \
self.extra_path == other.extra_path and \
self.ignore_merge_commits == other.ignore_merge_commits and \
+ self.ignore_fixup_commits == other.ignore_fixup_commits and \
+ self.ignore_squash_commits == other.ignore_squash_commits and \
self.debug == other.debug and \
self.ignore == other.ignore and \
self._config_path == other._config_path # noqa
@@ -223,13 +249,15 @@
return_str += u"extra-path: {0}\n".format(self.extra_path)
return_str += u"ignore: {0}\n".format(",".join(self.ignore))
return_str += u"ignore-merge-commits: {0}\n".format(self.ignore_merge_commits)
+ return_str += u"ignore-fixup-commits: {0}\n".format(self.ignore_fixup_commits)
+ return_str += u"ignore-squash-commits: {0}\n".format(self.ignore_squash_commits)
return_str += u"verbosity: {0}\n".format(self.verbosity)
return_str += u"debug: {0}\n".format(self.debug)
return_str += u"target: {0}\n".format(self.target)
return_str += u"[RULES]\n"
for rule in self.rules:
return_str += u" {0}: {1}\n".format(rule.id, rule.name)
- for option_name, option_value in rule.options.items():
+ for option_name, option_value in sorted(rule.options.items()):
if isinstance(option_value.value, list):
option_val_repr = ",".join(option_value.value)
else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint/files/commit-msg new/gitlint-0.11.0/gitlint/files/commit-msg
--- old/gitlint-0.8.2/gitlint/files/commit-msg 2016-12-01 21:37:44.000000000 +0100
+++ new/gitlint-0.11.0/gitlint/files/commit-msg 2018-04-02 11:59:07.000000000 +0200
@@ -26,7 +26,7 @@
run_gitlint(){
echo "gitlint: checking commit message..."
- cat "$1" | python -m gitlint.cli
+ python -m gitlint.cli --msg-filename "$1"
gitlint_exit_code=$?
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint/files/gitlint new/gitlint-0.11.0/gitlint/files/gitlint
--- old/gitlint-0.8.2/gitlint/files/gitlint 2016-12-02 15:21:52.000000000 +0100
+++ new/gitlint-0.11.0/gitlint/files/gitlint 2018-04-02 11:59:07.000000000 +0200
@@ -1,10 +1,20 @@
# All these sections are optional, edit this file as you like.
# [general]
+# Ignore certain rules, you can reference them by their id or by their full name
# ignore=title-trailing-punctuation, T3
+
# verbosity should be a value between 1 and 3, the commandline -v flags take precedence over this
# verbosity = 2
+
# By default gitlint will ignore merge commits. Set to 'false' to disable.
# ignore-merge-commits=true
+
+# By default gitlint will ignore fixup commits. Set to 'false' to disable.
+# ignore-fixup-commits=true
+
+# By default gitlint will ignore squash commits. Set to 'false' to disable.
+# ignore-squash-commits=true
+
# Enable debug mode (prints more output). Disabled by default.
# debug=true
@@ -46,3 +56,27 @@
# By specifying this rule, developers can only change the file when they explicitly reference
# it in the commit message.
# files=gitlint/rules.py,README.md
+
+# [author-valid-email]
+# python like regex (https://docs.python.org/2/library/re.html) that the
+# commit author email address should be matched to
+# For example, use the following regex if you only want to allow email addresses from foo.com
+# regex=[^@]+@foo.com
+
+# [ignore-by-title]
+# Ignore certain rules for commits of which the title matches a regex
+# E.g. Match commit titles that start with "Release"
+# regex=^Release(.*)
+#
+# Ignore certain rules, you can reference them by their id or by their full name
+# Use 'all' to ignore all rules
+# ignore=T1,body-min-length
+
+# [ignore-by-body]
+# Ignore certain rules for commits of which the body has a line that matches a regex
+# E.g. Match bodies that have a line that that contain "release"
+# regex=(.*)release(.*)
+#
+# Ignore certain rules, you can reference them by their id or by their full name
+# Use 'all' to ignore all rules
+# ignore=T1,body-min-length
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint/git.py new/gitlint-0.11.0/gitlint/git.py
--- old/gitlint-0.8.2/gitlint/git.py 2017-03-14 10:16:31.000000000 +0100
+++ new/gitlint-0.11.0/gitlint/git.py 2019-03-13 12:27:10.000000000 +0100
@@ -11,6 +11,51 @@
pass
+class GitNotInstalledError(GitContextError):
+ def __init__(self):
+ super(GitNotInstalledError, self).__init__(
+ u"'git' command not found. You need to install git to use gitlint on a local repository. " +
+ u"See https://git-scm.com/book/en/v2/Getting-Started-Installing-Git on how to install git.")
+
+
+def _git(*command_parts, **kwargs):
+ """ Convenience function for running git commands. Automatically deals with exceptions and unicode. """
+ # Special arguments passed to sh: http://amoffat.github.io/sh/special_arguments.html
+ git_kwargs = {'_tty_out': False}
+ git_kwargs.update(kwargs)
+ try:
+ result = sh.git(*command_parts, **git_kwargs) # pylint: disable=unexpected-keyword-arg
+ # If we reach this point and the result has an exit_code that is larger than 0, this means that we didn't
+ # get an exception (which is the default sh behavior for non-zero exit codes) and so the user is expecting
+ # a non-zero exit code -> just return the entire result
+ if hasattr(result, 'exit_code') and result.exit_code > 0:
+ return result
+ return ustr(result)
+ except CommandNotFound:
+ raise GitNotInstalledError()
+ except ErrorReturnCode as e: # Something went wrong while executing the git command
+ error_msg = e.stderr.strip()
+ if '_cwd' in git_kwargs and b"not a git repository" in error_msg.lower():
+ error_msg = u"{0} is not a git repository.".format(git_kwargs['_cwd'])
+ else:
+ error_msg = u"An error occurred while executing '{0}': {1}".format(e.full_cmd, error_msg)
+ raise GitContextError(error_msg)
+
+
+def git_version():
+ """ Determine the git version installed on this host by calling git --version"""
+ return _git("--version").replace(u"\n", u"")
+
+
+def git_commentchar():
+ """ Shortcut for retrieving comment char from git config """
+ commentchar = _git("config", "--get", "core.commentchar", _ok_code=[1])
+ # git will return an exit code of 1 if it can't find a config value, in this case we fall-back to # as commentchar
+ if hasattr(commentchar, 'exit_code') and commentchar.exit_code == 1: # pylint: disable=no-member
+ commentchar = "#"
+ return ustr(commentchar).replace(u"\n", u"")
+
+
class GitCommitMessage(object):
""" Class representing a git commit message. A commit message consists of the following:
- original: The actual commit message as returned by `git log`
@@ -18,6 +63,8 @@
- title: the first line of full
- body: all lines following the title
"""
+ COMMENT_CHAR = git_commentchar()
+ CUTLINE = '{0} ------------------------ >8 ------------------------'.format(COMMENT_CHAR)
def __init__(self, original=None, full=None, title=None, body=None):
self.original = original
@@ -28,9 +75,14 @@
@staticmethod
def from_full_message(commit_msg_str):
""" Parses a full git commit message by parsing a given string into the different parts of a commit message """
- lines = [line for line in commit_msg_str.splitlines() if not line.startswith("#")]
+ all_lines = commit_msg_str.splitlines()
+ try:
+ cutline_index = all_lines.index(GitCommitMessage.CUTLINE)
+ except ValueError:
+ cutline_index = None
+ lines = [line for line in all_lines[:cutline_index] if not line.startswith(GitCommitMessage.COMMENT_CHAR)]
full = "\n".join(lines)
- title = lines[0] if len(lines) > 0 else ""
+ title = lines[0] if lines else ""
body = lines[1:] if len(lines) > 1 else []
return GitCommitMessage(original=commit_msg_str, full=full, title=title, body=body)
@@ -38,7 +90,7 @@
return self.full # pragma: no cover
def __str__(self):
- return sstr(self) # pragma: no cover
+ return sstr(self.__unicode__()) # pragma: no cover
def __repr__(self):
return self.__str__() # pragma: no cover
@@ -54,8 +106,9 @@
In the context of gitlint, only the git context and commit message are required.
"""
- def __init__(self, context, message, sha=None, date=None, author_name=None, author_email=None, parents=None,
- is_merge_commit=False, changed_files=None):
+ def __init__(self, context, message, sha=None, date=None, author_name=None, # pylint: disable=too-many-arguments
+ author_email=None, parents=None, is_merge_commit=None, is_fixup_commit=None,
+ is_squash_commit=None, changed_files=None):
self.context = context
self.message = message
self.sha = sha
@@ -64,15 +117,19 @@
self.author_email = author_email
# parent commit hashes
self.parents = parents or []
- self.is_merge_commit = is_merge_commit
self.changed_files = changed_files or []
+ # If it's not explicitely specified, we consider a commit a merge commit if its title starts with "Merge"
+ self.is_merge_commit = message.title.startswith(u"Merge") if is_merge_commit is None else is_merge_commit
+ self.is_fixup_commit = message.title.startswith(u"fixup!") if is_fixup_commit is None else is_fixup_commit
+ self.is_squash_commit = message.title.startswith(u"squash!") if is_squash_commit is None else is_squash_commit
+
def __unicode__(self):
format_str = u"Author: %s <%s>\nDate: %s\n%s" # pragma: no cover
return format_str % (self.author_name, self.author_email, self.date, ustr(self.message)) # pragma: no cover
def __str__(self):
- return sstr(self) # pragma: no cover
+ return sstr(self.__unicode__()) # pragma: no cover
def __repr__(self):
return self.__str__() # pragma: no cover
@@ -83,7 +140,8 @@
self.sha == other.sha and self.author_name == other.author_name and \
self.author_email == other.author_email and \
self.date == other.date and self.parents == other.parents and \
- self.is_merge_commit == other.is_merge_commit and self.changed_files == other.changed_files # noqa
+ self.is_merge_commit == other.is_merge_commit and self.is_fixup_commit == other.is_fixup_commit and \
+ self.is_squash_commit == other.is_squash_commit and self.changed_files == other.changed_files # noqa
class GitContext(object):
@@ -102,73 +160,55 @@
context = GitContext()
commit_msg_obj = GitCommitMessage.from_full_message(commit_msg_str)
- # For now, we consider a commit a merge commit if its title starts with "Merge"
- is_merge_commit = commit_msg_obj.title.startswith("Merge")
- commit = GitCommit(context, commit_msg_obj, is_merge_commit=is_merge_commit)
+ commit = GitCommit(context, commit_msg_obj)
context.commits.append(commit)
return context
@staticmethod
- def from_local_repository(repository_path, refspec="HEAD"):
+ def from_local_repository(repository_path, refspec=None):
""" Retrieves the git context from a local git repository.
:param repository_path: Path to the git repository to retrieve the context from
:param refspec: The commit(s) to retrieve
"""
context = GitContext()
- try:
- # Special arguments passed to sh: http://amoffat.github.io/sh/special_arguments.html
- sh_special_args = {
- '_tty_out': False,
- '_cwd': repository_path
- }
-
- sha_list = sh.git("rev-list",
- # If refspec contains a dot it is a range
- # eg HEAD^.., upstream/master...HEAD
- '--max-count={0}'.format(-1 if "." in refspec else 1),
- refspec, **sh_special_args).split()
-
- for sha in sha_list:
- # Get info from the local git repository: https://git-scm.com/docs/pretty-formats
- raw_commit = sh.git.log(sha, "-1", "--pretty=%aN,%aE,%ai,%P%n%B",
- **sh_special_args).split("\n")
-
- (name, email, date, parents), commit_msg = raw_commit[0].split(","), "\n".join(raw_commit[1:])
-
- commit_parents = parents.split(" ")
- commit_is_merge_commit = len(commit_parents) > 1
-
- # changed files in last commit
- changed_files = sh.git("diff-tree", "--no-commit-id", "--name-only",
- "-r", sha, **sh_special_args).split()
-
- # "YYYY-MM-DD HH:mm:ss Z" -> ISO 8601-like format
- # Use arrow for datetime parsing, because apparently python is quirky around ISO-8601 dates:
- # http://stackoverflow.com/a/30696682/381010
- commit_date = arrow.get(ustr(date), "YYYY-MM-DD HH:mm:ss Z").datetime
-
- # Create Git commit object with the retrieved info
- commit_msg_obj = GitCommitMessage.from_full_message(commit_msg)
- commit = GitCommit(context, commit_msg_obj, sha=sha, author_name=name,
- author_email=email, date=commit_date, changed_files=changed_files,
- parents=commit_parents, is_merge_commit=commit_is_merge_commit)
-
- context.commits.append(commit)
-
- except CommandNotFound:
- raise GitContextError(
- u"'git' command not found. You need to install git to use gitlint on a local repository. "
- u"See https://git-scm.com/book/en/v2/Getting-Started-Installing-Git on how to install git."
- )
- except ErrorReturnCode as e: # Something went wrong while executing the git command
- error_msg = e.stderr.strip()
- if b"Not a git repository" in error_msg:
- error_msg = u"{0} is not a git repository.".format(repository_path)
- else:
- error_msg = u"An error occurred while executing '{0}': {1}".format(e.full_cmd, error_msg)
- raise GitContextError(error_msg)
+
+ # If no refspec is defined, fallback to the last commit on the current branch
+ if refspec is None:
+ # We tried many things here e.g.: defaulting to e.g. HEAD or HEAD^... (incl. dealing with
+ # repos that only have a single commit - HEAD^... doesn't work there), but then we still get into
+ # problems with e.g. merge commits. Easiest solution is just taking the SHA from `git log -1`.
+ sha_list = [_git("log", "-1", "--pretty=%H", _cwd=repository_path).replace(u"\n", u"")]
+ else:
+ sha_list = _git("rev-list", refspec, _cwd=repository_path).split()
+
+ for sha in sha_list:
+ # Get info from the local git repository: https://git-scm.com/docs/pretty-formats
+ long_format = "--pretty=%aN%x00%aE%x00%ai%x00%P%n%B"
+ raw_commit = _git("log", sha, "-1", long_format, _cwd=repository_path).split("\n")
+
+ (name, email, date, parents), commit_msg = raw_commit[0].split('\x00'), "\n".join(raw_commit[1:])
+
+ commit_parents = parents.split(" ")
+ commit_is_merge_commit = len(commit_parents) > 1
+
+ # changed files in last commit
+ changed_files = _git("diff-tree", "--no-commit-id", "--name-only", "-r", sha, _cwd=repository_path).split()
+
+ # "YYYY-MM-DD HH:mm:ss Z" -> ISO 8601-like format
+ # Use arrow for datetime parsing, because apparently python is quirky around ISO-8601 dates:
+ # http://stackoverflow.com/a/30696682/381010
+ commit_date = arrow.get(ustr(date), "YYYY-MM-DD HH:mm:ss Z").datetime
+
+ # Create Git commit object with the retrieved info
+ commit_msg_obj = GitCommitMessage.from_full_message(commit_msg)
+
+ commit = GitCommit(context, commit_msg_obj, sha=sha, author_name=name,
+ author_email=email, date=commit_date, changed_files=changed_files,
+ parents=commit_parents, is_merge_commit=commit_is_merge_commit)
+
+ context.commits.append(commit)
return context
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint/lint.py new/gitlint-0.11.0/gitlint/lint.py
--- old/gitlint-0.8.2/gitlint/lint.py 2017-04-25 11:14:33.000000000 +0200
+++ new/gitlint-0.11.0/gitlint/lint.py 2019-03-13 10:29:52.000000000 +0100
@@ -1,6 +1,8 @@
+# pylint: disable=logging-not-lazy
import logging
from gitlint import rules as gitlint_rules
from gitlint import display
+from gitlint.utils import ustr
LOG = logging.getLogger(__name__)
logging.basicConfig()
@@ -14,25 +16,31 @@
self.display = display.Display(config)
- def ignore_rule(self, rule):
+ def should_ignore_rule(self, rule):
+ """ Determines whether a rule should be ignored based on the general list of commits to ignore """
return rule.id in self.config.ignore or rule.name in self.config.ignore
@property
+ def configuration_rules(self):
+ return [rule for rule in self.config.rules if
+ isinstance(rule, gitlint_rules.ConfigurationRule) and not self.should_ignore_rule(rule)]
+
+ @property
def title_line_rules(self):
return [rule for rule in self.config.rules if
isinstance(rule, gitlint_rules.LineRule) and
- rule.target == gitlint_rules.CommitMessageTitle and not self.ignore_rule(rule)]
+ rule.target == gitlint_rules.CommitMessageTitle and not self.should_ignore_rule(rule)]
@property
def body_line_rules(self):
return [rule for rule in self.config.rules if
isinstance(rule, gitlint_rules.LineRule) and
- rule.target == gitlint_rules.CommitMessageBody and not self.ignore_rule(rule)]
+ rule.target == gitlint_rules.CommitMessageBody and not self.should_ignore_rule(rule)]
@property
def commit_rules(self):
return [rule for rule in self.config.rules if isinstance(rule, gitlint_rules.CommitRule) and
- not self.ignore_rule(rule)]
+ not self.should_ignore_rule(rule)]
@staticmethod
def _apply_line_rules(lines, commit, rules, line_nr_start):
@@ -60,11 +68,20 @@
return all_violations
def lint(self, commit):
- """ Lint the last commit in a given git context by applying all title, body and general rules. """
+ """ Lint the last commit in a given git context by applying all ignore, title, body and commit rules. """
LOG.debug("Linting commit %s", commit.sha or "[SHA UNKNOWN]")
- # Skip linting if this is merge commit and if the config is set to ignore those
- if commit.is_merge_commit and self.config.ignore_merge_commits:
- return []
+ LOG.debug("Commit Object\n" + ustr(commit))
+
+ # Apply config rules
+ for rule in self.configuration_rules:
+ rule.apply(self.config, commit)
+
+ # Skip linting if this is a special commit type that is configured to be ignored
+ ignore_commit_types = ["merge", "squash", "fixup"]
+ for commit_type in ignore_commit_types:
+ if getattr(commit, "is_{0}_commit".format(commit_type)) and \
+ getattr(self.config, "ignore_{0}_commits".format(commit_type)):
+ return []
violations = []
# determine violations by applying all rules
@@ -72,17 +89,20 @@
violations.extend(self._apply_line_rules(commit.message.body, commit, self.body_line_rules, 2))
violations.extend(self._apply_commit_rules(self.commit_rules, commit))
- # sort violations by line number
- violations.sort(key=lambda v: (v.line_nr, v.rule_id)) # sort violations by line number and rule_id
+ # Sort violations by line number and rule_id. If there's no line nr specified (=common certain commit rules),
+ # we replace None with -1 so that it always get's placed first. Note that we need this to do this to support
+ # python 3, as None is not allowed in a list that is being sorted.
+ violations.sort(key=lambda v: (-1 if v.line_nr is None else v.line_nr, v.rule_id))
return violations
def print_violations(self, violations):
""" Print a given set of violations to the standard error output """
for v in violations:
- self.display.e(u"{0}: {1}".format(v.line_nr, v.rule_id), exact=True)
- self.display.ee(u"{0}: {1} {2}".format(v.line_nr, v.rule_id, v.message), exact=True)
+ line_nr = v.line_nr if v.line_nr else "-"
+ self.display.e(u"{0}: {1}".format(line_nr, v.rule_id), exact=True)
+ self.display.ee(u"{0}: {1} {2}".format(line_nr, v.rule_id, v.message), exact=True)
if v.content:
- self.display.eee(u"{0}: {1} {2}: \"{3}\"".format(v.line_nr, v.rule_id, v.message, v.content),
+ self.display.eee(u"{0}: {1} {2}: \"{3}\"".format(line_nr, v.rule_id, v.message, v.content),
exact=True)
else:
- self.display.eee(u"{0}: {1} {2}".format(v.line_nr, v.rule_id, v.message), exact=True)
+ self.display.eee(u"{0}: {1} {2}".format(line_nr, v.rule_id, v.message), exact=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint/rules.py new/gitlint-0.11.0/gitlint/rules.py
--- old/gitlint-0.8.2/gitlint/rules.py 2016-12-30 14:24:17.000000000 +0100
+++ new/gitlint-0.11.0/gitlint/rules.py 2019-03-13 10:29:52.000000000 +0100
@@ -1,9 +1,14 @@
+# pylint: disable=inconsistent-return-statements
import copy
+import logging
import re
from gitlint.options import IntOption, BoolOption, StrOption, ListOption
from gitlint.utils import sstr
+LOG = logging.getLogger(__name__)
+logging.basicConfig()
+
class Rule(object):
""" Class representing gitlint rules. """
@@ -36,6 +41,11 @@
return self.__str__() # pragma: no cover
+class ConfigurationRule(Rule):
+ """ Class representing rules that can dynamically change the configuration of gitlint during runtime. """
+ pass
+
+
class CommitRule(Rule):
""" Class representing rules that act on an entire commit at once """
pass
@@ -253,7 +263,7 @@
min_length = self.options['min-length'].value
body_message_no_newline = "".join([line for line in commit.message.body if line is not None])
actual_length = len(body_message_no_newline)
- if actual_length > 0 and actual_length < min_length:
+ if 0 < actual_length < min_length:
violation_message = "Body message is too short ({0}<{1})".format(actual_length, min_length)
return [RuleViolation(self.id, violation_message, body_message_no_newline, 3)]
@@ -286,3 +296,57 @@
violation_message = u"Body does not mention changed file '{0}'".format(needs_mentioned_file)
violations.append(RuleViolation(self.id, violation_message, None, len(commit.message.body) + 1))
return violations if violations else None
+
+
+class AuthorValidEmail(CommitRule):
+ name = "author-valid-email"
+ id = "M1"
+ options_spec = [StrOption('regex', "[^@ ]+@[^@ ]+\.[^@ ]+", "Regex that author email address should match")]
+
+ def validate(self, commit):
+ # Note that unicode is allowed in email addresses
+ # See http://stackoverflow.com/questions/3844431
+ # /are-email-addresses-allowed-to-contain-non-alphanumeric-characters
+ email_regex = re.compile(self.options['regex'].value, re.UNICODE)
+
+ if commit.author_email and not email_regex.match(commit.author_email):
+ return [RuleViolation(self.id, "Author email for commit is invalid", commit.author_email)]
+
+
+class IgnoreByTitle(ConfigurationRule):
+ name = "ignore-by-title"
+ id = "I1"
+ options_spec = [StrOption('regex', None, "Regex matching the titles of commits this rule should apply to"),
+ StrOption('ignore', "all", "Comman-seperate list of rules to ignore")]
+
+ def apply(self, config, commit):
+ title_regex = re.compile(self.options['regex'].value, re.UNICODE)
+
+ if title_regex.match(commit.message.title):
+ config.ignore = self.options['ignore'].value
+
+ message = u"Commit title '{0}' matches the regex '{1}', ignoring rules: {2}"
+ message = message.format(commit.message.title, self.options['regex'].value, self.options['ignore'].value)
+
+ LOG.debug("Ignoring commit because of rule '%s': %s", self.id, message)
+
+
+class IgnoreByBody(ConfigurationRule):
+ name = "ignore-by-body"
+ id = "I2"
+ options_spec = [StrOption('regex', None, "Regex matching lines of the body of commits this rule should apply to"),
+ StrOption('ignore', "all", "Comman-seperate list of rules to ignore")]
+
+ def apply(self, config, commit):
+ body_line_regex = re.compile(self.options['regex'].value, re.UNICODE)
+
+ for line in commit.message.body:
+ if body_line_regex.match(line):
+ config.ignore = self.options['ignore'].value
+
+ message = u"Commit message line '{0}' matches the regex '{1}', ignoring rules: {2}"
+ message = message.format(line, self.options['regex'].value, self.options['ignore'].value)
+
+ LOG.debug("Ignoring commit because of rule '%s': %s", self.id, message)
+ # No need to check other lines if we found a match
+ return
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint/user_rules.py new/gitlint-0.11.0/gitlint/user_rules.py
--- old/gitlint-0.8.2/gitlint/user_rules.py 2017-04-25 12:34:00.000000000 +0200
+++ new/gitlint-0.11.0/gitlint/user_rules.py 2019-03-13 10:29:52.000000000 +0100
@@ -41,7 +41,7 @@
modules.append(os.path.splitext(filename)[0])
# No need to continue if there are no modules specified
- if len(modules) == 0:
+ if not modules:
return []
# Append the extra rules path to python path so that we can import them
@@ -93,7 +93,7 @@
rules.LineRule.__name__, rules.CommitRule.__name__))
# Rules must have an id attribute
- if not hasattr(clazz, 'id') or clazz.id is None or len(clazz.id) == 0:
+ if not hasattr(clazz, 'id') or clazz.id is None or not clazz.id:
raise UserRuleError(u"User-defined rule class '{0}' must have an 'id' attribute".format(clazz.__name__))
# Rule id's cannot start with gitlint reserved letters
@@ -102,7 +102,7 @@
raise UserRuleError(msg.format(clazz.__name__, clazz.id[0]))
# Rules must have a name attribute
- if not hasattr(clazz, 'name') or clazz.name is None or len(clazz.name) == 0:
+ if not hasattr(clazz, 'name') or clazz.name is None or not clazz.name:
raise UserRuleError(u"User-defined rule class '{0}' must have a 'name' attribute".format(clazz.__name__))
# if set, options_spec must be a list of RuleOption
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint/utils.py new/gitlint-0.11.0/gitlint/utils.py
--- old/gitlint-0.8.2/gitlint/utils.py 2017-04-25 12:17:39.000000000 +0200
+++ new/gitlint-0.11.0/gitlint/utils.py 2019-03-13 10:29:52.000000000 +0100
@@ -1,4 +1,4 @@
-# pylint: disable=bad-option-value,unidiomatic-typecheck,undefined-variable
+# pylint: disable=bad-option-value,unidiomatic-typecheck,undefined-variable,no-else-return
import sys
from locale import getpreferredencoding
@@ -17,7 +17,10 @@
else:
return unicode(obj) # pragma: no cover # noqa
else:
- return str(obj)
+ if type(obj) in [bytes]:
+ return obj.decode(DEFAULT_ENCODING)
+ else:
+ return str(obj)
def sstr(obj):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint.egg-info/PKG-INFO new/gitlint-0.11.0/gitlint.egg-info/PKG-INFO
--- old/gitlint-0.8.2/gitlint.egg-info/PKG-INFO 2017-04-25 13:26:39.000000000 +0200
+++ new/gitlint-0.11.0/gitlint.egg-info/PKG-INFO 2019-03-13 14:16:59.000000000 +0100
@@ -1,13 +1,13 @@
Metadata-Version: 1.1
Name: gitlint
-Version: 0.8.2
+Version: 0.11.0
Summary: Git commit message linter written in python, checks your commit messages for style.
Home-page: https://github.com/jorisroovers/gitlint
Author: Joris Roovers
Author-email: UNKNOWN
License: MIT
Description:
- Great for use as a commit-msg git hook or as part of your gating script in a CI/CD pipeline (e.g. jenkins).
+ Great for use as a commit-msg git hook or as part of your gating script in a CI pipeline (e.g. jenkins, gitlab).
Many of the gitlint validations are based on `well-known`_ community_ `standards`_, others are based on checks that
we've found useful throughout the years. Gitlint has sane defaults, but you can also easily customize it to your
own liking.
@@ -29,12 +29,12 @@
Classifier: Development Status :: 5 - Production/Stable
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Environment :: Console
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/gitlint.egg-info/requires.txt new/gitlint-0.11.0/gitlint.egg-info/requires.txt
--- old/gitlint-0.8.2/gitlint.egg-info/requires.txt 2017-04-25 13:26:39.000000000 +0200
+++ new/gitlint-0.11.0/gitlint.egg-info/requires.txt 2019-03-13 14:16:59.000000000 +0100
@@ -1,9 +1,9 @@
-Click==6.6
+Click==6.7
arrow==0.10.0
-ordereddict==1.1
-[:python_version == "2.6"]
+[:python_version < "2.7"]
importlib==1.0.3
+ordereddict==1.1
[:sys_platform != "win32"]
-sh==1.11
+sh==1.12.14
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/setup.cfg new/gitlint-0.11.0/setup.cfg
--- old/gitlint-0.8.2/setup.cfg 2017-04-25 13:26:40.000000000 +0200
+++ new/gitlint-0.11.0/setup.cfg 2019-03-13 14:16:59.000000000 +0100
@@ -4,5 +4,4 @@
[egg_info]
tag_build =
tag_date = 0
-tag_svn_revision = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitlint-0.8.2/setup.py new/gitlint-0.11.0/setup.py
--- old/gitlint-0.8.2/setup.py 2017-03-14 10:22:45.000000000 +0100
+++ new/gitlint-0.11.0/setup.py 2019-03-13 13:26:51.000000000 +0100
@@ -1,7 +1,9 @@
#!/usr/bin/env python
+from __future__ import print_function
from setuptools import setup, find_packages
import re
import os
+import sys
# There is an issue with building python packages in a shared vagrant directory because of how setuptools works
# in python < 2.7.9. We solve this by deleting the filesystem hardlinking capability during build.
@@ -9,11 +11,11 @@
try:
del os.link
except:
- pass # Not all OSes (e.g. windows) support os.link
+ pass # Not all OSes (e.g. windows) support os.link
description = "Git commit message linter written in python, checks your commit messages for style."
long_description = """
-Great for use as a commit-msg git hook or as part of your gating script in a CI/CD pipeline (e.g. jenkins).
+Great for use as a commit-msg git hook or as part of your gating script in a CI pipeline (e.g. jenkins, gitlab).
Many of the gitlint validations are based on `well-known`_ community_ `standards`_, others are based on checks that
we've found useful throughout the years. Gitlint has sane defaults, but you can also easily customize it to your
own liking.
@@ -48,12 +50,12 @@
"Development Status :: 5 - Production/Stable",
"Operating System :: OS Independent",
"Programming Language :: Python",
- "Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
+ "Programming Language :: Python :: 3.7",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Environment :: Console",
@@ -63,16 +65,16 @@
"License :: OSI Approved :: MIT License"
],
install_requires=[
- 'Click==6.6',
- 'arrow==0.10.0',
- 'ordereddict==1.1',
+ 'Click==6.7',
+ 'arrow==0.10.0'
],
extras_require={
- ':python_version == "2.6"': [
+ ':python_version < "2.7"': [
'importlib==1.0.3',
+ 'ordereddict==1.1',
],
':sys_platform != "win32"': [
- 'sh==1.11',
+ 'sh==1.12.14',
],
},
keywords='gitlint git lint',
@@ -89,3 +91,9 @@
],
},
)
+
+# Print a red deprecation warning for python 2.6 users
+if sys.version_info[0] == 2 and sys.version_info[1] <= 6:
+ msg = "\033[31mDEPRECATION: Python 2.6 or below are no longer supported by gitlint or the Python core team." + \
+ "Please upgrade your Python to a later version.\033[0m"
+ print(msg)
++++++ relax-requirements.patch ++++++
diff -u -r gitlint-0.11.0/gitlint.egg-info/requires.txt gitlint-0.11.0.patched/gitlint.egg-info/requires.txt
--- gitlint-0.11.0/gitlint.egg-info/requires.txt 2019-03-13 14:16:59.000000000 +0100
+++ gitlint-0.11.0.patched/gitlint.egg-info/requires.txt 2019-07-04 15:34:32.604844335 +0200
@@ -1,9 +1,9 @@
-Click==6.7
-arrow==0.10.0
+Click>=6.7
+arrow>=0.10.0
[:python_version < "2.7"]
-importlib==1.0.3
-ordereddict==1.1
+importlib>=1.0.3
+ordereddict>=1.1
[:sys_platform != "win32"]
-sh==1.12.14
+sh>=1.12.14
diff -u -r gitlint-0.11.0/setup.py gitlint-0.11.0.patched/setup.py
--- gitlint-0.11.0/setup.py 2019-03-13 13:26:51.000000000 +0100
+++ gitlint-0.11.0.patched/setup.py 2019-07-04 15:33:46.932567901 +0200
@@ -65,16 +65,16 @@
"License :: OSI Approved :: MIT License"
],
install_requires=[
- 'Click==6.7',
- 'arrow==0.10.0'
+ 'Click>=6.7',
+ 'arrow>=0.10.0'
],
extras_require={
':python_version < "2.7"': [
- 'importlib==1.0.3',
- 'ordereddict==1.1',
+ 'importlib>=1.0.3',
+ 'ordereddict>=1.1',
],
':sys_platform != "win32"': [
- 'sh==1.12.14',
+ 'sh>=1.12.14',
],
},
keywords='gitlint git lint',
1
0
Hello community,
here is the log from the commit of package python-sphinxcontrib-httpdomain for openSUSE:Factory checked in at 2019-07-05 13:49:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-sphinxcontrib-httpdomain (Old)
and /work/SRC/openSUSE:Factory/.python-sphinxcontrib-httpdomain.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-sphinxcontrib-httpdomain"
Fri Jul 5 13:49:09 2019 rev:16 rq:713560 version:1.7.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-sphinxcontrib-httpdomain/python-sphinxcontrib-httpdomain.changes 2019-07-03 15:15:21.303007290 +0200
+++ /work/SRC/openSUSE:Factory/.python-sphinxcontrib-httpdomain.new.4615/python-sphinxcontrib-httpdomain.changes 2019-07-05 13:49:10.433495477 +0200
@@ -9 +9 @@
-- update to version 1.7.0
+- update to version 1.7.0 (bsc#1139695)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-sphinxcontrib-httpdomain.spec ++++++
--- /var/tmp/diff_new_pack.ZnDdjC/_old 2019-07-05 13:49:10.973496310 +0200
+++ /var/tmp/diff_new_pack.ZnDdjC/_new 2019-07-05 13:49:10.973496310 +0200
@@ -27,7 +27,6 @@
Source: https://github.com/sphinx-contrib/httpdomain/archive/%{version}.tar.gz
BuildRequires: %{python_module Flask >= 0.11}
BuildRequires: %{python_module Sphinx >= 1.5}
-BuildRequires: %{python_module Sphinx}
BuildRequires: %{python_module bottle >= 0.11.0}
BuildRequires: %{python_module pytest}
BuildRequires: %{python_module setuptools}
1
0
Hello community,
here is the log from the commit of package i2pd for openSUSE:Factory checked in at 2019-07-05 13:49:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/i2pd (Old)
and /work/SRC/openSUSE:Factory/.i2pd.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "i2pd"
Fri Jul 5 13:49:07 2019 rev:7 rq:713502 version:2.27.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/i2pd/i2pd.changes 2019-06-12 13:13:48.572847485 +0200
+++ /work/SRC/openSUSE:Factory/.i2pd.new.4615/i2pd.changes 2019-07-05 13:49:08.553492578 +0200
@@ -1,0 +2,10 @@
+Thu Jul 4 21:55:21 UTC 2019 - Alexei Podvalsky <avvissu(a)yandex.by>
+
+- Update to 2.27.0:
+ * Support of PSK and DH authentication for encrypted LeaseSet2
+ * Uptime is based on monotonic timer
+ * BOB status command response
+ * Correct NTCP2 port if NTCP is disabled
+ * Flood encrypted LeaseSet2 with store hash
+
+-------------------------------------------------------------------
Old:
----
i2pd-2.26.0.tar.gz
New:
----
i2pd-2.27.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ i2pd.spec ++++++
--- /var/tmp/diff_new_pack.UToUSH/_old 2019-07-05 13:49:09.193493565 +0200
+++ /var/tmp/diff_new_pack.UToUSH/_new 2019-07-05 13:49:09.197493571 +0200
@@ -19,7 +19,7 @@
%define sysuser i2pd
%define sysgroup i2pd
Name: i2pd
-Version: 2.26.0
+Version: 2.27.0
Release: 0
Summary: C++ implementation of an I2P client
License: BSD-3-Clause
++++++ i2pd-2.26.0.tar.gz -> i2pd-2.27.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/ChangeLog new/i2pd-2.27.0/ChangeLog
--- old/i2pd-2.26.0/ChangeLog 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/ChangeLog 2019-07-03 18:38:55.000000000 +0200
@@ -1,6 +1,16 @@
# for this file format description,
# see https://github.com/olivierlacan/keep-a-changelog
+## [2.27.0] - 2019-07-03
+### Added
+- Support of PSK and DH authentication for encrypted LeaseSet2
+### Changed
+- Uptime is based on monotonic timer
+### Fixed
+- BOB status command response
+- Correct NTCP2 port if NTCP is disabled
+- Flood encrypted LeaseSet2 with store hash
+
## [2.26.0] - 2019-06-07
### Added
- HTTP method "PROPFIND"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/Win32/installer.iss new/i2pd-2.27.0/Win32/installer.iss
--- old/i2pd-2.26.0/Win32/installer.iss 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/Win32/installer.iss 2019-07-03 18:38:55.000000000 +0200
@@ -1,5 +1,5 @@
#define I2Pd_AppName "i2pd"
-#define I2Pd_ver "2.26.0"
+#define I2Pd_ver "2.27.0"
#define I2Pd_Publisher "PurpleI2P"
[Setup]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/android/build.gradle new/i2pd-2.27.0/android/build.gradle
--- old/i2pd-2.26.0/android/build.gradle 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/android/build.gradle 2019-07-03 18:38:55.000000000 +0200
@@ -29,8 +29,8 @@
applicationId "org.purplei2p.i2pd"
targetSdkVersion 28
minSdkVersion 14
- versionCode 2260
- versionName "2.26.0"
+ versionCode 2270
+ versionName "2.27.0"
ndk {
abiFilters 'armeabi-v7a'
abiFilters 'x86'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/appveyor.yml new/i2pd-2.27.0/appveyor.yml
--- old/i2pd-2.26.0/appveyor.yml 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/appveyor.yml 2019-07-03 18:38:55.000000000 +0200
@@ -1,4 +1,4 @@
-version: 2.26.0.{build}
+version: 2.27.0.{build}
pull_requests:
do_not_increment_build_number: true
branches:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/contrib/rpm/i2pd-git.spec new/i2pd-2.27.0/contrib/rpm/i2pd-git.spec
--- old/i2pd-2.26.0/contrib/rpm/i2pd-git.spec 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/contrib/rpm/i2pd-git.spec 2019-07-03 18:38:55.000000000 +0200
@@ -1,7 +1,7 @@
%define git_hash %(git rev-parse HEAD | cut -c -7)
Name: i2pd-git
-Version: 2.26.0
+Version: 2.27.0
Release: git%{git_hash}%{?dist}
Summary: I2P router written in C++
Conflicts: i2pd
@@ -110,6 +110,9 @@
%changelog
+* Wed Jul 3 2019 orignal <i2porignal(a)yandex.ru> - 2.27.0
+- update to 2.27.0
+
* Fri Jun 7 2019 orignal <i2porignal(a)yandex.ru> - 2.26.0
- update to 2.26.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/contrib/rpm/i2pd.spec new/i2pd-2.27.0/contrib/rpm/i2pd.spec
--- old/i2pd-2.26.0/contrib/rpm/i2pd.spec 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/contrib/rpm/i2pd.spec 2019-07-03 18:38:55.000000000 +0200
@@ -1,5 +1,5 @@
Name: i2pd
-Version: 2.26.0
+Version: 2.27.0
Release: 1%{?dist}
Summary: I2P router written in C++
Conflicts: i2pd-git
@@ -108,6 +108,9 @@
%changelog
+* Wed Jul 3 2019 orignal <i2porignal(a)yandex.ru> - 2.27.0
+- update to 2.27.0
+
* Fri Jun 7 2019 orignal <i2porignal(a)yandex.ru> - 2.26.0
- update to 2.26.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/debian/changelog new/i2pd-2.27.0/debian/changelog
--- old/i2pd-2.26.0/debian/changelog 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/debian/changelog 2019-07-03 18:38:55.000000000 +0200
@@ -1,3 +1,9 @@
+i2pd (2.27.0-1) unstable; urgency=medium
+
+ * updated to version 2.27.0/0.9.41
+
+ -- orignal <orignal(a)i2pmail.org> Wed, 3 Jul 2019 16:00:00 +0000
+
i2pd (2.26.0-1) unstable; urgency=medium
* updated to version 2.26.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/Crypto.cpp new/i2pd-2.27.0/libi2pd/Crypto.cpp
--- old/i2pd-2.26.0/libi2pd/Crypto.cpp 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/Crypto.cpp 2019-07-03 18:38:55.000000000 +0200
@@ -296,11 +296,20 @@
#if OPENSSL_X25519
m_Pkey = EVP_PKEY_new_raw_private_key (EVP_PKEY_X25519, NULL, priv, 32);
m_Ctx = EVP_PKEY_CTX_new (m_Pkey, NULL);
- memcpy (m_PublicKey, pub, 32); // TODO: verify against m_Pkey
+ if (pub)
+ memcpy (m_PublicKey, pub, 32); // TODO: verify against m_Pkey
+ else
+ {
+ size_t len = 32;
+ EVP_PKEY_get_raw_public_key (m_Pkey, m_PublicKey, &len);
+ }
#else
+ m_Ctx = BN_CTX_new ();
memcpy (m_PrivateKey, priv, 32);
- memcpy (m_PublicKey, pub, 32);
- m_Ctx = BN_CTX_new ();
+ if (pub)
+ memcpy (m_PublicKey, pub, 32);
+ else
+ GetEd25519 ()->ScalarMulB (m_PrivateKey, m_PublicKey, m_Ctx);
#endif
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/Crypto.h new/i2pd-2.27.0/libi2pd/Crypto.h
--- old/i2pd-2.26.0/libi2pd/Crypto.h 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/Crypto.h 2019-07-03 18:38:55.000000000 +0200
@@ -74,7 +74,7 @@
public:
X25519Keys ();
- X25519Keys (const uint8_t * priv, const uint8_t * pub); // for RouterContext
+ X25519Keys (const uint8_t * priv, const uint8_t * pub); // if pub is null, derive from priv
~X25519Keys ();
void GenerateKeys ();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/Destination.cpp new/i2pd-2.27.0/libi2pd/Destination.cpp
--- old/i2pd-2.26.0/libi2pd/Destination.cpp 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/Destination.cpp 2019-07-03 18:38:55.000000000 +0200
@@ -70,6 +70,16 @@
it = params->find (I2CP_PARAM_LEASESET_TYPE);
if (it != params->end ())
m_LeaseSetType = std::stoi(it->second);
+ it = params->find (I2CP_PARAM_LEASESET_PRIV_KEY);
+ if (it != params->end ())
+ {
+ m_LeaseSetPrivKey.reset (new i2p::data::Tag<32>());
+ if (m_LeaseSetPrivKey->FromBase64 (it->second) != 32)
+ {
+ LogPrint(eLogError, "Destination: invalid value i2cp.leaseSetPrivKey ", it->second);
+ m_LeaseSetPrivKey.reset (nullptr);
+ }
+ }
}
}
catch (std::exception & ex)
@@ -422,7 +432,7 @@
auto it2 = m_LeaseSetRequests.find (key);
if (it2 != m_LeaseSetRequests.end () && it2->second->requestedBlindedKey)
{
- auto ls2 = std::make_shared<i2p::data::LeaseSet2> (buf + offset, len - offset, it2->second->requestedBlindedKey);
+ auto ls2 = std::make_shared<i2p::data::LeaseSet2> (buf + offset, len - offset, it2->second->requestedBlindedKey, m_LeaseSetPrivKey ? *m_LeaseSetPrivKey : nullptr);
if (ls2->IsValid ())
{
m_RemoteLeaseSets[ls2->GetIdentHash ()] = ls2; // ident is not key
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/Destination.h new/i2pd-2.27.0/libi2pd/Destination.h
--- old/i2pd-2.26.0/libi2pd/Destination.h 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/Destination.h 2019-07-03 18:38:55.000000000 +0200
@@ -55,6 +55,7 @@
const char I2CP_PARAM_LEASESET_TYPE[] = "i2cp.leaseSetType";
const int DEFAULT_LEASESET_TYPE = 1;
const char I2CP_PARAM_LEASESET_ENCRYPTION_TYPE[] = "i2cp.leaseSetEncType";
+ const char I2CP_PARAM_LEASESET_PRIV_KEY[] = "i2cp.leaseSetPrivKey"; // PSK decryption key, base64
// latency
const char I2CP_PARAM_MIN_TUNNEL_LATENCY[] = "latency.min";
@@ -175,6 +176,7 @@
m_PublishDelayTimer, m_CleanupTimer;
std::string m_Nickname;
int m_LeaseSetType;
+ std::unique_ptr<i2p::data::Tag<32> > m_LeaseSetPrivKey; // non-null if presented
public:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/I2NPProtocol.cpp new/i2pd-2.27.0/libi2pd/I2NPProtocol.cpp
--- old/i2pd-2.26.0/libi2pd/I2NPProtocol.cpp 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/I2NPProtocol.cpp 2019-07-03 18:38:55.000000000 +0200
@@ -258,12 +258,12 @@
return m;
}
- std::shared_ptr<I2NPMessage> CreateDatabaseStoreMsg (std::shared_ptr<const i2p::data::LeaseSet> leaseSet)
+ std::shared_ptr<I2NPMessage> CreateDatabaseStoreMsg (const i2p::data::IdentHash& storeHash, std::shared_ptr<const i2p::data::LeaseSet> leaseSet)
{
if (!leaseSet) return nullptr;
auto m = NewI2NPShortMessage ();
uint8_t * payload = m->GetPayload ();
- memcpy (payload + DATABASE_STORE_KEY_OFFSET, leaseSet->GetIdentHash (), 32);
+ memcpy (payload + DATABASE_STORE_KEY_OFFSET, storeHash, 32);
payload[DATABASE_STORE_TYPE_OFFSET] = leaseSet->GetStoreType (); // 1 for LeaseSet
htobe32buf (payload + DATABASE_STORE_REPLY_TOKEN_OFFSET, 0);
size_t size = DATABASE_STORE_HEADER_SIZE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/I2NPProtocol.h new/i2pd-2.27.0/libi2pd/I2NPProtocol.h
--- old/i2pd-2.26.0/libi2pd/I2NPProtocol.h 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/I2NPProtocol.h 2019-07-03 18:38:55.000000000 +0200
@@ -247,7 +247,7 @@
std::shared_ptr<I2NPMessage> CreateDatabaseSearchReply (const i2p::data::IdentHash& ident, std::vector<i2p::data::IdentHash> routers);
std::shared_ptr<I2NPMessage> CreateDatabaseStoreMsg (std::shared_ptr<const i2p::data::RouterInfo> router = nullptr, uint32_t replyToken = 0);
- std::shared_ptr<I2NPMessage> CreateDatabaseStoreMsg (std::shared_ptr<const i2p::data::LeaseSet> leaseSet); // for floodfill only
+ std::shared_ptr<I2NPMessage> CreateDatabaseStoreMsg (const i2p::data::IdentHash& storeHash, std::shared_ptr<const i2p::data::LeaseSet> leaseSet); // for floodfill only
std::shared_ptr<I2NPMessage> CreateDatabaseStoreMsg (std::shared_ptr<const i2p::data::LocalLeaseSet> leaseSet, uint32_t replyToken = 0, std::shared_ptr<const i2p::tunnel::InboundTunnel> replyTunnel = nullptr);
bool IsRouterInfoMsg (std::shared_ptr<I2NPMessage> msg);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/LeaseSet.cpp new/i2pd-2.27.0/libi2pd/LeaseSet.cpp
--- old/i2pd-2.26.0/libi2pd/LeaseSet.cpp 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/LeaseSet.cpp 2019-07-03 18:38:55.000000000 +0200
@@ -479,7 +479,7 @@
}
else
{
- LogPrint (eLogError, "LeaseSet2: Unexpected blinded key type ", blindedKeyType, " instread ", key->GetBlindedSigType ());
+ LogPrint (eLogError, "LeaseSet2: Unexpected blinded key type ", blindedKeyType, " instead ", key->GetBlindedSigType ());
return;
}
// outer key
@@ -506,7 +506,7 @@
if (authDataLen > 0)
{
memcpy (innerInput + 32, subcredential, 36);
- i2p::crypto::HKDF (outerPlainText.data () + 1, innerInput, 68, "ELS2_L2K", keys);
+ i2p::crypto::HKDF (outerPlainText.data () + 1 + authDataLen, innerInput, 68, "ELS2_L2K", keys);
}
else
// no authData presented, innerInput = subcredential || publishedTimestamp
@@ -531,40 +531,75 @@
}
}
+ // helper for ExtractClientAuthData
+ static inline bool GetAuthCookie (const uint8_t * authClients, int numClients, const uint8_t * okm, uint8_t * authCookie)
+ {
+ // try to find clientCookie_i for clientID_i = okm[44:51]
+ for (int i = 0; i < numClients; i++)
+ {
+ if (!memcmp (okm + 44, authClients + i*40, 8)) // clientID_i
+ {
+ // clientKey_i = okm[0:31]
+ // clientIV_i = okm[32:43]
+ i2p::crypto::ChaCha20 (authClients + i*40 + 8, 32, okm, okm + 32, authCookie); // clientCookie_i
+ return true;
+ }
+ }
+ return false;
+ }
+
size_t LeaseSet2::ExtractClientAuthData (const uint8_t * buf, size_t len, const uint8_t * secret, const uint8_t * subcredential, uint8_t * authCookie) const
{
size_t offset = 0;
uint8_t flag = buf[offset]; offset++; // flag
if (flag & 0x01) // client auth
{
- if (flag & 0x02) // PSK, bit 1 is set to 1
+ if (!(flag & 0x0E)) // DH, bit 1-3 all zeroes
+ {
+ const uint8_t * ephemeralPublicKey = buf + offset; offset += 32; // ephemeralPublicKey
+ uint16_t numClients = bufbe16toh (buf + offset); offset += 2; // clients
+ const uint8_t * authClients = buf + offset; offset += numClients*40; // authClients
+ if (offset > len)
+ {
+ LogPrint (eLogError, "LeaseSet2: Too many clients ", numClients, " in DH auth data");
+ return 0;
+ }
+ // calculate authCookie
+ if (secret)
+ {
+ i2p::crypto::X25519Keys ck (secret, nullptr); // derive cpk_i from csk_i
+ uint8_t authInput[100];
+ ck.Agree (ephemeralPublicKey, authInput); // sharedSecret is first 32 bytes of authInput
+ memcpy (authInput + 32, ck.GetPublicKey (), 32); // cpk_i
+ memcpy (authInput + 64, subcredential, 36);
+ uint8_t okm[64]; // 52 actual data
+ i2p::crypto::HKDF (ephemeralPublicKey, authInput, 100, "ELS2_XCA", okm);
+ if (!GetAuthCookie (authClients, numClients, okm, authCookie))
+ LogPrint (eLogError, "LeaseSet2: Client cookie DH not found");
+ }
+ else
+ LogPrint (eLogError, "LeaseSet2: Can't calculate authCookie: csk_i is not provided");
+ }
+ else if (flag & 0x02) // PSK, bit 1 is set to 1
{
const uint8_t * authSalt = buf + offset; offset += 32; // authSalt
uint16_t numClients = bufbe16toh (buf + offset); offset += 2; // clients
const uint8_t * authClients = buf + offset; offset += numClients*40; // authClients
+ if (offset > len)
+ {
+ LogPrint (eLogError, "LeaseSet2: Too many clients ", numClients, " in PSK auth data");
+ return 0;
+ }
// calculate authCookie
if (secret)
{
uint8_t authInput[68];
memcpy (authInput, secret, 32);
- memcpy (authInput, subcredential, 36);
+ memcpy (authInput + 32, subcredential, 36);
uint8_t okm[64]; // 52 actual data
i2p::crypto::HKDF (authSalt, authInput, 68, "ELS2PSKA", okm);
- // try to find clientCookie_i for clientID_i = okm[44:51]
- bool found = false;
- for (int i = 0; i < numClients; i++)
- {
- if (!memcmp (okm + 44, authClients + i*40, 8)) // clientID_i
- {
- // clientKey_i = okm[0:31]
- // clientIV_i = okm[32:43]
- i2p::crypto::ChaCha20 (authClients + i*40 + 8, 32, okm, okm + 32, authCookie); // clientCookie_i
- found = true;
- break;
- }
- }
- if (!found)
- LogPrint (eLogError, "LeaseSet2: Client cookie not found");
+ if (!GetAuthCookie (authClients, numClients, okm, authCookie))
+ LogPrint (eLogError, "LeaseSet2: Client cookie PSK not found");
}
else
LogPrint (eLogError, "LeaseSet2: Can't calculate authCookie: psk_i is not provided");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/NTCP2.cpp new/i2pd-2.27.0/libi2pd/NTCP2.cpp
--- old/i2pd-2.26.0/libi2pd/NTCP2.cpp 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/NTCP2.cpp 2019-07-03 18:38:55.000000000 +0200
@@ -396,6 +396,10 @@
{
m_IsTerminated = true;
m_IsEstablished = false;
+ boost::system::error_code ec;
+ m_Socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
+ if (ec)
+ LogPrint (eLogDebug, "NTCP2: Couldn't shutdown socket: ", ec.message ());
m_Socket.close ();
transports.PeerDisconnected (shared_from_this ());
m_Server.RemoveNTCP2Session (shared_from_this ());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/NetDb.cpp new/i2pd-2.27.0/libi2pd/NetDb.cpp
--- old/i2pd-2.26.0/libi2pd/NetDb.cpp 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/NetDb.cpp 2019-07-03 18:38:55.000000000 +0200
@@ -523,9 +523,10 @@
auto total = m_RouterInfos.size ();
uint64_t expirationTimeout = NETDB_MAX_EXPIRATION_TIMEOUT*1000LL;
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch();
+ auto uptime = i2p::context.GetUptime ();
// routers don't expire if less than 90 or uptime is less than 1 hour
- bool checkForExpiration = total > NETDB_MIN_ROUTERS && ts > (i2p::context.GetStartupTime () + 600)*1000LL; // 10 minutes
- if (checkForExpiration && ts > (i2p::context.GetStartupTime () + 3600)*1000LL) // 1 hour
+ bool checkForExpiration = total > NETDB_MIN_ROUTERS && uptime > 600; // 10 minutes
+ if (checkForExpiration && uptime > 3600) // 1 hour
expirationTimeout = i2p::context.IsFloodfill () ? NETDB_FLOODFILL_EXPIRATION_TIMEOUT*1000LL :
NETDB_MIN_EXPIRATION_TIMEOUT*1000LL + (NETDB_MAX_EXPIRATION_TIMEOUT - NETDB_MIN_EXPIRATION_TIMEOUT)*1000LL*NETDB_MIN_ROUTERS/total;
@@ -909,7 +910,7 @@
else if (!leaseSet->IsExpired ()) // we don't send back our LeaseSets
{
LogPrint (eLogDebug, "NetDb: requested LeaseSet ", key, " found");
- replyMsg = CreateDatabaseStoreMsg (leaseSet);
+ replyMsg = CreateDatabaseStoreMsg (ident, leaseSet);
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/RouterContext.cpp new/i2pd-2.27.0/libi2pd/RouterContext.cpp
--- old/i2pd-2.26.0/libi2pd/RouterContext.cpp 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/RouterContext.cpp 2019-07-03 18:38:55.000000000 +0200
@@ -19,7 +19,7 @@
RouterContext::RouterContext ():
m_LastUpdateTime (0), m_AcceptsTunnels (true), m_IsFloodfill (false),
- m_StartupTime (0), m_ShareRatio (100), m_Status (eRouterStatusOK),
+ m_ShareRatio (100), m_Status (eRouterStatusOK),
m_Error (eRouterErrorNone), m_NetID (I2PD_NET_ID)
{
}
@@ -27,7 +27,7 @@
void RouterContext::Init ()
{
srand (i2p::util::GetMillisecondsSinceEpoch () % 1000);
- m_StartupTime = i2p::util::GetSecondsSinceEpoch ();
+ m_StartupTime = std::chrono::steady_clock::now();
if (!Load ())
CreateNewRouter ();
m_Decryptor = m_Keys.CreateDecryptor (nullptr);
@@ -183,17 +183,18 @@
void RouterContext::PublishNTCP2Address (int port, bool publish, bool v4only)
{
if (!m_NTCP2Keys) return;
- if (!port)
- {
- port = rand () % (30777 - 9111) + 9111; // I2P network ports range
- if (port == 9150) port = 9151; // Tor browser
- }
bool updated = false;
for (auto& address : m_RouterInfo.GetAddresses ())
{
if (address->IsNTCP2 () && (address->port != port || address->ntcp2->isPublished != publish) && (!v4only || address->host.is_v4 ()))
{
- address->port = port;
+ if (!port && !address->port)
+ {
+ // select random port only if address's port is not set
+ port = rand () % (30777 - 9111) + 9111; // I2P network ports range
+ if (port == 9150) port = 9151; // Tor browser
+ }
+ if (port) address->port = port;
address->cost = publish ? 3 : 14;
address->ntcp2->isPublished = publish;
address->ntcp2->iv = m_NTCP2Keys->iv;
@@ -715,7 +716,7 @@
uint32_t RouterContext::GetUptime () const
{
- return i2p::util::GetSecondsSinceEpoch () - m_StartupTime;
+ return std::chrono::duration_cast<std::chrono::seconds> (std::chrono::steady_clock::now() - m_StartupTime).count ();
}
bool RouterContext::Decrypt (const uint8_t * encrypted, uint8_t * data, BN_CTX * ctx) const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/RouterContext.h new/i2pd-2.27.0/libi2pd/RouterContext.h
--- old/i2pd-2.26.0/libi2pd/RouterContext.h 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/RouterContext.h 2019-07-03 18:38:55.000000000 +0200
@@ -5,6 +5,7 @@
#include <string>
#include <memory>
#include <mutex>
+#include <chrono>
#include <boost/asio.hpp>
#include "Identity.h"
#include "RouterInfo.h"
@@ -64,8 +65,7 @@
const uint8_t * GetNTCP2IV () const { return m_NTCP2Keys ? m_NTCP2Keys->iv : nullptr; };
i2p::crypto::X25519Keys& GetStaticKeys ();
- uint32_t GetUptime () const;
- uint32_t GetStartupTime () const { return m_StartupTime; };
+ uint32_t GetUptime () const; // in seconds
uint64_t GetLastUpdateTime () const { return m_LastUpdateTime; };
uint64_t GetBandwidthLimit () const { return m_BandwidthLimit; };
uint64_t GetTransitBandwidthLimit () const { return (m_BandwidthLimit*m_ShareRatio)/100LL; };
@@ -137,7 +137,7 @@
std::shared_ptr<i2p::crypto::CryptoKeyDecryptor> m_Decryptor;
uint64_t m_LastUpdateTime; // in seconds
bool m_AcceptsTunnels, m_IsFloodfill;
- uint64_t m_StartupTime; // in seconds since epoch
+ std::chrono::time_point<std::chrono::steady_clock> m_StartupTime;
uint64_t m_BandwidthLimit; // allowed bandwidth
int m_ShareRatio;
RouterStatus m_Status;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/Tag.h new/i2pd-2.27.0/libi2pd/Tag.h
--- old/i2pd-2.26.0/libi2pd/Tag.h 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/Tag.h 2019-07-03 18:38:55.000000000 +0200
@@ -71,14 +71,14 @@
return std::string (str, str + l);
}
- void FromBase32 (const std::string& s)
+ size_t FromBase32 (const std::string& s)
{
- i2p::data::Base32ToByteStream (s.c_str (), s.length (), m_Buf, sz);
+ return i2p::data::Base32ToByteStream (s.c_str (), s.length (), m_Buf, sz);
}
- void FromBase64 (const std::string& s)
+ size_t FromBase64 (const std::string& s)
{
- i2p::data::Base64ToByteStream (s.c_str (), s.length (), m_Buf, sz);
+ return i2p::data::Base64ToByteStream (s.c_str (), s.length (), m_Buf, sz);
}
private:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/Transports.cpp new/i2pd-2.27.0/libi2pd/Transports.cpp
--- old/i2pd-2.26.0/libi2pd/Transports.cpp 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/Transports.cpp 2019-07-03 18:38:55.000000000 +0200
@@ -562,7 +562,10 @@
{
auto addr = router->GetSSUV6Address ();
if (addr)
- m_SSUServer->CreateDirectSession (router, { addr->host, (uint16_t)addr->port }, false);
+ m_SSUServer->GetServiceV6 ().post ([this, router, addr]
+ {
+ m_SSUServer->CreateDirectSession (router, { addr->host, (uint16_t)addr->port }, false);
+ });
}
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/util.h new/i2pd-2.27.0/libi2pd/util.h
--- old/i2pd-2.26.0/libi2pd/util.h 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/util.h 2019-07-03 18:38:55.000000000 +0200
@@ -46,7 +46,7 @@
{
auto tmp = m_Head;
m_Head = static_cast<T*>(*(void * *)m_Head); // next
- delete tmp;
+ ::operator delete ((void *)tmp);
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd/version.h new/i2pd-2.27.0/libi2pd/version.h
--- old/i2pd-2.26.0/libi2pd/version.h 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd/version.h 2019-07-03 18:38:55.000000000 +0200
@@ -7,7 +7,7 @@
#define MAKE_VERSION(a,b,c) STRINGIZE(a) "." STRINGIZE(b) "." STRINGIZE(c)
#define I2PD_VERSION_MAJOR 2
-#define I2PD_VERSION_MINOR 26
+#define I2PD_VERSION_MINOR 27
#define I2PD_VERSION_MICRO 0
#define I2PD_VERSION_PATCH 0
#define I2PD_VERSION MAKE_VERSION(I2PD_VERSION_MAJOR, I2PD_VERSION_MINOR, I2PD_VERSION_MICRO)
@@ -21,7 +21,7 @@
#define I2P_VERSION_MAJOR 0
#define I2P_VERSION_MINOR 9
-#define I2P_VERSION_MICRO 40
+#define I2P_VERSION_MICRO 41
#define I2P_VERSION_PATCH 0
#define I2P_VERSION MAKE_VERSION(I2P_VERSION_MAJOR, I2P_VERSION_MINOR, I2P_VERSION_MICRO)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd_client/BOB.cpp new/i2pd-2.27.0/libi2pd_client/BOB.cpp
--- old/i2pd-2.26.0/libi2pd_client/BOB.cpp 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd_client/BOB.cpp 2019-07-03 18:38:55.000000000 +0200
@@ -341,17 +341,17 @@
SendReplyOK();
}
- void BOBCommandSession::SendData (const char * data)
+ void BOBCommandSession::SendRaw (const char * data)
{
std::ostream os(&m_SendBuffer);
- os << "DATA " << data << std::endl;
+ os << data << std::endl;
}
void BOBCommandSession::BuildStatusLine(bool currentTunnel, BOBDestination *dest, std::string &out)
{
// helper lambdas
- const auto isset = [](const std::string &str) { return str.empty() ? "not_set" : str; }; // for inhost, outhost
- const auto issetNum = [&isset](const int p) { return isset(p == 0 ? "" : std::to_string(p)); }; // for inport, outport
+ const auto issetStr = [](const std::string &str) { return str.empty() ? "not_set" : str; }; // for inhost, outhost
+ const auto issetNum = [&issetStr](const int p) { return issetStr(p == 0 ? "" : std::to_string(p)); }; // for inport, outport
const auto destExists = [](const BOBDestination * const dest) { return dest != nullptr; };
const auto destReady = [](const BOBDestination * const dest) { return dest->GetLocalDestination()->IsReady(); };
const auto bool_str = [](const bool v) { return v ? "true" : "false"; }; // bool -> str
@@ -359,8 +359,8 @@
// tunnel info
const std::string nickname = currentTunnel ? m_Nickname : dest->GetNickname();
const bool quiet = currentTunnel ? m_IsQuiet : dest->GetQuiet();
- const std::string inhost = isset(currentTunnel ? m_InHost : dest->GetInHost());
- const std::string outhost = isset(currentTunnel ? m_OutHost : dest->GetOutHost());
+ const std::string inhost = issetStr(currentTunnel ? m_InHost : dest->GetInHost());
+ const std::string outhost = issetStr(currentTunnel ? m_OutHost : dest->GetOutHost());
const std::string inport = issetNum(currentTunnel ? m_InPort : dest->GetInPort());
const std::string outport = issetNum(currentTunnel ? m_OutPort : dest->GetOutPort());
const bool keys = destExists(dest); // key must exist when destination is created
@@ -370,7 +370,8 @@
// build line
std::stringstream ss;
- ss << "NICKNAME: " << nickname << " " << "STARTING: " << bool_str(starting) << " "
+ ss << "DATA "
+ << "NICKNAME: " << nickname << " " << "STARTING: " << bool_str(starting) << " "
<< "RUNNING: " << bool_str(running) << " " << "STOPPING: " << bool_str(stopping) << " "
<< "KEYS: " << bool_str(keys) << " " << "QUIET: " << bool_str(quiet) << " "
<< "INPORT: " << inport << " " << "INHOST: " << inhost << " "
@@ -654,16 +655,16 @@
for (const auto& it: destinations)
{
BuildStatusLine(false, it.second, statusLine);
- SendData (statusLine.c_str());
+ SendRaw(statusLine.c_str());
if(m_Nickname.compare(it.second->GetNickname()) == 0)
sentCurrent = true;
}
if(!sentCurrent && !m_Nickname.empty())
{
- // add the current tunnel to the list
+ // add the current tunnel to the list.
+ // this is for the incomplete tunnel which has not been started yet.
BuildStatusLine(true, m_CurrentDestination, statusLine);
- LogPrint(eLogError, statusLine);
- SendData(statusLine.c_str());
+ SendRaw(statusLine.c_str());
}
SendReplyOK ("Listing done");
}
@@ -690,21 +691,23 @@
void BOBCommandSession::StatusCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: status ", operand);
+ const std::string name = operand;
std::string statusLine;
- if (m_Nickname == operand)
+
+ // always prefer destination
+ auto ptr = m_Owner.FindDestination(name);
+ if(ptr != nullptr)
{
- // check current tunnel
- BuildStatusLine(true, nullptr, statusLine);
+ // tunnel destination exists
+ BuildStatusLine(false, ptr, statusLine);
SendReplyOK(statusLine.c_str());
}
else
{
- // check other
- std::string name = operand;
- auto ptr = m_Owner.FindDestination(name);
- if(ptr != nullptr)
+ if(m_Nickname == name && !name.empty())
{
- BuildStatusLine(false, ptr, statusLine);
+ // tunnel is incomplete / has not been started yet
+ BuildStatusLine(true, nullptr, statusLine);
SendReplyOK(statusLine.c_str());
}
else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd_client/BOB.h new/i2pd-2.27.0/libi2pd_client/BOB.h
--- old/i2pd-2.26.0/libi2pd_client/BOB.h 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd_client/BOB.h 2019-07-03 18:38:55.000000000 +0200
@@ -213,7 +213,7 @@
void HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void SendReplyOK (const char * msg = nullptr);
void SendReplyError (const char * msg);
- void SendData (const char * data);
+ void SendRaw (const char * data);
void BuildStatusLine(bool currentTunnel, BOBDestination *destination, std::string &out);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/libi2pd_client/ClientContext.cpp new/i2pd-2.27.0/libi2pd_client/ClientContext.cpp
--- old/i2pd-2.26.0/libi2pd_client/ClientContext.cpp 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/libi2pd_client/ClientContext.cpp 2019-07-03 18:38:55.000000000 +0200
@@ -395,6 +395,8 @@
options[I2CP_PARAM_LEASESET_TYPE] = GetI2CPOption(section, I2CP_PARAM_LEASESET_TYPE, DEFAULT_LEASESET_TYPE);
std::string encType = GetI2CPStringOption(section, I2CP_PARAM_LEASESET_ENCRYPTION_TYPE, "");
if (encType.length () > 0) options[I2CP_PARAM_LEASESET_ENCRYPTION_TYPE] = encType;
+ std::string privKey = GetI2CPStringOption(section, I2CP_PARAM_LEASESET_PRIV_KEY, "");
+ if (privKey.length () > 0) options[I2CP_PARAM_LEASESET_PRIV_KEY] = privKey;
}
void ClientContext::ReadI2CPOptionsFromConfig (const std::string& prefix, std::map<std::string, std::string>& options) const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml new/i2pd-2.27.0/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml
--- old/i2pd-2.26.0/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/qt/i2pd_qt/data/website.i2pd.i2pd.appdata.xml 2019-07-03 18:38:55.000000000 +0200
@@ -35,6 +35,7 @@
<translation type="qt" />
<releases>
+ <release version="2.27.0" date="2019-07-03" />
<release version="2.26.0" date="2019-06-07" />
<release version="2.25.0" date="2019-05-09" />
<release version="2.24.0" date="2019-03-21" />
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/i2pd-2.26.0/qt/i2pd_qt/i2pd_qt.pro new/i2pd-2.27.0/qt/i2pd_qt/i2pd_qt.pro
--- old/i2pd-2.26.0/qt/i2pd_qt/i2pd_qt.pro 2019-06-07 16:25:55.000000000 +0200
+++ new/i2pd-2.27.0/qt/i2pd_qt/i2pd_qt.pro 2019-07-03 18:38:55.000000000 +0200
@@ -4,19 +4,22 @@
TARGET = i2pd_qt
TEMPLATE = app
-QMAKE_CXXFLAGS *= -std=c++11 -ggdb
+QMAKE_CXXFLAGS *= -std=c++11 -Wno-unused-parameter -Wno-maybe-uninitialized
DEFINES += USE_UPNP
SOURCES += DaemonQT.cpp mainwindow.cpp \
../../libi2pd/api.cpp \
../../libi2pd/Base.cpp \
+ ../../libi2pd/Blinding.cpp \
../../libi2pd/BloomFilter.cpp \
+ ../../libi2pd/ChaCha20.cpp \
../../libi2pd/Config.cpp \
../../libi2pd/CPU.cpp \
../../libi2pd/Crypto.cpp \
- ../../libi2pd/CryptoKey.cpp \
+ ../../libi2pd/CryptoKey.cpp \
../../libi2pd/Datagram.cpp \
../../libi2pd/Destination.cpp \
+ ../../libi2pd/Ed25519.cpp \
../../libi2pd/Event.cpp \
../../libi2pd/Family.cpp \
../../libi2pd/FS.cpp \
@@ -31,7 +34,9 @@
../../libi2pd/Log.cpp \
../../libi2pd/NetDb.cpp \
../../libi2pd/NetDbRequests.cpp \
+ ../../libi2pd/NTCP2.cpp \
../../libi2pd/NTCPSession.cpp \
+ ../../libi2pd/Poly1305.cpp \
../../libi2pd/Profiling.cpp \
../../libi2pd/Reseed.cpp \
../../libi2pd/RouterContext.cpp \
@@ -49,9 +54,6 @@
../../libi2pd/TunnelGateway.cpp \
../../libi2pd/TunnelPool.cpp \
../../libi2pd/util.cpp \
- ../../libi2pd/Ed25519.cpp \
- ../../libi2pd/Chacha20.cpp \
- ../../libi2pd/Poly1305.cpp \
../../libi2pd_client/AddressBook.cpp \
../../libi2pd_client/BOB.cpp \
../../libi2pd_client/ClientContext.cpp \
@@ -64,42 +66,37 @@
../../libi2pd_client/SOCKS.cpp \
../../libi2pd_client/Websocket.cpp \
../../libi2pd_client/WebSocks.cpp \
+ ../../daemon/Daemon.cpp \
+ ../../daemon/HTTPServer.cpp \
+ ../../daemon/I2PControl.cpp \
+ ../../daemon/i2pd.cpp \
+ ../../daemon/UPnP.cpp \
ClientTunnelPane.cpp \
MainWindowItems.cpp \
ServerTunnelPane.cpp \
SignatureTypeComboboxFactory.cpp \
TunnelConfig.cpp \
TunnelPane.cpp \
- ../../daemon/Daemon.cpp \
- ../../daemon/HTTPServer.cpp \
- ../../daemon/i2pd.cpp \
- ../../daemon/I2PControl.cpp \
- ../../daemon/UnixDaemon.cpp \
- ../../daemon/UPnP.cpp \
textbrowsertweaked1.cpp \
pagewithbackbutton.cpp \
widgetlock.cpp \
widgetlockregistry.cpp \
- logviewermanager.cpp \
- ../../libi2pd/NTCP2.cpp
-
-#qt creator does not handle this well
-#SOURCES += $$files(../../libi2pd/*.cpp)
-#SOURCES += $$files(../../libi2pd_client/*.cpp)
-#SOURCES += $$files(../../daemon/*.cpp)
-#SOURCES += $$files(./*.cpp)
-
-SOURCES -= ../../daemon/UnixDaemon.cpp
+ logviewermanager.cpp
HEADERS += DaemonQT.h mainwindow.h \
../../libi2pd/api.h \
../../libi2pd/Base.h \
+ ../../libi2pd/Blinding.h \
../../libi2pd/BloomFilter.h \
+ ../../libi2pd/ChaCha20.h \
../../libi2pd/Config.h \
+ ../../libi2pd/CPU.h \
../../libi2pd/Crypto.h \
- ../../libi2pd/CryptoKey.h \
+ ../../libi2pd/CryptoKey.h \
+ ../../libi2pd/CryptoWorker.h \
../../libi2pd/Datagram.h \
../../libi2pd/Destination.h \
+ ../../libi2pd/Ed25519.h \
../../libi2pd/Event.h \
../../libi2pd/Family.h \
../../libi2pd/FS.h \
@@ -115,13 +112,16 @@
../../libi2pd/Log.h \
../../libi2pd/NetDb.hpp \
../../libi2pd/NetDbRequests.h \
+ ../../libi2pd/NTCP2.h \
../../libi2pd/NTCPSession.h \
+ ../../libi2pd/Poly1305.h \
../../libi2pd/Profiling.h \
../../libi2pd/Queue.h \
../../libi2pd/Reseed.h \
../../libi2pd/RouterContext.h \
../../libi2pd/RouterInfo.h \
../../libi2pd/Signature.h \
+ ../../libi2pd/Siphash.h \
../../libi2pd/SSU.h \
../../libi2pd/SSUData.h \
../../libi2pd/SSUSession.h \
@@ -151,6 +151,10 @@
../../libi2pd_client/SOCKS.h \
../../libi2pd_client/Websocket.h \
../../libi2pd_client/WebSocks.h \
+ ../../daemon/Daemon.h \
+ ../../daemon/HTTPServer.h \
+ ../../daemon/I2PControl.h \
+ ../../daemon/UPnP.h \
ClientTunnelPane.h \
MainWindowItems.h \
ServerTunnelPane.h \
@@ -158,16 +162,11 @@
TunnelConfig.h \
TunnelPane.h \
TunnelsPageUpdateListener.h \
- ../../daemon/Daemon.h \
- ../../daemon/HTTPServer.h \
- ../../daemon/I2PControl.h \
- ../../daemon/UPnP.h \
textbrowsertweaked1.h \
pagewithbackbutton.h \
widgetlock.h \
widgetlockregistry.h \
i2pd.rc \
- i2pd.rc \
logviewermanager.h
INCLUDEPATH += ../../libi2pd
1
0
Hello community,
here is the log from the commit of package artikulate for openSUSE:Factory checked in at 2019-07-05 13:49:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/artikulate (Old)
and /work/SRC/openSUSE:Factory/.artikulate.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "artikulate"
Fri Jul 5 13:49:05 2019 rev:64 rq:713489 version:19.04.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/artikulate/artikulate.changes 2019-06-14 20:25:03.662788065 +0200
+++ /work/SRC/openSUSE:Factory/.artikulate.new.4615/artikulate.changes 2019-07-05 13:49:06.529489456 +0200
@@ -1,0 +2,11 @@
+Thu Jul 4 18:27:27 UTC 2019 - Fabian Vogt <fabian(a)ritter-vogt.de>
+
+- Add patch to not install devel links for internal libraries:
+ * 0001-Install-internal-libraries-with-NAMELINK_SKIP.patch
+
+-------------------------------------------------------------------
+Thu Jul 4 18:05:18 UTC 2019 - Fabian Vogt <fabian(a)ritter-vogt.de>
+
+- Disable building the GStreamer backend
+
+-------------------------------------------------------------------
New:
----
0001-Install-internal-libraries-with-NAMELINK_SKIP.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ artikulate.spec ++++++
--- /var/tmp/diff_new_pack.XyBTjg/_old 2019-07-05 13:49:08.185492010 +0200
+++ /var/tmp/diff_new_pack.XyBTjg/_new 2019-07-05 13:49:08.185492010 +0200
@@ -28,9 +28,10 @@
Group: Amusements/Teaching/Other
URL: http://edu.kde.org
Source0: %{name}-%{version}.tar.xz
+# PATCH-FIX-UPSTREAM
+Patch100: 0001-Install-internal-libraries-with-NAMELINK_SKIP.patch
BuildRequires: extra-cmake-modules >= %{kf5_version}
BuildRequires: fdupes
-BuildRequires: gstreamer-plugins-qt5-devel
BuildRequires: karchive-devel
BuildRequires: kconfig-devel
BuildRequires: kcrash-devel
@@ -53,19 +54,14 @@
Requires: kqtquickcharts >= %{_kapp_version}
Obsoletes: %{name}5 < %{version}
Provides: %{name}5 = %{version}
-%if %{with lang}
-Recommends: %{name}-lang
-%endif
%description
Improve your pronunciation by listening to native speakers.
-%if %{with lang}
%lang_package
-%endif
%prep
-%setup -q
+%autosetup -p1
%build
%cmake_kf5 -d build
@@ -94,9 +90,9 @@
%doc %lang(en) %{_kf5_htmldir}/en/artikulate/
%{_kf5_iconsdir}/hicolor/*/*/artikulate*.*
%{_kf5_iconsdir}/hicolor/*/actions/language-artikulate.*
-%{_kf5_libdir}/libartikulatecore.so*
-%{_kf5_libdir}/libartikulatelearnerprofile.so*
-%{_kf5_libdir}/libartikulatesound.so*
+%{_kf5_libdir}/libartikulatecore.so.*
+%{_kf5_libdir}/libartikulatelearnerprofile.so.*
+%{_kf5_libdir}/libartikulatesound.so.*
%{_kf5_plugindir}/artikulate/
%{_kf5_sharedir}/artikulate/
++++++ 0001-Install-internal-libraries-with-NAMELINK_SKIP.patch ++++++
>From 66611f64ee98a4ffb7bac26b8c4f153c8102bae9 Mon Sep 17 00:00:00 2001
From: Fabian Vogt <fabian(a)ritter-vogt.de>
Date: Thu, 4 Jul 2019 20:26:25 +0200
Subject: [PATCH] Install internal libraries with NAMELINK_SKIP
They don't have any API/ABI guarantees, to the namelink would be mostly
useless anyway.
---
liblearnerprofile/src/CMakeLists.txt | 1 +
libsound/src/CMakeLists.txt | 1 +
src/CMakeLists.txt | 1 +
3 files changed, 3 insertions(+)
diff --git a/liblearnerprofile/src/CMakeLists.txt b/liblearnerprofile/src/CMakeLists.txt
index a15cdef..37ab579 100644
--- a/liblearnerprofile/src/CMakeLists.txt
+++ b/liblearnerprofile/src/CMakeLists.txt
@@ -57,5 +57,6 @@ set_target_properties(
install(
TARGETS artikulatelearnerprofile
+ LIBRARY NAMELINK_SKIP
${INSTALL_TARGETS_DEFAULT_ARGS}
)
diff --git a/libsound/src/CMakeLists.txt b/libsound/src/CMakeLists.txt
index 1ad39ea..4050cf7 100644
--- a/libsound/src/CMakeLists.txt
+++ b/libsound/src/CMakeLists.txt
@@ -55,6 +55,7 @@ set_target_properties(
install(
TARGETS artikulatesound
+ LIBRARY NAMELINK_SKIP
${INSTALL_TARGETS_DEFAULT_ARGS}
)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 066341a..11d64fc 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -93,6 +93,7 @@ set_target_properties(
)
install(
TARGETS artikulatecore
+ LIBRARY NAMELINK_SKIP
DESTINATION ${INSTALL_TARGETS_DEFAULT_ARGS}
)
install(FILES artikulate.knsrc DESTINATION ${CONFIG_INSTALL_DIR})
--
2.22.0
1
0
Hello community,
here is the log from the commit of package kamoso for openSUSE:Factory checked in at 2019-07-05 13:49:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kamoso (Old)
and /work/SRC/openSUSE:Factory/.kamoso.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kamoso"
Fri Jul 5 13:49:03 2019 rev:16 rq:713485 version:19.04.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/kamoso/kamoso.changes 2019-06-14 20:25:42.834775383 +0200
+++ /work/SRC/openSUSE:Factory/.kamoso.new.4615/kamoso.changes 2019-07-05 13:49:04.677486600 +0200
@@ -1,0 +2,6 @@
+Thu Jul 4 18:07:21 UTC 2019 - Fabian Vogt <fabian(a)ritter-vogt.de>
+
+- Replace BuildDep on Qt5GStreamer with plain gstreamer-1.0
+- Add kirigami2 runtime dep
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ kamoso.spec ++++++
--- /var/tmp/diff_new_pack.WxwSBY/_old 2019-07-05 13:49:06.205488957 +0200
+++ /var/tmp/diff_new_pack.WxwSBY/_new 2019-07-05 13:49:06.205488957 +0200
@@ -40,14 +40,16 @@
BuildRequires: cmake(KF5Notifications)
BuildRequires: cmake(KF5Purpose)
BuildRequires: cmake(Qt5Core)
-BuildRequires: cmake(Qt5GStreamer)
BuildRequires: cmake(Qt5Gui)
BuildRequires: cmake(Qt5OpenGL)
BuildRequires: cmake(Qt5Quick)
BuildRequires: cmake(Qt5Widgets)
+BuildRequires: pkgconfig(gstreamer-1.0)
+BuildRequires: pkgconfig(gstreamer-video-1.0)
BuildRequires: pkgconfig(libudev)
Requires: gstreamer-plugins-base
Requires: gstreamer-plugins-good
+Requires: kirigami2
Recommends: %{name}-lang
%description
1
0
Hello community,
here is the log from the commit of package quilter for openSUSE:Factory checked in at 2019-07-05 13:49:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/quilter (Old)
and /work/SRC/openSUSE:Factory/.quilter.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "quilter"
Fri Jul 5 13:49:00 2019 rev:16 rq:713475 version:1.9.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/quilter/quilter.changes 2019-06-12 13:19:04.620557745 +0200
+++ /work/SRC/openSUSE:Factory/.quilter.new.4615/quilter.changes 2019-07-05 13:49:00.361479944 +0200
@@ -1,0 +2,9 @@
+Tue Jun 11 17:01:17 UTC 2019 - Alexei Podvalsky <avvissu(a)yandex.by>
+
+- Update to 1.9.1:
+ * Merge pull request #258 from tim77/master
+ * Merge branch 'master' of https://github.com/lainsce/quilter
+ * Fix exporting as pdf visual glitches
+ * Add Fedora installation instructions
+
+-------------------------------------------------------------------
Old:
----
quilter-1.9.0.tar.gz
New:
----
quilter-1.9.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ quilter.spec ++++++
--- /var/tmp/diff_new_pack.zZsxr5/_old 2019-07-05 13:49:01.285481369 +0200
+++ /var/tmp/diff_new_pack.zZsxr5/_new 2019-07-05 13:49:01.289481375 +0200
@@ -17,7 +17,7 @@
Name: quilter
-Version: 1.9.0
+Version: 1.9.1
Release: 0
Summary: Writing application
License: GPL-3.0-only
++++++ quilter-1.9.0.tar.gz -> quilter-1.9.1.tar.gz ++++++
++++ 7473 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package minder for openSUSE:Factory checked in at 2019-07-05 13:48:57
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/minder (Old)
and /work/SRC/openSUSE:Factory/.minder.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "minder"
Fri Jul 5 13:48:57 2019 rev:8 rq:713474 version:1.3.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/minder/minder.changes 2019-06-12 13:12:20.848939472 +0200
+++ /work/SRC/openSUSE:Factory/.minder.new.4615/minder.changes 2019-07-05 13:48:59.209478168 +0200
@@ -1,0 +2,9 @@
+Tue Jun 11 16:59:09 UTC 2019 - Alexei Podvalsky <avvissu(a)yandex.by>
+
+- Update to 1.3.1:
+ * Merge branch 'master' of github.com:phase1geo/Minder
+ * Updates for new release.
+ * Fixing export issue.
+ * Fixing release information
+
+-------------------------------------------------------------------
Old:
----
Minder-1.3.0.tar.gz
New:
----
Minder-1.3.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ minder.spec ++++++
--- /var/tmp/diff_new_pack.ztzV0a/_old 2019-07-05 13:49:00.069479494 +0200
+++ /var/tmp/diff_new_pack.ztzV0a/_new 2019-07-05 13:49:00.077479506 +0200
@@ -17,7 +17,7 @@
Name: minder
-Version: 1.3.0
+Version: 1.3.1
Release: 0
Summary: Mind-mapping app
License: GPL-3.0-or-later
++++++ Minder-1.3.0.tar.gz -> Minder-1.3.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Minder-1.3.0/data/com.github.phase1geo.minder.appdata.xml new/Minder-1.3.1/data/com.github.phase1geo.minder.appdata.xml
--- old/Minder-1.3.0/data/com.github.phase1geo.minder.appdata.xml 2019-05-19 15:11:32.000000000 +0200
+++ new/Minder-1.3.1/data/com.github.phase1geo.minder.appdata.xml 2019-06-04 01:28:24.000000000 +0200
@@ -88,9 +88,16 @@
<content_attribute id="money-gambling">none</content_attribute>
</content_rating>
<releases>
- <release version="1.3" date="2019-05-17">
+ <release version="1.3.1" data="2019-06-02">
<description>
- <p>Let's stay connected!</p>
+ <ul>
+ <li>Fixing issue with export functions.</li>
+ </ul>
+ </description>
+ </release>
+ <release version="1.3.0" date="2019-05-20">
+ <description>
+ <p>Let's make a connection!</p>
<ul>
<li>Added support for creating a visual connection between any two nodes.</li>
<li>Added ability to show/hide all connections in the map.</li>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Minder-1.3.0/data/com.github.phase1geo.minder.appdata.xml.in new/Minder-1.3.1/data/com.github.phase1geo.minder.appdata.xml.in
--- old/Minder-1.3.0/data/com.github.phase1geo.minder.appdata.xml.in 2019-05-19 15:11:32.000000000 +0200
+++ new/Minder-1.3.1/data/com.github.phase1geo.minder.appdata.xml.in 2019-06-04 01:28:24.000000000 +0200
@@ -79,7 +79,14 @@
<content_attribute id="money-gambling">none</content_attribute>
</content_rating>
<releases>
- <release version="1.3" date="2019-05-17">
+ <release version="1.3.1" data="2019-06-02">
+ <description>
+ <ul>
+ <li>Fixing issue with export functions.</li>
+ </ul>
+ </description>
+ </release>
+ <release version="1.3.0" date="2019-05-20">
<description>
<p>Let's stay connected!</p>
<ul>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Minder-1.3.0/src/Application.vala new/Minder-1.3.1/src/Application.vala
--- old/Minder-1.3.0/src/Application.vala 2019-05-19 15:11:32.000000000 +0200
+++ new/Minder-1.3.1/src/Application.vala 2019-06-04 01:28:24.000000000 +0200
@@ -122,7 +122,7 @@
/* If the version was specified, output it and then exit */
if( version ) {
- stdout.printf( "1.3\n" );
+ stdout.printf( "1.3.1\n" );
Process.exit( 0 );
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Minder-1.3.0/src/MainWindow.vala new/Minder-1.3.1/src/MainWindow.vala
--- old/Minder-1.3.0/src/MainWindow.vala 2019-05-19 15:11:32.000000000 +0200
+++ new/Minder-1.3.1/src/MainWindow.vala 2019-06-04 01:28:24.000000000 +0200
@@ -938,7 +938,9 @@
/* Exports the model to various formats */
private void action_export() {
- FileChooserNative dialog = new FileChooserNative( _( "Export As" ), this, FileChooserAction.SAVE, _( "Export" ), _( "Cancel" ) );
+ // FileChooserNative dialog = new FileChooserNative( _( "Export As" ), this, FileChooserAction.SAVE, _( "Export" ), _( "Cancel" ) );
+ FileChooserDialog dialog = new FileChooserDialog( _( "Export As" ), this, FileChooserAction.SAVE,
+ _( "Cancel" ), ResponseType.CANCEL, _( "Export" ), ResponseType.ACCEPT );
/* BMP */
FileFilter bmp_filter = new FileFilter();
@@ -1038,6 +1040,8 @@
}
}
+ dialog.close();
+
}
/*
1
0