X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/0919e3f9400aba51bd73e7f90c6d1ba4406b5421..54debba5d21783160e78706f6c21b274ca4b805b:/cmdline/acqprogress.cc diff --git a/cmdline/acqprogress.cc b/cmdline/acqprogress.cc index 82bb6fac6..8b30b324b 100644 --- a/cmdline/acqprogress.cc +++ b/cmdline/acqprogress.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acqprogress.cc,v 1.1 1998/11/11 23:45:52 jgg Exp $ +// $Id: acqprogress.cc,v 1.24 2003/04/27 01:56:48 doogie Exp $ /* ###################################################################### Acquire Progress - Command line progress meter @@ -11,14 +11,22 @@ #include "acqprogress.h" #include #include +#include +#include + +#include + #include -#include +#include +#include /*}}}*/ +using namespace std; + // AcqTextStatus::AcqTextStatus - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -AcqTextStatus::AcqTextStatus(unsigned int ScreenWidth,unsigned int Quiet) : +AcqTextStatus::AcqTextStatus(unsigned int &ScreenWidth,unsigned int Quiet) : ScreenWidth(ScreenWidth), Quiet(Quiet) { } @@ -44,9 +52,9 @@ void AcqTextStatus::IMSHit(pkgAcquire::ItemDesc &Itm) if (Quiet <= 0) cout << '\r' << BlankLine << '\r'; - cout << "Hit " << Itm.Description; + cout << _("Hit ") << Itm.Description; if (Itm.Owner->FileSize != 0) - cout << " [" << SizeToStr(Itm.Owner->FileSize) << ']'; + cout << " [" << SizeToStr(Itm.Owner->FileSize) << "B]"; cout << endl; Update = true; }; @@ -68,9 +76,9 @@ void AcqTextStatus::Fetch(pkgAcquire::ItemDesc &Itm) if (Quiet <= 0) cout << '\r' << BlankLine << '\r'; - cout << "Get:" << hex << Itm.Owner->ID << dec << ' ' << Itm.Description; + cout << _("Get:") << Itm.Owner->ID << ' ' << Itm.Description; if (Itm.Owner->FileSize != 0) - cout << " [" << SizeToStr(Itm.Owner->FileSize) << ']'; + cout << " [" << SizeToStr(Itm.Owner->FileSize) << "B]"; cout << endl; }; /*}}}*/ @@ -90,11 +98,23 @@ void AcqTextStatus::Fail(pkgAcquire::ItemDesc &Itm) if (Quiet > 1) return; + // Ignore certain kinds of transient failures (bad code) + if (Itm.Owner->Status == pkgAcquire::Item::StatIdle) + return; + if (Quiet <= 0) cout << '\r' << BlankLine << '\r'; - cout << "Err " << Itm.Description << endl; - cout << " " << Itm.Owner->ErrorText << endl; + if (Itm.Owner->Status == pkgAcquire::Item::StatDone) + { + cout << _("Ign ") << Itm.Description << endl; + } + else + { + cout << _("Err ") << Itm.Description << endl; + cout << " " << Itm.Owner->ErrorText << endl; + } + Update = true; }; /*}}}*/ @@ -109,12 +129,13 @@ void AcqTextStatus::Stop() return; if (Quiet <= 0) - cout << '\r' << BlankLine << '\r'; - - if (FetchedBytes != 0) - cout << "Fetched " << SizeToStr(FetchedBytes) << " in " << - TimeToStr(ElapsedTime) << " (" << SizeToStr(CurrentCPS) << - "/s)" << endl; + cout << '\r' << BlankLine << '\r' << flush; + + if (FetchedBytes != 0 && _error->PendingError() == false) + ioprintf(cout,_("Fetched %sB in %s (%sB/s)\n"), + SizeToStr(FetchedBytes).c_str(), + TimeToStr(ElapsedTime).c_str(), + SizeToStr(CurrentCPS).c_str()); } /*}}}*/ // AcqTextStatus::Pulse - Regular event pulse /*{{{*/ @@ -122,22 +143,25 @@ void AcqTextStatus::Stop() /* This draws the current progress. Each line has an overall percent meter and a per active item status meter along with an overall bandwidth and ETA indicator. */ -void AcqTextStatus::Pulse(pkgAcquire *Owner) +bool AcqTextStatus::Pulse(pkgAcquire *Owner) { if (Quiet > 0) - return; + return true; pkgAcquireStatus::Pulse(Owner); enum {Long = 0,Medium,Short} Mode = Long; - char Buffer[300]; + char Buffer[sizeof(BlankLine)]; char *End = Buffer + sizeof(Buffer); char *S = Buffer; - + if (ScreenWidth >= sizeof(Buffer)) + ScreenWidth = sizeof(Buffer)-1; + // Put in the percent done - sprintf(S,"%ld%%",long(double(CurrentBytes*100.0)/double(TotalBytes))); - + sprintf(S,"%ld%%",long(double((CurrentBytes + CurrentItems)*100.0)/double(TotalBytes+TotalItems))); + + bool Shown = false; for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0; I = Owner->WorkerStep(I)) { @@ -147,13 +171,19 @@ void AcqTextStatus::Pulse(pkgAcquire *Owner) if (I->CurrentItem == 0) { if (I->Status.empty() == false) + { snprintf(S,End-S," [%s]",I->Status.c_str()); + Shown = true; + } + continue; } + Shown = true; + // Add in the short description if (I->CurrentItem->Owner->ID != 0) - snprintf(S,End-S," [%x %s",I->CurrentItem->Owner->ID, + snprintf(S,End-S," [%lu %s",I->CurrentItem->Owner->ID, I->CurrentItem->ShortDesc.c_str()); else snprintf(S,End-S," [%s",I->CurrentItem->ShortDesc.c_str()); @@ -168,11 +198,11 @@ void AcqTextStatus::Pulse(pkgAcquire *Owner) // Add the current progress if (Mode == Long) - snprintf(S,End-S," %u",I->CurrentSize); + snprintf(S,End-S," %lu",I->CurrentSize); else { if (Mode == Medium || I->TotalSize == 0) - snprintf(S,End-S," %s",SizeToStr(I->CurrentSize).c_str()); + snprintf(S,End-S," %sB",SizeToStr(I->CurrentSize).c_str()); } S += strlen(S); @@ -180,22 +210,32 @@ void AcqTextStatus::Pulse(pkgAcquire *Owner) if (I->TotalSize > 0 && I->CurrentItem->Owner->Complete == false) { if (Mode == Short) - snprintf(S,End-S," %u%%", + snprintf(S,End-S," %lu%%", long(double(I->CurrentSize*100.0)/double(I->TotalSize))); else - snprintf(S,End-S,"/%s %u%%",SizeToStr(I->TotalSize).c_str(), + snprintf(S,End-S,"/%sB %lu%%",SizeToStr(I->TotalSize).c_str(), long(double(I->CurrentSize*100.0)/double(I->TotalSize))); } S += strlen(S); snprintf(S,End-S,"]"); } - // Put in the ETA and cps meter + // Show something.. + if (Shown == false) + snprintf(S,End-S,_(" [Working]")); + + /* Put in the ETA and cps meter, block off signals to prevent strangeness + during resizing */ + sigset_t Sigs,OldSigs; + sigemptyset(&Sigs); + sigaddset(&Sigs,SIGWINCH); + sigprocmask(SIG_BLOCK,&Sigs,&OldSigs); + if (CurrentCPS != 0) { char Tmp[300]; unsigned long ETA = (unsigned long)((TotalBytes - CurrentBytes)/CurrentCPS); - sprintf(Tmp," %s/s %s",SizeToStr(CurrentCPS).c_str(),TimeToStr(ETA).c_str()); + sprintf(Tmp," %sB/s %s",SizeToStr(CurrentCPS).c_str(),TimeToStr(ETA).c_str()); unsigned int Len = strlen(Buffer); unsigned int LenT = strlen(Tmp); if (Len + LenT < ScreenWidth) @@ -205,7 +245,9 @@ void AcqTextStatus::Pulse(pkgAcquire *Owner) } } Buffer[ScreenWidth] = 0; - + BlankLine[ScreenWidth] = 0; + sigprocmask(SIG_SETMASK,&OldSigs,0); + // Draw the current status if (strlen(Buffer) == strlen(BlankLine)) cout << '\r' << Buffer << flush; @@ -215,5 +257,27 @@ void AcqTextStatus::Pulse(pkgAcquire *Owner) BlankLine[strlen(Buffer)] = 0; Update = false; + + return true; +} + /*}}}*/ +// AcqTextStatus::MediaChange - Media need to be swapped /*{{{*/ +// --------------------------------------------------------------------- +/* Prompt for a media swap */ +bool AcqTextStatus::MediaChange(string Media,string Drive) +{ + if (Quiet <= 0) + cout << '\r' << BlankLine << '\r'; + ioprintf(cout,_("Media change: please insert the disc labeled\n" + " '%s'\n" + "in the drive '%s' and press enter\n"), + Media.c_str(),Drive.c_str()); + + char C = 0; + while (C != '\n' && C != '\r') + read(STDIN_FILENO,&C,1); + + Update = true; + return true; } /*}}}*/