summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMake/FindZstd.cmake25
-rw-r--r--CMake/config.h.in3
-rw-r--r--CMakeLists.txt6
-rw-r--r--apt-inst/deb/debfile.cc8
-rw-r--r--apt-pkg/CMakeLists.txt2
-rw-r--r--apt-pkg/aptconfiguration.cc8
-rw-r--r--apt-pkg/contrib/fileutl.cc220
-rw-r--r--apt-pkg/contrib/fileutl.h16
-rw-r--r--apt-pkg/pkgsystem.cc2
-rw-r--r--debian/changelog9
-rw-r--r--debian/control3
-rw-r--r--doc/apt-get.8.xml2
-rw-r--r--doc/apt-transport-https.1.xml2
-rw-r--r--doc/apt-verbatim.ent6
-rw-r--r--doc/examples/configure-index1
-rw-r--r--doc/po/apt-doc.pot4
-rw-r--r--doc/po/de.po6
-rw-r--r--doc/po/es.po4
-rw-r--r--doc/po/fr.po4
-rw-r--r--doc/po/it.po4
-rw-r--r--doc/po/ja.po4
-rw-r--r--doc/po/nl.po6
-rw-r--r--doc/po/pl.po4
-rw-r--r--doc/po/pt.po4
-rw-r--r--doc/po/pt_BR.po4
-rw-r--r--doc/sources.list.5.xml11
-rwxr-xr-xprepare-release6
-rw-r--r--test/integration/framework2
-rw-r--r--test/libapt/fileutl_test.cc4
29 files changed, 340 insertions, 40 deletions
diff --git a/CMake/FindZstd.cmake b/CMake/FindZstd.cmake
new file mode 100644
index 000000000..68118049b
--- /dev/null
+++ b/CMake/FindZstd.cmake
@@ -0,0 +1,25 @@
+# - Try to find ZSTD
+# Once done, this will define
+#
+# ZSTD_FOUND - system has ZSTD
+# ZSTD_INCLUDE_DIRS - the ZSTD include directories
+# ZSTD_LIBRARIES - the ZSTD library
+find_package(PkgConfig)
+
+pkg_check_modules(ZSTD_PKGCONF libzstd)
+
+find_path(ZSTD_INCLUDE_DIRS
+ NAMES zstd.h
+ PATHS ${ZSTD_PKGCONF_INCLUDE_DIRS}
+)
+
+
+find_library(ZSTD_LIBRARIES
+ NAMES zstd
+ PATHS ${ZSTD_PKGCONF_LIBRARY_DIRS}
+)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(ZSTD DEFAULT_MSG ZSTD_INCLUDE_DIRS ZSTD_LIBRARIES)
+
+mark_as_advanced(ZSTD_INCLUDE_DIRS ZSTD_LIBRARIES)
diff --git a/CMake/config.h.in b/CMake/config.h.in
index cfaa14ed1..bd0da8649 100644
--- a/CMake/config.h.in
+++ b/CMake/config.h.in
@@ -17,6 +17,9 @@
/* Define if we have the lz4 library for lz4 */
#cmakedefine HAVE_LZ4
+/* Define if we have the zstd library for zst */
+#cmakedefine HAVE_ZSTD
+
/* Define if we have the udev library */
#cmakedefine HAVE_UDEV
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b723b0ead..a79ce99d4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -103,6 +103,12 @@ if (LZ4_FOUND)
set(HAVE_LZ4 1)
endif()
+find_package(Zstd REQUIRED)
+if (ZSTD_FOUND)
+ set(HAVE_ZSTD 1)
+endif()
+
+
find_package(Udev)
if (UDEV_FOUND)
set(HAVE_UDEV 1)
diff --git a/apt-inst/deb/debfile.cc b/apt-inst/deb/debfile.cc
index 8eef446bb..6f7cf5691 100644
--- a/apt-inst/deb/debfile.cc
+++ b/apt-inst/deb/debfile.cc
@@ -50,7 +50,9 @@ debDebFile::debDebFile(FileFd &File) : File(File), AR(File)
if (!CheckMember("control.tar") &&
!CheckMember("control.tar.gz") &&
- !CheckMember("control.tar.xz")) {
+ !CheckMember("control.tar.xz") &&
+ !CheckMember("control.tar.zst"))
+ {
_error->Error(_("This is not a valid DEB archive, missing '%s' member"), "control.tar");
return;
}
@@ -59,7 +61,9 @@ debDebFile::debDebFile(FileFd &File) : File(File), AR(File)
!CheckMember("data.tar.gz") &&
!CheckMember("data.tar.bz2") &&
!CheckMember("data.tar.lzma") &&
- !CheckMember("data.tar.xz")) {
+ !CheckMember("data.tar.xz") &&
+ !CheckMember("data.tar.zst"))
+ {
_error->Error(_("This is not a valid DEB archive, missing '%s' member"), "data.tar");
return;
}
diff --git a/apt-pkg/CMakeLists.txt b/apt-pkg/CMakeLists.txt
index 2f5ad3200..fdf27f92d 100644
--- a/apt-pkg/CMakeLists.txt
+++ b/apt-pkg/CMakeLists.txt
@@ -44,6 +44,7 @@ target_include_directories(apt-pkg
${BZIP2_INCLUDE_DIR}
${LZMA_INCLUDE_DIRS}
${LZ4_INCLUDE_DIRS}
+ ${ZSTD_INCLUDE_DIRS}
$<$<BOOL:${UDEV_FOUND}>:${UDEV_INCLUDE_DIRS}>
${ICONV_INCLUDE_DIRS}
)
@@ -55,6 +56,7 @@ target_link_libraries(apt-pkg
${BZIP2_LIBRARIES}
${LZMA_LIBRARIES}
${LZ4_LIBRARIES}
+ ${ZSTD_LIBRARIES}
$<$<BOOL:${UDEV_FOUND}>:${UDEV_LIBRARIES}>
${ICONV_LIBRARIES}
)
diff --git a/apt-pkg/aptconfiguration.cc b/apt-pkg/aptconfiguration.cc
index 0421ea949..61e53ec3a 100644
--- a/apt-pkg/aptconfiguration.cc
+++ b/apt-pkg/aptconfiguration.cc
@@ -39,6 +39,7 @@ static void setDefaultConfigurationForCompressors() {
_config->CndSet("Dir::Bin::bzip2", "/bin/bzip2");
_config->CndSet("Dir::Bin::xz", "/usr/bin/xz");
_config->CndSet("Dir::Bin::lz4", "/usr/bin/lz4");
+ _config->CndSet("Dir::Bin::zstd", "/usr/bin/zstd");
if (FileExists(_config->Find("Dir::Bin::xz")) == true) {
_config->Set("Dir::Bin::lzma", _config->Find("Dir::Bin::xz"));
_config->Set("APT::Compressor::lzma::Binary", "xz");
@@ -67,6 +68,7 @@ static void setDefaultConfigurationForCompressors() {
_config->CndSet("Acquire::CompressionTypes::lzma","lzma");
_config->CndSet("Acquire::CompressionTypes::gz","gzip");
_config->CndSet("Acquire::CompressionTypes::lz4","lz4");
+ _config->CndSet("Acquire::CompressionTypes::zst", "zstd");
}
/*}}}*/
// getCompressionTypes - Return Vector of usable compressiontypes /*{{{*/
@@ -369,6 +371,12 @@ const Configuration::getCompressors(bool const Cached) {
# define APT_ADD_COMPRESSOR(NAME, EXT, BINARY, ARG, DEARG, COST) \
{ CompressorsDone.push_back(NAME); compressors.emplace_back(NAME, EXT, BINARY, ARG, DEARG, COST); }
APT_ADD_COMPRESSOR(".", "", "", nullptr, nullptr, 0)
+ if (_config->Exists("Dir::Bin::zstd") == false || FileExists(_config->Find("Dir::Bin::zstd")) == true)
+ APT_ADD_COMPRESSOR("zstd", ".zst", "zstd", "-19", "-d", 60)
+#ifdef HAVE_ZSTD
+ else
+ APT_ADD_COMPRESSOR("zstd", ".zst", "false", nullptr, nullptr, 60)
+#endif
if (_config->Exists("Dir::Bin::lz4") == false || FileExists(_config->Find("Dir::Bin::lz4")) == true)
APT_ADD_COMPRESSOR("lz4",".lz4","lz4","-1","-d",50)
#ifdef HAVE_LZ4
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index f8f7a478c..85d7b36c7 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -67,6 +67,9 @@
#ifdef HAVE_LZ4
#include <lz4frame.h>
#endif
+#ifdef HAVE_ZSTD
+#include <zstd.h>
+#endif
#include <endian.h>
#include <stdint.h>
@@ -1716,6 +1719,218 @@ public:
#endif
};
/*}}}*/
+
+class APT_HIDDEN ZstdFileFdPrivate : public FileFdPrivate
+{ /*{{{*/
+#ifdef HAVE_ZSTD
+ ZSTD_DStream *dctx;
+ ZSTD_CStream *cctx;
+ size_t res;
+ FileFd backend;
+ simple_buffer zstd_buffer;
+ // Count of bytes that the decompressor expects to read next, or buffer size.
+ size_t next_to_load = APT_BUFFER_SIZE;
+
+ public:
+ virtual bool InternalOpen(int const iFd, unsigned int const Mode) APT_OVERRIDE
+ {
+ if ((Mode & FileFd::ReadWrite) == FileFd::ReadWrite)
+ return _error->Error("zstd only supports write or read mode");
+
+ if ((Mode & FileFd::WriteOnly) == FileFd::WriteOnly)
+ {
+ cctx = ZSTD_createCStream();
+ res = ZSTD_initCStream(cctx, findLevel(compressor.CompressArgs));
+ zstd_buffer.reset(APT_BUFFER_SIZE);
+ }
+ else
+ {
+ dctx = ZSTD_createDStream();
+ res = ZSTD_initDStream(dctx);
+ zstd_buffer.reset(APT_BUFFER_SIZE);
+ }
+
+ filefd->Flags |= FileFd::Compressed;
+
+ if (ZSTD_isError(res))
+ return false;
+
+ unsigned int flags = (Mode & (FileFd::WriteOnly | FileFd::ReadOnly));
+ if (backend.OpenDescriptor(iFd, flags, FileFd::None, true) == false)
+ return false;
+
+ return true;
+ }
+ virtual ssize_t InternalUnbufferedRead(void *const To, unsigned long long const Size) APT_OVERRIDE
+ {
+ /* Keep reading as long as the compressor still wants to read */
+ while (true)
+ {
+ // Fill compressed buffer;
+ if (zstd_buffer.empty())
+ {
+ unsigned long long read;
+ /* Reset - if LZ4 decompressor wants to read more, allocate more */
+ zstd_buffer.reset(next_to_load);
+ if (backend.Read(zstd_buffer.getend(), zstd_buffer.free(), &read) == false)
+ return -1;
+ zstd_buffer.bufferend += read;
+
+ if (read == 0)
+ {
+ /* Expected EOF */
+ if (next_to_load == 0)
+ return 0;
+
+ res = -1;
+ return filefd->FileFdError("ZSTD: %s %s",
+ filefd->FileName.c_str(),
+ _("Unexpected end of file")),
+ -1;
+ }
+ }
+ // Drain compressed buffer as far as possible.
+ ZSTD_inBuffer in = {
+ .src = zstd_buffer.get(),
+ .size = zstd_buffer.size(),
+ .pos = 0,
+ };
+ ZSTD_outBuffer out = {
+ .dst = To,
+ .size = Size,
+ .pos = 0,
+ };
+
+ next_to_load = res = ZSTD_decompressStream(dctx, &out, &in);
+
+ if (res == 0)
+ {
+ res = ZSTD_initDStream(dctx);
+ }
+
+ if (ZSTD_isError(res))
+ return -1;
+
+ zstd_buffer.bufferstart += in.pos;
+
+ if (out.pos != 0)
+ return out.pos;
+ }
+
+ return 0;
+ }
+ virtual bool InternalReadError() APT_OVERRIDE
+ {
+ char const *const errmsg = ZSTD_getErrorName(res);
+
+ return filefd->FileFdError("ZSTD: %s %s (%zu: %s)", filefd->FileName.c_str(), _("Read error"), res, errmsg);
+ }
+ virtual ssize_t InternalWrite(void const *const From, unsigned long long const Size) APT_OVERRIDE
+ {
+ // Drain compressed buffer as far as possible.
+ ZSTD_outBuffer out = {
+ .dst = zstd_buffer.buffer,
+ .size = zstd_buffer.buffersize_max,
+ .pos = 0,
+ };
+ ZSTD_inBuffer in = {
+ .src = From,
+ .size = Size,
+ .pos = 0,
+ };
+
+ res = ZSTD_compressStream(cctx, &out, &in);
+
+ if (ZSTD_isError(res) || backend.Write(zstd_buffer.buffer, out.pos) == false)
+ return -1;
+
+ return in.pos;
+ }
+
+ virtual bool InternalWriteError() APT_OVERRIDE
+ {
+ char const *const errmsg = ZSTD_getErrorName(res);
+
+ return filefd->FileFdError("ZSTD: %s %s (%zu: %s)", filefd->FileName.c_str(), _("Write error"), res, errmsg);
+ }
+ virtual bool InternalStream() const APT_OVERRIDE { return true; }
+
+ virtual bool InternalFlush() APT_OVERRIDE
+ {
+ return backend.Flush();
+ }
+
+ virtual bool InternalClose(std::string const &) APT_OVERRIDE
+ {
+ /* Reset variables */
+ res = 0;
+ next_to_load = APT_BUFFER_SIZE;
+
+ if (cctx != nullptr)
+ {
+ if (filefd->Failed() == false)
+ {
+ do
+ {
+ ZSTD_outBuffer out = {
+ .dst = zstd_buffer.buffer,
+ .size = zstd_buffer.buffersize_max,
+ .pos = 0,
+ };
+ res = ZSTD_endStream(cctx, &out);
+ if (ZSTD_isError(res) || backend.Write(zstd_buffer.buffer, out.pos) == false)
+ return false;
+ } while (res > 0);
+
+ if (!backend.Flush())
+ return false;
+ }
+ if (!backend.Close())
+ return false;
+
+ res = ZSTD_freeCStream(cctx);
+ cctx = nullptr;
+ }
+
+ if (dctx != nullptr)
+ {
+ res = ZSTD_freeDStream(dctx);
+ dctx = nullptr;
+ }
+ if (backend.IsOpen())
+ {
+ backend.Close();
+ filefd->iFd = -1;
+ }
+
+ return ZSTD_isError(res) == false;
+ }
+
+ static uint32_t findLevel(std::vector<std::string> const &Args)
+ {
+ for (auto a = Args.rbegin(); a != Args.rend(); ++a)
+ {
+ if (a->size() >= 2 && (*a)[0] == '-' && (*a)[1] != '-')
+ {
+ auto const level = a->substr(1);
+ auto const notANumber = level.find_first_not_of("0123456789");
+ if (notANumber != std::string::npos)
+ continue;
+
+ return (uint32_t)stoi(level);
+ }
+ }
+ return 19;
+ }
+
+ explicit ZstdFileFdPrivate(FileFd *const filefd) : FileFdPrivate(filefd), dctx(nullptr), cctx(nullptr) {}
+ virtual ~ZstdFileFdPrivate()
+ {
+ InternalClose("");
+ }
+#endif
+};
+ /*}}}*/
class APT_HIDDEN LzmaFileFdPrivate: public FileFdPrivate { /*{{{*/
#ifdef HAVE_LZMA
struct LZMAFILE {
@@ -2212,6 +2427,7 @@ bool FileFd::Open(string FileName,unsigned int const Mode,CompressMode Compress,
case Lzma: name = "lzma"; break;
case Xz: name = "xz"; break;
case Lz4: name = "lz4"; break;
+ case Zstd: name = "zstd"; break;
case Auto:
case Extension:
// Unreachable
@@ -2329,6 +2545,7 @@ bool FileFd::OpenDescriptor(int Fd, unsigned int const Mode, CompressMode Compre
case Lzma: name = "lzma"; break;
case Xz: name = "xz"; break;
case Lz4: name = "lz4"; break;
+ case Zstd: name = "zstd"; break;
case Auto:
case Extension:
if (AutoClose == true && Fd != -1)
@@ -2393,6 +2610,9 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
#ifdef HAVE_LZ4
APT_COMPRESS_INIT("lz4", Lz4FileFdPrivate);
#endif
+#ifdef HAVE_ZSTD
+ APT_COMPRESS_INIT("zstd", ZstdFileFdPrivate);
+#endif
#undef APT_COMPRESS_INIT
else if (compressor.Name == "." || compressor.Binary.empty() == true)
d = new DirectFileFdPrivate(this);
diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h
index 699b8b802..6249b7c16 100644
--- a/apt-pkg/contrib/fileutl.h
+++ b/apt-pkg/contrib/fileutl.h
@@ -46,6 +46,7 @@ class FileFd
friend class Bz2FileFdPrivate;
friend class LzmaFileFdPrivate;
friend class Lz4FileFdPrivate;
+ friend class ZstdFileFdPrivate;
friend class DirectFileFdPrivate;
friend class PipedFileFdPrivate;
protected:
@@ -76,8 +77,19 @@ class FileFd
ReadOnlyGzip,
WriteAtomic = ReadWrite | Create | Atomic
};
- enum CompressMode { Auto = 'A', None = 'N', Extension = 'E', Gzip = 'G', Bzip2 = 'B', Lzma = 'L', Xz = 'X', Lz4='4' };
-
+ enum CompressMode
+ {
+ Auto = 'A',
+ None = 'N',
+ Extension = 'E',
+ Gzip = 'G',
+ Bzip2 = 'B',
+ Lzma = 'L',
+ Xz = 'X',
+ Lz4 = '4',
+ Zstd = 'Z'
+ };
+
inline bool Read(void *To,unsigned long long Size,bool AllowEof)
{
unsigned long long Jnk;
diff --git a/apt-pkg/pkgsystem.cc b/apt-pkg/pkgsystem.cc
index aa94418c6..5d74e882b 100644
--- a/apt-pkg/pkgsystem.cc
+++ b/apt-pkg/pkgsystem.cc
@@ -72,7 +72,7 @@ std::vector<std::string> pkgSystem::ArchitecturesSupported() const /*{{{*/
return {};
}
/*}}}*/
-// pkgSystem::Set/GetVersionMapping - for internal/external communcation/*{{{*/
+// pkgSystem::Set/GetVersionMapping - for internal/external communication/*{{{*/
void pkgSystem::SetVersionMapping(map_id_t const in, map_id_t const out)
{
if (in == out)
diff --git a/debian/changelog b/debian/changelog
index 28382e2f0..3f0474b55 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -5,24 +5,15 @@ apt (1.6~beta1) unstable; urgency=medium
* add apt-helper drop-privs command…
* restore gcc visibility=hidden for apt-private
* ensure correct file permissions for auxfiles
- * allow the apt/lists/auxfiles/ directory to be missing (Closes: 887624)
- * add apt-helper drop-privs command…
- * restore gcc visibility=hidden for apt-private
- * ensure correct file permissions for auxfiles
[ Julian Andres Klode ]
* indexcopy: Copy uncompressed indices from cdrom again (LP: #1746807)
* Work around test-method-mirror failure by setting umask at start
* Check that Date of Release file is not in the future
* apt.conf.autoremove: Add linux-cloud-tools to list (LP: #1698159)
- * indexcopy: Copy uncompressed indices from cdrom again (LP: #1746807)
- * Work around test-method-mirror failure by setting umask at start
- * Check that Date of Release file is not in the future
- * apt.conf.autoremove: Add linux-cloud-tools to list (LP: #1698159)
[ Chris Leick ]
* German manpage translation update
- * German manpage translation update
-- Julian Andres Klode <jak@debian.org> Mon, 26 Feb 2018 13:14:13 +0100
diff --git a/debian/control b/debian/control
index a9063eb13..333150ff8 100644
--- a/debian/control
+++ b/debian/control
@@ -23,6 +23,7 @@ Build-Depends: cmake (>= 3.4),
liblzma-dev,
libseccomp-dev [amd64 arm64 armel armhf i386 mips mips64el mipsel ppc64el s390x hppa powerpc powerpcspe ppc64 x32],
libudev-dev [linux-any],
+ libzstd-dev (>= 1.0),
pkg-config,
po4a (>= 0.34-2),
xsltproc,
@@ -67,6 +68,7 @@ Description: commandline package manager
Package: libapt-pkg5.0
Architecture: any
Multi-Arch: same
+Priority: optional
Pre-Depends: ${misc:Pre-Depends}
Depends: ${misc:Depends}, ${shlibs:Depends}
Breaks: appstream (<< 0.9.0-3~), apt (<< 1.1~exp14), libapt-inst1.5 (<< 0.9.9~)
@@ -92,6 +94,7 @@ Description: package management runtime library
Package: libapt-inst2.0
Architecture: any
Multi-Arch: same
+Priority: optional
Pre-Depends: ${misc:Pre-Depends}
Depends: ${misc:Depends}, ${shlibs:Depends}
Section: libs
diff --git a/doc/apt-get.8.xml b/doc/apt-get.8.xml
index 520cfc126..3c1e90744 100644
--- a/doc/apt-get.8.xml
+++ b/doc/apt-get.8.xml
@@ -593,7 +593,7 @@
<literal>label</literal>, <literal>codename</literal>, <literal>suite</literal>,
<literal>version</literal> and <literal>defaultpin</literal>. See also &apt-preferences;.
- Configuration Item: <literal>Acquire::AllowReleaseInfoChanges</literal>.</para></listitem>
+ Configuration Item: <literal>Acquire::AllowReleaseInfoChange</literal>.</para></listitem>
</varlistentry>
<varlistentry><term><option>--show-progress</option></term>
diff --git a/doc/apt-transport-https.1.xml b/doc/apt-transport-https.1.xml
index 1bad8578b..1327b0a16 100644
--- a/doc/apt-transport-https.1.xml
+++ b/doc/apt-transport-https.1.xml
@@ -38,7 +38,7 @@ a user but used by APT tools based on user configuration.</para>
which, as indicated by the appended S, is wrapped in an encrypted layer known as
Transport Layer Security (TLS) to provide end-to-end encryption.
A sufficiently capable attacker can still observe the communication partners
-and deeper analyse of the encrypted communcation might still reveal important details.
+and deeper analyse of the encrypted communication might still reveal important details.
An overview over available alternative transport methods is given in &sources-list;.</para>
</refsect1>
diff --git a/doc/apt-verbatim.ent b/doc/apt-verbatim.ent
index d7817cb79..a8aa0bf5e 100644
--- a/doc/apt-verbatim.ent
+++ b/doc/apt-verbatim.ent
@@ -93,6 +93,12 @@
</citerefentry>"
>
+<!ENTITY apt-transport-mirror "<citerefentry>
+ <refentrytitle><command>apt-transport-mirror</command></refentrytitle>
+ <manvolnum>1</manvolnum>
+ </citerefentry>"
+>
+
<!ENTITY sources-list "<citerefentry>
<refentrytitle><filename>sources.list</filename></refentrytitle>
<manvolnum>5</manvolnum>
diff --git a/doc/examples/configure-index b/doc/examples/configure-index
index 3763aa900..4612f362e 100644
--- a/doc/examples/configure-index
+++ b/doc/examples/configure-index
@@ -416,6 +416,7 @@ Dir "<DIR>"
dpkg-source "<PROGRAM_PATH>";
dpkg-buildpackage "/usr/bin/dpkg-buildpackage";
lz4 "<PROGRAM_PATH>";
+ zstd "<PROGRAM_PATH>";
gzip "<PROGRAM_PATH>";
xz "<PROGRAM_PATH>";
bzip2 "<PROGRAM_PATH>";
diff --git a/doc/po/apt-doc.pot b/doc/po/apt-doc.pot
index 036766a8c..2a9af09f4 100644
--- a/doc/po/apt-doc.pot
+++ b/doc/po/apt-doc.pot
@@ -1438,7 +1438,7 @@ msgid ""
"<literal>codename</literal>, <literal>suite</literal>, "
"<literal>version</literal> and <literal>defaultpin</literal>. See also "
"&apt-preferences;. Configuration Item: "
-"<literal>Acquire::AllowReleaseInfoChanges</literal>."
+"<literal>Acquire::AllowReleaseInfoChange</literal>."
msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -7235,7 +7235,7 @@ msgid ""
"&apt-transport-http;), which, as indicated by the appended S, is wrapped in "
"an encrypted layer known as Transport Layer Security (TLS) to provide "
"end-to-end encryption. A sufficiently capable attacker can still observe "
-"the communication partners and deeper analyse of the encrypted communcation "
+"the communication partners and deeper analyse of the encrypted communication "
"might still reveal important details. An overview over available "
"alternative transport methods is given in &sources-list;."
msgstr ""
diff --git a/doc/po/de.po b/doc/po/de.po
index 35e1a6de1..ce9664693 100644
--- a/doc/po/de.po
+++ b/doc/po/de.po
@@ -2010,7 +2010,7 @@ msgid ""
"certain fields like <literal>origin</literal>, <literal>label</literal>, "
"<literal>codename</literal>, <literal>suite</literal>, <literal>version</"
"literal> and <literal>defaultpin</literal>. See also &apt-preferences;. "
-"Configuration Item: <literal>Acquire::AllowReleaseInfoChanges</literal>."
+"Configuration Item: <literal>Acquire::AllowReleaseInfoChange</literal>."
msgstr ""
"Es existieren Spezialoptionen (<literal>--allow-releaseinfo-change-</"
"literal><replaceable>Feld</replaceable>), um Änderungen nur für bestimmte "
@@ -2018,7 +2018,7 @@ msgstr ""
"<literal>codename</literal>, <literal>suite</literal>, <literal>version</"
"literal> und <literal>defaultpin</literal> zu erlauben. Siehe auch &apt-"
"preferences;. Konfigurationselement: <literal>Acquire::"
-"AllowReleaseInfoChanges</literal>."
+"AllowReleaseInfoChange</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
#: apt-get.8.xml
@@ -10349,7 +10349,7 @@ msgid ""
"http;), which, as indicated by the appended S, is wrapped in an encrypted "
"layer known as Transport Layer Security (TLS) to provide end-to-end "
"encryption. A sufficiently capable attacker can still observe the "
-"communication partners and deeper analyse of the encrypted communcation "
+"communication partners and deeper analyse of the encrypted communication "
"might still reveal important details. An overview over available "
"alternative transport methods is given in &sources-list;."
msgstr ""
diff --git a/doc/po/es.po b/doc/po/es.po
index 1ade7d522..73028c8cf 100644
--- a/doc/po/es.po
+++ b/doc/po/es.po
@@ -2075,7 +2075,7 @@ msgid ""
"certain fields like <literal>origin</literal>, <literal>label</literal>, "
"<literal>codename</literal>, <literal>suite</literal>, <literal>version</"
"literal> and <literal>defaultpin</literal>. See also &apt-preferences;. "
-"Configuration Item: <literal>Acquire::AllowReleaseInfoChanges</literal>."
+"Configuration Item: <literal>Acquire::AllowReleaseInfoChange</literal>."
msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -10082,7 +10082,7 @@ msgid ""
"http;), which, as indicated by the appended S, is wrapped in an encrypted "
"layer known as Transport Layer Security (TLS) to provide end-to-end "
"encryption. A sufficiently capable attacker can still observe the "
-"communication partners and deeper analyse of the encrypted communcation "
+"communication partners and deeper analyse of the encrypted communication "
"might still reveal important details. An overview over available "
"alternative transport methods is given in &sources-list;."
msgstr ""
diff --git a/doc/po/fr.po b/doc/po/fr.po
index b7703c807..867391b53 100644
--- a/doc/po/fr.po
+++ b/doc/po/fr.po
@@ -2006,7 +2006,7 @@ msgid ""
"certain fields like <literal>origin</literal>, <literal>label</literal>, "
"<literal>codename</literal>, <literal>suite</literal>, <literal>version</"
"literal> and <literal>defaultpin</literal>. See also &apt-preferences;. "
-"Configuration Item: <literal>Acquire::AllowReleaseInfoChanges</literal>."
+"Configuration Item: <literal>Acquire::AllowReleaseInfoChange</literal>."
msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -10254,7 +10254,7 @@ msgid ""
"http;), which, as indicated by the appended S, is wrapped in an encrypted "
"layer known as Transport Layer Security (TLS) to provide end-to-end "
"encryption. A sufficiently capable attacker can still observe the "
-"communication partners and deeper analyse of the encrypted communcation "
+"communication partners and deeper analyse of the encrypted communication "
"might still reveal important details. An overview over available "
"alternative transport methods is given in &sources-list;."
msgstr ""
diff --git a/doc/po/it.po b/doc/po/it.po
index 42c9ab3f4..3ba6c6756 100644
--- a/doc/po/it.po
+++ b/doc/po/it.po
@@ -2044,7 +2044,7 @@ msgid ""
"certain fields like <literal>origin</literal>, <literal>label</literal>, "
"<literal>codename</literal>, <literal>suite</literal>, <literal>version</"
"literal> and <literal>defaultpin</literal>. See also &apt-preferences;. "
-"Configuration Item: <literal>Acquire::AllowReleaseInfoChanges</literal>."
+"Configuration Item: <literal>Acquire::AllowReleaseInfoChange</literal>."
msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -10239,7 +10239,7 @@ msgid ""
"http;), which, as indicated by the appended S, is wrapped in an encrypted "
"layer known as Transport Layer Security (TLS) to provide end-to-end "
"encryption. A sufficiently capable attacker can still observe the "
-"communication partners and deeper analyse of the encrypted communcation "
+"communication partners and deeper analyse of the encrypted communication "
"might still reveal important details. An overview over available "
"alternative transport methods is given in &sources-list;."
msgstr ""
diff --git a/doc/po/ja.po b/doc/po/ja.po
index 3666e8677..70ab3f40d 100644
--- a/doc/po/ja.po
+++ b/doc/po/ja.po
@@ -1979,7 +1979,7 @@ msgid ""
"certain fields like <literal>origin</literal>, <literal>label</literal>, "
"<literal>codename</literal>, <literal>suite</literal>, <literal>version</"
"literal> and <literal>defaultpin</literal>. See also &apt-preferences;. "
-"Configuration Item: <literal>Acquire::AllowReleaseInfoChanges</literal>."
+"Configuration Item: <literal>Acquire::AllowReleaseInfoChange</literal>."
msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -9852,7 +9852,7 @@ msgid ""
"http;), which, as indicated by the appended S, is wrapped in an encrypted "
"layer known as Transport Layer Security (TLS) to provide end-to-end "
"encryption. A sufficiently capable attacker can still observe the "
-"communication partners and deeper analyse of the encrypted communcation "
+"communication partners and deeper analyse of the encrypted communication "
"might still reveal important details. An overview over available "
"alternative transport methods is given in &sources-list;."
msgstr ""
diff --git a/doc/po/nl.po b/doc/po/nl.po
index 4e869a3d5..cd27f3446 100644
--- a/doc/po/nl.po
+++ b/doc/po/nl.po
@@ -2077,14 +2077,14 @@ msgid ""
"certain fields like <literal>origin</literal>, <literal>label</literal>, "
"<literal>codename</literal>, <literal>suite</literal>, <literal>version</"
"literal> and <literal>defaultpin</literal>. See also &apt-preferences;. "
-"Configuration Item: <literal>Acquire::AllowReleaseInfoChanges</literal>."
+"Configuration Item: <literal>Acquire::AllowReleaseInfoChange</literal>."
msgstr ""
"Er bestaan specialistische opties (<literal>--allow-releaseinfo-change-</"
"literal><replaceable>veld</replaceable>) om enkel veranderingen toe te staan "
"voor bepaalde velden, zoals <literal>origin</literal>, <literal>label</"
"literal>, <literal>codename</literal>, <literal>suite</literal>, "
"<literal>version</literal> en <literal>defaultpin</literal>. Zie ook &apt-"
-"preferences;. Configuratie-item: <literal>Acquire::AllowReleaseInfoChanges</"
+"preferences;. Configuratie-item: <literal>Acquire::AllowReleaseInfoChange</"
"literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -10475,7 +10475,7 @@ msgid ""
"http;), which, as indicated by the appended S, is wrapped in an encrypted "
"layer known as Transport Layer Security (TLS) to provide end-to-end "
"encryption. A sufficiently capable attacker can still observe the "
-"communication partners and deeper analyse of the encrypted communcation "
+"communication partners and deeper analyse of the encrypted communication "
"might still reveal important details. An overview over available "
"alternative transport methods is given in &sources-list;."
msgstr ""
diff --git a/doc/po/pl.po b/doc/po/pl.po
index 46513d19d..2f111b3e2 100644
--- a/doc/po/pl.po
+++ b/doc/po/pl.po
@@ -2084,7 +2084,7 @@ msgid ""
"certain fields like <literal>origin</literal>, <literal>label</literal>, "
"<literal>codename</literal>, <literal>suite</literal>, <literal>version</"
"literal> and <literal>defaultpin</literal>. See also &apt-preferences;. "
-"Configuration Item: <literal>Acquire::AllowReleaseInfoChanges</literal>."
+"Configuration Item: <literal>Acquire::AllowReleaseInfoChange</literal>."
msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -9239,7 +9239,7 @@ msgid ""
"http;), which, as indicated by the appended S, is wrapped in an encrypted "
"layer known as Transport Layer Security (TLS) to provide end-to-end "
"encryption. A sufficiently capable attacker can still observe the "
-"communication partners and deeper analyse of the encrypted communcation "
+"communication partners and deeper analyse of the encrypted communication "
"might still reveal important details. An overview over available "
"alternative transport methods is given in &sources-list;."
msgstr ""
diff --git a/doc/po/pt.po b/doc/po/pt.po
index d8d4c4b7a..af4c0b6f9 100644
--- a/doc/po/pt.po
+++ b/doc/po/pt.po
@@ -2018,7 +2018,7 @@ msgid ""
"certain fields like <literal>origin</literal>, <literal>label</literal>, "
"<literal>codename</literal>, <literal>suite</literal>, <literal>version</"
"literal> and <literal>defaultpin</literal>. See also &apt-preferences;. "
-"Configuration Item: <literal>Acquire::AllowReleaseInfoChanges</literal>."
+"Configuration Item: <literal>Acquire::AllowReleaseInfoChange</literal>."
msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -10018,7 +10018,7 @@ msgid ""
"http;), which, as indicated by the appended S, is wrapped in an encrypted "
"layer known as Transport Layer Security (TLS) to provide end-to-end "
"encryption. A sufficiently capable attacker can still observe the "
-"communication partners and deeper analyse of the encrypted communcation "
+"communication partners and deeper analyse of the encrypted communication "
"might still reveal important details. An overview over available "
"alternative transport methods is given in &sources-list;."
msgstr ""
diff --git a/doc/po/pt_BR.po b/doc/po/pt_BR.po
index 56bab5079..3401ed857 100644
--- a/doc/po/pt_BR.po
+++ b/doc/po/pt_BR.po
@@ -1410,7 +1410,7 @@ msgid ""
"certain fields like <literal>origin</literal>, <literal>label</literal>, "
"<literal>codename</literal>, <literal>suite</literal>, <literal>version</"
"literal> and <literal>defaultpin</literal>. See also &apt-preferences;. "
-"Configuration Item: <literal>Acquire::AllowReleaseInfoChanges</literal>."
+"Configuration Item: <literal>Acquire::AllowReleaseInfoChange</literal>."
msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -7560,7 +7560,7 @@ msgid ""
"http;), which, as indicated by the appended S, is wrapped in an encrypted "
"layer known as Transport Layer Security (TLS) to provide end-to-end "
"encryption. A sufficiently capable attacker can still observe the "
-"communication partners and deeper analyse of the encrypted communcation "
+"communication partners and deeper analyse of the encrypted communication "
"might still reveal important details. An overview over available "
"alternative transport methods is given in &sources-list;."
msgstr ""
diff --git a/doc/sources.list.5.xml b/doc/sources.list.5.xml
index 75b5d94b9..e55c5b31e 100644
--- a/doc/sources.list.5.xml
+++ b/doc/sources.list.5.xml
@@ -409,6 +409,17 @@ deb-src [ option1=value1 option2=value2 ] uri suite [component1] [component2] [.
alternative.</para></listitem>
</varlistentry>
+ <varlistentry><term><command>mirror</command>, <command>mirror+<replaceable>scheme</replaceable></command> (&apt-transport-mirror;)</term>
+ <listitem><para>
+ The mirror scheme specifies the location of a mirrorlist. By default the
+ scheme used for the location is <literal>http</literal>, but any other
+ scheme can be used via <command>mirror+<replaceable>scheme</replaceable></command>.
+ The mirrorlist itself can contain many different URIs for mirrors the APT client
+ can transparently pick, choose and fallback between intended to help both
+ with distributing the load over the available mirrors and ensuring that
+ clients can acquire data even if some configured mirrors are not available.
+ </para></listitem>
+ </varlistentry>
<varlistentry><term><command>file</command></term>
<listitem><para>
diff --git a/prepare-release b/prepare-release
index e9e9362da..a37962cd7 100755
--- a/prepare-release
+++ b/prepare-release
@@ -105,6 +105,12 @@ elif [ "$1" = 'pre-build' ]; then
echo "You probably want to run »./prepare-release pre-export« to fix this."
exit 1
fi
+ NEWSDISTRIBUTION=$(dpkg-parsechangelog -l debian/NEWS | sed -n -e '/^Distribution:/s/^Distribution: //p')
+ if [ "$NEWSDISTRIBUTION" = 'UNRELEASED' ]; then
+ echo "changelog (${VERSION}) has a distribution (${DISTRIBUTION}) set, while the NEWS file hasn't!"
+ echo "You probably want to edit »debian/NEWS« to fix this."
+ exit 1
+ fi
fi
elif [ "$1" = 'post-build' ]; then
if [ "$DISTRIBUTION" != "UNRELEASED" ]; then
diff --git a/test/integration/framework b/test/integration/framework
index a9c797790..38a084302 100644
--- a/test/integration/framework
+++ b/test/integration/framework
@@ -627,6 +627,7 @@ configcompression() {
'.') printf ".\t.\tcat\n";;
'gz') printf "gzip\tgz\t$CMD $1\n";;
'bz2') printf "bzip2\tbz2\t$CMD $1\n";;
+ 'zst') printf "zstd\tzst\t$CMD $1\n";;
*) printf "$1\t$1\t$CMD $1\n";;
esac
shift
@@ -655,6 +656,7 @@ forcecompressor() {
case $COMPRESSOR in
gzip) COMPRESS='gz';;
bzip2) COMPRESS='bz2';;
+ zstd) COMPRESS='zst';;
esac
local CONFFILE="${TMPWORKINGDIRECTORY}/rootdir/etc/apt/apt.conf.d/00force-compressor"
echo "Acquire::CompressionTypes::Order { \"${COMPRESS}\"; };
diff --git a/test/libapt/fileutl_test.cc b/test/libapt/fileutl_test.cc
index a702c16ec..38536f77f 100644
--- a/test/libapt/fileutl_test.cc
+++ b/test/libapt/fileutl_test.cc
@@ -180,7 +180,7 @@ static void TestFileFd(mode_t const a_umask, mode_t const ExpectedFilePermission
static void TestFileFd(unsigned int const filemode)
{
auto const compressors = APT::Configuration::getCompressors();
- EXPECT_EQ(7, compressors.size());
+ EXPECT_EQ(8, compressors.size());
bool atLeastOneWasTested = false;
for (auto const &c: compressors)
{
@@ -204,7 +204,7 @@ TEST(FileUtlTest, FileFD)
_config->Set("APT::Compressor::rev::Binary", "rev");
_config->Set("APT::Compressor::rev::Cost", 10);
auto const compressors = APT::Configuration::getCompressors(false);
- EXPECT_EQ(7, compressors.size());
+ EXPECT_EQ(8, compressors.size());
EXPECT_TRUE(std::any_of(compressors.begin(), compressors.end(), [](APT::Configuration::Compressor const &c) { return c.Name == "rev"; }));
std::string const startdir = SafeGetCWD();