summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/contrib/fileutl.cc6
-rw-r--r--apt-pkg/deb/dpkgpm.cc29
-rw-r--r--apt-pkg/install-progress.cc71
-rw-r--r--apt-pkg/install-progress.h11
-rw-r--r--cmdline/apt-extracttemplates.cc15
-rw-r--r--cmdline/apt.cc2
-rw-r--r--debian/apt.cron.daily2
-rw-r--r--doc/apt-extracttemplates.1.xml4
-rw-r--r--doc/apt.conf.5.xml12
-rw-r--r--doc/examples/configure-index4
-rw-r--r--test/integration/framework1
-rwxr-xr-xtest/integration/test-apt-extracttemplates45
-rw-r--r--test/libapt/install_progress_test.cc30
-rw-r--r--test/libapt/makefile6
14 files changed, 204 insertions, 34 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index 69406a9bf..188bb87ee 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -104,7 +104,11 @@ bool RunScripts(const char *Cnf)
{
if (Opts->Value.empty() == true)
continue;
-
+
+ if(_config->FindB("Debug::RunScripts", false) == true)
+ std::clog << "Running external script: '"
+ << Opts->Value << "'" << std::endl;
+
if (system(Opts->Value.c_str()) != 0)
_exit(100+Count);
}
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 5a5fff13b..c3e7e1d1d 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -399,10 +399,14 @@ bool pkgDPkgPM::SendPkgsInfo(FILE * const F, unsigned int const &Version)
that are due to be installed. */
bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
{
+ bool result = true;
+
Configuration::Item const *Opts = _config->Tree(Cnf);
if (Opts == 0 || Opts->Child == 0)
return true;
Opts = Opts->Child;
+
+ sighandler_t old_sigpipe = signal(SIGPIPE, SIG_IGN);
unsigned int Count = 1;
for (; Opts != 0; Opts = Opts->Next, Count++)
@@ -410,6 +414,10 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
if (Opts->Value.empty() == true)
continue;
+ if(_config->FindB("Debug::RunScripts", false) == true)
+ std::clog << "Running external script with list of all .deb file: '"
+ << Opts->Value << "'" << std::endl;
+
// Determine the protocol version
string OptSec = Opts->Value;
string::size_type Pos;
@@ -424,8 +432,10 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
std::set<int> KeepFDs;
MergeKeepFdsFromConfiguration(KeepFDs);
int Pipes[2];
- if (pipe(Pipes) != 0)
- return _error->Errno("pipe","Failed to create IPC pipe to subprocess");
+ if (pipe(Pipes) != 0) {
+ result = _error->Errno("pipe","Failed to create IPC pipe to subprocess");
+ break;
+ }
if (InfoFD != (unsigned)Pipes[0])
SetCloseExec(Pipes[0],true);
else
@@ -459,8 +469,10 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
}
close(Pipes[0]);
FILE *F = fdopen(Pipes[1],"w");
- if (F == 0)
- return _error->Errno("fdopen","Faild to open new FD");
+ if (F == 0) {
+ result = _error->Errno("fdopen","Faild to open new FD");
+ break;
+ }
// Feed it the filenames.
if (Version <= 1)
@@ -488,11 +500,14 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
fclose(F);
// Clean up the sub process
- if (ExecWait(Process,Opts->Value.c_str()) == false)
- return _error->Error("Failure running script %s",Opts->Value.c_str());
+ if (ExecWait(Process,Opts->Value.c_str()) == false) {
+ result = _error->Error("Failure running script %s",Opts->Value.c_str());
+ break;
+ }
}
+ signal(SIGPIPE, old_sigpipe);
- return true;
+ return result;
}
/*}}}*/
// DPkgPM::DoStdin - Read stdin and pass to slave pty /*{{{*/
diff --git a/apt-pkg/install-progress.cc b/apt-pkg/install-progress.cc
index dfe4fb18c..8bb587f67 100644
--- a/apt-pkg/install-progress.cc
+++ b/apt-pkg/install-progress.cc
@@ -252,17 +252,22 @@ void PackageManagerFancy::staticSIGWINCH(int signum)
(*I)->HandleSIGWINCH(signum);
}
-int PackageManagerFancy::GetNumberTerminalRows()
+PackageManagerFancy::TermSize
+PackageManagerFancy::GetTerminalSize()
{
struct winsize win;
+ PackageManagerFancy::TermSize s;
+
// FIXME: get from "child_pty" instead?
if(ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *)&win) != 0)
- return -1;
+ return s;
if(_config->FindB("Debug::InstallProgress::Fancy", false) == true)
- std::cerr << "GetNumberTerminalRows: " << win.ws_row << std::endl;
-
- return win.ws_row;
+ std::cerr << "GetTerminalSize: " << win.ws_row << std::endl;
+
+ s.rows = win.ws_row;
+ s.columns = win.ws_col;
+ return s;
}
void PackageManagerFancy::SetupTerminalScrollArea(int nr_rows)
@@ -298,21 +303,21 @@ void PackageManagerFancy::SetupTerminalScrollArea(int nr_rows)
void PackageManagerFancy::HandleSIGWINCH(int)
{
- int nr_terminal_rows = GetNumberTerminalRows();
+ int nr_terminal_rows = GetTerminalSize().rows;
SetupTerminalScrollArea(nr_terminal_rows);
}
void PackageManagerFancy::Start(int a_child_pty)
{
child_pty = a_child_pty;
- int nr_terminal_rows = GetNumberTerminalRows();
+ int nr_terminal_rows = GetTerminalSize().rows;
if (nr_terminal_rows > 0)
SetupTerminalScrollArea(nr_terminal_rows);
}
void PackageManagerFancy::Stop()
{
- int nr_terminal_rows = GetNumberTerminalRows();
+ int nr_terminal_rows = GetTerminalSize().rows;
if (nr_terminal_rows > 0)
{
SetupTerminalScrollArea(nr_terminal_rows + 1);
@@ -324,6 +329,26 @@ void PackageManagerFancy::Stop()
child_pty = -1;
}
+std::string
+PackageManagerFancy::GetTextProgressStr(float Percent, int OutputSize)
+{
+ std::string output;
+ int i;
+
+ // should we raise a exception here instead?
+ if (Percent < 0.0 || Percent > 1.0 || OutputSize < 3)
+ return output;
+
+ int BarSize = OutputSize - 2; // bar without the leading "[" and trailing "]"
+ output += "[";
+ for(i=0; i < BarSize*Percent; i++)
+ output += "#";
+ for (/*nothing*/; i < BarSize; i++)
+ output += ".";
+ output += "]";
+ return output;
+}
+
bool PackageManagerFancy::StatusChanged(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
@@ -333,27 +358,47 @@ bool PackageManagerFancy::StatusChanged(std::string PackageName,
HumanReadableAction))
return false;
- int row = GetNumberTerminalRows();
+ PackageManagerFancy::TermSize size = GetTerminalSize();
static std::string save_cursor = "\033[s";
static std::string restore_cursor = "\033[u";
- static std::string set_bg_color = "\033[42m"; // green
- static std::string set_fg_color = "\033[30m"; // black
+ // green
+ static std::string set_bg_color = DeQuoteString(
+ _config->Find("Dpkg::Progress-Fancy::Progress-fg", "%1b[42m"));
+ // black
+ static std::string set_fg_color = DeQuoteString(
+ _config->Find("Dpkg::Progress-Fancy::Progress-bg", "%1b[30m"));
static std::string restore_bg = "\033[49m";
static std::string restore_fg = "\033[39m";
std::cout << save_cursor
// move cursor position to last row
- << "\033[" << row << ";0f"
+ << "\033[" << size.rows << ";0f"
<< set_bg_color
<< set_fg_color
<< progress_str
- << restore_cursor
<< restore_bg
<< restore_fg;
std::flush(std::cout);
+
+ // draw text progress bar
+ if (_config->FindB("Dpkg::Progress-Fancy::Progress-Bar", true))
+ {
+ int padding = 4;
+ float progressbar_size = size.columns - padding - progress_str.size();
+ float current_percent = (float)StepsDone/(float)TotalSteps;
+ std::cout << " "
+ << GetTextProgressStr(current_percent, progressbar_size)
+ << " ";
+ std::flush(std::cout);
+ }
+
+ // restore
+ std::cout << restore_cursor;
+ std::flush(std::cout);
+
last_reported_progress = percentage;
return true;
diff --git a/apt-pkg/install-progress.h b/apt-pkg/install-progress.h
index baf245376..112b034fb 100644
--- a/apt-pkg/install-progress.h
+++ b/apt-pkg/install-progress.h
@@ -125,7 +125,12 @@ namespace Progress {
void SetupTerminalScrollArea(int nr_rows);
void HandleSIGWINCH(int);
- int GetNumberTerminalRows();
+ typedef struct {
+ int rows;
+ int columns;
+ } TermSize;
+ TermSize GetTerminalSize();
+
sighandler_t old_SIGWINCH;
int child_pty;
@@ -138,6 +143,10 @@ namespace Progress {
unsigned int StepsDone,
unsigned int TotalSteps,
std::string HumanReadableAction);
+
+ // return a progress bar of the given size for the given progress
+ // percent between 0.0 and 1.0 in the form "[####...]"
+ static std::string GetTextProgressStr(float percent, int OutputSize);
};
class PackageManagerText : public PackageManager
diff --git a/cmdline/apt-extracttemplates.cc b/cmdline/apt-extracttemplates.cc
index a82623444..e4428e051 100644
--- a/cmdline/apt-extracttemplates.cc
+++ b/cmdline/apt-extracttemplates.cc
@@ -37,6 +37,7 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
+#include <stdlib.h>
#include "apt-extracttemplates.h"
@@ -239,23 +240,25 @@ static int ShowHelp(void)
static string WriteFile(const char *package, const char *prefix, const char *data)
{
char fn[512];
- static int i;
std::string tempdir = GetTempDir();
- snprintf(fn, sizeof(fn), "%s/%s.%s.%u%d",
+ snprintf(fn, sizeof(fn), "%s/%s.%s.XXXXXX",
_config->Find("APT::ExtractTemplates::TempDir",
tempdir.c_str()).c_str(),
- package, prefix, getpid(), i++);
+ package, prefix);
FileFd f;
if (data == NULL)
data = "";
-
- if (!f.Open(fn, FileFd::WriteTemp, 0600))
+ int fd = mkstemp(fn);
+ if (fd < 0) {
+ _error->Errno("ofstream::ofstream",_("Unable to mkstemp %s"),fn);
+ return string();
+ }
+ if (!f.OpenDescriptor(fd, FileFd::WriteOnly, FileFd::None, true))
{
_error->Errno("ofstream::ofstream",_("Unable to write to %s"),fn);
return string();
}
-
f.Write(data, strlen(data));
f.Close();
return fn;
diff --git a/cmdline/apt.cc b/cmdline/apt.cc
index b69aeef2d..778ca5a80 100644
--- a/cmdline/apt.cc
+++ b/cmdline/apt.cc
@@ -109,7 +109,7 @@ int main(int argc, const char *argv[]) /*{{{*/
}
// some different defaults
- _config->CndSet("DPkgPM::Progress-Fancy", "1");
+ _config->CndSet("DPkg::Progress-Fancy", "1");
_config->CndSet("Apt::Color", "1");
_config->CndSet("APT::Get::Upgrade-Allow-New", true);
diff --git a/debian/apt.cron.daily b/debian/apt.cron.daily
index aafd9e0ad..ee0761bfb 100644
--- a/debian/apt.cron.daily
+++ b/debian/apt.cron.daily
@@ -41,7 +41,7 @@
# APT::Periodic::MaxSize "0"; (new)
# - Set maximum size of the cache in MB (0=disable). If the cache
# is bigger, cached package files are deleted until the size
-# requirement is met (the biggest packages will be deleted
+# requirement is met (the oldest packages will be deleted
# first).
#
# APT::Periodic::Update-Package-Lists "0";
diff --git a/doc/apt-extracttemplates.1.xml b/doc/apt-extracttemplates.1.xml
index d27e05075..9f9888069 100644
--- a/doc/apt-extracttemplates.1.xml
+++ b/doc/apt-extracttemplates.1.xml
@@ -47,8 +47,8 @@
<para>template-file and config-script are written to the temporary directory
specified by the <option>-t</option> or <option>--tempdir</option>
(<literal>APT::ExtractTemplates::TempDir</literal>) directory,
- with filenames of the form <filename>package.template.XXXX</filename> and
- <filename>package.config.XXXX</filename></para>
+ with filenames of the form <filename>package.template.XXXXXX</filename> and
+ <filename>package.config.XXXXXX</filename></para>
</refsect1>
<refsect1><title>options</title>
diff --git a/doc/apt.conf.5.xml b/doc/apt.conf.5.xml
index 78f6a27a2..fcbf20dac 100644
--- a/doc/apt.conf.5.xml
+++ b/doc/apt.conf.5.xml
@@ -1184,6 +1184,18 @@ DPkg::TriggersPending "true";</literallayout></para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>Debug::RunScripts</option></term>
+ <listitem>
+ <para>
+ Display the external commands that are called by apt hooks.
+ This includes e.g. the config options
+ <literal>DPkg::{Pre,Post}-Invoke</literal> or
+ <literal>APT::Update::{Pre,Post}-Invoke</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+
<!-- 2009/07/11 Currently used nowhere. The corresponding code
is commented.
<varlistentry>
diff --git a/doc/examples/configure-index b/doc/examples/configure-index
index 93e96cf16..2d9f829ba 100644
--- a/doc/examples/configure-index
+++ b/doc/examples/configure-index
@@ -149,7 +149,7 @@ APT
MaxSize "0"; // (new)
// - Set maximum size of the cache in MB (0=disable). If the cache
// is bigger, cached package files are deleted until the size
- // requirement is met (the biggest packages will be deleted
+ // requirement is met (the oldest packages will be deleted
// first).
Update-Package-Lists "0";
@@ -450,7 +450,7 @@ Debug
aptcdrom "false"; // Show found package files
IdentCdrom "false";
acquire::netrc "false"; // netrc parser
-
+ RunScripts "false"; // debug invocation of external scripts
}
pkgCacheGen::Essential "native"; // other modes: all, none, installed
diff --git a/test/integration/framework b/test/integration/framework
index 8e401cb5f..1c6f041b0 100644
--- a/test/integration/framework
+++ b/test/integration/framework
@@ -118,6 +118,7 @@ apt() { runapt apt "$@"; }
apthelper() { runapt "${APTHELPERBINDIR}/apt-helper" "$@"; }
aptwebserver() { runapt "${APTWEBSERVERBINDIR}/aptwebserver" "$@"; }
aptitude() { runapt aptitude "$@"; }
+aptextracttemplates() { runapt apt-extracttemplates "$@"; }
dpkg() {
command dpkg --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log "$@"
diff --git a/test/integration/test-apt-extracttemplates b/test/integration/test-apt-extracttemplates
new file mode 100755
index 000000000..ae2cc8bc2
--- /dev/null
+++ b/test/integration/test-apt-extracttemplates
@@ -0,0 +1,45 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'amd64'
+
+# apt-extracttemplates needs this
+insertinstalledpackage 'debconf' 'amd64' '1.5'
+insertinstalledpackage 'pkg-with-template' 'amd64' '1.0'
+
+# build a simple package that contains a config and a tempalte
+mkdir -p DEBIAN
+TEMPLATE_STR="Template: foo/bar
+Type: string
+Description: Some bar var
+"
+echo "$TEMPLATE_STR" > DEBIAN/templates
+
+CONFIG_STR="#!/bin/sh
+random shell stuff
+"
+echo "$CONFIG_STR" > DEBIAN/config
+
+buildsimplenativepackage 'pkg-with-template' 'amd64' '0.8.15' 'stable' '' 'pkg with template' '' '' './DEBIAN'
+
+# ensure we get the right stuff out of the file
+mkdir extracttemplates-out
+OUT="$(aptextracttemplates -t ./extracttemplates-out incoming/pkg-with-template*.deb)"
+
+PKG=$(printf "$OUT" | cut -f1 -d' ')
+INSTALLED_VER=$(printf "$OUT" | cut -f2 -d' ')
+TEMPLATE=$(printf "$OUT" | cut -f3 -d' ')
+CONFIG=$(printf "$OUT" | cut -f4 -d' ')
+
+testequal "$CONFIG_STR" cat $CONFIG
+testequal "$TEMPLATE_STR" cat $TEMPLATE
+
+# ensure that the format of the output string has the right number of dots
+for s in "$CONFIG" "$TEMPLATE"; do
+ NR_DOTS=$(basename "$s" | tr -c -d .)
+ testequal ".." echo $NR_DOTS
+done
diff --git a/test/libapt/install_progress_test.cc b/test/libapt/install_progress_test.cc
new file mode 100644
index 000000000..be1a3411e
--- /dev/null
+++ b/test/libapt/install_progress_test.cc
@@ -0,0 +1,30 @@
+#include <config.h>
+
+#include <apt-pkg/install-progress.h>
+
+#include <string>
+
+#include "assert.h"
+
+int main() {
+ APT::Progress::PackageManagerFancy p;
+ std::string s;
+
+ s= p.GetTextProgressStr(0.5, 60);
+ equals(s.size(), 60);
+
+ s= p.GetTextProgressStr(0.5, 4);
+ equals(s, "[#.]");
+
+ s= p.GetTextProgressStr(0.1, 12);
+ equals(s, "[#.........]");
+
+ s= p.GetTextProgressStr(0.9, 12);
+ equals(s, "[#########.]");
+
+ // deal with incorrect inputs gracefully (or should we die instead?)
+ s= p.GetTextProgressStr(-999, 12);
+ equals(s, "");
+
+ return 0;
+}
diff --git a/test/libapt/makefile b/test/libapt/makefile
index 66d6ea783..e03b5e6aa 100644
--- a/test/libapt/makefile
+++ b/test/libapt/makefile
@@ -123,3 +123,9 @@ SLIBS = -lapt-pkg
SOURCE = sourcelist_test.cc
include $(PROGRAM_H)
+# test install-progress
+PROGRAM = InstallProgress${BASENAME}
+SLIBS = -lapt-pkg
+SOURCE = install_progress_test.cc
+include $(PROGRAM_H)
+