Skip to content

Commit

Permalink
diff-closures: remove gratuitous copy
Browse files Browse the repository at this point in the history
This was done originally because std::smatch does not accept `const char
*` as iterators. However, this was because we should have been using
std::cmatch instead.

(cherry picked from commit https://git.lix.systems/lix-project/lix/commit/12a5838d11f790d36e2ac626e8916a2c19bcb80b)
  • Loading branch information
lf- authored and Mic92 committed Jul 25, 2024
1 parent 492715c commit 07aeedd
Showing 1 changed file with 4 additions and 11 deletions.
15 changes: 4 additions & 11 deletions src/nix/diff-closures.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,24 +25,17 @@ GroupedPaths getClosureInfo(ref<Store> store, const StorePath & toplevel)

GroupedPaths groupedPaths;

for (auto & path : closure) {
for (auto const & path : closure) {
/* Strip the output name. Unfortunately this is ambiguous (we
can't distinguish between output names like "bin" and
version suffixes like "unstable"). */
static std::regex regex("(.*)-([a-z]+|lib32|lib64)");
std::smatch match;
std::cmatch match;
std::string name{path.name()};
// Used to keep name alive through being potentially overwritten below
// (to not invalidate the references from the regex result)
//
// n.b. cannot be just path.name().{begin,end}() since that returns const
// char *, which does not, for some reason, convert as required on
// libstdc++. Seems like a libstdc++ bug or standard bug to me... we
// can afford the allocation in any case.
const std::string origName{path.name()};
std::string_view const origName = path.name();
std::string outputName;

if (std::regex_match(origName, match, regex)) {
if (std::regex_match(origName.begin(), origName.end(), match, regex)) {
name = match[1];
outputName = match[2];
}
Expand Down

0 comments on commit 07aeedd

Please sign in to comment.