From d7e89fa661d94edcdfb8c16ed8a74beee6b8d63d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Fri, 17 Jul 2020 10:38:38 +0100 Subject: [PATCH] commitIdFromGitRepo: fix stackoverflow if many branches are used. If many branches are created than builtins.match stack overflows because of a bug in libstdc++: see https://github.com/NixOS/nix/issues/2147 --- lib/sources.nix | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/sources.nix b/lib/sources.nix index ed9bce485300a..776fcc32052bc 100644 --- a/lib/sources.nix +++ b/lib/sources.nix @@ -145,10 +145,14 @@ rec { # packed-refs file, so we have to grep through it: then let fileContent = readFile packedRefsName; - matchRef = match (".*\n([^\n ]*) " + file + "\n.*") fileContent; - in if matchRef == null + matchRef = builtins.match "([a-z0-9]+) ${file}"; + isRef = s: builtins.isString s && (matchRef s) != null; + # there is a bug in libstdc++ leading to stackoverflow for long strings: + # https://github.com/NixOS/nix/issues/2147#issuecomment-659868795 + refs = builtins.filter isRef (builtins.split "\n" fileContent); + in if refs == [] then throw ("Could not find " + file + " in " + packedRefsName) - else lib.head matchRef + else lib.head (matchRef (lib.head refs)) else throw ("Not a .git directory: " + path); in readCommitFromFile "HEAD";