apport (0.108) hardy; urgency=low [ Martin Pitt ] * apport-{gtk,qt,cli}: Fix handling of file references added by package hooks. (LP: #205163) * backends/packaging_rpm.py: Fix dependency resolution of uname(*) in the RPM backend. Thanks to Patryk Zawadzki! (LP: #213018) * backends/packaging_rpm.py: Fix RPM platform parsing, thanks to Patryk Zawadzki! (LP: #213015) * po/de.po: Fix typo (missing space). * debian/apport.default: Disable Apport for the final Hardy release, since it is less useful in stable releases, and drains a lot of CPU and I/O power on crashes. Disabling it here instead of in update-notifier/adept is more discoverable and more centralized. [ Daniel Hahler ] * bin/apport-retrace: catch the same exceptions from Report.load() like ui.load_report() does (LP: #211899) * Fix uncaught exceptions in apport itself (LP: #215929): - apport/REThread.py: check if "sys" exists in the except block of REThread.run() - apport_python_hook.py: check if "sys" exists in the finally block of apport_excepthook * cli/apport-cli: Fix UnboundLocalError in ui_present_crash, which rendered apport-cli useless (for reporting crashes) (LP: #216151) -- Martin Pitt Wed, 16 Apr 2008 12:24:32 +0200 apport (0.107) hardy; urgency=low * cli/apport-cli: Add translator comment for difficult string. (LP: #210948) * Update German translations. * po/Make{vars,file}: Remove the --language=python option again, since it breaks extracting strings from the glade. intltool-update currently does not seem to have a way to tag a file as "language python", so add an ugly workaround: Create temporary .py symlinks for gtk/apport-gtk & friends, and have intltool extract them. * apport/ui.py: Disallow filing a bug without specifying a package or a PID. Update debian/local/ubuntu-bug.1 accordingly (apport-cli manpage was already correct). (LP: #210348) -- Martin Pitt Sun, 06 Apr 2008 11:44:38 -0600 apport (0.106) hardy; urgency=low [ Martin Pitt ] * apport/crashdb_impl/launchpad.py: Fix spelling mistake in p-lp-bugs API (now corrected there). * apport_python_hook.py: Catch IndexError for invalid sys.argv[0], too. (LP: #204940) * apport/ui.py: Add test_run_report_bug_unpackaged_pid() test case which reports a bug against a pid which belongs to an unpackaged program. This reproduces LP #203764. * apport/report.py: Drop add_hooks_info() assertion on nonexisting Package field, return silently instead. This conforms to the behaviour of the other add_*_info() functions and avoids nasty error handling. * apport/ui.py: Generate proper error message when calling with -f -p PID and PID belongs to an unpackaged program. (LP: #203764). [ Sebastien Bacher ] * po/Makevars: add the --language=python xgettext option so the translations template is correctly updated on build since cdbs is using intltool-update directly and not the corresponding makefile target -- Martin Pitt Tue, 01 Apr 2008 16:02:46 +0200 apport (0.105) hardy; urgency=low * apport/crashdb_impl/launchpad.py: Ignore ValueErrors when subscribing a team, since these are usually due to the team already being subscribed. * apport/report.py, anonymize(): Be robust against empty user names and only anonymize fields which can potentially contain user specific data. (LP: #195706) * backends/packaging-apt-dpkg.py, get_architecture(): Return 'unknown' instead of None if package architecture cannot be determined. (LP: #198548) * apport/ui.py, run_crash(): Intercept other IOErrors, too (such as EISDIR) and print out proper error message instead of crashing. (LP: #201819) * apport_python_hook.py: If the Python script has mutilated sys.argv so that even sys.argv[0] does not exist any more, fall back into readlink()ing /proc/pid/exe and gracefully handle the failure of that, instead of crashing in the crash handler (ugh). Add test case. (LP: #198183) -- Martin Pitt Tue, 18 Mar 2008 23:04:57 +0100 apport (0.104) hardy; urgency=low [ Martin Pitt ] * apport/crashdb_impl/launchpad.py, get_source_version(): re-escape the package name so that it doesn't stumble over '+' and similar characters. * apport/ui.py tests: assert that ProcEnviron is also included into bug reports where we do not have a PID, since having the local information is interesting and important (and acceptable in terms of personal information). * apport/report.py: Split out method add_proc_environ() for getting ProcEnviron, so that we can call it separately. * apport/ui.py, run_report_bug(): Add ProcEnviron if we do not have a pid to file a bug against. This way, bugs filed against packages or distro also get locale information. (LP: #198514) * apport/fileutils.py, mark_report_seen(): Do not crash if the file does not exist any more, because it was removed underneath us. (LP: #199932) * apport/ui.py, test_collect_info_exepath(): Add a tuple argument and a CompressedValue to the test report. This reproduces LP #199349. * apport/report.py, anonymize(): Only work on string values. (LP: #199349) * apport/ui.py: If a report has a field "Ignore", entirely ignore the report without even presenting an explanatory error dialog (as "UnsupportableReason" does). Document this in doc/package-hooks.txt. (LP: #198863) * debian/control: Bump Standards-Version (no changes necessary). * debian/control: Fix wrongly spelt project names (Python and GTK+). Thanks to lintian's scrutiny. * gtk/apport-gtk-mime.desktop.in, qt4/apport-qt-mime.desktop.in: Add a main category. [ Kees Cook ] * apport/report.py: fix module license checking logic (LP: #199927). - nonfree_modules: being unable to find a module should not mean the module is non-free. - test_module_license_evaluation: check modinfo reporting. * problem_report.py: Skip atime test case if file system is mounted noatime. -- Martin Pitt Thu, 13 Mar 2008 14:01:30 +0100 apport (0.103) hardy; urgency=low * bin/apport-unpack: Print error messages instead of crashing for problems like nonexisting file names passed as arguments. (LP: #185273) * backends/packaging-apt-dpkg.py, is_distro_package(): Explicitly check site for "ppa", so that we do not automatically file bugs for PPA packages. This works around Soyuz bug LP #140412 for the time being. * apport/report.py: Add standard_title() test cases for Python crashes with a custom message, and a custom message with newlines. The latter reproduces LP #190947. * apport/report.py, standard_title(): Do not rely on a fixed position of the topmost function; use iteration and regular expression matching instead. (LP: #190947) * apport/ui.py, parse_argv(): Specify that --pid/-P argument must be an integer, to avoid exceptions when it's not. (LP: #193494) * apport/report.py: Use uname -srm, not -a, to hide the hostname. (part of LP #192786); also use os.uname() instead of calling the system program. * problem_report.py(): Make write() work for reports with CompressedValues. Add test case. * apport/ui.py: Add test case test_run_crash_anonymity() which asserts that the crash dump does not contain strings which can identify the user, such as the user name, login name, host name, and current directory. * apport/report.py: Add method anonymize() which replaces user specific strings with generic ones. * apport/ui.py, thread_collect_info(): Call anonymize() on the report. (LP: #192786) * bin/apport-retrace: Only update a bug report with new attachments if it is not a duplicate. (LP: #172792) * bin/apport-retrace: Print out proper error message instead of an exception if trying to do write operations to the bug tracker without specifying a cookie file. (LP: #146423) -- Martin Pitt Mon, 25 Feb 2008 17:47:13 +0100 apport (0.102) hardy; urgency=low [ Martin Pitt ] * problem_report.py: Support reading reports with legacy zlib compression in 'retain compressed values' mode (as used nowadays by apport when reporting a crash). Add a test case, too. (LP: #129616) * debian/control, debian/rules: Switch from python-support to python-central, and use 'nomove' option so that apport works during upgrades, too. (LP: #121341) * debian/rules: Use dh_icons instead of dh_iconcache. * debian/apport.init: Do not stop apport in any runlevel (LSB header). * apport/ui.py, run_crash(): Catch zlib.error on invalidly compressed core dumps. (LP: #176977) * apport/ui.py: Give a meaningful error message instead of crashing if the package for a crash report is not installed any more. (LP: #149739) * apport/ui.py: Do not include ProcCmdline in bug reports, since these are not ack'ed by the user and might contain sensitive data. (LP: #132800) * apport/ui.py: Add various test cases for crash reports whose packages have been uninstalled between the crash and the report. This reproduces LP #186684. * apport/ui.py, load_report(): Produce proper error message if executable/interpreter path do not exist any more. (LP: #186684) * cli/apport-cli: Intercept SIGPIPE when calling sensible-pager, to avoid crash when quitting it prematurely. (LP: #153872) * bin/apport-checkreports: Print out a list of program names/packages which have a pending crash report. (LP: #145117) * apport/ui.py, run_argv(): Add return code which indicates whether any report has been processed. * cli/apport-cli: If no pending crash reports are present, say so and refer to --help. (LP: #182985) * apport/ui.py: Waive check for obsolete packages if environment defines $APPORT_IGNORE_OBSOLETE_PACKAGES. Document this in the apport-cli manpage. (LP: #148064) [ Daniel Hahler ] * .crash file integration for KDE3 (LP: #177055) - debian/apport-qt.install: install added files qt4/apport-qt-mime.desktop and qt4/apport-qt-mimelnk.desktop * Fixed minor warnings/errors from desktop-file-validate in gtk/apport-gtk-mime.desktop.in and qt4/apport-qt.desktop.in (LP: #146957) -- Martin Pitt Wed, 06 Feb 2008 12:55:53 +0100 apport (0.101) hardy; urgency=low * debian/control: Add python-xdg dependency to apport, since apport-cli needs it. (LP: #177095) * apport/ui.py: Add test case for reporting a report which has been preprocessed by apport-retrace, i. e. has a stack trace, but no core dump any more (reproducing LP #185084). * apport/ui.py, run_crash(): Do not reject reports which have a stack trace, but no core dump. (LP: #185084) * apport/report.py: Fix test_add_gdb_info_load() test case, the temporary executable was already deleted when gdb ran the second time. -- Martin Pitt Wed, 23 Jan 2008 17:48:06 +0000 apport (0.100) hardy; urgency=low * bin/crash-digger: Add option --log for logging to a file, and --pidfile/--stop for daemonization. Add test cases to test-crash-digger. * bin/apport: Do not re-raise exceptions about failure to create the lock file, to avoid crashing in the case that another apport instance tries to lock at exactly the same moment. (LP: #147237) * apport/report.py testsuite: Check that our methods get along with binary data which turn into CompressedValue objects after loading them from a file. This reproduces LP #148305. * problem_report.py, CompressedValue: Add method splitlines() since we need it very often. Add test case to test_compressed_values(). (LP: #148305) * problem_report.py: Add test case to check that update() works and does the right thing with binary values and overwriting. This confirms that importing a dictionary works. * debian/local/setup-apport-retracer: Update for hardy. * apport/crashdb_impl/launchpad.py: get_source_info() does not work any more due to HTML changes in Launchpad, and not showing the component any more on /distro/+source/package. Since we do not actually need component and release name any more, rename it to get_source_version(), fix the regular expression to just get the version, and adapt get_fixed_version() accordingly. * debian/local/setup-apport-retracer: Update default apt sources to http://ddebs.ubuntu.com. * apport/ui.py: Robostify cleanup of forked test processes. * apport/ui.py: Sleep for 0.5 seconds after creating the test process in the test suite to give /proc some time to settle down. * bin/apport: Drop evaluation of CORE_* environment variables and mandate calling with . Drop the now obsolete apport/elfcore.py. Adapt test-apport accordingly. * debian/apport.init, use-local: Now call apport with %p, %s, and %c kernel macros (since 2.6.24). Drop Edgy support from init script. -- Martin Pitt Fri, 21 Dec 2007 02:18:48 +0100 apport (0.99) hardy; urgency=low * cli/apport-cli, qt4/apport-qt: Fix typo 'send' -> 'sent'. (LP: #139288) * apport_python_hook.py: Add user info, too. Also add check for this to the test suite. (LP: #145109) * apport/ui.py, run_crash(): Show a proper UI error message instead of just crashing with an exception if the crash report is inaccessible for the invoking user. (LP: #146464) * apport/crashdb_impl/memory.py: Implement mark_retraced(), get_unretraced(), and get_dup_unchecked() for completeness, and define _MemoryCrashDBTest also when not running file as __main__. This makes the class useful for higher-level test suites. Add test cases for the new functions. * apport/crashdb_impl/memory.py: Support 'dummy_data' option which adds a few dummy crashes by default. This is useful for external test suites which cannot otherwise pre-fill the in-memory db. Add checks that this works properly. * bin/crash-digger: Use self.log() more consistently, and flush stdout in log(), so that we do not lose logs on output redirection. * Add test-crash-digger: Initial test suite for bin/crash-digger. * apport/ui.py, run_crash(): Intercept CRC errors from the info collection thread, which happens on broken core dumps. (LP: #132212) * cli/apport-cli, ui_present_package_error(): Fix running of dialog, so that reporting package problems with apport-cli actually works. (LP: #136369) * apport/ui.py, run_crash(): Intercept ENOSPC and present a proper error message. (LP: #145100) * gtk/apport-gtk.glade: Fix title of upload progress window to comply to HIG. Thanks, Bruce Cowan. (LP: #144782) * qt4/apport-qt: Fix Unicode <-> UTF-8 conversion. Thanks, Daniel Hahler! (LP: #148177) * apport/ui.py: Only import xdg.DesktopEntry when a .desktop file has been found in the affected package. This avoids the dependency on servers with just apport-cli. Thanks, Matthias Gug! (LP: #130013) * apport/fileutils.py: Do not fail if there are no packages installed which have one or several .desktop files. Thanks, Matthias Gug! -- Martin Pitt Sun, 28 Oct 2007 18:32:07 -0400 apport (0.98) gutsy; urgency=low [ Martin Pitt ] * debian/local/setup-apport-retracer: launchpadBugs -> launchpadbugs (recently renamed Python package in python-launchpad-bugs). * apport/crashdb_impl/launchpad.py, test examples: Do not duplicate to bug #1, that generates a huge amount of spam. Use another test bug. * apport/crashdb_impl/launchpad.py, download(): Use Bug.description_raw, since LP mangles spaces in .description. Bump p-lp-bugs dependency. * apport/crashdb_impl/launchpad.py, close_duplicate(): Explicitly set the duplicate after removing attachments, since the new LP does not allow any modification of duplicate bugs. * bin/crash-digger: Only consolidate the duplicate DB when -i is given (i. e. usually only on one running instance). [ Colin Watson ] * Use bugs.launchpad.net for +filebug and +bugs requests. (LP: #138090) -- Martin Pitt Mon, 01 Oct 2007 14:35:07 +0200 apport (0.97) gutsy; urgency=low [Martin Pitt] * problem_report.py: Coerce CompressedValue.__len__() to return an int to work on Python 2.4, too. * debian/local/setup-apport-retracer: Adapt ddeb apt source for the move from ~pitti to ~ubuntu-archive. [Markus Korn] * port to new python-launchpad-bugs API. [Daniel Holbach] * small fixes to the port. * debian/control: bumped python-launchpad-bugs Depends to >= 0.2.2. -- Daniel Holbach Tue, 04 Sep 2007 11:24:28 +0200 apport (0.96) gutsy; urgency=low * Create man pages for apport-cli, apport-chroot, and dupdb-admin. * apport/fileutils.py, find_file_package(): Try to resolve symlinks in the directory path. (LP: #125551) * apport/crashdb_impl/launchpad.py, debian/local/setup-apport-retracer: Use packaging.get_system_architecture() (which is dpkg --print-architecture on Debian/Ubuntu) instead of uname, so that this does the right thing on lpia. * problem_report.py, write_mime(): Use base64 encoding for gzipped attachments, to not screw up mail servers. Thanks to Tim Yamin for this patch! * apport/crashdb.py: Drop the last argument (-1), since it is the default anyway and did not yet exist on Python 2.4. -- Martin Pitt Tue, 21 Aug 2007 14:11:48 +0200 apport (0.95) gutsy; urgency=low * general-hooks/automatix.py: Remove hashbang, it's not an executable script. * apport/report.py: Support system-wide blacklisting: /etc/apport/blacklist.d/. Add test cases. * Add doc/README.blacklist: Document blacklist.d/, install it there in setup.py. * debian/rules: Blacklist wine-preloader, so that we ignore wine crashes until an appropriate way is found to deal with them. (Point 6 of apport-better-retracing spec.) -- Martin Pitt Sat, 11 Aug 2007 18:10:54 +0200 apport (0.94) gutsy; urgency=low * doc/data-format.tex: Some updates to incorporate feedback from Gnome upstream: - Do not talk about "Distributions" any more, but "Operating systems". Gnome is used on non-Linux OSs, too. - Split "DistroRelease:" field into "OS:" and "OSRelease:". - Explicitly mention that CoreDump, StackTrace etc. can also contain minidump output. - Increase document version to 0.2. * apport/report.py, obsolete_packages(): Fix crash when apt does not know an available version of a package. (LP: #128176) * test-apport: Add check that apport aborts immediately if another apport instance is already running. Also test that a symlink attack on the lock file is not possible. * bin/apport: Abort running several apport instances at the same time, by lockf()'ing /var/crashes/.lock and aborting on failure. (LP: #119622) * Add bin/gcc_ice_hook: Script to create an apport report for a gcc ICE (internal compiler exception). Add test cases to test-hooks, and ship it in the 'apport' package. (LP: #125551) * run-tests: In 'local' mode, only explicitly run the apt/dpkg implementation instead of backends/*, since the RPM ones don't have tests yet. * apport/crashdb.py: Add a second optional parameter to upload() to specify an upload progress callback function. Adapt the declarations in the Launchpad and Memory implementations, too. * apport/crashdb_impl/launchpad.py, upload(): Pass upload progress callback handler to launchpadBugs.storeblob.upload(), which supports this since version 0.2~39. Bump dependency to it accordingly. * apport/ui.py, file_report(): Define an upload progress callback handler, pass it to the crashdb upload(), and feed ui_set_upload_progress() with some actual data. (LP: #91521) * problem_report.py: Remove support for reading bz2 compressed binary data. That was only relevant during edgy's development cycle. * apport/report.py, test_add_proc_info(): Fix determination of /bin/zgrep interpreter. * problem_report.py: Switch encoding of binary values from bare zlib to proper gzip format, since this is much more useful when reusing the compressed value. Retain support for zlib-only reports. Add test cases for both old and new encodings, and adapt the other test cases for the new format. Update doc/data-format.tex accordingly. * problem_report.py, write(): Add new permitted 'binary' argument value 'compressed', which retains gzip compressed binary values instead of unpacking them transparently. Add test cases. * problem_report, write_mime(): Eliminate unnecessary usage of StringIO. * problem_report, write_mime(): Make function work for compressed binary values. Add test case. * apport/report.py, add_gdb_info(): Make function work if CoreDump is a compressed value. * apport/ui.py: Load crash report with keeping compressed binaries. This avoids loading the entire uncompressed core dump into memory, and avoids recompressing it all over again for generating the crash database upload MIME document. This greatly speeds up crash reporting, too. (LP: #98562) -- Martin Pitt Tue, 31 Jul 2007 21:32:00 +0200 apport (0.93) gutsy; urgency=low * apport/crashdb.py: Set sqlite connect timeout to two hours, instead of the default 5 seconds. Previously, one retracer always crashed when the other was consolidating the database. * bin/dupdb-admin, command_dump(): Correctly interpret empty version strings as 'fixed in unknown verrsion', not 'unfixed'. * apport/crashdb_impl/launchpad.py: Fix typo in bug comment string. * apport/crashdb_impl/launchpad.py: Add function get_source_info() which parses out release, version, and component from https://launchpad.net/$DISTRO/+source/$PACKAGE. * apport/crashdb_impl/launchpad.py, get_fixed_version(): If a bug is fixed, return the current version (as approximation of the version where the bug was fixed), instead of an empty string (which meant 'fixed in unknown version'). [apport-crash-duplicates spec] -- Martin Pitt Wed, 25 Jul 2007 17:04:27 +0200 apport (0.92) gutsy; urgency=low * bin/crash-digger: Do not crash if duplicate db is locked when attempting to consolidate it. This happens often because in the DC we have two parallel instances (for amd64 and i386). * Move ubuntu-fat-chroot from bin/ to debian/local/, since it is so heavily Ubuntu specific. * debian/local/ubuntu-fat-chroot: Use diversions for the binaries we want to disable, so that chroot upgrades do not trash the modifications. * debian/local/setup-apport-retracer: launchpad-crash-digger -> crash-digger. * bin/crash-digger: Add option -i/--arch-indep-dupcheck to explicitly enable duplicate checking of arch-independent crashes like Python exceptions. We only want to process them on one architecture to avoid scattering the duplicate database. * apport/crashdb_impl/launchpad.py, get_unfixed(): Search for 'apport-crash' tag, not 'apport'. * bin/apport-unpack: Fix format string in error message. * apport/ui.py, __init__(): Intercept ImportError, which can happen for crashes during system upgrades. (LP: #124354) * Add general-hooks/automatix.py: Refuse to send problem reports if automatix is installed. * doc/package-hooks.txt: Do not document UnsupportableReason, since it does not make sense to set it in package hooks (it is checked before calling the hooks). Hooks should use UnreportableReason only. * apport/ui.py, test_run_crash_package(): Check that 'Package' problem reports collect additional information, too. * apport/ui.py, collect_info(): Collect additional information for 'Package' problem reports, too. * Revive preloadlib/: - Remove PIPE_CORE #ifdefs and make them the default. We do not need to support the Edgy kernel patches in this version any more. - Install signal handler for SIGABRT, too. - Read core ulimit, pass it to apport in CORE_REAL_RLIM, and set it to zero for the program, since we do not actually want the kernel to write core files when we pipe the core dump to apport. - test-apport: Pass APPORT_REPORT_DIR to the manually called apport instance in the memory clipping test; otherwise it'll write into /var/crash/, which we do not consider in library mode. * apport/crashdb_impl/launchpad.py, __init__(): Only do the "download bug #2" hack if we actually have an authentication cookie. Thus, do it only on the retracing servers, not on the client side. (LP: #125142) * apport/report.py, crash_signature(): Generate a signature for one-line Python tracebacks, too. This sometimes seems to happen, e. g. LP#124588. (LP: #125020) * apport/crashdb_impl/launchpad.py, update(): Set bug importance to Medium if retracing was successful. (LP: #106379) -- Martin Pitt Tue, 24 Jul 2007 21:50:34 +0200 apport (0.91) gutsy; urgency=low * bin/apport: Remove code that supported the Edgy kernel way of core dump passing. Also factorize the CORE_REAL_RLIM evaluation, since it is likely to change in the near future. * apport/crashdb_impl/launchpad.py, close_duplicate(): Delete some attachments, as specified in apport-crash-duplicates spec, and make the bug public afterwards. * apport/crashdb_impl/launchpad.py, close_duplicate(): If the master bug is already duped to yet another bug, mark the bug to that one instead of the master. * apport/crashdb.py: Split out duplicate_db_last_consolidation() for getting the date (or seconds since) the last consolidation, so that we can use it externally. * apport/crashdb.py: Add duplicate_db_change_master_id() to change the master ID of a crash. Add test case to apport/crashdb_impl/memory.py. * Add bin/dupdb-admin: Initial version of duplicate db CLI app; can dump the db, display consolidation state, and change master bug IDs for now. Ship it in apport-retrace. * apport/crashdb.py, duplicate_db_last_consolidation(): Fix timedelta seconds calculation to actually take the days into account, too. * bin/crash-digger: Fix dumping of dup db after consolidation. * apport/ui.py: - test_run_report_bug_package(): Add test case for calling the UI in bug filing mode with an invalid package name. - run_report_bug(): Do not crash on invalid package name, generate an error message instead. (LP: #123644) * apport/fileutils.py, mark_report_seen(): Do not crash if the file has already been deleted underneath us. (LP: #122347) * apport/ui.py, run_report_bug(): Do not crash if the target process runs as a different user. Print a proper error message instead. Add test case test_run_report_bug_noperm_pid(). (LP: #121121) * apport/fileutils.py, likely_packaged(): Ignore /var/lib/schroot. Add test case. (LP: #122859) * apport/ui.py, open_url(): Intercept weird race condition for os.close() trying to close an already invalidated fd. (LP: #123180) Merge the fedora branch, thanks to Will Woods : * Add apport.init.fedora: Fedora specific init script. * Add apport.spec: RPM build recipe. * Add backends/packaging_rpm.py: Partial implementation of the packaging backend for RPM which applies to all RPM-based distros. * Add backends/packaging_fedora.py: Concrete packaging backend implementation for Fedora. * apport/elfcore.py: Classes for parsing general ELF files, and information from core dumps. * bin/apport: Fall back to reading signal number and PID directly from the core file (via elfcore.py) if CORE_SIGNAL and CORE_PID are not defined (i. e. when running on a non-Ubuntu kernel). * crashdb.conf: Add stanzas for Fedora and a 'debug' database which uses the 'memory' crashdb implementation. -- Martin Pitt Sat, 14 Jul 2007 15:08:35 +0200 apport (0.90) gutsy; urgency=low * apport/ui.py, load_report(): Catch IOError, too. LP: #118827 * Merge apport-cli package into apport itself. The program itself is just 3 kB compressed, and it's not worth wasting another 34 kB compressed changelog for this tiny bit. * apport/report.py, obsolete_packages(): Use the version comparison from the packaging system instead of just testing for inequality. This catches zero epochs. Thanks to Will Woods ! * apport/ui.py: Add option -c/--crash-file to run the UI with a particular crash file (which can be anywhere) instead of all pending crashes in /var/crash/. * Add xdg-mime/apport.xml: XDG MIME type definition for .crash files. * Add gtk/apport-gtk-mime.desktop.in: Link text/x-apport MIME type to apport-gtk -c, so that .crash files can be reported with Gnome. * Add debian/apport.links: Install an icon symlink for the MIME type. * apport/ui.py: Do not ask the initial "Do you want to report this?" question when being invoked with --crash-file. * po/POTFILES.in: Add missing cli/apport-cli. * po/de.po: Updated for apport-cli. * cli/apport-cli: Add option for keeping the report file without sending it, and to display its path. This is for sending the report later, copying it from a server to a workstation with internet connection, etc. * apport/crashdb_impl/launchpad.py: Simplify _subscribe_triaging_team(), now that we do not differ between main and universe policies any more. * apport/report.py: Support another hook directory /usr/share/apport/general-hooks/ for scripts which are run for every problem report. This was requested for adding e. g. AppArmor logs, etc. Add test cases. * Add debian/apport.dirs again to ship that hook directory. * doc/package-hooks.txt: Document the general hooks. -- Martin Pitt Tue, 10 Jul 2007 21:10:19 +0100 apport (0.89) gutsy; urgency=low Implement private crash bug handling, according to https://wiki.ubuntu.com/CrashReporting: * apport/crashdb_impl/launchpad.py: - upload(): If we have an Ubuntu bug, mark it as private and only subscribe 'apport' (the 'Apport retracing service' user). - Add function _subscribe_triaging_team() which subscribes ubuntu-crashes-main for source packages in Ubuntu main or restricted, or ubuntu-crashes-universe for other packages. It does not touch non-Ubuntu bugs, since these are not marked private by default and are outside of the scope of this spec. - update(), _mark_dup_checked(): Call _subscribe_triaging_team(). - Note: This entire spec is a gross hack, and Ubuntu derivatives do not benefit from it at all. We have to live with this until LP grows a real crash database. - get_distro_release(): Make this function work with private bugs, too, by using p-lp-bugs' safe_urlopen(). Bug fixes: * apport/crashdb_impl/launchpad.py: Revert simplification change of 0.85: BugList returns a set of strings, not integers; due to non-identity they do not work with the usual set operations. * apport/crashdb_impl/launchpad.py: Add function get_source_component() to query Launchpad for the component of a given distribution and source package. (This will be required for implementing crash-reporting). * backends/packaging-apt-dpkg.py, _search_contents(): Package list is actually comma separated, only take the first item. This fixes retracing of e. g. #124139. * backends/packaging-apt-dpkg.py, _search_contents(): Fix package name parsing for non-main components. This fixes retracing of e. g. #124111. * apport/report.py, _read_maps(): Revert ptrace hack when maps cannot be read. maps file is now protected based on process ownership, not ptracing. * apport/crashdb.py, apport/crashdb_impl/launchpad.py, apport/crashdb_impl/memory.py: Remove official interface mark_dup_checked(), as it should only be an internally used function. Add report parameter, since we will need it there in the future. Remove explicit call from bin/crash-digger and instead change check_duplicate() to call it on its own. * apport/crashdb_impl/launchpad.py, download(): Replace dodgy parsing of fields from the description with proper code, so that multi-line fields are read correctly, too. -- Martin Pitt Fri, 06 Jul 2007 11:19:22 +0200 apport (0.88) gutsy; urgency=low * po/de.po: Update. * backends/packaging-apt-dpkg.py, _search_contents(): Do not check the return value of zgrep. It usually errors out with 'stdout: broken pipe' when called with -m1. * bin/crash-digger: Mark a bug as retraced if DistroRelease: cannot be determined. Those are bugs apport cannot handle. * backends/packaging-apt-dpkg.py, get_source_tree(): Call apt-get source with --assume-yes to not block on VCS confirmations. * apport/crashdb.py: Add interface mark_retrace_failed(). Implement it in apport/crashdb_impl/launchpad.py. * bin/apport-retrace: If retraced report does not have a crash signature, mark it as failed with above new function. Bump python-apport dependency for this. * apport/crashdb_impl/launchpad.py, update(): Delete CoreDump.gz attachment if the retrace was successful (i. e. if the report has a crash signature). * apport/ui.py, test_run_crash(): Set the message box title, text, and severity as assertion message if the run_crash() test fails, so that you know why it fails. This usually happens if libc6 or another dependency of the test crash is out of date. * gtk/apport-gtk.glade: Mark string as translatable. LP: #119621 -- Martin Pitt Tue, 03 Jul 2007 21:38:05 +0200 apport (0.87) gutsy; urgency=low * apport/report.py: - test_gen_stacktrace_top(): Add test case for unwinding a Gnome assertion (g_logv(), g_assert_warning() and similar), see LP #123462. - _gen_stacktrace_top(): Generalize for unwinding multiple functions and a set of function names, and add the Gnome assertion ones. -- Martin Pitt Mon, 02 Jul 2007 11:00:44 +0200 apport (0.86) gutsy; urgency=low * test-apport: Check that apport does not create reports for emtpy core dumps. * problem_report.py: Introduce a fourth optional parameter "fail_on_empty" to file pointer tuples which causes write() to raise an IOError if no data was read. Add test cases. * bin/apport: Enforce non-emptyness of CoreDump. * problem_report.py: Add test case for delayed piping of data passed as file object pointers. This was supposed to explain the reason for getting bugs with zero-byte core dumps, but already works correctly. * apport/report.py, check_ignored(): round the mtime to an int (just like mark_ignore() does), to not get wrong results on file systems that support subsecond file timestamps. This fixes running the test suite on the live CD. * test-apport: Clarify assertion message if /var/crash is not empty. -- Martin Pitt Thu, 28 Jun 2007 19:14:36 +0200 apport (0.85) gutsy; urgency=low * apport/crashdb_impl/launchpad.py: BugList.bugs is already a set, simplify code a bit. * debian/control: Add dpkg-dev dependency to apport-retrace, for getting dpkg-source. * apport/report.py, crash_signature(): Allow ':' and '~' as part of function names to cover C++. Adapt test case to cover this. * apport/report.py test suite: Do not assume that /bin/zgrep uses /bin/sh, it was recently changed to use bash. Directly read the interpreter from the shebang line. * bin/apport-chroot, command_upgrade(): Supply -y to 'apt-get upgrade' also in verbose mode. * bin/apport-chroot, command_upgrade(): Run 'apt-get clean' before regenerating the chroot tarball. * backends/packaging-apt-dpkg.py, get_dependencies(): Fix crash when encountering a virtual package. LP: #122274 * apport/report.py, obsolete_packages(): Do not consider virtual packages as obsolete. * apport/crashdb_impl/launchpad.py: Do a bogus call to Bug() in the ctor. This initializes python-launchpad-bugs to use a cookie for the urlopen in BugList, so that get_unretraced() and get_dup_unchecked() return private bugs, too. This works around LP #122126. -- Martin Pitt Mon, 25 Jun 2007 16:38:43 +0200 apport (0.84) gutsy; urgency=low * apport/crashdb.py: Add new abstract methods: - get_unretraced() and mark_retraced(id) to get a list of crashes that need to be retraced and chalk them off. - get_dup_unchecked() and mark_dup_checked() to get a list of crashes that need to be checked for being a duplicate and chalk them off. This is aimed at crashes which do not need retracing, such as unhandled Python exceptions. * apport/crashdb_impl/launchpad.py: Implement above methods for launchpad (moving the code from bin/launchpad-crash-digger). * apport/crashdb_impl/launchpad.py: Set "need-duplicate-check" tag for Python crashes. * apport/crashdb_impl/launchpad.py, download(): Fetch Traceback.txt, too, so that we can do duplicate checking for Python crashes. * bin/launchpad-crash-digger: Drop Launchpad specific code and replace it with calls to above new functions. Rename to bin/crash-digger. Also rename all 'cookie' to 'auth' (as happened with the other applications earlier). * bin/crash-digger: Do duplicate checking for needs-duplicate-check crash bugs (such as Python crashes). * bin/apport-retrace, bin/crash-digger: More language cleanup; we should stop talking about 'bugs' and use 'crash' consistently. -- Martin Pitt Thu, 14 Jun 2007 19:50:24 +0200 apport (0.83) gutsy; urgency=low * apport/crashdb.py: Separate abstract from implemented functions. * apport/crashdb.py, apport/packaging.py, apport/ui.py: Use NotImplementedError instead of Exception in the abstract methods. * apport/packaging.py: Add interface compare_versions() for comparing package version numbers. * backends/packaging-apt-dpkg.py: Implement compare_versions() using apt.VersionCompare(), add some test cases. * apport/report.py: Fix typo: 'none' -> 'None'. * apport/chroot.py: Do not include /usr/local/lib and /usr/lib in LD_LIBRARY_PATH, just /lib, so that we still use the libc from outside, but e. g. libxml2 from inside the chroot. https://blueprints.launchpad.net/ubuntu/+spec/apport-crash-duplicates: Merge crash-dups branch, which implements automatic crash duplicate detection: * apport/crashdb.py: Add methods for crash duplicate detection. * apport/crashdb_impl/memory.py: Change internal data management to track fixed version and duplicates. * apport/crashdb_impl/memory.py: Add a test suite for all methods, including the duplicate detection API of the base CrashDatabase (since it is much easier to test it here, on an actual implementation). * debian/pyversions: Bump minimal Python version to 2.5, since this starts providing the sqlite3 module. * apport/crashdb_impl/launchpad.py: Implement new methods required for crash duplicate detection. get_fixed_version() does not approximate version tracking yet; it just returns '' for fixed bugs (which means 'fixed, but unknown version'). Bump python-launchpad-bugs dependency for this to ensure the availability of Bug.mark_duplicate(). * bin/apport-retrace: Add option --duplicate-db which specifies the path to the duplicate sqlite database and enables duplicate detection. * Abin/apport-chroot: Add option --duplicate-db. If a file is given, symlink it into the chroot and pass --duplicate-db to apport-retrace. * bin/launchpad-crash-digger: Add --duplicate-db and pass it to apport-chroot. * apport/crashdb.py: Track last run of duplicate_db_consolidate() in an extra table and add a method duplicate_db_needs_consolidation() which returns True if the last run was more than a given number of seconds ago. Add test cases to apport/crashdb_impl/memory.py. * bin/launchpad-crash-digger, fill_pool(): Check whether the duplicate database needs consolidation (i. e. updating the bug states to the reality in the bug tracker) and if so, trigger it. -- Martin Pitt Wed, 13 Jun 2007 13:09:57 +0200 apport (0.82) gutsy; urgency=low * Add bin/ubuntu-fat-chroot: Script to install a set of commonly needed packages into a minimal Ubuntu chroot (as created by apport-chroot). This requires some hacking of postinst and /usr/sbin/ files in between the installation stages and thus deserves a script on its own. * apport/packaging.py: - Add "uninstalled" option to get_file_package(). If set to True, this will do an expensive search of files/packages which are not installed. - Add interface "set_mirror(URL)" for functions which need to retrieve packages and data from distribution mirrors. * backends/packaging-apt-dpkg.py: Implement "uninstalled" option and "set_mirror(URL)", add test cases. * bin/apport-retrace: Use "uninstalled" option now to install packages and corresponding -dbgsyms for uninstalled files mentioned in ProcMaps (Point 1 of apport-better-retracing spec). Bump python-apport dependency. * apport/packaging.py: Add interface get_available_version(package). * backends/packaging-apt-dpkg.py: Implement get_available_version(), add shallow test case. * apport/report.py: Add function obsolete_packages() to return packages in Package: and Depends: which are not up to date. Add test cases. * apport/ui.py, thread_collect_info(): For crashes, call obsolete_packages() and set UnreportableReason: if there are any (Point 2 of apport-better-retracing spec). * apport/ui.py, thread_collect_info(): call standard_title() and add it to the report as 'Title' field. This is useful if reporters modify the default title (per request of Brian Murray, thanks). Add test case. * apport/ui.py: Fix declaration of the test suite's ui_set_upload_progress(). Funny that this has never been triggered before. * apport/report.py, add_gdb_info(): Split out StacktraceTop generation into separate funtion _gen_stacktrace_top(), so that we can test it separately. * apport/report.py, _gen_stacktrace_top(): Step back from the crashed program's own signal handlers, since those are generally not useful for the purposes of StacktraceTop and only impede duplicate matching (Point 4 of apport-better-retracing spec). Add various test cases. * apport/report.py: Add method crash_signature() to calculate an unique identifier of a signal or Python crash, to be used for duplicate detection. Add various test cases. * apport/packaging.py: Add interface get_source_tree() to fetch and unpack a source package to a given directory, optionally specifying a particular version. * backends/packaging-apt-dpkg.py: Implement get_source_tree(). This has a rather crude 'call apt-get source and guess about directories' implementation until python-apt learns about doing this directly and more elegantly (see LP #118788). * bin/apport-retrace: Add gen_source_stacktrace() and a few helper functions to construct a field 'StacktraceSource' with the source code around the affected lines in the stack trace (as available). (Point 5 of apport-better-retracing spec). * apport/crashdb_impl/launchpad.py, update(): Attach StacktraceSource to the bug if it exists. * apport/crashdb_impl/launchpad.py: Check PackageArchitecture for 'all', to not set a retracer tag 'need-all-retrace'. * test-apport: Clarify assertion failure message when an unexpected core dump is present. * apport/report.py, get_module_license(): Do not iterate over Popen.stdout, use communicate() instead. The latter is already fixed to not trip over SIGINTR. (LP: #118965) -- Martin Pitt Fri, 08 Jun 2007 07:47:04 +0200 apport (0.81) gutsy; urgency=low * apport/report.py: Remove '[apport]' default bug title prefix. (LP: #94819) * apport/crashdb_impl/launchpad.py: Tag new bugs with 'apport-'. This replaces the former '[apport]' prefixing. * debian/local/setup-apport-retracer: Specify a path in '.' command and use sh again. Yay for me needing three attempts before actually RTFMing how '.' works (which is really nasty and strange IMHO). * bin/apport-chroot: Fix symlinks before repackaging the chroot tarball in 'install' and 'installdeb' modes. * debian/local/setup-apport-retracer: Install python-libxml2 and python-apt. * bin/launchpad-crash-digger: Supply --auth instead of the deprecated --cookie to apport-chroot. * bin/apport-chroot: Fix identifier name in command_retrace(). * debian/local/setup-apport-retracer: Set APPORT_CRASHDB_CONF to the local crashdb.conf. * bin/apport-chroot: Unset APPORT_CRASHDB_CONF for login and retrace. * bin/launchpad-crash-digger: Check the release of a bug and whether we have a chroot for it before untagging it. This avoids loosing tags for bugs we do not yet have a working retracer chroot for. * bin/apport-retrace: Do not abort with an exception if package installation fails. Give a proper error message instead and point to -u. (LP: #115681) * apport/crashdb_impl/launchpad.py, update(): Create a temporary directory and use proper file names for the new attachments. With TemporaryFile(), attachment file names ended up as ''. (LP: #115347) * apport/report.py, add_os_info(): Add field 'NonfreeKernelModules' which lists loaded kernel modules which do not have a FOSS license. This is particularly helpful for quickly checking for restricted graphics drivers. (LP: #103239) * apport_python_hook.py: Move the apport.* imports into the try: block and move the likely_packaged() test to the top, to avoid importing apport.report and creating a Report object for non-packaged scripts. This makes the entire code more efficient and robust against errors in the apport modules. (LP: #109955) * apport/report.py, add_gdb_info(): Intercept OSError from gdb invocation (which might be segfaulting itself) and just do not put any gdb output into the report. The automatic retracers can try their luck again. (LP: #112501) * bin/apport-retrace: Fix handling of packages which are still known to /var/lib/dpkg/status, but do not have an apt record any more; treat them like virtual packages and just issue a warning instead of falling over. (LP: #107474) * Add doc/data-format.tex: Documentation of the structure, encoding, and standard keys of the Apport report file format. [apport-for-upstreams blueprint] * Add doc/Makefile: Build and clean rules for generating data-format.pdf. * debian/rules, setup.py: Call doc/Makefile and install the PDF documentation. Add texlive-latex-recommended build dependency for that. -- Martin Pitt Thu, 24 May 2007 19:39:12 +0200 apport (0.80) gutsy; urgency=low Collect all Launchpad specific bits in a separate class and provide an abstract base class. This will greatly help for getting upstream acceptance and the possibility of automatically forwarding crashes upstream (apport-for-upstreams specification): * Add apport/crashdb.py: Abstract crash database interface. This also offers a factory function get_crashdb() which reads a configuration file to find the default crash database to be used. * Add ./crashdb.conf: Crash database configuration file, for Ubuntu on Launchpad. Modify setup.py and debian/python-apport.install to ship it in python-apport. * Add apport/crashdb_impl/memory.py: Simple in-memory implementation of crash database interface for testing. * Add apport/crashdb_impl/launchpad.py: Launchpad implementation of crash database interface. * apport/ui.py: Drop LP specific bits and move towards new CrashDatabase interface. * apport/ui.py, test suite: Do not overwrite file_report() any more, but use the memory CrashDatabase. This will test the actual file_report() implementation and allows the test suite to check the precise value of opened URLs. * apport/{report,ui}.py: Move UserInterface.create_crash_bug_title() and its test cases to Report.standard_title(). It is much more appropriate there and can be used in the retracer as well. * bin/apport-retrace: Drop LP specific bits and move to CrashDatabase interface. Remove the --remove-tag option, we really should not have it here; remove it from man/apport-retrace.1 as well. * bin/apport-chroot: Drop --remove-tag option here, too. * bin/apport-chroot: Drop LP specific bits and move to CrashDatabase interface. * bin/launchpad-crash-digger: Remove retracing tag directly instead of passing --remove-tag to apport-chroot. This is a much cleaner design and avoids infinitely looping on some weirdly failing retraces. * debian/control: Bump some python-apport dependencies for the API changes. Some debranding: * setup.py: Use apport wiki home page for 'url'. * Remove 'X-Ubuntu-Gettext-Domain' from *.desktop.in, since langpack.mk will add it automatically now. * *.desktop.in: Remove 'in Ubuntu' from comment. * cli/apport-cli, qt4/apport-qt: Generalize window titles. Other fixes: * po/de.po: Update. * debian/local/setup-apport-retracer: Revert back 'source' to '.' and use bash instead of sh. POSIX sh does not seem to have a 'source' command. -- Martin Pitt Mon, 21 May 2007 19:25:31 +0200 apport (0.79) gutsy; urgency=low * debian/local/setup-apport-retracer: Fix '.' bashism, replace it with 'source'. * problem_report.py, write_mime(): Drop preamble argument, replace it with an extra_headers dictionary. This is much easier to evaluate on clients. * apport/ui.py: Convert to new write_mime() interface from above. This finally automatically tags bugs with need-$ARCH-retrace. Bump p-problem-report dependency of python-apport for this. * apport/report.py: Change example URLs in the testsuite from launchpad to an artificial ones to avoid the impression that it is LP specific. * backends/packaging-apt-dpkg.py: Formally make this a subclass of apport.packaging.PackageInfo. * debian/control: Use code.lp.net instead of bazaar.lp.net VCS URL. * bin/kernel_hook: Fix/improve the collected information: - Read /proc/modules instead of lsmod. - Fix lspci argument: -n instead of -m. - Add /proc/cmdline. * debian/rules: Use langpack.mk for updating the .desktop files. * Add po/Makevars to specify the domain, to make intltool figure out the gettext domain automatically. * bin/kernel_hook, ./test-hooks: Do not rely on /proc/version_signature any more, it's gone in the gutsy kernel. -- Martin Pitt Mon, 21 May 2007 15:55:10 +0200 apport (0.78) gutsy; urgency=low * apport/packaging.py, backends/packaging-dpkg.py: Add new interface is_distro_package(package) which verifies the origin of a given package. Move the dodgy hack from apport/ui.py to the backend, where it belongs to. Also add a test case. * debian/control: Add python-apt dependency to python-apport. * debian/control: Remove debianutils dependency, it's essential. * Drop backends/packaging-dpkg.py. It had some hackish usage of python-apt anyway, since some things just cannot be figured out with dpkg alone. Since we have to give up on that idea, implement a new clean packaging backend 'packaging-apt-dpkg.py' which now uses python-apt and dpkg in a clean way. * apport/report.py, add_gdb_info(): Fix crash when Stacktrace could not be created. (LP: #107853) * ./test-apport: Check that crashes create a core dump (with proper ulimits) when an unseen crash report exists already. This reproduces LP #105976. * bin/apport: Create core dump file if aborting because an unseen crash report already exists. (LP: #105976) * apport/ui.py: Add a comment for translators. (LP: #104703) * apport/ui.py, load_report(): Also catch zlib.error on invalid reports. (LP: #103547) * apport/report.py: Add method has_useful_stacktrace() to determine whether the stack trace can be considered useful. The current heuristic is to consider it useless if it either is shorter than three lines and has any unknown function, or for longer traces, a minority of known functions. Add test cases. * gtk/apport-gtk, qt4/apport-qt, cli/apport-cli: Do not offer 'reduced report' option if the stack trace is useless. (LP: #87430) Bump the python-apport dependencies of the frontend packages to ensure that we have has_useful_stacktrace(). -- Martin Pitt Sat, 5 May 2007 17:53:42 +0200 apport (0.77) gutsy; urgency=low * apport/report.py: Replace any() call with a list comprehension to work with Python < 2.5. (LP: #104864) * apport/report.py: Move the ctypes import to the one place where we actually need it, and do not entirely fail if they do not exist (such as in Python 2.4). It is only required for non-default Feisty kernels anyway. (LP: #107662) * apport/chroot.py: Fix test suite to work with Python 2.4's tarfile module output format. * debian/local/setup-apport-retracer: Generalized some feisty specific bits, set default release to gutsy. -- Martin Pitt Mon, 23 Apr 2007 12:22:17 +0200 apport (0.76) feisty; urgency=low * Move python_hook.py out of the apport module to apport_python_hook.py, so that it does not inflict the expensive import of all apport related modules to every python program. Adapt module prefixes accordingly. (LP: #105764) * setup.py, debian/python-apport.install: Install apport_python_hook.py into the python-apport binary package. * apport/ui.py test suite: Unset locale related environment variables so that the tests which check strings are not invalidated by translations. -- Martin Pitt Thu, 12 Apr 2007 11:47:50 +0200 apport (0.75) feisty; urgency=low * apport/report.py, add_proc_info(): Chop off /rofs/ prefix from ExecutablePath, so that crashes work on the live system, too. Arguably a kernel bug, but probably too hard to fix at this time. (LP: #102909) * backends/packaging-dpkg.py, get_modified_files(): Ignore empty lines in broken .md5sums file rather than crashing on them. (LP: #102906) -- Martin Pitt Wed, 4 Apr 2007 21:51:28 +0200 apport (0.74) feisty; urgency=low * debian/apport-{gtk,qt}.install: Do not install .desktop files for now, until we get a proper guided bug reporting. * problem_report.py, write_mime(): Do not re-compress keys which already end in .gz. Add test cases. * test-hooks: Add a (dodgy) test case for calling package_hook on an uninstalled package. After all, this is very likely to happen for installation errors. This reproduces #97636. * backends/packaging-dpkg.py, get_source(): Add a similarly dodgy fallback to apt if the queried package is not installed. This needs to be generalized and cleaned up later, but now is the time for unintrusive small patches. (LP: #97636) * test-apport: Do not fail on non-empty gdb stderr if it only consists of a single warning (as happens on powerpc). * apport/report.py, test_check_interpreted(): Run gedit test on an actually existing file, reproducing the interpreter confusion reported in #102056. * apport/report.py, _check_interpreted(): Add a whitelist of common interpreters and check ExecutablePath against it. (LP: #102056) * apport/ui.py: Ignore SystemError exceptions from apt, which happen on badly formatted source.list entries. (LP: #98901) * apport/ui.py: Fix crash on None candiateOrigin from the apt cache object. (LP: #98961) * gtk/apport-gtk.glade: Add window titles to progress and details dialogs. (LP: #97640) -- Martin Pitt Wed, 4 Apr 2007 14:44:08 +0200 apport (0.73) feisty; urgency=low * problem_report.py, write(): Allow a third optional argument in tuple values, which specify a maximum file size. Above it, the entire key gets removed. Add testsuite checks for all boundary cases. * bin/apport: Limit core dump size to 75% of usable RAM (MemFree+Cached-Writeback). This should avoid trashing people's boxes hard on huge core dumps. Bump dependencies on python-problem-report. Create an expensive, but realistic check for this in test-apport. (LP: #71560) * apport/ui.py, run_crash(): If a signal crash report does not have a core dump, explain that the computer has too little memory for an automatic analysis/report of the crash. Add test suite check. -- Martin Pitt Thu, 29 Mar 2007 23:38:23 +0200 apport (0.72) feisty; urgency=low [ Martin Pitt ] * bin/apport-chroot, command_create(): Install gpgv. * bin/apport-retrace: Fix error handling in fetch_unpack(). * Move apport-retrace.1 manpage from package apport to apport-retrace. Bump Conflicts/Replaces accordingly. * bin/launchpad-crash-digger, apport/ui.py: Remove the special case 'powerpc'->'ppc' and use need-powerpc-retrace uniformly. * debian/control: Add XS-Vcs-Bzr: header. * apport/ui.py: Fix wrong parameter name in help message. * Another grammar fix, thanks to Brian Murray! [ Michael Hofmann ] * debian/local/ubuntu-bug: Try to use apport-cli, if we do not have a $DISPLAY, or neither Gnome nor KDE are running. * debian/control: Recommend elinks, since it is the only text browser so far that works with Launchpad (see #59510) * Add debian/apport-cli.README.Debian: Describe how to integrate apport-checkreports and apport-cli into .bashrc for crash notification on servers. * qt4/apport-qt: Fix undefined symbol in ui_present_package_error(). (LP: #97282) -- Martin Pitt Thu, 29 Mar 2007 11:41:39 +0200 apport (0.71) feisty; urgency=low * cli/apport-cli, qt4/apport-qt: Fix bad grammar 'some minutes'. (LP: #95296) * problem_report.py, write_mime(): Add optional 'preamble' parameter. Add test case. * apport/ui.py, upload_launchpad_blob(): Set need-$ARCH-retrace tag in MIME preamble. Bump p-problem-report dependency. (LP: #94790) * bin/apport-retrace: In verbose mode, display the path of currently extracting deb. * bin/apport-retrace: Do not fall over errors of dpkg -x (which happens e. g. on udev, where it cannot unpack /dev, since this is a symlink to the real /dev). Merely print out a warning about it. * apport/ui.py, run_report_bug(): Ignore ENOENT from add_proc_info(). This happens if the user closes the application prematurely, so that /proc/pid does not exist any more. Add test case. (LP: #95954) * backends/packaging-dpkg.py, get_modified_files(): Ignore lines in .md5sums files which contain a NUL byte. This Should Not Happen™, but nevertheless did. (LP: #96050) * apport/ui.py, doc/package-hooks.txt: Check for a field "UnreportableReason: " and display an information box that the current crash cannot be reported because of . Add test case. Document the new field. * apport/ui.py: Check package origin, compare it to DistroRelease:, and report crash as unreportable if they do not match. This particularly saves the user from uploading large reports for e. g. opera crashes, and avoids filing Ubuntu bugs from Debian installations. (LP: #75513) -- Martin Pitt Mon, 26 Mar 2007 18:01:24 +0200 apport (0.70) feisty; urgency=low [ Martin Pitt ] * bin/apport-retrace: Add option --remove-tag to remove a Launchpad bug tag. This is intended for an automatic Malone crash retracing system. * debian/control: Bump python-launchpad-bugs dependency to ensure that we have Bug.[gs]et_metadata(). * man/apport-retrace.1: Add documentation for --confirm and --remove-tag. * bin/apport-chroot: Add option --remove-tag and pass it to apport-retrace. * apport/chroot.py, fix_symlinks(): Convert chroot path prefixed absolute symlinks to relative symlinks to avoid fakechroot's weird handling of absolute symlinks. * Add bin/launchpad-crash-digger: Daemon for watching out for need-$ARCH-retrace tagged Ubuntu bugs in Launchpad and calling apport-retrace on them. * bin/apport-retrace: Mangle bug comment with StacktraceTop to not contain invalid UTF-8, to avoid getting Internal Server Errors from LP. * debian/local/setup-apport-retracer: Install libc6-i686{,-dbgsym} into an x86 chroot, to get sane x86 backtraces for crashes in libc. * debian/local/setup-apport-retracer: - Unpack and install python-launchpad-bugs locally if the package is not installed. - Link launchpad-crash-digger into the retracer's bin/ dir. * run-tests: Run tests with python's -tt flag to catch whitespace errors. * Replace tabs with spaces in all Python files. (LP: #93561) * Remove trailing white space in all Python files. * apport/report.py, add_proc_info(): Do not regard symlinks to executables as interpreted scripts any more (such as Debian alternatives). Add test case. (LP: #94732) * problem_report.py: Add new method get_new() which returns a set of all keys which have been added since load() or construction. Add test cases. * problem_report.py: Add optional parameter only_new to write(), which writes only the get_new() keys. Add test case. * apport/ui.py: Remember currently processed report file and update it with the added information, so that it becomes useful for local evaluation, too. Bump python-problem-report dependency to ensure write()'s only_new availability. (LP: #94678) * apport-chroot: Add forgotten sys.exit(1) after printing the error message about an invalid chroot specification. * apport/ui.py, run_crash(): Check for a field "UnsupportableReason: " and display an information box that the current configuration cannot be supported because of , instead of processing and reporting the crash. Add test case for this workflow. With special regards to our Firefox crash triagers who want to get rid of the hundreds of flash-related crashes. :) * apport/report.py, add_hooks_info(): Use execfile() instead of __import__(), since package names might conflict with module names already imported into apport's namespace. Also search for hook named after the source package name (prefixed with 'source_'). Add test cases. * bin/apport-chroot: When specifying --save for login, only save the tarball if the exit status is 0. * bin/apport-chroot, create: Install /usr/sbin/policy-rc.d to disable init scripts. * bin/apport-chroot: Fixed command function selection to not abort with 'unknown command' if the DistroRelease: was unknown. * bin/apport-retrace: Replace --no-purge with --no-dpkg. With this option, do not call dpkg --unpack any more, but dpkg -x, to avoid any fchmod() and other calls which cause problems in fakechroots. * bin/apport-retrace: Fix ordering of version numbers in warning message. * doc/package-hooks.txt: Add some examples, document source package hook. [ Kees Cook ] * apport/report.py, add_proc_info(): If reading /proc/pid/maps fails, ptrace() the target process to make it readable (proposed security improvement in future kernels). * bin/apport-retrace: Fix crash for packages unknown to the apt cache. * apport/report.py, add_gdb_info(): Limit maximum backtrace depth to 2000 to avoid infinitely looped stacks and gdb crashes. (LP: #94455) This also caps the maximum size of information that we add to reports. (LP: #92653) * bin/apport-retrace: Add option -R/--rebuild-package-info, so that apport-retrace works on unprocessed crash dumps in /var/crash. * Some grammar corrections. * Add package-hooks/source_apport.py: Package hook for apport itself. Include /var/log/apport.log and the status of files in /var/crash. [ Michael Hofmann ] * Add cli/apport-cli, setup.py, debian/apport-cli.install, debian/control: Add command line user interface. * apport/ui.py, format_filesize(): Use MiB and GiB instead of MB and GB; these are the official units. Adapt test cases. * apport/ui.py, collect_info()/file_report(): Do not raise an exception on KeyboardInterrupt in the subthreads. * apport/ui.py, open_url(): Do not use gtk.MessageDialog(), but ui_error_message(), and fix error passing so that the message is displayed in the parent thread. * apport/ui.py, open_url(): Check that $DISPLAY is set before considering the KDE/Gnome web browsers. -- Martin Pitt Mon, 26 Mar 2007 09:41:03 +0200 apport (0.69) feisty; urgency=low * apport-chroot: Add command 'installdeb' to conveniently install a bunch of .debs into a chroot. * apport-chroot: Fix 'login' and 'upgrade' commands to not require specifying a chroot map when giving a chroot tarball path as argument. * test-apport: Check that core dumps are written for packaged programs as well, if ulimits want them. (Test for #92029) * bin/apport: Call write_user_coredump() for packaged program crashes and SIGABRT as well. (LP: #92029) -- Martin Pitt Mon, 19 Mar 2007 17:37:23 +0100 apport (0.68) feisty; urgency=low [ Michael Hofmann ] * qt4/apport-qt: Fix taskbar entry, remove an unused method. * qt4/error.ui: Fix icon spacing. [ Martin Pitt ] * apport-retrace: Add option --confirm to display the retraced stack traces and ask for confirmation before uploading them as LP bug attachments. (LP: #91878) * apport-chroot: Add option --confirm-attach; if given, call apport-retrace with --confirm. -- Martin Pitt Thu, 15 Mar 2007 00:05:18 +0100 apport (0.67) feisty; urgency=low * debian/local/setup-apport-retracer: Add apt sources for restricted, universe, and multiverse, too. * po/de.po: Update from Rosetta. * apport/report.py: Remove undefined call to error_log() in _command_output(), replace it with raising proper exceptions. * bin/apport-retrace: Fix 'numer' typo. (LP: #91680) * test-apport: Check that non-packaged executables generate a core dump on SIGABRT, too (test case for bug #92029). * bin/apport: Move check for ignoring SIGABRT below the core dump file writing for non-packaged binaries. (LP: #92029) * gtk/apport-gtk.glade: - Remove titles from the progress windows to comply with Gnome HIG and not repeat the text content. - Improve wording a bit. - LP: #92114 * gtk/apport-gtk{,.glade}: Fix signal handler name of the Cancel button in the upload progress dialog, so that it actually works. (LP: #92115) -- Martin Pitt Wed, 14 Mar 2007 17:34:57 +0100 apport (0.66) feisty; urgency=low * Remove apport/MultipartPostHandler.py, this functionality moved to python-launchpad-bugs now. Add a dependency to that package. * apport/ui.py, upload_launchpad_blob(): Use the shiny new launchpadBugs.storeblob.upload(). * bin/apport-retrace: Attach retraced stack traces back to the Launchpad bug report if no other output option is given (This corresponds to the in-place editing when a report file is specified). Add option --cookie to specify a Mozilla-style cookie file for the necessary Launchpad authentication. * man/apport-retrace.1: Document above apport-retrace changes. * bin/apport-chroot: Add --cookie option: temporarily symlink cookie into the chroot and pass it to apport-retrace in retrace mode. -- Martin Pitt Sat, 10 Mar 2007 15:01:57 +0100 apport (0.65) feisty; urgency=low * debian/local/setup-apport-retracer: - Replace grep-dctrl with grep call, since grep-dctrl is not installed in all the DC chroots. - Do not download apport source from archive.u.c., instead require that this script lives in the unpacked apport source tree. * bin/apport-chroot: Use apt-get options -y and --allow-unauthenticated when installing additional packages. * bin/apport-chroot: Handle --extra-package for 'upgrade', too, to provide a simple way of adding a package to an existing chroot tarball. * debian/local/setup-apport-retracer: Create tarball chroots by default. It only imposes a negligible overhead, and sharing unpacked directories with multiple people is just too brittle. * bin/apport-retrace: Add option --no-purge to not purge unpacked packages after retracing. This is (only) useful with temporarily unpacked chroots, since it's only a waste of time there. * bin/apport-chroot: Call apport-retrace with --no-purge when retracing in a chroot tarball. * apport/chroot.py: Add fix_symlinks() method to remove the chroot root directory prefix from symbolic links; they prevent function of tarball chroots and moving around directory chroots. Add test case. * bin/apport: Fix symlinks after creating and upgrading a chroot. * bin/apport-chroot: Add option --save to update a tarball after logging in to it. -- Martin Pitt Sat, 10 Mar 2007 21:21:25 +0100 apport (0.64) feisty; urgency=low * bin/apport-chroot: Add 'login' command. * bin/apport-chroot: Install apport-retrace into a newly created chroot. * Add debian/local/setup-apport-retracer: Script to install local versions of apport, debootstrap, fake{,ch}root libraries, and a feisty apport fakechroot. This works OOTB on ronne's amd64 and i386 feisty chroots. The script is not shipped in any package yet, but it's convenient to ship it in revision control and in the source. * apport/report.py, _check_interpreted(): When calling an interpreter with a script name as argument, set ExecutablePath to the script instead of the interpreter. Add test case. (LP: #88794) * apport/report.py, search_bug_patterns(): Catch all exceptions from urlopen(), not just IOError. Sometimes this fails with funnier errors. (LP: #89589) * bin/apport-retrace: Give some additional explanation when installing packages fails. (LP: #89916) * apport/fileutils.py, get_all_{system_,}reports(): Fix file access race condition. (LP: #89977) * bin/apport-retrace: Add option -p/--extra-package to install an additional package for retracing. May be specified multiple times. Document new option in man/apport-retrace.1. (LP: #90077) * bin/apport-chroot: Add a similar option -p/--extra-package and install those in the 'create' command and simply pass it to apport-retrace in the 'retrace' command. (LP: #90077) * bin/apport-chroot: Add a -v/--verbose option. * bin/apport-retrace: Do not complain about missing ddebs for Arch: all packages. -- Martin Pitt Tue, 6 Mar 2007 16:20:41 +0100 apport (0.63) feisty; urgency=low New feature: fakechroot support for apport-retrace * bin/apport-retrace: - Simplify program design and throw away the complicated debug symbol sandbox generation, along with the -d and -C options. Instead, directly install the missing packages and ddebs with apt. This makes the tool more suitable for running in chroots and has often been requested anyway. - Add option -u/--unpack-only which causes additionally installed packages to be unpacked without being configured and purged again after retracing. This allows apport-retrace to work under fakechroot and has the nice side effect of speeding up package installation (we do not care about configuration for retracing anyway). * man/apport-retrace.1: Update description for the new behaviour, drop documentation of the -d and -C options, and add documentation of -u. * Add apport/chroot.py: Class for representing and working with chroots; this uses the fakeroot and fakechroot libraries when being called as non-root. * Add bin/apport-chroot: CLI frontend for doing various things with chroots (including fakeroot/fakechroot support from the Chroot class). For now, this implements: - create a chroot (tarball or directory) - dist-upgrade a particular or all chroots - apport-retrace a bug or Apport report file * setup.py: Ship apport-chroot in scripts directory. * Add a new package apport-retrace which ships apport-retrace and apport-chroot and carries all the heavier dependencies (binutils, python-launchpad-bugs, python-apt, etc.). Drop the latter two dependencies from the apport package. This allows us to install the apport-retrace package in fakechroots (not possible with apport itself) and avoid unnecessary dependencies on normal desktop installations. -- Martin Pitt Mon, 5 Mar 2007 11:20:36 +0100 apport (0.62) feisty; urgency=low * apport/ui.py, collect_info(): Use REThread instead of Thread and raise exceptions from it, so that errors during info collection actually become visible. * apport/report.py, add_proc_info(): Check that ExecutablePath actually exists, so that invalid values from transient error conditions are ignored (such as '/usr/bin/gnome-panel\x00\x00\x8b (deleted)'). * apport/packaging.py: Add interface get_system_architecture() to return the system architecture in the distro specific notation. This can differ from get_architecture(package) on multiarch platforms such as amd64. * backends/packaging-dpkg.py: Implement get_system_architecture() to return dpkg --print-architecture, add a shallow test case. * apport/report.py, add_package_info(): Rename key 'Architecture:' to 'PackageArchitecture:' for clarity. * apport/report.py, add_os_info(): Add system architecture as 'Architecture:' field. * apport/ui.py, create_crash_bug_title(): Append warning about non-native package if package architecture does not match the system's one. * All test suites: Remove redundant word 'behaviour' from test descriptions. * test-hooks: Run tests on installed hooks in /usr/share/apport by default and add a '--local' switch to test the hooks in the source tree instead. Use this option in run-tests. * apport/report.py, test_add_proc_info(): Change the python script test so that it does not depend on being run in the source tree. * run-tests: Add a 'local' command line option which runs tests on the files and modules in the build tree. Run tests on system files/modules by default. * setup.py, debian/apport.install: Ship test-hooks, test-apport, and run-tests in /usr/share/apport/testsuite/, so that the full test suite can be run in the installed system. * gtk/apport-gtk.desktop.in: Only show in Gnome and Xfce. * qt4/apport-qt.desktop.in: Only show in KDE. -- Martin Pitt Thu, 1 Mar 2007 10:43:29 +0100 apport (0.61) feisty; urgency=low * bin/apport: - Kernel 2.6.20-9 now sets CORE_REAL_RLIM to -1 instead of not setting it; handle this case correctly. (LP: #87065) - Add forgotten multiplication of CORE_REAL_RLIM with 1024, since ulimit sets kB, not bytes. -- Martin Pitt Tue, 27 Feb 2007 16:06:11 +0100 apport (0.60) feisty; urgency=low * gtk/apport-gtk.glade: Reintroduce window titles. Since the crash notifications are like alerts, title have been removed recently to comply with Gnome HIG standards, but then the user will get 'nameless window' buttons in the task bar. Let's have the smaller evil then. (LP: #87164) * apport/packaging.py: Add get_architecture() interface for determining the architecture of a particular package (which might not match the overall system architecture on multiarch-capable systems, e. g. an i386 Firefox package installed on amd64). * backends/packaging-dpkg.py: Implement get_architecture() and add test case. * apport/report.py, add_package_info(): Add Architecture: field. (LP: #87424) * apport/ui.py: Already mark report as seen when we load it, not just in the information collection thread. That way, reports will only be shown once on systems which have /var/crash mounted noatime, too. (LP: #85809) * apport/fileutils.py, mark_report_seen(): If os.utime() fails, and opening the report file for reading does not change the atime (happens with noatime mount option), don't throw an exception, just delete the report. (other aspect of LP: #85809) * qt4/apport-qt: Wrap gettext() into an unicode(str, 'UTF-8') call, otherwise all non-ASCII unicode strings are broken. (LP: #87757) -- Martin Pitt Mon, 26 Feb 2007 20:55:40 +0100 apport (0.59) feisty; urgency=low * apport/report.py: Check that interpreter options are discarded in test_check_interpreted_script(). This replicates bug #87005. * apport/report.py, _check_interpreted_script(): Filter out interpreter command line options. This should make the detection of interpreted scripts more robust. (LP: #87005) * test-apport, check_crash(): Differ between expecting the program dumping core and finding a core dump on disk, because this is not equivalent any more with core pipelining. * bin/apport: Write core files into a process' cwd if the process' ulimit requests and permits it and the crashes process is not packaged, so that developers get happy again. Test this behaviour with various ulimits in test-apport. * test-apport: Check that the core file written by apport is valid. This uncovers kernel bugs like #87065 * problem_report.py test suite: Use assertAlmostEqual() when comparing stat times, since they are floats on some systems. * apport/report.py, add_gdb_info(): - Remove all the initial gdb output, which gets rid of the duplicated #0 line. - Replace some stray tabs with spaces. - Thanks to Kees Cook for this! -- Martin Pitt Thu, 22 Feb 2007 19:52:52 +0100 apport (0.58) feisty; urgency=low * qt4/apport-qt.desktop.in move to System menu -- Jonathan Riddell Tue, 20 Feb 2007 11:35:17 +0000 apport (0.57) feisty; urgency=low * apport/ui.py: Intercept ENOMEM and fail gracefully; there is little else we can do at that point, and there is no point in presenting a crash report for this. (LP: #85155) * apport/ui.py: Ignore KeyError when deleting the CoreDump field on sending a reduced report. This Should Not Happen™, but nevertheless did. (LP: #86083) * gtk/apport-gtk, qt4/apport-qt: Intercept ImportError for the non-builtin Python modules. This usually happens for crashes when there is a dist-upgrade active and some Python packages have not been configured yet. (LP: #86007) * apport/ui.py: If the problem report does not apply to a packaged program, and we have an ExecutablePath, mention it in the error message for easier debugging. * apport/python_hook.py: Resolve symbolic links in ExecutablePath. (LP: #85529) * apport/ui.py, open_url(): Remove debugging print statement again, now that we tracked down bug #83974. -- Martin Pitt Mon, 19 Feb 2007 14:40:29 +0100 apport (0.56) feisty; urgency=low * apport/ui.py, open_url(): When being invoked as root, call gnome-open or firefox as root through sudo instead of dropping our uid/gid and calling it normally. The latter does not work for Firefox for some mysterious reason. Thanks to Mika Fischer for this trick. (LP: #81207) * Add debian/local/ubuntu-bug.1: Manpage for ubuntu-bug. Add it to debian/apport.manpages. * qt4/apport-qt: Add some missing features that are present in the GTK UI: - Do not show details by default, add a button to show them. - Add complete/reduced bug report radio buttons. - Thanks to Michael Hofmann for this! -- Martin Pitt Thu, 15 Feb 2007 14:59:07 +0100 apport (0.55) feisty; urgency=low * Add debian/local/ubuntu-bug: Check for a running KDE or Gnome session, availability of apport-gtk and -qt, and open the appropriate GUI in bug filing mode. This makes it convenient for shell users and is also required for proper Firefox 'Report a bug...' menu integration (see bug #85041). * debian/apport.install: Install ubuntu-bug to /usr/bin. * gtk/apport-gtk: Generously add some gtk.main_iteration() calls to avoid hanging dialogs, since we do not have a main loop. * apport/ui.py: Do not silently ignore exceptions while uploading data to Launchpad, but intercept them and display their message in the error dialog. (Part of LP: #84992) * apport/ui.py: Switch from edge.launchpad.net to production launchpad.net, since the necessary bits are now there. (LP: #84992) -- Martin Pitt Wed, 14 Feb 2007 13:37:52 +0100 apport (0.54) feisty; urgency=low * bin/apport: Re-enable, now that our kernel has been fixed to pipe complete core dumps to us. -- Martin Pitt Tue, 13 Feb 2007 09:33:38 +0100 apport (0.53) feisty; urgency=low * apport/ui.py, open_url(): Remove some accidentally left-over debugging junk. * gtk/apport-gtk: Process pending GTK events after hiding the info collection window to avoid a hanging dead dialog. * gtk/apport-gtk: Do not count the lines of fields with binary data. This particularly avoids long delays with huge core dumps. (LP: #81979) * apport/ui.py, open_url(): Print URL to stdout, so that we can debug the weirdness in #83974. -- Martin Pitt Mon, 12 Feb 2007 16:57:05 +0100 apport (0.52) feisty; urgency=low * apport/report.py: Fix hook directory to be /usr/share/apport/package-hooks/, not /u/s/apport/. * Add doc/package-hooks.txt: Document per-package hooks, ship in package apport. * Add debian/apport.dirs: Ship package-hooks/ directory. * gtk/apport-gtk, qt4/apport-qt: Fix detection of binary data so that the CoreDump is not displayed as incomprehensible gibberish any more. * Add qt4/apport-qt.desktop.in and add it to POTFILES.in. * bin/apport-retrace: --verbose can now be specified multiple times to increase verbosity and debug package installation. Also, fix some quoting bugs. Thanks to Kees Cook for this! * qt4/apport-qt: Fix restart button handling. (LP: #84202) * qt4/apport-qt: Do not try to call splitlines() on a report value that is a file reference; just display the reference instead. (LP: #84196) * bin/apport: Disable for now, since the current kernel produces cropped core dumps and thus we get totally useless crash reports -- Martin Pitt Fri, 9 Feb 2007 18:58:08 +0100 apport (0.51) feisty; urgency=low New feature: Qt4 GUI implementation: * Added qt4/: Qt4 implementation of the abstract user interface. Thanks to Michael Hofmann for that! * debian/copyright: Add Michael as copyright holder. * setup.py, debian/control, debian/apport-qt.install: Packaging bits for apport-qt. * Move translations from apport-gtk to apport, since they are shared between frontends. Add appropriate Conflicts/Replaces (we don't strictly need it here because we strip them anyway, but we need that for the moving icon anyway). * Move icon from apport-gtk to apport, since it is/can be shared between frontends. Improvements: * Replaced old apport.png icon stolen from bug-buddy with nice SVG one. Thanks to Troy Sobotka for this! * debian/copyright: Add Troy as copyright holder for the icon. * bin/apport-retrace, man/apport-retrace.1: Document that report can now be a LP bug number. -- Martin Pitt Thu, 8 Feb 2007 20:01:12 +0100 apport (0.50) feisty; urgency=low * gtk/apport-gtk.glade: Fix 'prolem' typo. * bin/apport-retrace: Use python-launchpad-bugs to create a Report object from a given Launchpad bug number (given as argument instead of the report file path). Add appropriate p-l-b dependency. * gtk/apport-gtk: Mark '(binary data)' string as translatable. -- Martin Pitt Thu, 8 Feb 2007 15:15:47 +0100 apport (0.49) feisty; urgency=low * gtk/apport-gtk.glade: Fix s/send/sent/ typo. Closes: LP#83061 * apport/ui.py, create_crash_bug_title(): Cope with odd Tracebacks that are shorter than three lines. Add test case from the bug. Closes: LP#83556 * apport/python_hook: Do not create a report if the binary is ignored. Add test case. Closes: LP#83566 * gtk/apport-gtk: Do not save/alter crash dialog title any more, it's empty now. * apport/ui.py, open_url(): Check the user's session for ksmserver/gnome-session to decide whether to prefer kfmclient or gnome-open. Also, only call Firefox directly if gconf's prefered browser is actually Firefox. Closes: LP#82007 -- Martin Pitt Tue, 6 Feb 2007 18:33:15 +0100 apport (0.48) feisty; urgency=low New feature: Infrastructure for reporting kernel Oopses: * Add bin/kernel_hook and ship it in /usr/share/apport. The kernel can call this on an Oops. Add a test suite for it to test-hooks. * apport/ui.py: Add support for reporting ProblemType: Kernel reports, and add test suite for the workflow. * gtk/apport-gtk{,.glade}: Add implementation for ui_present_kernel_error(). Improvements: * Merged various apport-retrace improvements from Kees' branch: - Add various options to override some report fields with local values. - Add --verbose option and be quiet by default. - Read ProcMaps for additional library dependencies, to also catch libraries loaded at runtime (plugins). - Set correct debug file directory when starting an interactive gdb session with -g. * Add gtk/apport-gtk.desktop.in: Desktop file for calling apport-gtk in 'file a distro bug' mode, to be displayed in gnome-panel's System menu (see bug-reporting-tool spec). Also add a Makefile to do the intltool-merge dance, add it to POTFILES.in, and ship it in debian/apport-gtk.install. * bin/apport: Call add_os_info(), so that we get architecture information even for 'naked' reports which didn't go through UI enrichment. * Add ./test-hooks: Test suite for the various package hooks shipped with apport. Test the package problem hook for now. Bug fixes: * debian/control: Add missing python-apt dependency to apport (apport-retrace needs it). Thanks to Kees Cook for noticing. * debian/control: Add gdb dependency to python-apport. * backends/packaging-dpkg.py test suite: Verify that packages returned by get_dependencies() actually exist. This catches the 'chops off first letter of package name sometimes' bug. * backends/packaging-dpkg.py, _init_status(): Add missing space to Depends: field format in dpkg-query call. This fixes the chopped-off first letters in the 'Dependencies' report field. * setup.py: Remove version attribute, we do not update and use it anyway. * apport/ui.py: Do not crash if Package: specifies a nonexisting package. Display a proper error message instead. Add test_run_crash_errors() test case. * apport/report.py, add_package_info(): Fix crash when the first dependency is not installed. Closes: LP#82561 * gtk/apport-gtk.glade: Remove window titles in alert dialogs to comply with Gnome HIG. Closes: LP#83123 -- Martin Pitt Mon, 5 Feb 2007 12:19:35 +0100 apport (0.47) feisty; urgency=low * apport/report.py, add_hooks_info(): Only use first part of 'Package:', there might be a version number and a changed files list which we must not propagate to the import statement. Closes: LP#82566 -- Kees Cook Wed, 31 Jan 2007 15:37:11 -0800 apport (0.46) feisty; urgency=low * debian/control: Bump dependencies to python-apport due to recent changes in expected return values in some UI functions. Closes: LP#82267 * bin/package_hook: Remove erroneous 'import apport.packaging', which shadows the packaging variable in the apport package. This unbreaks the package problem hook. Closes: LP#82297 -- Martin Pitt Wed, 31 Jan 2007 07:51:24 +0100 apport (0.45) feisty; urgency=low New feature: Infrastructure for package install/upgrade failures: * Add bin/package_hook: Script for creating a report for a package installation/upgrade failure. It receives a package name, a number of log files, and an ErrorMessage: from stdin. This will be called from e.g. dist-upgrader. * setup.py, debian/apport.install: Ship package_hook. * apport/ui.py: If ProblemType is 'Package', call a new function self.ui_present_package_error() instead of presenting a crash. Add test suite checks for the package error report workflow. * apport/ui.py, create_crash_bug_title(): Create default bug title for package reports. Add various test cases. * gtk/apport-gtk{,.glade}: GTK implementation of ui_present_package_error(). New feature: Maintain a per-binary blacklist to inhibit apport crash reports until the binary changes. Closes: LP#79408 * apport/report.py: Add new Report methods check_ignored() and mark_ignore() to check for/set ignore list entries. Add test cases. * apport/ui.py: Add another return value of ui_present_crash() to specify whether or not to blacklist the current crash's executable. Check workflow of both responses in the test suite. * gtk/apport-gtk{,.glade}: Add a blacklist checkbox to the crash notification dialogs. * bin/apport: Do nothing if the current crash is blacklisted. * test-apport: Test blacklisting. Bug fixes: * gtk/apport-gtk: Fix return code for restarting the application ('reopen' -> 'restart'). Closes: LP#81422 * test-apport: Adapt to new core_pattern kernel interface mode: - Check core_pattern instead of the obsolete crashdump sysctl to determine whether or not apport is running. - Give apport max. 10 seconds to complete. The current kernel reaps the crashed process as soon as writing the core dump to the pipe is finished, but apport still needs to write the report file. - Do not EXFAIL the test for crashes in nonwriteable cwd any more, since it is now supposed to work (we do not write a core dump to the disk any more). * run-tests, use-local: Adapt to new core_pattern kernel interface. * apport: Improve logging of exceptions, include environment variables. * apport/report.py test suite: Use gdb to generate a test core dump, do not rely on kill(SIGSEGV) and the kernel to do it (since we now use a pipe in core_pattern). * backends/packaging-dpkg.py: Fix return value of get_modified_files() if dpkg .list file is missing. * apport/report.py, add_package_info(): Do not produce stray empty lines for uninstalled alternative dependencies. * apport/report.py: Fix test_add_gdb_info_script() to not leave behind a stray gzip process which randomly blocks stdin. Closes: LP#78421 * backends/packaging-dpkg.py: Do not read the dpkg status in the constructor, but lazily initialize it when actually calling a query function. This avoids imposing the dpkg-query overhead for programs that import the apport package without doing package queries (such as any Python program under Ubuntu, due to the Python crash hook). * apport/ui.py, create_crash_bug_title(): - Do not crash on an empty StacktraceTop. Closes: LP#81677 - Do not mention an unknown function name ('??') in the bug title; instead, use the topmost function with a known name, or leave it out at all. - Add test cases for these situations. * apport/report.py, _get_ignore_dom(): Do not throw an error for an empty ignore list file. Code cleanups: * apport/report.py test suite: Refactorize generation of test crash program and core dump generation. * Consistently use 'in'/'not in' instead of find() for substring searches. * Changed the packaging backend import, so that its methods can now be accessed at apport.packaging instead of apport.packging.impl. -- Martin Pitt Sun, 28 Jan 2007 12:34:05 +0100 apport (0.44) feisty; urgency=low Some more 'Need for Speed' optimizations: * backends/packaging-dpkg.py, _check_files_md5(): Also accept a md5sum string in addition to a md5sum file. * backends/packaging-dpkg.py, get_modified_files(): Compare package file's ctime and mtime against the package list file's mtime and only md5sum the files that are newer. This drastically reduces the amount of md5suming (usually to zero) and thus speeds up the information collection. * backends/packaging-dpkg.py: Use a single hackish 'dpkg-query --show *' as a portable variant of 'cat /var/lib/dpkg/status' to pre-fill the status cache with all packages instead of calling dpkg -s on every single package we query. This changes the time for figuring out dependencies and their versions from 'unbearable for many packages' to 'barely noticeable'. New feature: per-package apport hooks to collect additional information: * apport/report.py: Add method add_hooks_info() which executes a function add_info(report) from /usr/share/apport/.py. Also add appropriate test cases. This provides per-package hooks for apport. * apport/ui.py: Call add_hooks_info() in the information collection thread. Bug fixes: * apport/report.py: Add some more test cases for _check_interpreted() for Python scripts. * apport/python_hook.py: Check for a correct ExecutablePath in test_general(). * apport/python_hook.py: Use fileutils.likely_packaged() instead of checking for /tmp and home, so that we ignore stuff in /usr/local, too. Closes: LP#81244 * apport/python_hook.py: If we figure out an ExecutablePath which is not actually an executable, do not create a report. This particularly affects interactive python sessions where sys.argv[0] is empty and thus ExecutablePath ends up being the current directory. Add test cases. Closes: LP#81237 -- Martin Pitt Wed, 24 Jan 2007 17:16:04 +0100 apport (0.43) feisty; urgency=low * apport/ui.py: Add method create_crash_bug_title() to construct a reasonable standard bug title for crash reports, so that the automatic duplicate detection actually has a chance to work. Also add test cases for various signal crashes and an unhandled Python exception. * apport/ui.py, file_report(): Submit a default bug title for crash reports. Closes: LP#79657 -- Martin Pitt Tue, 23 Jan 2007 16:26:40 +0100 apport (0.42) feisty; urgency=low New feature: https://wiki.ubuntu.com/ApportImprovements (kernel interface change): * bin/apport: Support calling without arguments, to support new semantics agreed in the ApportImprovements spec: macro values (in particular, pid and signal number) are passed as environment variables. * preloadlib/libapport.c: Simulate new kernel behaviour described above. * debian/apport.init: Set the kernel's core_pattern sysctl to pipe to apport if the edgy-style 'crashdump-helper' sysctl helper does not exist. Bug fixes: * bin/apport-retrace: Beautify error message when report file is not accessible. Closes: LP#79568 * apport/ui.py: Fix crash in the bug pattern search thread if we could not determine a package name. Closes: LP#77872 * bin/apport: Only unlink the core dump if it still exists. Closes: LP#80866 * gtk/apport-gtk.glade: Fix expand/fill attributes so that the expander gets all the space when resizing the window. Closes: LP#80987 * problem_report.py, write_mime(): Make sure that multi-line values that go to the summary are terminated with a newline. * apport/ui.py: Fix error message invocation for reporting cloakroom upload failure. * problem_report.py, write_mime(): Fix off-by-one comparison of the 'inline text' treshold, so that apport's StacktraceTop field appears in bug summaries. Also fix a corner case in CR line ending handling. Check both things in the test suite. * gtk/apport-gtk: Add missing 'import subprocess.'. Closes: LP#81007 * debian/control: Bump apport's and apport-gtk's dependency to python-apport to make sure that apport.ui is available. Closes: LP#81019 * apport/ui.py: Add missing 'import pwd'. Closes: LP#81033 Minor improvements: * apport/ui.py: Get the cloakroom ticket number from the X-Launchpad-Blob-Token HTTP header instead of parsing the resulting page. -- Martin Pitt Tue, 23 Jan 2007 11:27:20 +0100 apport (0.41) feisty; urgency=low New feature: Use Malone cloakroom for uploading reports. Closes: LP#70919 * gtk/apport-gtk.glade: Redesign bug reporting dialog to have a 'Create bug report' and a 'Cancel' button. Also assign GTK_RESPONSE_* constants to the dialog buttons. Go back to Glade 2 since Glade 3 still sucks too much. * gtk/apport-gtk: Adjust workflow for sending report to Malone cloakroom instead of asking the user to attach the file. Sending is not yet implemented, though. * gtk/apport-gtk: Do not show any dialogs any more when filing a bug. * Add apport/MultipartPostHandler.py: This module provides an urllib2 opener for uploading file attachments to forms over HTTP POST. This module is (C) 2006 Will Holcomb and was taken from http://odin.himinbi.org/MultipartPostHandler.py. (This is a serious hole of the Python standard library IMHO.) * apport/ui.py, file_report(): Upload blob to Malone (edge.launchpad.net for now), retrieve the ticket, and pass it to +filebug. Refactorizations: * gtk/apport-gtk: Major refactorization to use modal dialogs and run() instead of loosely coupled event handlers. * Add apport/ui.py: Abstract frontend which encapsulates the logic, workflow and UI independent bits and provides UI hooks for concrete implementations. This both makes it easy to write more frontends like Qt or CLI, and also makes the code automatically testable. Add an extensive testsuite. * run-tests: Add ui.py testsuite. * gtk/apport-gtk: Port to ui.py's UserInterface (which means moving 1/3 of the code into the new ui_*() methods and throwing away the rest). * Add apport/REThread.py: Enhanced threading.Thread class that can propagate the return value and uncaught exceptions of run() to the calling thread. * apport/ui.py: Get rid of thread_check_bugpatterns() and hackish exception handling, rewrite using REThread. * apport/ui.py, gtk/apport-gtk: Add progress bar to report upload. It is indefinite for now, because neither urllib2 nor httplib support upload progress. Bug fixes: * gtk/apport-gtk.glade: Merged Gnome HIG fixes from Sebastian Heinlein, thank you! * Merge patch from Sebastian Heinlein to properly treat the apport-gtk icon the dh_iconcache way and make it themeable. Thank you! * gtk/apport-gtk: Remove periods from primary dialog texts to comply with Gnome HIG standards. * backends/packaging-dpkg.py, get_file_package(): Process list files in chunks of 100, so that we do not exceed the maximum command line length if there is a large number of packages installed. Closes: LP#64839 * gtk/apport-gtk: Use pgrep with -u instead of pidof for testing whether the crashed process is already running again, so that we do not match processes of other users. Add procps package dependency for this. * gtk/apport-gtk: Only offer to restart programs that are in the $PATH. E. g. /usr/lib/firefox/firefox-bin cannot be called directly. Closes: LP#79623 * apport/report.py: Disassemble 16 instructions instead of 32 bytes to become independent of the instruction size. Thanks to Kees Cook for the patch! -- Martin Pitt Mon, 22 Jan 2007 10:47:33 +0100 apport (0.40) feisty; urgency=low * debian/control: Add missing python-dev build dependency, which is apparently required for 2.5 now. -- Martin Pitt Mon, 15 Jan 2007 11:06:20 +0100 apport (0.39) feisty; urgency=low * Introduce abstract packaging interface and move all dpkg/apt specific bits to a dpkg implementation of this packaging interface (merge apport/abstract-pkg branch): - Add apport/packaging.py: Abstract packaging system query interface. - Add backends/packaging-dpkg.py: dpkg implementation of abstract packaging interface. - run-tests: Run tests of all backends. - apport/fileutils.py, apport/report.py: Port to packaging.py interface. - debian/control: Drop python-apport's 'python-apt' dependency since the backend only uses dpkg now (without measurable performance penalty since it uses internal caching). - debian/rules: Install backends/packaging-dpkg.py as our packaging backend to apport/packaging_impl.py and remove it again on clean. -- Martin Pitt Sat, 13 Jan 2007 15:53:08 +0100 apport (0.38) feisty; urgency=low * Add ./COPYING: GPL license. * debian/rules: Build POT file again. * apport/fileutils.py: Add get_all_system_reports() and get_new_system_reports() and added test cases. Now the test suite can also be run as root to be able to actually check their complete behaviour. Adapt the other tests to get along with running the tests as root. * bin/apport-checkreports: Add option --system to check for system crash reports. Closes: LP#62316 * gtk/apport-gtk: If called through sudo to process system crashes, drop privileges to the original user in open_url() so that we get the web browser correctly. (LP#62316) Caveat: The user cannot actually attach the crash report file directly since it is not accessible to the user; this will get fixed once Malone is able to link a bug report with uploaded blobs. -- Martin Pitt Fri, 12 Jan 2007 14:29:44 +0100 apport (0.37) feisty; urgency=low * problem_report.py: Remove the requirement that values must not contain empty lines. Add test cases that reading and writing values with empty lines works, and add a test case that load() properly complains about empty lines in debcontrol encoding (empty lines in values are encoded with a single space). Closes: LP#78094 * apport/report.py test suite: Do not rely on a particular structure of the 'cat' stacktrace; apparently this is not consistent across architectures. Instead, compile a segfaulting mini C program, let it dump core, and test add_gdb_info() on it instead. This also allows us for a more rigid check of StacktraceTop. -- Martin Pitt Mon, 8 Jan 2007 14:44:08 +0100 apport (0.36) feisty; urgency=low * gtk/apport-gtk.glade: Restore pulse step of progress bar (this apparently got destroyed when saving with Glade 3). * gtk/apport-gtk{,.glade}: Terminate the program properly when closing the progress dialog instead of exiting with an exception. * gtk/apport-gtk: Defer opening of the bug reporting window a bit so that it appears on top of the browser window. Also enable the task bar blinking for it when it is in the background. * gtk/apport-gtk.glade: Restore vertical padding of bug report dialog labels (another Glade 3 transition regression). * bin/apport-retrace, apport/report.py: Call gdb on InterpreterPath if present; calling it on a script does not yield anything useful. Add a test case to report.py. * debian/apport.init: Use mkdir -p instead of install -d, since install is not in /bin. Thanks to Kees Cook for catching this. * debian/control: Add missing python-apport dependency 'python-apt', which is not caught by ${python:Depends}. * gtk/apport-gtk: Catch MemoryError when loading a report and display an error dialog instead of just crashing. Closes: LP#76235 * gtk/apport-gtk: Properly catch exceptions from the bug pattern check thread to avoid useless backtraces like in bug #75160. * gtk/apport-gtk: Catch exceptions from decoding of damaged reports and display an error message instead of crashing. Closes: LP#77149 * apport/report.py: Add missing import of 'time' to test suite. -- Martin Pitt Fri, 5 Jan 2007 09:49:01 +0100 apport (0.35) feisty; urgency=low Optimizations: * apport/fileutils.py: Split out heuristics for determining whether a file belongs to a package to new function likely_packaged() and add test cases. * bin/apport: Do not use the expensive find_file_package() any more, use likely_packaged() instead. This will create initial reports in some corner cases (like custom non-packaged executables in /usr/bin/), but greatly reduces I/O impact at crash time. We rely on apport-gtk to deal with reports that do not actually belong to a packaged executable. * apport/report.py, add_gdb_info(): Call gdb just once and split the output instead of calling it again for each command. This should significantly speed up the gdb stage especially for large programs/core dumps. * Use cStringIO instead of StringIO in modules. * gtk/apport-gtk: Code cleanup and refactorization: - Move iteration over crash reports into __main__ to simplify housekeeping in the ApportGTK class and get rid of some functions. - Refactor creation of temporary report file. * gtk/apport-gtk.glade: Split the text in the progress bar dialog so that we can use it for multiple steps (like uploading data to Malone) while not breaking translations. New feature: Bug reporting tool (https://wiki.ubuntu.com/BugReportingTool) * gtk/apport-gtk: Split out crash report initialization to new function show_crashes() so that we can use the frontend for other purposes like bug reporting. * gtk/apport-gtk: Add --file-bug, --package, and --pid options; if given, create a bug report about the given package instead of viewing crash reports. * gtk/apport-gtk{,.glade}: Generalize some strings to not talk about 'crash' any more, to make them suitable for bug reporting, too. * gtk/apport-gtk: Support --file-bug without specifying a package or a PID for filing generic distro bugs. * problem_report.py: Add new method write_mime() to encode a problem report in MIME/Multipart RFC 2822 format (i. e. an email with attachments). Short values are aggregated into the first inline text/plain part, large values, binary values, and file references get gzip compressed separate attachments. Also add various test cases. Bug/crash information: * apport/report.py, add_user_info(): Add list of system groups that the user belongs to. * bin/apport: Call add_user_info(), check functionality in test-apport. * apport/report.py, add_gdb_info(): Add field 'StacktraceTop' with the top five functions on the stack and no local variables. This reduced 'glimpse' is suitable for inline display in bug reports and automatic processing (dup finders, etc). Bug fixes: * po/Makefile: Add top_srcdir to work with current intltool. * po/de.po: Unfuzz some strings. * apport/report.py, add_gdb_info(): Strip away the 'No symbol table info available' messages from stack traces. * apport/report.py, test_search_bug_patterns(): Use security.u.c. instead of archive.u.c., since the latter times out too often. -- Martin Pitt Wed, 3 Jan 2007 16:45:20 +0100 apport (0.34) feisty; urgency=low * apport/fileutils.py, mark_report_seen(): Do not bail out if os.utime() fails due to access permissions. This happens if the file does not belong to the user calling apport-gtk, but is world-readable (such as ubiquity crash reports). If utime() fails, repeatedly open()/close() the file for reading until atime != ctime, or the 1.2s timeout is reached. Closes: LP#72250 * apport/python_hook.py: Add unit test, call that in run-tests. * apport/python_hook.py: Chmod the generated report to 0600 to not expose potentially private data to the world, and to be consistent with other crash reports. * apport/fileutils.py: Add check_files_md5() and test cases. * apport/report.py, add_package_info(): Append list of modified package files to Package: and Dependencies: value. Closes: LP#70946 * bin/apport-retrace: Get along with Package:/Dependencies: fields with list of modified files. -- Martin Pitt Fri, 22 Dec 2006 12:40:55 +0100 apport (0.33) feisty; urgency=low * debian/rules: Convert to cdbs. This fixes the dh_pysupport invocation along the way, too. * gtk/apport-gtk: Rework web browser invocation: Use kfmclient if available, fall back to firefox-remote, then to webbrowser.open(). Do not call x-www-browser any more since this would block if no running browser was open before. * Drop the apport_utils module (and with it the python-apport-utils package), it became too much of a dumping ground. The report file handling functions now live in apport.fileutils, and the debugging information collectors are now methods of a new 'Report' class (subclass of ProblemReport) in the new apport.report module. Adjust all programs accordingly. * Add debian/python-apport.postinst: Remove old .pyc and .pyo cruft on upgrades to clean up after our broken dh_pysupport invocation in earlier versions, so that the new modules are actually used. * Remove debian/apport.postinst: Those cleanups were only necessary for intra-edgy upgrades. -- Martin Pitt Tue, 19 Dec 2006 01:15:27 +0100 apport (0.32) feisty; urgency=low * apport_utils.py: Filter out "no debugging symbols found" warnings from gdb outputs, and add some tests for this. Thanks to Kees Cook for the patch! * test-apport: Fix AGENTPATH directory when building the preload library (recently moved to bin/). * use-local: Fix path to apport as well (recently moved to bin/). * apport-retrace: Use ldd on InterpreterPath if present; ldd'ing scripts will not get us very far. Closes: LP#72201 -- Martin Pitt Thu, 14 Dec 2006 13:42:58 +0100 apport (0.31) feisty; urgency=low * Move scripts to bin/ in source package. * Add apport/python_hook.py: Default exception handler for Python, to create apport reports for unhandled exceptions. Thanks to Robert Collins for this! Closes: LP#70957 * Add new package python-apport to ship the new Python package 'apport'. This includes the python crash hook for now, but in the near future apport-utils will get redesigned and put into this package, too. * debian/control: apport now depends on python-apport instead of python-apport-utils. * apport_utils.py: Quiesce gdb error messages in test suite. -- Martin Pitt Sat, 25 Nov 2006 12:30:41 +0100 apport (0.30) feisty; urgency=low * test-apport, use-local: Support both kernel 2.6.17 and 2.6.19 sysctl names (crashdump-helper vs. crashdump). * gtk/apport-gtk.glade: Improve dialog title capitalization. Closes: LP#70652. * debian/apport.cron.daily: Immediately exit if /var/crash does not exist. Create /var/crash in debian/apport.init if it does not exist. Closes: LP#71599 * Convert all tabs in Python source code files to spaces to comply to PEP 8. Thanks to Robert Collins for pointing this out. * apport_utils.py, gtk/apport-gtk: Do not pass None to subprocess arguments if report belongs to a non-packaged program. Thanks to Robert Collins for discovering and fixing this! Closes: LP#70942 * debian/apport.init: Change /var/crash permissions to 1777, so that custom crash handlers (in Python/Mono/etc.) can put reports there. -- Martin Pitt Sat, 25 Nov 2006 10:44:33 +0100 apport (0.29) feisty; urgency=low * apport-retrace: Do not crash if a linked library is not a dependency. Closes: LP#65914 * apport_utils.py: - Add test_find_file_package_diversion() selftest to check diversion handling. - find_file_package(): Check for and respect diversions. - Closes: LP#65917 * debian/apport.init, test-apport, use-local: Adapt to 'crashdump-helper' -> 'crashdump' sysctl renaming in 2.6.19. * test-apport: Restore cwd even when failing a test. * problem_report.py, ProblemReport.write(): Support file-like objects as argument of file references to support direct reading from pipes. Add test case test_write_fileobj(). * apport: Support '-' as core file argument, in which case the core will be read from stdin. This paves the way for using Linux 2.6.19's 'pipe core_pattern' feature. Bump python-problem-report dependency to >= 0.29 for this. * apport: Confine permissions of log file to root:adm 0640, just in case. * apport: Temporarily drop real u/gid to target user for the os.access() tests, so that normal users cannot verify the existence of a given inaccessible file. Add comprehensive tests to apport_utils' test suite and test-apport. Thanks to Kees Cook for this patch! * apport_utils.py, find_file_package(): Terminate fgrep options with '--' to avoid problems with funny file names. Thanks to Kees Cook for spotting this! * test-apport: Automatically detect whether ULIMIT_CORE is nonzero, and adapt tests accordingly: check that core still exists after invoking apport, and clean it up. * apport-retrace: Add new mode -g/--gdb which starts an interactive gdb session with the report's core dump. Add this to man/apport-retrace.1, too. * apport-retrace: If -c is given, completely remove the CoreDump field from the report instead of setting it to 'removed'. * test-apport: When using 'lib' mode, point APPORT_LOG_FILE to a temporary file. Print it if the test suite fails. * test-apport: Fix EXFAILure of the 'core dump works for non-writable cwds' test case. * preloadlib: Support -DPIPE_CORE mode which emulates the pipe-in-core_pattern mode of kernel 2.6.19. * test-apport: Build preload library with core piping. No more failed test suite checks in 'lib' mode. -- Martin Pitt Sun, 5 Nov 2006 07:10:30 -0800 apport (0.28) edgy; urgency=low "No core - ignore!" * apport: Do not create a report for crashes which we do not get a core dump for. The reports are useless and only clutter our bug tracker. -- Martin Pitt Mon, 9 Oct 2006 15:22:32 +0200 apport (0.27) edgy; urgency=low * apport: Ignore SIGABRT for now; it's usually signalled from abort() or assertion failures and we only get reports with unusable stack traces for it (see #61938). * gtk/apport-gtk: If gnome-open is not available, fall back to x-www-browser instead of using webbrowser.py, to respect default browser in XFCE. Closes: LP#64209 * apport: use os.nice() instead of executing 'renice'. Thanks to Benoit Boissinot for noticing. * apport_utils.py, find_file_package(): Lower() both strings in the speedup heuristics to match e. g. /usr/bin/Xorg -> xserver-xorg. Thanks to Kees Cook! * apport_utils.py, report_add_package_info(): Do not crash if we encounter a 'None' current version, which can happen with uninstalled alternative dependencies. Thanks to Kees Cook for tracking this down! -- Martin Pitt Fri, 6 Oct 2006 17:15:08 +0200 apport (0.26) edgy; urgency=low * apport-retrace: Clean up code a bit: - Move option parsing to separate function. - Use apport_utils' report_add_gdb_info() instead of duplicating the gdb code. * apport_utils.py, report_add_gdb_info(): Add optional parameter 'debugdir' to specify an alternate debug file symbol root directory. * apport-retrace: Add option -d/--download-debug to automatically download available ddebs, create a temporary debug symbol directory from already installed and downloaded ddebs, and point gdb to use that. Also add option -C/--cache-dir to specify a permanent ddeb cache directory (by default, a temporary one is used). Update the manpage accordingly. * apport-retrace: Make the best out of a report without packaging information (which can happen if the user does not click on 'report bug' in apport-gtk). * apport_utils, report_add_proc_info(): - Move heuristics for detecting interpreted scripts to a separate function to be able to provide separate test cases for it. Check a few more special cases for mono programs. - Make interpreter heuristics even scarier to detect some more mono corner cases (like banshee and beagled-helper). Closes: LP#58859 -- Martin Pitt Wed, 4 Oct 2006 19:10:47 +0200 apport (0.25) edgy; urgency=low * Drop apport-gtk's update-notifier dependency to a Recommends:. * apport_utils.py, report_add_gdb_info(): Add register dump and disassembly of the last 32 bytes, they might be useful to see what's going on sometimes. Thanks to Kees Cook for the idea and the patch. * test-apport, check_crash(): Verify that a crash does not leave a core file behind. (Test for LP#62972) * preloadlib/libapport.c: Do not unlink the core file after calling apport, but set REMOVE_CORE=1 environment instead. This matches the current kernel behaviour. * apport: Register an atexit handler as early as possible for unlinking the core dump if REMOVE_CORE environment is set. Closes: LP#62972 * apport: Set nice level 10 instead of 5. Closes: LP#63099 -- Martin Pitt Mon, 2 Oct 2006 14:21:53 +0200 apport (0.24) edgy; urgency=low The "Need for speed" release -- rrrroarrr! * apport: Remove _copy_shrink_corefile(): While this has an enormous impact on the size of an uncompressed core dump, it only causes a negligible size reduction of the bzip2'ed core, but it needs a lot of I/O resources for large core dumps. * problem_report.py: - Use zlib instead of bzip2 for compressing the binary data (in particular, core dumps). This results in slightly bigger files, but speeds up compression a lot (30 seconds vs. ~2:45 minutes for a Firefox core dump on my slow iBook). Closes: LP#61538 - ProblemReport.read(): Support both bzip2 and zlib compression to be able to read existing reports, too. - Add/Adapt test cases. * Move InformationCollector._get_gdb() from apport to apport_utils.py report_add_gdb_info(), and add a test case for it. * apport_utils.py, report_add_package_info(): Support calling without a package name, then it will be figured out from ExecutableName. Extend test case accordingly. * test-apport: Do not require apport reports to contain gdb, packaging, and OS information, since we are going to move them out of apport. * apport: Do not collect static information. It requires a lot of CPU and I/O resources and slows down the machine a lot, and it can be added to the report later in the frontend. This also gets rid of the entire InformationCollector class, since everything has been moved to apport_utils.py now. Closes: LP#62542 * apport: Do not intercept KeyboardInterrupt as unhandled exception (only useful for command line debugging, though). * problem_report.py: Add test case for appending new data to an existing report, fix write() function to not rely on an existing ProblemType key. * problem_report.py: Add new method ProblemReport.add_to_existing() to update an already existing problem report with new data. Add test case. * apport_utils.py, mark_report_seen(): Use os.utime() instead of open()/read() and a timeout for simpler and faster operation. * gtk/apport-gtk: - Collect gdb/packaging/operating system information when the user chooses to file a bug and update the apport report. - Change the 'Downloading bug patterns...' progress dialog to 'Collecting information about the crash...'. * debian/control: Bumped library dependencies of apport-gtk, added update-notifer dependency. -- Martin Pitt Fri, 29 Sep 2006 15:47:56 +0200 apport (0.23) edgy; urgency=low * apport: Reset signal handler to SIG_IGN in the crash signal handler, to avoid an endless crash/handler loop (noticed during debugging LP#61708). * debian/apport.init: Do not let the script run with set -e, so that do_{start,stop} can deliver their return codes for proper evaluation, instead of immediately existing. Closes: LP#61796 * test-apport: Check that SIGQUIT does not generate a report. (Check for bug #62511). * apport: Ignore SIGQUIT. Closes: LP#62511 -- Martin Pitt Thu, 28 Sep 2006 20:57:38 +0200 apport (0.22) edgy; urgency=low * apport_utils.py, report_add_proc_info(): Make 'interpreted script' detection more general to also work for mono programs. * test-apport: Check that non-packaged scripts do not generate a report. * apport: Call ic.collect_runtime_information() earlier and drop the local /proc/pid/exe examination, so that we get proper script detection. This avoids getting crash reports for non-packaged scripts (see test case change from above). * apport: Do not try to chmod the report file if we could not create it and output to stderr instead (this mainly affects local testing only). * apport_utils.py, find_file_package(): First grep the package lists whose names are a substring of the crashed binary name (or vice versa), to immensely speed up the package name determination in many cases. * apport: Drop the maximum number of consecutive crashes per executable from 5 to 2. 5 creates a too bad user experience and creates the impression that it will never stop. Closes: LP#61078 -- Martin Pitt Tue, 19 Sep 2006 16:16:46 +0200 apport (0.21) edgy; urgency=low * apport: Keep a partially written report with '000' permissions, and only chmod it to 0600 when it is fully written. This stops update-notifier from picking up half-written reports and get activated several times. Closes: LP#59988 * apport: Add the executable path to the first line of logging. * apport: Run the complete code under control of the general exception fallback handler. * debian/apport.default: Increase maximum core size to 200 MB, to also catch Firefox and Evolution core dumps. * apport_utils.py, find_file_package(): Before searching the dpkg database (which is expensive), check if the executable path matches a whitelist of path prefixes. This replaces the weaker blacklist (/tmp and /home) in apport itself. * gtk/apport-gtk: Show a progress dialog while checking for bug patterns and execute report_search_bug_patterns() in a separate thread, so that the UI is not potentially blocked for a long time. * apport: Gracefully abort if we cannot readlink /proc/pid/exe, instead of falling over with an exception. Closes: LP#59993 * debian/rules: Use 'multiuser' instead of 'defaults' for dh_installinit. Clean up the unnecessary rc symlinks in postinst and add appropriate sysv-rc dependency. -- Martin Pitt Thu, 14 Sep 2006 23:16:26 +0200 apport (0.20) edgy; urgency=low * apport: Renice ourself to priority 5 to not slow down the user's processes so heavily. * Add manpages for apport-retrace(1) and apport-unpack(1) and install them into apport. Closes: LP#58463 * problem_report.py: Test attaching two files instead of one in the test_write_file() regression check to assert correct key sorting. * problem_report.py: Alter write() method to sort binary data to the end of the report. This makes reports easier to read, and also shows relevant information more quickly when progressively loading them in a web browser. Adapt regression tests accordingly. * Move setting of ExecutablePath from apport's InformationCollector ctor to apport_utils' report_add_proc_info(), where it belongs to. Check ExecutablePath in apport_utils' regression tests. * apport-unpack: Support '-' as report argument to read from stdin. * apport_utils.py, report_add_proc_info(): - Apply some heuristics to determine whether the crashed process is an interpreted script (check if the Name in /proc/pid/status matches the second /proc/pid/cmdline part, and if that command line argument is an existing executable file). In the case of an interpreted script, set ExecutablePath to the script and InterpreterPath to the actually crashed ELF binary. - Test this with a shell (/bin/zgrep) and a Python (./apport-unpack) script in the test suite. - Closes: LP#58859 * Add debian/apport.logrotate to add a daily 7-step /var/log/apport log rotation. * test-apport: Fix WCOREDUMP() and pidof checks in check_crash(). * apport: Install a signal handler for all 'crashy' signals, which just logs the signal and stack info and exits. This should avoid a crashing apport examining itself, possibly in an endless loop. Closes: LP#58873 -- Martin Pitt Mon, 11 Sep 2006 09:20:18 +0200 apport (0.19) edgy; urgency=low * apport_utils.py: Add function report_search_bug_patterns(): Try to download a package specific bug pattern XML file from a given URL base directory and return the bug URL in case of a match. Also add extensive test suite check. * test-apport: Fix help message. * apport-gtk: Make use of the new report_search_bug_patterns() function and display appropriate instructions on match. Bump python-apport-utils dependency. -- Martin Pitt Tue, 5 Sep 2006 11:31:17 +0200 apport (0.18) edgy; urgency=low The "mating dance for ubiquity" release. * apport-gtk: - Use pidof's -x option in the detection whether the program is already running to correctly handle scripts. - Do not assume the presence of the ExecutablePath key in reports, but gracefully fall back to Package. - If the report specifies an explicit DesktopFile, use that instead of trying to figure it out. - Only created reduced report and show the radio buttons if there are actually removed fields. - Change tooltip of 'reduced report' radio button to be more generic (do not refer to the memory dump, but to 'large items', since this is what apport-gtk currently does). - Support new field 'BugDisplayMode: file | list (default)'. In 'file' mode, display the /+filebug page instead of /+bugs and change instructions accordingly. - Use the ProcCmdline attibute to restart an application; correctly parsing of all the desktop file is just not possible at this point. - Support new field 'RespawnCommand' to use custom respawning command. * problem_report.py: Add method has_removed_fields() to check whether load() skipped any fields due to binary=False. Add test suite check. * apport_utils.py: Fix the quoting in ProcCmdline so that it is fully shell compatible. * run-tests: Check if kernel crash dump helper is active, and if so, run test-apport in kernel mode. * problem_report.py: Support an optional second argument of file references which controls whether or not the file contents will be compressed/encoded (defaults to True for backwards compatibility). Add test suite checks. -- Martin Pitt Fri, 25 Aug 2006 14:01:47 +0200 apport (0.17) edgy; urgency=low * Move packaging information collection from apport to new function report_add_package_info() in apport_utils.py, add test suite check. * Move operating system information collection from apport to new function report_add_os_info() in apport_utils.py, add test suite check. * Move /proc information collection from apport to new function report_add_proc_info() in apport_utils.py, add test suite check, and fix handling of failed /proc/$$/environ reading. * preloadlib/libapport.c: Route gcore's stderr to /dev/null to suppress error messages during the test suite and to become more compatible to the kernel behaviour. * Change apport_utils.py to be a public module and ship it in the new python-apport-utils package, so that other applications like ubiquity can use it easily. * po/de.po: Add new translations to make this complete again. * problem_report.py, apport_utils.py: Prepend UnitTest classes with '_' so that they do not appear in the help() output. * apport_utils.py: Add make_report_path(), which constructs the canonical crash report pathname for a given report. * Add debian/apport.postinst: Remove /usr/share/apport/apport_utils.pyc when upgrading from an earlier version, so that the programs in /usr/share/apport actually use the version from p-apport-utils. -- Martin Pitt Tue, 22 Aug 2006 18:14:00 +0200 apport (0.16) edgy; urgency=low * test-apport: Check that non-packaged binaries do not generate a report. * apport_utils.py: Add find_file_package() to find the package a file belongs to. This uses fgrep /var/lib/dpkg/info/*.list which is much faster than dpkg -S. Also add test suite check. * apport: Use find_file_package() instead of direct dpkg -S call and pass the result to