Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package duperemove for openSUSE:Factory checked in at 2026-10-18 19:26:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/duperemove (Old) and /work/SRC/openSUSE:Factory/.duperemove.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "duperemove" Sun Oct 18 19:26:51 2026 rev:35 rq:1385995 version:0.15.2 Changes: -------- --- /work/SRC/openSUSE:Factory/duperemove/duperemove.changes 2025-02-06 22:07:05.570239669 +0100 +++ /work/SRC/openSUSE:Factory/.duperemove.new.3698736/duperemove.changes 2026-10-18 19:27:25.806067038 +0200 @@ -1,0 +2,25 @@ +Sun Oct 18 05:35:35 UTC 2026 - Martin Pluskal <[email protected]> + +- Drop duperemove-0.15-buildfail.patch: fixed upstream, 0.15.2 ships list.h (gh#markfasheh/duperemove#367). +- Spec cleanup: drop obsolete Group: tags, use pkgconfig() BuildRequires. + +------------------------------------------------------------------- +Thu May 15 06:40:08 UTC 2025 - Michael Vetter <[email protected]> + +- Update to 0.15.2: + * dedupe.c: fix infinite looping on NoCOW files #376 + +------------------------------------------------------------------- +Mon Mar 24 13:07:25 UTC 2025 - [email protected] + +- require gcc-PIE [bsc#1239940] for build + +------------------------------------------------------------------- +Thu Mar 6 05:29:46 UTC 2025 - Ilgaz Öcal <[email protected]> + +- Update to 0.15.1 + * file_scan: allow scanning multi-device bcachefs + * dedupe: Skip extents with insufficient duplicates + * Fixes found when packaging for Chimera Linux + +------------------------------------------------------------------- Old: ---- duperemove-0.15-buildfail.patch duperemove-0.15.tar.gz New: ---- duperemove-0.15.2.tar.gz ----------(Old B)---------- Old: - Drop duperemove-0.15-buildfail.patch: fixed upstream, 0.15.2 ships list.h (gh#markfasheh/duperemove#367). - Spec cleanup: drop obsolete Group: tags, use pkgconfig() BuildRequires. ----------(Old E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ duperemove.spec ++++++ --- /var/tmp/diff_new_pack.hG0ad0/_old 2026-10-18 19:27:26.757106885 +0200 +++ /var/tmp/diff_new_pack.hG0ad0/_new 2026-10-18 19:27:26.761107053 +0200 @@ -1,7 +1,7 @@ # # spec file for package duperemove # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -23,23 +23,22 @@ %define req_gcc_ver %{nil} %endif Name: duperemove -Version: 0.15 +Version: 0.15.2 Release: 0 Summary: Software to find duplicate extents in files and remove them License: GPL-2.0-only -Group: System/Filesystems URL: https://github.com/markfasheh/duperemove Source: https://github.com/markfasheh/%{name}/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -# PATCH-FIX-UPSTREAM [email protected] gh#markfasheh/duperemove#367 -Patch: duperemove-0.15-buildfail.patch BuildRequires: gcc%{req_gcc_ver} +BuildRequires: gcc%{req_gcc_ver}-PIE BuildRequires: gcc%{req_gcc_ver}-c++ -BuildRequires: libblkid-devel -BuildRequires: libbsd-devel -BuildRequires: libmount-devel BuildRequires: pkgconfig -BuildRequires: xxhash-devel +BuildRequires: pkgconfig(blkid) BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(libbsd) +BuildRequires: pkgconfig(libbsd-overlay) +BuildRequires: pkgconfig(libxxhash) +BuildRequires: pkgconfig(mount) BuildRequires: pkgconfig(sqlite3) BuildRequires: pkgconfig(uuid) @@ -50,14 +49,12 @@ %package -n %{samename} Summary: Debug/Test tool to exercise the btrfs out-of-band deduplication ioctl -Group: System/Filesystems %description -n %{samename} Debug/Test tool to exercise a btrfs ioctl for deduplicating file regions. %package zsh-completion Summary: Zsh Completion for %{name} -Group: System/Shells Requires: zsh Supplements: (%{name} and zsh) BuildArch: noarch ++++++ duperemove-0.15.tar.gz -> duperemove-0.15.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/Makefile new/duperemove-0.15.2/Makefile --- old/duperemove-0.15/Makefile 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/Makefile 2025-05-09 20:07:30.000000000 +0200 @@ -2,7 +2,7 @@ IS_RELEASE ?= $(if $(filter $(shell git rev-list $(shell git describe --abbrev=0 --tags --exclude '*dev';)..HEAD --count;),0),1,0) CC ?= gcc -CFLAGS ?= -Wall -ggdb --std=c23 -MMD +CFLAGS ?= -Wall -ggdb -std=gnu11 -Werror=strict-prototypes -MMD PKG_CONFIG ?= pkg-config MANPAGES=duperemove.8 btrfs-extent-same.8 hashstats.8 show-shared-extents.8 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/dbfile.c new/duperemove-0.15.2/dbfile.c --- old/duperemove-0.15/dbfile.c 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/dbfile.c 2025-05-09 20:07:30.000000000 +0200 @@ -561,6 +561,17 @@ } } +/* + * dbfile_close_handle takes struct dbhandle*. + * we need a function that takes void* so we + * can pass it to register_cleanup without + * causing UB. + */ +static void cleanup_dbhandle(void *db) +{ + dbfile_close_handle(db); +} + struct dbhandle *dbfile_open_handle_thread(char *filename, struct threads_pool *pool) { struct dbhandle *db; @@ -569,7 +580,7 @@ dbfile_unlock(); if (db) - register_cleanup(pool, (void*)&dbfile_close_handle, db); + register_cleanup(pool, (void*)&cleanup_dbhandle, db); return db; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/dbfile.h new/duperemove-0.15.2/dbfile.h --- old/duperemove-0.15/dbfile.h 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/dbfile.h 2025-05-09 20:07:30.000000000 +0200 @@ -77,8 +77,8 @@ */ struct dbhandle *dbfile_open_handle_thread(char *filename, struct threads_pool *pool); -void dbfile_lock(); -void dbfile_unlock(); +void dbfile_lock(void); +void dbfile_unlock(void); struct dbfile_config { unsigned int blocksize; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/dedupe.c new/duperemove-0.15.2/dedupe.c --- old/duperemove-0.15/dedupe.c 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/dedupe.c 2025-05-09 20:07:30.000000000 +0200 @@ -306,7 +306,6 @@ * get -EINVAL on all the fds. Short circuit this then * by moving everything off the queued list. */ - fs_blocksize = get_fs_blocksize(ctxt->ioctl_file->fd); list_splice_init(&ctxt->queued, &ctxt->completed); } } @@ -328,6 +327,7 @@ print_btrfs_same_info(ctxt); if (ctxt->same->info[0].status == -EINVAL && !fs_blocksize) { + fs_blocksize = get_fs_blocksize(ctxt->ioctl_file->fd); set_aligned_same_length(ctxt, ctxt->same); goto retry; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/docs/duperemove.html new/duperemove-0.15.2/docs/duperemove.html --- old/duperemove-0.15/docs/duperemove.html 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/docs/duperemove.html 2025-05-09 20:07:30.000000000 +0200 @@ -4,7 +4,7 @@ <meta charset="utf-8" /> <meta name="generator" content="pandoc" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> - <meta name="dcterms.date" content="2025-11-02" /> + <meta name="dcterms.date" content="2025-03-01" /> <title>Duperemove</title> <style> html { @@ -172,7 +172,7 @@ <body> <header id="title-block-header"> <h1 class="title">Duperemove</h1> -<p class="date">02 Nov 2025</p> +<p class="date">01 Mar 2025</p> </header> <h1 id="name">NAME</h1> <p><code>duperemove</code> - Find duplicate regions in files and submit diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/duperemove.8 new/duperemove-0.15.2/duperemove.8 --- old/duperemove-0.15/duperemove.8 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/duperemove.8 2025-05-09 20:07:30.000000000 +0200 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.1.11.1 .\" -.TH "Duperemove" "8" "02 Nov 2025" "duperemove 0.15" "System Manager\[cq]s Manual" +.TH "Duperemove" "8" "01 Mar 2025" "duperemove 0.15.1" "System Manager\[cq]s Manual" .SH NAME \f[CR]duperemove\f[R] \- Find duplicate regions in files and submit them for deduplication diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/duperemove.c new/duperemove-0.15.2/duperemove.c --- old/duperemove-0.15/duperemove.c 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/duperemove.c 2025-05-09 20:07:30.000000000 +0200 @@ -130,7 +130,7 @@ return 0; } -static void print_version() +static void print_version(void) { char *s = NULL; #ifdef DEBUG_BUILD @@ -206,7 +206,7 @@ BATCH_SIZE_OPTION, }; -static int process_fdupes() +static int process_fdupes(void) { int ret = 0; _cleanup_(freep) char *path = NULL; @@ -285,7 +285,7 @@ return 0; } -static void help() +static void help(void) { execlp("man", "man", "8", "duperemove", NULL); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/file_scan.c new/duperemove-0.15.2/file_scan.c --- old/duperemove-0.15/file_scan.c 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/file_scan.c 2025-05-09 20:07:30.000000000 +0200 @@ -220,6 +220,30 @@ return makedev(stx->stx_dev_major, stx->stx_dev_minor); } +static char *extract_first_device(const char *fs_source) +{ + char *first_device = NULL; + const char *colon; + + if (!fs_source) + return NULL; + + colon = strchr(fs_source, ':'); + if (colon) { + size_t len = colon - fs_source; + first_device = malloc(len + 1); + if (!first_device) + return NULL; + memcpy(first_device, fs_source, len); + first_device[len] = '\0'; + } else { + first_device = strdup(fs_source); + if (!first_device) + return NULL; + } + return first_device; +} + /* Get the UUID associated with the FS that stores path */ int get_uuid(char *path, uuid_t *uuid) { @@ -245,6 +269,9 @@ return 1; } } else { + const char *fs_source; + char *first_device; + dprintf("get_uuid: %s do not live on btrfs\n", path); ret = statx(0, path, 0, STATX_BASIC_STATS, &st); @@ -274,7 +301,16 @@ return 1; } - uuid_found = blkid_get_tag_value(NULL, "UUID", mnt_fs_get_source(dev)); + fs_source = mnt_fs_get_source(dev); + first_device = extract_first_device(fs_source); + + if (!first_device) { + eprintf("Memory allocation failed\n"); + return 1; + } + + uuid_found = blkid_get_tag_value(NULL, "UUID", first_device); + free(first_device); if (!uuid_found) { eprintf("libblkid could not get uuid for " "device %s. Run blkid as root to " diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/file_scan.h new/duperemove-0.15.2/file_scan.h --- old/duperemove-0.15/file_scan.h 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/file_scan.h 2025-05-09 20:07:30.000000000 +0200 @@ -47,8 +47,8 @@ int add_exclude_pattern(const char *pattern); -void filescan_init(); -void filescan_free(); +void filescan_init(void); +void filescan_free(void); void add_file_fdupes(char *path); #endif /* __FILE_SCAN_H__ */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/hashstats.c new/duperemove-0.15.2/hashstats.c --- old/duperemove-0.15/hashstats.c 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/hashstats.c 2025-05-09 20:07:30.000000000 +0200 @@ -138,7 +138,7 @@ stats->num_files, stats->num_b_hashes, stats->num_e_hashes); } -static void version() +static void version(void) { printf("hashstats %s\n", VERSTRING); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/list.h new/duperemove-0.15.2/list.h --- old/duperemove-0.15/list.h 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/list.h 2025-05-09 20:07:30.000000000 +0200 @@ -31,6 +31,7 @@ #define LIST_HEAD_INIT(name) { &(name), &(name) } +#undef LIST_HEAD // <bsd/sys/queue.h> #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/markdown/duperemove.md new/duperemove-0.15.2/markdown/duperemove.md --- old/duperemove-0.15/markdown/duperemove.md 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/markdown/duperemove.md 2025-05-09 20:07:30.000000000 +0200 @@ -2,8 +2,8 @@ title: Duperemove section: 8 header: System Manager’s Manual -footer: duperemove 0.15 -date: 02 Nov 2025 +footer: duperemove 0.15.1 +date: 01 Mar 2025 --- # NAME `duperemove` - Find duplicate regions in files and submit them for deduplication diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/progress.c new/duperemove-0.15.2/progress.c --- old/duperemove-0.15/progress.c 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/progress.c 2025-05-09 20:07:30.000000000 +0200 @@ -66,7 +66,7 @@ /* * Used to track the status of our search extents from blocks */ -static uint64_t search_total, search_processed; +static _Atomic uint64_t search_total, search_processed; #define s_save_pos() if (tty) printf("\33[s"); #define s_restore_pos() if (tty) printf("\33[u"); @@ -176,7 +176,7 @@ return NULL; } -static void *pscan_progress_thread(void *) +static void *pscan_progress_thread(void * p) { struct winsize w; do { @@ -215,7 +215,7 @@ return tprogress; } -void pscan_run() +void pscan_run(void) { tty = isatty(STDOUT_FILENO); @@ -230,7 +230,7 @@ printer = g_thread_new("progress_printer", pscan_progress_thread, NULL); } -void pscan_join() +void pscan_join(void) { g_thread_join(printer); @@ -277,7 +277,7 @@ (*progress)->file_path[0] = '\0'; } -bool is_progress_printer_running() +bool is_progress_printer_running(void) { return printer ? true : false; } @@ -312,7 +312,7 @@ g_mutex_unlock(&pscan.mutex); } -static void *psearch_progress_thread(void *) +static void *psearch_progress_thread(void * p) { static int last_pos = -1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/progress.h new/duperemove-0.15.2/progress.h --- old/duperemove-0.15/progress.h 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/progress.h 2025-05-09 20:07:30.000000000 +0200 @@ -39,7 +39,7 @@ struct pscan_thread **threads; }; -void pscan_finish_listing(); +void pscan_finish_listing(void); /* Used to increment the global todo list */ void pscan_set_progress(uint64_t added_files, uint64_t added_bytes); @@ -53,13 +53,13 @@ * - the listing is completed - pscan_finish_listing() has been called * - the sum of all threads progresses equals to the global totals */ -void pscan_run(); +void pscan_run(void); /* * Wait for the progress thread to finish * Also cleanup per-thread progresses and print the global totals */ -void pscan_join(); +void pscan_join(void); /* * Reset file tracking data @@ -69,7 +69,7 @@ */ void pscan_reset_thread(struct pscan_thread **progress); -bool is_progress_printer_running(); +bool is_progress_printer_running(void); /* * The progress thread overwrites its area. @@ -87,7 +87,7 @@ /* * Wait for the progress thread to finish */ -void psearch_join(); +void psearch_join(void); /* * extent search: update the number of processed filerecs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/results-tree.h new/duperemove-0.15.2/results-tree.h --- old/duperemove-0.15/results-tree.h 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/results-tree.h 2025-05-09 20:07:30.000000000 +0200 @@ -20,11 +20,7 @@ #include <glib.h> #include "csum.h" - -// TODO: delete this -struct list_head { - struct list_head *next, *prev; -}; +#include "list.h" struct results_tree { struct rb_root root; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duperemove-0.15/run_dedupe.c new/duperemove-0.15.2/run_dedupe.c --- old/duperemove-0.15/run_dedupe.c 2025-02-02 15:31:58.000000000 +0100 +++ new/duperemove-0.15.2/run_dedupe.c 2025-05-09 20:07:30.000000000 +0200 @@ -561,11 +561,16 @@ * around the rbtree code here so rb_erase doesn't * change the tree underneath us. */ - g_mutex_lock(&mutex); node = rb_next(node); g_mutex_unlock(&mutex); + if (dext->de_num_dupes < 2) { + qprintf("Skipping extent - insufficient duplicates (%u)\n", + dext->de_num_dupes); + continue; + } + g_thread_pool_push(dedupe_pool, dext, &err); if (err) { eprintf("Fatal error while deduping: %s\n",
