DEBDELTAS(1)

✨ debdeltas β€” the manual, but make it cute ✨

okay so bestie, this is the manual page for debdeltas, a User Command from the DEBDELTAS(1) page. it computes deltas between Debian packages and it is honestly kind of iconic. let's get into it 🫢


🌸 NAME 🌸

debdeltas β€” compute deltas between Debian packages. that's it, that's the vibe. πŸ’…


πŸŽ€ SYNOPSIS πŸŽ€

debdeltas [OPTION]... ARGS ...

πŸ¦‹ DESCRIPTION πŸ¦‹

so debdeltas computes deltas between the old and new versions of Debian packages. periodt.

and if you're sitting there like "bestie what even is a delta" β€” the full explanation lives in debdelta(1). go read that one, iykyk. πŸ’œ


πŸ‘‘ COMMAND ARGUMENTS πŸ‘‘

okay so, in all of the following, ARGS can be any of these three things:

  • a Debian binary file (usually, a file ending in .deb) πŸ’–
  • a directory containing such files πŸ“
  • a Packages file (that is, an index file such as those found in Debian mirrors β€” even the zipped ones β€” see apt-ftparchive(1))

we're gonna call cmdline all such args that are not related to an option. no cap.

as a first step, debdeltas builds an internal list of Debian packages. to do this, it parses all ARGS of the options --alt, --old, and those ARGS given as non-option arguments (the aforementioned cmdline args). and then:

  • if the argument is a Debian package β†’ debdeltas adds it to the list ✨
  • if the argument is a directory β†’ debdeltas scans it for Debian packages to be added to the list πŸ”
  • if the argument is Packages files β†’ debdeltas parses it and adds all Debian packages to the list πŸ“¦

then debdeltas groups all found Debian packages by name and architecture. slay.

for each group, the newest cmdline version is isolated, and then deltas are computed from all --old versions to that version. πŸ’«

these deltas are stored in many delta files with appropriate names of the form:

name_oldversion_newversion_architecture.debdelta

the location of the delta files is specified by the --dir option. πŸ“‚

note that the location of files in a Packages index is specified relative to the base of the mirror, e.g. Filename: pool/main/x/xxx/xxx_3_i386.deb. for this reason, any Packages argument must be presented with a long path (that contains at least the dists directory). don't be lazy about it bestie 😭
note also that the same directory or index can be provided many times β€” as --old, as --alt, and as a cmdline argument. it's giving "no thoughts, head empty, just parse it again" πŸ™ˆ
note also that debdeltas will skip all packages that are smaller than 10KB. tiny babies don't get deltas. πŸ’€

πŸ’– MAIN OPTIONS πŸ’–

  • --dir DIR β€” force saving of deltas in this DIR (otherwise they go in the dir of the newer deb_file). πŸ“
  • --alt ARGS β€” this is parsed as the non-option command line, but the found packages are never considered for a delta. they are considered though when --clean-deltas is used, to decide if to delete a delta; and they're useful to find debs that are deleted from indexes and moved elsewhere. multiple --alt can be specified. 🧚
  • --old ARGS β€” this is parsed as the non-option command line, and the found packages are considered as the older versions. multiple --old can be specified. moreover, when scanning a Packages index, it is not an error if files do not exist, as long as they have been moved in a --alt directory. note that, if no --old is specified, then no deltas will be generated 😭 (yes really, zero, nada).
  • --forensicdir DIR β€” write hashes files; these are to be compared with those produced by debdelta-upgrade --forensic=... when a delta fails. πŸ”

🌈 The double slash 🌈

okay this one is lowkey my favorite. listen up. πŸ‘‘

if a directory path is provided as argument to --dir, and it ends in //, then this triggers a specific behaviour related to files found in Packages indexes (as presented in the commandline). so if a package in an index is stored in pool/main/x/xxx/xxx_3_i386.deb, and --dir is /tmp/foobar//, then the delta will be saved in:

