____________________________________________

            NCGOPHER, POUDRIERE-DEVEL AND CODEBERG.ORG

                           Nicolas Herry
           ____________________________________________


                            2022/11/05





1 ncgopher, poudriere-devel and codeberg.org
============================================

  As I was idly browsing Mastodon the other day, I discovered the
  existence of a new Gopher client: [ncgopher]. It's quick, it's
  written in Rust, it supports TLS and it actually does more than
  Gopher, as it also supports Gemini and finger. It looked nice
  enough that I decided to make a [port for FreeBSD]. And this
  turned out to be an excellent decision, as I got to try a few new
  things along the way.


[ncgopher] <https://github.com/jansc/ncgopher>

[port for FreeBSD]
<https://codeberg.org/beastieboy/ncgopher-freebsd-port>

1.1 USES = cargo
~~~~~~~~~~~~~~~~

  There is a new `USES' available to ports Makefiles:
  `cargo'. Well, I say new, it is to me, as I haven't been actively
  working on ports stuff in a long time. As one would expects, this
  does the right thing and calls `cargo build' with the
  configuration specified in `CARGO_' variables. In the case of
  ncgopher, I had to pass `--release' as an argument to the
  command, and define the list of dependencies. Creating this list
  manually would be quite an undertaking, but fortunately, there is
  now a dedicated `make' target: `cargo-crates'. This target
  extracts the dependencies from the file Cargo.lock and spits them
  out exactly as they should be declared in the Makefile.

  The only slightly tedious step is to list the licenses used by
  the port and its dependencies. An additional target is available
  to generate the list, `cargo-crates-licenses', but the output is
  the SPDX 1.2 format, which is different to the one used in ports
  Makefiles. I had to resort to something along the lines of `make
  cargo-crates-licenses | awk '{print $2}' | sort -u', and then
  lookup the name of the license in the [predefined list]. I'm not
  sure there is a better way to do that; I might look at creating a
  translation table for that in the future, and put it in a script.


[predefined list]
<https://docs.freebsd.org/en/books/porters-handbook/makefiles/index.html#licenses-license-list>


1.2 poudriere-devel
~~~~~~~~~~~~~~~~~~~

  As usual, after I had prepared a first version of the port, I
  fired up `poudriere' to tell me what I did wrong. Given that this
  is a Rust application, I expected it to take some time. Well,
  indeed, on my laptop, rust takes at least 3 hours to build. I say
  at least, because I never got to see the end of it: I would run
  out of memory before that. I tried helping with generous swap
  files, added via `swapon', but that didn't work. And of course, I
  had to wait 3 long hours to see it fail again. And again.

  Having run out of ideas, I turned to `freebsd-questions', where a
  good soul directed me towards using `poudriere-devel'. It turns
  out this new version is able to download binary packages to speed
  up build time (and, in the case of ports, test time). The default
  configuration has it download everything as a binary package,
  actually, if I undertand well, so I took the conservative path
  and only asked for a few packages to be fetched instead of built:

  ,----
  | # /usr/local/etc/poudriere.conf
  | # Set to always attempt to fetch packages or dependencies before building.
  | # XXX: This is subject to change
  | # Default: off; requires -b <branch> for bulk or testport.
  | #PACKAGE_FETCH_BRANCH=latest
  | # The branch will be appended to the URL:
  | #PACKAGE_FETCH_URL=pkg+http://pkg.FreeBSD.org/\${ABI}
  | # Packages which should never be fetched.  This is useful for ports that
  | # you have local patches for as otherwise the patches would be ignored if
  | # a remote package is used instead.
  | #PACKAGE_FETCH_BLACKLIST=""
  | # Alternatively a whitelist can be created to only allow specific packages to
  | # be fetched.
  | # Default: everything
  | PACKAGE_FETCH_WHITELIST="gcc* rust llvm*"
  `----

  Then, it's only a matter of specifying the branch when running
  `poudriere', if you haven't opted for providing a default
  (implicit) value in the configuration gopher://gopher.beastieboy.net/0/

  ,----
  | $ poudriere testport -j 131x64 -p porting -b latest www/ncgopher
  `----

  And this is enough to bring us down from 3 hours to 3
  minutes. Poudriere and the very pragmatic people behind it will
  never cease to amaze me...


1.3 codeberg
~~~~~~~~~~~~

  There was one last novelty this weekend: I gave [codeberg.org] a
  try. Codeberg is maintained by a non-profit organisation based in
  Germany, focuses on open source projects and lives off
  donations. According to their FAQ, they are pretty sustainable
  already, having enough to stick around for the next 12 years.

  The service itself consists of a gitea instance and I found it
  very responsive. This looks to me as a very good solution
  whenever I want to promote a project out of my personal
  repository.


[codeberg.org] <https://www.codeberg.txt>