forked from lix-project/lix
Merge pull request #3736 from obsidiansystems/allow-relative-paths-in-store-option
Allow relative paths in --store option
This commit is contained in:
commit
ff314f186e
|
@ -967,12 +967,20 @@ ref<Store> openStore(const std::string & uri_,
|
||||||
throw Error("don't know how to open Nix store '%s'", uri);
|
throw Error("don't know how to open Nix store '%s'", uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isNonUriPath(const std::string & spec) {
|
||||||
|
return
|
||||||
|
// is not a URL
|
||||||
|
spec.find("://") == std::string::npos
|
||||||
|
// Has at least one path separator, and so isn't a single word that
|
||||||
|
// might be special like "auto"
|
||||||
|
&& spec.find("/") != std::string::npos;
|
||||||
|
}
|
||||||
|
|
||||||
StoreType getStoreType(const std::string & uri, const std::string & stateDir)
|
StoreType getStoreType(const std::string & uri, const std::string & stateDir)
|
||||||
{
|
{
|
||||||
if (uri == "daemon") {
|
if (uri == "daemon") {
|
||||||
return tDaemon;
|
return tDaemon;
|
||||||
} else if (uri == "local" || hasPrefix(uri, "/")) {
|
} else if (uri == "local" || isNonUriPath(uri)) {
|
||||||
return tLocal;
|
return tLocal;
|
||||||
} else if (uri == "" || uri == "auto") {
|
} else if (uri == "" || uri == "auto") {
|
||||||
if (access(stateDir.c_str(), R_OK | W_OK) == 0)
|
if (access(stateDir.c_str(), R_OK | W_OK) == 0)
|
||||||
|
@ -996,8 +1004,9 @@ static RegisterStoreImplementation regStore([](
|
||||||
return std::shared_ptr<Store>(std::make_shared<UDSRemoteStore>(params));
|
return std::shared_ptr<Store>(std::make_shared<UDSRemoteStore>(params));
|
||||||
case tLocal: {
|
case tLocal: {
|
||||||
Store::Params params2 = params;
|
Store::Params params2 = params;
|
||||||
if (hasPrefix(uri, "/"))
|
if (isNonUriPath(uri)) {
|
||||||
params2["root"] = uri;
|
params2["root"] = absPath(uri);
|
||||||
|
}
|
||||||
return std::shared_ptr<Store>(std::make_shared<LocalStore>(params2));
|
return std::shared_ptr<Store>(std::make_shared<LocalStore>(params2));
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
20
tests/local-store.sh
Normal file
20
tests/local-store.sh
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
source common.sh
|
||||||
|
|
||||||
|
cd $TEST_ROOT
|
||||||
|
|
||||||
|
echo example > example.txt
|
||||||
|
mkdir -p ./x
|
||||||
|
|
||||||
|
NIX_STORE_DIR=$TEST_ROOT/x
|
||||||
|
|
||||||
|
CORRECT_PATH=$(nix-store --store ./x --add example.txt)
|
||||||
|
|
||||||
|
PATH1=$(nix path-info --store ./x $CORRECT_PATH)
|
||||||
|
[ $CORRECT_PATH == $PATH1 ]
|
||||||
|
|
||||||
|
PATH2=$(nix path-info --store "$PWD/x" $CORRECT_PATH)
|
||||||
|
[ $CORRECT_PATH == $PATH2 ]
|
||||||
|
|
||||||
|
# FIXME we could also test the query parameter version:
|
||||||
|
# PATH3=$(nix path-info --store "local?store=$PWD/x" $CORRECT_PATH)
|
||||||
|
# [ $CORRECT_PATH == $PATH3 ]
|
|
@ -6,7 +6,7 @@ nix_tests = \
|
||||||
gc-auto.sh \
|
gc-auto.sh \
|
||||||
referrers.sh user-envs.sh logging.sh nix-build.sh misc.sh fixed.sh \
|
referrers.sh user-envs.sh logging.sh nix-build.sh misc.sh fixed.sh \
|
||||||
gc-runtime.sh check-refs.sh filter-source.sh \
|
gc-runtime.sh check-refs.sh filter-source.sh \
|
||||||
remote-store.sh export.sh export-graph.sh \
|
local-store.sh remote-store.sh export.sh export-graph.sh \
|
||||||
timeout.sh secure-drv-outputs.sh nix-channel.sh \
|
timeout.sh secure-drv-outputs.sh nix-channel.sh \
|
||||||
multiple-outputs.sh import-derivation.sh fetchurl.sh optimise-store.sh \
|
multiple-outputs.sh import-derivation.sh fetchurl.sh optimise-store.sh \
|
||||||
binary-cache.sh nix-profile.sh repair.sh dump-db.sh case-hack.sh \
|
binary-cache.sh nix-profile.sh repair.sh dump-db.sh case-hack.sh \
|
||||||
|
|
Loading…
Reference in a new issue