forked from pool/fdupes
Accepting request 438708 from home:psimons:branches:utilities
Drop 50_bts284274_hardlinkreplace.dpatch. The --linkhard option added by this patch has an implementation bug that can cause data loss. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=677419 has more details. OBS-URL: https://build.opensuse.org/request/show/438708 OBS-URL: https://build.opensuse.org/package/show/utilities/fdupes?expand=0&rev=15
This commit is contained in:
parent
1bfed6008b
commit
bb7f5ba608
@ -1,230 +0,0 @@
|
|||||||
#! /bin/sh /usr/share/dpatch/dpatch-run
|
|
||||||
## 50_bts284274_hardlinkreplace.dpatch by <jfs@debian.org>
|
|
||||||
##
|
|
||||||
## All lines beginning with `## DP:' are a description of the patch.
|
|
||||||
## DP: Replace duplicate files with hardlinks
|
|
||||||
|
|
||||||
@DPATCH@
|
|
||||||
Index: fdupes-1.6.1/fdupes.c
|
|
||||||
===================================================================
|
|
||||||
--- fdupes-1.6.1.orig/fdupes.c 2016-11-04 14:37:27.771346294 +0100
|
|
||||||
+++ fdupes-1.6.1/fdupes.c 2016-11-04 14:44:50.631242166 +0100
|
|
||||||
@@ -54,6 +54,8 @@
|
|
||||||
#define F_PERMISSIONS 0x2000
|
|
||||||
#define F_REVERSE 0x4000
|
|
||||||
#define F_IMMEDIATE 0x8000
|
|
||||||
+#define F_HARDLINKFILES 0x10000
|
|
||||||
+#define F_DEBUGINFO 0x20000
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
ORDER_TIME = 0,
|
|
||||||
@@ -903,6 +905,88 @@ void deletefiles(file_t *files, int prom
|
|
||||||
free(preservestr);
|
|
||||||
}
|
|
||||||
|
|
||||||
+void hardlinkfiles(file_t *files, int debug)
|
|
||||||
+{
|
|
||||||
+ int counter;
|
|
||||||
+ int groups = 0;
|
|
||||||
+ int curgroup = 0;
|
|
||||||
+ file_t *tmpfile;
|
|
||||||
+ file_t *curfile;
|
|
||||||
+ file_t **dupelist;
|
|
||||||
+ int max = 0;
|
|
||||||
+ int x = 0;
|
|
||||||
+
|
|
||||||
+ curfile = files;
|
|
||||||
+
|
|
||||||
+ while (curfile) {
|
|
||||||
+ if (curfile->hasdupes) {
|
|
||||||
+ counter = 1;
|
|
||||||
+ groups++;
|
|
||||||
+
|
|
||||||
+ tmpfile = curfile->duplicates;
|
|
||||||
+ while (tmpfile) {
|
|
||||||
+ counter++;
|
|
||||||
+ tmpfile = tmpfile->duplicates;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (counter > max) max = counter;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ curfile = curfile->next;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ max++;
|
|
||||||
+
|
|
||||||
+ dupelist = (file_t**) malloc(sizeof(file_t*) * max);
|
|
||||||
+
|
|
||||||
+ if (!dupelist) {
|
|
||||||
+ errormsg("out of memory\n");
|
|
||||||
+ exit(1);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ while (files) {
|
|
||||||
+ if (files->hasdupes) {
|
|
||||||
+ curgroup++;
|
|
||||||
+ counter = 1;
|
|
||||||
+ dupelist[counter] = files;
|
|
||||||
+
|
|
||||||
+ if (debug) printf("[%d] %s\n", counter, files->d_name);
|
|
||||||
+
|
|
||||||
+ tmpfile = files->duplicates;
|
|
||||||
+
|
|
||||||
+ while (tmpfile) {
|
|
||||||
+ dupelist[++counter] = tmpfile;
|
|
||||||
+ if (debug) printf("[%d] %s\n", counter, tmpfile->d_name);
|
|
||||||
+ tmpfile = tmpfile->duplicates;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (debug) printf("\n");
|
|
||||||
+
|
|
||||||
+ /* preserve only the first file */
|
|
||||||
+
|
|
||||||
+ printf(" [+] %s\n", dupelist[1]->d_name);
|
|
||||||
+ for (x = 2; x <= counter; x++) {
|
|
||||||
+ if (unlink(dupelist[x]->d_name) == 0) {
|
|
||||||
+ if ( link(dupelist[1]->d_name, dupelist[x]->d_name) == 0 ) {
|
|
||||||
+ printf(" [h] %s\n", dupelist[x]->d_name);
|
|
||||||
+ } else {
|
|
||||||
+ printf("-- unable to create a hardlink for the file: %s\n", strerror(errno));
|
|
||||||
+ printf(" [!] %s ", dupelist[x]->d_name);
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ printf(" [!] %s ", dupelist[x]->d_name);
|
|
||||||
+ printf("-- unable to delete the file!\n");
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ printf("\n");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ files = files->next;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ free(dupelist);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
int sort_pairs_by_arrival(file_t *f1, file_t *f2)
|
|
||||||
{
|
|
||||||
if (f2->duplicates != 0)
|
|
||||||
@@ -1030,12 +1114,14 @@ void help_text()
|
|
||||||
printf(" \twith -s or --symlinks, or when specifying a\n");
|
|
||||||
printf(" \tparticular directory more than once; refer to the\n");
|
|
||||||
printf(" \tfdupes documentation for additional information\n");
|
|
||||||
- /*printf(" -l --relink \t(description)\n");*/
|
|
||||||
+ printf(" -L --linkhard \thardlink duplicate files to the first file in\n");
|
|
||||||
+ printf(" \teach set of duplicates without prompting the user\n");
|
|
||||||
printf(" -N --noprompt \ttogether with --delete, preserve the first file in\n");
|
|
||||||
printf(" \teach set of duplicates and delete the rest without\n");
|
|
||||||
printf(" \tprompting the user\n");
|
|
||||||
printf(" -I --immediate \tdelete duplicates as they are encountered, without\n");
|
|
||||||
printf(" \tgrouping into sets; implies --noprompt\n");
|
|
||||||
+ printf(" -D --debug \tenable debugging information\n");
|
|
||||||
printf(" -p --permissions \tdon't consider files with different owner/group or\n");
|
|
||||||
printf(" \tpermission bits as duplicates\n");
|
|
||||||
printf(" -o --order=BY \tselect sort order for output, linking and deleting; by\n");
|
|
||||||
@@ -1077,6 +1163,7 @@ int main(int argc, char **argv) {
|
|
||||||
{ "symlinks", 0, 0, 's' },
|
|
||||||
{ "hardlinks", 0, 0, 'H' },
|
|
||||||
{ "relink", 0, 0, 'l' },
|
|
||||||
+ { "linkhard", 0, 0, 'L' },
|
|
||||||
{ "noempty", 0, 0, 'n' },
|
|
||||||
{ "nohidden", 0, 0, 'A' },
|
|
||||||
{ "delete", 0, 0, 'd' },
|
|
||||||
@@ -1084,6 +1171,7 @@ int main(int argc, char **argv) {
|
|
||||||
{ "help", 0, 0, 'h' },
|
|
||||||
{ "noprompt", 0, 0, 'N' },
|
|
||||||
{ "immediate", 0, 0, 'I'},
|
|
||||||
+ { "debug", 0, 0, 'D' },
|
|
||||||
{ "summarize", 0, 0, 'm'},
|
|
||||||
{ "summary", 0, 0, 'm' },
|
|
||||||
{ "permissions", 0, 0, 'p' },
|
|
||||||
@@ -1100,7 +1188,7 @@ int main(int argc, char **argv) {
|
|
||||||
|
|
||||||
oldargv = cloneargs(argc, argv);
|
|
||||||
|
|
||||||
- while ((opt = GETOPT(argc, argv, "frRq1SsHlnAdvhNImpo:i"
|
|
||||||
+ while ((opt = GETOPT(argc, argv, "frRq1SsHlLnAdDvhNImpo:i"
|
|
||||||
#ifndef OMIT_GETOPT_LONG
|
|
||||||
, long_options, NULL
|
|
||||||
#endif
|
|
||||||
@@ -1139,6 +1227,12 @@ int main(int argc, char **argv) {
|
|
||||||
case 'd':
|
|
||||||
SETFLAG(flags, F_DELETEFILES);
|
|
||||||
break;
|
|
||||||
+ case 'L':
|
|
||||||
+ SETFLAG(flags, F_HARDLINKFILES);
|
|
||||||
+ break;
|
|
||||||
+ case 'D':
|
|
||||||
+ SETFLAG(flags, F_DEBUGINFO);
|
|
||||||
+ break;
|
|
||||||
case 'v':
|
|
||||||
printf("fdupes %s\n", VERSION);
|
|
||||||
exit(0);
|
|
||||||
@@ -1192,6 +1286,16 @@ int main(int argc, char **argv) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (ISFLAG(flags, F_HARDLINKFILES) && ISFLAG(flags, F_DELETEFILES)) {
|
|
||||||
+ errormsg("options --linkhard and --delete are not compatible\n");
|
|
||||||
+ exit(1);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (ISFLAG(flags, F_HARDLINKFILES) && ISFLAG(flags, F_CONSIDERHARDLINKS)) {
|
|
||||||
+ errormsg("options --linkhard and --hardlinks are not compatible\n");
|
|
||||||
+ exit(1);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (ISFLAG(flags, F_RECURSEAFTER)) {
|
|
||||||
firstrecurse = nonoptafter("--recurse:", argc, oldargv, argv, optind);
|
|
||||||
|
|
||||||
@@ -1288,6 +1392,15 @@ int main(int argc, char **argv) {
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
+ if (ISFLAG(flags, F_HARDLINKFILES))
|
|
||||||
+
|
|
||||||
+ if (ISFLAG(flags, F_DEBUGINFO))
|
|
||||||
+ hardlinkfiles(files, 1);
|
|
||||||
+ else
|
|
||||||
+ hardlinkfiles(files, 0);
|
|
||||||
+
|
|
||||||
+ else {
|
|
||||||
+
|
|
||||||
if (ISFLAG(flags, F_SUMMARIZEMATCHES))
|
|
||||||
summarizematches(files);
|
|
||||||
|
|
||||||
@@ -1295,6 +1408,8 @@ int main(int argc, char **argv) {
|
|
||||||
|
|
||||||
printmatches(files);
|
|
||||||
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
while (files) {
|
|
||||||
curfile = files->next;
|
|
||||||
free(files->d_name);
|
|
||||||
Index: fdupes-1.6.1/fdupes.1
|
|
||||||
===================================================================
|
|
||||||
--- fdupes-1.6.1.orig/fdupes.1 2016-11-04 14:37:31.507413478 +0100
|
|
||||||
+++ fdupes-1.6.1/fdupes.1 2016-11-04 14:38:38.500615178 +0100
|
|
||||||
@@ -59,6 +59,10 @@ prompt user for files to preserve, delet
|
|
||||||
.B CAVEATS
|
|
||||||
below)
|
|
||||||
.TP
|
|
||||||
+.B -L --hardlink
|
|
||||||
+replace all duplicate files with hardlinks to the
|
|
||||||
+first file in each set of duplicates
|
|
||||||
+.TP
|
|
||||||
.B -N --noprompt
|
|
||||||
when used together with \-\-delete, preserve the first file in each
|
|
||||||
set of duplicates and delete the others without prompting the user
|
|
||||||
@@ -67,6 +71,9 @@ set of duplicates and delete the others
|
|
||||||
delete duplicates as they are encountered, without
|
|
||||||
grouping into sets; implies --noprompt
|
|
||||||
.TP
|
|
||||||
+.B -D --debug
|
|
||||||
+provide debugging information
|
|
||||||
+.TP
|
|
||||||
.B -p --permissions
|
|
||||||
don't consider files with different owner/group or permission bits as duplicates
|
|
||||||
.TP
|
|
@ -1,3 +1,11 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Nov 4 14:33:59 UTC 2016 - psimons@suse.com
|
||||||
|
|
||||||
|
- Drop 50_bts284274_hardlinkreplace.dpatch. The --linkhard option
|
||||||
|
added by this patch has an implementation bug that can cause data
|
||||||
|
loss. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=677419
|
||||||
|
has more details.
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Nov 4 13:47:27 UTC 2016 - psimons@suse.com
|
Fri Nov 4 13:47:27 UTC 2016 - psimons@suse.com
|
||||||
|
|
||||||
|
@ -27,8 +27,6 @@ Source0: https://github.com/adrianlopezroche/fdupes/archive/v%{version}.t
|
|||||||
Source1: macros.fdupes
|
Source1: macros.fdupes
|
||||||
#PATCH-FIX-SUSE: fix patch according distro's needs
|
#PATCH-FIX-SUSE: fix patch according distro's needs
|
||||||
Patch0: fdupes-makefile.patch
|
Patch0: fdupes-makefile.patch
|
||||||
#PATCH-FIX-DEBIAN: add -L/--linkhard
|
|
||||||
Patch20: 50_bts284274_hardlinkreplace.dpatch
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
|
|
||||||
%description
|
%description
|
||||||
@ -38,7 +36,6 @@ residing within specified directories.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch0
|
%patch0
|
||||||
%patch20 -p1
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
make %{?_smp_mflags} COMPILER_OPTIONS="%{optflags}"
|
make %{?_smp_mflags} COMPILER_OPTIONS="%{optflags}"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user