[tahoe-lafs-trac-stream] [Tahoe-LAFS] #3399: Evaluate adding mypy checks to code checks

Tahoe-LAFS trac at tahoe-lafs.org
Fri Sep 11 19:40:54 UTC 2020


#3399: Evaluate adding mypy checks to code checks
-----------------------------+------------------------------
     Reporter:  jaraco       |      Owner:  jaraco
         Type:  enhancement  |     Status:  assigned
     Priority:  normal       |  Milestone:  Support Python 3
    Component:  unknown      |    Version:  n/a
   Resolution:               |   Keywords:
Launchpad Bug:               |
-----------------------------+------------------------------

Comment (by jaraco):

 I've started work in [this branch](https://github.com/jaraco/tahoe-
 lafs/tree/3399.mypy). Just adding mypy checks reveals 200+ errors with the
 bulk in `interfaces.py`:

 {{{
 typechecks installed: mypy==0.782,mypy-extensions==0.4.3,typed-ast==1.4.1
 ,typing-extensions==3.7.4.3
 typechecks run-test-pre: PYTHONHASHSEED='8406647'
 typechecks run-test: commands[0] | mypy src
 src/allmydata/introducer/interfaces.py:45: error: Method must have at
 least one argument
 src/allmydata/introducer/interfaces.py:106: error: Method must have at
 least one argument
 src/allmydata/interfaces.py:59: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:67: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:110: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:318: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:436: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:457: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:468: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:473: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:484: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:488: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:492: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:502: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:508: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:528: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:545: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:548: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:551: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:560: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:570: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:599: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:627: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:642: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:657: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:661: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:666: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:670: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:678: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:690: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:701: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:772: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:782: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:790: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:793: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:888: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:922: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:925: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:930: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1001: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1007: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1011: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1019: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1027: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1037: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1042: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1051: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1056: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1062: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1071: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1074: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1080: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1084: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1092: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1101: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1127: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1201: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1294: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1304: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1349: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1358: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1367: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1517: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1542: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1619: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1622: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1630: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1779: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1892: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1930: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1955: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1968: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1992: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:1995: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2011: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2022: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2044: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2050: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2074: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2118: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2134: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2147: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2161: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2164: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2167: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2172: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2175: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2178: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2186: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2189: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2205: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2208: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2345: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2348: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2351: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2354: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2359: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2366: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2369: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2372: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2375: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2379: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2390: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2395: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2400: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2408: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2416: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2420: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2424: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2431: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2434: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2445: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2448: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2451: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2457: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2462: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2466: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2478: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2482: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2495: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2499: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2509: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2520: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2524: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2560: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2564: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2569: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2575: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2610: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2706: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2711: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2714: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2718: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2723: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2726: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2732: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2736: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2741: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2745: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2748: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2752: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2764: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2767: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2772: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2779: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2783: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2788: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2793: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2796: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2800: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2805: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2808: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2845: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2863: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2880: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2883: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2889: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2896: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2909: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2939: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2966: error: Method must have at least one
 argument
 src/allmydata/interfaces.py:2977: error: Method must have at least one
 argument
 src/allmydata/util/pollmixin.py:26: error: Need type annotation for
 '_poll_should_ignore_these_errors' (hint:
 "_poll_should_ignore_these_errors: List[<type>] = ...")
 src/allmydata/test/test_python3.py:50: error:
 "Callable[[Python3PortingEffortTests], Any]" has no attribute "todo"
 src/allmydata/test/check_load.py:47: error: Need type annotation for
 'last_stats' (hint: "last_stats: Dict[<type>, <type>] = ...")
 src/allmydata/test/check_load.py:53: error: Incompatible types in
 assignment (expression has type "int", variable has type "str")
 src/allmydata/test/check_load.py:56: error: Incompatible types in
 assignment (expression has type "float", target has type "int")
 src/allmydata/monitor.py:44: error: Method must have at least one argument
 src/allmydata/monitor.py:49: error: Method must have at least one argument
 src/allmydata/monitor.py:60: error: Method must have at least one argument
 src/allmydata/monitor.py:77: error: Method must have at least one argument
 src/allmydata/monitor.py:81: error: Method must have at least one argument
 src/allmydata/monitor.py:86: error: Method must have at least one argument
 src/allmydata/util/fileutil.py:312: error: Name '_getfullpathname' already
 defined on line 310
 src/allmydata/storage/crawler.py:22: error: Name 'pickle' already defined
 (possibly by an import)
 src/allmydata/node.py:712: error: Need type annotation for
 'GENERATED_FILES' (hint: "GENERATED_FILES: List[<type>] = ...")
 src/allmydata/windows/fixups.py:220: error: Name 'unichr' is not defined
 src/allmydata/test/test_iputil.py:136: error: "Callable[[ListAddresses],
 Any]" has no attribute "timeout"
 src/allmydata/web/status.py:1327: error: Name 'cmp' is not defined
 src/allmydata/web/status.py:1335: error: Name 'cmp' is not defined
 src/allmydata/test/test_stats.py:9: error: Incompatible types in
 assignment (expression has type "float", base class "CPUUsageMonitor"
 defined the type as "int")
 src/allmydata/uri.py:726: error: Incompatible types in assignment
 (expression has type "Type[CHKFileVerifierURI]", base class
 "DirectoryURIVerifier" defined the type as "Type[SSKVerifierURI]")
 src/allmydata/scripts/run_common.py:70: error: List item 0 has
 incompatible type "Tuple[str, str, None, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/debug.py:21: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/debug.py:419: error: Incompatible types in
 assignment (expression has type "str", base class "BaseOptions" defined
 the type as "None")
 src/allmydata/scripts/debug.py:613: error: Incompatible types in
 assignment (expression has type "str", base class "BaseOptions" defined
 the type as "None")
 src/allmydata/scripts/debug.py:661: error: Incompatible types in
 assignment (expression has type "str", base class "BaseOptions" defined
 the type as "None")
 src/allmydata/scripts/debug.py:875: error: Incompatible types in
 assignment (expression has type "str", base class "BaseOptions" defined
 the type as "None")
 src/allmydata/scripts/create_node.py:147: error: Incompatible types in
 assignment (expression has type "str", base class "BaseOptions" defined
 the type as "None")
 src/allmydata/scripts/create_node.py:154: error: List item 0 has
 incompatible type "Tuple[str, str, None, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/create_node.py:155: error: List item 1 has
 incompatible type "Tuple[str, str, None, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/create_node.py:156: error: List item 2 has
 incompatible type "Tuple[str, str, str, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/create_node.py:158: error: List item 3 has
 incompatible type "Tuple[str, str, None, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/create_node.py:160: error: List item 4 has
 incompatible type "Tuple[str, None, int, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/create_node.py:161: error: List item 5 has
 incompatible type "Tuple[str, None, int, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/create_node.py:162: error: List item 6 has
 incompatible type "Tuple[str, None, int, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/create_node.py:163: error: List item 7 has
 incompatible type "Tuple[str, None, None, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/create_node.py:199: error: Incompatible types in
 assignment (expression has type "str", base class "BaseOptions" defined
 the type as "None")
 src/allmydata/scripts/tahoe_start.py:20: error: List item 0 has
 incompatible type "Tuple[str, str, None, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/stats_gatherer.py:15: error: List item 0 has
 incompatible type "Tuple[str, None, None, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/stats_gatherer.py:16: error: List item 1 has
 incompatible type "Tuple[str, None, None, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/stats_gatherer.py:17: error: List item 2 has
 incompatible type "Tuple[str, None, None, str]"; expected
 "List[Optional[str]]"
 src/allmydata/scripts/stats_gatherer.py:27: error: Incompatible types in
 assignment (expression has type "str", base class "BaseOptions" defined
 the type as "None")
 src/allmydata/frontends/ftpd.py:2: error: Module 'types' has no attribute
 'NoneType'
 src/allmydata/web/directory.py:1217: error: Incompatible types in
 assignment (expression has type "str", base class "MultiFormatResource"
 defined the type as "None")
 src/allmydata/web/directory.py:1274: error: Incompatible types in
 assignment (expression has type "str", base class "MultiFormatResource"
 defined the type as "None")
 src/allmydata/scripts/cli.py:54: error: List item 0 has incompatible type
 "Tuple[str, None, None, str]"; expected "List[Optional[str]]"
 src/allmydata/scripts/cli.py:65: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:75: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:84: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:88: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:107: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:150: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:155: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:168: error: List item 0 has incompatible type
 "Tuple[str, None, None, str]"; expected "List[Optional[str]]"
 src/allmydata/scripts/cli.py:186: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:198: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:226: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:261: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:270: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:289: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:375: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:392: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:408: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:420: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:435: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/scripts/cli.py:452: error: Incompatible types in assignment
 (expression has type "str", base class "BaseOptions" defined the type as
 "None")
 src/allmydata/frontends/sftpd.py:3: error: Module 'types' has no attribute
 'NoneType'
 src/allmydata/scripts/runner.py:65: error: Unsupported operand types for +
 ("List[List[Union[Type[BaseOptions], str, None]]]" and "List[Tuple[str,
 None, Type[InviteOptions], str]]")
 src/allmydata/scripts/runner.py:110: error: Module has no attribute
 "dispatch"
 src/allmydata/test/storage_plugin.py:41: error: Method must have at least
 one argument
 src/allmydata/test/test_storage_client.py:508: error: On Python 3
 '{}'.format(b'abc') produces "b'abc'"; use !r if this is a desired
 behavior
 src/allmydata/test/test_helper.py:88: error: Need type annotation for
 'introducer_clients' (hint: "introducer_clients: List[<type>] = ...")
 src/allmydata/test/check_memory.py:495: error: Module has no attribute
 "maxint"
 src/allmydata/test/check_memory.py:497: error: Module has no attribute
 "maxint"
 src/allmydata/test/check_memory.py:501: error: Module has no attribute
 "maxint"
 src/allmydata/test/test_sftp.py:17: error: Name 'conch_interfaces' already
 defined on line 12
 src/allmydata/test/test_sftp.py:18: error: Name 'sftp' already defined on
 line 13
 src/allmydata/test/test_sftp.py:19: error: Incompatible import of "sftpd"
 (imported name has type Module, local name has type "object")
 src/allmydata/test/test_sftp.py:23: error: Incompatible types in
 assignment (expression has type "None", variable has type "ImportError")
 src/allmydata/test/test_encode.py:176: error: Incompatible types in
 assignment (expression has type "float", variable has type "int")
 src/allmydata/test/test_deepcheck.py:919: error: Name 'unicode' is not
 defined
 Found 242 errors in 31 files (checked 291 source files)
 ERROR: InvocationError for command /Users/jaraco/code/public/tahoe-
 lafs/.tox/typechecks/bin/mypy src (exited with code 1)
 ___________________________________ summary
 ____________________________________
 ERROR:   typechecks: commands failed

 }}}

--
Ticket URL: <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3399#comment:2>
Tahoe-LAFS <https://Tahoe-LAFS.org>
secure decentralized storage


More information about the tahoe-lafs-trac-stream mailing list