openSUSE Commits
Threads by month
- ----- 2025 -----
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 1 participants
- 383805 discussions
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package gpu-screen-recorder-gtk for openSUSE:Factory checked in at 2025-01-05 15:29:21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gpu-screen-recorder-gtk (Old)
and /work/SRC/openSUSE:Factory/.gpu-screen-recorder-gtk.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gpu-screen-recorder-gtk"
Sun Jan 5 15:29:21 2025 rev:12 rq:1234647 version:20250102
Changes:
--------
--- /work/SRC/openSUSE:Factory/gpu-screen-recorder-gtk/gpu-screen-recorder-gtk.changes 2024-12-03 20:47:28.647713758 +0100
+++ /work/SRC/openSUSE:Factory/.gpu-screen-recorder-gtk.new.1881/gpu-screen-recorder-gtk.changes 2025-01-05 15:29:32.385525959 +0100
@@ -1,0 +2,16 @@
+Fri Jan 03 04:11:10 UTC 2025 - mantarimay(a)pm.me
+
+- Update to version 20250102:
+ * Fix regression: incorrect window resulting in incorrect game
+ name for video, and background for uncomposited x11
+ * Fix unable to properly add program to system startup on
+ immutable distros
+ * Fix streaming not working in the new UI
+ * Open the running new UI when trying to launch it again instead
+ of showing an error, to allow switching back to the old UI in
+ case of errors
+ * Add a new experimental UI, a ShadowPlay-like fullscreen
+ overlay UI with support for global hotkeys on any Wayland
+ compositor
+
+-------------------------------------------------------------------
Old:
----
gpu-screen-recorder-gtk-20241124.tar.zst
New:
----
gpu-screen-recorder-gtk-20250102.tar.zst
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ gpu-screen-recorder-gtk.spec ++++++
--- /var/tmp/diff_new_pack.MeeYuA/_old 2025-01-05 15:29:33.073554259 +0100
+++ /var/tmp/diff_new_pack.MeeYuA/_new 2025-01-05 15:29:33.077554424 +0100
@@ -1,7 +1,7 @@
#
# spec file for package gpu-screen-recorder-gtk
#
-# Copyright (c) 2024 mantarimay
+# Copyright (c) 2025 mantarimay
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
%bcond_with test
%define appid com.dec05eba.gpu_screen_recorder
Name: gpu-screen-recorder-gtk
-Version: 20241124
+Version: 20250102
Release: 0
Summary: GTK frontend for GPU Screen Recorder
License: GPL-3.0-only
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.MeeYuA/_old 2025-01-05 15:29:33.129556563 +0100
+++ /var/tmp/diff_new_pack.MeeYuA/_new 2025-01-05 15:29:33.137556892 +0100
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://repo.dec05eba.com/gpu-screen-recorder-gtk.git</param>
- <param name="changesrevision">26adb4d8189ddad7d33a74ba2f356ea97c288fd8</param></service></servicedata>
+ <param name="changesrevision">33071d4c8413b52d628d0253270ce3c5d3743845</param></service></servicedata>
(No newline at EOF)
++++++ gpu-screen-recorder-gtk-20241124.tar.zst -> gpu-screen-recorder-gtk-20250102.tar.zst ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/README.md new/gpu-screen-recorder-gtk-20250102/README.md
--- old/gpu-screen-recorder-gtk-20241124/README.md 2024-11-24 22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/README.md 2025-01-02 15:36:27.000000000 +0100
@@ -5,9 +5,9 @@
There is a new alternative UI for GPU Screen Recorder in the style of ShadowPlay available here: [GPU Screen Recorder UI](https://git.dec05eba.com/gpu-screen-recorder-ui/).
# Installation
-This program depends on [GPU Screen Recorder](https://git.dec05eba.com/gpu-screen-recorder/) which needs to be installed first.\
-Run `sudo ./install.sh` or if you are running Arch Linux, then you can find gpu screen recorder gtk on aur under the name gpu-screen-recorder-gtk (`yay -S gpu-screen-recorder-gtk`).\
-You can also install gpu screen recorder (the gtk gui version) from [flathub](https://flathub.org/apps/details/com.dec05eba.gpu_screen_recorder). This flatpak includes gpu-screen-recorder so no need to install that first.
+If you are using an Arch Linux based distro then you can find gpu screen recorder gtk on aur under the name gpu-screen-recorder-gtk (`yay -S gpu-screen-recorder-gtk`).\
+If you are running another distro then you can run `sudo ./install.sh`, but you need to manually install the dependencies, as described below.\
+You can also install gpu screen recorder from [flathub](https://flathub.org/apps/details/com.dec05eba.gpu_screen_recorder). This flatpak includes both this UI and gpu-screen-recorder so no need to install that first.
# Dependencies
GPU Screen Recorder GTK uses meson build system so you need to install `meson` to build GPU Screen Recorder GTK.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/TODO new/gpu-screen-recorder-gtk-20250102/TODO
--- old/gpu-screen-recorder-gtk-20241124/TODO 2024-11-24 22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/TODO 2025-01-02 15:36:27.000000000 +0100
@@ -69,4 +69,4 @@
Move x11 hotkey code to its own file.
-Add audio devices/app refresh button.
\ No newline at end of file
+Detect gpu screen recorder flatpak update and restart the gsr-ui systemd service to apply the update. Or show a notification when it has been updated and can be restarted to apply update.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/com.dec05eba.gpu_screen_recorder.appdata.xml new/gpu-screen-recorder-gtk-20250102/com.dec05eba.gpu_screen_recorder.appdata.xml
--- old/gpu-screen-recorder-gtk-20241124/com.dec05eba.gpu_screen_recorder.appdata.xml 2024-11-24 22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/com.dec05eba.gpu_screen_recorder.appdata.xml 2025-01-02 15:36:27.000000000 +0100
@@ -37,6 +37,9 @@
<li>AAC</li>
</ul>
<p>
+ At the moment the program comes with two different UIs. A gtk based one and a new experimental ShadowPlay-like fullscreen overlay UI. The gtk based UI will be removed in the future.
+ </p>
+ <p>
Recording a monitor requires (restricted) root access which means that you have to install GPU Screen Recorder system-wide: "flatpak install --system com.dec05eba.gpu_screen_recorder"
and pkexec needs to be installed on the system and a polkit agent needs to be running.
Note that this only applies to when recording a monitor on AMD/Intel or when recording on Wayland without using the desktop portal option.
@@ -61,25 +64,71 @@
You can find which NVIDIA driver version is running on your system by running "cat /proc/driver/nvidia/version".
</p>
<p>GPU Screen Recorder flatpak can install files in $HOME/.local/share/gpu-screen-recorder. If you want to uninstall GPU Screen Recorder then you will have to remove this directory manually.</p>
+ <p>If you tried out the new UI then a systemd service was added to ~/.local/share/systemd/user/gpu-screen-recorder-ui.service. If you want to uninstall GPU Screen Recorder then you will have to remove this file.</p>
</description>
<launchable type="desktop-id">com.dec05eba.gpu_screen_recorder.desktop</launchable>
<screenshots>
<screenshot type="default">
- <caption>Simple view</caption>
+ <caption>Front page</caption>
+ <image>https://raw.githubusercontent.com/dec05eba/com.dec05eba.gpu_screen_recorder…</image>
+ </screenshot>
+ <screenshot>
+ <caption>Settings page</caption>
+ <image>https://raw.githubusercontent.com/dec05eba/com.dec05eba.gpu_screen_recorder…</image>
+ </screenshot>
+ <screenshot>
+ <caption>Simple view in the old UI</caption>
<image>https://raw.githubusercontent.com/dec05eba/com.dec05eba.gpu_screen_recorder…</image>
</screenshot>
<screenshot>
- <caption>Advanced view</caption>
+ <caption>Advanced view in the old UI</caption>
<image>https://raw.githubusercontent.com/dec05eba/com.dec05eba.gpu_screen_recorder…</image>
</screenshot>
<screenshot>
- <caption>Recording page</caption>
+ <caption>Recording page in the old UI</caption>
<image>https://raw.githubusercontent.com/dec05eba/com.dec05eba.gpu_screen_recorder…</image>
</screenshot>
</screenshots>
<releases>
+ <release version="5.0.4" date="2025-01-01">
+ <description>
+ <ul>
+ <li>Fix regression: incorrect window resulting in incorrect game name for video, and background for uncomposited x11</li>
+ </ul>
+ </description>
+ </release>
+ <release version="5.0.3" date="2024-12-31">
+ <description>
+ <ul>
+ <li>Fix unable to properly add program to system startup on immutable distros</li>
+ </ul>
+ </description>
+ </release>
+ <release version="5.0.2" date="2024-12-31">
+ <description>
+ <ul>
+ <li>Fix streaming not working in the new UI</li>
+ </ul>
+ </description>
+ </release>
+ <release version="5.0.1" date="2024-12-30">
+ <description>
+ <ul>
+ <li>Open the running new UI when trying to launch it again instead of showing an error, to allow switching back to the old UI in case of errors</li>
+ </ul>
+ </description>
+ </release>
+ <release version="5.0.0" date="2024-12-29">
+ <description>
+ <ul>
+ <li>Add a new experimental UI, a ShadowPlay-like fullscreen overlay UI with support for global hotkeys on any Wayland compositor</li>
+ <li>Better compatibility and performance on some older AMD GPUs</li>
+ <li>Better handle application audio nodes, fixing possible issue with application audio not working</li>
+ </ul>
+ </description>
+ </release>
<release version="4.3.3" date="2024-11-22">
<description>
<ul>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/meson.build new/gpu-screen-recorder-gtk-20250102/meson.build
--- old/gpu-screen-recorder-gtk-20241124/meson.build 2024-11-24 22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/meson.build 2025-01-02 15:36:27.000000000 +0100
@@ -1,4 +1,4 @@
-project('gpu-screen-recorder-gtk', ['c', 'cpp'], version : '4.3.3', default_options : ['warning_level=2'])
+project('gpu-screen-recorder-gtk', ['c', 'cpp'], version : '5.0.0', default_options : ['warning_level=2'])
add_project_arguments('-Wshadow', language : ['c', 'cpp'])
if get_option('buildtype') == 'debug'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/project.conf new/gpu-screen-recorder-gtk-20250102/project.conf
--- old/gpu-screen-recorder-gtk-20241124/project.conf 2024-11-24 22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/project.conf 2025-01-02 15:36:27.000000000 +0100
@@ -1,7 +1,7 @@
[package]
name = "gpu-screen-recorder-gtk"
type = "executable"
-version = "4.3.3"
+version = "5.0.0"
platforms = ["posix"]
[config]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/src/config.hpp new/gpu-screen-recorder-gtk-20250102/src/config.hpp
--- old/gpu-screen-recorder-gtk-20241124/src/config.hpp 2024-11-24 22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/src/config.hpp 2025-01-02 15:36:27.000000000 +0100
@@ -48,6 +48,8 @@
bool hevc_amd_bug_warning_shown = false;
bool av1_amd_bug_warning_shown = false;
bool restore_portal_session = true;
+ bool use_new_ui = false;
+ int32_t installed_gsr_global_hotkeys_version = 0;
};
struct YoutubeStreamConfig {
@@ -334,6 +336,8 @@
{"main.hevc_amd_bug_warning_shown", {CONFIG_TYPE_BOOL, &config.main_config.hevc_amd_bug_warning_shown}},
{"main.av1_amd_bug_warning_shown", {CONFIG_TYPE_BOOL, &config.main_config.av1_amd_bug_warning_shown}},
{"main.restore_portal_session", {CONFIG_TYPE_BOOL, &config.main_config.restore_portal_session}},
+ {"main.use_new_ui", {CONFIG_TYPE_BOOL, &config.main_config.use_new_ui}},
+ {"main.installed_gsr_global_hotkeys_version", {CONFIG_TYPE_I32, &config.main_config.installed_gsr_global_hotkeys_version}},
{"streaming.service", {CONFIG_TYPE_STRING, &config.streaming_config.streaming_service}},
{"streaming.youtube.key", {CONFIG_TYPE_STRING, &config.streaming_config.youtube.stream_key}},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/src/main.cpp new/gpu-screen-recorder-gtk-20250102/src/main.cpp
--- old/gpu-screen-recorder-gtk-20241124/src/main.cpp 2024-11-24 22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/src/main.cpp 2025-01-02 15:36:27.000000000 +0100
@@ -20,6 +20,8 @@
#include <vector>
#include <libayatana-appindicator/app-indicator.h>
+#define GSR_CURRENT_GLOBAL_HOTKEYS_CODE_VERSION 1
+
#ifndef GSR_VERSION
#define GSR_VERSION "unknown"
#endif
@@ -151,6 +153,7 @@
static bool streaming = false;
static pid_t gpu_screen_recorder_process = -1;
static int prev_exit_status = -1;
+static bool config_empty = false;
static Config config;
static std::string record_file_current_filename;
static bool nvfbc_installed = false;
@@ -241,7 +244,6 @@
struct SupportedCaptureOptions {
bool window = false;
bool focused = false;
- bool screen = false;
bool portal = false;
std::vector<GsrMonitor> monitors;
};
@@ -1033,6 +1035,7 @@
return GDK_FILTER_CONTINUE;
Window target_win = ev->xbutton.subwindow;
+ // TODO: Fix, this is incorrect when trying to record steam window. For steam window
Window new_window = window_get_target_window_child(_select_window_userdata->display, target_win);
if(new_window)
target_win = new_window;
@@ -1396,13 +1399,13 @@
if(flatpak && !flatpak_is_installed_as_system()) {
if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) {
GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- "GPU Screen Recorder needs to be installed system-wide to record your monitor on Wayland when not using the portal option. To install GPU Screen recorder system-wide, you can run this command:\n"
+ "GPU Screen Recorder needs to be installed system-wide to record your monitor on Wayland when not using the portal option. You can run this command to install GPU Screen recorder system-wide:\n"
"flatpak install --system com.dec05eba.gpu_screen_recorder\n");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
} else {
GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- "GPU Screen Recorder needs to be installed system-wide to record your monitor on AMD/Intel when not using the portal option. To install GPU Screen recorder system-wide, you can run this command:\n"
+ "GPU Screen Recorder needs to be installed system-wide to record your monitor on AMD/Intel when not using the portal option. You can run this command to install GPU Screen recorder system-wide:\n"
"flatpak install --system com.dec05eba.gpu_screen_recorder\n"
"Alternatively, record a single window which doesn't have this restriction.");
gtk_dialog_run(GTK_DIALOG(dialog));
@@ -2595,8 +2598,6 @@
_gsr_info->supported_capture_options.window = true;
else if(line == "focused")
_gsr_info->supported_capture_options.focused = true;
- else if(line == "screen")
- _gsr_info->supported_capture_options.screen = true;
else if(line == "portal")
_gsr_info->supported_capture_options.portal = true;
else
@@ -2706,6 +2707,112 @@
g_free(id);
}
+static void launch_gsr_ui(bool show_ui) {
+ const char *args[] = { "gsr-ui", show_ui ? "launch-show" : "launch-hide", nullptr };
+ execvp(args[0], (char* const*)args);
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "gsr-ui (gpu-screen-recorder-ui) isn't installed. Please install it first.");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+}
+
+static gboolean on_click_switch_to_new_ui(GtkButton*, gpointer) {
+ if(!dpy) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "The new UI only works on X11 or through XWayland on Wayland. Native Wayland is not supported because Wayland is missing features required by this software.\n"
+ "Install X11 on your system to use the new UI.");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ return true;
+ }
+
+ if(!is_pkexec_installed()) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "pkexec needs to be installed to switch to the new UI");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ return true;
+ }
+
+ if(!flatpak_is_installed_as_system()) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "GPU Screen Recorder needs to be installed system-wide to use the new UI. You can run this command to install GPU Screen recorder system-wide:\n"
+ "flatpak install --system com.dec05eba.gpu_screen_recorder\n");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ return true;
+ }
+
+ GtkWidget *dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
+ "You are about to try out the new UI, which is a ShadowPlay-like fullscreen UI. It runs in the background and you have to show/hide it by pressing Alt+Z.\n"
+ "This new UI is still experimental and you may experience issues depending on your system. You can switch back to the old UI at any time by opening the UI and clicking on the settings button and clicking on the \"Go back to the old UI\" button.\n"
+ "Note that at the moment it assumes you are using a keyboard with qwerty layout. If you are using another keyboard layout then instead of pressing Alt+Z you have to press the key that has been switched the with Z key.\n"
+ "\n"
+ "This new UI comes with new features, such as being able to automatically launch it on system startup by enabling it in settings, and hotkey support on any Wayland compositor.\n"
+ "\n"
+ "If you are using an NVIDIA GPU then you may experience issue with recording/replay if a suspend happens while recording/using replay. This is an NVIDIA driver issue and it also happens in the old UI.\n"
+ "See this for a workaround: <a href=\"https://wiki.archlinux.org/title/NVIDIA/Tips_and_tricks#Preserve_video_memo…">Arch Wiki - Preserve video memory after suspend</a>.\n"
+ "\n"
+ "Are you sure you want to switch to the new UI?");
+ gint response = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ switch(response) {
+ case GTK_RESPONSE_YES:
+ break;
+ case GTK_RESPONSE_NO:
+ default:
+ return true;
+ }
+
+ dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
+ "The new UI needs root privileges to finish setup to make global hotkeys and recording work on any system. The new UI will also be added to system startup.\n"
+ "\n"
+ "Are you sure you want to continue?");
+ response = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ switch(response) {
+ case GTK_RESPONSE_YES:
+ break;
+ case GTK_RESPONSE_NO:
+ default:
+ return true;
+ }
+
+ const int exit_code = system("flatpak-spawn --host -- /var/lib/flatpak/app/com.dec05eba.gpu_screen_recorder/current/active/files/bin/kms-server-proxy setup-gsr-ui");
+ if(exit_code != 0) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "Failed to setup the new UI. You either cancelled the installation or you don't have pkexec installed and a polkit agent running.");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ return true;
+ }
+
+ config.main_config.use_new_ui = true;
+ config.main_config.installed_gsr_global_hotkeys_version = GSR_CURRENT_GLOBAL_HOTKEYS_CODE_VERSION;
+ save_configs();
+
+ bool service_install_successful = (system(
+ "data_home=$(flatpak-spawn --host -- /bin/sh -c 'echo \"${XDG_DATA_HOME:-$HOME/.local/share}\"') && "
+ "flatpak-spawn --host -- install -Dm644 /var/lib/flatpak/app/com.dec05eba.gpu_screen_recorder/current/active/files/share/gpu-screen-recorder/gpu-screen-recorder-ui.service \"$data_home/systemd/user/gpu-screen-recorder-ui.service\"") == 0);
+ service_install_successful &= (system("flatpak-spawn --host -- systemctl --user daemon-reload") == 0);
+ service_install_successful &= (system("flatpak-spawn --host -- systemctl enable --now --user gpu-screen-recorder-ui") == 0);
+ if(!service_install_successful) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
+ "Failed to add GPU Screen Recorder to system startup. If you want the new UI to start on system startup then you need to add this command to system startup:\n"
+ "flatpak run com.dec05eba.gpu_screen_recorder gsr-ui");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ }
+
+ if(!service_install_successful)
+ launch_gsr_ui(true);
+
+ g_application_quit(G_APPLICATION(select_window_userdata.app));
+ return true;
+}
+
static GtkWidget* create_common_settings_page(GtkStack *stack, GtkApplication *app) {
GtkGrid *main_grid = GTK_GRID(gtk_grid_new());
gtk_stack_add_named(stack, GTK_WIDGET(main_grid), "common-settings");
@@ -2723,7 +2830,9 @@
int notifications_area_row = 0;
GtkGrid *simple_advanced_grid = GTK_GRID(gtk_grid_new());
- gtk_grid_attach(main_grid, GTK_WIDGET(simple_advanced_grid), 0, main_grid_row++, 2, 1);
+ gtk_grid_set_column_spacing(simple_advanced_grid, 10);
+ gtk_grid_attach(main_grid, GTK_WIDGET(simple_advanced_grid), 0, main_grid_row++, flatpak ? 3 : 2, 1);
+
gtk_grid_attach(simple_advanced_grid, gtk_label_new("View: "), 0, 0, 1, 1);
view_combo_box = GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new());
g_signal_connect(view_combo_box, "scroll-event", G_CALLBACK(scroll_event_ignore), NULL);
@@ -2734,6 +2843,12 @@
gtk_combo_box_set_active(GTK_COMBO_BOX(view_combo_box), 0);
g_signal_connect(view_combo_box, "changed", G_CALLBACK(view_combo_box_change_callback), view_combo_box);
+ if(flatpak) {
+ GtkButton *switch_to_new_ui_button = GTK_BUTTON(gtk_button_new_with_label("Try out the new UI"));
+ gtk_grid_attach(simple_advanced_grid, GTK_WIDGET(switch_to_new_ui_button), 2, 0, 1, 1);
+ g_signal_connect(switch_to_new_ui_button, "clicked", G_CALLBACK(on_click_switch_to_new_ui), nullptr);
+ }
+
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL));
gtk_scrolled_window_set_min_content_width(scrolled_window, 100);
gtk_scrolled_window_set_min_content_height(scrolled_window, 100);
@@ -2796,12 +2911,6 @@
const bool allow_screen_capture = is_monitor_capture_drm() || nvfbc_installed;
if(allow_screen_capture) {
- if(gsr_info.supported_capture_options.screen) {
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, "All monitors", -1);
- gtk_list_store_set(store, &iter, 1, "screen", -1);
- }
-
for(const auto &monitor : gsr_info.supported_capture_options.monitors) {
std::string label = "Monitor ";
label += monitor.name;
@@ -2852,7 +2961,9 @@
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(record_area_selection_menu), renderer, "text", 0, NULL);
gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(record_area_selection_menu), renderer, record_area_set_sensitive, NULL, NULL);
- if(allow_screen_capture || gsr_info.supported_capture_options.portal)
+ if(allow_screen_capture && !gsr_info.supported_capture_options.portal && gsr_info.supported_capture_options.monitors.empty())
+ gtk_combo_box_set_active(record_area_selection_menu, 0);
+ else if(allow_screen_capture || gsr_info.supported_capture_options.portal)
gtk_combo_box_set_active(record_area_selection_menu, 2);
else
gtk_combo_box_set_active(record_area_selection_menu, 0);
@@ -3061,42 +3172,44 @@
gtk_list_store_set(store, &iter, 1, "hevc", -1);
gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.av1 ? "AV1 (Smallest file size, worst software compatibility)" : "AV1 (Not available on your system)", -1);
- gtk_list_store_set(store, &iter, 1, "av1", -1);
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.vp8 ? "VP8" : "VP8 (Not available on your system)", -1);
- gtk_list_store_set(store, &iter, 1, "vp8", -1);
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.vp9 ? "VP9" : "VP9 (Not available on your system)", -1);
- gtk_list_store_set(store, &iter, 1, "vp9", -1);
+ gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.hevc ? "HEVC (10 bit, reduces banding)" : "HEVC (10 bit, not available on your system)", -1);
+ gtk_list_store_set(store, &iter, 1, "hevc_10bit", -1);
if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.hevc ? "HEVC (HDR)" : "HEVC (HDR, not available on your system)", -1);
gtk_list_store_set(store, &iter, 1, "hevc_hdr", -1);
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.av1 ? "AV1 (HDR)" : "AV1 (HDR, not available on your system)", -1);
- gtk_list_store_set(store, &iter, 1, "av1_hdr", -1);
} else {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "HEVC (HDR, not available on X11)", -1);
gtk_list_store_set(store, &iter, 1, "hevc_hdr", -1);
+ }
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.av1 ? "AV1 (Smallest file size, worst software compatibility)" : "AV1 (Not available on your system)", -1);
+ gtk_list_store_set(store, &iter, 1, "av1", -1);
+
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.av1 ? "AV1 (10 bit, reduces banding)" : "AV1 (10 bit, not available on your system)", -1);
+ gtk_list_store_set(store, &iter, 1, "av1_10bit", -1);
+
+ if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) {
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.av1 ? "AV1 (HDR)" : "AV1 (HDR, not available on your system)", -1);
+ gtk_list_store_set(store, &iter, 1, "av1_hdr", -1);
+ } else {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "AV1 (HDR, not available on X11)", -1);
gtk_list_store_set(store, &iter, 1, "av1_hdr", -1);
}
gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.hevc ? "HEVC (10 bit, reduces banding)" : "HEVC (10 bit, not available on your system)", -1);
- gtk_list_store_set(store, &iter, 1, "hevc_10bit", -1);
+ gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.vp8 ? "VP8" : "VP8 (Not available on your system)", -1);
+ gtk_list_store_set(store, &iter, 1, "vp8", -1);
gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.av1 ? "AV1 (10 bit, reduces banding)" : "AV1 (10 bit, not available on your system)", -1);
- gtk_list_store_set(store, &iter, 1, "av1_10bit", -1);
+ gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.vp9 ? "VP9" : "VP9 (Not available on your system)", -1);
+ gtk_list_store_set(store, &iter, 1, "vp9", -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, gsr_info.supported_video_codecs.h264_software ? "H264 Software Encoder (Slow, not recommeded)" : "H264 Software Encoder (Not available on your system)", -1);
@@ -3903,16 +4016,11 @@
}
static void load_config() {
- bool config_empty = false;
- config = read_config(config_empty);
-
std::string first_monitor;
if(gsr_info.system_info.display_server != DisplayServer::WAYLAND && strcmp(config.main_config.record_area_option.c_str(), "window") == 0) {
//
} else if(gsr_info.system_info.display_server != DisplayServer::WAYLAND && strcmp(config.main_config.record_area_option.c_str(), "focused") == 0) {
//
- } else if(gsr_info.system_info.display_server != DisplayServer::WAYLAND && gsr_info.gpu_info.vendor == GpuVendor::NVIDIA && strcmp(config.main_config.record_area_option.c_str(), "screen") == 0) {
- //
} else if(config.main_config.record_area_option == "portal" && gsr_info.supported_capture_options.portal && gsr_info.system_info.display_server == DisplayServer::WAYLAND) {
//
} else {
@@ -4195,7 +4303,7 @@
if(gsr_info.system_info.display_server == DisplayServer::X11 && !dpy) {
GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- "Failed to connect to X11 server");
+ "Failed to connect to the X11 server");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
g_application_quit(G_APPLICATION(app));
@@ -4236,7 +4344,7 @@
#else
const char *icon_path = "/usr/share/icons";
#endif
- gtk_icon_theme_set_search_path(icon_theme, &icon_path, 1);
+ gtk_icon_theme_prepend_search_path(icon_theme, icon_path);
const char *icon_name = "com.dec05eba.gpu_screen_recorder";
if(!gtk_icon_theme_has_icon(icon_theme, icon_name))
@@ -4320,15 +4428,124 @@
}
}
+static bool kms_server_proxy_setup_gsr_ui(const char *msg) {
+ GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", msg);
+ const gint response = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ switch(response) {
+ case GTK_RESPONSE_YES:
+ break;
+ case GTK_RESPONSE_NO:
+ default: {
+ config.main_config.use_new_ui = false;
+ save_config(config);
+ return false;
+ }
+ }
+
+ const int exit_code = system("flatpak-spawn --host -- /var/lib/flatpak/app/com.dec05eba.gpu_screen_recorder/current/active/files/bin/kms-server-proxy setup-gsr-ui");
+ if(exit_code != 0) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Failed to setup the new UI. You either cancelled the installation or you don't have pkexec installed and a polkit agent running.");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ config.main_config.use_new_ui = false;
+ save_configs();
+ return false;
+ }
+
+ config.main_config.use_new_ui = true;
+ config.main_config.installed_gsr_global_hotkeys_version = GSR_CURRENT_GLOBAL_HOTKEYS_CODE_VERSION;
+ save_config(config);
+ return true;
+}
+
+static bool is_gsr_global_hotkeys_installed() {
+ const char *user_homepath = getenv("HOME");
+ if(!user_homepath)
+ user_homepath = "/tmp";
+
+ char path[PATH_MAX];
+ snprintf(path, sizeof(path), "%s/.local/share/gpu-screen-recorder/gsr-global-hotkeys", user_homepath);
+ return access(path, F_OK) == 0;
+}
+
+static bool is_kms_server_proxy_installed() {
+ const char *user_homepath = getenv("HOME");
+ if(!user_homepath)
+ user_homepath = "/tmp";
+
+ char path[PATH_MAX];
+ snprintf(path, sizeof(path), "%s/.local/share/gpu-screen-recorder/kms-server-proxy-1", user_homepath);
+ return access(path, F_OK) == 0;
+}
+
+static void startup_new_ui(bool launched_by_daemon) {
+ if(!dpy) {
+ if(launched_by_daemon) {
+ fprintf(stderr, "Error: failed to connect to the X11 server, assuming no graphical session has started yet\n");
+ exit(1);
+ } else {
+ GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "Failed to connect to the X11 server while trying to start the new GPU Screen Recorder UI. Please install X11 on your system to use the new UI");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ config.main_config.use_new_ui = false;
+ save_config(config);
+ return;
+ }
+ }
+
+ if(config.main_config.installed_gsr_global_hotkeys_version != GSR_CURRENT_GLOBAL_HOTKEYS_CODE_VERSION) {
+ if(!kms_server_proxy_setup_gsr_ui(
+ "An update is available. The new GPU Screen Recorder UI needs root privileges to finish update to make global hotkeys and recording work on any system.\n"
+ "\n"
+ "Are you sure you want to continue?"))
+ {
+ return;
+ }
+ } else if(!is_gsr_global_hotkeys_installed() || !is_kms_server_proxy_installed()) {
+ if(!kms_server_proxy_setup_gsr_ui(
+ "Required files are missing to launch the new GPU Screen Recorder UI. These files will be installed again.\n"
+ "\n"
+ "Are you sure you want to continue?"))
+ {
+ return;
+ }
+ }
+
+ launch_gsr_ui(!launched_by_daemon);
+ exit(0);
+}
+
int main(int argc, char **argv) {
setlocale(LC_ALL, "C");
+ const bool use_old_ui_opt = argc == 2 && strcmp(argv[1], "use-old-ui") == 0;
+ const bool launched_by_daemon_opt = argc == 2 && strcmp(argv[1], "gsr-ui") == 0;
+ argc = 1;
+
if(geteuid() == 0) {
fprintf(stderr, "Error: don't run gpu-screen-recorder-gtk as the root user\n");
return 1;
}
dpy = XOpenDisplay(NULL);
+
+ config_empty = false;
+ config = read_config(config_empty);
+
+ if(use_old_ui_opt) {
+ system("flatpak-spawn --host -- systemctl disable --user gpu-screen-recorder-ui");
+ config.main_config.use_new_ui = false;
+ save_config(config);
+ }
+
+ if(config.main_config.use_new_ui)
+ startup_new_ui(launched_by_daemon_opt);
+
gsr_info_exit_status = get_gpu_screen_recorder_info(&gsr_info);
if(gsr_info_exit_status == GsrInfoExitStatus::OK) {
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ripcalc for openSUSE:Factory checked in at 2025-01-05 15:29:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ripcalc (Old)
and /work/SRC/openSUSE:Factory/.ripcalc.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ripcalc"
Sun Jan 5 15:29:19 2025 rev:2 rq:1234641 version:0.1.13
Changes:
--------
--- /work/SRC/openSUSE:Factory/ripcalc/ripcalc.changes 2024-08-02 17:27:40.262130058 +0200
+++ /work/SRC/openSUSE:Factory/.ripcalc.new.1881/ripcalc.changes 2025-01-05 15:29:30.145433822 +0100
@@ -1,0 +2,8 @@
+Thu Jan 2 20:08:16 UTC 2025 - Andreas Stieger <andreas.stieger(a)gmx.de>
+
+- Update to version 0.1.13
+ * don't require input to be one IP per line
+ * show subnets within network in format
+ * limit how much an encapsulating network can grow with --group
+
+-------------------------------------------------------------------
Old:
----
ripcalc-0.1.12.obscpio
New:
----
ripcalc-0.1.13.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ripcalc.spec ++++++
--- /var/tmp/diff_new_pack.3eVwlQ/_old 2025-01-05 15:29:31.045470841 +0100
+++ /var/tmp/diff_new_pack.3eVwlQ/_new 2025-01-05 15:29:31.045470841 +0100
@@ -1,7 +1,7 @@
#
# spec file for package ripcalc
#
-# Copyright (c) 2024 Andreas Stieger <Andreas.Stieger(a)gmx.de>
+# Copyright (c) 2025 Andreas Stieger <Andreas.Stieger(a)gmx.de>
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: ripcalc
-Version: 0.1.12
+Version: 0.1.13
Release: 0
Summary: Tool for network addresses
License: GPL-3.0-or-later
@@ -35,6 +35,9 @@
%prep
%autosetup -p1 -a1
+%if 0%{?suse_version} < 1600
+find Cargo.lock vendor/ -type f -name Cargo.lock -exec sed -Ei 's/^version = 4$/version = 3/g' {} \;
+%endif
%build
%{cargo_build}
++++++ _service ++++++
--- /var/tmp/diff_new_pack.3eVwlQ/_old 2025-01-05 15:29:31.081472322 +0100
+++ /var/tmp/diff_new_pack.3eVwlQ/_new 2025-01-05 15:29:31.085472486 +0100
@@ -5,7 +5,7 @@
<param name="changesgenerate">enable</param>
<param name="filename">ripcalc</param>
<param name="versionformat">@PARENT_TAG@</param>
- <param name="revision">v0.1.12</param>
+ <param name="revision">v0.1.13</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="versionrewrite-replacement">\1</param>
</service>
@@ -20,8 +20,5 @@
<param name="compression">zst</param>
<param name="update">true</param>
</service>
- <service name="cargo_audit" mode="manual">
- <param name="srcdir">projectname</param>
- </service>
</services>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.3eVwlQ/_old 2025-01-05 15:29:31.105473309 +0100
+++ /var/tmp/diff_new_pack.3eVwlQ/_new 2025-01-05 15:29:31.109473474 +0100
@@ -1,7 +1,8 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://gitlab.com/edneville/ripcalc.git</param>
- <param name="changesrevision">5aca7acaf7fc5e6d53eb737e620fe418cf76bfdb</param>
+ <param name="changesrevision">d1e29a5ea08ffcb525d423dcbe51e26436d5f851</param>
</service>
</servicedata>
+(No newline at EOF)
++++++ ripcalc-0.1.12.obscpio -> ripcalc-0.1.13.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ripcalc-0.1.12/Cargo.lock new/ripcalc-0.1.13/Cargo.lock
--- old/ripcalc-0.1.12/Cargo.lock 2024-07-11 22:35:02.000000000 +0200
+++ new/ripcalc-0.1.13/Cargo.lock 2025-01-01 19:06:50.000000000 +0100
@@ -116,7 +116,7 @@
[[package]]
name = "ripcalc"
-version = "0.1.12"
+version = "0.1.13"
dependencies = [
"csv",
"getopts",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ripcalc-0.1.12/Cargo.toml new/ripcalc-0.1.13/Cargo.toml
--- old/ripcalc-0.1.12/Cargo.toml 2024-07-11 22:35:02.000000000 +0200
+++ new/ripcalc-0.1.13/Cargo.toml 2025-01-01 19:06:50.000000000 +0100
@@ -1,7 +1,7 @@
[package]
name = "ripcalc"
description = "ripcalc, format and lookup IP addresses"
-version = "0.1.12"
+version = "0.1.13"
authors = ["ed neville <ed(a)s5h.net>"]
edition = "2018"
license = "GPL-3.0-or-later"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ripcalc-0.1.12/Makefile new/ripcalc-0.1.13/Makefile
--- old/ripcalc-0.1.12/Makefile 2024-07-11 22:35:02.000000000 +0200
+++ new/ripcalc-0.1.13/Makefile 2025-01-01 19:06:50.000000000 +0100
@@ -49,6 +49,11 @@
printf "127.0.0.1/8\n" | $(RELEASE) | grep "IP is: 127.0.0.1/8" | wc -l | tr -d '[:blank:]' | grep -Fx 1
printf " 127.0.0.1/8 \n " | $(RELEASE) | grep "IP is: 127.0.0.1/8" | wc -l | tr -d '[:blank:]' | grep -Fx 1
$(RELEASE) --base 10 -6 55835323703435061617372717077650323870 | grep "IP is: 2a01:7e00::f03c:92ff:fe35:b99e/64" | wc -l | tr -d '[:blank:]' | grep -Fx 1
+ printf '10.0.1.0 10.0.255.0' | $(RELEASE) -e --format cidr | grep "10.0.0.0/16" | wc -l | tr -d '[:blank:]' | grep -Fx 1
+ printf '10.0.1.0 10.0.255.0\n10.2.0.0 10.2.2.2\n10.3.0.0\n10.10.10.10\n' | $(RELEASE) --format cidr | wc -l | tr -d '[:blank:]' | grep -Fx 6
+ printf '2a0a:1100:1002::/48' | $(RELEASE) --networks 64 | tr -d '[:blank:]' | grep -Fx "Networks(64):65536"
+ printf '2a0a:1100:1002::/48' | $(RELEASE) --networks 64 --format '%D:%N' | grep -Fx '64:65536'
+ for i in 1 2 3 4; do for j in 1 2 3 4; do echo 192.$$i.$$j.1; done; done | $(RELEASE) --group 16 --format short --encapsulating | wc -l | tr -d '[:blank:]' | grep -Fx 4
install: all
command -v please && please install -m 0755 -s $(RELEASE) /usr/local/bin || sudo install -m 0755 -s $(RELEASE) /usr/local/bin
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ripcalc-0.1.12/README.md new/ripcalc-0.1.13/README.md
--- old/ripcalc-0.1.12/README.md 2024-07-11 22:35:02.000000000 +0200
+++ new/ripcalc-0.1.13/README.md 2025-01-01 19:06:50.000000000 +0100
@@ -11,6 +11,12 @@
&& please install -m 0755 -s target/release/ripcalc /usr/local/bin
```
+or
+
+```
+please snap install ripcalc
+```
+
# usage
Ripcalc allows networks to be provided by argument
@@ -85,7 +91,9 @@
| %r | Network reservation information (if available) |
| %d | Matching device interface by IP |
| %m | Matching media link interface by network |
-| %k | RBL-style format |
+| %k | RBL/reverse DNS-style format |
+| %D | Network size (--networks) |
+| %N | Number of subnets (--networks) |
| %% | % |
| \n | Line break |
| \t | Tab character |
@@ -188,6 +196,12 @@
please ip route add blackhole `ripcalc -e 192.168.56.10 192.168.57.1 192.168.44.47`
```
+Networks can be grouped, in a scenario where you have a list of unwanted traffic, you can turn this into a list of small networks to block, supposing you don't want to block anything that covers more than a /19:
+
+```
+cat bad_traffic | ripcalc --encapsulating --group 19 --format cidr
+```
+
# help
```
@@ -199,19 +213,22 @@
-c, --csv PATH csv reference file
-d, --divide CIDR divide network into chunks
--noexpand do not expand networks in list
- -e, --encapsulating
+ -e, --encapsulating
display encapsulating network from arguments or lookup
list
-f, --format STRING format output
'cidr' expands to %a/%c\n
'short' expands to %a\n
See manual for more options
+ --group CIDR maximum network group size for encapsulation
-h, --help display help
-i, --field FIELD csv field
-l, --list list all addresses in network
--outside display when extremities are outside network
--inside display when extremities are inside network
-m, --mask CIDR cidr mask
+ -n, --networks CIDR instead of hosts, display number of subnets of this
+ size
-r, --reverse (none, inputs, sources or both) v4 octets, v6 hex
-s, --file PATH lookup addresses from, - for stdin
-v, --version print version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ripcalc-0.1.12/changelog.md new/ripcalc-0.1.13/changelog.md
--- old/ripcalc-0.1.12/changelog.md 2024-07-11 22:35:02.000000000 +0200
+++ new/ripcalc-0.1.13/changelog.md 2025-01-01 19:06:50.000000000 +0100
@@ -1,3 +1,9 @@
+0.1.13
+
+ * don't require input to be one IP per line
+ * show subnets within network in format, suggested by andy(a)bitfolk.com
+ * limit how much an encapsulating network can grow with --group
+
0.1.12
* now builds on macos #1, thanks @sander_maijers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ripcalc-0.1.12/ripcalc.1 new/ripcalc-0.1.13/ripcalc.1
--- old/ripcalc-0.1.12/ripcalc.1 2024-07-11 22:35:02.000000000 +0200
+++ new/ripcalc-0.1.13/ripcalc.1 2025-01-01 19:06:50.000000000 +0100
@@ -15,7 +15,7 @@
. ftr VB CB
. ftr VBI CBI
.\}
-.TH "ripcalc" "1" "11 July 2024" "ripcalc 0.1.12" "User Manual"
+.TH "ripcalc" "1" "01 January 2025" "ripcalc 0.1.13" "User Manual"
.hy
.SH NAME
.PP
@@ -40,7 +40,7 @@
.PP
\f[B]ripcalc -s/--file [-] 127.0.0.1\f[R]
.PP
-\f[B]ripcalc -e/--encapsulating [-s/--file name]\f[R]
+\f[B]ripcalc -e/--encapsulating [-s/--file name] [--group CIDR]\f[R]
.PP
\f[B]ripcalc -s/--file name [--inside/--outside] 127.0.0.1\f[R]
.PP
@@ -48,6 +48,8 @@
.PP
\f[B]ripcalc -d/--divide [CIDR] 127.0.0.1/24\f[R]
.PP
+\f[B]ripcalc \[en]networks [CIDR] 127.0.0.1/24\f[R]
+.PP
\f[B]ripcalc -h/--help\f[R]
.SH DESCRIPTION
.PP
@@ -76,11 +78,16 @@
or both can be treated as back-to-front.
.PP
\f[B]ripcalc\f[R] can return a list of subnets when a network is
-provided along with the \f[B]divide\f[R] argument and a subnet CIDR
+provided along with the \f[V]--divide\f[R] argument and a subnet CIDR
mask.
.PP
When \f[V]--encapsulating\f[R] is used the containing network will be
-returned.
+returned, use with \f[V]--group\f[R] to limit the range that an
+encapsulating network can grow.
+.PP
+The number (\f[B]%D\f[R]) of subnets can be printed when using the
+\f[V]--group\f[R] argument with the \f[B]%N\f[R] formatters.
+The argument should be the CIDR mask, see below for example.
.SH CSV
.PP
Network matches can be returned from a \f[B]CSV\f[R].
@@ -233,7 +240,17 @@
T{
%k
T}@T{
-RBL-style format
+RBL/reverse DNS-style format
+T}
+T{
+%D
+T}@T{
+Network size (--networks)
+T}
+T{
+%N
+T}@T{
+Number of subnets (--networks)
T}
T{
%%
@@ -263,10 +280,64 @@
--format \[aq]%{name}\[aq]
\f[R]
.fi
-.SS inside/outside
+.SH inside/outside
.PP
When \f[V]--inside\f[R] or \f[V]--outside\f[R] are given addresses that
match \f[V]--file\f[R] are printed.
If no matches are found \f[V]ripcalc\f[R] will exit non-zero.
+.SH subnets
+.PP
+For large networks it can be useful to see the number of subnets, to see
+the number of /29 subnets within a /24 network, the command would look
+like this:
+.IP
+.nf
+\f[C]
+ripcalc --networks 29 192.168.230.0/24
+ IP is: 192.168.230.0/24
+ Broadcast is: 192.168.230.255
+ Network is: 192.168.230.0
+ Subnet is: 255.255.255.0
+ Wildcard is: 0.0.0.255
+ Networks (29): 32
+\f[R]
+.fi
+.PP
+Or for a IPv6 /48 network that you want to subnet into /64, you can see
+there are 65536 subnets:
+.IP
+.nf
+\f[C]
+ ripcalc --networks 64 2001:db8:1::/48
+ IP is: 2001:db8:1::/48
+ Expanded: 2001:0db8:0001:0000:0000:0000:0000:0000
+ Network is: 2001:0db8:0001:0000:0000:0000:0000:0000
+Last host address: 2001:0db8:0001:ffff:ffff:ffff:ffff:ffff
+ Subnet is: ffff:ffff:ffff:0000:0000:0000:0000:0000
+ Networks (64): 65536
+\f[R]
+.fi
+.SH encapsulating
+.PP
+Suppose a large flood of requests are from a network pattern, to
+preserve service you may want to block the whole network that
+encapsulates a list:
+.IP
+.nf
+\f[C]
+please ip route add blackhole \[ga]ripcalc -e 192.168.56.10 192.168.57.1 192.168.44.47\[ga]
+\f[R]
+.fi
+.PP
+Networks can be grouped, in a scenario where you have a list of unwanted
+traffic, you can turn this into a list of small networks to block,
+supposing you don\[cq]t want to block anything that covers more than a
+/19:
+.IP
+.nf
+\f[C]
+cat bad_traffic | ripcalc --encapsulating --group 19 --format cidr
+\f[R]
+.fi
.SH AUTHORS
Ed Neville (ed-ripcalc\[at]s5h.net)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ripcalc-0.1.12/ripcalc.md new/ripcalc-0.1.13/ripcalc.md
--- old/ripcalc-0.1.12/ripcalc.md 2024-07-11 22:35:02.000000000 +0200
+++ new/ripcalc-0.1.13/ripcalc.md 2025-01-01 19:06:50.000000000 +0100
@@ -2,9 +2,9 @@
title: ripcalc
section: 1
header: User Manual
-footer: ripcalc 0.1.12
+footer: ripcalc 0.1.13
author: Ed Neville (ed-ripcalc(a)s5h.net)
-date: 11 July 2024
+date: 01 January 2025
---
# NAME
@@ -31,7 +31,7 @@
**ripcalc -s/--file [-] 127.0.0.1**
-**ripcalc -e/--encapsulating [-s/--file name]**
+**ripcalc -e/--encapsulating [-s/--file name] [--group CIDR]**
**ripcalc -s/--file name [--inside/--outside] 127.0.0.1**
@@ -39,6 +39,8 @@
**ripcalc -d/--divide [CIDR] 127.0.0.1/24**
+**ripcalc --networks [CIDR] 127.0.0.1/24**
+
**ripcalc -h/--help**
@@ -56,9 +58,11 @@
When `--reverse` is used the `inputs`, `sources` or both can be treated as back-to-front.
-**ripcalc** can return a list of subnets when a network is provided along with the **divide** argument and a subnet CIDR mask.
+**ripcalc** can return a list of subnets when a network is provided along with the `--divide` argument and a subnet CIDR mask.
+
+When `--encapsulating` is used the containing network will be returned, use with `--group` to limit the range that an encapsulating network can grow.
-When `--encapsulating` is used the containing network will be returned.
+The number (**%D**) of subnets can be printed when using the `--group` argument with the **%N** formatters. The argument should be the CIDR mask, see below for example.
# CSV
@@ -117,7 +121,9 @@
| %r | Network reservation information (if available) |
| %d | Matching device interface by IP |
| %m | Matching media link interface by network |
-| %k | RBL-style format |
+| %k | RBL/reverse DNS-style format |
+| %D | Network size (--networks) |
+| %N | Number of subnets (--networks) |
| %% | % |
| \n | Line break |
| \t | Tab character |
@@ -128,8 +134,39 @@
--format '%{name}'
-## inside/outside
+# inside/outside
When `--inside` or `--outside` are given addresses that match `--file` are printed. If no matches are found `ripcalc` will exit non-zero.
+# subnets
+
+For large networks it can be useful to see the number of subnets, to see the number of /29 subnets within a /24 network, the command would look like this:
+
+ ripcalc --networks 29 192.168.230.0/24
+ IP is: 192.168.230.0/24
+ Broadcast is: 192.168.230.255
+ Network is: 192.168.230.0
+ Subnet is: 255.255.255.0
+ Wildcard is: 0.0.0.255
+ Networks (29): 32
+
+Or for a IPv6 /48 network that you want to subnet into /64, you can see there are 65536 subnets:
+
+ ripcalc --networks 64 2001:db8:1::/48
+ IP is: 2001:db8:1::/48
+ Expanded: 2001:0db8:0001:0000:0000:0000:0000:0000
+ Network is: 2001:0db8:0001:0000:0000:0000:0000:0000
+ Last host address: 2001:0db8:0001:ffff:ffff:ffff:ffff:ffff
+ Subnet is: ffff:ffff:ffff:0000:0000:0000:0000:0000
+ Networks (64): 65536
+
+# encapsulating
+
+Suppose a large flood of requests are from a network pattern, to preserve service you may want to block the whole network that encapsulates a list:
+
+ please ip route add blackhole `ripcalc -e 192.168.56.10 192.168.57.1 192.168.44.47`
+
+Networks can be grouped, in a scenario where you have a list of unwanted traffic, you can turn this into a list of small networks to block, supposing you don't want to block anything that covers more than a /19:
+
+ cat bad_traffic | ripcalc --encapsulating --group 19 --format cidr
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ripcalc-0.1.12/src/lib.rs new/ripcalc-0.1.13/src/lib.rs
--- old/ripcalc-0.1.12/src/lib.rs 2024-07-11 22:35:02.000000000 +0200
+++ new/ripcalc-0.1.13/src/lib.rs 2025-01-01 19:06:50.000000000 +0100
@@ -6,6 +6,7 @@
use nix::sys::stat::SFlag;
use std::collections::HashMap;
use std::fmt;
+use std::io::BufRead;
use std::net::Ipv4Addr;
use std::net::Ipv6Addr;
use std::net::ToSocketAddrs;
@@ -417,7 +418,7 @@
for key in networks.keys().skip(1) {
let mut key = key.clone();
match (&ip.address, &key.address) {
- (Addr::V4(_), Addr::V4(_)) => {
+ (Addr::V4(_), Addr::V4(_)) | (Addr::V6(_), Addr::V6(_)) => {
if key.cidr < ip.cidr {
ip.cidr = key.cidr;
}
@@ -431,19 +432,57 @@
}
ip = network(&ip);
}
- (Addr::V6(_), Addr::V6(_)) => {
- if key.cidr < ip.cidr {
- ip.cidr = key.cidr;
+ (_, _) => {
+ return None;
+ }
+ }
+ }
+
+ Some(ip)
+}
+
+pub fn smallest_group_network_limited(networks: &HashMap<Ip, bool>, cidr: u32) -> Option<Vec<Ip>> {
+ if networks.is_empty() {
+ return None;
+ }
+
+ let mut net_list: HashMap<Ip, Ip> = HashMap::new();
+
+ for key in networks.keys() {
+ let mut bucket_ip = key.clone();
+ bucket_ip.cidr = cidr;
+
+ let mut key_copy = key.clone();
+
+ // don't add a entry with a bigger network than cidr
+ if key_copy.cidr < cidr {
+ key_copy.cidr = cidr;
+ }
+
+ let bucket = network(&bucket_ip);
+
+ if !net_list.contains_key(&bucket) {
+ net_list.insert(bucket.clone(), key_copy.clone());
+ }
+
+ let ip = net_list.get_mut(&bucket).unwrap();
+
+ match (&ip.address, &key.address) {
+ (Addr::V4(_), Addr::V4(_)) | (Addr::V6(_), Addr::V6(_)) => {
+ // println!("ip.cidr {}, key_copy.cidr {}", ip.cidr, key_copy.cidr);
+ if key_copy.cidr < ip.cidr {
+ // println!("key less than ip: ip.cidr {}, key_copy.cidr {}", ip.cidr, key_copy.cidr);
+ ip.cidr = key_copy.cidr;
}
- key.cidr = ip.cidr;
- while network(&key) != network(&ip) {
+ key_copy.cidr = ip.cidr;
+ while network(&key_copy) != network(ip) && ip.cidr > cidr {
if ip.cidr == 0 {
return None;
}
ip.cidr -= 1;
- key.cidr = ip.cidr;
+ key_copy.cidr = ip.cidr;
}
- ip = network(&ip);
+ *ip = network(ip);
}
(_, _) => {
return None;
@@ -451,7 +490,7 @@
}
}
- Some(ip)
+ Some(net_list.values().cloned().collect())
}
impl fmt::Display for Ip {
@@ -1046,6 +1085,7 @@
ip: &Ip,
formatted: String,
rows: &Option<HashMap<Ip, NetRow>>,
+ subnet_size: Option<u32>,
) -> Option<String> {
let ip = &mut ip.clone();
let mut reformatted = formatted;
@@ -1200,6 +1240,20 @@
'%' => {
out_str.push('%');
}
+ 'D' => {
+ if let Some(s) = subnet_size {
+ out_str.push_str(&s.to_string());
+ } else {
+ out_str.push('D');
+ };
+ }
+ 'N' => {
+ if let Some(s) = subnet_size {
+ out_str.push_str(&subnets_in_network(s, ip).to_string());
+ } else {
+ out_str.push('N');
+ };
+ }
_ => {
out_str.push(k);
}
@@ -1265,3 +1319,46 @@
false
}
+
+pub fn find_ips<'a>(
+ reader: &'a mut Box<dyn BufRead>,
+ input_base: Option<i32>,
+ reverse: &'a Reverse,
+) -> impl 'a + std::iter::Iterator<Item = Vec<Ip>> {
+ std::iter::from_fn(move || {
+ if let Some(line) = reader.lines().next().into_iter().by_ref().next() {
+ let line: String = line.as_ref().unwrap().trim().to_string();
+ let mut v = vec![];
+
+ for part in line.split(' ') {
+ let p = part.trim();
+ if p.is_empty() {
+ continue;
+ }
+
+ let ip = match parse_address_mask(
+ p,
+ Some(32),
+ Some(128),
+ input_base,
+ matches!(reverse, Reverse::Both | Reverse::Input),
+ ) {
+ Some(x) => x,
+ None => {
+ eprintln!("Could not parse {}", p);
+ continue;
+ }
+ };
+
+ v.push(ip);
+ }
+ return Some(v);
+ }
+ None
+ })
+}
+
+pub fn subnets_in_network(networks: u32, ip: &Ip) -> u128 {
+ let base: u128 = 2;
+ base.pow(networks - ip.cidr)
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ripcalc-0.1.12/src/main.rs new/ripcalc-0.1.13/src/main.rs
--- old/ripcalc-0.1.12/src/main.rs 2024-07-11 22:35:02.000000000 +0200
+++ new/ripcalc-0.1.13/src/main.rs 2025-01-01 19:06:50.000000000 +0100
@@ -12,13 +12,46 @@
rows: &Option<HashMap<Ip, NetRow>>,
used: Option<&HashMap<Addr, bool>>,
) {
+ let mut networks: Option<u32> = None;
+
+ if matches.opt_present("networks") {
+ let nets = matches.opt_str("networks").unwrap().trim().parse().unwrap();
+
+ if nets < ip.cidr && !(matches.opt_present("encapsulating") && matches.opt_present("group"))
+ {
+ eprintln!("{} is bigger than the network mask {}", nets, ip.cidr);
+ std::process::exit(1);
+ }
+
+ match ip.address {
+ Addr::V4(_) => {
+ if nets > 32 {
+ eprintln!("{} is too big", nets);
+ std::process::exit(1);
+ }
+ }
+ Addr::V6(_) => {
+ if nets > 128 {
+ eprintln!("{} is too big", nets);
+ std::process::exit(1);
+ }
+ }
+ }
+ networks = Some(nets);
+ }
+
let mut formatted = if matches.opt_present("f") {
matches.opt_str("f").unwrap()
} else {
+ let mut network_size = "Network size: %t".to_string();
let width = 25;
+ if matches.opt_present("networks") {
+ network_size = format!("Networks ({}): %N", networks.as_ref().unwrap()).to_string();
+ }
match ip.address {
- Addr::V4(_) => format!("{ip:>width$}/{cidr}\n{broadcast:>width$}\n{network:>width$}\n{subnet:>width$}\n{wildcard:>width$}\n{network_size:>width$}\n", ip="IP is: %a", cidr="%c", broadcast="Broadcast is: %b", network="Network is: %n", subnet="Subnet is: %s", wildcard="Wildcard is: %w", network_size="Network size: %t", width=width),
- Addr::V6(_) => format!("{ip:>widthn$}/{cidr}\n{expanded:>width$}\n{network:>width$}\n{last_host_address:>width$}\n{subnet:>width$}\n{network_size:>widthn$}\n", ip="IP is: %a", cidr="%c", expanded="Expanded: %xa", network="Network is: %xn", last_host_address="Last host address: %xb", subnet="Subnet is: %xs", network_size="Network size: %t", width=width, widthn=width-1),
+
+ Addr::V4(_) => format!("{ip:>width$}/{cidr}\n{broadcast:>width$}\n{network:>width$}\n{subnet:>width$}\n{wildcard:>width$}\n{network_size:>width$}\n", ip="IP is: %a", cidr="%c", broadcast="Broadcast is: %b", network="Network is: %n", subnet="Subnet is: %s", wildcard="Wildcard is: %w", network_size=network_size, width=width),
+ Addr::V6(_) => format!("{ip:>widthn$}/{cidr}\n{expanded:>width$}\n{network:>width$}\n{last_host_address:>width$}\n{subnet:>width$}\n{network_size:>widthn$}\n", ip="IP is: %a", cidr="%c", expanded="Expanded: %xa", network="Network is: %xn", last_host_address="Last host address: %xb", subnet="Subnet is: %xs", network_size=network_size, width=width, widthn=width-1),
}
};
@@ -40,7 +73,7 @@
};
for ip_copy in addresses(ip, used, Some(divide)) {
- if let Some(m) = format_details(&ip_copy, formatted.to_string(), rows) {
+ if let Some(m) = format_details(&ip_copy, formatted.to_string(), rows, networks) {
print!("{}", m);
}
}
@@ -49,21 +82,21 @@
if matches.opt_present("list") {
if matches.opt_present("noexpand") {
- if let Some(m) = format_details(ip, formatted, rows) {
+ if let Some(m) = format_details(ip, formatted, rows, networks) {
print!("{}", m);
}
return;
}
for ip_copy in addresses(ip, used, None) {
- if let Some(m) = format_details(&ip_copy, formatted.to_string(), rows) {
+ if let Some(m) = format_details(&ip_copy, formatted.to_string(), rows, networks) {
print!("{}", m);
}
}
return;
}
- if let Some(m) = format_details(ip, formatted, rows) {
+ if let Some(m) = format_details(ip, formatted, rows, networks) {
print!("{}", m);
}
}
@@ -189,7 +222,7 @@
rows: &Option<HashMap<Ip, NetRow>>,
inside: Option<bool>,
) {
- let reader: Box<dyn BufRead> = if path == "-" {
+ let mut reader: Box<dyn BufRead> = if path == "-" {
Box::new(BufReader::new(std::io::stdin()))
} else {
let path = std::path::Path::new(&path);
@@ -203,24 +236,10 @@
Box::new(BufReader::new(File::open(path).unwrap()))
};
- let mut used: HashMap<Addr, bool> = HashMap::new();
if matches.opt_present("available") {
- for line in reader.lines() {
- let line: String = line.as_ref().unwrap().trim().to_string();
- let ip = match parse_address_mask(
- line.as_ref(),
- Some(32),
- Some(128),
- input_base,
- matches!(reverse, Reverse::Both | Reverse::Input),
- ) {
- Some(x) => x,
- None => {
- eprintln!("Could not parse {}", line);
- continue;
- }
- };
- for ip in addresses(&ip, None, None) {
+ let mut used: HashMap<Addr, bool> = HashMap::new();
+ for a in find_ips(&mut reader, input_base, reverse) {
+ for ip in a {
used.insert(ip.address, true);
}
}
@@ -233,31 +252,36 @@
if matches.opt_present("encapsulating") {
let mut used: HashMap<Ip, bool> = HashMap::new();
- for line in reader.lines() {
- let line: String = line.as_ref().unwrap().trim().to_string();
- let ip = match parse_address_mask(
- line.as_ref(),
- Some(32),
- Some(128),
- input_base,
- matches!(reverse, Reverse::Both | Reverse::Input),
- ) {
- Some(x) => x,
- None => {
- eprintln!("Could not parse {}", line);
- continue;
- }
- };
- used.insert(ip, true);
+ for a in find_ips(&mut reader, input_base, reverse) {
+ for i in a {
+ used.insert(i, true);
+ }
}
- match smallest_group_network(&used) {
- Some(x) => {
- print_details(&x, matches, rows, None);
+ if matches.opt_present("group") {
+ let network_size: u32 = matches.opt_str("group").unwrap().trim().parse().unwrap();
+
+ match smallest_group_network_limited(&used, network_size) {
+ Some(mut x) => {
+ x.sort_by(|a, b| a.partial_cmp(b).unwrap());
+ for y in x {
+ print_details(&y, matches, rows, None);
+ }
+ }
+ None => {
+ eprintln!("Could not find an encapsulating network, sorry");
+ std::process::exit(1);
+ }
}
- None => {
- eprintln!("Could not find an encapsulating network, sorry");
- std::process::exit(1);
+ } else {
+ match smallest_group_network(&used) {
+ Some(x) => {
+ print_details(&x, matches, rows, None);
+ }
+ None => {
+ eprintln!("Could not find an encapsulating network, sorry");
+ std::process::exit(1);
+ }
}
}
@@ -266,51 +290,41 @@
let mut found_match = false;
- for line in reader.lines() {
- let line: String = line.as_ref().unwrap().trim().to_string();
- let ip = parse_address_mask(
- &line,
- Some(32),
- Some(128),
- input_base,
- matches!(reverse, Reverse::Both | Reverse::Source),
- );
- if ip.is_none() {
- continue;
- }
+ for a in find_ips(&mut reader, input_base, reverse) {
+ for ip in a {
+ match inside {
+ Some(true) => {
+ let mut found = false;
+ for arg in ip_args {
+ if within(arg, &ip) {
+ found = true;
+ break;
+ }
+ }
- match inside {
- Some(true) => {
- let mut found = false;
- for arg in ip_args {
- if within(arg, ip.as_ref().unwrap()) {
- found = true;
- break;
+ if found {
+ found_match = true;
+ print_details(&ip, matches, rows, None);
}
}
+ Some(false) => {
+ let mut found = false;
- if found {
- found_match = true;
- print_details(&ip.unwrap(), matches, rows, None);
- }
- }
- Some(false) => {
- let mut found = false;
-
- for arg in ip_args {
- if within(arg, ip.as_ref().unwrap()) {
- found = true;
- break;
+ for arg in ip_args {
+ if within(arg, &ip) {
+ found = true;
+ break;
+ }
}
- }
- if !found {
- found_match = true;
- print_details(&ip.unwrap(), matches, rows, None);
+ if !found {
+ found_match = true;
+ print_details(&ip, matches, rows, None);
+ }
+ }
+ None => {
+ print_details(&ip, matches, rows, None);
}
- }
- None => {
- print_details(&ip.unwrap(), matches, rows, None);
}
}
}
@@ -363,6 +377,12 @@
);
opts.optopt("f", "format", "format output\n'cidr' expands to %a/%c\\n\n'short' expands to %a\\n\nSee manual for more options", "STRING");
+ opts.optopt(
+ "",
+ "group",
+ "maximum network group size for encapsulation",
+ "CIDR",
+ );
opts.optflag("h", "help", "display help");
opts.optopt("i", "field", "csv field", "FIELD");
@@ -374,6 +394,12 @@
);
opts.optflag("", "inside", "display when extremities are inside network");
opts.optopt("m", "mask", "cidr mask", "CIDR");
+ opts.optopt(
+ "n",
+ "networks",
+ "instead of hosts, display number of subnets of this size",
+ "CIDR",
+ );
opts.optopt(
"r",
@@ -416,6 +442,26 @@
inside = Some(false);
}
+ if matches.opt_present("group") {
+ let _: u32 = match matches.opt_str("group").unwrap().trim().parse() {
+ Ok(x) => x,
+ Err(x) => {
+ eprintln!("Cannot convert {} to number", x);
+ std::process::exit(1);
+ }
+ };
+ }
+
+ if matches.opt_present("networks") {
+ let _: u32 = match matches.opt_str("networks").unwrap().trim().parse() {
+ Ok(x) => x,
+ Err(x) => {
+ eprintln!("Cannot convert {} to number", x);
+ std::process::exit(1);
+ }
+ };
+ }
+
if matches.opt_present("reverse") {
match matches.opt_str("reverse").unwrap().as_str() {
"inputs" => {
@@ -556,13 +602,29 @@
}
if matches.opt_present("encapsulating") {
- match smallest_group_network(&used) {
- Some(x) => {
- print_details(&x, &matches, &rows, None);
+ if matches.opt_present("networks") {
+ let network_size: u32 = matches.opt_str("networks").unwrap().trim().parse().unwrap();
+
+ match smallest_group_network_limited(&used, network_size) {
+ Some(x) => {
+ for y in x {
+ print_details(&y, &matches, &rows, None);
+ }
+ }
+ None => {
+ eprintln!("Could not find an encapsulating network, sorry");
+ std::process::exit(1);
+ }
}
- None => {
- eprintln!("Could not find an encapsulating network, sorry");
- std::process::exit(1);
+ } else {
+ match smallest_group_network(&used) {
+ Some(x) => {
+ print_details(&x, &matches, &rows, None);
+ }
+ None => {
+ eprintln!("Could not find an encapsulating network, sorry");
+ std::process::exit(1);
+ }
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ripcalc-0.1.12/tests/funcs.rs new/ripcalc-0.1.13/tests/funcs.rs
--- old/ripcalc-0.1.12/tests/funcs.rs 2024-07-11 22:35:02.000000000 +0200
+++ new/ripcalc-0.1.13/tests/funcs.rs 2025-01-01 19:06:50.000000000 +0100
@@ -277,7 +277,7 @@
cidr: 30,
};
- let f = format_details(&net, "%a".to_string(), &None);
+ let f = format_details(&net, "%a".to_string(), &None, None);
assert_eq!(f, Some("192.168.0.0".to_string()));
}
@@ -291,6 +291,7 @@
},
"%".to_string(),
&None,
+ None,
);
assert_eq!(f, Some("%".to_string()));
@@ -302,6 +303,7 @@
},
"%%".to_string(),
&None,
+ None,
);
assert_eq!(f, Some("%".to_string()));
@@ -313,6 +315,7 @@
},
"%%%".to_string(),
&None,
+ None,
);
assert_eq!(f, Some("%%".to_string()));
@@ -324,6 +327,7 @@
},
"%%%%".to_string(),
&None,
+ None,
);
assert_eq!(f, Some("%%".to_string()));
@@ -336,7 +340,7 @@
cidr: 64,
};
- let f = format_details(&net, "select * from IP6 where (ip >= %ln and ip <= %lb) and active = 1;\nupdate IP6 set active = 0 where (ip >= %ln and ip <= %lb) and active = 1;".to_string(), &None);
+ let f = format_details(&net, "select * from IP6 where (ip >= %ln and ip <= %lb) and active = 1;\nupdate IP6 set active = 0 where (ip >= %ln and ip <= %lb) and active = 1;".to_string(), &None, None);
assert_eq!(f, Some("select * from IP6 where (ip >= 42540724579414763292693624807812497408 and ip <= 42540724579414763311140368881522049023) and active = 1;
update IP6 set active = 0 where (ip >= 42540724579414763292693624807812497408 and ip <= 42540724579414763311140368881522049023) and active = 1;".to_string()));
@@ -349,7 +353,7 @@
cidr: 64,
};
- let f = format_details(&net, "%%b".to_string(), &None);
+ let f = format_details(&net, "%%b".to_string(), &None, None);
assert_eq!(f, Some("%b".to_string()));
}
@@ -361,7 +365,7 @@
cidr: 64,
};
- let f = format_details(&net, "%lb".to_string(), &None);
+ let f = format_details(&net, "%lb".to_string(), &None, None);
assert_eq!(
f,
@@ -376,7 +380,7 @@
cidr: 64,
};
- let f = format_details(&net, "%lb\n\n\n%%".to_string(), &None);
+ let f = format_details(&net, "%lb\n\n\n%%".to_string(), &None, None);
assert_eq!(
f,
@@ -391,16 +395,16 @@
cidr: 64,
};
- let f = format_details(&net, "\n".to_string(), &None);
+ let f = format_details(&net, "\n".to_string(), &None, None);
assert_eq!(f, Some("\n".to_string()));
- let f = format_details(&net, "\\".to_string(), &None);
+ let f = format_details(&net, "\\".to_string(), &None, None);
assert_eq!(f, Some('\\'.to_string()));
- let f = format_details(&net, "\\i".to_string(), &None);
+ let f = format_details(&net, "\\i".to_string(), &None, None);
assert_eq!(f, Some("i".to_string()));
- let f = format_details(&net, "\\t".to_string(), &None);
+ let f = format_details(&net, "\\t".to_string(), &None, None);
assert_eq!(f, Some("\t".to_string()));
}
@@ -626,9 +630,9 @@
cidr: 30,
};
- let f = format_details(&net, "%La".to_string(), &None);
+ let f = format_details(&net, "%La".to_string(), &None, None);
assert_eq!(f, Some("-1819047474".to_string()));
- let f = format_details(&net, "%la".to_string(), &None);
+ let f = format_details(&net, "%la".to_string(), &None, None);
assert_eq!(f, Some("2475919822".to_string()));
let net = Ip {
@@ -636,9 +640,9 @@
cidr: 30,
};
- let f = format_details(&net, "%La".to_string(), &None);
+ let f = format_details(&net, "%La".to_string(), &None, None);
assert_eq!(f, Some("-5192296858534827628530496329154561".to_string()));
- let f = format_details(&net, "%la".to_string(), &None);
+ let f = format_details(&net, "%la".to_string(), &None, None);
assert_eq!(
f,
Some("340277174624079928635746076935439056895".to_string())
@@ -806,4 +810,148 @@
let v: Vec<Ip> = i.collect();
assert_eq!(v.len(), 65536);
}
+
+ #[test]
+ fn test_networks_sizing_v6() {
+ let net = Ip {
+ address: Addr::V6(Ipv6Addr::from_str("::1").unwrap()),
+ cidr: 48,
+ };
+
+ assert_eq!(subnets_in_network(64, &net), 65536);
+ assert_eq!(subnets_in_network(48, &net), 1);
+ assert_eq!(subnets_in_network(49, &net), 2);
+ }
+
+ #[test]
+ fn test_networks_sizing_v4() {
+ let net = Ip {
+ address: Addr::V4(Ipv4Addr::from_str("127.0.0.1").unwrap()),
+ cidr: 16,
+ };
+
+ assert_eq!(subnets_in_network(24, &net), 256);
+ assert_eq!(subnets_in_network(25, &net), 512);
+ assert_eq!(subnets_in_network(26, &net), 1024);
+ assert_eq!(subnets_in_network(27, &net), 2048);
+ assert_eq!(subnets_in_network(28, &net), 4096);
+ }
+
+ #[test]
+ fn test_smallest_network_limited() {
+ let empty: HashMap<Ip, bool> = HashMap::new();
+ assert_eq!(smallest_group_network_limited(&empty, 32), None);
+ }
+
+ #[test]
+ fn test_smallest_network_limited_22_24() {
+ let mut net_list: HashMap<Ip, bool> = HashMap::new();
+ for i in 0..4 {
+ for j in 0..4 {
+ net_list.insert(
+ Ip {
+ address: Addr::V4(
+ Ipv4Addr::from_str(&format!("192.168.{i}.{j}")).expect("bad ipv4"),
+ ),
+ cidr: 24,
+ },
+ true,
+ );
+ }
+ }
+
+ let mut resp = smallest_group_network_limited(&net_list, 22).unwrap();
+ resp.sort_by(|a, b| a.partial_cmp(b).unwrap());
+ assert_eq!(
+ resp,
+ [Ip {
+ address: Addr::V4(Ipv4Addr::from_str(&format!("192.168.0.0")).expect("bad ipv4")),
+ cidr: 22
+ }]
+ );
+ }
+
+ #[test]
+ fn test_smallest_network_limited_22_8() {
+ let mut net_list: HashMap<Ip, bool> = HashMap::new();
+ for i in 0..4 {
+ for j in 0..4 {
+ net_list.insert(
+ Ip {
+ address: Addr::V4(
+ Ipv4Addr::from_str(&format!("192.{i}.{j}.0")).expect("bad ipv4"),
+ ),
+ cidr: 8,
+ },
+ true,
+ );
+ }
+ }
+
+ let mut resp = smallest_group_network_limited(&net_list, 22).unwrap();
+ resp.sort_by(|a, b| a.partial_cmp(b).unwrap());
+ assert_eq!(
+ resp,
+ [
+ Ip {
+ address: Addr::V4(Ipv4Addr::from_str(&format!("192.0.0.0")).expect("bad ipv4")),
+ cidr: 22
+ },
+ Ip {
+ address: Addr::V4(Ipv4Addr::from_str(&format!("192.1.0.0")).expect("bad ipv4")),
+ cidr: 22
+ },
+ Ip {
+ address: Addr::V4(Ipv4Addr::from_str(&format!("192.2.0.0")).expect("bad ipv4")),
+ cidr: 22
+ },
+ Ip {
+ address: Addr::V4(Ipv4Addr::from_str(&format!("192.3.0.0")).expect("bad ipv4")),
+ cidr: 22
+ },
+ ]
+ );
+ }
+
+ #[test]
+ fn test_smallest_network_limited_24_8() {
+ let mut net_list: HashMap<Ip, bool> = HashMap::new();
+ for i in 0..4 {
+ for j in 0..4 {
+ net_list.insert(
+ Ip {
+ address: Addr::V4(
+ Ipv4Addr::from_str(&format!("192.0.{i}.{j}")).expect("bad ipv4"),
+ ),
+ cidr: 8,
+ },
+ true,
+ );
+ }
+ }
+
+ let mut resp = smallest_group_network_limited(&net_list, 24).unwrap();
+ resp.sort_by(|a, b| a.partial_cmp(b).unwrap());
+ assert_eq!(
+ resp,
+ [
+ Ip {
+ address: Addr::V4(Ipv4Addr::from_str(&format!("192.0.0.0")).expect("bad ipv4")),
+ cidr: 24
+ },
+ Ip {
+ address: Addr::V4(Ipv4Addr::from_str(&format!("192.0.1.0")).expect("bad ipv4")),
+ cidr: 24
+ },
+ Ip {
+ address: Addr::V4(Ipv4Addr::from_str(&format!("192.0.2.0")).expect("bad ipv4")),
+ cidr: 24
+ },
+ Ip {
+ address: Addr::V4(Ipv4Addr::from_str(&format!("192.0.3.0")).expect("bad ipv4")),
+ cidr: 24
+ },
+ ]
+ );
+ }
}
++++++ ripcalc.obsinfo ++++++
--- /var/tmp/diff_new_pack.3eVwlQ/_old 2025-01-05 15:29:31.229478410 +0100
+++ /var/tmp/diff_new_pack.3eVwlQ/_new 2025-01-05 15:29:31.233478574 +0100
@@ -1,5 +1,5 @@
name: ripcalc
-version: 0.1.12
-mtime: 1720730102
-commit: 5aca7acaf7fc5e6d53eb737e620fe418cf76bfdb
+version: 0.1.13
+mtime: 1735754810
+commit: d1e29a5ea08ffcb525d423dcbe51e26436d5f851
++++++ vendor.tar.zst ++++++
++++ 995733 lines of diff (skipped)
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ghc-time-compat for openSUSE:Factory checked in at 2025-01-05 15:29:18
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-time-compat (Old)
and /work/SRC/openSUSE:Factory/.ghc-time-compat.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-time-compat"
Sun Jan 5 15:29:18 2025 rev:19 rq:1234638 version:1.9.8
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-time-compat/ghc-time-compat.changes 2024-07-22 17:17:53.673016706 +0200
+++ /work/SRC/openSUSE:Factory/.ghc-time-compat.new.1881/ghc-time-compat.changes 2025-01-05 15:29:29.129392030 +0100
@@ -1,0 +2,7 @@
+Thu Dec 26 13:31:38 UTC 2024 - Peter Simons <psimons(a)suse.com>
+
+- Update time-compat to version 1.9.8.
+ Upstream has not updated the file "CHANGELOG.md" since the last
+ release.
+
+-------------------------------------------------------------------
Old:
----
time-compat-1.9.7.tar.gz
time-compat.cabal
New:
----
time-compat-1.9.8.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-time-compat.spec ++++++
--- /var/tmp/diff_new_pack.I301fW/_old 2025-01-05 15:29:29.773418520 +0100
+++ /var/tmp/diff_new_pack.I301fW/_new 2025-01-05 15:29:29.777418684 +0100
@@ -20,13 +20,12 @@
%global pkgver %{pkg_name}-%{version}
%bcond_with tests
Name: ghc-%{pkg_name}
-Version: 1.9.7
+Version: 1.9.8
Release: 0
Summary: Compatibility package for time
License: BSD-3-Clause
URL: https://hackage.haskell.org/package/%{pkg_name}
Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{ve…
-Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/2.cabal…
BuildRequires: ghc-Cabal-devel
BuildRequires: ghc-base-devel
BuildRequires: ghc-base-orphans-devel
@@ -37,6 +36,8 @@
BuildRequires: ghc-hashable-devel
BuildRequires: ghc-hashable-prof
BuildRequires: ghc-rpm-macros
+BuildRequires: ghc-template-haskell-devel
+BuildRequires: ghc-template-haskell-prof
BuildRequires: ghc-time-devel
BuildRequires: ghc-time-prof
ExcludeArch: %{ix86}
@@ -45,6 +46,8 @@
BuildRequires: ghc-HUnit-prof
BuildRequires: ghc-QuickCheck-devel
BuildRequires: ghc-QuickCheck-prof
+BuildRequires: ghc-random-devel
+BuildRequires: ghc-random-prof
BuildRequires: ghc-tagged-devel
BuildRequires: ghc-tagged-prof
BuildRequires: ghc-tasty-devel
@@ -94,7 +97,6 @@
%prep
%autosetup -n %{pkg_name}-%{version}
-cp -p %{SOURCE1} %{pkg_name}.cabal
%build
%ghc_lib_build
++++++ time-compat-1.9.7.tar.gz -> time-compat-1.9.8.tar.gz ++++++
++++ 6007 lines of diff (skipped)
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ghc-scientific for openSUSE:Factory checked in at 2025-01-05 15:29:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-scientific (Old)
and /work/SRC/openSUSE:Factory/.ghc-scientific.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-scientific"
Sun Jan 5 15:29:17 2025 rev:34 rq:1234637 version:0.3.8.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-scientific/ghc-scientific.changes 2024-07-22 17:17:35.928308012 +0200
+++ /work/SRC/openSUSE:Factory/.ghc-scientific.new.1881/ghc-scientific.changes 2025-01-05 15:29:28.237355340 +0100
@@ -1,0 +2,6 @@
+Thu Dec 26 13:50:23 UTC 2024 - Peter Simons <psimons(a)suse.com>
+
+- Update scientific to version 0.3.8.0 revision 2.
+ Upstream has revised the Cabal build instructions on Hackage.
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-scientific.spec ++++++
--- /var/tmp/diff_new_pack.mwbP1B/_old 2025-01-05 15:29:28.869381336 +0100
+++ /var/tmp/diff_new_pack.mwbP1B/_new 2025-01-05 15:29:28.873381500 +0100
@@ -26,7 +26,7 @@
License: BSD-3-Clause
URL: https://hackage.haskell.org/package/%{pkg_name}
Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{ve…
-Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/1.cabal…
+Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/2.cabal…
BuildRequires: ghc-Cabal-devel
BuildRequires: ghc-base-devel
BuildRequires: ghc-base-prof
++++++ scientific.cabal ++++++
--- /var/tmp/diff_new_pack.mwbP1B/_old 2025-01-05 15:29:28.921383474 +0100
+++ /var/tmp/diff_new_pack.mwbP1B/_new 2025-01-05 15:29:28.925383639 +0100
@@ -1,6 +1,6 @@
name: scientific
version: 0.3.8.0
-x-revision: 1
+x-revision: 2
synopsis: Numbers represented using scientific notation
description:
"Data.Scientific" provides the number type 'Scientific'. Scientific numbers are
@@ -50,13 +50,14 @@
|| ==9.0.2
|| ==9.2.8
|| ==9.4.8
- || ==9.6.5
- || ==9.8.2
+ || ==9.6.6
+ || ==9.8.4
|| ==9.10.1
+ || ==9.12.1
source-repository head
type: git
- location: git://github.com/basvandijk/scientific.git
+ location: https://github.com/basvandijk/scientific.git
flag integer-simple
description: Use the integer-simple package instead of integer-gmp
@@ -79,7 +80,7 @@
ghc-options: -Wall
build-depends:
- base >=4.5 && <4.21
+ base >=4.5 && <4.22
, binary >=0.8.6.0 && <0.9
, bytestring >=0.10.8.2 && <0.13
, containers >=0.6.0.1 && <0.8
@@ -87,7 +88,7 @@
, hashable >=1.4.4.0 && <1.6
, integer-logarithms >=1.0.3.1 && <1.1
, primitive >=0.9.0.0 && <0.10
- , template-haskell >=2.14.0.0 && <2.23
+ , template-haskell >=2.14.0.0 && <2.24
, text >=1.2.3.0 && <1.3 || >=2.0 && <2.2
if impl(ghc >=9.0)
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ghc-skylighting-core for openSUSE:Factory checked in at 2025-01-05 15:29:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-skylighting-core (Old)
and /work/SRC/openSUSE:Factory/.ghc-skylighting-core.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-skylighting-core"
Sun Jan 5 15:29:16 2025 rev:43 rq:1233974 version:0.14.5
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-skylighting-core/ghc-skylighting-core.changes 2024-12-20 23:11:47.619374662 +0100
+++ /work/SRC/openSUSE:Factory/.ghc-skylighting-core.new.1881/ghc-skylighting-core.changes 2025-01-05 15:29:27.249314700 +0100
@@ -1,0 +2,13 @@
+Mon Dec 23 06:56:27 UTC 2024 - Peter Simons <psimons(a)suse.com>
+
+- Update skylighting-core to version 0.14.5.
+ ## 0.14.5
+
+ * Update xml syntax definitions for bash, cmake, commonlisp, isocpp,
+ javascript-react, julia, latex, lua, markdown, modelines, nix, orgmode,
+ php, python, rhtml, ruby, swift, xml, yaml, zig, zsh. Add odin (required
+ by orgmode).
+
+ * Update JSON syntax definition from upstream. (#203)
+
+-------------------------------------------------------------------
Old:
----
skylighting-core-0.14.4.tar.gz
New:
----
skylighting-core-0.14.5.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-skylighting-core.spec ++++++
--- /var/tmp/diff_new_pack.xbwoxx/_old 2025-01-05 15:29:27.881340696 +0100
+++ /var/tmp/diff_new_pack.xbwoxx/_new 2025-01-05 15:29:27.885340861 +0100
@@ -20,7 +20,7 @@
%global pkgver %{pkg_name}-%{version}
%bcond_with tests
Name: ghc-%{pkg_name}
-Version: 0.14.4
+Version: 0.14.5
Release: 0
Summary: Syntax highlighting library
License: BSD-3-Clause
++++++ skylighting-core-0.14.4.tar.gz -> skylighting-core-0.14.5.tar.gz ++++++
++++ 6005 lines of diff (skipped)
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ghc-pandoc-lua-engine for openSUSE:Factory checked in at 2025-01-05 15:29:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-pandoc-lua-engine (Old)
and /work/SRC/openSUSE:Factory/.ghc-pandoc-lua-engine.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-pandoc-lua-engine"
Sun Jan 5 15:29:14 2025 rev:12 rq:1233972 version:0.4.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-pandoc-lua-engine/ghc-pandoc-lua-engine.changes 2024-12-20 23:11:30.094652131 +0100
+++ /work/SRC/openSUSE:Factory/.ghc-pandoc-lua-engine.new.1881/ghc-pandoc-lua-engine.changes 2025-01-05 15:29:24.197189162 +0100
@@ -1,0 +2,6 @@
+Mon Dec 23 19:46:55 UTC 2024 - Peter Simons <psimons(a)suse.com>
+
+- Update pandoc-lua-engine to version 0.4.1.
+ Upstream does not provide a change log file.
+
+-------------------------------------------------------------------
Old:
----
pandoc-lua-engine-0.4.tar.gz
New:
----
pandoc-lua-engine-0.4.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-pandoc-lua-engine.spec ++++++
--- /var/tmp/diff_new_pack.bbqxtE/_old 2025-01-05 15:29:25.165228979 +0100
+++ /var/tmp/diff_new_pack.bbqxtE/_new 2025-01-05 15:29:25.165228979 +0100
@@ -20,7 +20,7 @@
%global pkgver %{pkg_name}-%{version}
%bcond_with tests
Name: ghc-%{pkg_name}
-Version: 0.4
+Version: 0.4.1
Release: 0
Summary: Lua engine to power custom pandoc conversions
License: GPL-2.0-or-later
++++++ pandoc-lua-engine-0.4.tar.gz -> pandoc-lua-engine-0.4.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-lua-engine-0.4/pandoc-lua-engine.cabal new/pandoc-lua-engine-0.4.1/pandoc-lua-engine.cabal
--- old/pandoc-lua-engine-0.4/pandoc-lua-engine.cabal 2001-09-09 03:46:40.000000000 +0200
+++ new/pandoc-lua-engine-0.4.1/pandoc-lua-engine.cabal 2001-09-09 03:46:40.000000000 +0200
@@ -1,6 +1,6 @@
cabal-version: 2.4
name: pandoc-lua-engine
-version: 0.4
+version: 0.4.1
build-type: Simple
license: GPL-2.0-or-later
license-file: COPYING.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-lua-engine-0.4/src/Text/Pandoc/Lua/Module/Pandoc.hs new/pandoc-lua-engine-0.4.1/src/Text/Pandoc/Lua/Module/Pandoc.hs
--- old/pandoc-lua-engine-0.4/src/Text/Pandoc/Lua/Module/Pandoc.hs 2001-09-09 03:46:40.000000000 +0200
+++ new/pandoc-lua-engine-0.4.1/src/Text/Pandoc/Lua/Module/Pandoc.hs 2001-09-09 03:46:40.000000000 +0200
@@ -146,6 +146,7 @@
otherConstructors :: [DocumentedFunction PandocError]
otherConstructors =
[ mkAttr
+ , mkCaption
, mkCell
, mkAttributeList
, mkCitation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-lua-engine-0.4/src/Text/Pandoc/Lua/Module/Utils.hs new/pandoc-lua-engine-0.4.1/src/Text/Pandoc/Lua/Module/Utils.hs
--- old/pandoc-lua-engine-0.4/src/Text/Pandoc/Lua/Module/Utils.hs 2001-09-09 03:46:40.000000000 +0200
+++ new/pandoc-lua-engine-0.4.1/src/Text/Pandoc/Lua/Module/Utils.hs 2001-09-09 03:46:40.000000000 +0200
@@ -316,7 +316,11 @@
[ (fmap Shared.stringify . peekPandoc)
, (fmap Shared.stringify . peekInline)
, (fmap Shared.stringify . peekBlock)
+ , (fmap Shared.stringify . peekCaption)
+ , (fmap Shared.stringify . peekCell)
, (fmap Shared.stringify . peekCitation)
+ , (fmap Shared.stringify . peekTableHead)
+ , (fmap Shared.stringify . peekTableFoot)
, (fmap stringifyMetaValue . peekMetaValue)
, (fmap (const "") . peekAttr)
, (fmap (const "") . peekListAttributes)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-lua-engine-0.4/test/lua/module/pandoc-utils.lua new/pandoc-lua-engine-0.4.1/test/lua/module/pandoc-utils.lua
--- old/pandoc-lua-engine-0.4/test/lua/module/pandoc-utils.lua 2001-09-09 03:46:40.000000000 +0200
+++ new/pandoc-lua-engine-0.4.1/test/lua/module/pandoc-utils.lua 2001-09-09 03:46:40.000000000 +0200
@@ -223,6 +223,22 @@
local inlines = pandoc.Inlines{pandoc.Str 'a', pandoc.Subscript('b')}
assert.are_equal('ab', utils.stringify(inlines))
end),
+ test('Caption', function ()
+ local capt = pandoc.Caption(pandoc.Para{pandoc.Str 'a', pandoc.Emph('b')})
+ assert.are_equal('ab', utils.stringify(capt))
+ end),
+ test('Cell', function ()
+ local cell = pandoc.Cell(pandoc.Para{pandoc.Str 'a', pandoc.Emph('b')})
+ assert.are_equal('ab', utils.stringify(cell))
+ end),
+ test('TableFoot', function ()
+ local tf = pandoc.TableFoot{pandoc.Row{pandoc.Cell{pandoc.Plain "x y"}}}
+ assert.are_equal('x y', utils.stringify(tf))
+ end),
+ test('TableHead', function ()
+ local th = pandoc.TableHead{pandoc.Row{pandoc.Cell{pandoc.Plain "head1"}}}
+ assert.are_equal('head1', utils.stringify(th))
+ end),
test('Meta', function ()
local meta = pandoc.Meta{
a = pandoc.Inlines 'funny and ',
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ghc-colourista for openSUSE:Factory checked in at 2025-01-05 15:29:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-colourista (Old)
and /work/SRC/openSUSE:Factory/.ghc-colourista.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-colourista"
Sun Jan 5 15:29:12 2025 rev:6 rq:1233970 version:0.1.0.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-colourista/ghc-colourista.changes 2024-05-21 18:35:13.603722036 +0200
+++ /work/SRC/openSUSE:Factory/.ghc-colourista.new.1881/ghc-colourista.changes 2025-01-05 15:29:21.921095542 +0100
@@ -1,0 +2,6 @@
+Mon Dec 23 15:34:20 UTC 2024 - Peter Simons <psimons(a)suse.com>
+
+- Update colourista to version 0.1.0.2 revision 6.
+ Upstream has revised the Cabal build instructions on Hackage.
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-colourista.spec ++++++
--- /var/tmp/diff_new_pack.10UhcZ/_old 2025-01-05 15:29:23.661167114 +0100
+++ /var/tmp/diff_new_pack.10UhcZ/_new 2025-01-05 15:29:23.665167279 +0100
@@ -26,7 +26,7 @@
License: MPL-2.0
URL: https://hackage.haskell.org/package/%{pkg_name}
Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{ve…
-Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/5.cabal…
+Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/6.cabal…
BuildRequires: ghc-Cabal-devel
BuildRequires: ghc-ansi-terminal-devel
BuildRequires: ghc-ansi-terminal-prof
++++++ colourista.cabal ++++++
--- /var/tmp/diff_new_pack.10UhcZ/_old 2025-01-05 15:29:23.701168760 +0100
+++ /var/tmp/diff_new_pack.10UhcZ/_new 2025-01-05 15:29:23.705168924 +0100
@@ -1,7 +1,7 @@
cabal-version: 2.4
name: colourista
version: 0.1.0.2
-x-revision: 5
+x-revision: 6
synopsis: Convenient interface for printing colourful messages
description: Convenient interface for printing colourful messages based on the @ansi-terminal@ library.
homepage: https://github.com/kowainik/colourista
@@ -32,7 +32,7 @@
location: https://github.com/kowainik/colourista.git
common common-options
- build-depends: base >= 4.10.1.0 && < 4.21
+ build-depends: base >= 4.10.1.0 && < 4.22
ghc-options: -Wall
-Wcompat
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ghc-auto-update for openSUSE:Factory checked in at 2025-01-05 15:29:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-auto-update (Old)
and /work/SRC/openSUSE:Factory/.ghc-auto-update.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-auto-update"
Sun Jan 5 15:29:11 2025 rev:22 rq:1233969 version:0.2.6
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-auto-update/ghc-auto-update.changes 2024-12-26 12:24:09.627171627 +0100
+++ /work/SRC/openSUSE:Factory/.ghc-auto-update.new.1881/ghc-auto-update.changes 2025-01-05 15:29:20.957055890 +0100
@@ -1,0 +2,9 @@
+Mon Dec 23 01:14:37 UTC 2024 - Peter Simons <psimons(a)suse.com>
+
+- Update auto-update to version 0.2.6.
+ ## 0.2.6
+
+ * Using the thread version of AutoUpdate for non-threaded RTS.
+ [#1020](https://github.com/yesodweb/wai/pull/1020)
+
+-------------------------------------------------------------------
Old:
----
auto-update-0.2.5.tar.gz
New:
----
auto-update-0.2.6.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-auto-update.spec ++++++
--- /var/tmp/diff_new_pack.DG7Cbu/_old 2025-01-05 15:29:21.541079912 +0100
+++ /var/tmp/diff_new_pack.DG7Cbu/_new 2025-01-05 15:29:21.541079912 +0100
@@ -20,7 +20,7 @@
%global pkgver %{pkg_name}-%{version}
%bcond_with tests
Name: ghc-%{pkg_name}
-Version: 0.2.5
+Version: 0.2.6
Release: 0
Summary: Efficiently run periodic, on-demand actions
License: MIT
++++++ auto-update-0.2.5.tar.gz -> auto-update-0.2.6.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/auto-update-0.2.5/ChangeLog.md new/auto-update-0.2.6/ChangeLog.md
--- old/auto-update-0.2.5/ChangeLog.md 2001-09-09 03:46:40.000000000 +0200
+++ new/auto-update-0.2.6/ChangeLog.md 2001-09-09 03:46:40.000000000 +0200
@@ -1,5 +1,10 @@
# ChangeLog for auto-update
+## 0.2.6
+
+* Using the thread version of AutoUpdate for non-threaded RTS.
+ [#1020](https://github.com/yesodweb/wai/pull/1020)
+
## 0.2.5
* Thread less autoupdate
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/auto-update-0.2.5/Control/AutoUpdate.hs new/auto-update-0.2.6/Control/AutoUpdate.hs
--- old/auto-update-0.2.5/Control/AutoUpdate.hs 2001-09-09 03:46:40.000000000 +0200
+++ new/auto-update-0.2.6/Control/AutoUpdate.hs 2001-09-09 03:46:40.000000000 +0200
@@ -45,9 +45,26 @@
)
where
+import Control.AutoUpdate.Types
#ifdef mingw32_HOST_OS
import Control.AutoUpdate.Thread
#else
-import Control.AutoUpdate.Event
+import qualified Control.AutoUpdate.Event as Event
+import qualified Control.AutoUpdate.Thread as Thread
+
+import GHC.Event
+
+mkAutoUpdate :: UpdateSettings a -> IO (IO a)
+mkAutoUpdate settings = do
+ mmgr <- getSystemEventManager
+ case mmgr of
+ Nothing -> Thread.mkAutoUpdate settings
+ Just _m -> Event.mkAutoUpdate settings
+
+mkAutoUpdateWithModify :: UpdateSettings a -> (a -> IO a) -> IO (IO a)
+mkAutoUpdateWithModify settings f = do
+ mmgr <- getSystemEventManager
+ case mmgr of
+ Nothing -> Thread.mkAutoUpdateWithModify settings f
+ Just _m -> Event.mkAutoUpdateWithModify settings f
#endif
-import Control.AutoUpdate.Types
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/auto-update-0.2.5/auto-update.cabal new/auto-update-0.2.6/auto-update.cabal
--- old/auto-update-0.2.5/auto-update.cabal 2001-09-09 03:46:40.000000000 +0200
+++ new/auto-update-0.2.6/auto-update.cabal 2001-09-09 03:46:40.000000000 +0200
@@ -1,5 +1,5 @@
name: auto-update
-version: 0.2.5
+version: 0.2.6
synopsis: Efficiently run periodic, on-demand actions
description: API docs and the README are available at <http://www.stackage.org/package/auto-update>.
homepage: https://github.com/yesodweb/wai
@@ -21,9 +21,8 @@
Control.Reaper
Control.Reaper.Internal
other-modules: Control.AutoUpdate.Types
- if os(windows)
- other-modules: Control.AutoUpdate.Thread
- else
+ Control.AutoUpdate.Thread
+ if !os(windows)
exposed-modules: Control.AutoUpdate.Internal
other-modules: Control.AutoUpdate.Event
build-depends: base >= 4.12 && < 5,
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package wezterm for openSUSE:Factory checked in at 2025-01-05 15:29:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/wezterm (Old)
and /work/SRC/openSUSE:Factory/.wezterm.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "wezterm"
Sun Jan 5 15:29:07 2025 rev:38 rq:1234640 version:20240203.110809.5046fc22+git421
Changes:
--------
--- /work/SRC/openSUSE:Factory/wezterm/wezterm.changes 2024-11-08 12:05:27.628694217 +0100
+++ /work/SRC/openSUSE:Factory/.wezterm.new.1881/wezterm.changes 2025-01-05 15:29:18.584958322 +0100
@@ -1,0 +2,21 @@
+Thu Jan 2 22:55:13 UTC 2025 - Soc Virnyl Estela <uncomfyhalomacro(a)opensuse.org>
+
+- Update to version 20240203.110809.5046fc22+git421:
+ * deps: libpng -> 1.6.44
+ * deps: update to zlib 1.3.1
+ * wezterm-ssh: update pty version
+ * docs: changelog for serial bits
+ * pty: bump semver because serial2 changes public API
+ * Use serial2 crate instead of serial (#6411)
+ * chore: remove redundant words in comment
+ * fix some warnings with rust 1.83
+ * wayland: reimplement maximize and restore
+ * Disable libpng VSX_OPT flag for PowerPC 64
+ * cargo update
+ * docs: changelog for #6186
+ * Region scrolling tests and a fix
+ * Region scrolling tests
+ * fix warning
+ * Fixed minor typo in the example from `get_default_colors.md
+
+-------------------------------------------------------------------
Old:
----
wezterm-20240203.110809.5046fc22+git404.tar.zst
New:
----
wezterm-20240203.110809.5046fc22+git421.tar.zst
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ wezterm.spec ++++++
--- /var/tmp/diff_new_pack.BgDPGS/_old 2025-01-05 15:29:20.673044208 +0100
+++ /var/tmp/diff_new_pack.BgDPGS/_new 2025-01-05 15:29:20.673044208 +0100
@@ -1,7 +1,7 @@
#
# spec file for package wezterm
#
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -20,7 +20,7 @@
# %%global _dashed_version 20230712-072601-f4abf8fd
Name: wezterm
-Version: 20240203.110809.5046fc22+git404
+Version: 20240203.110809.5046fc22+git421
Release: 0
Summary: GPU-accelerated cross-platform terminal emulator and multiplexer
URL: https://github.com/wez/wezterm
++++++ _service ++++++
--- /var/tmp/diff_new_pack.BgDPGS/_old 2025-01-05 15:29:20.713045853 +0100
+++ /var/tmp/diff_new_pack.BgDPGS/_new 2025-01-05 15:29:20.713045853 +0100
@@ -4,7 +4,7 @@
<param name="versionformat">@PARENT_TAG@+git@TAG_OFFSET@</param>
<!-- param name="versionformat">@PARENT_TAG@</param -->
<param name="scm">git</param>
- <param name="revision">51c794ac500a2033b9dc570c71810518bfa667a9</param>
+ <param name="revision">be54403e4d297ccc2fb4c7b212e2a83b13a89948</param>
<param name="versionrewrite-pattern">(\d+)-(\d+)-(\w+)</param>
<param name="versionrewrite-replacement">\1.\2.\3</param>
<param name="changesgenerate">enable</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.BgDPGS/_old 2025-01-05 15:29:20.733046676 +0100
+++ /var/tmp/diff_new_pack.BgDPGS/_new 2025-01-05 15:29:20.737046841 +0100
@@ -3,6 +3,6 @@
<param name="url">https://github.com/wez/wezterm.git</param>
<param name="changesrevision">69ae847273aa2b0a64bdb07cf19d3f6fbaaa6b71</param></service><service name="tar_scm">
<param name="url">https://github.com/wez/wezterm</param>
- <param name="changesrevision">51c794ac500a2033b9dc570c71810518bfa667a9</param></service></servicedata>
+ <param name="changesrevision">be54403e4d297ccc2fb4c7b212e2a83b13a89948</param></service></servicedata>
(No newline at EOF)
++++++ vendor.tar.zst ++++++
/work/SRC/openSUSE:Factory/wezterm/vendor.tar.zst /work/SRC/openSUSE:Factory/.wezterm.new.1881/vendor.tar.zst differ: char 7, line 1
++++++ wezterm-20240203.110809.5046fc22+git404.tar.zst -> wezterm-20240203.110809.5046fc22+git421.tar.zst ++++++
/work/SRC/openSUSE:Factory/wezterm/wezterm-20240203.110809.5046fc22+git404.tar.zst /work/SRC/openSUSE:Factory/.wezterm.new.1881/wezterm-20240203.110809.5046fc22+git421.tar.zst differ: char 7, line 1
++++++ wezterm.obsinfo ++++++
--- /var/tmp/diff_new_pack.BgDPGS/_old 2025-01-05 15:29:20.793049144 +0100
+++ /var/tmp/diff_new_pack.BgDPGS/_new 2025-01-05 15:29:20.797049308 +0100
@@ -1,5 +1,5 @@
name: wezterm
-version: 20240203.110809.5046fc22+git404
-mtime: 1730734444
-commit: 51c794ac500a2033b9dc570c71810518bfa667a9
+version: 20240203.110809.5046fc22+git421
+mtime: 1735830509
+commit: be54403e4d297ccc2fb4c7b212e2a83b13a89948
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package agama-web-ui for openSUSE:Factory checked in at 2025-01-05 15:29:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/agama-web-ui (Old)
and /work/SRC/openSUSE:Factory/.agama-web-ui.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "agama-web-ui"
Sun Jan 5 15:29:00 2025 rev:6 rq:1234628 version:0
Changes:
--------
--- /work/SRC/openSUSE:Factory/agama-web-ui/agama-web-ui.changes 2024-11-25 23:21:35.242891314 +0100
+++ /work/SRC/openSUSE:Factory/.agama-web-ui.new.1881/agama-web-ui.changes 2025-01-05 15:29:14.052771908 +0100
@@ -1,0 +2,50 @@
+Fri Dec 20 12:53:41 UTC 2024 - David Diaz <dgonzalez(a)suse.com>
+
+- Fix netmask handling to avoid a silent connection form error
+ (gh#agama-project/agama#1846).
+
+-------------------------------------------------------------------
+Tue Dec 10 14:43:08 UTC 2024 - David Diaz <dgonzalez(a)suse.com>
+
+- Restore the rendering of questions throughout the app
+ (gh#agama-project/agama#1820)
+
+-------------------------------------------------------------------
+Mon Dec 9 14:10:44 UTC 2024 - David Diaz <dgonzalez(a)suse.com>
+
+- Simplify screen for enforcing root password
+ (gh#agama-project/agama#1821, gh#agama-project#agama#1787).
+
+-------------------------------------------------------------------
+Sun Dec 1 17:14:04 UTC 2024 - Knut Anderssen <kanderssen(a)suse.com>
+
+- Do not crash in the InstallationFinished page when running an
+ unattended installation with an storage section defined in the
+ profile (gh#agama-project/agama#1793).
+
+-------------------------------------------------------------------
+Thu Nov 28 14:34:49 UTC 2024 - David Diaz <dgonzalez(a)suse.com>
+
+- Request a root authentication method after selecting a product
+ (gh#agama-project#agama#1787).
+
+-------------------------------------------------------------------
+Tue Nov 26 09:30:09 UTC 2024 - Ladislav Slezák <lslezak(a)suse.com>
+
+- Use dynamic imports for loading the translation files
+ (gh#agama-project/agama#1777)
+
+-------------------------------------------------------------------
+Mon Nov 25 11:12:36 UTC 2024 - David Diaz <dgonzalez(a)suse.com>
+
+- Unify Install and "warning" header buttons.
+- Move installation issues to a drawer shown when Install button
+ is clicked (gh#agama-project#agama#1778).
+
+-------------------------------------------------------------------
+Fri Nov 15 16:48:44 UTC 2024 - Ladislav Slezák <lslezak(a)suse.com>
+
+- Set the plain text password flag when setting the root and first
+ user password (gh#agama-project/agama#1771)
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ agama.obscpio ++++++
++++ 89781 lines of diff (skipped)
++++++ agama.obsinfo ++++++
--- /var/tmp/diff_new_pack.ZGKoWf/_old 2025-01-05 15:29:16.412868982 +0100
+++ /var/tmp/diff_new_pack.ZGKoWf/_new 2025-01-05 15:29:16.416869146 +0100
@@ -1,5 +1,5 @@
name: agama
-version: 10+489
-mtime: 1731912515
-commit: 72170de34101a363fb17113928c543e0ea0454d1
+version: 10+731
+mtime: 1735247351
+commit: 3bdbd16335eb7f7a5c87473dd4b798950db22698
++++++ node_modules.obscpio ++++++
/work/SRC/openSUSE:Factory/agama-web-ui/node_modules.obscpio /work/SRC/openSUSE:Factory/.agama-web-ui.new.1881/node_modules.obscpio differ: char 60, line 1
++++++ node_modules.spec.inc ++++++
++++ 2388 lines (skipped)
++++ between /work/SRC/openSUSE:Factory/agama-web-ui/node_modules.spec.inc
++++ and /work/SRC/openSUSE:Factory/.agama-web-ui.new.1881/node_modules.spec.inc
++++++ node_modules.sums ++++++
++++ 1455 lines (skipped)
++++ between /work/SRC/openSUSE:Factory/agama-web-ui/node_modules.sums
++++ and /work/SRC/openSUSE:Factory/.agama-web-ui.new.1881/node_modules.sums
++++++ package-lock.json ++++++
++++ 12187 lines (skipped)
++++ between /work/SRC/openSUSE:Factory/agama-web-ui/package-lock.json
++++ and /work/SRC/openSUSE:Factory/.agama-web-ui.new.1881/package-lock.json
1
0