bitbake-devel.lists.openembedded.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] knotty: show elapsed time on the task progress bar
@ 2026-08-18 19:39 WXbet
  2026-08-18 19:54 ` WXbet
  0 siblings, 1 reply; 11+ messages in thread
From: WXbet @ 2026-08-18 19:39 UTC (permalink / raw)
  To: bitbake-devel


[-- Attachment #1.1: Type: text/plain, Size: 464 bytes --]

As a convenience for the user, this makes it easy to see at a glance how long
the current build has already been running.

The progress bar for the overall build currently shows only a percentage and
a bar, with no running time — while each individual running-task line below
it already carries an elapsed-time value. The patch adds a Timer widget to
the bar, reusing knotty's existing time formatting so it matches the rest of
the UI.

Thanks,
WXbet

[-- Attachment #1.2: Type: text/html, Size: 539 bytes --]

[-- Attachment #2: 0001-knotty-show-elapsed-time-on-the-task-progress-bar.patch --]
[-- Type: application/octet-stream, Size: 2878 bytes --]

From 9302e85e75edc6af22ea90336d2b0c46fa95fe80 Mon Sep 17 00:00:00 2001
From: WXbet <57314510+WXbet@users.noreply.github.com>
Date: Tue, 18 Aug 2026 21:30:22 +0200
Subject: [PATCH] knotty: show elapsed time on the task progress bar

The progress bar for the overall build shows a percentage and a bar but no
elapsed time, even though the individual running-task lines below it each
show one.

Add a Timer widget to the bar. The time formatting in
TerminalFilter.elapsed() is hoisted to a module-level bb_elapsed() helper and
reused by a small progressbar.Timer subclass, so the bar prints the same
"%dh%dm%ds" style as the rest of the UI.

Signed-off-by: WXbet <57314510+WXbet@users.noreply.github.com>
---
 lib/bb/ui/knotty.py | 28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py
index 15025e8dd..343045881 100644
--- a/lib/bb/ui/knotty.py
+++ b/lib/bb/ui/knotty.py
@@ -37,6 +37,21 @@ featureSet = [bb.cooker.CookerFeatures.SEND_SANITYEVENTS, bb.cooker.CookerFeatur
 logger = logging.getLogger("BitBake")
 interactive = sys.stdout.isatty()
 
+def bb_elapsed(sec):
+    hrs = int(sec / 3600.0)
+    sec -= hrs * 3600
+    min = int(sec / 60.0)
+    sec -= min * 60
+    if hrs > 0:
+        return "%dh%dm%ds" % (hrs, min, sec)
+    elif min > 0:
+        return "%dm%ds" % (min, sec)
+    else:
+        return "%ds" % (sec)
+
+class BBTimer(progressbar.Timer):
+    format_time = staticmethod(bb_elapsed)
+
 class BBProgress(progressbar.ProgressBar):
     def __init__(self, msg, maxval, widgets=None, extrapos=-1, resize_handler=None):
         self.id = msg
@@ -250,16 +265,7 @@ class TerminalFilter(object):
         self._footer_lines = None
 
     def elapsed(self, sec):
-        hrs = int(sec / 3600.0)
-        sec -= hrs * 3600
-        min = int(sec / 60.0)
-        sec -= min * 60
-        if hrs > 0:
-            return "%dh%dm%ds" % (hrs, min, sec)
-        elif min > 0:
-            return "%dm%ds" % (min, sec)
-        else:
-            return "%ds" % (sec)
+        return bb_elapsed(sec)
 
     def keepAlive(self, t):
         if not self.cuu:
@@ -354,7 +360,7 @@ class TerminalFilter(object):
                 msg = "Currently %2s running tasks (%s)" % (len(activetasks), cur_tasks)
             maxtask = self.helper.tasknumber_total
             if not self.main_progress or self.main_progress.maxval != maxtask:
-                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar()]
+                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar(), ' ', BBTimer(format='Elapsed: %s')]
                 self.main_progress = BBProgress("Running tasks", maxtask, widgets=widgets, resize_handler=self.sigwinch_handle)
                 self.main_progress.fd = self._footer_buf
                 self.main_progress.start(False)
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] knotty: show elapsed time on the task progress bar
  2026-08-18 19:39 [PATCH] knotty: show elapsed time on the task progress bar WXbet
@ 2026-08-18 19:54 ` WXbet
  2026-08-19  8:22   ` [bitbake-devel] " Alexander Kanavin
  0 siblings, 1 reply; 11+ messages in thread
From: WXbet @ 2026-08-18 19:54 UTC (permalink / raw)
  To: bitbake-devel


[-- Attachment #1.1: Type: text/plain, Size: 2 bytes --]



[-- Attachment #1.2: Type: text/html, Size: 113 bytes --]

[-- Attachment #2: 0001-knotty-show-elapsed-time-on-the-task-progress-bar.png --]
[-- Type: image/png, Size: 170661 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [bitbake-devel] [PATCH] knotty: show elapsed time on the task progress bar
  2026-08-18 19:54 ` WXbet
