forked from lix-project/lix
nix repl: properly deal with interruptions
When I stop a download with Ctrl-C in a `nix repl` of a flake, the REPL
refuses to do any other downloads:
nix-repl> builtins.getFlake "nix-serve"
[0.0 MiB DL] downloading 'https://api.github.com/repos/edolstra/nix-serve/tarball/e9828a9e01a14297d15ca41 error: download of 'e9828a9e01
' was interrupted
[0.0 MiB DL]
nix-repl> builtins.getFlake "nix-serve"
error: interrupted by the user
[0.0 MiB DL]
To fix this issue, two changes were necessary:
* Reset the global `_isInterrupted` variable: only because a single
operation was aborted, it should still be possible to continue the
session.
* Recreate a `fileTransfer`-instance if the current one was shut down by
an abort.
This commit is contained in:
parent
844dd901a7
commit
0872659002
|
@ -716,15 +716,32 @@ struct curlFileTransfer : public FileTransfer
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ref<curlFileTransfer> makeCurlFileTransfer()
|
||||||
|
{
|
||||||
|
return make_ref<curlFileTransfer>();
|
||||||
|
}
|
||||||
|
|
||||||
ref<FileTransfer> getFileTransfer()
|
ref<FileTransfer> getFileTransfer()
|
||||||
{
|
{
|
||||||
static ref<FileTransfer> fileTransfer = makeFileTransfer();
|
static ref<curlFileTransfer> fileTransfer = makeCurlFileTransfer();
|
||||||
|
|
||||||
|
// this has to be done in its own scope to make sure that the lock is released
|
||||||
|
// before creating a new fileTransfer instance.
|
||||||
|
auto needsRecreation = [&]() -> bool {
|
||||||
|
auto state = fileTransfer->state_.lock();
|
||||||
|
return state->quit;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (needsRecreation()) {
|
||||||
|
fileTransfer = makeCurlFileTransfer();
|
||||||
|
}
|
||||||
|
|
||||||
return fileTransfer;
|
return fileTransfer;
|
||||||
}
|
}
|
||||||
|
|
||||||
ref<FileTransfer> makeFileTransfer()
|
ref<FileTransfer> makeFileTransfer()
|
||||||
{
|
{
|
||||||
return make_ref<curlFileTransfer>();
|
return makeCurlFileTransfer();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::future<FileTransferResult> FileTransfer::enqueueFileTransfer(const FileTransferRequest & request)
|
std::future<FileTransferResult> FileTransfer::enqueueFileTransfer(const FileTransferRequest & request)
|
||||||
|
|
|
@ -396,6 +396,8 @@ bool NixRepl::processLine(string line)
|
||||||
{
|
{
|
||||||
if (line == "") return true;
|
if (line == "") return true;
|
||||||
|
|
||||||
|
_isInterrupted = false;
|
||||||
|
|
||||||
string command, arg;
|
string command, arg;
|
||||||
|
|
||||||
if (line[0] == ':') {
|
if (line[0] == ':') {
|
||||||
|
|
Loading…
Reference in a new issue