aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2005-02-15 10:49:31 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2005-02-15 10:49:31 +0000
commite17910cfb5ddeca2c136bc0a951318beea2e8a13 (patch)
tree82f03ded20fddcec3f3eaed600c1c0dfff313bcd /src
parent0083562f759223f3ef7ace4f269137cf68bf1295 (diff)
* And yet another installation source: the ability to copy user
environment elements from one user environment to another, e.g., $ nix-env -i --from-profile /nix/var/nix/profiles/other-profile aterm copies the `aterm' component installed in the `other-profile' to the user's current profile.
Diffstat (limited to 'src')
-rw-r--r--src/nix-env/main.cc80
1 files changed, 46 insertions, 34 deletions
diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc
index bab1f7fe1..2db59e4b1 100644
--- a/src/nix-env/main.cc
+++ b/src/nix-env/main.cc
@@ -169,12 +169,12 @@ struct AddPos : TermFun
};
-static void queryInstalled(EvalState & state, UserEnvElems & elems,
- const Path & userEnv)
+static UserEnvElems queryInstalled(EvalState & state, const Path & userEnv)
{
Path path = userEnv + "/manifest";
- if (!pathExists(path)) return; /* not an error, assume nothing installed */
+ if (!pathExists(path))
+ return UserEnvElems(); /* not an error, assume nothing installed */
Expr e = ATreadFromNamedFile(path.c_str());
if (!e) throw Error(format("cannot read Nix expression from `%1%'") % path);
@@ -183,7 +183,9 @@ static void queryInstalled(EvalState & state, UserEnvElems & elems,
AddPos addPos;
e = bottomupRewrite(addPos, e);
+ UserEnvElems elems;
parseDerivations(state, e, elems);
+ return elems;
}
@@ -273,6 +275,39 @@ static void createUserEnv(EvalState & state, const UserEnvElems & elems,
}
+static UserEnvElems filterBySelector(const UserEnvElems & allElems,
+ const Strings & args)
+{
+ DrvNames selectors = drvNamesFromArgs(args);
+
+ UserEnvElems elems;
+
+ /* Filter out the ones we're not interested in. */
+ for (UserEnvElems::const_iterator i = allElems.begin();
+ i != allElems.end(); ++i)
+ {
+ DrvName drvName(i->second.name);
+ for (DrvNames::iterator j = selectors.begin();
+ j != selectors.end(); ++j)
+ {
+ if (j->matches(drvName)) {
+ j->hits++;
+ elems.insert(*i);
+ }
+ }
+ }
+
+ /* Check that all selectors have been used. */
+ for (DrvNames::iterator i = selectors.begin();
+ i != selectors.end(); ++i)
+ if (i->hits == 0)
+ throw Error(format("selector `%1%' matches no derivations")
+ % i->fullName);
+
+ return elems;
+}
+
+
static void queryInstSources(EvalState & state,
const InstallSourceInfo & instSource, const Strings & args,
UserEnvElems & elems)
@@ -289,35 +324,13 @@ static void queryInstSources(EvalState & state,
case srcUnknown:
case srcNixExprDrvs: {
- DrvNames selectors = drvNamesFromArgs(args);
-
/* Load the derivations from the (default or specified)
Nix expression. */
UserEnvElems allElems;
loadDerivations(state, instSource.nixExprPath,
instSource.systemFilter, allElems);
- /* Filter out the ones we're not interested in. */
- for (UserEnvElems::iterator i = allElems.begin();
- i != allElems.end(); ++i)
- {
- DrvName drvName(i->second.name);
- for (DrvNames::iterator j = selectors.begin();
- j != selectors.end(); ++j)
- {
- if (j->matches(drvName)) {
- j->hits++;
- elems.insert(*i);
- }
- }
- }
-
- /* Check that all selectors have been used. */
- for (DrvNames::iterator i = selectors.begin();
- i != selectors.end(); ++i)
- if (i->hits == 0)
- throw Error(format("selector `%1%' matches no derivations")
- % i->fullName);
+ elems = filterBySelector(allElems, args);
break;
}
@@ -373,6 +386,8 @@ static void queryInstSources(EvalState & state,
break;
case srcProfile:
+ elems = filterBySelector(
+ queryInstalled(state, instSource.profile), args);
break;
}
}
@@ -396,8 +411,7 @@ static void installDerivations(Globals & globals,
/* Add in the already installed derivations, unless they have the
same name as a to-be-installed element. */
- UserEnvElems installedElems;
- queryInstalled(globals.state, installedElems, profile);
+ UserEnvElems installedElems = queryInstalled(globals.state, profile);
for (UserEnvElems::iterator i = installedElems.begin();
i != installedElems.end(); ++i)
@@ -443,8 +457,7 @@ static void upgradeDerivations(Globals & globals,
name and a higher version number. */
/* Load the currently installed derivations. */
- UserEnvElems installedElems;
- queryInstalled(globals.state, installedElems, profile);
+ UserEnvElems installedElems = queryInstalled(globals.state, profile);
/* Fetch all derivations from the input file. */
UserEnvElems availElems;
@@ -519,8 +532,7 @@ static void opUpgrade(Globals & globals,
static void uninstallDerivations(Globals & globals, DrvNames & selectors,
Path & profile)
{
- UserEnvElems installedElems;
- queryInstalled(globals.state, installedElems, profile);
+ UserEnvElems installedElems = queryInstalled(globals.state, profile);
for (UserEnvElems::iterator i = installedElems.begin();
i != installedElems.end(); ++i)
@@ -631,7 +643,7 @@ static void opQuery(Globals & globals,
switch (source) {
case sInstalled:
- queryInstalled(globals.state, elems, globals.profile);
+ elems = queryInstalled(globals.state, globals.profile);
break;
case sAvailable: {
@@ -656,7 +668,7 @@ static void opQuery(Globals & globals,
UserEnvElems installed; /* installed paths */
if (printStatus)
- queryInstalled(globals.state, installed, globals.profile);
+ installed = queryInstalled(globals.state, globals.profile);
/* Print the desired columns. */
Table table;