git: e93acc87c3f1 - main - news/sabnzbd: Update to 4.0.2

From: Po-Chuan Hsieh <sunpoet_at_FreeBSD.org>
Date: Sun, 09 Jul 2023 10:46:26 UTC
The branch main has been updated by sunpoet:

URL: https://cgit.FreeBSD.org/ports/commit/?id=e93acc87c3f167677ba187bb3934f7de780df844

commit e93acc87c3f167677ba187bb3934f7de780df844
Author:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
AuthorDate: 2023-07-09 10:31:57 +0000
Commit:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
CommitDate: 2023-07-09 10:31:57 +0000

    news/sabnzbd: Update to 4.0.2
    
    - Add py-sabctools 7.1.0 support [1]
    
    PR:             272071
    Approved by:    James French <james@french.id.au> (maintainer)
    Obtained from:  https://github.com/sabnzbd/sabnzbd/commit/a179f2a895259e49f3679405ad59cac06e0bf2d9 [1]
---
 news/sabnzbd/Makefile              |   4 +-
 news/sabnzbd/distinfo              |   6 +-
 news/sabnzbd/files/patch-sabctools | 115 +++++++++++++++++++++++++++++++++++++
 3 files changed, 120 insertions(+), 5 deletions(-)

diff --git a/news/sabnzbd/Makefile b/news/sabnzbd/Makefile
index d2c4a0de46c5..e1cc10adb619 100644
--- a/news/sabnzbd/Makefile
+++ b/news/sabnzbd/Makefile
@@ -1,5 +1,5 @@
 PORTNAME=	sabnzbd
-DISTVERSION=	4.0.0
+DISTVERSION=	4.0.2
 CATEGORIES=	news
 MASTER_SITES=	https://github.com/sabnzbd/sabnzbd/releases/download/${DISTVERSION}/
 DISTNAME=	SABnzbd-${DISTVERSION}-src
