diff options
-rw-r--r-- | freefilesync/README.md | 35 | ||||
-rw-r--r-- | freefilesync/debian/changelog | 18 | ||||
-rw-r--r-- | freefilesync/debian/freefilesync+devuan.dsc | 2 | ||||
-rw-r--r-- | freefilesync/debian/patches/ffs_curl.patch | 20 | ||||
-rw-r--r-- | freefilesync/debian/patches/ffs_libssh2.patch | 7 | ||||
-rw-r--r-- | freefilesync/debian/patches/ffs_traditional_view.patch | 118 | ||||
-rwxr-xr-x | freefilesync/debian/rules | 26 | ||||
-rw-r--r-- | freefilesync/ffs_curl.patch | 39 | ||||
-rw-r--r-- | freefilesync/ffs_libssh2.patch | 12 | ||||
-rw-r--r-- | freefilesync/ffs_traditional_view.patch | 118 | ||||
-rw-r--r-- | freefilesync/freefilesync.spec | 11 |
11 files changed, 202 insertions, 204 deletions
diff --git a/freefilesync/README.md b/freefilesync/README.md index c09acd5..1e0b276 100644 --- a/freefilesync/README.md +++ b/freefilesync/README.md @@ -1,24 +1,31 @@ -# FreeFileSync upstream +# Readme for freefilesync + +## FreeFileSync upstream https://freefilesync.org -Forked from `https://github.com/PhantomX/chinforpms/blob/master/_pasture/freefilesync/freefilesync.spec` +Forked from [https://github.com/PhantomX/chinforpms/blob/master/\_pasture/freefilesync/freefilesync.spec](https://github.com/PhantomX/chinforpms/blob/master/_pasture/freefilesync/freefilesync.spec) https://gitlab.com/opensource-tracking/FreeFileSync -# Reason for being in stackrpms +## Reason for being in stackrpms Fedora, CentOS, and Devuan do not package FreeFileSync. I maintained a separate spec file for this application, but rebased to a fork from PhantomX. -# Reverse dependency matrix +## Alternatives +* rsync traditional cli sync utility +* grsync gtk frotend for rsync +* duplicati sync with cloud storage offerings +* rclone another cloud storage sync utility + +## Reverse dependency matrix Distro | FreeFileSync version | gtk version -------------- | -------------------- | ---------------- -CentOS 7 | 10.19 | 2 -CentOS 8 | 10.19 | 2 -Fedora 29 | 10.19 | 2 -Fedora 30 | 10.19 | 2 -Fedora 31 | 10.19 | 2 -Fedora Rawhide | 10.19 | 2 -Devuan Ceres | 10.19 | 2 (stable), 3 (unstable) +CentOS 7 | 10.24 | 2 +CentOS 8 | 10.24 | 2 +Fedora 32 | 11.3 | 2 +Fedora 33 | 11.3 | 2 +Fedora Rawhide | 11.3 | 2 +Devuan Ceres | 11.3 | 3 -# Additional info -Devuan upstream recently dropped gtk2 packages required for building FreeFileSync. This means that OBS can only build the gtk3 version, which has some serious stability problems. My local gtk2 build is much more stable but depends on my local devuan-archive repo. +## Additional info +Upstream officially still [uses gtk2](https://freefilesync.org/forum/viewtopic.php?t=7660&p=26079#p26063) but the code supports gtk3 starting around version 10.25. With version 10.25, only stdc++=20 is supported, so el7 cannot go any higher: I was unable to find g++-10 for el7. -# Differences from upstream +## Differences from upstream None diff --git a/freefilesync/debian/changelog b/freefilesync/debian/changelog index 301e624..2e40831 100644 --- a/freefilesync/debian/changelog +++ b/freefilesync/debian/changelog @@ -1,3 +1,21 @@ +freefilesync (11.3-1+devuan) obs; urgency=low + + * Upstream updates + - Enhanced main grid color scheme + - Mouse-highlight for file selection + - Added file create/delete indicators + - Show file list tooltip for missing items + - Click folder name and scroll to group start + - Log failure to create application default config folder + - Added tooltips and fixed help link context menu + - Fixed tooltip not updated when scrolling (macOS, Linux) + - Move error dialogs to foreground during batch sync + - Align context menu popup positions + - Updated translation files + * [bgstack15] update traditional view patch + + -- Ben Stack <bgstack15@gmail.com> Mon, 02 Nov 2020 07:44:57 -0500 + freefilesync (11.2-1+devuan) obs; urgency=low * Upstream updates diff --git a/freefilesync/debian/freefilesync+devuan.dsc b/freefilesync/debian/freefilesync+devuan.dsc index e5cae56..347d8d8 100644 --- a/freefilesync/debian/freefilesync+devuan.dsc +++ b/freefilesync/debian/freefilesync+devuan.dsc @@ -2,7 +2,7 @@ Format: 3.0 (quilt) Source: freefilesync Binary: freefilesync Architecture: any -Version: 11.2-1+devuan +Version: 11.3-1+devuan Maintainer: B Stack <bgstack15@gmail.com> Homepage: https://freefilesync.org/ Standards-Version: 4.1.4 diff --git a/freefilesync/debian/patches/ffs_curl.patch b/freefilesync/debian/patches/ffs_curl.patch index 549d9ac..604ab30 100644 --- a/freefilesync/debian/patches/ffs_curl.patch +++ b/freefilesync/debian/patches/ffs_curl.patch @@ -1,10 +1,10 @@ Source: AUR -Author: Simon Brulhart -Date: 2019-10-20 21:33:47 +0200 +Author: Simon Brulhart, bgstack15 +Date: 2020-11-01 17:22:33 -0500 Message: remove assertion for libcurl version >1.67 (1.66 should be safe but slower) The upstream release uses the curl git master branch instead of release versions. The AUR guy thinks it's acceptable to use the older version of libcurl, that is actually already released. -Version: FreeFileSync 10.17 +Version: FreeFileSync 11.3 diff -r -u 10.17-0/FreeFileSync/Source/afs/ftp.cpp 10.17-1/FreeFileSync/Source/afs/ftp.cpp --- 10.21-0/FreeFileSync/Source/afs/ftp.cpp 2020-03-18 08:56:08.608066350 -0400 +++ 10.21-1/FreeFileSync/Source/afs/ftp.cpp 2020-03-18 09:23:46.882110499 -0400 @@ -17,18 +17,18 @@ diff -r -u 10.17-0/FreeFileSync/Source/afs/ftp.cpp 10.17-1/FreeFileSync/Source/a /* 1. CURLFTPMETHOD_NOCWD requires absolute paths to unconditionally skip CWDs: https://github.com/curl/curl/pull/4382 2. CURLFTPMETHOD_SINGLECWD requires absolute paths to skip one needless "CWD entry path": https://github.com/curl/curl/pull/4332 => https://curl.haxx.se/docs/faq.html#How_do_I_list_the_root_dir_of_an -diff -Naur 10.20-0/libcurl/curl_wrap.h 10.20-1/libcurl/curl_wrap.h ---- 10.21-0/libcurl/curl_wrap.h 2020-03-18 08:56:08.488065042 -0400 -+++ 10.21-1/libcurl/curl_wrap.h 2020-03-18 09:25:52.871480165 -0400 -@@ -137,9 +137,9 @@ +diff -x '*.orig' -x '*.rej' -aur 11.3-0/libcurl/curl_wrap.h 11.3-1/libcurl/curl_wrap.h +--- 11.3-0/libcurl/curl_wrap.h 2020-11-01 17:14:27.183497417 -0500 ++++ 11.3-1/libcurl/curl_wrap.h 2020-11-01 17:21:38.883967113 -0500 +@@ -137,10 +137,7 @@ ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_AUTH_ERROR); ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_HTTP3); ZEN_CHECK_CASE_FOR_CONSTANT(CURL_LAST); - ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_QUIC_CONNECT_ERROR); -+ //ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_QUIC_CONNECT_ERROR); +- ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_PROXY); } -- static_assert(CURL_LAST == CURLE_QUIC_CONNECT_ERROR + 1); -+ //static_assert(CURL_LAST == CURLE_QUIC_CONNECT_ERROR + 1); +- static_assert(CURL_LAST == CURLE_PROXY + 1); return replaceCpy<std::wstring>(L"Curl status %x", L"%x", numberTo<std::wstring>(static_cast<int>(sc))); } + diff --git a/freefilesync/debian/patches/ffs_libssh2.patch b/freefilesync/debian/patches/ffs_libssh2.patch index d5ca14e..022914b 100644 --- a/freefilesync/debian/patches/ffs_libssh2.patch +++ b/freefilesync/debian/patches/ffs_libssh2.patch @@ -9,8 +9,8 @@ Source: <none> Author: B Stack Message: libssh2 v1.8.0 does not yet implement these two error messages. I do not know why distros are not serving libssh2 v1.9.0 which wa released June 20, 2019. Date: 2019-09-17T13:41:23Z ---- 10.21-0/libssh2/libssh2_wrap.h 2020-03-18 08:56:08.500065173 -0400 -+++ 10.21-1/libssh2/libssh2_wrap.h 2020-03-18 09:11:49.398311857 -0400 +--- 11.3-0/libssh2/libssh2_wrap.h 2020-11-01 17:14:27.203497619 -0500 ++++ 11.3-1/libssh2/libssh2_wrap.h 2020-11-01 17:18:42.294130563 -0500 @@ -172,8 +172,8 @@ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_ENCRYPT); ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_BAD_SOCKET); @@ -20,5 +20,6 @@ Date: 2019-09-17T13:41:23Z + //ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_WINDOW_FULL); + //ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_KEYFILE_AUTH_FAILED); - default: + default: return replaceCpy<std::wstring>(L"SSH status %x", L"%x", numberTo<std::wstring>(sc)); + diff --git a/freefilesync/debian/patches/ffs_traditional_view.patch b/freefilesync/debian/patches/ffs_traditional_view.patch index 173842f..ff78325 100644 --- a/freefilesync/debian/patches/ffs_traditional_view.patch +++ b/freefilesync/debian/patches/ffs_traditional_view.patch @@ -1,7 +1,11 @@ -diff -x '.git*' -x '*.orig' -x '*.rej' -aur 11.2-1/FreeFileSync/Source/ui/file_grid.cpp 11.2-1-trad3/FreeFileSync/Source/ui/file_grid.cpp ---- 11.2-1/FreeFileSync/Source/ui/file_grid.cpp 2020-10-02 14:39:05.289463269 -0400 -+++ 11.2-1-trad3/FreeFileSync/Source/ui/file_grid.cpp 2020-10-02 20:48:25.047194116 -0400 -@@ -446,8 +446,10 @@ +Version: 11.3 +Date: 2020-11-01 +Author: bgstack15@gmail.com +Message: restore a traditional view to FreeFileSync +diff -x '*.orig' -x '*.rej' -aur 11.3-0/FreeFileSync/Source/ui/file_grid.cpp 11.3-1/FreeFileSync/Source/ui/file_grid.cpp +--- 11.3-0/FreeFileSync/Source/ui/file_grid.cpp 2020-11-01 17:14:27.531500950 -0500 ++++ 11.3-1/FreeFileSync/Source/ui/file_grid.cpp 2020-11-01 22:52:14.590746142 -0500 +@@ -493,8 +493,10 @@ case ItemPathFormat::name: return utfTo<std::wstring>(fsObj->getItemName<side>()); case ItemPathFormat::relative: @@ -12,20 +16,11 @@ diff -x '.git*' -x '*.orig' -x '*.rej' -aur 11.2-1/FreeFileSync/Source/ui/file_g return AFS::getDisplayPath(fsObj->getAbstractPath<side>()); } assert(false); -@@ -529,7 +531,8 @@ - //---------------------------------------------------------------------------------- - wxDCPenChanger dummy(dc, wxPen(row == pdi.groupLastRow - 1 /*last group item*/ ? - getColorGridLine() : getDefaultBackgroundColorAlternating(pdi.groupIdx % 2 != 0), fastFromDIP(1))); -- dc.DrawLine(rect.GetBottomLeft(), rect.GetBottomRight() + wxPoint(1, 0)); -+ if (itemPathFormat_ != ItemPathFormat::traditional && itemPathFormat_ != ItemPathFormat::tradrel) -+ dc.DrawLine(rect.GetBottomLeft(), rect.GetBottomRight() + wxPoint(1, 0)); - } - - -@@ -628,6 +631,24 @@ +@@ -654,6 +656,27 @@ else //=> BaseFolderPair groupParentFolder = AFS::getDisplayPath(pdi.fsObj->base().getAbstractPath<side>()); break; ++ + case ItemPathFormat::traditional: + if (auto groupFolder = dynamic_cast<const FolderPair*>(pdi.folderGroupObj)) + { @@ -36,6 +31,7 @@ diff -x '.git*' -x '*.orig' -x '*.rej' -aur 11.2-1/FreeFileSync/Source/ui/file_g + else //=> BaseFolderPair + groupParentFolder = AFS::getDisplayPath(pdi.fsObj->base().getAbstractPath<side>()); + break; ++ + case ItemPathFormat::tradrel: + if (pdi.folderGroupObj) + { @@ -44,25 +40,26 @@ diff -x '.git*' -x '*.orig' -x '*.rej' -aur 11.2-1/FreeFileSync/Source/ui/file_g + utfTo<std::wstring>(pdi.folderGroupObj ->template getItemName<side>()); + } + break; ++ } //path components should follow the app layout direction and are NOT a single piece of text! -@@ -655,6 +676,31 @@ - int widthGroupName = groupName .empty() ? 0 : (iconSize + gridGap_ + getTextExtentBuffered(dc, groupName).x + 2 * gridGap_); - int widthGroupItems = widthGroupSep + (drawFileIcons ? iconSize + gridGap_ : 0) + groupItemNamesWidth; +@@ -684,6 +707,31 @@ + int groupItemsWidth = groupSepWidth + (drawFileIcons ? gapSize_ + iconSize : 0) + gapSize_ + groupItemNamesWidth; + const int groupItemsMinWidth = groupSepWidth + (drawFileIcons ? gapSize_ + iconSize : 0) + gapSize_ + ellipsisWidth; -+ // start trad patch ++ // start trad patch + -+ //add slashes for better readability -+ assert(!contains(groupParentFolder, L'/') || !contains(groupParentFolder, L'\\')); -+ const wchar_t groupParentSep = contains(groupParentFolder, L'/') ? L'/' : (contains(groupParentFolder, L'\\') ? L'\\' : FILE_NAME_SEPARATOR); ++ // rearrange this one section ++ //add slashes for better readability + a wide gap for disambiguation ++ assert(!contains(groupParentFolder, L'/') || !contains(groupParentFolder, L'\\')); ++ const wchar_t groupParentSep = contains(groupParentFolder, L'/') ? L'/' : (contains(groupParentFolder, L'\\') ? L'\\' : FILE_NAME_SEPARATOR); + + switch (itemPathFormat_) + { + case ItemPathFormat::traditional: + case ItemPathFormat::tradrel: -+ widthGroupParent -= widthGroupName - getTextExtentBuffered(dc, utfTo<std::wstring>(FILE_NAME_SEPARATOR)).x; -+ ++ groupParentWidth -= groupNameWidth - getTextExtentBuffered(dc, utfTo<std::wstring>(FILE_NAME_SEPARATOR)).x; + if (!endsWith(groupParentFolder, L'/' ) && //e.g. ftp://server/ + !endsWith(groupParentFolder, L'\\') && /*e.g. C:\ */ + groupParentFolder.size() > 0 ) @@ -77,83 +74,72 @@ diff -x '.git*' -x '*.orig' -x '*.rej' -aur 11.2-1/FreeFileSync/Source/ui/file_g + // but with the "add slashes" paragraph 1 moved to above this switch statement! + //not enough space? => collapse - if (int excessWidth = gridGap_ + widthGroupParent + widthGroupName + widthGroupItems - maxWidth; + if (int excessWidth = groupParentWidth + groupNameWidth + groupItemsWidth - maxWidth; excessWidth > 0) -@@ -664,10 +710,6 @@ +@@ -693,10 +741,6 @@ //1. render group components on two rows stackedGroupRender = true; -- //add slashes for better readability +- //add slashes for better readability + a wide gap for disambiguation - assert(!contains(groupParentFolder, L'/') || !contains(groupParentFolder, L'\\')); - const wchar_t groupParentSep = contains(groupParentFolder, L'/') ? L'/' : (contains(groupParentFolder, L'\\') ? L'\\' : FILE_NAME_SEPARATOR); - if (!endsWith(groupParentFolder, L'/' ) && //e.g. ftp://server/ !endsWith(groupParentFolder, L'\\')) /*e.g. C:\ */ groupParentFolder += groupParentSep; -@@ -725,6 +767,11 @@ +@@ -755,6 +799,11 @@ + } } } - ++ + // end of original section, and back to the trad patch! + break; + } + // and end the addition for trad patch -+ + return { - itemName, -@@ -793,6 +840,9 @@ +@@ -873,6 +922,9 @@ rectGroup = rectGroupParent = rectGroupName = rectTmp; - rectGroupParent.width = widthGroupParent; + rectGroupParent.width = groupParentWidth; + // re-add back the width of groupname so that the directory name is clickable + if (itemPathFormat_ == ItemPathFormat::traditional || itemPathFormat_ == ItemPathFormat::tradrel) -+ rectGroupParent.width += widthGroupName; - rectGroupName .width = widthGroupName; ++ rectGroupParent.width += groupNameWidth; + rectGroupName .width = groupNameWidth; if (stackedGroupRender) -@@ -829,7 +879,8 @@ - if (row == pdi.groupLastRow - 1 /*last group item*/) //restore the group separation line we just cleared - { - wxDCPenChanger dummy(dc, wxPen(getColorGridLine(), fastFromDIP(1))); -- dc.DrawLine(rectGroup.GetBottomLeft(), rectGroup.GetBottomRight() + wxPoint(1, 0)); -+ if (itemPathFormat_ != ItemPathFormat::traditional && itemPathFormat_ != ItemPathFormat::tradrel) -+ dc.DrawLine(rectGroup.GetBottomLeft(), rectGroup.GetBottomRight() + wxPoint(1, 0)); - } - } +@@ -922,6 +974,7 @@ + rectNav.width = fastFromDIP(20); -@@ -844,7 +895,7 @@ - dc.GradientFillLinear(rectNav, getColorSelectionGradientFrom(), backCol, wxEAST); - } + if (row == pdi.groupLastRow - 1 /*last group item*/) //preserve the group separation line! ++ if (itemPathFormat_ != ItemPathFormat::traditional && itemPathFormat_ != ItemPathFormat::tradrel) + rectNav.height -= fastFromDIP(1); + + wxColor backCol = *wxWHITE; +@@ -930,7 +983,7 @@ + dc.GradientFillLinear(rectNav, getColorSelectionGradientFrom(), backCol, wxEAST); + } - if (!groupName.empty() && row == groupFirstRow) + if (!(itemPathFormat_ == ItemPathFormat::traditional || itemPathFormat_ == ItemPathFormat::tradrel) && !groupName.empty() && row == groupFirstRow) { - wxDCTextColourChanger textColorGroupName(dc); - if (static_cast<HoverAreaGroup>(rowHover) == HoverAreaGroup::groupName) -@@ -865,9 +916,9 @@ - drawCellText(dc, rectGroupName, groupName, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, &getTextExtentBuffered(dc, groupName)); + wxRect rectGroupNameBack = rectGroupName; + rectGroupNameBack.width += 2 * gapSize_; //include gap left of vline +@@ -972,10 +1025,10 @@ + drawCellText(dc, rectGroupName, groupName, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, &getTextExtentBuffered(dc, groupName)); } - if (!groupParentFolder.empty() && + if (itemPathFormat_ == ItemPathFormat::traditional || itemPathFormat_ == ItemPathFormat::tradrel || (!groupParentFolder.empty() && (( stackedGroupRender && row == groupFirstRow + 1) || -- (!stackedGroupRender && row == groupFirstRow))) -+ (!stackedGroupRender && row == groupFirstRow)))) + (!stackedGroupRender && row == groupFirstRow)) && +- (groupName.empty() || !pdi.folderGroupObj->isEmpty<side>())) ++ (groupName.empty() || !pdi.folderGroupObj->isEmpty<side>()))) { - drawCellText(dc, rectGroupParent, groupParentFolder, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, &getTextExtentBuffered(dc, groupParentFolder)); - } -@@ -876,7 +927,8 @@ - if (!groupParentFolder.empty() || !groupName.empty()) - { - wxDCPenChanger dummy(dc, wxPen(getColorGridLine(), fastFromDIP(1))); -- dc.DrawLine(rectGroupItems.GetTopLeft(), rectGroupItems.GetBottomLeft() + wxPoint(0, 1)); //draws half-open range! -+ if (itemPathFormat_ != ItemPathFormat::traditional && itemPathFormat_ != ItemPathFormat::tradrel) -+ dc.DrawLine(rectGroupItems.GetTopLeft(), rectGroupItems.GetBottomLeft() + wxPoint(0, 1)); //draws half-open range! - rectGroupItems.x += fastFromDIP(1) + gridGap_; - rectGroupItems.width -= fastFromDIP(1) + gridGap_; - } -@@ -1040,6 +1092,10 @@ + wxRect rectGroupParentText = rectGroupParent; + rectGroupParentText.x += gapSize_; +@@ -1166,6 +1219,10 @@ return _("Relative path"); case ItemPathFormat::full: return _("Full path"); diff --git a/freefilesync/debian/rules b/freefilesync/debian/rules index a359bd9..2d49df4 100755 --- a/freefilesync/debian/rules +++ b/freefilesync/debian/rules @@ -24,7 +24,7 @@ override_dh_auto_clean: dh_auto_clean dh_auto_clean --sourcedirectory=FreeFileSync/Source dh_auto_clean --sourcedirectory=FreeFileSync/Source/RealTimeSync - rm -f ${pkgname}.png ${prog2name}.png file_batch.png + rm -f ${pkgname}.png ${prog2name}.png cfg_batch.png override_dh_auto_build: dh_auto_build @@ -56,7 +56,7 @@ override_dh_auto_install: # handled by dpkg already # icons - unzip ${pkgname}/Build/Resources/Icons.zip file_batch.png file_sync.png + unzip ${pkgname}/Build/Resources/Icons.zip cfg_batch.png start_sync.png mkdir -p ${buildroot}${_datadir}/icons/hicolor/16x16/apps mkdir -p ${buildroot}${_datadir}/icons/hicolor/32x32/apps mkdir -p ${buildroot}${_datadir}/icons/hicolor/48x48/apps @@ -79,23 +79,23 @@ override_dh_auto_install: convert ${pkgname}/Build/Resources/${prog2name}.png -filter Lanczos -resize 64x64 ${buildroot}${_datadir}/icons/hicolor/64x64/apps/${prog2name}.png convert ${pkgname}/Build/Resources/${prog2name}.png -filter Lanczos -resize 128x128 ${buildroot}${_datadir}/icons/hicolor/128x128/apps/${prog2name}.png # mimetypes - convert file_batch.png -filter Lanczos -resize 16x16 ${buildroot}${_datadir}/icons/hicolor/16x16/mimetypes/application-x-freefilesync-batch.png - convert file_batch.png -filter Lanczos -resize 32x32 ${buildroot}${_datadir}/icons/hicolor/32x32/mimetypes/application-x-freefilesync-batch.png - convert file_batch.png -filter Lanczos -resize 48x48 ${buildroot}${_datadir}/icons/hicolor/48x48/mimetypes/application-x-freefilesync-batch.png - convert file_batch.png -filter Lanczos -resize 64x64 ${buildroot}${_datadir}/icons/hicolor/64x64/mimetypes/application-x-freefilesync-batch.png - convert file_batch.png -filter Lanczos -resize 128x128 ${buildroot}${_datadir}/icons/hicolor/128x128/mimetypes/application-x-freefilesync-batch.png - convert file_sync.png -filter Lanczos -resize 16x16 ${buildroot}${_datadir}/icons/hicolor/16x16/mimetypes/application-x-freefilesync-ffs.png - convert file_sync.png -filter Lanczos -resize 32x32 ${buildroot}${_datadir}/icons/hicolor/32x32/mimetypes/application-x-freefilesync-ffs.png - convert file_sync.png -filter Lanczos -resize 48x48 ${buildroot}${_datadir}/icons/hicolor/48x48/mimetypes/application-x-freefilesync-ffs.png - convert file_sync.png -filter Lanczos -resize 64x64 ${buildroot}${_datadir}/icons/hicolor/64x64/mimetypes/application-x-freefilesync-ffs.png - convert file_sync.png -filter Lanczos -resize 128x128 ${buildroot}${_datadir}/icons/hicolor/128x128/mimetypes/application-x-freefilesync-ffs.png + convert cfg_batch.png -filter Lanczos -resize 16x16 ${buildroot}${_datadir}/icons/hicolor/16x16/mimetypes/application-x-freefilesync-batch.png + convert cfg_batch.png -filter Lanczos -resize 32x32 ${buildroot}${_datadir}/icons/hicolor/32x32/mimetypes/application-x-freefilesync-batch.png + convert cfg_batch.png -filter Lanczos -resize 48x48 ${buildroot}${_datadir}/icons/hicolor/48x48/mimetypes/application-x-freefilesync-batch.png + convert cfg_batch.png -filter Lanczos -resize 64x64 ${buildroot}${_datadir}/icons/hicolor/64x64/mimetypes/application-x-freefilesync-batch.png + convert cfg_batch.png -filter Lanczos -resize 128x128 ${buildroot}${_datadir}/icons/hicolor/128x128/mimetypes/application-x-freefilesync-batch.png + convert start_sync.png -filter Lanczos -resize 16x16 ${buildroot}${_datadir}/icons/hicolor/16x16/mimetypes/application-x-freefilesync-ffs.png + convert start_sync.png -filter Lanczos -resize 32x32 ${buildroot}${_datadir}/icons/hicolor/32x32/mimetypes/application-x-freefilesync-ffs.png + convert start_sync.png -filter Lanczos -resize 48x48 ${buildroot}${_datadir}/icons/hicolor/48x48/mimetypes/application-x-freefilesync-ffs.png + convert start_sync.png -filter Lanczos -resize 64x64 ${buildroot}${_datadir}/icons/hicolor/64x64/mimetypes/application-x-freefilesync-ffs.png + convert start_sync.png -filter Lanczos -resize 128x128 ${buildroot}${_datadir}/icons/hicolor/128x128/mimetypes/application-x-freefilesync-ffs.png convert ${pkgname}/Build/Resources/${prog2name}.png -filter Lanczos -resize 16x16 ${buildroot}${_datadir}/icons/hicolor/16x16/mimetypes/application-x-freefilesync-real.png convert ${pkgname}/Build/Resources/${prog2name}.png -filter Lanczos -resize 32x32 ${buildroot}${_datadir}/icons/hicolor/32x32/mimetypes/application-x-freefilesync-real.png convert ${pkgname}/Build/Resources/${prog2name}.png -filter Lanczos -resize 48x48 ${buildroot}${_datadir}/icons/hicolor/48x48/mimetypes/application-x-freefilesync-real.png convert ${pkgname}/Build/Resources/${prog2name}.png -filter Lanczos -resize 64x64 ${buildroot}${_datadir}/icons/hicolor/64x64/mimetypes/application-x-freefilesync-real.png convert ${pkgname}/Build/Resources/${prog2name}.png -filter Lanczos -resize 128x128 ${buildroot}${_datadir}/icons/hicolor/128x128/mimetypes/application-x-freefilesync-real.png - rm -f file_batch.png file_sync.png + rm -f cfg_batch.png start_sync.png override_dh_fixperms: dh_fixperms || : diff --git a/freefilesync/ffs_curl.patch b/freefilesync/ffs_curl.patch index ec038d7..604ab30 100644 --- a/freefilesync/ffs_curl.patch +++ b/freefilesync/ffs_curl.patch @@ -1,39 +1,34 @@ Source: AUR -Author: Simon Brulhart -Date: 2019-10-20 21:33:47 +0200 +Author: Simon Brulhart, bgstack15 +Date: 2020-11-01 17:22:33 -0500 Message: remove assertion for libcurl version >1.67 (1.66 should be safe but slower) The upstream release uses the curl git master branch instead of release versions. The AUR guy thinks it's acceptable to use the older version of libcurl, that is actually already released. -Version: FreeFileSync 10.17 - -# ffs_curl.patch is different between the rpm and dpkg +Version: FreeFileSync 11.3 diff -r -u 10.17-0/FreeFileSync/Source/afs/ftp.cpp 10.17-1/FreeFileSync/Source/afs/ftp.cpp ---- 10.17-0/FreeFileSync/Source/afs/ftp.cpp 2019-10-17 18:37:03.000000000 +0200 -+++ 10.17-1/FreeFileSync/Source/afs/ftp.cpp 2019-10-20 20:18:07.221692533 +0200 -@@ -632,7 +632,7 @@ +--- 10.21-0/FreeFileSync/Source/afs/ftp.cpp 2020-03-18 08:56:08.608066350 -0400 ++++ 10.21-1/FreeFileSync/Source/afs/ftp.cpp 2020-03-18 09:23:46.882110499 -0400 +@@ -635,7 +635,7 @@ curlRelPath += compFmt; } - static_assert(LIBCURL_VERSION_MAJOR > 7 || (LIBCURL_VERSION_MAJOR == 7 && LIBCURL_VERSION_MINOR >= 67)); -+ // static_assert(LIBCURL_VERSION_MAJOR > 7 || (LIBCURL_VERSION_MAJOR == 7 && LIBCURL_VERSION_MINOR >= 67)); ++ static_assert(LIBCURL_VERSION_MAJOR > 7 || (LIBCURL_VERSION_MAJOR == 7 && LIBCURL_VERSION_MINOR >= 68)); /* 1. CURLFTPMETHOD_NOCWD requires absolute paths to unconditionally skip CWDs: https://github.com/curl/curl/pull/4382 2. CURLFTPMETHOD_SINGLECWD requires absolute paths to skip one needless "CWD entry path": https://github.com/curl/curl/pull/4332 => https://curl.haxx.se/docs/faq.html#How_do_I_list_the_root_dir_of_an - -Message: For Fedora <= 30 that has curl < 7.66.0 you need this patch. -diff -Naur 10.20-0/libcurl/curl_wrap.h 10.20-1/libcurl/curl_wrap.h ---- 10.22-0/libcurl/curl_wrap.h 2020-03-18 15:49:57.839901161 -0400 -+++ 10.22-1/libcurl/curl_wrap.h 2020-03-18 15:56:21.034499900 -0400 -@@ -134,12 +134,7 @@ - ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_SSL_INVALIDCERTSTATUS); - ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_HTTP2_STREAM); - ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_RECURSIVE_API_CALL); -- ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_AUTH_ERROR); -- ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_HTTP3); -- ZEN_CHECK_CASE_FOR_CONSTANT(CURL_LAST); +diff -x '*.orig' -x '*.rej' -aur 11.3-0/libcurl/curl_wrap.h 11.3-1/libcurl/curl_wrap.h +--- 11.3-0/libcurl/curl_wrap.h 2020-11-01 17:14:27.183497417 -0500 ++++ 11.3-1/libcurl/curl_wrap.h 2020-11-01 17:21:38.883967113 -0500 +@@ -137,10 +137,7 @@ + ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_AUTH_ERROR); + ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_HTTP3); + ZEN_CHECK_CASE_FOR_CONSTANT(CURL_LAST); - ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_QUIC_CONNECT_ERROR); +- ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_PROXY); } -- static_assert(CURL_LAST == CURLE_QUIC_CONNECT_ERROR + 1); +- static_assert(CURL_LAST == CURLE_PROXY + 1); return replaceCpy<std::wstring>(L"Curl status %x", L"%x", numberTo<std::wstring>(static_cast<int>(sc))); } + diff --git a/freefilesync/ffs_libssh2.patch b/freefilesync/ffs_libssh2.patch index 0872f32..022914b 100644 --- a/freefilesync/ffs_libssh2.patch +++ b/freefilesync/ffs_libssh2.patch @@ -9,15 +9,17 @@ Source: <none> Author: B Stack Message: libssh2 v1.8.0 does not yet implement these two error messages. I do not know why distros are not serving libssh2 v1.9.0 which wa released June 20, 2019. Date: 2019-09-17T13:41:23Z -diff -Naur /usr/src/freefilesync/10.20-0/libssh2/libssh2_wrap.h /usr/src/freefilesync/10.20-1/libssh2/libssh2_wrap.h ---- 10.22-0/libssh2/libssh2_wrap.h 2020-03-18 15:49:57.839901161 -0400 -+++ 10.22-1/libssh2/libssh2_wrap.h 2020-03-18 16:17:29.758794018 -0400 -@@ -172,8 +172,6 @@ +--- 11.3-0/libssh2/libssh2_wrap.h 2020-11-01 17:14:27.203497619 -0500 ++++ 11.3-1/libssh2/libssh2_wrap.h 2020-11-01 17:18:42.294130563 -0500 +@@ -172,8 +172,8 @@ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_ENCRYPT); ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_BAD_SOCKET); ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_KNOWN_HOSTS); - ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_WINDOW_FULL); - ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_KEYFILE_AUTH_FAILED); ++ //ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_WINDOW_FULL); ++ //ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_KEYFILE_AUTH_FAILED); - default: + default: return replaceCpy<std::wstring>(L"SSH status %x", L"%x", numberTo<std::wstring>(sc)); + diff --git a/freefilesync/ffs_traditional_view.patch b/freefilesync/ffs_traditional_view.patch index 173842f..ff78325 100644 --- a/freefilesync/ffs_traditional_view.patch +++ b/freefilesync/ffs_traditional_view.patch @@ -1,7 +1,11 @@ -diff -x '.git*' -x '*.orig' -x '*.rej' -aur 11.2-1/FreeFileSync/Source/ui/file_grid.cpp 11.2-1-trad3/FreeFileSync/Source/ui/file_grid.cpp ---- 11.2-1/FreeFileSync/Source/ui/file_grid.cpp 2020-10-02 14:39:05.289463269 -0400 -+++ 11.2-1-trad3/FreeFileSync/Source/ui/file_grid.cpp 2020-10-02 20:48:25.047194116 -0400 -@@ -446,8 +446,10 @@ +Version: 11.3 +Date: 2020-11-01 +Author: bgstack15@gmail.com +Message: restore a traditional view to FreeFileSync +diff -x '*.orig' -x '*.rej' -aur 11.3-0/FreeFileSync/Source/ui/file_grid.cpp 11.3-1/FreeFileSync/Source/ui/file_grid.cpp +--- 11.3-0/FreeFileSync/Source/ui/file_grid.cpp 2020-11-01 17:14:27.531500950 -0500 ++++ 11.3-1/FreeFileSync/Source/ui/file_grid.cpp 2020-11-01 22:52:14.590746142 -0500 +@@ -493,8 +493,10 @@ case ItemPathFormat::name: return utfTo<std::wstring>(fsObj->getItemName<side>()); case ItemPathFormat::relative: @@ -12,20 +16,11 @@ diff -x '.git*' -x '*.orig' -x '*.rej' -aur 11.2-1/FreeFileSync/Source/ui/file_g return AFS::getDisplayPath(fsObj->getAbstractPath<side>()); } assert(false); -@@ -529,7 +531,8 @@ - //---------------------------------------------------------------------------------- - wxDCPenChanger dummy(dc, wxPen(row == pdi.groupLastRow - 1 /*last group item*/ ? - getColorGridLine() : getDefaultBackgroundColorAlternating(pdi.groupIdx % 2 != 0), fastFromDIP(1))); -- dc.DrawLine(rect.GetBottomLeft(), rect.GetBottomRight() + wxPoint(1, 0)); -+ if (itemPathFormat_ != ItemPathFormat::traditional && itemPathFormat_ != ItemPathFormat::tradrel) -+ dc.DrawLine(rect.GetBottomLeft(), rect.GetBottomRight() + wxPoint(1, 0)); - } - - -@@ -628,6 +631,24 @@ +@@ -654,6 +656,27 @@ else //=> BaseFolderPair groupParentFolder = AFS::getDisplayPath(pdi.fsObj->base().getAbstractPath<side>()); break; ++ + case ItemPathFormat::traditional: + if (auto groupFolder = dynamic_cast<const FolderPair*>(pdi.folderGroupObj)) + { @@ -36,6 +31,7 @@ diff -x '.git*' -x '*.orig' -x '*.rej' -aur 11.2-1/FreeFileSync/Source/ui/file_g + else //=> BaseFolderPair + groupParentFolder = AFS::getDisplayPath(pdi.fsObj->base().getAbstractPath<side>()); + break; ++ + case ItemPathFormat::tradrel: + if (pdi.folderGroupObj) + { @@ -44,25 +40,26 @@ diff -x '.git*' -x '*.orig' -x '*.rej' -aur 11.2-1/FreeFileSync/Source/ui/file_g + utfTo<std::wstring>(pdi.folderGroupObj ->template getItemName<side>()); + } + break; ++ } //path components should follow the app layout direction and are NOT a single piece of text! -@@ -655,6 +676,31 @@ - int widthGroupName = groupName .empty() ? 0 : (iconSize + gridGap_ + getTextExtentBuffered(dc, groupName).x + 2 * gridGap_); - int widthGroupItems = widthGroupSep + (drawFileIcons ? iconSize + gridGap_ : 0) + groupItemNamesWidth; +@@ -684,6 +707,31 @@ + int groupItemsWidth = groupSepWidth + (drawFileIcons ? gapSize_ + iconSize : 0) + gapSize_ + groupItemNamesWidth; + const int groupItemsMinWidth = groupSepWidth + (drawFileIcons ? gapSize_ + iconSize : 0) + gapSize_ + ellipsisWidth; -+ // start trad patch ++ // start trad patch + -+ //add slashes for better readability -+ assert(!contains(groupParentFolder, L'/') || !contains(groupParentFolder, L'\\')); -+ const wchar_t groupParentSep = contains(groupParentFolder, L'/') ? L'/' : (contains(groupParentFolder, L'\\') ? L'\\' : FILE_NAME_SEPARATOR); ++ // rearrange this one section ++ //add slashes for better readability + a wide gap for disambiguation ++ assert(!contains(groupParentFolder, L'/') || !contains(groupParentFolder, L'\\')); ++ const wchar_t groupParentSep = contains(groupParentFolder, L'/') ? L'/' : (contains(groupParentFolder, L'\\') ? L'\\' : FILE_NAME_SEPARATOR); + + switch (itemPathFormat_) + { + case ItemPathFormat::traditional: + case ItemPathFormat::tradrel: -+ widthGroupParent -= widthGroupName - getTextExtentBuffered(dc, utfTo<std::wstring>(FILE_NAME_SEPARATOR)).x; -+ ++ groupParentWidth -= groupNameWidth - getTextExtentBuffered(dc, utfTo<std::wstring>(FILE_NAME_SEPARATOR)).x; + if (!endsWith(groupParentFolder, L'/' ) && //e.g. ftp://server/ + !endsWith(groupParentFolder, L'\\') && /*e.g. C:\ */ + groupParentFolder.size() > 0 ) @@ -77,83 +74,72 @@ diff -x '.git*' -x '*.orig' -x '*.rej' -aur 11.2-1/FreeFileSync/Source/ui/file_g + // but with the "add slashes" paragraph 1 moved to above this switch statement! + //not enough space? => collapse - if (int excessWidth = gridGap_ + widthGroupParent + widthGroupName + widthGroupItems - maxWidth; + if (int excessWidth = groupParentWidth + groupNameWidth + groupItemsWidth - maxWidth; excessWidth > 0) -@@ -664,10 +710,6 @@ +@@ -693,10 +741,6 @@ //1. render group components on two rows stackedGroupRender = true; -- //add slashes for better readability +- //add slashes for better readability + a wide gap for disambiguation - assert(!contains(groupParentFolder, L'/') || !contains(groupParentFolder, L'\\')); - const wchar_t groupParentSep = contains(groupParentFolder, L'/') ? L'/' : (contains(groupParentFolder, L'\\') ? L'\\' : FILE_NAME_SEPARATOR); - if (!endsWith(groupParentFolder, L'/' ) && //e.g. ftp://server/ !endsWith(groupParentFolder, L'\\')) /*e.g. C:\ */ groupParentFolder += groupParentSep; -@@ -725,6 +767,11 @@ +@@ -755,6 +799,11 @@ + } } } - ++ + // end of original section, and back to the trad patch! + break; + } + // and end the addition for trad patch -+ + return { - itemName, -@@ -793,6 +840,9 @@ +@@ -873,6 +922,9 @@ rectGroup = rectGroupParent = rectGroupName = rectTmp; - rectGroupParent.width = widthGroupParent; + rectGroupParent.width = groupParentWidth; + // re-add back the width of groupname so that the directory name is clickable + if (itemPathFormat_ == ItemPathFormat::traditional || itemPathFormat_ == ItemPathFormat::tradrel) -+ rectGroupParent.width += widthGroupName; - rectGroupName .width = widthGroupName; ++ rectGroupParent.width += groupNameWidth; + rectGroupName .width = groupNameWidth; if (stackedGroupRender) -@@ -829,7 +879,8 @@ - if (row == pdi.groupLastRow - 1 /*last group item*/) //restore the group separation line we just cleared - { - wxDCPenChanger dummy(dc, wxPen(getColorGridLine(), fastFromDIP(1))); -- dc.DrawLine(rectGroup.GetBottomLeft(), rectGroup.GetBottomRight() + wxPoint(1, 0)); -+ if (itemPathFormat_ != ItemPathFormat::traditional && itemPathFormat_ != ItemPathFormat::tradrel) -+ dc.DrawLine(rectGroup.GetBottomLeft(), rectGroup.GetBottomRight() + wxPoint(1, 0)); - } - } +@@ -922,6 +974,7 @@ + rectNav.width = fastFromDIP(20); -@@ -844,7 +895,7 @@ - dc.GradientFillLinear(rectNav, getColorSelectionGradientFrom(), backCol, wxEAST); - } + if (row == pdi.groupLastRow - 1 /*last group item*/) //preserve the group separation line! ++ if (itemPathFormat_ != ItemPathFormat::traditional && itemPathFormat_ != ItemPathFormat::tradrel) + rectNav.height -= fastFromDIP(1); + + wxColor backCol = *wxWHITE; +@@ -930,7 +983,7 @@ + dc.GradientFillLinear(rectNav, getColorSelectionGradientFrom(), backCol, wxEAST); + } - if (!groupName.empty() && row == groupFirstRow) + if (!(itemPathFormat_ == ItemPathFormat::traditional || itemPathFormat_ == ItemPathFormat::tradrel) && !groupName.empty() && row == groupFirstRow) { - wxDCTextColourChanger textColorGroupName(dc); - if (static_cast<HoverAreaGroup>(rowHover) == HoverAreaGroup::groupName) -@@ -865,9 +916,9 @@ - drawCellText(dc, rectGroupName, groupName, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, &getTextExtentBuffered(dc, groupName)); + wxRect rectGroupNameBack = rectGroupName; + rectGroupNameBack.width += 2 * gapSize_; //include gap left of vline +@@ -972,10 +1025,10 @@ + drawCellText(dc, rectGroupName, groupName, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, &getTextExtentBuffered(dc, groupName)); } - if (!groupParentFolder.empty() && + if (itemPathFormat_ == ItemPathFormat::traditional || itemPathFormat_ == ItemPathFormat::tradrel || (!groupParentFolder.empty() && (( stackedGroupRender && row == groupFirstRow + 1) || -- (!stackedGroupRender && row == groupFirstRow))) -+ (!stackedGroupRender && row == groupFirstRow)))) + (!stackedGroupRender && row == groupFirstRow)) && +- (groupName.empty() || !pdi.folderGroupObj->isEmpty<side>())) ++ (groupName.empty() || !pdi.folderGroupObj->isEmpty<side>()))) { - drawCellText(dc, rectGroupParent, groupParentFolder, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, &getTextExtentBuffered(dc, groupParentFolder)); - } -@@ -876,7 +927,8 @@ - if (!groupParentFolder.empty() || !groupName.empty()) - { - wxDCPenChanger dummy(dc, wxPen(getColorGridLine(), fastFromDIP(1))); -- dc.DrawLine(rectGroupItems.GetTopLeft(), rectGroupItems.GetBottomLeft() + wxPoint(0, 1)); //draws half-open range! -+ if (itemPathFormat_ != ItemPathFormat::traditional && itemPathFormat_ != ItemPathFormat::tradrel) -+ dc.DrawLine(rectGroupItems.GetTopLeft(), rectGroupItems.GetBottomLeft() + wxPoint(0, 1)); //draws half-open range! - rectGroupItems.x += fastFromDIP(1) + gridGap_; - rectGroupItems.width -= fastFromDIP(1) + gridGap_; - } -@@ -1040,6 +1092,10 @@ + wxRect rectGroupParentText = rectGroupParent; + rectGroupParentText.x += gapSize_; +@@ -1166,6 +1219,10 @@ return _("Relative path"); case ItemPathFormat::full: return _("Full path"); diff --git a/freefilesync/freefilesync.spec b/freefilesync/freefilesync.spec index a40f6fe..c5bc731 100644 --- a/freefilesync/freefilesync.spec +++ b/freefilesync/freefilesync.spec @@ -19,7 +19,7 @@ %define libssh2_name libssh2-%{name} %endif Name: freefilesync -Version: 11.2 +Version: 11.3 Release: 1%{?dist} Summary: A file synchronization utility @@ -156,7 +156,7 @@ install -d %{buildroot}%{_datadir}/mime/packages install -Dm 0644 -t %{buildroot}%{_datadir}/mime/packages %{SOURCE3} # icons -unzip %{pkgname}/Build/Resources/Icons.zip file_batch.png file_sync.png +unzip %{pkgname}/Build/Resources/Icons.zip cfg_batch.png start_sync.png ff=" -filter Lanczos" for res in 16 22 24 32 48 64 96 128 256 ;do @@ -167,8 +167,8 @@ for res in 16 22 24 32 48 64 96 128 256 ;do convert %{pkgname}/Build/Resources/%{pkgname}.png ${ff} ${rr} ${dir}/apps/%{pkgname}.png convert %{pkgname}/Build/Resources/%{prog2name}.png ${ff} ${rr} ${dir}/apps/%{prog2name}.png # mimetypes - convert file_batch.png ${ff} ${rr} ${dir}/mimetypes/application-x-freefilesync-batch.png - convert file_sync.png ${ff} ${rr} ${dir}/mimetypes/application-x-freefilesync-ffs.png + convert cfg_batch.png ${ff} ${rr} ${dir}/mimetypes/application-x-freefilesync-batch.png + convert start_sync.png ${ff} ${rr} ${dir}/mimetypes/application-x-freefilesync-ffs.png convert %{pkgname}/Build/Resources/%{prog2name}.png ${ff} ${rr} ${dir}/mimetypes/application-x-freefilesync-real.png done @@ -207,6 +207,9 @@ update-mime-database -n ${_datadir}/mime 1>/dev/null 2>&1 & : %ghost %config %attr(666, -, -) %{_datadir}/%{name}/GlobalSettings.xml %changelog +* Mon Nov 02 2020 B Stack <bgstack15@gmail.com> - 11.3-1 +- version bump + * Sat Oct 03 2020 B Stack <bgstack15@gmail.com> - 11.2-1 - version bump |