Commit Graph

8876 Commits

Author SHA1 Message Date
Simon Sohrt ca62b3447b RewriteGenerator: Fully buffering of input is no longer necessary
Fully buffering by the previous generator of the input for the RewriteGenerator is no longer necessary.

Bug: 577948
Signed-off-by: Simon Sohrt <sohrt@his.de>
Change-Id: I59c7a7c7f3766e97627764608bc8dc733804274c
2022-05-25 05:49:28 -04:00
Matthias Sohn 0c749d33ba Update Orbit to S20220517184036
and
- net.i2p.crypto.eddsa to 0.3.0.v20220506-1020
- org.bouncycastle.bcpg to 1.70.0.v20220507-1208
- org.bouncycastle.bcprov to 1.70.0.v20220507-1208

Change-Id: Ifc450da0a9b469629b7d3a7e4194a2bc8a2a4403
2022-05-25 00:10:30 +02:00
Fabio Ponciroli 4ac6e7b505 PackFileSnapshot: Resolve warnings by using "equals" instead of "=="
Errorprone raises the following warning: "[ReferenceEquality] Comparison
using reference equality instead of value equality"

Added Equality#isSameInstance util method to be reused in similar cases.

Change-Id: Ifc9885c9806dcafa1c5ee1351d3095bf1517dbf5
2022-05-20 20:12:29 +02:00
James Z.M. Gao 88d5f51e61 Remove stray files (probes or lock files) created by background threads
On process exit, it was possible that the filesystem timestamp
resolution measurement left behind .probe files or even a lock file
for the jgit.config.

Ensure the SAVE_RUNNER is shut down when the process exits (via
System.exit() or otherwise). Move lf.lock() into the try-finally
block when saving the config file.

Delete .probe files on JVM shutdown -- they are created in daemon
threads that may terminate abruptly, not executing the "finally"
clause that normally removes these files.

Bug: 579445
Change-Id: Ie27aca1fdaddfa487ebe072c3913d78355910df8
2022-05-15 19:41:24 +02:00
Matthias Sohn 114325560a Merge branch 'stable-6.2'
* stable-6.2:
  HTTP Smart: set correct HTTP status on error

Change-Id: I7bf99b0c720f9dabb65da5cc777281a1d227f5a8
2022-05-09 22:10:13 +02:00
Matthias Sohn e1efd4dd1f Merge branch 'stable-6.1' into stable-6.2
* stable-6.1:
  HTTP Smart: set correct HTTP status on error

Change-Id: I792d6cdfe9e76a3d2e6d1e01ec1dc96805ed2900
2022-05-09 22:09:05 +02:00
Sven Selberg 8984e1f663 HTTP Smart: set correct HTTP status on error
Previous behavior was that status code was automatically set to 200
regardless of reported status and according to HTTP Smart protocol[1]:

  If there is no repository at $GIT_URL, or the resource pointed to by
  a location matching $GIT_URL does not exist, the server MUST NOT
  respond with 200 OK response. A server SHOULD respond with
  404 Not Found, 410 Gone, or any other suitable HTTP status code which
  does not imply the resource exists as requested.

