diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-04-29T19·04+0200 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-04-29T19·07+0200 |
commit | d8bf0d4859e28ddd23401fbe89f4e528aa09ddb3 (patch) | |
tree | b10ec7730294bb404cb08cdf2a85c93e631212bd /src/libexpr/primops/fetchgit.cc | |
parent | 38539b943a060d9cdfc24d6e5d997c0885b8aa2f (diff) |
Support Git repos in the Nix path
E.g. $ nix-build -I nixpkgs=git://github.com/NixOS/nixpkgs '<nixpkgs>' -A hello This is not extremely useful yet because you can't specify a branch/revision.
Diffstat (limited to 'src/libexpr/primops/fetchgit.cc')
-rw-r--r-- | src/libexpr/primops/fetchgit.cc | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/src/libexpr/primops/fetchgit.cc b/src/libexpr/primops/fetchgit.cc index e2a545ee0562..bd440c8c62ad 100644 --- a/src/libexpr/primops/fetchgit.cc +++ b/src/libexpr/primops/fetchgit.cc @@ -5,6 +5,43 @@ namespace nix { +Path exportGit(ref<Store> store, const std::string & uri, const std::string & rev) +{ + if (!isUri(uri)) + throw EvalError(format("‘%s’ is not a valid URI") % uri); + + Path cacheDir = getCacheDir() + "/nix/git"; + + if (!pathExists(cacheDir)) { + createDirs(cacheDir); + runProgram("git", true, { "init", "--bare", cacheDir }); + } + + Activity act(*logger, lvlInfo, format("fetching Git repository ‘%s’") % uri); + + std::string localRef = "pid-" + std::to_string(getpid()); + Path localRefFile = cacheDir + "/refs/heads/" + localRef; + + runProgram("git", true, { "-C", cacheDir, "fetch", uri, rev + ":" + localRef }); + + std::string commitHash = chomp(readFile(localRefFile)); + + unlink(localRefFile.c_str()); + + debug(format("got revision ‘%s’") % commitHash); + + // FIXME: should pipe this, or find some better way to extract a + // revision. + auto tar = runProgram("git", true, { "-C", cacheDir, "archive", commitHash }); + + Path tmpDir = createTempDir(); + AutoDelete delTmpDir(tmpDir, true); + + runProgram("tar", true, { "x", "-C", tmpDir }, tar); + + return store->addToStore("git-export", tmpDir); +} + static void prim_fetchgit(EvalState & state, const Pos & pos, Value * * args, Value & v) { // FIXME: cut&paste from fetch(). @@ -35,39 +72,7 @@ static void prim_fetchgit(EvalState & state, const Pos & pos, Value * * args, Va } else url = state.forceStringNoCtx(*args[0], pos); - if (!isUri(url)) - throw EvalError(format("‘%s’ is not a valid URI, at %s") % url % pos); - - Path cacheDir = getCacheDir() + "/nix/git"; - - if (!pathExists(cacheDir)) { - createDirs(cacheDir); - runProgram("git", true, { "init", "--bare", cacheDir }); - } - - Activity act(*logger, lvlInfo, format("fetching Git repository ‘%s’") % url); - - std::string localRef = "pid-" + std::to_string(getpid()); - Path localRefFile = cacheDir + "/refs/heads/" + localRef; - - runProgram("git", true, { "-C", cacheDir, "fetch", url, rev + ":" + localRef }); - - std::string commitHash = chomp(readFile(localRefFile)); - - unlink(localRefFile.c_str()); - - debug(format("got revision ‘%s’") % commitHash); - - // FIXME: should pipe this, or find some better way to extract a - // revision. - auto tar = runProgram("git", true, { "-C", cacheDir, "archive", commitHash }); - - Path tmpDir = createTempDir(); - AutoDelete delTmpDir(tmpDir, true); - - runProgram("tar", true, { "x", "-C", tmpDir }, tar); - - Path storePath = state.store->addToStore("git-export", tmpDir); + Path storePath = exportGit(state.store, url, rev); mkString(v, storePath, PathSet({storePath})); } |