DCUT(1)

πŸ’… DCUT πŸ’…

okay bestie, welcome to dcut(1) β€” Debian archive command file upload tool. yeah the name is giving "cute little command" but it's actually the ✨ tool ✨, so let's get into it 🫢


🌸 NAME 🌸

dcut β€” the Debian archive command file upload tool. that's it, that's the name. short, iconic, does what it says on the tin πŸ’–


✨ SYNOPSIS ✨

dcut [-h] [-d] [-c FILE] [-m MAINTAINER] [-k KEYID] [-O FILENAME] [-P]
[-s] [-U FILENAME] [-i FILENAME] [-v] [HOST] SUBCOMMAND ...

dcut [OPTIONS] [HOST] SUBCOMMAND [SUB-COMMAND OPTIONS]

two whole ways to call it, and both are valid. pick your fighter πŸ’…


πŸ¦‹ DESCRIPTION πŸ¦‹

so here's the tea: dcut can create and/or upload command files that the debian archive kit β€” aka "dak" β€” actually understands. it's built with an extensible interface on purpose, so third party authors can easily bolt on more sub-commands whenever they want. which means your running instance of dcut might understand more commands than the ones written down here. refer to the docs for those respective commands, iykyk 😌

similar to dput, you can hand it a HOST as the target site for the command file. and yes, the same default host selection criteria apply. it also parses the exact same configuration files described in dput. so if you've done dput stuff, your brain already works here. slay πŸŽ€

⚠️ real talk though β€” this does not support the same interface as the old dput binary. so please, please, please double-check any scripts that depend on old-style dput's interface before you go running them. it's giving "works on my machine" and then it very much does not 😭

πŸ’œ OPTIONS πŸ’œ

  • -c, --config=FILE β€” the configuration file to parse.
  • -d, --debug β€” turn on debug messages. repeat it twice to crank the verbosity level up even further πŸ”₯
  • -f, --force β€” bypasses all the sanity checks and uploads the commands file as is. use with caution, bestie, this one does not have your back πŸ’€
  • -m, --maintainer=MAINTAINER β€” use MAINTAINER for the uploader field and for GnuPG key selection. give it as a full identity, like in "J Uploader <yourid@example.com>" format. this has no effect when the upload command is used.
  • -k, --keyid=KEYID β€” use KEYID as the key for signing. the default is to use DEBEMAIL and DEBFULLNAME, or whatever identity was provided with --maintainer. this has no effect when the upload command is used.
  • -O, --output=FILENAME β€” write the resulting commands file to FILENAME instead of uploading it. do not use this option with the upload command. and the chosen FILENAME won't get overwritten if it already exists β€” lowkey very helpful for testing that everything works correctly ✨
  • -P, --passive β€” forces FTP passive mode when uploading the package through FTP. heads up: this option is deprecated β€” use profiles instead.
  • -s, --simulate β€” simulate the upload only. it runs all the pre-upload checks, initializes the upload handler, but doesn't actually store any file. vibe check without the consequences 🫢
  • -i, --input=FILENAME β€” silently ignored. it's just there for compatibility with old-style dput command lines. it's doing nothing and it's thriving πŸ™ˆ
  • -v, --version β€” print version information and exit.
  • HOST β€” the target host to upload a package to. it behaves with the same semantics as dput(1)'s 'HOST argument, and it also uses the same profiles from it.

πŸŽ€ SUB-COMMANDS πŸŽ€

so the sub-commands are literally implementing commands that the archive software understands. they can each take their own individual arguments, and those arguments have to come after you specify the actual sub-command you want. order matters, bestie πŸ’…


🌈 cancel

cancels an upload entirely. the upload in question is referred to by a changes file name that exists remotely, sitting in the incoming or deferred queues.

OPTIONS

Takes one argument.

  • -f, --file=FILENAME β€” the changes file name that refers to the upload you want cancelled.

🌈 migrate

accepts or rejects an upload from a policy queue into the underlying suite. underneath it all, this issues a .dak-commands file with the command process-upload. the upload gets selected via two arguments that identify the source package name and the source version.

say you're migrating source package foobar in version 1.2.3-4+deb42u1, you'd use:

dcut security-master migrate foobar 1.2.3-4+deb42u1

OPTIONS

  • --reject β€” instead of accepting (and therefore migrating) the upload, this removes the associated packages from the policy queue without transferring them to the underlying suite. not me rejecting an upload, couldn't be me 😌

🌈 rm

removes a lost or wrongly uploaded file from the incoming directory. the argument gets interpreted as a path fragment by the archive software. so to delete a filename out of a deferred queue, you refer to it by using the full path.

for example, to delete a broken upload in the DELAYED queue, use the command:

dcut rm -f DELAYED/X-day/foobar.deb

