aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/build-remote/build-remote.cc5
-rw-r--r--src/libcmd/editor-for.cc1
-rw-r--r--src/libexpr/eval.cc1
-rw-r--r--src/libexpr/eval.hh3
-rw-r--r--src/libexpr/nixexpr.hh1
-rw-r--r--src/libfetchers/fetchers.hh2
-rw-r--r--src/libmain/progress-bar.cc3
-rw-r--r--src/libmain/shared.cc2
-rw-r--r--src/libmain/shared.hh4
-rw-r--r--src/libstore/binary-cache-store.cc1
-rw-r--r--src/libstore/build/derivation-goal.cc1
-rw-r--r--src/libstore/build/entry-points.cc1
-rw-r--r--src/libstore/build/hook-instance.cc1
-rw-r--r--src/libstore/build/local-derivation-goal.cc4
-rw-r--r--src/libstore/builtins/buildenv.cc1
-rw-r--r--src/libstore/builtins/fetchurl.cc1
-rw-r--r--src/libstore/content-address.cc1
-rw-r--r--src/libstore/daemon.cc3
-rw-r--r--src/libstore/derivations.cc5
-rw-r--r--src/libstore/derived-path.hh1
-rw-r--r--src/libstore/filetransfer.cc1
-rw-r--r--src/libstore/filetransfer.hh1
-rw-r--r--src/libstore/gc.cc1
-rw-r--r--src/libstore/legacy-ssh-store.cc1
-rw-r--r--src/libstore/local-store.cc1
-rw-r--r--src/libstore/lock.hh5
-rw-r--r--src/libstore/machines.hh4
-rw-r--r--src/libstore/make-content-addressed.cc1
-rw-r--r--src/libstore/misc.cc2
-rw-r--r--src/libstore/nar-accessor.hh4
-rw-r--r--src/libstore/nar-info-disk-cache.cc1
-rw-r--r--src/libstore/nar-info.cc2
-rw-r--r--src/libstore/optimise-store.cc1
-rw-r--r--src/libstore/parsed-derivations.cc1
-rw-r--r--src/libstore/path-info.cc1
-rw-r--r--src/libstore/path-with-outputs.cc3
-rw-r--r--src/libstore/platform/darwin.cc1
-rw-r--r--src/libstore/platform/linux.cc1
-rw-r--r--src/libstore/profiles.cc3
-rw-r--r--src/libstore/remote-store.cc4
-rw-r--r--src/libstore/s3-binary-cache-store.cc1
-rw-r--r--src/libstore/ssh-store.cc4
-rw-r--r--src/libstore/store-api.cc4
-rw-r--r--src/libutil/args.cc5
-rw-r--r--src/libutil/args.hh2
-rw-r--r--src/libutil/backed-string-view.hh69
-rw-r--r--src/libutil/error.cc1
-rw-r--r--src/libutil/file-system.cc1
-rw-r--r--src/libutil/hash.cc1
-rw-r--r--src/libutil/meson.build1
-rw-r--r--src/libutil/processes.cc1
-rw-r--r--src/libutil/regex.cc3
-rw-r--r--src/libutil/serialise.cc22
-rw-r--r--src/libutil/serialise.hh7
-rw-r--r--src/libutil/source-path.cc1
-rw-r--r--src/libutil/strings.hh13
-rw-r--r--src/libutil/types.hh72
-rw-r--r--src/nix-store/nix-store.cc2
-rw-r--r--src/nix/doctor.cc1
-rw-r--r--src/nix/verify.cc3
-rw-r--r--src/pch/precompiled-headers.hh16
-rw-r--r--tests/unit/libstore/derivation.cc2
-rw-r--r--tests/unit/libstore/protocol.hh1
-rw-r--r--tests/unit/libutil/references.cc1
64 files changed, 190 insertions, 125 deletions
diff --git a/src/build-remote/build-remote.cc b/src/build-remote/build-remote.cc
index 2450e80c2..3c7af067b 100644
--- a/src/build-remote/build-remote.cc
+++ b/src/build-remote/build-remote.cc
@@ -1,11 +1,7 @@
-#include <cstdlib>
-#include <cstring>
#include <algorithm>
#include <set>
#include <memory>
-#include <string_view>
#include <tuple>
-#include <iomanip>
#if __APPLE__
#include <sys/time.h>
#endif
@@ -18,6 +14,7 @@
#include "build-result.hh"
#include "store-api.hh"
#include "derivations.hh"
+#include "strings.hh"
#include "local-store.hh"
#include "legacy.hh"
#include "experimental-features.hh"
diff --git a/src/libcmd/editor-for.cc b/src/libcmd/editor-for.cc
index 67653d9c9..868153e90 100644
--- a/src/libcmd/editor-for.cc
+++ b/src/libcmd/editor-for.cc
@@ -1,6 +1,7 @@
#include "editor-for.hh"
#include "environment-variables.hh"
#include "source-path.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 227cd254a..a87383f7f 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -19,6 +19,7 @@
#include "gc-small-vector.hh"
#include "fetch-to-store.hh"
#include "flake/flakeref.hh"
+#include "exit.hh"
#include <algorithm>
#include <iostream>
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index eab1f22ef..ba1e4a820 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -12,6 +12,7 @@
#include "experimental-features.hh"
#include "search-path.hh"
#include "repl-exit-status.hh"
+#include "backed-string-view.hh"
#include <map>
#include <optional>
@@ -791,4 +792,4 @@ static constexpr std::string_view corepkgsPrefix{"/__corepkgs__/"};
}
-#include "eval-inline.hh"
+#include "eval-inline.hh" // IWYU pragma: keep
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh
index 52f254813..d16281c39 100644
--- a/src/libexpr/nixexpr.hh
+++ b/src/libexpr/nixexpr.hh
@@ -11,6 +11,7 @@
#include "eval-error.hh"
#include "pos-idx.hh"
#include "pos-table.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libfetchers/fetchers.hh b/src/libfetchers/fetchers.hh
index 40f2b6294..f778908fb 100644
--- a/src/libfetchers/fetchers.hh
+++ b/src/libfetchers/fetchers.hh
@@ -7,6 +7,8 @@
#include "path.hh"
#include "attrs.hh"
#include "url.hh"
+#include "ref.hh"
+#include "strings.hh"
#include <memory>
diff --git a/src/libmain/progress-bar.cc b/src/libmain/progress-bar.cc
index f0270df04..cdb15d8c7 100644
--- a/src/libmain/progress-bar.cc
+++ b/src/libmain/progress-bar.cc
@@ -1,8 +1,9 @@
#include "progress-bar.hh"
+#include "file-system.hh"
#include "sync.hh"
-#include "store-api.hh"
#include "names.hh"
#include "terminal.hh"
+#include "strings.hh"
#include <map>
#include <thread>
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index 018e34509..bc9548e09 100644
--- a/src/libmain/shared.cc
+++ b/src/libmain/shared.cc
@@ -6,6 +6,8 @@
#include "loggers.hh"
#include "current-process.hh"
#include "terminal.hh"
+#include "strings.hh"
+#include "exit.hh"
#include <algorithm>
#include <exception>
diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh
index d7d872319..b41efe567 100644
--- a/src/libmain/shared.hh
+++ b/src/libmain/shared.hh
@@ -7,12 +7,10 @@
#include "path.hh"
#include "derived-path.hh"
#include "processes.hh"
-#include "exit.hh"
+#include "strings.hh"
#include <signal.h>
-#include <locale>
-
namespace nix {
diff --git a/src/libstore/binary-cache-store.cc b/src/libstore/binary-cache-store.cc
index fc0569a66..d4197b3df 100644
--- a/src/libstore/binary-cache-store.cc
+++ b/src/libstore/binary-cache-store.cc
@@ -10,6 +10,7 @@
#include "nar-accessor.hh"
#include "thread-pool.hh"
#include "signals.hh"
+#include "strings.hh"
#include <chrono>
#include <regex>
diff --git a/src/libstore/build/derivation-goal.cc b/src/libstore/build/derivation-goal.cc
index f2c8ccc5f..3ed3cb6bd 100644
--- a/src/libstore/build/derivation-goal.cc
+++ b/src/libstore/build/derivation-goal.cc
@@ -9,6 +9,7 @@
#include "logging-json.hh"
#include "substitution-goal.hh"
#include "drv-output-substitution-goal.hh"
+#include "strings.hh"
#include <fstream>
#include <sys/types.h>
diff --git a/src/libstore/build/entry-points.cc b/src/libstore/build/entry-points.cc
index f52f2876f..1f85881fa 100644
--- a/src/libstore/build/entry-points.cc
+++ b/src/libstore/build/entry-points.cc
@@ -2,6 +2,7 @@
#include "substitution-goal.hh"
#include "derivation-goal.hh"
#include "local-store.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libstore/build/hook-instance.cc b/src/libstore/build/hook-instance.cc
index d5da80c74..f91a904cc 100644
--- a/src/libstore/build/hook-instance.cc
+++ b/src/libstore/build/hook-instance.cc
@@ -2,6 +2,7 @@
#include "file-system.hh"
#include "globals.hh"
#include "hook-instance.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libstore/build/local-derivation-goal.cc b/src/libstore/build/local-derivation-goal.cc
index 1571627d6..7553f1e79 100644
--- a/src/libstore/build/local-derivation-goal.cc
+++ b/src/libstore/build/local-derivation-goal.cc
@@ -1,15 +1,12 @@
#include "local-derivation-goal.hh"
#include "indirect-root-store.hh"
-#include "hook-instance.hh"
#include "machines.hh"
#include "store-api.hh"
#include "worker.hh"
#include "builtins.hh"
#include "builtins/buildenv.hh"
#include "path-references.hh"
-#include "finally.hh"
#include "archive.hh"
-#include "compression.hh"
#include "daemon.hh"
#include "topo-sort.hh"
#include "json-utils.hh"
@@ -19,6 +16,7 @@
#include "child.hh"
#include "unix-domain-socket.hh"
#include "mount.hh"
+#include "strings.hh"
#include <regex>
#include <queue>
diff --git a/src/libstore/builtins/buildenv.cc b/src/libstore/builtins/buildenv.cc
index 61c729d27..9fe5f6660 100644
--- a/src/libstore/builtins/buildenv.cc
+++ b/src/libstore/builtins/buildenv.cc
@@ -1,4 +1,5 @@
#include "buildenv.hh"
+#include "strings.hh"
#include <sys/stat.h>
#include <sys/types.h>
diff --git a/src/libstore/builtins/fetchurl.cc b/src/libstore/builtins/fetchurl.cc
index 4049d1c6c..062ecdc14 100644
--- a/src/libstore/builtins/fetchurl.cc
+++ b/src/libstore/builtins/fetchurl.cc
@@ -3,6 +3,7 @@
#include "store-api.hh"
#include "archive.hh"
#include "compression.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libstore/content-address.cc b/src/libstore/content-address.cc
index 6aa6d598d..dae311609 100644
--- a/src/libstore/content-address.cc
+++ b/src/libstore/content-address.cc
@@ -1,6 +1,7 @@
#include "args.hh"
#include "content-address.hh"
#include "split.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc
index 5ac9cd2ef..a9239197b 100644
--- a/src/libstore/daemon.cc
+++ b/src/libstore/daemon.cc
@@ -2,7 +2,7 @@
#include "monitor-fd.hh"
#include "worker-protocol.hh"
#include "worker-protocol-impl.hh"
-#include "build-result.hh"
+#include "build-result.hh" // IWYU pragma: keep
#include "store-api.hh"
#include "store-cast.hh"
#include "gc-store.hh"
@@ -12,6 +12,7 @@
#include "finally.hh"
#include "archive.hh"
#include "derivations.hh"
+#include "strings.hh"
#include "args.hh"
#include <sstream>
diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc
index 7f41e6865..93baa9f20 100644
--- a/src/libstore/derivations.cc
+++ b/src/libstore/derivations.cc
@@ -3,11 +3,12 @@
#include "store-api.hh"
#include "globals.hh"
#include "types.hh"
-#include "split.hh"
#include "common-protocol.hh"
#include "common-protocol-impl.hh"
-#include "fs-accessor.hh"
#include "json-utils.hh"
+#include "strings.hh"
+#include "backed-string-view.hh"
+
#include <boost/container/small_vector.hpp>
#include <nlohmann/json.hpp>
diff --git a/src/libstore/derived-path.hh b/src/libstore/derived-path.hh
index c96e0df67..b75415aec 100644
--- a/src/libstore/derived-path.hh
+++ b/src/libstore/derived-path.hh
@@ -5,6 +5,7 @@
#include "path.hh"
#include "outputs-spec.hh"
#include "comparator.hh"
+#include "ref.hh"
#include <variant>
diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc
index 11c8a755c..f3e8a5312 100644
--- a/src/libstore/filetransfer.cc
+++ b/src/libstore/filetransfer.cc
@@ -5,6 +5,7 @@
#include "s3.hh"
#include "signals.hh"
#include "compression.hh"
+#include "strings.hh"
#if ENABLE_S3
#include <aws/core/client/ClientConfiguration.h>
diff --git a/src/libstore/filetransfer.hh b/src/libstore/filetransfer.hh
index b2ee66312..4352cb81b 100644
--- a/src/libstore/filetransfer.hh
+++ b/src/libstore/filetransfer.hh
@@ -2,6 +2,7 @@
///@file
#include "box_ptr.hh"
+#include "ref.hh"
#include "logging.hh"
#include "serialise.hh"
#include "types.hh"
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index 7b4a12dc9..d5903d01e 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -5,6 +5,7 @@
#include "signals.hh"
#include "finally.hh"
#include "unix-domain-socket.hh"
+#include "strings.hh"
#include <queue>
#include <regex>
diff --git a/src/libstore/legacy-ssh-store.cc b/src/libstore/legacy-ssh-store.cc
index 9e2d65a1c..4433b411d 100644
--- a/src/libstore/legacy-ssh-store.cc
+++ b/src/libstore/legacy-ssh-store.cc
@@ -9,6 +9,7 @@
#include "path-with-outputs.hh"
#include "ssh.hh"
#include "ssh-store.hh"
+#include "strings.hh"
#include "derivations.hh"
namespace nix {
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index 4c8e2ea2f..49991e38a 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -10,6 +10,7 @@
#include "signals.hh"
#include "finally.hh"
#include "compression.hh"
+#include "strings.hh"
#include <algorithm>
#include <cstring>
diff --git a/src/libstore/lock.hh b/src/libstore/lock.hh
index 1c268e1fb..ac5ff061b 100644
--- a/src/libstore/lock.hh
+++ b/src/libstore/lock.hh
@@ -1,11 +1,10 @@
#pragma once
///@file
-#include "types.hh"
-
-#include <optional>
+#include <memory>
#include <sys/types.h>
+#include <vector>
namespace nix {
diff --git a/src/libstore/machines.hh b/src/libstore/machines.hh
index 8516409d4..56d9bed30 100644
--- a/src/libstore/machines.hh
+++ b/src/libstore/machines.hh
@@ -1,7 +1,9 @@
#pragma once
///@file
-#include "types.hh"
+#include "ref.hh"
+#include <set>
+#include <vector>
namespace nix {
diff --git a/src/libstore/make-content-addressed.cc b/src/libstore/make-content-addressed.cc
index abb6e9889..0c592ce22 100644
--- a/src/libstore/make-content-addressed.cc
+++ b/src/libstore/make-content-addressed.cc
@@ -1,5 +1,6 @@
#include "make-content-addressed.hh"
#include "references.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc
index a63a28482..7ea7c189a 100644
--- a/src/libstore/misc.cc
+++ b/src/libstore/misc.cc
@@ -1,12 +1,12 @@
#include "derivations.hh"
#include "parsed-derivations.hh"
#include "globals.hh"
-#include "local-store.hh"
#include "store-api.hh"
#include "thread-pool.hh"
#include "topo-sort.hh"
#include "closure.hh"
#include "filetransfer.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libstore/nar-accessor.hh b/src/libstore/nar-accessor.hh
index 5e19bd3c7..4299daf1b 100644
--- a/src/libstore/nar-accessor.hh
+++ b/src/libstore/nar-accessor.hh
@@ -1,10 +1,12 @@
#pragma once
///@file
+#include "fs-accessor.hh"
+#include "ref.hh"
+
#include <functional>
#include <nlohmann/json_fwd.hpp>
-#include "fs-accessor.hh"
namespace nix {
diff --git a/src/libstore/nar-info-disk-cache.cc b/src/libstore/nar-info-disk-cache.cc
index 5c0bb17b9..c83a8fbfb 100644
--- a/src/libstore/nar-info-disk-cache.cc
+++ b/src/libstore/nar-info-disk-cache.cc
@@ -4,6 +4,7 @@
#include "sqlite.hh"
#include "globals.hh"
#include "users.hh"
+#include "strings.hh"
#include <sqlite3.h>
#include <nlohmann/json.hpp>
diff --git a/src/libstore/nar-info.cc b/src/libstore/nar-info.cc
index e557b4677..0434873df 100644
--- a/src/libstore/nar-info.cc
+++ b/src/libstore/nar-info.cc
@@ -1,4 +1,4 @@
-#include "globals.hh"
+#include "strings.hh"
#include "nar-info.hh"
#include "store-api.hh"
diff --git a/src/libstore/optimise-store.cc b/src/libstore/optimise-store.cc
index 9c871b78f..c60e5a85d 100644
--- a/src/libstore/optimise-store.cc
+++ b/src/libstore/optimise-store.cc
@@ -1,6 +1,7 @@
#include "local-store.hh"
#include "globals.hh"
#include "signals.hh"
+#include "strings.hh"
#include <cstring>
#include <sys/types.h>
diff --git a/src/libstore/parsed-derivations.cc b/src/libstore/parsed-derivations.cc
index 992a79c6e..1b2ec914d 100644
--- a/src/libstore/parsed-derivations.cc
+++ b/src/libstore/parsed-derivations.cc
@@ -1,4 +1,5 @@
#include "parsed-derivations.hh"
+#include "strings.hh"
#include <nlohmann/json.hpp>
#include <regex>
diff --git a/src/libstore/path-info.cc b/src/libstore/path-info.cc
index 4dc2823ce..54519a867 100644
--- a/src/libstore/path-info.cc
+++ b/src/libstore/path-info.cc
@@ -1,5 +1,6 @@
#include "path-info.hh"
#include "store-api.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libstore/path-with-outputs.cc b/src/libstore/path-with-outputs.cc
index af6837370..c49531acb 100644
--- a/src/libstore/path-with-outputs.cc
+++ b/src/libstore/path-with-outputs.cc
@@ -1,7 +1,6 @@
#include "path-with-outputs.hh"
#include "store-api.hh"
-
-#include <regex>
+#include "strings.hh"
namespace nix {
diff --git a/src/libstore/platform/darwin.cc b/src/libstore/platform/darwin.cc
index 078753bff..956fb1e9b 100644
--- a/src/libstore/platform/darwin.cc
+++ b/src/libstore/platform/darwin.cc
@@ -2,6 +2,7 @@
#include "signals.hh"
#include "platform/darwin.hh"
#include "regex.hh"
+#include "strings.hh"
#include <sys/proc_info.h>
#include <sys/sysctl.h>
diff --git a/src/libstore/platform/linux.cc b/src/libstore/platform/linux.cc
index f22fbe58f..486d71885 100644
--- a/src/libstore/platform/linux.cc
+++ b/src/libstore/platform/linux.cc
@@ -5,6 +5,7 @@
#include "signals.hh"
#include "platform/linux.hh"
#include "regex.hh"
+#include "strings.hh"
#include <grp.h>
#include <regex>
diff --git a/src/libstore/profiles.cc b/src/libstore/profiles.cc
index e8b88693d..d88a3b9fe 100644
--- a/src/libstore/profiles.cc
+++ b/src/libstore/profiles.cc
@@ -1,12 +1,11 @@
#include "profiles.hh"
-#include "store-api.hh"
#include "local-fs-store.hh"
#include "users.hh"
+#include "strings.hh"
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
-#include <errno.h>
#include <stdio.h>
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 36223051b..1f94ca03f 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -15,6 +15,8 @@
#include "finally.hh"
#include "logging.hh"
#include "filetransfer.hh"
+#include "strings.hh"
+
#include <nlohmann/json.hpp>
namespace nix {
@@ -64,7 +66,7 @@ void RemoteStore::initConnection(Connection & conn)
{
/* Send the magic greeting, check for the reply. */
try {
- conn.from.endOfFileError = "Nix daemon disconnected unexpectedly (maybe it crashed?)";
+ conn.from.specialEndOfFileError = "Nix daemon disconnected unexpectedly (maybe it crashed?)";
conn.to << WORKER_MAGIC_1;
conn.to.flush();
diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc
index 921a2e556..b50084860 100644
--- a/src/libstore/s3-binary-cache-store.cc
+++ b/src/libstore/s3-binary-cache-store.cc
@@ -7,6 +7,7 @@
#include "globals.hh"
#include "compression.hh"
#include "filetransfer.hh"
+#include "strings.hh"
#include <aws/core/Aws.h>
#include <aws/core/VersionConfig.h>
diff --git a/src/libstore/ssh-store.cc b/src/libstore/ssh-store.cc
index 94c0b7237..fb60326c1 100644
--- a/src/libstore/ssh-store.cc
+++ b/src/libstore/ssh-store.cc
@@ -1,13 +1,11 @@
#include "ssh-store.hh"
#include "store-api.hh"
-#include "local-fs-store.hh"
#include "remote-store.hh"
#include "remote-store-connection.hh"
-#include "remote-fs-accessor.hh"
-#include "archive.hh"
#include "worker-protocol.hh"
#include "pool.hh"
#include "ssh.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc
index f921956e8..cb0604233 100644
--- a/src/libstore/store-api.cc
+++ b/src/libstore/store-api.cc
@@ -5,10 +5,10 @@
#include "nar-info-disk-cache.hh"
#include "thread-pool.hh"
#include "url.hh"
-#include "references.hh"
#include "archive.hh"
-#include "remote-store.hh"
+#include "uds-remote-store.hh"
#include "signals.hh"
+#include "strings.hh"
// FIXME this should not be here, see TODO below on
// `addMultipleToStore`.
#include "worker-protocol.hh"
diff --git a/src/libutil/args.cc b/src/libutil/args.cc
index 1342e7c6a..edcab23ac 100644
--- a/src/libutil/args.cc
+++ b/src/libutil/args.cc
@@ -1,10 +1,11 @@
#include "args.hh"
#include "args/root.hh"
#include "hash.hh"
-#include "json-utils.hh"
+#include "strings.hh"
+#include "json-utils.hh" // IWYU pragma: keep (instances)
#include "environment-variables.hh"
-#include "experimental-features-json.hh"
+#include "experimental-features-json.hh" // IWYU pragma: keep (instances)
#include "logging.hh"
#include <glob.h>
diff --git a/src/libutil/args.hh b/src/libutil/args.hh
index 5fdbaba7e..e2bac6415 100644
--- a/src/libutil/args.hh
+++ b/src/libutil/args.hh
@@ -3,6 +3,8 @@
#include "experimental-features.hh"
#include "types.hh"
+#include "ref.hh"
+
#include <functional>
#include <map>
#include <memory>
diff --git a/src/libutil/backed-string-view.hh b/src/libutil/backed-string-view.hh
new file mode 100644
index 000000000..96136331c
--- /dev/null
+++ b/src/libutil/backed-string-view.hh
@@ -0,0 +1,69 @@
+#pragma once
+/// @file String view that can be either owned or borrowed.
+#include <variant>
+#include <string>
+#include <string_view>
+
+/**
+ * This wants to be a little bit like rust's Cow type.
+ * Some parts of the evaluator benefit greatly from being able to reuse
+ * existing allocations for strings, but have to be able to also use
+ * newly allocated storage for values.
+ *
+ * We do not define implicit conversions, even with ref qualifiers,
+ * since those can easily become ambiguous to the reader and can degrade
+ * into copying behaviour we want to avoid.
+ */
+class BackedStringView {
+private:
+ std::variant<std::string, std::string_view> data;
+
+ /**
+ * Needed to introduce a temporary since operator-> must return
+ * a pointer. Without this we'd need to store the view object
+ * even when we already own a string.
+ */
+ class Ptr {
+ private:
+ std::string_view view;
+ public:
+ Ptr(std::string_view view): view(view) {}
+ const std::string_view * operator->() const { return &view; }
+ };
+
+public:
+ BackedStringView(std::string && s): data(std::move(s)) {}
+ BackedStringView(std::string_view sv): data(sv) {}
+ template<size_t N>
+ BackedStringView(const char (& lit)[N]): data(std::string_view(lit)) {}
+
+ BackedStringView(const BackedStringView &) = delete;
+ BackedStringView & operator=(const BackedStringView &) = delete;
+
+ /**
+ * We only want move operations defined since the sole purpose of
+ * this type is to avoid copies.
+ */
+ BackedStringView(BackedStringView && other) = default;
+ BackedStringView & operator=(BackedStringView && other) = default;
+
+ bool isOwned() const
+ {
+ return std::holds_alternative<std::string>(data);
+ }
+
+ std::string toOwned() &&
+ {
+ return isOwned()
+ ? std::move(std::get<std::string>(data))
+ : std::string(std::get<std::string_view>(data));
+ }
+
+ std::string_view operator*() const
+ {
+ return isOwned()
+ ? std::get<std::string>(data)
+ : std::get<std::string_view>(data);
+ }
+ Ptr operator->() const { return Ptr(**this); }
+};
diff --git a/src/libutil/error.cc b/src/libutil/error.cc
index e5d6a9fa8..a7cbfbfd0 100644
--- a/src/libutil/error.cc
+++ b/src/libutil/error.cc
@@ -3,6 +3,7 @@
#include "logging.hh"
#include "position.hh"
#include "terminal.hh"
+#include "strings.hh"
#include <iostream>
#include <optional>
diff --git a/src/libutil/file-system.cc b/src/libutil/file-system.cc
index 631cf076b..1d266067e 100644
--- a/src/libutil/file-system.cc
+++ b/src/libutil/file-system.cc
@@ -10,6 +10,7 @@
#include "logging.hh"
#include "serialise.hh"
#include "signals.hh"
+#include "strings.hh"
#include "types.hh"
#include "users.hh"
diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc
index f05d4aa98..d383e9802 100644
--- a/src/libutil/hash.cc
+++ b/src/libutil/hash.cc
@@ -10,6 +10,7 @@
#include "charptr-cast.hh"
#include "logging.hh"
#include "split.hh"
+#include "strings.hh"
#include <sys/types.h>
#include <sys/stat.h>
diff --git a/src/libutil/meson.build b/src/libutil/meson.build
index e7f986363..6566f7f46 100644
--- a/src/libutil/meson.build
+++ b/src/libutil/meson.build
@@ -53,6 +53,7 @@ libutil_headers = files(
'archive.hh',
'args/root.hh',
'args.hh',
+ 'backed-string-view.hh',
'box_ptr.hh',
'canon-path.hh',
'cgroup.hh',
diff --git a/src/libutil/processes.cc b/src/libutil/processes.cc
index 61e1ad556..eec592221 100644
--- a/src/libutil/processes.cc
+++ b/src/libutil/processes.cc
@@ -3,6 +3,7 @@
#include "finally.hh"
#include "logging.hh"
#include "processes.hh"
+#include "strings.hh"
#include "serialise.hh"
#include "signals.hh"
diff --git a/src/libutil/regex.cc b/src/libutil/regex.cc
index a9e6c6bee..a12d13550 100644
--- a/src/libutil/regex.cc
+++ b/src/libutil/regex.cc
@@ -1,6 +1,9 @@
#include <string>
#include <regex>
+// Declared as extern in precompiled-headers.hh
+template class std::basic_regex<char>;
+
namespace nix::regex {
std::string quoteRegexChars(const std::string & raw)
{
diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc
index 4eda1b7e7..f509fedff 100644
--- a/src/libutil/serialise.cc
+++ b/src/libutil/serialise.cc
@@ -9,6 +9,21 @@
namespace nix {
+namespace {
+/**
+ * Convert a little-endian integer to host order.
+ */
+template<typename T>
+T readLittleEndian(unsigned char * p)
+{
+ T x = 0;
+ for (size_t i = 0; i < sizeof(x); ++i, ++p) {
+ x |= ((T) *p) << (i * 8);
+ }
+ return x;
+}
+}
+
template<typename T>
T readNum(Source & source)
{
@@ -152,7 +167,7 @@ size_t FdSource::readUnbuffered(char * data, size_t len)
n = ::read(fd, data, len);
} while (n == -1 && errno == EINTR);
if (n == -1) { _good = false; throw SysError("reading from file"); }
- if (n == 0) { _good = false; throw EndOfFile(std::string(*endOfFileError)); }
+ if (n == 0) { _good = false; throw EndOfFile(endOfFileError()); }
read += n;
return n;
}
@@ -163,6 +178,11 @@ bool FdSource::good()
return _good;
}
+std::string FdSource::endOfFileError() const
+{
+ return specialEndOfFileError.has_value() ? *specialEndOfFileError : "unexpected end-of-file";
+}
+
size_t StringSource::read(char * data, size_t len)
{
diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh
index 9ad8018d0..612658b2d 100644
--- a/src/libutil/serialise.hh
+++ b/src/libutil/serialise.hh
@@ -1,12 +1,10 @@
#pragma once
///@file
-#include <concepts>
#include <memory>
#include "charptr-cast.hh"
#include "generator.hh"
-#include "strings.hh"
#include "types.hh"
#include "file-descriptor.hh"
@@ -153,7 +151,10 @@ struct FdSource : BufferedSource
{
int fd;
size_t read = 0;
- BackedStringView endOfFileError{"unexpected end-of-file"};
+ /** Defaults to "unexpected end-of-file" */
+ std::optional<std::string> specialEndOfFileError;
+
+ std::string endOfFileError() const;
FdSource() : fd(-1) { }
FdSource(int fd) : fd(fd) { }
diff --git a/src/libutil/source-path.cc b/src/libutil/source-path.cc
index cfaac20c0..782005ef1 100644
--- a/src/libutil/source-path.cc
+++ b/src/libutil/source-path.cc
@@ -1,4 +1,5 @@
#include "source-path.hh"
+#include "strings.hh"
namespace nix {
diff --git a/src/libutil/strings.hh b/src/libutil/strings.hh
index 7330e2063..ebafab9ad 100644
--- a/src/libutil/strings.hh
+++ b/src/libutil/strings.hh
@@ -165,19 +165,6 @@ std::optional<N> string2Float(const std::string_view s);
/**
- * Convert a little-endian integer to host order.
- */
-template<typename T>
-T readLittleEndian(unsigned char * p)
-{
- T x = 0;
- for (size_t i = 0; i < sizeof(x); ++i, ++p) {
- x |= ((T) *p) << (i * 8);
- }
- return x;
-}
-
-/**
* Convert a string to lower case.
*/
std::string toLower(const std::string & s);
diff --git a/src/libutil/types.hh b/src/libutil/types.hh
index 13cb062fb..66c41fe59 100644
--- a/src/libutil/types.hh
+++ b/src/libutil/types.hh
@@ -1,17 +1,15 @@
#pragma once
///@file
-#include "ref.hh"
-
#include <list>
#include <optional>
#include <set>
#include <string>
-#include <limits>
+#include <string_view>
#include <map>
-#include <variant>
#include <vector>
#include <span>
+#include <stdint.h> // IWYU pragma: keep (this is used literally everywhere)
namespace nix {
@@ -166,70 +164,4 @@ constexpr auto enumerate(T && iterable)
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
-
-
-/**
- * This wants to be a little bit like rust's Cow type.
- * Some parts of the evaluator benefit greatly from being able to reuse
- * existing allocations for strings, but have to be able to also use
- * newly allocated storage for values.
- *
- * We do not define implicit conversions, even with ref qualifiers,
- * since those can easily become ambiguous to the reader and can degrade
- * into copying behaviour we want to avoid.
- */
-class BackedStringView {
-private:
- std::variant<std::string, std::string_view> data;
-
- /**
- * Needed to introduce a temporary since operator-> must return
- * a pointer. Without this we'd need to store the view object
- * even when we already own a string.
- */
- class Ptr {
- private:
- std::string_view view;
- public:
- Ptr(std::string_view view): view(view) {}
- const std::string_view * operator->() const { return &view; }
- };
-
-public:
- BackedStringView(std::string && s): data(std::move(s)) {}
- BackedStringView(std::string_view sv): data(sv) {}
- template<size_t N>
- BackedStringView(const char (& lit)[N]): data(std::string_view(lit)) {}
-
- BackedStringView(const BackedStringView &) = delete;
- BackedStringView & operator=(const BackedStringView &) = delete;
-
- /**
- * We only want move operations defined since the sole purpose of
- * this type is to avoid copies.
- */
- BackedStringView(BackedStringView && other) = default;
- BackedStringView & operator=(BackedStringView && other) = default;
-
- bool isOwned() const
- {
- return std::holds_alternative<std::string>(data);
- }
-
- std::string toOwned() &&
- {
- return isOwned()
- ? std::move(std::get<std::string>(data))
- : std::string(std::get<std::string_view>(data));
- }
-
- std::string_view operator*() const
- {
- return isOwned()
- ? std::get<std::string>(data)
- : std::get<std::string_view>(data);
- }
- Ptr operator->() const { return Ptr(**this); }
-};
-
}
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index 5762b0644..bc43aa7b1 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -1,6 +1,7 @@
#include "archive.hh"
#include "derivations.hh"
#include "dotgraph.hh"
+#include "exit.hh"
#include "globals.hh"
#include "build-result.hh"
#include "store-cast.hh"
@@ -17,7 +18,6 @@
#include <iostream>
#include <algorithm>
-#include <cstdio>
#include <sys/types.h>
#include <sys/stat.h>
diff --git a/src/nix/doctor.cc b/src/nix/doctor.cc
index 4e1cfe8c0..17db3f764 100644
--- a/src/nix/doctor.cc
+++ b/src/nix/doctor.cc
@@ -7,6 +7,7 @@
#include "store-api.hh"
#include "local-fs-store.hh"
#include "worker-protocol.hh"
+#include "exit.hh"
using namespace nix;
diff --git a/src/nix/verify.cc b/src/nix/verify.cc
index 8783d4e04..d4ab352f4 100644
--- a/src/nix/verify.cc
+++ b/src/nix/verify.cc
@@ -1,10 +1,9 @@
#include "command.hh"
#include "shared.hh"
#include "store-api.hh"
-#include "sync.hh"
#include "thread-pool.hh"
#include "signals.hh"
-#include "references.hh"
+#include "exit.hh"
#include <atomic>
diff --git a/src/pch/precompiled-headers.hh b/src/pch/precompiled-headers.hh
index f52f1cab8..c417d27db 100644
--- a/src/pch/precompiled-headers.hh
+++ b/src/pch/precompiled-headers.hh
@@ -58,3 +58,19 @@
#include <unistd.h>
#include <nlohmann/json.hpp>
+
+// This stuff is here to force the compiler to actually apply the extern
+// template directives in all compilation units. To borrow a term, under
+// complex microarchitectural conditions, clang ignores the extern template
+// declaration, as revealed in the profile.
+//
+// In most cases, extern template works fine in the header itself. We don't
+// have any idea why this happens.
+
+// Here because of all the regexes everywhere (it is infeasible to block instantiation everywhere)
+// For some reason this does not actually prevent the instantiation of
+// regex::_M_compile, and the regex compiler (my interpretation of what this is
+// supposed to do is make the template bits out-of-line), but it *does* prevent
+// a bunch of codegen of regex stuff, which seems to save about 30s on-cpu.
+// Instantiated in libutil/regex.cc.
+extern template class std::basic_regex<char>;
diff --git a/tests/unit/libstore/derivation.cc b/tests/unit/libstore/derivation.cc
index f6401a095..21e141693 100644
--- a/tests/unit/libstore/derivation.cc
+++ b/tests/unit/libstore/derivation.cc
@@ -1,8 +1,8 @@
#include <nlohmann/json.hpp>
#include <gtest/gtest.h>
-#include "experimental-features.hh"
#include "derivations.hh"
+#include "strings.hh"
#include "tests/libstore.hh"
#include "tests/characterization.hh"
diff --git a/tests/unit/libstore/protocol.hh b/tests/unit/libstore/protocol.hh
index 059b4d91c..8212959f0 100644
--- a/tests/unit/libstore/protocol.hh
+++ b/tests/unit/libstore/protocol.hh
@@ -1,6 +1,7 @@
#include <nlohmann/json.hpp>
#include <gtest/gtest.h>
+#include "strings.hh"
#include "tests/libstore.hh"
#include "tests/characterization.hh"
diff --git a/tests/unit/libutil/references.cc b/tests/unit/libutil/references.cc
index a914e6c70..ef7111e9c 100644
--- a/tests/unit/libutil/references.cc
+++ b/tests/unit/libutil/references.cc
@@ -1,4 +1,5 @@
#include "references.hh"
+#include "strings.hh"
#include <gtest/gtest.h>
namespace nix {