mirror of
https://github.com/NixOS/nix.git
synced 2025-11-15 23:12:44 +01:00
Improve progress indicator
This commit is contained in:
parent
e80257f122
commit
b01d62285c
26 changed files with 339 additions and 168 deletions
|
|
@ -63,6 +63,7 @@ struct CurlDownloader : public Downloader
|
|||
CurlDownloader & downloader;
|
||||
DownloadRequest request;
|
||||
DownloadResult result;
|
||||
Activity act;
|
||||
bool done = false; // whether either the success or failure function has been called
|
||||
std::function<void(const DownloadResult &)> success;
|
||||
std::function<void(std::exception_ptr exc)> failure;
|
||||
|
|
@ -70,10 +71,6 @@ struct CurlDownloader : public Downloader
|
|||
bool active = false; // whether the handle has been added to the multi object
|
||||
std::string status;
|
||||
|
||||
bool showProgress = false;
|
||||
double prevProgressTime{0}, startTime{0};
|
||||
unsigned int moveBack{1};
|
||||
|
||||
unsigned int attempt = 0;
|
||||
|
||||
/* Don't start this download until the specified time point
|
||||
|
|
@ -87,12 +84,10 @@ struct CurlDownloader : public Downloader
|
|||
DownloadItem(CurlDownloader & downloader, const DownloadRequest & request)
|
||||
: downloader(downloader), request(request)
|
||||
{
|
||||
showProgress =
|
||||
request.showProgress == DownloadRequest::yes ||
|
||||
(request.showProgress == DownloadRequest::automatic && isatty(STDERR_FILENO));
|
||||
|
||||
if (!request.expectedETag.empty())
|
||||
requestHeaders = curl_slist_append(requestHeaders, ("If-None-Match: " + request.expectedETag).c_str());
|
||||
|
||||
logger->event(evDownloadCreated, act, request.uri);
|
||||
}
|
||||
|
||||
~DownloadItem()
|
||||
|
|
@ -109,6 +104,7 @@ struct CurlDownloader : public Downloader
|
|||
} catch (...) {
|
||||
ignoreException();
|
||||
}
|
||||
logger->event(evDownloadDestroyed, act);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
|
|
@ -171,19 +167,7 @@ struct CurlDownloader : public Downloader
|
|||
|
||||
int progressCallback(double dltotal, double dlnow)
|
||||
{
|
||||
if (showProgress) {
|
||||
double now = getTime();
|
||||
if (prevProgressTime <= now - 1) {
|
||||
string s = (format(" [%1$.0f/%2$.0f KiB, %3$.1f KiB/s]")
|
||||
% (dlnow / 1024.0)
|
||||
% (dltotal / 1024.0)
|
||||
% (now == startTime ? 0 : dlnow / 1024.0 / (now - startTime))).str();
|
||||
std::cerr << "\e[" << moveBack << "D" << s;
|
||||
moveBack = s.size();
|
||||
std::cerr.flush();
|
||||
prevProgressTime = now;
|
||||
}
|
||||
}
|
||||
logger->event(evDownloadProgress, act, dltotal, dlnow);
|
||||
return _isInterrupted;
|
||||
}
|
||||
|
||||
|
|
@ -201,13 +185,6 @@ struct CurlDownloader : public Downloader
|
|||
|
||||
void init()
|
||||
{
|
||||
// FIXME: handle parallel downloads.
|
||||
if (showProgress) {
|
||||
std::cerr << (format("downloading ‘%1%’... ") % request.uri);
|
||||
std::cerr.flush();
|
||||
startTime = getTime();
|
||||
}
|
||||
|
||||
if (!req) req = curl_easy_init();
|
||||
|
||||
curl_easy_reset(req);
|
||||
|
|
@ -263,10 +240,6 @@ struct CurlDownloader : public Downloader
|
|||
|
||||
void finish(CURLcode code)
|
||||
{
|
||||
if (showProgress)
|
||||
//std::cerr << "\e[" << moveBack << "D\e[K\n";
|
||||
std::cerr << "\n";
|
||||
|
||||
long httpStatus = 0;
|
||||
curl_easy_getinfo(req, CURLINFO_RESPONSE_CODE, &httpStatus);
|
||||
|
||||
|
|
@ -292,6 +265,7 @@ struct CurlDownloader : public Downloader
|
|||
try {
|
||||
result.data = decodeContent(encoding, ref<std::string>(result.data));
|
||||
callSuccess(success, failure, const_cast<const DownloadResult &>(result));
|
||||
logger->event(evDownloadSucceeded, act, result.data->size());
|
||||
} catch (...) {
|
||||
done = true;
|
||||
callFailure(failure, std::current_exception());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue