zsh-workers
 help / color / Atom feed
* [PATCH] Completion for sbuild
@ 2019-08-22 19:53 Baptiste BEAUPLAT
  2019-08-23  4:40 ` Daniel Shahaf
  0 siblings, 1 reply; 2+ messages in thread
From: Baptiste BEAUPLAT @ 2019-08-22 19:53 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1.1.1: Type: text/plain, Size: 372 bytes --]

Hi list,

I wrote a completion function for sbuild (a debian tool to build
packages). I think it would be nice to have it upstream. It covers all
options described in the man (expect one, which is depreciated).

Don't hesitate to give me feedback, I'd be glade to improve it.

Thanks for making such an awesome shell!

Best,

-- 
Baptiste BEAUPLAT - lyknode

[-- Attachment #1.1.2: _sbuild --]
[-- Type: text/plain, Size: 9270 bytes --]

#compdef sbuild

_deb_distributions() {
    local suite stable
    suite=""

    # Get stable, oldstable and oldoldstable
    if [ -f /usr/share/distro-info/debian.csv ]; then
        stable="$(grep -E '^[^,]*(,[^,]*){4}$' /usr/share/distro-info/debian.csv |
                  tail -n 1 | cut -d ',' -f 3)"
        suite=($(grep -B 2 -F ",${stable}," /usr/share/distro-info/debian.csv |
                 cut -d ',' -f 3))
    fi

    compadd "$@" "${suite[@]}" unstable experimental
}

_get_identity() {
    [ -n "${DEBFULLNAME}" -a -n "${DEBEMAIL}" ] && \
        compadd "$@" "${DEBFULLNAME} <${DEBEMAIL}>"
}

_get_gpg_key() {
    compadd "$@" $(gpg -K --with-colons 2> /dev/null | grep '^uid:u:' |
                   grep -o -e '<[^>]*>' | tr -d '<>')
}

_sbuild() {
    _arguments \
        '(-h --help)'{-h,--help}'[show help message]' \
        '(-V --version)'{-V,--version}'[show version information]' \
        '(-D --debug)'{-D,--debug}'[enable debug output]' \
        '--add-depends=[add dependencies to source package]:depends' \
        '--add-conflicts=[add conflicts to source package]:conflicts' \
        '--add-depends-arch=[add arch dependencies to source package]:depends' \
        '--add-conflicts-arch=[add arch conflicts to source package]:conflicts' \
        '--add-depends-indep=[add indep dependencies to source package]:depends' \
        '--add-conflicts-indep=[add indep conflicts to source package]:conflicts' \
        '--arch=[architecture]:architecture:_deb_architectures' \
        '--host=[host architecture]:architecture:_deb_architectures' \
        '--build=[build architecture]:architecture:_deb_architectures' \
        '(-A --arch-all --no-arch-all)'{-A,--arch-all}'[build Architecture: all packages]' \
        '(-A --arch-all --no-arch-all)--no-arch-all[do not build Architecture: all packages]' \
        '(--arch-any --no-arch-any)--arch-any[build Architecture: any packages]' \
        '(--arch-any --no-arch-any)--no-arch-any[do not build Architecture: any packages]' \
        '(-b --batch)'{-b,--batch}'[operate in batchmode]' \
        '(-c --chroot)'{-c=,--chroot=}'[chroot to use]:chroot' \
        '(--chroot-mode)--chroot-mode=[chroot mode]:mode:(schroot sudo autopkgtest unshare)' \
        '(-d --dist)'{-d=,--dist=}'[distribution]:distribution:_deb_distributions' \
        '--archive=[use specified archive]' \
        '(--apt-clean --no-apt-clean)--apt-clean[force apt-get clean]' \
        '(--apt-clean --no-apt-clean)--no-apt-clean[do not apt-get clean]' \
        '(--apt-upgrade --no-apt-upgrade)--apt-upgrade[force apt-get upgrade]' \
        '(--apt-upgrade --no-apt-upgrade)--no-apt-upgrade[do not apt-get upgrade]' \
        '(--apt-distupgrade --no-apt-distupgrade)--apt-distupgrade[force apt-get distupgrade]' \
        '(--apt-distupgrade --no-apt-distupgrade)--no-apt-distupgrade[do not apt-get distupgrade]' \
        '(-m --maintainer)'{-m=,--maintainer=}'[Maintainer field for .changes]:maintainer:_get_identity' \
        '(-e --uploader)'{-e=,--uploader=}'[Uploader field for .changes]:uploader:_get_identity' \
        '(-k --keyid)'{-k=,--keyid=}'[GPG Key to sign packages]:gpg key:_get_gpg_key' \
        '(-j --jobs)'{-j=,--jobs=}'[jobs to run simultaneously]:number of jobs' \
        '--debbuildopt=[option to dpkg-buildpackage]:option' \
        '--debbuildopts=[options to dpkg-buildpackage]:options' \
        '--dpkg-source-opt=[option to dpkg-source]:option' \
        '--dpkg-source-opts=[options to dpkg-source]:options' \
        '--mail-log-to=[send log to mail]:recipient:_email_addresses -c' \
        '--mailfrom=[mail from]:sender:_email_addresses -c' \
        '(-n --nolog)'{-n,--nolog}'[no build log file]' \
        '--profiles=[profiles for dpkg-buildpackage]:profile list (comma separated)' \
        '(-p --purge)'{-p=,--purge=}'[purge mode]:purge mode:(never successful always)' \
        '--purge-build=[build purge mode]:purge mode:(never successful always)' \
        '--purge-deps=[deps purge mode]:purge mode:(never successful always)' \
        '--purge-session=[session purge mode]:purge mode:(never successful always)' \
        '(-s --source --no-source)'{-s,--source}'[build source package]' \
        '(-s --source --no-source)--no-source[do not build source package]' \
        '--force-orig-source[force orig.tar.gz in .changes]' \
        '--use-snapshot[use latest gcc snapshot]' \
        '(-v --verbose)'{-v,--verbose}'[be verbose]' \
        '(-q --quiet)'{-q,--quiet}'[be quiet]' \
        '--make-binNMU=[create binNMU with changelog entry]:changelog entry' \
        '--binNMU=[binNMU version]:version' \
        '--append-to-version=[append string to version]:string' \
        '--binNMU-timestamp=[binNMU timestamp]:timestamp' \
        '--binNMU-changelog=[use this file as binNMU changelog]:file:_files' \
        '--build-dir=[build directory]:directory:_files -/' \
        '(--clean-source --no-clean-source)--clean-source[clean inside an unpacked source tree]' \
        '(--clean-source --no-clean-source)--no-clean-source[do not clean inside an unpacked source tree]' \
        '(--run-lintian --no-run-lintian)--run-lintian[run lintian]' \
        '(--run-lintian --no-run-lintian)--no-run-lintian[do not run lintian]' \
        '(--no-run-lintian --lintian-opt)--lintian-opt=[option for lintian]:option' \
        '(--no-run-lintian --lintian-opts)--lintian-opts=[options for lintian]:options' \
        '(--run-piuparts --no-run-piuparts)--run-piuparts[run piuparts]' \
        '(--run-piuparts --no-run-piuparts)--no-run-piuparts[do not run piuparts]' \
        '(--no-run-piuparts --piuparts-opt)--piuparts-opt=[option for piuparts]:option' \
        '(--no-run-piuparts --piuparts-opts)--piuparts-opts=[options for piuparts]:options' \
        '(--no-run-piuparts --piuparts-root-arg)--piuparts-root-arg=[root-argion for piuparts]:argument' \
        '(--no-run-piuparts --piuparts-root-args)--piuparts-root-args=[root-argions for piuparts]:arguments' \
        '(--run-autopkgtest --no-run-autopkgtest)--run-autopkgtest[run autopkgtest]' \
        '(--run-autopkgtest --no-run-autopkgtest)--no-run-autopkgtest[do not run autopkgtest]' \
        '(--no-run-autopkgtest --autopkgtest-opt)--autopkgtest-opt=[option for autopkgtest]:option' \
        '(--no-run-autopkgtest --autopkgtest-opts)--autopkgtest-opts=[options for autopkgtest]:options' \
        '(--no-run-autopkgtest --autopkgtest-root-arg)--autopkgtest-root-arg=[root-argion for autopkgtest]:argument' \
        '(--no-run-autopkgtest --autopkgtest-root-args)--autopkgtest-root-args=[root-argions for autopkgtest]:arguments' \
        '--pre-build-commands=[run commands before starting anything]:commands' \
        '--chroot-setup-commands=[run commands after chroot initialization]:commands' \
        '--chroot-update-failed-commands=[run commands after chroot update fails]:commands' \
        '--build-deps-failed-commands=[run commands after installing build deps fails]:commands' \
        '--starting-build-commands=[run commands after dependencies are installed]:commands' \
        '--finished-build-commands=[run commands after package is built]:commands' \
        '--build-failed-commands=[run commands after dpkg-buildpackage fails]:commands' \
        '--chroot-cleanup-commands=[run commands after chroot cleanup]:commands' \
        '--post-build-commands=[run commands after package is build sucessfuly]:commands' \
        '--post-build-failed-commands[run commands after package failed to build]:commands' \
        '--anything-failed-commands=[run commands for all --xxx-failed-commands option]:commands' \
        '--log-external-command-output[external commands output are logged]' \
        '--log-external-command-error[external commands error output are logged]' \
        '--build-dep-resolver=[resolver for build dependency]:resolver:(apt aptitude aspcud xapt null)' \
        '--aspcud-criteria=[Optimization for aspcud]:criteria' \
        '(--resolve-alternatives --no-resolve-alternatives)--resolve-alternatives[allow alternatives in Build-Depends*]' \
        '(--resolve-alternatives --no-resolve-alternatives)--no-resolve-alternatives[disallow alternatives in Build-Depends*]' \
        '--extra-package=[make a package or directory available to the resolver]:package:_files -g "*deb' \
        '--extra-repository=[add a repository to the resolver]:url' \
        '--extra-repository-key=[add key to the resolver]:key:_files -g "*.asc"' \
        '--build-path=[place to build the package inside chroot]:path:_files -/' \
        '--autopkgtest-virt-server=[autopkgtest virtualization server]:type:(schroot lxc chroot qemu ssh)' \
        '--autopkgtest-virt-server-opt=[option for autopkgtest virtialization server]:option' \
        '--autopkgtest-virt-server-opts=[options for autopkgtest virtialization server]:options' \
        '--sbuild-mode=[switch to buildd mode]:mode:(user buildd)' \
        '--stats-dir=[write stats to directory]:path:_files -/' \
        '--purge-extra-packages[remove all but strictly required dependencies (experimental)]' \
        '--bd-uninstallable-explainer=[choose the method to explain why dependencies failed]:method:(dose3 apt)' \
        '*:dsc file:_files -g "*.dsc"'
}

_sbuild "$@"

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

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

* Re: [PATCH] Completion for sbuild
  2019-08-22 19:53 [PATCH] Completion for sbuild Baptiste BEAUPLAT
@ 2019-08-23  4:40 ` Daniel Shahaf
  0 siblings, 0 replies; 2+ messages in thread