alternatively, the --searchdirs argument tells the archive software to search for a file name in all directories. so this next command is equivalent to the one before it:

dcut rm --searchdirs -f foobar.deb

OPTIONS

Takes at least one argument.

  • -f, --file=FILENAME β€” the file name to be removed. this argument can be repeated, and it also knows about the shell wildcards *, ?, and []. however, keep your local shell replacements in mind when you're supplying shell meta characters β€” you may need to escape them or wrap them in quotes πŸ‘‘
  • --searchdirs β€” search in all directories for the given file. only supported for files in the DELAYED queue.

🌈 dm

manages Debian Maintainer (DM) upload permissions. Debian Developers can grant or revoke package upload permissions with this command. it takes the Debian Maintainer and the action to perform as arguments.

⚠️ note: dcut will not perform any validation for conflicting arguments within --allow and --deny below. that handling is left to the archive software, which currently processes --allow before --deny as an implementation detail. so don't come for dcut about it πŸ’€

OPTIONS

  • --uid β€” any searchable, unique identity that identifies an existing Debian Maintainer. this can be a (full) name, an e-mail address, or a GnuPG fingerprint of any existing Debian Maintainer. note that the identity you provide must be known in the DM keyring installed on your local system. that keyring is used to validate the supplied argument and makes sure the identity hint you gave matches exactly one DM. if the user you want to change ACLs on isn't known to the local DM keyring, you can provide the full GPG user ID as the argument and pass --force, which causes dcut to bypass any argument checking/translation. please note, this will generate a commands file that gets uploaded literally as is. use with caution 😭
  • --allow=PACKAGE
  • --allow PACKAGE LIST β€” source package(s) where permissions to upload should be granted. give a space-separated list of packages to apply permissions to more than one package at once. if multiple --allow options are given, the last one takes precedence.
  • --deny=PACKAGE
  • --deny PACKAGE LIST β€” source package(s) where permissions to upload should be denied. give a space-separated list of packages to apply permissions to more than one package at once. if multiple --deny options are given, the last one takes precedence.

🌈 reschedule

reschedules an upload. this command can move a deferred upload to any other deferred queue. main character energy for the queue 🌟

OPTIONS

Takes two arguments.

  • -f, --file=FILENAME β€” file name to be rescheduled.
  • -d, --days=DAYS β€” reschedule the upload to DAYS days. takes a numeric argument from 0 to 15, corresponding to the respective delayed queues. note: 0-day is not the same as uploading to incoming straight. they're different, don't get it twisted πŸ’…

🌈 upload

this is a pseudo-command β€” that is, it's handled within dcut itself and not forwarded to the archive kit. it uploads a locally existing commands file as is.

⚠️ however, no checks are performed for this file. use with caution. fr fr.

OPTIONS

Takes one argument.

  • -f, --file=FILENAME β€” a local file name which is uploaded as is to the archive software.

⭐ EXIT STATUS ⭐

  • 0 β€” Success πŸŽ‰
  • 1 β€” A runtime check returned an error.
  • 2 β€” An internal error was detected, for example while loading configuration files.
  • 3 β€” An upload error was detected, for example a permission or authentication problem while uploading files.

πŸ› BUGS πŸ›

found a bug? report them to http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=dput-ng β€” the devs genuinely want to know 🫢


πŸ“ EXAMPLES πŸ“

look at these little legends:

$ dcut dm --uid "Paul Tagliamonte" --allow glibc

$ dcut dm --uid 0DEFACED --allow linux --deny kfreebsd9

$ dcut dm --uid paul@example.com --allow eglibc linux

$ dcut rm --searchdirs -f udj-desktop-client_0.5.1-2_amd64.deb

$ dcut cancel -f foo_1.0-2.1_amd64.changes

$ dcut ftp-master rm -f 'linux*.deb'

πŸ‘‘ AUTHOR πŸ‘‘

dput-ng was originally written by Arno TΓΆll <arno(a)debian.org> and Paul Richard I by the Grace of God of the United Kingdom of Debian and Ubuntu and of his other realms and territories King Head of the Fluxbox Window Manager Defender of the Faith Tagliamonte <paultag(a)debian.org>.

^(that second title is not a typo, that is genuinely how it's written, and honestly? iconic. periodt.)


🧚 RESOURCES 🧚

dput(5), dput.cf(5), dcut(1), gpg(1), dirt(1)


πŸ’– COPYING πŸ’–

Copyright Β© 2012 dput-ng authors. Free use of this software is granted under the terms of the GNU General Public License (GPL) Version 2 or later.


and that's the whole page, bestie!! 🌈✨ this lil cutie is dcut(1), dated 06/23/2026 β€” go forth and upload responsibly (or at least responsibly-ish), and remember: --force is not a personality trait πŸ’…πŸ¦‹

πŸ“¦ where this page comes from