From f2152f036e11c633b54a9146665a47f7b980a355 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 10 May 2005 12:28:16 +0000 Subject: * make pinning on component work again (we just use the section, as apt-0.6 don't use per-section Release files anymore) --- apt-pkg/deb/debindexfile.cc | 4 ++-- apt-pkg/deb/deblistparser.cc | 11 +++++++++-- apt-pkg/deb/deblistparser.h | 3 ++- 3 files changed, 13 insertions(+), 5 deletions(-) (limited to 'apt-pkg/deb') diff --git a/apt-pkg/deb/debindexfile.cc b/apt-pkg/deb/debindexfile.cc index f26265fff..ff8bce85d 100644 --- a/apt-pkg/deb/debindexfile.cc +++ b/apt-pkg/deb/debindexfile.cc @@ -24,7 +24,7 @@ #include #include #include - + #include /*}}}*/ @@ -290,7 +290,7 @@ bool debPackagesIndex::Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const FileFd Rel(ReleaseFile,FileFd::ReadOnly); if (_error->PendingError() == true) return false; - Parser.LoadReleaseInfo(File,Rel); + Parser.LoadReleaseInfo(File,Rel,Section); } return true; diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index 96a80582d..25b533773 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -564,13 +564,20 @@ bool debListParser::Step() // --------------------------------------------------------------------- /* */ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI, - FileFd &File) + FileFd &File, string component) { pkgTagFile Tags(&File, File.Size() + 256); // XXX pkgTagSection Section; if (Tags.Step(Section) == false) return false; + //mvo: I don't think we need to fill that in (it's unused since apt-0.6) + //FileI->Architecture = WriteUniqString(Arch); + + // apt-secure does no longer download individual (per-section) Release + // file. to provide Component pinning we use the section name now + FileI->Component = WriteUniqString(component); + const char *Start; const char *Stop; if (Section.Find("Suite",Start,Stop) == true) @@ -589,7 +596,7 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI, if (Section.FindFlag("NotAutomatic",FileI->Flags, pkgCache::Flag::NotAutomatic) == false) _error->Warning("Bad NotAutomatic flag"); - + return !_error->PendingError(); } /*}}}*/ diff --git a/apt-pkg/deb/deblistparser.h b/apt-pkg/deb/deblistparser.h index 9f305211a..3a0e0421b 100644 --- a/apt-pkg/deb/deblistparser.h +++ b/apt-pkg/deb/deblistparser.h @@ -55,7 +55,8 @@ class debListParser : public pkgCacheGenerator::ListParser virtual bool Step(); - bool LoadReleaseInfo(pkgCache::PkgFileIterator FileI,FileFd &File); + bool LoadReleaseInfo(pkgCache::PkgFileIterator FileI,FileFd &File, + string section); static const char *ParseDepends(const char *Start,const char *Stop, string &Package,string &Ver,unsigned int &Op, -- cgit v1.2.3-70-g09d2 From 75ef8f14174f83a5f876a0d7414f4e6064a7d3e0 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 9 Aug 2005 08:38:26 +0000 Subject: * merged from main Patches applied: * apt@packages.debian.org/apt--main--0--patch-106 Restore lost changelog entries * apt@packages.debian.org/apt--main--0--patch-107 Merge michael.vogt@ubuntu.com--2005/apt--progress-reporting--0 * apt@packages.debian.org/apt--main--0--patch-108 Merge michael.vogt@ubuntu.com--2005/apt--progress-reporting--0 * apt@packages.debian.org/apt--main--0--patch-109 Merge michael.vogt@ubuntu.com--2005/apt--progress-reporting--0 * apt@packages.debian.org/apt--main--0--patch-110 Merge michael.vogt@ubuntu.com--2005/apt--progress-reporting--0 * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-5 * merged with apt--main--0 * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--base-0 tag of apt@packages.debian.org/apt--main--0--patch-85 * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-1 * inital proof of concept code, understands what dpkg tells it already * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-2 * progress reporting works now * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-3 * added "APT::Status-Fd" variable * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-4 * do i18n now too * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-5 * define N_(x) if it is not defined already * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-6 * PackageManager::DoInstall(int status_fd) added (does not break the ABI) * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-7 * merged with apt--fixes--0 to make it build again * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-8 * added support for "error" and "conffile-prompt" messages from dpkg * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-9 merge with main * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-10 * use sizeof() for all snprintf() uses; fix a potential line break problem in the status reading code; changed the N_() to _() calls * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-11 * added APT::KeepFDs configuration list for file descriptors that apt should leave open (needed for various frontends like debconf, synaptic) * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-12 * fixed a API breakage * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-13 * doc added, should be releasable now * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-14 * merged with apt--main--0 * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-15 * more source comments, added Debug::DpkgPM debug code to inspect the dpkg<->apt communication, broke the abi (ok with matt) * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-16 * the progress reporting has it's own "Debug::pkgDPkgProgressReporting" debug variable now * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-17 * merged PackageOps and TranslatedPackageOps into a single Map with the new DpkgState struct * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-18 * clear the APT::Keep-Fds configuration when it's no longer needed * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-19 * rewrote the reading from dpkg so that it never blocks * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-20 * merged the two status arrays into one * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-21 * added support for download progress reporting too (for Kamion and base-config) * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-22 * ABI break; added Configuration::Clear(string List, {int,string} value) added (to remove a single Value from a list); test/conf_clear.cc added * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-23 * remvoed a debug string * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-24 * soname changed, fixed a bug in the parsing code when dpkg send the same state more than once (at the end) * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-25 * merged with apt@packages.debian.org/apt--main--0, added changelog entry for the 0.6.40.1 upload * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-26 * fix a bug when out-of-order states are send from dpkg * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-27 * changelog update * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-28 * a real changelog entry now * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-29 * changelog finalized * michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-30 * propper (and sane) support for pmerror and pmconffile added --- README.progress-reporting | 62 ++++++++++ apt-pkg/acquire.cc | 21 ++++ apt-pkg/contrib/configuration.cc | 45 ++++++- apt-pkg/contrib/configuration.h | 7 +- apt-pkg/contrib/fileutl.cc | 24 +++- apt-pkg/contrib/fileutl.h | 2 +- apt-pkg/deb/dpkgpm.cc | 242 +++++++++++++++++++++++++++++++++---- apt-pkg/deb/dpkgpm.h | 9 +- apt-pkg/init.h | 2 +- apt-pkg/makefile | 2 +- apt-pkg/packagemanager.cc | 4 +- apt-pkg/packagemanager.h | 2 +- cmdline/apt-get.cc | 6 +- configure.in | 2 +- debian/apt-doc.docs | 1 + debian/changelog | 254 ++++++++++++++++++++++++++++++++++++++- doc/examples/configure-index | 8 ++ methods/makefile | 2 +- po/apt-all.pot | 2 +- test/conf_clear.cc | 23 ++++ test/makefile | 6 + 21 files changed, 681 insertions(+), 45 deletions(-) create mode 100644 README.progress-reporting create mode 100644 debian/apt-doc.docs create mode 100644 test/conf_clear.cc (limited to 'apt-pkg/deb') diff --git a/README.progress-reporting b/README.progress-reporting new file mode 100644 index 000000000..73fbd8c08 --- /dev/null +++ b/README.progress-reporting @@ -0,0 +1,62 @@ +Install-progress reporting +-------------------------- + +If the apt options: "APT::Status-Fd" is set, apt will send status +reports to that fd. The status information is seperated with a ':', +there are the following status conditions: + +status = {"pmstatus", "dlstatus", "conffile-prompt", "error" } + +The reason for using a fd instead of a OpProgress class is that many +apt frontend fork a (vte) terminal for the actual installation. + +The reason to do the mapping and l10n of the dpkg states to human +readable (and translatable) strings is that this way the translation +needs to be done only once for all frontends. + + +pmstatus +-------- +Status of the package manager (dpkg). This is send when packages +are installed/removed. +pmstatus:pkgname:TotalPercentage:action-description + +PkgName = the name of the package +TotalPercentage = the total progress between [0..100] +description = a i18ned human readable decription of the current action + + +Example: +# ./apt-get install -o APT::Status-Fd=2 3dchess >/dev/null +pmstatus:3dchess:20:Preparing 3dchess +pmstatus:3dchess:40:Unpacking 3dchess +pmstatus:3dchess:60:Preparing to configure 3dchess +pmstatus:3dchess:80:Configuring 3dchess +pmstatus:3dchess:100:Installed 3dchess + +pmerror +------- +pmerror:deb:TotalPercentage:error string + +Example: +pmerror: /var/cache/apt/archives/krecipes_0.8.1-0ubuntu1_i386.deb : 75% : trying to overwrite `/usr/share/doc/kde/HTML/en/krecipes/krectip.png', which is also in package krecipes-data + + +pmconffile +---------- +pmconffile:conffile:percent:'current-conffile' 'new-conffile' useredited distedited + + + +dlstatus +-------- +dlstatus:AlreadDownloaded:TotalPercentage:action-description + +AlreadyDownloaded = the number of already downloaded packages +TotalPercentage = the total progress between [0..100] +description = a i18ned human readable decription of the current action + +Example: +dlstatus:1:9.05654:Downloading file 1 of 3 (4m40s remaining) +dlstatus:1:9.46357:Downloading file 1 of 3 (4m39s remaining) +dlstatus:1:9.61022:Downloading file 1 of 3 (4m38s remaining) \ No newline at end of file diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index 70dce4f54..62209e65b 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -803,6 +804,26 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) Time = NewTime; } + int fd = _config->FindI("APT::Status-Fd",-1); + if(fd > 0) + { + ostringstream status; + + char msg[200]; + long i = CurrentItems < TotalItems ? CurrentItems + 1 : CurrentItems; + unsigned long ETA = + (unsigned long)((TotalBytes - CurrentBytes) / CurrentCPS); + + snprintf(msg,sizeof(msg), _("Downloading file %li of %li (%s remaining)"), i, TotalItems, TimeToStr(ETA).c_str()); + + // build the status str + status << "dlstatus:" << i + << ":" << (CurrentBytes/float(TotalBytes)*100.0) + << ":" << msg + << endl; + write(fd, status.str().c_str(), status.str().size()); + } + return true; } /*}}}*/ diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc index 69f8d1dca..09e454be9 100644 --- a/apt-pkg/contrib/configuration.cc +++ b/apt-pkg/contrib/configuration.cc @@ -325,6 +325,47 @@ void Configuration::Set(const char *Name,int Value) char S[300]; snprintf(S,sizeof(S),"%i",Value); Itm->Value = S; +} + /*}}}*/ +// Configuration::Clear - Clear an single value from a list /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void Configuration::Clear(string Name, int Value) +{ + char S[300]; + snprintf(S,sizeof(S),"%i",Value); + Clear(Name, S); +} + /*}}}*/ +// Configuration::Clear - Clear an single value from a list /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void Configuration::Clear(string Name, string Value) +{ + Item *Top = Lookup(Name.c_str(),false); + if (Top == 0 || Top->Child == 0) + return; + + Item *Tmp, *Prev, *I; + Prev = I = Top->Child; + + while(I != NULL) + { + if(I->Value == Value) + { + Tmp = I; + // was first element, point parent to new first element + if(Top->Child == Tmp) + Top->Child = I->Next; + I = I->Next; + Prev->Next = I; + delete Tmp; + } else { + Prev = I; + I = I->Next; + } + } + } /*}}}*/ // Configuration::Clear - Clear an entire tree /*{{{*/ @@ -333,9 +374,9 @@ void Configuration::Set(const char *Name,int Value) void Configuration::Clear(string Name) { Item *Top = Lookup(Name.c_str(),false); - if (Top == 0) + if (Top == 0) return; - + Top->Value = string(); Item *Stop = Top; Top = Top->Child; diff --git a/apt-pkg/contrib/configuration.h b/apt-pkg/contrib/configuration.h index 0ed8f59d3..789bc82cf 100644 --- a/apt-pkg/contrib/configuration.h +++ b/apt-pkg/contrib/configuration.h @@ -87,8 +87,13 @@ class Configuration bool Exists(const char *Name) const; bool ExistsAny(const char *Name) const; + // clear a whole tree void Clear(string Name); - + + // remove a certain value from a list (e.g. the list of "APT::Keep-Fds") + void Clear(string List, string Value); + void Clear(string List, int Value); + inline const Item *Tree(const char *Name) const {return Lookup(Name);}; inline void Dump() { Dump(std::clog); }; diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index 0ce0c9b9d..9fd71728e 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -32,6 +33,7 @@ #include #include #include +#include /*}}}*/ using namespace std; @@ -306,7 +308,7 @@ bool WaitFd(int Fd,bool write,unsigned long timeout) /* This is used if you want to cleanse the environment for the forked child, it fixes up the important signals and nukes all of the fds, otherwise acts like normal fork. */ -pid_t ExecFork(int dontCloseThisFd) +pid_t ExecFork() { // Fork off the process pid_t Process = fork(); @@ -326,11 +328,27 @@ pid_t ExecFork(int dontCloseThisFd) signal(SIGWINCH,SIG_DFL); signal(SIGCONT,SIG_DFL); signal(SIGTSTP,SIG_DFL); - + + set KeepFDs; + Configuration::Item const *Opts = _config->Tree("APT::Keep-Fds"); + if (Opts != 0 && Opts->Child != 0) + { + Opts = Opts->Child; + for (; Opts != 0; Opts = Opts->Next) + { + if (Opts->Value.empty() == true) + continue; + int fd = atoi(Opts->Value.c_str()); + KeepFDs.insert(fd); + } + } + // Close all of our FDs - just in case for (int K = 3; K != 40; K++) - if(K != dontCloseThisFd) + { + if(KeepFDs.find(K) == KeepFDs.end()) fcntl(K,F_SETFD,FD_CLOEXEC); + } } return Process; diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h index 4716e261e..041aa3309 100644 --- a/apt-pkg/contrib/fileutl.h +++ b/apt-pkg/contrib/fileutl.h @@ -87,7 +87,7 @@ string SafeGetCWD(); void SetCloseExec(int Fd,bool Close); void SetNonBlock(int Fd,bool Block); bool WaitFd(int Fd,bool write = false,unsigned long timeout = 0); -pid_t ExecFork(int dontCloseThisFd=-1); +pid_t ExecFork(); bool ExecWait(pid_t Pid,const char *Name,bool Reap = false); // File string manipulators diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 61c48dcbb..fe8fbca74 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -25,7 +25,11 @@ #include #include #include -#include +#include +#include + +#include +#include /*}}}*/ using namespace std; @@ -325,8 +329,14 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf) /*}}}*/ // DPkgPM::Go - Run the sequence /*{{{*/ // --------------------------------------------------------------------- -/* This globs the operations and calls dpkg */ -bool pkgDPkgPM::Go(int status_fd) +/* This globs the operations and calls dpkg + * + * If it is called with "OutStatusFd" set to a valid file descriptor + * apt will report the install progress over this fd. It maps the + * dpkg states a package goes through to human readable (and i10n-able) + * names and calculates a percentage for each step. +*/ +bool pkgDPkgPM::Go(int OutStatusFd) { unsigned int MaxArgs = _config->FindI("Dpkg::MaxArgs",8*1024); unsigned int MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",32*1024); @@ -336,7 +346,66 @@ bool pkgDPkgPM::Go(int status_fd) if (RunScriptsWithPkgs("DPkg::Pre-Install-Pkgs") == false) return false; + + // prepare the progress reporting + int Done = 0; + int Total = 0; + // map the dpkg states to the operations that are performed + // (this is sorted in the same way as Item::Ops) + static const struct DpkgState DpkgStatesOpMap[][5] = { + // Install operation + { + {"half-installed", _("Preparing %s")}, + {"unpacked", _("Unpacking %s") }, + {NULL, NULL} + }, + // Configure operation + { + {"unpacked",_("Preparing to configure %s") }, + {"half-configured", _("Configuring %s") }, + { "installed", _("Installed %s")}, + {NULL, NULL} + }, + // Remove operation + { + {"half-configured", _("Preparing for removal of %s")}, + {"half-installed", _("Removing %s")}, + {"config-files", _("Removed %s")}, + {NULL, NULL} + }, + // Purge operation + { + {"config-files", _("Preparing for remove with config %s")}, + {"not-installed", _("Removed with config %s")}, + {NULL, NULL} + }, + }; + // the dpkg states that the pkg will run through, the string is + // the package, the vector contains the dpkg states that the package + // will go through + map > PackageOps; + // the dpkg states that are already done; the string is the package + // the int is the state that is already done (e.g. a package that is + // going to be install is already in state "half-installed") + map PackageOpsDone; + + // init the PackageOps map, go over the list of packages that + // that will be [installed|configured|removed|purged] and add + // them to the PackageOps map (the dpkg states it goes through) + // and the PackageOpsTranslations (human readable strings) + for (vector::iterator I = List.begin(); I != List.end();I++) + { + string name = (*I).Pkg.Name(); + PackageOpsDone[name] = 0; + for(int i=0; (DpkgStatesOpMap[(*I).Op][i]).state != NULL; i++) + { + PackageOps[name].push_back(DpkgStatesOpMap[(*I).Op][i]); + Total++; + } + } + + // this loop is runs once per operation for (vector::iterator I = List.begin(); I != List.end();) { vector::iterator J = I; @@ -367,16 +436,15 @@ bool pkgDPkgPM::Go(int status_fd) } } - // if we got a status_fd argument, we pass it to apt char status_fd_buf[20]; - if(status_fd > 0) - { - Args[n++] = "--status-fd"; - Size += strlen(Args[n-1]); - snprintf(status_fd_buf,20,"%i",status_fd); - Args[n++] = status_fd_buf; - Size += strlen(Args[n-1]); - } + int fd[2]; + pipe(fd); + + Args[n++] = "--status-fd"; + Size += strlen(Args[n-1]); + snprintf(status_fd_buf,sizeof(status_fd_buf),"%i", fd[1]); + Args[n++] = status_fd_buf; + Size += strlen(Args[n-1]); switch (I->Op) { @@ -449,17 +517,17 @@ bool pkgDPkgPM::Go(int status_fd) it doesn't die but we do! So we must also ignore it */ sighandler_t old_SIGQUIT = signal(SIGQUIT,SIG_IGN); sighandler_t old_SIGINT = signal(SIGINT,SIG_IGN); - - // Fork dpkg + + // Fork dpkg pid_t Child; - if(status_fd > 0) - Child = ExecFork(status_fd); - else - Child = ExecFork(); + _config->Set("APT::Keep-Fds::",fd[1]); + Child = ExecFork(); // This is the child if (Child == 0) { + close(fd[0]); // close the read end of the pipe + if (chdir(_config->FindDir("DPkg::Run-Directory","/").c_str()) != 0) _exit(100); @@ -487,19 +555,141 @@ bool pkgDPkgPM::Go(int status_fd) _exit(100); } + // clear the Keep-Fd again + _config->Clear("APT::Keep-Fds",fd[1]); + // Wait for dpkg int Status = 0; - while (waitpid(Child,&Status,0) != Child) - { - if (errno == EINTR) + + // we read from dpkg here + int _dpkgin = fd[0]; + fcntl(_dpkgin, F_SETFL, O_NONBLOCK); + close(fd[1]); // close the write end of the pipe + + // the read buffers for the communication with dpkg + char line[1024] = {0,}; + char buf[2] = {0,0}; + + // the result of the waitpid call + int res; + + while ((res=waitpid(Child,&Status, WNOHANG)) != Child) { + if(res < 0) { + // FIXME: move this to a function or something, looks ugly here + // error handling, waitpid returned -1 + if (errno == EINTR) + continue; + RunScripts("DPkg::Post-Invoke"); + + // Restore sig int/quit + signal(SIGQUIT,old_SIGQUIT); + signal(SIGINT,old_SIGINT); + return _error->Errno("waitpid","Couldn't wait for subprocess"); + } + + // read a single char, make sure that the read can't block + // (otherwise we may leave zombies) + int len = read(_dpkgin, buf, 1); + + // nothing to read, wait a bit for more + if(len <= 0) + { + usleep(1000); continue; - RunScripts("DPkg::Post-Invoke"); + } + + // sanity check (should never happen) + if(strlen(line) >= sizeof(line)-10) + { + _error->Error("got a overlong line from dpkg: '%s'",line); + line[0]=0; + } + // append to line, check if we got a complete line + strcat(line, buf); + if(buf[0] != '\n') + continue; + + if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + std::clog << "got from dpkg '" << line << "'" << std::endl; + + // the status we output + ostringstream status; + + /* dpkg sends strings like this: + 'status: : ' + errors look like this: + 'status: /var/cache/apt/archives/krecipes_0.8.1-0ubuntu1_i386.deb : error : trying to overwrite `/usr/share/doc/kde/HTML/en/krecipes/krectip.png', which is also in package krecipes-data + and conffile-prompt like this + 'status: conffile-prompt: conffile : 'current-conffile' 'new-conffile' useredited distedited + + */ + char* list[4]; + TokSplitString(':', line, list, 5); + char *pkg = list[1]; + char *action = _strstrip(list[2]); + + if(strncmp(action,"error",strlen("error")) == 0) + { + status << "pmerror:" << list[1] + << ":" << (Done/float(Total)*100.0) + << ":" << list[3] + << endl; + if(OutStatusFd > 0) + write(OutStatusFd, status.str().c_str(), status.str().size()); + line[0]=0; + if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + std::clog << "send: '" << status.str() << "'" << endl; + continue; + } + if(strncmp(action,"conffile",strlen("conffile")) == 0) + { + status << "pmconffile:" << list[1] + << ":" << (Done/float(Total)*100.0) + << ":" << list[3] + << endl; + if(OutStatusFd > 0) + write(OutStatusFd, status.str().c_str(), status.str().size()); + line[0]=0; + if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + std::clog << "send: '" << status.str() << "'" << endl; + continue; + } + + vector &states = PackageOps[pkg]; + const char *next_action = NULL; + if(PackageOpsDone[pkg] < states.size()) + next_action = states[PackageOpsDone[pkg]].state; + // check if the package moved to the next dpkg state + if(next_action && (strcmp(action, next_action) == 0)) + { + // only read the translation if there is actually a next + // action + const char *translation = states[PackageOpsDone[pkg]].str; + char s[200]; + snprintf(s, sizeof(s), translation, pkg); + + // we moved from one dpkg state to a new one, report that + PackageOpsDone[pkg]++; + Done++; + // build the status str + status << "pmstatus:" << pkg + << ":" << (Done/float(Total)*100.0) + << ":" << s + << endl; + if(OutStatusFd > 0) + write(OutStatusFd, status.str().c_str(), status.str().size()); + if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + std::clog << "send: '" << status.str() << "'" << endl; + + } + if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + std::clog << "(parsed from dpkg) pkg: " << pkg + << " action: " << action << endl; - // Restore sig int/quit - signal(SIGQUIT,old_SIGQUIT); - signal(SIGINT,old_SIGINT); - return _error->Errno("waitpid","Couldn't wait for subprocess"); + // reset the line buffer + line[0]=0; } + close(_dpkgin); // Restore sig int/quit signal(SIGQUIT,old_SIGQUIT); diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index b59b9dc93..2ff8a9ac7 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -23,6 +23,13 @@ using std::vector; class pkgDPkgPM : public pkgPackageManager { protected: + + // used for progress reporting + struct DpkgState + { + const char *state; // the dpkg state (e.g. "unpack") + const char *str; // the human readable translation of the state + }; struct Item { @@ -45,7 +52,7 @@ class pkgDPkgPM : public pkgPackageManager virtual bool Install(PkgIterator Pkg,string File); virtual bool Configure(PkgIterator Pkg); virtual bool Remove(PkgIterator Pkg,bool Purge = false); - virtual bool Go(int status_fd=-1); + virtual bool Go(int StatusFd=-1); virtual void Reset(); public: diff --git a/apt-pkg/init.h b/apt-pkg/init.h index 74ac3a7ca..e21351797 100644 --- a/apt-pkg/init.h +++ b/apt-pkg/init.h @@ -18,7 +18,7 @@ // See the makefile #define APT_PKG_MAJOR 3 -#define APT_PKG_MINOR 5 +#define APT_PKG_MINOR 10 #define APT_PKG_RELEASE 0 extern const char *pkgVersion; diff --git a/apt-pkg/makefile b/apt-pkg/makefile index 5f48f0f52..8de7d945e 100644 --- a/apt-pkg/makefile +++ b/apt-pkg/makefile @@ -13,7 +13,7 @@ include ../buildlib/defaults.mak # methods/makefile - FIXME LIBRARY=apt-pkg LIBEXT=$(GLIBC_VER)$(LIBSTDCPP_VER) -MAJOR=3.9 +MAJOR=3.10 MINOR=0 SLIBS=$(PTHREADLIB) $(INTLLIBS) APT_DOMAIN:=libapt-pkg$(MAJOR) diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc index a08ccd602..155408bb4 100644 --- a/apt-pkg/packagemanager.cc +++ b/apt-pkg/packagemanager.cc @@ -631,11 +631,11 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall() // --------------------------------------------------------------------- /* This uses the filenames in FileNames and the information in the DepCache to perform the installation of packages.*/ -pkgPackageManager::OrderResult pkgPackageManager::DoInstall() +pkgPackageManager::OrderResult pkgPackageManager::DoInstall(int status_fd) { OrderResult Res = OrderInstall(); if (Res != Failed) - if (Go() == false) + if (Go(status_fd) == false) return Failed; return Res; } diff --git a/apt-pkg/packagemanager.h b/apt-pkg/packagemanager.h index 43f2c4ace..f64637d03 100644 --- a/apt-pkg/packagemanager.h +++ b/apt-pkg/packagemanager.h @@ -76,7 +76,7 @@ class pkgPackageManager : protected pkgCache::Namespace // Main action members bool GetArchives(pkgAcquire *Owner,pkgSourceList *Sources, pkgRecords *Recs); - OrderResult DoInstall(); + OrderResult DoInstall(int statusFd=-1); bool FixMissing(); pkgPackageManager(pkgDepCache *Cache); diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 75617d194..e673e0f5b 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -765,7 +765,8 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, if (_config->FindB("APT::Get::Simulate") == true) { pkgSimulate PM(Cache); - pkgPackageManager::OrderResult Res = PM.DoInstall(); + int status_fd = _config->FindI("APT::Status-Fd",-1); + pkgPackageManager::OrderResult Res = PM.DoInstall(status_fd); if (Res == pkgPackageManager::Failed) return false; if (Res != pkgPackageManager::Completed) @@ -994,7 +995,8 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, } _system->UnLock(); - pkgPackageManager::OrderResult Res = PM->DoInstall(); + int status_fd = _config->FindI("APT::Status-Fd",-1); + pkgPackageManager::OrderResult Res = PM->DoInstall(status_fd); if (Res == pkgPackageManager::Failed || _error->PendingError() == true) return false; if (Res == pkgPackageManager::Completed) diff --git a/configure.in b/configure.in index 7e3aba331..1ee7e168b 100644 --- a/configure.in +++ b/configure.in @@ -18,7 +18,7 @@ AC_CONFIG_AUX_DIR(buildlib) AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in) dnl -- SET THIS TO THE RELEASE VERSION -- -AC_DEFINE_UNQUOTED(VERSION,"0.6.40") +AC_DEFINE_UNQUOTED(VERSION,"0.6.40.2") PACKAGE="apt" AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE") AC_SUBST(PACKAGE) diff --git a/debian/apt-doc.docs b/debian/apt-doc.docs new file mode 100644 index 000000000..a7507f4e7 --- /dev/null +++ b/debian/apt-doc.docs @@ -0,0 +1 @@ +README.progress-reporting \ No newline at end of file diff --git a/debian/changelog b/debian/changelog index 78b400954..614041acf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,20 @@ +apt (0.6.40.2) unstable; urgency=low + + * improved the support for "error" and "conffile" reporting from + dpkg, added the format to README.progress-reporting + * added README.progress-reporting to the apt-doc package + + -- + +apt (0.6.40.1) unstable; urgency=low + + * bugfix in the parsing code for the apt<->dpkg communication. apt + crashed when dpkg sends the same state more than once under certain + conditions + * 0.6.40 breaks the ABI but I accidentally didn't change the soname :/ + + -- Michael Vogt Fri, 5 Aug 2005 13:24:58 +0200 + apt (0.6.40) unstable; urgency=low * Patch from Jordi Mallach to mark some additional strings for translation @@ -5,8 +22,13 @@ apt (0.6.40) unstable; urgency=low * Merge from bubulle@debian.org--2005/apt--main--0: - Update pot and merge with *.po - Updated French translation, including apt-key.fr.8 + * Restore changelog entries from the 0.6.x series that went to Debian + experimental + * Merge michael.vogt@ubuntu.com--2005/apt--progress-reporting--0 + - Provide an interface for progress reporting which can be used by + (e.g.) base-config - -- Matt Zimmerman Thu, 28 Jul 2005 11:57:32 -0700 + -- Matt Zimmerman Thu, 28 Jul 2005 11:57:32 -0700 apt (0.6.39) unstable; urgency=low @@ -213,6 +235,236 @@ apt (0.6.27) hoary; urgency=low -- Matt Zimmerman Mon, 13 Dec 2004 01:03:11 -0800 +apt (0.6.25) experimental; urgency=low + + * Fix handling of two-part sources for sources.list deb-src entries in + the same way that deb entries were fixed + + -- Matt Zimmerman Wed, 9 Jun 2004 05:29:50 -0700 + +apt (0.6.24) experimental; urgency=low + + * YnPrompt fixes were inadvertently left out, include them (Closes: + #249251) + + -- Matt Zimmerman Sun, 16 May 2004 14:18:53 -0700 + +apt (0.6.23) experimental; urgency=low + + * Remove obsolete pkgIterator::TargetVer() (Closes: #230159) + * Reverse test in CheckAuth to match new prompt (Closes: #248211) + + -- Matt Zimmerman Sun, 9 May 2004 21:01:58 -0700 + +apt (0.6.22) experimental; urgency=low + + * Merge 0.5.25 + * Make the unauthenticated packages prompt more intuitive (yes to + continue, default no), but require --force-yes in addition to + --assume-yes in order to override + + -- Matt Zimmerman Fri, 19 Mar 2004 13:55:35 -0800 + +apt (0.6.21) experimental; urgency=low + + * Merge 0.5.24 + + -- Matt Zimmerman Tue, 16 Mar 2004 22:52:34 -0800 + +apt (0.6.20) experimental; urgency=low + + * Merge 0.5.23 + + -- Matt Zimmerman Thu, 26 Feb 2004 17:17:02 -0800 + +apt (0.6.19) experimental; urgency=low + + * Merge 0.5.22 + * Convert apt-key(8) to docbook XML + + -- Matt Zimmerman Mon, 9 Feb 2004 15:44:49 -0800 + +apt (0.6.18) experimental; urgency=low + + * Add new Debian Archive Automatic Signing Key to the default keyring + (existing keyrings are not updated; do that yourself) + + -- Matt Zimmerman Sat, 17 Jan 2004 17:04:30 -0800 + +apt (0.6.17) experimental; urgency=low + + * Merge 0.5.21 + * Handle more IMS stuff correctly + + -- Matt Zimmerman Fri, 16 Jan 2004 10:54:25 -0800 + +apt (0.6.16) experimental; urgency=low + + * Fix some cases where the .gpg file could be left in place when it is + invalid + + -- Matt Zimmerman Fri, 9 Jan 2004 09:22:15 -0800 + +apt (0.6.15) experimental; urgency=low + + * s/Debug::Acquire::gpg/&v/ + * Honor the [vendor] syntax in sources.list again (though it is not + presently used for anything) + * Don't ship vendors.list(5) since it isn't used yet + * Revert change from 0.6.10; it was right in the first place and the + problem was apparently something else. Archive = Suite. + + -- Matt Zimmerman Mon, 5 Jan 2004 17:43:01 -0800 + +apt (0.6.14) experimental; urgency=low + + * Merge 0.5.20 + + -- Matt Zimmerman Sun, 4 Jan 2004 11:09:21 -0800 + +apt (0.6.13) experimental; urgency=low + + * Merge 0.5.19 + + -- Matt Zimmerman Sat, 3 Jan 2004 16:22:31 -0800 + +apt (0.6.12) experimental; urgency=low + + * Have pkgAcquireIndex calculate an MD5 sum if one is not provided by + the method (as with file: and copy:). Local repositories + * Fix warning about dist name mismatch to actually print what it was + expecting + * Don't expect any particular distribution name for two-part + sources.list entries + * Merge 0.5.18 + + -- Matt Zimmerman Fri, 2 Jan 2004 13:59:00 -0800 + +apt (0.6.11) experimental; urgency=low + + * Support IMS requests of Release.gpg and Release + * This required API changes, bump the libapt-pkg version + * Copy local Release files into Dir::State::Lists + * Set IndexFile attribute when retrieving Release and Release.gpg so + that the appropriate Cache-Control headers are sent + + -- Matt Zimmerman Fri, 2 Jan 2004 10:46:17 -0800 + +apt (0.6.10) experimental; urgency=low + + * Use "Codename" (woody, sarge, etc.) to supply the value of the + "Archive" package file attribute, used to match "release a=" type + pins, rather than "Suite" (stable, testing, etc.) + + -- Matt Zimmerman Thu, 1 Jan 2004 16:56:47 -0800 + +apt (0.6.9) experimental; urgency=low + + * Another tagfile workaround + + -- Matt Zimmerman Thu, 1 Jan 2004 13:56:08 -0800 + +apt (0.6.8) experimental; urgency=low + + * Add a config option and corresponding command line option + (--allow-unauthenticated) to apt-get, to make buildd operators happy + (Closes: #225648) + + -- Matt Zimmerman Wed, 31 Dec 2003 08:28:04 -0800 + +apt (0.6.7) experimental; urgency=low + + * Forgot to revert part of the changes to tagfile in 0.6.4. Hopefully + will fix segfaults for some folks. + + -- Matt Zimmerman Wed, 31 Dec 2003 08:01:28 -0800 + +apt (0.6.6) experimental; urgency=low + + * Restore the ugly hack I removed from indexRecords::Load which set the + pkgTagFile buffer size to (file size)+256. This is concealing a bug, + but I can't fix it right now. This should fix the segfaults that + folks are seeing with 0.6.[45]. + + -- Matt Zimmerman Mon, 29 Dec 2003 18:11:13 -0800 + +apt (0.6.5) experimental; urgency=low + + * Move the authentication check into a separate function in apt-get + * Fix display of unauthenticated packages when they are in the cache + (Closes: #225336) + + -- Matt Zimmerman Sun, 28 Dec 2003 16:47:57 -0800 + +apt (0.6.4) experimental; urgency=low + + * Use the top-level Release file in LoadReleaseInfo, rather than looking + for the per-section ones (which aren't downloaded anymore). This + unbreaks release pinning, including the NotAutomatic bit used by + project/experimental + * Use FileFd::Size() rather than a separate stat() call in + LoadReleaseInfo + * Fix pkgTagFile to leave a little extra room at the end of the buffer + to append the record separator if it isn't present + * Change LoadReleaseInfo to use "Suite" rather than "Archive", to match + the Debian archive's dist-level Release files + + -- Matt Zimmerman Sun, 28 Dec 2003 15:55:55 -0800 + +apt (0.6.3) experimental; urgency=low + + * Fix MetaIndexURI for flat ("foo/") sources + + -- Matt Zimmerman Sun, 28 Dec 2003 12:11:56 -0800 + +apt (0.6.2) experimental; urgency=low + + * Add space between package names when multiple unauthenticated packages + are being installed (Closes: #225212) + * Provide apt-key with a secret keyring and a trustdb, even though we + would never use them, because it blows up if it doesn't have them + * Fix typo in apt-key(8) (standard input is '-', not '/') + + -- Matt Zimmerman Sat, 27 Dec 2003 13:01:40 -0800 + +apt (0.6.1) experimental; urgency=low + + * Merge apt 0.5.17 + * Rearrange Release file authentication code to be more clear + * If Release is present, but Release.gpg is not, don't forget to still + queue Packages files + * Convert distribution "../project/experimental" to "experimental" for + comparison purposes + * Make a number of Release file errors into warnings; for now, it is OK + not to have a codename, for example. We mostly care about checksums + for now + + -- Matt Zimmerman Fri, 26 Dec 2003 15:12:47 -0800 + +apt (0.6.0) experimental; urgency=low + + * Signature verification support patch ("apt-secure") from Colin Walters + and Isaac Jones . This + implements: + - Release signature verification (Release.gpg) + - Packages, Sources md5sum verification against Release + - Closes: #203741 + * Make some modifications to signature verification support: + - Release.gpg is always retrieved and verified if present, rather than + requiring that sources be configured as secure + - Print a hint about installing gnupg if exec(gpgv) fails + - Remove obsolete pkgAcqIndexRel + - Move vendors.list stuff into a separate module (vendorlist.{h,cc}) + - If any files about to be retrieved are not authenticated, issue a + warning to the user and require confirmation + - Fix a heap corruption bug in pkgSrcRecords::pkgSrcRecords() + * Suggests: gnupg + * Install a keyring in /usr/share/apt/debian-archive.gpg containing an + initial set of Debian archive signing keys to seed /etc/apt/trusted.gpg + * Add a new tool, apt-key(8) used to manage the keyring + + -- Matt Zimmerman Fri, 26 Dec 2003 08:27:19 -0800 + apt (0.5.32) hoary; urgency=low * Call setlocale in the methods, so that the messages are properly diff --git a/doc/examples/configure-index b/doc/examples/configure-index index a09ea0c37..dee0c06ff 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -84,6 +84,13 @@ APT Force-LoopBreak "false"; // DO NOT turn this on, see the man page Cache-Limit "4194304"; Default-Release ""; + + + // Write progress messages on this fd (for stuff like base-config) + Status-Fd "-1"; + // Keep the list of FDs open (normally apt closes all fds when it + // does a ExecFork) + Keep-Fds {}; }; // Options for the downloading routines @@ -234,6 +241,7 @@ Debug pkgAcquire "false"; pkgAcquire::Worker "false"; pkgDPkgPM "false"; + pkgDPkgProgressReporting "false"; pkgOrderList "false"; pkgInitialize "false"; // This one will dump the configuration space diff --git a/methods/makefile b/methods/makefile index 089300570..06fd2a6fc 100644 --- a/methods/makefile +++ b/methods/makefile @@ -7,7 +7,7 @@ include ../buildlib/defaults.mak BIN := $(BIN)/methods # FIXME.. -LIB_APT_PKG_MAJOR = 3.5 +LIB_APT_PKG_MAJOR = 3.10 APT_DOMAIN := libapt-pkg$(LIB_APT_PKG_MAJOR) # The file method diff --git a/po/apt-all.pot b/po/apt-all.pot index 53be3fcca..d06c14ce1 100644 --- a/po/apt-all.pot +++ b/po/apt-all.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2005-07-02 11:19-0700\n" +"POT-Creation-Date: 2005-06-06 14:00+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/test/conf_clear.cc b/test/conf_clear.cc new file mode 100644 index 000000000..259aa0f39 --- /dev/null +++ b/test/conf_clear.cc @@ -0,0 +1,23 @@ +#include +#include + +using namespace std; + +int main(int argc,const char *argv[]) +{ + Configuration Cnf; + + cout << "adding elements" << endl; + Cnf.Set("APT::Keep-Fds::",28); + Cnf.Set("APT::Keep-Fds::",17); + Cnf.Set("APT::Keep-Fds::",47); + Cnf.Dump(); + + cout << "Removing elements" << endl; + Cnf.Clear("APT::Keep-Fds",17); + Cnf.Clear("APT::Keep-Fds",28); + Cnf.Clear("APT::Keep-Fds",47); + Cnf.Dump(); + + return 0; +} diff --git a/test/makefile b/test/makefile index 9ad6233c2..a9dbdc34d 100644 --- a/test/makefile +++ b/test/makefile @@ -38,6 +38,12 @@ LIB_MAKES = apt-pkg/makefile apt-inst/makefile SOURCE = testextract.cc include $(PROGRAM_H) +# Program for testing the config file parser +PROGRAM=conftest_clear +SLIBS = -lapt-pkg +SOURCE = conf_clear.cc +include $(PROGRAM_H) + # Program for testing the config file parser PROGRAM=conftest SLIBS = -lapt-pkg -- cgit v1.2.3-70-g09d2 From 13e8426f800dd5e21e78fa6488b860e3f0467984 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 23 Aug 2005 08:03:51 +0000 Subject: * merged with apt--fixes--0 Patches applied: * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-7 * fixed incorrect man-page example * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-8 * changelog udpate * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-9 * we only need to check once for xmlto * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-10 * fix a bug in a man-page, fix a problem with overly long lines in apt-cdrom * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-11 * merged with apt--main--0 * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-12 * fix a incorrect error message (it always added .gz regardless what was downloaded) * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-13 * merged with main * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-14 * added Hashsum support for file and cdrom * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-15 * added README.arch * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-16 * merged with main * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-17 * move the changelog to the right place * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-18 * Change pkgPolicy::Pin from private to protected * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-19 * added a default constructor for PrvIterator * michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-20 * applied otavios patch to reread the statusFile on debSystem::Initialize * otavio@debian.org--2005/apt--fixes--0--patch-28 Reread status configuration, needed for clients using independent apt ... --- README.arch | 8 + apt-pkg/acquire-item.cc | 18 +- apt-pkg/acquire-item.h | 5 +- apt-pkg/cacheiterators.h | 4 +- apt-pkg/cdrom.cc | 3 + apt-pkg/deb/debsystem.cc | 7 +- apt-pkg/policy.h | 4 +- cmdline/apt-get.cc | 2 +- configure.in | 5 +- debian/changelog | 20 +- doc/apt.conf.5.xml | 2 +- doc/apt_preferences.5.xml | 2 +- methods/cdrom.cc | 7 + methods/file.cc | 8 +- po/apt-all.pot | 471 +++++++++++++++++++++++++++++----------------- 15 files changed, 359 insertions(+), 207 deletions(-) create mode 100644 README.arch (limited to 'apt-pkg/deb') diff --git a/README.arch b/README.arch new file mode 100644 index 000000000..c02d57350 --- /dev/null +++ b/README.arch @@ -0,0 +1,8 @@ + +You can build apt from arch, but this needs the following additional +packages (in addtion to the usual build-depends): +xmlto perlsgml sgml2x sgmlspl docbook + +then run: +debian/rules arch-build + diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index c39d3fdde..dea68f3ee 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -142,20 +142,21 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner, { Decompression = false; Erase = false; - + DestFile = _config->FindDir("Dir::State::lists") + "partial/"; DestFile += URItoFileName(URI); if(comprExt.empty()) { - // autoselect - if(FileExists("/usr/bin/bzip2")) - Desc.URI = URI + ".bz2"; - else - Desc.URI = URI + ".gz"; + // autoselect the compression method + if(FileExists("/usr/bin/bzip2")) + CompressionExtension = ".bz2"; + else + CompressionExtension = ".gz"; } else { - Desc.URI = URI + comprExt; + CompressionExtension = comprExt; } + Desc.URI = URI + CompressionExtension; Desc.Description = URIDesc; Desc.Owner = this; @@ -905,7 +906,8 @@ void pkgAcqArchive::Done(string Message,unsigned long Size,string Md5Hash, { Status = StatError; ErrorText = _("MD5Sum mismatch"); - Rename(DestFile,DestFile + ".FAILED"); + if(FileExists(DestFile)) + Rename(DestFile,DestFile + ".FAILED"); return; } } diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h index ea71153d5..90f80368b 100644 --- a/apt-pkg/acquire-item.h +++ b/apt-pkg/acquire-item.h @@ -92,7 +92,8 @@ class pkgAcqIndex : public pkgAcquire::Item pkgAcquire::ItemDesc Desc; string RealURI; string ExpectedMD5; - + string CompressionExtension; + public: // Specialized action members @@ -100,7 +101,7 @@ class pkgAcqIndex : public pkgAcquire::Item virtual void Done(string Message,unsigned long Size,string Md5Hash, pkgAcquire::MethodConfig *Cnf); virtual string Custom600Headers(); - virtual string DescURI() {return RealURI + ".gz";}; + virtual string DescURI() {return RealURI + CompressionExtension;}; pkgAcqIndex(pkgAcquire *Owner,string URI,string URIDesc, string ShortDesct, string ExpectedMD5, string compressExt=""); diff --git a/apt-pkg/cacheiterators.h b/apt-pkg/cacheiterators.h index 62d2695dd..ce3c4165e 100644 --- a/apt-pkg/cacheiterators.h +++ b/apt-pkg/cacheiterators.h @@ -222,7 +222,7 @@ class pkgCache::PrvIterator void operator ++(int) {if (Prv != Owner->ProvideP) Prv = Owner->ProvideP + (Type == PrvVer?Prv->NextPkgProv:Prv->NextProvides);}; inline void operator ++() {operator ++(0);}; - inline bool end() const {return Prv == Owner->ProvideP?true:false;}; + inline bool end() const {return Owner == 0 || Prv == Owner->ProvideP?true:false;}; // Comparison inline bool operator ==(const PrvIterator &B) const {return Prv == B.Prv;}; @@ -244,6 +244,8 @@ class pkgCache::PrvIterator inline PkgIterator OwnerPkg() {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[Prv->Version].ParentPkg);}; inline unsigned long Index() const {return Prv - Owner->ProvideP;}; + inline PrvIterator() : Owner(0), Prv(0), Type(PrvVer) {}; + inline PrvIterator(pkgCache &Owner,Provides *Trg,Version *) : Prv(Trg), Type(PrvVer), Owner(&Owner) { diff --git a/apt-pkg/cdrom.cc b/apt-pkg/cdrom.cc index ca74aa685..c067cf1ee 100644 --- a/apt-pkg/cdrom.cc +++ b/apt-pkg/cdrom.cc @@ -422,6 +422,9 @@ bool pkgCdrom::WriteSourceList(string Name,vector &List,bool Source) { F.getline(Buffer,sizeof(Buffer)); CurLine++; + if (F.fail() && !F.eof()) + return _error->Error(_("Line %u too long in source list %s."), + CurLine,File.c_str()); _strtabexpand(Buffer,sizeof(Buffer)); _strstrip(Buffer); diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc index 0b3a4f742..2d805ea6f 100644 --- a/apt-pkg/deb/debsystem.cc +++ b/apt-pkg/deb/debsystem.cc @@ -164,7 +164,12 @@ bool debSystem::Initialize(Configuration &Cnf) Cnf.CndSet("Dir::State::userstatus","status.user"); // Defunct Cnf.CndSet("Dir::State::status","/var/lib/dpkg/status"); Cnf.CndSet("Dir::Bin::dpkg","/usr/bin/dpkg"); - + + if (StatusFile) { + delete StatusFile; + StatusFile = 0; + } + return true; } /*}}}*/ diff --git a/apt-pkg/policy.h b/apt-pkg/policy.h index 15f204798..40ebd3f70 100644 --- a/apt-pkg/policy.h +++ b/apt-pkg/policy.h @@ -45,6 +45,8 @@ using std::vector; class pkgPolicy : public pkgDepCache::Policy { + protected: + struct Pin { pkgVersionMatch::MatchType Type; @@ -58,8 +60,6 @@ class pkgPolicy : public pkgDepCache::Policy string Pkg; }; - protected: - Pin *Pins; signed short *PFPriority; vector Defaults; diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index e673e0f5b..7e079b91c 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -1659,7 +1659,7 @@ bool DoInstall(CommandLine &CmdL) // See if we need to prompt if (Cache->InstCount() == ExpectedInst && Cache->DelCount() == 0) return InstallPackages(Cache,false,false); - + return InstallPackages(Cache,false); } /*}}}*/ diff --git a/configure.in b/configure.in index 1ee7e168b..d9c3289ff 100644 --- a/configure.in +++ b/configure.in @@ -18,7 +18,7 @@ AC_CONFIG_AUX_DIR(buildlib) AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in) dnl -- SET THIS TO THE RELEASE VERSION -- -AC_DEFINE_UNQUOTED(VERSION,"0.6.40.2") +AC_DEFINE_UNQUOTED(VERSION,"0.6.41") PACKAGE="apt" AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE") AC_SUBST(PACKAGE) @@ -181,9 +181,6 @@ AC_PATH_PROG(DOCBOOK2MAN,docbook2man) dnl Check for the XML tools needed to build man pages AC_PATH_PROG(XMLTO,xmlto) -dnl Check for the XML tools needed to build man pages -AC_PATH_PROG(XMLTO,xmlto) - dnl Check for YODL dnl AC_CHECK_PROG(YODL_MAN,yodl2man,"yes","") diff --git a/debian/changelog b/debian/changelog index 39ab07b32..059840378 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,11 +1,11 @@ -apt (0.6.40.2) unstable; urgency=low +apt (0.6.41) unstable; urgency=low * improved the support for "error" and "conffile" reporting from dpkg, added the format to README.progress-reporting * added README.progress-reporting to the apt-doc package * improved the network timeout handling, if a index file from a - sources.list times out, don't try to get the other files from - that entry + sources.list times out or EAI_AGAIN is returned from getaddrinfo, + don't try to get the other files from that entry * Support architecture-specific extra overrides (closes: #225947). Thanks to Anthony Towns for idea and the patch, thanks to Colin Watson for testing it. @@ -17,11 +17,15 @@ apt (0.6.40.2) unstable; urgency=low * Andreas Pakulat: - added example apt-ftparchive.conf file to doc/examples (closes: #322483) - * methods/connect.cc: - - send failure reason for EAI_AGAIN (TmpResolveFailure) to acuire-item - * apt-pkg/acquire-item.cc: - - fail early if a FailReason is TmpResolveFailure (avoids hangs during - the install when no network is available) + * Fix a incorrect example in the man-page (closes: #282918) + * Fix a bug for very long lines in the apt-cdrom code (closes: #280356) + * Fix a manual page bug (closes: #316314) + * Do md5sum checking for file and cdrom method (closes: #319142) + * Change pkgPolicy::Pin from private to protected to let subclasses + access it too (closes: #321799) + * add default constructor for PrvIterator (closes: #322267) + * Reread status configuration on debSystem::Initialize() + (needed for apt-proxy, thanks to Otavio for this patch) -- Michael Vogt Tue, 23 Aug 2005 00:15:00 +0200 diff --git a/doc/apt.conf.5.xml b/doc/apt.conf.5.xml index 69e212243..43f33681f 100644 --- a/doc/apt.conf.5.xml +++ b/doc/apt.conf.5.xml @@ -284,7 +284,7 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";}; sourcelist gives the location of the sourcelist and main is the default configuration file (setting has no effect, unless it is done from the config file specified by - APT_CONFIG. + APT_CONFIG). The Dir::Parts setting reads in all the config fragments in lexical order from the directory specified. After this is done then the diff --git a/doc/apt_preferences.5.xml b/doc/apt_preferences.5.xml index 3e50bef8c..12b03196a 100644 --- a/doc/apt_preferences.5.xml +++ b/doc/apt_preferences.5.xml @@ -183,7 +183,7 @@ belonging to any distribution whose Archive name is "unstable Package: * Pin: release a=unstable -Pin-Priority: 50 +Pin-Priority: 500 The following record assigns a high priority to all package versions diff --git a/methods/cdrom.cc b/methods/cdrom.cc index 7cc036814..41eb8a0ee 100644 --- a/methods/cdrom.cc +++ b/methods/cdrom.cc @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -180,6 +181,12 @@ bool CDROMMethod::Fetch(FetchItem *Itm) CurrentID = NewID; Res.LastModified = Buf.st_mtime; Res.Size = Buf.st_size; + + Hashes Hash; + FileFd Fd(Res.Filename, FileFd::ReadOnly); + Hash.AddFD(Fd.Fd(), Fd.Size()); + Res.TakeHashes(Hash); + URIDone(Res); return true; } diff --git a/methods/file.cc b/methods/file.cc index 3500de9f5..9cdd5bc2d 100644 --- a/methods/file.cc +++ b/methods/file.cc @@ -15,6 +15,8 @@ // Include Files /*{{{*/ #include #include +#include +#include #include #include @@ -75,7 +77,11 @@ bool FileMethod::Fetch(FetchItem *Itm) if (Res.Filename.empty() == true) return _error->Error(_("File not found")); - + + Hashes Hash; + FileFd Fd(Res.Filename, FileFd::ReadOnly); + Hash.AddFD(Fd.Fd(), Fd.Size()); + Res.TakeHashes(Hash); URIDone(Res); return true; } diff --git a/po/apt-all.pot b/po/apt-all.pot index d06c14ce1..c34299d26 100644 --- a/po/apt-all.pot +++ b/po/apt-all.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2005-06-06 14:00+0200\n" +"POT-Creation-Date: 2005-08-23 09:45+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -147,8 +147,8 @@ msgid " %4i %s\n" msgstr "" #: cmdline/apt-cache.cc:1651 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70 -#: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:545 -#: cmdline/apt-get.cc:2322 cmdline/apt-sortpkgs.cc:144 +#: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:550 +#: cmdline/apt-get.cc:2324 cmdline/apt-sortpkgs.cc:144 #, c-format msgid "%s %s for %s %s compiled on %s %s\n" msgstr "" @@ -240,31 +240,31 @@ msgstr "" msgid "Cannot get debconf version. Is debconf installed?" msgstr "" -#: ftparchive/apt-ftparchive.cc:163 ftparchive/apt-ftparchive.cc:337 +#: ftparchive/apt-ftparchive.cc:167 ftparchive/apt-ftparchive.cc:341 msgid "Package extension list is too long" msgstr "" -#: ftparchive/apt-ftparchive.cc:165 ftparchive/apt-ftparchive.cc:179 -#: ftparchive/apt-ftparchive.cc:202 ftparchive/apt-ftparchive.cc:252 -#: ftparchive/apt-ftparchive.cc:266 ftparchive/apt-ftparchive.cc:288 +#: ftparchive/apt-ftparchive.cc:169 ftparchive/apt-ftparchive.cc:183 +#: ftparchive/apt-ftparchive.cc:206 ftparchive/apt-ftparchive.cc:256 +#: ftparchive/apt-ftparchive.cc:270 ftparchive/apt-ftparchive.cc:292 #, c-format msgid "Error processing directory %s" msgstr "" -#: ftparchive/apt-ftparchive.cc:250 +#: ftparchive/apt-ftparchive.cc:254 msgid "Source extension list is too long" msgstr "" -#: ftparchive/apt-ftparchive.cc:367 +#: ftparchive/apt-ftparchive.cc:371 msgid "Error writing header to contents file" msgstr "" -#: ftparchive/apt-ftparchive.cc:397 +#: ftparchive/apt-ftparchive.cc:401 #, c-format msgid "Error processing contents %s" msgstr "" -#: ftparchive/apt-ftparchive.cc:551 +#: ftparchive/apt-ftparchive.cc:556 msgid "" "Usage: apt-ftparchive [options] command\n" "Commands: packages binarypath [overridefile [pathprefix]]\n" @@ -306,11 +306,11 @@ msgid "" " -o=? Set an arbitrary configuration option" msgstr "" -#: ftparchive/apt-ftparchive.cc:757 +#: ftparchive/apt-ftparchive.cc:762 msgid "No selections matched" msgstr "" -#: ftparchive/apt-ftparchive.cc:830 +#: ftparchive/apt-ftparchive.cc:835 #, c-format msgid "Some files are missing in the package file group `%s'" msgstr "" @@ -343,83 +343,83 @@ msgstr "" msgid "Unable to get a cursor" msgstr "" -#: ftparchive/writer.cc:79 +#: ftparchive/writer.cc:78 #, c-format msgid "W: Unable to read directory %s\n" msgstr "" -#: ftparchive/writer.cc:84 +#: ftparchive/writer.cc:83 #, c-format msgid "W: Unable to stat %s\n" msgstr "" -#: ftparchive/writer.cc:126 +#: ftparchive/writer.cc:125 msgid "E: " msgstr "" -#: ftparchive/writer.cc:128 +#: ftparchive/writer.cc:127 msgid "W: " msgstr "" -#: ftparchive/writer.cc:135 +#: ftparchive/writer.cc:134 msgid "E: Errors apply to file " msgstr "" -#: ftparchive/writer.cc:152 ftparchive/writer.cc:182 +#: ftparchive/writer.cc:151 ftparchive/writer.cc:181 #, c-format msgid "Failed to resolve %s" msgstr "" -#: ftparchive/writer.cc:164 +#: ftparchive/writer.cc:163 msgid "Tree walking failed" msgstr "" -#: ftparchive/writer.cc:189 +#: ftparchive/writer.cc:188 #, c-format msgid "Failed to open %s" msgstr "" -#: ftparchive/writer.cc:246 +#: ftparchive/writer.cc:245 #, c-format msgid " DeLink %s [%s]\n" msgstr "" -#: ftparchive/writer.cc:254 +#: ftparchive/writer.cc:253 #, c-format msgid "Failed to readlink %s" msgstr "" -#: ftparchive/writer.cc:258 +#: ftparchive/writer.cc:257 #, c-format msgid "Failed to unlink %s" msgstr "" -#: ftparchive/writer.cc:265 +#: ftparchive/writer.cc:264 #, c-format msgid "*** Failed to link %s to %s" msgstr "" -#: ftparchive/writer.cc:275 +#: ftparchive/writer.cc:274 #, c-format msgid " DeLink limit of %sB hit.\n" msgstr "" #: ftparchive/writer.cc:358 apt-inst/extract.cc:181 apt-inst/extract.cc:193 -#: apt-inst/extract.cc:210 apt-inst/deb/dpkgdb.cc:121 +#: apt-inst/extract.cc:210 apt-inst/deb/dpkgdb.cc:121 methods/gpgv.cc:256 #, c-format msgid "Failed to stat %s" msgstr "" -#: ftparchive/writer.cc:378 +#: ftparchive/writer.cc:386 msgid "Archive had no package field" msgstr "" -#: ftparchive/writer.cc:386 ftparchive/writer.cc:595 +#: ftparchive/writer.cc:394 ftparchive/writer.cc:602 #, c-format msgid " %s has no override entry\n" msgstr "" -#: ftparchive/writer.cc:429 ftparchive/writer.cc:677 +#: ftparchive/writer.cc:437 ftparchive/writer.cc:688 #, c-format msgid " %s maintainer is %s not %s\n" msgstr "" @@ -523,7 +523,7 @@ msgstr "" msgid "Y" msgstr "" -#: cmdline/apt-get.cc:140 cmdline/apt-get.cc:1484 +#: cmdline/apt-get.cc:140 cmdline/apt-get.cc:1486 #, c-format msgid "Regex compilation error - %s" msgstr "" @@ -654,6 +654,10 @@ msgstr "" msgid "WARNING: The following packages cannot be authenticated!" msgstr "" +#: cmdline/apt-get.cc:691 +msgid "Authentication warning overridden.\n" +msgstr "" + #: cmdline/apt-get.cc:698 msgid "Install these packages without verification [y/N]? " msgstr "" @@ -662,57 +666,74 @@ msgstr "" msgid "Some packages could not be authenticated" msgstr "" -#: cmdline/apt-get.cc:709 cmdline/apt-get.cc:855 +#: cmdline/apt-get.cc:709 cmdline/apt-get.cc:856 msgid "There are problems and -y was used without --force-yes" msgstr "" +#: cmdline/apt-get.cc:753 +msgid "Internal error, InstallPackages was called with broken packages!" +msgstr "" + #: cmdline/apt-get.cc:762 msgid "Packages need to be removed but remove is disabled." msgstr "" -#: cmdline/apt-get.cc:788 cmdline/apt-get.cc:1778 cmdline/apt-get.cc:1811 +#: cmdline/apt-get.cc:773 +msgid "Internal error, Ordering didn't finish" +msgstr "" + +#: cmdline/apt-get.cc:789 cmdline/apt-get.cc:1780 cmdline/apt-get.cc:1813 msgid "Unable to lock the download directory" msgstr "" -#: cmdline/apt-get.cc:798 cmdline/apt-get.cc:1859 cmdline/apt-get.cc:2070 +#: cmdline/apt-get.cc:799 cmdline/apt-get.cc:1861 cmdline/apt-get.cc:2072 #: apt-pkg/cachefile.cc:67 msgid "The list of sources could not be read." msgstr "" -#: cmdline/apt-get.cc:818 +#: cmdline/apt-get.cc:814 +msgid "How odd.. The sizes didn't match, email apt@packages.debian.org" +msgstr "" + +#: cmdline/apt-get.cc:819 #, c-format msgid "Need to get %sB/%sB of archives.\n" msgstr "" -#: cmdline/apt-get.cc:821 +#: cmdline/apt-get.cc:822 #, c-format msgid "Need to get %sB of archives.\n" msgstr "" -#: cmdline/apt-get.cc:826 +#: cmdline/apt-get.cc:827 #, c-format msgid "After unpacking %sB of additional disk space will be used.\n" msgstr "" -#: cmdline/apt-get.cc:829 +#: cmdline/apt-get.cc:830 #, c-format msgid "After unpacking %sB disk space will be freed.\n" msgstr "" -#: cmdline/apt-get.cc:846 +#: cmdline/apt-get.cc:844 cmdline/apt-get.cc:1927 +#, c-format +msgid "Couldn't determine free space in %s" +msgstr "" + +#: cmdline/apt-get.cc:847 #, c-format msgid "You don't have enough free space in %s." msgstr "" -#: cmdline/apt-get.cc:861 cmdline/apt-get.cc:881 +#: cmdline/apt-get.cc:862 cmdline/apt-get.cc:882 msgid "Trivial Only specified but this is not a trivial operation." msgstr "" -#: cmdline/apt-get.cc:863 +#: cmdline/apt-get.cc:864 msgid "Yes, do as I say!" msgstr "" -#: cmdline/apt-get.cc:865 +#: cmdline/apt-get.cc:866 #, c-format msgid "" "You are about to do something potentially harmful.\n" @@ -720,74 +741,74 @@ msgid "" " ?] " msgstr "" -#: cmdline/apt-get.cc:871 cmdline/apt-get.cc:890 +#: cmdline/apt-get.cc:872 cmdline/apt-get.cc:891 msgid "Abort." msgstr "" -#: cmdline/apt-get.cc:886 +#: cmdline/apt-get.cc:887 msgid "Do you want to continue [Y/n]? " msgstr "" -#: cmdline/apt-get.cc:958 cmdline/apt-get.cc:1334 cmdline/apt-get.cc:1968 +#: cmdline/apt-get.cc:959 cmdline/apt-get.cc:1336 cmdline/apt-get.cc:1970 #, c-format msgid "Failed to fetch %s %s\n" msgstr "" -#: cmdline/apt-get.cc:976 +#: cmdline/apt-get.cc:977 msgid "Some files failed to download" msgstr "" -#: cmdline/apt-get.cc:977 cmdline/apt-get.cc:1977 +#: cmdline/apt-get.cc:978 cmdline/apt-get.cc:1979 msgid "Download complete and in download only mode" msgstr "" -#: cmdline/apt-get.cc:983 +#: cmdline/apt-get.cc:984 msgid "" "Unable to fetch some archives, maybe run apt-get update or try with --fix-" "missing?" msgstr "" -#: cmdline/apt-get.cc:987 +#: cmdline/apt-get.cc:988 msgid "--fix-missing and media swapping is not currently supported" msgstr "" -#: cmdline/apt-get.cc:992 +#: cmdline/apt-get.cc:993 msgid "Unable to correct missing packages." msgstr "" -#: cmdline/apt-get.cc:993 +#: cmdline/apt-get.cc:994 msgid "Aborting install." msgstr "" -#: cmdline/apt-get.cc:1026 +#: cmdline/apt-get.cc:1028 #, c-format msgid "Note, selecting %s instead of %s\n" msgstr "" -#: cmdline/apt-get.cc:1036 +#: cmdline/apt-get.cc:1038 #, c-format msgid "Skipping %s, it is already installed and upgrade is not set.\n" msgstr "" -#: cmdline/apt-get.cc:1054 +#: cmdline/apt-get.cc:1056 #, c-format msgid "Package %s is not installed, so not removed\n" msgstr "" -#: cmdline/apt-get.cc:1065 +#: cmdline/apt-get.cc:1067 #, c-format msgid "Package %s is a virtual package provided by:\n" msgstr "" -#: cmdline/apt-get.cc:1077 +#: cmdline/apt-get.cc:1079 msgid " [Installed]" msgstr "" -#: cmdline/apt-get.cc:1082 +#: cmdline/apt-get.cc:1084 msgid "You should explicitly select one to install." msgstr "" -#: cmdline/apt-get.cc:1087 +#: cmdline/apt-get.cc:1089 #, c-format msgid "" "Package %s is not available, but is referred to by another package.\n" @@ -795,79 +816,79 @@ msgid "" "is only available from another source\n" msgstr "" -#: cmdline/apt-get.cc:1106 +#: cmdline/apt-get.cc:1108 msgid "However the following packages replace it:" msgstr "" -#: cmdline/apt-get.cc:1109 +#: cmdline/apt-get.cc:1111 #, c-format msgid "Package %s has no installation candidate" msgstr "" -#: cmdline/apt-get.cc:1129 +#: cmdline/apt-get.cc:1131 #, c-format msgid "Reinstallation of %s is not possible, it cannot be downloaded.\n" msgstr "" -#: cmdline/apt-get.cc:1137 +#: cmdline/apt-get.cc:1139 #, c-format msgid "%s is already the newest version.\n" msgstr "" -#: cmdline/apt-get.cc:1164 +#: cmdline/apt-get.cc:1166 #, c-format msgid "Release '%s' for '%s' was not found" msgstr "" -#: cmdline/apt-get.cc:1166 +#: cmdline/apt-get.cc:1168 #, c-format msgid "Version '%s' for '%s' was not found" msgstr "" -#: cmdline/apt-get.cc:1172 +#: cmdline/apt-get.cc:1174 #, c-format msgid "Selected version %s (%s) for %s\n" msgstr "" -#: cmdline/apt-get.cc:1282 +#: cmdline/apt-get.cc:1284 msgid "The update command takes no arguments" msgstr "" -#: cmdline/apt-get.cc:1295 cmdline/apt-get.cc:1389 +#: cmdline/apt-get.cc:1297 cmdline/apt-get.cc:1391 msgid "Unable to lock the list directory" msgstr "" -#: cmdline/apt-get.cc:1353 +#: cmdline/apt-get.cc:1355 msgid "" "Some index files failed to download, they have been ignored, or old ones " "used instead." msgstr "" -#: cmdline/apt-get.cc:1372 +#: cmdline/apt-get.cc:1374 msgid "Internal error, AllUpgrade broke stuff" msgstr "" -#: cmdline/apt-get.cc:1471 cmdline/apt-get.cc:1507 +#: cmdline/apt-get.cc:1473 cmdline/apt-get.cc:1509 #, c-format msgid "Couldn't find package %s" msgstr "" -#: cmdline/apt-get.cc:1494 +#: cmdline/apt-get.cc:1496 #, c-format msgid "Note, selecting %s for regex '%s'\n" msgstr "" -#: cmdline/apt-get.cc:1524 +#: cmdline/apt-get.cc:1526 msgid "You might want to run `apt-get -f install' to correct these:" msgstr "" -#: cmdline/apt-get.cc:1527 +#: cmdline/apt-get.cc:1529 msgid "" "Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a " "solution)." msgstr "" -#: cmdline/apt-get.cc:1539 +#: cmdline/apt-get.cc:1541 msgid "" "Some packages could not be installed. This may mean that you have\n" "requested an impossible situation or if you are using the unstable\n" @@ -875,149 +896,153 @@ msgid "" "or been moved out of Incoming." msgstr "" -#: cmdline/apt-get.cc:1547 +#: cmdline/apt-get.cc:1549 msgid "" "Since you only requested a single operation it is extremely likely that\n" "the package is simply not installable and a bug report against\n" "that package should be filed." msgstr "" -#: cmdline/apt-get.cc:1552 +#: cmdline/apt-get.cc:1554 msgid "The following information may help to resolve the situation:" msgstr "" -#: cmdline/apt-get.cc:1555 +#: cmdline/apt-get.cc:1557 msgid "Broken packages" msgstr "" -#: cmdline/apt-get.cc:1581 +#: cmdline/apt-get.cc:1583 msgid "The following extra packages will be installed:" msgstr "" -#: cmdline/apt-get.cc:1652 +#: cmdline/apt-get.cc:1654 msgid "Suggested packages:" msgstr "" -#: cmdline/apt-get.cc:1653 +#: cmdline/apt-get.cc:1655 msgid "Recommended packages:" msgstr "" -#: cmdline/apt-get.cc:1673 +#: cmdline/apt-get.cc:1675 msgid "Calculating upgrade... " msgstr "" -#: cmdline/apt-get.cc:1676 methods/ftp.cc:702 methods/connect.cc:99 +#: cmdline/apt-get.cc:1678 methods/ftp.cc:702 methods/connect.cc:101 msgid "Failed" msgstr "" -#: cmdline/apt-get.cc:1681 +#: cmdline/apt-get.cc:1683 msgid "Done" msgstr "" -#: cmdline/apt-get.cc:1854 +#: cmdline/apt-get.cc:1748 cmdline/apt-get.cc:1756 +msgid "Internal error, problem resolver broke stuff" +msgstr "" + +#: cmdline/apt-get.cc:1856 msgid "Must specify at least one package to fetch source for" msgstr "" -#: cmdline/apt-get.cc:1881 cmdline/apt-get.cc:2088 +#: cmdline/apt-get.cc:1883 cmdline/apt-get.cc:2090 #, c-format msgid "Unable to find a source package for %s" msgstr "" -#: cmdline/apt-get.cc:1928 +#: cmdline/apt-get.cc:1930 #, c-format msgid "You don't have enough free space in %s" msgstr "" -#: cmdline/apt-get.cc:1933 +#: cmdline/apt-get.cc:1935 #, c-format msgid "Need to get %sB/%sB of source archives.\n" msgstr "" -#: cmdline/apt-get.cc:1936 +#: cmdline/apt-get.cc:1938 #, c-format msgid "Need to get %sB of source archives.\n" msgstr "" -#: cmdline/apt-get.cc:1942 +#: cmdline/apt-get.cc:1944 #, c-format msgid "Fetch source %s\n" msgstr "" -#: cmdline/apt-get.cc:1973 +#: cmdline/apt-get.cc:1975 msgid "Failed to fetch some archives." msgstr "" -#: cmdline/apt-get.cc:2001 +#: cmdline/apt-get.cc:2003 #, c-format msgid "Skipping unpack of already unpacked source in %s\n" msgstr "" -#: cmdline/apt-get.cc:2013 +#: cmdline/apt-get.cc:2015 #, c-format msgid "Unpack command '%s' failed.\n" msgstr "" -#: cmdline/apt-get.cc:2030 +#: cmdline/apt-get.cc:2032 #, c-format msgid "Build command '%s' failed.\n" msgstr "" -#: cmdline/apt-get.cc:2049 +#: cmdline/apt-get.cc:2051 msgid "Child process failed" msgstr "" -#: cmdline/apt-get.cc:2065 +#: cmdline/apt-get.cc:2067 msgid "Must specify at least one package to check builddeps for" msgstr "" -#: cmdline/apt-get.cc:2093 +#: cmdline/apt-get.cc:2095 #, c-format msgid "Unable to get build-dependency information for %s" msgstr "" -#: cmdline/apt-get.cc:2113 +#: cmdline/apt-get.cc:2115 #, c-format msgid "%s has no build depends.\n" msgstr "" -#: cmdline/apt-get.cc:2165 +#: cmdline/apt-get.cc:2167 #, c-format msgid "" "%s dependency for %s cannot be satisfied because the package %s cannot be " "found" msgstr "" -#: cmdline/apt-get.cc:2217 +#: cmdline/apt-get.cc:2219 #, c-format msgid "" "%s dependency for %s cannot be satisfied because no available versions of " "package %s can satisfy version requirements" msgstr "" -#: cmdline/apt-get.cc:2252 +#: cmdline/apt-get.cc:2254 #, c-format msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new" msgstr "" -#: cmdline/apt-get.cc:2277 +#: cmdline/apt-get.cc:2279 #, c-format msgid "Failed to satisfy %s dependency for %s: %s" msgstr "" -#: cmdline/apt-get.cc:2291 +#: cmdline/apt-get.cc:2293 #, c-format msgid "Build-dependencies for %s could not be satisfied." msgstr "" -#: cmdline/apt-get.cc:2295 +#: cmdline/apt-get.cc:2297 msgid "Failed to process build dependencies" msgstr "" -#: cmdline/apt-get.cc:2327 +#: cmdline/apt-get.cc:2329 msgid "Supported modules:" msgstr "" -#: cmdline/apt-get.cc:2368 +#: cmdline/apt-get.cc:2370 msgid "" "Usage: apt-get [options] command\n" " apt-get [options] install|remove pkg1 [pkg2 ...]\n" @@ -1270,8 +1295,8 @@ msgstr "" msgid "File %s/%s overwrites the one in the package %s" msgstr "" -#: apt-inst/extract.cc:467 apt-pkg/contrib/configuration.cc:709 -#: apt-pkg/contrib/cdromutl.cc:153 apt-pkg/acquire.cc:416 apt-pkg/clean.cc:38 +#: apt-inst/extract.cc:467 apt-pkg/contrib/configuration.cc:750 +#: apt-pkg/contrib/cdromutl.cc:153 apt-pkg/acquire.cc:417 apt-pkg/clean.cc:38 #, c-format msgid "Unable to read %s" msgstr "" @@ -1407,39 +1432,40 @@ msgstr "" msgid "Unparsable control file" msgstr "" -#: methods/cdrom.cc:113 +#: methods/cdrom.cc:114 #, c-format msgid "Unable to read the cdrom database %s" msgstr "" -#: methods/cdrom.cc:122 +#: methods/cdrom.cc:123 msgid "" "Please use apt-cdrom to make this CD-ROM recognized by APT. apt-get update " "cannot be used to add new CD-ROMs" msgstr "" -#: methods/cdrom.cc:130 methods/cdrom.cc:168 +#: methods/cdrom.cc:131 methods/cdrom.cc:169 msgid "Wrong CD-ROM" msgstr "" -#: methods/cdrom.cc:163 +#: methods/cdrom.cc:164 #, c-format msgid "Unable to unmount the CD-ROM in %s, it may still be in use." msgstr "" -#: methods/cdrom.cc:177 methods/file.cc:77 methods/rsh.cc:264 +#: methods/cdrom.cc:178 methods/file.cc:79 methods/rsh.cc:264 msgid "File not found" msgstr "" -#: methods/copy.cc:42 methods/gzip.cc:133 methods/gzip.cc:142 +#: methods/copy.cc:42 methods/gpgv.cc:265 methods/gzip.cc:133 +#: methods/gzip.cc:142 msgid "Failed to stat" msgstr "" -#: methods/copy.cc:79 methods/gzip.cc:139 +#: methods/copy.cc:79 methods/gpgv.cc:262 methods/gzip.cc:139 msgid "Failed to set modification time" msgstr "" -#: methods/file.cc:42 +#: methods/file.cc:44 msgid "Invalid URI, local URIS must not start with //" msgstr "" @@ -1495,7 +1521,7 @@ msgstr "" msgid "Server closed the connection" msgstr "" -#: methods/ftp.cc:338 methods/rsh.cc:190 apt-pkg/contrib/fileutl.cc:453 +#: methods/ftp.cc:338 apt-pkg/contrib/fileutl.cc:471 methods/rsh.cc:190 msgid "Read error" msgstr "" @@ -1507,7 +1533,7 @@ msgstr "" msgid "Protocol corruption" msgstr "" -#: methods/ftp.cc:446 methods/rsh.cc:232 apt-pkg/contrib/fileutl.cc:492 +#: methods/ftp.cc:446 apt-pkg/contrib/fileutl.cc:510 methods/rsh.cc:232 msgid "Write error" msgstr "" @@ -1608,43 +1634,79 @@ msgstr "" msgid "Cannot initiate the connection to %s:%s (%s)." msgstr "" -#: methods/connect.cc:92 +#: methods/connect.cc:93 #, c-format msgid "Could not connect to %s:%s (%s), connection timed out" msgstr "" -#: methods/connect.cc:104 +#: methods/connect.cc:106 #, c-format msgid "Could not connect to %s:%s (%s)." msgstr "" #. We say this mainly because the pause here is for the #. ssh connection that is still going -#: methods/connect.cc:132 methods/rsh.cc:425 +#: methods/connect.cc:134 methods/rsh.cc:425 #, c-format msgid "Connecting to %s" msgstr "" -#: methods/connect.cc:163 +#: methods/connect.cc:165 #, c-format msgid "Could not resolve '%s'" msgstr "" -#: methods/connect.cc:167 +#: methods/connect.cc:171 #, c-format msgid "Temporary failure resolving '%s'" msgstr "" -#: methods/connect.cc:169 +#: methods/connect.cc:174 #, c-format msgid "Something wicked happened resolving '%s:%s' (%i)" msgstr "" -#: methods/connect.cc:216 +#: methods/connect.cc:221 #, c-format msgid "Unable to connect to %s %s:" msgstr "" +#: methods/gpgv.cc:92 +msgid "E: Argument list from Acquire::gpgv::Options too long. Exiting." +msgstr "" + +#: methods/gpgv.cc:191 +msgid "" +"Internal error: Good signature, but could not determine key fingerprint?!" +msgstr "" + +#: methods/gpgv.cc:196 +msgid "At least one invalid signature was encountered." +msgstr "" + +#. FIXME String concatenation considered harmful. +#: methods/gpgv.cc:201 +msgid "Could not execute " +msgstr "" + +#: methods/gpgv.cc:202 +msgid " to verify signature (is gnupg installed?)" +msgstr "" + +#: methods/gpgv.cc:206 +msgid "Unknown error executing gpgv" +msgstr "" + +#: methods/gpgv.cc:237 +msgid "The following signatures were invalid:\n" +msgstr "" + +#: methods/gpgv.cc:244 +msgid "" +"The following signatures couldn't be verified because the public key is not " +"available:\n" +msgstr "" + #: methods/gzip.cc:57 #, c-format msgid "Couldn't open pipe for %s" @@ -1728,10 +1790,6 @@ msgstr "" msgid "Internal error" msgstr "" -#: methods/rsh.cc:330 -msgid "Connection closed prematurely" -msgstr "" - #: apt-pkg/contrib/mmap.cc:82 msgid "Can't mmap an empty file" msgstr "" @@ -1746,57 +1804,57 @@ msgstr "" msgid "Selection %s not found" msgstr "" -#: apt-pkg/contrib/configuration.cc:395 +#: apt-pkg/contrib/configuration.cc:436 #, c-format msgid "Unrecognized type abbreviation: '%c'" msgstr "" -#: apt-pkg/contrib/configuration.cc:453 +#: apt-pkg/contrib/configuration.cc:494 #, c-format msgid "Opening configuration file %s" msgstr "" -#: apt-pkg/contrib/configuration.cc:471 +#: apt-pkg/contrib/configuration.cc:512 #, c-format msgid "Line %d too long (max %d)" msgstr "" -#: apt-pkg/contrib/configuration.cc:567 +#: apt-pkg/contrib/configuration.cc:608 #, c-format msgid "Syntax error %s:%u: Block starts with no name." msgstr "" -#: apt-pkg/contrib/configuration.cc:586 +#: apt-pkg/contrib/configuration.cc:627 #, c-format msgid "Syntax error %s:%u: Malformed tag" msgstr "" -#: apt-pkg/contrib/configuration.cc:603 +#: apt-pkg/contrib/configuration.cc:644 #, c-format msgid "Syntax error %s:%u: Extra junk after value" msgstr "" -#: apt-pkg/contrib/configuration.cc:643 +#: apt-pkg/contrib/configuration.cc:684 #, c-format msgid "Syntax error %s:%u: Directives can only be done at the top level" msgstr "" -#: apt-pkg/contrib/configuration.cc:650 +#: apt-pkg/contrib/configuration.cc:691 #, c-format msgid "Syntax error %s:%u: Too many nested includes" msgstr "" -#: apt-pkg/contrib/configuration.cc:654 apt-pkg/contrib/configuration.cc:659 +#: apt-pkg/contrib/configuration.cc:695 apt-pkg/contrib/configuration.cc:700 #, c-format msgid "Syntax error %s:%u: Included from here" msgstr "" -#: apt-pkg/contrib/configuration.cc:663 +#: apt-pkg/contrib/configuration.cc:704 #, c-format msgid "Syntax error %s:%u: Unsupported directive '%s'" msgstr "" -#: apt-pkg/contrib/configuration.cc:697 +#: apt-pkg/contrib/configuration.cc:738 #, c-format msgid "Syntax error %s:%u: Extra junk at end of file" msgstr "" @@ -1862,7 +1920,7 @@ msgstr "" msgid "Unable to stat the mount point %s" msgstr "" -#: apt-pkg/contrib/cdromutl.cc:149 apt-pkg/acquire.cc:422 apt-pkg/clean.cc:44 +#: apt-pkg/contrib/cdromutl.cc:149 apt-pkg/acquire.cc:423 apt-pkg/clean.cc:44 #, c-format msgid "Unable to change to %s" msgstr "" @@ -1871,70 +1929,70 @@ msgstr "" msgid "Failed to stat the cdrom" msgstr "" -#: apt-pkg/contrib/fileutl.cc:80 +#: apt-pkg/contrib/fileutl.cc:82 #, c-format msgid "Not using locking for read only lock file %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:85 +#: apt-pkg/contrib/fileutl.cc:87 #, c-format msgid "Could not open lock file %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:103 +#: apt-pkg/contrib/fileutl.cc:105 #, c-format msgid "Not using locking for nfs mounted lock file %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:107 +#: apt-pkg/contrib/fileutl.cc:109 #, c-format msgid "Could not get lock %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:359 +#: apt-pkg/contrib/fileutl.cc:377 #, c-format msgid "Waited for %s but it wasn't there" msgstr "" -#: apt-pkg/contrib/fileutl.cc:369 +#: apt-pkg/contrib/fileutl.cc:387 #, c-format msgid "Sub-process %s received a segmentation fault." msgstr "" -#: apt-pkg/contrib/fileutl.cc:372 +#: apt-pkg/contrib/fileutl.cc:390 #, c-format msgid "Sub-process %s returned an error code (%u)" msgstr "" -#: apt-pkg/contrib/fileutl.cc:374 +#: apt-pkg/contrib/fileutl.cc:392 #, c-format msgid "Sub-process %s exited unexpectedly" msgstr "" -#: apt-pkg/contrib/fileutl.cc:418 +#: apt-pkg/contrib/fileutl.cc:436 #, c-format msgid "Could not open file %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:474 +#: apt-pkg/contrib/fileutl.cc:492 #, c-format msgid "read, still have %lu to read but none left" msgstr "" -#: apt-pkg/contrib/fileutl.cc:504 +#: apt-pkg/contrib/fileutl.cc:522 #, c-format msgid "write, still have %lu to write but couldn't" msgstr "" -#: apt-pkg/contrib/fileutl.cc:579 +#: apt-pkg/contrib/fileutl.cc:597 msgid "Problem closing the file" msgstr "" -#: apt-pkg/contrib/fileutl.cc:585 +#: apt-pkg/contrib/fileutl.cc:603 msgid "Problem unlinking the file" msgstr "" -#: apt-pkg/contrib/fileutl.cc:596 +#: apt-pkg/contrib/fileutl.cc:614 msgid "Problem syncing the file" msgstr "" @@ -2059,7 +2117,7 @@ msgstr "" msgid "Opening %s" msgstr "" -#: apt-pkg/sourcelist.cc:170 +#: apt-pkg/sourcelist.cc:170 apt-pkg/cdrom.cc:426 #, c-format msgid "Line %u too long in source list %s." msgstr "" @@ -2108,16 +2166,21 @@ msgstr "" msgid "Unable to correct problems, you have held broken packages." msgstr "" -#: apt-pkg/acquire.cc:61 +#: apt-pkg/acquire.cc:62 #, c-format msgid "Lists directory %spartial is missing." msgstr "" -#: apt-pkg/acquire.cc:65 +#: apt-pkg/acquire.cc:66 #, c-format msgid "Archive directory %spartial is missing." msgstr "" +#: apt-pkg/acquire.cc:817 +#, c-format +msgid "Downloading file %li of %li (%s remaining)" +msgstr "" + #: apt-pkg/acquire-worker.cc:112 #, c-format msgid "The method driver %s could not be found." @@ -2251,31 +2314,31 @@ msgstr "" msgid "rename failed, %s (%s -> %s)." msgstr "" -#: apt-pkg/acquire-item.cc:235 apt-pkg/acquire-item.cc:900 +#: apt-pkg/acquire-item.cc:236 apt-pkg/acquire-item.cc:908 msgid "MD5Sum mismatch" msgstr "" -#: apt-pkg/acquire-item.cc:714 +#: apt-pkg/acquire-item.cc:722 #, c-format msgid "" "I wasn't able to locate a file for the %s package. This might mean you need " "to manually fix this package. (due to missing arch)" msgstr "" -#: apt-pkg/acquire-item.cc:767 +#: apt-pkg/acquire-item.cc:775 #, c-format msgid "" "I wasn't able to locate file for the %s package. This might mean you need to " "manually fix this package." msgstr "" -#: apt-pkg/acquire-item.cc:803 +#: apt-pkg/acquire-item.cc:811 #, c-format msgid "" "The package index files are corrupted. No Filename: field for package %s." msgstr "" -#: apt-pkg/acquire-item.cc:890 +#: apt-pkg/acquire-item.cc:898 msgid "Size mismatch" msgstr "" @@ -2284,73 +2347,73 @@ msgstr "" msgid "Vendor block %s contains no fingerprint" msgstr "" -#: apt-pkg/cdrom.cc:504 +#: apt-pkg/cdrom.cc:507 #, c-format msgid "" "Using CD-ROM mount point %s\n" "Mounting CD-ROM\n" msgstr "" -#: apt-pkg/cdrom.cc:513 apt-pkg/cdrom.cc:595 +#: apt-pkg/cdrom.cc:516 apt-pkg/cdrom.cc:598 msgid "Identifying.. " msgstr "" -#: apt-pkg/cdrom.cc:538 +#: apt-pkg/cdrom.cc:541 #, c-format msgid "Stored label: %s \n" msgstr "" -#: apt-pkg/cdrom.cc:558 +#: apt-pkg/cdrom.cc:561 #, c-format msgid "Using CD-ROM mount point %s\n" msgstr "" -#: apt-pkg/cdrom.cc:576 +#: apt-pkg/cdrom.cc:579 msgid "Unmounting CD-ROM\n" msgstr "" -#: apt-pkg/cdrom.cc:580 +#: apt-pkg/cdrom.cc:583 msgid "Waiting for disc...\n" msgstr "" #. Mount the new CDROM -#: apt-pkg/cdrom.cc:588 +#: apt-pkg/cdrom.cc:591 msgid "Mounting CD-ROM...\n" msgstr "" -#: apt-pkg/cdrom.cc:606 +#: apt-pkg/cdrom.cc:609 msgid "Scanning disc for index files..\n" msgstr "" -#: apt-pkg/cdrom.cc:644 +#: apt-pkg/cdrom.cc:647 #, c-format msgid "Found %i package indexes, %i source indexes and %i signatures\n" msgstr "" -#: apt-pkg/cdrom.cc:701 +#: apt-pkg/cdrom.cc:704 msgid "That is not a valid name, try again.\n" msgstr "" -#: apt-pkg/cdrom.cc:717 +#: apt-pkg/cdrom.cc:720 #, c-format msgid "" "This disc is called: \n" "'%s'\n" msgstr "" -#: apt-pkg/cdrom.cc:721 +#: apt-pkg/cdrom.cc:724 msgid "Copying package lists..." msgstr "" -#: apt-pkg/cdrom.cc:745 +#: apt-pkg/cdrom.cc:748 msgid "Writing new source list\n" msgstr "" -#: apt-pkg/cdrom.cc:754 +#: apt-pkg/cdrom.cc:757 msgid "Source list entries for this disc are:\n" msgstr "" -#: apt-pkg/cdrom.cc:788 +#: apt-pkg/cdrom.cc:791 msgid "Unmounting CD-ROM..." msgstr "" @@ -2373,3 +2436,57 @@ msgstr "" #, c-format msgid "Wrote %i records with %i missing files and %i mismatched files\n" msgstr "" + +#: apt-pkg/deb/dpkgpm.cc:358 +#, c-format +msgid "Preparing %s" +msgstr "" + +#: apt-pkg/deb/dpkgpm.cc:359 +#, c-format +msgid "Unpacking %s" +msgstr "" + +#: apt-pkg/deb/dpkgpm.cc:364 +#, c-format +msgid "Preparing to configure %s" +msgstr "" + +#: apt-pkg/deb/dpkgpm.cc:365 +#, c-format +msgid "Configuring %s" +msgstr "" + +#: apt-pkg/deb/dpkgpm.cc:366 +#, c-format +msgid "Installed %s" +msgstr "" + +#: apt-pkg/deb/dpkgpm.cc:371 +#, c-format +msgid "Preparing for removal of %s" +msgstr "" + +#: apt-pkg/deb/dpkgpm.cc:372 +#, c-format +msgid "Removing %s" +msgstr "" + +#: apt-pkg/deb/dpkgpm.cc:373 +#, c-format +msgid "Removed %s" +msgstr "" + +#: apt-pkg/deb/dpkgpm.cc:378 +#, c-format +msgid "Preparing for remove with config %s" +msgstr "" + +#: apt-pkg/deb/dpkgpm.cc:379 +#, c-format +msgid "Removed with config %s" +msgstr "" + +#: methods/rsh.cc:330 +msgid "Connection closed prematurely" +msgstr "" -- cgit v1.2.3-70-g09d2