@ 2026-08-19  8:22   ` Alexander Kanavin
  2026-08-19  9:33     ` WXbet
  0 siblings, 1 reply; 11+ messages in thread
From: Alexander Kanavin @ 2026-08-19  8:22 UTC (permalink / raw)
  To: WXbet; +Cc: bitbake-devel


[-- Attachment #1.1: Type: text/plain, Size: 682 bytes --]

Can you please send this patch as an email per patch submission policy,
because attachments are difficult to review and comment on?

Alex

On Tue, 18 Aug 2026 at 21:54, WXbet via lists.openembedded.org <WXbet=
proton.me@lists.openembedded.org> wrote:

>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#19985):
> https://lists.openembedded.org/g/bitbake-devel/message/19985
> Mute This Topic: https://lists.openembedded.org/mt/120819188/1686489
> Group Owner: bitbake-devel+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/bitbake-devel/unsub [
> alex.kanavin@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>

[-- Attachment #1.2: Type: text/html, Size: 1656 bytes --]

[-- Attachment #2: 0001-knotty-show-elapsed-time-on-the-task-progress-bar.png --]
[-- Type: image/png, Size: 170661 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH] knotty: show elapsed time on the task progress bar
  2026-08-19  8:22   ` [bitbake-devel] " Alexander Kanavin
@ 2026-08-19  9:33     ` WXbet
  2026-08-26 13:03       ` WXbet
                         ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: WXbet @ 2026-08-19  9:33 UTC (permalink / raw)
  To: bitbake-devel; +Cc: WXbet

The progress bar for the overall build shows a percentage and a bar but no
elapsed time, even though the individual running-task lines below it each
show one.

Add a Timer widget to the bar. The time formatting in
TerminalFilter.elapsed() is hoisted to a module-level bb_elapsed() helper and
reused by a small progressbar.Timer subclass, so the bar prints the same
"%dh%dm%ds" style as the rest of the UI.

Signed-off-by: WXbet <wxbet.oe@gmail.com>
---
 lib/bb/ui/knotty.py | 28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py
index 15025e8dd..343045881 100644
--- a/lib/bb/ui/knotty.py
+++ b/lib/bb/ui/knotty.py
@@ -37,6 +37,21 @@ featureSet = [bb.cooker.CookerFeatures.SEND_SANITYEVENTS, bb.cooker.CookerFeatur
 logger = logging.getLogger("BitBake")
 interactive = sys.stdout.isatty()
 
+def bb_elapsed(sec):
+    hrs = int(sec / 3600.0)
+    sec -= hrs * 3600
+    min = int(sec / 60.0)
+    sec -= min * 60
+    if hrs > 0:
+        return "%dh%dm%ds" % (hrs, min, sec)
+    elif min > 0:
+        return "%dm%ds" % (min, sec)
+    else:
+        return "%ds" % (sec)
+
+class BBTimer(progressbar.Timer):
+    format_time = staticmethod(bb_elapsed)
+
 class BBProgress(progressbar.ProgressBar):
     def __init__(self, msg, maxval, widgets=None, extrapos=-1, resize_handler=None):
         self.id = msg
@@ -250,16 +265,7 @@ class TerminalFilter(object):
         self._footer_lines = None
 
     def elapsed(self, sec):
-        hrs = int(sec / 3600.0)
-        sec -= hrs * 3600
-        min = int(sec / 60.0)
-        sec -= min * 60
-        if hrs > 0:
-            return "%dh%dm%ds" % (hrs, min, sec)
-        elif min > 0:
-            return "%dm%ds" % (min, sec)
-        else:
-            return "%ds" % (sec)
+        return bb_elapsed(sec)
 
     def keepAlive(self, t):
         if not self.cuu:
@@ -354,7 +360,7 @@ class TerminalFilter(object):
                 msg = "Currently %2s running tasks (%s)" % (len(activetasks), cur_tasks)
             maxtask = self.helper.tasknumber_total
             if not self.main_progress or self.main_progress.maxval != maxtask:
-                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar()]
+                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar(), ' ', BBTimer(format='Elapsed: %s')]
                 self.main_progress = BBProgress("Running tasks", maxtask, widgets=widgets, resize_handler=self.sigwinch_handle)
                 self.main_progress.fd = self._footer_buf
                 self.main_progress.start(False)
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] knotty: show elapsed time on the task progress bar
  2026-08-19  9:33     ` WXbet
@ 2026-08-26 13:03       ` WXbet
  2026-08-26 14:41       ` [bitbake-devel] " Peter Kjellerstedt
  2026-08-27 10:01       ` [PATCH v2] " WXbet
  2 siblings, 0 replies; 11+ messages in thread
From: WXbet @ 2026-08-26 13:03 UTC (permalink / raw)
  To: bitbake-devel

[-- Attachment #1: Type: text/plain, Size: 35 bytes --]

Any chance to get this be merged?

[-- Attachment #2: Type: text/html, Size: 46 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: [bitbake-devel] [PATCH] knotty: show elapsed time on the task progress bar
  2026-08-19  9:33     ` WXbet
  2026-08-26 13:03       ` WXbet
@ 2026-08-26 14:41       ` Peter Kjellerstedt
  2026-08-26 15:15         ` WXbet
  2026-08-27 10:01       ` [PATCH v2] " WXbet
  2 siblings, 1 reply; 11+ messages in thread
From: Peter Kjellerstedt @ 2026-08-26 14:41 UTC (permalink / raw)
  To: WXbet@proton.me, bitbake-devel@lists.openembedded.org; +Cc: WXbet

> -----Original Message-----
> From: bitbake-devel@lists.openembedded.org <bitbake-devel@lists.openembedded.org> On Behalf Of WXbet via lists.openembedded.org
> Sent: den 19 augusti 2026 11:33
> To: bitbake-devel@lists.openembedded.org
> Cc: WXbet <wxbet.oe@gmail.com>
> Subject: [bitbake-devel] [PATCH] knotty: show elapsed time on the task progress bar
> 
> The progress bar for the overall build shows a percentage and a bar but no
> elapsed time, even though the individual running-task lines below it each
> show one.
> 
> Add a Timer widget to the bar. The time formatting in
> TerminalFilter.elapsed() is hoisted to a module-level bb_elapsed() helper and
> reused by a small progressbar.Timer subclass, so the bar prints the same
> "%dh%dm%ds" style as the rest of the UI.

On the other hand, the progress bars that are shown during the initial 
phase before the build tasks starts all use Progressbar's own Timer 
widget. I think it makes more sense to just use progressbar.Timer() 
rather than BBTimer().

> 
> Signed-off-by: WXbet <wxbet.oe@gmail.com>
> ---
>  lib/bb/ui/knotty.py | 28 +++++++++++++++++-----------
>  1 file changed, 17 insertions(+), 11 deletions(-)
> 
> diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py
> index 15025e8dd..343045881 100644
> --- a/lib/bb/ui/knotty.py
> +++ b/lib/bb/ui/knotty.py
> @@ -37,6 +37,21 @@ featureSet = [bb.cooker.CookerFeatures.SEND_SANITYEVENTS, bb.cooker.CookerFeatur
>  logger = logging.getLogger("BitBake")
>  interactive = sys.stdout.isatty()
> 
> +def bb_elapsed(sec):
> +    hrs = int(sec / 3600.0)
> +    sec -= hrs * 3600
> +    min = int(sec / 60.0)
> +    sec -= min * 60
> +    if hrs > 0:
> +        return "%dh%dm%ds" % (hrs, min, sec)
> +    elif min > 0:
> +        return "%dm%ds" % (min, sec)
> +    else:
> +        return "%ds" % (sec)
> +
> +class BBTimer(progressbar.Timer):
> +    format_time = staticmethod(bb_elapsed)
> +
>  class BBProgress(progressbar.ProgressBar):
>      def __init__(self, msg, maxval, widgets=None, extrapos=-1, resize_handler=None):
>          self.id = msg
> @@ -250,16 +265,7 @@ class TerminalFilter(object):
>          self._footer_lines = None
> 
>      def elapsed(self, sec):
> -        hrs = int(sec / 3600.0)
> -        sec -= hrs * 3600
> -        min = int(sec / 60.0)
> -        sec -= min * 60
> -        if hrs > 0:
> -            return "%dh%dm%ds" % (hrs, min, sec)
> -        elif min > 0:
> -            return "%dm%ds" % (min, sec)
> -        else:
> -            return "%ds" % (sec)
> +        return bb_elapsed(sec)
> 
>      def keepAlive(self, t):
>          if not self.cuu:
> @@ -354,7 +360,7 @@ class TerminalFilter(object):
>                  msg = "Currently %2s running tasks (%s)" % (len(activetasks), cur_tasks)
>              maxtask = self.helper.tasknumber_total
>              if not self.main_progress or self.main_progress.maxval != maxtask:
> -                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar()]
> +                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar(), ' ', BBTimer(format='Elapsed: %s')]
>                  self.main_progress = BBProgress("Running tasks", maxtask, widgets=widgets, resize_handler=self.sigwinch_handle)
>                  self.main_progress.fd = self._footer_buf
>                  self.main_progress.start(False)
> --
> 2.53.0

//Peter



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] knotty: show elapsed time on the task progress bar
  2026-08-26 14:41       ` [bitbake-devel] " Peter Kjellerstedt
@ 2026-08-26 15:15         ` WXbet
  2026-08-27  8:22           ` [bitbake-devel] " Peter Kjellerstedt
  0 siblings, 1 reply; 11+ messages in thread
From: WXbet @ 2026-08-26 15:15 UTC (permalink / raw)
  To: bitbake-devel

[-- Attachment #1: Type: text/plain, Size: 1142 bytes --]

On Wed, Aug 26, 2026 at 04:41 PM, Peter Kjellerstedt wrote:

> 
> On the other hand, the progress bars that are shown during the initial
> phase before the build tasks starts all use Progressbar's own Timer
> widget. I think it makes more sense to just use progressbar.Timer()
> rather than BBTimer().

The formatting is deliberate. The running-task lines right below the bar print their time through TerminalFilter.elapsed() , e.g. 16m34s. With progressbar.Timer the bar reads 0:16:34 , so the same screen would show two different time formats. The parsing-phase bars are gone by the time the task bar appears, so they never compete with it.

Timer.format_time is a staticmethod and Timer defines __slots__ , so it cannot be replaced per instance, hence the small subclass.

If you prefer consistency with progressbar's own format, this one-liner does it instead and I am happy to send it as v2:

-                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar()]
+                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar(), ' ', progressbar.Timer(format='Elapsed: %s')]

[-- Attachment #2: Type: text/html, Size: 1423 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: [bitbake-devel] [PATCH] knotty: show elapsed time on the task progress bar
  2026-08-26 15:15         ` WXbet
@ 2026-08-27  8:22           ` Peter Kjellerstedt
  2026-08-27 10:43             ` WXbet
  0 siblings, 1 reply; 11+ messages in thread
From: Peter Kjellerstedt @ 2026-08-27  8:22 UTC (permalink / raw)
  To: WXbet@proton.me, bitbake-devel@lists.openembedded.org

> -----Original Message-----
> From: bitbake-devel@lists.openembedded.org <bitbake-devel@lists.openembedded.org> On Behalf Of WXbet via lists.openembedded.org
> Sent: den 26 augusti 2026 17:16
> To: bitbake-devel@lists.openembedded.org
> Subject: Re: [bitbake-devel] [PATCH] knotty: show elapsed time on the task progress bar
> 
> On Wed, Aug 26, 2026 at 04:41 PM, Peter Kjellerstedt wrote:
> > On the other hand, the progress bars that are shown during the initial 
> > phase before the build tasks starts all use Progressbar's own Timer 
> > widget. I think it makes more sense to just use progressbar.Timer() 
> > rather than BBTimer().
> 
> The formatting is deliberate. The running-task lines right below the 
> bar print their time through TerminalFilter.elapsed(), e.g. 16m34s. 
> With progressbar.Timer the bar reads 0:16:34, so the same screen would 
> show two different time formats.

True, but the times that are displayed through elapsed() are shown as 
part of the label for each task. There it makes sense to keep them 
short, and since most tasks run in the matter of seconds or a few 
minutes, always displaying the time with hours is excessive.

The total build time on the other hand is shown as part of the progress 
bar to the right, and can easily reach hours.

> The parsing-phase bars are gone by 
> the time the task bar appears, so they never compete with it.

Not entirely true. This is what it looks like when I build, with the 
default Timer() enabled in the overall tasks progress bar:

Initialising tasks: 100% |######################################################| Time: 0:00:07
Checking sstate mirror object availability (475): 100% |########################| Time: 0:00:00
Sstate summary: Wanted 475 Local 0 Mirrors 0 Missed 475 Current 10917 (0% match, 95% complete)
NOTE: Executing Tasks
1 running tasks (21335 of 21694)  98% |##############################   | Elapsed Time: 0:00:00

So using Progressbar's formatting matches the already existing 
progress bars.

> 
> Timer.format_time is a staticmethod and Timer defines __slots__, so it 
> cannot be replaced per instance, hence the small subclass.
> 
> If you prefer consistency with progressbar's own format, this one-liner 
> does it instead and I am happy to send it as v2:
> 
> -                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar()]
> +                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar(), ' ', progressbar.Timer(format='Elapsed: %s')]

