forked from lix-project/lix
Add a copyStorePath() utility function
This commit is contained in:
parent
80f739b571
commit
dfebfc835f
|
@ -3222,11 +3222,7 @@ void SubstitutionGoal::tryToRun()
|
||||||
/* Wake up the worker loop when we're done. */
|
/* Wake up the worker loop when we're done. */
|
||||||
Finally updateStats([this]() { outPipe.writeSide.close(); });
|
Finally updateStats([this]() { outPipe.writeSide.close(); });
|
||||||
|
|
||||||
StringSink sink;
|
copyStorePath(ref<Store>(sub), ref<Store>(worker.store.shared_from_this()), storePath);
|
||||||
sub->exportPaths({storePath}, false, sink);
|
|
||||||
|
|
||||||
StringSource source(*sink.s);
|
|
||||||
worker.store.importPaths(false, source, 0);
|
|
||||||
|
|
||||||
promise.set_value();
|
promise.set_value();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
|
|
@ -357,6 +357,19 @@ const Store::Stats & Store::getStats()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
|
||||||
|
const Path & storePath)
|
||||||
|
{
|
||||||
|
auto info = srcStore->queryPathInfo(storePath);
|
||||||
|
|
||||||
|
StringSink sink;
|
||||||
|
srcStore->exportPaths({storePath}, false, sink);
|
||||||
|
|
||||||
|
StringSource source(*sink.s);
|
||||||
|
dstStore->importPaths(false, source, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ValidPathInfo decodeValidPathInfo(std::istream & str, bool hashGiven)
|
ValidPathInfo decodeValidPathInfo(std::istream & str, bool hashGiven)
|
||||||
{
|
{
|
||||||
ValidPathInfo info;
|
ValidPathInfo info;
|
||||||
|
|
|
@ -502,6 +502,11 @@ Path computeStorePathForText(const string & name, const string & s,
|
||||||
const PathSet & references);
|
const PathSet & references);
|
||||||
|
|
||||||
|
|
||||||
|
/* Copy a path from one store to another. */
|
||||||
|
void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
|
||||||
|
const Path & storePath);
|
||||||
|
|
||||||
|
|
||||||
/* Remove the temporary roots file for this process. Any temporary
|
/* Remove the temporary roots file for this process. Any temporary
|
||||||
root becomes garbage after this point unless it has been registered
|
root becomes garbage after this point unless it has been registered
|
||||||
as a (permanent) root. */
|
as a (permanent) root. */
|
||||||
|
|
|
@ -28,6 +28,13 @@ public:
|
||||||
throw std::invalid_argument("null pointer cast to ref");
|
throw std::invalid_argument("null pointer cast to ref");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
explicit ref<T>(T * p)
|
||||||
|
: p(p)
|
||||||
|
{
|
||||||
|
if (!p)
|
||||||
|
throw std::invalid_argument("null pointer cast to ref");
|
||||||
|
}
|
||||||
|
|
||||||
T* operator ->() const
|
T* operator ->() const
|
||||||
{
|
{
|
||||||
return &*p;
|
return &*p;
|
||||||
|
|
|
@ -65,11 +65,7 @@ struct CmdCopy : StorePathsCommand
|
||||||
if (!dstStore->isValidPath(storePath)) {
|
if (!dstStore->isValidPath(storePath)) {
|
||||||
Activity act(*logger, lvlInfo, format("copying ‘%s’...") % storePath);
|
Activity act(*logger, lvlInfo, format("copying ‘%s’...") % storePath);
|
||||||
|
|
||||||
StringSink sink;
|
copyStorePath(srcStore, dstStore, storePath);
|
||||||
srcStore->exportPaths({storePath}, false, sink);
|
|
||||||
|
|
||||||
StringSource source(*sink.s);
|
|
||||||
dstStore->importPaths(false, source, 0);
|
|
||||||
|
|
||||||
logger->incProgress(copiedLabel);
|
logger->incProgress(copiedLabel);
|
||||||
} else
|
} else
|
||||||
|
|
Loading…
Reference in a new issue