Since the jgit HTTP client isn't able to handle reading content from a
response reporting an error (calling HttpURLConnection#getInputStream
on a "failed" connection throws an exception and the internal interface
HttpConnection does not expose HttpURLConnection#getErrorStream) the
SmartClientSmartServerTest needed to be rewritten to expect the generic
response messages.

[1] https://git-scm.com/docs/http-protocol#_general_request_processing

Bug: 579676
Change-Id: Ibb942d02124a0bc279df09600b091354019ce064
2022-05-09 22:06:38 +02:00
Matthias Sohn b92c260425 Merge branch 'stable-6.2'
* stable-6.2:
  Prepare 6.2.0-SNAPSHOT builds
  JGit v6.2.0.202205041315-m2

Change-Id: Ia5180f086ac07fe6fa0e68d233ddb963010945b6
2022-05-05 13:49:22 +02:00
Matthias Sohn b969c44c00 Prepare 6.2.0-SNAPSHOT builds
Change-Id: Ic3788b38d6408e83729caa718c128a5632798a60
2022-05-05 13:39:09 +02:00
Matthias Sohn 6ac09896b2 JGit v6.2.0.202205041315-m2
Change-Id: Ie13beac020e79182a4058ba67550bb78b2008833
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2022-05-04 19:25:04 +02:00
Matthias Sohn 60ecf4a247 Update list of 3rd party dependencies
Change-Id: I4f8f8ede8b4c788ce2b4db174df4cc1d35350542
2022-05-03 23:09:22 +02:00
Matthias Sohn 919b84296c Add target platforms for eclipse 4.23 (2022-03) and 4.24 (2022-06)
Change-Id: I6481a0e6e989b8ceefeecced0d7d8609a24d0c9f
2022-05-03 00:46:08 +02:00
Matthias Sohn 1140500ed3 Update Orbit to I20220502200629
and
- com.jcraft.jzlib to 1.1.3.v20220502-1820

Change-Id: I7694f1b793f598c3adb96b5223a5f7b5783a35ec
2022-05-02 22:59:51 +02:00
Thomas Wolf 4dd9a94ec5 [sshd] Better user feedback on authentication failure
When authentication fails, JGit produces an exception with an error
message telling the user that it could not log in (including the host
name). The causal chain has an SshException from Apache MINA sshd with
message "No more authentication methods available".

This is not very helpful. The user was left without any indication why
authentication failed.

Include in the exception message a log of all attempted authentications.
That way, the user can see which keys were tried, in which order and
with which signature algorithms. The log also reports authentication
attempts for gssapi-with-mic or password authentication. For
keyboard-interactive Apache MINA sshd is lacking a callback interface.

The way Apache MINA sshd loads keys from files, the file names are lost
in higher layers. Add a mechanism to record on the session for each
key fingerprint the file it was loaded from, if any. That way the
exception message can refer to keys by file name, which is easier to
understand by users than the rather cryptic key fingerprints.

Bug: 571390
Change-Id: Ic4b6ce6b99f307d5e798fcc91b16b9ffd995d224
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-05-01 08:48:44 +02:00
Matthias Fromme 8b8999dca8 Lazy loading of .lfsconfig.
Load the '.lfsconfig ' on access instead of trying to load it
unconditionally each time an LFS filter is applied.

Bug 578020
Change-Id: I986d4e61a736fc83cf00e62a08d8413c6bb53f78
2022-04-30 15:13:51 +02:00
Thomas Wolf 1a96d10489 [releng] bump japicmp base version
Bump the japicmp base version to 6.1.0.202203080745-r.

Change-Id: I54a9ae339fbe2a3a02f438f794caa22c8cbcd02c
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-04-25 07:57:36 +02:00
Thomas Wolf 563a7b5828 RefSpec: add missing @since
New API needs an @since 6.2 annotation.

Change-Id: I16b01ea820cc651605166acc13591b515541d06b
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-04-25 07:45:55 +02:00
Thomas Wolf 7f9cd7d2ba De-couple ServiceLoader calls from class loading
Use the holder pattern to de-couple the loading of super classes from
the ServiceLoader calls to set up global instances. This prevents
potential lock inversions.

Bug: 579550
Change-Id: Ie8284e4d6d680ddd4cc6a486bbefe8ed00266240
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-04-14 10:52:55 +02:00
Thomas Wolf 7e06e51750 CommitCommand: call GpgSigner.getDefault() only if indeed signing
If we're not signing the commit, we don't need the GpgSigner at all.

Change-Id: Ica35651c73d82b7604c8a67487b0d9474c908aae
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-04-14 10:52:55 +02:00
Thomas Wolf fbce3122e0 GpgSigner: prevent class lock inversion on the default signer
Don't store the default signer in a static field of the abstract
superclass GpgSigner. This many lead to a lock inversion on the class
initialization locks if there are concurrent loads of the GpgSigner
class and of one of its subclasses, and that subclass happens to be
the one the ServiceLoader wants to load.

Use the holder pattern to de-couple the loading of class GpgSigner
from the ServiceLoader call.

Bug: 579550
Change-Id: Ifac0ea0c8985a09fe0518d0dabc072fafd6db907
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-04-14 10:52:55 +02:00
yunjieli eca101fc05 Fetch: Introduce negative refspecs.
Implement negative refspecs in JGit fetch, following C Git. Git
supports negative refspecs in source only while this change supports
them in both source and destination.

If one branch is equal to any branch or matches any pattern in the
negative refspecs collection, the branch will not be fetched even if
it's in the toFetch collection.

With this feature, users can express more complex patterns during fetch.

Change-Id: Iaa1cd4de5c08c273e198b72e12e3dadae7be709f
Sign-off-by: Yunjie Li<yunjieli@google.com>
2022-04-13 10:21:20 -07:00
Han-Wen NIenhuys 68a0725896 Merge "Add GetRefsBenchmark for testing refs lookups" 2022-04-05 07:33:51 -04:00
Fabio Ponciroli 98029e6758 BaseSearch: Suppress ReferenceEquality Warnings
Errorprone raises the following warning:
"[ReferenceEquality] Comparison using reference equality
instead of value equality"

Change-Id: Ib7542506dcdf5a0c7775a99a2c0972930d622879
2022-04-02 04:18:54 -04:00
Fabio Ponciroli 47a16f5f22 RewriteGenerator: Suppress ReferenceEquality Warnings
Errorprone raises the following warning:
"[ReferenceEquality] Comparison using reference equality
instead of value equality"

Change-Id: Idfe3f044730019fb49dccee25a0563c6fc01fc6a
2022-04-01 17:41:56 -04:00
Fabio Ponciroli cc8b2e627b PlotCommit: Suppress ReferenceEquality Warnings
Errorprone raises the following warning:
"[ReferenceEquality] Comparison using reference equality
instead of value equality"

Change-Id: Ia0dc2df68c77e40ff509a2c39568abce92525ee9
2022-04-01 17:27:42 -04:00
Fabio Ponciroli f1362e857e PlotCommitList: Suppress ReferenceEquality Warnings
Errorprone raises the following warning:
"[ReferenceEquality] Comparison using reference equality
instead of value equality"

A single pointer comparison is fine here.
A comparison with 'equals' would complicate the code and
also impact performance.

Change-Id: I6677dfc483acb95a64afbf433fd2b9460e408264
2022-04-01 17:07:19 -04:00
Luca Milanesio a706835a49 Add GetRefsBenchmark for testing refs lookups
Introduce a new benchmark that shows a typical use-case
of opening a cached repository and fetching one ref from
a repository with a high number of refs.

This specific benchmark is tailored to the Gerrit use-case
of reading frequently individual refs SHA1s and by ref-name
prefix from the All-Users repository.

Include the following variables for the benchmark:
- numBranches (from 100 up to 50000)
- trustFolderStat (true or false)
- useRefTable (true or false)

The benchmark needs to be evaluated on a local high-perf SSD
and on a slower NFS network disk.

Bug: 576165
Change-Id: Ie59a87ca9f0191ff30229688e3430332e2f59a4f
2022-04-01 16:39:35 -04:00
Matthias Sohn aa5a2c4619 [pgm tests] Relax version constraints for hamcrest
We updated hamcrest to 2.2. but there is no need to prevent that
older versions of hamcrest can be used. Hence relax the lower bound
to 1.1 like in other bundles.

Change-Id: I3f2f270d2aabc7d742a585d2fc7f0bce283e2a64
2022-03-30 16:26:57 -04:00
Thomas Wolf 8f02807164 Use git config core.commentChar
This concerns committing, creating merge conflict messages and creating
and editing squash messages. In a squash message, once the comment
character has been determined initially is always the first character.
Note that if core.commentChar=auto and there is a sequence of squashes,
it may be necessary to change the comment character when a new message
is added.

Bug: 579325
Change-Id: Idca19284a0240cd322e7512ea299a03658e1b2c1
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-26 19:53:37 +01:00
Thomas Wolf a187d12dd9 CommitConfig: add support for core.commentChar
Provide  access to the core.commentChar git config, and provide a
utility method to determine an unused comment character if the setting
is "auto".

Bug: 579325
Change-Id: I1ec7e4deffea6ac5929a8538a624d73bb59e4ecc
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-26 19:53:37 +01:00
Thomas Wolf a171360292 [push, lfs] Tell the pre-push hook whether the push is a dry run
This is a feature that does not exist in C git: an external pre-push
hook doesn't know whether the push is run as a dry run. But for
internal hooks written in Java it is entirely possible to give a hook
this information.

In JGit with its internal LFS implementation, this enables us to not
perform LFS uploads in a dry run. This is kind of important because
EGit frequently does a dry-run before doing the actual push to give the
user a way to review what would be pushed before it actually happens.

Doing an LFS upload of potentially huge files during a dry-run is
wasteful, makes the dry run not actually a dry run, and leads to
uploading the same file twice if followed by a real push.

Use the information in the LfsPrePushHook to only do the initial call
to the LFS server, but then skipping the actual upload if the push is
a dry run. That way, a failure to contact the LFS server leads to an
error in the dry run, as it should.

Bug: 546567
Change-Id: I155430f27c4979d91096ba72fd95c3775dd3f28b
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-23 18:55:31 -04:00
Matthias Sohn 30a137dfe5 Merge changes I5df54a92,Iecc61d1c
* changes:
  LsRemoteCommand: apply url.*.insteadOf
  Factor out URL replacement from RemoteConfig
2022-03-22 12:15:33 -04:00
Thomas Wolf b12ec8f377 LFS: clean up messages
Remove an unused message, and remove unnecessary quotes.

Change-Id: I9da3eeb3db33324fa07bebd434bca3c0a4da27ab
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-21 04:58:50 -04:00
Thomas Wolf 0ae37d4000 DirCacheCheckout: use a LinkedHashMap instead of HashMap
This guarantees that updates are checked out in git order, which
is important for LFS if a .lfsconfig file is used. That file comes
early in git order, and the LFS smudge filter will consider the
working tree version. To ensure that on branch switches the correct
version of that file is used, the checkout order must be stable and
should be the git order.

Change-Id: I20f6d11bf08558f9d5adfd2be71e36321460038c
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-19 21:41:55 +01:00
Thomas Wolf 7b1c8cf147 Re-try reading a file when there are concurrent writes
Git and JGit are very careful to replace git files atomically when
writing. The normal mechanism for this is to write to a temporary
file and then to rename it atomically to the final destination. This
works fine on POSIX-compliant systems, but on systems where renaming
may not be atomic, exceptions may be thrown if code tries to read
the file while the rename is still ongoing. This happens in particular
on Windows, where the typical symptom is that a FileNotFoundException
with message "The process cannot access the file because it is being
used by another process" is thrown, but file.isFile() == true at the
same time.

In FileBasedConfig, a re-try was already implemented for this case.
But the same problem can also occur in other places, for instance
in RefDirectory when reading loose or packed refs. Additionally,
JGit has similar re-tries when a stale NFS file handle is detected,
but that mechanism wasn't used consistently (only for git configs
and packed refs, but not for loose refs).

