* `nix-store --read-log / -l PATH' shows the build log of PATH, if

available.  For instance,

    $ nix-store -l $(which svn) | less

  lets you read the build log of the Subversion instance in your
  profile.

* `nix-store -qb': if applied to a non-derivation, take the deriver.
This commit is contained in:
Eelco Dolstra 2006-10-28 16:33:54 +00:00
parent 99b0ea7c67
commit ae6fb27f18
5 changed files with 60 additions and 4 deletions

View file

@ -5,6 +5,23 @@
<!--==================================================================-->
<section><title>Release 0.11 (TBA)</title>
<itemizedlist>
<listitem><para><command>nix-store</command> has a new operation
<option>--read-log</option> (<option>-l</option>)
<parameter>paths</parameter> that shows the build log of the given
paths.</para></listitem>
</itemizedlist>
</section>
<!--==================================================================--> <!--==================================================================-->
<section><title>Release 0.10.1 (October 11, 2006)</title> <section><title>Release 0.10.1 (October 11, 2006)</title>

View file

@ -1511,7 +1511,7 @@ void DerivationGoal::computeClosure()
} }
static string drvsLogDir = "drvs"; string drvsLogDir = "drvs";
void DerivationGoal::openLogFile() void DerivationGoal::openLogFile()

View file

@ -8,6 +8,9 @@
namespace nix { namespace nix {
extern string drvsLogDir;
/* Ensure that the output paths of the derivation are valid. If they /* Ensure that the output paths of the derivation are valid. If they
are already valid, this is a no-op. Otherwise, validity can are already valid, this is a no-op. Otherwise, validity can
be reached in two ways. First, if the output paths have be reached in two ways. First, if the output paths have

View file

@ -9,6 +9,7 @@ Operations:
--add / -A: copy a path to the Nix store --add / -A: copy a path to the Nix store
--delete: safely delete paths from the Nix store --delete: safely delete paths from the Nix store
--query / -q: query information --query / -q: query information
--read-log / -l: print build log of given store paths
--register-substitutes: register a substitute expression (dangerous!) --register-substitutes: register a substitute expression (dangerous!)
--clear-substitutes: clear all substitutes --clear-substitutes: clear all substitutes

View file

@ -46,6 +46,17 @@ static Path fixPath(Path path)
} }
static Path useDeriver(Path path)
{
if (!isDerivation(path)) {
path = queryDeriver(noTxn, path);
if (path == "")
throw Error(format("deriver of path `%1%' is not known") % path);
}
return path;
}
/* Realisation the given path. For a derivation that means build it; /* Realisation the given path. For a derivation that means build it;
for other paths it means ensure their validity. */ for other paths it means ensure their validity. */
static Path realisePath(const Path & path) static Path realisePath(const Path & path)
@ -360,12 +371,12 @@ static void opQuery(Strings opFlags, Strings opArgs)
for (Strings::iterator i = opArgs.begin(); for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); ++i) i != opArgs.end(); ++i)
{ {
*i = fixPath(*i); Path path = useDeriver(fixPath(*i));
Derivation drv = derivationFromPath(*i); Derivation drv = derivationFromPath(path);
StringPairs::iterator j = drv.env.find(bindingName); StringPairs::iterator j = drv.env.find(bindingName);
if (j == drv.env.end()) if (j == drv.env.end())
throw Error(format("derivation `%1%' has no environment binding named `%2%'") throw Error(format("derivation `%1%' has no environment binding named `%2%'")
% *i % bindingName); % path % bindingName);
cout << format("%1%\n") % j->second; cout << format("%1%\n") % j->second;
} }
break; break;
@ -404,6 +415,28 @@ static void opQuery(Strings opFlags, Strings opArgs)
} }
static void opReadLog(Strings opFlags, Strings opArgs)
{
if (!opFlags.empty()) throw UsageError("unknown flag");
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); ++i)
{
Path path = useDeriver(fixPath(*i));
Path logPath = (format("%1%/%2%/%3%") %
nixLogDir % drvsLogDir % baseNameOf(path)).str();
if (!pathExists(logPath))
throw Error(format("build log of derivation `%1%' is not available") % path);
/* !!! Make this run in O(1) memory. */
string log = readFile(logPath);
writeFull(STDOUT_FILENO, (const unsigned char *) log.c_str(), log.size());
}
}
static void opRegisterSubstitutes(Strings opFlags, Strings opArgs) static void opRegisterSubstitutes(Strings opFlags, Strings opArgs)
{ {
if (!opFlags.empty()) throw UsageError("unknown flag"); if (!opFlags.empty()) throw UsageError("unknown flag");
@ -663,6 +696,8 @@ void run(Strings args)
op = opDelete; op = opDelete;
else if (arg == "--query" || arg == "-q") else if (arg == "--query" || arg == "-q")
op = opQuery; op = opQuery;
else if (arg == "--read-log" || arg == "-l")
op = opReadLog;
else if (arg == "--register-substitutes") else if (arg == "--register-substitutes")
op = opRegisterSubstitutes; op = opRegisterSubstitutes;
else if (arg == "--clear-substitutes") else if (arg == "--clear-substitutes")