No need for as special format, the default is "Elapsed Time: %s" and I 
think it makes sense to keep the "Time" part:

                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar(), ' ', progressbar.Timer()]

That said, I like having the total time in the progress bar. I always 
run my builds as `time bitbake ...` so that I have the total build time
afterwards, but having the currently elapsed time is very nice as well.

//Peter


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v2] knotty: show elapsed time on the task progress bar
  2026-08-19  9:33     ` WXbet
  2026-08-26 13:03       ` WXbet
  2026-08-26 14:41       ` [bitbake-devel] " Peter Kjellerstedt
@ 2026-08-27 10:01       ` WXbet
  2026-09-05 19:14         ` WXbet
  2 siblings, 1 reply; 11+ messages in thread
From: WXbet @ 2026-08-27 10:01 UTC (permalink / raw)
  To: bitbake-devel; +Cc: peter.kjellerstedt, WXbet

The progress bar for the overall build shows a percentage and a bar but no
elapsed time, although a build easily runs for hours.

Add progressbar's Timer widget to it, which prints the same way as the bars
of the initialisation phase that stay on screen above it.

Signed-off-by: WXbet <wxbet.oe@gmail.com>
---
 lib/bb/ui/knotty.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py
index 15025e8dd..1a3198b5c 100644
--- a/lib/bb/ui/knotty.py
+++ b/lib/bb/ui/knotty.py
@@ -354,7 +354,7 @@ class TerminalFilter(object):
                 msg = "Currently %2s running tasks (%s)" % (len(activetasks), cur_tasks)
             maxtask = self.helper.tasknumber_total
             if not self.main_progress or self.main_progress.maxval != maxtask:
-                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar()]
+                widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar(), ' ', progressbar.Timer()]
                 self.main_progress = BBProgress("Running tasks", maxtask, widgets=widgets, resize_handler=self.sigwinch_handle)
                 self.main_progress.fd = self._footer_buf
                 self.main_progress.start(False)


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] knotty: show elapsed time on the task progress bar
  2026-08-27  8:22           ` [bitbake-devel] " Peter Kjellerstedt
