summaryrefslogtreecommitdiff
path: root/gnu/packages/patches
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2021-09-07 11:04:44 +0200
committerLudovic Courtès <ludo@gnu.org>2021-09-07 14:19:08 +0200
commitd9dfbf886ddbb92dfdaa118bb9765e78aad5c53a (patch)
tree2732020de20a38c09b66a60b0cb36022799f7c2e /gnu/packages/patches
parentb949f34f31a045eb0fb242b81a223178fb6994d3 (diff)
parent49922efb11da0f0e9d4f5979d081de5ea8c99d25 (diff)
Merge branch 'master' into core-updates-frozen
Diffstat (limited to 'gnu/packages/patches')
-rw-r--r--gnu/packages/patches/adb-libssl_11-compatibility.patch35
-rw-r--r--gnu/packages/patches/beets-werkzeug-compat.patch18
-rw-r--r--gnu/packages/patches/mailutils-variable-lookup.patch26
-rw-r--r--gnu/packages/patches/minetest-add-MINETEST_MOD_PATH.patch156
-rw-r--r--gnu/packages/patches/ocaml-ppx-variants-ppxlib-api-change.patch42
-rw-r--r--gnu/packages/patches/python-execnet-read-only-fix.patch77
-rw-r--r--gnu/packages/patches/python-mediafile-wavpack.patch57
-rw-r--r--gnu/packages/patches/python-pyan3-fix-absolute-path-bug.patch160
-rw-r--r--gnu/packages/patches/python-pyan3-fix-positional-arguments.patch22
-rw-r--r--gnu/packages/patches/python-pytest-asyncio-python-3.8.patch238
-rw-r--r--gnu/packages/patches/u-boot-nintendo-nes-serial.patch14
11 files changed, 770 insertions, 75 deletions
diff --git a/gnu/packages/patches/adb-libssl_11-compatibility.patch b/gnu/packages/patches/adb-libssl_11-compatibility.patch
new file mode 100644
index 0000000000..9affe58b5d
--- /dev/null
+++ b/gnu/packages/patches/adb-libssl_11-compatibility.patch
@@ -0,0 +1,35 @@
+This patch is taken from Debian
+URL: https://sources.debian.org/data/main/a/android-platform-system-core/1%3A7.0.0%2Br33-1/debian/patches/adb_libssl_11.diff
+Description: adb: Make compatible with openssl 1.1
+ OpenSSL version 1.1 brought some API changes which broke the build here,
+ fix that by accessing rsa->n (and e) directly, using RSA_get0_key instead.
+Author: Chirayu Desai <chirayudesai1@gmail.com
+Last-Update: 2016-11-10
+--- a/adb/adb_auth_host.cpp
++++ b/adb/adb_auth_host.cpp
+@@ -71,6 +71,7 @@
+ BIGNUM* rem = BN_new();
+ BIGNUM* n = BN_new();
+ BIGNUM* n0inv = BN_new();
++ BIGNUM* e = BN_new();
+
+ if (RSA_size(rsa) != RSANUMBYTES) {
+ ret = 0;
+@@ -78,7 +79,7 @@
+ }
+
+ BN_set_bit(r32, 32);
+- BN_copy(n, rsa->n);
++ RSA_get0_key(rsa, &n, &e, NULL);
+ BN_set_bit(r, RSANUMWORDS * 32);
+ BN_mod_sqr(rr, r, n, ctx);
+ BN_div(NULL, rem, n, r32, ctx);
+@@ -92,7 +93,7 @@
+ BN_div(n, rem, n, r32, ctx);
+ pkey->n[i] = BN_get_word(rem);
+ }
+- pkey->exponent = BN_get_word(rsa->e);
++ pkey->exponent = BN_get_word(e);
+
+ out:
+ BN_free(n0inv);
diff --git a/gnu/packages/patches/beets-werkzeug-compat.patch b/gnu/packages/patches/beets-werkzeug-compat.patch
deleted file mode 100644
index 1a91c3a3f9..0000000000
--- a/gnu/packages/patches/beets-werkzeug-compat.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-Be compatible with python-werkzeug 1.0.0.
-
-Taken from upstream:
-https://github.com/beetbox/beets/commit/d43d54e21cde97f57f19486925ab56b419254cc8
-
-diff --git a/beetsplug/web/__init__.py b/beetsplug/web/__init__.py
-index f53fb3a954..21ff5d94ed 100644
---- a/beetsplug/web/__init__.py
-+++ b/beetsplug/web/__init__.py
-@@ -169,7 +169,7 @@ def to_python(self, value):
- return ids
-
- def to_url(self, value):
-- return ','.join(value)
-+ return ','.join(str(v) for v in value)
-
-
- class QueryConverter(PathConverter):
diff --git a/gnu/packages/patches/mailutils-variable-lookup.patch b/gnu/packages/patches/mailutils-variable-lookup.patch
new file mode 100644
index 0000000000..0069f3596d
--- /dev/null
+++ b/gnu/packages/patches/mailutils-variable-lookup.patch
@@ -0,0 +1,26 @@
+Have 'send-message' look up 'mu-debug' & co. in the right
+module: <https://issues.guix.gnu.org/49968>.
+
+Submitted: https://lists.gnu.org/archive/html/bug-mailutils/2021-09/msg00000.html
+
+---
+ include/mailutils/guile.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/include/mailutils/guile.h b/include/mailutils/guile.h
+index f05550678..47f89db39 100644
+--- a/include/mailutils/guile.h
++++ b/include/mailutils/guile.h
+@@ -20,7 +20,8 @@
+
+ #include <libguile.h>
+
+-#define MU_SCM_SYMBOL_VALUE(p) SCM_VARIABLE_REF(scm_c_lookup(p))
++#define MU_SCM_SYMBOL_VALUE(p) \
++ (scm_c_public_ref ("mailutils mailutils", p))
+
+ typedef struct
+ {
+--
+2.33.0
+
diff --git a/gnu/packages/patches/minetest-add-MINETEST_MOD_PATH.patch b/gnu/packages/patches/minetest-add-MINETEST_MOD_PATH.patch
new file mode 100644
index 0000000000..a74034a2c5
--- /dev/null
+++ b/gnu/packages/patches/minetest-add-MINETEST_MOD_PATH.patch
@@ -0,0 +1,156 @@
+From d10ea2ad7efc2364a8a2007b4c6d3e85511e2f84 Mon Sep 17 00:00:00 2001
+From: Maxime Devos <maximedevos@telenet.be>
+Date: Tue, 3 Aug 2021 01:00:23 +0200
+Subject: [PATCH] Add environment variable MINETEST_MOD_PATH
+
+This adds an environment variable MINETEST_MOD_PATH.
+When it exists, Minetest will look there for mods
+in addition to ~/.minetest/mods/. Mods can still be
+installed to ~/.minetest/mods/ with the built-in installer.
+
+With thanks to Leo Prikler.
+---
+ builtin/mainmenu/pkgmgr.lua | 7 +++----
+ doc/menu_lua_api.txt | 8 +++++++-
+ src/content/subgames.cpp | 11 +++++++++++
+ src/script/lua_api/l_mainmenu.cpp | 23 +++++++++++++++++++++++
+ src/script/lua_api/l_mainmenu.h | 2 ++
+ 5 files changed, 46 insertions(+), 5 deletions(-)
+
+diff --git a/builtin/mainmenu/pkgmgr.lua b/builtin/mainmenu/pkgmgr.lua
+index 787936e31..d8fba0ebe 100644
+--- a/builtin/mainmenu/pkgmgr.lua
++++ b/builtin/mainmenu/pkgmgr.lua
+@@ -682,10 +682,9 @@ function pkgmgr.preparemodlist(data)
+ local game_mods = {}
+
+ --read global mods
+- local modpath = core.get_modpath()
+-
+- if modpath ~= nil and
+- modpath ~= "" then
++ local modpaths = core.get_modpaths()
++ --XXX what was ‘modpath ~= ""’ and ‘modpath ~= nil’ for?
++ for _,modpath in ipairs(modpaths) do
+ get_mods(modpath,global_mods)
+ end
+
+diff --git a/doc/menu_lua_api.txt b/doc/menu_lua_api.txt
+index b3975bc1d..132444b14 100644
+--- a/doc/menu_lua_api.txt
++++ b/doc/menu_lua_api.txt
+@@ -218,7 +218,13 @@ Package - content which is downloadable from the content db, may or may not be i
+ * returns path to global user data,
+ the directory that contains user-provided mods, worlds, games, and texture packs.
+ * core.get_modpath() (possible in async calls)
+- * returns path to global modpath
++ * returns path to global modpath, where mods can be installed
++* core.get_modpaths() (possible in async calls)
++ * returns list of paths to global modpaths, where mods have been installed
++
++ The difference with "core.get_modpath" is that no mods should be installed in these
++ directories by Minetest -- they might be read-only.
++
+ * core.get_clientmodpath() (possible in async calls)
+ * returns path to global client-side modpath
+ * core.get_gamepath() (possible in async calls)
+diff --git a/src/content/subgames.cpp b/src/content/subgames.cpp
+index e9dc609b0..d73f95a1f 100644
+--- a/src/content/subgames.cpp
++++ b/src/content/subgames.cpp
+@@ -61,6 +61,12 @@ std::string getSubgamePathEnv()
+ return subgame_path ? std::string(subgame_path) : "";
+ }
+
++std::string getModPathEnv()
++{
++ char *mod_path = getenv("MINETEST_MOD_PATH");
++ return mod_path ? std::string(mod_path) : "";
++}
++
+ SubgameSpec findSubgame(const std::string &id)
+ {
+ if (id.empty())
+@@ -110,6 +116,11 @@ SubgameSpec findSubgame(const std::string &id)
+ std::set<std::string> mods_paths;
+ if (!user_game)
+ mods_paths.insert(share + DIR_DELIM + "mods");
++
++ Strfnd mod_search_paths(getModPathEnv());
++ while (!mod_search_paths.at_end())
++ mods_paths.insert(mod_search_paths.next(PATH_DELIM));
++
+ if (user != share || user_game)
+ mods_paths.insert(user + DIR_DELIM + "mods");
+
+diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp
+index 3e9709bde..903ac3a22 100644
+--- a/src/script/lua_api/l_mainmenu.cpp
++++ b/src/script/lua_api/l_mainmenu.cpp
+@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
+ #include "lua_api/l_internal.h"
+ #include "common/c_content.h"
+ #include "cpp_api/s_async.h"
++#include "util/strfnd.h"
+ #include "gui/guiEngine.h"
+ #include "gui/guiMainMenu.h"
+ #include "gui/guiKeyChangeMenu.h"
+@@ -502,6 +503,26 @@ int ModApiMainMenu::l_get_modpath(lua_State *L)
+ return 1;
+ }
+
++/******************************************************************************/
++int ModApiMainMenu::l_get_modpaths(lua_State *L)
++{
++ const char *c_modpath = getenv("MINETEST_MOD_PATH");
++ if (c_modpath == NULL)
++ c_modpath = "";
++ int index = 1;
++ lua_newtable(L);
++ Strfnd mod_search_paths{std::string(c_modpath)};
++ while (!mod_search_paths.at_end()) {
++ std::string component = mod_search_paths.next(PATH_DELIM);
++ lua_pushstring(L, component.c_str());
++ lua_rawseti(L, -2, index);
++ index++;
++ }
++ ModApiMainMenu::l_get_modpath(L);
++ lua_rawseti(L, -2, index);
++ return 1;
++}
++
+ /******************************************************************************/
+ int ModApiMainMenu::l_get_clientmodpath(lua_State *L)
+ {
+@@ -949,6 +970,7 @@ void ModApiMainMenu::Initialize(lua_State *L, int top)
+ API_FCT(get_mapgen_names);
+ API_FCT(get_user_path);
+ API_FCT(get_modpath);
++ API_FCT(get_modpaths);
+ API_FCT(get_clientmodpath);
+ API_FCT(get_gamepath);
+ API_FCT(get_texturepath);
+@@ -983,6 +1005,7 @@ void ModApiMainMenu::InitializeAsync(lua_State *L, int top)
+ API_FCT(get_mapgen_names);
+ API_FCT(get_user_path);
+ API_FCT(get_modpath);
++ API_FCT(get_modpaths);
+ API_FCT(get_clientmodpath);
+ API_FCT(get_gamepath);
+ API_FCT(get_texturepath);
+diff --git a/src/script/lua_api/l_mainmenu.h b/src/script/lua_api/l_mainmenu.h
+index 33ac9e721..a6a54a2cb 100644
+--- a/src/script/lua_api/l_mainmenu.h
++++ b/src/script/lua_api/l_mainmenu.h
+@@ -112,6 +112,8 @@ class ModApiMainMenu: public ModApiBase
+
+ static int l_get_modpath(lua_State *L);
+
++ static int l_get_modpaths(lua_State *L);
++
+ static int l_get_clientmodpath(lua_State *L);
+
+ static int l_get_gamepath(lua_State *L);
+--
+2.32.0
+
diff --git a/gnu/packages/patches/ocaml-ppx-variants-ppxlib-api-change.patch b/gnu/packages/patches/ocaml-ppx-variants-ppxlib-api-change.patch
new file mode 100644
index 0000000000..b437bfb061
--- /dev/null
+++ b/gnu/packages/patches/ocaml-ppx-variants-ppxlib-api-change.patch
@@ -0,0 +1,42 @@
+From 6103f6fc56f978c847ba7c1f2d9f38ee93a5e337 Mon Sep 17 00:00:00 2001
+From: Sonja Heinze <sonjaleaheinze@gmail.com>
+Date: Tue, 9 Mar 2021 12:57:47 +0100
+Subject: [PATCH] Adapt to Ppxlib's API change
+
+Ppxlib is removing Lexer.keyword_table from the API in exchange for
+the more lightweight Keyword.is_keyword.
+
+Signed-off-by: Sonja Heinze <sonjaleaheinze@gmail.com>
+---
+Patch from <https://github.com/janestreet/ppx_variants_conv/pull/9>.
+
+ ppx_variants_conv.opam | 2 +-
+ src/ppx_variants_conv.ml | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/ppx_variants_conv.opam b/ppx_variants_conv.opam
+index 7e7148d..b56040f 100644
+--- a/ppx_variants_conv.opam
++++ b/ppx_variants_conv.opam
+@@ -15,7 +15,7 @@ depends: [
+ "base" {>= "v0.14" & < "v0.15"}
+ "variantslib" {>= "v0.14" & < "v0.15"}
+ "dune" {>= "2.0.0"}
+- "ppxlib" {>= "0.14.0"}
++ "ppxlib" {>= "0.23.0"}
+ ]
+ synopsis: "Generation of accessor and iteration functions for ocaml variant types"
+ description: "
+diff --git a/src/ppx_variants_conv.ml b/src/ppx_variants_conv.ml
+index 8d60086..112fc78 100644
+--- a/src/ppx_variants_conv.ml
++++ b/src/ppx_variants_conv.ml
+@@ -66,7 +66,7 @@ end
+
+ let variant_name_to_string v =
+ let s = String.lowercase v in
+- if Caml.Hashtbl.mem Lexer.keyword_table s
++ if Keyword.is_keyword s
+ then s ^ "_"
+ else s
+
diff --git a/gnu/packages/patches/python-execnet-read-only-fix.patch b/gnu/packages/patches/python-execnet-read-only-fix.patch
new file mode 100644
index 0000000000..58a4b129a7
--- /dev/null
+++ b/gnu/packages/patches/python-execnet-read-only-fix.patch
@@ -0,0 +1,77 @@
+From 0d6562a20b0610c5a83d1c66ac879223b84a2746 Mon Sep 17 00:00:00 2001
+From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
+Date: Thu, 26 Aug 2021 00:43:26 -0400
+Subject: [PATCH] rsync_remote: Fix a problem when receiving read-only
+ directories.
+
+Before this change, when the source directories hierarchy was
+read-only, the read-only mode would be preserved at the destination,
+preventing child directories to be recreated by a normal user (a
+permission denied error, EACCES would be raised).
+
+* execnet/rsync_remote.py (serve_rsync.receive_directory_structure):
+Bitwise OR to ensure the write bit is set on received directories.
+* testing/test_rsync.py (TestRSync)
+<test_read_only_directories>: New test.
+---
+ execnet/rsync_remote.py | 8 ++++++--
+ testing/test_rsync.py | 17 +++++++++++++++++
+ 2 files changed, 23 insertions(+), 2 deletions(-)
+
+diff --git a/execnet/rsync_remote.py b/execnet/rsync_remote.py
+index cd5e765..55d154c 100644
+--- a/execnet/rsync_remote.py
++++ b/execnet/rsync_remote.py
+@@ -35,7 +35,11 @@ def serve_rsync(channel):
+ os.makedirs(path)
+ mode = msg.pop(0)
+ if mode:
+- os.chmod(path, mode)
++ # Ensure directories are writable, otherwise a
++ # permission denied error (EACCES) would be raised
++ # when attempting to receive read-only directory
++ # structures.
++ os.chmod(path, mode | 0o700)
+ entrynames = {}
+ for entryname in msg:
+ destpath = os.path.join(path, entryname)
+@@ -59,7 +63,7 @@ def serve_rsync(channel):
+ checksum = md5(f.read()).digest()
+ f.close()
+ elif msg_mode and msg_mode != st.st_mode:
+- os.chmod(path, msg_mode)
++ os.chmod(path, msg_mode | 0o700)
+ return
+ else:
+ return # already fine
+diff --git a/testing/test_rsync.py b/testing/test_rsync.py
+index 995f229..1d6c30c 100644
+--- a/testing/test_rsync.py
++++ b/testing/test_rsync.py
+@@ -157,6 +157,23 @@ class TestRSync:
+ mode = destdir.stat().mode
+ assert mode & 511 == 504
+
++ @py.test.mark.skipif("sys.platform == 'win32' or getattr(os, '_name', '') == 'nt'")
++ def test_read_only_directories(self, dirs, gw1):
++ source = dirs.source
++ dest = dirs.dest1
++ source.ensure("sub", "subsub", dir=True)
++ source.join("sub").chmod(0o500)
++ source.join("sub", "subsub").chmod(0o500)
++
++ # The destination directories should be created with the write
++ # permission forced, to avoid raising an EACCES error.
++ rsync = RSync(source)
++ rsync.add_target(gw1, dest)
++ rsync.send()
++
++ assert dest.join("sub").stat().mode & 0o700
++ assert dest.join("sub").join("subsub").stat().mode & 0o700
++
+ @needssymlink
+ def test_symlink_rsync(self, dirs, gw1):
+ source = dirs.source
+--
+2.32.0
+
diff --git a/gnu/packages/patches/python-mediafile-wavpack.patch b/gnu/packages/patches/python-mediafile-wavpack.patch
deleted file mode 100644
index 9839fe87b5..0000000000
--- a/gnu/packages/patches/python-mediafile-wavpack.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-This patch has already been applied upstream, but is not included in the
-current release 0.6.0.
-
-From d2fc3b59f77c515b02dfe7ad936f89264375d2b4 Mon Sep 17 00:00:00 2001
-From: Adrian Sampson <adrian@radbox.org>
-Date: Wed, 29 Jul 2020 19:42:57 -0400
-Subject: [PATCH] Fix test for WavPack bitrate
-
-Fixes #34.
----
- docs/index.rst | 5 +++++
- mediafile.py | 2 +-
- test/test_mediafile.py | 2 +-
- 3 files changed, 7 insertions(+), 2 deletions(-)
-
-diff --git a/docs/index.rst b/docs/index.rst
-index 7b622df..1465405 100644
---- a/docs/index.rst
-+++ b/docs/index.rst
-@@ -100,6 +100,11 @@ Internals
- Changelog
- ---------
-
-+v0.7.0
-+''''''
-+
-+- Mutagen 1.45.0 or later is now required.
-+
- v0.6.0
- ''''''
-
-diff --git a/mediafile.py b/mediafile.py
-index 23fadaf..9e9d063 100644
---- a/mediafile.py
-+++ b/mediafile.py
-@@ -56,7 +56,7 @@
- import six
-
-
--__version__ = '0.6.0'
-+__version__ = '0.7.0'
- __all__ = ['UnreadableFileError', 'FileTypeError', 'MediaFile']
-
- log = logging.getLogger(__name__)
-diff --git a/test/test_mediafile.py b/test/test_mediafile.py
-index e9e1850..7f17f44 100644
---- a/test/test_mediafile.py
-+++ b/test/test_mediafile.py
-@@ -907,7 +907,7 @@ class WavpackTest(ReadWriteTestBase, unittest.TestCase):
- 'bitrate': 109312,
- 'format': u'WavPack',
- 'samplerate': 44100,
-- 'bitdepth': 0,
-+ 'bitdepth': 16,
- 'channels': 1,
- }
-
diff --git a/gnu/packages/patches/python-pyan3-fix-absolute-path-bug.patch b/gnu/packages/patches/python-pyan3-fix-absolute-path-bug.patch
new file mode 100644
index 0000000000..0b6a083fa3
--- /dev/null
+++ b/gnu/packages/patches/python-pyan3-fix-absolute-path-bug.patch
@@ -0,0 +1,160 @@
+From ac1bd55d07fd1bad2f4a92dc0809607c407d9140 Mon Sep 17 00:00:00 2001
+From: "Maciej A. Czyzewski" <maciejanthonyczyzewski@gmail.com>
+Date: Wed, 9 Jun 2021 15:29:18 +0200
+Subject: [PATCH] feature: new params for graphviz + solves #70
+
+- solve abs path bug #70
+- new params for graphviz (ranksep; layout)
+- tested layout `dot`; `fdp` (square graph)
+- updated `.gitignore` (files gen. after `visualize_pyan_architecture.sh`)
+---
+ .gitignore | 5 ++++
+ README.md | 6 ++--
+ pyan/main.py | 55 +++++++++++++++++++++++++++++++---
+ visualize_pyan_architecture.sh | 5 ++++
+ 4 files changed, 64 insertions(+), 7 deletions(-)
+
+diff --git a/.gitignore b/.gitignore
+index 990fdc0c..93313aaf 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -162,3 +162,8 @@ htmlcov
+ .idea/
+ .history/
+ .vscode/
++
++# our vis. of architecture
++architecture.dot
++architecture.html
++architecture.svg
+diff --git a/README.md b/README.md
+index d1f19dcf..9e6919a3 100644
+--- a/README.md
++++ b/README.md
+@@ -48,7 +48,7 @@ See `pyan3 --help`.
+
+ Example:
+
+-`pyan *.py --uses --no-defines --colored --grouped --annotated --dot >myuses.dot`
++`pyan3 *.py --uses --no-defines --colored --grouped --annotated --dot >myuses.dot`
+
+ Then render using your favorite GraphViz filter, mainly `dot` or `fdp`:
+
+@@ -56,11 +56,11 @@ Then render using your favorite GraphViz filter, mainly `dot` or `fdp`:
+
+ Or use directly
+
+-`pyan *.py --uses --no-defines --colored --grouped --annotated --svg >myuses.svg`
++`pyan3 *.py --uses --no-defines --colored --grouped --annotated --svg >myuses.svg`
+
+ You can also export as an interactive HTML
+
+-`pyan *.py --uses --no-defines --colored --grouped --annotated --html > myuses.html`
++`pyan3 *.py --uses --no-defines --colored --grouped --annotated --html > myuses.html`
+
+ Alternatively, you can call `pyan` from a script
+
+diff --git a/pyan/main.py b/pyan/main.py
+index 5d079714..b1a16f63 100644
+--- a/pyan/main.py
++++ b/pyan/main.py
+@@ -141,6 +141,31 @@ def main(cli_args=None):
+ ),
+ )
+
++ parser.add_argument(
++ "--dot-ranksep",
++ default="0.5",
++ dest="ranksep",
++ help=(
++ "specifies the dot graph 'ranksep' property for "
++ "controlling desired rank separation, in inches. "
++ "Allowed values: [0.02 .. 1000.0]. "
++ "[dot only]"
++ ),
++ )
++
++ parser.add_argument(
++ "--graphviz-layout",
++ default="dot",
++ dest="layout",
++ help=(
++ "specifies the graphviz 'layout' property for "
++ "the name of the layout algorithm to use. "
++ "Allowed values: ['dot', 'neato', 'fdp', 'sfdp', 'twopi', 'circo']. "
++ "Recommended values: ['dot', 'fdp']. "
++ "[graphviz only]"
++ ),
++ )
++
+ parser.add_argument(
+ "-a",
+ "--annotated",
+@@ -159,7 +184,12 @@ def main(cli_args=None):
+
+ known_args, unknown_args = parser.parse_known_args(cli_args)
+
+- filenames = [fn2 for fn in unknown_args for fn2 in glob(fn, recursive=True)]
++
++ filenames = []
++ for fn in unknown_args:
++ for fn2 in glob(fn, recursive=True):
++ abs_fn2 = os.path.abspath(fn2)
++ filenames.append(abs_fn2)
+
+ # determine root
+ if known_args.root is not None:
+@@ -203,6 +233,11 @@ def main(cli_args=None):
+ handler = logging.FileHandler(known_args.logname)
+ logger.addHandler(handler)
+
++ logger.debug(f"[files] {unknown_args}")
++
++ if root:
++ root = os.path.abspath(root)
++
+ v = CallGraphVisitor(filenames, logger=logger, root=root)
+
+ if known_args.function or known_args.namespace:
+@@ -222,13 +257,25 @@ def main(cli_args=None):
+ writer = None
+
+ if known_args.dot:
+- writer = DotWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
++ writer = DotWriter(graph, options=[
++ "rankdir=" + known_args.rankdir,
++ "ranksep=" + known_args.ranksep,
++ "layout=" + known_args.layout,
++ ], output=known_args.filename, logger=logger)
+
+ if known_args.html:
+- writer = HTMLWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
++ writer = HTMLWriter(graph, options=[
++ "rankdir=" + known_args.rankdir,
++ "ranksep=" + known_args.ranksep,
++ "layout=" + known_args.layout,
++ ], output=known_args.filename, logger=logger)
+
+ if known_args.svg:
+- writer = SVGWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
++ writer = SVGWriter(graph, options=[
++ "rankdir=" + known_args.rankdir,
++ "ranksep=" + known_args.ranksep,
++ "layout=" + known_args.layout,
++ ], output=known_args.filename, logger=logger)
+
+ if known_args.tgf:
+ writer = TgfWriter(graph, output=known_args.filename, logger=logger)
+diff --git a/visualize_pyan_architecture.sh b/visualize_pyan_architecture.sh
+index 22c63342..81b6ca24 100755
+--- a/visualize_pyan_architecture.sh
++++ b/visualize_pyan_architecture.sh
+@@ -2,3 +2,8 @@
+ echo -ne "Pyan architecture: generating architecture.{dot,svg}\n"
+ python3 -m pyan pyan/*.py --no-defines --uses --colored --annotate --dot -V >architecture.dot 2>architecture.log
+ dot -Tsvg architecture.dot >architecture.svg
++echo -ne "Pyan architecture: generating architecture.{html,graphviz=fdp}\n"
++python3 -m pyan pyan/*.py --no-defines --uses \
++ --grouped --nested-groups \
++ --graphviz-layout fdp \
++ --colored --html > architecture.html
diff --git a/gnu/packages/patches/python-pyan3-fix-positional-arguments.patch b/gnu/packages/patches/python-pyan3-fix-positional-arguments.patch
new file mode 100644
index 0000000000..81923d7a41
--- /dev/null
+++ b/gnu/packages/patches/python-pyan3-fix-positional-arguments.patch
@@ -0,0 +1,22 @@
+From 37404bb039bd9c5509b4aec8f61e360dfba50715 Mon Sep 17 00:00:00 2001
+From: Wenxin Ling <w.ling@mediaire.de>
+Date: Mon, 1 Mar 2021 15:21:16 +0100
+Subject: [PATCH] Fix positional arguments issue for CallGraphVisitor
+
+---
+ pyan/main.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyan/main.py b/pyan/main.py
+index 18821a14..5d079714 100644
+--- a/pyan/main.py
++++ b/pyan/main.py
+@@ -203,7 +203,7 @@ def main(cli_args=None):
+ handler = logging.FileHandler(known_args.logname)
+ logger.addHandler(handler)
+
+- v = CallGraphVisitor(filenames, logger, root=root)
++ v = CallGraphVisitor(filenames, logger=logger, root=root)
+
+ if known_args.function or known_args.namespace:
+
diff --git a/gnu/packages/patches/python-pytest-asyncio-python-3.8.patch b/gnu/packages/patches/python-pytest-asyncio-python-3.8.patch
new file mode 100644
index 0000000000..519f92c047
--- /dev/null
+++ b/gnu/packages/patches/python-pytest-asyncio-python-3.8.patch
@@ -0,0 +1,238 @@
+# Modified to apply on 0.10.0.
+
+From c7a111180b3f35f2fe5a07ead185e4e792f9dfa0 Mon Sep 17 00:00:00 2001
+From: Andrew Svetlov <andrew.svetlov@gmail.com>
+Date: Thu, 9 Apr 2020 08:44:46 +0200
+Subject: [PATCH] Test on Python 3.8, drop 3.3 and 3.4
+
+---
+ .travis.yml | 7 +++---
+ setup.py | 1 +
+ tests/conftest.py | 2 +-
+ tests/test_hypothesis_integration.py | 2 +-
+ tests/test_simple.py | 32 +++++++++++-----------------
+ tests/test_simple_35.py | 17 ++++++---------
+ tests/test_subprocess.py | 6 ++----
+ tox.ini | 5 +++--
+ 8 files changed, 29 insertions(+), 43 deletions(-)
+
+diff --git a/.travis.yml b/.travis.yml
+index fe90234..b93377a 100644
+--- a/.travis.yml
++++ b/.travis.yml
+@@ -1,4 +1,5 @@
+ language: python
++
+ matrix:
+ include:
+ - python: 3.5
+@@ -7,10 +8,8 @@ matrix:
+ env: TOX_ENV=py36
+ - python: 3.7
+ env: TOX_ENV=py37
+- # TODO: the dist and sudo keys are currently needed to use Python 3.7.
+- # They should be removed once Travis-CI supports 3.7 on the default image.
+- dist: xenial
+- sudo: true
++ - python: 3.8
++ env: TOX_ENV=py38
+
+ install: pip install tox-travis coveralls
+
+diff --git a/setup.py b/setup.py
+index 18566bf..6175711 100644
+--- a/setup.py
++++ b/setup.py
+@@ -36,6 +36,7 @@ def find_version():
+ "Programming Language :: Python :: 3.5",
+ "Programming Language :: Python :: 3.6",
+ "Programming Language :: Python :: 3.7",
++ "Programming Language :: Python :: 3.8",
+ "Topic :: Software Development :: Testing",
+ "Framework :: Pytest",
+ ],
+diff --git a/tests/conftest.py b/tests/conftest.py
+index 6203cf8..cc2ec16 100644
+--- a/tests/conftest.py
++++ b/tests/conftest.py
+@@ -17,7 +17,7 @@ def dependent_fixture(event_loop):
+ async def just_a_sleep():
+ """Just sleep a little while."""
+ nonlocal event_loop
+- await asyncio.sleep(0.1, loop=event_loop)
++ await asyncio.sleep(0.1)
+ nonlocal counter
+ counter += 1
+
+diff --git a/tests/test_simple.py b/tests/test_simple.py
+index 1627139..00c07fc 100644
+--- a/tests/test_simple.py
++++ b/tests/test_simple.py
+@@ -1,28 +1,26 @@
+ """Quick'n'dirty unit tests for provided fixtures and markers."""
+ import asyncio
+-import os
+ import pytest
+
+ import pytest_asyncio.plugin
+
+
+-async def async_coro(loop=None):
+- """A very simple coroutine."""
+- await asyncio.sleep(0, loop=loop)
++async def async_coro():
++ await asyncio.sleep(0)
+ return 'ok'
+
+
+ def test_event_loop_fixture(event_loop):
+ """Test the injection of the event_loop fixture."""
+ assert event_loop
+- ret = event_loop.run_until_complete(async_coro(event_loop))
++ ret = event_loop.run_until_complete(async_coro())
+ assert ret == 'ok'
+
+
+ @pytest.mark.asyncio
+-def test_asyncio_marker():
++async def test_asyncio_marker():
+ """Test the asyncio pytest marker."""
+- yield # sleep(0)
++ await asyncio.sleep(0)
+
+
+ @pytest.mark.xfail(reason='need a failure', strict=True)
+@@ -45,13 +43,11 @@ async def closer(_, writer):
+ writer.close()
+
+ server1 = await asyncio.start_server(closer, host='localhost',
+- port=unused_tcp_port,
+- loop=event_loop)
++ port=unused_tcp_port)
+
+ with pytest.raises(IOError):
+ await asyncio.start_server(closer, host='localhost',
+- port=unused_tcp_port,
+- loop=event_loop)
++ port=unused_tcp_port)
+
+ server1.close()
+ await server1.wait_closed()
+@@ -68,20 +64,16 @@ async def closer(_, writer):
+ unused_tcp_port_factory())
+
+ server1 = await asyncio.start_server(closer, host='localhost',
+- port=port1,
+- loop=event_loop)
++ port=port1)
+ server2 = await asyncio.start_server(closer, host='localhost',
+- port=port2,
+- loop=event_loop)
++ port=port2)
+ server3 = await asyncio.start_server(closer, host='localhost',
+- port=port3,
+- loop=event_loop)
++ port=port3)
+
+ for port in port1, port2, port3:
+ with pytest.raises(IOError):
+ await asyncio.start_server(closer, host='localhost',
+- port=port,
+- loop=event_loop)
++ port=port)
+
+ server1.close()
+ await server1.wait_closed()
+@@ -117,7 +109,7 @@ class Test:
+ @pytest.mark.asyncio
+ async def test_asyncio_marker_method(self, event_loop):
+ """Test the asyncio pytest marker in a Test class."""
+- ret = await async_coro(event_loop)
++ ret = await async_coro()
+ assert ret == 'ok'
+
+
+diff --git a/tests/test_simple_35.py b/tests/test_simple_35.py
+index 1e4d697..4141fb0 100644
+--- a/tests/test_simple_35.py
++++ b/tests/test_simple_35.py
+@@ -6,7 +6,7 @@
+
+ @pytest.mark.asyncio
+ async def async_coro(loop):
+- await asyncio.sleep(0, loop=loop)
++ await asyncio.sleep(0)
+ return 'ok'
+
+
+@@ -27,8 +27,7 @@ async def closer(_, writer):
+ writer.close()
+
+ server1 = await asyncio.start_server(closer, host='localhost',
+- port=unused_tcp_port,
+- loop=event_loop)
++ port=unused_tcp_port)
+
+ server1.close()
+ await server1.wait_closed()
+@@ -45,20 +44,16 @@ async def closer(_, writer):
+
+ async def run_test():
+ server1 = await asyncio.start_server(closer, host='localhost',
+- port=port1,
+- loop=event_loop)
++ port=port1)
+ server2 = await asyncio.start_server(closer, host='localhost',
+- port=port2,
+- loop=event_loop)
++ port=port2)
+ server3 = await asyncio.start_server(closer, host='localhost',
+- port=port3,
+- loop=event_loop)
++ port=port3)
+
+ for port in port1, port2, port3:
+ with pytest.raises(IOError):
+ await asyncio.start_server(closer, host='localhost',
+- port=port,
+- loop=event_loop)
++ port=port)
+
+ server1.close()
+ await server1.wait_closed()
+diff --git a/tests/test_subprocess.py b/tests/test_subprocess.py
+index 83490e8..069c6c2 100644
+--- a/tests/test_subprocess.py
++++ b/tests/test_subprocess.py
+@@ -21,8 +21,7 @@ def event_loop():
+ async def test_subprocess(event_loop):
+ """Starting a subprocess should be possible."""
+ proc = await asyncio.subprocess.create_subprocess_exec(
+- sys.executable, '--version', stdout=asyncio.subprocess.PIPE,
+- loop=event_loop)
++ sys.executable, '--version', stdout=asyncio.subprocess.PIPE)
+ await proc.communicate()
+
+
+@@ -30,6 +29,5 @@ async def test_subprocess(event_loop):
+ async def test_subprocess_forbid(event_loop):
+ """Starting a subprocess should be possible."""
+ proc = await asyncio.subprocess.create_subprocess_exec(
+- sys.executable, '--version', stdout=asyncio.subprocess.PIPE,
+- loop=event_loop)
++ sys.executable, '--version', stdout=asyncio.subprocess.PIPE)
+ await proc.communicate()
+diff --git a/tox.ini b/tox.ini
+index 13d5155..eed6fb6 100644
+--- a/tox.ini
++++ b/tox.ini
+@@ -1,6 +1,7 @@
+ [tox]
+-envlist = py35, py36, py37
+-minversion = 2.5.0
++minversion = 3.14.0
++envlist = py35, py36, py37, py38
++skip_missing_interpreters = true
+
+ [testenv]
+ extras = testing
diff --git a/gnu/packages/patches/u-boot-nintendo-nes-serial.patch b/gnu/packages/patches/u-boot-nintendo-nes-serial.patch
new file mode 100644
index 0000000000..3588236803
--- /dev/null
+++ b/gnu/packages/patches/u-boot-nintendo-nes-serial.patch
@@ -0,0 +1,14 @@
+Date: Sun, 5 Sep 2021 23:24:00 +0200
+Author: Danny Milosavljevic <dannym@scratchpost.org>
+Description: Set console UART to use pins PB0 and PB1.
+--- u-boot-2018.11/configs/Nintendo_NES_Classic_Edition_defconfig.orig 2021-09-05 23:09:15.905846467 +0200
++++ u-boot-2018.11/configs/Nintendo_NES_Classic_Edition_defconfig 2021-09-05 23:12:21.562774694 +0200
+@@ -21,7 +21,7 @@
+ CONFIG_SYS_NAND_OOBSIZE=0x40
+ CONFIG_AXP_DLDO1_VOLT=3300
+ CONFIG_AXP_ELDO2_VOLT=1800
+-CONFIG_CONS_INDEX=5
++CONFIG_CONS_INDEX=1
+ CONFIG_USB_MUSB_GADGET=y
+ CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y
+ CONFIG_USB_FUNCTION_MASS_STORAGE=y