Skip to content

Commit

Permalink
builtins.fetchgit: Support a "name" attribute
Browse files Browse the repository at this point in the history
The "name" attribute defaults to "source", which we should use for all
similar functions (e.g. fetchTarball and in Hydra) to ensure that we
get a consistent store path regardless of how the tree is fetched.

"source" is not necessarily a correct label, but using an empty name
is problematic: you get an ugly store path ending in a dash, and it's
impossible to have a fixed-output derivation that produces that path
because ".drv" is not a valid store name.

Fixes #904.
  • Loading branch information
edolstra committed Oct 30, 2017
1 parent c1ae189 commit 65b5f17
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 11 deletions.
26 changes: 16 additions & 10 deletions src/libexpr/primops/fetchgit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@

#include <regex>

using namespace std::string_literals;

namespace nix {

Path exportGit(ref<Store> store, const std::string & uri,
const std::string & ref, const std::string & rev)
const std::string & ref, const std::string & rev,
const std::string & name)
{
if (rev != "") {
std::regex revRegex("^[0-9a-fA-F]{40}$");
Expand Down Expand Up @@ -51,12 +54,12 @@ Path exportGit(ref<Store> store, const std::string & uri,
}

// FIXME: check whether rev is an ancestor of ref.
std::string commitHash =
rev != "" ? rev : chomp(readFile(localRefFile));
std::string commitHash = rev != "" ? rev : chomp(readFile(localRefFile));

printTalkative("using revision %s of repo '%s'", uri, commitHash);

Path storeLink = cacheDir + "/" + commitHash + ".link";
std::string storeLinkName = hashString(htSHA512, name + std::string("\0"s) + commitHash).to_string(Base32, false);
Path storeLink = cacheDir + "/" + storeLinkName + ".link";
PathLocks storeLinkLock({storeLink}, fmt("waiting for lock on '%1%'...", storeLink));

if (pathExists(storeLink)) {
Expand All @@ -76,7 +79,7 @@ Path exportGit(ref<Store> store, const std::string & uri,

runProgram("tar", true, { "x", "-C", tmpDir }, tar);

auto storePath = store->addToStore("git-export", tmpDir);
auto storePath = store->addToStore(name, tmpDir);

replaceSymlink(storePath, storeLink);

Expand All @@ -91,6 +94,7 @@ static void prim_fetchgit(EvalState & state, const Pos & pos, Value * * args, Va
std::string url;
std::string ref = "master";
std::string rev;
std::string name = "source";

state.forceValue(*args[0]);

Expand All @@ -99,16 +103,18 @@ static void prim_fetchgit(EvalState & state, const Pos & pos, Value * * args, Va
state.forceAttrs(*args[0], pos);

for (auto & attr : *args[0]->attrs) {
string name(attr.name);
if (name == "url") {
string n(attr.name);
if (n == "url") {
PathSet context;
url = state.coerceToString(*attr.pos, *attr.value, context, false, false);
if (hasPrefix(url, "/")) url = "file://" + url;
}
else if (name == "ref")
else if (n == "ref")
ref = state.forceStringNoCtx(*attr.value, *attr.pos);
else if (name == "rev")
else if (n == "rev")
rev = state.forceStringNoCtx(*attr.value, *attr.pos);
else if (n == "name")
name = state.forceStringNoCtx(*attr.value, *attr.pos);
else
throw EvalError("unsupported argument '%s' to 'fetchgit', at %s", attr.name, *attr.pos);
}
Expand All @@ -119,7 +125,7 @@ static void prim_fetchgit(EvalState & state, const Pos & pos, Value * * args, Va
} else
url = state.forceStringNoCtx(*args[0], pos);

Path storePath = exportGit(state.store, url, ref, rev);
Path storePath = exportGit(state.store, url, ref, rev, name);

mkString(v, storePath, PathSet({storePath}));
}
Expand Down
3 changes: 2 additions & 1 deletion src/libexpr/primops/fetchgit.hh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace nix {
class Store;

Path exportGit(ref<Store> store, const std::string & uri,
const std::string & ref, const std::string & rev = "");
const std::string & ref, const std::string & rev = "",
const std::string & name = "");

}

0 comments on commit 65b5f17

Please sign in to comment.