From e5695fa59141ad17764d11ade4c461084639517f Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Oct 22 2019 01:11:44 +0000 Subject: import diffutils-3.3-5.el7 --- diff --git a/.diffutils.metadata b/.diffutils.metadata new file mode 100644 index 0000000..8e754fb --- /dev/null +++ b/.diffutils.metadata @@ -0,0 +1 @@ +6463cce7d3eb73489996baefd0e4425928ecd61e SOURCES/diffutils-3.3.tar.xz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..68437e0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/diffutils-3.3.tar.xz diff --git a/SOURCES/diffutils-3.3-diffseq.patch b/SOURCES/diffutils-3.3-diffseq.patch new file mode 100644 index 0000000..3453224 --- /dev/null +++ b/SOURCES/diffutils-3.3-diffseq.patch @@ -0,0 +1,208 @@ +diff -up diffutils-3.3/lib/diffseq.h.me diffutils-3.3/lib/diffseq.h +--- diffutils-3.3/lib/diffseq.h.me 2018-08-10 14:26:48.940444056 +0200 ++++ diffutils-3.3/lib/diffseq.h 2018-08-10 14:26:50.453439777 +0200 +@@ -138,12 +132,6 @@ struct partition + /* Midpoints of this partition. */ + OFFSET xmid; + OFFSET ymid; +- +- /* True if low half will be analyzed minimally. */ +- bool lo_minimal; +- +- /* Likewise for high half. */ +- bool hi_minimal; + }; + + +@@ -175,7 +156,7 @@ struct partition + suboptimal diff output. It cannot cause incorrect diff output. */ + + static void +-diag (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim, bool find_minimal, ++diag (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim, + struct partition *part, struct context *ctxt) + { + OFFSET *const fd = ctxt->fdiag; /* Give the compiler a chance. */ +@@ -235,7 +216,6 @@ diag (OFFSET xoff, OFFSET xlim, OFFSET y + { + part->xmid = x; + part->ymid = y; +- part->lo_minimal = part->hi_minimal = true; + return; + } + } +@@ -268,14 +248,10 @@ diag (OFFSET xoff, OFFSET xlim, OFFSET y + { + part->xmid = x; + part->ymid = y; +- part->lo_minimal = part->hi_minimal = true; + return; + } + } + +- if (find_minimal) +- continue; +- + #ifdef USE_HEURISTIC + /* Heuristic: check occasionally for a diagonal that has made lots + of progress compared with the edit distance. If we have any +@@ -319,11 +295,7 @@ diag (OFFSET xoff, OFFSET xlim, OFFSET y + } + } + if (best > 0) +- { +- part->lo_minimal = true; +- part->hi_minimal = false; +- return; +- } ++ return; + } + + { +@@ -358,77 +330,10 @@ diag (OFFSET xoff, OFFSET xlim, OFFSET y + } + } + if (best > 0) +- { +- part->lo_minimal = false; +- part->hi_minimal = true; +- return; +- } ++ return; + } + } + #endif /* USE_HEURISTIC */ +- +- /* Heuristic: if we've gone well beyond the call of duty, give up +- and report halfway between our best results so far. */ +- if (c >= ctxt->too_expensive) +- { +- OFFSET fxybest; +- OFFSET fxbest IF_LINT (= 0); +- OFFSET bxybest; +- OFFSET bxbest IF_LINT (= 0); +- +- /* Find forward diagonal that maximizes X + Y. */ +- fxybest = -1; +- for (d = fmax; d >= fmin; d -= 2) +- { +- OFFSET x = MIN (fd[d], xlim); +- OFFSET y = x - d; +- if (ylim < y) +- { +- x = ylim + d; +- y = ylim; +- } +- if (fxybest < x + y) +- { +- fxybest = x + y; +- fxbest = x; +- } +- } +- +- /* Find backward diagonal that minimizes X + Y. */ +- bxybest = OFFSET_MAX; +- for (d = bmax; d >= bmin; d -= 2) +- { +- OFFSET x = MAX (xoff, bd[d]); +- OFFSET y = x - d; +- if (y < yoff) +- { +- x = yoff + d; +- y = yoff; +- } +- if (x + y < bxybest) +- { +- bxybest = x + y; +- bxbest = x; +- } +- } +- +- /* Use the better of the two diagonals. */ +- if ((xlim + ylim) - bxybest < fxybest - (xoff + yoff)) +- { +- part->xmid = fxbest; +- part->ymid = fxybest - fxbest; +- part->lo_minimal = true; +- part->hi_minimal = false; +- } +- else +- { +- part->xmid = bxbest; +- part->ymid = bxybest - bxbest; +- part->lo_minimal = false; +- part->hi_minimal = true; +- } +- return; +- } + } + #undef XREF_YREF_EQUAL + } +@@ -452,7 +354,7 @@ diag (OFFSET xoff, OFFSET xlim, OFFSET y + + static bool + compareseq (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim, +- bool find_minimal, struct context *ctxt) ++ struct context *ctxt) + { + #ifdef ELEMENT + ELEMENT const *xv = ctxt->xvec; /* Help the compiler. */ +@@ -498,12 +400,12 @@ compareseq (OFFSET xoff, OFFSET xlim, OF + struct partition part IF_LINT2 (= { .xmid = 0, .ymid = 0 }); + + /* Find a point of correspondence in the middle of the vectors. */ +- diag (xoff, xlim, yoff, ylim, find_minimal, &part, ctxt); ++ diag (xoff, xlim, yoff, ylim, &part, ctxt); + + /* Use the partitions to split this problem into subproblems. */ +- if (compareseq (xoff, part.xmid, yoff, part.ymid, part.lo_minimal, ctxt)) ++ if (compareseq (xoff, part.xmid, yoff, part.ymid, ctxt)) + return true; +- if (compareseq (part.xmid, xlim, part.ymid, ylim, part.hi_minimal, ctxt)) ++ if (compareseq (part.xmid, xlim, part.ymid, ylim, ctxt)) + return true; + } + +diff -up diffutils-3.3/src/analyze.c.me diffutils-3.3/src/analyze.c +--- diffutils-3.3/src/analyze.c.me 2018-08-10 14:06:53.473858743 +0200 ++++ diffutils-3.3/src/analyze.c 2018-08-10 14:08:30.533579865 +0200 +@@ -542,7 +542,6 @@ diff_2_files (struct comparison *cmp) + { + struct context ctxt; + lin diags; +- lin too_expensive; + + /* Allocate vectors for the results of comparison: + a flag for each line of each file, saying whether that line +@@ -574,18 +573,11 @@ diff_2_files (struct comparison *cmp) + + ctxt.heuristic = speed_large_files; + +- /* Set TOO_EXPENSIVE to be approximate square root of input size, +- bounded below by 256. */ +- too_expensive = 1; +- for (; diags != 0; diags >>= 2) +- too_expensive <<= 1; +- ctxt.too_expensive = MAX (256, too_expensive); +- + files[0] = cmp->file[0]; + files[1] = cmp->file[1]; + + compareseq (0, cmp->file[0].nondiscarded_lines, +- 0, cmp->file[1].nondiscarded_lines, minimal, &ctxt); ++ 0, cmp->file[1].nondiscarded_lines, &ctxt); + + free (ctxt.fdiag - (cmp->file[1].nondiscarded_lines + 1)); + +diff -up diffutils-3.3/src/diff.h.me diffutils-3.3/src/diff.h +--- diffutils-3.3/src/diff.h.me 2018-08-10 14:28:25.878169926 +0200 ++++ diffutils-3.3/src/diff.h 2018-08-10 14:28:40.739127903 +0200 +@@ -376,7 +376,7 @@ extern void print_sdiff_script (struct c + extern char const change_letter[4]; + extern char const pr_program[]; + extern char *concat (char const *, char const *, char const *); +-extern bool (*lines_differ) (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE; ++extern bool (*lines_differ) (char const *, size_t, char const *, size_t); + extern bool lines_differ_singlebyte (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE; + #ifdef HANDLE_MULTIBYTE + extern bool lines_differ_multibyte (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE; diff --git a/SOURCES/diffutils-cmp-s-empty.patch b/SOURCES/diffutils-cmp-s-empty.patch new file mode 100644 index 0000000..bc1c6b4 --- /dev/null +++ b/SOURCES/diffutils-cmp-s-empty.patch @@ -0,0 +1,20 @@ +diff -up diffutils-2.8.1/src/cmp.c.cmp-s-empty diffutils-2.8.1/src/cmp.c +--- diffutils-2.8.1/src/cmp.c.cmp-s-empty 2002-04-05 21:37:31.000000000 +0100 ++++ diffutils-2.8.1/src/cmp.c 2010-06-25 14:56:08.464802321 +0100 +@@ -316,12 +316,15 @@ main (int argc, char **argv) + + /* If only a return code is needed, + and if both input descriptors are associated with plain files, ++ and if both files are larger than 0 bytes (procfs files are always 0), + conclude that the files differ if they have different sizes + and if more bytes will be compared than are in the smaller file. */ + + if (comparison_type == type_status + && S_ISREG (stat_buf[0].st_mode) +- && S_ISREG (stat_buf[1].st_mode)) ++ && S_ISREG (stat_buf[1].st_mode) ++ && stat_buf[0].st_size > 0 ++ && stat_buf[1].st_size > 0) + { + off_t s0 = stat_buf[0].st_size - file_position (0); + off_t s1 = stat_buf[1].st_size - file_position (1); diff --git a/SOURCES/diffutils-i18n.patch b/SOURCES/diffutils-i18n.patch new file mode 100644 index 0000000..be365e4 --- /dev/null +++ b/SOURCES/diffutils-i18n.patch @@ -0,0 +1,778 @@ +diff -up diffutils-3.3/src/diff.c.i18n diffutils-3.3/src/diff.c +--- diffutils-3.3/src/diff.c.i18n 2013-02-02 04:39:05.000000000 +0000 ++++ diffutils-3.3/src/diff.c 2013-10-23 11:25:18.729708853 +0100 +@@ -74,6 +74,8 @@ static void try_help (char const *, char + static void check_stdout (void); + static void usage (void); + ++bool (*lines_differ) (char const *, size_t, char const *, size_t); ++ + /* If comparing directories, compare their common subdirectories + recursively. */ + static bool recursive; +@@ -285,6 +287,13 @@ main (int argc, char **argv) + re_set_syntax (RE_SYNTAX_GREP | RE_NO_POSIX_BACKTRACKING); + excluded = new_exclude (); + ++#ifdef HANDLE_MULTIBYTE ++ if (MB_CUR_MAX > 1) ++ lines_differ = lines_differ_multibyte; ++ else ++#endif ++ lines_differ = lines_differ_singlebyte; ++ + /* Decode the options. */ + + while ((c = getopt_long (argc, argv, shortopts, longopts, NULL)) != -1) +diff -up diffutils-3.3/src/diff.h.i18n diffutils-3.3/src/diff.h +--- diffutils-3.3/src/diff.h.i18n 2013-02-02 04:39:05.000000000 +0000 ++++ diffutils-3.3/src/diff.h 2013-10-23 11:25:18.729708853 +0100 +@@ -23,6 +23,17 @@ + #include + #include + ++/* For platforms which support the ISO C ammendment 1 functionality we ++ support user-defined character classes. */ ++#if defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H ++/* Solaris 2.5 has a bug: must be included before . */ ++# include ++# include ++# if defined (HAVE_MBRTOWC) ++# define HANDLE_MULTIBYTE 1 ++# endif ++#endif ++ + /* What kind of changes a hunk contains. */ + enum changes + { +@@ -365,7 +376,11 @@ extern void print_sdiff_script (struct c + extern char const change_letter[4]; + extern char const pr_program[]; + extern char *concat (char const *, char const *, char const *); +-extern bool lines_differ (char const *, char const *) _GL_ATTRIBUTE_PURE; ++extern bool (*lines_differ) (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE; ++extern bool lines_differ_singlebyte (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE; ++#ifdef HANDLE_MULTIBYTE ++extern bool lines_differ_multibyte (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE; ++#endif + extern lin translate_line_number (struct file_data const *, lin); + extern struct change *find_change (struct change *); + extern struct change *find_reverse_change (struct change *); +diff -up diffutils-3.3/src/io.c.i18n diffutils-3.3/src/io.c +--- diffutils-3.3/src/io.c.i18n 2013-02-02 04:39:05.000000000 +0000 ++++ diffutils-3.3/src/io.c 2013-10-23 12:03:09.155348827 +0100 +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + + /* Rotate an unsigned value to the left. */ + #define ROL(v, n) ((v) << (n) | (v) >> (sizeof (v) * CHAR_BIT - (n))) +@@ -208,6 +209,28 @@ slurp (struct file_data *current) + + /* Split the file into lines, simultaneously computing the equivalence + class for each line. */ ++#ifdef HANDLE_MULTIBYTE ++# define MBC2WC(P, END, MBLENGTH, WC, STATE, CONVFAIL) \ ++do \ ++ { \ ++ mbstate_t state_bak = STATE; \ ++ \ ++ CONVFAIL = 0; \ ++ MBLENGTH = mbrtowc (&WC, P, END - (char const *)P, &STATE); \ ++ \ ++ switch (MBLENGTH) \ ++ { \ ++ case (size_t)-2: \ ++ case (size_t)-1: \ ++ STATE = state_bak; \ ++ ++CONVFAIL; \ ++ /* Fall through. */ \ ++ case 0: \ ++ MBLENGTH = 1; \ ++ } \ ++ } \ ++ while (0) ++#endif + + static void + find_and_hash_each_line (struct file_data *current) +@@ -234,12 +257,300 @@ find_and_hash_each_line (struct file_dat + bool same_length_diff_contents_compare_anyway = + diff_length_compare_anyway | ig_case; + ++#ifdef HANDLE_MULTIBYTE ++ wchar_t wc; ++ size_t mblength; ++ mbstate_t state; ++ int convfail; ++ ++ memset (&state, '\0', sizeof (mbstate_t)); ++#endif ++ + while (p < suffix_begin) + { + char const *ip = p; + hash_value h = 0; + unsigned char c; + ++#ifdef HANDLE_MULTIBYTE ++ if (MB_CUR_MAX > 1) ++ { ++ wchar_t lo_wc; ++ char mbc[MB_LEN_MAX]; ++ mbstate_t state_wc; ++ ++ /* Hash this line until we find a newline. */ ++ switch (ig_white_space) ++ { ++ case IGNORE_ALL_SPACE: ++ while (1) ++ { ++ if (*p == '\n') ++ { ++ ++p; ++ break; ++ } ++ ++ MBC2WC (p, suffix_begin, mblength, wc, state, convfail); ++ ++ if (convfail) ++ mbc[0] = *p++; ++ else if (!iswspace (wc)) ++ { ++ bool flag = 0; ++ ++ if (ig_case) ++ { ++ lo_wc = towlower (wc); ++ if (lo_wc != wc) ++ { ++ flag = 1; ++ ++ p += mblength; ++ memset (&state_wc, '\0', sizeof(mbstate_t)); ++ mblength = wcrtomb (mbc, lo_wc, &state_wc); ++ ++ assert (mblength != (size_t)-1 && ++ mblength != (size_t)-2); ++ ++ mblength = (mblength < 1) ? 1 : mblength; ++ } ++ } ++ ++ if (!flag) ++ { ++ for (i = 0; i < mblength; i++) ++ mbc[i] = *p++; ++ } ++ } ++ else ++ { ++ p += mblength; ++ continue; ++ } ++ ++ for (i = 0; i < mblength; i++) ++ h = HASH (h, mbc[i]); ++ } ++ break; ++ ++ case IGNORE_SPACE_CHANGE: ++ while (1) ++ { ++ if (*p == '\n') ++ { ++ ++p; ++ break; ++ } ++ ++ MBC2WC (p, suffix_begin, mblength, wc, state, convfail); ++ ++ if (!convfail && iswspace (wc)) ++ { ++ while (1) ++ { ++ if (*p == '\n') ++ { ++ ++p; ++ goto hashing_done; ++ } ++ ++ p += mblength; ++ MBC2WC (p, suffix_begin, mblength, wc, state, convfail); ++ if (convfail || !iswspace (wc)) ++ break; ++ } ++ h = HASH (h, ' '); ++ } ++ ++ /* WC is now the first non-space. */ ++ if (convfail) ++ mbc[0] = *p++; ++ else ++ { ++ bool flag = 0; ++ ++ if (ignore_case) ++ { ++ lo_wc = towlower (wc); ++ if (lo_wc != wc) ++ { ++ flag = 1; ++ ++ p += mblength; ++ memset (&state_wc, '\0', sizeof(mbstate_t)); ++ mblength = wcrtomb (mbc, lo_wc, &state_wc); ++ ++ assert (mblength != (size_t)-1 && ++ mblength != (size_t)-2); ++ ++ mblength = (mblength < 1) ? 1 : mblength; ++ } ++ } ++ ++ if (!flag) ++ { ++ for (i = 0; i < mblength; i++) ++ mbc[i] = *p++; ++ } ++ } ++ ++ for (i = 0; i < mblength; i++) ++ h = HASH (h, mbc[i]); ++ } ++ break; ++ ++ case IGNORE_TAB_EXPANSION: ++ case IGNORE_TAB_EXPANSION_AND_TRAILING_SPACE: ++ case IGNORE_TRAILING_SPACE: ++ { ++ size_t column = 0; ++ while (1) ++ { ++ if (*p == '\n') ++ { ++ ++p; ++ break; ++ } ++ ++ MBC2WC (p, suffix_begin, mblength, wc, state, convfail); ++ ++ if (!convfail ++ && ig_white_space & IGNORE_TRAILING_SPACE ++ && iswspace (wc)) ++ { ++ char const *p1 = p; ++ while (1) ++ { ++ if (*p1 == '\n') ++ { ++ p = p1 + 1; ++ goto hashing_done; ++ } ++ ++ p1 += mblength; ++ MBC2WC (p1, suffix_begin, mblength, wc, state, convfail); ++ if (convfail || !iswspace (wc)) ++ break; ++ } ++ } ++ ++ size_t repetitions = 1; ++ bool no_convert = 0; ++ ++ if (ig_white_space & IGNORE_TAB_EXPANSION) ++ { ++ if (convfail) ++ column++; ++ else ++ switch (wc) ++ { ++ case L'\b': ++ column -= 0 < column; ++ break; ++ ++ case L'\t': ++ mbc[0] = ' '; ++ mblength = 1; ++ no_convert = 1; ++ p++; ++ assert(mblength == 1); ++ repetitions = tabsize - column % tabsize; ++ column = (column + repetitions < column ++ ? 0 ++ : column + repetitions); ++ break; ++ ++ case L'\r': ++ column = 0; ++ break; ++ ++ default: ++ column += wcwidth (wc); ++ break; ++ } ++ } ++ ++ if (ig_case) ++ { ++ lo_wc = towlower (wc); ++ if (lo_wc != wc) ++ { ++ no_convert = 1; ++ p += mblength; ++ memset (&state_wc, '\0', sizeof(mbstate_t)); ++ mblength = wcrtomb (mbc, lo_wc, &state_wc); ++ ++ assert (mblength != (size_t)-1 && ++ mblength != (size_t)-2); ++ ++ mblength = (mblength < 1) ? 1 : mblength; ++ } ++ } ++ ++ if (!no_convert) ++ for (i = 0; i < mblength; i++) ++ mbc[i] = *p++; ++ ++ do ++ { ++ for (i = 0; i < mblength; i++) ++ h = HASH (h, mbc[i]); ++ } ++ while (--repetitions != 0); ++ } ++ } ++ break; ++ ++ default: ++ while (1) ++ { ++ if (*p == '\n') ++ { ++ ++p; ++ break; ++ } ++ ++ MBC2WC (p, suffix_begin, mblength, wc, state, convfail); ++ ++ if (convfail) ++ mbc[0] = *p++; ++ else ++ { ++ int flag = 0; ++ ++ if (ig_case) ++ { ++ lo_wc = towlower (wc); ++ if (lo_wc != wc) ++ { ++ flag = 1; ++ p += mblength; ++ memset (&state_wc, '\0', sizeof(mbstate_t)); ++ mblength = wcrtomb (mbc, lo_wc, &state_wc); ++ ++ assert (mblength != (size_t)-1 && ++ mblength != (size_t)-2); ++ ++ mblength = (mblength < 1) ? 1 : mblength; ++ } ++ } ++ ++ if (!flag) ++ { ++ for (i = 0; i < mblength; i++) ++ mbc[i] = *p++; ++ } ++ } ++ ++ for (i = 0; i < mblength; i++) ++ h = HASH (h, mbc[i]); ++ } ++ } ++ } ++ else ++#endif ++ + /* Hash this line until we find a newline. */ + switch (ig_white_space) + { +@@ -390,7 +701,7 @@ find_and_hash_each_line (struct file_dat + else if (!diff_length_compare_anyway) + continue; + +- if (! lines_differ (eqline, ip)) ++ if (! lines_differ (eqline, eqs[i].length + 1, ip, length + 1)) + break; + } + +diff -up diffutils-3.3/src/util.c.i18n diffutils-3.3/src/util.c +--- diffutils-3.3/src/util.c.i18n 2013-02-02 04:39:05.000000000 +0000 ++++ diffutils-3.3/src/util.c 2013-10-23 11:25:18.730708857 +0100 +@@ -408,7 +408,8 @@ finish_output (void) + Return nonzero if the lines differ. */ + + bool +-lines_differ (char const *s1, char const *s2) ++lines_differ_singlebyte (char const *s1, size_t s1len, ++ char const *s2, size_t s2len) + { + register char const *t1 = s1; + register char const *t2 = s2; +@@ -564,6 +565,354 @@ lines_differ (char const *s1, char const + + return true; + } ++ ++#ifdef HANDLE_MULTIBYTE ++# define MBC2WC(T, END, MBLENGTH, WC, STATE, CONVFAIL) \ ++do \ ++ { \ ++ mbstate_t bak = STATE; \ ++ \ ++ CONVFAIL = 0; \ ++ MBLENGTH = mbrtowc (&WC, T, END - T, &STATE); \ ++ \ ++ switch (MBLENGTH) \ ++ { \ ++ case (size_t)-2: \ ++ case (size_t)-1: \ ++ STATE = bak; \ ++ ++CONVFAIL; \ ++ /* Fall through. */ \ ++ case 0: \ ++ MBLENGTH = 1; \ ++ } \ ++ } \ ++ while (0) ++ ++bool ++lines_differ_multibyte (char const *s1, size_t s1len, ++ char const *s2, size_t s2len) ++{ ++ char const *end1, *end2; ++ char c1, c2; ++ wchar_t wc1, wc2, wc1_bak, wc2_bak; ++ size_t mblen1, mblen2; ++ mbstate_t state1, state2, state1_bak, state2_bak; ++ int convfail1, convfail2, convfail1_bak, convfail2_bak; ++ ++ char const *t1 = s1; ++ char const *t2 = s2; ++ char const *t1_bak, *t2_bak; ++ size_t column = 0; ++ ++ if (ignore_white_space == IGNORE_NO_WHITE_SPACE && !ignore_case) ++ { ++ while (*t1 != '\n') ++ if (*t1++ != *t2++) ++ return 1; ++ return 0; ++ } ++ ++ end1 = t1 + s1len; ++ end2 = t2 + s2len; ++ ++ memset (&state1, '\0', sizeof (mbstate_t)); ++ memset (&state2, '\0', sizeof (mbstate_t)); ++ ++ while (1) ++ { ++ c1 = *t1; ++ c2 = *t2; ++ MBC2WC (t1, end1, mblen1, wc1, state1, convfail1); ++ MBC2WC (t2, end2, mblen2, wc2, state2, convfail2); ++ ++ /* Test for exact char equality first, since it's a common case. */ ++ if (convfail1 ^ convfail2) ++ break; ++ else if (convfail1 && convfail2 && c1 != c2) ++ break; ++ else if (!convfail1 && !convfail2 && wc1 != wc2) ++ { ++ switch (ignore_white_space) ++ { ++ case IGNORE_ALL_SPACE: ++ /* For -w, just skip past any white space. */ ++ while (1) ++ { ++ if (convfail1) ++ break; ++ else if (wc1 == L'\n' || !iswspace (wc1)) ++ break; ++ ++ t1 += mblen1; ++ c1 = *t1; ++ MBC2WC (t1, end1, mblen1, wc1, state1, convfail1); ++ } ++ ++ while (1) ++ { ++ if (convfail2) ++ break; ++ else if (wc2 == L'\n' || !iswspace (wc2)) ++ break; ++ ++ t2 += mblen2; ++ c2 = *t2; ++ MBC2WC (t2, end2, mblen2, wc2, state2, convfail2); ++ } ++ t1 += mblen1; ++ t2 += mblen2; ++ break; ++ ++ case IGNORE_SPACE_CHANGE: ++ /* For -b, advance past any sequence of white space in ++ line 1 and consider it just one space, or nothing at ++ all if it is at the end of the line. */ ++ if (wc1 != L'\n' && iswspace (wc1)) ++ { ++ size_t mblen_bak; ++ mbstate_t state_bak; ++ ++ do ++ { ++ t1 += mblen1; ++ mblen_bak = mblen1; ++ state_bak = state1; ++ MBC2WC (t1, end1, mblen1, wc1, state1, convfail1); ++ } ++ while (!convfail1 && (wc1 != L'\n' && iswspace (wc1))); ++ ++ state1 = state_bak; ++ mblen1 = mblen_bak; ++ t1 -= mblen1; ++ convfail1 = 0; ++ wc1 = L' '; ++ } ++ ++ /* Likewise for line 2. */ ++ if (wc2 != L'\n' && iswspace (wc2)) ++ { ++ size_t mblen_bak; ++ mbstate_t state_bak; ++ ++ do ++ { ++ t2 += mblen2; ++ mblen_bak = mblen2; ++ state_bak = state2; ++ MBC2WC (t2, end2, mblen2, wc2, state2, convfail2); ++ } ++ while (!convfail2 && (wc2 != L'\n' && iswspace (wc2))); ++ ++ state2 = state_bak; ++ mblen2 = mblen_bak; ++ t2 -= mblen2; ++ convfail2 = 0; ++ wc2 = L' '; ++ } ++ ++ if (wc1 != wc2) ++ { ++ /* If we went too far when doing the simple test for ++ equality, go back to the first non-whitespace ++ character in both sides and try again. */ ++ if (wc2 == L' ' && wc1 != L'\n' && ++ t1 > s1 && ++ !convfail1_bak && iswspace (wc1_bak)) ++ { ++ t1 = t1_bak; ++ wc1 = wc1_bak; ++ state1 = state1_bak; ++ convfail1 = convfail1_bak; ++ continue; ++ } ++ if (wc1 == L' ' && wc2 != L'\n' ++ && t2 > s2 ++ && !convfail2_bak && iswspace (wc2_bak)) ++ { ++ t2 = t2_bak; ++ wc2 = wc2_bak; ++ state2 = state2_bak; ++ convfail2 = convfail2_bak; ++ continue; ++ } ++ } ++ ++ t1_bak = t1; t2_bak = t2; ++ wc1_bak = wc1; wc2_bak = wc2; ++ state1_bak = state1; state2_bak = state2; ++ convfail1_bak = convfail1; convfail2_bak = convfail2; ++ ++ if (wc1 == L'\n') ++ wc1 = L' '; ++ else ++ t1 += mblen1; ++ ++ if (wc2 == L'\n') ++ wc2 = L' '; ++ else ++ t2 += mblen2; ++ ++ break; ++ ++ case IGNORE_TRAILING_SPACE: ++ case IGNORE_TAB_EXPANSION_AND_TRAILING_SPACE: ++ if (iswspace (wc1) && iswspace (wc2)) ++ { ++ char const *p; ++ wchar_t wc; ++ size_t mblength; ++ int convfail; ++ mbstate_t state; ++ bool just_whitespace_left = 1; ++ if (wc1 != L'\n') ++ { ++ mblength = mblen1; ++ p = t1; ++ memset (&state, '\0', sizeof(mbstate_t)); ++ while (p < end1) ++ { ++ if (*p == '\n') ++ break; ++ ++ p += mblength; ++ MBC2WC (p, end1, mblength, wc, state, convfail); ++ if (convfail || !iswspace (wc)) ++ { ++ just_whitespace_left = 0; ++ break; ++ } ++ } ++ } ++ if (just_whitespace_left && wc2 != L'\n') ++ { ++ mblength = mblen2; ++ p = t2; ++ memset (&state, '\0', sizeof(mbstate_t)); ++ while (p < end2) ++ { ++ if (*p == '\n') ++ break; ++ ++ p += mblength; ++ MBC2WC (p, end2, mblength, wc, state, convfail); ++ if (convfail || !iswspace (wc)) ++ { ++ just_whitespace_left = 0; ++ break; ++ } ++ } ++ } ++ ++ if (just_whitespace_left) ++ /* Both lines have nothing but whitespace left. */ ++ return false; ++ } ++ ++ if (ignore_white_space == IGNORE_TRAILING_SPACE) ++ break; ++ /* Fall through. */ ++ case IGNORE_TAB_EXPANSION: ++ if ((wc1 == L' ' && wc2 == L'\t') ++ || (wc1 == L'\t' && wc2 == L' ')) ++ { ++ size_t column2 = column; ++ ++ while (1) ++ { ++ if (convfail1) ++ { ++ ++t1; ++ break; ++ } ++ else if (wc1 == L' ') ++ column++; ++ else if (wc1 == L'\t') ++ column += tabsize - column % tabsize; ++ else ++ { ++ t1 += mblen1; ++ break; ++ } ++ ++ t1 += mblen1; ++ c1 = *t1; ++ MBC2WC (t1, end1, mblen1, wc1, state1, convfail1); ++ } ++ ++ while (1) ++ { ++ if (convfail2) ++ { ++ ++t2; ++ break; ++ } ++ else if (wc2 == L' ') ++ column2++; ++ else if (wc2 == L'\t') ++ column2 += tabsize - column2 % tabsize; ++ else ++ { ++ t2 += mblen2; ++ break; ++ } ++ ++ t2 += mblen2; ++ c2 = *t2; ++ MBC2WC (t2, end2, mblen2, wc2, state2, convfail2); ++ } ++ ++ if (column != column2) ++ return 1; ++ } ++ else ++ { ++ t1 += mblen1; ++ t2 += mblen2; ++ } ++ break; ++ ++ case IGNORE_NO_WHITE_SPACE: ++ t1 += mblen1; ++ t2 += mblen2; ++ break; ++ } ++ ++ /* Lowercase all letters if -i is specified. */ ++ if (ignore_case) ++ { ++ if (!convfail1) ++ wc1 = towlower (wc1); ++ if (!convfail2) ++ wc2 = towlower (wc2); ++ } ++ ++ if (convfail1 ^ convfail2) ++ break; ++ else if (convfail1 && convfail2 && c1 != c2) ++ break; ++ else if (!convfail1 && !convfail2 && wc1 != wc2) ++ break; ++ } ++ else ++ { ++ t1_bak = t1; t2_bak = t2; ++ wc1_bak = wc1; wc2_bak = wc2; ++ state1_bak = state1; state2_bak = state2; ++ convfail1_bak = convfail1; convfail2_bak = convfail2; ++ ++ t1 += mblen1; t2 += mblen2; ++ } ++ ++ if (!convfail1 && wc1 == L'\n') ++ return 0; ++ ++ column += convfail1 ? 1 : ++ (wc1 == L'\t') ? tabsize - column % tabsize : wcwidth (wc1); ++ } ++ ++ return 1; ++} ++#endif + + /* Find the consecutive changes at the start of the script START. + Return the last link before the first gap. */ diff --git a/SOURCES/diffutils-mkdir_p.patch b/SOURCES/diffutils-mkdir_p.patch new file mode 100644 index 0000000..78d29eb --- /dev/null +++ b/SOURCES/diffutils-mkdir_p.patch @@ -0,0 +1,12 @@ +diff -up diffutils-3.3/po/Makefile.in.in.mkdir_p diffutils-3.3/po/Makefile.in.in +--- diffutils-3.3/po/Makefile.in.in.mkdir_p 2013-03-26 11:25:58.869375066 +0000 ++++ diffutils-3.3/po/Makefile.in.in 2013-03-26 11:26:00.114379442 +0000 +@@ -42,7 +42,7 @@ INSTALL_DATA = @INSTALL_DATA@ + mkinstalldirs = $(SHELL) @install_sh@ -d + install_sh = $(SHELL) @install_sh@ + MKDIR_P = @MKDIR_P@ +-mkdir_p = @mkdir_p@ ++mkdir_p = @MKDIR_P@ + + GMSGFMT_ = @GMSGFMT@ + GMSGFMT_no = @GMSGFMT@ diff --git a/SPECS/diffutils.spec b/SPECS/diffutils.spec new file mode 100644 index 0000000..b08c54c --- /dev/null +++ b/SPECS/diffutils.spec @@ -0,0 +1,320 @@ +Summary: A GNU collection of diff utilities +Name: diffutils +Version: 3.3 +Release: 5%{?dist} +Group: Applications/Text +URL: http://www.gnu.org/software/diffutils/diffutils.html +Source: ftp://ftp.gnu.org/gnu/diffutils/diffutils-%{version}.tar.xz +Patch1: diffutils-cmp-s-empty.patch +Patch2: diffutils-mkdir_p.patch +Patch4: diffutils-i18n.patch +Patch5: diffutils-3.3-diffseq.patch +License: GPLv3+ +Requires(post): info +Requires(preun): info +Provides: bundled(gnulib) +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildRequires: help2man + +%description +Diffutils includes four utilities: diff, cmp, diff3 and sdiff. Diff +compares two files and shows the differences, line by line. The cmp +command shows the offset and line numbers where two files differ, or +cmp can show the characters that differ between the two files. The +diff3 command shows the differences between three files. Diff3 can be +used when two people have made independent changes to a common +original; diff3 can produce a merged file that contains both sets of +changes and warnings about conflicts. The sdiff command can be used +to merge two files interactively. + +Install diffutils if you need to compare text files. + +%prep +%setup -q +# For 'cmp -s', compare file sizes only if both non-zero (bug #563618). +%patch1 -p1 -b .cmp-s-empty + +# Work around @mkdir_p@ build issue. +%patch2 -p1 -b .mkdir_p + +%patch4 -p1 -b .i18n + +%patch5 -p1 -b .diffseq + +%build +%configure +make PR_PROGRAM=%{_bindir}/pr + +%install +rm -rf $RPM_BUILD_ROOT +make DESTDIR=$RPM_BUILD_ROOT install + +rm -f $RPM_BUILD_ROOT%{_infodir}/dir +%find_lang %{name} + +%check +make check + +%post +/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || : + +%preun +if [ $1 = 0 ]; then + /sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || : +fi + +%clean +rm -rf $RPM_BUILD_ROOT + +%files -f %{name}.lang +%defattr(-,root,root) +%doc COPYING NEWS README +%{_bindir}/* +%{_mandir}/*/* +%{_infodir}/diffutils.info*gz + +%changelog +* Wed Nov 21 2018 Than Ngo - 3.3-5 +- Resolves: #1611281, diff -y produces garbage + +* Fri Jan 24 2014 Daniel Mach - 3.3-4 +- Mass rebuild 2014-01-24 + +* Fri Dec 27 2013 Daniel Mach - 3.3-3 +- Mass rebuild 2013-12-27 + +* Wed Oct 23 2013 Tim Waugh 3.3-2 +- Fixed multibyte handling logic for diff -Z (bug #1022417). + +* Tue Mar 26 2013 Tim Waugh 3.3-1 +- 3.3 (bug #927560). + +* Fri Feb 22 2013 Tim Waugh 3.2-13 +- Fixed i18n handling of 'diff -E' (bug #914666). + +* Wed Feb 13 2013 Fedora Release Engineering - 3.2-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Fri Oct 26 2012 Tim Waugh 3.2-11 +- Ported i18n patch and reinstated it (bug #870460). + +* Wed Sep 19 2012 Tim Waugh 3.2-10 +- Fixed license as current source says GPLv3+. + +* Mon Jul 23 2012 Tim Waugh 3.2-9 +- Fixed build failure. + +* Wed Jul 18 2012 Fedora Release Engineering - 3.2-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Mon May 21 2012 Tim Waugh 3.2-7 +- Provides bundled(gnulib) (bug #821751). + +* Fri Jan 13 2012 Fedora Release Engineering - 3.2-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Thu Dec 8 2011 Tim Waugh 3.2-5 +- Fix bug #747969 again. + +* Tue Nov 29 2011 Tim Waugh 3.2-4 +- Real fix for bug #747969: the diffutils info file changed name in + 3.1. Updated the scriptlets to install/remove the correct filename + from the info directory. + +* Fri Nov 25 2011 Tim Waugh 3.2-3 +- Fixed up reference to info page in man pages (bug #747969). + +* Fri Nov 25 2011 Tim Waugh 3.2-2 +- Applied upstream gnulib fix for float test on ppc, as well as + correction for LDBL_MANT_DIG definition (bug #733536). + +* Fri Sep 2 2011 Tim Waugh 3.2-1 +- 3.2. + +* Thu Aug 11 2011 Tim Waugh 3.1-1 +- 3.1. + +* Wed Apr 13 2011 Tim Waugh 3.0-1 +- 3.0 (bug #566482). +- The i18n patch is dropped for the time being. + +* Tue Feb 08 2011 Fedora Release Engineering - 2.8.1-30 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Fri Jun 25 2010 Tim Waugh 2.8.1-29 +- For 'cmp -s', compare file sizes only if both non-zero (bug #563618). + +* Wed Apr 21 2010 Tim Waugh - 2.8.1-28 +- Build requires help2man (bug #577325). Fixes empty diff man page. + +* Wed Mar 3 2010 Tim Waugh - 2.8.1-27 +- Added comments for all patches. + +* Wed Mar 3 2010 Tim Waugh - 2.8.1-26 +- Use upstream man pages. +- Ship COPYING file. + +* Tue Aug 11 2009 Tim Waugh 2.8.1-25 +- Only try to install the info file if it exists so that package + installation does not fail with --excludedocs (bug #515919). + +* Fri Jul 24 2009 Fedora Release Engineering - 2.8.1-24 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Tue Feb 24 2009 Fedora Release Engineering - 2.8.1-23 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Fri Feb 13 2009 Tim Waugh 2.8.1-22 +- Fixed 'sdiff -E' (bug #484892). + +* Wed Feb 13 2008 Tim Waugh 2.8.1-21 +- Rebuild for GCC 4.3. + +* Wed Jan 2 2008 Tim Waugh 2.8.1-20 +- Converted spec file to UTF-8 (bug #225696). +- Fixed summary (bug #225696). +- Fixed PreReq (bug #225696). +- Removed Prefix (bug #225696). +- Fixed build root (bug #225696). +- Avoid %%makeinstall (bug #225696). +- Fixed license tag (bug #225696). + +* Tue Nov 6 2007 Tim Waugh 2.8.1-19 +- Rebuilt. + +* Tue Nov 6 2007 Tim Waugh 2.8.1-18 +- Fixed multibyte speed improvement patch (bug #363831). + +* Tue Aug 14 2007 Tim Waugh 2.8.1-17 +- Multibyte speed improvement (bug #252117). + +* Mon Jan 22 2007 Tim Waugh 2.8.1-16 +- Make scriptlet unconditionally succeed (bug #223683). + +* Wed Jul 12 2006 Jesse Keating - 2.8.1-15.2.2 +- rebuild + +* Fri Feb 10 2006 Jesse Keating - 2.8.1-15.2.1 +- bump again for double-long bug on ppc(64) + +* Tue Feb 07 2006 Jesse Keating - 2.8.1-15.2 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Fri Dec 09 2005 Jesse Keating +- rebuilt + +* Wed Apr 6 2005 Tim Waugh 2.8.1-15 +- Fixed sdiff exit code handling (bug #152967). + +* Wed Mar 2 2005 Tim Waugh 2.8.1-14 +- Rebuild for new GCC. + +* Wed Feb 9 2005 Tim Waugh 2.8.1-13 +- Rebuilt. + +* Tue Jun 15 2004 Elliot Lee +- rebuilt + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Thu Jan 8 2004 Tim Waugh 2.8.1-10 +- Fix mistaken use of '|' instead of '||'. + +* Sat Oct 25 2003 Tim Waugh 2.8.1-9 +- Rebuilt. + +* Tue Jun 17 2003 Tim Waugh 2.8.1-8 +- Rebuilt. + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Wed Jan 22 2003 Tim Powers +- rebuilt + +* Tue Nov 19 2002 Tim Waugh 2.8.1-5 +- i18n patch. + +* Tue Oct 22 2002 Tim Waugh 2.8.1-4 +- Ship translations. + +* Fri Jun 21 2002 Tim Powers +- automated rebuild + +* Thu May 23 2002 Tim Powers +- automated rebuild + +* Mon Apr 22 2002 Tim Waugh 2.8.1-1 +- 2.8.1. +- No longer need immunix-owl-tmp patch. + +* Wed Feb 27 2002 Tim Waugh 2.7.2-5 +- Rebuild in new environment. + +* Wed Jan 09 2002 Tim Powers +- automated rebuild + +* Fri Nov 02 2001 Tim Waugh 2.7.2-3 +- Make sure %%post scriplet doesn't fail if --excludedocs is used. + +* Fri Jun 01 2001 Tim Waugh 2.7.2-2 +- Install diff.1, since it's no longer in man-pages. + +* Fri Mar 30 2001 Tim Waugh 2.7.2-1 +- 2.7.2. + +* Wed Jul 12 2000 Prospector +- automatic rebuild + +* Thu Jul 06 2000 Trond Eivind Glomsrød +- fix %%changelog entries (escape them) +- update source location +- remove manual stripping +- add URL + +* Tue Jun 06 2000 Than Ngo +- add %%defattr +- use rpm macros + +* Wed May 31 2000 Ngo Than +- put man pages and info files in correct place +- cleanup specfile + +* Thu Feb 03 2000 Preston Brown +- rebuild to gzip man pages. + +* Mon Apr 19 1999 Jeff Johnson +- man pages not in %%files. +- but avoid conflict for diff.1 + +* Sun Mar 21 1999 Cristian Gafton +- auto rebuild in the new build environment (release 14) + +* Sun Mar 14 1999 Jeff Johnson +- add man pages (#831). +- add %%configure and Prefix. + +* Thu Dec 17 1998 Cristian Gafton +- build for glibc 2.1 + +* Tue Jul 14 1998 Bill Kawakami +- included the four man pages stolen from Slackware + +* Tue May 05 1998 Prospector System +- translations modified for de, fr, tr + +* Sun May 03 1998 Cristian Gafton +- fixed spec file to reference/use the $RPM_BUILD_ROOT always + +* Wed Dec 31 1997 Otto Hammersmith +- fixed where it looks for 'pr' (/usr/bin, rather than /bin) + +* Fri Oct 17 1997 Donnie Barnes +- added BuildRoot + +* Sun Sep 14 1997 Erik Troan +- uses install-info + +* Mon Jun 02 1997 Erik Troan +- built against glibc