@@ -19,7 +19,7 @@ RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cheetah3>=0:devel/py-cheetah3@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}feedparser>=6.0.0:textproc/py-feedparser@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}portend>=0:net/py-portend@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}sqlite3>=0:databases/py-sqlite3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}sabctools>=0:news/py-sabctools@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}sabctools>=7.1.0<7.1.0_99:news/py-sabctools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}guessit>0:multimedia/py-guessit@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}puremagic>0:sysutils/py-puremagic@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}pysocks>0:net/py-pysocks@${PY_FLAVOR} \
diff --git a/news/sabnzbd/distinfo b/news/sabnzbd/distinfo
index 38ad0171ffc8..6433ee11ccf8 100644
--- a/news/sabnzbd/distinfo
+++ b/news/sabnzbd/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1682683069
-SHA256 (SABnzbd-4.0.0-src.tar.gz) = 32e6073a238d25747ef86919ff0804725cf59ddbcfab60c812e21c998ce2ed71
-SIZE (SABnzbd-4.0.0-src.tar.gz) = 5079964
+TIMESTAMP = 1688165296
+SHA256 (SABnzbd-4.0.2-src.tar.gz) = 2783f225057031869dff74f7eb191f54f35e8abe60906fcaaa94ab7772166c4e
+SIZE (SABnzbd-4.0.2-src.tar.gz) = 5081392
diff --git a/news/sabnzbd/files/patch-sabctools b/news/sabnzbd/files/patch-sabctools
new file mode 100644
index 000000000000..a9d0ee784c29
--- /dev/null
+++ b/news/sabnzbd/files/patch-sabctools
@@ -0,0 +1,115 @@
+Obtained from:	https://github.com/sabnzbd/sabnzbd/commit/a179f2a895259e49f3679405ad59cac06e0bf2d9
+
+--- requirements.txt.orig	2023-06-07 19:24:42 UTC
++++ requirements.txt
+@@ -1,6 +1,6 @@
+ # Main requirements
+ # Note that not all sub-dependencies are listed, but only ones we know could cause trouble
+-sabctools==7.0.2
++sabctools==7.1.0
+ cheetah3==3.2.6.post1
+ cffi==1.15.1
+ pycparser==2.21
+--- sabnzbd/assembler.py.orig	2023-06-07 19:24:42 UTC
++++ sabnzbd/assembler.py
+@@ -27,6 +27,7 @@ from threading import Thread
+ import ctypes
+ from typing import Tuple, Optional, List
+ 
++import sabctools
+ import sabnzbd
+ from sabnzbd.misc import get_all_passwords, match_str
+ from sabnzbd.filesystem import (
+@@ -160,13 +161,21 @@ class Assembler(Thread):
+ 
+     @staticmethod
+     def assemble(nzo: NzbObject, nzf: NzbFile, file_done: bool):
+-        """Assemble a NZF from its table of articles
+-        1) Partial write: write what we have
+-        2) Nothing written before: write all
+-        """
++        """Assemble a NZF from its table of articles"""
+ 
++        # When a file exists, we cannot use "w+b"
++        if os.path.exists(nzf.filepath):
++            open_mode = "r+b"
++            file_sparse = True
++        else:
++            open_mode = "w+b"
++            file_sparse = False
++
+         # We write large article-sized chunks, so we can safely skip the buffering of Python
+-        with open(nzf.filepath, "ab", buffering=0) as fout:
++        with open(nzf.filepath, open_mode, buffering=0) as fout:
++            # Track position, so we can prevent a seek if writing continuous
++            file_position = 0
++
+             for article in nzf.decodetable:
+                 # Break if deleted during writing
+                 if nzo.status is Status.DELETED:
+@@ -178,9 +187,25 @@ class Assembler(Thread):
+ 
+                 # Write all decoded articles
+                 if article.decoded:
++                    # On first write try to make the file sparse
++                    if not file_sparse and article.file_size is not None and article.file_size > 0:
++                        file_sparse = True
++                        try:
++                            sabctools.sparse(fout, article.file_size)
++                        except:
++                            logging.debug("Failed to make %s sparse with length %d", nzf.filepath, article.file_size)
++                            logging.debug("Traceback: ", exc_info=True)
++
+                     data = sabnzbd.ArticleCache.load_article(article)
+                     # Could be empty in case nzo was deleted
+                     if data:
++                        if article.data_begin is not None:
++                            # Seek ahead if needed
++                            if article.data_begin != file_position:
++                                fout.seek(article.data_begin)
++                            file_position = article.data_begin + len(data)
++                        else:
++                            fout.seek(0, os.SEEK_END)
+                         fout.write(data)
+                         nzf.update_crc32(article.crc32, len(data))
+                         article.on_disk = True
+--- sabnzbd/constants.py.orig	2023-06-07 19:24:42 UTC
++++ sabnzbd/constants.py
+@@ -49,7 +49,7 @@ RENAMES_FILE = "__renames__"
+ ATTRIB_FILE = "SABnzbd_attrib"
+ REPAIR_REQUEST = "repair-all.sab"
+ 
+-SABCTOOLS_VERSION_REQUIRED = "7.0.2"
++SABCTOOLS_VERSION_REQUIRED = "7.1.0"
+ 
+ DB_HISTORY_VERSION = 1
+ DB_HISTORY_NAME = "history%s.db" % DB_HISTORY_VERSION
+--- sabnzbd/decoder.py.orig	2023-06-07 19:24:42 UTC
++++ sabnzbd/decoder.py
+@@ -172,7 +172,7 @@ def decode(article: Article, raw_data: bytearray):
+ 
+ def decode_yenc(article: Article, data: bytearray) -> bytearray:
+     # Let SABCTools do all the heavy lifting
+-    yenc_filename, article.data_begin, article.data_size, crc_correct = sabctools.yenc_decode(data)
++    yenc_filename, article.file_size, article.data_begin, article.data_size, crc_correct = sabctools.yenc_decode(data)
+ 
+     nzf = article.nzf
+     # Assume it is yenc
+--- sabnzbd/nzbstuff.py.orig	2023-06-07 19:24:42 UTC
++++ sabnzbd/nzbstuff.py
+@@ -163,6 +163,7 @@ ArticleSaver = (
+     "bytes",
+     "lowest_partnum",
+     "decoded",
++    "file_size",
+     "data_begin",
+     "data_size",
+     "on_disk",
+@@ -187,6 +188,7 @@ class Article(TryList):
+         self.fetcher_priority: int = 0
+         self.tries: int = 0  # Try count
+         self.decoded: bool = False
++        self.file_size: Optional[int] = None
+         self.data_begin: Optional[int] = None
+         self.data_size: Optional[int] = None
+         self.on_disk: bool = False