Factor out the general re-try mechanism for reading into a new method
FileUtils.readWithRetry() and use that in all three places. The
re-try parameters are hardcoded: at most 5 times for stale NFS handles,
and at most 5 times with increasing backoff delays (50, 100, 200, 400,
and 800ms) for the above concurrent write case.

Bug: 579116
Change-Id: If0c2ad367446d3c0f32b509274cf8e814aca12cf
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-19 21:33:51 +01:00
Thomas Wolf ac78c17523 [sideband] Ensure last bit of progress channel is written
If the last sideband progress message didn't end in \r or \n, there
may still be a buffered message at the end of a fetch or push. Ensure
that message gets written, too, even if it may be only partial.

Bug: 575629
Change-Id: I38edccb5cffb89e00e468480b43c7d951fb63e8e
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-19 12:13:37 +01:00
Thomas Wolf 45287f1097 Add tests for SideBandInputStream
Bug: 575629
Change-Id: I4591a64a2c07c7841417ec7a5c7883134ffda1be
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-19 12:12:05 +01:00
Fabio Ponciroli a820ff0896 WinPipeConnector: Resolve warnings by using "equals" instead of "=="
Errorprone raises the following warning: "[ReferenceEquality] Comparison
using reference equality instead of value equality".

Change-Id: Ic73305b2af628f66e7659ea1b839b3a640e3cd8d
2022-03-17 16:03:16 -05:00
Thomas Wolf 2c1a8798ca LsRemoteCommand: apply url.*.insteadOf
If LsRemoteCommand is used without repository, the remote URI was not
translated. If the git user config contains e.g.

  [url "ssh://git@github.com/"]
    insteadOf = https://github.com/

