openSUSE Commits
Threads by month
- ----- 2024 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
July 2024
- 1 participants
- 1521 discussions
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-pytest-ansible for openSUSE:Factory checked in at 2024-07-04 16:25:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pytest-ansible (Old)
and /work/SRC/openSUSE:Factory/.python-pytest-ansible.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pytest-ansible"
Thu Jul 4 16:25:09 2024 rev:6 rq:1185202 version:24.1.4
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pytest-ansible/python-pytest-ansible.changes 2024-04-23 18:57:44.478075583 +0200
+++ /work/SRC/openSUSE:Factory/.python-pytest-ansible.new.2080/python-pytest-ansible.changes 2024-07-04 16:26:34.522743644 +0200
@@ -1,0 +2,58 @@
+Wed Jul 03 16:45:32 UTC 2024 - opensuse_buildservice(a)ojkastl.de
+
+- Update to version 24.1.4:
+ * Bump pylint from 3.2.4 to 3.2.5 in /.config in the dependencies
+ group (#355)
+ * Sort, lowercase and remove duplicates in .config/dictionary.txt
+ (#354)
+ * Remove flake8 (#351)
+ * Bump the dependencies group across 1 directory with 3 updates
+ (#353)
+ * Resolve module to full qualified name (#352)
+ * Bump the dependencies group in /.config with 7 updates (#349)
+ * Add a couple safety pre-commit checks. (#348)
+ * Move the coverage file into the .cache directory. (#347)
+ * Move the coverage file into the .cache directory. (#346)
+ * Bump the dependencies group in /.config with 10 updates (#345)
+ * Add known first party (#344)
+ * Wrap the long line so it will pass a default yamllint config
+ (#343)
+ * Move tool cache into cache directory to prevent root directory
+ pollution. (#342)
+ * Bump pipdeptree in /.config in the dependencies group (#332)
+ * Ruff inline (#341)
+ * Shift to per error exclusions (#340)
+ * The tox workflow is called by release and therefore needs
+ `workflow_call` (#339)
+ * Allow manually running push for release note generation after a
+ failed or reverted release. (#338)
+ * Switch to pycontrib prettier (#335)
+ * Update for coverage exclude (#331)
+ * Sort, lowercase and remove duplicates in .config/dictionary.txt
+ (#329)
+ * Update codecov yaml file (#327)
+ * Update depndabot config (#326)
+ * Update cspell configuration file (#328)
+ * Update pytest (#323)
+ * Update ack to use org token (#324)
+ * Update mypy configuration (#321)
+ * Update pylint (#320)
+ * Enable ruff with exceptions (#319)
+ * Enable pydocstyle (#318)
+ * Update VsCode files (#317)
+ * Update precommit (#316)
+ * Update tox.ini (#315)
+ * Bump the dev group across 1 directory with 10 updates (#314)
+ * Bump the runtime group in /.config with 2 updates (#312)
+ * Use OIDC authentication for codecov (#311)
+ * Bump the dev group in /.config with 7 updates (#310)
+ * Bump the dev group in /.config with 7 updates (#309)
+ * Bump jinja2 from 3.1.3 to 3.1.4 in /.config (#308)
+ * chore: pre-commit autoupdate (#307)
+ * Bump the dev group in /.config with 8 updates (#306)
+ * Bump pytest from 8.1.1 to 8.2.0 in /.config in the runtime
+ group (#303)
+ * Bump the dev group in /.config with 8 updates (#304)
+ * gha: rename reusable repository (#305)
+
+-------------------------------------------------------------------
Old:
----
pytest-ansible-24.1.3.obscpio
New:
----
pytest-ansible-24.1.4.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pytest-ansible.spec ++++++
--- /var/tmp/diff_new_pack.b59OLE/_old 2024-07-04 16:26:35.398775623 +0200
+++ /var/tmp/diff_new_pack.b59OLE/_new 2024-07-04 16:26:35.398775623 +0200
@@ -46,7 +46,7 @@
%endif
Name: python-pytest-ansible
-Version: 24.1.3
+Version: 24.1.4
Release: 0
Summary: Plugin for pytest to simplify calling ansible modules from tests or fixtures
License: MIT
++++++ _service ++++++
--- /var/tmp/diff_new_pack.b59OLE/_old 2024-07-04 16:26:35.434776938 +0200
+++ /var/tmp/diff_new_pack.b59OLE/_new 2024-07-04 16:26:35.438777084 +0200
@@ -2,7 +2,7 @@
<service name="obs_scm" mode="manual">
<param name="url">https://github.com/ansible-community/pytest-ansible</param>
<param name="scm">git</param>
- <param name="revision">v24.1.3</param>
+ <param name="revision">v24.1.4</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>
<param name="versionrewrite-pattern">v(.*)</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.b59OLE/_old 2024-07-04 16:26:35.458777814 +0200
+++ /var/tmp/diff_new_pack.b59OLE/_new 2024-07-04 16:26:35.462777960 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/ansible-community/pytest-ansible</param>
- <param name="changesrevision">d357f58bec06e4332e9f3c677d301e0151b3b2cd</param></service></servicedata>
+ <param name="changesrevision">e93d5e4ff864161458cd52961a13cfe261b7d656</param></service></servicedata>
(No newline at EOF)
++++++ pytest-ansible-24.1.3.obscpio -> pytest-ansible-24.1.4.obscpio ++++++
++++ 4942 lines of diff (skipped)
++++++ pytest-ansible.obsinfo ++++++
--- /var/tmp/diff_new_pack.b59OLE/_old 2024-07-04 16:26:35.610783363 +0200
+++ /var/tmp/diff_new_pack.b59OLE/_new 2024-07-04 16:26:35.610783363 +0200
@@ -1,5 +1,5 @@
name: pytest-ansible
-version: 24.1.3
-mtime: 1713779654
-commit: d357f58bec06e4332e9f3c677d301e0151b3b2cd
+version: 24.1.4
+mtime: 1719715401
+commit: e93d5e4ff864161458cd52961a13cfe261b7d656
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-awx-cli for openSUSE:Factory checked in at 2024-07-04 16:25:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-awx-cli (Old)
and /work/SRC/openSUSE:Factory/.python-awx-cli.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-awx-cli"
Thu Jul 4 16:25:01 2024 rev:6 rq:1185185 version:24.6.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-awx-cli/python-awx-cli.changes 2024-06-24 20:52:41.186978016 +0200
+++ /work/SRC/openSUSE:Factory/.python-awx-cli.new.2080/python-awx-cli.changes 2024-07-04 16:26:22.210294180 +0200
@@ -1,0 +2,7 @@
+Wed Jul 3 16:24:42 UTC 2024 - Johannes Kastl <opensuse_buildservice(a)ojkastl.de>
+
+- update to 24.6.1:
+ https://github.com/ansible/awx/releases/tag/24.6.1
+ No CLI-related changes mentioned in the release notes
+
+-------------------------------------------------------------------
Old:
----
awx-24.6.0.obscpio
New:
----
awx-24.6.1.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-awx-cli.spec ++++++
--- /var/tmp/diff_new_pack.Nu9vyw/_old 2024-07-04 16:26:22.938320756 +0200
+++ /var/tmp/diff_new_pack.Nu9vyw/_new 2024-07-04 16:26:22.938320756 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-awx-cli
-Version: 24.6.0
+Version: 24.6.1
Release: 0
Summary: CLI for the AWX Ansible web platform
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.Nu9vyw/_old 2024-07-04 16:26:22.982322363 +0200
+++ /var/tmp/diff_new_pack.Nu9vyw/_new 2024-07-04 16:26:22.982322363 +0200
@@ -4,7 +4,7 @@
<param name="scm">git</param>
<param name="exclude">.git</param>
<param name="subdir">awxkit</param>
- <param name="revision">24.6.0</param>
+ <param name="revision">24.6.1</param>
<param name="versionformat">@PARENT_TAG@</param>
</service>
<service name="set_version" mode="manual">
++++++ awx-24.6.0.obscpio -> awx-24.6.1.obscpio ++++++
++++++ awx.obsinfo ++++++
--- /var/tmp/diff_new_pack.Nu9vyw/_old 2024-07-04 16:26:23.110327036 +0200
+++ /var/tmp/diff_new_pack.Nu9vyw/_new 2024-07-04 16:26:23.114327182 +0200
@@ -1,5 +1,5 @@
name: awx
-version: 24.6.0
-mtime: 1718915674
-commit: 4738c8333a917ef09fa85ff2b50b9c9c03adaf4f
+version: 24.6.1
+mtime: 1719954322
+commit: 94e5795dfc37b95c576d61f3e3b4e936c021548c
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package kor for openSUSE:Factory checked in at 2024-07-04 16:24:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kor (Old)
and /work/SRC/openSUSE:Factory/.kor.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kor"
Thu Jul 4 16:24:55 2024 rev:20 rq:1185195 version:0.5.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/kor/kor.changes 2024-06-19 16:39:41.628030821 +0200
+++ /work/SRC/openSUSE:Factory/.kor.new.2080/kor.changes 2024-07-04 16:26:13.521976921 +0200
@@ -1,0 +2,12 @@
+Wed Jul 03 16:36:27 UTC 2024 - opensuse_buildservice(a)ojkastl.de
+
+- Update to version 0.5.2:
+ * Fix: Add filters to replicasets (#324)
+ * fix(multi): Support grouping by resource in multi resource mode
+ (#320)
+ * fix(delete): Refactor input handling & output display on
+ resource deletion (#323)
+ * feat: add CI step to package and publish Helm chart (#306)
+ * update readme to show unused reason (#317)
+
+-------------------------------------------------------------------
Old:
----
kor-0.5.1.obscpio
New:
----
kor-0.5.2.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ kor.spec ++++++
--- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.370044412 +0200
+++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.370044412 +0200
@@ -19,7 +19,7 @@
%define __arch_install_post export NO_BRP_STRIP_DEBUG=true
Name: kor
-Version: 0.5.1
+Version: 0.5.2
Release: 0
Summary: Tool to discover unused Kubernetes Resources
License: MIT
++++++ _service ++++++
--- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.406045727 +0200
+++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.406045727 +0200
@@ -3,7 +3,7 @@
<param name="url">https://github.com/yonahd/kor</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="revision">v0.5.1</param>
+ <param name="revision">v0.5.2</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>
<param name="versionrewrite-pattern">v(.*)</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.430046603 +0200
+++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.434046750 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/yonahd/kor</param>
- <param name="changesrevision">ced2ef283271806d0102c102f21c28766344d423</param></service></servicedata>
+ <param name="changesrevision">181141dcce1fb608e6982500e88b8f0609b47356</param></service></servicedata>
(No newline at EOF)
++++++ kor-0.5.1.obscpio -> kor-0.5.2.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/.github/workflows/release.yml new/kor-0.5.2/.github/workflows/release.yml
--- old/kor-0.5.1/.github/workflows/release.yml 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/.github/workflows/release.yml 2024-06-26 10:08:43.000000000 +0200
@@ -53,3 +53,14 @@
- name: Update new version in krew-index
uses: rajatjindal/krew-release-bot(a)v0.0.46
+
+ - name: Configure Git
+ run: |
+ git config user.name "$GITHUB_ACTOR"
+ git config user.email "$GITHUB_ACTOR(a)users.noreply.github.com"
+
+ - name: Run chart-releaser
+ uses: helm/chart-releaser-action(a)v1.6.0
+ env:
+ CR_TOKEN: "${{ secrets.RELEASE_GITHUB_TOKEN }}"
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/README.md new/kor-0.5.2/README.md
--- old/kor-0.5.1/README.md 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/README.md 2024-06-26 10:08:43.000000000 +0200
@@ -31,7 +31,7 @@
- StorageClasses
- NetworkPolicies
-![Kor Screenshot](/images/screenshot.png)
+![Kor Screenshot](/images/show_reason_screenshot.png)
## Installation
@@ -224,6 +224,27 @@
Kor supports three output formats: `table`, `json`, and `yaml`. The default output format is `table`.
Additionally, you can use the `--group-by` flag to group the output by `namespace` or `resource`.
+#### Show reason
+
+```sh
+kor all -n test --show-reason
+```
+```
+Unused resources in namespace: "test"
++---+----------------+----------------------------------------------+--------------------------------------------------------+
+| # | RESOURCE TYPE | RESOURCE NAME | REASON |
++---+----------------+----------------------------------------------+--------------------------------------------------------+
+| 1 | Service | do-not-delete | Marked with unused label |
+| 2 | Ingress | example-ingress | Ingress does not have a valid backend service |
+| 3 | Ingress | example-ingress2 | Ingress does not have a valid backend service |
+| 4 | ConfigMap | prober-blackbox-config | ConfigMap is not used in any pod or container |
+| 5 | ConfigMap | release-name-prober-operator-blackbox-config | ConfigMap is not used in any pod or container |
+| 6 | ConfigMap | unused-cm | ConfigMap is not used in any pod or container |
+| 7 | ServiceAccount | my-service-account2 | ServiceAccount is not in use |
+| 8 | Pdb | my-pdb | Pdb is not referencing any deployments or statefulsets |
++---+----------------+----------------------------------------------+--------------------------------------------------------+
+```
+
#### Group by resource
```sh
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/charts/kor/Chart.yaml new/kor-0.5.2/charts/kor/Chart.yaml
--- old/kor-0.5.1/charts/kor/Chart.yaml 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/charts/kor/Chart.yaml 2024-06-26 10:08:43.000000000 +0200
@@ -2,8 +2,17 @@
name: kor
description: A Kubernetes Helm Chart to discover orphaned resources using kor
type: application
-version: 0.1.8
-appVersion: "0.4.3"
+version: 0.1.9
+appVersion: "0.5.1"
maintainers:
- name: "yonahd"
url: "https://github.com/yonahd/kor"
+annotations:
+ "artifacthub.io/license": MIT
+ "artifacthub.io/links": |
+ - name: Application Source
+ url: https://github.com/yonahd/kor
+ - name: Chart Source
+ url: https://github.com/yonahd/kor/tree/main/charts/kor
+ - name: Grafana Dashboard
+ url: https://grafana.com/grafana/dashboards/19863-kor-dashboard/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/charts/kor/README.md new/kor-0.5.2/charts/kor/README.md
--- old/kor-0.5.1/charts/kor/README.md 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/charts/kor/README.md 2024-06-26 10:08:43.000000000 +0200
@@ -1,6 +1,6 @@
# kor
-![Version: 0.1.8](https://img.shields.io/badge/Version-0.1.8-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.4.3](https://img.shields.io/badge/AppVersion-0.4.3-informational?style=flat-square)
+![Version: 0.1.9](https://img.shields.io/badge/Version-0.1.9-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.5.1](https://img.shields.io/badge/AppVersion-0.5.1-informational?style=flat-square)
A Kubernetes Helm Chart to discover orphaned resources using kor
Binary files old/kor-0.5.1/images/show_reason_screenshot.png and new/kor-0.5.2/images/show_reason_screenshot.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/clusterroles.go new/kor-0.5.2/pkg/kor/clusterroles.go
--- old/kor-0.5.1/pkg/kor/clusterroles.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/clusterroles.go 2024-06-26 10:08:43.000000000 +0200
@@ -44,9 +44,6 @@
usedClusterRoles := make(map[string]bool)
for _, rb := range roleBindingsAllNameSpaces {
- if pass, _ := filter.Run(filterOpts); pass {
- continue
- }
usedClusterRoles[rb.RoleRef.Name] = true
if rb.RoleRef.Kind == "ClusterRole" {
usedClusterRoles[rb.RoleRef.Name] = true
@@ -61,9 +58,6 @@
}
for _, crb := range clusterRoleBindings.Items {
- if pass, _ := filter.Run(filterOpts); pass {
- continue
- }
usedClusterRoles[crb.RoleRef.Name] = true
}
@@ -191,6 +185,11 @@
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to process cluster role : %v\n", err)
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, "", "ClusterRole", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete clusterRole %s : %v\n", diff, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[""] = make(map[string][]ResourceInfo)
@@ -198,11 +197,6 @@
case "resource":
appendResources(resources, "ClusterRole", "", diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, "", "ClusterRole", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete clusterRole %s : %v\n", diff, err)
- }
- }
var outputBuffer bytes.Buffer
var jsonResponse []byte
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/configmaps.go new/kor-0.5.2/pkg/kor/configmaps.go
--- old/kor-0.5.1/pkg/kor/configmaps.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/configmaps.go 2024-06-26 10:08:43.000000000 +0200
@@ -166,6 +166,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "ConfigMap", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete ConfigMap %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -173,11 +178,6 @@
case "resource":
appendResources(resources, "ConfigMap", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "ConfigMap", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete ConfigMap %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/daemonsets.go new/kor-0.5.2/pkg/kor/daemonsets.go
--- old/kor-0.5.1/pkg/kor/daemonsets.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/daemonsets.go 2024-06-26 10:08:43.000000000 +0200
@@ -67,6 +67,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "DaemonSet", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete DaemonSet %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -74,11 +79,6 @@
case "resource":
appendResources(resources, "DaemonSet", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "DaemonSet", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete DaemonSet %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/delete.go new/kor-0.5.2/pkg/kor/delete.go
--- old/kor-0.5.1/pkg/kor/delete.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/delete.go 2024-06-26 10:08:43.000000000 +0200
@@ -270,58 +270,7 @@
return remainingResources, nil
}
-func DeleteResource(diff []string, clientset kubernetes.Interface, namespace, resourceType string, noInteractive bool) ([]string, error) {
- deletedDiff := []string{}
-
- for _, resourceName := range diff {
- deleteFunc, exists := DeleteResourceCmd()[resourceType]
- if !exists {
- fmt.Printf("Resource type '%s' is not supported\n", resourceName)
- continue
- }
-
- if !noInteractive {
- fmt.Printf("Do you want to delete %s %s in namespace %s? (Y/N): ", resourceType, resourceName, namespace)
- var confirmation string
- _, err := fmt.Scanf("%s", &confirmation)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err)
- continue
- }
-
- if strings.ToLower(confirmation) != "y" && strings.ToLower(confirmation) != "yes" {
- deletedDiff = append(deletedDiff, resourceName)
-
- fmt.Printf("Do you want flag the resource %s %s in namespace %s as In Use? (Y/N): ", resourceType, resourceName, namespace)
- var inUse string
- _, err := fmt.Scanf("%s", &inUse)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err)
- continue
- }
-
- if strings.ToLower(inUse) == "y" || strings.ToLower(inUse) == "yes" {
- if err := FlagResource(clientset, namespace, resourceType, resourceName); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to flag resource %s %s in namespace %s as In Use: %v\n", resourceType, resourceName, namespace, err)
- }
- continue
- }
- continue
- }
- }
-
- fmt.Printf("Deleting %s %s in namespace %s\n", resourceType, resourceName, namespace)
- if err := deleteFunc(clientset, namespace, resourceName); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete %s %s in namespace %s: %v\n", resourceType, resourceName, namespace, err)
- continue
- }
- deletedDiff = append(deletedDiff, resourceName+"-DELETED")
- }
-
- return deletedDiff, nil
-}
-
-func DeleteResource2(diff []ResourceInfo, clientset kubernetes.Interface, namespace, resourceType string, noInteractive bool) ([]ResourceInfo, error) {
+func DeleteResource(diff []ResourceInfo, clientset kubernetes.Interface, namespace, resourceType string, noInteractive bool) ([]ResourceInfo, error) {
deletedDiff := []ResourceInfo{}
for _, resource := range diff {
@@ -334,7 +283,7 @@
if !noInteractive {
fmt.Printf("Do you want to delete %s %s in namespace %s? (Y/N): ", resourceType, resource.Name, namespace)
var confirmation string
- _, err := fmt.Scanf("%s", &confirmation)
+ _, err := fmt.Scanf("%s\n", &confirmation)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err)
continue
@@ -345,7 +294,7 @@
fmt.Printf("Do you want flag the resource %s %s in namespace %s as In Use? (Y/N): ", resourceType, resource.Name, namespace)
var inUse string
- _, err := fmt.Scanf("%s", &inUse)
+ _, err := fmt.Scanf("%s\n", &inUse)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err)
continue
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/delete_test.go new/kor-0.5.2/pkg/kor/delete_test.go
--- old/kor-0.5.1/pkg/kor/delete_test.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/delete_test.go 2024-06-26 10:08:43.000000000 +0200
@@ -15,26 +15,42 @@
func TestDeleteResource(t *testing.T) {
clientset := fake.NewSimpleClientset()
+ configmap1 := CreateTestConfigmap(testNamespace, "configmap-1", AppLabels)
+ _, err := clientset.CoreV1().ConfigMaps(testNamespace).Create(context.TODO(), configmap1, metav1.CreateOptions{})
+ if err != nil {
+ t.Fatalf("Error creating fake configmap: %v", err)
+ }
+ configmap2 := CreateTestConfigmap(testNamespace, "configmap-2", AppLabels)
+ _, err = clientset.CoreV1().ConfigMaps(testNamespace).Create(context.TODO(), configmap2, metav1.CreateOptions{})
+ if err != nil {
+ t.Fatalf("Error creating fake configmap: %v", err)
+ }
+
tests := []struct {
name string
- diff []string
+ diff []ResourceInfo
resourceType string
- expectedDiff []string
+ expectedDiff []ResourceInfo
expectedError bool
}{
{
- name: "Test deletion confirmation",
- diff: []string{"resource1", "resource2"},
- resourceType: "ConfigMap",
- expectedDiff: []string{"resource1-DELETED", "resource2"},
+ name: "Test deletion confirmation",
+ diff: []ResourceInfo{
+ {Name: configmap1.Name, Reason: "ConfigMap is not used in any pod or container"},
+ {Name: configmap2.Name, Reason: "Marked with unused label"},
+ },
+ resourceType: "ConfigMap",
+ expectedDiff: []ResourceInfo{
+ {Name: configmap1.Name + "-DELETED", Reason: "ConfigMap is not used in any pod or container"},
+ {Name: configmap2.Name + "-DELETED", Reason: "Marked with unused label"},
+ },
expectedError: false,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
- deletedDiff, _ := DeleteResource(test.diff, clientset, "namespace", test.resourceType, true)
-
+ deletedDiff, _ := DeleteResource(test.diff, clientset, testNamespace, test.resourceType, true)
for i, deleted := range deletedDiff {
if deleted != test.expectedDiff[i] {
t.Errorf("Expected: %s, Got: %s", test.expectedDiff[i], deleted)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/deployments.go new/kor-0.5.2/pkg/kor/deployments.go
--- old/kor-0.5.1/pkg/kor/deployments.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/deployments.go 2024-06-26 10:08:43.000000000 +0200
@@ -49,6 +49,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Deployment", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Deployment %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -56,11 +61,6 @@
case "resource":
appendResources(resources, "Deployment", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Deployment", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Deployment %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/finalizers.go new/kor-0.5.2/pkg/kor/finalizers.go
--- old/kor-0.5.1/pkg/kor/finalizers.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/finalizers.go 2024-06-26 10:08:43.000000000 +0200
@@ -47,7 +47,7 @@
continue
}
for _, item := range resourceList.Items {
- if pass, _ := filter.Run(filterOpts); pass {
+ if pass, _ := filter.SetObject(&item).Run(filterOpts); pass {
continue
}
if CheckFinalizers(item.GetFinalizers(), item.GetDeletionTimestamp()) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/formatter.go new/kor-0.5.2/pkg/kor/formatter.go
--- old/kor-0.5.1/pkg/kor/formatter.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/formatter.go 2024-06-26 10:08:43.000000000 +0200
@@ -148,7 +148,7 @@
}
}
table.Render()
- return fmt.Sprintf("Unused %ss:\n%s", resource, buf.String())
+ return fmt.Sprintf("Unused %ss:\n%s\n", resource, buf.String())
}
func appendResources(resources map[string]map[string][]ResourceInfo, resourceType, namespace string, diff []ResourceInfo) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/hpas.go new/kor-0.5.2/pkg/kor/hpas.go
--- old/kor-0.5.1/pkg/kor/hpas.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/hpas.go 2024-06-26 10:08:43.000000000 +0200
@@ -88,6 +88,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "HPA", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete HPA %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -95,11 +100,6 @@
case "resource":
appendResources(resources, "Hpa", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "HPA", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete HPA %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/ingresses.go new/kor-0.5.2/pkg/kor/ingresses.go
--- old/kor-0.5.1/pkg/kor/ingresses.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/ingresses.go 2024-06-26 10:08:43.000000000 +0200
@@ -36,7 +36,7 @@
usedIngresses := []string{}
for _, ingress := range ingresses.Items {
- if pass, _ := filter.Run(filterOpts); pass {
+ if pass, _ := filter.SetObject(&ingress).Run(filterOpts); pass {
continue
}
@@ -124,6 +124,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Ingress", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Ingress %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -131,11 +136,6 @@
case "resource":
appendResources(resources, "Ingress", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Ingress", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Ingress %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/jobs.go new/kor-0.5.2/pkg/kor/jobs.go
--- old/kor-0.5.1/pkg/kor/jobs.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/jobs.go 2024-06-26 10:08:43.000000000 +0200
@@ -73,6 +73,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Job", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Job %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -80,11 +85,6 @@
case "resource":
appendResources(resources, "Job", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Job", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Job %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/multi.go new/kor-0.5.2/pkg/kor/multi.go
--- old/kor-0.5.1/pkg/kor/multi.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/multi.go 2024-06-26 10:08:43.000000000 +0200
@@ -97,64 +97,62 @@
}
func GetUnusedMulti(resourceNames string, filterOpts *filters.Options, clientset kubernetes.Interface, apiExtClient apiextensionsclientset.Interface, dynamicClient dynamic.Interface, outputFormat string, opts Opts) (string, error) {
- var allDiffs []ResourceDiff
- var outputBuffer bytes.Buffer
- var unusedMulti string
resourceList := strings.Split(resourceNames, ",")
namespaces := filterOpts.Namespaces(clientset)
- response := make(map[string]map[string][]ResourceInfo)
+ resources := make(map[string]map[string][]ResourceInfo)
var err error
noNamespaceDiff, resourceList := retrieveNoNamespaceDiff(clientset, apiExtClient, dynamicClient, resourceList, filterOpts)
if len(noNamespaceDiff) != 0 {
for _, diff := range noNamespaceDiff {
if len(diff.diff) != 0 {
- output := FormatOutputAll("", []ResourceDiff{diff}, opts)
- outputBuffer.WriteString(output)
-
- resourceMap := make(map[string][]ResourceInfo)
- resourceMap[diff.resourceType] = diff.diff
- response[""] = resourceMap
+ if opts.DeleteFlag {
+ if diff.diff, err = DeleteResource(diff.diff, clientset, "", diff.resourceType, opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete %s %s: %v\n", diff.resourceType, diff.diff, err)
+ }
+ }
+ switch opts.GroupBy {
+ case "namespace":
+ resources[""] = make(map[string][]ResourceInfo)
+ resources[""][diff.resourceType] = diff.diff
+ case "resource":
+ appendResources(resources, diff.resourceType, "", diff.diff)
+ }
}
}
-
- resourceMap := make(map[string][]ResourceInfo)
- for _, diff := range noNamespaceDiff {
- resourceMap[diff.resourceType] = diff.diff
- }
- response[""] = resourceMap
-
}
for _, namespace := range namespaces {
- allDiffs = retrieveNamespaceDiffs(clientset, namespace, resourceList, filterOpts)
-
- if opts.DeleteFlag {
- for _, diff := range allDiffs {
- if diff.diff, err = DeleteResource2(diff.diff, clientset, namespace, diff.resourceType, opts.NoInteractive); err != nil {
+ allDiffs := retrieveNamespaceDiffs(clientset, namespace, resourceList, filterOpts)
+ for _, diff := range allDiffs {
+ if opts.DeleteFlag {
+ if diff.diff, err = DeleteResource(diff.diff, clientset, namespace, diff.resourceType, opts.NoInteractive); err != nil {
fmt.Fprintf(os.Stderr, "Failed to delete %s %s in namespace %s: %v\n", diff.resourceType, diff.diff, namespace, err)
}
}
-
- }
- output := FormatOutputAll(namespace, allDiffs, opts)
- if output != "" {
- outputBuffer.WriteString(output)
-
- resourceMap := make(map[string][]ResourceInfo)
- for _, diff := range allDiffs {
- resourceMap[diff.resourceType] = diff.diff
+ switch opts.GroupBy {
+ case "namespace":
+ resources[namespace] = make(map[string][]ResourceInfo)
+ resources[namespace][diff.resourceType] = diff.diff
+ case "resource":
+ appendResources(resources, diff.resourceType, namespace, diff.diff)
}
- response[namespace] = resourceMap
}
}
- jsonResponse, err := json.MarshalIndent(response, "", " ")
- if err != nil {
- return "", err
+ var outputBuffer bytes.Buffer
+ var jsonResponse []byte
+ switch outputFormat {
+ case "table":
+ outputBuffer = FormatOutput(resources, opts)
+ case "json", "yaml":
+ var err error
+ if jsonResponse, err = json.MarshalIndent(resources, "", " "); err != nil {
+ return "", err
+ }
}
- unusedMulti, err = unusedResourceFormatter(outputFormat, outputBuffer, opts, jsonResponse)
+ unusedMulti, err := unusedResourceFormatter(outputFormat, outputBuffer, opts, jsonResponse)
if err != nil {
fmt.Printf("err: %v\n", err)
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/networkpolicies.go new/kor-0.5.2/pkg/kor/networkpolicies.go
--- old/kor-0.5.1/pkg/kor/networkpolicies.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/networkpolicies.go 2024-06-26 10:08:43.000000000 +0200
@@ -62,7 +62,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
-
+ if opts.DeleteFlag {
+ if diff, err := DeleteResource(diff, clientset, namespace, "NetworkPolicy", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete NetworkPolicy %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -70,12 +74,6 @@
case "resource":
appendResources(resources, "NetworkPolicy", namespace, diff)
}
-
- if opts.DeleteFlag {
- if diff, err := DeleteResource2(diff, clientset, namespace, "NetworkPolicy", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete NetworkPolicy %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pdbs.go new/kor-0.5.2/pkg/kor/pdbs.go
--- old/kor-0.5.1/pkg/kor/pdbs.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/pdbs.go 2024-06-26 10:08:43.000000000 +0200
@@ -89,6 +89,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "PDB", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete PDB %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -96,11 +101,6 @@
case "resource":
appendResources(resources, "Pdb", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "PDB", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete PDB %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pods.go new/kor-0.5.2/pkg/kor/pods.go
--- old/kor-0.5.1/pkg/kor/pods.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/pods.go 2024-06-26 10:08:43.000000000 +0200
@@ -51,6 +51,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Pod", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Pod %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -58,11 +63,6 @@
case "resource":
appendResources(resources, "Pod", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Pod", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Pod %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pv.go new/kor-0.5.2/pkg/kor/pv.go
--- old/kor-0.5.1/pkg/kor/pv.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/pv.go 2024-06-26 10:08:43.000000000 +0200
@@ -50,6 +50,11 @@
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to process pvs: %v\n", err)
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, "", "PV", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete PV %s: %v\n", diff, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[""] = make(map[string][]ResourceInfo)
@@ -57,11 +62,6 @@
case "resource":
appendResources(resources, "Pv", "", diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, "", "PV", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete PV %s: %v\n", diff, err)
- }
- }
var outputBuffer bytes.Buffer
var jsonResponse []byte
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pvc.go new/kor-0.5.2/pkg/kor/pvc.go
--- old/kor-0.5.1/pkg/kor/pvc.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/pvc.go 2024-06-26 10:08:43.000000000 +0200
@@ -80,6 +80,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "PVC", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete PVC %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -87,11 +92,6 @@
case "resource":
appendResources(resources, "Pvc", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "PVC", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete PVC %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/replicaset.go new/kor-0.5.2/pkg/kor/replicaset.go
--- old/kor-0.5.1/pkg/kor/replicaset.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/replicaset.go 2024-06-26 10:08:43.000000000 +0200
@@ -22,7 +22,7 @@
var unusedReplicaSetNames []ResourceInfo
for _, replicaSet := range replicaSetList.Items {
- if pass, _ := filter.Run(filterOpts); pass {
+ if pass, _ := filter.SetObject(&replicaSet).Run(filterOpts); pass {
continue
}
@@ -44,6 +44,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "ReplicaSet", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete ReplicaSet %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -51,11 +56,6 @@
case "resource":
appendResources(resources, "ReplicaSet", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "ReplicaSet", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete ReplicaSet %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/roles.go new/kor-0.5.2/pkg/kor/roles.go
--- old/kor-0.5.1/pkg/kor/roles.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/roles.go 2024-06-26 10:08:43.000000000 +0200
@@ -18,7 +18,7 @@
//go:embed exceptions/roles/roles.json
var rolesConfig []byte
-func retrieveUsedRoles(clientset kubernetes.Interface, namespace string, filterOpts *filters.Options) ([]string, error) {
+func retrieveUsedRoles(clientset kubernetes.Interface, namespace string) ([]string, error) {
// Get a list of all role bindings in the specified namespace
roleBindings, err := clientset.RbacV1().RoleBindings(namespace).List(context.TODO(), metav1.ListOptions{})
if err != nil {
@@ -27,10 +27,6 @@
usedRoles := make(map[string]bool)
for _, rb := range roleBindings.Items {
- if pass, _ := filter.Run(filterOpts); pass {
- continue
- }
-
usedRoles[rb.RoleRef.Name] = true
}
@@ -78,7 +74,7 @@
}
func processNamespaceRoles(clientset kubernetes.Interface, namespace string, filterOpts *filters.Options) ([]ResourceInfo, error) {
- usedRoles, err := retrieveUsedRoles(clientset, namespace, filterOpts)
+ usedRoles, err := retrieveUsedRoles(clientset, namespace)
if err != nil {
return nil, err
}
@@ -113,6 +109,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Role", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Role %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -120,11 +121,6 @@
case "resource":
appendResources(resources, "Role", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Role", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Role %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/roles_test.go new/kor-0.5.2/pkg/kor/roles_test.go
--- old/kor-0.5.1/pkg/kor/roles_test.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/roles_test.go 2024-06-26 10:08:43.000000000 +0200
@@ -63,7 +63,7 @@
func TestRetrieveUsedRoles(t *testing.T) {
clientset := createTestRoles(t)
- usedRoles, err := retrieveUsedRoles(clientset, testNamespace, &filters.Options{})
+ usedRoles, err := retrieveUsedRoles(clientset, testNamespace)
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/secrets.go new/kor-0.5.2/pkg/kor/secrets.go
--- old/kor-0.5.1/pkg/kor/secrets.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/secrets.go 2024-06-26 10:08:43.000000000 +0200
@@ -203,6 +203,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Secret", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Secret %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -210,11 +215,6 @@
case "resource":
appendResources(resources, "Secret", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Secret", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Secret %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/serviceaccounts.go new/kor-0.5.2/pkg/kor/serviceaccounts.go
--- old/kor-0.5.1/pkg/kor/serviceaccounts.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/serviceaccounts.go 2024-06-26 10:08:43.000000000 +0200
@@ -171,6 +171,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "ServiceAccount", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Serviceaccount %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[namespace] = make(map[string][]ResourceInfo)
@@ -178,11 +183,6 @@
case "resource":
appendResources(resources, "ServiceAccount", namespace, diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "ServiceAccount", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Serviceaccount %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/services.go new/kor-0.5.2/pkg/kor/services.go
--- old/kor-0.5.1/pkg/kor/services.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/services.go 2024-06-26 10:08:43.000000000 +0200
@@ -31,7 +31,7 @@
var endpointsWithoutSubsets []ResourceInfo
for _, endpoints := range endpointsList.Items {
- if pass, _ := filter.Run(filterOpts); pass {
+ if pass, _ := filter.SetObject(&endpoints).Run(filterOpts); pass {
continue
}
@@ -68,7 +68,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
-
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "Service", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Service %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
if diff != nil {
@@ -79,13 +83,6 @@
if diff != nil {
appendResources(resources, "Service", namespace, diff)
}
-
- }
-
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "Service", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Service %s in namespace %s: %v\n", diff, namespace, err)
- }
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/statefulsets.go new/kor-0.5.2/pkg/kor/statefulsets.go
--- old/kor-0.5.1/pkg/kor/statefulsets.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/statefulsets.go 2024-06-26 10:08:43.000000000 +0200
@@ -22,7 +22,7 @@
var statefulSetsWithoutReplicas []ResourceInfo
for _, statefulSet := range statefulSetsList.Items {
- if pass, _ := filter.Run(filterOpts); pass {
+ if pass, _ := filter.SetObject(&statefulSet).Run(filterOpts); pass {
continue
}
@@ -51,6 +51,11 @@
fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err)
continue
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, namespace, "StatefulSet", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete Statefulset %s in namespace %s: %v\n", diff, namespace, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
if diff != nil {
@@ -62,11 +67,6 @@
appendResources(resources, "StatefulSet", namespace, diff)
}
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, namespace, "StatefulSet", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete Statefulset %s in namespace %s: %v\n", diff, namespace, err)
- }
- }
}
var outputBuffer bytes.Buffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/storageclasses.go new/kor-0.5.2/pkg/kor/storageclasses.go
--- old/kor-0.5.1/pkg/kor/storageclasses.go 2024-06-18 20:44:31.000000000 +0200
+++ new/kor-0.5.2/pkg/kor/storageclasses.go 2024-06-26 10:08:43.000000000 +0200
@@ -104,6 +104,11 @@
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to process storageClasses: %v\n", err)
}
+ if opts.DeleteFlag {
+ if diff, err = DeleteResource(diff, clientset, "", "StorageClass", opts.NoInteractive); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to delete StorageClass %s: %v\n", diff, err)
+ }
+ }
switch opts.GroupBy {
case "namespace":
resources[""] = make(map[string][]ResourceInfo)
@@ -111,11 +116,6 @@
case "resource":
appendResources(resources, "StorageClass", "", diff)
}
- if opts.DeleteFlag {
- if diff, err = DeleteResource2(diff, clientset, "", "StorageClass", opts.NoInteractive); err != nil {
- fmt.Fprintf(os.Stderr, "Failed to delete StorageClass %s: %v\n", diff, err)
- }
- }
var outputBuffer bytes.Buffer
var jsonResponse []byte
++++++ kor.obsinfo ++++++
--- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.610053177 +0200
+++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.614053323 +0200
@@ -1,5 +1,5 @@
name: kor
-version: 0.5.1
-mtime: 1718736271
-commit: ced2ef283271806d0102c102f21c28766344d423
+version: 0.5.2
+mtime: 1719389323
+commit: 181141dcce1fb608e6982500e88b8f0609b47356
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/kor/vendor.tar.gz /work/SRC/openSUSE:Factory/.kor.new.2080/vendor.tar.gz differ: char 5, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package cilium-cli for openSUSE:Factory checked in at 2024-07-04 16:24:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/cilium-cli (Old)
and /work/SRC/openSUSE:Factory/.cilium-cli.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cilium-cli"
Thu Jul 4 16:24:45 2024 rev:69 rq:1185180 version:0.16.11
Changes:
--------
--- /work/SRC/openSUSE:Factory/cilium-cli/cilium-cli.changes 2024-06-10 17:37:35.666865548 +0200
+++ /work/SRC/openSUSE:Factory/.cilium-cli.new.2080/cilium-cli.changes 2024-07-04 16:26:04.913662544 +0200
@@ -1,0 +2,61 @@
+Wed Jul 03 16:10:01 UTC 2024 - opensuse_buildservice(a)ojkastl.de
+
+- Update to version 0.16.11:
+ * Prepare for v0.16.11 release
+ * ci: speedup workflows
+ * sysdump: derive operator namespace from agent namespace if
+ specified
+ * sysdump: fix no Cilium output if operator was not detected
+ * fix(deps): update all go dependencies main
+ * image: Push Docker image on tag push
+ * Remove cilium-cli-test-job-chart
+ * aks: Temporarily disable Hubble Relay
+ * fix(deps): update module github.com/cilium/cilium to
+ v1.16.0-rc.0
+ * multicluster: Run cilium-cli inside a container
+ * chore(deps): update docker/build-push-action action to v6.2.0
+ * fix: ExternalTargetCANamespace name
+ * eks: Run cilium-cli inside a container
+ * connectivity: Ensure Hubble Relay is connected to all the nodes
+ * external-workloads: Run cilium-cli inside a container
+ * gke: Run cilium-cli inside a container
+ * gha: fix cluster names in kind workflow
+ * autodetect: try to sanitize autodetected cluster name
+ * azure: directly retrieve cluster name from kubeconfig
+ * action: Add an option to run cilium-cli inside a container
+ * connectivity: Add pod-to-pod-no-frag
+ * connectivity: Extend PingCommand to accept extra args
+ * chore(deps): pin ubuntu docker tag to 2e863c4
+ * connectivity: refactor initClients
+ * connectivity: introduce detectSingleNode method
+ * Dockerfile: Install aws / azure / gcloud CLIs
+ * chore(deps): update docker/build-push-action action to v6.1.0
+ * chore(deps): update all github action dependencies
+ * chore(deps): update golang:1.22.4-alpine3.19 docker digest to
+ c46c460
+ * chore(deps): update docker.io/library/golang:1.22.4-alpine3.19
+ docker digest to c46c460
+ * chore(deps): update quay.io/cilium/alpine-curl docker tag to
+ v1.10.0
+ * chore(deps): update docker.io/library/golang:1.22.4-alpine3.19
+ docker digest to e43a04e
+ * chore(deps): update golang-images
+ * gh/workflows: Fix display img digest step
+ * connectivity: Display last assertion error on failure
+ * connectivity: Extend pod-to-pod encryption tests
+ * chore(deps): update docker/build-push-action action to v6
+ * fix(deps): update all go dependencies main
+ * chore(deps): update docker.io/library/golang:1.22.4-alpine3.19
+ docker digest to d9b1f00
+ * chore(deps): update docker/build-push-action action to v5.4.0
+ * chore(deps): update golangci/golangci-lint docker tag to
+ v1.59.1
+ * chore(deps): update golang-images
+ * Pick up the latest cilium/cilium from main branch
+ * chore(deps): update dependency cilium/cilium to v1.15.6
+ * chore(deps): update actions/checkout action to v4.1.7
+ * gha: increase disk size for GKE clusters
+ * fix(deps): update github.com/cilium/charts digest to 4be5659
+ * Update stable release to v0.16.10
+
+-------------------------------------------------------------------
Old:
----
cilium-cli-0.16.10.obscpio
New:
----
cilium-cli-0.16.11.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ cilium-cli.spec ++++++
--- /var/tmp/diff_new_pack.T0zUlr/_old 2024-07-04 16:26:10.585869693 +0200
+++ /var/tmp/diff_new_pack.T0zUlr/_new 2024-07-04 16:26:10.597870131 +0200
@@ -21,7 +21,7 @@
%define executable_name cilium
Name: cilium-cli
-Version: 0.16.10
+Version: 0.16.11
Release: 0
Summary: CLI to install, manage & troubleshoot Kubernetes clusters running Cilium
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.T0zUlr/_old 2024-07-04 16:26:10.913881672 +0200
+++ /var/tmp/diff_new_pack.T0zUlr/_new 2024-07-04 16:26:10.937882548 +0200
@@ -3,7 +3,7 @@
<param name="url">https://github.com/cilium/cilium-cli</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="revision">v0.16.10</param>
+ <param name="revision">v0.16.11</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>
<param name="versionrewrite-pattern">v(.*)</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.T0zUlr/_old 2024-07-04 16:26:11.073887516 +0200
+++ /var/tmp/diff_new_pack.T0zUlr/_new 2024-07-04 16:26:11.105888685 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/cilium/cilium-cli</param>
- <param name="changesrevision">511f0173c21db1c3c959b96fd68eef18f83a0a9f</param></service></servicedata>
+ <param name="changesrevision">9d071f99ae32af95cb15c3e0a280d222b569a1cf</param></service></servicedata>
(No newline at EOF)
++++++ cilium-cli-0.16.10.obscpio -> cilium-cli-0.16.11.obscpio ++++++
/work/SRC/openSUSE:Factory/cilium-cli/cilium-cli-0.16.10.obscpio /work/SRC/openSUSE:Factory/.cilium-cli.new.2080/cilium-cli-0.16.11.obscpio differ: char 49, line 1
++++++ cilium-cli.obsinfo ++++++
--- /var/tmp/diff_new_pack.T0zUlr/_old 2024-07-04 16:26:11.437900810 +0200
+++ /var/tmp/diff_new_pack.T0zUlr/_new 2024-07-04 16:26:11.461901686 +0200
@@ -1,5 +1,5 @@
name: cilium-cli
-version: 0.16.10
-mtime: 1717801773
-commit: 511f0173c21db1c3c959b96fd68eef18f83a0a9f
+version: 0.16.11
+mtime: 1719503043
+commit: 9d071f99ae32af95cb15c3e0a280d222b569a1cf
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/cilium-cli/vendor.tar.gz /work/SRC/openSUSE:Factory/.cilium-cli.new.2080/vendor.tar.gz differ: char 5, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package oc for openSUSE:Factory checked in at 2024-07-04 16:24:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/oc (Old)
and /work/SRC/openSUSE:Factory/.oc.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "oc"
Thu Jul 4 16:24:36 2024 rev:2 rq:1185176 version:4.16.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/oc/oc.changes 2024-04-15 20:23:16.471259664 +0200
+++ /work/SRC/openSUSE:Factory/.oc.new.2080/oc.changes 2024-07-04 16:25:56.085340133 +0200
@@ -1,0 +2,175 @@
+Wed Jul 03 16:02:57 UTC 2024 - opensuse_buildservice(a)ojkastl.de
+
+- Update to version 4.16.0:
+ * OCPBUGS-33762: Hardcode resource groups/kinds for now
+ * update status: minor code cleanups
+ * `upgrade status`: polish alert insights
+ * inspectalerts: refactor `getWithBearer` to try all urls in
+ route
+ * inspectalerts: use client-go wrappers for thanos call debugging
+ * OCPBUGS-33896: `status/inspect-alerts`: handle non-200 by
+ Thanos
+ * add mock tests for alerts in oc adm upgrade status
+ * add alerts to update health in oc adm upgrade status
+ * `upgrade status`: upgrade -> update
+ * OCPBUGS-33903: Simplify output when not updating
+ * pkg/cli/admin/upgrade/rollback: Gate on
+ OC_ENABLE_CMD_UPGRADE_ROLLBACK
+ * adm update status: Fix target version field for install.
+ * adm update status: Show information about upgrade target
+ version
+ * Add s390x based oc into extraction target
+ * OCPBUGS-32682: Fix the retrieval of API objects with an empty
+ name (#1765)
+ * Support multiple icsps in migrate icsp
+ * [OCPNODE-2282]Support multiple ImageDigestMirrorSet objects in
+ the the single file
+ * Switch cli-artifacts default oc to RHEL9
+ * OTA-1275: cli/admin/release/git: use optimized git flags
+ * Switch cli image to RHEL9 base image
+ * pkg/cli/admin/upgrade/status: Drop free-form Progressing output
+ line
+ * pkg/cli/admin/upgrade/status: Move Failing from free-form to
+ updateInsight
+ * OTA-1174: `update status`: unify on `--details`
+ * Bump go-jose indirect reference to 2.6.3
+ * Improve error message when binary is not in target list
+ * `upgrade status`: hint at using `--details=health`
+ * `upgrade status`: ellipsize (duplicate) long names in messages
+ * `upgrade status --detailed=health`: show involved resources
+ * `update status`: Simplify CO status line
+ * oc image extract: Print an error msg instead of panicking when
+ all images are filtered out from the manifest list.
+ * oc adm must-gather: print timestamp when logging
+ * Changing the conditional risk to known issues
+ * release: extract ccoctl.rhel8 and ccoctl.rhel9
+ * `upgrade status`: always tabulate 'All is well'
+ * `upgrade status`: ignore incomplete insights
+ * `upgrade status`: pad linebreaks in descriptions
+ * `upgrade status`: populate descriptions and refs for insights
+ * `upgrade status`: `--details=health` shows reference and
+ description
+ * `upgrade status`: test `--detailed=all` in examples integration
+ test
+ * `upgrade status`: add `--detailed=nodes` that shows all nodes
+ * add prune renderedmachineconfigs
+ * indicate how many tests each feature has
+ * update library-go for new api
+ * update API for test reporting types
+ * adm update status: Refactor node status
+ * adm update status: Add status of control plane nodes
+ * WRKLDS-1171: Add openshift-install-fips target to oc release
+ extract
+ * OCPBUGS-20097: Migrate tools image to RHEL9
+ * Add help text the behavior of filter-by-os against single image
+ * Add OIDC specific certificate authority bundle flag
+ * update library-go
+ * adjust rendering
+ * update vendor for featuregate diffing
+ * update featureset changes to table based view
+ * Revert "WRKLDS-1128: cli/admin/release/git: use optimized git
+ flags"
+ * Remove some of newapp unit tests relying on external deprecated
+ images
+ * pkg/cli/admin/release/info: add back disk space note
+ * Bump coreos/go-oidc to 3.10.0
+ * pkg/cli/admin/release: fix git extract
+ * pkg/cli/admin/release/git: fetch with blob:none
+ * cli/admin/release/git: use optimized git flags
+ * tools: extend the image with sosreport
+ * vendor: Add machineconfiguration client and API
+ * adm update status: Add MCO logic needed for worker node status
+ * adm update status: Fix "Omitted additional... nodes" text
+ * adm update status: Fix update duration after control plane is
+ updated
+ * adm update status: Add worker pool status
+ * pkg/cli/admin/upgrade/status/examples: Add examples for worker
+ pool status
+ * Add images mismatching kubectl version into warning to track
+ * pkg/cli/admin/upgrade/status/examples: Update examples
+ * Drop issuer-url extraction instead rely on issuer-url flag
+ * Introduce --issuer-url flag in oc login
+ * Introduce certificate-authority flag for image related commands
+ * oc idle: Remove redundant endpoint resource modification
+ * Extract oc also for linux/ppc64le
+ * Update some commands incorrect examples
+ * oc adm catalog mirror: reconstruct the original digest with ':'
+ for sha256 and sha512 algorithms on Windows
+ * Print log rather than returning an error when kubectl version
+ mistmaches
+ * Revert "Revert "NO-JIRA: Bump k8s dependencies to 1.29.1""
+ * Tools image no longer has python;adding
+ * Revert "NO-JIRA: Bump k8s dependencies to 1.29.1"
+ * oc adm catalog mirror: use ToSlash and FromSlash to unify the
+ path separators
+ * pkg/cli/admin/inspectalerts/OWNERS: Assign to monitoring team
+ * pkg/cli/admin/inspectalerts: Pivot to Thanos /api/v1/alerts
+ * pkg/cli/admin/inspectalerts: New tech-preview inspect-alerts
+ subcommand
+ * Bump k8s dependencies to 1.29.1
+ * Revert "Fix --parallelism flag formatting in help"
+ * Copy oc.rhel8 instead of symlink
+ * Bump joelanford/ignore to bump go-git to 5.11.0
+ * add FallbackToLogsOnError for easier debugging
+ * pkg/cli/admin/inspect: use since/since-time for previous
+ container logs
+ * Fix --parallelism flag formatting in help
+ * pkg/cli/admin/inspect: format RFC3339 parse error
+ * Simplified kubectl component version check
+ * Revert "Revert "WRKLDS-1016: Bump kube dependencies to 1.29.0""
+ * Revert "WRKLDS-1016: Bump kube dependencies to 1.29.0"
+ * Use correct hash sum of extracted tarball after re-signing with
+ codesign
+ * Add missing resources for describer test
+ * React to argument order change in library-go func
+ * Bump openshift dependencies to align with 1.29.0
+ * React to plugin resolution to beta promotion
+ * Wire warning printer to configflags for shortname warnings
+ * Change type to VolumeResourceRequirements
+ * Bump to 1.29.0
+ * Wire oc login external OIDC issuer to oc get-token cred exec
+ plugin
+ * Add coreos/go-oidc and int128/oauth2cli and bump oauth2
+ dependencies
+ * Add get-token command as cred exec plugin
+ * Unit tests for must-gather all-images
+ * Add --all-images flag to must-gather
+ * Consider kubectl version checks only in cli and cli-artifact
+ images
+ * Write oc adm must-gather logs into a file
+ * oc adm must-gather: pull gather container logs
+ * pkg/cli/admin/mustgather: add since and since-time flags to
+ limit logs
+ * adm update status: add TODOs to remind us to revise early
+ decisions
+ * pkg/cli/admin/inspect: use since/since-time for rotated logs
+ * report kubectl version to the release controller
+ * add markdown representation of features
+ * add information about featuregate diff in a particular release
+ * Skip rhel9 binary not found error for older releases
+ * Allow extracted binary name can be set to different
+ * Generate RHEL8 based oc and add as target to extract
+ * Add RHEL9 oc as linux command in target list
+ * Skip release-arch and arch type collision per command
+ * OTA-1087: Add update health section to `adm update status`
+ * `adm update status`: add fixtures with degraded/unavailable COs
+ * Sanitize path using filepath Clean
+ * oc adm prune images: fix --certificate-authority flag name in
+ validation code
+ * pkg/cli/admin/upgrade/rollback: New rollback command
+ * pkg/cli/tag: validate tag name on creation
+ * Generate oc rhel9 fips compatible binary compiled in rhel9
+ * Bump ocp images to 4.16 in addition to go 1.21
+ * oc release extract: Introduce --idms-file and deprecate
+ icsp-file
+ * Skip network.openshift.io/v1alpha1 in describer unit test
+ * Bump openshift/api to include to the new CloudCredential
+ capability
+ * Remove deprecated password defaulting in default config flag
+ * Migrate from deprecated ioutils to relevant libraries
+ * pkg/cli/admin/release/extract: Log a warning on
+ --credentials-requests without --included
+ * Do not force the ancient OS version dist tag, just use whatever
+ the OS in question sets.
+
+-------------------------------------------------------------------
Old:
----
oc-4.15.0.obscpio
New:
----
oc-4.16.0.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ oc.spec ++++++
--- /var/tmp/diff_new_pack.TwRQfu/_old 2024-07-04 16:25:57.653397398 +0200
+++ /var/tmp/diff_new_pack.TwRQfu/_new 2024-07-04 16:25:57.653397398 +0200
@@ -1,7 +1,7 @@
#
# spec file for package oc
#
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -25,7 +25,7 @@
%define OC_COMMIT 0c63f9da
Name: oc
-Version: 4.15.0
+Version: 4.16.0
Release: 0
Summary: Openshift / OKD Client CLI
License: Apache-2.0
@@ -33,13 +33,13 @@
Source: oc-%{version}.tar.gz
Source1: vendor.tar.gz
BuildRequires: go >= 1.21
-BuildRequires: libgpgme-devel
BuildRequires: krb5-devel
+BuildRequires: libgpgme-devel
# this package contains a kubectl link, so we need a Conflicts
Conflicts: kubernetes-client
-Conflicts: kubernetes-client-provider
Conflicts: kuberlr
+Conflicts: kubernetes-client-provider
%description
With OpenShift Client CLI (oc), you can create applications and manage OpenShift resources. It is built on top of kubectl which means it provides its full capabilities to connect with any kubernetes compliant cluster, and on top adds commands simplifying interaction with an OpenShift cluster.
++++++ _service ++++++
--- /var/tmp/diff_new_pack.TwRQfu/_old 2024-07-04 16:25:57.685398567 +0200
+++ /var/tmp/diff_new_pack.TwRQfu/_new 2024-07-04 16:25:57.689398713 +0200
@@ -3,7 +3,7 @@
<param name="url">https://github.com/openshift/oc</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="revision">openshift-clients-4.15.0-202402082307</param>
+ <param name="revision">openshift-clients-4.16.0-202406131906</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>
<param name="versionrewrite-pattern">openshift-clients-(.*)-20..........</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.TwRQfu/_old 2024-07-04 16:25:57.705399298 +0200
+++ /var/tmp/diff_new_pack.TwRQfu/_new 2024-07-04 16:25:57.709399444 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/openshift/oc</param>
- <param name="changesrevision">48dcf5980a6671b5933707e5a055def023c7a13a</param></service></servicedata>
+ <param name="changesrevision">a2450418f7b12a71e8f3562a4e9aa8a976bbf85b</param></service></servicedata>
(No newline at EOF)
++++++ oc-4.15.0.obscpio -> oc-4.16.0.obscpio ++++++
/work/SRC/openSUSE:Factory/oc/oc-4.15.0.obscpio /work/SRC/openSUSE:Factory/.oc.new.2080/oc-4.16.0.obscpio differ: char 48, line 1
++++++ oc.obsinfo ++++++
--- /var/tmp/diff_new_pack.TwRQfu/_old 2024-07-04 16:25:57.749400905 +0200
+++ /var/tmp/diff_new_pack.TwRQfu/_new 2024-07-04 16:25:57.753401051 +0200
@@ -1,5 +1,5 @@
name: oc
-version: 4.15.0
-mtime: 1707280963
-commit: 48dcf5980a6671b5933707e5a055def023c7a13a
+version: 4.16.0
+mtime: 1717587587
+commit: a2450418f7b12a71e8f3562a4e9aa8a976bbf85b
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/oc/vendor.tar.gz /work/SRC/openSUSE:Factory/.oc.new.2080/vendor.tar.gz differ: char 5, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package inspektor-gadget for openSUSE:Factory checked in at 2024-07-04 16:24:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/inspektor-gadget (Old)
and /work/SRC/openSUSE:Factory/.inspektor-gadget.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "inspektor-gadget"
Thu Jul 4 16:24:27 2024 rev:2 rq:1185167 version:0.30.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/inspektor-gadget/inspektor-gadget.changes 2024-06-09 20:24:34.770931773 +0200
+++ /work/SRC/openSUSE:Factory/.inspektor-gadget.new.2080/inspektor-gadget.changes 2024-07-04 16:25:43.532881715 +0200
@@ -1,0 +2,143 @@
+Wed Jul 03 15:51:22 UTC 2024 - opensuse_buildservice(a)ojkastl.de
+
+- Update to version 0.30.0:
+ * ci: Set DOCKER_BUILD_NO_SUMMARY.
+ * gadgets/trace_capabilities: Add special check for exec-family
+ syscalls
+ * gadgets: Add trace_capabilities
+ * gadgets/trace_tcpdrop: Add kernel stack field
+ * pkg/operators/ebpf: Support kernel stack map
+ * pkg/oci: Add new options to restrain execution by digest.
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * gadgets: update README.md
+ * gadgets/Makefile: add readme target
+ * gadgets/trace_exec: Add tests
+ * testing: Add helper to sleep
+ * treewide: Remove unneeded systemd workaround.
+ * ci: Use eastus2 for AKS
+ * go: bump github.com/moby/moby
+ * go: bump github.com/docker/cli
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * test/images: Test that export command is deterministic
+ * build: Allow reproducible builds
+ * kubemanager: Check ParamAllNamespaces in PreStart too
+ * datasource: Return error on New()
+ * go: bump github.com/moby/moby
+ * go: bump github.com/docker/cli
+ * ci: Remove ARO from release needs.
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * gadgets/snapshot_process: Port test to use new testing
+ framework
+ * pkg/testing/match: Add unittests
+ * testing: Consolidate match logic in pkg/testing/match
+ * CI: Use multinode cluster for testing gadgets on kubernetes
+ * trace_mount: Add call column and flag decoding
+ * docs: Remove mouting /run for ig.
+ * pkg/container-utils: Preprend HOST_ROOT to
+ /run/cri-dockerd.sock.
+ * cmd/ig: Preprend host.HostRoot to runtime socket path.
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * docs: Add instruction to verify ebpf-builder image.
+ * ci: Verify eBPF builder image before building gadgets.
+ * Revert "container-collection: add process metadata enricher"
+ * gadgets/trace_exec: Update metadata.
+ * ci: bump docker/build-push-action from 5 to 6
+ * ci: bump aquasecurity/trivy-action from 0.22.0 to 0.23.0
+ * add sort operator import to ig and gadgettracermanager binaries
+ * pkg/datasource: add @flyth as code owner
+ * pkg/datasource: improve subscription handling
+ * Fix codeowners
+ * trace_tcp{drop,retrans}: Use bitfields for flags
+ * ebpf/formatters: Support formatting bitfields
+ * trace_open: Add missing fields
+ * gadgets/test: Run tests even if wasm module exists
+ * ig/build: Always pull builder-image if latest tag is used
+ * tests: Disable TestTraceNetwork on cri-o
+ * gadgets/trace_sni: Port test to use new testing framework
+ * pkg/operators/sort: add unit tests
+ * add sort operator
+ * pkg/datasource: add Swap() method to DataArray
+ * gadgets/ports: Convert to host endianess inside the gadget
+ * go: bump github.com/containers/image/v5 from 5.31.0 to 5.31.1
+ * go: bump github.com/tetratelabs/wazero from 1.7.1 to 1.7.3
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * gadgets/trace_exec: Add wasm module to handle args field
+ * docs: Add guide to use wasm from a gadget
+ * docs/reference: Add wasm reference docs
+ * wasm: Add test to check consts are in sync
+ * operators/wasm: Add tests
+ * operators: Add wasm operator
+ * image/build: Use correct Inspektor Gadget code in in-tree
+ gadgets
+ * gadgets: Port trace_tcp_test to gadgets
+ * pkg/container-hook: Check container PID bound before converting
+ it.
+ * ci: bump actions/{download,upload}-artifact from 3 to 4
+ * formatters: Avoid changing name of the field
+ * operators/ebpf: Rename converters to formatters
+ * ci: Use westeurope for AKS.
+ * container-hook: delete old entries and marks after timeout
+ * container-hook: use a single fanotify to watch pid files
+ * integration/kubectl-gadget: Add an option to skip image
+ verification
+ * gadgets/test: Add an option skip image verification
+ * ci: Skip signing ig-k8s image/gadget images on fork
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * go: bump github.com/miekg/dns from 1.1.59 to 1.1.61 in
+ /tools/dnstester
+ * execsnoop: add parent upper layer
+ * gadgets/signal: Add test using the new framework.
+ * integration/Command: Enhance error messages for kill
+ * pkg/oci: Remove undeeded authOpts for getSigningInformation().
+ * container-collection: add process metadata enricher
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * gadgets/trace_mount: Implement test using new framework
+ * tests: Remove duplicated test
+ * testing/containers: Add support for privileged mode
+ * gadgets/trace_open: Improve tests
+ * gadgets/trace_exec: drop uid filter on sys_exit_execve
+ * pkg/gadgets/trace_exec: drop uid filter on sys_exit_execve
+ * pkg/gadgets/capabilities: Fix pid field
+ * container-hook: add new test
+ * pkg/gadgets/capabilities: fix pid and tgid fields
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * ci: Use --format to retrieve image digest instead of grep and
+ awk.
+ * go: bump github.com/spf13/cobra from 1.8.0 to 1.8.1
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * go: bump github.com/docker/docker
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * ci: Sign helper images.
+ * go: bump github.com/moby/moby
+ * ci: Sign ig container image.
+ * ci: Add action to sign container image.
+ * go: bump the k8s group with 8 updates
+ * uprobetracer: use secureopen to avoid TOCTOU issues
+ * New pkg: secureopen: open files in containers
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * go: bump google.golang.org/protobuf from 1.34.1 to 1.34.2
+ * Align k8s json and columns name
+ * trace exec: extract fixup for execve as a common header
+ * fields: Mark fields hidden based on attributes
+ * ci: bump aquasecurity/trivy-action from 0.21.0 to 0.22.0
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * go: bump sigs.k8s.io/controller-runtime from 0.18.3 to 0.18.4
+ * go: bump github.com/docker/{cli,docker} and
+ github.com/moby/moby
+ * go: bump github.com/containerd/containerd from 1.7.17 to 1.7.18
+ * go: bump the golang-x group with 3 updates
+ * go: bump github.com/containers/common from 0.59.0 to 0.59.1
+ * Updating trace_open test to support testing in k8s and adding
+ ci job for testing with k8s
+ * adding helper functions for testing with k8s
+ * gadgets/trace_exec: extract fixup for execve as a common header
+ * go: bump github.com/spf13/viper from 1.18.2 to 1.19.0
+ * go: bump github.com/mdlayher/socket from 0.4.1 to 0.5.1 in
+ /examples
+ * Artifact Hub: Update gadgets version to v0.29.0
+ * container-collection: Don't rely on k8s.io/kubernetes/pkg/...
+ * go: bump github.com/aws/aws-sdk-go in /tools/eks-cleanup
+ * implementing container factory interface for k8s
+ * updating field names: pod and container
+
+-------------------------------------------------------------------
Old:
----
inspektor-gadget-0.29.0.obscpio
New:
----
inspektor-gadget-0.30.0.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ inspektor-gadget.spec ++++++
--- /var/tmp/diff_new_pack.Va3hLe/_old 2024-07-04 16:25:46.144977109 +0200
+++ /var/tmp/diff_new_pack.Va3hLe/_new 2024-07-04 16:25:46.160977694 +0200
@@ -19,7 +19,7 @@
%define __arch_install_post export NO_BRP_STRIP_DEBUG=true
Name: inspektor-gadget
-Version: 0.29.0
+Version: 0.30.0
Release: 0
Summary: A eBPF tool and systems inspection framework
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.Va3hLe/_old 2024-07-04 16:25:46.356984852 +0200
+++ /var/tmp/diff_new_pack.Va3hLe/_new 2024-07-04 16:25:46.396986313 +0200
@@ -3,7 +3,7 @@
<param name="url">https://github.com/inspektor-gadget/inspektor-gadget</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="revision">v0.29.0</param>
+ <param name="revision">v0.30.0</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>
<param name="versionrewrite-pattern">v(.*)</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.Va3hLe/_old 2024-07-04 16:25:46.592993471 +0200
+++ /var/tmp/diff_new_pack.Va3hLe/_new 2024-07-04 16:25:46.636995078 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/inspektor-gadget/inspektor-gadget</param>
- <param name="changesrevision">7c386267cd5f8e46b6be12d56f7475811e6f222e</param></service></servicedata>
+ <param name="changesrevision">8d4753f66034450890bc67dbeaaff58edb118e37</param></service></servicedata>
(No newline at EOF)
++++++ inspektor-gadget-0.29.0.obscpio -> inspektor-gadget-0.30.0.obscpio ++++++
/work/SRC/openSUSE:Factory/inspektor-gadget/inspektor-gadget-0.29.0.obscpio /work/SRC/openSUSE:Factory/.inspektor-gadget.new.2080/inspektor-gadget-0.30.0.obscpio differ: char 49, line 1
++++++ inspektor-gadget.obsinfo ++++++
--- /var/tmp/diff_new_pack.Va3hLe/_old 2024-07-04 16:25:46.897004574 +0200
+++ /var/tmp/diff_new_pack.Va3hLe/_new 2024-07-04 16:25:46.929005742 +0200
@@ -1,5 +1,5 @@
name: inspektor-gadget
-version: 0.29.0
-mtime: 1717178103
-commit: 7c386267cd5f8e46b6be12d56f7475811e6f222e
+version: 0.30.0
+mtime: 1719825849
+commit: 8d4753f66034450890bc67dbeaaff58edb118e37
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/inspektor-gadget/vendor.tar.gz /work/SRC/openSUSE:Factory/.inspektor-gadget.new.2080/vendor.tar.gz differ: char 5, line 1
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package FreeFileSync for openSUSE:Factory checked in at 2024-07-04 16:24:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/FreeFileSync (Old)
and /work/SRC/openSUSE:Factory/.FreeFileSync.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "FreeFileSync"
Thu Jul 4 16:24:14 2024 rev:25 rq:1185084 version:13.7
Changes:
--------
--- /work/SRC/openSUSE:Factory/FreeFileSync/FreeFileSync.changes 2024-05-15 21:29:10.755200524 +0200
+++ /work/SRC/openSUSE:Factory/.FreeFileSync.new.2080/FreeFileSync.changes 2024-07-04 16:25:29.768379035 +0200
@@ -1,0 +2,9 @@
+Wed Jul 3 08:22:31 UTC 2024 - Christophe Marin <christophe(a)krop.fr>
+
+- Update to 13.7
+ * Support copying symlinks between SFTP devices
+ * Fixed input focus not being restored after comparison/sync
+ * Fixed log file pruning not considering selected configuration
+ * Show startup error details when running outside terminal (Linux)
+
+-------------------------------------------------------------------
Old:
----
FreeFileSync_13.6_Source.zip
New:
----
FreeFileSync_13.7_Source.zip
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ FreeFileSync.spec ++++++
--- /var/tmp/diff_new_pack.QqmAjM/_old 2024-07-04 16:25:31.080426951 +0200
+++ /var/tmp/diff_new_pack.QqmAjM/_new 2024-07-04 16:25:31.080426951 +0200
@@ -21,7 +21,7 @@
%endif
Name: FreeFileSync
-Version: 13.6
+Version: 13.7
Release: 0
Summary: Backup software to synchronize files and folders
License: GPL-3.0-or-later
++++++ FreeFileSync_13.6_Source.zip -> FreeFileSync_13.7_Source.zip ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Changelog.txt new/Changelog.txt
--- old/Changelog.txt 2024-05-10 18:03:31.000000000 +0200
+++ new/Changelog.txt 2024-06-23 09:46:57.000000000 +0200
@@ -1,3 +1,11 @@
+FreeFileSync 13.7 [2024-06-20]
+------------------------------
+Support copying symlinks between SFTP devices
+Fixed input focus not being restored after comparison/sync
+Fixed log file pruning not considering selected configuration
+Show startup error details when running outside terminal (Linux)
+
+
FreeFileSync 13.6 [2024-05-10]
------------------------------
Compact parent path display for medium/large row sizes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/afs/sftp.cpp new/FreeFileSync/Source/afs/sftp.cpp
--- old/FreeFileSync/Source/afs/sftp.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/FreeFileSync/Source/afs/sftp.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -1474,10 +1474,10 @@
{
if (!fileHandle_)
throw std::logic_error(std::string(__FILE__) + '[' + numberTo<std::string>(__LINE__) + "] Contract violation!");
+
+ ZEN_ON_SCOPE_EXIT(fileHandle_ = nullptr); //reset on error, too! there's no point in, calling libssh2_sftp_close() a second time in ~OutputStreamSftp()
try
{
- ZEN_ON_SCOPE_EXIT(fileHandle_ = nullptr); //reset on error, too! there's no point in, calling libssh2_sftp_close() a second time in ~OutputStreamSftp()
-
session_->executeBlocking("libssh2_sftp_close", //throw SysError, SysErrorSftpProtocol
[&](const SshSession::Details& sd) { return ::libssh2_sftp_close(fileHandle_); }); //noexcept!
}
@@ -1733,26 +1733,31 @@
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(getDisplayPath(linkPath))), e.toString()); }
}
+ static std::string getSymlinkContentImpl(const SftpFileSystem& sftpFs, const AfsPath& linkPath) //throw SysError
+ {
+ std::string buf(10000, '\0');
+ int rc = 0;
+
+ runSftpCommand(sftpFs.login_, "libssh2_sftp_readlink", //throw SysError, SysErrorSftpProtocol
+ [&](const SshSession::Details& sd) { return rc = ::libssh2_sftp_readlink(sd.sftpChannel, getLibssh2Path(linkPath), buf.data(), buf.size()); }); //noexcept!
+
+ ASSERT_SYSERROR(makeUnsigned(rc) <= buf.size()); //better safe than sorry
+
+ buf.resize(rc);
+ return buf;
+ }
+
bool equalSymlinkContentForSameAfsType(const AfsPath& linkPathL, const AbstractPath& linkPathR) const override //throw FileError
{
- auto getTargetPath = [](const SftpFileSystem& sftpFs, const AfsPath& linkPath)
+ auto getLinkContent = [](const SftpFileSystem& sftpFs, const AfsPath& linkPath)
{
- std::string buf(10000, '\0');
- int rc = 0;
try
{
- runSftpCommand(sftpFs.login_, "libssh2_sftp_readlink", //throw SysError, SysErrorSftpProtocol
- [&](const SshSession::Details& sd) { return rc = ::libssh2_sftp_readlink(sd.sftpChannel, getLibssh2Path(linkPath), buf.data(), buf.size()); }); //noexcept!
-
- ASSERT_SYSERROR(makeUnsigned(rc) <= buf.size()); //better safe than sorry
+ return getSymlinkContentImpl(sftpFs, linkPath); //throw SysError
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(sftpFs.getDisplayPath(linkPath))), e.toString()); }
-
- buf.resize(rc);
- return buf;
};
-
- return getTargetPath(*this, linkPathL) == getTargetPath(static_cast<const SftpFileSystem&>(linkPathR.afsDevice.ref()), linkPathR.afsPath);
+ return getLinkContent(*this, linkPathL) == getLinkContent(static_cast<const SftpFileSystem&>(linkPathR.afsDevice.ref()), linkPathR.afsPath); //throw FileError
}
//----------------------------------------------------------------------------------------------------------------
@@ -1802,12 +1807,25 @@
throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(targetPath))), _("Operation not supported by device."));
}
- //already existing: fail
- void copySymlinkForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const override
+ //already existing: fail (SSH_FX_FAILURE)
+ void copySymlinkForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const override //throw FileError
{
- throw FileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."),
- L"%x", L'\n' + fmtPath(getDisplayPath(sourcePath))),
- L"%y", L'\n' + fmtPath(AFS::getDisplayPath(targetPath))), _("Operation not supported by device."));
+ try
+ {
+ const std::string buf = getSymlinkContentImpl(*this, sourcePath); //throw SysError
+
+ runSftpCommand(static_cast<const SftpFileSystem&>(targetPath.afsDevice.ref()).login_, "libssh2_sftp_symlink", //throw SysError, SysErrorSftpProtocol
+ [&](const SshSession::Details& sd) //noexcept!
+ {
+ return ::libssh2_sftp_symlink(sd.sftpChannel, getLibssh2Path(targetPath.afsPath), buf);
+ });
+ }
+ catch (const SysError& e)
+ {
+ throw FileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."),
+ L"%x", L'\n' + fmtPath(getDisplayPath(sourcePath))),
+ L"%y", L'\n' + fmtPath(AFS::getDisplayPath(targetPath))), e.toString());
+ }
}
//already existing: undefined behavior! (e.g. fail/overwrite)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/application.cpp new/FreeFileSync/Source/application.cpp
--- old/FreeFileSync/Source/application.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/FreeFileSync/Source/application.cpp 2024-06-23 09:46:58.000000000 +0200
@@ -530,10 +530,6 @@
-> WinInet not working when FFS is running as a service!!! https://support.microsoft.com/en-us/help/238425/info-wininet-not-supported-… */
- std::set<AbstractPath> logFilePathsToKeep;
- for (const ConfigFileItem& item : globalCfg.mainDlg.config.fileHistory)
- logFilePathsToKeep.insert(item.lastRunStats.logFilePath);
-
const std::chrono::system_clock::time_point syncStartTime = std::chrono::system_clock::now();
const WindowLayout::Dimensions progressDim
@@ -666,26 +662,33 @@
}
//--------------------- save log file ----------------------
+ std::set<AbstractPath> logsToKeepPaths;
+ for (const ConfigFileItem& cfi : globalCfg.mainDlg.config.fileHistory)
+ if (!equalNativePath(cfi.cfgFilePath, cfgFilePath)) //exception: don't keep old log for the selected cfg file!
+ logsToKeepPaths.insert(cfi.lastRunStats.logFilePath);
+
try //create not before destruction: 1. avoid issues with FFS trying to sync open log file 2. include status in log file name without extra rename
{
//do NOT use tryReportingError()! saving log files should not be cancellable!
- saveLogFile(logFilePath, r.summary, r.errorLog.ref(), globalCfg.logfilesMaxAgeDays, globalCfg.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError
+ saveLogFile(logFilePath, r.summary, r.errorLog.ref(), globalCfg.logfilesMaxAgeDays, globalCfg.logFormat, logsToKeepPaths, notifyStatusNoThrow); //throw FileError
}
catch (const FileError& e)
{
- logMsg(r.errorLog.ref(), e.toString(), MSG_TYPE_ERROR);
+ try //fallback: log file *must* be saved no matter what!
+ {
+ const AbstractPath logFileDefaultPath = AFS::appendRelPath(createAbstractPath(getLogFolderDefaultPath()), generateLogFileName(globalCfg.logFormat, r.summary));
+ if (logFilePath == logFileDefaultPath)
+ throw;
- const AbstractPath logFileDefaultPath = AFS::appendRelPath(createAbstractPath(getLogFolderDefaultPath()), generateLogFileName(globalCfg.logFormat, r.summary));
- if (logFilePath != logFileDefaultPath) //fallback: log file *must* be saved no matter what!
- try
- {
- logFilePath = logFileDefaultPath;
- saveLogFile(logFileDefaultPath, r.summary, r.errorLog.ref(), globalCfg.logfilesMaxAgeDays, globalCfg.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError
- }
- catch (const FileError& e2) { logMsg(r.errorLog.ref(), e2.toString(), MSG_TYPE_ERROR); assert(false); } //should never happen!!!
+ logMsg(r.errorLog.ref(), e.toString(), MSG_TYPE_ERROR);
+
+ logFilePath = logFileDefaultPath;
+ saveLogFile(logFileDefaultPath, r.summary, r.errorLog.ref(), globalCfg.logfilesMaxAgeDays, globalCfg.logFormat, logsToKeepPaths, notifyStatusNoThrow); //throw FileError
+ }
+ catch (const FileError& e2) { logMsg(r.errorLog.ref(), e2.toString(), MSG_TYPE_ERROR); logExtraError(e2.toString()); } //should never happen!!!
}
- //--------- update last sync stats for the selected cfg files ---------
+ //--------- update last sync stats for the selected cfg file ---------
const ErrorLogStats& logStats = getStats(r.errorLog.ref());
for (ConfigFileItem& cfi : globalCfg.mainDlg.config.fileHistory)
@@ -702,8 +705,8 @@
r.summary.statsProcessed.items,
r.summary.statsProcessed.bytes,
r.summary.totalTime,
- logStats.error,
- logStats.warning,
+ logStats.errors,
+ logStats.warnings,
};
break;
}
@@ -726,9 +729,9 @@
}
//email sending, or saving log file failed? at least this should affect the exit code:
- if (logStats.error > 0)
+ if (logStats.errors > 0)
raiseExitCode(exitCode_, FfsExitCode::error);
- else if (logStats.warning > 0)
+ else if (logStats.warnings > 0)
raiseExitCode(exitCode_, FfsExitCode::warning);
//---------------------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/base/db_file.cpp new/FreeFileSync/Source/base/db_file.cpp
--- old/FreeFileSync/Source/base/db_file.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/FreeFileSync/Source/base/db_file.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -55,7 +55,7 @@
- precomposed/decomposed UTF: differences already ignored
- 32 vs 64-bit: already handled
- => give db files different names: */
+ => give DB files different names: */
const Zstring dbName = Zstr(".sync"); //files beginning with dots are usually hidden
return AFS::appendRelPath(baseFolder.getAbstractPath<side>(), dbName + SYNC_DB_FILE_ENDING);
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/log_file.cpp new/FreeFileSync/Source/log_file.cpp
--- old/FreeFileSync/Source/log_file.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/FreeFileSync/Source/log_file.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -50,8 +50,8 @@
const ErrorLogStats logCount = getStats(log);
- if (logCount.error > 0) summary.push_back(tabSpace + utfTo<std::string>(_("Errors:") + L' ' + formatNumber(logCount.error)));
- if (logCount.warning > 0) summary.push_back(tabSpace + utfTo<std::string>(_("Warnings:") + L' ' + formatNumber(logCount.warning)));
+ if (logCount.errors > 0) summary.push_back(tabSpace + utfTo<std::string>(_("Errors:") + L' ' + formatNumber(logCount.errors)));
+ if (logCount.warnings > 0) summary.push_back(tabSpace + utfTo<std::string>(_("Warnings:") + L' ' + formatNumber(logCount.warnings)));
summary.push_back(tabSpace + utfTo<std::string>(_("Items processed:") + L' ' + formatNumber(s.statsProcessed.items) + //show always, even if 0!
L" (" + formatFilesizeShort(s.statsProcessed.bytes) + L')'));
@@ -79,7 +79,7 @@
output += '|' + std::string(sepLineLen, '_') + "\n\n";
//------------ warnings/errors preview ----------------
- const int logFailTotal = logCount.warning + logCount.error;
+ const int logFailTotal = logCount.warnings + logCount.errors;
if (logFailTotal > 0)
{
output += '\n' + utfTo<std::string>(_("Errors and warnings:")) + '\n';
@@ -251,20 +251,20 @@
const ErrorLogStats logCount = getStats(log);
- if (logCount.error > 0)
+ if (logCount.errors > 0)
output += R"(
<tr>
<td>)" + htmlTxt(_("Errors:")) + R"(</td>
<td><img src="https://freefilesync.org/images/log/msg-error.png" width="24" height="24" alt=""></td>
- <td><span style="font-weight:600;">)" + htmlTxt(formatNumber(logCount.error)) + R"(</span></td>
+ <td><span style="font-weight:600;">)" + htmlTxt(formatNumber(logCount.errors)) + R"(</span></td>
</tr>)";
- if (logCount.warning > 0)
+ if (logCount.warnings > 0)
output += R"(
<tr>
<td>)" + htmlTxt(_("Warnings:")) + R"(</td>
<td><img src="https://freefilesync.org/images/log/msg-warning.png" width="24" height="24" alt=""></td>
- <td><span style="font-weight:600;">)" + htmlTxt(formatNumber(logCount.warning)) + R"(</span></td>
+ <td><span style="font-weight:600;">)" + htmlTxt(formatNumber(logCount.warnings)) + R"(</span></td>
</tr>)";
output += R"(
@@ -299,7 +299,7 @@
)";
//------------ warnings/errors preview ----------------
- const int logFailTotal = logCount.warning + logCount.error;
+ const int logFailTotal = logCount.warnings + logCount.errors;
if (logFailTotal > 0)
{
output += R"(
@@ -526,7 +526,7 @@
void limitLogfileCount(const AbstractPath& logFolderPath, //throw FileError, X
int logfilesMaxAgeDays, //<= 0 := no limit
- const std::set<AbstractPath>& logFilePathsToKeep,
+ const std::set<AbstractPath>& logsToKeepPaths,
const std::function<void(std::wstring&& msg)>& notifyStatus /*throw X*/)
{
if (logfilesMaxAgeDays > 0)
@@ -551,7 +551,7 @@
for (const LogFileInfo& lfi : logFiles)
if (lfi.timeStamp < cutOffTime &&
- !logFilePathsToKeep.contains(lfi.filePath)) //don't trim latest log files corresponding to last used config files!
+ !logsToKeepPaths.contains(lfi.filePath)) //don't trim latest log files corresponding to last used config files!
//nitpicker's corner: what about path differences due to case? e.g. user-overriden log file path changed in case
{
if (notifyStatus) notifyStatus(statusPrefix + fmtPath(AFS::getDisplayPath(lfi.filePath))); //throw X
@@ -635,7 +635,7 @@
const ErrorLog& log,
int logfilesMaxAgeDays,
LogFileFormat logFormat,
- const std::set<AbstractPath>& logFilePathsToKeep,
+ const std::set<AbstractPath>& logsToKeepPaths,
const std::function<void(std::wstring&& msg)>& notifyStatus /*throw X*/)
{
std::exception_ptr firstError;
@@ -648,9 +648,8 @@
try
{
const std::optional<AbstractPath> logFolderPath = AFS::getParentPath(logFilePath);
- assert(logFolderPath);
- if (logFolderPath) //else: logFilePath == device root; not possible with generateLogFilePath()
- limitLogfileCount(*logFolderPath, logfilesMaxAgeDays, logFilePathsToKeep, notifyStatus); //throw FileError, X
+ assert(logFolderPath); //else: logFilePath == device root; not possible with generateLogFilePath()
+ limitLogfileCount(*logFolderPath, logfilesMaxAgeDays, logsToKeepPaths, notifyStatus); //throw FileError, X
}
catch (const FileError&) { if (!firstError) firstError = std::current_exception(); };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/log_file.h new/FreeFileSync/Source/log_file.h
--- old/FreeFileSync/Source/log_file.h 2024-05-10 18:03:31.000000000 +0200
+++ new/FreeFileSync/Source/log_file.h 2024-06-23 09:46:57.000000000 +0200
@@ -29,7 +29,7 @@
const zen::ErrorLog& log,
int logfilesMaxAgeDays,
LogFileFormat logFormat,
- const std::set<AbstractPath>& logFilePathsToKeep,
+ const std::set<AbstractPath>& logsToKeepPaths,
const std::function<void(std::wstring&& msg)>& notifyStatus /*throw X*/);
void sendLogAsEmail(const std::string& email, //throw FileError, X
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/ui/batch_status_handler.cpp new/FreeFileSync/Source/ui/batch_status_handler.cpp
--- old/FreeFileSync/Source/ui/batch_status_handler.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/FreeFileSync/Source/ui/batch_status_handler.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -85,9 +85,9 @@
return TaskResult::cancelled;
}
const ErrorLogStats logCount = getStats(errorLog_.ref());
- if (logCount.error > 0)
+ if (logCount.errors > 0)
return TaskResult::error;
- else if (logCount.warning > 0)
+ else if (logCount.warnings > 0)
return TaskResult::warning;
if (getTotalStats() == ProgressStats())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/ui/gui_status_handler.cpp new/FreeFileSync/Source/ui/gui_status_handler.cpp
--- old/FreeFileSync/Source/ui/gui_status_handler.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/FreeFileSync/Source/ui/gui_status_handler.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -156,9 +156,9 @@
}
const ErrorLogStats logCount = getStats(errorLog_);
- if (logCount.error > 0)
+ if (logCount.errors > 0)
return TaskResult::error;
- else if (logCount.warning > 0)
+ else if (logCount.warnings > 0)
return TaskResult::warning;
else
return TaskResult::success;
@@ -430,9 +430,9 @@
}
const ErrorLogStats logCount = getStats(errorLog_.ref());
- if (logCount.error > 0)
+ if (logCount.errors > 0)
return TaskResult::error;
- else if (logCount.warning > 0)
+ else if (logCount.warnings > 0)
return TaskResult::warning;
if (getTotalStats() == ProgressStats())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/ui/log_panel.cpp new/FreeFileSync/Source/ui/log_panel.cpp
--- old/FreeFileSync/Source/ui/log_panel.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/FreeFileSync/Source/ui/log_panel.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -354,17 +354,17 @@
btn.SetToolTip(tooltip);
};
- initButton(*m_bpButtonErrors, "msg_error", _("Error" ) + L" (" + formatNumber(logCount.error) + L')');
- initButton(*m_bpButtonWarnings, "msg_warning", _("Warning") + L" (" + formatNumber(logCount.warning) + L')');
- initButton(*m_bpButtonInfo, "msg_info", _("Info" ) + L" (" + formatNumber(logCount.info) + L')');
+ initButton(*m_bpButtonErrors, "msg_error", _("Error" ) + L" (" + formatNumber(logCount.errors) + L')');
+ initButton(*m_bpButtonWarnings, "msg_warning", _("Warning") + L" (" + formatNumber(logCount.warnings) + L')');
+ initButton(*m_bpButtonInfo, "msg_info", _("Info" ) + L" (" + formatNumber(logCount.infos) + L')');
m_bpButtonErrors ->setActive(true);
m_bpButtonWarnings->setActive(true);
- m_bpButtonInfo ->setActive(logCount.warning + logCount.error == 0);
+ m_bpButtonInfo ->setActive(logCount.warnings + logCount.errors == 0);
- m_bpButtonErrors ->Show(logCount.error != 0);
- m_bpButtonWarnings->Show(logCount.warning != 0);
- m_bpButtonInfo ->Show(logCount.info != 0);
+ m_bpButtonErrors ->Show(logCount.errors != 0);
+ m_bpButtonWarnings->Show(logCount.warnings != 0);
+ m_bpButtonInfo ->Show(logCount.infos != 0);
m_gridMessages->setDataProvider(std::make_shared<GridDataMessages>(newLog));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/ui/main_dlg.cpp new/FreeFileSync/Source/ui/main_dlg.cpp
--- old/FreeFileSync/Source/ui/main_dlg.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/FreeFileSync/Source/ui/main_dlg.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -302,64 +302,38 @@
//---------------------------------------------------------------------------------------------
-/* mitigate unwanted reentrancy caused by wxApp::Yield()
-
- CAVEAT: This doesn't block all theoretically possible Window events that were queued *before* disableGuiElementsImpl() takes effect,
- but at least the 90% case of (rare!) crashes caused by a duplicate click event on comparison or sync button. */
-class MainDialog::SingleOperationBlocker
+class MainDialog::UiInputDisabler
{
public:
- explicit SingleOperationBlocker(MainDialog& mainDlg) : mainDlg_(mainDlg) {}
+ UiInputDisabler(MainDialog& mainDlg, bool enableAbort) : mainDlg_(mainDlg)
+ {
+ disableGuiElementsImpl(enableAbort);
+ }
- ~SingleOperationBlocker()
+ ~UiInputDisabler()
{
- if (opStarted_)
+ if (!dismissed_ )
{
- if (guiDisabled_)
- {
- wxTheApp->Yield(); //GUI update before enabling buttons again: prevent strange behaviour of delayed button clicks
- enableGuiElementsImpl();
- }
- assert(mainDlg_.operationInProgress_);
- mainDlg_.operationInProgress_ = false;
+ wxTheApp->Yield(); //GUI update before enabling buttons again: prevent strange behaviour of delayed button clicks
+ enableGuiElementsImpl();
}
- else assert(!guiDisabled_);
}
- bool start() //disabling GUI elements is NOT enough! e.g. reentrancy when there's a second click event *already* in the Windows message queue
- {
- if (mainDlg_.operationInProgress_)
- return false;
-
- return mainDlg_.operationInProgress_ = opStarted_ = true;
- }
-
- void disableGui(bool enableAbort) //=> logically belongs into start()! But keep seperate: modal dialogs look better when GUI is not yet disabled
- {
- assert(opStarted_ && !guiDisabled_);
- guiDisabled_ = true;
- disableGuiElementsImpl(enableAbort);
- }
-
- void dismiss()
- {
- opStarted_ = guiDisabled_ = false;
- }
+ void dismiss() { dismissed_ = true; }
private:
- SingleOperationBlocker (const SingleOperationBlocker&) = delete;
- SingleOperationBlocker& operator=(const SingleOperationBlocker&) = delete;
+ UiInputDisabler (const UiInputDisabler&) = delete;
+ UiInputDisabler& operator=(const UiInputDisabler&) = delete;
void disableGuiElementsImpl(bool enableAbort); //dis-/enable all elements (except abort button) that might receive unwanted user input
void enableGuiElementsImpl(); //during long-running processes: comparison, deletion
MainDialog& mainDlg_;
- bool opStarted_ = false;
- bool guiDisabled_ = false;
+ bool dismissed_ = false;
};
-void MainDialog::SingleOperationBlocker::disableGuiElementsImpl(bool enableAbort)
+void MainDialog::UiInputDisabler::disableGuiElementsImpl(bool enableAbort)
{
//disables all elements (except abort button) that might receive user input during long-running processes:
//when changing consider: comparison, synchronization, manual deletion
@@ -410,7 +384,7 @@
}
-void MainDialog::SingleOperationBlocker::enableGuiElementsImpl()
+void MainDialog::UiInputDisabler::enableGuiElementsImpl()
{
//wxGTK, yet another QOI issue: some stupid bug keeps moving main dialog to top!!
mainDlg_.EnableCloseButton(true);
@@ -1154,7 +1128,7 @@
if (!extraLog.empty())
{
const ErrorLogStats logCount = getStats(extraLog);
- const TaskResult taskResult = logCount.error > 0 ? TaskResult::error : (logCount.warning > 0 ? TaskResult::warning : TaskResult::success);
+ const TaskResult taskResult = logCount.errors > 0 ? TaskResult::error : (logCount.warnings > 0 ? TaskResult::warning : TaskResult::success);
setLastOperationLog({.result = taskResult}, make_shared<const ErrorLog>(std::move(extraLog)));
showLogPanel(true);
}
@@ -1626,9 +1600,9 @@
void MainDialog::copyToAlternateFolder(const std::vector<FileSystemObject*>& selectionL,
const std::vector<FileSystemObject*>& selectionR)
{
- SingleOperationBlocker opBlock(*this);
- if (!opBlock.start())
+ if (std::exchange(operationInProgress_, true))
return;
+ ZEN_ON_SCOPE_EXIT(operationInProgress_ = false);
std::vector<const FileSystemObject*> copyLeft;
std::vector<const FileSystemObject*> copyRight;
@@ -1668,7 +1642,7 @@
const auto& guiCfg = getConfig();
- opBlock.disableGui(true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
+ UiInputDisabler uiBlock(*this, true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
StatusHandlerTemporaryPanel statusHandler(*this, std::chrono::system_clock::now() /*startTime*/,
false /*ignoreErrors*/,
@@ -1698,9 +1672,9 @@
void MainDialog::deleteSelectedFiles(const std::vector<FileSystemObject*>& selectionL,
const std::vector<FileSystemObject*>& selectionR, bool moveToRecycler)
{
- SingleOperationBlocker opBlock(*this);
- if (!opBlock.start())
+ if (std::exchange(operationInProgress_, true))
return;
+ ZEN_ON_SCOPE_EXIT(operationInProgress_ = false);
std::vector<FileSystemObject*> deleteLeft = selectionL;
std::vector<FileSystemObject*> deleteRight = selectionR;
@@ -1730,7 +1704,7 @@
//wxBusyCursor dummy; -> redundant: progress already shown in status bar!
const auto& guiCfg = getConfig();
- opBlock.disableGui(true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
+ UiInputDisabler uiBlock(*this, true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
StatusHandlerTemporaryPanel statusHandler(*this, std::chrono::system_clock::now() /*startTime*/,
false /*ignoreErrors*/,
@@ -1763,9 +1737,9 @@
void MainDialog::renameSelectedFiles(const std::vector<FileSystemObject*>& selectionL,
const std::vector<FileSystemObject*>& selectionR)
{
- SingleOperationBlocker opBlock(*this);
- if (!opBlock.start())
+ if (std::exchange(operationInProgress_, true))
return;
+ ZEN_ON_SCOPE_EXIT(operationInProgress_ = false);
std::vector<FileSystemObject*> renameLeft = selectionL;
std::vector<FileSystemObject*> renameRight = selectionR;
@@ -1793,7 +1767,7 @@
//wxBusyCursor dummy; -> redundant: progress already shown in status bar!
const auto& guiCfg = getConfig();
- opBlock.disableGui(true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
+ UiInputDisabler uiBlock(*this, true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
StatusHandlerTemporaryPanel statusHandler(*this, std::chrono::system_clock::now() /*startTime*/,
false /*ignoreErrors*/,
@@ -1936,9 +1910,9 @@
const std::vector<FileSystemObject*>& selectionL,
const std::vector<FileSystemObject*>& selectionR)
{
- SingleOperationBlocker opBlock(*this);
- if (!opBlock.start())
+ if (std::exchange(operationInProgress_, true))
return;
+ ZEN_ON_SCOPE_EXIT(operationInProgress_ = false);
try
{
@@ -2027,7 +2001,7 @@
FocusPreserver fp;
- opBlock.disableGui(true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
+ UiInputDisabler uiBlock(*this, true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
StatusHandlerTemporaryPanel statusHandler(*this, std::chrono::system_clock::now() /*startTime*/,
false /*ignoreErrors*/,
@@ -3286,6 +3260,8 @@
void MainDialog::cfgHistoryRemoveObsolete(const std::vector<Zstring>& filePaths)
{
+ warn_static("shouldn't delete on access denied!?") //https://freefilesync.org/forum/viewtopic.php?t=11363
+
auto getUnavailableCfgFilesAsync = [filePaths] //don't use wxString: NOT thread-safe! (e.g. non-atomic ref-count)
{
std::vector<std::future<bool>> availableFiles; //check existence of all config files in parallel!
@@ -3767,9 +3743,9 @@
void MainDialog::removeSelectedCfgHistoryItems(bool deleteFromDisk)
{
- SingleOperationBlocker opBlock(*this);
- if (!opBlock.start())
+ if (std::exchange(operationInProgress_, true))
return;
+ ZEN_ON_SCOPE_EXIT(operationInProgress_ = false);
const std::vector<size_t> selectedRows = m_gridCfgHistory->getSelectedRows();
if (!selectedRows.empty())
@@ -3795,7 +3771,7 @@
moveToRecycler) != ConfirmationButton::accept)
return;
- opBlock.disableGui(true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
+ UiInputDisabler uiBlock(*this, true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
StatusHandlerTemporaryPanel statusHandler(*this, std::chrono::system_clock::now() /*startTime*/,
false /*ignoreErrors*/,
@@ -4583,9 +4559,14 @@
void MainDialog::onCompare(wxCommandEvent& event)
{
- SingleOperationBlocker opBlock(*this);
- if (!opBlock.start())
+ /* mitigate unwanted reentrancy caused by wxApp::Yield():
+ disabling GUI elements is NOT enough! e.g. reentrancy when there's a second click event *already* in the Windows message queue
+
+ CAVEAT: This doesn't block all theoretically possible Window events that were queued *before* disableGuiElementsImpl() takes effect,
+ but at least the 90% case of (rare!) crashes caused by a duplicate click event on comparison or sync button. */
+ if (std::exchange(operationInProgress_, true))
return;
+ ZEN_ON_SCOPE_EXIT(operationInProgress_ = false);
//wxBusyCursor dummy; -> redundant: progress already shown in progress dialog!
@@ -4609,7 +4590,7 @@
const std::vector<FolderPairCfg>& fpCfgList = extractCompareCfg(guiCfg.mainCfg);
- opBlock.disableGui(true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
+ UiInputDisabler uiBlock(*this, true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
//handle status display and error messages
StatusHandlerTemporaryPanel statusHandler(*this, std::chrono::system_clock::now(),
@@ -4844,9 +4825,10 @@
return;
}
- SingleOperationBlocker opBlock(*this); //*after* simluated comparison button click!
- if (!opBlock.start())
+ if (std::exchange(operationInProgress_, true)) //*after* simluated comparison button click!
return;
+ ZEN_ON_SCOPE_EXIT(operationInProgress_ = false);
+ //------------------------------------------------------------------
const auto& guiCfg = getConfig();
@@ -4863,10 +4845,6 @@
globalCfg_.confirmDlgs.confirmSyncStart = !dontShowAgain;
}
- std::set<AbstractPath> logFilePathsToKeep;
- for (const ConfigFileItem& item : cfggrid::getDataView(*m_gridCfgHistory).get())
- logFilePathsToKeep.insert(item.lastRunStats.logFilePath);
-
const std::chrono::system_clock::time_point syncStartTime = std::chrono::system_clock::now();
const WindowLayout::Dimensions progressDim
@@ -4876,7 +4854,7 @@
globalCfg_.dpiLayouts[getDpiScalePercent()].progressDlg.isMaximized
};
- opBlock.disableGui(false /*enableAbort*/); //StatusHandlerFloatingDialog will internally process Window messages, so avoid unexpected callbacks!
+ UiInputDisabler uiBlock(*this, false /*enableAbort*/); //StatusHandlerFloatingDialog will internally process Window messages, so avoid unexpected callbacks!
//class handling status updates and error messages
StatusHandlerFloatingDialog statusHandler(this, getJobNames(), syncStartTime,
@@ -5018,23 +4996,33 @@
}
//--------------------- save log file ----------------------
+ std::set<AbstractPath> logsToKeepPaths;
+ {
+ const std::set<Zstring /*cfg file path*/, LessNativePath> activeCfgSorted(activeConfigFiles_.begin(), activeConfigFiles_.end());
+
+ for (const ConfigFileItem& cfi : cfggrid::getDataView(*m_gridCfgHistory).get())
+ if (!activeCfgSorted.contains(cfi.cfgFilePath)) //exception: don't keep old logs for the selected cfg files!
+ logsToKeepPaths.insert(cfi.lastRunStats.logFilePath);
+ }
try //create not before destruction: 1. avoid issues with FFS trying to sync open log file 2. include status in log file name without extra rename
{
//do NOT use tryReportingError()! saving log files should not be cancellable!
- saveLogFile(logFilePath, fullSummary, fullLog, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError
+ saveLogFile(logFilePath, fullSummary, fullLog, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logsToKeepPaths, notifyStatusNoThrow); //throw FileError
}
catch (const FileError& e)
{
- logMsg2(e.toString(), MSG_TYPE_ERROR);
+ try //fallback: log file *must* be saved no matter what!
+ {
+ const AbstractPath logFileDefaultPath = AFS::appendRelPath(createAbstractPath(getLogFolderDefaultPath()), generateLogFileName(globalCfg_.logFormat, fullSummary));
+ if (logFilePath == logFileDefaultPath)
+ throw;
- const AbstractPath logFileDefaultPath = AFS::appendRelPath(createAbstractPath(getLogFolderDefaultPath()), generateLogFileName(globalCfg_.logFormat, fullSummary));
- if (logFilePath != logFileDefaultPath) //fallback: log file *must* be saved no matter what!
- try
- {
- logFilePath = logFileDefaultPath;
- saveLogFile(logFileDefaultPath, fullSummary, fullLog, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError
- }
- catch (const FileError& e2) { logMsg2(e2.toString(), MSG_TYPE_ERROR); assert(false); } //should never happen!!!
+ logMsg2(e.toString(), MSG_TYPE_ERROR);
+
+ logFilePath = logFileDefaultPath;
+ saveLogFile(logFileDefaultPath, fullSummary, fullLog, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logsToKeepPaths, notifyStatusNoThrow); //throw FileError
+ }
+ catch (const FileError& e2) { logMsg2(e2.toString(), MSG_TYPE_ERROR); logExtraError(e2.toString()); } //should never happen!!!
}
//--------- update last sync stats for the selected cfg files ---------
@@ -5048,8 +5036,8 @@
fullSummary.statsProcessed.items,
fullSummary.statsProcessed.bytes,
fullSummary.totalTime,
- fullLogStats.error,
- fullLogStats.warning,
+ fullLogStats.errors,
+ fullLogStats.warnings,
});
//re-apply selection: sort order changed if sorted by last sync time
cfggrid::addAndSelect(*m_gridCfgHistory, activeConfigFiles_, false /*scrollToSelection*/);
@@ -5080,7 +5068,7 @@
case FinalRequest::exit:
Destroy(); //don't use Close() which prompts to save current config in onClose()
- opBlock.dismiss(); //...or else we'll crash when ~SingleOperationBlocker() calls Yield()!
+ uiBlock.dismiss(); //...or else: crash when ~UiInputDisabler() calls Yield() + enableGuiElementsImpl()!
break;
case FinalRequest::shutdown:
@@ -5119,9 +5107,9 @@
void MainDialog::startSyncForSelecction(const std::vector<FileSystemObject*>& selection)
{
- SingleOperationBlocker opBlock(*this);
- if (!opBlock.start())
+ if (std::exchange(operationInProgress_, true))
return;
+ ZEN_ON_SCOPE_EXIT(operationInProgress_ = false);
//------------------ analyze selection ------------------
std::unordered_set<const BaseFolderPair*> basePairsSelect;
@@ -5217,7 +5205,7 @@
//last sync log file? => let's go without; same behavior as manual deletion
- opBlock.disableGui(true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
+ UiInputDisabler uiBlock(*this, true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
StatusHandlerTemporaryPanel statusHandler(*this, syncStartTime,
guiCfg.mainCfg.ignoreErrors,
@@ -5284,9 +5272,9 @@
if (errorLog)
{
const ErrorLogStats logCount = getStats(*errorLog);
- if (logCount.error > 0)
+ if (logCount.errors > 0)
return loadImage("msg_error", dipToScreen(getMenuIconDipSize()));
- if (logCount.warning > 0)
+ if (logCount.warnings > 0)
return loadImage("msg_warning", dipToScreen(getMenuIconDipSize()));
//return loadImage("msg_success", dipToScreen(getMenuIconDipSize())); -> too noisy?
@@ -5432,9 +5420,11 @@
void MainDialog::swapSides()
{
- SingleOperationBlocker opBlock(*this);
- if (!opBlock.start())
+ if (std::exchange(operationInProgress_, true))
return;
+ ZEN_ON_SCOPE_EXIT(operationInProgress_ = false);
+
+ FocusPreserver fp;
if (!folderCmp_.empty() && //require confirmation only *after* comparison
globalCfg_.confirmDlgs.confirmSwapSides)
@@ -5494,9 +5484,7 @@
{
const auto& guiCfg = getConfig();
- FocusPreserver fp;
-
- opBlock.disableGui(true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
+ UiInputDisabler uiBlock(*this, true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
StatusHandlerTemporaryPanel statusHandler(*this, std::chrono::system_clock::now() /*startTime*/,
false /*ignoreErrors*/,
@@ -5730,16 +5718,17 @@
{
if (!folderCmp_.empty())
{
- const auto& guiCfg = getConfig();
- const auto& directCfgs = extractDirectionCfg(folderCmp_, getConfig().mainCfg);
-
- SingleOperationBlocker opBlock(*this);
- if (!opBlock.start()) //can't just skip, but now's a really bad time! Hopefully never happens!?
+ if (std::exchange(operationInProgress_, true))
+ //can't just skip:t now's a really bad time! Hopefully never happens!?
throw std::runtime_error(std::string(__FILE__) + '[' + numberTo<std::string>(__LINE__) + "] Sync direction changed while other operation running.");
+ ZEN_ON_SCOPE_EXIT(operationInProgress_ = false);
FocusPreserver fp;
- opBlock.disableGui(true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
+ UiInputDisabler uiBlock(*this, true /*enableAbort*/); //StatusHandlerTemporaryPanel calls wxApp::Yield(), so avoid unexpected callbacks!
+
+ const auto& guiCfg = getConfig();
+ const auto& directCfgs = extractDirectionCfg(folderCmp_, getConfig().mainCfg);
StatusHandlerTemporaryPanel statusHandler(*this, std::chrono::system_clock::now() /*startTime*/,
false /*ignoreErrors*/,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/ui/main_dlg.h new/FreeFileSync/Source/ui/main_dlg.h
--- old/FreeFileSync/Source/ui/main_dlg.h 2024-05-10 18:03:32.000000000 +0200
+++ new/FreeFileSync/Source/ui/main_dlg.h 2024-06-23 09:46:58.000000000 +0200
@@ -66,7 +66,7 @@
friend class FolderPairCallback;
friend class PanelMoveWindow;
- class SingleOperationBlocker; //mitigate unwanted reentrancy caused by wxApp::Yield()
+ class UiInputDisabler;
//configuration load/save
void setLastUsedConfig(const XmlGuiConfig& guiConfig, const std::vector<Zstring>& cfgFilePaths);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/ui/progress_indicator.cpp new/FreeFileSync/Source/ui/progress_indicator.cpp
--- old/FreeFileSync/Source/ui/progress_indicator.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/FreeFileSync/Source/ui/progress_indicator.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -1511,7 +1511,7 @@
//show log instead of graph if errors occurred! (not required for ignored warnings)
const ErrorLogStats logCount = getStats(log.ref());
- if (logCount.error > 0)
+ if (logCount.errors > 0)
pnl_.m_notebookResult->ChangeSelection(pagePosLog);
//fill image list to cope with wxNotebook image setting design desaster...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/ui/small_dlgs.cpp new/FreeFileSync/Source/ui/small_dlgs.cpp
--- old/FreeFileSync/Source/ui/small_dlgs.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/FreeFileSync/Source/ui/small_dlgs.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -1129,7 +1129,7 @@
void DeleteDialog::onOkay(wxCommandEvent& event)
{
- //additional safety net, similar to Windows Explorer: time delta between DEL and ENTER must be at least 50ms to avoid accidental deletion!
+ //additional safety net, similar to File Explorer: time delta between DEL and ENTER must be at least 50ms to avoid accidental deletion!
if (std::chrono::steady_clock::now() < dlgStartTime_ + std::chrono::milliseconds(50)) //considers chrono-wrap-around!
return;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/version/version.h new/FreeFileSync/Source/version/version.h
--- old/FreeFileSync/Source/version/version.h 2024-05-10 18:03:32.000000000 +0200
+++ new/FreeFileSync/Source/version/version.h 2024-06-23 09:46:58.000000000 +0200
@@ -3,7 +3,7 @@
namespace fff
{
-const char ffsVersion[] = "13.6"; //internal linkage!
+const char ffsVersion[] = "13.7"; //internal linkage!
const char FFS_VERSION_SEPARATOR = '.';
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcurl/curl_wrap.cpp new/libcurl/curl_wrap.cpp
--- old/libcurl/curl_wrap.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/libcurl/curl_wrap.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -402,9 +402,10 @@
ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_SSL_CLIENTCERT);
ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_UNRECOVERABLE_POLL);
ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_TOO_LARGE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_ECH_REQUIRED);
ZEN_CHECK_CASE_FOR_CONSTANT(CURL_LAST);
}
- static_assert(CURL_LAST == CURLE_TOO_LARGE + 1);
+ static_assert(CURL_LAST == CURLE_ECH_REQUIRED + 1);
return replaceCpy<std::wstring>(L"Curl status %x", L"%x", numberTo<std::wstring>(static_cast<int>(sc)));
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh2/libssh2_wrap.h new/libssh2/libssh2_wrap.h
--- old/libssh2/libssh2_wrap.h 2024-05-10 18:03:32.000000000 +0200
+++ new/libssh2/libssh2_wrap.h 2024-06-23 09:46:58.000000000 +0200
@@ -107,6 +107,20 @@
return libssh2_sftp_symlink_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()), buf, static_cast<unsigned int>(bufSize), LIBSSH2_SFTP_READLINK);
}
+#undef libssh2_sftp_symlink
+inline int libssh2_sftp_symlink(LIBSSH2_SFTP* sftp, const std::string& path, const std::string_view buf)
+{
+ return libssh2_sftp_symlink_ex(sftp,
+ /* CAVEAT: https://www.sftp.net/spec/openssh-sftp-extensions.txt
+ "When OpenSSH's sftp-server was implemented, the order of the arguments
+ to the SSH_FXP_SYMLINK method was inadvertently reversed."
+
+ => of course libssh2 didn't get the memo: fix this shit: */
+ /**/ buf .data (), static_cast<unsigned int>(buf .size()),
+ const_cast<char*>(path.c_str()), static_cast<unsigned int>(path.size()),
+ LIBSSH2_SFTP_SYMLINK);
+}
+
#undef libssh2_sftp_rename
inline int libssh2_sftp_rename(LIBSSH2_SFTP* sftp, const std::string& pathFrom, const std::string& pathTo, long flags)
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wx+/grid.cpp new/wx+/grid.cpp
--- old/wx+/grid.cpp 2024-05-10 18:03:33.000000000 +0200
+++ new/wx+/grid.cpp 2024-06-23 09:46:59.000000000 +0200
@@ -163,7 +163,7 @@
if (extentTrunc.GetWidth() > rect.width)
{
- //unlike Windows Explorer, we truncate UTF-16 correctly: e.g. CJK-Ideograph encodes to TWO wchar_t: utfTo<std::wstring>("\xf0\xa4\xbd\x9c");
+ //unlike File Explorer, we truncate UTF-16 correctly: e.g. CJK-Ideograph encodes to TWO wchar_t: utfTo<std::wstring>("\xf0\xa4\xbd\x9c");
size_t low = 0; //number of Unicode chars!
size_t high = unicodeLength(text); //
if (high > 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wx+/window_tools.h new/wx+/window_tools.h
--- old/wx+/window_tools.h 2024-05-10 18:03:32.000000000 +0200
+++ new/wx+/window_tools.h 2024-06-23 09:46:58.000000000 +0200
@@ -79,7 +79,10 @@
if (oldFocusId_ != wxID_ANY)
if (wxWindow* oldFocusWin = wxWindow::FindWindowById(oldFocusId_))
+ {
+ assert(oldFocusWin->IsEnabled()); //only enabled windows can have focus, so why wouldn't it be anymore?
setFocusIfActive(*oldFocusWin);
+ }
}
wxWindowID getFocusId() const { return oldFocusId_; }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zen/error_log.h new/zen/error_log.h
--- old/zen/error_log.h 2024-05-10 18:03:32.000000000 +0200
+++ new/zen/error_log.h 2024-06-23 09:46:58.000000000 +0200
@@ -38,9 +38,9 @@
struct ErrorLogStats
{
- int info = 0;
- int warning = 0;
- int error = 0;
+ int infos = 0;
+ int warnings = 0;
+ int errors = 0;
};
ErrorLogStats getStats(const ErrorLog& log);
@@ -66,16 +66,16 @@
switch (entry.type)
{
case MSG_TYPE_INFO:
- ++count.info;
+ ++count.infos;
break;
case MSG_TYPE_WARNING:
- ++count.warning;
+ ++count.warnings;
break;
case MSG_TYPE_ERROR:
- ++count.error;
+ ++count.errors;
break;
}
- assert(std::ssize(log) == count.info + count.warning + count.error);
+ assert(std::ssize(log) == count.infos + count.warnings + count.errors);
return count;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zen/file_access.h new/zen/file_access.h
--- old/zen/file_access.h 2024-05-10 18:03:32.000000000 +0200
+++ new/zen/file_access.h 2024-06-23 09:46:58.000000000 +0200
@@ -24,7 +24,7 @@
using FileIndex = ino_t;
using FileTimeNative = timespec;
-inline time_t nativeFileTimeToTimeT(const timespec& ft) { return ft.tv_sec; } //follow Windows Explorer: always round down!
+inline time_t nativeFileTimeToTimeT(const timespec& ft) { return ft.tv_sec; } //follow File Explorer: always round down!
inline timespec timetToNativeFileTime(time_t utcTime) { return {.tv_sec = utcTime}; }
enum class ItemType
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zen/format_unit.h new/zen/format_unit.h
--- old/zen/format_unit.h 2024-05-10 18:03:32.000000000 +0200
+++ new/zen/format_unit.h 2024-06-23 09:46:58.000000000 +0200
@@ -17,7 +17,7 @@
std::wstring formatFilesizeShort(int64_t filesize);
std::wstring formatRemainingTime(double timeInSec);
std::wstring formatProgressPercent(double fraction /*[0, 1]*/, int decPlaces = 0 /*[0, 9]*/); //rounded down!
-std::wstring formatUtcToLocalTime(time_t utcTime); //like Windows Explorer would...
+std::wstring formatUtcToLocalTime(time_t utcTime); //like File Explorer would...
std::wstring formatTwoDigitPrecision (double value); //format with fixed number of digits
std::wstring formatThreeDigitPrecision(double value); //(unless value is too large)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zen/socket.h new/zen/socket.h
--- old/zen/socket.h 2024-05-10 18:03:32.000000000 +0200
+++ new/zen/socket.h 2024-06-23 09:46:58.000000000 +0200
@@ -141,16 +141,6 @@
}
setNonBlocking(testSocket, false); //throw SysError
- //-----------------------------------------------------------
-
- int noDelay = 1; //disable Nagle algorithm: https://brooker.co.za/blog/2024/05/09/nagle.html
- //e.g. test case "website sync": 23% shorter comparison time!
- if (::setsockopt(testSocket, //_In_ SOCKET s
- IPPROTO_TCP, //_In_ int level
- TCP_NODELAY, //_In_ int optname
- reinterpret_cast<char*>(&noDelay), //_In_ const char* optval
- sizeof(noDelay)) != 0) //_In_ int optlen
- THROW_LAST_SYS_ERROR_WSA("setsockopt(TCP_NODELAY)");
return testSocket;
};
@@ -163,11 +153,26 @@
try
{
socket_ = getConnectedSocket(*si); //throw SysError; pass ownership
- return;
+ firstError = std::nullopt;
+ break;
}
catch (const SysError& e) { if (!firstError) firstError = e; }
- throw* firstError; //list was not empty, so there must have been an error!
+ if (firstError)
+ throw* firstError;
+ assert(socket_ != invalidSocket); //list was non-empty, so there's either an error, or a valid socket
+ ZEN_ON_SCOPE_FAIL(closeSocket(socket_));
+ //-----------------------------------------------------------
+ //configure *after* selecting appropriate socket: cfg-failure should not discard otherwise fine connection!
+
+ int noDelay = 1; //disable Nagle algorithm: https://brooker.co.za/blog/2024/05/09/nagle.html
+ //e.g. test case "website sync": 23% shorter comparison time!
+ if (::setsockopt(socket_, //_In_ SOCKET s
+ IPPROTO_TCP, //_In_ int level
+ TCP_NODELAY, //_In_ int optname
+ reinterpret_cast<const char*>(&noDelay), //_In_ const char* optval
+ sizeof(noDelay)) != 0) //_In_ int optlen
+ THROW_LAST_SYS_ERROR_WSA("setsockopt(TCP_NODELAY)");
}
~Socket() { closeSocket(socket_); }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zen/type_traits.h new/zen/type_traits.h
--- old/zen/type_traits.h 2024-05-10 18:03:33.000000000 +0200
+++ new/zen/type_traits.h 2024-06-23 09:46:58.000000000 +0200
@@ -30,6 +30,7 @@
using Type = decltype(dummyFun(F()));
};
template <class F> using FunctionReturnTypeT = typename FunctionReturnType<F>::Type;
+//yes, there's std::invoke_result_t, but it requires to specify function argument types for no good reason
//=============================================================================
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package typescript for openSUSE:Factory checked in at 2024-07-04 16:24:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/typescript (Old)
and /work/SRC/openSUSE:Factory/.typescript.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "typescript"
Thu Jul 4 16:24:12 2024 rev:26 rq:1185074 version:5.5.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/typescript/typescript.changes 2024-06-24 20:55:33.861284041 +0200
+++ /work/SRC/openSUSE:Factory/.typescript.new.2080/typescript.changes 2024-07-04 16:25:27.832308329 +0200
@@ -1,0 +2,11 @@
+Wed Jul 3 08:21:30 UTC 2024 - Andrea Manzini <andrea.manzini(a)suse.com>
+
+- Update to version 5.5.3
+ * fixed #59032 JavaScript and TypeScript language service has been disabled
+ after crashing repeatedly
+ * fixed #58955 @import JSDoc tag doesn't seem to account for resolution-mode
+ import attribute in TS v5.5.2
+
+For the full changelog see https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/
+
+-------------------------------------------------------------------
Old:
----
typescript-5.5.2.tgz
New:
----
typescript-5.5.3.tgz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ typescript.spec ++++++
--- /var/tmp/diff_new_pack.Dy4lTy/_old 2024-07-04 16:25:28.348327174 +0200
+++ /var/tmp/diff_new_pack.Dy4lTy/_new 2024-07-04 16:25:28.352327320 +0200
@@ -17,7 +17,7 @@
Name: typescript
-Version: 5.5.2
+Version: 5.5.3
Release: 0
Summary: A language for application scale JavaScript development
License: Apache-2.0
++++++ typescript-5.5.2.tgz -> typescript-5.5.3.tgz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/package/lib/tsc.js new/package/lib/tsc.js
--- old/package/lib/tsc.js 1985-10-26 09:15:00.000000000 +0100
+++ new/package/lib/tsc.js 1985-10-26 09:15:00.000000000 +0100
@@ -18,7 +18,7 @@
// src/compiler/corePublic.ts
var versionMajorMinor = "5.5";
-var version = "5.5.2";
+var version = "5.5.3";
// src/compiler/core.ts
var emptyArray = [];
@@ -48048,7 +48048,7 @@
}
if (moduleResolutionKind === 3 /* Node16 */ || moduleResolutionKind === 99 /* NodeNext */) {
const isSyncImport = currentSourceFile.impliedNodeFormat === 1 /* CommonJS */ && !findAncestor(location, isImportCall) || !!findAncestor(location, isImportEqualsDeclaration);
- const overrideHost = findAncestor(location, (l) => isImportTypeNode(l) || isExportDeclaration(l) || isImportDeclaration(l));
+ const overrideHost = findAncestor(location, (l) => isImportTypeNode(l) || isExportDeclaration(l) || isImportDeclaration(l) || isJSDocImportTag(l));
if (isSyncImport && sourceFile.impliedNodeFormat === 99 /* ESNext */ && !hasResolutionModeOverride(overrideHost)) {
if (findAncestor(location, isImportEqualsDeclaration)) {
error(errorNode, Diagnostics.Module_0_cannot_be_imported_using_this_construct_The_specifier_only_resolves_to_an_ES_module_which_cannot_be_imported_with_require_Use_an_ECMAScript_import_instead, moduleReference);
@@ -118604,7 +118604,7 @@
}
function getModeForUsageLocationWorker(file, usage, compilerOptions) {
var _a;
- if (isImportDeclaration(usage.parent) || isExportDeclaration(usage.parent)) {
+ if (isImportDeclaration(usage.parent) || isExportDeclaration(usage.parent) || isJSDocImportTag(usage.parent)) {
const isTypeOnly = isExclusivelyTypeOnlyImportOrExport(usage.parent);
if (isTypeOnly) {
const override = getResolutionModeOverride(usage.parent.attributes);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/package/lib/typescript.js new/package/lib/typescript.js
--- old/package/lib/typescript.js 1985-10-26 09:15:00.000000000 +0100
+++ new/package/lib/typescript.js 1985-10-26 09:15:00.000000000 +0100
@@ -2366,7 +2366,7 @@
// src/compiler/corePublic.ts
var versionMajorMinor = "5.5";
-var version = "5.5.2";
+var version = "5.5.3";
var Comparison = /* @__PURE__ */ ((Comparison3) => {
Comparison3[Comparison3["LessThan"] = -1] = "LessThan";
Comparison3[Comparison3["EqualTo"] = 0] = "EqualTo";
@@ -52812,7 +52812,7 @@
}
if (moduleResolutionKind === 3 /* Node16 */ || moduleResolutionKind === 99 /* NodeNext */) {
const isSyncImport = currentSourceFile.impliedNodeFormat === 1 /* CommonJS */ && !findAncestor(location, isImportCall) || !!findAncestor(location, isImportEqualsDeclaration);
- const overrideHost = findAncestor(location, (l) => isImportTypeNode(l) || isExportDeclaration(l) || isImportDeclaration(l));
+ const overrideHost = findAncestor(location, (l) => isImportTypeNode(l) || isExportDeclaration(l) || isImportDeclaration(l) || isJSDocImportTag(l));
if (isSyncImport && sourceFile.impliedNodeFormat === 99 /* ESNext */ && !hasResolutionModeOverride(overrideHost)) {
if (findAncestor(location, isImportEqualsDeclaration)) {
error2(errorNode, Diagnostics.Module_0_cannot_be_imported_using_this_construct_The_specifier_only_resolves_to_an_ES_module_which_cannot_be_imported_with_require_Use_an_ECMAScript_import_instead, moduleReference);
@@ -123600,7 +123600,7 @@
}
function getModeForUsageLocationWorker(file, usage, compilerOptions) {
var _a;
- if (isImportDeclaration(usage.parent) || isExportDeclaration(usage.parent)) {
+ if (isImportDeclaration(usage.parent) || isExportDeclaration(usage.parent) || isJSDocImportTag(usage.parent)) {
const isTypeOnly = isExclusivelyTypeOnlyImportOrExport(usage.parent);
if (isTypeOnly) {
const override = getResolutionModeOverride(usage.parent.attributes);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/package/package.json new/package/package.json
--- old/package/package.json 1985-10-26 09:15:00.000000000 +0100
+++ new/package/package.json 1985-10-26 09:15:00.000000000 +0100
@@ -2,7 +2,7 @@
"name": "typescript",
"author": "Microsoft Corp.",
"homepage": "https://www.typescriptlang.org/",
- "version": "5.5.2",
+ "version": "5.5.3",
"license": "Apache-2.0",
"description": "TypeScript is a language for application scale JavaScript development",
"keywords": [
@@ -112,5 +112,5 @@
"node": "20.1.0",
"npm": "8.19.4"
},
- "gitHead": "ce2e60e4ea15a65992e54a9e8877d16be9d42abb"
+ "gitHead": "f0e992167440686f948965e5441a918b34251886"
}
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ffmpeg-7 for openSUSE:Factory checked in at 2024-07-04 16:24:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ffmpeg-7 (Old)
and /work/SRC/openSUSE:Factory/.ffmpeg-7.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ffmpeg-7"
Thu Jul 4 16:24:10 2024 rev:2 rq:1185067 version:7.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/ffmpeg-7/ffmpeg-7.changes 2024-04-23 18:56:31.911454027 +0200
+++ /work/SRC/openSUSE:Factory/.ffmpeg-7.new.2080/ffmpeg-7.changes 2024-07-04 16:25:25.556225206 +0200
@@ -1,0 +2,15 @@
+Tue Jul 2 12:26:28 UTC 2024 - Cliff Zhao <qzhao(a)suse.com>
+
+- Add ffmpeg-7-CVE-2024-32230.patch:
+ Backporting 96449cfe from upstream, Fix 1 line and one column images.
+ (CVE-2024-32230 bsc#1227296)
+
+-------------------------------------------------------------------
+Tue Jul 2 11:57:01 UTC 2024 - Cliff Zhao <qzhao(a)suse.com>
+
+- Add ffmpeg-7-CVE-2024-32228.patch:
+ Backporting 45964876 from upstream, Fix segfault on invalid film
+ grain metadata.
+ (CVE-2024-32228, bsc#1227277)
+
+-------------------------------------------------------------------
New:
----
ffmpeg-7-CVE-2024-32228.patch
ffmpeg-7-CVE-2024-32230.patch
BETA DEBUG BEGIN:
New:
- Add ffmpeg-7-CVE-2024-32228.patch:
Backporting 45964876 from upstream, Fix segfault on invalid film
New:
- Add ffmpeg-7-CVE-2024-32230.patch:
Backporting 96449cfe from upstream, Fix 1 line and one column images.
BETA DEBUG END:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ffmpeg-7.spec ++++++
--- /var/tmp/diff_new_pack.DaKB4k/_old 2024-07-04 16:25:26.236250041 +0200
+++ /var/tmp/diff_new_pack.DaKB4k/_new 2024-07-04 16:25:26.240250187 +0200
@@ -104,7 +104,6 @@
Source92: ffmpeg_get_dlopen_headers.sh
Source98: http://ffmpeg.org/ffmpeg-devel.asc#/ffmpeg-7.keyring
Source99: baselibs.conf
-
Patch1: ffmpeg-arm6l.diff
Patch2: ffmpeg-new-coder-errors.diff
Patch3: ffmpeg-codec-choice.diff
@@ -112,7 +111,8 @@
Patch5: work-around-abi-break.patch
Patch10: ffmpeg-chromium.patch
Patch91: ffmpeg-dlopen-openh264.patch
-
+Patch92: ffmpeg-7-CVE-2024-32228.patch
+Patch93: ffmpeg-7-CVE-2024-32230.patch
BuildRequires: ladspa-devel
BuildRequires: libgsm-devel
BuildRequires: libmp3lame-devel >= 3.98.3
++++++ ffmpeg-7-CVE-2024-32228.patch ++++++
From 459648761f5412acdc3317d5bac982ceaa257584 Mon Sep 17 00:00:00 2001
From: Niklas Haas <git(a)haasn.dev>
Date: Sat Apr 6 13:11:09 2024 +0200
Subject: avcodec/hevcdec: fix segfault on invalid film grain metadata
References: CVE-2024-32228
References: https://bugzilla.opensuse.org/1227277
Upstream: Backport from upstream
Invalid input files may contain film grain metadata which survives
ff_h274_film_grain_params_supported() but does not pass
av_film_grain_params_select(), leading to a SIGSEGV on hevc_frame_end().
Fix this by duplicating the av_film_grain_params_select() check at frame
init time.
An alternative solution here would be to defer the incompatibility check
to hevc_frame_end(), but this has the downside of allocating a film
grain buffer even when we already know we can't apply film grain.
Fixes: https://trac.ffmpeg.org/ticket/10951
--- ffmpeg-7.0/libavcodec/hevcdec.c 2024-04-05 07:22:59.000000000 +0800
+++ ffmpeg-7.0_new/libavcodec/hevcdec.c 2024-07-02 22:48:49.293996651 +0800
@@ -2892,10 +2892,16 @@
!(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) &&
!s->avctx->hwaccel;
+ ret = set_side_data(s);
+ if (ret < 0)
+ goto fail;
+
if (s->ref->needs_fg &&
- s->sei.common.film_grain_characteristics.present &&
- !ff_h274_film_grain_params_supported(s->sei.common.film_grain_characteristics.model_id,
- s->ref->frame->format)) {
+ ( s->sei.common.film_grain_characteristics.present &&
+ !ff_h274_film_grain_params_supported(s->sei.common.film_grain_characteristics.model_id,
+ s->ref->frame->format))
+ || !av_film_grain_params_select(s->ref->frame)) {
+
av_log_once(s->avctx, AV_LOG_WARNING, AV_LOG_DEBUG, &s->film_grain_warning_shown,
"Unsupported film grain parameters. Ignoring film grain.\n");
s->ref->needs_fg = 0;
@@ -2909,10 +2915,6 @@
goto fail;
}
- ret = set_side_data(s);
- if (ret < 0)
- goto fail;
-
s->frame->pict_type = 3 - s->sh.slice_type;
if (!IS_IRAP(s))
++++++ ffmpeg-7-CVE-2024-32230.patch ++++++
From 96449cfeaeb95fcfd7a2b8d9ccf7719e97471ed1 Mon Sep 17 00:00:00 2001
Author: Michael Niedermayer <michael(a)niedermayer.cc>
Date: Mon Apr 8 18:38:42 2024 +0200
Subject: avcodec/mpegvideo_enc: Fix 1 line and one column images
References: CVE-2024-32230
References: https://bugzilla.opensuse.org/1227296
Upstream: Backport from upstream
Fixes: Ticket10952
Fixes: poc21ffmpeg
Signed-off-by: Michael Niedermayer <michael(a)niedermayer.cc>
--- ffmpeg-7.0/libavcodec/mpegvideo_enc.c 2024-04-05 07:22:59.000000000 +0800
+++ ffmpeg-7.0_new/libavcodec/mpegvideo_enc.c 2024-07-02 23:24:47.410634866 +0800
@@ -1198,8 +1198,8 @@
ptrdiff_t dst_stride = i ? s->uvlinesize : s->linesize;
int h_shift = i ? s->chroma_x_shift : 0;
int v_shift = i ? s->chroma_y_shift : 0;
- int w = s->width >> h_shift;
- int h = s->height >> v_shift;
+ int w = AV_CEIL_RSHIFT(s->width , h_shift);
+ int h = AV_CEIL_RSHIFT(s->height, v_shift);
const uint8_t *src = pic_arg->data[i];
uint8_t *dst = pic->f->data[i];
int vpad = 16;
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package sdl_bomber for openSUSE:Factory checked in at 2024-07-04 16:23:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/sdl_bomber (Old)
and /work/SRC/openSUSE:Factory/.sdl_bomber.new.2080 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "sdl_bomber"
Thu Jul 4 16:23:58 2024 rev:2 rq:1185050 version:1.0.4
Changes:
--------
--- /work/SRC/openSUSE:Factory/sdl_bomber/sdl_bomber.changes 2016-01-16 11:56:50.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.sdl_bomber.new.2080/sdl_bomber.changes 2024-07-04 16:25:18.375962982 +0200
@@ -1,0 +2,5 @@
+Wed Jun 19 08:39:11 UTC 2024 - hui <sturm-fr(a)web.de>
+
+- Fix broken file path in sdl_bomber.sh boo#1218788
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ sdl_bomber.spec ++++++
--- /var/tmp/diff_new_pack.A2xvqr/_old 2024-07-04 16:25:19.219993806 +0200
+++ /var/tmp/diff_new_pack.A2xvqr/_new 2024-07-04 16:25:19.223993952 +0200
@@ -1,7 +1,7 @@
#
# spec file for package ssdl_bomber
#
-# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2024 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
++++++ sdl_bomber.sh ++++++
--- /var/tmp/diff_new_pack.A2xvqr/_old 2024-07-04 16:25:19.275995851 +0200
+++ /var/tmp/diff_new_pack.A2xvqr/_new 2024-07-04 16:25:19.279995998 +0200
@@ -1,5 +1,5 @@
#!/bin/sh
-cd /usr/lib/sdl_bomber
+cd /usr/libexec/sdl_bomber
exec ./bomber "${@}"
1
0