Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ugrep for openSUSE:Factory checked in at 2023-08-16 14:17:34 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ugrep (Old) and /work/SRC/openSUSE:Factory/.ugrep.new.11712 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ugrep" Wed Aug 16 14:17:34 2023 rev:48 rq:1104080 version:3.12.7 Changes: -------- --- /work/SRC/openSUSE:Factory/ugrep/ugrep.changes 2023-08-08 15:55:08.177069080 +0200 +++ /work/SRC/openSUSE:Factory/.ugrep.new.11712/ugrep.changes 2023-08-16 14:17:37.823201866 +0200 @@ -1,0 +2,9 @@ +Tue Aug 15 18:20:54 UTC 2023 - Andreas Stieger <andreas.stie...@gmx.de> + +- update to 3.12.7: + * compatibility improvement with one of GNU grep's idiosyncrasies: + unpaired ) in regex are matched literally. This behavior is + automatically in effect when the grep and egrep aliases of + ugrep are used or explicitly with option -Y. + +------------------------------------------------------------------- Old: ---- ugrep-3.12.6.tar.gz New: ---- ugrep-3.12.7.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ugrep.spec ++++++ --- /var/tmp/diff_new_pack.ad2Zyv/_old 2023-08-16 14:17:38.647207635 +0200 +++ /var/tmp/diff_new_pack.ad2Zyv/_new 2023-08-16 14:17:38.651207663 +0200 @@ -17,7 +17,7 @@ Name: ugrep -Version: 3.12.6 +Version: 3.12.7 Release: 0 Summary: Universal grep: a feature-rich grep implementation with focus on speed License: BSD-3-Clause ++++++ ugrep-3.12.6.tar.gz -> ugrep-3.12.7.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-3.12.6/README.md new/ugrep-3.12.7/README.md --- old/ugrep-3.12.6/README.md 2023-08-06 22:29:36.000000000 +0200 +++ new/ugrep-3.12.7/README.md 2023-08-14 20:03:34.000000000 +0200 @@ -5,6 +5,10 @@ Ugrep is like grep, but faster, user-friendly, and equipped with must-have features. Ugrep's speed and features beat grep, ripgrep, silver searcher, ack, sift, etc. +New faster ugrep 3.12.6 and new **ugrep-indexer** tool to accelerate search with file system indexing. Visit [GitHub ugrep-indexer](https://github.com/Genivia/ugrep-indexer) for details. + +See [how to install ugrep](#install) on your system. + The ugrep tools include the following powerful commands: - **ug** for interactive use with a .ugrep configuration file with your preferences located in the working directory or home directory (run 'ug --save-config' to create a .ugrep file you can edit) - **ug+** for interactive use, also searches pdfs, documents, e-books, image metadata @@ -15,15 +19,24 @@ <br> <img src="https://www.genivia.com/images/scranim.gif" width="438" alt=""> -- Written in clean and efficient C++11 for advanced features and speed, thoroughly tested +Development roadmap +------------------- -- Portable (Linux, Unix, MacOS, Windows, etc), includes binaries for Windows in the [releases](https://github.com/Genivia/ugrep/releases) +- my highest priority is testing and quality assurance to continue to make sure ugrep has no bugs and is reliable +- make ugrep even faster, see [my latest blog article](https://www.genivia.com/ugrep.html) demonstrating with a reproducible benchmark that ugrep beats GNU grep and ripgrep in terms of raw performance +- listen to users to continue to improve ugrep with new and updated features +- share reproducible performance data with the community +- improve the interactive TUI with a split screen +- add file indexing to speed up cold search performance, see [ugrep-indexer](https://github.com/Genivia/ugrep-indexer) + +Overview +-------- - Supports all GNU/BSD grep standard options; ugrep is a faster [compatible replacement](#grep) for GNU/BSD grep - Matches Unicode patterns by default in UTF-8, UTF-16, UTF-32 encoded files -- Matches multiple lines with `\n` and `\R` regex patterns +- Matches multiple lines with `\n` or `\R` in regex patterns, *no special options are required to do so!* - Built-in help: `ug --help`, where `ug --help WHAT` displays options related to `WHAT` you are looking for @@ -41,12 +54,6 @@ ð¡**ProTip** `-Q` replaces `PATTERN` on the command line to type your patterns interactively instead. Specify `-e PATTERN` to search and edit the `PATTERN` in the TUI. For quicker search responses to keypresses, try `-Q1` (fast, 100ms delay) to `-Q5` (default 500ms delay). -- Find approximate pattern matches with [fuzzy search](#fuzzy), within the specified Levenshtein distance - - ug -Z PATTERN ... ug -Z3 PATTTERN ... - - ð¡**ProTip** `-Zn` matches up to `n` extra, missing or replaced characters, `-Z+n` matches up to `n` extra characters, `-Z-n` matches with up to `n` missing characters and `-Z~n` matches up to `n` replaced characters. `-Z` defaults to `-Z1`. - - Search with Google-like [Boolean query patterns](#bool) using `--bool` patterns with `AND` (or just space), `OR` (or a bar `|`), `NOT` (or a dash `-`), using quotes to match exactly, and grouping with `( )`; or with options `-e` (as an "or"), `--and`, `--andnot`, and `--not` regex patterns ug --bool 'A B C' ... ug -e 'A' --and 'B' --and 'C' ... @@ -59,12 +66,6 @@ ð¡**ProTip** specify `--files --bool` to apply the Boolean query to files as a whole: a file matches if all Boolean conditions are satisfied by matching patterns file-wide. Otherwise, Boolean conditions apply to single lines by default, since grep utilities are generally line-based pattern matchers. Option `--stats` displays the query in human-readable form after the search completes. -- Fzf-like search with regex (or fixed strings with `-F`), fuzzy matching with up to 4 extra characters with `-Z+4` and words only with `-w`, using `--files --bool` for file-wide Boolean searches - - ug -Q1 --files --bool -l -w -Z+4 --sort=best - - ð¡**ProTip** `-l` lists the matching files in the TUI, press `TAB` then `ALT-y` to view a file, `SHIFT-TAB` and `Alt-l` to go back to view the list of matching files ordered by best match - - Search the contents of [archives](#archives) (cpio, jar, tar, pax, zip) and [compressed files](#archives) (zip, gz, Z, bz, bz2, lzma, xz, lz4, zstd) ug -z PATTERN ... ug -z --zmax=2 PATTERN ... @@ -84,6 +85,18 @@ ð¡**ProTip** the `ug+` command is the same as the `ug` command, but also uses filters to search PDFs, documents, and image metadata, when the [`pdftotext`](https://pypi.org/project/pdftotext), [`antiword`](https://github.com/rsdoiel/antiword), [`pandoc`](https://pandoc.org), and [`exiftool`](https://exiftool.sourceforge.net) are installed (optionally, not used when not installed). +- Find approximate pattern matches with [fuzzy search](#fuzzy), within the specified Levenshtein distance + + ug -Z PATTERN ... ug -Z3 PATTTERN ... + + ð¡**ProTip** `-Zn` matches up to `n` extra, missing or replaced characters, `-Z+n` matches up to `n` extra characters, `-Z-n` matches with up to `n` missing characters and `-Z~n` matches up to `n` replaced characters. `-Z` defaults to `-Z1`. + +- Fzf-like search with regex (or fixed strings with `-F`), fuzzy matching with up to 4 extra characters with `-Z+4` and words only with `-w`, using `--files --bool` for file-wide Boolean searches + + ug -Q1 --files --bool -l -w -Z+4 --sort=best + + ð¡**ProTip** `-l` lists the matching files in the TUI, press `TAB` then `ALT-y` to view a file, `SHIFT-TAB` and `Alt-l` to go back to view the list of matching files ordered by best match + - Search [binary files](#binary) and display hexdumps with binary pattern matches (Unicode text or `-U` for byte patterns) ug --hexdump -U BYTEPATTERN ... ug --hexdump TEXTPATTERN ... @@ -699,7 +712,7 @@ over grep](#improvements). If you want to stick exactly to GNU/BSD grep ASCII/LATIN1 non-UTF Unicode -patterns, use `ugrep -U` to disable full Unicode pattern matching. +patterns, use option `-U` to disable full Unicode pattern matching. In fact, executing `ugrep` with options `-U`, `-Y`, `-.` and `--sort` makes it behave exactly like `egrep`, matching only ASCII/LATIN1 non-UTF Unicode @@ -797,10 +810,10 @@ - **ugrep** starts an interactive query TUI with option `-Q`. - **ugrep** matches patterns across multiple lines when patterns match `\n`. - **ugrep** matches full Unicode by default (disabled with option `-U`). -- **ugrep** supports fuzzy (approximate) matching with option `-Z`. +- **ugrep** supports Boolean patterns with AND, OR and NOT (option `--bool`). - **ugrep** supports gitignore with option `--ignore-files`. +- **ugrep** supports fuzzy (approximate) matching with option `-Z`. - **ugrep** supports user-defined global and local configuration files. -- **ugrep** supports Boolean patterns with AND, OR and NOT (option `--bool`). - **ugrep** searches compressed files and archives with option `-z`. - **ugrep** searches cpio, jar, pax, tar and zip archives with option `-z`. - **ugrep** searches cpio, jar, pax, tar and zip archives recursively stored @@ -867,7 +880,7 @@ searching for identifiers in source code and find matches that aren't in strings and comments. Predefined `zap` patterns use negative patterns, for example, use `-f cpp/zap_comments` to ignore pattern matches in C++ comments. -- **ugrep** does not the `GREP_OPTIONS` environment variable, because the +- **ugrep** ignores the `GREP_OPTIONS` environment variable, because the behavior of **ugrep** must be portable and predictable on every system. Also GNU grep abandoned `GREP_OPTIONS` for this reason. Please use the `ug` command that loads the .ugrep configuration file located in the working @@ -2353,7 +2366,7 @@ To recursively search for approximate matches of the word `foobar` with `-Z`, i.e. approximate matching with one error, e.g. `Foobar`, `foo_bar`, `foo bar`, -`fobar`: +`fobar` and other forms with one missing, one extra or one deleted character: ug -Z 'foobar' @@ -5345,7 +5358,7 @@ - ugrep 3.12.6 August 6, 2023 UGREP(1) + ugrep 3.12.7 August 14, 2023 UGREP(1) ð [Back to table of contents](#toc) Binary files old/ugrep-3.12.6/bin/win32/ugrep.exe and new/ugrep-3.12.7/bin/win32/ugrep.exe differ Binary files old/ugrep-3.12.6/bin/win64/ugrep.exe and new/ugrep-3.12.7/bin/win64/ugrep.exe differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-3.12.6/include/reflex/convert.h new/ugrep-3.12.7/include/reflex/convert.h --- old/ugrep-3.12.6/include/reflex/convert.h 2023-08-06 22:29:36.000000000 +0200 +++ new/ugrep-3.12.7/include/reflex/convert.h 2023-08-14 20:03:34.000000000 +0200 @@ -68,7 +68,8 @@ const convert_flag_type dotall = 0x0080; ///< convert `.` (dot) to match all, same as `(?s)` const convert_flag_type freespace = 0x0100; ///< convert regex by removing spacing, same as `(?x)` const convert_flag_type notnewline = 0x0200; ///< inverted character classes and \s do not match newline `\n` - const convert_flag_type permissive = 0x0400; ///< convert Unicode to compact UTF-8 patterns and DFA, permits some invalid UTF-8 sequences + const convert_flag_type permissive = 0x0400; ///< convert Unicode to compact UTF-8 patterns, permits some invalid UTF-8 sequences + const convert_flag_type closing = 0x8000; ///< permit matching ) when it has no opening ( } /// @brief Returns the converted regex string given a regex library signature and conversion flags, throws regex_error. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-3.12.6/include/reflex/pattern.h new/ugrep-3.12.7/include/reflex/pattern.h --- old/ugrep-3.12.6/include/reflex/pattern.h 2023-08-06 22:29:36.000000000 +0200 +++ new/ugrep-3.12.7/include/reflex/pattern.h 2023-08-14 20:03:34.000000000 +0200 @@ -803,15 +803,15 @@ Option() : b(), h(), e(), f(), i(), m(), n(), o(), p(), q(), r(), s(), w(), x(), z() { } bool b; ///< disable escapes in bracket lists bool h; ///< construct indexing hash finite state automaton - Char e; ///< escape character, or > 255 for none, '\\' default - std::vector<std::string> f; ///< output to files + Char e; ///< escape character, or > 255 for none, a backslash by default + std::vector<std::string> f; ///< output the patterns and/or DFA to files(s) bool i; ///< case insensitive mode, also `(?i:X)` bool m; ///< multi-line mode, also `(?m:X)` std::string n; ///< pattern name (for use in generated code) bool o; ///< generate optimized FSM code for option f bool p; ///< with option f also output predict match array for fast search with find() bool q; ///< enable "X" quotation of verbatim content, also `(?q:X)` - bool r; ///< raise syntax errors + bool r; ///< raise syntax errors as exceptions bool s; ///< single-line mode (dotall mode), also `(?s:X)` bool w; ///< write error message to stderr bool x; ///< free-spacing mode, also `(?x:X)` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-3.12.6/lib/convert.cpp new/ugrep-3.12.7/lib/convert.cpp --- old/ugrep-3.12.6/lib/convert.cpp 2023-08-06 22:29:36.000000000 +0200 +++ new/ugrep-3.12.7/lib/convert.cpp 2023-08-14 20:03:34.000000000 +0200 @@ -1750,19 +1750,35 @@ else { if (lev == 1) - throw regex_error(regex_error::mismatched_parens, pattern, pos); - if (beg) + { + if (!(flags & convert_flag::closing)) + throw regex_error(regex_error::mismatched_parens, pattern, pos); + if (!(flags & convert_flag::basic) || bre) + { + // translate a closing ) to \) when it has no opening ( + regex.append(&pattern[loc], pos - loc).push_back('\\'); + loc = pos; + anc = false; + beg = false; + } + } + else if (beg) + { throw regex_error(regex_error::empty_expression, pattern, pos); - if (lap == lev) + } + else { - // lex lookahead: translate ) to )) - regex.append(&pattern[loc], pos - loc).push_back(')'); - loc = pos; - lap = 0; + if (lap == lev) + { + // lex lookahead: translate ) to )) + regex.append(&pattern[loc], pos - loc).push_back(')'); + loc = pos; + lap = 0; + } + // terminate (?isx:...) + mod[lev].clear(); + --lev; } - // terminate (?isx:...) - mod[lev].clear(); - --lev; } break; case '|': @@ -2005,10 +2021,6 @@ anc = false; beg = false; } - else - { - throw regex_error(regex_error::mismatched_braces, pattern, pos); - } break; case '#': if ((flags & convert_flag::lex) && (flags & convert_flag::freespace)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-3.12.6/lib/pattern.cpp new/ugrep-3.12.7/lib/pattern.cpp --- old/ugrep-3.12.6/lib/pattern.cpp 2023-08-06 22:29:36.000000000 +0200 +++ new/ugrep-3.12.7/lib/pattern.cpp 2023-08-14 20:03:34.000000000 +0200 @@ -493,17 +493,17 @@ opt_.x = true; break; case 'z': - for (const char *t = s += (s[1] == '='); *s != ';' && *s != '\0'; ++t) + for (const char *t = s += (s[1] == '='); *s != ';' && *s != '\0'; ++t) + { + if (std::isspace(*t) || *t == ';' || *t == '\0') { - if (std::isspace(*t) || *t == ';' || *t == '\0') - { - if (t > s + 1) - opt_.z = std::string(s + 1, t - s - 1); - s = t; - } + if (t > s + 1) + opt_.z = std::string(s + 1, t - s - 1); + s = t; } - --s; - break; + } + --s; + break; case 'f': case 'n': for (const char *t = s += (s[1] == '='); *s != ';' && *s != '\0'; ++t) @@ -596,7 +596,10 @@ Char c = at(end); if (c == '\0' || c == '|') break; - if (c == '.' || c == '^' || c == '$' || c == '(' || c == ')' || c == '[' || c == '{' || c == '?' || c == '*' || c == '+') + if (c == '.' || c == '^' || c == '$' || + c == '(' || c == '[' || c == '{' || + c == '?' || c == '*' || c == '+' || + c == ')') { end = loc; break; @@ -1115,6 +1118,10 @@ lazyset.clear(); } } + else if (at(loc) == '\0') + { + error(regex_error::mismatched_braces, loc); + } else { error(regex_error::invalid_repeat, loc); @@ -1381,17 +1388,13 @@ { error(begin ? regex_error::empty_expression : regex_error::mismatched_parens, loc++); } - else if (c == '}') - { - error(regex_error::mismatched_braces, loc++); - } else if (c != '\0' && c != '|' && c != '?' && c != '*' && c != '+') { pos_add(firstpos, loc); pos_add(lastpos, loc); nullable = false; if (c == opt_.e) - (void)parse_esc(loc); + c = parse_esc(loc); else ++loc; } @@ -4060,8 +4063,8 @@ { if (!has_hfa()) return false; - HFA::VisitSet visit[2]; // we alternate and swap two visit bitsets, to produce a new one from the previous - bool accept = false; // a flag to indicate that we reached an accept (or dead) state, i.e. a possible match is found + HFA::VisitSet visit[2]; // we alternate two state visit bitsets, to produce a new one from the previous + bool accept = false; // a flag to indicate that we reached an accept (= dead) state, i.e. a possible match is found for (size_t level = 0; level < HFA::MAX_DEPTH && !accept; ++level) if (!match_hfa_transitions(level, hfa_.hashes[level], indexed, size, visit[level & 1], visit[~level & 1], accept)) return false; @@ -4098,7 +4101,7 @@ { HFA::States::const_iterator state = hfa_.states.find(next->first); if (state == hfa_.states.end() || state->second.empty()) - return accept = true; // reached an accepting (dead) state (dead means accept in HFA) + return accept = true; // reached an accepting (= dead) state (dead means accept in HFA) const HFA::StateSet::const_iterator index_end = state->second.end(); for (HFA::StateSet::const_iterator index = state->second.begin(); index != index_end; ++index) next_visit.set(*index, true); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-3.12.6/man/ugrep.1 new/ugrep-3.12.7/man/ugrep.1 --- old/ugrep-3.12.6/man/ugrep.1 2023-08-06 22:29:36.000000000 +0200 +++ new/ugrep-3.12.7/man/ugrep.1 2023-08-14 20:03:34.000000000 +0200 @@ -1,4 +1,4 @@ -.TH UGREP "1" "August 06, 2023" "ugrep 3.12.6" "User Commands" +.TH UGREP "1" "August 14, 2023" "ugrep 3.12.7" "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-3.12.6/src/query.cpp new/ugrep-3.12.7/src/query.cpp --- old/ugrep-3.12.6/src/query.cpp 2023-08-06 22:29:36.000000000 +0200 +++ new/ugrep-3.12.7/src/query.cpp 2023-08-14 20:03:34.000000000 +0200 @@ -452,14 +452,14 @@ Screen::put( 9, 0, "\033[7mM-Left\033[m \033[7mM-Right\033[m pan ½ page"); Screen::put(10, 0, "\033[7mM-Up\033[m \033[7mM-Down\033[m scroll ½ pg"); #endif - Screen::put(11, 0, ""); - Screen::put(12, 0, "\033[7mHome\033[m \033[7mEnd\033[m begin/end of line"); + Screen::put(11, 0, "\033[7mHome\033[m \033[7mEnd\033[m of pattern"); + Screen::put(12, 0, ""); Screen::put(13, 0, "\033[7m^K\033[m delete after cursor"); Screen::put(14, 0, "\033[7m^L\033[m refresh screen"); Screen::put(15, 0, "\033[7m^Q\033[m quick exit and output"); Screen::put(16, 0, "\033[7m^R\033[m or \033[7mF4\033[m restore bookmark"); Screen::put(17, 0, "\033[7m^S\033[m scroll to next file/dir"); - Screen::put(18, 0, "\033[7m^T\033[m toggle colors on/off"); + Screen::put(18, 0, "\033[7m^T\033[m toggle colors"); Screen::put(19, 0, "\033[7m^U\033[m delete before cursor"); Screen::put(20, 0, "\033[7m^V\033[m verbatim character"); Screen::put(21, 0, "\033[7m^W\033[m scroll back one file/dir"); @@ -502,9 +502,9 @@ if (!message_) { #ifdef WITH_MACOS_META_KEY - Screen::put(0, 0, "\033[7mF1\033[m help and options: \033[7m^\033[m=\033[7mCtrl\033[m \033[7mS-\033[m=\033[7mShift\033[m \033[7mM-\033[m=\033[7mAlt\033[m/\033[7mOption\033[m or use \033[7m^O\033[m+key"); + Screen::put(0, 0, " HELP AND OPTIONS \033[7m^\033[m=Ctrl \033[7mS-\033[m=Shift \033[7mM-\033[m=Alt/Option or \033[7m^O\033[m+key"); #else - Screen::put(0, 0, "\033[7mF1\033[m help and options: \033[7m^\033[m=\033[7mCtrl\033[m \033[7mS-\033[m=\033[7mShift\033[m \033[7mM-\033[m=\033[7mAlt\033[m or use \033[7m^O\033[m+key"); + Screen::put(0, 0, " HELP AND OPTIONS \033[7m^\033[m=Ctrl \033[7mS-\033[m=Shift \033[7mM-\033[m=Alt or \033[7m^O\033[m+key"); #endif } @@ -750,6 +750,8 @@ eof_ = true; buflen_ = 0; + Screen::clear(); + // if -e PATTERN specified, collect patterns on the line to edit if (!flag_regexp.empty()) { @@ -787,8 +789,11 @@ move(len_); } - - Screen::clear(); + else + { + // display a brief help message + message("press CTRL-Z or F1 for help"); + } set_prompt(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-3.12.6/src/query.hpp new/ugrep-3.12.7/src/query.hpp --- old/ugrep-3.12.6/src/query.hpp 2023-08-06 22:29:36.000000000 +0200 +++ new/ugrep-3.12.7/src/query.hpp 2023-08-14 20:03:34.000000000 +0200 @@ -63,7 +63,7 @@ // the max time that a message (to confirm a command) is shown at the query line, in steps of 100ms #ifndef QUERY_MESSAGE_DELAY -#define QUERY_MESSAGE_DELAY 12 +#define QUERY_MESSAGE_DELAY 15 #endif class Query { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-3.12.6/src/ugrep.cpp new/ugrep-3.12.7/src/ugrep.cpp --- old/ugrep-3.12.6/src/ugrep.cpp 2023-08-06 22:29:36.000000000 +0200 +++ new/ugrep-3.12.7/src/ugrep.cpp 2023-08-14 20:03:34.000000000 +0200 @@ -7601,9 +7601,13 @@ // reflex::Matcher options std::string matcher_options; - // -Y: permit empty pattern matches + // -Y: permit empty pattern matches and match closing ) when no opening ( unless -P and -F if (flag_empty) + { + if (!flag_perl_regexp && !flag_fixed_strings) + convert_flags |= reflex::convert_flag::closing; matcher_options.push_back('N'); + } // -w: match whole words, i.e. make \< and \> match only left side and right side, respectively if (flag_word_regexp) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ugrep-3.12.6/src/ugrep.hpp new/ugrep-3.12.7/src/ugrep.hpp --- old/ugrep-3.12.6/src/ugrep.hpp 2023-08-06 22:29:36.000000000 +0200 +++ new/ugrep-3.12.7/src/ugrep.hpp 2023-08-14 20:03:34.000000000 +0200 @@ -38,7 +38,7 @@ #define UGREP_HPP // ugrep version -#define UGREP_VERSION "3.12.6" +#define UGREP_VERSION "3.12.7" // disable mmap because mmap is almost always slower than the file reading speed improvements since 3.0.0 #define WITH_NO_MMAP