forked from lix-project/lix
convert a for more utilities to string_view
This commit is contained in:
parent
558c4ee3e3
commit
0d7fae6a57
8 changed files with 32 additions and 23 deletions
|
@ -309,8 +309,8 @@ private:
|
||||||
friend struct ExprAttrs;
|
friend struct ExprAttrs;
|
||||||
friend struct ExprLet;
|
friend struct ExprLet;
|
||||||
|
|
||||||
Expr * parse(char * text, size_t length, FileOrigin origin, const Path & path,
|
Expr * parse(char * text, size_t length, FileOrigin origin, const PathView path,
|
||||||
const Path & basePath, StaticEnv & staticEnv);
|
const PathView basePath, StaticEnv & staticEnv);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
|
@ -598,7 +598,7 @@ namespace nix {
|
||||||
|
|
||||||
|
|
||||||
Expr * EvalState::parse(char * text, size_t length, FileOrigin origin,
|
Expr * EvalState::parse(char * text, size_t length, FileOrigin origin,
|
||||||
const Path & path, const Path & basePath, StaticEnv & staticEnv)
|
const PathView path, const PathView basePath, StaticEnv & staticEnv)
|
||||||
{
|
{
|
||||||
yyscan_t scanner;
|
yyscan_t scanner;
|
||||||
ParseData data(*this);
|
ParseData data(*this);
|
||||||
|
|
|
@ -26,7 +26,7 @@ static void makeWritable(const Path & path)
|
||||||
struct MakeReadOnly
|
struct MakeReadOnly
|
||||||
{
|
{
|
||||||
Path path;
|
Path path;
|
||||||
MakeReadOnly(const Path & path) : path(path) { }
|
MakeReadOnly(const PathView path) : path(path) { }
|
||||||
~MakeReadOnly()
|
~MakeReadOnly()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
@ -205,12 +205,13 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats,
|
||||||
/* Make the containing directory writable, but only if it's not
|
/* Make the containing directory writable, but only if it's not
|
||||||
the store itself (we don't want or need to mess with its
|
the store itself (we don't want or need to mess with its
|
||||||
permissions). */
|
permissions). */
|
||||||
bool mustToggle = dirOf(path) != realStoreDir.get();
|
const Path dirOfPath(dirOf(path));
|
||||||
if (mustToggle) makeWritable(dirOf(path));
|
bool mustToggle = dirOfPath != realStoreDir.get();
|
||||||
|
if (mustToggle) makeWritable(dirOfPath);
|
||||||
|
|
||||||
/* When we're done, make the directory read-only again and reset
|
/* When we're done, make the directory read-only again and reset
|
||||||
its timestamp back to 0. */
|
its timestamp back to 0. */
|
||||||
MakeReadOnly makeReadOnly(mustToggle ? dirOf(path) : "");
|
MakeReadOnly makeReadOnly(mustToggle ? dirOfPath : "");
|
||||||
|
|
||||||
Path tempLink = (format("%1%/.tmp-link-%2%-%3%")
|
Path tempLink = (format("%1%/.tmp-link-%2%-%3%")
|
||||||
% realStoreDir % getpid() % random()).str();
|
% realStoreDir % getpid() % random()).str();
|
||||||
|
|
|
@ -170,7 +170,7 @@ std::string writeStructuredAttrsShell(const nlohmann::json & json)
|
||||||
|
|
||||||
auto handleSimpleType = [](const nlohmann::json & value) -> std::optional<std::string> {
|
auto handleSimpleType = [](const nlohmann::json & value) -> std::optional<std::string> {
|
||||||
if (value.is_string())
|
if (value.is_string())
|
||||||
return shellEscape(value);
|
return shellEscape(value.get<std::string_view>());
|
||||||
|
|
||||||
if (value.is_number()) {
|
if (value.is_number()) {
|
||||||
auto f = value.get<float>();
|
auto f = value.get<float>();
|
||||||
|
|
|
@ -81,7 +81,7 @@ void replaceEnv(std::map<std::string, std::string> newEnv)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Path absPath(Path path, std::optional<Path> dir, bool resolveSymlinks)
|
Path absPath(Path path, std::optional<PathView> dir, bool resolveSymlinks)
|
||||||
{
|
{
|
||||||
if (path[0] != '/') {
|
if (path[0] != '/') {
|
||||||
if (!dir) {
|
if (!dir) {
|
||||||
|
@ -95,12 +95,12 @@ Path absPath(Path path, std::optional<Path> dir, bool resolveSymlinks)
|
||||||
if (!getcwd(buf, sizeof(buf)))
|
if (!getcwd(buf, sizeof(buf)))
|
||||||
#endif
|
#endif
|
||||||
throw SysError("cannot get cwd");
|
throw SysError("cannot get cwd");
|
||||||
dir = buf;
|
path = concatStrings(buf, "/", path);
|
||||||
#ifdef __GNU__
|
#ifdef __GNU__
|
||||||
free(buf);
|
free(buf);
|
||||||
#endif
|
#endif
|
||||||
}
|
} else
|
||||||
path = *dir + "/" + path;
|
path = concatStrings(*dir, "/", path);
|
||||||
}
|
}
|
||||||
return canonPath(path, resolveSymlinks);
|
return canonPath(path, resolveSymlinks);
|
||||||
}
|
}
|
||||||
|
@ -172,7 +172,7 @@ Path canonPath(PathView path, bool resolveSymlinks)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Path dirOf(const Path & path)
|
Path dirOf(const PathView path)
|
||||||
{
|
{
|
||||||
Path::size_type pos = path.rfind('/');
|
Path::size_type pos = path.rfind('/');
|
||||||
if (pos == string::npos)
|
if (pos == string::npos)
|
||||||
|
@ -1344,9 +1344,11 @@ std::string toLower(const std::string & s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string shellEscape(const std::string & s)
|
std::string shellEscape(const std::string_view s)
|
||||||
{
|
{
|
||||||
std::string r = "'";
|
std::string r;
|
||||||
|
r.reserve(s.size() + 2);
|
||||||
|
r += "'";
|
||||||
for (auto & i : s)
|
for (auto & i : s)
|
||||||
if (i == '\'') r += "'\\''"; else r += i;
|
if (i == '\'') r += "'\\''"; else r += i;
|
||||||
r += '\'';
|
r += '\'';
|
||||||
|
@ -1751,7 +1753,7 @@ void bind(int fd, const std::string & path)
|
||||||
|
|
||||||
if (path.size() + 1 >= sizeof(addr.sun_path)) {
|
if (path.size() + 1 >= sizeof(addr.sun_path)) {
|
||||||
Pid pid = startProcess([&]() {
|
Pid pid = startProcess([&]() {
|
||||||
auto dir = dirOf(path);
|
Path dir = dirOf(path);
|
||||||
if (chdir(dir.c_str()) == -1)
|
if (chdir(dir.c_str()) == -1)
|
||||||
throw SysError("chdir to '%s' failed", dir);
|
throw SysError("chdir to '%s' failed", dir);
|
||||||
std::string base(baseNameOf(path));
|
std::string base(baseNameOf(path));
|
||||||
|
@ -1780,7 +1782,7 @@ void connect(int fd, const std::string & path)
|
||||||
|
|
||||||
if (path.size() + 1 >= sizeof(addr.sun_path)) {
|
if (path.size() + 1 >= sizeof(addr.sun_path)) {
|
||||||
Pid pid = startProcess([&]() {
|
Pid pid = startProcess([&]() {
|
||||||
auto dir = dirOf(path);
|
Path dir = dirOf(path);
|
||||||
if (chdir(dir.c_str()) == -1)
|
if (chdir(dir.c_str()) == -1)
|
||||||
throw SysError("chdir to '%s' failed", dir);
|
throw SysError("chdir to '%s' failed", dir);
|
||||||
std::string base(baseNameOf(path));
|
std::string base(baseNameOf(path));
|
||||||
|
|
|
@ -49,7 +49,7 @@ void clearEnv();
|
||||||
specified directory, or the current directory otherwise. The path
|
specified directory, or the current directory otherwise. The path
|
||||||
is also canonicalised. */
|
is also canonicalised. */
|
||||||
Path absPath(Path path,
|
Path absPath(Path path,
|
||||||
std::optional<Path> dir = {},
|
std::optional<PathView> dir = {},
|
||||||
bool resolveSymlinks = false);
|
bool resolveSymlinks = false);
|
||||||
|
|
||||||
/* Canonicalise a path by removing all `.' or `..' components and
|
/* Canonicalise a path by removing all `.' or `..' components and
|
||||||
|
@ -62,7 +62,7 @@ Path canonPath(PathView path, bool resolveSymlinks = false);
|
||||||
everything before the final `/'. If the path is the root or an
|
everything before the final `/'. If the path is the root or an
|
||||||
immediate child thereof (e.g., `/foo'), this means `/'
|
immediate child thereof (e.g., `/foo'), this means `/'
|
||||||
is returned.*/
|
is returned.*/
|
||||||
Path dirOf(const Path & path);
|
Path dirOf(const PathView path);
|
||||||
|
|
||||||
/* Return the base name of the given canonical path, i.e., everything
|
/* Return the base name of the given canonical path, i.e., everything
|
||||||
following the final `/' (trailing slashes are removed). */
|
following the final `/' (trailing slashes are removed). */
|
||||||
|
@ -148,6 +148,9 @@ Path getDataDir();
|
||||||
/* Create a directory and all its parents, if necessary. Returns the
|
/* Create a directory and all its parents, if necessary. Returns the
|
||||||
list of created directories, in order of creation. */
|
list of created directories, in order of creation. */
|
||||||
Paths createDirs(const Path & path);
|
Paths createDirs(const Path & path);
|
||||||
|
inline Paths createDirs(PathView path) {
|
||||||
|
return createDirs(Path(path));
|
||||||
|
}
|
||||||
|
|
||||||
/* Create a symlink. */
|
/* Create a symlink. */
|
||||||
void createSymlink(const Path & target, const Path & link,
|
void createSymlink(const Path & target, const Path & link,
|
||||||
|
@ -187,6 +190,7 @@ public:
|
||||||
void cancel();
|
void cancel();
|
||||||
void reset(const Path & p, bool recursive = true);
|
void reset(const Path & p, bool recursive = true);
|
||||||
operator Path() const { return path; }
|
operator Path() const { return path; }
|
||||||
|
operator PathView() const { return path; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -491,7 +495,7 @@ std::string toLower(const std::string & s);
|
||||||
|
|
||||||
|
|
||||||
/* Escape a string as a shell word. */
|
/* Escape a string as a shell word. */
|
||||||
std::string shellEscape(const std::string & s);
|
std::string shellEscape(const std::string_view s);
|
||||||
|
|
||||||
|
|
||||||
/* Exception handling in destructors: print an error message, then
|
/* Exception handling in destructors: print an error message, then
|
||||||
|
|
|
@ -472,9 +472,11 @@ struct CmdDevelop : Common, MixEnvironment
|
||||||
else {
|
else {
|
||||||
script = "[ -n \"$PS1\" ] && [ -e ~/.bashrc ] && source ~/.bashrc;\n" + script;
|
script = "[ -n \"$PS1\" ] && [ -e ~/.bashrc ] && source ~/.bashrc;\n" + script;
|
||||||
if (developSettings.bashPrompt != "")
|
if (developSettings.bashPrompt != "")
|
||||||
script += fmt("[ -n \"$PS1\" ] && PS1=%s;\n", shellEscape(developSettings.bashPrompt));
|
script += fmt("[ -n \"$PS1\" ] && PS1=%s;\n",
|
||||||
|
shellEscape(developSettings.bashPrompt.get()));
|
||||||
if (developSettings.bashPromptSuffix != "")
|
if (developSettings.bashPromptSuffix != "")
|
||||||
script += fmt("[ -n \"$PS1\" ] && PS1+=%s;\n", shellEscape(developSettings.bashPromptSuffix));
|
script += fmt("[ -n \"$PS1\" ] && PS1+=%s;\n",
|
||||||
|
shellEscape(developSettings.bashPromptSuffix.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
writeFull(rcFileFd.get(), script);
|
writeFull(rcFileFd.get(), script);
|
||||||
|
|
|
@ -107,7 +107,7 @@ Path resolveSymlink(const Path & path)
|
||||||
auto target = readLink(path);
|
auto target = readLink(path);
|
||||||
return hasPrefix(target, "/")
|
return hasPrefix(target, "/")
|
||||||
? target
|
? target
|
||||||
: dirOf(path) + "/" + target;
|
: concatStrings(dirOf(path), "/", target);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<string> resolveTree(const Path & path, PathSet & deps)
|
std::set<string> resolveTree(const Path & path, PathSet & deps)
|
||||||
|
|
Loading…
Reference in a new issue