unofficial mirror of bug-guix@gnu.org 
 help / color / mirror / code / Atom feed
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
To: raid5atemyhomework <raid5atemyhomework@protonmail.com>
Cc: Efraim Flashner <efraim@flashner.co.il>,
	"51498@debbugs.gnu.org" <51498-done@debbugs.gnu.org>
Subject: bug#51498: onionshare build is broken
Date: Mon, 11 Jul 2022 23:58:01 -0400	[thread overview]
Message-ID: <87k08j9e46.fsf@gmail.com> (raw)
In-Reply-To: <71NrR9CIatwqC45LYY-6AWdyugCrijO3vc409GY_eDSCIg9wnzFAE3CerYB3r0zkY16fwraexVge-RKIQPquf0cDHrFRfnXHMGrEdfKAqh0=@protonmail.com> (raid5atemyhomework@protonmail.com's message of "Fri, 05 Nov 2021 01:31:24 +0000")

Hi,

raid5atemyhomework <raid5atemyhomework@protonmail.com> writes:

>> > Can you test it again? I was able to build it just now with commit
>> > c0c974ad96767a1e207fe2823cd5479605485415. I was also able to build it
>> > with your provided commit above.
>>
>> Having diverging results suggests a nondeterministic build, which is
>> bad, right? I'm running on a Guix System machine running directly on
>> the metal.
>
> On a Guix on top of a foreign distro, I got:
>
> * good: `guix time-machine --commit=ebc274063716a3a9471f51abb526d693c06b9f63 -- build onionshare`
>   * result: `/gnu/store/ynkjlqh9sjr72blfvvxrj86cgjpa270l-onionshare-2.3.2`
>
> Looks like nondeterminism?
>
> On the machine where the build is failing, this is the stanza where the tests start going wrong:
>
> ```
> tests/test_gui_share.py::TestShare::test_401_public_skips_ratelimit PASSED [  5%]
> tests/test_gui_share.py::TestShare::test_401_triggers_ratelimit PASSED   [ 10%]
> tests/test_gui_share.py::TestShare::test_405_page_returned_for_invalid_methods PASSED [ 15%]
> tests/test_gui_share.py::TestShare::test_autostart_and_autostop_timer_mismatch SKIPPED [ 21%]
> tests/test_gui_share.py::TestShare::test_autostart_timer SKIPPED         [ 26%]
> tests/test_gui_share.py::TestShare::test_autostart_timer_cancel PASSED   [ 31%]
> tests/test_gui_share.py::TestShare::test_autostart_timer_too_short SKIPPED [ 36%]
> tests/test_gui_share.py::TestShare::test_autostop_timer SKIPPED          [ 42%]
> tests/test_gui_share.py::TestShare::test_autostop_timer_too_short SKIPPED [ 47%]
> tests/test_gui_share.py::TestShare::test_clear_all_history_button PASSED [ 52%]
> tests/test_gui_share.py::TestShare::test_download PASSED                 [ 57%]
> tests/test_gui_share.py::TestShare::test_individual_files PASSED         [ 63%]
> tests/test_gui_share.py::TestShare::test_individual_files_without_autostop_sharing PASSED [ 68%]
> tests/test_gui_share.py::TestShare::test_large_download FAILED           [ 73%]
> tests/test_gui_share.py::TestShare::test_persistent_password FAILED      [ 78%]
> tests/test_gui_share.py::TestShare::test_public_mode FAILED              [ 84%]
> tests/test_gui_share.py::TestShare::test_remove_all_file_selection_button FAILED [ 89%]
> tests/test_gui_share.py::TestShare::test_unreadable_file FAILED          [ 94%]
> tests/test_gui_share.py::TestShare::test_without_autostop_sharing FAILED [100%]
> ```

I was able to reproduce the nondeterministic failure; on my system it
gave:

--8<---------------cut here---------------start------------->8---
=================================== FAILURES ===================================
________________________ TestShare.test_large_download _________________________

self = <tests.test_gui_share.TestShare testMethod=test_large_download>

    def test_large_download(self):
        """
        Test a large download
        """
        tab = self.new_share_tab()
    
        self.run_all_common_setup_tests()
        self.run_all_share_mode_setup_tests(tab)
        tab.get_mode().server_status.file_selection.file_list.add_file(
            self.tmpfile_large
        )
>       self.run_all_share_mode_started_tests(tab, startup_time=15000)

tests/test_gui_share.py:432: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/test_gui_share.py:183: in run_all_share_mode_started_tests
    self.server_is_started(tab, startup_time)
tests/gui_base_test.py:249: in server_is_started
    self.assertEqual(tab.get_mode().server_status.status, 2)
E   AssertionError: 1 != 2
----------------------------- Captured stdout call -----------------------------
[Jul 11 2022 10:05:58 PM] Tab.share_mode_clicked
[Jul 11 2022 10:05:58 PM] Web.__init__: is_gui=True, mode=share
[Jul 11 2022 10:05:58 PM] Common.get_resource_path: filename=static
[Jul 11 2022 10:05:58 PM] Common.get_resource_path: filename=static, path=/gnu/store/dg59r5qmksn2llkbqxbzj4zw3xvcfppp-onionshare-cli-2.4/lib/python3.9/site-packages/onionshare_cli/resources/static
[Jul 11 2022 10:05:58 PM] Common.get_resource_path: filename=templates
[Jul 11 2022 10:05:58 PM] Common.get_resource_path: filename=templates, path=/gnu/store/dg59r5qmksn2llkbqxbzj4zw3xvcfppp-onionshare-cli-2.4/lib/python3.9/site-packages/onionshare_cli/resources/templates
[Jul 11 2022 10:05:58 PM] Web.generate_static_url_path: new static_url_path is /static_uosd2rkf6txcyiop4jrurdpxtu
[Jul 11 2022 10:05:58 PM] ShareModeWeb.init
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = []
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/640bf8a6.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/640bf8a6.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/c31c4eeb.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ToggleHistory.toggle_clicked
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/640bf8a6.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/c31c4eeb.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/640bf8a6.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/c31c4eeb.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/c31c4eeb.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/c31c4eeb.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/c31c4eeb.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/c31c4eeb.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/640bf8a6.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/640bf8a6.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/640bf8a6.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/c31c4eeb.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/640bf8a6.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/c31c4eeb.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/large_file', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt']
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] ShareMode.update_primary_action
[Jul 11 2022 10:05:58 PM] ServerStatus.update
[Jul 11 2022 10:05:58 PM] Mode.start_server
[Jul 11 2022 10:05:58 PM] Mode.start_server: Starting an onion thread
[Jul 11 2022 10:05:58 PM] OnionThread.__init__
[Jul 11 2022 10:05:58 PM] ModeSettings.set: updating undress-coyness-anime: share.filenames = ['/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/640bf8a6.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/c31c4eeb.txt', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/large_file', '/tmp/guix-build-onionshare-2.4.drv-0/tmpx624akaf/test.txt'][Jul 11 2022 10:05:58 PM] OnionThread.run

[Jul 11 2022 10:05:58 PM] Web.generate_static_url_path: new static_url_path is /static_76kyy3l57efdgiew6xhqlusxca
[Jul 11 2022 10:05:58 PM] OnionShare.start_onion_service
[Jul 11 2022 10:05:59 PM] WebThread.__init__
[Jul 11 2022 10:05:59 PM] WebThread.run[Jul 11 2022 10:05:59 PM] Mode.start_server_step2

[Jul 11 2022 10:05:59 PM] Web.start: port=17618
[Jul 11 2022 10:05:59 PM] CompressThread.__init__
[Jul 11 2022 10:05:59 PM] CompressThread.run
[Jul 11 2022 10:05:59 PM] ShareModeWeb.init
[Jul 11 2022 10:05:59 PM] ShareModeWeb.set_file_info_custom
[Jul 11 2022 10:05:59 PM] ShareModeWeb.build_zipfile_list
----------------------------- Captured stderr call -----------------------------
This plugin does not support setParent!
------------------------------ Captured log call -------------------------------
INFO     werkzeug:_internal.py:225  * Running on http://127.0.0.1:17618/ (Press CTRL+C to quit)
__________________________ TestShare.test_public_mode __________________________

self = <tests.test_gui_share.TestShare testMethod=test_public_mode>

    def test_public_mode(self):
        """
        Public mode shouldn't have a password
        """
>       tab = self.new_share_tab()

tests/test_gui_share.py:367: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gui_base_test.py:88: in new_share_tab
    self.verify_new_tab(tab)
tests/gui_base_test.py:80: in verify_new_tab
    self.assertTrue(tab.new_tab.isVisible())
E   AssertionError: False is not true
----------------------------- Captured stdout call -----------------------------
[Jul 11 2022 10:06:14 PM] Mode.start_server_step3
[Jul 11 2022 10:06:14 PM] ServerStatus.update
[Jul 11 2022 10:06:14 PM] Settings.load
_______________ TestShare.test_remove_all_file_selection_button ________________

self = <tests.test_gui_share.TestShare testMethod=test_remove_all_file_selection_button>

    def test_remove_all_file_selection_button(self):
        """
        Test remove all file items at once
        """
>       tab = self.new_share_tab()

tests/test_gui_share.py:356: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gui_base_test.py:88: in new_share_tab
    self.verify_new_tab(tab)
tests/gui_base_test.py:80: in verify_new_tab
    self.assertTrue(tab.new_tab.isVisible())
E   AssertionError: False is not true
________________________ TestShare.test_unreadable_file ________________________

self = <tests.test_gui_share.TestShare testMethod=test_unreadable_file>

    def test_unreadable_file(self):
        """
        Sharing an unreadable file should throw a warning
        """
>       tab = self.new_share_tab()

tests/test_gui_share.py:489: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gui_base_test.py:88: in new_share_tab
    self.verify_new_tab(tab)
tests/gui_base_test.py:80: in verify_new_tab
    self.assertTrue(tab.new_tab.isVisible())
E   AssertionError: False is not true
___________________ TestShare.test_without_autostop_sharing ____________________

self = <tests.test_gui_share.TestShare testMethod=test_without_autostop_sharing>

    def test_without_autostop_sharing(self):
        """
        Disable autostop sharing after first download
        """
>       tab = self.new_share_tab()

tests/test_gui_share.py:379: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gui_base_test.py:88: in new_share_tab
    self.verify_new_tab(tab)
tests/gui_base_test.py:80: in verify_new_tab
    self.assertTrue(tab.new_tab.isVisible())
E   AssertionError: False is not true
--------------------------- Captured stdout teardown ---------------------------
[Jul 11 2022 10:06:18 PM] MainWindow.closeEvent
[Jul 11 2022 10:06:18 PM] MainWindow.closeEvent, opening warning dialog
[Jul 11 2022 10:06:18 PM] MainWindow.cleanup
[Jul 11 2022 10:06:18 PM] TabWidget.cleanup
[Jul 11 2022 10:06:18 PM] Tab.cleanup: tab_id=8
[Jul 11 2022 10:06:18 PM] Web.stop: stopping server
[Jul 11 2022 10:06:19 PM] Web.cleanup
[Jul 11 2022 10:06:19 PM] Alert.__init__
[Jul 11 2022 10:06:19 PM] OnionCleanupThread.__init__
[Jul 11 2022 10:06:19 PM] OnionCleanupThread.run
[Jul 11 2022 10:06:19 PM] Onion.cleanup
--------------------------- Captured stderr teardown ---------------------------
This plugin does not support propagateSizeHints()
This plugin does not support propagateSizeHints()
---------------------------- Captured log teardown -----------------------------
INFO     werkzeug:_internal.py:225 127.0.0.1 - - [11/Jul/2022 22:06:18] "GET /xwpum3u67ltpl525lvd3tgghce/shutdown HTTP/1.1" 200 -
=============================== warnings summary ===============================
tests/conftest.py:75
  /tmp/guix-build-onionshare-2.4.drv-0/source/desktop/tests/conftest.py:75: PytestDeprecationWarning: @pytest.yield_fixture is deprecated.
  Use @pytest.fixture instead; they are the same.
    def temp_dir_1024_delete(temp_dir):

tests/conftest.py:99
  /tmp/guix-build-onionshare-2.4.drv-0/source/desktop/tests/conftest.py:99: PytestDeprecationWarning: @pytest.yield_fixture is deprecated.
  Use @pytest.fixture instead; they are the same.
    def temp_file_1024_delete(temp_dir):

tests/conftest.py:113
  /tmp/guix-build-onionshare-2.4.drv-0/source/desktop/tests/conftest.py:113: PytestDeprecationWarning: @pytest.yield_fixture is deprecated.
  Use @pytest.fixture instead; they are the same.
    @pytest.yield_fixture(scope="session")

tests/conftest.py:126
  /tmp/guix-build-onionshare-2.4.drv-0/source/desktop/tests/conftest.py:126: PytestDeprecationWarning: @pytest.yield_fixture is deprecated.
  Use @pytest.fixture instead; they are the same.
    @pytest.yield_fixture(scope="session")

tests/test_gui_share.py::TestShare::test_405_page_returned_for_invalid_methods
tests/test_gui_share.py::TestShare::test_clear_all_history_button
tests/test_gui_share.py::TestShare::test_client_auth
tests/test_gui_share.py::TestShare::test_individual_files_without_autostop_sharing
tests/test_gui_share.py::TestShare::test_without_autostop_sharing
  /gnu/store/dg59r5qmksn2llkbqxbzj4zw3xvcfppp-onionshare-cli-2.4/lib/python3.9/site-packages/onionshare_cli/web/web.py:317: UserWarning: The 'environ['werkzeug.server.shutdown']' function is deprecated and will be removed in Werkzeug 2.1.
    func()

tests/test_gui_share.py::TestShare::test_download
tests/test_gui_share.py::TestShare::test_individual_files
  /gnu/store/dg59r5qmksn2llkbqxbzj4zw3xvcfppp-onionshare-cli-2.4/lib/python3.9/site-packages/onionshare_cli/web/share_mode.py:387: UserWarning: The 'environ['werkzeug.server.shutdown']' function is deprecated and will be removed in Werkzeug 2.1.
    shutdown_func()

-- Docs: https://docs.pytest.org/en/stable/warnings.html
=========================== short test summary info ============================
FAILED tests/test_gui_share.py::TestShare::test_large_download - AssertionErr...
FAILED tests/test_gui_share.py::TestShare::test_public_mode - AssertionError:...
FAILED tests/test_gui_share.py::TestShare::test_remove_all_file_selection_button
FAILED tests/test_gui_share.py::TestShare::test_unreadable_file - AssertionEr...
FAILED tests/test_gui_share.py::TestShare::test_without_autostop_sharing - As...
======== 5 failed, 7 passed, 5 skipped, 11 warnings in 73.66s (0:01:13) ========
error: in phase 'check': uncaught exception:
%exception #<&invoke-error program: "./tests/run.sh" arguments: () exit-status: 1 term-signal: #f stop-signal: #f> 
phase `check' failed after 97.3 seconds
command "./tests/run.sh" failed with status 1
--8<---------------cut here---------------end--------------->8---

So the first thing I tried was updating onionshare to 2.5; unfortunately
the tests got even more problematic to run, so I asked guidance upstream
and disabled the test suite for now, after trying to make things work
for a good while (see commit aedd7dc8e085788fbaf066754eb3387edb719335).

At least it won't fail nondeterministically!

Thanks for the report.

Closing.

Maxim




      reply	other threads:[~2022-07-12  4:00 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-30  2:53 bug#51498: onionshare build is broken raid5atemyhomework via Bug reports for GNU Guix
2021-10-30  3:05 ` raid5atemyhomework via Bug reports for GNU Guix
2021-11-01 10:37 ` Efraim Flashner
2021-11-05  1:21   ` raid5atemyhomework via Bug reports for GNU Guix
2021-11-05  1:31     ` raid5atemyhomework via Bug reports for GNU Guix
2022-07-12  3:58       ` Maxim Cournoyer [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87k08j9e46.fsf@gmail.com \
    --to=maxim.cournoyer@gmail.com \
    --cc=51498-done@debbugs.gnu.org \
    --cc=efraim@flashner.co.il \
    --cc=raid5atemyhomework@protonmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

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).