summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.MultiArch63
-rw-r--r--apt-pkg/cacheset.cc6
-rw-r--r--apt-pkg/cdrom.cc66
-rw-r--r--apt-pkg/cdrom.h1
-rw-r--r--apt-pkg/contrib/fileutl.cc17
-rw-r--r--cmdline/acqprogress.cc306
-rw-r--r--cmdline/acqprogress.h39
-rw-r--r--debian/apt.dirs1
-rw-r--r--debian/apt.maintscript3
-rwxr-xr-xdebian/rules4
-rw-r--r--methods/http.cc88
-rw-r--r--methods/https.cc10
-rw-r--r--po/vi.po22
-rw-r--r--share/bash-completions/apt95
-rwxr-xr-xtest/integration/test-ubuntu-bug-365611-long-package-names6
-rw-r--r--vendor/README66
-rw-r--r--vendor/blankon/apt-vendor.ent8
-rw-r--r--vendor/blankon/sources.list.in10
-rw-r--r--vendor/ubuntu/apt.conf-01-vendor-ubuntu6
19 files changed, 295 insertions, 522 deletions
diff --git a/README.MultiArch b/README.MultiArch
deleted file mode 100644
index 588419b8d..000000000
--- a/README.MultiArch
+++ /dev/null
@@ -1,63 +0,0 @@
-Before we start with this topic: Note that MultiArch is not yet ready for
-prime time and/or for the casual user. The implementation is so far widely
-untested and only useful for developers of packagemanagment tools which
-use APT and his friends and maintainers of (upcoming) MultiArch packages.
-This README is especially NOT written for the casual user and is NOT a
-usage guide - you have been warned. It is assumed that the reader has
-at least a bit of knowledge about APT internals, dependency relations
-and the MultiArch spec [0].
-
-Note also that the toolchain isn't ready yet, e.g. while you can simulate
-the installation of MultiArch packages they will more sooner than later
-cause enormous problems if really installed as dpkg can't handle MultiArch
-yet (no, --force-{overwrite,architecture} aren't good options here).
-Other parts of the big picture are missing and/or untested too.
-You have been warned!
-
-
-The implementation is focused on NOT breaking existing singleArch-only
-applications and/or systems as this is the current status-quo for all
-systems. Also, many systems don't need (or can't make use of) MultiArch,
-so APT will proceed in thinking SingleArch as long as it is not explicitly
-told to handle MultiArch:
-To activate MultiArch handling you need to specify architectures you
-want to be considered by APT with the config list APT::Architectures
-(Insert architectures in order of preference).
-APT will download Packages files for all these architectures in the
-update step. Exception: In the sourcelist is the optionfield used:
-deb [ arch=amd64,i386 ] http://example.org/ experimental main
-(This optionfield is a NOP in previous apt versions)
-
-Internally in APT a package is represented as a PkgIterator -
-before MultiArch this PkgIterator was architecture unaware,
-only VerIterators include the architecture they came from.
-This is/was a big problem as all versions in a package are
-considered for dependency resolution, so pinning will not work in all cases.
-
-The problem is solved by a conceptional change:
-A PkgIterator is now architecture aware, so the packages
-of foobar for amd64 and for i386 are now for apt internal totally
-different packages. That is a good thing for e.g. pinning, but
-sometimes you need the information that such packages are belonging together:
-All these foobar packages therefore form a Group accessible with GrpIterators.
-Note that the GrpIterator has the same name as all the packages in this group,
-so e.g. apt-cache pkgnames iterates over GrpIterator to get the package names:
-This is compatible to SingleArch as a Group consists only of a single package
-and also to MultiArch as a Group consists of possible many packages which
-all have the same name and are therefore out of interest for pkgnames.
-
-
-Given all these internal changes it is quite interesting that the actual
-implementation of MultiArch is trivial: Some implicit dependencies and a few
-more provides are all changes needed to get it working. Especially noteworthy
-is that it wasn't needed to change the resolver in any way and other parts only
-need to be told about using GrpIterator instead of PkgIterator, so chances are
-good that libapt-applications will proceed to work without or at least only
-require minor changes, but your mileage may vary…
-
-
-Known Issues and/or noteworthy stuff:
-* The implementation is mostly untested, so it is very likely that APT will
- eat your kids if you aren't as lucky as the author of these patches.
-
-[0] https://wiki.ubuntu.com/MultiarchSpec
diff --git a/apt-pkg/cacheset.cc b/apt-pkg/cacheset.cc
index d453a2bfb..2ed6a96da 100644
--- a/apt-pkg/cacheset.cc
+++ b/apt-pkg/cacheset.cc
@@ -391,6 +391,8 @@ bool VersionContainerInterface::FromModifierCommandLine(unsigned short &modID,
CacheSetHelper &helper) {
Version select = NEWEST;
std::string str = cmdline;
+ if (unlikely(str.empty() == true))
+ return false;
bool modifierPresent = false;
unsigned short fallback = modID;
for (std::list<Modifier>::const_iterator mod = mods.begin();
@@ -400,8 +402,8 @@ bool VersionContainerInterface::FromModifierCommandLine(unsigned short &modID,
size_t const alength = strlen(mod->Alias);
switch(mod->Pos) {
case Modifier::POSTFIX:
- if (str.compare(str.length() - alength, alength,
- mod->Alias, 0, alength) != 0)
+ if (str.length() <= alength ||
+ str.compare(str.length() - alength, alength, mod->Alias, 0, alength) != 0)
continue;
str.erase(str.length() - alength);
modID = mod->ID;
diff --git a/apt-pkg/cdrom.cc b/apt-pkg/cdrom.cc
index 2635ede76..a5ad6a9ff 100644
--- a/apt-pkg/cdrom.cc
+++ b/apt-pkg/cdrom.cc
@@ -563,6 +563,15 @@ bool pkgCdrom::WriteSourceList(string Name,vector<string> &List,bool Source)
return true;
}
/*}}}*/
+bool pkgCdrom::UnmountCDROM(std::string const &CDROM, pkgCdromStatus * const log)/*{{{*/
+{
+ if (_config->FindB("APT::CDROM::NoMount",false) == true)
+ return true;
+ if (log != NULL)
+ log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
+ return UnmountCdrom(CDROM);
+}
+ /*}}}*/
bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, std::string &ident, pkgCdromStatus * const log, bool const interactive)/*{{{*/
{
// Startup
@@ -583,9 +592,7 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
{
if (interactive == true)
{
- if(log != NULL)
- log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
- UnmountCdrom(CDROM);
+ UnmountCDROM(CDROM, log);
if(log != NULL)
{
@@ -605,6 +612,9 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
return _error->Error("Failed to mount the cdrom.");
}
+ if (IsMounted(CDROM) == false)
+ return _error->Error("Failed to mount the cdrom.");
+
// Hash the CD to get an ID
if (log != NULL)
log->Update(_("Identifying... "), STEP_IDENT);
@@ -614,6 +624,7 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
ident = "";
if (log != NULL)
log->Update("\n");
+ UnmountCDROM(CDROM, NULL);
return false;
}
@@ -629,8 +640,11 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
if (FileExists(DFile) == true)
{
if (ReadConfigFile(Database,DFile) == false)
+ {
+ UnmountCDROM(CDROM, NULL);
return _error->Error("Unable to read the cdrom database %s",
DFile.c_str());
+ }
}
return true;
}
@@ -651,13 +665,7 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log) /*{{{*/
}
// Unmount and finish
- if (_config->FindB("APT::CDROM::NoMount",false) == false)
- {
- if (log != NULL)
- log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
- UnmountCdrom(CDROM);
- }
-
+ UnmountCDROM(CDROM, log);
return true;
}
/*}}}*/
@@ -682,11 +690,15 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
{
if (log != NULL)
log->Update("\n");
+ UnmountCDROM(CDROM, NULL);
return false;
}
if (chdir(StartDir.c_str()) != 0)
+ {
+ UnmountCDROM(CDROM, NULL);
return _error->Errno("chdir","Unable to change to %s", StartDir.c_str());
+ }
if (_config->FindB("Debug::aptcdrom",false) == true)
{
@@ -728,8 +740,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
if (List.empty() == true && SourceList.empty() == true)
{
- if (_config->FindB("APT::CDROM::NoMount",false) == false)
- UnmountCdrom(CDROM);
+ UnmountCDROM(CDROM, NULL);
return _error->Error(_("Unable to locate any package files, perhaps this is not a Debian Disc or the wrong architecture?"));
}
@@ -769,14 +780,14 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
{
if(log == NULL)
{
- if (_config->FindB("APT::CDROM::NoMount",false) == false)
- UnmountCdrom(CDROM);
+ UnmountCDROM(CDROM, NULL);
return _error->Error("No disc name found and no way to ask for it");
}
while(true) {
if(!log->AskCdromName(Name)) {
// user canceld
+ UnmountCDROM(CDROM, NULL);
return false;
}
cout << "Name: '" << Name << "'" << endl;
@@ -813,7 +824,10 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
string const partialListDir = listDir + "partial/";
if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), partialListDir) == false &&
CreateAPTDirectoryIfNeeded(listDir, partialListDir) == false)
+ {
+ UnmountCDROM(CDROM, NULL);
return _error->Errno("cdrom", _("List directory %spartial is missing."), listDir.c_str());
+ }
// take care of the signatures and copy them if they are ok
// (we do this before PackageCopy as it modifies "List" and "SourceList")
@@ -827,7 +841,10 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
if (Copy.CopyPackages(CDROM,Name,List, log) == false ||
SrcCopy.CopyPackages(CDROM,Name,SourceList, log) == false ||
TransCopy.CopyTranslations(CDROM,Name,TransList, log) == false)
+ {
+ UnmountCDROM(CDROM, NULL);
return false;
+ }
// reduce the List so that it takes less space in sources.list
ReduceSourcelist(CDROM,List);
@@ -837,13 +854,19 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
if (_config->FindB("APT::cdrom::NoAct",false) == false)
{
if (WriteDatabase(Database) == false)
+ {
+ UnmountCDROM(CDROM, NULL);
return false;
-
+ }
+
if(log != NULL)
log->Update(_("Writing new source list\n"), STEP_WRITE);
if (WriteSourceList(Name,List,false) == false ||
WriteSourceList(Name,SourceList,true) == false)
+ {
+ UnmountCDROM(CDROM, NULL);
return false;
+ }
}
// Print the sourcelist entries
@@ -855,8 +878,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
string::size_type Space = (*I).find(' ');
if (Space == string::npos)
{
- if (_config->FindB("APT::CDROM::NoMount",false) == false)
- UnmountCdrom(CDROM);
+ UnmountCDROM(CDROM, NULL);
return _error->Error("Internal error");
}
@@ -874,8 +896,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
string::size_type Space = (*I).find(' ');
if (Space == string::npos)
{
- if (_config->FindB("APT::CDROM::NoMount",false) == false)
- UnmountCdrom(CDROM);
+ UnmountCDROM(CDROM, NULL);
return _error->Error("Internal error");
}
@@ -888,12 +909,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
}
// Unmount and finish
- if (_config->FindB("APT::CDROM::NoMount",false) == false) {
- if (log != NULL)
- log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
- UnmountCdrom(CDROM);
- }
-
+ UnmountCDROM(CDROM, log);
return true;
}
/*}}}*/
diff --git a/apt-pkg/cdrom.h b/apt-pkg/cdrom.h
index 0f2c2cd02..bd0902176 100644
--- a/apt-pkg/cdrom.h
+++ b/apt-pkg/cdrom.h
@@ -77,6 +77,7 @@ class pkgCdrom /*{{{*/
private:
APT_HIDDEN bool MountAndIdentCDROM(Configuration &Database, std::string &CDROM,
std::string &ident, pkgCdromStatus * const log, bool const interactive);
+ APT_HIDDEN bool UnmountCDROM(std::string const &CDROM, pkgCdromStatus * const log);
};
/*}}}*/
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index de73a7fd8..b77c7ff7f 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -58,13 +58,10 @@
#include <bzlib.h>
#endif
#ifdef HAVE_LZMA
- #include <stdint.h>
#include <lzma.h>
#endif
-
-#ifdef WORDS_BIGENDIAN
-#include <inttypes.h>
-#endif
+#include <endian.h>
+#include <stdint.h>
#include <apti18n.h>
/*}}}*/
@@ -1880,19 +1877,13 @@ unsigned long long FileFd::Size()
FileFdErrno("lseek","Unable to seek to end of gzipped file");
return 0;
}
- size = 0;
+ uint32_t size = 0;
if (read(iFd, &size, 4) != 4)
{
FileFdErrno("read","Unable to read original size of gzipped file");
return 0;
}
-
-#ifdef WORDS_BIGENDIAN
- uint32_t tmp_size = size;
- uint8_t const * const p = (uint8_t const * const) &tmp_size;
- tmp_size = (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0];
- size = tmp_size;
-#endif
+ size = le32toh(size);
if (lseek(iFd, oldPos, SEEK_SET) < 0)
{
diff --git a/cmdline/acqprogress.cc b/cmdline/acqprogress.cc
deleted file mode 100644
index c362c1edf..000000000
--- a/cmdline/acqprogress.cc
+++ /dev/null
@@ -1,306 +0,0 @@
-// -*- mode: cpp; mode: fold -*-
-// Description /*{{{*/
-// $Id: acqprogress.cc,v 1.24 2003/04/27 01:56:48 doogie Exp $
-/* ######################################################################
-
- Acquire Progress - Command line progress meter
-
- ##################################################################### */
- /*}}}*/
-// Include files /*{{{*/
-#include<config.h>
-
-#include <apt-pkg/acquire.h>
-#include <apt-pkg/acquire-item.h>
-#include <apt-pkg/acquire-worker.h>
-#include <apt-pkg/configuration.h>
-#include <apt-pkg/strutl.h>
-#include <apt-pkg/error.h>
-
-#include <string.h>
-#include <stdio.h>
-#include <signal.h>
-#include <iostream>
-#include <unistd.h>
-
-#include "acqprogress.h"
-#include <apti18n.h>
- /*}}}*/
-
-using namespace std;
-
-// AcqTextStatus::AcqTextStatus - Constructor /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-AcqTextStatus::AcqTextStatus(unsigned int &ScreenWidth,unsigned int Quiet) :
- ScreenWidth(ScreenWidth), ID(0), Quiet(Quiet)
-{
- BlankLine[0] = 0;
-}
- /*}}}*/
-// AcqTextStatus::Start - Downloading has started /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-void AcqTextStatus::Start()
-{
- pkgAcquireStatus::Start();
- BlankLine[0] = 0;
- ID = 1;
-};
- /*}}}*/
-// AcqTextStatus::IMSHit - Called when an item got a HIT response /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-void AcqTextStatus::IMSHit(pkgAcquire::ItemDesc &Itm)
-{
- if (Quiet > 1)
- return;
-
- if (Quiet <= 0)
- cout << '\r' << BlankLine << '\r';
-
- cout << _("Hit ") << Itm.Description;
- if (Itm.Owner->FileSize != 0)
- cout << " [" << SizeToStr(Itm.Owner->FileSize) << "B]";
- cout << endl;
- Update = true;
-};
- /*}}}*/
-// AcqTextStatus::Fetch - An item has started to download /*{{{*/
-// ---------------------------------------------------------------------
-/* This prints out the short description and the expected size */
-void AcqTextStatus::Fetch(pkgAcquire::ItemDesc &Itm)
-{
- Update = true;
- if (Itm.Owner->Complete == true)
- return;
-
- Itm.Owner->ID = ID++;
-
- if (Quiet > 1)
- return;
-
- if (Quiet <= 0)
- cout << '\r' << BlankLine << '\r';
-
- cout << _("Get:") << Itm.Owner->ID << ' ' << Itm.Description;
- if (Itm.Owner->FileSize != 0)
- cout << " [" << SizeToStr(Itm.Owner->FileSize) << "B]";
- cout << endl;
-};
- /*}}}*/
-// AcqTextStatus::Done - Completed a download /*{{{*/
-// ---------------------------------------------------------------------
-/* We don't display anything... */
-void AcqTextStatus::Done(pkgAcquire::ItemDesc &Itm)
-{
- Update = true;
-};
- /*}}}*/
-// AcqTextStatus::Fail - Called when an item fails to download /*{{{*/
-// ---------------------------------------------------------------------
-/* We print out the error text */
-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';
-
- 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;
-};
- /*}}}*/
-// AcqTextStatus::Stop - Finished downloading /*{{{*/
-// ---------------------------------------------------------------------
-/* This prints out the bytes downloaded and the overall average line
- speed */
-void AcqTextStatus::Stop()
-{
- pkgAcquireStatus::Stop();
- if (Quiet > 1)
- return;
-
- if (Quiet <= 0)
- 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 /*{{{*/
-// ---------------------------------------------------------------------
-/* 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. */
-bool AcqTextStatus::Pulse(pkgAcquire *Owner)
-{
- pkgAcquireStatus::Pulse(Owner);
-
- if (Quiet > 0)
- return true;
-
- enum {Long = 0,Medium,Short} Mode = Medium;
-
- 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,"%.0f%%",((CurrentBytes + CurrentItems)*100.0)/(TotalBytes+TotalItems));
-
- bool Shown = false;
- for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0;
- I = Owner->WorkerStep(I))
- {
- S += strlen(S);
-
- // There is no item running
- 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," [%lu %s",I->CurrentItem->Owner->ID,
- I->CurrentItem->ShortDesc.c_str());
- else
- snprintf(S,End-S," [%s",I->CurrentItem->ShortDesc.c_str());
- S += strlen(S);
-
- // Show the short mode string
- if (I->CurrentItem->Owner->Mode != 0)
- {
- snprintf(S,End-S," %s",I->CurrentItem->Owner->Mode);
- S += strlen(S);
- }
-
- // Add the current progress
- if (Mode == Long)
- snprintf(S,End-S," %llu",I->CurrentSize);
- else
- {
- if (Mode == Medium || I->TotalSize == 0)
- snprintf(S,End-S," %sB",SizeToStr(I->CurrentSize).c_str());
- }
- S += strlen(S);
-
- // Add the total size and percent
- if (I->TotalSize > 0 && I->CurrentItem->Owner->Complete == false)
- {
- if (Mode == Short)
- snprintf(S,End-S," %.0f%%",
- (I->CurrentSize*100.0)/I->TotalSize);
- else
- snprintf(S,End-S,"/%sB %.0f%%",SizeToStr(I->TotalSize).c_str(),
- (I->CurrentSize*100.0)/I->TotalSize);
- }
- S += strlen(S);
- snprintf(S,End-S,"]");
- }
-
- // 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 long ETA = (TotalBytes - CurrentBytes)/CurrentCPS;
- 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)
- {
- memset(Buffer + Len,' ',ScreenWidth - Len);
- strcpy(Buffer + ScreenWidth - LenT,Tmp);
- }
- }
- Buffer[ScreenWidth] = 0;
- BlankLine[ScreenWidth] = 0;
- sigprocmask(SIG_SETMASK,&OldSigs,0);
-
- // Draw the current status
- if (strlen(Buffer) == strlen(BlankLine))
- cout << '\r' << Buffer << flush;
- else
- cout << '\r' << BlankLine << '\r' << Buffer << flush;
- memset(BlankLine,' ',strlen(Buffer));
- 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 we do not output on a terminal and one of the options to avoid user
- // interaction is given, we assume that no user is present who could react
- // on your media change request
- if (isatty(STDOUT_FILENO) != 1 && Quiet >= 2 &&
- (_config->FindB("APT::Get::Assume-Yes",false) == true ||
- _config->FindB("APT::Get::Force-Yes",false) == true ||
- _config->FindB("APT::Get::Trivial-Only",false) == true))
-
- return false;
-
- 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;
- bool bStatus = true;
- while (C != '\n' && C != '\r')
- {
- int len = read(STDIN_FILENO,&C,1);
- if(C == 'c' || len <= 0)
- bStatus = false;
- }
-
- if(bStatus)
- Update = true;
- return bStatus;
-}
- /*}}}*/
diff --git a/cmdline/acqprogress.h b/cmdline/acqprogress.h
deleted file mode 100644
index 8f0903923..000000000
--- a/cmdline/acqprogress.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// -*- mode: cpp; mode: fold -*-
-// Description /*{{{*/
-// $Id: acqprogress.h,v 1.5 2003/02/02 22:24:11 jgg Exp $
-/* ######################################################################
-
- Acquire Progress - Command line progress meter
-
- ##################################################################### */
- /*}}}*/
-#ifndef ACQPROGRESS_H
-#define ACQPROGRESS_H
-
-#include <apt-pkg/acquire.h>
-
-#include <string>
-
-class AcqTextStatus : public pkgAcquireStatus
-{
- unsigned int &ScreenWidth;
- char BlankLine[1024];
- unsigned long ID;
- unsigned long Quiet;
-
- public:
-
- virtual bool MediaChange(std::string Media,std::string Drive);
- virtual void IMSHit(pkgAcquire::ItemDesc &Itm);
- virtual void Fetch(pkgAcquire::ItemDesc &Itm);
- virtual void Done(pkgAcquire::ItemDesc &Itm);
- virtual void Fail(pkgAcquire::ItemDesc &Itm);
- virtual void Start();
- virtual void Stop();
-
- bool Pulse(pkgAcquire *Owner);
-
- AcqTextStatus(unsigned int &ScreenWidth,unsigned int Quiet);
-};
-
-#endif
diff --git a/debian/apt.dirs b/debian/apt.dirs
index ecbcdbc0a..1e8b057eb 100644
--- a/debian/apt.dirs
+++ b/debian/apt.dirs
@@ -16,3 +16,4 @@ var/lib/apt/periodic
var/log/apt
usr/share/apt
usr/share/bug/apt
+usr/share/bash-completion/completions/
diff --git a/debian/apt.maintscript b/debian/apt.maintscript
new file mode 100644
index 000000000..939769355
--- /dev/null
+++ b/debian/apt.maintscript
@@ -0,0 +1,3 @@
+rm_conffile /etc/apt/apt.conf.d/20changelog 1.0.3 -- "@"
+
+
diff --git a/debian/rules b/debian/rules
index 338890445..c013c3a55 100755
--- a/debian/rules
+++ b/debian/rules
@@ -191,6 +191,10 @@ apt: build-binary build-manpages debian/apt.install
cp share/ubuntu-archive.gpg debian/$@/usr/share/$@
cp debian/apt.auto-removal.sh debian/$@/etc/kernel/postinst.d/apt-auto-removal
chmod 755 debian/$@/etc/kernel/postinst.d/apt-auto-removal
+ # install bash completion
+ cp share/bash-completions/* debian/$@/usr/share/bash-completion/completions/
+ # install vendor specific apt confs
+ find -L vendor/current -name 'apt.conf-*' | while read conf; do cp "$${conf}" "debian/$@/etc/apt/apt.conf.d/$${conf#*-}"; done
# make rosetta happy and remove pot files in po/ (but leave stuff
# in po/domains/* untouched) and cp *.po into each domain dir
diff --git a/methods/http.cc b/methods/http.cc
index ed6e3517d..c734d3799 100644
--- a/methods/http.cc
+++ b/methods/http.cc
@@ -45,6 +45,7 @@
#include <stdio.h>
#include <errno.h>
#include <iostream>
+#include <sstream>
#include "config.h"
#include "connect.h"
@@ -667,22 +668,13 @@ void HttpMethod::SendReq(FetchItem *Itm)
URI Uri = Itm->Uri;
// The HTTP server expects a hostname with a trailing :port
- char Buf[1000];
+ std::stringstream Req;
string ProperHost;
if (Uri.Host.find(':') != string::npos)
ProperHost = '[' + Uri.Host + ']';
else
ProperHost = Uri.Host;
- if (Uri.Port != 0)
- {
- sprintf(Buf,":%u",Uri.Port);
- ProperHost += Buf;
- }
-
- // Just in case.
- if (Itm->Uri.length() >= sizeof(Buf))
- abort();
/* RFC 2616 §5.1.2 requires absolute URIs for requests to proxies,
but while its a must for all servers to accept absolute URIs,
@@ -701,27 +693,20 @@ void HttpMethod::SendReq(FetchItem *Itm)
in 1.1, can cause problems with proxies, and we are an HTTP/1.1
client anyway.
C.f. https://tools.ietf.org/wg/httpbis/trac/ticket/158 */
- sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\n",
- requesturi.c_str(),ProperHost.c_str());
+ Req << "GET " << requesturi << " HTTP/1.1\r\n";
+ if (Uri.Port != 0)
+ Req << "Host: " << ProperHost << ":" << Uri.Port << "\r\n";
+ else
+ Req << "Host: " << ProperHost << "\r\n";
// generate a cache control header (if needed)
- if (_config->FindB("Acquire::http::No-Cache",false) == true)
- {
- strcat(Buf,"Cache-Control: no-cache\r\nPragma: no-cache\r\n");
- }
- else
- {
- if (Itm->IndexFile == true)
- {
- sprintf(Buf+strlen(Buf),"Cache-Control: max-age=%u\r\n",
- _config->FindI("Acquire::http::Max-Age",0));
- }
- else
- {
- if (_config->FindB("Acquire::http::No-Store",false) == true)
- strcat(Buf,"Cache-Control: no-store\r\n");
- }
- }
+ if (_config->FindB("Acquire::http::No-Cache",false) == true)
+ Req << "Cache-Control: no-cache\r\n"
+ << "Pragma: no-cache\r\n";
+ else if (Itm->IndexFile == true)
+ Req << "Cache-Control: max-age=" << _config->FindI("Acquire::http::Max-Age",0) << "\r\n";
+ else if (_config->FindB("Acquire::http::No-Store",false) == true)
+ Req << "Cache-Control: no-store\r\n";
// If we ask for uncompressed files servers might respond with content-
// negotiation which lets us end up with compressed files we do not support,
@@ -733,46 +718,35 @@ void HttpMethod::SendReq(FetchItem *Itm)
size_t const filepos = Itm->Uri.find_last_of('/');
string const file = Itm->Uri.substr(filepos + 1);
if (flExtension(file) == file)
- strcat(Buf,"Accept: text/*\r\n");
+ Req << "Accept: text/*\r\n";
}
- string Req = Buf;
-
- // Check for a partial file
+ // Check for a partial file and send if-queries accordingly
struct stat SBuf;
if (stat(Itm->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0)
- {
- // In this case we send an if-range query with a range header
- sprintf(Buf,"Range: bytes=%lli-\r\nIf-Range: %s\r\n",(long long)SBuf.st_size,
- TimeRFC1123(SBuf.st_mtime).c_str());
- Req += Buf;
- }
- else
- {
- if (Itm->LastModified != 0)
- {
- sprintf(Buf,"If-Modified-Since: %s\r\n",TimeRFC1123(Itm->LastModified).c_str());
- Req += Buf;
- }
- }
+ Req << "Range: bytes=" << SBuf.st_size << "-\r\n"
+ << "If-Range: " << TimeRFC1123(SBuf.st_mtime) << "\r\n";
+ else if (Itm->LastModified != 0)
+ Req << "If-Modified-Since: " << TimeRFC1123(Itm->LastModified).c_str() << "\r\n";
if (Server->Proxy.User.empty() == false || Server->Proxy.Password.empty() == false)
- Req += string("Proxy-Authorization: Basic ") +
- Base64Encode(Server->Proxy.User + ":" + Server->Proxy.Password) + "\r\n";
+ Req << "Proxy-Authorization: Basic "
+ << Base64Encode(Server->Proxy.User + ":" + Server->Proxy.Password) << "\r\n";
maybe_add_auth (Uri, _config->FindFile("Dir::Etc::netrc"));
if (Uri.User.empty() == false || Uri.Password.empty() == false)
- {
- Req += string("Authorization: Basic ") +
- Base64Encode(Uri.User + ":" + Uri.Password) + "\r\n";
- }
- Req += "User-Agent: " + _config->Find("Acquire::http::User-Agent",
- "Debian APT-HTTP/1.3 (" PACKAGE_VERSION ")") + "\r\n\r\n";
-
+ Req << "Authorization: Basic "
+ << Base64Encode(Uri.User + ":" + Uri.Password) << "\r\n";
+
+ Req << "User-Agent: " << _config->Find("Acquire::http::User-Agent",
+ "Debian APT-HTTP/1.3 (" PACKAGE_VERSION ")") << "\r\n";
+
+ Req << "\r\n";
+
if (Debug == true)
cerr << Req << endl;
- Server->WriteResponse(Req);
+ Server->WriteResponse(Req.str());
}
/*}}}*/
// HttpMethod::Configuration - Handle a configuration message /*{{{*/
diff --git a/methods/https.cc b/methods/https.cc
index c4aff8f38..e0348ab58 100644
--- a/methods/https.cc
+++ b/methods/https.cc
@@ -325,11 +325,11 @@ bool HttpsMethod::Fetch(FetchItem *Itm)
// if we have the file send an if-range query with a range header
if (stat(Itm->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0)
{
- char Buf[1000];
- sprintf(Buf, "Range: bytes=%li-", (long) SBuf.st_size);
- headers = curl_slist_append(headers, Buf);
- sprintf(Buf, "If-Range: %s", TimeRFC1123(SBuf.st_mtime).c_str());
- headers = curl_slist_append(headers, Buf);
+ std::string Buf;
+ strprintf(Buf, "Range: bytes=%lli-", (long long) SBuf.st_size);
+ headers = curl_slist_append(headers, Buf.c_str());
+ strprintf(Buf, "If-Range: %s", TimeRFC1123(SBuf.st_mtime).c_str());
+ headers = curl_slist_append(headers, Buf.c_str());
}
else if(Itm->LastModified > 0)
{
diff --git a/po/vi.po b/po/vi.po
index b5f9acbbd..01eb01918 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,10 +6,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: apt 1.0.1\n"
+"Project-Id-Version: apt 1.0.2\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2014-04-25 13:52+0200\n"
-"PO-Revision-Date: 2014-04-11 09:08+0700\n"
+"POT-Creation-Date: 2014-04-25 13:17+0200\n"
+"PO-Revision-Date: 2014-04-28 09:24+0700\n"
"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
"Language: vi\n"
@@ -162,7 +162,7 @@ msgid " Version table:"
msgstr " Bảng phiên bản:"
#: cmdline/apt-cache.cc:1742 cmdline/apt-cdrom.cc:207 cmdline/apt-config.cc:83
-#: cmdline/apt-get.cc:1581 cmdline/apt-helper.cc:58 cmdline/apt-mark.cc:388
+#: cmdline/apt-get.cc:1578 cmdline/apt-helper.cc:58 cmdline/apt-mark.cc:388
#: cmdline/apt.cc:42 cmdline/apt-extracttemplates.cc:217
#: ftparchive/apt-ftparchive.cc:600 cmdline/apt-internal-solver.cc:42
#: cmdline/apt-sortpkgs.cc:147
@@ -546,11 +546,11 @@ msgstr "Gặp lỗi khi xử lý các quan hệ phụ thuộc khi biên dịch"
msgid "Changelog for %s (%s)"
msgstr "Changelog cho %s (%s)"
-#: cmdline/apt-get.cc:1586
+#: cmdline/apt-get.cc:1583
msgid "Supported modules:"
msgstr "Hỗ trợ các mô-đun:"
-#: cmdline/apt-get.cc:1627
+#: cmdline/apt-get.cc:1624
msgid ""
"Usage: apt-get [options] command\n"
" apt-get [options] install|remove pkg1 [pkg2 ...]\n"
@@ -1503,11 +1503,11 @@ msgid "Listing"
msgstr "Đang liệt kê"
#: apt-private/private-list.cc:164
-#, fuzzy, c-format
+#, c-format
msgid "There is %i additional version. Please use the '-a' switch to see it"
msgid_plural ""
"There are %i additional versions. Please use the '-a' switch to see them."
-msgstr[0] "Ở đây có %i bản ghi phụ thêm. Hãy dùng tùy chọn “-a” để xem"
+msgstr[0] "Ở đây có %i phiên bản phụ thêm. Hãy dùng tùy chọn “-a” để xem."
#: apt-private/private-main.cc:23
msgid ""
@@ -1727,7 +1727,7 @@ msgstr "Xong"
#. Only warn if there are no sources.list.d.
#. Only warn if there is no sources.list file.
#: methods/mirror.cc:95 apt-inst/extract.cc:471 apt-pkg/acquire.cc:491
-#: apt-pkg/clean.cc:40 apt-pkg/init.cc:103 apt-pkg/init.cc:111
+#: apt-pkg/clean.cc:40 apt-pkg/init.cc:102 apt-pkg/init.cc:110
#: apt-pkg/policy.cc:381 apt-pkg/sourcelist.cc:280 apt-pkg/sourcelist.cc:286
#: apt-pkg/contrib/cdromutl.cc:205 apt-pkg/contrib/fileutl.cc:371
#: apt-pkg/contrib/fileutl.cc:484
@@ -2808,12 +2808,12 @@ msgid "Invalid 'Date' entry in Release file %s"
msgstr ""
"Gặp mục tin “Date” (ngày tháng) không hợp lệ trong tập tin Phát hành %s"
-#: apt-pkg/init.cc:146
+#: apt-pkg/init.cc:145
#, c-format
msgid "Packaging system '%s' is not supported"
msgstr "Không hỗ trợ hệ thống đóng gói “%s”"
-#: apt-pkg/init.cc:162
+#: apt-pkg/init.cc:161
msgid "Unable to determine a suitable packaging system type"
msgstr "Không thể quyết định kiểu hệ thống đóng gói thích hợp"
diff --git a/share/bash-completions/apt b/share/bash-completions/apt
new file mode 100644
index 000000000..9929bf755
--- /dev/null
+++ b/share/bash-completions/apt
@@ -0,0 +1,95 @@
+# Debian apt(8) completion -*- shell-script -*-
+
+_apt()
+{
+ local sourcesdir="/etc/apt/sources.list.d"
+ local cur prev words cword
+ _init_completion || return
+
+ # see if the user selected a command already
+ local COMMANDS=("install" "remove" "purge" "show" "list"
+ "update" "upgrade" "full-upgrade" "dist-upgrade"
+ "edit-sources" "help")
+
+ local command i
+ for (( i=0; i < ${#words[@]}-1; i++ )); do
+ if [[ ${COMMANDS[@]} =~ ${words[i]} ]]; then
+ command=${words[i]}
+ break
+ fi
+ done
+
+ # supported options per command
+ if [[ "$cur" == -* ]]; then
+ case $command in
+ install|remove|purge|upgrade|full-upgrade)
+ COMPREPLY=( $( compgen -W '--show-progress
+ --fix-broken --purge --verbose-versions --auto-remove
+ --simulate --dry-run
+ --download
+ --fix-missing
+ --fix-policy
+ --ignore-hold
+ --force-yes
+ --trivial-only
+ --reinstall --solver' -- "$cur" ) )
+ return 0
+ ;;
+ update)
+ COMPREPLY=( $( compgen -W '--list-cleanup
+ ' -- "$cur" ) )
+ return 0
+ ;;
+ list)
+ COMPREPLY=( $( compgen -W '--installed --upgradable
+ --manual-installed
+ -v --verbose
+ -a --all-versions
+ ' -- "$cur" ) )
+ return 0
+ ;;
+ show)
+ COMPREPLY=( $( compgen -W '-a --all-versions
+ ' -- "$cur" ) )
+ return 0
+ ;;
+ esac
+ fi
+
+ # specific command arguments
+ if [[ -n $command ]]; then
+ case $command in
+ remove|purge)
+ if [[ -f /etc/debian_version ]]; then
+ # Debian system
+ COMPREPLY=( $( \
+ _xfunc dpkg _comp_dpkg_installed_packages $cur ) )
+ else
+ # assume RPM based
+ _xfunc rpm _rpm_installed_packages
+ fi
+ return 0
+ ;;
+ install|show|list)
+ COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" \
+ 2> /dev/null ) )
+ return 0
+ ;;
+ edit-sources)
+ COMPREPLY=( $( compgen -W '$( command ls $sourcesdir )' \
+ -- "$cur" ) )
+ return 0
+ ;;
+ esac
+ fi
+
+ # no command yet, show what commands we have
+ if [ "$command" = "" ]; then
+ COMPREPLY=( $( compgen -W '${COMMANDS[@]}' -- "$cur" ) )
+ fi
+
+ return 0
+} &&
+complete -F _apt apt
+
+# ex: ts=4 sw=4 et filetype=sh
diff --git a/test/integration/test-ubuntu-bug-365611-long-package-names b/test/integration/test-ubuntu-bug-365611-long-package-names
index 894c8dc97..f22986e21 100755
--- a/test/integration/test-ubuntu-bug-365611-long-package-names
+++ b/test/integration/test-ubuntu-bug-365611-long-package-names
@@ -4,8 +4,12 @@ set -e
TESTDIR=$(readlink -f $(dirname $0))
. $TESTDIR/framework
setupenvironment
-configarchitecture "i386"
+configarchitecture 'i386'
setupaptarchive
aptget install $(for i in $(seq 0 1000); do echo -n 'a'; done) 2> longpackagename.log > /dev/null || true
testfileequal 'longpackagename.log' "E: Unable to locate package $(for i in $(seq 0 1000); do echo -n 'a'; done)"
+
+# … and the opposite of long:
+aptget install "" -s >longpackagename.log 2>&1 || true
+testfileequal 'longpackagename.log' "$(aptget install -s)"
diff --git a/vendor/README b/vendor/README
new file mode 100644
index 000000000..c2fabbd4c
--- /dev/null
+++ b/vendor/README
@@ -0,0 +1,66 @@
+The vendor system in APT is an experiment to help distributions ship a stock
+apt release instead of applying documentation patches to it, increasing
+maintenance burden for everyone and hiding 'interesting' patches in the mix.
+
+The provided information is used in the apt-key script and in documentation
+like manpages and example configuration files. If you have patches modifying
+additional bits and pieces currently not covered by this system please
+contact us so we can change this!
+
+
+== Adding a new vendor
+
+In the same directory you found this README in you should create a new
+directory with the name of your distribution (as defined by dpkg-vendor,
+ e.g. via "dpkg-vendor --query Vendor"). The name is case-insensitive,
+but ensure that the name is otherwise correct and the other fields in
+your deb-origin(5) file are correct as well as our buildsystem relies on
+this information.
+
+If no information is found for the current vendor at buildtime, the system
+looks for a vendor the current vendor is a derivative of, falling back to
+Debian if all else fails.
+
+The directory should include 2 files at the moment. It is best to look
+at the files of other distributions to understand what values are to be
+expected. Some additional notes about them can be found below.
+
+If we happen to include new fields/files in this system, we will opt for
+using a sensible default rather than failing the build or similar, so
+you are recommend to watch this space.
+Ensure also that your information is up-to-date!
+
+Contributing a new vendor as well as updating a existing one is best done
+by opening a bug in the Debian BTS against apt with a patch attached.
+
+
+== apt-vendor.ent
+
+The format used is the one DocBook XML uses. The file is included as an
+entity file in the manpages xml source, so the syntax has to be valid!
+
+The keyring-* settings are additionally used also in the creation of the
+apt-key script and the keyring-package in particular as a dependency for apt.
+
+The field current-codename is optional and can be used in sources.list.in.
+
+
+== sources.list.in
+
+An example for a sources.list which will be shipped in /usr/share/doc.
+This file will NOT be installed in /etc or otherwise used by apt.
+
+You can use some placeholders in this file, namely:
+* &debian-stable-codename;
+* &debian-oldstable-codename;
+* &debian-testing-codename;
+* &ubuntu-codename;
+with the value you would expect based on the name.
+
+The placeholder &current-codename; is yours and can be set in apt-vendor.ent
+
+
+== apt.conf-*
+
+Files in your vendor directory following this naming scheme will be picked up
+by the debian/rules file and installed in /etc/apt/apt.conf.d/ directory.
diff --git a/vendor/blankon/apt-vendor.ent b/vendor/blankon/apt-vendor.ent
new file mode 100644
index 000000000..2600eb715
--- /dev/null
+++ b/vendor/blankon/apt-vendor.ent
@@ -0,0 +1,8 @@
+<!-- details about the keys used by the distribution -->
+<!ENTITY keyring-distro "BlankOn">
+<!ENTITY keyring-package "<package>blankon-keyring</package>">
+<!ENTITY keyring-filename "<filename>/usr/share/keyrings/blankon-archive-keyring.gpg</filename>">
+<!ENTITY keyring-removed-filename "<filename>/usr/share/keyrings/blankon-archive-removed-keys.gpg</filename>">
+<!ENTITY keyring-master-filename "/usr/share/keyrings/blankon-master-keyring.gpg">
+<!ENTITY keyring-uri "http://arsip.blankonlinux.or.id/blankon/project/blankon-archive-keyring.gpg">
+<!ENTITY current-codename "tambora">
diff --git a/vendor/blankon/sources.list.in b/vendor/blankon/sources.list.in
new file mode 100644
index 000000000..2322e974d
--- /dev/null
+++ b/vendor/blankon/sources.list.in
@@ -0,0 +1,10 @@
+# See sources.list(5) manpage for more information
+# Remember that CD-ROMs, DVDs and such are managed through the apt-cdrom tool.
+deb http://arsip.blankonlinux.or.id/blankon &current-codename; main restricted
+deb-src http://arsip.blankonlinux.or.id/blankon &current-codename; main restricted
+
+deb http://arsip.blankonlinux.or.id/blankon &current-codename;-security main restricted
+deb-src http://arsip.blankonlinux.or.id/blankon &current-codename;-security main restricted
+
+deb http://arsip.blankonlinux.or.id/blankon &current-codename;-updates main restricted
+deb-src http://arsip.blankonlinux.or.id/blankon &current-codename;-updates main restricted
diff --git a/vendor/ubuntu/apt.conf-01-vendor-ubuntu b/vendor/ubuntu/apt.conf-01-vendor-ubuntu
new file mode 100644
index 000000000..c4092ff44
--- /dev/null
+++ b/vendor/ubuntu/apt.conf-01-vendor-ubuntu
@@ -0,0 +1,6 @@
+// Server information for apt-changelog
+APT {
+ Changelogs {
+ Server "http://changelogs.ubuntu.com/changelogs";
+ };
+};