nix-env -i: Add a flag ‘--remove-all’ / ‘-r’
This is equivalent to running ‘nix-env -e '*'’ first, except that it happens in a single transaction. Thus, ‘nix-env -i pkgs...’ replaces the profile with the specified set of packages. The main motivation is to support declarative package management (similar to environment.systemPackages in NixOS). That is, if you have a specification ‘profile.nix’ like this: with import <nixpkgs> {}; [ thunderbird geeqie ... ] then after any change to ‘profile.nix’, you can run: $ nix-env -f profile.nix -ir to update the profile to match the specification. (Without the ‘-r’ flag, if you remove a package from ‘profile.nix’, it won't be removed from the actual profile.) Suggested by @zefhemel.
This commit is contained in:
parent
88c07341a6
commit
2c1ecf8e81
|
@ -209,6 +209,10 @@ also <xref linkend="sec-common-options" />.</phrase></para>
|
||||||
<arg choice='plain'><option>--preserve-installed</option></arg>
|
<arg choice='plain'><option>--preserve-installed</option></arg>
|
||||||
<arg choice='plain'><option>-P</option></arg>
|
<arg choice='plain'><option>-P</option></arg>
|
||||||
</group>
|
</group>
|
||||||
|
<group choice='opt'>
|
||||||
|
<arg choice='plain'><option>--remove-all</option></arg>
|
||||||
|
<arg choice='plain'><option>-r</option></arg>
|
||||||
|
</group>
|
||||||
<arg choice='plain' rep='repeat'><replaceable>args</replaceable></arg>
|
<arg choice='plain' rep='repeat'><replaceable>args</replaceable></arg>
|
||||||
</cmdsynopsis>
|
</cmdsynopsis>
|
||||||
|
|
||||||
|
@ -318,6 +322,16 @@ number of possible ways:
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry><term><option>--remove-all</option></term>
|
||||||
|
<term><option>-r</option></term>
|
||||||
|
|
||||||
|
<listitem><para>Remove all previously installed packages first.
|
||||||
|
This is equivalent to running <literal>nix-env -e '*'</literal>
|
||||||
|
first, except that everything happens in a single
|
||||||
|
transaction.</para></listitem>
|
||||||
|
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
</refsection>
|
</refsection>
|
||||||
|
|
|
@ -54,6 +54,7 @@ struct Globals
|
||||||
EvalState state;
|
EvalState state;
|
||||||
bool dryRun;
|
bool dryRun;
|
||||||
bool preserveInstalled;
|
bool preserveInstalled;
|
||||||
|
bool removeAll;
|
||||||
string forceName;
|
string forceName;
|
||||||
bool prebuiltOnly;
|
bool prebuiltOnly;
|
||||||
};
|
};
|
||||||
|
@ -489,29 +490,33 @@ static void installDerivations(Globals & globals,
|
||||||
newNames.insert(DrvName(i->name).name);
|
newNames.insert(DrvName(i->name).name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add in the already installed derivations, unless they have the
|
|
||||||
same name as a to-be-installed element. */
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
string lockToken = optimisticLockProfile(profile);
|
string lockToken = optimisticLockProfile(profile);
|
||||||
|
|
||||||
DrvInfos installedElems = queryInstalled(globals.state, profile);
|
|
||||||
|
|
||||||
DrvInfos allElems(newElems);
|
DrvInfos allElems(newElems);
|
||||||
foreach (DrvInfos::iterator, i, installedElems) {
|
|
||||||
DrvName drvName(i->name);
|
|
||||||
MetaInfo meta = i->queryMetaInfo(globals.state);
|
|
||||||
if (!globals.preserveInstalled &&
|
|
||||||
newNames.find(drvName.name) != newNames.end() &&
|
|
||||||
!keep(meta))
|
|
||||||
printMsg(lvlInfo,
|
|
||||||
format("replacing old `%1%'") % i->name);
|
|
||||||
else
|
|
||||||
allElems.push_back(*i);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (DrvInfos::iterator, i, newElems)
|
/* Add in the already installed derivations, unless they have
|
||||||
printMsg(lvlInfo, format("installing `%1%'") % i->name);
|
the same name as a to-be-installed element. */
|
||||||
|
if (!globals.removeAll) {
|
||||||
|
printMsg(lvlError, "FOO");
|
||||||
|
|
||||||
|
DrvInfos installedElems = queryInstalled(globals.state, profile);
|
||||||
|
|
||||||
|
foreach (DrvInfos::iterator, i, installedElems) {
|
||||||
|
DrvName drvName(i->name);
|
||||||
|
MetaInfo meta = i->queryMetaInfo(globals.state);
|
||||||
|
if (!globals.preserveInstalled &&
|
||||||
|
newNames.find(drvName.name) != newNames.end() &&
|
||||||
|
!keep(meta))
|
||||||
|
printMsg(lvlInfo, format("replacing old `%1%'") % i->name);
|
||||||
|
else
|
||||||
|
allElems.push_back(*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (DrvInfos::iterator, i, newElems)
|
||||||
|
printMsg(lvlInfo, format("installing `%1%'") % i->name);
|
||||||
|
}
|
||||||
|
|
||||||
printMissing(globals.state, newElems);
|
printMissing(globals.state, newElems);
|
||||||
|
|
||||||
|
@ -531,6 +536,8 @@ static void opInstall(Globals & globals,
|
||||||
if (parseInstallSourceOptions(globals, i, opFlags, arg)) ;
|
if (parseInstallSourceOptions(globals, i, opFlags, arg)) ;
|
||||||
else if (arg == "--preserve-installed" || arg == "-P")
|
else if (arg == "--preserve-installed" || arg == "-P")
|
||||||
globals.preserveInstalled = true;
|
globals.preserveInstalled = true;
|
||||||
|
else if (arg == "--remove-all" || arg == "-r")
|
||||||
|
globals.removeAll = true;
|
||||||
else throw UsageError(format("unknown flag `%1%'") % arg);
|
else throw UsageError(format("unknown flag `%1%'") % arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1298,6 +1305,7 @@ void run(Strings args)
|
||||||
|
|
||||||
globals.dryRun = false;
|
globals.dryRun = false;
|
||||||
globals.preserveInstalled = false;
|
globals.preserveInstalled = false;
|
||||||
|
globals.removeAll = false;
|
||||||
globals.prebuiltOnly = false;
|
globals.prebuiltOnly = false;
|
||||||
|
|
||||||
for (Strings::iterator i = args.begin(); i != args.end(); ) {
|
for (Strings::iterator i = args.begin(); i != args.end(); ) {
|
||||||
|
|
Loading…
Reference in a new issue