# NAME

dht – Debian Haskell Packaging Tools

# SYNOPSIS

./dht subcommand [args..]

# DESCRIPTION

This is the Debian Haskell Team multi purpose tool, combining various more or less useful tools.

Supported subcommands:

- cabal-debian - Run cabal-debian with inferred parameters
- dch - Append the changelog
- debian2dsc - generate a dsc file from a debian directory
- init - Create an initial packaging
- make-all - Rebuilds a set of packages
- mass-change - Apply a change to many packages
- tag - Tag a built package
- upgrade - Upgrade a package to the version in the package plan
- upload - Uploads, tags and pushes
- what-to-build - Find packages to be built
- what-to-upgrade - Find packages to be upgraded
- what-to-upload - Lists .changes files that should be uploaded

# Subcommands

## dht cabal-debian

Usage: dht cabal-debian [option…]

This is a wrapper around cabal-debian that tries to infer a few useful facts: * If the test suite is enabled. * Which Cabal flags are to be used. * The source package name.

None of these checks are perfect, so check the result.

It also passes `--official`.

## dht dch

Usage: dht dch [debchange option]

This is a wrapper for debchange(1), which will implement our custom heuristics of whether a new changelog entry should be created, or the current one be amended: If the current version is tagged, create a new changelog entry, else append to the current one.

It passes either –append or –increment to debchange, so you should not. The –newversion option may be used in order to specify the version number.

## dht debian2dsc

Usage: dht debian2dsc [-o output/] [dir …]

Expects directories containing the contents of the `debian/` directory of a Debian source package (i.e. `control`, `changelog`, `watch`, …). Uses the watch file to retrieve the upstream tarball (unless it already exists in the local directory), creates a `debian.tar.xz` tarball from the given directory (ignoring the ususal suspects like `_darcs` and `*~`) and creates a corresponding `.dsc` file; all without unpacking the upstream tarball.

## dht init

Usage: dht init [-D distribution] Cabal-Pkg …

This script will:

- Query the package plan for the desired version number of CabalPkg.
- Use `cabal unpack --pristine` to fetch the source into the right directory
- Run cabal-debian –official to initialize the packaging.
- Optimistically mark the package as ready for release
- Commit this to git.

Please review the package afterwards, in particular `debian/copyright`.

## dht make-all

Usage: dht make-all [–excluded-packages PKG,PKG,…] [-o|–output DIR] [–bindmount DIR] [-j|–jobs INT] [-c|–chroot SCHROOT] [–shake-verbosity VERBOSITY] [–keep-going] [–sbuild-option OPTION] [TARGET…] Rebuilds a set of packages

Available options: -h,–help Show this help text –excluded-packages PKG,PKG,… comma or space separated list of source package names to ignore (default: ghc, ghc-testsuite, haskell-devscripts, haskell98-report, haskell-platform) -o,–output DIR output directory (default: “lab”) –bindmount DIR directory bind-mounted in the schroot (default: “/tmp”) -j,–jobs INT number of parallel jobs (default: 1) -c,–chroot SCHROOT name of the schroot to use (default: “haskell”) –shake-verbosity VERBOSITY verbosity for shake (Silent, Quiet, Normal, Loud, Chatty or Diagnostic) (default: Normal) –keep-going keep going even if there are errors –sbuild-option OPTION An option to pass on to sbuilder (can be passed multiple times)

## dht mass-change

Usage: dht mass-change [-n] [MESSAGE] [ACTION] DIRECTORY …

This script runs ACTION in each of the given directories. If the ACTION effected a change, it will add MESSAGE to the changelog.

It assumes that all directories are in the same git repository as this script. It ensures that the repository is clean to begin with, and will commit all changes at once at the end, if there was a change.

## dht tag

Usage: dht tag [–dry-run] [directory..]

For all given directories, which should be Debian source packages, figure out the current version from debian/changeslog and create a tag, tagging the youngest git commit that changed this particular source package.

With –dry-run it simply checks if it could tag everything (suite not UNRELEASED, not already tagged), and returns 0 if it could.

## dht upgrade

Usage: dht upgrade [-D dist] directory/

This script will:

- Query the package plan for the desired version number.
- Run debchange to amend the debian/changlog.
- Run cabal-debian –official –upgrade to upgrade the packaging.
- Optimistically mark the package as ready for release
- Commit this to git.

At the end, it will rightfully ask you to review the changes, giving you a helpful link to the diff between the upstream sources.

## dht upload

Usage: dht upload [-h HOST] [foo.changes]

Signs the `.changes` file and the corresponding `.dsc` file in a temporary location (to avoid touching the original files), uploads them to the archive using `dput`, tags them in the repository and pushes the tag.

If the -h parameter is specified, upload to HOST, rather than the dput `default_host`. If mass-uploading, it is suggested to use `ssh-upload` for robustness (see the discussion in #833536).

If no changes file is given, but the script is run in a debian source package, it checks the parent directory for an appropriately named changes file, just like debrelease(1) would do.

Checks that the distribution is not `UNRELEASED` and that the tag does not exist already.

## dht what-to-build

Usage: dht what-to-build [directory..]

For all given directories (defaults to `p/*/`), check if they are to be built. This means, in particular:

- The latest entry in `debian/changelog` is not `UNRELEASED`, and
- there is no corresponding tag in the git repository.

## dht what-to-upgrade

Usage: dht what-to-upgrade [directory..]

For all given directories (defaults to `p/*/`), check if they are to be upgraded, i.e. that the package plan lists a newer version than the changelog.

## dht what-to-upload

Usage: dht what-to-upload foo.changes ..

Given a number of changes files, reports hose that should be uploaded, i.e. the distribution is not UNRELEASED and that the tag does not exist already.