Back to mini-buildd PTS page

Accepted mini-buildd 1.9.90 (source) into experimental



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Mon, 11 Oct 2021 10:17:04 +0200
Source: mini-buildd
Architecture: source
Version: 1.9.90
Distribution: experimental
Urgency: medium
Maintainer: Stephan Sürken <absurd@debian.org>
Changed-By: Stephan Sürken <absurd@debian.org>
Changes:
 mini-buildd (1.9.90) experimental; urgency=medium
 .
   Summary:
   * Make work for django 3.2 (now compatible 2.2-3.2).
   * New structure for internal store dirs "events" and "builds".
   * New "setup" API call (replacing "wizards"), now including some
     maintenance capabilities.
   * Quite a lot of testing && micro changes, especially for the WEB UI.
 .
   Details:
   * [bf04c89] base.html: api, doc, admin links: complete via config.
   * [255261a] config.py: Mv all "accounts" uris to config.
   * [0c05fdd] config.py, fstab: Just use one directory ('var/shared': to
     be shared with chroots). Replaces "var/spool", "var/chroots-libdir".
   * [7a757d5] config.py: Update id "spool" to "builds" (under new
     'var/share').
   * [bc1c2f6] config.py: Renaming "chroots_lib"->"libdir".
   * [389745b] config.py: Fix some "acounts" uris: Should be relative.
   * [dfdc54d] urls.py: Fix: Use config for account profile, not hardcoded.
   * [0866407] httpd.py (HttpD._add_static_route): Support url hierarchy.
   * [63c3969] config.py: (Temporary) fix for static compat log.
   * [6650c4a] config.py: Cease using "home.html", always use "index.html"
     (as default template).
   * [67293a7] snippets/events.html: Fix event log links.
   * [c74a4fa] devel (restart): Give up after 5 tries to call status (don't
     loop forever on error).
   * [0e4c565] django_settings.py (configure): Fix: Don't hardcode
     STATIC_URL.
   * [41a248b] api_view/show.html: Fix wrong mbd_uri call.
   * [d4005a4] views.py (ExceptionMiddleware.__error): Log middleware
     exceptions (else no chance to debug template errors).
   * [7a2a02c] *.html: Various get -> getabs fixes ;(...
   * [8192ccc] config.py: Rename "events-log" "events" (uri && dir).
   * [de0bf01] events/log.html: Fix static link.
   * [b14448b] models/repository.py (Repository.mbd_get_apt_line): Fix: Use
     URIS config for repo url.
   * [dc3d34d] devel: Update tidy test.
   * [be14c68] config.py: Just use "attach" for event attach location.
   * [d6d4b7f] httpd.py (FileResource): Move "doc missing" support to
     FileResource.
   * [3d63fcd] httpd.py (HttpD): Generalize route support (so we can add
     events the same way).
   * [c318c12] changes.py: Add "timecode" support: Once generated in
     Upload, propagated through to buildrequest/result.
   * [1b4032b] builder.py: Don't remove build dir port-building.
   * [65d779e] packager.py (Packager): Fix: Log exception on unexpected
     fail.
   * [bc04a5b] views.py (API.dispatch): Fix: Log exception when api call
     fails.
   * [3cae7ec] events.py (Event.from_changes): Add timecode from changes to
     events.
   * [af570de] changes.py, packager.py: Fix "move_to_pkglog": Dump special
     treatment for rejected/installed && any purge action.
   * [e8c3699] builder.py (Build.run_deferred): With purging removed, dump
     clean() and just remove buildrequest directly.
   * [2f91ea4] changes.py: Upgrade LogPath implementation-
   * [e5ca5ca] changes.py (Changes.get_spool_dir): Now obsolete, removed.
   * [7c37202] changes.py (Changes): Remove "spool_hash" support: No longer
     needed.
   * [c83d629] net.py (reactor): Comment some debug logs (occur too often,
     even for debug).
   * [857fe6a] builder.py (Build.build): Remove safeguard code to remove
     "live buildlog" due to possibly same sha1sum (we use timecode now).
   * [6c4a0e0] config.py: Move 'static options' to config (and fully
     automate static routes).
   * [f6f04f1] config.py: Add Uris for "builds" (analog to "events").
   * [52206aa] config.py (Home.__init__): STATIC, DOC global resources no
     longer needed.
   * [871c0ea] config.py: Resource, Home -> Route, Routes.
   * [bf92fdf] httpd.py: Add custom directory indexer: Home, "up",
     automated "view" link.
   * [ef42ff2] base.html: Main menu: Add events, repositories and builds
     (static) links.
   * [d9641b1] views.py: Rename "buildlog" view "plain".
   * [74e5350] views.py: New generic EventsView.
   * [5db086d] views.py: Update/fix PlainView to work w/ events.
   * [ab3f111] views.py: Rm obsoleted EventLog views.
   * [a0fa305] urls.py: builds: Add buildlog view.
   * [51d89b2] urls.py: Fix: Give route str ids only (ROUTES may not be
     configured at import time).
   * [79ea4ab] events|plain.html: block title should not have html tags.
   * [298d284] builder.py: Remove extra "live buildlog" support (we now
     just use 'builds' dir).
   * [7151b1a] httpd.py: Allow multiple static routes (for compat routes).
   * [570196f] config.py: Put all "static" routes (i.e., handled by httpd
     directly) below '/static/' (avoids uri pollution / possible conflicts
     with django apps).
   * [0309ee4] config.py: Introduce StaticUri: Fix repetition of static
     prefix && fix option handling.
   * [a558d53] httpd.py (DirectoryLister.mbd_header): Use
     StaticUri.uri2view to convert to view uri in directory listing hack.
   * [f5d849b] config.py: Remove obsoleted "buildlogs" route.
   * [b7ece38] packager.py (Package.auto_ports): Add log_exeptionif
     auto_port fails && protect erro handling.-
   * [c9e9ab9] config.py: Compat: Add "/repositories/" compatibility route.
   * [920ae0f] config.py: Add "log_v10x" compat URI.
   * [725da8c] changes.py (Changes): Get rid of extra properties:
     file_name, file_path.
   * [d04a3cf] changes.py: Get rid of superfluous is_new() method.
   * [51efe1b] changes.py: Create path only when needed && simplify save().
   * [60ac468] changes.py (Changes): Make file_name + is_new properties
     (prepare for file_path to be None).
   * [a04eb8f] changes.py (Changes): Allow initialization via dict.
   * [dcd0c40] events.py: Log via logchanges() only, and with actual
     'Changes' objects.
   * [54b136d] config.py (StaticUri): Make options with kwargs.
   * [e213198] httpd.py: Directory listing: Put "up" button before
     directory (so it does not move).
   * [6a335f9] snippets/repositories.html: Put old-style (per repo!) compat
     link to repositories, not events.
   * [535332b] snippets/repositories.html: Only one "browse repo" link (no
     need for separate dist/ and pool/ links).
   * [09ba836] config.py (StaticUri): Regex: Auto-prepend uri to regex &&
     fix repository regex (i.e., allow conf/, db/ down in the tree).
   * [42f1c20] config|httpd.py: Compile regex early (StaticUri), and don't
     call at all if not given.
   * [181c14b] httpd.py (FileResource): Use (one) dict for options && put
     defaults & 'docs' to config.
   * [e69800e] config.py: Rename option "with_cache" -> "cache_ttl" (and
     support configuting the actual TTL (max-age) value).
   * [4f4bedf] includes/mbd_events.html: Don't display "migrate", "remove"
     on events page.
   * [a4171f9] includes/mbd_events.html: Always show events link.
   * [9379b09] templates/includes/mbd_sbuild_status.html: Remove newline at
     EOF (make mbd_sbuild_status tag really spaceless).
   * [85fbadf] templates/includes/mbd_events.html: Move crucial info to
     'Details' only, remove redundancies.
   * [04c6634] events.py (Event): Simplify extra_info() -> error(): Not
     used any more.
   * [596bab4] events.html: Use "All" as title if path is empty && add "up"
     link.
   * [e951e93] changes.py (DebianFileName): New class -- upcoming one-stop
     for all debian file names.
   * [a5040a5] changes.py (Changes): New precondition: Any object must
     already have Source, Version, Distribution.
   * [f81a67c] changes.py (Changes): Add "dfn" (DebianFileName) class var
     (possible w/ new precondition).
   * [4e86187] changes.py: Obsolete gen_changes_file_name, gen_file_name,
     gen_dsc_file_name, dsc_name (all handled by DebianFileName now).
   * [26c7618] changes.py: Obsolete get_buildlog_name (handled by
     DebianFileName now).
   * [791b46d] changes.py (Changes): Rename dsc_file_name -> dsc_file_path,
     and un-property it.
   * [2bb9af9] includes/mbd_events.html: Add static (browse) Events link.
   * [40c1cab] changes.py (DebianFileName): Update to one generig generator
     method (gen), and fixup json type.
   * [15fb0b1] events.py (Event.save): Update to use DebianFileName.
   * [dae6ed0] changes.py (DebianFileName): Do apdxes w/o leading slash.
   * [e2d6884] devel: Add "fishy-words" test (just output, don't fail).
   * [6098b30] files.py: Add 'Tar' helper class.
   * [3136f94] changes.py (gen_buildrequests): Use DSC and its files for
     buildrequest tar (instead of excluding from uploaded changes).
   * [1732203] changes.py (Changes): Use files.Tar for tar, untar && remove
     obsoleted functionality.
   * [7a9a1f6] includes/mbd_events.html: Always show error in summary.
   * [bd9e08c] repository.py: Fix: Don't log MIGRATE event on error-
     rollback (due to failed binary install).
   * [fc6a109] changes.py (Changes): Add get_files_path helper.
   * [5bc9be0] config.py (Uri.getabs): Guess if uri is dir, and append "/"
     in that case.
   * [47c010c] mini_buildd.js: Add mbd_event (test code only).
   * [fcee1dd] mini_buildd.js: Add some missing 'EOL-semicolons'.
   * [7815d34] urls.py: api_view/, not api_view.
   * [24d1570] doc: Don't use mini-build.css, fix logo paths to use twisted
     static, and remove mini-buildd's static files.
   * [6c7f6d7] devel (MBD_CODEVERSION): Fix bullseye: ~BULLSEYE, not 11
     (still not released yet).
   * [dabd18c] config.py: Rename 'static/events' -> 'static/events.attach'
     (better name, and marks it "non-dir" for uris).
   * [f2f0c66] events.py: Add new events: BUILDING and PACKAGING (to
     eventually replace packaging/building display support).
   * [78811e1] html: Remove 'packaging', 'building': Events only.
   * [8a61b77] base.html: 'Events' not needed in header menu.
   * [fd73331] *.html: Make all snippets (except events) normal templates.
   * [175f07f] index.html: 'Un-snippet' events. Events are just on the
     index page now (autoreload yourself if needed ;).
   * [3231c64] mini_buildd.js: Rm all snippet-related code.
   * [a6320be] includes/mbd_snippet.html: Rm, no longer used.
   * [87801ec] mini_buildd.css: Rm snippet-related css code.
   * [8b130fa] builtins.py: Rm mbd_snippet and mbd_next.
   * [5114e65] changes.py: Move DebianFileName to 'files' module.
   * [f63bdf9] changes.py: Mv *LogPath, Log to module "files".
   * [0cc2622] config.py: Mv "Path" to module "files".
   * [ae767e6] includes/mbd_events.html: POC: Try to prevent table
     'changing design' after page/script load is complete.
   * [c28749d] builtins.py: Generalize/simplify datatables javascript code
     via template tag.
   * [a18df9e] devel: Add "compat.*only" to fishy words.
   * [ad3feae] files.py (Path): "merge" (sort-of) functionality of LogPath
     into Path.
   * [fb01495] files.py: Replace obsoleted "LogPath" by Path.
   * [2b45f65] setup.cfg (max_line_length): Sync w/ prospector value.
   * [2d5e6ad] changes.py (Changes): Temporary fix for temporary
     get_buildlog_uri.
   * [2418622] includes/mbd_events.html: Fix for events view uris: Use sub,
     not path.
   * [8805f2c] files.py: Update EventsPath to be used in events view.
   * [4e2f3bd] models/repository.py (Repository.mbd_get_dsc_path): Simplify
     code (after Path update).
   * [288294e] files.py (Log): Rm onsolete Log class (and temporarily
     comment/mark api call "retry").
   * [e0af21d] devel: Help the elderly to better find errors by unasked-for
     ridiculous terminal log eye-candy.
   * [2a88e31] devel: Don't fail if tput fails.
   * [05ff676] events.py (Event.save): Fix file_path for type BUILDING
     (missing arch).
   * [b034454] packager.py: Log PACKAGING event _before_ uploading
     buildrequests -- else BUILDING events may be logged first if building
     is on the same instance.
   * [3eae9f5] events.py: Events: Add "running": Only PACKAGING/BUILDING
     events that have not finished.
   * [0c795da] mini_buildd/index.html: Only show "running" events on index
     page.
   * [743134f] misc.py (measure): Helper to log run time of functions (dev
     only).
   * [f851fe9] events.py (Events.log): Use only one method to log (events).
   * [49ec769] devel: fishy-words: Add "deprecated".
   * [17df869] mbd_events.html: Add microseconds to datatables timestamp
     'data-order' (fixes sorting for events within same second).
   * [d73acf4] misc.py (load_json): Add helper.
   * [8d6aaee] files|daemon.py: Get events data on startup from events
     directory (making 'pickled_data' workaround now completely unused).
   * [3a68a91] files.py (Path.expire): Add "expire support" for Path.
   * [6038ff8] daemon.py: Use Path.expire for 'expire cronjobs', and use
     genrically expire 'builds' and 'events' paths.
   * [5e55e5e] config.py: Make "log" URIS non-depcrecated again (deprecate
     1.0.x compat uri only).
   * [b33a2b6] httpd.py (HttpD._add_route): Use config.Uri (not plain str)
     as argument.
   * [f55e897] httpd.py (FileResource): Use Path, Uri objects as arguments.
   * [f805b66] httpd.py (FileResource): Set 'defaultType' per constructor.
   * [515f762] config.py (Route): Make 'uris' class var "never-none" (but
     empty dict).
   * [81ba6d4] httpd.py (HttpD.__init__): Actually loop over ROUTES to add
     routes (simplifes code).
   * [a08d027] config.py (StaticUri): Get rid of the implicit prefix (in
     the end, it does make things more confusing).
   * [d3533fd] config.py (Uri): Merge StaticUri into Uri (we want to use
     options for both later).
   * [6d19b38] config.py (Uri): Just use std pyway for options (no need for
     extra options dict any more).
   * [32872ca] config.py: Fix repositories compat path.
   * [be1382b] config.py (Auth): Mv "auth" support code here from api.py
     (so it can be used anywhere).
   * [8c87101] views.py (context): Add pydoc.
   * [f4ed52a] views.py: Update class based views to simply override get(),
     not get_context_data().
   * [bbb73cc] config.py (Uri): Add "auth" to options.
   * [875f65b] config.py (Auth): Add check() (does throw on unauthorized).
   * [604705a] httpd.py (FileResource): Add "auth" support.
   * [2cd86e1] config.py (Auth.auth_err): Allow special case (user=None,
     auth=NONE).
   * [a3601e2] base.html: Generate all uri links from all routes to menu.
   * [5b655d5] config.py (Uri): Update methods to naming scheme similar to
     Path (mark compat methods).
   * [d60ed69] views.py (API.dispatch): Update to auth.check().
   * [0ffef65] config.py: Route 'log': Add (staff-protected) uris.
   * [903e86a] httpd.py (FileResource.getChild): Add better (but still
     secure) regex-does-not-match error page.
   * [8052af2] config.py: Route "log": Rm 'static_v10x' compat uri (this
     does not really work w/ twisted routes, and is not really needed).
   * [c1b33ac] config.py: "repositories" uris: Use 'static_v10x', not
     'static-v10x' (keep it accessible in templates).
   * [a683fcf] django_settings.py: Strip down context_processors to django
     (2.2.20) defaults.
   * [46046e0] base.html: Rather use URIS (not ROUTES) for "site map".
   * [2a3d338] config.py: Fixup URIS and ROUTES ordering.
   * [d4efd1b] files.py: Mv EventsPath.uri_static to Routes.static_uri.
   * [b554904] views.py (RouteView): New view (will eventually do all views
     for configured ROUTES).
   * [0435398] views.py: Switch to RouteView for builds and events
     (obsoletes PlainView, EventsView).
   * [d02faa8] views.py: RouteView: Add general tpl "route.html" (already
     replaceing "builds.html" and "events.html"; but prefering specific
     still).
   * [f6bb222] views.py (RouteView): Add dirs && files (browsing).
   * [3fec99b] views.py: RouteView: Rename "items"->"entries" (avoids
     hickup when django resolves to dict.items()).
   * [56e5e44] config.py (Uri.getabs): Update all code to new abs_join, and
     remove.
   * [7dd494c] config.py (Uri.url): Update all code to new url_join, and
     remove.
   * [e3b8603] mini_buildd/index.html: "running" include: Update to
     "entries".
   * [f8dc4d6] config.py (Uri.get): Update all code to new join, and
     remove.
   * [80d09bb] files.py (Path.get): Update all code to new join, and
     remove.
   * [01530bd] mini_buildd/route.html: Don't use "tiny" (tidy error, not
     html 5 (?)).
   * [99e3c7a] config.py: Add "menu" Uri option, add "sitemap" and auto-
     produce menu.
   * [cabba91] mini_buildd/plain.html: Rm, no longer needed.
   * [98090cf] views.py (RouteView): Add ".log" to extension list (to show
     "plain", for log/*).
   * [fa7a78c] includes/mbd_events.html: Rm extra (non-script) css include
     (was only needed for snippet support).
   * [54eb265] includes/mbd_datatable.html: Auto-hide table while setting
     up (avoids "table flicker").
   * [3f5971a] *.html: Set mbd_datatables inside the table tag (i.e., avoid
     "table-flicker" w/o breaking non-javascript browsers).
   * [258618e] config.py: Minor menu re-order.
   * [31ded8b] views.py: "chroots": Update to generic "route.html".
   * [8a61f53] views.py: "repositories": Update to generic "route.html".
   * [4adf0a8] views.py: "remotes": Update to generic "route.html".
   * [1f96d77] urls.py: Fix: Special routes must come 1st.
   * [3a7204d] views.py: "crontab": Update to generic "route.html".
   * [c38b87c] sitemap.html: Upgrade design from utterly unreadable to
     ugly.
   * [d24e8d8] config.py: repositoreis, chroot, remotes, crontab: Update to
     dir-based uri.
   * [b965c30] devel (tidy): Mute TAG_NOT_ALLOWED_IN: Cries about "<script>
     isn't allowed in <table>", but this isn't true for HTML5 afaik. And me
     wants!
   * [a06dbc7] api.py: Rm "logcat" (can now be viewed as superuser via
     browser only).
   * [c8adf3e] devel: shapshot version: Make dch fast for long stints (use
     only last couple commits).
   * [11a213b] misc.py (timecode): Make it work for any given stamp, not
     now only.
   * [cda2bca] *.py: Fix handful of literal "utf.*8" (instead of config)
     uses.
   * [3845480] files.py: Missing (explicit) import.
   * [920ec08] cron.py: Make cron status persistent (log 20 runs).
   * [a27aaa3] mini_buildd.css: lightblue -> mediumslateblue (much better
     contrast).
   * [fb3ad44] cron.py (_Job.readlog): Fix: We need to strip lines.
   * [13a64be] index.html: Add initial "problem indicator" block (crontab
     only for now).
   * [4a49623] index.html: Rm event links (are in main menu already now).
   * [1d999a0] __init__.py (open_utf8): Move to 'files' module.
   * [0c759d6] httpd.py (DirectoryLister.render): bytes() was missing
     encoder.
   * [0eb595f] urls.py: Properly order account profile route.
   * [623ff16] config.py: Update "sitemap" to "dir URI" && RouteView.
   * [37b86ed] urls.py: extra "section" for API routes.
   * [03173dd] views.py (RouteView): Use standard (non-re) <path> in
     urls.py, do parsing in view.
   * [bc5fe37] config.py: Update "home" uri to dir based.
   * [f69a288] views.py (API, APIView): Override get(), not dispatch().
   * [f1b9bef] views.py (RouteView): Rather use TemplateReponse directly,
     not shortcut.
   * [0953aed] config.py: Update "api_view" to "dir URI".
   * [3b798c6] views.py: Merge Api + APIView classes; 'api/' as generic uri
     (drop 'api_view/').
   * [df6500d] views.py (APIView): Don't use class var for api_cmd (and
     remove all pylint ignores).
   * [f3dcf40] views.py: Eliminate PathView.
   * [91e73ba] devel (tidy): Update check to test all (public django) uris.
   * [fc90c2c] mbd_repositories.html: Fix some tidy errors.
   * [44faa8b] config.py: Get rid of extra "api" uri.
   * [ae33a70] config|files.py: Uri|Path: Add __str__() (similar to
     pathlib.Path).
   * [63930a1] config.py: Make all (dir) uris natively have trailing
     slashes.
   * [695f40b] config.py: Make all (dir) uris natively have leading
     slashes.
   * [c619bea] views.py (APIView.get): Fix template names (html view).
   * [76e1955] mini_buildd.js: Fix api uri (trailing slash).
   * [993fdd5] urls.py: Completely abandon any hardcoded paths (all from
     config instead).
   * [c3d0cac] config.py (Auth.test): Test method to be used w/ django
     later.
   * [29c4e61] urls|views.py: RouteView: Do auth automatically (as per
     config.py) and via django (as per user_passes_test).
   * [7569c4f] views.py (APIView): Fix error response in when output="html"
     (to html error, not json).
   * [a9c7b60] views.py: Mv 'api index' to RoutesView.
   * [25b5e88] builtins.py (mbd_api): Default action to 'html' (not 'ajax')
     for now.
   * [663399e] api.py (Command): Add helper uri(): (Upcoming) api command
     uri.
   * [5330629] urls.py: APIView: Give each call its own uri ('/api/<cmd>/')
     && do auth automatically (as per config.py) and via django (as per
     user_passes_test).
   * [a077ae0] mini_buildd.js: Update to new API uris.
   * [f763652] client.py (Client.api): Update to new API uri.
   * [c0d66bb] mbd_api_submit.html: Don't disable command on auth_err (now,
     django will do auto-login).
   * [df50a3a] mini_buildd.js: aoi call: Add try/catch on result handling
     (catch unexpected errors).
   * [8fb932c] mbd_api.html: Update to new API uri.
   * [3879fdc] api: Remove support for "command" parameter (add command
     class directly as view parameter).
   * [0e9cc0b] views.py: APIView: Use django decorator 'require.GET', rm
     obsolete index support && simplify code.
   * [26224b6] views.py: RouteView: Override get_contex_data() only (now we
     do auth elsewhere).
   * [95402d1] views.py (RouteView): get_context_data: Use (known) args
     directly, not kwargs.
   * [a9920f9] views.py (APIView): get: Use (known) args directly, not
     args, kwargs.
   * [189e366] views.py (AccountProfileView): Fix impl order.
   * [dcd1bf1] Rename all include files for builtin tags
     (mbd_tag_<name>.html), and remove API extra handling in RouteView.
   * [dc314e3] files.py (load_json): Move here from misc.py.
   * [dcc9459] files.py (find): Add recursive 'find' based on os.scandir().
   * [d66816c] files.py (EventsPath.files): Use find, not glob (factor ~2
     speed gain in our test setup).
   * [a19f0fe] httpd.py: Directory listings: Fix home uri (just use / now).
   * [6edaddf] files.py (EventsPath): Limit methods to events(), drop
     files(), jsons() (not needed).
   * [977382e] config.py (Routes): Allow "None" path for Route, and allow
     for more diversified route adding in Routes.
   * [2635ccf] config.py: remotes, sitemap, api: Make these "None-Paths"
     (fixes unneeded directory creation).
   * [76650f0] config.py, *.py: "events": Use EventsPath in ROUTES, and
     always use that very object (instead of creating new 'Path's).
   * [6c6db8c] files.py (load_json): Rm, not used any more.
   * [67d1736] events.py (Event): Add LRU cache for events load from file
     path (via functools).
   * [29bed7a] misc.py (datetime_parse_since): Move here to other datetime
     tools (from events cli).
   * [fb1267a] misc.py: Put all datetime support functions in own class
     (somewhat nicer at least).
   * [0880ea9] setup.py: More diff-friendly notation.
   * [42001d4] misc.py: Date parsing: Switch from datutil to dateparser
     (allows for "2 weeks ago" and such).
   * [b7d4f7e] devel: mbd_api, mbd_events, mbd_dput: Remove "full command
     debug" support (would not work with space-separated args, what we now
     need).
   * [91c2f42] misc.py (Datetime): Update parse(): Default value, EPOCH
     (not "all" for since values), move all doc/support here.
   * [649a7c7] views.py: Add "since" support for route (for now, "events"
     only).
   * [32c6fc5] mini-buildd-events: --since: Use user doc from
     misc.Datetime.parse.
   * [c98139b] models/source.py: Update valid_until code.
   * [baeba73] html: Initial HTML fixups: css, home, route.
   * [aa8fa8a] views.py: route: Fix (plain) file display for events.
   * [5eb4115] route.html: Put "Index" to nav.
   * [44a2559] html: Improve route && index.
   * [ad6aa25] includes/mbd_events.html: Generate (datatable) table id.
   * [7d44fe5] cron.py: Rename "problem"->"attention", and return actual
     problem string.
   * [c749704] daemon.py (Daemon.attention): Add attention map support to
     Daemon && generic context.
   * [0c2abde] base.html: Display possible problems via attention map in
     menu.
   * [f9747bc] templates/includes/mbd_builds.html: Initial impl.
   * [89f141a] urls.py: Add "names" for our paths (so they can be
     potentially used w/ builtin 'url' ttag).
   * [f8cca4a] includes/mbd_events.html: Update to builtin "url"; remove
     static links as these are already elsewhere.
   * [6256751] urls.py: Add static routes here, too, just so we can access
     them via django's 'url' builtin.
   * [8e6fe95] base.html: Update all "account" urls to use django's builtin
     'url'.
   * [4be2e1e] mbd_repsoitories, api/show.html: Fix some links && upgrade
     last 'mbd_uri' to builtin 'url'.
   * [9455b5b] builtins.py: Rm obsoleted mbd_uri, mbd_uri_home.
   * [772d639] changes.py: move_to_pkglog -> move_to_events.
   * [406b240] route.html: Add alternate updater using html "date" input.
   * [8a11693] changes.py: Make "Architecture" mandatory.
   * [479af78] changes.py (Incoming[Build]Changes): To better maintain
     common code.
   * [41cc255] includes/mbd_events.html: Fix terminate links (was swapped).
   * [0afaa6c] devel (fishy-words): Print file name.
   * [fd7d6de] changes.py: Initial code partition into new class skeletons.
   * [e797a0d] changes.py: Fix timeocode impl for new multi-class setup.
   * [7a01bf7] changes.py: Changes: "subpath", "events_path", "builds_path"
     as class variables.
   * [e151d39] changes.py (Upload.gen_buildrequests): Rm extra 'cset' of
     timecode.
   * [bc1f036] changes.py: Fix up 'buildlog' values.
   * [0ea6d13] changes.py (Upload.get_builders): Merge breq generation &&
     upload into Upload.request_builds().
   * [b5d2825] daemon.py: Move Changes.get_builders() to
     Daeomon.get_builders_for().
   * [6f44141] daemon.py (Daemon.get_builders_for): Just do
     'local_endpoint' automatically.
   * [5fea5dd] changes.py (Changes): key, bkey: From property to class var
     && use the (now timecoded) paths.
   * [c201b10] packager.py (Package.add_buildresult): Rm 'extra.log': No
     longer used or needed.
   * [9587b0c] packager.py (Package.add_buildresult): Merge
     'move_to_events' to finally clause.
   * [cd08a26] prospector.yaml (pylint): Allow slightly more local vars.
   * [ffd2747] events.py: get json event file path from changes (and remove
     extra, redundant code).
   * [860a040] changes.py (Upload.request_builds): Remove redundancy by
     putting all files in a dict 1st.
   * [fa27546] changes.py: buildreqeust: Move all config files to subdir
     ".config/".
   * [decef28] changes.py: request_builds(): Update path to files.Path.
   * [a09e891] changes.py (Upload.request_builds): Should create in events
     path, not builds path.
   * [66f5c87] daemon.py (Daemon._port): Fix: Use Base changes to upload.
   * [6c51784] packager.py (Packager.run_event): Fix: Use Base changes for
     cleanup.
   * [5db0bb3] changes.py: Simplify 'timecode' code, remove __str__ support
     (mostly unused, rather confusing than helping).
   * [2f840b2] mini-buildd-self-signed-certificate (usage): Don't use
     actual default values (Fixes: Builder hostname ends up in man page).
   * [18a2a29] changes.py (Buildrequest.gen_buildresult): Rm unused path
     arg && simplify code.
   * [2272022] changes.py: Simplify save support: Base.save_as (generic),
     Changes.save_to (to path, auto file name, auto-sign).
   * [89cc980] changes.py: Don't re-use buildrequest files.
   * [7b22bb7] files.py: Update 'Tar' to not write to file on add -- write
     on new save_as() only.
   * [1ed6fb8] changes.py (Base.save_as): Fix: Update 'file_path' on save.
   * [3799fd2] changes.py: Get rid of (manually) set file_path && update to
     new Tar class.
   * [44c5456] changes.py (Buildrequest.gen_buildresult): Simplify.
   * [a6a30a6] changes.py (Changes): Upgrade "distribution" to actual class
     car && and remove double impl.
   * [53a7e9d] changes.py (Upload.Options): Fix doc tests to use Base
     changes (else 'fail', configured django would be needed)
   * [506c003] changes.py: Remove remove(), use new move_to() only
     (effectively, buildrequests now get stored in 'builds', not just
     removed).
   * [fc415b9] builder.py (Build.__init__): Only use bkey for Builder
     thread name (not whole contents of changes file).
   * [02bd4c0] builder.py (Build.run_deferred): Properly handle
     build/upload (Fixes: No buildresult reporting after internal error in
     build).
   * [1d565f0] events.py: from_changes, log: Add support for "exception"
     arg.
   * [70ec8d4] changes.py: to_json -> to_event_json, and move all (but
     packager) context there.
   * [b3d0830] packager.py (Packager.run_event): Improve REJECTED/Bogus
     error handling.
   * [bd9727c] packager.py (Package.add_buildresult): Move success check to
     changes.Buildresult.
   * [69be510] packager.py (Package): Use class dict vars 'buildrequest' +
     'buildresults' symmetrically for code clarity.
   * [4e02b98] packager.py: Rm "success", "failed" class vars (obsoleted by
     buildresults dict).
   * [55f5168] packager.py (Package): 'status' should not be class var.
   * [f6d2563] packager.py (Package): 'extra' should not be class var.
   * [6139828] packager.py (Package): Separate finish() from
     add_buildresult().
   * [d54e9dc] packager.py (Package): Rm "running": not used.
   * [4f7600b] packager.py: Code order && cosmetics.
   * [aa85c8c] builder.py: Log BUILT event after build, not upload; alsa
     log BUILT w/ 'error' on 'internal error'.
   * [8105b29] builder.py (Build.__init__): Do "libdir" support via
     files.Path.
   * [8687289] builder.py (Build.run_deferred): Log 'BUILDING' when build
     actually starts (not in constructor).
   * [bbdffc2] builder.py: No need for class var "config".
   * [6b668f8] builder.py: No need for class var "sbuild_cmd".
   * [5f09757] builder.py (Build): Use "builds_path" as shortcut for
     'breq.builds_path', not builds_dir.
   * [876058a] builder.py (Build.__init__): Cosmetics/ordering.
   * [422ec5c] builder.py: No need for class var "setup".
   * [65925a5] files.py (DebianName): Add "upload" file type.
   * [b71834a] changes.py (Buildrequest.gen_buildresult): Load existing
     (builds) file if exists.
   * [b24e67f] changes.py: Buildrequest: Add status flags based on builds
     dir: needs_build() (no buildresult file), needs_upload() (no upload
     file).
   * [f2f2d38] builder.py: Use new breq status flags.
   * [53a7ce9] builder.py (Build.run_deferred): 'BUILT': When buildrequest
     is built && uploaded.
   * [2305ee3] builder.py: Move all sbuild stuff to class 'SBuild' in
     sbuild.py.
   * [bfb2585] sbuild.py (SBuild.__init__): No need to separate 'setup
     parts', one beastly constructor is just fine.
   * [b82b7d1] sbuild.py (SBuild): Add shortuct for config_path (get rid of
     quite some redundancy).
   * [d697987] sbuild.py: SBuild class: Rename 'sbuild_cmd' 'cmdline'.
   * [a357140] builder.py (Build): Code simplification && some obsolete
     class vars removed.
   * [abe4592] sbuild.py: Also move actual sbuild call && buildlog parsing
     here (from builder).
   * [bda00ca] events.py: Simplify "running" dict handling to use
     'changes.bkey' as key (already is unambiguous).
   * [b648462] sbuild.py (SBuild): buildlog2buildresult: Make regex
     precompiled once (as class attr).
   * [b43720f] builder.py (Build.run_deferred): Remove wrong/forgotten
     extra BUILT event log.
   * [2e214bb] sbuild.py (SBuild.buildlog2buildresult): Fix RST syntax in
     doc (now relevant for sphinx as method is no longer private).
   * [0f91b93] changes.py (Changes.to_event_json): Add key && bkey to
     events.
   * [179e343] sbuild.py (SBuild.__init__): Update some class var naming
     for now-class-solution.
   * [9f179a5] sbuild.py: Little re-modelling of Sbuild/Build classes to
     allow terminate() to work again.
   * [8dbd62c] client.py (Client.api): Fix: Don't set "command" in http
     args (commands now have their own uri).
   * [832812d] api.py: Use call "cancel" to terminate running build. Drop
     termination of whole package.
   * [dcf5fcf] builder.py, api.py: Misc code cleanups.
   * [864bc85] changes.py: Fix 'self.distribution': Only for "Upload"
     (mapping && integrity) and "Buildrequest" (integrity).
   * [43084b0] changes.py (Upload): Fix: Use "initial_value" on all
     constructors.
   * [d5332ed] devel: testsuite: Add test "bogus-ftp-uploads".
   * [13819d0] api.py (SetupDaemon): Fix usage of obsoleted mbd_sync arg
     (ssl only).
   * [2c92f4c] changes.py (Changes.__init__): Improve && make "key missing"
     check error public.
   * [8788bc0] changes.py (Changes): Make MANDATORY a dict (i.e., add
     optional 'hint' text for the public error string).
   * [895c0cd] changes.py (Upload): Add 'Changed-By' to MANDATORY (with
     hint) -- obsoleting extra check.
   * [91f8c2d] builder.py: Handle "Internal-Error" custom header "like
     exception" when creating event json.
   * [2a2842f] static/data.svg: New svg from opencliparts.
   * [382bcf5] builtins.py (Plain.cat): Support json file filter.
   * [1e38f4a] events.py (Event.json_file_name): Gen json file name in
     events directly (will make this available in templates later).
   * [1d7fa41] mini_buildd/route.html: Leave out whole 'entries' section
     when not needed.
   * [2cad227] mbd_events.html: Fixes && Simplification. Drop json inline,
     just go with link to json file.
   * [7396970] builtins.py (PlainFilter): Plain -> PlainFilter, improve
     extensibility.
   * [3cd760b] builtins.py: PlainFilter: Add default filter.
   * [edcb276] views.py (RouteView.get_context_data): Add 'static_uri' to
     context, drop 'route', 'fullpath'.
   * [e73af15] __init__.py (HTTPNotFound): Add (shortcut for) 404 error.
   * [18bd8d7] views.py (RouteView.get_context_data): Add 404 error.
   * [0ae3a5b] config.py (Routes.__init__): "builds" should also use the
     dedicated class (files.BuildsPath).
   * [b76fca1] misc.py: Datetime: Better name "stamp"->"now".
   * [cd6f672] misc.py (Datetime): Add "file" helper (get ts from file).
   * [616f6cf] misc.py (Datetime): Add .from_stamp().
   * [d53797e] views.py: Generalize "since" support && add entries
     (buildlogs) for builds.
   * [e222c02] mbd_builds.html: Properly show new buildlog entries.
   * [0d528c6] events.py: Add common events loader (Fixes possibly
     different events queue order after restart).
   * [53d8c1d] files.py: Make "find" Path.ifiles, and simplify other code.
   * [4da28ee] route.html: Fix typo (fixes entries for non-since variants).
   * [aff7582] views.py (RouteView): Use "lambda map" for entries variants
     (rather than big if-else tree).
   * [22d6036] events.py: Use i<name> for iters not <name>_iter.
   * [37ccaf6] views.py (RouteView.get_context_data): Fix "builds" entry
     uris.
   * [667e02b] client.py (Client.api): Use "FIXME" on code cleanup note/py
     > 3.7 (so we find it w/ fisyh-words).
   * [96fcb1a] models/base.py: Add mbd_class_name (get class names in
     templates).
   * [8b7389f] mbd_chroots.html: Update to datatables and fixup to usable
     state.
   * [b123203] views.py: Provide index for "events" and "builds" only.
   * [9ab93e1] includes/mbd_scandir.html: Display os.scandir().
   * [9b93ddd] views.py, route.html: Update to scandir.
   * [6cd76c7] mbd_chroots.html: Add 'Status', fix 'Admin" link.
   * [d45ff6e] includes/mbd_remotes.html: Update/Fix to make initially
     usable.
   * [d02111b] views.py: Procude scandir for "logs".
   * [4ef6fd3] views.py (RouteView.get_context_data): Add default entry
     producer (emtpy list).
   * [7b022b2] builtins.py (PlainFilter.regex_filter): Generalized filter
     for other uses later.
   * [a7952b2] builtins.py (PlainFilter): buildlog toc heuristic: Add
     "critical" errors detection.
   * [c3ae608] builtins.py (PlainFilter): Add "log" filter: TOC for levels
     'warning' and up.
   * [584842e] daemon.py (Daemon): Add models() method as future access
     vehicle for all code "django".
   * [cfe4885] daemon.py (Daemon): Remove get_active_chroots() (replaced by
     generic models()).
   * [f9683eb] daemon.py (Daemon): Remove get_active_repositories()
     (replaced by generic models()).
   * [2c549d2] daemon.py (Daemon): Remove get_suites() (replaced by generic
     models()).
   * [29a50a5] daemon.py (Daemon): Remove
     get_active_or_auto_reactivate_remotes() (replaced by generic
     models()).
   * [1d74263] daemon.py (Daemon.get_active_codenames): Should not use
     models() inside daemon.py.
   * [c3ec178] models/repository.py (Repository.mbd_icodenames): Add
     iterator to all codenames from a repository.
   * [e8a422b] daemon.py (Daemon): Remove get_active_codenames() (replaced
     by generic models()).
   * [62451e9] daemon.py (Daemon): Remove get_subscription_objects()
     (replaced by generic models()).
   * [ce4c790] package.py (KeyringPackage.__init__): Use models(), not
     import of models.
   * [f7c58b4] devel (importchecker): Exemption for deamon.py.
   * [b63f2ff] views.py: repository, chroots, remotes: show all (not active
     only).
   * [e25472b] config.py: Cosmetic: Put "api" (menu) before "log" &&
     cosolidate map order in view.
   * [663713c] models/gnupg.py (Remote.__str__): Fix: Really should not
     call status on remote.
   * [29adebb] client.py (Client.api): Improve user error handling (use
     public exceptions where due).
   * [2d524e9] static/configure.svg: Add from openclipart.
   * [7501f05] config.py: No need to make uri class var private.
   * [4e9bfa9] New generic "builders support" (in models/gnupg.py). html:
     Improve && update "remotes" section to "builders".
   * [46992d6] mbd_repositories.html: Rple two top-level "details" by plain
     h3, h4 headers.
   * [023ae6b] changes.py: Create builds/event paths on demand/when needed
     only (fixes some superflous empty dirs).
   * [d91297e] config.py: AUTH: Upgrade to proper enum; eliminates
     AUTH_STRING extra code.
   * [8e86907] mini_buildd.css, api: Add mbd-auth-* classes.
   * [bf8b816] builtins.py: Rm "auth_err" (string) support in 'mbd_api' tag
     (we now have auto-auth via django views).
   * [6beb736] httpd.py (FileResource): Add (commented) auth-redirect code;
     don't use 'auth_err' string.
   * [29df24f] config.py (Auth): Drop 'auth_err string' && check, simplify
     to just have is_authorized().
   * [489d4e2] views.py: Add ouput "html-snippet" for API calls.
   * [be862ed] includes/mbd_tag_api.html, base.html: Move HTML for 'ajaxed
     api results' from individual API code to one static place in base.
   * [d6ba91e] mini_buildd.js, api tag: Simplify JS to use load() in api
     result html snippet.
   * [2849016] builtins.py (mbd_api): Default to action "ajax" again.
   * [3a96307] builtins.py (mbd_api): Add is_authorized context, resp. css
     and force form action to 'login' on unauthorized.
   * [914fd4d] includes/mbd_api_submit.html: Merge into mbd_tag_api.html.
   * [26b92fb] mbd_tag_api.html: Make 'output' real hidden input (rather
     than hidden by css).
   * [3d0f463] mbd_tag_api.html: Make hiddens args actual hidden inputs
     (instead of hiding by css && calling mbd_api_arg).
   * [645ba50] mbd_tag_api.html: Fix login detour via link inside a button,
     and use 'url' tag for login uri.
   * [003d7dc] builtins.py: Rm "reload" from context (unused now).
   * [e052ac1] views.py: API: output=json|snippet|page && get rid of
     "action" option.
   * [7ecdfb3] base_api.html: Remove, is now obsolete.
   * [999e4f7] api.py (List, Show): New command class attr PREFER_PAGE_VIEW
     (for web templates only).
   * [e60495c] API form submit: Really fix the script/noscript dilemma;
     remove all former css workarounds.
   * [c22fa14] builtins.py (mbd_api): Remove 'output' arg (now obsolete).
   * [b5184b5] builtins.py (mbd_api): Update context dict notation to diff-
     friendly.
   * [bdbd486] *.html: urlencode on get_full_path does not seem to be
     necessary for some time (see
     https://code.djangoproject.com/ticket/18456).
   * [839c93d] mini_buildd.js: api: Add initial error handling && progress
     bar.
   * [d736c9e] mbd_api_show.html: Add "remove" only if exists.
   * [7f7394b] Revert "*.html: urlencode on get_full_path does not seem to
     be necessary for some time (see
     https://code.djangoproject.com/ticket/18456)."
   * [357e22d] events.py: Reword events.Events -> events.Queue (to not
     confuse w/ "events" (log directory)).
   * [b1ee5fd] daemon.py: Move cronjob methods to cron.py.
   * [56f4d01] setup.py: Ignore mildly annoying 'snapshot version warning'
     from setuptools.dist.
   * [3e1e54b] devel: Make MBD_KEEP disable all "on exit" runs, not just
     some.
   * [93873b9] Add (empty) '__init__.py' for models sub package.
   * [6a9c104] daemon.py: Move "port" functions to package.py.
   * [afaeaa3] views.py: API: Minor restructuring so we can have generic
     code for both, page and snippet (DRY).
   * [804c9e6] builtins.py (mbd_plain): Show "as_detail" support.
   * [8d1ad0a] mbd_api_call.html: Show cmd as "full" && add plain (json).
   * [f951a29] django structure: Move includes into app dir (includes ->
     mini_buildd/includes).
   * [4d7a6ed] django structure: Move "base.html", "error.html" into app
     dir (*.html -> mini_buildd/*.html).
   * [c32623b] django structure: Tag includes: Remove 'mbd_tag_' file
     prefixes and move to "tags/" (mbd_tag_*.html ->
     mini_buildd/tags/*.html).
   * [60a3f0d] django structure: API call includes: Remove 'mbd_api_' file
     prefixes and move to "api/" (mbd_api_*.html ->
     mini_buildd/api/*.html).
   * [e71494c] django structure: Other includes: Remove 'mbd_' file
     prefixes (mbd_*.html -> *.html).
   * [72f8271] api.py: Fix one forgotten update from previous code move to
     package.py.
   * [c4c5959] devel: Rm "deprecated" from list of fishy words (only non-
     fishy uses ;).
   * [9026913] show: Add "architecture=source" for both, reprepro &&
     repository show() variants (makes results suitable for Changes).
   * [8856de5] repository.py (Repository.mbd_package_show): Use dict (not
     tuple) for codename.
   * [6a2d4ef] models/repository.py (Repository.mbd_package_show): Make
     distributions dict, not list.
   * [38d20e8] models/repository.py (Repository.mbd_package_show): Simplify
     code.
   * [37ca3c9] repository.py (Repository._mbd_package_migrate): Fix MIGRATE
     distribution.
   * [17d3f9e] reprepro.py: show(): Add 'component' to results && iterator
     variant (ishow).
   * [2df43f0] repository.py: get_dsc_path -> find_dsc_uri, components list
     as parameter.
   * [fca6d7f] api.py (Find._run): Accommodate pyflakes (W504, line break
     after binary operator).
   * [ad2b4c7] models/repository.py, api.py: Move "show" code to API, used
     only there.
   * [5aacfa4] reprepro.py: Move "package_find" methods here from
     repository.py (these are reprepro only).
   * [4bf85e5] reprepro.py, repository.py: Make private find variants
     public.
   * [b347bb5] devel (tidy): Fix API call URIs.
   * [e9eca8d] api.py (show): Show all existing repos && update result to
     have repository options (active).
   * [ef02e7a] includes/api_results.html: Add api results include.
   * [cb7685b] mini_buildd.js: api load function: Give form element
     directly.
   * [665f6dd] tags/api.html: Update to use from.action again (not multiple
     submit buttons).
   * [3e18efd] builtins.py: Drop extra builtin for 'api_arg'.
   * [21c91d2] models/repository.py (Repository.mbd_icodenames): Sort list
     of codenames.
   * [4a9a032] includes/tags/api.html: Put api result back here, with ids
     (enables more than one result per page).
   * [7637fcb] tags/api.html: Move api results html back into api tag (we
     need it only here).
   * [2ae137d] includes/tracker.html. *: Add initial "tracker" route.
   * [c23a1f2] mini_buildd.js: API submit: Use jquery hide()/show() && hide
     "directly" via onclick=...
   * [bb409b8] mini_buildd.js, tags/api.html: Rather use 'onsubmit' for js
     submit.
   * [878bd72] mini_buildd.js: api_form_submit: Code clean up.
   * [5c2d43c] views.py: Pre-compute dict of available api command
     templates.
   * [24708e2] includes/api/call.html: Eliminate extra "call.html" (just
     use page, snippet templates).
   * [5456eac] views.py: Eliminate "repositories" from cmd context (really
     not needed any more).
   * [f4cd80c] api.py, tags/api.html: Drop PREFER_PAGE_VIEW (aiming for
     extra tracker page).
   * [4291f16] mini_buildd.css (div.mbd-api-results-content): Minor
     padding/margin fixups.
   * [54961c4] tags/api.html: 'close': Fix: Re-add class.
   * [797c5c9] tags/api.html: JS API: Support choosing "popup" or "embed"
     CSS variants.
   * [d5c834c] includes: Mv all include templates used as "route" to
     "routes/" subdir.
   * [c2c9e18] includes/track.html: Add "track" include, use in base and
     events.
   * [91d2f72] includes/track.html: Hide source if given.
   * [07af85b] includes/routes/tracker.html: Use "embed" css variant.
   * [36a6d91] api.py: show(source) -> show(repository, codename, source)
   * [4e40329] api.py (Show._run): No such rep error handling.
   * [5d42fea] .prospector.yaml: Also customize argument-regex (same as
     variable-regex).
   * [30be31d] devel (tidy): Log complete URLs (so we can click on it to
     debug quickly).
   * [1c7c574] devel: testsuite: Updates for changed show() api call.
   * [70036f3] reprepro.py (Reprepro): show() -> ils(), make versatile.
   * [a8102c8] devel (testsuite): Tidy tests should run after auto-setup
     (make show work).
   * [8d8c801] reprepro.py (Reprepro.find_in): Fix: Rather use 'is None'.
   * [d58e04c] api.py (Show._run): Minor code fixes.
   * [95e83c8] api.py (Show._run): dsc_path -> dsc_uri.
   * [fb29bdb] models/repository.py (get): Add generic getter helper.
   * [57a5c06] api.py: Update dist / diststr parse functions.
   * [b8a67f5] devel: Return of pylint standalone test.
   * [6d09f03] devel: Return of pyflakes standalone test.
   * [6113596] devel: Return of pydocstyle standalone test.
   * [971745e] devel: Return of pycodestyle standalone test.
   * [06fc7d4] admin.py (AdminSite): Fix two trivial pydocstyle warnings.
   * [11c5d87] devel: Drop "prospector": Hardly helped, forced pip user
     installs, no updates, stuck to old versions of checkers.
   * [5af8165] devel: Reorder static tests && add new 1st 'build_py' static
     test (instead of calling 'build_py' on any test again.)
   * [457ab0b] devel (mbd_installdjango): Rm, outdated, not needed.
   * [0abb12e] devel (mbd_installdeps): pycodestyle/pyflakes: From Debian.
   * [0ee9ae8] devel (MBD_PYPATH): Make PYTHONPATH export global, rm
     'pyenv' extra function.
   * [709a7af] setup.cfg (ignore): D416 does not seem to exist (any more).
   * [75f2625] devel: Drop fishy-words, configure pylint's "fixme" to do
     the same.
   * [fab0b79] *.py: Do 'raise from e' for all wrapped exceptions (pylint
     2.5->2.7, W0707).
   * [6dbd1e5] .pylintrc (extension-pkg-whitelist): Add 'apt_pkg', used in
     super-portext (pylint 2.5->2.7, I1101).
   * [7827073] api.py: Fix inconsistent return statement (pylint 2.5->2.7,
     R1710).
   * [b21d80e] distribution.py: Make sbuild check modes uppercase (pylint
     2.5->2.7, R0103).
   * [0ab1126] devel: Add term color for warn log.
   * [0296153] api/snippet.html: debug: Add links for page && json output.
   * [ae0637f] debian/control: Limit to python >= 3.6 (fstrings).
   * [ea2291c] views.py: API: Put auth back to explicit view code (fixes
     'output=json' error handling).
   * [dcfe093] views.py (ExceptionMiddleware.error): Add html snippet
     error.
   * [1b9c605] templates/mini_buildd/error_snippet.html: Use 'rfc8707'
     object directly.
   * [59e54a2] .pylintrc (notes): Add "workaround" to 'noteable' strings.
   * [d62ffce] daemon.py: Remove workaround for
     https://github.com/PyCQA/pylint/issues/3742 (fixed in pylint 2.7.2).
   * [bce699f] devel (mbd_pylintgeneratedmembers): Update (this semi-
     automation) to use sll code (not just modesl) and directly append to
     '.pylintrc' in the desired notation.
   * [fcb5554] .pylintrc (generated-members): Update w/ adapted semi-
     automation. Adds "destroy" exemption (from Singleton metaclass).
   * [2ef23eb] __init__.py (PyCompat): Add python (now 3.6) 'compat class'.
   * [d54b212] views.py (RouteView.get_context_data): Use py 3.6 compat for
     'removeprefix' (3.9 only).
   * [56d6063] call.py (Call._call2shell): Jail shlex.join to PyCompat
     (fixes: Run again w/ py 3.6/buster).
   * [e2e9fff] control (Build-Depends): Upgrade p-d-registration deps to
     2.2-5~ (fixes: Breakage w/ newer django versions).
   * [b3462aa] gnupg.py (PublicKeyCache): Add key2id() support (fixes
     adding manual apt keys).
   * [92203d1] control (Build-Depends): Add dep on python3-attr (>=19) (for
     twisted; fixes buster ports).
   * [a7d3be5] devel (mbd_installdeps): Fix pylint3->pylint (former is
     virtual only).
   * [667f4aa] gnupg.py (BaseGnuPG.get_colons): Make public since we use it
     outside class.
   * [677f13d] models/repository.py (Repository.mbd_sorted_distributions):
     Reverse order (newest dist 1st).
   * [8d22df8] static/mini_buildd.css (body): Rm now-unecessary config for
     details.
   * [a9e7493] includes/tags/api*.html: Only use "required" when
     authorized.
   * [2b2289b] static/mini_buildd.js: Move "lengthMenu" default to
     datatable tag.
   * [de2c0c3] static/mini_buildd.css: Make main header (navbar) sticky.
   * [4fcb17e] mini_buildd.css; Make forms inline in datatable (track).
   * [9396a1d] mini_buildd.css: API: get rid of extra colors for api-auth
     status.
   * [104b034] tags/api.html: Move result div out of form.
   * [d8eea61] mini_buildd.css: API: Remove some configs interfering w/
     embed.
   * [999a5a8] builtins.py (mbd_api): Use popup=bool, not css=embed|popup
     (fixes redundant display=none).
   * [c09fc39] tags/api.html, js: API: In script mode, do confirmation via
     js confirm().
   * [b5bc945] mini_buildd.css: Put border around "embedded" api result.
   * [5b0c859] routes/tracker.html: Rather loop dists (not codenames), and
     do it sorted.
   * [158b1b8] models/repository.py: Use mbd_sorted_distributions wherever
     appropriate.
   * [b97f4c6] tags/api.html: Show home, reload on 'popup' only.
   * [1dd958a] api/snippet.html: Show debug links on webapp 'debug' only.
   * [fedb737] mini_buildd.css: datatables: Also make "details" td elements
     inline.
   * [9f56801] django_settings.py (STATIC_URL): We can simply use .uri now
     (not join() && explicitly add /).
   * [2fd9327] tags/api.html: Fix: URLs in form input must *not* be
     explicitly urlencoded.
   * [06ca00b] config.py: accounts.profile: Set to default
     'accounts/profile'.
   * [610e7a1] views.py: Add custom LoginView (url "login" =
     "accounts/login").
   * [f3aac23] django_settings.py (configure): Remove explicit
     LOGIN_REDIRECT_URL, but set LOGIN_URL explicitly.
   * [9562657] html: Use "login" (new custom LoginView), not "admin:login".
   * [d714eb5] views.py: Rm custom LoginView again (turns out this will not
     solve any problems ;(.
   * [540eb62] base.html: Remove remaining (logout, password_change) refs
     to admin namespace.
   * [f920c7b] builtins.py: Add new tag mbd_accounts.
   * [84f30c5] base.html: Re-do "accounts" menu: Use 'mbd_accounts' && some
     style updates.
   * [964b7de] mini_buildd.css: OMG: Make all submit buttons 'roundish'.
   * [6a47ecb] routes/api.html: Embed api calls.
   * [7359b86] builtins.py (mbd_accounts): Add support to add extra css
     class(es) for form.
   * [176e98c] tags/api.html: Use 'mbd_accounts login' if unauthorized.
   * [f2e63fa] tags/api*.html: Remove uneeded parts from the now authorized
     'branch".
   * [c27e767] builtins.py (mbd_accounts): Cleverly guess "next" if not
     given; especially, use REFERER if we have a snippet request.
   * [01453de] base.html: Improve accounts menu (Fixes tidy error: no forms
     allowed in summary).
   * [e261976] api.py: setup*: Update to Daemon.models() (obsoletes
     Daemon.meta()).
   * [8916dd5] api.py: get_key->pub_key.
   * [f4760b6] api.py: status: Result cleanup: Rm obsoleted "remotes,
     packaging, building, crontab, events".
   * [92b233c] api.py: get_sources_list->sources_list.
   * [5b9bcbd] devel: get_dput_conf->dput_conf.
   * [547707e] api.py: activate, deactivate: Make confirm-able.
   * [82bb4e8] Rename module: distribution.py -> dist.py.
   * [3245990] dist.py: Rename class Distribution -> Dist.
   * [86320dd] changes.py (Changes): Fix self.distribution -> self.dist.
   * [19ad5ef] dist.py: Update 'Dist' to new nomenclature && add doc.
   * [acf8d0e] devel: pylint: Disable "fixme" for general check && fail on
     any issue; add extra check to (just show) 'fixme' warnings.
   * [6ad0833] cli.py: Put 'auth_log' hack to m-b.cli (fixes duplicate code
     in m-b-ssh-* commands).
   * [515578a] devel (pylint): Add extra run to show 'locally-disabled'
     (in-code exceptions).
   * [d391a26] Distribution, Source, Component: Rm __hash__() from (sort
     support): Does not seem to be necessary.
   * [b3674e8] Fixed in pylint: Remove false-positive workarounds for
     https://github.com/PyCQA/pylint/issues/1553
   * [f76d3ba] gnupg.py: Remove workaround for pylint crash:
     https://github.com/PyCQA/pylint/issues/3742.
   * [75782a0] pylint: Rm 'too-many-ancestors' locally-disabled (incr 'max-
     parents' instead).
   * [25fa737] models/base.py (Model.save): Rm unneeded signature-differs
     local disabled.
   * [2764cb8] mini-buildd-ssh-uploader-command (CLI.runcli): Improve
     comment wording (so it's no pylint "fixme").
   * [03e8ca6] client.py (Client.api): Convert 'in-code fixme' to 'doc
     todo'.
   * [eb1d7b3] __init__.py: Move NEWLINE helper to 'mini_buildd' with
     proper docs.
   * [46c154f] threads.py (DeferredThread.run): Re-add info log ('wtf note'
     does not seem to apply any more).
   * [d187696] setup.py (Scripts.__init__): Improve doc on Debian files
     creation (don't label as "workaround").
   * [8d874aa] .pylintrc (disable): pylint 2.7: logging-format-
     interpolation, f-string-without-interpolation: No longer needed.
   * [bcc2f01] api.py: Rename "show"->"ls".
   * [006225a] api.py (snapshot calls): Prefix "snapshot" && improve
     naming.
   * [1dd7694] api.py: Use Mixins for command options (AUTH,
     NEEDS_RUNNING_DAEMON, CONFIRM).
   * [806d51a] api.py (SetupDaemon): Remove all GroupXXX from actual
     commands.
   * [69362f6] tags/accounts.html: Don't filter name as title.
   * [000ff04] base.html: Accounts menu: Add custom name for all entries.
   * [aa5521e] API: Get rid of old-style grouping altogether.
   * [e2f85b7] builtins.py (mbd_api): Make 'full' default to False.
   * [c69e4de] api.py (RepoSup): Remove, move tool to KeyringPackages
     command.
   * [98a93d6] api.py (StatusResult): Remove, merge into Status command.
   * [07faab8] routes/api.html: details per cmd.
   * [78dd192] models/source.py, dist.py: Add Ubuntu "hirsute".
   * [6352572] builtins.py (mbd_datatable): Add 'page_length' option &&
     default to 10.
   * [ac15b60] mini_buildd.js: Confirm API call: Show args.
   * [7dba714] tags/api.html: Fix: Hidden values need to use raw_value.
   * [c5f7d8a] models/source.py (Archive.clean): Improve exception error
     text.
   * [8b979cd] models/source.py: Move vendor archives "lib" to dists.py.
   * [7fc00f9] models/source.py, api.py: Move
     Archive.meta_add_debian|ubuntu -> api.py.
   * [1397939] models/source.py, api.py: Move Archive.meta_add_loacl ->
     api.py.
   * [85ac34c] api.py (SetupSources): --with-vendor-archives=Bool ->
     --vendor-archives=List.
   * [a2257e3] models/source.py, dist.py: Move apt keys to dist.py.
   * [bb3d4eb] dist.py, models/source.py: Move sources setup data to
     dist.CODENAME_SETUP.
   * [827d552] dist.py: CODENAME_SETUP: Separate by vendor.
   * [a7c66d7] api.py (MultiSelectArgument._r2v): Filter out empty items
     from (comma-) separated list.
   * [94c9b9e] models/source.py, api.py (setup_sources): Move
     meta_add_debian|ubuntu to api.py, and make setup call codename-based.
   * [c4b3b42] tags/api_arg.html: Typo fix ('unknown').
   * [3a4ca6f] tags/api_arg.html: Better wording for multiselect custom
     input.
   * [61ec5cf] models/source.py: Move _get_or_create (setup) code to
     api.py.
   * [c989e91] models/source.py (PrioritySource.Admin): Move
     mbd_meta_add_extras (setup code) to api.py.
   * [9c56920] net.py (ClientEndpoint.login): Don't log csrf security
     token.
   * [803d3a5] api.py (SetupSources): Default to 'empty' for vendors
     options; rename '--with-local-archives' -> '--guess-local-archives'.
   * [7636011] devel (testsuite): Only use computed MBD_CODENAME for tests
     (drops internal port test).
   * [ec6b0d9] devel: Drop MBD_ARCHIVES, MBD_VENDORS in favor of MBD_SETUP
     (args to API call setup).
   * [b095f80] api.py (SetupSources): Apt cacher 'guess support' as
     separate option.
   * [1465c54] devel (MBD_SETUP_DESC): Default to guess local apt-cacher
     only for archives.
   * [9ac9435] devel (mbd_supertestall): Update for new MBD_SETUP.
   * [a38e85f] devel (profile): Rm 'allvendors' doc (option is no more).
   * [31170f8] devel (profile): Rm "testkeyring" option (not used, can now
     easily be called manually).
   * [3d30031] devel (profile): Rm "testpackage" option (not used, can now
     easily be called manually).
   * [becb657] devel: Remove (now unneeded) RESTART_HOOK support.
   * [109c0e2] dist.py: Move "config" structures top.
   * [7b2f6e5] client.py (Client.api): Error handling: Just use Rfc7807
     object (no json extra step needed).
   * [025e601] client.py (Client.api): No need for extra error logging.
   * [ba7a67d] client.py (Client.api): Simplify interactive code (always
     retry after action).
   * [e369027] client.py (Client.api): Further simplify error handling.
   * [d595920] admin/mini_buildd.html: "setup" api call should offer full
     options.
   * [9c7ddeb] api.py (SetupSources.update_object): New method to replacing
     get_or_create.
   * [1b5d2ac] models/base.py: Remove extra mbd_get_or_create (just to show
     a log).
   * [de48fb6] models/repository.py: Move meta ("wizard") methods to api.py
     (setup).
   * [344f348] chroot.py; Use _mbd_meta_add_base_sources() in api.py
     directly, drop all per-Class variants.
   * [ed11433] models/chroot.py: Move to meta method to api.py.
   * [b7fbd2a] models/distribution.py; Move meta add_base_sources to
     api.py.
   * [9437b56] .pylintrc (max-module-lines): Update to 1500.
   * [578bee7] models/distribution.py: Move to meta.*defaults method to
     api.py.
   * [e0da26f] .pylintrc: Consistently use 'x=y' format (not 'x: y').
   * [856b4c6] setup.cfg: Move .pylintrc here.
   * [2edf81a] setup.cfg: Remove empty pylint sections.
   * [85597d0] *.py: mbd_meta_pca_all -> mbd_pca_all.
   * [b13845f] api.py: setup: Use 'update_object' (instead of
     'get_or_create') everywhere.
   * [c2b95cd] templates/admin/base_site.html: Overwrite some strange CSS
     values from django admin (fixes 'select' api display)
   * [649055a] models/chroot.py (Chroot.mbd_get_backend): Simplify &&
     document.
   * [ca3a064] models/chroot.py: LVM backends: Add user error if LVM is not
     installed.
   * [9fb3978] models/chroot.py (Chroot.__str__): Don't append backend info
     (only works when instance is saved).
   * [cfc26fa] models/distribution.py (Distribution.__str__): Switch to
     diff-friendly notation.
   * [237cf1c] models/distribution.py (Distribution.__str__): Simplify,
     only show base source + archs.
   * [81a649c] api.py (SetupRepositories): Layout: Update to setup dict.
   * [70761ae] api.py (SetupRepositories): Separate suite/layout config
     dicts && cover debdev layout.
   * [0121e74] api.py (SetupRepositories): Update SUITE_SETUP to use
     'options'.
   * [0c0057b] api.py (SetupRepositories): Add dict-like config for
     REPOSITORIES.
   * [fa1385c] api.py (SetupRepositories): Remove *meta* calls (merge into
     run)
   * [fb121c7] api.py (SetupRepository): Rename (singular).
   * [e920b0f] api.py_ setup_repositories->setup_repository, make id &&
     preset freely configurable.
   * [560635b] api.py: Move repository setup dicts to dist.py.
   * [3f59a08] dist.py: Merge all "setup" to one big dict (dist.SETUP).
   * [ba6cd6b] api.py: setup_chroots: Merge last meta method.
   * [56e8791] api.py: Merge all setup calls.
   * [dc620ed] api.py (Setup): Better wording for archive && codename
     arguments.
   * [e1340e5] api.py (Setup): Add --update option (noop for now).
   * [d6bd55c] api.py: setup: update_object->x_or_create (implements '--
     update' functionality).
   * [78ace8d] api.py (Setup): Sources: Update apt_keys on --update.
   * [9d69950] api.py: Add mbd_is_security to Source (greatly simplifying
     priority source setup).
   * [de20e2c] dist.py: Update SETUP format.
   * [fcd30cb] api.py (SetupRepositories): Put default_components into
     dist.SETUP.
   * [544d81c] dist.py: Update SETUP format: Option to add more options per
     codename.
   * [f8ca3f4] dist.py: Add "supported" setting for codename setup.
   * [339809b] dist.py: Add get_codenames() helper && [SUPPORTED_]CODENAMES
     (replacing CODENAME_SETUP_BY_CODENAME).
   * [b8450bc] changes.py (Upload.request_builds): "dist" var should be
     "distribution".
   * [c61676d] dist.py: Move Dist.apt_allow_unauthenticated -> SETUP
     (jessie workaround).
   * [7d10aa6] dist.py: Move Codename.arch_optional -> SETUP (Ubuntu
     workaround).
   * [b910f15] gnupg.py (PublicKeyCache): Fix: Also import Ubuntu archive
     keyrings if installed.
   * [772bfd5] dist.py: Move Dist.produces_ddeb_appendix -> SETUP (Ubuntu
     workaround).
   * [2768026] dist.py: Re-add squeeze apt keys.
   * [0f1028c] dist.py: (Re-)add squeeze as unsupported codename.
   * [530be71] dist.py: (Re-)add lenny apt keys.
   * [a199e69] dist.py: (Re-)add lenny codename (as unsupported).
   * [052baab] models/source.py (Source.mbd_is_security): Move to dist &&
     fix after SETUP update.
   * [2d7a14a] dist.py: Move "no_lintian_suppress" to SETUP.
   * [4a8986f] dist.py: Remove 'Codename' class (obsolete now everything
     has moved to SETUP).
   * [d3f844e] dist.py: Update module doc wording.
   * [f3cfe29] api.py (Setup._run): Move "needs_uname_26" (lenny) to SETUP.
   * [d7adeef] dist.py: Move "usually used mirror paths" to SETUP/per
     vendor.
   * [7c1b6f5] dist.py: Move "distro info" instances to SETUP.
   * [ec622fd] api.py (Setup._run): Add && use shortcuts for all model
     classes.
   * [90456b0] api.py (Setup._run): Use x_or_create() for Daemon.
   * [c93c1a3] api.py (Setup.x_or_create): Fix default instance creation
     code (even though currently commented).
   * [6245916] api.py (Setup.x_or_create): Update to dict-based result.
   * [a37eaf9] setup.cfg (generated-members): mbd_check was listed twice.
   * [1aabf27] devel (mbd_pylintgeneratedmembers): Fix: Remove manual
     addition of 'mbd_check'.
   * [47bcc2c] devel (mbd_pylintgeneratedmembers): Update to now write to
     setup.cfg.
   * [d4f9a67] setup.cfg (generated-members): Update via ./devel
     pylintgeneratedmembers (django 'Model._meta')
   * [15d2146] models/base.py (Model): Add (experimental) mbd_diff().
   * [66a478c] api.py: setup: x_or_create(): Add diff to result.
   * [ba30511] devel (testsuite): 'auto-setup'->'setup' && split keyring-
     and testpackages in own test cases.
   * [3f42656] api.py (setup): suite option: Omit unnecessary dummy
     variables.
   * [3502972] api.py (setup): Continue on --update=Yes even if not created
     (for suite, layout, distribution).
   * [0fe2508] api.py (setup): Add comment why not using x_or_create when
     updating sources apt keys.
   * [82fb6e3] api.py (setup): Conforming naming convention for the
     distribution setup code.
   * [5a92af0] dist.py: SETUO(layout): Add "stable" and "testing" to
     "Debian Developer" (els eit won't work w/ default suites).
   * [e0e8fac] api.py (setup): Fix SuiteOption creation.
   * [ca06f5b] models/base.py (Model): Add helper to get a field's default
     value.
   * [4c0132c] api.py (setup): Distribution: Mv
     "apt_allow_unauthenticated", "lintian_mode" to x_or_create args.
   * [ec10bec] api.py (setup): Distribution: Mv "extra_options" to
     x_or_create args.
   * [b8e2afa] api.py (setup): Distribution: components/prio source: Use
     set/filters instead of manually adding.
   * [cedb92a] api.py (setup): Add "setup" shortcut and sync some naming
     conventions.
   * [b712aeb] api.py (setup): Distribution: Mv "architecture_option" to
     x_or_create().
   * [6b838da] api.py (setup): Change order: Setup chroots before
     repository.
   * [a75e8bb] api.py (setup): "--codenames" -> "--sources".
   * [5b7b00e] api.py (setup): Add (for now, dummy) methods for setup
     parts.
   * [6cff03d] api.py (status): Remove no-op __init__.
   * [2785152] api.py: Separate setup code.
   * [a8962b6] api.py (setup): "setup" shortcut as class attribute.
   * [89783ea] api.py (setup): Make "chroots" fully configurable
     (--chroots, --chroots-from-sources).
   * [8bd37b6] api.py (setup): repositories: Give list of repo/preset
     tuples to create (default to empty).
   * [d43c72b] models/base.py (mbd_diff): Only compare fields actually
     given.
   * [1e82280] api.py (Setup.setup_sources): Generate prio sources directly
     in loop for sources.
   * [3029596] devel (mbd_supertestall): Adapt args (after setup change).
   * [ce76cde] httpd.py (Events): Spurious disconnects on SSL: Identify
     direct cause (in twisted) && add workaround.
   * [e9bf658] dist.py: Get "supported" flag from distro_info.
   * [a70b8ad] __init__.py: Shortcuts: Move 'm_b.Daemon.models()' to
     'm_b.mdls()'.
   * [9f6335e] api.py (setup): Remove 'variable shortcuts' for model
     classes.
   * [2d0c14c] api.py (setup): Get rid of some unneeded comments.
   * [ff21704] config.py: HOSTNAME now unqualified, add HOSTNAME_FQDN &&
     properly set values from --hostname arg && and use these values
     everywhere.
   * [b49d70d] api.py (Setup.setup_daemon): Add "identity" arg.
   * [273caef] api.py (Setup.setup_archives): Rm MsgLog about netselect-apt
     (rather confusing than helpful).
   * [00b0c1c] api.py (Setup.setup_repositories): Simplify 'suite option'
     code.
   * [2edf936] api.py (Setup.setup_sources): Cosmetic: Update comment.
   * [d590ba0] api.py (Setup.setup_repositories): Simplify distribution
     setup code.
   * [7edc2e5] api.py (setup): Simplify repository+chroot setup code.
   * [1198f21] api.py (setup): Fix order (repositories last).
   * [cbb1158] api.py (setup): Only run repository setup (layout, dists,
     repos) if repo ids given.
   * [3efcc08] dist.py: APT_KEYS: Vendor keys should be capitalized.
   * [97a5fc2] config.py (default_ftp_endpoint): Move code to compute
     default ftpd_bind to config.py.
   * [191c358] models/daemon.py (get): Create model instance singleton with
     computed ftpd_bind default.
   * [bf9b36a] api.py: Argument refac I: r2v/v2r => s2v/s2r, classmethod
     only.
   * [3d0e0e8] api.py: Argument refac II: Get rid of 'raw_value'.
   * [8b34c44] api.py: Argument refac III: Add 'given' value && compute
     actual 'value' via method/property.
   * [dbdee1a] api.py: Argument refac IV: argparse support as method only.
   * [e7e3083] api.py: ident->id_list for specialized Argument classes.
   * [18aa777] config.py: Move 'DEFAULT_HTTP_ENDPOINTS' to config.py.
   * [8439fb8] __init__.py (PyCompat): Improve doc for 'PyCompat' class.
   * [7a114de] config.py: Make config.HTTP_ENDPOINTS str (description)
     only.
   * [0193a06] models/daemon.py (get): Fix: 'ftpd_bind' must given as
     default only, not as id.
   * [1bdf12a] models/daemon.py (Daemon.clean): Add (django) validation for
     ftpd_bind.
   * [8357612] api.py (Argument): Let "default" optionally be a callable;
     add magic value '<server_default>' to make this accessible from
     clients.
   * [1eba57b] api.py (Setup): Add --ftp-endpoint (with callback default).
   * [01ebcf3] api.py (Setup): '--identity': Update to callable (server)
     default.
   * [c97d51f] api.py (Argument): default(), value(), strvalue(): No need
     to be property.
   * [bd7f360] mini_buildd.css: API: Remove image from 'setup' call.
   * [525cf00] mini_buildd.css: Add 'mbd-boxed' class.
   * [33dab34] routes/api.html: Just use a boxed div to separate commands,
     and don't embed (rather popup) results.
   * [ef2c60d] api.py (Setup): Update doc && move doctests to module level.
   * [4d1f007] devel: Add MBD_SETUP_COMMON && update supertestall.
   * [a2b3a7d] devel (profile): Drop (redundant) defaults.
   * [47051dd] devel: Drop mbd_setup and mbd_profile (less is indeed more).
   * [e408be7] api.py (Setup.setup_sources): Use set() to iterate over
     codenames (avoids unnecessary duplicate runs).
   * [e96626d] dist.py (DistroInfo): Add custom classes for Debian/Ubuntu
     to abstract new method mbd_supported(with_lts=X).
   * [1d44bb5] dist.py (get_codenames): Update to use new mbd_supported(),
     and support 'with_lts'.
   * [f08fe9a] api.py (Setup): sources: Add '--sources-from-vendor-with-
     lts'.
   * [0b8dc5d] devel (mbd_supertestall): Use 'lts' sources (add 'wheezy'
     (non-LTS) manually for now).
   * [c811269] tags/api_arg.html: Fix: Don't display 'select' if there are
     no choices.
   * [7785310] api.py: Arguments: Add "header" support to archive some sort
     of grouping when commands have many args.
   * [52f6940] api.py (Setup): Add argument headers (web display only).
   * [690ca1f] static: Rename debian_swirl.svg -> debian.svg.
   * [9c293c7] tags/api_arg.html: Fix: Add value to non-choices
     [multi]select input.
   * [c5dbe5f] static/ubuntu.svg: Add Ubuntu "Circle Of Friends" logo
     (seems fine, see https://ubuntu.com/legal/intellectual-property-
     policy).
   * [98ee164] api.py: Move generic option(s) top (with header).
   * [e0e0a12] api.py: Add "default setup" constants (Default, Debian,
     Ubuntu)
   * [564a1a2] index.html: Add default setups to main page (for now).
   * [96c8385] HTML menus (WCAG): Use <ul> for all menus.
   * [7f3cdb4] HTML menus (WCAG): Use 'aria-labelledby' (both main menus
     for now).
   * [27cf273] HTML menus (WCAG): Only use one nav-element (with nested
     "<ul>s").
   * [e94a935] mini_buildd.css: (Re-)add mbd-float-right class.
   * [4254adf] HTML menus (WCAG): Adapt base.html && CSS to work with ul
     tree (including dropdown menus)
   * [c5deea6] mini_buildd.css: Purge old header setup (with few merges).
   * [0280af7] base.html/CSS: Use global 'mbd' class for body, update
     header stuff.
   * [1efd827] mini_buildd.css: Update (most) configs to 'body.mbd style'.
   * [c70ed75] base.html: Menu: Remove {{uri.class}} (this does no longer
     exist).
   * [9a249f0] base.html: Menu: Update 'attention' class add code to use
     'yesno'.
   * [6acbf58] config.py: Add new MENU dict (replacing extra 'URI.menu'
     flag).
   * [0a2197f] mini_buildd.css: Menu: Avoid right cutoff for submenus.
   * [293ee48] config.py: MENU: Update to list of dicts (prepare for
     various types).
   * [633d0ba] api.py (Power): Replace commands "activate", "deactivate" by
     "power".
   * [ea2d8a3] config.py: MENU: Support 'href', and move homepage link
     there.
   * [fa602e9] includes/menu_item.html: Outsource menu items display to
     include.
   * [7fe9b6b] admin/mini_buildd.html: Fix: Update to new api call "power".
   * [821ae36] config.py: MENU: Support submenus && add "Documentation",
     "Admin" submenus.
   * [113ec7c] mini_buildd.css: Menu: Fix/improve submenu display.
   * [52098fd] menu_item.html: Auto-add 'mbd-active' for active URI menu
     items.
   * [adbf8e3] mini_buildd.css: menu: Can't use margin on submenus.
   * [bcaf1c7] route.html: Update to new "nav style".
   * [4242236] mini_buildd.css: Bring 'grid' to all headers, not just main.
   * [2e9ffc4] menu: Two navs for main menu && update menu aria labels.
   * [24c7971] mini_buildd.css: Remove mbd-float-right again.
   * [e6f6537] base.html: Add "triangle down" for submenus.
   * [b234a3b] mini_buildd/setup.html: Add new location
     'mini_buildd/setup.html'.
   * [82b65df] __init__.py (is_alive): Add shortcut (may also be used to
     avoid importing django early).
   * [a985647] api.py (Power): Make this toggle by default (with new
     is_alive shortcut as default).
   * [e42f13c] includes/menu_item.html: Support "api" menu items.
   * [b51db75] config.py: "power" menu item via config.MENU.
   * [5530a12] api.py (SelectArgument.argparse_kvsargs): Allow positional
     args to be actually optional, if we have a default.
   * [2431112] api.py (Power): Switch to select arg "to_state" (allows nice
     ``power [on|off]`` notation w/ toggle when not given).
   * [17e95ac] includes/menu.html: Macro to spew out whole (static) menus.
   * [5e6b387] config.py: MENU->MENUS as dict, update macros (prepare for
     multiple static menus).
   * [f190103] base.html: User menu: Rather use "Logged Off" than django
     default "AnonymousUser".
   * [17bb615] includes/menu.html: Include the "nav" container (and aria
     label) here.
   * [4ccbb4d] config.py: MENUS: Rm "api" support again, update main menu.
   * [5c7bc98] base.html: Add aria label for account menu.
   * [20021c4] base.html: Retreat: Skip 'menu as config' idea (really
     causes way more pain than it helps).
   * [07289b2] More main menu improvements.
   * [726d79c] base.html (menu): Move "power" to admin menu.
   * [2aa10c4] config.py: More consistently rename "documentation" ->
     "doc".
   * [abd2edd] daemon.py (Daemon.attention): Add stubs for all possible
     "attention" candidates, and improve tooltip.
   * [3dfa8c6] models/base.py (StatusModel): Add mbd_attention: HR-string
     if any object is inactive.
   * [10a19d4] daemon.py (Daemon): Attention: Update implementation && add
     support for builders, chroots and respositories.
   * [4304222] base.html: "Box" the account/user menu.
   * [3487460] mini_buildd.css: Restrict header config to main header
     (body.header).
   * [d9d99ea] html: Sync headers in all page-like htmls.
   * [dbbd9b0] mini_buildd.css (body.mbd>header): Merge dupped config.
   * [d13d1c7] base.html: Fix footer (grid setup).
   * [d493849] index.html, setup.html: Omit section, main content should be
     just in main.
   * [b0270c8] mini_buildd.css (body.mbd>main): Add main header config.
   * [52e7774] route.html: Put nav to main header.
   * [b36f6ac] views.py (RouteView): Default to None (not []) if there are
     no entries.
   * [29b5f1b] route.html: Fix for "no entries"; add (sort of) TOC.
   * [4ef7541] net.py (Endpoint.geturl): Add support for a custom user
     name.
   * [06b71a8] api.py (Command.command_line): Add command line generator.
   * [0440eb6] mini-buildd-api (CLI): Initial support to parse API command
     line strings.
   * [14d093a] api.py: Support to parse API command line strings.
   * [3d15109] api.py (parse_command_line): Make argparse raise only (not
     exit) on error. See https://bugs.python.org/issue41255
   * [61c1bf2] views.py: Make "SetupView" accessible by superuser only.
   * [c269183] views.py: Switch to use non-absolute imports for django
     decorators.
   * [04deac4] views.py: Make login_required for AccountProfile view.
   * [b9d228c] builtins.py: (Re-)add 'mbd_next' tag.
   * [c00814d] tags/api.html: Unauthorized: Be sure to use the same HTML
     elements/classes here, to make CSS styling look the same.
   * [d727df5] daemon.py (Daemon): Add set|get_setup() (hide that we
     (mis)use 'pickled_data' for it).
   * [bed4a6e] api.py: Update && fix setup command globals; add function to
     get saved setup.
   * [ba98b82] daemon.py (Daemon.sync): Don't blank out pickled_data (we
     use it again now).
   * [a835f07] setup.html: Fix mixed up headers/titles.
   * [eb05f9e] api.py (Command.from_command_line): Constructor from command
     line.
   * [210e1f9] models/base.py,daemon.py: Make pickled_data (mis)use for
     'setup' visible/documented via django.
   * [54b703c] models/daemon.py (Daemon.clean): Add validation for
     'pickled_data' field now used as command line setup.
   * [f7ac00b] api.py (Argument): Add VALUE_TYPE, validation && ivalue (for
     command line).
   * [aef9af1] api.py (RaisingArgumentParser): Fix pydocstyle warning
     (missing .).
   * [0f655c9] api.py (Setup): Add --set (save command line).
   * [d284ff6] daemon.py (Daemon.__init__): Add heuristic when to blank
     pickled_data.
   * [7e9f7a7] models/daemon.py (Daemon.clean): Remove "setup" validation
     (not a good idea after all).
   * [12cc762] api.py: set=True, update=True for predefined setups.
   * [b18c685] api.py: --set -> --save.
   * [944ccda] api.py (Command.__init__): Use dict comprehension for
     self.args.
   * [3ef2765] api.py (Command.__init__): Simplify args gathering code.
   * [755fe0f] api.py (Command.__init__): Improve debug logs (and enable
     for now).
   * [3788e14] api.py (Command.__init__): args handling: Yet another
     cleanup of current code (before real fix).
   * [d570ede] devel (MBD_SETUP_COMMON_DESC): --save setup.
   * [6f8abcf] net.py (Endpoint.geturl): Run urlencode with doseq=True (no
     need for comma-separate lists).
   * [4fbd9f8] client.py (Client.api): Add debug log to see command args.
   * [0026fba] mini-buildd-api: Update to upcoming "from_argparse()".
   * [298c1a6] views.py: APIView: Update to upcoming "from_request()".
   * [46033d6] api.py (KeyringPackages): Update --distributions to "server
     default"-style.
   * [2e6d04b] api.py (Command): Add from_request, from_argparse
     (obsoleting api_args).
   * [45837f7] api.py: Rm obsoleted django import.
   * [3e2046d] builtins.py, api.py: Command: Add from_templatetag() for
     mbd_api templatetag.
   * [1fbdcee] api.py (Argument): Simplify: Drop validate(), default() &&
     misc fixups.
   * [ddc7091] api.py (Command): Add/sync doc for all "from"-Constructors.
   * [a2ca0ad] api.py (Command.from_argparse): Fix: Rather use cli_value we
     already have.
   * [395bbdc] api.py (Argument.__str__): Add for convenience (debug).
   * [78d2985] api.py (Command.from_argparse): Distinguish between "str"
     and other value types.
   * [e4a9406] api.py (Command.from_templatetag|argparse): Fix: Use 'is
     None'-style for value.
   * [a7e9015] api.py: Let BoolArgument be 'false' by default.
   * [cb16849] api.py (BoolArgument): Make default=false mandatory (so we
     can use it naturally as --option in command lines).
   * [f6476a5] api.py (BoolArgument): Command line: Make normal option
     again ('--with-foo', not '--with-foo True').
   * [232019b] api.py (BoolArgument): Web: Make (bool) options 'checkbox'
     again.
   * [3e42b89] api.py (Power): Use 'OnOff' enum; result to
     state/previous_state instead of status.
   * [c4d213d] api.py (BoolArgument): Use TRUE,FALSE (str) constants.
   * [b2969c7] api.py: Move STATUS_RESULT_DOC to status only.
   * [4eb77b4] api.py: Move all "set" code from update() methods (to server
     defaults).
   * [7d3c8b7] api.py (Argument.choices): Allow choices via function.
   * [7eca1cc] api.py: Move all run-time value functions to one place.
   * [7569e49] api.py: Remove RepositoryPattern class (not used).
   * [47d5495] api.py (Repository, RepositoryRegex): Update to choices via
     function.
   * [d99431b] api.py (MultiSelectArgument.argparse_kvsargs): Fix: Don't
     call choices().
   * [4d25b77] api.py (Distribution): Update all 'dist' special arg classes
     to 'choice functions'.
   * [dae6509] api.py: Update 'codename, suite, sources' special arg
     classes to 'choice functions'.
   * [910e5df] api.py (Power._run): Result: previous_state -> state_pre.
   * [908440c] api.py (Argument): Remove support for update().
   * [2fdadb8] MsgLog removal: Bulk-replace all calls to MsgLog() by LOG.
   * [8305c85] MsgLog removal: Fix all errors w/ static checkers (`devel
     check`).
   * [aad942f] MsgLog removal: models: Remove "request" from all (custom)
     methods.
   * [92be18a] MsgLog removal: api.py: Remove 'request' from all custom
     model calls.
   * [7989450] models/msglog.py: Delete MsgLog impl.
   * [e4de753] models/base.py,source.py: Remove three now unneeded extra
     LOG calls.
   * [03fd642] css, html: Remove all support for messages.
   * [59a8b88] daemon.py, webapp.py: Fixup mbd_action calls.
   * [332b65d] django_settings.py: Remove django message loglevel
     configuration (messages now only used by admin).
   * [ef924d1] cron.py (_Job): Log exception on cron error.
   * [21fcee6] client.py (Client.api): non-interactive: If possible, raise
     API's RFC 7807 result (improves error handling).
   * [5ea6cbd] api.py (Argument): Add "allow_none" (value) option; add
     validate() method.
   * [33501c5] api.py (SourceVersion): Use 'allow_none=True' (removes fixme
     "false2none").
   * [523bcc9] devel (MBD_SETUP_DESC): Default to none (i.e., setup for
     current dist only).
   * [b108c54] api.py (Setup.setup_repositories): Get 'with_rollback' from
     layout, not suite setup (Fixes: Rollbacks per setup).
   * [66ac74e] api.py: Update Repositories/Codenames special arg classes.
   * [f0da8ac] api.py (Argument.argparse_kvsargs): help: Add server default
     hint (the name of the function).
   * [f504936] api.py: Update naming of (some) value functions.
   * [f7f6ede] api.py: Update Distribution(s) special arg classes.
   * [fe37c05] api.py:Repositories, Codenames special args: Back to
     'id_list' as arg.
   * [22e8232] api.py (power_toggle): Update all run value functions to
     meaningful names (shown to the user).
   * [47e04f6] api.py (Status): Remove (commented) debug code line for
     MsgLog (which is no more).
   * [b513db3] api.py (Status): Simplify code (status result no longer used
     elsewhere).
   * [8b985da] api.py (Status): Update doc, json result && simplify code.
   * [53ddcd9] daemon.py (Daemon.get_status): Remove (no longer used).
   * [e1842e7] api.py (Power): No need to state server default extra (it's
     automatic now).
   * [4555f4e] api.py (Cancel): Add choices && result.
   * [a297503] api.py (PubKey, DputConf, GetUploaders): Update API doc.
   * [19edaa1] api.py (Uploaders): Rename from GetUploaders.
   * [7d97c84] repositories.html: Update 'sources_list' call args.
   * [741ddad] api.py: Make "Status" very 1st command.
   * [a1ecdaf] api.py: Re-oder all api commands (sort of 'light to heavy').
   * [b011240] api.py: Add headers "Consume, Contribute, Maintain": Roughly
     categorize api commands (for api overview only).
   * [f2aad28] devel (apt-getters): Update && extend test calls.
   * [9fe309d] mini_buildd.js: Add support to show actual command args.
   * [3a99810] api.py (SourcesList): --suite -> --suites as multiselect.
   * [7416006] api.py (Command.from_request): Rather 'unconsider' None, not
     bool(http_value).
   * [fa09766] api.py (SourcesList): options, snapshot, mirror options: Use
     'allow_none'.
   * [1d18f8d] api.py: Update doc notation ("Capitalize, end with .") up to
     sources_list.
   * [bf2c6c6] tags/api_arg.html: text: Properly deal w/ new allow_none.
   * [83024d8] tags/api_arg.html: Argument.value|choices|default may run
     code to determine resp. values; running these only once via 'with'
     variables does speed things up.
   * [37c152b] misc.py (singularize): Add poor man's singularize().
   * [97410d8] api.py (MultiSelectArgument.argparse_kvsargs): Let's metavar
     be singular.
   * [813be54] misc.py (singularize): Add "s" plural (Huts -> Hut).
   * [3876c99] api.py (Ls): Update doc.
   * [5b969d6] api.py (Argument.__init__): argparse_is_positional() ->
     is_positional().
   * [ec3dd51] builtins.py (mbd_api): Make positional mandatory (don't call
     value here).
   * [87eeb0a] api.py (List): Update arguments and doc.
   * [ce2db70] api.py: Put 'Find' after 'Ls'.
   * [5a02f69] tags/api_arg.html: text: Always make required when
     positional.
   * [a9c7ecf] api.py: Update/fix "version" arguments (doc && code).
   * [87f2c75] api.py: Sync specialized arg classes (kwargs).
   * [51f402d] reprepro.py: Improve 'find' code && fix: check for None not
     bool.
   * [fada36f] api.py (Command.from_request): Improve code && fix: Discard
     empty values (from form submit).
   * [3adaaab] api.py (Ls): Add --version, --minimal-version limiters.
   * [0f33321] api.py (Find): Be literally 'Ls', but failing on no results.
   * [81acd08] routes/api.html: Misuse fieldset for box w/ label.
   * [0caa023] api.py: Run values: Use general distribution helper, add
     migratable_distributions.
   * [828e0ea] api.py (Migrate): Update dist choices to migratable only.
   * [784ea8f] api.py (UploadOptions): Remove in-method import.
   * [642ca64] api.py (Argument): Make _s2v, _v2s non-private (de-facto
     public, and no reason not to be).
   * [6483555] api.py (Retry): Fix arg order && make version non-
     positional.
   * [dbe6c3e] package.py (_port): upload(): Rather use force=True
     (although when porting, we should have a clear tmp directory).
   * [ffea722] events.py, api.py (last_failed_bkeys): Add more convenience
     tool functions (later needed for 'retry').
   * [4035fc5] api.py (Retry): Rewrite to work with new events dir/bkey.
   * [6ff82d7] api.py, events.py: Move convenience run-value functions to
     api.py (only used there, and they are whacky).
   * [8fa0dd3] misc.py (attempt): Extent to allow for return values.
   * [e795591] api.py: Protect run-value convenience functions for events
     via attempt.
   * [fa1e054] api.py (Retry): Rewrite implementation again, now with over-
     the-top validation ;).
   * [dea4f09] api.py (Argument): Add "required" flag ("needs user input").
   * [bb17405] api_arg.html: Update HTML 'required' to be set via
     arg.required.
   * [0474153] api_arg.html: select: Always make required (hardcoded).
   * [f838fc9] api.py: Bulk-sync ARGUMENT notation for all API calls (and
     yes, we love long lines).
   * [33b84ce] views.py (AccountProfileView): Add user subscriptions to
     context.
   * [b876ab3] builtins.py (mbd_api): Show positional arguments as
     mandatory only if value is not given.
   * [4a5aa73] mini_buildd.css (div.mbd-api-results-container): Explicitly
     set 'text-align: left;' (it can implicitly be otherwise).
   * [2fc9e9e] api.py (Command.__init__): update() must be called last
     (after self.request is set).
   * [5eda23a] api.py (Argument.required): Change to function, not class
     var (may change if value is set).
   * [fe74ace] api.py: Replace "Subscription" by re-implementations
     "Subscribe", "Unsubscribe".
   * [b8b1125] account_profile.html: Update subscriptions to new
     subscribe/unsubscribe (now more coneniently shows list of subs in
     datatable).
   * [37dd35f] routes/tracker.html: Update to "subscribe".
   * [c8aea8b] tracker.html: Update to new 'ls' syntax.
   * [f44c7fa] api.py (Distribution, Source): Add support for extra doc
     string (use for subscribe).
   * [c041b05] api.py (Command): Remove "update" support. Only used for
     'port' (and not really a huge benefit there).
   * [4302727] api_arg.html: text: If value is None, use "" as form value,
     not "None".
   * [a8097f8] api.py (Argument.v2s): If value is None, use "" as strvalue,
     not "None".
   * [4a09d36] api.py (Argument): Better (correct) name: ivalue() ->
     icommand_line_value().
   * [4c3b0c4] api.py (get_setup): Fix: Show usable log when saved setup
     can't be parsed.
   * [93c83b5] api.py (BoolArgument.icommand_line_value): Empty generator
     (bool are now simple --with-foo options -- fixes computed command
     lines).
   * [e1108ca] src/mini-buildd-backup: Add tool to backup && restore (to a
     fresh installation) a mini-buildd instance.
   * [42f9b01] devel (MBD_CODENAME): Update bullseye codeversion (11), add
     bookworm.
   * [bc1a331] dist.py: bullseye release: Add new apt keys: archive,
     release, security.
   * [919febc] dist.py: bullseye release: Add 'buster-backports-sloppy' for
     default buster setup.
   * [6bd2721] dist.py: bullseye release: Add 'bullseye-security',
     'bullseye-backports' for default bullseye setup.
   * [5faf485] dist.py: APT_KEYS dict: Use better notation.
   * [e7391b2] dist.py: Update SETUP w/ "lintian_options" (to be used next)
     && add doc about findings on "--fail-on[-warnings]" option.
   * [2db315a] dist.py (get_lintian_options): Add function to get lintian
     options (with fallback).
   * [36c2b5e] dist.py: SETUP: Debian codenames: Order newest first.
   * [5f2f611] dist.py: SETUP: Ubuntu codenames: Order newest first.
   * [b271861] dist.py: Update lintian_options to be lists, handled with
     shlex.join. Drop "no_lintian_suppress".
   * [105c682] dist.py: SETUP: Correctly setup "warnfail" f.a. (older)
     codenames.
   * [6a7ed31] dist.py: Fixup all keys for all sources post-bullseye (i.e.,
     definitely covers all current signatures, removes unused where found).
   * [cbd5851] api.py (Setup): Add --sources-from-vendor-with-all option.
   * [62ac7b4] gnupg.py, models/source.py: Improve per-source signature
     logging.
   * [3249f43] models/base.py, daemon.py: Move the description of 'setup'
     use of pickled_data to Daemon model.
   * [cc492b2] models/*.py: Exclude 'pickled_data' from 'prominent' Models.
   * [f907ca6] models/daemon.py (Daemon): Update default keyserver:
     pool.sks-keyservers.net (dead) -> keyserver.ubuntu.com.
   * [75dd08f] gnupg.py: Move 'keyserver support' to 'PublicKeyCache'
     completely (also properly errors out now when --recv-keys skips import
     on 'newer' servers).
   * [37e5638] api.py: get_setup(): Return None if there is none, not some
     default.
   * [2f83b56] api_arg.html: multiselect: Only 'require' if arg.required is
     set.
   * [8180e43] api.py (Argument): Add default method.
   * [546a71c] api.py (Argument.set): Make bool expression more readable;
     add log.
   * [46ebb52] api.py (default_chroot_backend): Add run value for chroot
     backend.
   * [2226ed9] api_arg.html, *.py: select, multiselect: Always use html
     input "text" (w/ datalist).
   * [61f7333] api.py (Setup): Fix argument convenience header.
   * [97d5d37] api_arg.html: text: Remove "multiple" attribute.
   * [561983d] api_arg.html: Fix value for checkbox/bool.
   * [379bb5a] api_arg.html: Add convenience button to clear text value
     (js).
   * [fbf96cc] api_arg.html: textarea: Use given as value.
   * [aa88503] api_arg.html: Only "prefetch" choices.
   * [010b553] api.py (Argument): Add strdefault, update strvalue.
   * [0646a91] api.py: Simplify from_request, from_templatetag.
   * [3ef1f2e] api.py (Command.__init__): Remove option that given_args may
     be Arguments themselves (not used).
   * [27d7167] api.py (Argument): Handle all value details is
     Argument.set(), simplify && remove redundancies from_* constructors.
   * [b6f1c40] api.py: Xommand: from_* constructors no longer necessary.
   * [9f11622] models/daemon.py: Move "setup handling" completely to model.
   * [8efc771] api.py (Setup): Fix: --chroots must accept any chroot, not
     supported only.
   * [5fc5d3b] api.py (Command.icommand_line): Fix: Rather use 'not None'.
   * [8ff6547] api_arg.html: Add per-text-arg convenience buttons: reset,
     default.
   * [e7c02bf] api.py: Better names to all *Argument classes.
   * [736aa35] api.py (ListArgument.s2v, v2s): Use "" as None.
   * [f3d905b] models/daemon.py: Doc: Fix rst syntax (hard sphinx error).
   * [277e460] api.py: Remove allow_none, just use default for that.
   * [6d36e3a] api.py: required -> needs_value and other cleanups.
   * [9a624f2] api.py: Add doc for generic Argument class && some code
     fixes.
   * [0fb467a] api.py: Add strgiven (always use that in forms), validate in
     value().
   * [44c40c6] api_arg.html: input: Use 'placeholder' to hint default when
     value is empty.
   * [c3373c7] api.py (ChoiceArgument.value): Add actual choice validator.
   * [4e608f4] client.py (Client.api): Make it take a full Command instance
     (not name && args).
   * [f61a3b5] builtins.py (mbd_api): No need to check for empty values w/
     new Arguments.
   * [f1206a3] api.py (Command): Remove some obsoleted code.
   * [f604e47] api.py (Argument.set): Fix: yield "None" on empty list.
   * [d153cbc] api.py (Setup): Fix silly use of mutable objects from
     arguments (would mysteriously change argument defaults ;).
   * [5975aed] api.py (ListArgument.icommand_line_value->given): Fix: We
     should yield from given, not value.
   * [8e3f8ee] api.py (Command): Introduce iarguments() as (future)
     replacement for ARGUMENTS (obsoletes copy).
   * [0ec4d69] api.py: Bulk-update all Commands from ARGUMENTS ->
     iarguments().
   * [8d0baec] api.py: Remove ARGUMENTS completely.
   * [5f699bd] api_arg.html: checkbox/bool: Fix 'True' value.
   * [460857d] api_arg.html: "Default" button obsolete (we see default now
     when cleared).
   * [e009f16] api.py: Add doctest (Setup from command line and back).
   * [f4e8a51] api.py (Argument.set()): Also set to None on False bool
     value.
   * [1aae965] api.py (Argument.__str__): Improve (debug).
   * [c9c6d88] changes.py (Base._upload): Rather use "ftp_cls" not "FTP"
     (get rid of the unnecessary local check disable).
   * [5416051] api_arg.html: text: If there is strdefault/placeholder,
     adapt size to it.
   * [f2c5def] api_arg.html: Revive Default button (still useful); only
     show buttons if action makes sense.
   * [1daf0bc] mini_buildd.css: Some rather random adaptions to make api
     forms look better (or at least different).
   * [6478f02] builtins.py: Update helpers to access/set vars in templates:
     mbd_get() ('identity function'), mbd_dict_get ('get value from dict').
   * [37da13f] api.py (get_setup): Update to deliver dict w/ 'saved' info
     && deliver Setup() default on non-saved.
   * [cc886f8] setup.html: Update to new get_setup && initial new 'common
     main HTML strcuture'.
   * [f2fc361] mini_buildd.css: Drop extra 'mbd-boxed' class in favor of
     structural boxing of sections.
   * [09a3830] route.html: Update to new main layout w/ sections.
   * [a56ba16] index.html: Update to new main layout w/ sections.
   * [74dd87c] mini_buildd.css: Put box around *any* section beneath main.
   * [06d9e26] routes/api.html: Update to new main layout w/ sections;
     generalize special "api header" (cmd && arg) support.
   * [c0ec844] mini_buildd.css: "aside" no longer used.
   * [de6f25c] mini_buildd.css: Re-order, some cleanup.
   * [3a043f3] mini_buildd.css (div.mbd-api-results-container-popup): Don't
     border "embed".
   * [350d871] routes/tracker.html: Properly use sections.
   * [69902cd] api.html, css: Minimize use of classes: 1 unused, 4
     obsoleted.
   * [70e9684] mini_buildd.css|js, api.html: Minimize use of classes and
     ids.
   * [161e5e8] tags/api.html: Container: Make proper nav (with ul &&
     label).
   * [b9e366e] tags/plain.html: Update to proper nav (label, ul).
   * [42f269c] builtins.py (mbd_plain): Remove support for "as_detail".
   * [1d0ef6f] mini_buildd.css: Make 'new style api css' to only act on
     'body.mbd'.
   * [70d42e8] tracker.html: Update to proper nav (ul, label).
   * [222d58c] builders.html: Update navs (ul, label).
   * [18ca492] api.html: Better id: container -> api-result-container.
   * [9c5bc1d] static: Add close.svg, update reload.svg (from openclipart).
   * [0a9147f] api.html: Make results not popup here.
   * [bda74a6] tags/api.html: Always use Close + Reload, both w/ image.
   * [9c7dafe] mini_buildd.css: Colors: Go with 6 (named) colors only.
   * [b254a8b] mini_buildd.css: One segment for all 6 "log" levels.
   * [1ee7562] admin/mini_buildd.html: Drop placing api call directly here,
     rather hint to /setup. Also fixes GUI quirk.
   * [80ee7db] mini_buildd.css (:root): Add base --bg-color (analog to
     --color).
   * [2841bcd] mini_buildd.css (:root): Fixup bg colors; downgrade to 4.
   * [1fd6f00] /mini_buildd.css: Rm wrong 'api args' config (not really
     improves things anyway).
   * [537f806] mini_buildd.css: Cosmetic: Update doc comments for API.
   * [805109d] mini_buildd.css (:root): Use hsl() (not hex) for greys &&
     base fg color.
   * [0dabf7a] mini_buildd.css (:root): More color updates/simplifications.
   * [52dc1d6] builtins.py (mbd_api): Fix: Use needs_value() for mandatory.
   * [9239ffb] tags/plain.html: Don't use extra 'section' here.
   * [f8f3742] mini_buildd.css: Add generic classes (mbd-foo) for the six
     'states'.
   * [65439c6] mini_buildd.css: mbd-hidden: Unused, remove.
   * [82a7dc4] builtins.py (PlainFilter): Update to generic css 'state'
     classes.
   * [fbe034f] builtins.py (Css): Add mbd_cssmap: Mapper helper for css.
   * [fb84164] Update 'sbuild_status' to css mapper.
   * [9bd1dba] Update 'sbuild_check' to css mapper.
   * [4a0a197] Update 'events' to css mapper.
   * [0d8ac91] builtins.py: mbd_cssify: no longer used, remove.
   * [128b586] admin/mini_buildd/change_list.html: Move js-Hack to html.
   * [6a8eba6] Update 'admin_actions' to css mapper (mapping in js for this
     hack).
   * [b8eb866] Update 'model_status' to css mapper.
   * [82d8df6] Update 'mbd-dist-*' classes to generic ones.
   * [df29793] Update 'mbd-[in]active' classes to generic ones.
   * [a92667e] mini_buildd.css (:root): Update notation, order.
   * [4683f1c] mini_buildd.css: Improve drop down menu.
   * [5ff8871] mini_buildd.css: dropdown nav fixups: Also highlight
     dropdown items, don't conflict with api html container.
   * [2a7908d] models/daemon.py (Daemon.mbd_setup_v10x2v20x): Fix
     (previously not-updated) save call.
   * [70dde69] control: Make lintian a recommendation, and add piuparts,
     autopkgtest.
   * [18805ed] mini_buildd.css: Get rid of all extra margins/paddings.
   * [6b55365] mini_buildd.css (form.mbd-api): No need for extra setup for
     select/textarea.
   * [b993ee3] mini_buildd.css (:root): Re-order colors.
   * [272e154] mini_buildd.css: Obsolete class 'mbd-datatable'.
   * [5907ff6] mini_buildd.css: Bulk-prefix (body.mbd) remaining parts.
   * [6954c0c] mini_buildd.css (:root): Order && doc update again.
   * [78e430d] routes/crontab.html: Update to new css.
   * [7c5cecb] account_profile.html: Update to new css.
   * [46fee68] *.html: Bulk-update to new (limited) css classes.
   * [5193298] mini_buildd.css (body.mbd>header): Fix stray comment close.
   * [c9dddd8] mini_buildd.css: Fix: Always use 'background-color', never
     background (shortcut).
   * [d2f5738] base|index.html: Move "power" menu from main (admin) menu to
     home.
   * [8729a92] mini_buildd.css: +mbd-highlight, mbd-unauthorized->mbd-dim.
   * [9203375] images: Add power_on|off svgs (from openclipart).
   * [4aa38c2] index.html: Power state via images. Obsoletes mbd-stopped
     class.
   * [f980774] mini_buildd.css: Cosmetics, reordering.
   * [7d57c99] mini_buildd.css (body.mbd>main>header): Obsolete explicit
     nav config.
   * [0e26b0f] mini_buildd.css (:root): More cosmetics, some fixes.
   * [6f00992] mini_buildd.css (:root): Move body-header color to var.
   * [3883d41] mini_buildd.css: Add mbd-body-menu-active.
   * [39787e9] mini_buildd.css (body.mbd a): Inherit colors for anchors.
   * [58df184] mini_buildd.css: Simplify img handling: Omit mbd-logo, go
     with mbd-icon only.
   * [e94e07c] builtins.py (mbd_img): Fix clipboard: Get rid of clipboard
     arg, use button.
   * [67a243a] builtins.py (mbd_img): Remove "onclick" arg (rather use
     button around img for that).
   * [52e078b] builtins.py: Rm href support from 'mbd_img'; remove
     'mbd_home'.
   * [11fa83d] routes/events.html: Update "Action" to menu.
   * [0c15df9] routes/events.html: Simplify: Type+Details->Results, one
     menu.
   * [5f20d49] tags/sbuild_status.html: Don't use 'spaceless' in tag.
   * [5a7172d] mini_buildd.css: Datatables: No need for extra form/input
     setup (nav already does this).
   * [7390dee] api/ls.html: Update to nav, Migration && Menu coloms.
   * [c554974] api.py (Ls.run): (Initial) fix for buggy rollbacks/json.
   * [a48c24a] mini_buildd.js: api: Add helper vars: container,
     args_serialized, get_uri.
   * [421be7e] mini_buildd.js: api: Omit redundant 'form' argument.
   * [fd4199e] mini_buildd.js: Discard empty api form arguments.
   * [bcf35ad] mini_buildd.js: api: Explicitly use output=snippet on js api
     calls.
   * [270625e] tags/api.html: Use menu item w/ complete "Page Call" instead
     of mere extra args display.
   * [d31ac48] api call:: Misc code cosmetics.
   * [3ba67ad] dist.py: Add doctest: get(rollback=False).
   * [57be9b0] reprepro.py (Reprepro.ils): Fix result dict to 'recommended'
     order: distribution,source,version.
   * [4263de9] api.py: Add "Ls2": Simplified, will eventually replace Ls.
   * [02c86ab] api/ls.html: Fix title (update to new ls args).
   * [b3c5d5e] api/snippet.html: Simplify, rm debug.
   * [f01494a] api/page.html: Fix title.
   * [31e2463] mini_buildd.css: Configure "aside": Box, float right.
   * [c522c30] api/snippet.html (Refine Call): Add as "aside".
   * [f2e23ae] api/ls.html: Remove "Component" from table.
   * [b218641] api.py: Ls2: Add "uri".
   * [d8167ce] api/ls.html: Fix: Only show event link if we have a version.
   * [21f0f6f] api.py (Ls2): Add uploadable, migrates_to, is_migrated.
   * [8be4dd5] tags/api.html: Don't use empty href -- lintian dont like...
   * [3a77736] api.py (Ls2.run): Fix: use bool for 'is_migrated'.
   * [4edd91d] api.py: Make Ls2 the real Ls (ls apt display mostly works).
   * [09083d5] api/ls.html: Make rollbacks display functional again.
   * [38bb4c0] api/ls.html: Put rollbacks in its own table.
   * [f1008c1] api/ls.html: Make rollbacks table dataTable.
   * [b2f7fb6] mini_buildd.css: Drop custom dataTables styles -- we should
     be fine just with the builtin style classes.
   * [77fd5ef] mini_buildd.js: api: urldecode params (for confirmation
     text).
   * [7bb7566] mini_buildd.js: Instead of decoding previously encoded,
     rather produce human-readable text from args array directly.
   * [3bfd8c5] mini_buildd.js: Oops -- them javascript variables are global
     by default...
   * [3c65d17] api/snippet.html: Simplify.
   * [1272300] routes/tracker.html: Simplify && add ls call for "all".
   * [223f663] api/ls.html: Update table to have
     Migration,Extra,Rollbacks,Menu as 'non-data' columns.
   * [5fd883a] api/ls.html: Don't use section here.
   * [8f54671] routes/tracker.html: Fix missing section close tag.
   * [84a1a84] api/snippet.html: Don't use section here.
   * [cda4f30] html: Remove ARIA labels for now.
   * [cd18434] html: Get rid of any '/>' (element close) shorthand
     (presumably cargo-cult, we dontwant ;).
   * [0e0f976] api/ls.html: Extra: Fix order/wording.
   * [ae18f96] builtins.py (mbd_api): Replace "full=False" by
     "hide_options=False" (i.e., rather show options by default).
   * [6027619] api/ls.html: Update "Migrate" column.
   * [baf2043] builtins.py (mbd_datatable): Update to support no ordering.
   * [9feef98] api/ls.html: Make table non-ordering.
   * [a74ae5b] base.html: Fix noscript warning (class, wording).
   * [8d0c1a3] builtins.py (mbd_api): Args: Drop "popup" in favor of
     "output".
   * [ecc6f7f] html: Drop extra "tracker". Just 'ls' will do fine.
   * [1096c70] builtins.py (mbd_datatable): Add support for
     searching,paging,info options.
   * [869983e] api/ls.html: Minimize rollbacks datatable (no order, no
     searching, no info, no paging).
   * [9f02182] builtins.py: Add mbd_api_popup: Shortcut (for HTML) to
     create a popup.
   * [1696aa8] html: Bulk-update api candidates to "popup" variant.
   * [ea3a708] devel (mbd_curl_admin): Add function to run request logged-
     in (curl).
   * [5ab91f6] devel (tidy): Switch to use logged-in requests.
   * [3410f09] html: Fix three errors found w/ tidy logged-in.
   * [30dcb77] devel (tidy): Add more tests.
   * [8a90fb0] mini_buildd.css: Make body menu sticky.
   * [9826c5c] base.html: Move api-result-container to base template (have
     it once per page, not once per command).
   * [d75dcfb] setup.html: Make api setup calls popups.
   * [ccfa8db] devel: curl_admin -> curl-admin.
   * [f4da8a1] builtins.py (mbd_api): Make token / element ids mostly
     obsolete.
   * [1201204] devel (mbd_changes): Use time for final logged-in curl call
     (for debug).
   * [88273a4] api/js/css: Popup: Make truly centered && dynamic size.
   * [ba7b93b] mini_buildd.css: Grid class 'mbd-grid-lcr' (rather than
     repeating it).
   * [6769c3c] mini_buildd.css: Cosmetics, order.
   * [ff962c4] mini_buildd.css (:root): Make all colors hsl-colors.
   * [3201ea3] mini_buildd.css: Sync notation.
   * [045ed10] mini_buildd.css: Rename api-result-container->api-popup &&
     use section for popup snippet.
   * [8a3446a] mini_buildd.css: Simplify popup css.
   * [39d380b] mini_buildd.css: Simplify api header css.
   * [6358a6b] mini_buildd.css: Deprecate mbd-api-header class.
   * [d2955bf] mini_buildd.css: More CSS cleanups, removals, comments.
   * [232f54f] tags/api_arg.html: Update wording for X,D,R value buttons.
   * [580164e] mini_buildd.css (:root): Fix sticky header to not move; make
     footer sticky as well; fixed bg for sections based on level.
   * [a4835b5] mini_buildd.css: popup: Add max height (and width) and
     enable scrolling.
   * [5b2a068] html: Update API page, snippet, ls.
   * [8d90382] devel: mbd_hack-html: Bad hack to hack HTML.
   * [53c6756] html: plain, routes, builds, scandir: Some basic adaptions.
   * [d534d5c] mini_buildd.css (body.mbd header): "a" config for headers
     only.
   * [f5873c6] mini_buildd.css (body.mbd): Add bg for "pre".
   * [eacdfac] svg: Rename data->file, browse->dir.
   * [e4b34d3] plain.html: Fix when doenload_uri is None, add browse menu.
   * [a401f02] svg: Add builds, events (from openclipbaord for now).
   * [3a45d40] models/repository.py: mbd_find_dsc_uri->mbd_find_dsc_path
     (updates for api.py, package.py).
   * [f636b27] api/ls.html: Update to new svgs && dsc_path.
   * [83ed7e7] svg: Obsolete download, vanilla.
   * [33cddb8] routes/builders.html: Proper header.
   * [8206ca8] mini_buildd.css: Uff, some cssfiddle once again.
   * [387dcef] svg: Update various svgs (from openclipart for now).
   * [b695038] svg: Rm "start.svg" (not used).
   * [6ca5ffc] routes/events.html: Update dataTable config.
   * [55dc6c9] routes/builds.html: Update dataTable config.
   * [b4e3792] changes.py: Add changes (path) to events.
   * [4ed7d6c] routes/events.html: ls: Limit to this version only, hide
     options.
   * [60984fc] base.html: popup: Use ids again, actually use header for
     header, add home again && reorder header menus.
   * [8f4c8e1] mini_buildd.css (body.mbd>header): Remove bottom line again.
   * [c0b9e14] mini_buildd.css (body.mbd>header): Rm padding.
   * [68b5d0f] routes/events.html: ls only on INSTALLED.
   * [0154c5b] values.py: New module: On-demand cached values.
   * [4a02269] * src/mini_buildd/values.py: Add vget() helper.
   * [a5757ce] api.py (Argument): Support default/choices to be
     'values.Name'.
   * [465c891] api.py (OnOff): Move OnOff class to values.
   * [b8ba7a1] api.py: Move all "run values" to values.py.
   * [e49eab4] api.py: Remove (now obsolete) support for callables.
   * [edeaa3a] debian/mini-buildd.lintian-overrides (mini-buildd): Update
     for new lintian version.
   * [3524c28] api.py: Two more items moved to values; make them all non-
     cached by default.
   * [6b79b2a] testsuite packages: Add "copyright" files (error with newer
     lintian).
   * [abdfe15] tags/api.html: Revert to use id for form
     ('document.currentScript' would not work when used as snippet).
   * [3ea53a4] httpd.py: Directory Listing: Add HTML template with similar
     look-and-feel as the django pages.
   * [fb7e43b] mini_buildd.css: Make table captions and column headers
     align left.
   * [ea2fc91] httpd.py: Directory Listing: Simplify header.
   * [2c98159] devel (tidy): Add static events+builds tests.
   * [f63fbd4] httpd.py (DirectoryLister.render): Code cosmetics.
   * [e15dbab] httpd.py (DirectoryLister.render): Don't use (maybe not
     stable) private methods from twisted class.
   * [776d189] httpd.py (DirectoryLister.render): Use normal py templating
     for template.
   * [cd295d0] httpd.py (DirectoryLister): Rm (now-wrong) method doc.
   * [5cd9264] mini_buildd.css: Config for directory listings.
   * [1b8e066] files.py (Path.removeprefix): Add helper method.
   * [ca0c9ba] httpd.py (DirectoryLister.render): Fix: Use configured char
     encoding (rather than hardcoded 'utf-8')
   * [af1977c] httpd.py (DirectoryLister.render): Make file links got to
     "view".
   * [aaa3d58] views.py (DefaultView): Add (again) (we already had s.th.
     similar as PathView previously).
   * [81f6d54] views.py, urls.py: Replace HomeView by DefaultView.
   * [2d3dc75] views.py: Update AccountProfileView to DefaultView.
   * [e283a6a] views.py (SetupView): Update to DefaultView.
   * [f5a5d7f] views.py: API (index) back to non-route DefaultView.
   * [c06d35a] views.py: Sitemap to non-route DefaultView.
   * [7cb1749] views.py: Crontab to non-route DefaultView.
   * [a547264] views.py: Builders to non-route custom View.
   * [c6a7429] views.py: Chroots to non-route custom View.
   * [0f32b48] crontab/index.html: Fix page layout.
   * [80c7512] views.py: Update RouteView to DefaultView.
   * [a6f8a30] html: events, builds, repositories: Add header+nav back
     (from soon obsoleted route.html).
   * [56c9493] html: API popup: Add JSON link.
   * [7444710] close.svg: Update with more transparent variant (from
     opencliparts).
   * [918aca2] devel (mbd_installdeps): Add curl.
   * [3f28be1] devel (tidy): curl: Fix: Make curl fail when HTTP request
     fails (!= 200).
   * [5167183] views.py, ...: Update error templates.
   * [0783ffc] builders/index.html (Builders): Fix remote status link.
   * [2042719] urls.py: Only add explicit "routes". Skip adding static
     routes.
   * [637eb46] views.py: Update RouteView to do file/dir again.
   * [8404f8b] urls.py: Fix route adding to work for doctests.
   * [62cb303] repositories/index.html: Fix "browse" link.
   * [f11034e] webapp.py (WebApp): Add (commented) code to show
     'diffsettings' (for debugging).
   * [22cd3a8] builtins.py (PlainFilter): Fix (non-existing) 'mbd-critical'
     CSS class to 'mbd-error'.
   * [482c741] views.py (DirView): Add DirView, and update "log" to use it.
   * [c4e661f] urls.py: Add events-dir, builds-dir, repositories-dir
     (browsable).
   * [bbd01a9] urls.py: Rm auth support (auth now should be in views.py
     only, not needed for events,builds,repositories).
   * [96d1516] urls.py: Rm route object from RouteView.
   * [49efbf8] urls.py: Simplify code.
   * [bda357d] views.py (RouteView.get): Rm support for dir/file.
   * [5bf50b2] includes/events.html: Update to events-dir.
   * [624da60] views.py (TemplateView): Add generic parent template class;
     move 'since support'.
   * [a416d2b] views.py: events, builds, repositories: Each get separate
     view class.
   * [03ad4e2] urls.py (mbd_uri): Add URI helper && make code more
     readable.
   * [9771cb0] svg: Add 'up' (from opencliparts).
   * [e7d4473] views.py (EventsView): Update "events" to new class based
     regime w/ setup().
   * [0484426] views.py (BuildsView): Update "builds" to new class based
     regime w/ setup().
   * [28785bb] views.py: events/builds view: No need for extra "name" class
     attribute.
   * [afd2944] views.py (RouteView): Common view class for builds, events,
     repositories.
   * [3674de1] views.py (RepositoriesView): Update "repositories" to new
     class based regime w/ setup().
   * [29e546b] views.py: Update all remaining views to new class based
     regime w/ setup().
   * [28a4036] mini_buildd.css (body.mbd): Add left/right margins.
   * [eeb4442] urls.py: Add 'name' arg for *all* mini_buildd/ urls but API.
   * [7921bb6] crontab/index.html: Update header scheme.
   * [a129102] builders/index.html: Fix bogus h2 close.
   * [aea62bf] api: Cleanup template handling (snippets must be in
     includes, add/use default snippet include).
   * [1ca6d0f] views.py: Make 'defined-outside-init' pylint exception
     module-global (and add some notes).
   * [eb1e52d] views.py (APISnippets): Rename class, move outside View.
   * [4639723] views.py (APIView): Update to use setup().
   * [32f6c20] views.py: APIView: Update to use view class vars, not
     context.
   * [9877831] views.py (APIView): Move ApiSnippets back to APIView as
     Snippets.
   * [cd66c49] views.py (APIView.setup): Code cosmetics.
   * [4aab930] templates: Remove obsoleted routes.html, file/index.html.
   * [e66935e] httpd.py: Switch back to plain twisted DirectoryLister (now
     that we have django DirView).
   * [3842fcd] httpd.py: Actually remove all custom DirectoryLister code.
   * [58f518a] devel (tidy): Rm pure static tests -- is now native twisted,
     does not comply and we can't fix it.
   * [f2a5f83] devel (tidy): Add tests for new self-made DirView routes.
   * [60503e4] django 3.2: Add SECRET_KEY for pseudo-config as well.
   * [8ba72c4] builds,repositories,events/index.html: Sync headers to be
     generic.
   * [1627de5] dir/index.html: Fix "Up" menu.
   * [84dfbcc] dir/index.html: Fix file view (partly).
   * [646218f] base_path.html: Add base template for
     builds,events,repositories (common main title/header).
   * [437b0ff] log/index.html: Rm, now done with DirView.
   * [a0ff9a6] dir/index.html: Cosmetic fixes.
   * [2c770d4] dir/index.html: Merge includes/dir.html (only used here).
   * [4a23e7a] templates: dir/index.html -> dir.html (this is no explicit
     route).
   * [aacb3e2] dir.html: Skip section header.
   * [5178bb5] html/templates: Rename "plain" -> "file".
   * [44e9045] tags/file.html: "download_uri" -> uri (no special 'download'
     support any more).
   * [d754e81] tags/file.html: No need for default contents value.
   * [74d966f] svg: Add "download" (from openclipart).
   * [0bae45c] tags/file.html: "Raw File" -> Download.
   * [fe1d05b] dir.html: Fix uri of file.
   * [526c757] tags/file.html: Use "a", not button for clipboard (make menu
     items same layout).
   * [c3f55d1] views.py, builtins.py: Fixup plain view.
   * [4c6480a] config.py: Add new Uri kind "dir".
   * [6b48845] urls.py: Rename "name" kwargs (per default also template
     context) to "route".
   * [40ef4d9] urls.py, config.py (Uri): Move support for 'django path
     regex' to Uri class.
   * [438a1e4] config.py: Document special meanings of 'view', 'dir' and
     'static' uris.
   * [4e18231] builtins.py (PlainFilter): doc fixes for sphinx build.
   * [7289b96] urls.py: Use mbd_path for mini_buildd paths.
   * [9440b3a] base.html: Use django's "url" where possible.
   * [714a9f7] tags/datatable.html: Set style/classes (once) via js.
   * [6fd8842] builtins.py: mbd_dirname -> mbd_parent, properly 'implement'
     w/ pathlib.
   * [23684b1] svg: Add top (from opencliparts), rename index->view.
   * [f2e7cf4] urls.py: Update route/dir menus.
   * [1f4cc19] builtins.py: Add helper: mbd_fromtimestamp.
   * [ead4a95] dir.html: Add 'size' && 'modified' columns to table.
   * [b100f22] dir.html: Only use add 'view' link if it exists.
   * [ebbc2d4] tags/datatable.html: Generally enable the "stateSave"
     option.
   * [387631d] builtins.py: Add mbd_hash: To create persistent but HTML/JS
     compatible id strings.
   * [fb97c4b] events: Use mbd_hash for datatable id's (makes state
     actually persistent).
   * [110511f] builds/index.html: Update to mbd_hash (effectively makes
     datatable state persistent).
   * [06a035a] changes.py (Changes.to_event_json): Fix "changes" (for
     changes w/ multiple archs).
   * [074138a] since param: Simplify && only use the browser builtin.
   * [431adb6] html: Update base.html once again: Include main header, make
     configurable via blocks.
   * [381e004] views.py (BuildsView.setup): Fixup buildlog uris.
   * [b213b26] base, dir.html: Fix dir menus.
   * [70ca15d] repositories/index.html: Fixup main menu.
   * [2dd6536] repositories/index.html: Upgrade to datatables && major
     general fixes.
   * [43fa532] repositories/index.html: Fix title (this view does not use
     path).
   * [ffc9f2a] repositories/index.html: Fixup datatable search options.
   * [8c25110] tags/file.html: Remove link to 'real-raw' static browse.
   * [560a8dc] tags/file.html: Improve content display handling when None.
   * [2fd3d54] base.html: Menu: Don't show 'view switch' when file is
     displayed.
   * [339649d] devel (hack-html): start: Sufficient to only restart
     service.
   * [990adf2] html: Fix power on/off indicators.
   * [3efc240] crontab/index.html: Rm menu 'remote' (falsely copied).
   * [d2e413c] django_settings.py: django 3.2: Add DEFAULT_AUTO_FIELD to
     settings.
   * [02befd2] base.html: django 3.2: Drop (two) uses if 'ifequal' (now
     depcrecated).
   * [a8be4fc] admin/base_site.html: Use url tag for home uri.
   * [ab1a45f] mini_buildd.css (img.mbd-icon): Make icon size slightly
     bigger.
   * [e295722] Revert "Distribution, Source, Component: Rm __hash__() from
     (sort support): Does not seem to be necessary."
   * [57e2eaf] distribution, source, component models: Simplify __hash__
     impl (also avoids pylint same-code warnings).
   * [ae5db3b] models/base.py: Add feedback (via messages) for admin
     actions.
   * [8fab58a] api.py (Status): Re-add 'remotes' to status (fixes remote
     linking).
   * [ec9a339] distribution.py (ArchitectureOptionInline): Fix: Hide
     'pickled_data'.
   * [2f17dba] files.py (Path.create): Add create() function.
   * [0e18250] changes.py (Changes.move_to): Fix: Create path path before
     moving files.
   * [f4728fb] mini_buildd.js: API call progress bar: Display api call info
     && make look somewhat better on ff.
   * [a14bb27] mini_buildd.css: minimal padding in section.
   * [6026b8f] gnupg.py (Builders): Skip extra generator.
   * [ca5ec57] models/gnupg.py (Builders): Add "ourselves" flag.
   * [6187a65] builders/index.html: Update remote status, error handling &&
     action.
   * [db81fde] client.py (Client.api): Improve error handling for non-HTTP
     urllib exceptions.
   * [a586676] chroots/index.html: Fix actions to menu && fix link to
     change specific item directly.
   * [a4cd5cd] mini_buildd.css: Make 'a' inherit color 'everywhere mbd'.
   * [5785519] builders/index.html: Add direct per-object configure link.
   * [f37e2c9] builders/index.html: Update to new status meanings &&
     general improvements.
   * [ceb25ae] values.py: Add ALL_REMOTES.
   * [9fe11a1] base.html: Instance id to footer (do we can identify the
     instance on any page).
   * [2c9990f] models/gnupg.py (Remote): Enable "wake_command".
   * [a8efbf6] api.py: Add "wake" API call (wake remotes).
   * [910cf48] builders/index.html: Add wake (remote) API call.
   * [0617681] builders/chroots/repositories/index.html: Add convenience
     configure links.
   * [54aed90] *.html: Update all "admin" links to url template.
   * [82eb1d9] devel (mbd_installdeps): (buster convenience) Install ftp if
     ftp-ssl fails.
   * [c8ab55d] debian/control (Build-Depends): We need version 1.0 of
     distro-info (for lts options).
   * [aac0fd4] pylint 2.11: Cosmetic (use fstring).
   * [e211fbf] pylint 2.11: Update mbd_action call (fixes --remove-system-
     artifacts).
   * [02879f6] pylint 2.11: models/base.py: Improve comparison.
   * [e248636] pylint 2.11: Daemon.check(): Update mbd_action call (fixes
     check cronjob).
   * [fd24a28] devel: Generalize pip installs (via MBD_PIPINSTALL global
     config).
   * [4b44301] devel (mbd_pipinstall): Remove "importchecker" check.
   * [b030f08] devel: Update notes for MBD_PIPINSTALL.
   * [ca6584d] cron.py (_Job.id): Add id (name+type) for jobs && a getter
     from id.
   * [5d93ca8] values.py: Add value: ALL_CRONJOBS.
   * [9430066] cron.py: Add run() (for arbitrary runs outside of schedule).
   * [6acf657] cron.py (_Job.__run): Protect from running in parallel.
   * [245e9a7] api.py (Cronjob): Add new API call 'cronjob'.
   * [25d407b] crontab/index.html: Improve view && add cronjob API call
     (arbitraryily call cron job).
   * [0905f11] crontab/index.html: Use dataTables to show logs.
   * [68d4096] files.py: Move open_utf8() -> __init__.
   * [babcfee] __init__.py (fopen): open_utf8() -> fopen().
   * [af4bf14] pylint 2.11: Update all 'open' to use 'mini_buildd.fopen'
     (fixes open-without-encoding).
   * [7739c37] pylint 2.11: Fixup multiple 'open-like' calls to use "with".
   * [89ed0e7] mini_buildd.css: Add !important to basic 'indicator'
     classes.
   * [5c01199] net.py (ClientEndpoint.urlopen): Support timeout.
   * [648ff6f] client.py (Client.api): Support timeout.
   * [c18e10b] gnupg.py (Remote.mbd_get_status): Limit retrieval time to 2
     seconds.
   * [b5dea5d] builtins.py (mbd_file): Add support for custom title (and
     default to "Data", not "Plain").
   * [b85f107] builders/index.html: Fix bogus table order (we just want no
     default order).
   * [6faaded] builders/index.html: Provide status (json) data as details,
     omit extra status call.
   * [875211f] models/gnupg.py (Remote.mbd_get_status): Put all the wake
     logic here.
   * [2840a38] models/gnupg.py (Builders): Add "wake support".
   * [64f3829] changes.py (Upload.request_builds): Wake remotes on builds.
   * [cbbeb93] api.py (Wake): Don't use list of remotes (--remotes ->
     --remote), use new mbd_get_status().
   * [f956e8e] models/gnupg.py (Remote.mbd_api): Add helper mbd_api().
   * [8b9f8f9] api.py (Setup): Add support for remotes.
   * [d081d6b] models/gnupg.py (Remote): Wake on prepare and check.
   * [5068904] api.py (Setup.setup_remotes): Fix: Don't call mbd_pca_all()
     in loop.
   * [e73827c] setup.cfg (generated-members): Add mbd_pca_all().
   * [6ce3796] devel.localhost: Add script to create "second" instance.
   * [d315e20] devel (mbd_installdeps): Add piuparts, autopkgtest.
   * [20ed90c] builders/index.html: Remote link: Directly jump to
     'builders/' (not home).
   * [93d2736] devel: Fix number of places where $(hostname) was used
     instead of ${MBD_HOSTNAME}.
   * [8d17b21] devel (bash-completion): Add ./devel.localhost to completion
     commands.
   * [13c4ef9] devel (MBD_SETUP_COMMON_DESC): Add localhost:8068 as remote
     to setup.
   * [bb5290f] devel (testsuite-packages): Skip skipping rebuilding
     packages when already built.
   * [7abbb1a] devel.hostname: Add extra script for hostname (two instances
     on same network stack for testing).
   * [8a2d416] devel (testsuite-packages): Clean out possible debris via
     git.
   * [44318f2] debian/source/lintian-overrides: Workaround (temporary) for
     https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=995498.
   * [0f3376f] api.py (Argument.set): Improve error message on failed type.
   * [fa754fb] gnupg.py (BaseGnuPG.verify2_bare): Add verify2_bare() (for
     general (non-apt source) verifications).
   * [facb9c5] gnupg.py (BaseGnuPG.sign2): Add message signing support via
     py3-gpg.
   * [b63025c] models/gnupg.py (GnuPGPublicKey.mbd_verify): Add standalone
     message verification.
   * [4dad019] daemon.py (Daemon.handshake_message): Add signed handshake
     message generator.
   * [77d2c5e] api.py (Handshake): Add API command to realize a (gnupg)
     handshake.
   * [7c57246] models/gnupg.py (Remote.mbd_check): Add (gnupg) handshake.
   * [6b8097f] gnupg.py: Get rid of odd '*2 names', rather prefix w/
     'gpgme_'.
   * [7d4e987] gnupg.py (BaseGnuPG.gpgme_verify): Provide public errors on
     GPG verify errors.
   * [7de7802] gnupg.py: make all gpg_* methods expect 'str' (&& do
     conversions internally only).
Checksums-Sha1:
 8ba7c825f92b3a8b9a004b35a4d881b452b5a576 2325 mini-buildd_1.9.90.dsc
 dd02b14212243d219f85a07ff844b7d9794e16b3 516788 mini-buildd_1.9.90.tar.xz
 714677dff355798ba740e7cb07cb2355e4b390f6 10987 mini-buildd_1.9.90_source.buildinfo
Checksums-Sha256:
 57c3baf6fb968c01fe2a2273e46739814f5861bfd64fd544f95ab2ea927b4d2a 2325 mini-buildd_1.9.90.dsc
 5399522ebcc7078892caec4cc9a55923458ca741820508451d0e2ebd3c48842b 516788 mini-buildd_1.9.90.tar.xz
 76d43238b5137574c81fa8f46f7dfc7716fcfe60b69df4c84cebf18da9bceaa5 10987 mini-buildd_1.9.90_source.buildinfo
Files:
 a7775c874cd9a37b4a8ffc1e70be5961 2325 devel optional mini-buildd_1.9.90.dsc
 268436c54de1f52db59f00e802989041 516788 devel optional mini-buildd_1.9.90.tar.xz
 d6bea6ff7f45aa5804cb206621b0b00d 10987 devel optional mini-buildd_1.9.90_source.buildinfo

-----BEGIN PGP SIGNATURE-----

iQJGBAEBCgAwFiEEVOttCJ+jfBmmRZCzBm3oAX4rYdkFAmFj90cSHGFic3VyZEBk
ZWJpYW4ub3JnAAoJEAZt6AF+K2HZzD8P/iurkqze7FdU4eOQS+Osq9GkZN/b7C1i
zIGq0BlVz+M8ZDNv+7MfbUoCaun5In9+1J5E+msAEPnR6X11sYjKdyElMy7jFFXr
lIsZmUpwjdgYse6INNQWFtY6C+TTCajgbv/mYCHXIvmlOwL6HKb/JQ+ejLpLIQ4R
nqht3c+TU8RkqA5BunGm+uLjRdfle3+xjsnRz099zxYRAdYg9UK7+S87/kBG36oK
rXJtpe3VC829AP0crK2TFgG/cDLlZoQ2nQIaapQcOgBPq24wjoOKGCkGl/MKKsW/
0XfaG4vBnz3Z3aOo5DwpoqZ8xqHeH5X8Zivf8Yf2cShgjNnuoWfdo8JusfvW8SYk
s7WzRzap0h2RCDcX6lyZyegjGVU98ml2Lf61fk5Iz8VZFGvrtdW2jDdRlX3vZhBG
Lc/pV/Lp4nyaFDEvNcPvBd1E17/LI5ms8ZXU6eIEDncJxgkYdBUBywy0maTCTkt3
4fBGRhyegtHD1o3aKgsTY6oWhgnaSIKG8hFbziS4es1SR1v63as/bF1/EQd+sf8h
89lJLZB7LscyFsLC0k4hwVhqN8gChwFGCwaHJ6q/UHsElbBpK8MD/MrvEYQnBreG
8t7ogJKbyD2dp2ycmRS7N5eYZiiYCwMWdxQuEMfUhhQ/Aws8rnp1KPh8SQi7Stx4
7tup6DiVWJAF
=iIVP
-----END PGP SIGNATURE-----