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:
Maximilian Bosch 2021-10-07 23:58:02 +02:00
parent 844dd901a7
commit 0872659002
No known key found for this signature in database
GPG key ID: 091DBF4D1FC46B8E
2 changed files with 21 additions and 2 deletions

View file

@ -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)

View file

@ -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] == ':') {