and LsRemoteCommand is called with an HTTPS GitHub repository URL, the
command should actually rewrite this to an SSH URI and use the SSH
transport.

Actually this same problem may exist everywhere Transport is used with
an URIish instead of with a remote name. However, doing this translation
in Transport.open(URIish) and in Transport.open(Repository, URIish,
String) if no remote name is given would change the behavior and might
break assumptions made in existing clients. For instance, EGit's
PushOperation assumes that the URI obtained from PushResult.getURI()
was the same as was passed in to Transport.open(Repository, URIish).

URIs obtained from a RemoteConfig have this translation applied
transparently, and in Transport we cannot know for sure whether or
not a URI has already been translated, if needed. So doing this in
Transport might also lead to translating URIs twice.

Therefore this commit does the translation in LsRemoteCommand, where
we can be sure that it won't affect other use cases. If other cases
besides LsRemoteCommand are found where such a URI translation is
missing, it'll have to be done at higher levels, possibly even in
client code directly.

Bug: 544769
Change-Id: I5df54a925d30b55d98e21f37f2851fe79649b064
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-15 20:58:52 +01:00
Thomas Wolf c127a1a652 Factor out URL replacement from RemoteConfig
Add a new UrlConfig that encapsulates the basic URL replacement logic
for git configs url.<base>.insteadOf and pushInsteadof.

