diff --git a/Makefile.am b/Makefile.am index ea3b0e07..ed9a34d3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,6 +3,9 @@ if WANT_DOC SUBDIRS += doc endif +# Make sure we test and build manpages when doing distcheck +DISTCHECK_CONFIGURE_FLAGS = --enable-doc --disable-git-version + # Some files automatically included, so they aren't specified below: # AUTHORS, COPYING, NEWS, README EXTRA_DIST = HACKING diff --git a/configure.ac b/configure.ac index da0a35fa..c7841b80 100644 --- a/configure.ac +++ b/configure.ac @@ -103,11 +103,6 @@ AC_ARG_ENABLE(doxygen, AS_HELP_STRING([--enable-doxygen], [build your own API docs via Doxygen]), [wantdoxygen=$enableval], [wantdoxygen=no]) -# Help line for asciidoc -AC_ARG_ENABLE(asciidoc, - AS_HELP_STRING([--enable-asciidoc], [build your own manpages with Asciidoc]), - [wantasciidoc=$enableval], [wantasciidoc=no]) - # Help line for debug AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug], [enable debugging support]), @@ -273,23 +268,6 @@ else fi AM_CONDITIONAL(USE_DOXYGEN, test "x$usedoxygen" = "xyes") -# Check for asciidoc support and status -AC_CHECK_PROGS([ASCIIDOC], [asciidoc]) -AC_MSG_CHECKING([for asciidoc]) -if test "x$wantasciidoc" = "xyes" ; then - if test $ASCIIDOC ; then - AC_MSG_RESULT([yes]) - useasciidoc=yes - else - AC_MSG_RESULT([no, asciidoc missing]) - useasciidoc=no - fi -else - AC_MSG_RESULT([no, disabled by configure]) - useasciidoc=no -fi -AM_CONDITIONAL(USE_ASCIIDOC, test "x$useasciidoc" = "xyes") - # Enable or disable debug code AC_MSG_CHECKING(for debug mode request) if test "x$debug" = "xyes" ; then @@ -389,7 +367,6 @@ ${PACKAGE_NAME}: Run make in doc/ dir : ${wantdoc} Use download library : ${internaldownload} Doxygen support : ${usedoxygen} - Asciidoc support : ${useasciidoc} debug support : ${debug} " diff --git a/doc/Makefile.am b/doc/Makefile.am index 476a21c3..cce0a711 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -15,6 +15,7 @@ ASCIIDOC_MANS = \ DOXYGEN_MANS = $(wildcard man3/*.3) EXTRA_DIST = \ + asciidoc.conf \ pacman.8.txt \ makepkg.8.txt \ repo-add.8.txt \ @@ -29,8 +30,12 @@ EXTRA_DIST = \ $(DOXYGEN_MANS) # Files that should be removed, but which Automake does not know. -MOSTLYCLEANFILES = *.xml -MAINTAINERCLEANFILES = $(ASCIIDOC_MANS) +MOSTLYCLEANFILES = *.xml $(ASCIIDOC_MANS) + +# Ensure manpages are fresh when building a dist tarball +dist-hook: + $(MAKE) $(AM_MAKEFLAGS) clean + $(MAKE) $(AM_MAKEFLAGS) all if USE_GIT_VERSION GIT_VERSION := $(shell sh -c 'git describe --abbrev=4 | sed s/^v//')-dirty @@ -39,20 +44,18 @@ else REAL_PACKAGE_VERSION = $(PACKAGE_VERSION) endif - man_MANS = dist_man_MANS = $(ASCIIDOC_MANS) repo-remove.8 if USE_DOXYGEN man_MANS += $(DOXYGEN_MANS) -all: doxygen.in +all-local: doxygen.in doxygen.in: $(DOXYGEN) $(srcdir)/Doxyfile endif -if USE_ASCIIDOC ASCIIDOC_OPTS = \ -f asciidoc.conf \ -a pacman_version="$(REAL_PACKAGE_VERSION)" \ @@ -64,11 +67,10 @@ A2X_OPTS = \ --xsltproc-opts='-param man.endnotes.list.enabled 0' \ --xsltproc-opts='-param man.endnotes.are.numbered 0' -$(ASCIIDOC_MANS): - a2x $(A2X_OPTS) --asciidoc-opts="$(ASCIIDOC_OPTS)" $@.txt - # These rules are due to the includes and files of the asciidoc text $(ASCIIDOC_MANS): asciidoc.conf footer.txt + a2x $(A2X_OPTS) --asciidoc-opts="$(ASCIIDOC_OPTS)" $@.txt + pacman.8: pacman.8.txt makepkg.8: makepkg.8.txt repo-add.8: repo-add.8.txt @@ -78,7 +80,7 @@ pacman.conf.5: pacman.conf.5.txt libalpm.3: libalpm.3.txt # this one is just a symlink repo-remove.8: repo-add.8 - ln -s repo-add.8 repo-remove.8 -endif + rm -f repo-remove.8 + $(LN_S) repo-add.8 repo-remove.8 # vim:set ts=2 sw=2 noet: diff --git a/lib/libalpm/cache.c b/lib/libalpm/cache.c index 032cc978..10857792 100644 --- a/lib/libalpm/cache.c +++ b/lib/libalpm/cache.c @@ -19,7 +19,6 @@ #include "config.h" -#include #include #include #include diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c index cae237cf..499e55a4 100644 --- a/lib/libalpm/conflict.c +++ b/lib/libalpm/conflict.c @@ -25,7 +25,6 @@ #include #include -#include #include #include #include diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index 0ae0c897..9b91ce47 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -23,7 +23,6 @@ #include "config.h" -#include #include #include #include diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 13020041..ee0ff6f5 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -30,7 +30,6 @@ #include #include #include -#include /* libarchive */ #include diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index d2336454..73ae822e 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -30,7 +30,6 @@ #include #include #include -#include #include /* libalpm */ @@ -205,7 +204,7 @@ int SYMEXPORT alpm_trans_release() /* unlock db */ if(handle->lckfd != -1) { - close(handle->lckfd); + while(close(handle->lckfd) == -1 && errno == EINTR); handle->lckfd = -1; } if(_alpm_lckrm()) { @@ -567,7 +566,7 @@ int _alpm_runscriptlet(const char *root, const char *installfn, /* this code runs for the parent only (wait on the child) */ pid_t retpid; int status; - retpid = waitpid(pid, &status, 0); + while((retpid = waitpid(pid, &status, 0)) == -1 && errno == EINTR); if(retpid == -1) { _alpm_log(PM_LOG_ERROR, _("call to waitpid failed (%s)\n"), strerror(errno)); diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index b26c9702..da3463b0 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -254,7 +254,8 @@ int _alpm_lckmk() _alpm_makepath(dir); FREE(dir); - fd = open(file, O_WRONLY | O_CREAT | O_EXCL, 0000); + while((fd = open(file, O_WRONLY | O_CREAT | O_EXCL, 0000)) == -1 + && errno == EINTR); return(fd > 0 ? fd : -1); } diff --git a/pactest/pmtest.py b/pactest/pmtest.py index 39f4deab..7bb32812 100755 --- a/pactest/pmtest.py +++ b/pactest/pmtest.py @@ -197,9 +197,7 @@ class pmtest: cmd.append("fakeroot") fakechroot = which("fakechroot") - if not fakechroot: - print "WARNING: fakechroot not found, scriptlet tests WILL fail!!!" - else: + if fakechroot: cmd.append("fakechroot") if pacman["gdb"]: diff --git a/pactest/tests/scriptlet001.py b/pactest/tests/scriptlet001.py index 54a46aae..ff7fcd20 100644 --- a/pactest/tests/scriptlet001.py +++ b/pactest/tests/scriptlet001.py @@ -14,3 +14,7 @@ self.args = "--debug -U %s" % p1.filename() self.addrule("PACMAN_RETCODE=0") self.addrule("PACMAN_OUTPUT=" + pre) self.addrule("PACMAN_OUTPUT=" + post) + +fakechroot = which("fakechroot") +if not fakechroot: + self.expectfailure = True diff --git a/pactest/tests/scriptlet002.py b/pactest/tests/scriptlet002.py index dd792b82..cc316a10 100644 --- a/pactest/tests/scriptlet002.py +++ b/pactest/tests/scriptlet002.py @@ -14,3 +14,7 @@ self.args = "--debug -R %s" % p1.name self.addrule("PACMAN_RETCODE=0") self.addrule("PACMAN_OUTPUT=" + pre) self.addrule("PACMAN_OUTPUT=" + post) + +fakechroot = which("fakechroot") +if not fakechroot: + self.expectfailure = True diff --git a/src/pacman/callback.c b/src/pacman/callback.c index 59b40643..92a31f16 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -137,11 +137,9 @@ static void fill_progress(const int bar_percent, const int disp_percent, } printf("]"); } - /* print percent after progress bar */ + /* print display percent after progress bar */ if(proglen > 5) { - /* show total download percent if option is enabled */ - int p = config->totaldownload ? disp_percent : bar_percent; - printf(" %3d%%", p); + printf(" %3d%%", disp_percent); } if(bar_percent == 100) { @@ -435,6 +433,7 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) int len, wclen, wcwid, padwid; wchar_t *wcfname; + int totaldownload; off_t xfered, total; float rate = 0.0, timediff = 0.0, f_xfered = 0.0; unsigned int eta_h = 0, eta_m = 0, eta_s = 0; @@ -450,6 +449,12 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) /* only use TotalDownload if enabled and we have a callback value */ if(config->totaldownload && list_total) { + totaldownload = 1; + } else { + totaldownload = 0; + } + + if(totaldownload) { xfered = list_xfered + file_xfered; total = list_total; } else { @@ -462,8 +467,7 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) if(file_xfered == 0) { /* set default starting values, ensure we only call this once * if TotalDownload is enabled */ - if(!(config->totaldownload) - || (config->totaldownload && list_xfered == 0)) { + if(!totaldownload || (totaldownload && list_xfered == 0)) { gettimeofday(&initial_time, NULL); xfered_last = (off_t)0; rate_last = 0.0; @@ -500,7 +504,7 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) file_percent = (int)((float)file_xfered) / ((float)file_total) * 100; - if(config->totaldownload && list_total) { + if(totaldownload) { total_percent = (int)((float)list_xfered + file_xfered) / ((float)list_total) * 100; @@ -581,7 +585,11 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) free(fname); free(wcfname); - fill_progress(file_percent, total_percent, getcols() - infolen); + if(totaldownload) { + fill_progress(file_percent, total_percent, getcols() - infolen); + } else { + fill_progress(file_percent, file_percent, getcols() - infolen); + } return; } diff --git a/src/pacman/package.c b/src/pacman/package.c index fddce94a..71be2d8c 100644 --- a/src/pacman/package.c +++ b/src/pacman/package.c @@ -135,9 +135,11 @@ void dump_pkg_full(pmpkg_t *pkg, int level) /* Print additional package info if info flag passed more than once */ if(level > 1) { dump_pkg_backups(pkg); - printf("\n"); } + /* final newline to separate packages */ + printf("\n"); + FREELIST(depstrings); } diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 155f8da0..afe4ae44 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -36,6 +36,7 @@ #include /* uname */ #include /* setlocale */ #include /* time_t */ +#include #if defined(PACMAN_DEBUG) && defined(HAVE_MCHECK_H) #include /* debug tracing (mtrace) */ #endif @@ -211,21 +212,34 @@ static void cleanup(int ret) { exit(ret); } +/** Write function that correctly handles EINTR. + */ +static ssize_t xwrite(int fd, const void *buf, size_t count) +{ + ssize_t ret; + while((ret = write(fd, buf, count)) == -1 && errno == EINTR); + return(ret); +} + /** Catches thrown signals. Performs necessary cleanup to ensure database is * in a consistant state. * @param signum the thrown signal */ static RETSIGTYPE handler(int signum) { - if(signum==SIGSEGV) - { - /* write a log message and write to stderr */ - pm_printf(PM_LOG_ERROR, _("segmentation fault\n")); - pm_fprintf(stderr, PM_LOG_ERROR, - _("Internal pacman error: Segmentation fault.\n" - "Please submit a full bug report with --debug if appropriate.\n")); + int out = fileno(stdout); + int err = fileno(stderr); + if(signum == SIGSEGV) { + const char *msg1 = "error: segmentation fault\n"; + const char *msg2 = "Internal pacman error: Segmentation fault.\n" + "Please submit a full bug report with --debug if appropriate.\n"; + /* write a error message to out, the rest to err */ + xwrite(out, msg1, strlen(msg1)); + xwrite(err, msg2, strlen(msg2)); exit(signum); } else if((signum == SIGINT)) { + const char *msg = "\nInterrupt signal received\n"; + xwrite(err, msg, strlen(msg)); if(alpm_trans_interrupt() == 0) { /* a transaction is being interrupted, don't exit pacman yet. */ return; @@ -233,7 +247,7 @@ static RETSIGTYPE handler(int signum) /* no commiting transaction, we can release it now and then exit pacman */ alpm_trans_release(); /* output a newline to be sure we clear any line we may be on */ - printf("\n"); + xwrite(out, "\n", 1); } cleanup(signum); } @@ -262,11 +276,13 @@ static void setlibpaths(void) cleanup(ret); } if(!config->dbpath) { - snprintf(path, PATH_MAX, "%s%s", alpm_option_get_root(), DBPATH); + /* omit leading slash from our static DBPATH, root handles it */ + snprintf(path, PATH_MAX, "%s%s", alpm_option_get_root(), DBPATH + 1); config->dbpath = strdup(path); } if(!config->logfile) { - snprintf(path, PATH_MAX, "%s%s", alpm_option_get_root(), LOGFILE); + /* omit leading slash from our static LOGFILE path, root handles it */ + snprintf(path, PATH_MAX, "%s%s", alpm_option_get_root(), LOGFILE + 1); config->logfile = strdup(path); } } diff --git a/src/pacman/util.c b/src/pacman/util.c index fd0d38c7..b80b09ad 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -59,7 +59,7 @@ int trans_init(pmtranstype_t type, pmtransflag_t flags) return(0); } -int trans_release() +int trans_release(void) { if(alpm_trans_release() == -1) { pm_fprintf(stderr, PM_LOG_ERROR, _("failed to release transaction (%s)\n"), @@ -69,7 +69,7 @@ int trans_release() return(0); } -int needs_transaction() +int needs_transaction(void) { if(config->op != PM_OP_MAIN && config->op != PM_OP_QUERY && config->op != PM_OP_DEPTEST) { if((config->op == PM_OP_SYNC && !config->op_s_sync && @@ -85,7 +85,7 @@ int needs_transaction() } /* gets the current screen column width */ -int getcols() +int getcols(void) { if(!isatty(1)) { /* We will default to 80 columns if we're not a tty @@ -252,7 +252,7 @@ void indentprint(const char *str, int indent) { wchar_t *wcstr; const wchar_t *p; - int len, cidx; + int len, cidx, cols; if(!str) { return; @@ -267,6 +267,7 @@ void indentprint(const char *str, int indent) if(!p) { return; } + cols = getcols(); while(*p) { if(*p == L' ') { @@ -283,7 +284,7 @@ void indentprint(const char *str, int indent) while(q < next) { len += wcwidth(*q++); } - if(len > (getcols() - cidx - 1)) { + if(len > (cols - cidx - 1)) { /* wrap to a newline and reindent */ fprintf(stdout, "\n%-*s", indent, ""); cidx = indent; diff --git a/src/pacman/util.h b/src/pacman/util.h index cdb12bd6..64168587 100644 --- a/src/pacman/util.h +++ b/src/pacman/util.h @@ -37,9 +37,9 @@ #define UPDATE_SPEED_SEC 0.2f int trans_init(pmtranstype_t type, pmtransflag_t flags); -int trans_release(); -int needs_transaction(); -int getcols(); +int trans_release(void); +int needs_transaction(void); +int getcols(void); int makepath(const char *path); int rmrf(const char *path); char *mbasename(const char *path);