<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>email &amp;mdash; csantosb</title>
    <link>https://infosec.press/csantosb/tag:email</link>
    <description>Random thoughts</description>
    <pubDate>Wed, 13 May 2026 23:20:10 +0000</pubDate>
    <item>
      <title>sourcehut as guix test farm</title>
      <link>https://infosec.press/csantosb/sourcehut-as-guix-test-farm</link>
      <description>&lt;![CDATA[img br/&#xA;It is possible to contribute to improving #guix as the need for new functionalities, packages, fixes or upgrades arise. This is one of the strongest points in open communities: the possibility to participate on the development and continuous improvement of the tool. Let’s see how it goes when it comes to guix.!--more-- br/&#xA;Guix is a huge project which follows closely the #freesoftware paradigm, and collaboration works in two directions. You take advantage of other developers contributions to guix, while you participate yourself to improving guix repositories with your fixes, updates or new features, once they have been tested. In a first approach, from my own experience, one may create a personal local repository of package definitions, for a personal use. As a second step, it is possible to create a public guix channel, in parallel to contributing upstream. br/&#xA;Contributing your code to guix comes to sending #email with your patches attached, it’s that simple. Don&#39;t be intimidated by the details (this is used by lots of open communities, after all). Once your patches are submitted, a review of your code follows, see details. Some tools, like mumi, are helpful to that purpose. br/&#xA;&#xA;In detail&#xA;&#xA;Following the kind of contribution (new additions, fixes or upgrades), these simple steps will allow you to start contributing to guix: br/&#xA;&#xA;    git clone guix itselft br/&#xA;    from the guix repository, do: br/&#xA;    &#xA;        guix shell -D guix -CPW&#xA;    ./bootstrap&#xA;    ./configure&#xA;    make -j$(nproc)&#xA;    ./pre-inst-env guix build hello&#xA;        add and commit your changes, watch the commit message br/&#xA;    beware your synopses and descriptions br/&#xA;    remember to run the package tests, if relevant br/&#xA;    check the license br/&#xA;    use an alphabetical order in input lists br/&#xA;    no sign off your commits br/&#xA;    don’t forget to use lint/style/refresh -l/dependents to check your code br/&#xA;&#xA;Boring and routinary, right ? br/&#xA;&#xA;Use sourcehut&#xA;&#xA;img br/&#xA;Most of all the of the previous can be run automatically with help of sourcehut build farm #ci capabilities. Just simply, push the guix repository to sr.ht. At this point, it is possible to use this manifest file to run the lint/style/refresh -l/dependents testing stages on the yosys package definition, por example: br/&#xA;&#xA;image: guix&#xA;shell: true&#xA;environment:&#xA;  prj: guix.guix&#xA;  cmd: &#34;guix shell -D guix -CPWN git nss-certs -- ./pre-inst-env guix&#34;&#xA;sources:&#xA;  https://git.sr.ht/~csantosb/guix.guix&#xA;tasks:&#xA;  defpkg: |&#xA;      cd &#34;$prj&#34;&#xA;      pkg=$(git log -1 --oneline | cut -d&#39;:&#39; -f 2 | xargs)&#xA;      echo &#34;export pkg=$pkg&#34;     &#34;$HOME/.buildenv&#34;&#xA;  setup: |&#xA;      cd &#34;$prj&#34;&#xA;      guix shell -D guix -CPW -- ./bootstrap&#xA;      guix shell -D guix -CPW -- ./configure&#xA;      guix shell -D guix -CPW -- make -j $(nproc)&#xA;  build: |&#xA;      cd &#34;$prj&#34;&#xA;      eval &#34;$cmd build --rounds=5 $pkg&#34;&#xA;  lint: |&#xA;      cd &#34;$prj&#34;&#xA;      eval &#34;$cmd lint $pkg&#34;&#xA;  style: |&#xA;      cd &#34;$prj&#34;&#xA;      eval &#34;$cmd style $pkg --dry-run&#34;&#xA;  refresh: |&#xA;      cd &#34;$prj&#34;&#xA;      eval &#34;$cmd refresh -l $pkg&#34;&#xA;  dependents: |&#xA;      cd &#34;$prj&#34;&#xA;      eval &#34;$cmd build --dependents $pkg&#34;&#xA;triggers:&#xA;  condition: failure&#xA;    action: email&#xA;    to: builds.sr.ht@csantosb.mozmail.com&#xA;&#xA;Submit the manifest with br/&#xA;&#xA;hut builds submit # --edit&#xA;&#xA;You’ll be able to log into the build farm to follow the build process or to debug it with br/&#xA;&#xA;hut builds ssh ID&#xA;&#xA;Check the log here. As you can see, it fails: building of yosys succeeds, but building of packages which depend on it (--dependents) fails. br/&#xA;&#xA;Advanced&#xA;&#xA;Sourcehut provides a facility to automatize patch submission and testing. Using its hub integrator, one may just send an email to the email list related to your project (guix in this case), which mimics guix behavior for accepting patches. br/&#xA;The trick here consists on appending the project name as a prefix to the subject of the message, for example PATCH project-name], which will trigger the build of previous [.build.yml manifest file at the root of the project, after applying the patch. Neat, right ? br/&#xA;If you followed right here, you’ll notice that previous build manifest file is monolithic, affecting always the same package (yosys), which is kind of useless, as we are here interested in testing our patch. Thus, the question on how to trigger a custom build containing an updated $pkg variable related to the patch to test remains open. br/&#xA;To update the contents of the $pkg variable in the build manifest, one has to parse the commit message in the patch, extracting from there the package name. This is not a problem, as guix imposes clear commit messages in patches, so typically something like br/&#xA;&#xA;gnu: gnunet: Update to 0.23.0&#xA;&#xA;or br/&#xA;&#xA;gnu: texmacs: Add qtwayland-5&#xA;&#xA;Hopefully, parsing these messages to get the package name, and so the value of $pkg is trivial. br/&#xA;Then, it remains to include in our build manifest a first task which updates the contents of &#34;$HOME/.buildenv&#34;. This file is automatically populated using the environment variables in the manifest, and its contents are sourced at the beginning of all tasks. This mechanism allows passing variables between tasks. br/&#xA;&#xA;echo &#34;export pkg=value&#34;     &#34;$HOME/.buildenv&#34;&#xA;&#xA;Send your contribution&#xA;&#xA;Finally, once your changes go through all the tests, br/&#xA;&#xA;    use git send-email to create and send a patch br/&#xA;    consider reviews, if any, updating your patch accordingly with git ammend br/&#xA;    resend a new patch including a patch version (v1, v2 ...) br/&#xA;&#xA;Interested ? Consult the documentation for details, you’ll learn a lot about how to contribute to a common good and collaboration with other people. br/&#xA;ciseries br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/blog.csantosb/blob/master/pics/guix.png" alt="img"> <br/>
It is possible to contribute to improving <a href="/csantosb/tag:guix" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">guix</span></a> as the need for new functionalities, packages, fixes or upgrades arise. This is one of the strongest points in open communities: the possibility to participate on the development and continuous improvement of the tool. Let’s see how it goes when it comes to <a href="https://guix.gnu.org/" rel="nofollow">guix</a>. <br/>
Guix is a huge project which follows closely the <a href="/csantosb/tag:freesoftware" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">freesoftware</span></a> paradigm, and collaboration works in two directions. You take advantage of other developers contributions to guix, while you participate yourself to improving guix repositories with your fixes, updates or new features, once they have been tested. In a first approach, from my own experience, one may create a personal local repository of package definitions, for a personal use. As a second step, it is possible to create a public <a href="https://infosec.press/csantosb/guix-channels" rel="nofollow">guix channel</a>, in parallel to <a href="https://infosec.press/csantosb/guix-channels#contributing" rel="nofollow">contributing</a> upstream. <br/>
<a href="https://guix.gnu.org/manual/en/html_node/Contributing.html" rel="nofollow">Contributing</a> your code to guix comes to <a href="https://git-send-email.io/" rel="nofollow">sending <a href="/csantosb/tag:email" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">email</span></a></a> <a href="https://www.futurile.net/2022/03/07/git-patches-email-workflow/" rel="nofollow">with your patches</a> attached, it’s that simple. Don&#39;t be intimidated by the details (this is used by lots of open communities, after all). Once your patches are submitted, a review of your code follows, see <a href="https://libreplanet.org/wiki?title=Group:Guix/PatchReviewSessions2024" rel="nofollow">details</a>. Some tools, like <a href="https://www.youtube.com/watch?v=8m8igXrKaqU" rel="nofollow">mumi</a>, are helpful to that purpose. <br/></p>

<h1 id="in-detail">In detail</h1>

<p>Following the kind of contribution (new additions, fixes or upgrades), these simple steps will allow you to start contributing to guix: <br/></p>

<p>    git clone <a href="https://git.savannah.gnu.org/git/guix.git" rel="nofollow">guix itselft</a> <br/>
    from the guix repository, do: <br/></p>

<p>    <code>sh
    guix shell -D guix -CPW
    ./bootstrap
    ./configure
    make -j$(nproc)
    ./pre-inst-env guix build hello
</code>
    add and commit your changes, watch the commit message <br/>
    beware your <a href="https://guix.gnu.org/manual/en/html_node/Synopses-and-Descriptions.html" rel="nofollow">synopses and descriptions</a> <br/>
    remember to run the package tests, if relevant <br/>
    check the license <br/>
    use an alphabetical order in input lists <br/>
    no sign off your commits <br/>
    don’t forget to use <code>lint/style/refresh -l/dependents</code> to check your code <br/></p>

<p>Boring and routinary, right ? <br/></p>

<h1 id="use-sourcehut">Use sourcehut</h1>

<p><img src="https://git.sr.ht/~csantosb/blog.csantosb/blob/master/pics/sourcehut.png" alt="img"> <br/>
Most of all the of the previous can be run automatically with help of <a href="https://infosec.press/csantosb/tag:ciseries" rel="nofollow">sourcehut</a> build farm <a href="/csantosb/tag:ci" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ci</span></a> capabilities. Just simply, push the guix repository to <a href="https://git.sr.ht/~csantosb/guix.guix" rel="nofollow">sr.ht</a>. At this point, it is possible to use <a href="https://builds.sr.ht/~csantosb/job/1391146/manifest" rel="nofollow">this manifest</a> file to run the <code>lint/style/refresh -l/dependents</code> testing stages on the <code>yosys</code> package definition, por example: <br/></p>

<pre><code class="language-yaml">image: guix
shell: true
environment:
  prj: guix.guix
  cmd: &#34;guix shell -D guix -CPWN git nss-certs -- ./pre-inst-env guix&#34;
sources:
  - https://git.sr.ht/~csantosb/guix.guix
tasks:
  - def_pkg: |
      cd &#34;$prj&#34;
      _pkg=$(git log -1 --oneline | cut -d&#39;:&#39; -f 2 | xargs)
      echo &#34;export pkg=$_pkg&#34; &gt;&gt; &#34;$HOME/.buildenv&#34;
  - setup: |
      cd &#34;$prj&#34;
      guix shell -D guix -CPW -- ./bootstrap
      guix shell -D guix -CPW -- ./configure
      guix shell -D guix -CPW -- make -j $(nproc)
  - build: |
      cd &#34;$prj&#34;
      eval &#34;$cmd build --rounds=5 $pkg&#34;
  - lint: |
      cd &#34;$prj&#34;
      eval &#34;$cmd lint $pkg&#34;
  - style: |
      cd &#34;$prj&#34;
      eval &#34;$cmd style $pkg --dry-run&#34;
  - refresh: |
      cd &#34;$prj&#34;
      eval &#34;$cmd refresh -l $pkg&#34;
  - dependents: |
      cd &#34;$prj&#34;
      eval &#34;$cmd build --dependents $pkg&#34;
triggers:
  - condition: failure
    action: email
    to: builds.sr.ht@csantosb.mozmail.com
</code></pre>

<p>Submit the manifest with <br/></p>

<pre><code class="language-sh">hut builds submit # --edit
</code></pre>

<p>You’ll be able to log into the build farm to follow the build process or to debug it with <br/></p>

<pre><code class="language-sh">hut builds ssh ID
</code></pre>

<p>Check the log <a href="https://builds.sr.ht/~csantosb/job/1391146" rel="nofollow">here</a>. As you can see, it fails: building of <code>yosys</code> succeeds, but building of packages which depend on it (<code>--dependents</code>) <a href="https://builds.sr.ht/~csantosb/job/1391146#task-dependents" rel="nofollow">fails</a>. <br/></p>

<h1 id="advanced">Advanced</h1>

<p>Sourcehut provides a facility to automatize <a href="https://man.sr.ht/builds.sr.ht/#integrations" rel="nofollow">patch submission and testing</a>. Using its <code>hub</code> integrator, one may just send an email to the email list related to your project (guix in this case), which mimics guix behavior for accepting patches. <br/>
The trick here consists on appending the project name as a prefix to the subject of the message, for example <code>[PATCH project-name]</code>, which will trigger the build of previous <a href="https://builds.sr.ht/~csantosb/job/1391146/manifest" rel="nofollow">.build.yml</a> manifest file at the root of the project, after applying the patch. Neat, right ? <br/>
If you followed right here, you’ll notice that previous build manifest file is monolithic, affecting always the same package (yosys), which is kind of useless, as we are here interested in testing our patch. Thus, the question on how to trigger a custom build containing an updated <code>$pkg</code> variable related to the patch to test remains open. <br/>
To update the contents of the <code>$pkg</code> variable in the build manifest, one has to parse the commit message in the patch, extracting from there the package name. This is not a problem, as guix imposes clear commit messages in patches, so typically something like <br/></p>

<pre><code class="language-sh">* gnu: gnunet: Update to 0.23.0
</code></pre>

<p>or <br/></p>

<pre><code class="language-sh">* gnu: texmacs: Add qtwayland-5
</code></pre>

<p>Hopefully, parsing these messages to get the package name, and so the value of <code>$pkg</code> is trivial. <br/>
Then, it remains to include in our build manifest a first task which updates the contents of <code>&#34;$HOME/.buildenv&#34;</code>. This file is automatically populated using the environment variables in the manifest, and its contents are sourced at the beginning of all tasks. This mechanism allows passing variables between tasks. <br/></p>

<pre><code class="language-sh">echo &#34;export pkg=value&#34; &gt;&gt; &#34;$HOME/.buildenv&#34;
</code></pre>

<h1 id="send-your-contribution">Send your contribution</h1>

<p>Finally, once your changes go through all the tests, <br/></p>

<p>    use <a href="https://git-send-email.io/" rel="nofollow">git send-email</a> to create and <a href="https://guix.gnu.org/manual/en/html_node/Submitting-Patches.html" rel="nofollow">send a patch</a> <br/>
    consider reviews, if any, updating your patch accordingly with <code>git ammend</code> <br/>
    resend a new patch including a patch version (v1, v2 ...) <br/></p>

<p>Interested ? Consult <a href="https://guix.gnu.org/manual/en/html_node/Contributing.html" rel="nofollow">the documentation</a> for details, you’ll learn a lot about how to contribute to a common good and collaboration with other people. <br/>
<a href="/csantosb/tag:ciseries" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ciseries</span></a> <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/sourcehut-as-guix-test-farm</guid>
      <pubDate>Tue, 17 Dec 2024 16:57:05 +0000</pubDate>
    </item>
    <item>
      <title>git forges</title>
      <link>https://infosec.press/csantosb/git-forges</link>
      <description>&lt;![CDATA[img br/&#xA;Using #git is not the whole picture on #modernhw version control landscape. Git is great when one decides to locally follow changes, take diffs, create branches and so on. When it comes to collaboration with other people or to create a community around a common project, the need for extra tooling arises, and it becomes evident that git alone is not enough. A #gitforge fills this gap. !--more-- br/&#xA;Git bare repositories are a means of sharing the local git history remotely. Bares doesn’t show the worktree, as they are used solely as a common exchange place. This might be a remote server accessible through ssh, for example. Several different users may collaborate this way, provided they agree on a common workflow. Bares are more than enough for some needs. A front end on top of it may help to get an overview of what is going on and to take a look at branches, users and the like. All it takes to make this workflow useful is a little management, as git was designed with a fully distributed architecture in mind. Check the docs for more details. br/&#xA;Now, this approach is a bit too bare bones for most people. On top of bare git repositories, some decided to add extra functionality to ease using git remotely, calling for contributors attracted by buttons, colors, menus and most generally, being used to web frontends. Web forges include all usual suspects (project creation and configutation, markup rendering, user account and authorizations, project overview, etc.), as well as more advanced features (continuous integration, #ci, for testing and deployment with git hooks, wikis, code linters, built in actions, issue tracking, etc.). They abstract the use of git showing diffs, logs, issues threads, etc. As any other web gui tool, they come with its own set of inconvenients in what concern user freedom. br/&#xA;Popular examples are all around. #Gitlab may be deployed as a custom (not federated) instance, and is commonly found in research and public institutions; codeberg, based on forgejo, is a great example of how to deploy a lightweight #freesoftware instance of a collaborative forge (and the promise to federate on the fediverse). Many others exist, which more or less features, bells and whistles. You always have the choice. br/&#xA;&#xA;sourcehut&#xA;&#xA;#Sourcehut, as a collaborative platform, deserves special attention. It departs from mainstream forges, following a different paradigm based on the most robust, distributed and flexible technology at our hands since decades, plain text #email. Git, since its origins, includes a close integration with email, as they both share a distributed philosophy, avoiding central point of failure silos (surprising how mosft git forges tend to concentrate in silos). Sourcehut core architecture is based on mail exchange, patches and #maillists, which turns out to be a much more flexible approach than that of what most forges propose. Their concept of project goes well beyond that of usual workflows, integrating nicely git with email, wikis, bug trackers and build features. They’re still in an alpha stage, so expect the best still to come. br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/csbwiki/blob/master/pics/forge.png" alt="img"> <br/>
Using <a href="/csantosb/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a> is not the whole picture on <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a> version control landscape. Git is great when one decides to locally follow changes, take diffs, create branches and so on. When it comes to collaboration with other people or to create a community around a common project, the need for extra tooling arises, and it becomes evident that git alone is not enough. A <a href="/csantosb/tag:gitforge" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">gitforge</span></a> fills this gap.  <br/>
<a href="https://git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server" rel="nofollow">Git bare repositories</a> are a means of sharing the local git history remotely. Bares doesn’t show the worktree, as they are used solely as a common exchange place. This might be a remote server accessible through ssh, for example. Several different users may collaborate this way, provided they agree on a common workflow. Bares are more than enough for some needs. A front end on top of it may help to get an overview of what is going on and to take a look at branches, users and the like. All it takes to make this workflow useful is a little management, as git was designed with a fully distributed architecture in mind. Check the docs for more details. <br/>
Now, this approach is a bit too bare bones for most people. On top of bare git repositories, some decided to add extra functionality to ease using git remotely, calling for contributors attracted by buttons, colors, menus and most generally, being used to web frontends. Web forges include all usual suspects (project creation and configutation, markup rendering, user account and authorizations, project overview, etc.), as well as more advanced features (continuous integration, <a href="/csantosb/tag:ci" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ci</span></a>, for testing and deployment with git hooks, wikis, code linters, built in actions, issue tracking, etc.). They abstract the use of git showing diffs, logs, issues threads, etc. As any other web gui tool, they come with its own set of inconvenients in what concern user freedom. <br/>
Popular examples are all around. <a href="/csantosb/tag:Gitlab" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Gitlab</span></a> may be deployed as a custom (not federated) instance, and is <a href="https://about.gitlab.com/" rel="nofollow">commonly found</a> in research and public institutions; <a href="https://codeberg.org/" rel="nofollow">codeberg</a>, based on <a href="https://forgejo.org/" rel="nofollow">forgejo</a>, is a great example of how to deploy a lightweight <a href="/csantosb/tag:freesoftware" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">freesoftware</span></a> instance of a collaborative forge (and the promise to federate on the <a href="https://www.fediverse.to/" rel="nofollow">fediverse</a>). Many others exist, which more or less features, bells and whistles. You always <a href="https://drewdevault.com/2022/03/29/free-software-free-infrastructure.html" rel="nofollow">have the choice</a>. <br/></p>

<h1 id="sourcehut">sourcehut</h1>

<p><a href="/csantosb/tag:Sourcehut" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sourcehut</span></a>, as a collaborative platform, deserves special attention. It departs from mainstream forges, following a <a href="https://begriffs.com/posts/2018-06-05-mailing-list-vs-github.html" rel="nofollow">different paradigm</a> based on the most robust, distributed and flexible technology at our hands since decades, <a href="https://useplaintext.email/" rel="nofollow">plain text</a> <a href="/csantosb/tag:email" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">email</span></a>. Git, since its origins, includes a close integration with email, as they both share a distributed philosophy, avoiding central point of failure silos (surprising how mosft git forges tend to concentrate in silos). <a href="https://drewdevault.com/2018/07/02/Email-driven-git.html" rel="nofollow">Sourcehut</a> core architecture is based on mail exchange, patches and <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a>, which turns out to be a much more flexible approach than that of what most forges propose. Their concept of project goes well beyond that of usual workflows, integrating nicely git with email, wikis, bug trackers and build features. They’re still in an alpha stage, so expect the best still to come. <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/git-forges</guid>
      <pubDate>Sun, 08 Dec 2024 22:36:11 +0000</pubDate>
    </item>
    <item>
      <title>sourcehut crash course</title>
      <link>https://infosec.press/csantosb/sourcehut-crash-course</link>
      <description>&lt;![CDATA[img br/&#xA;Everything you need to get started with sourcehut, an original and interesting #gitforge . !--more-- br/&#xA;#Sourcehut is organized in independent, closely related services. #Git repositories, #maillists, #wiki pages, #bug trackers, etc. belong to different domains, see below. They cooperate to provide a pleasant and practical experience when doing #modernhw. br/&#xA;Check the official documentation for details in all that follows. br/&#xA;Each user is given a ~alias. Each user’s service will appear under the SERVICE.sr.ht/~user domain, and are accessible in the top panels of the web interface. br/&#xA;Main services are: br/&#xA;&#xA;git&#xA;&#xA;git.sr.ht/~user/project, #git repositories. br/&#xA;There are no groups to combine them. I use dot notation to group my projects git.sr.ht/~user/group1.prj1. br/&#xA;&#xA;builds&#xA;&#xA;builds.sr.ht/~user, task building service, with the list of builds by the user, with user’s recent activity. br/&#xA;builds.sr.ht, similar to the previous. br/&#xA;Builds are trigger by a .build.yml manifest, or by a .build folder folder with up to 4 manifest files, at the root of a project. br/&#xA;It is also possible to automatically submit builds when a patch to a repo with build manifests is sent to a mailing list. This is achieved by appending the project name as a prefix to the subject of the message, for example [PATCH project-name]. br/&#xA;Check doc for details. br/&#xA;&#xA;hub&#xA;&#xA;The main tab, sourcehut, gives access to the hub hub.sr.ht/~user (identical to sr.ht/~user). br/&#xA;The hub displays user’s projects. br/&#xA;Projects are groups of git repositories, #maillists and bug trackers. There may be any of them in a project. br/&#xA;Sourcehut itself is organised as a project here https://sr.ht/~sircmpwn/sourcehut, and may be used as an example. br/&#xA;&#xA;todo&#xA;&#xA;todo.sr.ht/~user, ticket tracking service, with the list of trackers created by the user, with user’s recent activity br/&#xA;todo.sr.ht, similar to the previous br/&#xA;&#xA;man&#xA;&#xA;man.sr.ht/~user/NAME, #wiki service to create documentation, with the wikis created by the user br/&#xA;man.sr.ht, sourcehut documentation br/&#xA;man.sr.ht/builds.sr.ht, builds service documentation br/&#xA;man.sr.ht/hub.sr.ht, hub service documentation, etc. br/&#xA;&#xA;lists&#xA;&#xA;lists.sr.ht/~user/NAME, #email #maillists service, with the list created by the user, with user’s recent activity br/&#xA;lists.sr.ht, lists the user follows, with recent activity br/&#xA;&#xA;Extra services are alse provided: br/&#xA;&#xA;chat&#xA;&#xA;chat.sr.ht, without the user alias, is a paid service. It provides a bouncer to save history of IRC channels while not connected, and may be used from another IRC client. br/&#xA;&#xA;paste.sr.ht&#xA;&#xA;Paste hosting service. br/&#xA;&#xA;srht.site&#xA;&#xA;Once again, the official documentation gives in depth details about the previous. And remember, there is also hut to operate from the #cli. br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/csbwiki/blob/master/pics/sourcehut.png" alt="img"> <br/>
Everything you need to get started with <a href="https://sr.ht" rel="nofollow">sourcehut</a>, an <a href="https://infosec.press/csantosb/git-forges#sourcehut" rel="nofollow">original and interesting</a> <a href="/csantosb/tag:gitforge" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">gitforge</span></a> .  <br/>
<a href="/csantosb/tag:Sourcehut" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sourcehut</span></a> is organized in independent, closely related services. <a href="/csantosb/tag:Git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Git</span></a> repositories, <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a>, <a href="/csantosb/tag:wiki" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">wiki</span></a> pages, <a href="/csantosb/tag:bug" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">bug</span></a> trackers, etc. belong to different domains, see below. They cooperate to provide a pleasant and practical experience when doing <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a>. <br/>
Check the <a href="https://man.sr.ht" rel="nofollow">official documentation</a> for details in all that follows. <br/>
Each user is given a <code>~alias</code>. Each user’s service will appear under the <code>SERVICE.sr.ht/~user</code> domain, and are accessible in the top panels of the web interface. <br/>
Main services are: <br/></p>

<h1 id="git">git</h1>

<p><code>git.sr.ht/~user/project</code>, <a href="/csantosb/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a> repositories. <br/>
There are no groups to combine them. I use dot notation to group my projects <code>git.sr.ht/~user/group1.prj1</code>. <br/></p>

<h1 id="builds">builds</h1>

<p><code>builds.sr.ht/~user</code>, task building service, with the list of builds by the user, with user’s recent activity. <br/>
<code>builds.sr.ht</code>, similar to the previous. <br/>
Builds are trigger by a <code>.build.yml</code> manifest, or by a <code>.build</code> folder folder with up to 4 manifest files, at the root of a project. <br/>
It is also possible to automatically submit builds when a patch to a repo with build manifests is sent to a mailing list. This is achieved by appending the project name as a prefix to the subject of the message, for example [PATCH project-name]. <br/>
Check <a href="https://man.sr.ht/builds.sr.ht/" rel="nofollow">doc</a> for details. <br/></p>

<h1 id="hub">hub</h1>

<p>The main tab, <code>sourcehut</code>, gives access to the hub <code>hub.sr.ht/~user</code> (identical to <code>sr.ht/~user</code>). <br/>
The hub displays user’s projects. <br/>
Projects are groups of git repositories, <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a> and bug trackers. There may be any of them in a project. <br/>
Sourcehut itself is organised as a project here <a href="https://sr.ht/~sircmpwn/sourcehut" rel="nofollow">https://sr.ht/~sircmpwn/sourcehut</a>, and may be used as an example. <br/></p>

<h1 id="todo">todo</h1>

<p><code>todo.sr.ht/~user</code>, ticket tracking service, with the list of trackers created by the user, with user’s recent activity <br/>
<code>todo.sr.ht</code>, similar to the previous <br/></p>

<h1 id="man">man</h1>

<p><code>man.sr.ht/~user/NAME</code>, <a href="/csantosb/tag:wiki" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">wiki</span></a> service to create documentation, with the wikis created by the user <br/>
<code>man.sr.ht</code>, <code>sourcehut</code> documentation <br/>
<code>man.sr.ht/builds.sr.ht</code>, builds service documentation <br/>
<code>man.sr.ht/hub.sr.ht</code>, hub service documentation, etc. <br/></p>

<h1 id="lists">lists</h1>

<p><code>lists.sr.ht/~user/NAME</code>, <a href="/csantosb/tag:email" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">email</span></a> <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a> service, with the list created by the user, with user’s recent activity <br/>
<code>lists.sr.ht</code>, lists the user follows, with recent activity <br/></p>

<p><strong>Extra services</strong> are alse provided: <br/></p>

<h1 id="chat">chat</h1>

<p><code>chat.sr.ht</code>, without the user alias, is a paid service. It provides a <a href="https://sourcehut.org/blog/2021-11-29-announcing-the-chat.sr.ht-public-beta/" rel="nofollow">bouncer to save history of IRC channels</a> while not connected, and may be used from another IRC client. <br/></p>

<h1 id="paste-sr-ht">paste.sr.ht</h1>

<p>Paste hosting service. <br/></p>

<h1 id="srht-site">srht.site</h1>

<p>Once again, the <a href="https://man.sr.ht" rel="nofollow">official documentation</a> gives in depth details about the previous. And remember, there is also <a href="https://sr.ht/~emersion/hut/" rel="nofollow">hut</a> to operate from the <a href="/csantosb/tag:cli" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">cli</span></a>. <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/sourcehut-crash-course</guid>
      <pubDate>Fri, 29 Nov 2024 14:33:48 +0000</pubDate>
    </item>
    <item>
      <title>guix channels</title>
      <link>https://infosec.press/csantosb/guix-channels</link>
      <description>&lt;![CDATA[img br/&#xA;guix includes the concept of channels, or git repositories of package definitions. This gives a chance for anyone to complete the collection of packages provided by the distribution, in case this is not enough. Keep reading for an intro on how to create your own channels, or how to use the most popular third party guix channels around. !--more-- br/&#xA;Guix itself only provides #freesoftware and #reproductible packages (no binary pre compiled blobs, then), which should be enough to most needs. Unfortunately, this is not always the case. Sometimes one needs to package #nonfree software including binary files to make work a graphic or network card, sometimes the source code of the compiler necessary to produce a package got lost somewhere in a dusty office, and cannot be found other than in a pre compiled form, impossible to bootstrap from its root. br/&#xA;Additionally, guix is not perfect (but getting closer). Even if becoming better thanks to contributions from the community, there are rough edges an lots of issues. One of the most frequent complaints is the time it takes for submitted patches to be review and accepted, if ever. This inconvenient is usually circunvented by creating a personal collection of package definitions. br/&#xA;In such situations, as in many others, package definitions may be written with help of the community (or using the guix packager !) and used normally, even if they have little chance to reach one day the main upstream guix repository (none in the case of nonfree stuff).  Where these definitions live ? In topic channels. Users have the possibility to develop their own channels and use custom packages, extending guix, while submitting patches upstream in parallel. Once the patch is merged, it may be removed from the channel. br/&#xA;&#xA;usual suspects&#xA;&#xA;Other than guix channel itself, you may have a feeling of what a guix channel looks like taking a look at the guix-science organization. In there, you’ll find collections of package definitions intended to be used in a context of specific research domains, both in its free and nonfree forms. For one reason or another, they have not their place in the main guix repository, and they live their life in here. Interesting enough, guix-past channel brings old-fashioned software to the present, which reveals useful to reproduce results older than guix itself. Another interesting examples are guixrus, by the ~whereiseveryone collective, providing packages not yet fully tested, nightly releases or alpha quality software; or the guix-hpc channel, with packages related to high performance computing; also guix-bioc, containing bioconductor packages, etc. You get the idea. br/&#xA;To include additional channels, other than the default ones, in your ~/.config/guix/channels.scm file, follow the documentation, and check with guix describe: you’ll get a list of all the channels in use next time you do a guix pull. At this point, you’ll have plenty of new packages to install at your hands ! Just remember the discussion about substitutes: some channels provide substitute servers, some not. This might be an issue, or not, depending of the computing resources necessary to build certain packages. br/&#xA;&#xA;your first personal channel&#xA;&#xA;Guix channels are simple to create and use. Just put your #guile modules, containing your package definitions, in a git repository. To use them, complete the default guix load path as in br/&#xA;&#xA;guix install -L ~/guix-channel PACKAGE&#xA;&#xA;You may opt to include this local channel into your ~/.config/guix/channels.scm file, or include the -L flag in your commands. As an alternative, guix searches for package definitions in the $GUIXPACKAGEPATH, so you may put your channel path in this variable. Remember that guix builds packages by compiling source code: no substitute server will do the job for you in this case, so plan accordingly with your local resources and patience. br/&#xA;&#xA;electronics channel&#xA;&#xA;This is about #modernhw after all, so let’s see an example more on detail, my own guix-electronics channel which complements the ./gnu/packages/electronics.scm guix module. This is the channel I’m using daily, where I include all the packages I need and doesn’t yet exist upstream. When they get merged somewhere else, I remove them from here. In the meantime, I’m a happy user of my custom packages. br/&#xA;I classify all my package definitions in #guile modules under ./electronics/packages/MODULE.scm. This is the reason why the compilers module, for example, starts by br/&#xA;&#xA;(define-module (electronics packages compilers)&#xA;&#xA;Then, proceed as usual (check the guix repo itself for inspiration), putting your packages below br/&#xA;&#xA;(define-public mypackage&#xA;  (package&#xA;    (name &#34;mypackage&#34;)&#xA;    ...&#xA;    ))&#xA;&#xA;I create a git repo, commit my changes and push it online to a #gitforge. br/&#xA;I need a .guix-channel file with the url of my channel and a version number. If the code in the channel depends on other channels other than main guix channel, one needs to specify this information in this file too.  In this case, for example, several of the package definitions include a dependency on ghdl-clang, provided by guix-science channel, so I need to declare it in here too. br/&#xA;It is also necessary a .guix-authorizations file, with the (GPG key) list of developers with right to push to this channel. This is how guix authenticates channels. Finally, it is important to create a readme file or similar where introduce the channel (first commit, signing key fingerprint). That’s it. Include the channel introduction into your ~/.config/guix/channels.scm file, and you’ll be pulling from your online guix channel. br/&#xA;&#xA;contributing&#xA;&#xA;The advantage of using a custom channel is to benefit from an increased degree of freedom when using guix, without being dependent of someone’s else time availability to consider your particular needs. Remember, guix is a huge project which follows closely the #freesoftware paradigm, and collaboration works in two directions. You take advantage of other developers contributions to guix, while you participate yourself to improving guix repositories with your package definitions, once they have been tested. br/&#xA;Take for example the list of packages in my electronics channel. I have included here utilities for #vhdl code editing under #emacs, specific to the electronic digital design field, which are not yet available in guix upstream channel. There is also a cosimulation library, #cocotb, which allows coupling #python and #ghdl to simulate a design. I have submitted a patch to include this in guix itself, similarly to python-vunit; once merged, I’ll remove them from here. br/&#xA;Some packages, like open fpga loader are now part of guix. Some others, like the gnat ada compiler and ghdl-clang stable have been merged already on guix-science, as gnat package is obtained from binaries (and so ghdl-clang is also impacted, from guix perspective). I include here a more recent ghdl-clang, non yet released, as it includes some fixes and improvements I am interested in, without having to wait until guix incorporates a new release. br/&#xA;Catch the idea ? br/&#xA;Contributing your code to guix comes to sending #email with your patches attached, it’s that simple. Dont be intimidated by the workflow (this is used by the linux project, for example). Once your patches are submitted, a review of your code folllows, see details. Some tools, like mumi, are helpful to that purpose. br/&#xA;These simple steps will allow you to start contributing to guix: br/&#xA;&#xA;git clone guix itselft br/&#xA;add and commit your changes, watch the commit message br/&#xA;don’t forget to use guix lint/style/refresh -l to check your code br/&#xA;use git send-email to create and send a patch br/&#xA;cosider reviews, if any, updating your patch accordingly with git ammend br/&#xA;resend a new patch including a patch version (v1, v2 ...) br/&#xA;&#xA;Interested ? Consult the doc for details, you’ll learn a lot about how to contribute to a common good and collaboration with other people. br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/csbwiki/blob/master/pics/guix-crash-course.png" alt="img"> <br/>
<a href="/csantosb/tag:guix" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">guix</span></a> includes the concept of <a href="https://guix.gnu.org/manual/en/html_node/Channels.html" rel="nofollow">channels</a>, or git repositories of package definitions. This gives a chance for anyone to complete the collection of <a href="https://packages.guix.gnu.org/" rel="nofollow">packages</a> provided by the distribution, in case this is not enough. Keep reading for an intro on how to create your own channels, or how to use the most popular third party guix channels around.  <br/>
Guix itself only provides <a href="/csantosb/tag:freesoftware" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">freesoftware</span></a> and <a href="/csantosb/tag:reproductible" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">reproductible</span></a> packages (no binary pre compiled blobs, then), which should be enough to most needs. Unfortunately, this is not always the case. Sometimes one needs to package <a href="/csantosb/tag:nonfree" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">nonfree</span></a> software including binary files to make work a graphic or network card, sometimes the source code of the compiler necessary to produce a package got lost somewhere in a dusty office, and cannot be found other than in a pre compiled form, impossible to bootstrap from its root. <br/>
Additionally, guix is not perfect (but <a href="https://infosec.press/csantosb/guix-crash-course" rel="nofollow">getting closer</a>). Even if becoming better thanks to contributions from the <a href="https://guix.gnu.org/en/contact/" rel="nofollow">community</a>, there are rough edges an <a href="https://issues.guix.gnu.org/" rel="nofollow">lots of issues</a>. One of the most frequent complaints is the time it takes for submitted patches to be review and accepted, if ever. This inconvenient is usually circunvented by creating a personal collection of package definitions. <br/>
In such situations, as in many others, package definitions may be written with help of the community (or using the <a href="https://guix-hpc.gitlabpages.inria.fr/guix-packager/" rel="nofollow">guix packager</a> !) and used normally, even if they have little chance to reach one day the main upstream guix repository (none in the case of nonfree stuff).  Where these definitions live ? In topic channels. Users have the possibility to develop their own channels and use custom packages, extending guix, while <a href="https://guix.gnu.org/manual/en/html_node/Submitting-Patches.html" rel="nofollow">submitting patches upstream</a> in parallel. Once the patch is merged, it may be removed from the channel. <br/></p>

<h1 id="usual-suspects">usual suspects</h1>

<p>Other than <a href="https://hpc.guix.info/channel/guix" rel="nofollow">guix channel</a> itself, you may have a feeling of what a guix channel looks like taking a look at the <a href="https://codeberg.org/guix-science" rel="nofollow">guix-science</a> organization. In there, you’ll find collections of package definitions intended to be used in a context of specific research domains, both in its <a href="https://codeberg.org/guix-science/guix-science" rel="nofollow">free</a> and <a href="https://codeberg.org/guix-science/guix-science-nonfree" rel="nofollow">nonfree</a> forms. For one reason or another, they have not their place in the main guix repository, and they live their life in here. Interesting enough, <a href="https://codeberg.org/guix-science/guix-past" rel="nofollow">guix-past</a> channel brings old-fashioned software to the present, which reveals useful to reproduce results older than guix itself. Another interesting examples are <a href="https://sr.ht/~whereiseveryone/guixrus/" rel="nofollow">guixrus</a>, by the <a href="https://sr.ht/~whereiseveryone/" rel="nofollow">~whereiseveryone</a> collective, providing packages not yet fully tested, nightly releases or alpha quality software; or the <a href="https://hpc.guix.info/channel/guix-hpc" rel="nofollow">guix-hpc</a> channel, with packages related to high performance computing; also <a href="https://hpc.guix.info/channel/guix-bioc" rel="nofollow">guix-bioc</a>, containing bioconductor packages, etc. You get the idea. <br/>
To include additional channels, other than the default ones, in your <code>~/.config/guix/channels.scm</code> file, follow the <a href="https://guix.gnu.org/manual/en/html_node/Specifying-Additional-Channels.html" rel="nofollow">documentation</a>, and check with <code>guix describe</code>: you’ll get a list of all the channels in use next time you do a <code>guix pull</code>. At this point, you’ll have plenty of new packages to install at your hands ! Just remember the <a href="https://infosec.press/csantosb/guix-crash-course#packages" rel="nofollow">discussion</a> about substitutes: some channels provide substitute servers, some not. This might be an issue, or not, depending of the computing resources necessary to build certain packages. <br/></p>

<h1 id="your-first-personal-channel">your first personal channel</h1>

<p>Guix channels are <a href="https://guix.gnu.org/cookbook/en/html_node/Channels.html" rel="nofollow">simple to create</a> and use. Just put your <a href="/csantosb/tag:guile" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">guile</span></a> modules, containing your package definitions, in a git repository. To use them, complete the default guix load path as in <br/></p>

<pre><code class="language-sh">guix install -L ~/guix-channel PACKAGE
</code></pre>

<p>You may opt to include this local channel into your <code>~/.config/guix/channels.scm</code> file, or include the <code>-L</code> flag in your commands. As an alternative, guix searches for package definitions in the <code>$GUIX_PACKAGE_PATH</code>, so you may put your channel path in this variable. Remember that guix builds packages by compiling source code: no substitute server will do the job for you in this case, so plan accordingly with your local resources and patience. <br/></p>

<h1 id="electronics-channel">electronics channel</h1>

<p>This is about <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a> after all, so let’s see an example more on detail, my own <a href="https://git.sr.ht/~csantosb/guix.channel-electronics" rel="nofollow">guix-electronics</a> channel which complements the <a href="https://codeberg.org/guix/guix/src/master/gnu/packages/electronics.scm" rel="nofollow">./gnu/packages/electronics.scm</a> guix module. This is the channel I’m using daily, where I include all the packages I need and doesn’t yet exist upstream. When they <a href="https://codeberg.org/csantosb/guix-science/commit/d33b748" rel="nofollow">get merged somewhere else</a>, I remove them from here. In the meantime, I’m a happy user of my custom packages. <br/>
I classify all my package definitions in <a href="/csantosb/tag:guile" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">guile</span></a> modules under <code>./electronics/packages/MODULE.scm</code>. This is the reason why the compilers module, for example, <a href="https://git.sr.ht/~csantosb/guix.channel-electronics/tree/main/electronics/packages/compilers.scm#L20" rel="nofollow">starts by</a> <br/></p>

<pre><code class="language-scheme">(define-module (electronics packages compilers)
</code></pre>

<p>Then, proceed as usual (check the guix repo itself for inspiration), putting your packages below <br/></p>

<pre><code class="language-scheme">(define-public mypackage
  (package
    (name &#34;mypackage&#34;)
    ...
    ))
</code></pre>

<p>I create a git repo, commit my changes and push it online to a <a href="/csantosb/tag:gitforge" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">gitforge</span></a>. <br/>
I need a <code>.guix-channel</code> <a href="https://git.sr.ht/~csantosb/guix.channel-electronics/tree/main/.guix-channel" rel="nofollow">file</a> with the url of my channel and a version number. If the code in the channel <a href="https://guix.gnu.org/manual/en/html_node/Declaring-Channel-Dependencies.html" rel="nofollow">depends on other channels</a> other than main guix channel, one needs to specify this information in this file too.  In this case, for example, several of the package definitions include a dependency on <code>ghdl-clang</code>, provided by <code>guix-science</code> channel, so I need to declare it in here too. <br/>
It is also necessary a <code>.guix-authorizations</code> <a href="https://git.sr.ht/~csantosb/guix.channel-electronics/tree/main/.guix-authorizations" rel="nofollow">file</a>, with the (GPG key) list of developers <a href="https://guix.gnu.org/manual/en/html_node/Specifying-Channel-Authorizations.html" rel="nofollow">with right to push to this channel</a>. This is how guix <a href="https://guix.gnu.org/manual/en/html_node/Channel-Authentication.html" rel="nofollow">authenticates</a> channels. Finally, it is important to create a <a href="https://git.sr.ht/~csantosb/guix.channel-electronics/tree/main/readme.org#L50" rel="nofollow">readme</a> file or similar where introduce the channel (first commit, signing key fingerprint). That’s it. Include the channel introduction into your <code>~/.config/guix/channels.scm</code> file, and you’ll be pulling from your online guix channel. <br/></p>

<h1 id="contributing">contributing</h1>

<p>The advantage of using a custom channel is to benefit from an increased degree of freedom when using guix, without being dependent of someone’s else time availability to consider your particular needs. Remember, guix is a huge project which follows closely the <a href="/csantosb/tag:freesoftware" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">freesoftware</span></a> paradigm, and collaboration works in two directions. You take advantage of other developers contributions to guix, while you participate yourself to improving guix repositories with your package definitions, once they have been tested. <br/>
Take for example the list of <a href="https://gitlab.com/csantosb/guix/channel-electronics/-/blob/main/packages.org" rel="nofollow">packages</a> in my electronics channel. I have included here utilities for <a href="/csantosb/tag:vhdl" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">vhdl</span></a> code editing under <a href="/csantosb/tag:emacs" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">emacs</span></a>, specific to the electronic digital design field, which are not yet available in guix upstream channel. There is also a cosimulation library, <a href="/csantosb/tag:cocotb" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">cocotb</span></a>, which allows coupling <a href="/csantosb/tag:python" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">python</span></a> and <a href="/csantosb/tag:ghdl" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ghdl</span></a> to simulate a design. I have submitted a <a href="https://issues.guix.gnu.org/68153" rel="nofollow">patch</a> to include this in guix itself, similarly to <a href="https://issues.guix.gnu.org/74242" rel="nofollow">python-vunit</a>; once merged, I’ll remove them from here. <br/>
Some packages, like <a href="https://git.savannah.gnu.org/cgit/guix.git/commit/?id=9fb7333fc9" rel="nofollow">open fpga loader</a> are now part of guix. Some others, like the <a href="https://codeberg.org/guix-science/guix-science/pulls/46" rel="nofollow">gnat ada compiler</a> and <code>ghdl-clang</code> stable have been merged already on <code>guix-science</code>, as <code>gnat</code> package is obtained from binaries (and so <code>ghdl-clang</code> is also impacted, from guix perspective). I include here a more recent <code>ghdl-clang</code>, non yet released, as it includes some fixes and improvements I am interested in, without having to wait until guix incorporates a new release. <br/>
Catch the idea ? <br/>
<a href="https://guix.gnu.org/manual/en/html_node/Contributing.html" rel="nofollow">Contributing</a> your code to guix comes to <a href="https://git-send-email.io/" rel="nofollow">sending <a href="/csantosb/tag:email" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">email</span></a></a> <a href="https://www.futurile.net/2022/03/07/git-patches-email-workflow/" rel="nofollow">with your patches</a> attached, it’s that simple. Dont be intimidated by the workflow (this is used by the linux project, for example). Once your patches are submitted, a review of your code folllows, see <a href="https://libreplanet.org/wiki?title=Group:Guix/PatchReviewSessions2024" rel="nofollow">details</a>. Some tools, like <a href="https://www.youtube.com/watch?v=8m8igXrKaqU" rel="nofollow">mumi</a>, are helpful to that purpose. <br/>
These simple steps will allow you to start contributing to guix: <br/></p>
<ul><li>git clone guix itselft <br/></li>
<li>add and commit your changes, watch the commit message <br/></li>
<li>don’t forget to use <code>guix lint/style/refresh -l</code> to check your code <br/></li>
<li>use <code>git send-email</code> to create and send a patch <br/></li>
<li>cosider reviews, if any, updating your patch accordingly with <code>git ammend</code> <br/></li>
<li>resend a new patch including a patch version (v1, v2 ...) <br/></li></ul>

<p>Interested ? Consult <a href="https://guix.gnu.org/manual/en/html_node/Contributing.html" rel="nofollow">the doc</a> for details, you’ll learn a lot about how to contribute to a common good and collaboration with other people. <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/guix-channels</guid>
      <pubDate>Tue, 31 Jan 2023 23:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>