From: Daniel Shahaf @ 2019-08-23  4:40 UTC (permalink / raw)
  To: Baptiste BEAUPLAT; +Cc: zsh-workers

Baptiste BEAUPLAT wrote on Thu, Aug 22, 2019 at 21:53:14 +0200:
> I wrote a completion function for sbuild (a debian tool to build
> packages). I think it would be nice to have it upstream.

Thanks for the patch!

> It covers all options described in the man (expect one, which is
> depreciated).

"deprecated", unless sbuild's financials are weirder than I thought. ☺

> Don't hesitate to give me feedback, I'd be glade to improve it.

I've done a partial review and found some minor issues.  I also have
some suggested additions; those are nice to haves, not blockers, of
course.

> _deb_distributions() {

There's already Completion/Debian/Type/_deb_codenames.  Please use it
(and improve it if needed).

> _get_identity() {
>     [ -n "${DEBFULLNAME}" -a -n "${DEBEMAIL}" ] && \
>         compadd "$@" "${DEBFULLNAME} <${DEBEMAIL}>"

Please add an end-of-options guard:
.
    compadd "$@" -- …
.
Please also fix the other instances of this issue in the patch.

Please use «_wanted» to allow filtering by tags.

I know it's annoying, but it's allowed to do:
.
    unset DEBFULLNAME
    DEBEMAIL="J Random <jrandom@debian.org>"
.
Could you support this?

Please use «[[» instead of «[»: the former is a reserved word, the
latter a builtin.  (No effect in this case, but more for a consistent
coding style.)

> }
> 
> _get_gpg_key() {
>     compadd "$@" $(gpg -K --with-colons 2> /dev/null | grep '^uid:u:' |
>                    grep -o -e '<[^>]*>' | tr -d '<>')

Example output:

[[[
% GNUPGHOME=$PWD gpg -K --with-colons
sec:u:3072:1:A1EA95DE874DB2D5:1566533599:1629605599::u:::scESC:::+::::
fpr:::::::::D1ADEF874C12D90BFB1062E0A1EA95DE874DB2D5:
grp:::::::::835F9949A6E28D3B70696867F064CBFF5DEBF50B:
uid:u::::1566533599::A06E327EA7388C18E4740E350ED4E60F2E04FC41::foobar:
ssb:u:3072:1:7CF9BDFD879FC134:1566533599:1629605599:::::e:::+:::
fpr:::::::::876684635455EB5CC21751587CF9BDFD879FC134:
grp:::::::::CD7D8D5F91E21EE5ADA28CADF7A17233F028C1FC:
]]]

A couple of issues here:

- Please use _call_program, to make the path to gpg configurable by
  zstyle.

- It would be nice to use builtins and parameter expansions instead of
  greps, for performance on Cygwin.  (Yes, I know this completion is
  for sbuild, but someone might do «ssh foo sbuild <TAB>».)  For
  example:

  local -a lines=( ${(f)"$(_call_program …)"} )
  lines=( ${(M)lines:#(#s)uid:u:*}

  and then split each element by colons to get the right field.  (You
  need to do that anyway for two reasons: (1) because the uid line
  needn't contain angle brackets; (2) for forwards compatibility with
  future versions of gpg.)
  
  By the way, consider using _describe.  If you use the "Name <Email>
  (Comment)" as the completion, you can add the keyid as the
  description, and vice-versa.

> }
> 
> _sbuild() {
>         '--add-depends=[add dependencies to source package]:depends' \

The part after the colon should say something like "source package
name" or "source package names, comma separated".  It's actually
displayed during completion if you have the «format» style set (e.g.,
«zstyle ':completion:*:(messages|descriptions)' format '> Completing %d»).

I ran out of time here so haven't reviewed the rest of this function,
sorry.

>         '*:dsc file:_files -g "*.dsc"'
> }
> 
> _sbuild "$@"

Cheers!

Daniel

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

end of thread, back to index

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-22 19:53 [PATCH] Completion for sbuild Baptiste BEAUPLAT
2019-08-23  4:40 ` Daniel Shahaf

zsh-workers

Archives are clonable: git clone --mirror http://inbox.vuxu.org/zsh-workers

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://inbox.vuxu.org/vuxu.archive.zsh.workers


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git