Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ugrep for openSUSE:Factory checked in at 2026-09-16 17:44:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ugrep (Old) and /work/SRC/openSUSE:Factory/.ugrep.new.383539 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ugrep" Wed Sep 16 17:44:17 2026 rev:95 rq:1378211 version:7.8.5 Changes: -------- --- /work/SRC/openSUSE:Factory/ugrep/ugrep.changes 2026-08-06 16:28:27.357515759 +0200 +++ /work/SRC/openSUSE:Factory/.ugrep.new.383539/ugrep.changes 2026-09-16 17:48:24.876233129 +0200 @@ -1,0 +2,15 @@ +Tue Sep 15 18:09:07 UTC 2026 - Andreas Stieger <[email protected]> + +- Update to version 7.8.5: + * update option --encoding=CP437 to retain LF (10) and CR (13) + codes in the output + * fix a rare edge case for the --encoding option when internally + converting a specified code page or a utf-encoding to UTF-8 + * update option -z (--decompress) for reasonable xz/lzma decoding + limits + * update matching mode flags -E, -F, -G, and -P to respect order + on the command line to permit overriding (like BSD grep) + * output an error message when regex matching mode flags are used + in a config file, instead of silently ignoring them + +------------------------------------------------------------------- Old: ---- ugrep-7.8.4.obscpio New: ---- ugrep-7.8.5.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ugrep.spec ++++++ --- /var/tmp/diff_new_pack.nT0a5X/_old 2026-09-16 17:48:26.068282916 +0200 +++ /var/tmp/diff_new_pack.nT0a5X/_new 2026-09-16 17:48:26.071283041 +0200 @@ -23,7 +23,7 @@ %bcond_without fish %endif Name: ugrep -Version: 7.8.4 +Version: 7.8.5 Release: 0 Summary: Universal grep: a feature-rich grep implementation with focus on speed License: BSD-3-Clause ++++++ _service ++++++ --- /var/tmp/diff_new_pack.nT0a5X/_old 2026-09-16 17:48:26.107284545 +0200 +++ /var/tmp/diff_new_pack.nT0a5X/_new 2026-09-16 17:48:26.112284754 +0200 @@ -5,7 +5,7 @@ <param name="changesgenerate">enable</param> <param name="filename">ugrep</param> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">v7.8.4</param> + <param name="revision">v7.8.5</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="versionrewrite-replacement">\1</param> </service> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.nT0a5X/_old 2026-09-16 17:48:26.141285965 +0200 +++ /var/tmp/diff_new_pack.nT0a5X/_new 2026-09-16 17:48:26.146286174 +0200 @@ -1,7 +1,7 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/Genivia/ugrep.git</param> - <param name="changesrevision">550599a6434fc5315fb6ecd415a5d859e6d846a8</param> + <param name="changesrevision">f2cc252c011460f6c75b1fb591813b4b6b59c225</param> </service> </servicedata> (No newline at EOF) ++++++ ugrep-7.8.4.obscpio -> ugrep-7.8.5.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/.github/workflows/codeql.yml new/ugrep-7.8.5/.github/workflows/codeql.yml --- old/ugrep-7.8.4/.github/workflows/codeql.yml 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/.github/workflows/codeql.yml 2026-09-15 13:41:49.000000000 +0200 @@ -27,16 +27,16 @@ uses: actions/checkout@v7 - name: Initialize CodeQL - uses: github/codeql-action/[email protected] + uses: github/codeql-action/[email protected] with: languages: ${{ matrix.language }} config-file: .github/config.yml - name: Autobuild - uses: github/codeql-action/[email protected] + uses: github/codeql-action/[email protected] - name: Perform CodeQL Analysis - uses: github/codeql-action/[email protected] + uses: github/codeql-action/[email protected] with: upload: false # disable the upload here - we will upload in a different action output: sarif-results @@ -55,6 +55,6 @@ output: sarif-results/${{ matrix.language }}.sarif - name: Upload SARIF - uses: github/codeql-action/[email protected] + uses: github/codeql-action/[email protected] with: sarif_file: sarif-results/${{ matrix.language }}.sarif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/CONTRIBUTING.md new/ugrep-7.8.5/CONTRIBUTING.md --- old/ugrep-7.8.4/CONTRIBUTING.md 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/CONTRIBUTING.md 2026-09-15 13:41:49.000000000 +0200 @@ -39,6 +39,12 @@ Contributions are covered under the [BSD-3 license](LICENSE.txt). -Thanks! +Authenticity: no AI was used in the creation of the ugrep source code and +documentation. Contributions must be authored by the submitter, with a few +exceptions such as porting changes from another fork while maintaining +attributions. Contents sourced from AI tools such as LLMs, including but not +limited to documentation files, source code, and configuration scrips, are not +permitted as they are unauthored and based on (trained on) copyright-protected +sources. -Robert van Engelen, Genivia Inc. +Thanks! diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/README.md new/ugrep-7.8.5/README.md --- old/ugrep-7.8.4/README.md 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/README.md 2026-09-15 13:41:49.000000000 +0200 @@ -5541,7 +5541,7 @@ BUGS Report bugs at: <https://github.com/Genivia/ugrep/issues> - ugrep 7.8.4 August 5, 2026 UGREP(1) + ugrep 7.8.5 September 15, 2026 UGREP(1) 🔝 [Back to table of contents](#toc) Binary files old/ugrep-7.8.4/bin/win32/ug.exe and new/ugrep-7.8.5/bin/win32/ug.exe differ Binary files old/ugrep-7.8.4/bin/win32/ugrep-indexer.exe and new/ugrep-7.8.5/bin/win32/ugrep-indexer.exe differ Binary files old/ugrep-7.8.4/bin/win32/ugrep.exe and new/ugrep-7.8.5/bin/win32/ugrep.exe differ Binary files old/ugrep-7.8.4/bin/win64/ug.exe and new/ugrep-7.8.5/bin/win64/ug.exe differ Binary files old/ugrep-7.8.4/bin/win64/ugrep-indexer.exe and new/ugrep-7.8.5/bin/win64/ugrep-indexer.exe differ Binary files old/ugrep-7.8.4/bin/win64/ugrep.exe and new/ugrep-7.8.5/bin/win64/ugrep.exe differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/configure new/ugrep-7.8.5/configure --- old/ugrep-7.8.4/configure 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/configure 2026-09-15 13:41:49.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.73 for ugrep 7.8.4. +# Generated by GNU Autoconf 2.73 for ugrep 7.8.5. # # Report bugs to <https://github.com/Genivia/ugrep/issues>. # @@ -590,8 +590,8 @@ # Identity of this package. PACKAGE_NAME='ugrep' PACKAGE_TARNAME='ugrep' -PACKAGE_VERSION='7.8.4' -PACKAGE_STRING='ugrep 7.8.4' +PACKAGE_VERSION='7.8.5' +PACKAGE_STRING='ugrep 7.8.5' PACKAGE_BUGREPORT='https://github.com/Genivia/ugrep/issues' PACKAGE_URL='https://ugrep.com' @@ -1369,7 +1369,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures ugrep 7.8.4 to adapt to many kinds of systems. +'configure' configures ugrep 7.8.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1440,7 +1440,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ugrep 7.8.4:";; + short | recursive ) echo "Configuration of ugrep 7.8.5:";; esac cat <<\_ACEOF @@ -1618,7 +1618,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ugrep configure 7.8.4 +ugrep configure 7.8.5 generated by GNU Autoconf 2.73 Copyright (C) 2026 Free Software Foundation, Inc. @@ -2172,7 +2172,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ugrep $as_me 7.8.4, which was +It was created by ugrep $as_me 7.8.5, which was generated by GNU Autoconf 2.73. Invocation command line was $ $0$ac_configure_args_raw @@ -3786,7 +3786,7 @@ # Define the identity of the package. PACKAGE='ugrep' - VERSION='7.8.4' + VERSION='7.8.5' printf '%s\n' "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -11945,7 +11945,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by ugrep $as_me 7.8.4, which was +This file was extended by ugrep $as_me 7.8.5, which was generated by GNU Autoconf 2.73. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12018,7 +12018,7 @@ cat >>"$CONFIG_STATUS" <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -ugrep config.status 7.8.4 +ugrep config.status 7.8.5 configured by $0, generated by GNU Autoconf 2.73, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/configure.ac new/ugrep-7.8.5/configure.ac --- old/ugrep-7.8.4/configure.ac 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/configure.ac 2026-09-15 13:41:49.000000000 +0200 @@ -1,4 +1,4 @@ -AC_INIT([ugrep],[7.8.4],[https://github.com/Genivia/ugrep/issues],[ugrep],[https://ugrep.com]) +AC_INIT([ugrep],[7.8.5],[https://github.com/Genivia/ugrep/issues],[ugrep],[https://ugrep.com]) AM_INIT_AUTOMAKE([foreign subdir-objects dist-xz no-dist-gzip]) AC_CONFIG_HEADERS([config.h]) AC_COPYRIGHT([Copyright (C) 2019-2026 Robert van Engelen, Genivia Inc.]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/lib/convert.cpp new/ugrep-7.8.5/lib/convert.cpp --- old/ugrep-7.8.4/lib/convert.cpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/lib/convert.cpp 2026-09-15 13:41:49.000000000 +0200 @@ -401,7 +401,7 @@ { if (ranges.find('\n') != ranges.end()) nl = true; - if (is_modified(mod, 'i') || (is_modified(mod, 'a') && is_modified(mod, 'u') && ranges.hi() > 0x7F)) + if (is_modified(mod, 'a') && is_modified(mod, 'u') && ranges.hi() > 0x7F) convert_anycase_ranges(ranges); if (is_modified(mod, 'u') && ranges.hi() > 0x7F) return convert_unicode_ranges(ranges, flags, signature, par); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/lib/input.cpp new/ugrep-7.8.5/lib/input.cpp --- old/ugrep-7.8.4/lib/input.cpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/lib/input.cpp 2026-09-15 13:41:49.000000000 +0200 @@ -54,9 +54,9 @@ const unsigned short codepages[38][256] = { - // DOS CP 437 to Unicode + // DOS CP 437 to Unicode, but preserve 0 (NUL), 10 (LF), 13 (CR) { - 0,0x263A,0x263B,0x2665,0x2666,0x2663,0x2660,0x2022,0x25D8,0x25CB,0x25D9,0x2642,0x2640,0x266A,0x266B,0x263C, + 0,0x263A,0x263B,0x2665,0x2666,0x2663,0x2660,0x2022,0x25D8,0x25CB, 10,0x2642,0x2640, 13,0x266B,0x263C, 0x25BA,0x25C4,0x2195,0x203C,0x00B6,0x00A7,0x25AC,0x21A8,0x2191,0x2193,0x2192,0x2190,0x221F,0x2194,0x25B2,0x25BC, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, @@ -791,7 +791,7 @@ { std::memcpy(t, utf8_, n); uidx_ = static_cast<unsigned short>(n); - ulen_ = static_cast<unsigned short>(l); + ulen_ = static_cast<unsigned short>(l - n); t += n; n = 0; } @@ -830,7 +830,7 @@ { std::memcpy(t, utf8_, n); uidx_ = static_cast<unsigned short>(n); - ulen_ = static_cast<unsigned short>(l); + ulen_ = static_cast<unsigned short>(l - n); t += n; n = 0; } @@ -861,7 +861,7 @@ { std::memcpy(t, utf8_, n); uidx_ = static_cast<unsigned short>(n); - ulen_ = static_cast<unsigned short>(l); + ulen_ = static_cast<unsigned short>(l - n); t += n; n = 0; } @@ -892,7 +892,7 @@ { std::memcpy(t, utf8_, n); uidx_ = static_cast<unsigned short>(n); - ulen_ = static_cast<unsigned short>(l); + ulen_ = static_cast<unsigned short>(l - n); t += n; n = 0; } @@ -929,7 +929,7 @@ else { uidx_ = 1; - ulen_ = 2; + ulen_ = 1; } } } @@ -983,7 +983,7 @@ { std::memcpy(t, utf8_, n); uidx_ = static_cast<unsigned short>(n); - ulen_ = static_cast<unsigned short>(l); + ulen_ = static_cast<unsigned short>(l - n); t += n; n = 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/man/ug.1 new/ugrep-7.8.5/man/ug.1 --- old/ugrep-7.8.4/man/ug.1 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/man/ug.1 2026-09-15 13:41:49.000000000 +0200 @@ -1,4 +1,4 @@ -.TH UGREP "1" "August 05, 2026" "ugrep 7.8.4" "User Commands" +.TH UGREP "1" "September 15, 2026" "ugrep 7.8.5" "User Commands" .SH NAME \fBugrep\fR, \fBug\fR -- file pattern searcher .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/man/ugrep-indexer.1 new/ugrep-7.8.5/man/ugrep-indexer.1 --- old/ugrep-7.8.4/man/ugrep-indexer.1 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/man/ugrep-indexer.1 2026-09-15 13:41:49.000000000 +0200 @@ -1,4 +1,4 @@ -.TH UGREP-INDEXER "1" "August 05, 2026" "ugrep-indexer 7.8.4" "User Commands" +.TH UGREP-INDEXER "1" "September 15, 2026" "ugrep-indexer 7.8.5" "User Commands" .SH NAME \fBugrep-indexer\fR -- file indexer to accelerate recursive searching .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/man/ugrep.1 new/ugrep-7.8.5/man/ugrep.1 --- old/ugrep-7.8.4/man/ugrep.1 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/man/ugrep.1 2026-09-15 13:41:49.000000000 +0200 @@ -1,4 +1,4 @@ -.TH UGREP "1" "August 05, 2026" "ugrep 7.8.4" "User Commands" +.TH UGREP "1" "September 15, 2026" "ugrep 7.8.5" "User Commands" .SH NAME \fBugrep\fR, \fBug\fR -- file pattern searcher .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/src/cnf.cpp new/ugrep-7.8.5/src/cnf.cpp --- old/ugrep-7.8.4/src/cnf.cpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/src/cnf.cpp 2026-09-15 13:41:49.000000000 +0200 @@ -94,7 +94,7 @@ bool parens = false; - if (*pattern == '(' && (flag_fixed_strings || pattern[1] != '?')) + if (*pattern == '(' && (flag_mode == Mode::FIXED || pattern[1] != '?')) { // check if matching ending ) is followed by spacing or EOS or |, then it is OK to parse '(' <parse1> ')' and convert to CNF int level = 0; @@ -120,7 +120,7 @@ --level; } - else if (*lookahead == '[' && !flag_fixed_strings) + else if (*lookahead == '[' && flag_mode != Mode::FIXED) { // skip [...] ++lookahead; @@ -196,7 +196,7 @@ } // if not -x then quote the string with \Q and \E - if (!flag_fixed_strings) + if (flag_mode != Mode::FIXED) quote(quoted); regex.append(quoted); @@ -206,7 +206,7 @@ pattern = lookahead; } - else if (*lookahead == '[' && !flag_fixed_strings) + else if (*lookahead == '[' && flag_mode != Mode::FIXED) { // skip [...] ++lookahead; @@ -256,7 +256,7 @@ if (flag_line_regexp && regex.empty()) regex.assign("^$"); - else if (flag_fixed_strings) + else if (flag_mode == Mode::FIXED) quote(regex); // -w and -x @@ -418,7 +418,7 @@ { // pop unused ending '|' (or BRE '\|') terms.pop_back(); - if (flag_basic_regexp) + if (flag_mode == Mode::BRE) terms.pop_back(); } } @@ -462,7 +462,7 @@ else if (regex.empty()) term.front()->clear(); // empty pattern means anything matches else - term.front()->append(flag_basic_regexp ? "\\|" : "|").append(regex); + term.front()->append(flag_mode == Mode::BRE ? "\\|" : "|").append(regex); // empty pattern means anything matches if (term.front()->empty()) @@ -492,7 +492,7 @@ std::string spattern(pattern); // -F - if (flag_fixed_strings) + if (flag_mode == Mode::FIXED) quote(spattern); // -w and -x @@ -526,7 +526,7 @@ else if (spattern.empty()) term.front()->clear(); // empty pattern means anything matches else - term.front()->append(flag_basic_regexp ? "\\|" : "|").append(spattern); + term.front()->append(flag_mode == Mode::BRE ? "\\|" : "|").append(spattern); // empty pattern means anything matches if (term.front()->empty()) @@ -566,7 +566,7 @@ if (flag_bool) return; - const char *sep = flag_fixed_strings ? "\\E|\\Q" : flag_basic_regexp ? "\\|" : "|"; + const char *sep = flag_mode == Mode::FIXED ? "\\E|\\Q" : flag_mode == Mode::BRE ? "\\|" : "|"; for (auto& i : terms) { @@ -644,7 +644,7 @@ bool or_sep = false; - if (flag_fixed_strings) + if (flag_mode == Mode::FIXED) fprintf(output, "a string in "); else fprintf(output, "a pattern in "); @@ -731,7 +731,7 @@ std::string CNF::adjoin() const { std::string adjoined; - const char *sep = flag_basic_regexp ? "\\|" : "|"; + const char *sep = flag_mode == Mode::BRE ? "\\|" : "|"; if (flag_files) { @@ -765,7 +765,7 @@ { // pop unused ending '|' (or BRE '\|') adjoined.pop_back(); - if (flag_basic_regexp) + if (flag_mode == Mode::BRE) adjoined.pop_back(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/src/cnf.hpp new/ugrep-7.8.5/src/cnf.hpp --- old/ugrep-7.8.4/src/cnf.hpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/src/cnf.hpp 2026-09-15 13:41:49.000000000 +0200 @@ -178,14 +178,14 @@ { // -x: make the regex line-anchored // -G requires \( \) instead of ( ) - const char *xleft = flag_basic_regexp ? "^\\(" : "^(?:"; - const char *xright = flag_basic_regexp ? "\\)$" : ")$"; + const char *xleft = flag_mode == Mode::BRE ? "^\\(" : "^(?:"; + const char *xright = flag_mode == Mode::BRE ? "\\)$" : ")$"; pattern.insert(0, xleft).append(xright); } else if (flag_word_regexp) { // -w: make the regex word-anchored (or implicitly done with matcher option W instead of \< and \>) - if (flag_perl_regexp) + if (flag_mode == Mode::PERL) { // -P requires (?<!\w) (?!\w) instead of \< and \> #if defined(HAVE_PCRE2) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/src/flag.hpp new/ugrep-7.8.5/src/flag.hpp --- old/ugrep-7.8.4/src/flag.hpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/src/flag.hpp 2026-09-15 13:41:49.000000000 +0200 @@ -68,10 +68,12 @@ // -D, --devices and -d, --directories enum class Action { UNSP, SKIP, READ, RECURSE }; +// -E (default), -G, -F, -P matching modes +enum class Mode { UNSP, ERE, BRE, FIXED, PERL }; + // ugrep command-line options extern bool flag_all_threads; // internal flag extern bool flag_any_line; -extern bool flag_basic_regexp; extern bool flag_best_match; extern bool flag_bool; extern bool flag_color_term; // internal flag @@ -85,7 +87,6 @@ extern bool flag_files; extern bool flag_files_with_matches; extern bool flag_files_without_match; -extern bool flag_fixed_strings; extern bool flag_glob_ignore_case; extern bool flag_grep; // internal flag extern bool flag_hex; @@ -110,7 +111,6 @@ extern bool flag_null_data; extern bool flag_only_line_number; extern bool flag_only_matching; -extern bool flag_perl_regexp; extern bool flag_query; extern bool flag_quiet; extern bool flag_sort_rev; // internal flag @@ -141,6 +141,7 @@ extern Sort flag_sort_key; // internal flag extern Action flag_devices_action; // internal flag extern Action flag_directories_action; // internal flag +extern Mode flag_mode; extern size_t flag_after_context; extern size_t flag_before_context; extern size_t flag_delay; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/src/query.cpp new/ugrep-7.8.5/src/query.cpp --- old/ugrep-7.8.4/src/query.cpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/src/query.cpp 2026-09-15 13:41:49.000000000 +0200 @@ -190,7 +190,7 @@ ++look; } } - else if (!flag_fixed_strings) + else if (flag_mode != ::Mode::FIXED) { for (const char *look = line_; look < ptr; ++look) { @@ -319,7 +319,7 @@ ptr = ++next + 1; } } - else if (!flag_fixed_strings) + else if (flag_mode != ::Mode::FIXED) { if (ch == '[' && !list && !literal && !braced) { @@ -387,7 +387,7 @@ } else if (strchr("$()*+.?^|", ch) != NULL && !list && !literal && !braced) { - if (!flag_basic_regexp || strchr("()+?|", ch) == NULL) + if (flag_mode != ::Mode::BRE || strchr("()+?|", ch) == NULL) { Screen::put(ptr, next - ptr); Screen::normal(); @@ -420,7 +420,7 @@ if (prev == ' ' || prev == '|' || prev == '(' || prev == -1) { if (ch == '-' || - (flag_fixed_strings && (ch == '(' || ch == ')' || ch == '|')) || + (flag_mode == ::Mode::FIXED && (ch == '(' || ch == ')' || ch == '|')) || strncmp(next, "AND ", 4) == 0 || strncmp(next, "OR ", 3) == 0 || strncmp(next, "NOT ", 4) == 0) @@ -438,7 +438,7 @@ ch = ' '; } } - else if (flag_fixed_strings && + else if (flag_mode == ::Mode::FIXED && (ch == '|' || (ch == ')' && (next + 1 >= end || next[1] == ' ' || next[1] == '|' || next[1] == ')')))) { @@ -1949,7 +1949,7 @@ error_ -= 4 + flag_ignore_case + flag_dotall + flag_free_space; // subtract 2 for -F - if (flag_fixed_strings && error_ >= 2) + if (flag_mode == ::Mode::FIXED && error_ >= 2) error_ -= 2; // subtract 2 or 3 for -x or -w @@ -3936,8 +3936,8 @@ flags_[2].flag = flag_byte_offset; flags_[3].flag = flag_after_context > 0 && flag_before_context > 0; flags_[4].flag = flag_count; - flags_[5].flag = flag_fixed_strings; - flags_[6].flag = flag_basic_regexp; + flags_[5].flag = flag_mode == ::Mode::FIXED; + flags_[6].flag = flag_mode == ::Mode::BRE; flags_[7].flag = !globs_.empty(); flags_[8].flag = flag_with_filename; flags_[9].flag = flag_no_filename; @@ -3948,7 +3948,7 @@ flags_[14].flag = flag_files_with_matches; flags_[15].flag = flag_line_number; flags_[16].flag = flag_only_matching; - flags_[17].flag = flag_perl_regexp; + flags_[17].flag = flag_mode == ::Mode::PERL; flags_[18].flag = flag_directories_action == Action::RECURSE && flag_dereference; flags_[19].flag = flag_directories_action == Action::RECURSE && !flag_dereference; flags_[20].flag = flag_initial_tab; @@ -4047,8 +4047,7 @@ } flag_byte_offset = flags_[2].flag; flag_count = flags_[4].flag; - flag_fixed_strings = flags_[5].flag; - flag_basic_regexp = flags_[6].flag; + flag_mode = flags_[6].flag ? ::Mode::BRE : flags_[5].flag ? ::Mode::FIXED : flags_[17].flag ? ::Mode::PERL : ::Mode::ERE; flag_glob.clear(); flag_iglob.clear(); if (globbing_) @@ -4065,7 +4064,6 @@ flag_files_with_matches = flags_[14].flag; flag_line_number = flags_[15].flag; flag_only_matching = flags_[16].flag; - flag_perl_regexp = flags_[17].flag; if (flags_[18].flag) flag_directories_action = Action::RECURSE, flag_dereference = true; else if (flags_[19].flag) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/src/stats.cpp new/ugrep-7.8.5/src/stats.cpp --- old/ugrep-7.8.4/src/stats.cpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/src/stats.cpp 2026-09-15 13:41:49.000000000 +0200 @@ -100,16 +100,18 @@ for (const auto& i : flag_config_files) fprintf(output, " using %s" NEWLINESTR, i.c_str()); } + if (flag_fuzzy > 0) + fprintf(output, " --fuzzy" NEWLINESTR); if (flag_bool) fprintf(output, " --bool %s" NEWLINESTR, (flag_files ? "--files" : "--lines")); - if (flag_basic_regexp) + if (flag_mode == Mode::BRE) fprintf(output, " --basic-regexp" NEWLINESTR); - else if (flag_fixed_strings) + else if (flag_mode == Mode::FIXED) fprintf(output, " --fixed-strings" NEWLINESTR); - else if (flag_fuzzy > 0) - fprintf(output, " --fuzzy" NEWLINESTR); - else if (flag_perl_regexp) + else if (flag_mode == Mode::PERL) fprintf(output, " --perl-regexp" NEWLINESTR); + else + fprintf(output, " --extended-regexp" NEWLINESTR); if (flag_decompress) fprintf(output, " --decompress --zmax=%zu" NEWLINESTR, flag_zmax); if (flag_min_depth > 0 && flag_max_depth > 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/src/ugrep-indexer.cpp new/ugrep-7.8.5/src/ugrep-indexer.cpp --- old/ugrep-7.8.4/src/ugrep-indexer.cpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/src/ugrep-indexer.cpp 2026-09-15 13:41:49.000000000 +0200 @@ -35,7 +35,7 @@ */ // DO NOT ALTER THIS LINE: updated by makemake.sh and we need it physically here for MSVC++ build from source -#define UGREP_VERSION "7.8.4" +#define UGREP_VERSION "7.8.5" // use a task-parallel thread to decompress the stream into a pipe to search, also handles nested archives #define WITH_DECOMPRESSION_THREAD diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/src/ugrep.cpp new/ugrep-7.8.5/src/ugrep.cpp --- old/ugrep-7.8.4/src/ugrep.cpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/src/ugrep.cpp 2026-09-15 13:41:49.000000000 +0200 @@ -303,7 +303,6 @@ // ugrep command-line options bool flag_all_threads = false; bool flag_any_line = false; -bool flag_basic_regexp = false; bool flag_best_match = false; bool flag_bool = false; bool flag_color_term = false; @@ -317,7 +316,6 @@ bool flag_files = false; bool flag_files_with_matches = false; bool flag_files_without_match = false; -bool flag_fixed_strings = false; bool flag_glob_ignore_case = false; bool flag_grep = false; bool flag_hex = false; @@ -342,7 +340,6 @@ bool flag_null_data = false; bool flag_only_line_number = false; bool flag_only_matching = false; -bool flag_perl_regexp = false; bool flag_query = false; bool flag_quiet = false; bool flag_sort_rev = false; @@ -373,6 +370,7 @@ Sort flag_sort_key = Sort::NA; Action flag_devices_action = Action::UNSP; Action flag_directories_action = Action::UNSP; +Mode flag_mode = Mode::UNSP; size_t flag_after_context = 0; size_t flag_before_context = 0; size_t flag_delay = DEFAULT_QUERY_DELAY; @@ -3971,7 +3969,7 @@ #if !defined(HAVE_PCRE2) && defined(HAVE_BOOST_REGEX) // buffer all input to work around Boost.Regex partial matching bug, but this may throw std::bad_alloc if the file is too large - if (flag_perl_regexp) + if (flag_mode == Mode::PERL) { matcher->buffer(); } @@ -4937,9 +4935,14 @@ options(pattern_args, 2, args); - if (Static::warnings > 0) + if (Static::warnings > 0 || + flag_bool || flag_fuzzy || flag_mode != Mode::UNSP || + flag_any_line || flag_count || flag_files_with_matches || flag_files_without_match || + flag_invert_match || flag_line_regexp || flag_only_line_number || flag_only_matching || + flag_replace || flag_text || flag_word_regexp) { - std::cerr << "ugrep: error in " << config_file << " at line " << lineno << '\n'; + // reject invalid options and options that don't make sense for config + std::cerr << "ugrep: error in config file " << config_file << " at line " << lineno << '\n'; errors = true; } else if (line.compare(0, 8, "--config") == 0) @@ -4947,7 +4950,7 @@ // parse a config file, but do not recurse more than one level deep if (recurse) { - std::cerr << "ugrep: recursive configuration in " << config_file << " at line " << lineno << '\n'; + std::cerr << "ugrep: error in config file " << config_file << " recursion at line " << lineno << '\n'; errors = true; } else @@ -4971,19 +4974,9 @@ ++lineno; } - // clear flags that don't make sense for config, clashing and confusing to allow - flag_any_line = false; - flag_basic_regexp = false; - flag_bool = false; - flag_count = false; + // silently ignore some options that don't make sense for config, clashing and confusing to allow flag_file.clear(); - flag_files_with_matches = false; - flag_files_without_match = false; - flag_fixed_strings = false; flag_from.clear(); - flag_fuzzy = 0; - flag_invert_match = false; - flag_line_regexp = false; flag_match = false; flag_max_count = 0; flag_max_files = 0; @@ -4991,17 +4984,11 @@ flag_max_size = 0; flag_min_line = 0; flag_min_size = 0; - flag_only_line_number = false; - flag_only_matching = false; flag_pager = NULL; - flag_perl_regexp = false; flag_query = false; flag_quiet = false; flag_regexp.clear(); - flag_replace = NULL; flag_save_config = NULL; - flag_text = false; - flag_word_regexp = false; if (wdir) { flag_view = NULL; @@ -5351,7 +5338,7 @@ case 'b': if (strcmp(arg, "basic-regexp") == 0) - flag_basic_regexp = true; + flag_mode = Mode::BRE; else if (strcmp(arg, "before-context") == 0) // legacy form --before-context NUM flag_before_context = strtonum(getloptarg(argc, argv, "", i), "invalid argument --before-context="); else if (strncmp(arg, "before-context=", 15) == 0) @@ -5462,7 +5449,7 @@ else if (strncmp(arg, "exclude-fs=", 11) == 0) flag_exclude_fs.emplace_back(getloptarg(argc, argv, arg + 11, i)); else if (strcmp(arg, "extended-regexp") == 0) - flag_basic_regexp = false; + flag_mode = Mode::ERE; else if (strcmp(arg, "encoding") == 0) usage("missing argument for --", arg); else @@ -5487,7 +5474,7 @@ else if (strcmp(arg, "files-without-match") == 0) flag_files_without_match = true; else if (strcmp(arg, "fixed-strings") == 0) - flag_fixed_strings = true; + flag_mode = Mode::FIXED; else if (strncmp(arg, "filter=", 7) == 0) flag_filter.append(flag_filter.empty() ? "" : ",").append(getloptarg(argc, argv, arg + 7, i)); else if (strncmp(arg, "filter-magic-label=", 19) == 0) @@ -5803,7 +5790,7 @@ else if (strcmp(arg, "passthru") == 0) flag_any_line = true; else if (strcmp(arg, "perl-regexp") == 0) - flag_perl_regexp = true; + flag_mode = Mode::PERL; else if (strcmp(arg, "pretty") == 0) flag_pretty = Static::AUTO; else if (strncmp(arg, "pretty=", 7) == 0) @@ -5980,7 +5967,7 @@ break; case 'E': - flag_basic_regexp = false; + flag_mode = Mode::ERE; break; case 'e': @@ -5989,7 +5976,7 @@ break; case 'F': - flag_fixed_strings = true; + flag_mode = Mode::FIXED; break; case 'f': @@ -5998,7 +5985,7 @@ break; case 'G': - flag_basic_regexp = true; + flag_mode = Mode::BRE; break; case 'g': @@ -6077,7 +6064,7 @@ break; case 'P': - flag_perl_regexp = true; + flag_mode = Mode::PERL; break; case 'p': @@ -6449,7 +6436,7 @@ else if (strncmp(program, "grep", len) == 0) { // the 'grep' command is equivalent to 'ugrep --grep -G -. --sort' - flag_basic_regexp = true; + flag_mode = Mode::BRE; flag_grep = true; flag_empty = true; flag_hidden = true; @@ -6466,7 +6453,7 @@ else if (strncmp(program, "fgrep", len) == 0) { // the 'fgrep' command is equivalent to 'ugrep --grep -F -. --sort' - flag_fixed_strings = true; + flag_mode = Mode::FIXED; flag_grep = true; flag_empty = true; flag_hidden = true; @@ -6476,7 +6463,7 @@ { // the 'zgrep' command is equivalent to 'ugrep --decompress --grep -G -. --sort' flag_decompress = true; - flag_basic_regexp = true; + flag_mode = Mode::BRE; flag_grep = true; flag_empty = true; flag_hidden = true; @@ -6495,7 +6482,7 @@ { // the 'zfgrep' command is equivalent to 'ugrep --decompress --grep -F -. --sort' flag_decompress = true; - flag_fixed_strings = true; + flag_mode = Mode::FIXED; flag_grep = true; flag_empty = true; flag_hidden = true; @@ -6540,12 +6527,10 @@ if (flag_zmax > 99) usage("option --zmax argument exceeds upper limit"); - // -P disables -F, -G and -Z (P>F>G>E override) and does not allow -N patterns - if (flag_perl_regexp) + // -P is incompatible with option -Z and with -N patterns + if (flag_mode == Mode::PERL) { #if defined(HAVE_PCRE2) || defined(HAVE_BOOST_REGEX) - flag_fixed_strings = false; - flag_basic_regexp = false; if (flag_fuzzy > 0) usage("options -P and -Z are not compatible"); for (const auto& arg : pattern_args) @@ -6560,10 +6545,6 @@ if (flag_only_matching || flag_ungroup) flag_empty = false; - // -F disables -G (P>F>G>E override) - if (flag_fixed_strings) - flag_basic_regexp = false; - // -e, -N, --and, --andnot, --not if (!pattern_args.empty()) { @@ -6574,7 +6555,7 @@ { if (arg.first == CNF::PATTERN::AND || arg.first == CNF::PATTERN::NOT) flag_bool = true; - else if (arg.first == CNF::PATTERN::NEG && flag_fixed_strings) + else if (arg.first == CNF::PATTERN::NEG && flag_mode == Mode::FIXED) usage("option -F with -% or -Q does not support -N PATTERN"); } @@ -8425,8 +8406,8 @@ if (!flag_file.empty()) { // -F: make newline-separated lines in regex literal with \Q and \E - bool fixed_strings = flag_fixed_strings; - const char *bar = flag_basic_regexp ? "\\|" : "|"; + bool fixed_strings = flag_mode == Mode::FIXED; + const char *bar = flag_mode == Mode::BRE ? "\\|" : "|"; // PATTERN or -e PATTERN: add an ending '|' (or BRE '\|') to the regex to concatenate sub-expressions if (!regex.empty()) @@ -8519,7 +8500,7 @@ { // pop unused ending '|' (or BRE '\|') from the |-concatenated regexes in the regex string regex.pop_back(); - if (flag_basic_regexp) + if (flag_mode == Mode::BRE) regex.pop_back(); } @@ -8528,7 +8509,7 @@ } // patterns ^, $ and ^$ are special cases to optimize for search - if (!flag_fixed_strings && Static::bcnf.singleton_or_undefined()) + if (flag_mode != Mode::FIXED && Static::bcnf.singleton_or_undefined()) { if (regex == "^$") { @@ -8592,7 +8573,7 @@ } // patterns .* and .+ are common easy special cases to optimize for search - if (!flag_fixed_strings && !flag_dotall && Static::bcnf.singleton_or_undefined()) + if (flag_mode != Mode::FIXED && !flag_dotall && Static::bcnf.singleton_or_undefined()) { if (regex == ".*") { @@ -8760,7 +8741,7 @@ convert_flags |= reflex::convert_flag::unicode; // -G: convert basic regex (BRE) to extended regex (ERE) - if (flag_basic_regexp) + if (flag_mode == Mode::BRE) convert_flags |= reflex::convert_flag::basic; // set reflex::Pattern options to enable multiline mode @@ -8788,8 +8769,8 @@ // reflex::Matcher options std::string matcher_options; - // grep compatibility mode: literally match closing ) like GNU grep when not paired with ( unless -P or -F - if (flag_grep && !flag_perl_regexp && !flag_fixed_strings) + // grep compatibility mode: literally match closing ) like GNU grep when not paired with ( unless -F or -P + if (flag_grep && flag_mode != Mode::FIXED && flag_mode != Mode::PERL) convert_flags |= reflex::convert_flag::closing; // -Y or --empty: permit empty pattern matches @@ -8811,7 +8792,7 @@ // --index: search is only possible with compatible options if (flag_index != NULL) { - if (flag_perl_regexp) + if (flag_mode == Mode::PERL) usage("options --index and -P (--perl-regexp) are not compatible"); if (!flag_filter.empty()) usage("options --index and --filter are not compatible"); @@ -8870,7 +8851,7 @@ } } } - else if (flag_perl_regexp) + else if (flag_mode == Mode::PERL) { // -P: Perl matching with PCRE2 or Boost.Regex #if defined(HAVE_PCRE2) @@ -13533,7 +13514,7 @@ #if !defined(HAVE_PCRE2) && defined(HAVE_BOOST_REGEX) // buffer all input to work around Boost.Regex partial matching bug, but this may throw std::bad_alloc if the file is too large - if (flag_perl_regexp) + if (flag_mode == Mode::PERL) matcher->buffer(); #endif @@ -15261,7 +15242,7 @@ #endif std::cout << "ugrep " UGREP_VERSION; if (flag_grep) - std::cout << " (" << (flag_basic_regexp ? "" : flag_fixed_strings ? "f" : "e") << "grep compat)"; + std::cout << " (" << (flag_mode == Mode::BRE ? "" : flag_mode == Mode::FIXED ? "f" : "e") << "grep compat)"; std::cout << " " PLATFORM << #if defined(HAVE_AVX512BW) (reflex::have_HW_AVX512BW() ? " +avx512" : (reflex::have_HW_AVX2() ? " +avx2" : reflex::have_HW_SSE2() ? " +sse2" : " (no sse2!)")) << diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/src/ugrep.hpp new/ugrep-7.8.5/src/ugrep.hpp --- old/ugrep-7.8.4/src/ugrep.hpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/src/ugrep.hpp 2026-09-15 13:41:49.000000000 +0200 @@ -38,7 +38,7 @@ #define UGREP_HPP // DO NOT ALTER THIS LINE: updated by makemake.sh and we need it physically here for MSVC++ build from source -#define UGREP_VERSION "7.8.4" +#define UGREP_VERSION "7.8.5" // disable mmap because mmap is almost always slower than the file reading speed improvements since 3.0.0 #define WITH_NO_MMAP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-7.8.4/src/zstream.hpp new/ugrep-7.8.5/src/zstream.hpp --- old/ugrep-7.8.4/src/zstream.hpp 2026-08-05 16:31:46.000000000 +0200 +++ new/ugrep-7.8.5/src/zstream.hpp 2026-09-15 13:41:49.000000000 +0200 @@ -524,7 +524,7 @@ lzma_strm_->avail_in = zlen_ - zcur_; // initialize lzma decompress - lzma_ret ret = lzma_auto_decoder(lzma_strm_, UINT64_MAX, LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED); + lzma_ret ret = lzma_auto_decoder(lzma_strm_, XZ::MEMLIMIT, LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED); if (ret != LZMA_OK) { cannot_decompress(pathname_, "lzma_auto_decoder failed"); @@ -1229,7 +1229,7 @@ try { xzfile_ = new XZ(); - lzma_ret ret = lzma_auto_decoder(&xzfile_->strm, UINT64_MAX, LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED); + lzma_ret ret = lzma_auto_decoder(&xzfile_->strm, XZ::MEMLIMIT, LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED); if (ret != LZMA_OK) { warning("lzma_stream_decoder failed", pathname); @@ -1547,7 +1547,7 @@ xzfile_ = new XZ(); xzfile_->strm.next_in = buf_; xzfile_->strm.avail_in = 6; - lzma_ret ret = lzma_auto_decoder(&xzfile_->strm, UINT64_MAX, LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED); + lzma_ret ret = lzma_auto_decoder(&xzfile_->strm, XZ::MEMLIMIT, LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED); if (ret != LZMA_OK) { warning("lzma_stream_decoder failed", pathname); @@ -1839,6 +1839,8 @@ lzma_end(&strm); } + static const uint64_t MEMLIMIT = 100 * 1024 * 1024; // 100 MB: files compressed with 'xz -9' require 65 MB to decompress + lzma_stream strm; unsigned char zbuf[Z_BUF_LEN]; size_t zlen; ++++++ ugrep.obsinfo ++++++ --- /var/tmp/diff_new_pack.nT0a5X/_old 2026-09-16 17:48:27.295334164 +0200 +++ /var/tmp/diff_new_pack.nT0a5X/_new 2026-09-16 17:48:27.302334457 +0200 @@ -1,5 +1,5 @@ name: ugrep -version: 7.8.4 -mtime: 1785940306 -commit: 550599a6434fc5315fb6ecd415a5d859e6d846a8 +version: 7.8.5 +mtime: 1789472509 +commit: f2cc252c011460f6c75b1fb591813b4b6b59c225