@ 2026-08-27 10:43             ` WXbet
  0 siblings, 0 replies; 11+ messages in thread
From: WXbet @ 2026-08-27 10:43 UTC (permalink / raw)
  To: bitbake-devel

[-- Attachment #1: Type: text/plain, Size: 218 bytes --]

Okay, then please check v2: bitbake-devel@lists.openembedded.org | [PATCH v2] knotty: show elapsed time on the task progress bar ( https://lists.openembedded.org/g/bitbake-devel/topic/patch_v2_knotty_show/120953856 )

[-- Attachment #2: Type: text/html, Size: 239 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] knotty: show elapsed time on the task progress bar
  2026-08-27 10:01       ` [PATCH v2] " WXbet
@ 2026-09-05 19:14         ` WXbet
  0 siblings, 0 replies; 11+ messages in thread
From: WXbet @ 2026-09-05 19:14 UTC (permalink / raw)
  To: bitbake-devel

[-- Attachment #1: Type: text/plain, Size: 21 bytes --]

Any update on this?

[-- Attachment #2: Type: text/html, Size: 32 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2026-09-05 19:14 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-18 19:39 [PATCH] knotty: show elapsed time on the task progress bar WXbet
2026-08-18 19:54 ` WXbet
2026-08-19  8:22   ` [bitbake-devel] " Alexander Kanavin
2026-08-19  9:33     ` WXbet
2026-08-26 13:03       ` WXbet
2026-08-26 14:41       ` [bitbake-devel] " Peter Kjellerstedt
2026-08-26 15:15         ` WXbet
2026-08-27  8:22           ` [bitbake-devel] " Peter Kjellerstedt
2026-08-27 10:43             ` WXbet
2026-08-27 10:01       ` [PATCH v2] " WXbet
2026-09-05 19:14         ` WXbet

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).