/tmp/foobar/pool/main/x/xxx/xxx_2_3_i386.debdelta

the same is true for --alt (and is useful to find old versions of a package). the double slash is doing the most and we love her for it πŸ’…βœ¨


⭐ OTHER OPTIONS ⭐

  • --signing-key KEY β€” key used to sign the deltas (using GnuPG). πŸ”
  • -n N β€” how many deltas to produce at maximum for each unique package/arch (default unlimited). πŸ”₯
  • --clean-deltas β€” delete deltas that upgrade to packages versions that are not found in the cmdline ARGS, and are at least two days old (according to mtime). 🧹
  • --no-md5 β€” do not include MD5 info in debdelta. πŸ™…
  • --needsold β€” create a patch that can only be used if the old .deb is available. πŸ‘€
  • --delta-algo ALGO β€” use a specific backend for computing binary diffs; possible values are: xdelta xdelta-bzip xdelta3 bsdiff. πŸ› οΈ
  • -M Mb β€” maximum memory to use (for 'bsdiff' or 'xdelta'). 🧠
  • --test β€” check that the patch does apply. βœ…
  • -v β€” verbose (can be added multiple times). πŸ—£οΈ
  • -d β€” print traceback on errors; save useful info in temporary files in case that a backend crashes. πŸ›

(if '-d' is added multiple times, it also adds to the patches other extra debugging checks: only for advanced bug tracking). πŸ’€

  • -k β€” keep temporary files (use for debugging). πŸ—‚οΈ
  • --gpg-home β€” specify a different home for GnuPG, default for root is /etc/debdelta/gnupg while for other users is unset. see --homedir in gpg(1) for details. πŸ”‘
  • --disable-feature FEATURE β€” disable an internal feature. see the documentation in README.features. 🚫
  • --no-act β€” just list the deltas that would be created. πŸ‘»

πŸ”’ SECURITY πŸ”’

see debdelta(1). (yes, we're outsourcing that one. go look bestie 🫢)


🚦 EXIT STATUS 🚦

see debdelta(1). (also outsourcing, sorry not sorry πŸ’…)


🌟 EXAMPLES 🌟

this one generates all deltas to upgrade from the old versions in ~/mydebs to the newest version in ~/mydebs, and stores the deltas in /tmp/:

debdeltas --dir /tmp/ --old ~/mydebs ~/mydebs

and this one generates all deltas to upgrade main/i386 from lenny to squeeze, and stores the deltas in a pool structure under /tmp/:

debdeltas --dir /tmp// --old /mirror/debian/dists/lenny/main/binary-i386/Packages.gz /mirror/debian/dists/squeeze/main/binary-i386/Packages.gz

see also the example scripts /usr/share/debdelta/debmirror-delta-security and /usr/share/debdelta/debmirror-deltas β€” they're giving main character energy fr fr ✨


😭 REPORTING BUGS 😭

report bugs to <mennucc1@debian.org>. be nice, they're doing their best 🫢


πŸ‘‘ AUTHORS πŸ‘‘

Debdelta was written and is copyright Β© 2006-09 Andrea Mennucci.

This man page was written by Jegou Pierre-yves <pierreyves.jeg@voila.fr>.


πŸ’œ COPYING πŸ’œ

This is free software. You may redistribute copies of it under the terms of the GNU Library General Public License <http://www.gnu.org/licenses/lgpl-2.0.html>. There is NO WARRANTY, to the extent permitted by law.


πŸ¦‹ SEE ALSO πŸ¦‹

debpatch(1), debdelta(1), /usr/share/doc/debdelta/README.


okay and that's the whole page bestie!! this was debdeltas from the DEBDELTAS(1) manual, version dated aug 2009, and the footer said debdeltas β€” yeah, that's right, she named herself twice, iconic behavior. now go compute some deltas. mwah πŸ’…πŸ’–βœ¨