Control: tags -1 - moreinfo "Adam D. Barratt" <adam@adam-barratt.org.uk> writes: > On Fri, 2023-08-25 at 21:17 -0400, Nicholas D Steeves wrote: >> >> <#part type="application/octet-stream" >> filename="/home/sten/Dropbox/tmp/0.8.10-1_to_0.8.10- >> 1+deb12u1.debdiff" disposition=attachment> >> <#/part> >> > That seems to have been missed. Ah, I see I failed to use reportbug's special attachment method. My bad. Thanks for letting me know, and this should now be fixed!
diff -Nru vorta-0.8.10/debian/changelog vorta-0.8.10/debian/changelog
--- vorta-0.8.10/debian/changelog 2023-01-23 15:06:42.000000000 -0500
+++ vorta-0.8.10/debian/changelog 2023-07-31 11:10:53.000000000 -0400
@@ -1,3 +1,11 @@
+vorta (0.8.10-1+deb12u1) bookworm; urgency=medium
+
+ * Add 0006-Handle-ctime-and-mtime-diff-changes-1675.patch, which is a
+ cherry-picked fix from upstream that adapts Vorta 0.8.10 to Borg 1.2.4
+ (Closes: #1042671).
+
+ -- Nicholas D Steeves <sten@debian.org> Mon, 31 Jul 2023 11:10:53 -0400
+
vorta (0.8.10-1) unstable; urgency=medium
* New upstream release.
diff -Nru vorta-0.8.10/debian/patches/0006-Handle-ctime-and-mtime-diff-changes-1675.patch vorta-0.8.10/debian/patches/0006-Handle-ctime-and-mtime-diff-changes-1675.patch
--- vorta-0.8.10/debian/patches/0006-Handle-ctime-and-mtime-diff-changes-1675.patch 1969-12-31 19:00:00.000000000 -0500
+++ vorta-0.8.10/debian/patches/0006-Handle-ctime-and-mtime-diff-changes-1675.patch 2023-07-31 11:10:53.000000000 -0400
@@ -0,0 +1,452 @@
+From: Henry Spanka <henry@spanka.eu>
+Date: Sat, 1 Apr 2023 21:10:56 +0200
+Subject: Handle ctime and mtime diff changes (#1675)
+
+Bug: https://github.com/borgbase/vorta/issues/1672
+Bug-Debian: https://bugs.debian.org/1042671
+Applied-Upstream: 0.8.11, https://github.com/borgbase/vorta/commit/e3451ed49e4a760d2a0d037ef45f22155eeb2ed9
+
+Borg v1.2.4 added new change types called `mtime` and `ctime` for the modification and the creation time of a file.
+Our diff json parser doesn't support these changes yet.
+The plain text parser doesn't need to be updated since it is only used for earlier versions of borg.
+This also extends the tooltip in the diff view to show changes in `ctime` or `mtime` in a localised manner.
+
+* src/vorta/views/diff_result.py (ChangeType): Add `CTIME` and `MTIME` linking to `MODIFIED`.
+
+* src/vorta/views/diff_result.py (DiffData): Add fields `ctime_change` and `mtime_change`.
+
+* src/vorta/views/diff_result.py (parse_diff_json): Parse the new change types.
+
+* src/vorta/views/diff_result.py (DiffTree.data): Add time changes to tooltip in a human readable format.
+
+* tests/test_diff.py : Update test data to include new change types. Add additional test cases for unittesting the new change types.
+---
+ src/vorta/views/diff_result.py | 55 ++++++++++++-
+ tests/test_diff.py | 176 ++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 217 insertions(+), 14 deletions(-)
+
+diff --git a/src/vorta/views/diff_result.py b/src/vorta/views/diff_result.py
+index 6a8e5ba..cf8b936 100644
+--- a/src/vorta/views/diff_result.py
++++ b/src/vorta/views/diff_result.py
+@@ -6,7 +6,7 @@
+ from pathlib import PurePath
+ from typing import List, Optional, Tuple
+ from PyQt5 import uic
+-from PyQt5.QtCore import QMimeData, QModelIndex, QPoint, Qt, QThread, QUrl
++from PyQt5.QtCore import QDateTime, QLocale, QMimeData, QModelIndex, QPoint, Qt, QThread, QUrl
+ from PyQt5.QtGui import QColor, QKeySequence
+ from PyQt5.QtWidgets import QApplication, QHeaderView, QMenu, QShortcut, QTreeView
+ from vorta.utils import get_asset, pretty_bytes, uses_dark_mode
+@@ -206,6 +206,8 @@ def parse_diff_json(diffs: List[dict], model: 'DiffTree'):
+ change_type: ChangeType = None
+ mode_change: Optional[Tuple[str, str]] = None
+ owner_change: Optional[Tuple[str, str, str, str]] = None
++ ctime_change: Optional[Tuple[QDateTime, QDateTime]] = None
++ mtime_change: Optional[Tuple[QDateTime, QDateTime]] = None
+ modified: Optional[Tuple[int, int]] = None
+
+ # added link, removed link, changed link
+@@ -213,6 +215,8 @@ def parse_diff_json(diffs: List[dict], model: 'DiffTree'):
+ # added directory, removed directory
+ # owner (old_user, new_user, old_group, new_group))
+ # mode (old_mode, new_mode)
++ # ctime (old_ctime, new_ctime)
++ # mtime (old_mtime, new_mtime)
+ for change in item['changes']:
+ # if more than one type of change has happened for this file/dir/link, then report the most important
+ # (higher priority)
+@@ -269,6 +273,22 @@ def parse_diff_json(diffs: List[dict], model: 'DiffTree'):
+ change['new_user'],
+ change['new_group'],
+ )
++
++ elif change['type'] == 'ctime':
++ # ctime change can occur along with previous changes
++ change_type = ChangeType.MODIFIED
++ ctime_change = (
++ QDateTime.fromString(change['old_ctime'], Qt.DateFormat.ISODateWithMs),
++ QDateTime.fromString(change['new_ctime'], Qt.DateFormat.ISODateWithMs),
++ )
++ elif change['type'] == 'mtime':
++ # mtime change can occur along with previous changes
++ change_type = ChangeType.MODIFIED
++ mtime_change = (
++ QDateTime.fromString(change['old_mtime'], Qt.DateFormat.ISODateWithMs),
++ QDateTime.fromString(change['new_mtime'], Qt.DateFormat.ISODateWithMs),
++ )
++
+ else:
+ raise Exception('Unknown change type: {}'.format(change['type']))
+
+@@ -282,6 +302,8 @@ def parse_diff_json(diffs: List[dict], model: 'DiffTree'):
+ size=size,
+ mode_change=mode_change,
+ owner_change=owner_change,
++ ctime_change=ctime_change,
++ mtime_change=mtime_change,
+ modified=modified,
+ ),
+ )
+@@ -492,6 +514,8 @@ class ChangeType(enum.Enum):
+ such as - a file is deleted and replaced with
+ a directory of the same name.
+ owner - user and/or group ownership changed.
++ ctime - creation time changed.
++ mtime - modification time changed.
+
+ size:
+ If type == `added` or `removed`,
+@@ -518,6 +542,14 @@ class ChangeType(enum.Enum):
+ See old_user property.
+ new_group:
+ See old_user property.
++ old_ctime:
++ If type == `ctime`, then old_ctime and new_ctime provide creation time changes.
++ new_ctime:
++ See old_ctime property.
++ old_mtime:
++ If type == `mtime`, then old_mtime and new_mtime provide modification time changes.
++ new_mtime:
++ See old_mtime property.
+ """
+
+ NONE = 0 # no change
+@@ -531,6 +563,8 @@ class ChangeType(enum.Enum):
+ CHANGED_LINK = MODIFIED
+ MODE = MODIFIED # changed permissions
+ OWNER = MODIFIED
++ CTIME = MODIFIED
++ MTIME = MODIFIED
+
+ def short(self):
+ """Get a short identifier for the change type."""
+@@ -588,6 +622,8 @@ class DiffData:
+ size: int # size change (disk usage)
+ mode_change: Optional[Tuple[str, str]] = None
+ owner_change: Optional[Tuple[str, str, str, str]] = None
++ ctime_change: Optional[Tuple[QDateTime, QDateTime]] = None
++ mtime_change: Optional[Tuple[QDateTime, QDateTime]] = None
+ modified: Optional[Tuple[int, int]] = None
+
+
+@@ -798,6 +834,7 @@ def data(self, index: QModelIndex, role: int = Qt.ItemDataRole.DisplayRole):
+
+ modified_template = self.tr("Added {}, deleted {}")
+ owner_template = "{: <10} -> {: >10}"
++ time_template = "{}: {} -> {}"
+ permission_template = "{} -> {}"
+
+ # format
+@@ -844,4 +881,20 @@ def data(self, index: QModelIndex, role: int = Qt.ItemDataRole.DisplayRole):
+ "{}:{}".format(item.data.owner_change[2], item.data.owner_change[3]),
+ )
+
++ if item.data.ctime_change:
++ tooltip += '\n'
++ tooltip += time_template.format(
++ "Creation Time",
++ QLocale.system().toString(item.data.ctime_change[0], QLocale.FormatType.ShortFormat),
++ QLocale.system().toString(item.data.ctime_change[1], QLocale.FormatType.ShortFormat),
++ )
++
++ if item.data.mtime_change:
++ tooltip += '\n'
++ tooltip += time_template.format(
++ "Modification Time",
++ QLocale.system().toString(item.data.mtime_change[0], QLocale.FormatType.ShortFormat),
++ QLocale.system().toString(item.data.mtime_change[1], QLocale.FormatType.ShortFormat),
++ )
++
+ return tooltip
+diff --git a/tests/test_diff.py b/tests/test_diff.py
+index a4e265d..7392977 100644
+--- a/tests/test_diff.py
++++ b/tests/test_diff.py
+@@ -1,6 +1,6 @@
+ from pathlib import PurePath
+ import pytest
+-from PyQt5.QtCore import QItemSelectionModel
++from PyQt5.QtCore import QDateTime, QItemSelectionModel, Qt
+ import vorta.borg
+ import vorta.utils
+ import vorta.views.archive_tab
+@@ -56,11 +56,22 @@ def check(feature_name):
+ [
+ (
+ 'changed link some/changed/link',
+- ('some/changed/link', FileType.LINK, ChangeType.CHANGED_LINK, 0, 0, None, None, None),
++ ('some/changed/link', FileType.LINK, ChangeType.CHANGED_LINK, 0, 0, None, None, None, None, None),
+ ),
+ (
+ ' +77.8 kB -77.8 kB some/changed/file',
+- ('some/changed/file', FileType.FILE, ChangeType.MODIFIED, 2 * 77800, 0, None, None, (77800, 77800)),
++ (
++ 'some/changed/file',
++ FileType.FILE,
++ ChangeType.MODIFIED,
++ 2 * 77800,
++ 0,
++ None,
++ None,
++ None,
++ None,
++ (77800, 77800),
++ ),
+ ),
+ (
+ ' +77.8 kB -77.8 kB [-rw-rw-rw- -> -rw-r--r--] some/changed/file',
+@@ -72,20 +83,33 @@ def check(feature_name):
+ 0,
+ ('-rw-rw-rw-', '-rw-r--r--'),
+ None,
++ None,
++ None,
+ (77800, 77800),
+ ),
+ ),
+ (
+ '[-rw-rw-rw- -> -rw-r--r--] some/changed/file',
+- ('some/changed/file', FileType.FILE, ChangeType.MODE, 0, 0, ('-rw-rw-rw-', '-rw-r--r--'), None, None),
++ (
++ 'some/changed/file',
++ FileType.FILE,
++ ChangeType.MODE,
++ 0,
++ 0,
++ ('-rw-rw-rw-', '-rw-r--r--'),
++ None,
++ None,
++ None,
++ None,
++ ),
+ ),
+ (
+ 'added directory some/changed/dir',
+- ('some/changed/dir', FileType.DIRECTORY, ChangeType.ADDED, 0, 0, None, None, None),
++ ('some/changed/dir', FileType.DIRECTORY, ChangeType.ADDED, 0, 0, None, None, None, None, None),
+ ),
+ (
+ 'removed directory some/changed/dir',
+- ('some/changed/dir', FileType.DIRECTORY, ChangeType.REMOVED_DIR, 0, 0, None, None, None),
++ ('some/changed/dir', FileType.DIRECTORY, ChangeType.REMOVED_DIR, 0, 0, None, None, None, None, None),
+ ),
+ # Example from https://github.com/borgbase/vorta/issues/521
+ (
+@@ -99,12 +123,25 @@ def check(feature_name):
+ None,
+ ('user', 'user', 'nfsnobody', 'nfsnobody'),
+ None,
++ None,
++ None,
+ ),
+ ),
+ # Very short owner change, to check stripping whitespace from file path
+ (
+ '[a:a -> b:b] home/user/arrays/test.txt',
+- ('home/user/arrays/test.txt', FileType.FILE, ChangeType.OWNER, 0, 0, None, ('a', 'a', 'b', 'b'), None),
++ (
++ 'home/user/arrays/test.txt',
++ FileType.FILE,
++ ChangeType.OWNER,
++ 0,
++ 0,
++ None,
++ ('a', 'a', 'b', 'b'),
++ None,
++ None,
++ None,
++ ),
+ ),
+ # All file-related changes in one test
+ (
+@@ -117,6 +154,8 @@ def check(feature_name):
+ 77000,
+ ('-rw-rw-rw-', '-rw-r--r--'),
+ ('user', 'user', 'nfsnobody', 'nfsnobody'),
++ None,
++ None,
+ (77800, 800),
+ ),
+ ),
+@@ -139,11 +178,22 @@ def test_archive_diff_parser(line, expected):
+ [
+ (
+ {'path': 'some/changed/link', 'changes': [{'type': 'changed link'}]},
+- ('some/changed/link', FileType.LINK, ChangeType.CHANGED_LINK, 0, 0, None, None, None),
++ ('some/changed/link', FileType.LINK, ChangeType.CHANGED_LINK, 0, 0, None, None, None, None, None),
+ ),
+ (
+ {'path': 'some/changed/file', 'changes': [{'type': 'modified', 'added': 77800, 'removed': 77800}]},
+- ('some/changed/file', FileType.FILE, ChangeType.MODIFIED, 2 * 77800, 0, None, None, (77800, 77800)),
++ (
++ 'some/changed/file',
++ FileType.FILE,
++ ChangeType.MODIFIED,
++ 2 * 77800,
++ 0,
++ None,
++ None,
++ None,
++ None,
++ (77800, 77800),
++ ),
+ ),
+ (
+ {
+@@ -161,6 +211,8 @@ def test_archive_diff_parser(line, expected):
+ 77000,
+ ('-rw-rw-rw-', '-rw-r--r--'),
+ None,
++ None,
++ None,
+ (77800, 800),
+ ),
+ ),
+@@ -169,15 +221,26 @@ def test_archive_diff_parser(line, expected):
+ 'path': 'some/changed/file',
+ 'changes': [{'type': 'mode', 'old_mode': '-rw-rw-rw-', 'new_mode': '-rw-r--r--'}],
+ },
+- ('some/changed/file', FileType.FILE, ChangeType.MODE, 0, 0, ('-rw-rw-rw-', '-rw-r--r--'), None, None),
++ (
++ 'some/changed/file',
++ FileType.FILE,
++ ChangeType.MODE,
++ 0,
++ 0,
++ ('-rw-rw-rw-', '-rw-r--r--'),
++ None,
++ None,
++ None,
++ None,
++ ),
+ ),
+ (
+ {'path': 'some/changed/dir', 'changes': [{'type': 'added directory'}]},
+- ('some/changed/dir', FileType.DIRECTORY, ChangeType.ADDED, 0, 0, None, None, None),
++ ('some/changed/dir', FileType.DIRECTORY, ChangeType.ADDED, 0, 0, None, None, None, None, None),
+ ),
+ (
+ {'path': 'some/changed/dir', 'changes': [{'type': 'removed directory'}]},
+- ('some/changed/dir', FileType.DIRECTORY, ChangeType.REMOVED_DIR, 0, 0, None, None, None),
++ ('some/changed/dir', FileType.DIRECTORY, ChangeType.REMOVED_DIR, 0, 0, None, None, None, None, None),
+ ),
+ # Example from https://github.com/borgbase/vorta/issues/521
+ (
+@@ -202,6 +265,8 @@ def test_archive_diff_parser(line, expected):
+ None,
+ ('user', 'user', 'nfsnobody', 'nfsnobody'),
+ None,
++ None,
++ None,
+ ),
+ ),
+ # Very short owner change, to check stripping whitespace from file path
+@@ -210,7 +275,74 @@ def test_archive_diff_parser(line, expected):
+ 'path': 'home/user/arrays/test.txt',
+ 'changes': [{'type': 'owner', 'old_user': 'a', 'new_user': 'b', 'old_group': 'a', 'new_group': 'b'}],
+ },
+- ('home/user/arrays/test.txt', FileType.FILE, ChangeType.OWNER, 0, 0, None, ('a', 'a', 'b', 'b'), None),
++ (
++ 'home/user/arrays/test.txt',
++ FileType.FILE,
++ ChangeType.OWNER,
++ 0,
++ 0,
++ None,
++ ('a', 'a', 'b', 'b'),
++ None,
++ None,
++ None,
++ ),
++ ),
++ # Short ctime change
++ (
++ {
++ 'path': 'home/user/arrays',
++ 'changes': [
++ {
++ 'new_ctime': '2023-04-01T17:23:14.104630',
++ 'old_ctime': '2023-03-03T23:40:17.073948',
++ 'type': 'ctime',
++ }
++ ],
++ },
++ (
++ 'home/user/arrays',
++ FileType.FILE,
++ ChangeType.MODIFIED,
++ 0,
++ 0,
++ None,
++ None,
++ (
++ QDateTime.fromString('2023-03-03T23:40:17.073948', Qt.DateFormat.ISODateWithMs),
++ QDateTime.fromString('2023-04-01T17:23:14.104630', Qt.DateFormat.ISODateWithMs),
++ ),
++ None,
++ None,
++ ),
++ ),
++ # Short mtime change
++ (
++ {
++ 'path': 'home/user/arrays',
++ 'changes': [
++ {
++ 'new_mtime': '2023-04-01T17:23:14.104630',
++ 'old_mtime': '2023-03-03T23:40:17.073948',
++ 'type': 'mtime',
++ }
++ ],
++ },
++ (
++ 'home/user/arrays',
++ FileType.FILE,
++ ChangeType.MODIFIED,
++ 0,
++ 0,
++ None,
++ None,
++ None,
++ (
++ QDateTime.fromString('2023-03-03T23:40:17.073948', Qt.DateFormat.ISODateWithMs),
++ QDateTime.fromString('2023-04-01T17:23:14.104630', Qt.DateFormat.ISODateWithMs),
++ ),
++ None,
++ ),
+ ),
+ # All file-related changes in one test
+ (
+@@ -226,6 +358,16 @@ def test_archive_diff_parser(line, expected):
+ 'old_group': 'user',
+ 'new_group': 'nfsnobody',
+ },
++ {
++ 'new_ctime': '2023-04-01T17:23:14.104630',
++ 'old_ctime': '2023-03-03T23:40:17.073948',
++ 'type': 'ctime',
++ },
++ {
++ 'new_mtime': '2023-04-01T17:15:50.290565',
++ 'old_mtime': '2023-03-05T00:24:00.359045',
++ 'type': 'mtime',
++ },
+ ],
+ },
+ (
+@@ -236,6 +378,14 @@ def test_archive_diff_parser(line, expected):
+ 0,
+ ('-rw-rw-rw-', '-rw-r--r--'),
+ ('user', 'user', 'nfsnobody', 'nfsnobody'),
++ (
++ QDateTime.fromString('2023-03-03T23:40:17.073948', Qt.DateFormat.ISODateWithMs),
++ QDateTime.fromString('2023-04-01T17:23:14.104630', Qt.DateFormat.ISODateWithMs),
++ ),
++ (
++ QDateTime.fromString('2023-03-05T00:24:00.359045', Qt.DateFormat.ISODateWithMs),
++ QDateTime.fromString('2023-04-01T17:15:50.290565', Qt.DateFormat.ISODateWithMs),
++ ),
+ (77800, 77800),
+ ),
+ ),
diff -Nru vorta-0.8.10/debian/patches/series vorta-0.8.10/debian/patches/series
--- vorta-0.8.10/debian/patches/series 2023-01-23 15:06:42.000000000 -0500
+++ vorta-0.8.10/debian/patches/series 2023-07-31 11:10:53.000000000 -0400
@@ -3,3 +3,4 @@
0003-fix-generic-privacy-breach-in-appdata.patch
0004-use-python3-in-Makefile.patch
0005-enable-colour-icon-in-notifications.patch
+0006-Handle-ctime-and-mtime-diff-changes-1675.patch
Cheers, Nicholas
Attachment:
signature.asc
Description: PGP signature