bustle 0.7.3 → 0.7.4
raw patch · 13 files changed
+622/−78 lines, 13 files
Files
- Bustle/UI.hs +1/−1
- Bustle/UI/AboutDialog.hs +1/−1
- Bustle/UI/DetailsView.hs +45/−13
- CONTRIBUTING.md +4/−1
- NEWS.md +19/−0
- README.md +0/−6
- bustle.cabal +2/−2
- c-sources/bustle-pcap.c +4/−5
- c-sources/pcap-monitor.c +149/−31
- data/bustle.ui +34/−2
- data/org.freedesktop.Bustle.appdata.xml.in +10/−2
- po/en_GB.po +327/−0
- po/messages.pot +26/−14
Bustle/UI.hs view
@@ -343,7 +343,7 @@ let yyyy_mm_dd_hh_mm_ss = takeWhile (/= '.') (show zt) cacheDir <- io getCacheDir- let filename = cacheDir </> yyyy_mm_dd_hh_mm_ss <.> "bustle"+ let filename = cacheDir </> yyyy_mm_dd_hh_mm_ss <.> "pcap" let title = printf (__ "Recording %s…") $ case target of Left BusTypeNone -> error "whoops, this value shouldn't exist"
Bustle/UI/AboutDialog.hs view
@@ -46,7 +46,7 @@ dialog `set` [ aboutDialogName := __ "Bustle" , aboutDialogVersion := showVersion version , aboutDialogComments := __ "Someone's favourite D-Bus profiler"- , aboutDialogWebsite := "https://www.freedesktop.org/wiki/Software/Bustle/"+ , aboutDialogWebsite := "https://gitlab.freedesktop.org/bustle/bustle#readme" , aboutDialogAuthors := authors , aboutDialogCopyright := "© 2008–2017 Will Thompson, Collabora Ltd. and contributors" , aboutDialogLicense := license
Bustle/UI/DetailsView.hs view
@@ -28,19 +28,23 @@ import Graphics.UI.Gtk hiding (Signal) import qualified DBus as D+import DBus.Internal.Message (MethodError(..))+import DBus.Internal.Types (ErrorName(..)) import Bustle.Types import Bustle.Marquee import Bustle.VariantFormatter +type OptionalRow = (Label, Label)+ data DetailsView = DetailsView { detailsGrid :: Grid , detailsType :: Stack , detailsSender :: Label- , detailsDestinationCaption :: Label- , detailsDestination :: Label+ , detailsDestination :: OptionalRow , detailsPath :: Label , detailsMember :: Label+ , detailsErrorName :: OptionalRow , detailsBodyView :: TextView } @@ -50,12 +54,17 @@ <$> builderGetObject builder castToGrid "detailsGrid" <*> builderGetObject builder castToStack "detailsType" <*> builderGetObject builder castToLabel "detailsSender"- <*> builderGetObject builder castToLabel "detailsDestinationCaption"- <*> builderGetObject builder castToLabel "detailsDestination"+ <*> optionalRow "detailsDestination" <*> builderGetObject builder castToLabel "detailsPath" <*> builderGetObject builder castToLabel "detailsMember"+ <*> optionalRow "detailsErrorName" <*> builderGetObject builder castToTextView "detailsArguments"+ where+ optionalRow labelId = (,)+ <$> builderGetObject builder castToLabel (labelId ++ "Caption")+ <*> builderGetObject builder castToLabel labelId + pickType :: Detailed Message -> String pickType (Detailed _ m _ _) = case m of MethodCall {} -> "methodCall"@@ -82,15 +91,42 @@ Signal { signalDestination = d } -> d _ -> Just (destination m) +getErrorName :: Detailed a -> Maybe String+getErrorName (Detailed _ _ _ rm) = case rm of+ (D.ReceivedMethodError _ (MethodError { methodErrorName = ErrorName en})) -> Just en+ _ -> Nothing++getErrorMessage :: Detailed a+ -> Maybe String+getErrorMessage (Detailed _ _ _ (D.ReceivedMethodError _ (MethodError _ _ _ _ body))) =+ case D.fromVariant <$> body of+ [message] -> message+ _ -> Nothing+getErrorMessage _ = Nothing+ formatMessage :: Detailed Message -> String formatMessage (Detailed _ _ _ rm) = formatArgs $ D.receivedMessageBody rm where formatArgs = intercalate "\n" . map (format_Variant VariantStyleSignature)+-- TODO: suppress escaping and type sig for errors, which are always (s) detailsViewGetTop :: DetailsView -> Widget detailsViewGetTop = toWidget . detailsGrid +setOptionalRow :: OptionalRow+ -> Maybe String+ -> IO ()+setOptionalRow (caption, label) s_ = do+ case s_ of+ Just s -> do+ labelSetText label s+ widgetShow label+ widgetShow caption+ Nothing -> do+ widgetHide label+ widgetHide caption+ detailsViewUpdate :: DetailsView -> Detailed Message -> IO ()@@ -102,17 +138,13 @@ -- TODO: these would be a lot more useful if we could resolve unique names -- to/from well-known names and show both labelSetText (detailsSender d) (unBusName . sender . deEvent $ m)- case getDestination m of- Just n -> do- labelSetText (detailsDestination d) (unBusName n)- widgetShow (detailsDestination d)- widgetShow (detailsDestinationCaption d)- Nothing -> do- widgetHide (detailsDestination d)- widgetHide (detailsDestinationCaption d)+ setOptionalRow (detailsDestination d) (unBusName <$> getDestination m)+ setOptionalRow (detailsErrorName d) (getErrorName m) labelSetText (detailsPath d) (maybe unknown (D.formatObjectPath . path) member_) labelSetMarkup (detailsMember d) (maybe unknown getMemberMarkup member_)- textBufferSetText buf $ formatMessage m+ textBufferSetText buf $ case getErrorMessage m of+ Just message -> message+ Nothing -> formatMessage m where unknown = ""
CONTRIBUTING.md view
@@ -48,7 +48,10 @@ scp -r x.y.z annarchy.freedesktop.org:/srv/www.freedesktop.org/www/software/bustle/ # Upload source to Hackage-stack upload+stack upload . git push origin --tags master ```++* Add `.1` to version number in `bustle.cabal`+* Update <https://github.com/flathub/org.freedesktop.Bustle>
NEWS.md view
@@ -1,3 +1,22 @@+Bustle 0.7.4 (2018-12-07)+-------------------------++User-facing changes:++* In the details for an error reply, the error name is now shown, and+ the error message is formatted more legibly.+* The default file extension for log files is now `.pcap`, reflecting+ what they actually are.++Internal changes:++* When you stop monitoring the system bus, the privileged dbus-monitor+ process is now terminated promptly, rather than dying with “Broken+ pipe” the next time a message is sent on the bus.+* Update all links to <https://gitlab.freedesktop.org/bustle/bustle> or+ <https://gitlab.freedesktop.org/bustle/bustle#readme> depending on+ context.+ Bustle 0.7.3 (2018-11-15) -------------------------
README.md view
@@ -34,9 +34,3 @@ bustle --count logfile.bustle bustle --time logfile.bustle---More information-================--See <https://www.freedesktop.org/wiki/Software/Bustle/>.
bustle.cabal view
@@ -1,6 +1,6 @@ Name: bustle Category: Network, Desktop-Version: 0.7.3+Version: 0.7.4 Cabal-Version: 2.0 Tested-With: GHC == 8.4.3 Synopsis: Draw sequence diagrams of D-Bus traffic@@ -9,7 +9,7 @@ License-file: LICENSE Author: Will Thompson <will@willthompson.co.uk> Maintainer: Will Thompson <will@willthompson.co.uk>-Homepage: https://www.freedesktop.org/wiki/Software/Bustle/+Homepage: https://gitlab.freedesktop.org/bustle/bustle#readme Data-files: data/bustle.ui, data/OpenTwoDialog.ui, data/RecordAddressDialog.ui,
c-sources/bustle-pcap.c view
@@ -208,7 +208,7 @@ GMainLoop *loop = user_data; if (!(domain == G_IO_ERROR && code == G_IO_ERROR_CANCELLED))- fprintf (stderr, "Error: %s %d %s", g_quark_to_string (domain), code, message);+ g_printerr ("Error while monitoring: %s\n", message); g_main_loop_quit (loop); }@@ -230,7 +230,7 @@ { GMainLoop *loop; gchar *filename;- GError *error = NULL;+ g_autoptr(GError) error = NULL; BustlePcapMonitor *pcap; parse_arguments (&argc, &argv, &filename);@@ -238,9 +238,8 @@ pcap = bustle_pcap_monitor_new (bus_type, address, filename, &error); if (pcap == NULL) {- fprintf (stderr, "%s %d %s",- g_quark_to_string (error->domain), error->code, error->message);- g_clear_error (&error);+ g_printerr ("Failed to start monitor: %s\n",+ error->message); exit (1); }
c-sources/pcap-monitor.c view
@@ -18,17 +18,29 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#define _GNU_SOURCE+ #include "config.h" #include "pcap-monitor.h" #include <errno.h>+#include <fcntl.h> #include <signal.h> #include <string.h>+#include <sys/ioctl.h>+#include <sys/stat.h>+#include <sys/types.h>+ #include <pcap/pcap.h>++#include <glib.h>+#include <glib/gstdio.h> #include <gio/gunixinputstream.h> + /* Prefix of name claimed by the connection that collects name owners. */ const char *BUSTLE_MONITOR_NAME_PREFIX = "org.freedesktop.Bustle.Monitor.";+static gboolean RUNNING_IN_FLATPAK = FALSE; /* * Transitions:@@ -85,6 +97,8 @@ /* input */ GSubprocess *dbus_monitor;+ /* If >= 0, master side of controlling terminal for dbus_monitor */+ int pt_master; GSource *dbus_monitor_source; pcap_t *pcap_in; @@ -121,12 +135,24 @@ G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init); ) +/* A sad echo of the functions in libglnx. */+static inline void *+throw_errno (GError **error,+ const gchar *prefix)+{+ int errsv = errno;+ g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv),+ "%s: %s", prefix, g_strerror (errsv));+ return NULL;+}+ static void bustle_pcap_monitor_init (BustlePcapMonitor *self) { self->bus_type = G_BUS_TYPE_SESSION; self->state = STATE_NEW; self->cancellable = g_cancellable_new ();+ self->pt_master = -1; } static void@@ -224,6 +250,12 @@ g_clear_error (&self->pcap_error); g_clear_error (&self->subprocess_error); + if (self->pt_master >= 0)+ {+ g_close (self->pt_master, NULL);+ self->pt_master = -1;+ }+ if (parent_class->finalize != NULL) parent_class->finalize (object); }@@ -298,6 +330,8 @@ G_TYPE_UINT, G_TYPE_INT, G_TYPE_STRING);++ RUNNING_IN_FLATPAK = g_file_test ("/.flatpak-info", G_FILE_TEST_EXISTS); } static void@@ -580,6 +614,36 @@ g_task_run_in_thread (task, dump_names_thread_func); } +/**+ * send_sigint:+ *+ * Send SIGINT to the dbus-monitor subprocess, in as many ways as possible.+ */+static void+send_sigint (BustlePcapMonitor *self)+{+ /* Send the signal directly; this has no effect on the privileged subprocess+ * used on the system bus.+ */+ if (self->dbus_monitor != NULL)+ g_subprocess_send_signal (self->dbus_monitor, SIGINT);++ /* Send it via the PTY that we set as the subprocess's controlling terminal;+ * this works even for a privileged child.+ */+ if (self->pt_master >= 0)+ {+ char ctrl_c = '\x03';++ if (write (self->pt_master, &ctrl_c, 1) != 1)+ {+ g_autoptr(GError) local_error = NULL;+ throw_errno (&local_error, "write to pt_master failed");+ g_warning ("%s: %s", G_STRFUNC, local_error->message);+ }+ }+}+ static gboolean start_pcap ( BustlePcapMonitor *self,@@ -599,9 +663,10 @@ dbus_monitor_filep = fdopen (stdout_fd, "r"); if (dbus_monitor_filep == NULL) {- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), "fdopen");+ throw_errno (error, "fdopen failed"); return FALSE; }+ /* fd is owned by the FILE * now */ g_unix_input_stream_set_close_fd (G_UNIX_INPUT_STREAM (stdout_pipe), FALSE); @@ -619,10 +684,8 @@ /* Cause dbus-monitor to exit next time it tries to write a message */ g_clear_pointer (&dbus_monitor_filep, fclose); - /* And try to terminate it immediately. When spawning via pkexec we may- * not be able to kill it.- */- g_subprocess_force_exit (self->dbus_monitor);+ /* And try to terminate it immediately. */+ send_sigint (self); return FALSE; }@@ -737,9 +800,7 @@ /* cases: * - G_SPAWN_ERROR / G_SPAWN_ERROR_FAILED / "Child process killed by signal N":- * dbus-monitor was killed, possibly by us calling- * g_subprocess_force_exit(), though this doesn't work for pkexec'd- * dbus-monitor+ * dbus-monitor was killed, presumably by send_sigint() * - G_SPAWN_EXIT_ERROR: * - 0: bus itself went away (assuming pkexec/flatpak-spawn propagate * errors correctly)@@ -765,27 +826,17 @@ */ g_clear_pointer (&self->pcap_in, pcap_close); - if (self->dbus_monitor != NULL)- {- /* Try to make it stop sooner; this has no effect on a privileged- * dbus-monitor.- */- g_subprocess_force_exit (self->dbus_monitor);- }+ /* And try to terminate it immediately. */+ send_sigint (self); } -static gboolean-initable_init (- GInitable *initable,- GCancellable *cancellable,- GError **error)+static const char **+build_argv (BustlePcapMonitor *self,+ GError **error) {- BustlePcapMonitor *self = BUSTLE_PCAP_MONITOR (initable);- gboolean in_flatpak = g_file_test ("/.flatpak-info", G_FILE_TEST_EXISTS); g_autoptr(GPtrArray) dbus_monitor_argv = g_ptr_array_sized_new (8);- GInputStream *stdout_pipe = NULL; - if (in_flatpak)+ if (RUNNING_IN_FLATPAK) { g_ptr_array_add (dbus_monitor_argv, "flatpak-spawn"); g_ptr_array_add (dbus_monitor_argv, "--host");@@ -818,11 +869,82 @@ default: g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Can only log the session bus, system bus, or a given address");- return FALSE;+ return NULL; } g_ptr_array_add (dbus_monitor_argv, NULL);+ return (const char **) g_ptr_array_free (g_steal_pointer (&dbus_monitor_argv), FALSE);+} +/**+ * set_controlling_tty_to_stdin:+ *+ * child_setup function for the dbus-monitor subprocess which arranges for its+ * controlling TTY to be a PTY, so we can send SIGINT to it even if it's+ * privileged.+ */+static void+set_controlling_tty_to_stdin (void *user_data G_GNUC_UNUSED)+{+ /* Move this child process to a new session, unsetting any existing+ * controlling terminal.+ */+ setsid ();++ /* Make stdin (the worker end of a PTY pair) the controlling terminal for+ * this child process.+ */+ ioctl (STDIN_FILENO, TIOCSCTTY, 0);+}++static GSubprocess *+spawn_monitor (BustlePcapMonitor *self,+ const char *const *argv,+ GError **error)+{+ g_autoptr(GSubprocessLauncher) launcher =+ g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_STDOUT_PIPE);++ self->pt_master = posix_openpt (O_RDWR | O_NOCTTY | O_CLOEXEC);+ if (self->pt_master < 0)+ return throw_errno (error, "posix_openpt failed");++ if (unlockpt (self->pt_master) < 0)+ return throw_errno (error, "unlockpt failed");++ char sname[PATH_MAX] = { 0 };+ if (ptsname_r (self->pt_master, sname, G_N_ELEMENTS (sname)) != 0)+ return throw_errno (error, "ptsname_r failed");++ int pt_slave = open (sname, O_RDWR);+ if (pt_slave < 0)+ return throw_errno (error, "open(sname) failed");++ g_subprocess_launcher_take_stdin_fd (launcher, pt_slave);+ if (!RUNNING_IN_FLATPAK)+ g_subprocess_launcher_set_child_setup (launcher, set_controlling_tty_to_stdin, NULL, NULL);+ /* otherwise, the session-helper process already does this for us */++ GSubprocess *child = g_subprocess_launcher_spawnv (launcher, argv, error);++ g_close (pt_slave, NULL);+ return child;+}++static gboolean+initable_init (+ GInitable *initable,+ GCancellable *cancellable,+ GError **error)+{+ BustlePcapMonitor *self = BUSTLE_PCAP_MONITOR (initable);+ g_autofree const char **argv = NULL;+ GInputStream *stdout_pipe = NULL;++ argv = build_argv (self, error);+ if (NULL == argv)+ return FALSE;+ if (self->filename == NULL) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,@@ -851,13 +973,9 @@ return FALSE; } - self->dbus_monitor = g_subprocess_newv (- (const gchar * const *) dbus_monitor_argv->pdata,- G_SUBPROCESS_FLAGS_STDOUT_PIPE, error);+ self->dbus_monitor = spawn_monitor (self, (const char * const *) argv, error); if (self->dbus_monitor == NULL)- {- return FALSE;- }+ return FALSE; stdout_pipe = g_subprocess_get_stdout_pipe (self->dbus_monitor); g_return_val_if_fail (stdout_pipe != NULL, FALSE);
data/bustle.ui view
@@ -726,7 +726,7 @@ </object> <packing> <property name="left_attach">0</property>- <property name="top_attach">5</property>+ <property name="top_attach">6</property> </packing> </child> <child>@@ -747,7 +747,7 @@ </object> <packing> <property name="left_attach">1</property>- <property name="top_attach">5</property>+ <property name="top_attach">6</property> </packing> </child> <child>@@ -886,6 +886,38 @@ <packing> <property name="left_attach">1</property> <property name="top_attach">2</property>+ </packing>+ </child>+ <child>+ <object class="GtkLabel" id="detailsErrorNameCaption">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="hexpand">False</property>+ <property name="label" translatable="yes">Error</property>+ <property name="xalign">1</property>+ <style>+ <class name="dim-label"/>+ </style>+ </object>+ <packing>+ <property name="left_attach">0</property>+ <property name="top_attach">5</property>+ </packing>+ </child>+ <child>+ <object class="GtkLabel" id="detailsErrorName">+ <property name="name">detailsMember</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="hexpand">True</property>+ <property name="label">com.example.Placeholder.Error.OhNo</property>+ <property name="selectable">True</property>+ <property name="ellipsize">start</property>+ <property name="xalign">0</property>+ </object>+ <packing>+ <property name="left_attach">1</property>+ <property name="top_attach">5</property> </packing> </child> </object>
data/org.freedesktop.Bustle.appdata.xml.in view
@@ -2,7 +2,9 @@ <!-- Copyright 2014 Philip Withnall <philip@tecnocode.co.uk> --> <!-- Copyright 2016–2018 Will Thompson <will@willthompson.co.uk> --> <component type="desktop-application">- <id>org.freedesktop.Bustle.desktop</id>+ <id>org.freedesktop.Bustle</id>+ <launchable type="desktop-id">org.freedesktop.Bustle.desktop</launchable>+ <content_rating type="oars-1.1" /> <metadata_license>CC-BY-SA-3.0</metadata_license> <name>Bustle</name> <summary>Draw sequence diagrams of D-Bus activity</summary>@@ -32,13 +34,19 @@ <caption>Relax with this soothing greyscale welcome page</caption> </screenshot> </screenshots>- <url type="homepage">https://www.freedesktop.org/wiki/Software/Bustle/</url>+ <url type="homepage">https://gitlab.freedesktop.org/bustle/bustle#readme</url> <update_contact>will_at_willthompson.co.uk</update_contact> <translation type="gettext">bustle</translation> <provides> <id>bustle.desktop</id> </provides> <releases>+ <release date="2018-12-07" version="0.7.4">+ <description>+ <p>In the details for an error reply, the error name is now shown, and the error message is formatted more legibly.</p>+ <p>The default file extension for log files is now ‘.pcap’, reflecting what they actually are.</p>+ </description>+ </release> <release date="2018-11-15" version="0.7.3"> <description> <p>Bustle now handles the application/vnd.tcpdump.pcap MIME type, which in practice means that your file manager will offer to open pcap files with Bustle.</p>
+ po/en_GB.po view
@@ -0,0 +1,327 @@+# SOME DESCRIPTIVE TITLE.+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER+# This file is distributed under the same license as the PACKAGE package.+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.+# +# Translators:+# Will Thompson <wjt@endlessm.com>, 2018+# +#, fuzzy+msgid ""+msgstr ""+"Project-Id-Version: PACKAGE VERSION\n"+"Report-Msgid-Bugs-To: \n"+"POT-Creation-Date: 2018-11-15 08:51+0000\n"+"PO-Revision-Date: 2018-11-15 09:57+0000\n"+"Last-Translator: Will Thompson <wjt@endlessm.com>, 2018\n"+"Language-Team: English (United Kingdom) (https://www.transifex.com/bustle/teams/6754/en_GB/)\n"+"MIME-Version: 1.0\n"+"Content-Type: text/plain; charset=UTF-8\n"+"Content-Transfer-Encoding: 8bit\n"+"Language: en_GB\n"+"Plural-Forms: nplurals=2; plural=(n != 1);\n"++#: Bustle/StatisticsPane.hs:189 Bustle/StatisticsPane.hs:192+msgid "%.1f ms"+msgstr ""++#: Bustle/Noninteractive.hs:55+msgid "(no interface)"+msgstr ""++#: Bustle/UI/AboutDialog.hs:46 data/bustle.ui:101+#: data/org.freedesktop.Bustle.desktop.in:3+#: data/org.freedesktop.Bustle.appdata.xml.in:6+msgid "Bustle"+msgstr ""++#: Bustle/StatisticsPane.hs:190+msgid "Calls"+msgstr ""++#: Bustle/UI.hs:456+msgid "Close _Without Saving"+msgstr ""++#: Bustle/UI.hs:226+msgid "Could not read '%s'"+msgstr "Could not read ‘%s’"++#: Bustle/UI.hs:763+msgid "Couldn't export log as PDF: "+msgstr "Couldn’t export log as PDF: OH NO"++#: Bustle/Noninteractive.hs:48+msgid "Couldn't parse '%s': %s"+msgstr "Couldn’t parse ‘%s’: %s"++#: Bustle/UI.hs:431+msgid "Couldn't save log: "+msgstr "Couldn’t save log: "++#: Bustle/StatisticsPane.hs:222 data/bustle.ui:787+msgid "Error"+msgstr ""++#: Bustle/StatisticsPane.hs:150+msgid "Frequency"+msgstr ""++#: Bustle/UI.hs:455+msgid "If you don't save, this log will be lost forever."+msgstr "If you don’t save, this log will be lost forever."++#: Bustle/StatisticsPane.hs:229+msgid "Largest"+msgstr ""++#: Bustle/UI.hs:239+msgid "Logged <b>%u</b> messages"+msgstr ""++#: Bustle/StatisticsPane.hs:191 Bustle/StatisticsPane.hs:228+msgid "Mean"+msgstr ""++#: Bustle/StatisticsPane.hs:135 Bustle/StatisticsPane.hs:213+#: data/bustle.ui:688+msgid "Member"+msgstr ""++#: Bustle/StatisticsPane.hs:142 Bustle/StatisticsPane.hs:179+msgid "Method"+msgstr ""++#: Bustle/StatisticsPane.hs:220 data/bustle.ui:762+msgid "Method call"+msgstr ""++#: Bustle/StatisticsPane.hs:221 data/bustle.ui:774+msgid "Method return"+msgstr ""++#: Bustle/UI.hs:348+msgid "Recording %s…"+msgstr ""++#: Bustle/UI.hs:448+msgid "Save log '%s' before closing?"+msgstr ""++#: Bustle/StatisticsPane.hs:143 Bustle/StatisticsPane.hs:223+#: data/bustle.ui:800+msgid "Signal"+msgstr ""++#: Bustle/StatisticsPane.hs:227+msgid "Smallest"+msgstr ""++#: Bustle/UI/AboutDialog.hs:48+msgid "Someone's favourite D-Bus profiler"+msgstr "Someone’s favourite D-Bus profiler"++#: Bustle/StatisticsPane.hs:188+msgid "Total"+msgstr ""++#: Bustle/UI/FilterDialog.hs:123+msgid ""+"Unticking a service hides its column in the diagram, and all messages it is "+"involved in. That is, all methods it calls or are called on it, the "+"corresponding returns, and all signals it emits will be hidden."+msgstr ""++#: Bustle/Util.hs:48+msgid "Warning: "+msgstr ""++#: Bustle/UI.hs:433+msgid ""+"You might want to manually recover the log from the temporary file at "+"\"%s\"."+msgstr ""++#: data/bustle.ui:14+msgid "_Filter Visible Services…"+msgstr ""++#: data/bustle.ui:24+msgid "_Statistics"+msgstr ""++#: data/bustle.ui:62+msgid ""+"Display two logs—one for the session bus, one for the system bus—side by "+"side."+msgstr ""++#: data/bustle.ui:63+msgid "O_pen a Pair of Logs…"+msgstr ""++#: data/bustle.ui:75+msgid "Record S_ession Bus"+msgstr ""++#: data/bustle.ui:84+msgid "Record S_ystem Bus"+msgstr ""++#: data/bustle.ui:93+msgid "Record _Address…"+msgstr ""++#: data/bustle.ui:138+msgid "Record a new log"+msgstr ""++#: data/bustle.ui:149+msgid "_Record"+msgstr ""++#: data/bustle.ui:182+msgid "_Stop"+msgstr ""++#: data/bustle.ui:200+msgid "Open an existing log"+msgstr ""++#: data/bustle.ui:310+msgid "Export as PDF"+msgstr ""++#: data/bustle.ui:334+msgid "Save"+msgstr ""++#: data/bustle.ui:493+msgid ""+"Start recording D-Bus activity with the <b>Record</b> button above\n"+" You can also run <i>dbus-monitor --pcap</i> from the command line"+msgstr ""++#: data/bustle.ui:512+msgid "Welcome to Bustle"+msgstr ""++#: data/bustle.ui:537+msgid "<big><b>Waiting for D-Bus traffic; please hold…</b></big>"+msgstr ""++#: data/bustle.ui:564+msgid "Frequencies"+msgstr ""++#: data/bustle.ui:578+msgid "Durations"+msgstr ""++#: data/bustle.ui:593+msgid "Sizes"+msgstr ""++#: data/bustle.ui:640+msgid "Type"+msgstr ""++#: data/bustle.ui:656+msgid "Path"+msgstr ""++#: data/bustle.ui:720+msgid "Arguments"+msgstr ""++#: data/bustle.ui:813+msgid "Directed signal"+msgstr ""++#: data/bustle.ui:832+msgid "Sender"+msgstr ""++#: data/bustle.ui:848+msgid "Destination"+msgstr ""++#: data/org.freedesktop.Bustle.desktop.in:4+#: data/org.freedesktop.Bustle.appdata.xml.in:7+msgid "Draw sequence diagrams of D-Bus activity"+msgstr ""++#: data/org.freedesktop.Bustle.desktop.in:6+msgid "org.freedesktop.Bustle"+msgstr ""++#: data/org.freedesktop.Bustle.desktop.in:11+msgid "debug;profile;d-bus;dbus;sequence;monitor;"+msgstr ""++#. Translators: These are the application description paragraphs in the+#. AppData file.+#: data/org.freedesktop.Bustle.appdata.xml.in:10+msgid ""+"Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions,"+" method calls and their corresponding returns, with time stamps for each "+"individual event and the duration of each method call. This can help you "+"check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based "+"application is not performing as well as you like. It also provides "+"statistics like signal frequencies and average method call times."+msgstr ""++#: data/org.freedesktop.Bustle.appdata.xml.in:23+msgid "Explore sequence diagrams of D-Bus activity"+msgstr ""++#: data/org.freedesktop.Bustle.appdata.xml.in:27+msgid "See statistics summarizing the log"+msgstr ""++#: data/org.freedesktop.Bustle.appdata.xml.in:31+msgid "Relax with this soothing greyscale welcome page"+msgstr ""++#: data/org.freedesktop.Bustle.appdata.xml.in:43+msgid ""+"Bustle now handles the application/vnd.tcpdump.pcap MIME type, which in "+"practice means that your file manager will offer to open pcap files with "+"Bustle."+msgstr ""++#: data/org.freedesktop.Bustle.appdata.xml.in:48+msgid ""+"You can now explore messages while they're being recorded. (Filtering, "+"statistics and exporting are still only available once you stop recording.)"+msgstr ""+"You can now explore messages while they’re being recorded. (Filtering, "+"statistics and exporting are still only available once you stop recording.)"++#: data/org.freedesktop.Bustle.appdata.xml.in:49+msgid ""+"The raw sender and destination for each message is now shown in the details "+"pane."+msgstr ""++#: data/org.freedesktop.Bustle.appdata.xml.in:50+msgid ""+"Bytestrings with embedded NULs which are otherwise ASCII are now shown as "+"ASCII strings."+msgstr ""++#: data/org.freedesktop.Bustle.appdata.xml.in:55+msgid ""+"It's now possible to monitor the system bus (from the user interface and "+"with the bustle-pcap command-line tool), with no need to reconfigure the "+"system bus. It's also possible to monitor an arbitrary bus by address."+msgstr ""+"It’s now possible to monitor the system bus (from the user interface and "+"with the bustle-pcap command-line tool), with no need to reconfigure the "+"system bus. It’s also possible to monitor an arbitrary bus by address."++#: data/org.freedesktop.Bustle.appdata.xml.in:56+msgid ""+"Bustle now requires that dbus-monitor (≥ 1.9.10) and pkexec are installed on"+" your system."+msgstr ""
po/messages.pot view
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n"-"POT-Creation-Date: 2018-11-15 08:51+0000\n"+"POT-Creation-Date: 2018-12-07 09:43+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n"@@ -27,7 +27,7 @@ #: Bustle/UI/AboutDialog.hs:46 data/bustle.ui:101 #: data/org.freedesktop.Bustle.desktop.in:3-#: data/org.freedesktop.Bustle.appdata.xml.in:6+#: data/org.freedesktop.Bustle.appdata.xml.in:9 msgid "Bustle" msgstr "" @@ -55,7 +55,7 @@ msgid "Couldn't save log: " msgstr "" -#: Bustle/StatisticsPane.hs:222 data/bustle.ui:787+#: Bustle/StatisticsPane.hs:222 data/bustle.ui:787 data/bustle.ui:896 msgid "Error" msgstr "" @@ -240,7 +240,7 @@ msgstr "" #: data/org.freedesktop.Bustle.desktop.in:4-#: data/org.freedesktop.Bustle.appdata.xml.in:7+#: data/org.freedesktop.Bustle.appdata.xml.in:10 msgid "Draw sequence diagrams of D-Bus activity" msgstr "" @@ -253,7 +253,7 @@ msgstr "" #. Translators: These are the application description paragraphs in the AppData file.-#: data/org.freedesktop.Bustle.appdata.xml.in:10+#: data/org.freedesktop.Bustle.appdata.xml.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each "@@ -263,51 +263,63 @@ "statistics like signal frequencies and average method call times." msgstr "" -#: data/org.freedesktop.Bustle.appdata.xml.in:23+#: data/org.freedesktop.Bustle.appdata.xml.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "" -#: data/org.freedesktop.Bustle.appdata.xml.in:27+#: data/org.freedesktop.Bustle.appdata.xml.in:30 msgid "See statistics summarizing the log" msgstr "" -#: data/org.freedesktop.Bustle.appdata.xml.in:31+#: data/org.freedesktop.Bustle.appdata.xml.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "" -#: data/org.freedesktop.Bustle.appdata.xml.in:43+#: data/org.freedesktop.Bustle.appdata.xml.in:46 msgid ""+"In the details for an error reply, the error name is now shown, and the "+"error message is formatted more legibly."+msgstr ""++#: data/org.freedesktop.Bustle.appdata.xml.in:47+msgid ""+"The default file extension for log files is now ‘.pcap’, reflecting what "+"they actually are."+msgstr ""++#: data/org.freedesktop.Bustle.appdata.xml.in:52+msgid "" "Bustle now handles the application/vnd.tcpdump.pcap MIME type, which in " "practice means that your file manager will offer to open pcap files with " "Bustle." msgstr "" -#: data/org.freedesktop.Bustle.appdata.xml.in:48+#: data/org.freedesktop.Bustle.appdata.xml.in:57 msgid "" "You can now explore messages while they're being recorded. (Filtering, " "statistics and exporting are still only available once you stop recording.)" msgstr "" -#: data/org.freedesktop.Bustle.appdata.xml.in:49+#: data/org.freedesktop.Bustle.appdata.xml.in:58 msgid "" "The raw sender and destination for each message is now shown in the details " "pane." msgstr "" -#: data/org.freedesktop.Bustle.appdata.xml.in:50+#: data/org.freedesktop.Bustle.appdata.xml.in:59 msgid "" "Bytestrings with embedded NULs which are otherwise ASCII are now shown as " "ASCII strings." msgstr "" -#: data/org.freedesktop.Bustle.appdata.xml.in:55+#: data/org.freedesktop.Bustle.appdata.xml.in:64 msgid "" "It's now possible to monitor the system bus (from the user interface and " "with the bustle-pcap command-line tool), with no need to reconfigure the " "system bus. It's also possible to monitor an arbitrary bus by address." msgstr "" -#: data/org.freedesktop.Bustle.appdata.xml.in:56+#: data/org.freedesktop.Bustle.appdata.xml.in:65 msgid "" "Bustle now requires that dbus-monitor (≥ 1.9.10) and pkexec are installed on " "your system."