aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharlie Li <vishwin@FreeBSD.org>2026-06-24 20:10:17 +0000
committerCharlie Li <vishwin@FreeBSD.org>2026-06-24 20:27:07 +0000
commit81c0a4f5271f88ae0baf593193bd31c89d1abef2 (patch)
tree7c298af68e5b5fc63ba2db5a4a442307574f4589
parent093cff0cd033f3f115f6adf5c8d068df3f1bd7e3 (diff)
www/py-ll-xist: rename and update to 5.85
Changelog: https://python.livinglogic.de/NEWS.html#changes-in-5-85-released-2026-05-20 Not the latest upstream version. 5.86 and later use t-strings which is a Python 3.14 feature. Event: Halifax Hackathon 202606
-rw-r--r--MOVED1
-rw-r--r--www/Makefile2
-rw-r--r--www/py-ll-xist/Makefile41
-rw-r--r--www/py-ll-xist/distinfo3
-rw-r--r--www/py-ll-xist/files/patch-test_test__url__open.py593
-rw-r--r--www/py-ll-xist/pkg-descr (renamed from www/xist/pkg-descr)0
-rw-r--r--www/xist/Makefile26
-rw-r--r--www/xist/distinfo3
8 files changed, 639 insertions, 30 deletions
diff --git a/MOVED b/MOVED
index 10862c0df551..2d65253df352 100644
--- a/MOVED
+++ b/MOVED
@@ -5377,3 +5377,4 @@ sysutils/signon-plugin-oauth2@qt6|sysutils/signon-plugin-oauth2|2026-06-22|Unfla
net-im/libaccounts-qt@qt5||2026-06-22|Unflavorize, remove Qt5 flavor
net-im/libaccounts-qt@qt6|net-im/libaccounts-qt|2026-06-22|Unflavorize
science/minc2|science/minc-tools|2026-06-24|Split into science/minc-tools and science/libminc
+www/xist|www/py-ll-xist|2026-06-24|Use correct Python package name
diff --git a/www/Makefile b/www/Makefile
index 5ea848b5d776..16d723db0f55 100644
--- a/www/Makefile
+++ b/www/Makefile
@@ -1882,6 +1882,7 @@
SUBDIR += py-limits
SUBDIR += py-litestar
SUBDIR += py-livereload
+ SUBDIR += py-ll-xist
SUBDIR += py-mailman-hyperkitty
SUBDIR += py-mechanicalsoup
SUBDIR += py-mechanize
@@ -2765,7 +2766,6 @@
SUBDIR += xcaddy
SUBDIR += xfce4-smartbookmark-plugin
SUBDIR += xh
- SUBDIR += xist
SUBDIR += xoops
SUBDIR += xsp
SUBDIR += xurls
diff --git a/www/py-ll-xist/Makefile b/www/py-ll-xist/Makefile
new file mode 100644
index 000000000000..3bba6eb19a7b
--- /dev/null
+++ b/www/py-ll-xist/Makefile
@@ -0,0 +1,41 @@
+PORTNAME= ll-xist
+DISTVERSION= 5.85
+CATEGORIES= www python
+MASTER_SITES= http://python-downloads.livinglogic.de/download/xist/ \
+ PYPI
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+DISTNAME= ${PORTNAME:C/[-_.]+/_/g}-${DISTVERSION}
+
+MAINTAINER= python@FreeBSD.org
+COMMENT= XML-based extensible HTML generator
+WWW= https://python.livinglogic.de/
+
+LICENSE= MIT
+
+BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}setuptools>0:devel/py-setuptools@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR}
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}cssutils>=2.6.0,1:www/py-cssutils@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}lxml>=4.3.4:devel/py-lxml@${PY_FLAVOR} \
+ ${PY_PILLOW} \
+ ${PYTHON_PKGNAMEPREFIX}oracledb>0:databases/py-oracledb@${PY_FLAVOR}
+#TEST_DEPENDS= ${PYTHON_PKGNAMEPREFIX}pytest-xdist>0:devel/py-pytest-xdist@${PY_FLAVOR} \
+# ${PYTHON_PKGNAMEPREFIX}pytest-rerunfailures>0:devel/py-pytest-rerunfailures@${PY_FLAVOR} \
+# ${PYTHON_PKGNAMEPREFIX}filelock>0:sysutils/py-filelock@${PY_FLAVOR} \
+# ${PYTHON_PKGNAMEPREFIX}psycopg>0:databases/py-psycopg@${PY_FLAVOR}
+
+USES= python
+USE_PYTHON= autoplist cython pep517
+#USE_PYTHON+= pytest
+
+#USE_GITHUB= yes
+#GH_ACCOUNT= LivingLogic
+#GH_PROJECT= LivingLogic.Python.xist
+#GH_TAGNAME= rel-5-85
+
+#post-patch:
+# ${REINPLACE_CMD} -e 's/pytest-reporter-html1//' ${WRKSRC}/pytest.ini
+
+post-install:
+ ${STRIP_CMD} ${STAGEDIR}${PYTHON_SITELIBDIR}/ll/*.so ${STAGEDIR}${PYTHON_SITELIBDIR}/ll/xist/*.so
+
+.include <bsd.port.mk>
diff --git a/www/py-ll-xist/distinfo b/www/py-ll-xist/distinfo
new file mode 100644
index 000000000000..64fbe2977eef
--- /dev/null
+++ b/www/py-ll-xist/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1782331233
+SHA256 (ll_xist-5.85.tar.gz) = 3cf688d83929572d1df2d4c21bffd33744ab0ed2c0c1f98fa79955c06f906702
+SIZE (ll_xist-5.85.tar.gz) = 1788274
diff --git a/www/py-ll-xist/files/patch-test_test__url__open.py b/www/py-ll-xist/files/patch-test_test__url__open.py
new file mode 100644
index 000000000000..a62d3ab939a8
--- /dev/null
+++ b/www/py-ll-xist/files/patch-test_test__url__open.py
@@ -0,0 +1,593 @@
+--- test/test_url_open.py 2026-05-20 16:02:56 UTC
++++ /dev/null
+@@ -1,590 +0,0 @@
+-#!/usr/bin/env python
+-# -*- coding: utf-8 -*-
+-# cython: language_level=3, always_allow_keywords=True
+-
+-## Copyright 2005-2026 by LivingLogic AG, Bayreuth/Germany
+-## Copyright 2005-2026 by Walter Dörwald
+-##
+-## All Rights Reserved
+-##
+-## See ll/xist/__init__.py for the license
+-
+-
+-import io, os, datetime
+-
+-from ll import url
+-
+-import pytest
+-
+-# This must point to an ssh account (in the form ``user@hostname``)
+-# that has a directory ``LivingLogic.Python.xist``.
+-remote_user = os.environ["LL_SSH_TEST_CONNECT"]
+-
+-@pytest.mark.net
+-def test_remove():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)
+- u2 = u/"foo_remove"
+- r = u2.open("wb")
+- try:
+- r.write(b"testing...")
+- r.close()
+- assert u2.exists()
+- finally:
+- u2.remove()
+- assert not u2.exists()
+-
+- check(__file__.rstrip("c"))
+- check(url.URL(__file__.rstrip("c")))
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/")
+-
+-
+-@pytest.mark.net
+-def test_link():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)
+- u2 = u/"foo_link"
+- try:
+- u.link(u2)
+- assert u2.exists()
+- assert u2.isfile()
+- assert not u2.islink() # A hardlink is indistinguisable from the real thing
+- finally:
+- u2.remove()
+- assert not u2.exists()
+-
+- check(__file__.rstrip("c"))
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/setup.py")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/setup.py")
+-
+-
+-@pytest.mark.net
+-def test_symlink():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)
+- u2 = u/"foo_symlink"
+- try:
+- u.symlink(u2)
+- assert u2.exists()
+- assert u2.islink()
+- finally:
+- u2.remove()
+- assert not u2.exists()
+-
+- check(__file__.rstrip("c"))
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/setup.py")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/setup.py")
+-
+-
+-@pytest.mark.net
+-def test_chmod():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)
+- r = u.open("wb")
+- try:
+- try:
+- r.write(b"testing ...")
+- finally:
+- r.close()
+- u.chmod(0o444)
+- assert u.stat().st_mode & 0o777 == 0o444
+- finally:
+- u.remove()
+-
+- check("~/foo_chmod")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/foo")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/foo")
+-
+-
+-@pytest.mark.net
+-def test_chown():
+- def check(u1, u2, owner, group):
+- with url.Context():
+- u1 = url.URL(u1)
+- u2 = url.URL(u2)
+- r = u1.open("wb")
+- try:
+- try:
+- r.write(b"foo")
+- finally:
+- r.close()
+- # Might have been left over from previous run
+- if u2.exists():
+- u2.remove()
+- try:
+- u1.symlink(u2)
+- u2.lchown(owner, group)
+- assert u1.owner() == owner
+- assert u1.group() == group
+- assert u2.owner() == owner
+- assert u2.group() == group
+-
+- u2.chown(owner, group)
+- assert u1.owner() == owner
+- assert u1.group() == group
+- assert u2.owner() == owner
+- assert u2.group() == group
+- finally:
+- u2.remove()
+- finally:
+- u1.remove()
+-
+- remote_user_name = remote_user.split("@")[0]
+-
+- check(f"ssh://{remote_user}/~/foo_chown", f"ssh://{remote_user}/~/bar", remote_user_name, remote_user_name)
+- check(f"ssh-nocheck://{remote_user}:22/~/foo_chown", f"ssh-nocheck://{remote_user}:22/~/bar", remote_user_name, remote_user_name)
+-
+-
+-@pytest.mark.net
+-def test_size():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)
+- assert len(u.open("rb").read()) == u.open("rb").size() == u.size() == 1479
+-
+- check("~/checkouts/LivingLogic.Python.xist/docs/_static/favicon.png")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/docs/_static/favicon.png")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/docs/_static/favicon.png")
+- check("https://python.livinglogic.de/_static/favicon.png")
+-
+-
+-@pytest.mark.net
+-def test_imagesize():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)
+- assert u.imagesize() == (32, 32)
+-
+- check("~/checkouts/LivingLogic.Python.xist/docs/_static/favicon.png")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/docs/_static/favicon.png")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/docs/_static/favicon.png")
+- check("https://python.livinglogic.de/_static/favicon.png")
+-
+-
+-@pytest.mark.net
+-def test_mimetype():
+- def check(u, mt):
+- with url.Context():
+- u = url.URL(u)
+- assert u.mimetype() == u.open().mimetype() == mt
+-
+- check(__file__.rstrip("c"), "text/x-python")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/setup.py", "text/x-python")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/setup.py", "text/x-python")
+- check("https://python.livinglogic.de/", "text/html")
+-
+-
+-@pytest.mark.net
+-def test_readline():
+- def check(u, firstline):
+- with url.Context():
+- u = url.URL(u)
+- r = u.open("rb")
+- canseektell = hasattr(r, "tell") and hasattr(r, "seek")
+- if canseektell:
+- try:
+- r.tell()
+- except io.UnsupportedOperation:
+- canseektell = False
+- assert r.readline() == firstline
+- if canseektell:
+- assert r.tell() == len(firstline)
+- r.seek(0)
+- assert r.readline() == firstline
+- r.seek(0)
+- else:
+- r = u.open("rb") # reopen
+- assert r.read(len(firstline)) == firstline
+- if canseektell:
+- r.seek(0)
+- else:
+- r = u.open("rb") # reopen
+- assert r.read().startswith(firstline)
+-
+- check(__file__.rstrip("c"), b"#!/usr/bin/env python\n")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/setup.py", b"#! /usr/bin/env python\n")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/setup.py", b"#! /usr/bin/env python\n")
+- check("https://python.livinglogic.de/_static/css/theme.css", b'/* sphinx_ll_theme version 0.1 | MIT license */\n')
+-
+-
+-@pytest.mark.net
+-def test_iter():
+- def check(u, firstline):
+- with url.Context():
+- u = url.URL(u)
+- r = u.open("rb")
+- assert next(iter(r)) == firstline
+- list(r)
+-
+- check(__file__.rstrip("c"), b"#!/usr/bin/env python\n")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/setup.py", b"#! /usr/bin/env python\n")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/setup.py", b"#! /usr/bin/env python\n")
+- check("https://python.livinglogic.de/_static/css/theme.css", b'/* sphinx_ll_theme version 0.1 | MIT license */\n')
+-
+-
+-@pytest.mark.net
+-def test_autocreate_dir():
+- def check(u):
+- with url.Context():
+- try:
+- u = url.URL(u)
+- with u.openwrite() as f:
+- f.write(b"Hurz!")
+- finally:
+- u.remove()
+- u.withoutfile().rmdir()
+-
+- check("gurk/hurz.txt")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/gurk/hurz.txt")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/gurk/hurz.txt")
+-
+-
+-@pytest.mark.net
+-def test_seek_tell():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)
+- r = u.open("rb")
+- r.read()
+- assert r.tell() == 1479
+- r.seek(0)
+- assert r.tell() == 0
+- r.seek(100, os.SEEK_SET)
+- assert r.tell() == 100
+- r.seek(0, os.SEEK_END)
+- assert r.tell() == 1479
+- r.seek(-479, os.SEEK_END)
+- assert r.tell() == 1000
+- r.seek(479, os.SEEK_CUR)
+- assert r.tell() == 1479
+- assert r.read() == b""
+-
+- check("~/checkouts/LivingLogic.Python.xist/docs/_static/favicon.png")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/docs/_static/favicon.png")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/docs/_static/favicon.png")
+-
+-
+-@pytest.mark.net
+-def test_truncate():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)/"foo_truncate"
+- try:
+- r = u.open("wb")
+- r.write(b"testing...")
+- r.seek(-3, os.SEEK_CUR)
+- r.truncate()
+- r.close()
+- assert u.open("rb").read() == b"testing"
+- finally:
+- u.remove()
+-
+- check(__file__)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/")
+-
+-
+-@pytest.mark.net
+-def test_owner():
+- def check(u, owner):
+- with url.Context():
+- u = url.URL(u)
+- assert u.owner() == owner
+- assert u.stat().st_uid == u.uid()
+-
+- remote_user_name = remote_user.split("@")[0]
+-
+- check(__file__, "walter")
+- check("/", "root")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", remote_user_name)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", remote_user_name)
+-
+-
+-@pytest.mark.net
+-def test_stat():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)
+- stat = u.stat()
+- assert stat.st_size > 1000
+- assert stat.st_mode & 0o600 == 0o600
+-
+- check(url.File(__file__)/"../README.rst")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst")
+-
+-
+-@pytest.mark.net
+-def test_group():
+- def check(u, *groups):
+- with url.Context():
+- u = url.URL(u)
+- assert u.group() in groups
+- assert u.stat().st_gid == u.gid()
+-
+- remote_user_name = remote_user.split("@")[0]
+-
+- check(__file__, "users", "staff", "walter")
+- check("/", "root", "admin", "wheel")
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", remote_user_name)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", remote_user_name)
+-
+-
+-@pytest.mark.net
+-def test_cdate():
+- def check(u, *args):
+- with url.Context():
+- assert url.URL(u).cdate() >= datetime.datetime(*args)
+-
+- check(__file__.rstrip("c"), 2006, 10, 24)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", 2006, 6, 29)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", 2006, 6, 29)
+-
+-
+-@pytest.mark.net
+-def test_mdate():
+- def check(u, *args):
+- with url.Context():
+- u = url.URL(u)
+- assert u.mdate() == u.open().mdate() >= datetime.datetime(*args)
+-
+- check(__file__.rstrip("c"), 2006, 10, 24)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", 2006, 6, 29)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", 2006, 6, 29)
+- check("https://python.livinglogic.de/XIST.html", 2006, 10, 3)
+-
+-
+-@pytest.mark.net
+-def test_adate():
+- def check(u, *args):
+- with url.Context():
+- assert url.URL(u).adate() >= datetime.datetime(*args)
+-
+- check(__file__.rstrip("c"), 2006, 10, 24)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", 2006, 6, 29)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", 2006, 6, 29)
+-
+-
+-@pytest.mark.net
+-def test_exists():
+- def check(u, exists):
+- with url.Context():
+- u = url.URL(u)
+- assert u.exists() == exists
+-
+- check(__file__, True)
+- check(__file__ + "no", False)
+- check("/", True)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", True)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", True)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/DONTREADME.rst", False)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/DONTREADME.rst", False)
+-
+-
+-@pytest.mark.net
+-def test_isfile():
+- def check(u, isfile):
+- with url.Context():
+- u = url.URL(u)
+- assert u.isfile() == isfile
+-
+- check(__file__, True)
+- check(__file__ + "no", False)
+- check("/", False)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", True)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", True)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/", False)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/", False)
+-
+-
+-@pytest.mark.net
+-def test_isdir():
+- def check(u, isdir):
+- with url.Context():
+- u = url.URL(u)
+- assert u.isdir() == isdir
+-
+- check(__file__, False)
+- check(__file__ + "no", False)
+- check("/", True)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", False)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", False)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/", True)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/", True)
+- check(f"ssh://{remote_user}/~/checkouts/", True)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/", True)
+-
+-
+-@pytest.mark.net
+-def test_islink():
+- def check(u, islink):
+- with url.Context():
+- u = url.URL(u)
+- assert u.islink() == islink
+-
+- check(__file__, False)
+- check("/", False)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", False)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", False)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/", False)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/", False)
+-
+-
+-@pytest.mark.net
+-def test_ismount():
+- def check(u, ismount):
+- with url.Context():
+- u = url.URL(u)
+- assert u.ismount() == ismount
+-
+- check(__file__, False)
+- check("/", True)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", False)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", False)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/", False)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/", False)
+- check(f"ssh://{remote_user}/~livpython", False)
+- check(f"ssh-nocheck://{remote_user}:22/~livpython", False)
+-
+-
+-@pytest.mark.net
+-def test_access():
+- def check(u, mode, result):
+- with url.Context():
+- u = url.URL(u)
+- assert u.access(mode) == result
+-
+- check(__file__, os.F_OK, True)
+- check(__file__ + "no", os.F_OK, False)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", os.F_OK, True)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", os.F_OK, True)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/DONTREADME.rst", os.F_OK, False)
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/DONTREADME.rst", os.F_OK, False)
+-
+-
+-@pytest.mark.net
+-def test_resheaders():
+- def check(u, headers):
+- with url.Context():
+- u = url.URL(u)
+- realheaders = u.resheaders()
+- for (k, v) in headers.items():
+- assert realheaders[k] == v
+-
+- check(url.File(__file__)/"../README.rst", {"Content-type": "text/x-rst"})
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/README.rst", {"Content-Type": "text/x-rst"})
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/README.rst", {"Content-Type": "text/x-rst"})
+- check("https://python.livinglogic.de/XIST.html", {"Content-type": "text/html"})
+-
+-
+-@pytest.mark.net
+-def test_resdata():
+- def check(u, firstline):
+- with url.Context():
+- u = url.URL(u)
+- realdata = u.open("rb").resdata()
+- assert realdata.splitlines(True)[0] == firstline
+-
+- check("https://python.livinglogic.de/_static/css/theme.css", b'/* sphinx_ll_theme version 0.1 | MIT license */\n')
+-
+-
+-@pytest.mark.net
+-def test_mkdir_rmdir():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)/"foo_mkdir_rmdir/"
+- u.mkdir(0o755)
+- try:
+- assert u.isdir()
+- assert u.stat().st_mode & 0o777 == 0o755
+- finally:
+- u.rmdir()
+-
+- check(__file__)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/")
+-
+-
+-@pytest.mark.net
+-def test_makedirs():
+- def check(u):
+- with url.Context():
+- u = url.URL(u)/"foo_makedirs/bar/"
+- u.makedirs(0o755)
+- try:
+- assert u.isdir()
+- assert u.stat().st_mode & 0o777 == 0o755
+- finally:
+- u.rmdir()
+- (u/"../").rmdir()
+-
+- check(__file__)
+- check(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/")
+- check(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/")
+-
+-
+-@pytest.mark.net
+-def test_dir():
+- def check(u, pu, isfile, include=None, exclude=None):
+- with url.Context():
+- u = url.URL(u)
+- pu = url.URL(pu)
+- assert u in pu.listdir(include=include, exclude=exclude)
+- if isfile:
+- assert u in pu.files(include=include, exclude=exclude)
+- assert u not in pu.dirs(include=include, exclude=exclude)
+- else:
+- assert u not in pu.files(include=include, exclude=exclude)
+- assert u in pu.dirs(include=include, exclude=exclude)
+-
+- check(os.path.basename(__file__), os.path.dirname(__file__), True)
+- check("lib/", "/usr/", False)
+- check("README.rst", f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/", True)
+- check("README.rst", f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/", True)
+- check("LivingLogic.Python.xist/", f"ssh://{remote_user}/~/checkouts/", False)
+- check("LivingLogic.Python.xist/", f"ssh-nocheck://{remote_user}:22/~/checkouts/", False)
+- check("lib/", "/usr/", False, "lib")
+- check("lib/", "/usr/", False, None, "nolib")
+-
+-
+-@pytest.mark.net
+-def test_walk():
+- def check(u, pu, isfile, include=None, exclude=None):
+- with url.Context():
+- u = url.URL(u)
+- pu = url.URL(pu)
+- assert any(u==wu for wu in pu.walkall(include=include, exclude=exclude))
+- if isfile:
+- assert any(u==wu for wu in pu.walkfiles(include=include, exclude=exclude))
+- assert all(u!=wu for wu in pu.walkdirs(include=include, exclude=exclude))
+- else:
+- assert all(u!=wu for wu in pu.walkfiles(include=include, exclude=exclude))
+- assert any(u==wu for wu in pu.walkdirs(include=include, exclude=exclude))
+-
+- check(os.path.basename(__file__), os.path.dirname(__file__), True)
+- check("src/ll/xist/", url.Dir("~/checkouts/LivingLogic.Python.xist/"), False)
+- check("ll/xist/ns/html.py", f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/src/", True)
+- check("ll/xist/ns/html.py", f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/src/", True)
+- check("ll/xist/ns/", f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/src/", False)
+- check("ll/xist/ns/", f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/src/", False)
+-
+-
+-@pytest.mark.net
+-def test_ssh_params():
+- with url.Context():
+- u1 = url.URL(f"ssh://{remote_user}/~/checkouts/LivingLogic.Python.xist/")
+- assert u1.isdir(python="/home/walter/.local/bin/python3") is True
+- assert u1.isdir(nice=20) is True
+- assert u1.isdir(check=False) is True
+- assert u1.isdir(check=True) is True
+-
+- u2 = url.URL(f"ssh-nocheck://{remote_user}:22/~/checkouts/LivingLogic.Python.xist/")
+- assert u2.isdir(python="/home/walter/.local/bin/python3") is True
+- assert u2.isdir(nice=20) is True
+- assert u2.isdir(check=False) is True
+- assert u2.isdir(check=True) is True
diff --git a/www/xist/pkg-descr b/www/py-ll-xist/pkg-descr
index 9c5445d4fbd7..9c5445d4fbd7 100644
--- a/www/xist/pkg-descr
+++ b/www/py-ll-xist/pkg-descr
diff --git a/www/xist/Makefile b/www/xist/Makefile
deleted file mode 100644
index 8b72d8deb609..000000000000
--- a/www/xist/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-PORTNAME= xist
-PORTVERSION= 5.34
-PORTREVISION= 4
-CATEGORIES= www python
-MASTER_SITES= PYPI \
- http://ftp.livinglogic.de/xist/
-PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
-DISTNAME= ll-${PORTNAME}-${PORTVERSION}
-
-MAINTAINER= python@FreeBSD.org
-COMMENT= XML-based extensible HTML generator
-WWW= http://www.livinglogic.de/Python/xist/
-
-LICENSE= MIT
-
-RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}cssutils>=1.0,1:www/py-cssutils@${PY_FLAVOR} \
- ${PYTHON_PKGNAMEPREFIX}lxml>=3.4:devel/py-lxml@${PY_FLAVOR} \
- ${PY_PILLOW}
-
-USES= python tar:bzip2
-USE_PYTHON= autoplist distutils
-
-post-install:
- ${STRIP_CMD} ${STAGEDIR}${PYTHON_SITELIBDIR}/ll/*.so ${STAGEDIR}${PYTHON_SITELIBDIR}/ll/xist/*.so
-
-.include <bsd.port.mk>
diff --git a/www/xist/distinfo b/www/xist/distinfo
deleted file mode 100644
index f0b2a9f4a44d..000000000000
--- a/www/xist/distinfo
+++ /dev/null
@@ -1,3 +0,0 @@
-TIMESTAMP = 1531645044
-SHA256 (ll-xist-5.34.tar.bz2) = a2e1ac0002fec5f216aef119a11981e76939c099f488ebf4db3eb188f374070f
-SIZE (ll-xist-5.34.tar.bz2) = 564559