ryanprior / emacs-guix-packaging

Tools for writing and maintaining Guix packages
22 stars 3 forks source link
emacs guix package-development

+options: toc:nil num:nil author:nil creator:nil date:nil

guix-packaging (aka "guix-packaging.el") provides tools to create and maintain Guix packages quickly and with confidence.

Vision:

+begin_quote

Writing and maintaining Guix packages in Emacs should be a breeze. The information you need should be ready at your fingertips and any chores or guesswork that can be reasonably automated should be. In particular, maintainers of Emacs packages in Guix should be able to complete the entire cycle of package creation, testing, installation, updates, maintenance and discovery within Emacs.

+end_quote

** Creating & maintaining Guix packages

*** Commands

**** ~M-x~ ~guix-packaging-insert-input~ Prompts for a set of package strings with completion, for example ~ruby@2.7.2~, and inserts the corresponding Guix input form such as ~("ruby@2.7.2" ,ruby-2.7)~.

Reads the Guile source code to find the appropriate symbol name, so it might not work with some packages that have unusual source code.

**** ~M-x~ ~guix-packaging-hash-git~ Saves the Guix hash to the kill ring for a git repository URL at a given tag.

Reads your mind to get the default URL: prefers the URL at point, falls back to the URL following =(url "= in the ~defun~ at point, or as a last resort, uses the next match in the buffer for ~goto-address-url-regexp~.

**** ~M-x~ ~guix-packaging-refresh-packages~ Refresh the cache of information about available Guix packages.


*** Snippets

**** scheme mode The ~guix-go~ snippet creates the skeleton of a go module package and assists you in quickly filling it out. You first provide the import path, from which the snippet infers the symbol & package names, the repo URL, the hash, and the homepage. All of these are presented in the snippet as default values that you can change as you go for unusual cases.

The ~guix-go-noversion~ snippet is similar but instead provides a package skeleton suitable for those modules which don't have any releases.

**** sgml, web, markdown, and org modes The ~guix-badge~ snippet inserts the HTML for a Repology badge showing the package status in Guix and linking to the project page in Repology, handy for project status pages.

**** text mode The ~guix-issue-url~ snippet inserts a URL pointing to the Guix issue tracker.


*** Configuration

*** Output & error buffers Set ~guix-packaging-output-buffer~ to control where status messages are sent, and ~guix-packaging-error-buffer~ for error messages. These can be the same if you prefer them interleaved. (Default: ~guix-packaging*~)

**** Guix Set ~guix-packaging-guix-executable~ to specify which executable file should be used to invoke Guix commands. (Default: =~/.config/guix/current/bin/guix=)

Add extra Guile load paths to Guix commands that support them by putting them in ~guix-packaging-extra-load-paths~.

**** Snippets Set ~guix-packaging-slug-dash-pattern~ to control which characters will get replaced with dashes when making a slug to use as a Guile symbol.


*** Structural transformation

Structural transformation is an experimental feature. It assists you in changing the structure of a Guix package definition without affecting the content.

It is documented in [[./TRANSFORM.org][TRANSFORM.ORG]].

** Tracking packaging progress

Some packages are complex due to a large number of transitive dependencies. I've found this to be true of software in the golang ecosystem where it's not uncommon to see 50+ transitive dependencies, and occasionally many more.

guix-packaging provides some facilities to help track progress on complex packages.

*** Commands

**** ~M-x~ ~guix-packaging-go-mod-to-checklist-dwim~ Turns go module definitions into an org/markdown checklist, suitable to keep track of packaging progress.

**** ~M-x~ ~guix-packaging-go-mod-to-checkbox~ Replace a single go module definition with a checkbox.