-----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-----