Change-Id: Iecc61d1c5e6089533552afa1d1e684ae72393b38
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-15 20:43:51 +01:00
Thomas Wolf 2d9ed3cf2a Fix MANIFEST.MF in the LFS bundles
Somehow new dependencies added in commit a229072f got lost when merging
stable-6.1 into master.

Change-Id: I19c16c6be73d07e05f37241a44cf25133ff467a5
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-12 17:28:47 +01:00
Matthias Sohn 13eb2ce3e2 Update Tycho to 2.6.0
Change-Id: Ic8b2b352721040ccc0164cf0c8637102518e5ce9
2022-03-09 22:34:16 +01:00
Matthias Sohn 338f2adf16 Merge branch 'stable-6.1'
* stable-6.1:
  Prepare 6.1.1-SNAPSHOT builds
  JGit v6.1.0.202203080745-r
  [checkout] Use .gitattributes from the commit to be checked out
  Don't use final for method parameters
  [push] support the "matching" RefSpecs ":" and "+:"
  [push] Call the pre-push hook later in the push process
  IndexDiff: use tree filter also for SubmoduleWalk
  Run license check with option -Ddash.projectId=technology.jgit
  Exclude transitive dependencies of sshd-sftp
  Update DEPENDENCIES for 6.1.0 release
  Add dependency to dash-licenses
  Fix typos of some keys in LfsText
  Sort LfsText entries alphabetically
  Support for "lfs.url" from ".lfsconfig"

