public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2] gdb/testsuite: relax filename restriction in some gdb.btrace tests
@ 2024-01-02 14:08 Guinevere Larsen
  2024-01-17  9:10 ` [PING][PATCH " Guinevere Larsen
  2024-01-19 17:15 ` [PATCH " Tom Tromey
  0 siblings, 2 replies; 3+ messages in thread
From: Guinevere Larsen @ 2024-01-02 14:08 UTC (permalink / raw)
  To: gdb-patches; +Cc: schwab, Guinevere Larsen

The test gdb.btrace/tailcall.exp has multiple tests that include the
filename in the output. When testing with gcc, only a relative path is
printed, but when using clang, the full file path is printed instead.
This makes most of those tests fail, with the exception of "record goto
4" which allows for more characters before the file name. The test
gdb.btrace/recod_goto.exp suffers with the same issue

This commit allows for text before the filename. However, instead of how
the aforementioned "record goto 4", it uses a regexp that doesn't allow
for newlines, just in case some off output happens.
---
 gdb/testsuite/gdb.btrace/record_goto.exp | 27 ++++++++++-------
 gdb/testsuite/gdb.btrace/tailcall.exp    | 37 ++++++++++++++----------
 2 files changed, 37 insertions(+), 27 deletions(-)

diff --git a/gdb/testsuite/gdb.btrace/record_goto.exp b/gdb/testsuite/gdb.btrace/record_goto.exp
index 1817ac07f51..6a7b2dfd0e8 100644
--- a/gdb/testsuite/gdb.btrace/record_goto.exp
+++ b/gdb/testsuite/gdb.btrace/record_goto.exp
@@ -51,6 +51,11 @@ if ![runto_main] {
     return -1
 }
 
+# When GDB prints the file for a stop location, it may print the full path
+# depending on what information the compiler added.  This regexp allows for
+# that path to be present, but does not require it.
+set optional_filepath {[^\n]*}
+
 # we want a small context sizes to simplify the test
 gdb_test_no_output "set record instruction-history-size 3"
 gdb_test_no_output "set record function-call-history-size 3"
@@ -80,7 +85,7 @@ gdb_test "record function-call-history /ci 1, +20" [multi_line \
   ]
 
 # let's see if we can go back in history
-gdb_test "record goto 19" ".*fun4 \\(\\) at record_goto.c:43.*"
+gdb_test "record goto 19" ".*fun4 \\(\\) at ${optional_filepath}record_goto.c:43.*"
 
 # the function call history should start at the new location
 gdb_test "record function-call-history /ci" [multi_line \
@@ -97,19 +102,19 @@ gdb_test "record instruction-history" [multi_line \
   ] "instruction-history from 19 forwards"
 
 # let's go to another place in the history
-gdb_test "record goto 27" ".*fun3 \\(\\) at record_goto.c:35.*"
+gdb_test "record goto 27" ".*fun3 \\(\\) at ${optional_filepath}record_goto.c:35.*"
 
 # check the back trace at that location
 gdb_test "backtrace" [multi_line \
-  "#0.*fun3.*at record_goto.c:35.*" \
-  "#1.*fun4.*at record_goto.c:43.*" \
-  "#2.*main.*at record_goto.c:49.*" \
+  "#0.*fun3.*at ${optional_filepath}record_goto.c:35.*" \
+  "#1.*fun4.*at ${optional_filepath}record_goto.c:43.*" \
+  "#2.*main.*at ${optional_filepath}record_goto.c:49.*" \
   "Backtrace stopped: not enough registers or memory available to unwind further" \
   ]
 
 # walk the backtrace
-gdb_test "up" ".*fun4.*at record_goto.c:43.*" "up to fun4"
-gdb_test "up" ".*main.*at record_goto.c:49.*" "up to main"
+gdb_test "up" ".*fun4.*at ${optional_filepath}record_goto.c:43.*" "up to fun4"
+gdb_test "up" ".*main.*at ${optional_filepath}record_goto.c:49.*" "up to main"
 
 # the function call history should start at the new location
 gdb_test "record function-call-history /ci -" [multi_line \
@@ -126,7 +131,7 @@ gdb_test "record instruction-history -" [multi_line \
   ] "instruction-history from 27 backwards"
 
 # test that we can go to the begin of the trace
-gdb_test "record goto begin" ".*main \\(\\) at record_goto.c:49.*"
+gdb_test "record goto begin" ".*main \\(\\) at ${optional_filepath}record_goto.c:49.*"
 
 # check that we're filling up the context correctly
 gdb_test "record function-call-history /ci -" [multi_line \
@@ -143,7 +148,7 @@ gdb_test "record instruction-history -" [multi_line \
   ] "instruction-history from begin backwards"
 
 # we should get the exact same history from the first instruction
-gdb_test "record goto 2" ".*fun4 \\(\\) at record_goto.c:40.*"
+gdb_test "record goto 2" ".*fun4 \\(\\) at ${optional_filepath}record_goto.c:40.*"
 
 # check that we're filling up the context correctly
 gdb_test "record function-call-history /ci -" [multi_line \
@@ -160,7 +165,7 @@ gdb_test "record instruction-history -" [multi_line \
   ] "instruction-history from 2 backwards"
 
 # check that we can go to the end of the trace
-gdb_test "record goto end" ".*main \\(\\) at record_goto.c:50.*"
+gdb_test "record goto end" ".*main \\(\\) at ${optional_filepath}record_goto.c:50.*"
 
 # check that we're filling up the context correctly
 gdb_test "record function-call-history /ci" [multi_line \
@@ -177,7 +182,7 @@ gdb_test "record instruction-history" [multi_line \
   ] "instruction-history from end forwards"
 
 # we should get the exact same history from the second to last instruction
-gdb_test "record goto 39" ".*fun4 \\(\\) at record_goto.c:44.*"
+gdb_test "record goto 39" ".*fun4 \\(\\) at ${optional_filepath}record_goto.c:44.*"
 
 # check that we're filling up the context correctly
 gdb_test "record function-call-history /ci" [multi_line \
diff --git a/gdb/testsuite/gdb.btrace/tailcall.exp b/gdb/testsuite/gdb.btrace/tailcall.exp
index 7fbcd40c077..757538dd5e4 100644
--- a/gdb/testsuite/gdb.btrace/tailcall.exp
+++ b/gdb/testsuite/gdb.btrace/tailcall.exp
@@ -49,6 +49,11 @@ if ![runto_main] {
     return -1
 }
 
+# When GDB prints the file for a stop location, it may print the full path
+# depending on what information the compiler added.  This regexp allows for
+# that path to be present, but does not require it.
+set optional_filepath {[^\n]*}
+
 # we want to see the full trace for this test
 gdb_test_no_output "set record function-call-history-size 0"
 
@@ -73,39 +78,39 @@ gdb_test "record function-call-history /c 1" [multi_line \
   ] "indented"
 
 # go into bar
-gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*"
+gdb_test "record goto 4" ".*bar \\(\\) at ${optional_filepath}tailcall.c:24\r\n.*"
 
 # check the backtrace
 gdb_test "backtrace" [multi_line \
-  "#0.*bar \\(\\) at tailcall.c:24" \
-  "#1.*foo \\(\\) at tailcall.c:29" \
-  "#2.*main \\(\\) at tailcall.c:37" \
+  "#0.*bar \\(\\) at ${optional_filepath}tailcall.c:24" \
+  "#1.*foo \\(\\) at ${optional_filepath}tailcall.c:29" \
+  "#2.*main \\(\\) at ${optional_filepath}tailcall.c:37" \
   "Backtrace stopped: not enough registers or memory available to unwind further" \
   ]
 
 # walk the backtrace
-gdb_test "up" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" "up to foo"
-gdb_test "up" "#2\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" "up to main"
-gdb_test "down" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" "down to foo"
+gdb_test "up" "#1\[^\r\n\]*foo \\(\\) at ${optional_filepath}tailcall.c:29\r\n.*" "up to foo"
+gdb_test "up" "#2\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:37\r\n.*" "up to main"
+gdb_test "down" "#1\[^\r\n\]*foo \\(\\) at ${optional_filepath}tailcall.c:29\r\n.*" "down to foo"
 
 # test stepping into and out of tailcalls.
-gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \
+gdb_test "finish" "\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:38\r\n.*" \
     "finish.1"
-gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" \
+gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at ${optional_filepath}tailcall.c:24\r\n.*" \
     "reverse-step.1"
-gdb_test "reverse-finish" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" \
+gdb_test "reverse-finish" "\[^\r\n\]*foo \\(\\) at ${optional_filepath}tailcall.c:29\r\n.*" \
     "reverse-finish.1"
-gdb_test "reverse-step" "\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" \
+gdb_test "reverse-step" "\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:37\r\n.*" \
     "reverse-step.2"
 gdb_test "next" "\[^\r\n\]*38.*" \
     "next.1"
-gdb_test "reverse-next" "\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" \
+gdb_test "reverse-next" "\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:37\r\n.*" \
     "reverse-next.1"
-gdb_test "step" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" \
+gdb_test "step" "\[^\r\n\]*foo \\(\\) at ${optional_filepath}tailcall.c:29\r\n.*" \
     "step.1"
-gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \
+gdb_test "finish" "\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:38\r\n.*" \
     "finish.2"
-gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" \
+gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at ${optional_filepath}tailcall.c:24\r\n.*" \
     "reverse-step.3"
-gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \
+gdb_test "finish" "\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:38\r\n.*" \
     "finish.3"
-- 
2.43.0


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

* [PING][PATCH v2] gdb/testsuite: relax filename restriction in some gdb.btrace tests
  2024-01-02 14:08 [PATCH v2] gdb/testsuite: relax filename restriction in some gdb.btrace tests Guinevere Larsen
@ 2024-01-17  9:10 ` Guinevere Larsen
  2024-01-19 17:15 ` [PATCH " Tom Tromey
  1 sibling, 0 replies; 3+ messages in thread
From: Guinevere Larsen @ 2024-01-17  9:10 UTC (permalink / raw)
  To: gdb-patches, Guinevere Larsen

Ping!
On 02/01/2024 15:08, Guinevere Larsen wrote:
> The test gdb.btrace/tailcall.exp has multiple tests that include the
> filename in the output. When testing with gcc, only a relative path is
> printed, but when using clang, the full file path is printed instead.
> This makes most of those tests fail, with the exception of "record goto
> 4" which allows for more characters before the file name. The test
> gdb.btrace/recod_goto.exp suffers with the same issue
>
> This commit allows for text before the filename. However, instead of how
> the aforementioned "record goto 4", it uses a regexp that doesn't allow
> for newlines, just in case some off output happens.
> ---
>   gdb/testsuite/gdb.btrace/record_goto.exp | 27 ++++++++++-------
>   gdb/testsuite/gdb.btrace/tailcall.exp    | 37 ++++++++++++++----------
>   2 files changed, 37 insertions(+), 27 deletions(-)
>
> diff --git a/gdb/testsuite/gdb.btrace/record_goto.exp b/gdb/testsuite/gdb.btrace/record_goto.exp
> index 1817ac07f51..6a7b2dfd0e8 100644
> --- a/gdb/testsuite/gdb.btrace/record_goto.exp
> +++ b/gdb/testsuite/gdb.btrace/record_goto.exp
> @@ -51,6 +51,11 @@ if ![runto_main] {
>       return -1
>   }
>   
> +# When GDB prints the file for a stop location, it may print the full path
> +# depending on what information the compiler added.  This regexp allows for
> +# that path to be present, but does not require it.
> +set optional_filepath {[^\n]*}
> +
>   # we want a small context sizes to simplify the test
>   gdb_test_no_output "set record instruction-history-size 3"
>   gdb_test_no_output "set record function-call-history-size 3"
> @@ -80,7 +85,7 @@ gdb_test "record function-call-history /ci 1, +20" [multi_line \
>     ]
>   
>   # let's see if we can go back in history
> -gdb_test "record goto 19" ".*fun4 \\(\\) at record_goto.c:43.*"
> +gdb_test "record goto 19" ".*fun4 \\(\\) at ${optional_filepath}record_goto.c:43.*"
>   
>   # the function call history should start at the new location
>   gdb_test "record function-call-history /ci" [multi_line \
> @@ -97,19 +102,19 @@ gdb_test "record instruction-history" [multi_line \
>     ] "instruction-history from 19 forwards"
>   
>   # let's go to another place in the history
> -gdb_test "record goto 27" ".*fun3 \\(\\) at record_goto.c:35.*"
> +gdb_test "record goto 27" ".*fun3 \\(\\) at ${optional_filepath}record_goto.c:35.*"
>   
>   # check the back trace at that location
>   gdb_test "backtrace" [multi_line \
> -  "#0.*fun3.*at record_goto.c:35.*" \
> -  "#1.*fun4.*at record_goto.c:43.*" \
> -  "#2.*main.*at record_goto.c:49.*" \
> +  "#0.*fun3.*at ${optional_filepath}record_goto.c:35.*" \
> +  "#1.*fun4.*at ${optional_filepath}record_goto.c:43.*" \
> +  "#2.*main.*at ${optional_filepath}record_goto.c:49.*" \
>     "Backtrace stopped: not enough registers or memory available to unwind further" \
>     ]
>   
>   # walk the backtrace
> -gdb_test "up" ".*fun4.*at record_goto.c:43.*" "up to fun4"
> -gdb_test "up" ".*main.*at record_goto.c:49.*" "up to main"
> +gdb_test "up" ".*fun4.*at ${optional_filepath}record_goto.c:43.*" "up to fun4"
> +gdb_test "up" ".*main.*at ${optional_filepath}record_goto.c:49.*" "up to main"
>   
>   # the function call history should start at the new location
>   gdb_test "record function-call-history /ci -" [multi_line \
> @@ -126,7 +131,7 @@ gdb_test "record instruction-history -" [multi_line \
>     ] "instruction-history from 27 backwards"
>   
>   # test that we can go to the begin of the trace
> -gdb_test "record goto begin" ".*main \\(\\) at record_goto.c:49.*"
> +gdb_test "record goto begin" ".*main \\(\\) at ${optional_filepath}record_goto.c:49.*"
>   
>   # check that we're filling up the context correctly
>   gdb_test "record function-call-history /ci -" [multi_line \
> @@ -143,7 +148,7 @@ gdb_test "record instruction-history -" [multi_line \
>     ] "instruction-history from begin backwards"
>   
>   # we should get the exact same history from the first instruction
> -gdb_test "record goto 2" ".*fun4 \\(\\) at record_goto.c:40.*"
> +gdb_test "record goto 2" ".*fun4 \\(\\) at ${optional_filepath}record_goto.c:40.*"
>   
>   # check that we're filling up the context correctly
>   gdb_test "record function-call-history /ci -" [multi_line \
> @@ -160,7 +165,7 @@ gdb_test "record instruction-history -" [multi_line \
>     ] "instruction-history from 2 backwards"
>   
>   # check that we can go to the end of the trace
> -gdb_test "record goto end" ".*main \\(\\) at record_goto.c:50.*"
> +gdb_test "record goto end" ".*main \\(\\) at ${optional_filepath}record_goto.c:50.*"
>   
>   # check that we're filling up the context correctly
>   gdb_test "record function-call-history /ci" [multi_line \
> @@ -177,7 +182,7 @@ gdb_test "record instruction-history" [multi_line \
>     ] "instruction-history from end forwards"
>   
>   # we should get the exact same history from the second to last instruction
> -gdb_test "record goto 39" ".*fun4 \\(\\) at record_goto.c:44.*"
> +gdb_test "record goto 39" ".*fun4 \\(\\) at ${optional_filepath}record_goto.c:44.*"
>   
>   # check that we're filling up the context correctly
>   gdb_test "record function-call-history /ci" [multi_line \
> diff --git a/gdb/testsuite/gdb.btrace/tailcall.exp b/gdb/testsuite/gdb.btrace/tailcall.exp
> index 7fbcd40c077..757538dd5e4 100644
> --- a/gdb/testsuite/gdb.btrace/tailcall.exp
> +++ b/gdb/testsuite/gdb.btrace/tailcall.exp
> @@ -49,6 +49,11 @@ if ![runto_main] {
>       return -1
>   }
>   
> +# When GDB prints the file for a stop location, it may print the full path
> +# depending on what information the compiler added.  This regexp allows for
> +# that path to be present, but does not require it.
> +set optional_filepath {[^\n]*}
> +
>   # we want to see the full trace for this test
>   gdb_test_no_output "set record function-call-history-size 0"
>   
> @@ -73,39 +78,39 @@ gdb_test "record function-call-history /c 1" [multi_line \
>     ] "indented"
>   
>   # go into bar
> -gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*"
> +gdb_test "record goto 4" ".*bar \\(\\) at ${optional_filepath}tailcall.c:24\r\n.*"
>   
>   # check the backtrace
>   gdb_test "backtrace" [multi_line \
> -  "#0.*bar \\(\\) at tailcall.c:24" \
> -  "#1.*foo \\(\\) at tailcall.c:29" \
> -  "#2.*main \\(\\) at tailcall.c:37" \
> +  "#0.*bar \\(\\) at ${optional_filepath}tailcall.c:24" \
> +  "#1.*foo \\(\\) at ${optional_filepath}tailcall.c:29" \
> +  "#2.*main \\(\\) at ${optional_filepath}tailcall.c:37" \
>     "Backtrace stopped: not enough registers or memory available to unwind further" \
>     ]
>   
>   # walk the backtrace
> -gdb_test "up" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" "up to foo"
> -gdb_test "up" "#2\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" "up to main"
> -gdb_test "down" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" "down to foo"
> +gdb_test "up" "#1\[^\r\n\]*foo \\(\\) at ${optional_filepath}tailcall.c:29\r\n.*" "up to foo"
> +gdb_test "up" "#2\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:37\r\n.*" "up to main"
> +gdb_test "down" "#1\[^\r\n\]*foo \\(\\) at ${optional_filepath}tailcall.c:29\r\n.*" "down to foo"
>   
>   # test stepping into and out of tailcalls.
> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \
> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:38\r\n.*" \
>       "finish.1"
> -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" \
> +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at ${optional_filepath}tailcall.c:24\r\n.*" \
>       "reverse-step.1"
> -gdb_test "reverse-finish" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" \
> +gdb_test "reverse-finish" "\[^\r\n\]*foo \\(\\) at ${optional_filepath}tailcall.c:29\r\n.*" \
>       "reverse-finish.1"
> -gdb_test "reverse-step" "\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" \
> +gdb_test "reverse-step" "\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:37\r\n.*" \
>       "reverse-step.2"
>   gdb_test "next" "\[^\r\n\]*38.*" \
>       "next.1"
> -gdb_test "reverse-next" "\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" \
> +gdb_test "reverse-next" "\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:37\r\n.*" \
>       "reverse-next.1"
> -gdb_test "step" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" \
> +gdb_test "step" "\[^\r\n\]*foo \\(\\) at ${optional_filepath}tailcall.c:29\r\n.*" \
>       "step.1"
> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \
> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:38\r\n.*" \
>       "finish.2"
> -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" \
> +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at ${optional_filepath}tailcall.c:24\r\n.*" \
>       "reverse-step.3"
> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \
> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at ${optional_filepath}tailcall.c:38\r\n.*" \
>       "finish.3"


-- 
Cheers,
Guinevere Larsen
She/Her/Hers


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

* Re: [PATCH v2] gdb/testsuite: relax filename restriction in some gdb.btrace tests
  2024-01-02 14:08 [PATCH v2] gdb/testsuite: relax filename restriction in some gdb.btrace tests Guinevere Larsen
  2024-01-17  9:10 ` [PING][PATCH " Guinevere Larsen
@ 2024-01-19 17:15 ` Tom Tromey
  1 sibling, 0 replies; 3+ messages in thread
From: Tom Tromey @ 2024-01-19 17:15 UTC (permalink / raw)
  To: Guinevere Larsen; +Cc: gdb-patches, schwab

>>>>> "Guinevere" == Guinevere Larsen <blarsen@redhat.com> writes:

Guinevere> The test gdb.btrace/tailcall.exp has multiple tests that include the
Guinevere> filename in the output. When testing with gcc, only a relative path is
Guinevere> printed, but when using clang, the full file path is printed instead.
Guinevere> This makes most of those tests fail, with the exception of "record goto
Guinevere> 4" which allows for more characters before the file name. The test
Guinevere> gdb.btrace/recod_goto.exp suffers with the same issue

Guinevere> This commit allows for text before the filename. However, instead of how
Guinevere> the aforementioned "record goto 4", it uses a regexp that doesn't allow
Guinevere> for newlines, just in case some off output happens.

Looks good to me, thank you.
Approved-By: Tom Tromey <tom@tromey.com>

Tom

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

end of thread, other threads:[~2024-01-19 17:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-02 14:08 [PATCH v2] gdb/testsuite: relax filename restriction in some gdb.btrace tests Guinevere Larsen
2024-01-17  9:10 ` [PING][PATCH " Guinevere Larsen
2024-01-19 17:15 ` [PATCH " Tom Tromey

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 read-only IMAP folder(s) and NNTP newsgroup(s).