From 562b572a879c34bf37b553f818bef4b9301304b7 Mon Sep 17 00:00:00 2001 From: dogsheng <960055655@qq.com> Date: Sat, 14 Dec 2019 18:54:01 +0800 Subject: [PATCH] Package init --- README.en.md | 36 ----- README.md | 39 ----- fdupes-1.6.1-allow_a_instead_of_all.patch | 24 ++++ fdupes-1.6.1-delete_old_TODO.patch | 88 ++++++++++++ fdupes-1.6.1-option_sort_by_ctime.patch | 167 ++++++++++++++++++++++ fdupes-1.6.1.tar.gz | Bin 0 -> 20869 bytes fdupes.spec | 84 +++++++++++ macros.fdupes | 21 +++ 8 files changed, 384 insertions(+), 75 deletions(-) delete mode 100644 README.en.md delete mode 100644 README.md create mode 100644 fdupes-1.6.1-allow_a_instead_of_all.patch create mode 100644 fdupes-1.6.1-delete_old_TODO.patch create mode 100644 fdupes-1.6.1-option_sort_by_ctime.patch create mode 100644 fdupes-1.6.1.tar.gz create mode 100644 fdupes.spec create mode 100644 macros.fdupes diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 95a3350..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# fdupes - -#### Description -{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md deleted file mode 100644 index c695c9d..0000000 --- a/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# fdupes - -#### 介绍 -{**以下是码云平台说明,您可以替换此简介** -码云是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用码云实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 码云特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 -5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/fdupes-1.6.1-allow_a_instead_of_all.patch b/fdupes-1.6.1-allow_a_instead_of_all.patch new file mode 100644 index 0000000..89115e0 --- /dev/null +++ b/fdupes-1.6.1-allow_a_instead_of_all.patch @@ -0,0 +1,24 @@ +From 88f3d2dd31fbef7e539b2523724221e8e8e5a9f0 Mon Sep 17 00:00:00 2001 +From: Falk +Date: Thu, 27 Oct 2016 18:10:48 +0200 +Subject: [PATCH] allow to type just a instead of all + +Typing all many times can be boring/annoying, So I propose to allow people to type just a for all. +(sometimes there can be very large duplicate sets) +--- + fdupes.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fdupes.c b/fdupes.c +index 7eee165..7a8a6ed 100644 +--- a/fdupes.c ++++ b/fdupes.c +@@ -886,7 +886,7 @@ void deletefiles(file_t *files, int prompt, FILE *tty) + token = strtok(preservestr, " ,\n"); + + while (token != NULL) { +- if (strcasecmp(token, "all") == 0) ++ if (strcasecmp(token, "all") == 0 || strcasecmp(token, "a") == 0) + for (x = 0; x <= counter; x++) preserve[x] = 1; + + number = 0; diff --git a/fdupes-1.6.1-delete_old_TODO.patch b/fdupes-1.6.1-delete_old_TODO.patch new file mode 100644 index 0000000..ac9ad2d --- /dev/null +++ b/fdupes-1.6.1-delete_old_TODO.patch @@ -0,0 +1,88 @@ +From 315f6702f1cc37036d9f826314245b44a781c387 Mon Sep 17 00:00:00 2001 +From: Adrian Lopez +Date: Sun, 21 Aug 2016 02:04:15 -0400 +Subject: [PATCH] Delete old TODO file. + +--- + TODO | 72 -------------------------------------------------------------------- + 1 file changed, 72 deletions(-) + delete mode 100644 TODO + +diff --git a/TODO b/TODO +deleted file mode 100644 +index f7f77c4..0000000 +--- a/TODO ++++ /dev/null +@@ -1,72 +0,0 @@ +-- A bug with -S shows wrong results. +- +-- A bug causes the following behavior: +- +- $ fdupes --symlinks testdir +- testdir/with spaces b +- testdir/with spaces a +- +- testdir/zero_b +- testdir/zero_a +- +- testdir/symlink_two +- testdir/twice_one +- +- $ cp testdir/two testdir/two_again +- $ fdupes --symlinks testdir +- testdir/two_again +- testdir/two +- testdir/twice_one +- testdir/symlink_two +- +- testdir/with spaces b +- testdir/with spaces a +- +- testdir/zero_b +- testdir/zero_a +- +- ** This is not the desired behavior. Likewise: +- +- $ fdupes testdir +- testdir/with spaces b +- testdir/with spaces a +- +- testdir/zero_b +- testdir/zero_a +- +- testdir/twice_one +- testdir/two +- +- $ fdupes --symlinks testdir +- testdir/with spaces b +- testdir/with spaces a +- +- testdir/zero_b +- testdir/zero_a +- +- testdir/symlink_two +- testdir/twice_one +- +-- Don't assume that stat always works. +- +-- Add partial checksumming where instead of MD5ing whole +- files we MD5 and compare every so many bytes, caching +- these partial results for subsequent comparisons. +- +-- Option -R should not have to be separated from the rest, +- such that "fdupes -dR testdir", "fdupes -d -R testdir", +- "fdupes -Rd testdir", etc., all yield the same results. +- +-- Add option to highlight or identify symlinked files (suggest +- using --classify to identify symlinks with @ suffix... when +- specified, files containing @ are listed using \@). +- +-- Consider autodeletion option without user intervention. +- +-- Consider option to match only to files in specific directory. +- +-- Do a little commenting, to avoid rolling eyes and/or snickering. +- +-- Fix problem where MD5 collisions will result in one of the +- files not being registered (causing it to be ignored). +- diff --git a/fdupes-1.6.1-option_sort_by_ctime.patch b/fdupes-1.6.1-option_sort_by_ctime.patch new file mode 100644 index 0000000..8529323 --- /dev/null +++ b/fdupes-1.6.1-option_sort_by_ctime.patch @@ -0,0 +1,167 @@ +From e95ec42dc178eff0410880c3dc4c0dac3df442df Mon Sep 17 00:00:00 2001 +From: Adrian Lopez +Date: Tue, 23 Aug 2016 18:21:18 -0400 +Subject: [PATCH] Add an option to sort duplicate files by ctime. + +--- + README | 5 +++-- + fdupes.1 | 2 +- + fdupes.c | 49 +++++++++++++++++++++++++++++++++++++------------ + 3 files changed, 41 insertions(+), 15 deletions(-) + +diff --git a/README b/README +index c748d05..c27f043 100644 +--- a/README ++++ b/README +@@ -37,8 +37,9 @@ Usage: fdupes [options] DIRECTORY... + grouping into sets; implies --noprompt + -p --permissions don't consider files with different owner/group or + permission bits as duplicates +- -o --order=BY select sort order for output, linking and deleting; by +- mtime (BY='time'; default) or filename (BY='name') ++ -o --order=BY select sort order for output and deleting; by file ++ modification time (BY='time'; default), status ++ change time (BY='ctime'), or filename (BY='name') + -i --reverse reverse order while sorting + -v --version display fdupes version + -h --help display this help message +diff --git a/fdupes.1 b/fdupes.1 +index 5ddad87..969a5d8 100644 +--- a/fdupes.1 ++++ b/fdupes.1 +@@ -72,7 +72,7 @@ don't consider files with different owner/group or permission bits as duplicates + .TP + .B -o --order\fR=\fIWORD\fR + order files according to WORD: +-time - sort by mtime, name - sort by filename ++time - sort by modification time, ctime - sort by status change time, name - sort by filename + .TP + .B -i --reverse + reverse order while sorting +diff --git a/fdupes.c b/fdupes.c +index ef64c45..7eee165 100644 +--- a/fdupes.c ++++ b/fdupes.c +@@ -56,7 +56,8 @@ + #define F_IMMEDIATE 0x8000 + + typedef enum { +- ORDER_TIME = 0, ++ ORDER_MTIME = 0, ++ ORDER_CTIME, + ORDER_NAME + } ordertype_t; + +@@ -64,6 +65,8 @@ char *program_name; + + unsigned long flags = 0; + ++ordertype_t ordertype = ORDER_MTIME; ++ + #define CHUNK_SIZE 8192 + + #define INPUT_SIZE 256 +@@ -97,7 +100,7 @@ typedef struct _file { + md5_byte_t *crcsignature; + dev_t device; + ino_t inode; +- time_t mtime; ++ time_t sorttime; + int hasdupes; /* true only if file is first on duplicate chain */ + struct _file *duplicates; + struct _file *next; +@@ -183,6 +186,14 @@ time_t getmtime(char *filename) { + return s.st_mtime; + } + ++time_t getctime(char *filename) { ++ struct stat s; ++ ++ if (stat(filename, &s) != 0) return 0; ++ ++ return s.st_ctime; ++} ++ + char **cloneargs(int argc, char **argv) + { + int x; +@@ -435,7 +446,17 @@ void getfilestats(file_t *file) + file->size = filesize(file->d_name); + file->inode = getinode(file->d_name); + file->device = getdevice(file->d_name); +- file->mtime = getmtime(file->d_name); ++ ++ switch (ordertype) ++ { ++ case ORDER_CTIME: ++ file->sorttime = getctime(file->d_name); ++ break; ++ case ORDER_MTIME: ++ default: ++ file->sorttime = getmtime(file->d_name); ++ break; ++ } + } + + int registerfile(filetree_t **branch, file_t *file) +@@ -911,11 +932,11 @@ int sort_pairs_by_arrival(file_t *f1, file_t *f2) + return !ISFLAG(flags, F_REVERSE) ? -1 : 1; + } + +-int sort_pairs_by_mtime(file_t *f1, file_t *f2) ++int sort_pairs_by_time(file_t *f1, file_t *f2) + { +- if (f1->mtime < f2->mtime) ++ if (f1->sorttime < f2->sorttime) + return !ISFLAG(flags, F_REVERSE) ? -1 : 1; +- else if (f1->mtime > f2->mtime) ++ else if (f1->sorttime > f2->sorttime) + return !ISFLAG(flags, F_REVERSE) ? 1 : -1; + + return 0; +@@ -1038,8 +1059,9 @@ void help_text() + printf(" \tgrouping into sets; implies --noprompt\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"); +- printf(" \tmtime (BY='time'; default) or filename (BY='name')\n"); ++ printf(" -o --order=BY \tselect sort order for output and deleting; by file\n"); ++ printf(" \tmodification time (BY='time'; default), status\n"); ++ printf(" \tchange time (BY='ctime'), or filename (BY='name')\n"); + printf(" -i --reverse \treverse order while sorting\n"); + printf(" -v --version \tdisplay fdupes version\n"); + printf(" -h --help \tdisplay this help message\n\n"); +@@ -1061,7 +1083,6 @@ int main(int argc, char **argv) { + int progress = 0; + char **oldargv; + int firstrecurse; +- ordertype_t ordertype = ORDER_TIME; + + #ifndef OMIT_GETOPT_LONG + static struct option long_options[] = +@@ -1161,7 +1182,9 @@ int main(int argc, char **argv) { + if (!strcasecmp("name", optarg)) { + ordertype = ORDER_NAME; + } else if (!strcasecmp("time", optarg)) { +- ordertype = ORDER_TIME; ++ ordertype = ORDER_MTIME; ++ } else if (!strcasecmp("ctime", optarg)) { ++ ordertype = ORDER_CTIME; + } else { + errormsg("invalid value for --order: '%s'\n", optarg); + exit(1); +@@ -1247,10 +1270,12 @@ int main(int argc, char **argv) { + if (confirmmatch(file1, file2)) { + if (ISFLAG(flags, F_DELETEFILES) && ISFLAG(flags, F_IMMEDIATE)) + deletesuccessor(match, curfile, +- (ordertype == ORDER_TIME) ? sort_pairs_by_mtime : sort_pairs_by_filename ); ++ (ordertype == ORDER_MTIME || ++ ordertype == ORDER_CTIME) ? sort_pairs_by_time : sort_pairs_by_filename ); + else + registerpair(match, curfile, +- (ordertype == ORDER_TIME) ? sort_pairs_by_mtime : sort_pairs_by_filename ); ++ (ordertype == ORDER_MTIME || ++ ordertype == ORDER_CTIME) ? sort_pairs_by_time : sort_pairs_by_filename ); + } + + fclose(file1); diff --git a/fdupes-1.6.1.tar.gz b/fdupes-1.6.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7763ef89a3f53b82ce59ed61d285f011a0435541 GIT binary patch literal 20869 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 g{?_06TYu|s{jI LICENSE +FDUPES Copyright (c) 1999 Adrian Lopez + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation files +(the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +EOF + + +%build +%make_build COMPILER_OPTIONS="%{?optflags}" LDFLAGS="%{?__global_ldflags}" + + +%install +%make_install BIN_DIR=%{_bindir} MAN_BASE_DIR=%{_mandir} +install -Dpm 0644 %{SOURCE1} %{buildroot}%{macrosdir}/%{macrosname} + + +%check +./%{name} testdir +./%{name} --omitfirst testdir +./%{name} --recurse testdir +./%{name} --size testdir + + +%files +%license CONTRIBUTORS LICENSE +%{_bindir}/%{name} +%{macrosdir}/%{macrosname} + +%files help +%doc CHANGES README +%doc %{_mandir}/man1/%{name}.1* + +%changelog +* Tue Dec 3 2019 mengxian - 1:1.6.1-6 +- Package init diff --git a/macros.fdupes b/macros.fdupes new file mode 100644 index 0000000..d01d65c --- /dev/null +++ b/macros.fdupes @@ -0,0 +1,21 @@ +%fdupes(s) \ + _target=""; \ + _symlinks=0; \ + %{-s:_symlinks=1;} \ + fdupes -q -n -r -p %1 | \ + while read _file; do \ + if test -z "$_target" ; then \ + _target="$_file"; \ + else \ + if test -z "$_file" ; then \ + _target=""; \ + continue ; \ + fi ; \ + if test "$_symlinks" = 1; then \ + ln -sf "${_target#%{buildroot}}" "$_file"; \ + else \ + ln -f "$_target" "$_file"; \ + fi ;\ + fi ; \ + done \ +%{nil}