Change-Id: I1b9f0c0ed647837e00b9640d235dbfab2329c5a6
2022-03-09 21:45:35 +01:00
Matthias Sohn 8f7ef245f0 Prepare 6.1.1-SNAPSHOT builds
Change-Id: Ifc80355025d8459245843be1c24dc5a286913e77
2022-03-08 17:04:10 +01:00
Matthias Sohn e982de3fcb JGit v6.1.0.202203080745-r
Change-Id: I8766ed400020c9571f321bbbfe34b0688af0107d
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2022-03-08 13:45:56 +01:00
Thomas Wolf f26ab4ebee [checkout] Use .gitattributes from the commit to be checked out
JGit used only one set of attributes constructed from the global and
info attributes, plus the attributes from working tree, index, and
HEAD.

These attributes must be used to determine whether the working tree is
dirty.

But for actually checking out a file, one must use the attributes from
global, info, and *the commit to be checked out*. Otherwise one may not
pick up definitions that are only in the .gitattributes of the commit
to be checked out or that are changed in that commit with respect to
the attributes currently in HEAD, the index, or the working tree.

Maintain in TreeWalk different Attributes per tree, and add operations
to determine EOL handling and smudge filters per tree.

Use the new methods in DirCacheCheckout and ResolveMerger. Note that
merging in JGit actually used the attributes from the base, not those
from ours, which looks dubious at least. It now uses those from ours,
and for checking out the ones from theirs.

The canBeContentMerged() determination was also done from the base
attributes, and is newly done from the ours attributes. Possibly this
should take into account all three attributes, and only if all three
agree the item can be content merged, a content merge should be
attempted? (What if the binary/text setting changes between base, ours,
or theirs?)

Also note that JGit attempts to perform content merges on non-binary
LFS files; there it used the filter attribute from base, too, even for
the ours and theirs versions. Newly it takes the filter attribute from
the correct tree. I'm not convinced doing content merges on potentially
huge files like LFS files is really a good idea.

Add tests in FilterCommandsTest and LfsGitTest to verify the behavior.

Open question: using index and working tree as fallback for the
attributes of ours (assuming it is HEAD) is OK. But does it also make
sense for base and theirs in merging?

Bug: 578707
Change-Id: I0bf433e9e3eb28479b6272e17c0666e175e67d08
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-07 18:45:25 +01:00
Michael Keppler 600e96dfdc Refer to target platform as file
Since Tycho 2.3 the target platform can be referenced as file, without
using Maven coordinates.

Signed-off-by: Michael Keppler <Michael.Keppler@gmx.de>
Change-Id: I120223dd3dc740fdff13a69201624b4cdc02c6f6
2022-03-07 15:52:58 +01:00
Matthias Sohn 72bba7bd53 Don't use final for method parameters
See https://wiki.eclipse.org/EGit/Contributor_Guide#Use_of_the_.22final.22_modifier

Change-Id: Idc6ed85483e381689e5085c4a1bacd75d26f5489
2022-03-06 18:52:59 +01:00
Thomas Wolf 8a2c769417 [push] support the "matching" RefSpecs ":" and "+:"
The implementation of push.default=matching was not correct.
It used the RefSpec "refs/heads/*:refs/heads/*", which would push
_all_ local branches. But "matching" must push only those local
branches for which a remote branch with the same name already exists
at the remote.

This RefSpec can be expanded only once the advertisement from the
remote has been received.

Enhance RefSpec so that ":" and "+:" can be represented. Introduce a
special RemoteRefUpdate for such a RefSpec; it must carry through the
fetch RefSpecs to be able to fill in the remote tracking updates as
needed. Implement the expansion in PushProcess.

Bug: 353405
Change-Id: I54a4bfbb0a6a7d77b9128bf4a9c951d6586c3df4
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-06 17:30:01 +01:00
Thomas Wolf 90df7c123e [push] Call the pre-push hook later in the push process
Call the pre-push hook only after having received the remote
advertisement and having determined rejections, like C git does.
Also similar to C git, don't pass rejected or up-to-date updates
to the pre-push hook.

Bug: 578852
Change-Id: I51d379ea7bd8234ec815f8f4a9fa325816f476cf
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
2022-03-06 17:30:01 +01:00