mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-21 12:35:52 +03:00
Fix typos found by codespell
Signed-off-by: Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com>
This commit is contained in:
parent
e3f948a3b2
commit
9d830e94f9
91 changed files with 135 additions and 135 deletions
|
@ -53,7 +53,7 @@ rm -rf usr/include
|
||||||
rm -rf usr/mkspecs
|
rm -rf usr/mkspecs
|
||||||
rm -rf usr/lib/x86_64-linux-gnu/
|
rm -rf usr/lib/x86_64-linux-gnu/
|
||||||
|
|
||||||
# Don't bundle the explorer extentions as we can't do anything with them in the AppImage
|
# Don't bundle the explorer extensions as we can't do anything with them in the AppImage
|
||||||
rm -rf usr/share/caja-python/
|
rm -rf usr/share/caja-python/
|
||||||
rm -rf usr/share/nautilus-python/
|
rm -rf usr/share/nautilus-python/
|
||||||
rm -rf usr/share/nemo-python/
|
rm -rf usr/share/nemo-python/
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Use the configuration below with appropriate changes,
|
# Use the configuration below with appropriate changes,
|
||||||
# if you want to support a new client version using
|
# if you want to support a new client version using
|
||||||
# your own fork. In such a case the tags do not come
|
# your own fork. In such a case the tags do not come
|
||||||
# accross to the main repo for a pull request, so
|
# across to the main repo for a pull request, so
|
||||||
# some hacking is needed
|
# some hacking is needed
|
||||||
[versionhack]
|
[versionhack]
|
||||||
commit = bc7e65b39552ac458b2adacf76cbf98735ec29a0
|
commit = bc7e65b39552ac458b2adacf76cbf98735ec29a0
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
# Check if varialbe MAC_INSTALLER_BACKGROUND_FILE is defined.
|
# Check if variable MAC_INSTALLER_BACKGROUND_FILE is defined.
|
||||||
# Make sure that the MAC_INSTALLER_BACKGROUND_FILE contains the full path, ie.
|
# Make sure that the MAC_INSTALLER_BACKGROUND_FILE contains the full path, ie.
|
||||||
# includes CMAKE_SOURCE_DIR or so.
|
# includes CMAKE_SOURCE_DIR or so.
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# - Check if the protoype we expect is correct.
|
# - Check if the prototype we expect is correct.
|
||||||
# check_prototype_definition(FUNCTION PROTOTYPE RETURN HEADER VARIABLE)
|
# check_prototype_definition(FUNCTION PROTOTYPE RETURN HEADER VARIABLE)
|
||||||
# FUNCTION - The name of the function (used to check if prototype exists)
|
# FUNCTION - The name of the function (used to check if prototype exists)
|
||||||
# PROTOTYPE- The prototype to check.
|
# PROTOTYPE- The prototype to check.
|
||||||
|
|
|
@ -68,7 +68,7 @@
|
||||||
# If SKIP_DEPENDENCY_HANDLING is not set, the INTERFACE_LINK_LIBRARIES property
|
# If SKIP_DEPENDENCY_HANDLING is not set, the INTERFACE_LINK_LIBRARIES property
|
||||||
# of the imported target for <component> will be set to contain the imported
|
# of the imported target for <component> will be set to contain the imported
|
||||||
# targets for the components listed in <name>_<component>_component_deps.
|
# targets for the components listed in <name>_<component>_component_deps.
|
||||||
# <component>_FOUND will also be set to false if any of the compoments in
|
# <component>_FOUND will also be set to false if any of the components in
|
||||||
# <name>_<component>_component_deps are not found. This requires the components
|
# <name>_<component>_component_deps are not found. This requires the components
|
||||||
# in <name>_<component>_component_deps to be listed before <component> in the
|
# in <name>_<component>_component_deps to be listed before <component> in the
|
||||||
# COMPONENTS argument.
|
# COMPONENTS argument.
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
# FEATURE: name of the feature, e.g. "libjpeg"
|
# FEATURE: name of the feature, e.g. "libjpeg"
|
||||||
# DESCRIPTION: description what this feature provides
|
# DESCRIPTION: description what this feature provides
|
||||||
# URL: home page
|
# URL: home page
|
||||||
# REQUIRED: TRUE or FALSE, indicating whether the featue is required
|
# REQUIRED: TRUE or FALSE, indicating whether the feature is required
|
||||||
# MIN_VERSION: minimum version number. empty string if unneeded
|
# MIN_VERSION: minimum version number. empty string if unneeded
|
||||||
# COMMENTS: More info you may want to provide. empty string if unnecessary
|
# COMMENTS: More info you may want to provide. empty string if unnecessary
|
||||||
#
|
#
|
||||||
|
|
|
@ -29,7 +29,7 @@ project=gets.chomp
|
||||||
|
|
||||||
printf("\n")
|
printf("\n")
|
||||||
|
|
||||||
print("Other projects to include (e.g. \"owutil tinyxml\", leave emtpy to skip): ")
|
print("Other projects to include (e.g. \"owutil tinyxml\", leave empty to skip): ")
|
||||||
otherprojects=gets.chomp
|
otherprojects=gets.chomp
|
||||||
|
|
||||||
printf("\n")
|
printf("\n")
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
{% set script_files = script_files + ['_static/bootstrap.js'] %}
|
{% set script_files = script_files + ['_static/bootstrap.js'] %}
|
||||||
{% set css_files = ['_static/bootstrap.css', '_static/bootstrap-sphinx.css'] + css_files %}
|
{% set css_files = ['_static/bootstrap.css', '_static/bootstrap-sphinx.css'] + css_files %}
|
||||||
|
|
||||||
{# Sidebar: Rework into our Boostrap nav section. #}
|
{# Sidebar: Rework into our Bootstrap nav section. #}
|
||||||
{% macro navBar() %}
|
{% macro navBar() %}
|
||||||
<div id="navbar" class="navbar navbar-fixed-top">
|
<div id="navbar" class="navbar navbar-fixed-top">
|
||||||
<div class="navbar-inner">
|
<div class="navbar-inner">
|
||||||
|
|
|
@ -193,7 +193,7 @@ table.field-list {
|
||||||
.bs-sidenav ul{
|
.bs-sidenav ul{
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
padding-left: 25px;
|
padding-left: 25px;
|
||||||
margin-left: 0; /* bootstrap 2 compatability. */
|
margin-left: 0; /* bootstrap 2 compatibility. */
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 1200px) {
|
@media (min-width: 1200px) {
|
||||||
|
|
|
@ -12,7 +12,7 @@ pygments_style = tango
|
||||||
# Tab name for entire site. (Default: "Site")
|
# Tab name for entire site. (Default: "Site")
|
||||||
navbar_site_name = Sitex
|
navbar_site_name = Sitex
|
||||||
|
|
||||||
# A list of tuples containting pages to link to. The value should be
|
# A list of tuples containing pages to link to. The value should be
|
||||||
# in the form [(name, page), ..]
|
# in the form [(name, page), ..]
|
||||||
navbar_links =
|
navbar_links =
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,7 @@ table.field-list {
|
||||||
.bs-sidenav ul{
|
.bs-sidenav ul{
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
padding-left: 25px;
|
padding-left: 25px;
|
||||||
margin-left: 0; /* bootstrap 2 compatability. */
|
margin-left: 0; /* bootstrap 2 compatibility. */
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 1200px) {
|
@media (min-width: 1200px) {
|
||||||
|
|
|
@ -12,7 +12,7 @@ pygments_style = tango
|
||||||
# Tab name for entire site. (Default: "Site")
|
# Tab name for entire site. (Default: "Site")
|
||||||
navbar_site_name = Sitex
|
navbar_site_name = Sitex
|
||||||
|
|
||||||
# A list of tuples containting pages to link to. The value should be
|
# A list of tuples containing pages to link to. The value should be
|
||||||
# in the form [(name, page), ..]
|
# in the form [(name, page), ..]
|
||||||
navbar_links =
|
navbar_links =
|
||||||
|
|
||||||
|
|
|
@ -110,7 +110,7 @@ Then, in Terminal:
|
||||||
|
|
||||||
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||||
|
|
||||||
.. note:: Under certain cirumstances, you may get on error along the
|
.. note:: Under certain circumstances, you may get on error along the
|
||||||
lines of ``Permission denied @ apply2files`` when installing certain
|
lines of ``Permission denied @ apply2files`` when installing certain
|
||||||
Homebrew packages. This is `a known issue`_ and can be fixed by changing
|
Homebrew packages. This is `a known issue`_ and can be fixed by changing
|
||||||
the permissions on the affected files with the following command:
|
the permissions on the affected files with the following command:
|
||||||
|
|
|
@ -273,7 +273,7 @@ epub_copyright = u'2013-2018, The Nextcloud developers'
|
||||||
# The format is a list of tuples containing the path and title.
|
# The format is a list of tuples containing the path and title.
|
||||||
#epub_pre_files = []
|
#epub_pre_files = []
|
||||||
|
|
||||||
# HTML files shat should be inserted after the pages created by sphinx.
|
# HTML files that should be inserted after the pages created by sphinx.
|
||||||
# The format is a list of tuples containing the path and title.
|
# The format is a list of tuples containing the path and title.
|
||||||
#epub_post_files = []
|
#epub_post_files = []
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ Some interesting values that can be set on the configuration file are:
|
||||||
| | | This option only works on linux |
|
| | | This option only works on linux |
|
||||||
+----------------------------------+--------------------------+--------------------------------------------------------------------------------------------------------+
|
+----------------------------------+--------------------------+--------------------------------------------------------------------------------------------------------+
|
||||||
| ``showExperimentalOptions`` | ``false`` | Whether to show experimental options that are still undergoing testing in the user interface. |
|
| ``showExperimentalOptions`` | ``false`` | Whether to show experimental options that are still undergoing testing in the user interface. |
|
||||||
| | | Turning this on does not enable experimental behavior on its own. It does enable user inferface |
|
| | | Turning this on does not enable experimental behavior on its own. It does enable user interface |
|
||||||
| | | options that can be used to opt in to experimental features. |
|
| | | options that can be used to opt in to experimental features. |
|
||||||
+----------------------------------+--------------------------+--------------------------------------------------------------------------------------------------------+
|
+----------------------------------+--------------------------+--------------------------------------------------------------------------------------------------------+
|
||||||
| ``showMainDialogAsNormalWindow`` | ``false`` | Whether the main dialog should be shown as a normal window even if tray icons are available. |
|
| ``showMainDialogAsNormalWindow`` | ``false`` | Whether the main dialog should be shown as a normal window even if tray icons are available. |
|
||||||
|
|
|
@ -11,7 +11,7 @@ The Nextcloud desktop client uploads local changes and downloads remote changes.
|
||||||
When a file has changed on the local side and on the remote between synchronization
|
When a file has changed on the local side and on the remote between synchronization
|
||||||
runs the client will be unable to resolve the situation on its own. It will
|
runs the client will be unable to resolve the situation on its own. It will
|
||||||
create a conflict file with the local version, download the remote version and
|
create a conflict file with the local version, download the remote version and
|
||||||
notify the user that a conflict occured which needs attention.
|
notify the user that a conflict occurred which needs attention.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
|
|
|
@ -1067,7 +1067,7 @@ HTML_STYLESHEET =
|
||||||
# defined cascading style sheet that is included after the standard style sheets
|
# defined cascading style sheet that is included after the standard style sheets
|
||||||
# created by doxygen. Using this option one can overrule certain style aspects.
|
# created by doxygen. Using this option one can overrule certain style aspects.
|
||||||
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
||||||
# standard style sheet and is therefor more robust against future updates.
|
# standard style sheet and is therefore more robust against future updates.
|
||||||
# Doxygen will copy the style sheet file to the output directory. For an example
|
# Doxygen will copy the style sheet file to the output directory. For an example
|
||||||
# see the documentation.
|
# see the documentation.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
@ -1951,7 +1951,7 @@ PREDEFINED = OWNCLOUDSYNC_EXPORT
|
||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED =
|
||||||
|
|
||||||
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
|
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
|
||||||
# remove all refrences to function-like macros that are alone on a line, have an
|
# remove all references to function-like macros that are alone on a line, have an
|
||||||
# all uppercase name, and do not end with a semicolon. Such function macros are
|
# all uppercase name, and do not end with a semicolon. Such function macros are
|
||||||
# typically used for boiler-plate code, and will confuse the parser if not
|
# typically used for boiler-plate code, and will confuse the parser if not
|
||||||
# removed.
|
# removed.
|
||||||
|
|
|
@ -19,7 +19,7 @@ The |version| release of the Nextcloud desktop sync client has many new features
|
||||||
improvements.
|
improvements.
|
||||||
|
|
||||||
* Main dialog will be a regular window if tray icons are not available on the system.
|
* Main dialog will be a regular window if tray icons are not available on the system.
|
||||||
* Virtual files wil be optional. That enables the desktop client to run on older Windows versions.
|
* Virtual files will be optional. That enables the desktop client to run on older Windows versions.
|
||||||
* Improvements for the virtual files on Windows
|
* Improvements for the virtual files on Windows
|
||||||
* Network traffic performance improvements
|
* Network traffic performance improvements
|
||||||
* Improvements to the sync engine
|
* Improvements to the sync engine
|
||||||
|
|
|
@ -227,7 +227,7 @@ folders larger than [folder size]**.
|
||||||
Using the Network Window
|
Using the Network Window
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
.. index:: proxy settings, SOCKS, bandwith, throttling, limiting
|
.. index:: proxy settings, SOCKS, bandwidth, throttling, limiting
|
||||||
|
|
||||||
The Network settings window enables you to define network proxy settings, and
|
The Network settings window enables you to define network proxy settings, and
|
||||||
also to limit download and upload bandwidth.
|
also to limit download and upload bandwidth.
|
||||||
|
|
|
@ -124,7 +124,7 @@ The tab provides several useful options:
|
||||||
Network
|
Network
|
||||||
~~~~~~~
|
~~~~~~~
|
||||||
|
|
||||||
.. index:: proxy settings, SOCKS, bandwith, throttling, limiting
|
.. index:: proxy settings, SOCKS, bandwidth, throttling, limiting
|
||||||
|
|
||||||
This tab consolidates ``Proxy Settings`` and ``Bandwith Limiting``:
|
This tab consolidates ``Proxy Settings`` and ``Bandwith Limiting``:
|
||||||
|
|
||||||
|
|
|
@ -94,8 +94,8 @@
|
||||||
[self.delegate addMenuItem:item];
|
[self.delegate addMenuItem:item];
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// LOG UNKOWN COMMAND
|
// LOG UNKNOWN COMMAND
|
||||||
NSLog(@"Unkown command: %@", command);
|
NSLog(@"Unknown command: %@", command);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# this script creates a plugin for caja, just by replacing
|
# this script creates a plugin for caja, just by replacing
|
||||||
# all occurences of Nautilus with Caja (case sensitive).
|
# all occurrences of Nautilus with Caja (case sensitive).
|
||||||
|
|
||||||
cp syncstate.py syncstate_caja.py
|
cp syncstate.py syncstate_caja.py
|
||||||
sed -i.org -e 's/Nautilus/Caja/g' syncstate_caja.py
|
sed -i.org -e 's/Nautilus/Caja/g' syncstate_caja.py
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# this script creates a plugin for nemo, just be replacing
|
# this script creates a plugin for nemo, just be replacing
|
||||||
# all occurences of Nautilus with Nemo.
|
# all occurrences of Nautilus with Nemo.
|
||||||
|
|
||||||
cp syncstate.py syncstate_nemo.py
|
cp syncstate.py syncstate_nemo.py
|
||||||
sed -i.org -e 's/autilus/emo/g' syncstate_nemo.py
|
sed -i.org -e 's/autilus/emo/g' syncstate_nemo.py
|
||||||
|
|
|
@ -3,6 +3,6 @@
|
||||||
# this script replaces the line
|
# this script replaces the line
|
||||||
# appname = 'Nextcloud'
|
# appname = 'Nextcloud'
|
||||||
# with the correct branding name in the syncstate.py script
|
# with the correct branding name in the syncstate.py script
|
||||||
# It also replaces the occurences in the class name so several
|
# It also replaces the occurrences in the class name so several
|
||||||
# branding can be loaded (see #6524)
|
# branding can be loaded (see #6524)
|
||||||
sed -i.org -e "s/Nextcloud/$1/g" syncstate.py
|
sed -i.org -e "s/Nextcloud/$1/g" syncstate.py
|
||||||
|
|
|
@ -105,7 +105,7 @@ class SocketConnect(GObject.GObject):
|
||||||
return False # Don't run again
|
return False # Don't run again
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("Could not connect to unix socket " + sock_file + ". " + str(e))
|
print("Could not connect to unix socket " + sock_file + ". " + str(e))
|
||||||
except Exception as e: # Bad habbit
|
except Exception as e: # Bad habit
|
||||||
print("Connect could not be established, try again later.")
|
print("Connect could not be established, try again later.")
|
||||||
self._sock.close()
|
self._sock.close()
|
||||||
|
|
||||||
|
|
|
@ -98,8 +98,8 @@ IFACEMETHODIMP_(ULONG) NCOverlay::Release()
|
||||||
|
|
||||||
IFACEMETHODIMP NCOverlay::GetPriority(int *pPriority)
|
IFACEMETHODIMP NCOverlay::GetPriority(int *pPriority)
|
||||||
{
|
{
|
||||||
// this defines which handler has prededence, so
|
// this defines which handler has precedence, so
|
||||||
// we order this in terms of likelyhood
|
// we order this in terms of likelihood
|
||||||
switch (_state) {
|
switch (_state) {
|
||||||
case State_OK:
|
case State_OK:
|
||||||
*pPriority = 0; break;
|
*pPriority = 0; break;
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
<?define OverlayGuidWarning = "@WIN_SHELLEXT_OVERLAY_GUID_WARNING@" ?>
|
<?define OverlayGuidWarning = "@WIN_SHELLEXT_OVERLAY_GUID_WARNING@" ?>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Preceeding spaces are intended, two spaces to put us ahead of the competition :/
|
Preceding spaces are intended, two spaces to put us ahead of the competition :/
|
||||||
|
|
||||||
There is a limit in Windows (oh wonder^^) so that only the first 15 extensions get invoked, this is why to use that dirty little trick to get ahead ;)
|
There is a limit in Windows (oh wonder^^) so that only the first 15 extensions get invoked, this is why to use that dirty little trick to get ahead ;)
|
||||||
See: https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers?redirectedfrom=MSDN#employing-the-verb-selection-model
|
See: https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers?redirectedfrom=MSDN#employing-the-verb-selection-model
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#define OVERLAY_GUID_WARNING L"@WIN_SHELLEXT_OVERLAY_GUID_WARNING@"
|
#define OVERLAY_GUID_WARNING L"@WIN_SHELLEXT_OVERLAY_GUID_WARNING@"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Preceeding spaces are intended, two spaces to put us ahead of the competition :/
|
// Preceding spaces are intended, two spaces to put us ahead of the competition :/
|
||||||
//
|
//
|
||||||
// There is a limit in Windows (oh wonder^^) so that only the first 15 extensions get invoked, this is why to use that dirty little trick to get ahead ;)
|
// There is a limit in Windows (oh wonder^^) so that only the first 15 extensions get invoked, this is why to use that dirty little trick to get ahead ;)
|
||||||
// See: https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers?redirectedfrom=MSDN#employing-the-verb-selection-model
|
// See: https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers?redirectedfrom=MSDN#employing-the-verb-selection-model
|
||||||
|
|
|
@ -172,7 +172,7 @@ bool FileSystem::uncheckedRenameReplace(const QString &originFileName,
|
||||||
#ifndef Q_OS_WIN
|
#ifndef Q_OS_WIN
|
||||||
bool success = false;
|
bool success = false;
|
||||||
QFile orig(originFileName);
|
QFile orig(originFileName);
|
||||||
// We want a rename that also overwites. QFile::rename does not overwite.
|
// We want a rename that also overwrites. QFile::rename does not overwrite.
|
||||||
// Qt 5.1 has QSaveFile::renameOverwrite we could use.
|
// Qt 5.1 has QSaveFile::renameOverwrite we could use.
|
||||||
// ### FIXME
|
// ### FIXME
|
||||||
success = true;
|
success = true;
|
||||||
|
|
|
@ -219,11 +219,11 @@ public:
|
||||||
* This usually creates some temporary files next to the db file, like
|
* This usually creates some temporary files next to the db file, like
|
||||||
* $dbfile-shm or $dbfile-wal.
|
* $dbfile-shm or $dbfile-wal.
|
||||||
*
|
*
|
||||||
* returns true if it could be openend or is currently opened.
|
* returns true if it could be opened or is currently opened.
|
||||||
*/
|
*/
|
||||||
bool open();
|
bool open();
|
||||||
|
|
||||||
/** Returns whether the db is currently openend. */
|
/** Returns whether the db is currently opened. */
|
||||||
bool isOpen();
|
bool isOpen();
|
||||||
|
|
||||||
/** Close the database */
|
/** Close the database */
|
||||||
|
|
|
@ -125,7 +125,7 @@ public:
|
||||||
QString _file;
|
QString _file;
|
||||||
QString _renameTarget;
|
QString _renameTarget;
|
||||||
|
|
||||||
/// The last X-Request-ID of the request that failled
|
/// The last X-Request-ID of the request that failed
|
||||||
QByteArray _requestId;
|
QByteArray _requestId;
|
||||||
|
|
||||||
[[nodiscard]] bool isValid() const;
|
[[nodiscard]] bool isValid() const;
|
||||||
|
|
|
@ -279,7 +279,7 @@ void Utility::usleep(int usec)
|
||||||
QThread::usleep(usec);
|
QThread::usleep(usec);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This can be overriden from the tests
|
// This can be overridden from the tests
|
||||||
OCSYNC_EXPORT bool fsCasePreserving_override = []() -> bool {
|
OCSYNC_EXPORT bool fsCasePreserving_override = []() -> bool {
|
||||||
QByteArray env = qgetenv("OWNCLOUD_TEST_CASE_PRESERVING");
|
QByteArray env = qgetenv("OWNCLOUD_TEST_CASE_PRESERVING");
|
||||||
if (!env.isEmpty())
|
if (!env.isEmpty())
|
||||||
|
@ -298,7 +298,7 @@ bool Utility::fileNamesEqual(const QString &fn1, const QString &fn2)
|
||||||
const QDir fd2(fn2);
|
const QDir fd2(fn2);
|
||||||
|
|
||||||
// Attention: If the path does not exist, canonicalPath returns ""
|
// Attention: If the path does not exist, canonicalPath returns ""
|
||||||
// ONLY use this function with existing pathes.
|
// ONLY use this function with existing paths.
|
||||||
const QString a = fd1.canonicalPath();
|
const QString a = fd1.canonicalPath();
|
||||||
const QString b = fd2.canonicalPath();
|
const QString b = fd2.canonicalPath();
|
||||||
bool re = !a.isEmpty() && QString::compare(a, b, fsCasePreserving() ? Qt::CaseInsensitive : Qt::CaseSensitive) == 0;
|
bool re = !a.isEmpty() && QString::compare(a, b, fsCasePreserving() ? Qt::CaseInsensitive : Qt::CaseSensitive) == 0;
|
||||||
|
@ -673,7 +673,7 @@ bool Utility::isPathWindowsDrivePartitionRoot(const QString &path)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// must mutch a pattern "[A-Za-z]:"
|
// must match a pattern "[A-Za-z]:"
|
||||||
if (!(path.at(1) == QLatin1Char(':') && path.at(0).isLetter())) {
|
if (!(path.at(1) == QLatin1Char(':') && path.at(0).isLetter())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,7 +145,7 @@ namespace Utility {
|
||||||
// if false, the two cases are two different files.
|
// if false, the two cases are two different files.
|
||||||
OCSYNC_EXPORT bool fsCasePreserving();
|
OCSYNC_EXPORT bool fsCasePreserving();
|
||||||
|
|
||||||
// Check if two pathes that MUST exist are equal. This function
|
// Check if two paths that MUST exist are equal. This function
|
||||||
// uses QDir::canonicalPath() to judge and cares for the systems
|
// uses QDir::canonicalPath() to judge and cares for the systems
|
||||||
// case sensitivity.
|
// case sensitivity.
|
||||||
OCSYNC_EXPORT bool fileNamesEqual(const QString &fn1, const QString &fn2);
|
OCSYNC_EXPORT bool fileNamesEqual(const QString &fn1, const QString &fn2);
|
||||||
|
@ -167,7 +167,7 @@ namespace Utility {
|
||||||
* Use this to get a string that describes the timespan between the first and
|
* Use this to get a string that describes the timespan between the first and
|
||||||
* the second timestamp in a human readable and understandable form.
|
* the second timestamp in a human readable and understandable form.
|
||||||
*
|
*
|
||||||
* If the second parameter is ommitted, the current time is used.
|
* If the second parameter is omitted, the current time is used.
|
||||||
*/
|
*/
|
||||||
OCSYNC_EXPORT QString timeAgoInWords(const QDateTime &dt, const QDateTime &from = QDateTime());
|
OCSYNC_EXPORT QString timeAgoInWords(const QDateTime &dt, const QDateTime &from = QDateTime());
|
||||||
|
|
||||||
|
@ -276,7 +276,7 @@ namespace Utility {
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* NTFS permissions lookup is diabled by default for performance reasons
|
* NTFS permissions lookup is disabled by default for performance reasons
|
||||||
* Enable it and disable it again once we leave the scope
|
* Enable it and disable it again once we leave the scope
|
||||||
* https://doc.qt.io/Qt-5/qfileinfo.html#ntfs-permissions
|
* https://doc.qt.io/Qt-5/qfileinfo.html#ntfs-permissions
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -527,7 +527,7 @@ void AccountSettings::slotSubfolderContextMenuRequested(const QModelIndex& index
|
||||||
ac = menu.addAction(tr("Encrypt"));
|
ac = menu.addAction(tr("Encrypt"));
|
||||||
connect(ac, &QAction::triggered, [this, info] { slotMarkSubfolderEncrypted(info); });
|
connect(ac, &QAction::triggered, [this, info] { slotMarkSubfolderEncrypted(info); });
|
||||||
} else {
|
} else {
|
||||||
// Ingore decrypting for now since it only works with an empty folder
|
// Ignore decrypting for now since it only works with an empty folder
|
||||||
// connect(ac, &QAction::triggered, [this, &info] { slotMarkSubfolderDecrypted(info); });
|
// connect(ac, &QAction::triggered, [this, &info] { slotMarkSubfolderDecrypted(info); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,12 +159,12 @@ public:
|
||||||
///Asks for user credentials
|
///Asks for user credentials
|
||||||
void handleInvalidCredentials();
|
void handleInvalidCredentials();
|
||||||
|
|
||||||
/** Returns the notifications status retrieved by the notificatons endpoint
|
/** Returns the notifications status retrieved by the notifications endpoint
|
||||||
* https://github.com/nextcloud/desktop/issues/2318#issuecomment-680698429
|
* https://github.com/nextcloud/desktop/issues/2318#issuecomment-680698429
|
||||||
*/
|
*/
|
||||||
bool isDesktopNotificationsAllowed() const;
|
bool isDesktopNotificationsAllowed() const;
|
||||||
|
|
||||||
/** Set desktop notifications status retrieved by the notificatons endpoint
|
/** Set desktop notifications status retrieved by the notifications endpoint
|
||||||
*/
|
*/
|
||||||
void setDesktopNotificationsAllowed(bool isAllowed);
|
void setDesktopNotificationsAllowed(bool isAllowed);
|
||||||
|
|
||||||
|
|
|
@ -728,7 +728,7 @@ void Application::parseOptions(const QStringList &options)
|
||||||
// virtual file, open it after the Folder were created (if the app is not terminated)
|
// virtual file, open it after the Folder were created (if the app is not terminated)
|
||||||
QTimer::singleShot(0, this, [this, option] { openVirtualFile(option); });
|
QTimer::singleShot(0, this, [this, option] { openVirtualFile(option); });
|
||||||
} else if (option.startsWith(QStringLiteral(APPLICATION_URI_HANDLER_SCHEME "://open"))) {
|
} else if (option.startsWith(QStringLiteral(APPLICATION_URI_HANDLER_SCHEME "://open"))) {
|
||||||
// see the section Local file editing of the Architecture page of the user documenation
|
// see the section Local file editing of the Architecture page of the user documentation
|
||||||
_editFileLocallyUrl = QUrl::fromUserInput(option);
|
_editFileLocallyUrl = QUrl::fromUserInput(option);
|
||||||
if (!_editFileLocallyUrl.isValid()) {
|
if (!_editFileLocallyUrl.isValid()) {
|
||||||
_editFileLocallyUrl.clear();
|
_editFileLocallyUrl.clear();
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace OCC {
|
||||||
* checkAuthentication is the quick version that only does the propfind
|
* checkAuthentication is the quick version that only does the propfind
|
||||||
* while checkServerAndAuth is doing the 4 calls.
|
* while checkServerAndAuth is doing the 4 calls.
|
||||||
*
|
*
|
||||||
* We cannot use the capabilites call to test the login and the password because of
|
* We cannot use the capabilities call to test the login and the password because of
|
||||||
* https://github.com/owncloud/core/issues/12930
|
* https://github.com/owncloud/core/issues/12930
|
||||||
*
|
*
|
||||||
* Here follows the state machine
|
* Here follows the state machine
|
||||||
|
|
|
@ -754,7 +754,7 @@ void FolderMan::slotRunOneEtagJob()
|
||||||
Folder *folder = nullptr;
|
Folder *folder = nullptr;
|
||||||
for (Folder *f : qAsConst(_folderMap)) {
|
for (Folder *f : qAsConst(_folderMap)) {
|
||||||
if (f->etagJob()) {
|
if (f->etagJob()) {
|
||||||
// Caveat: always grabs the first folder with a job, but we think this is Ok for now and avoids us having a seperate queue.
|
// Caveat: always grabs the first folder with a job, but we think this is Ok for now and avoids us having a separate queue.
|
||||||
_currentEtagJob = f->etagJob();
|
_currentEtagJob = f->etagJob();
|
||||||
folder = f;
|
folder = f;
|
||||||
break;
|
break;
|
||||||
|
@ -987,7 +987,7 @@ void FolderMan::runEtagJobIfPossible(Folder *folder)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (_scheduledFolders.contains(folder)) {
|
if (_scheduledFolders.contains(folder)) {
|
||||||
qCInfo(lcFolderMan) << "Can not run etag job: Folder is alreday scheduled";
|
qCInfo(lcFolderMan) << "Can not run etag job: Folder is already scheduled";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (_disabledFolders.contains(folder)) {
|
if (_disabledFolders.contains(folder)) {
|
||||||
|
@ -1727,7 +1727,7 @@ QPair<FolderMan::PathValidityResult, QString> FolderMan::checkPathValidityForNew
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if both pathes are equal, the server url needs to be different
|
// if both paths are equal, the server url needs to be different
|
||||||
// otherwise it would mean that a new connection from the same local folder
|
// otherwise it would mean that a new connection from the same local folder
|
||||||
// to the same account is added which is not wanted. The account must differ.
|
// to the same account is added which is not wanted. The account must differ.
|
||||||
if (serverUrl.isValid() && !differentPaths) {
|
if (serverUrl.isValid() && !differentPaths) {
|
||||||
|
|
|
@ -264,7 +264,7 @@ public slots:
|
||||||
/**
|
/**
|
||||||
* Triggers a sync run once the lock on the given file is removed.
|
* Triggers a sync run once the lock on the given file is removed.
|
||||||
*
|
*
|
||||||
* Automatically detemines the folder that's responsible for the file.
|
* Automatically determines the folder that's responsible for the file.
|
||||||
* See slotWatchedFileUnlocked().
|
* See slotWatchedFileUnlocked().
|
||||||
*/
|
*/
|
||||||
void slotSyncOnceFileUnlocks(const QString &path);
|
void slotSyncOnceFileUnlocks(const QString &path);
|
||||||
|
|
|
@ -163,7 +163,7 @@ void WatcherThread::watchChanges(size_t fileNotifyBufferSize,
|
||||||
if (curEntry->NextEntryOffset == 0) {
|
if (curEntry->NextEntryOffset == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// FILE_NOTIFY_INFORMATION has no fixed size and the offset is in bytes therefor we first need to cast to char
|
// FILE_NOTIFY_INFORMATION has no fixed size and the offset is in bytes therefore we first need to cast to char
|
||||||
curEntry = reinterpret_cast<FILE_NOTIFY_INFORMATION *>(reinterpret_cast<char*>(curEntry) + curEntry->NextEntryOffset);
|
curEntry = reinterpret_cast<FILE_NOTIFY_INFORMATION *>(reinterpret_cast<char*>(curEntry) + curEntry->NextEntryOffset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
#define OCS_SUCCESS_STATUS_CODE 100
|
#define OCS_SUCCESS_STATUS_CODE 100
|
||||||
// Apparantly the v2.php URLs can return that
|
// Apparently the v2.php URLs can return that
|
||||||
#define OCS_SUCCESS_STATUS_CODE_V2 200
|
#define OCS_SUCCESS_STATUS_CODE_V2 200
|
||||||
// Two factor auth notification returns Accepted 202
|
// Two factor auth notification returns Accepted 202
|
||||||
#define OCS_ACCEPTED_STATUS_CODE 202
|
#define OCS_ACCEPTED_STATUS_CODE 202
|
||||||
|
|
|
@ -367,7 +367,7 @@ public:
|
||||||
{
|
{
|
||||||
auto toolbar = qobject_cast<QToolBar *>(parent);
|
auto toolbar = qobject_cast<QToolBar *>(parent);
|
||||||
if (!toolbar) {
|
if (!toolbar) {
|
||||||
// this means we are in the extention menu, no special action here
|
// this means we are in the extension menu, no special action here
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -387,7 +387,7 @@ public:
|
||||||
* @param password The password of the share, may be empty
|
* @param password The password of the share, may be empty
|
||||||
*
|
*
|
||||||
* On success the signal linkShareCreated is emitted
|
* On success the signal linkShareCreated is emitted
|
||||||
* For older server the linkShareRequiresPassword signal is emitted when it seems appropiate
|
* For older server the linkShareRequiresPassword signal is emitted when it seems appropriate
|
||||||
* In case of a server error the serverError signal is emitted
|
* In case of a server error the serverError signal is emitted
|
||||||
*/
|
*/
|
||||||
void createLinkShare(const QString &path,
|
void createLinkShare(const QString &path,
|
||||||
|
|
|
@ -349,7 +349,7 @@ bool Systray::raiseFileDetailDialogs(const QString &localPath)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If it is empty then we have raised no dialogs, so return false (and viceversa)
|
// If it is empty then we have raised no dialogs, so return false (and vice-versa)
|
||||||
return !_fileDetailDialogs.empty();
|
return !_fileDetailDialogs.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ bool SortedActivityListModel::lessThan(const QModelIndex &sourceLeft, const QMod
|
||||||
|
|
||||||
// Then compare by status
|
// Then compare by status
|
||||||
if (leftSyncFileItemStatus != rightSyncFileItemStatus) {
|
if (leftSyncFileItemStatus != rightSyncFileItemStatus) {
|
||||||
// We want to shove erors towards the top.
|
// We want to shove errors towards the top.
|
||||||
return (leftSyncFileItemStatus != SyncFileItem::NoStatus &&
|
return (leftSyncFileItemStatus != SyncFileItem::NoStatus &&
|
||||||
leftSyncFileItemStatus != SyncFileItem::Success) ||
|
leftSyncFileItemStatus != SyncFileItem::Success) ||
|
||||||
leftSyncFileItemStatus == SyncFileItem::FatalError ||
|
leftSyncFileItemStatus == SyncFileItem::FatalError ||
|
||||||
|
|
|
@ -282,7 +282,7 @@ void User::slotDisconnectPushNotifications()
|
||||||
|
|
||||||
disconnect(_account->account().data(), &Account::pushNotificationsDisabled, this, &User::slotDisconnectPushNotifications);
|
disconnect(_account->account().data(), &Account::pushNotificationsDisabled, this, &User::slotDisconnectPushNotifications);
|
||||||
|
|
||||||
// connection to WebSocket may have dropped or an error occured, so we need to bring back the polling until we have re-established the connection
|
// connection to WebSocket may have dropped or an error occurred, so we need to bring back the polling until we have re-established the connection
|
||||||
setNotificationRefreshInterval(ConfigFile().notificationRefreshInterval());
|
setNotificationRefreshInterval(ConfigFile().notificationRefreshInterval());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -462,7 +462,7 @@ void User::slotNotificationRequestFinished(int statusCode)
|
||||||
qCWarning(lcActivity) << "Notification Request to Server failed, leave notification visible.";
|
qCWarning(lcActivity) << "Notification Request to Server failed, leave notification visible.";
|
||||||
} else {
|
} else {
|
||||||
// to do use the model to rebuild the list or remove the item
|
// to do use the model to rebuild the list or remove the item
|
||||||
qCWarning(lcActivity) << "Notification Request to Server successed, rebuilding list.";
|
qCWarning(lcActivity) << "Notification Request to Server succeeded, rebuilding list.";
|
||||||
_activityModel->removeActivityFromActivityList(row);
|
_activityModel->removeActivityFromActivityList(row);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows a dialog explaining the virtual files mode and warning about it
|
* Shows a dialog explaining the virtual files mode and warning about it
|
||||||
* being experimental. Calles the callback with true if enabling was
|
* being experimental. Calls the callback with true if enabling was
|
||||||
* chosen.
|
* chosen.
|
||||||
*/
|
*/
|
||||||
static void askExperimentalVirtualFilesFeature(QWidget *receiver, const std::function<void(bool enable)> &callback);
|
static void askExperimentalVirtualFilesFeature(QWidget *receiver, const std::function<void(bool enable)> &callback);
|
||||||
|
|
|
@ -35,7 +35,7 @@ public:
|
||||||
|
|
||||||
/** @brief sets an optional postfix shown greyed out */
|
/** @brief sets an optional postfix shown greyed out */
|
||||||
void setPostfix(const QString &postfix);
|
void setPostfix(const QString &postfix);
|
||||||
/** @brief retrives the postfix */
|
/** @brief retrieves the postfix */
|
||||||
[[nodiscard]] QString postfix() const;
|
[[nodiscard]] QString postfix() const;
|
||||||
/** @brief retrieves combined text() and postfix() */
|
/** @brief retrieves combined text() and postfix() */
|
||||||
[[nodiscard]] QString fullText() const;
|
[[nodiscard]] QString fullText() const;
|
||||||
|
|
|
@ -60,7 +60,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
// We need a separate class here, since we cannot simply return the same WebEnginePage object
|
// We need a separate class here, since we cannot simply return the same WebEnginePage object
|
||||||
// this leads to a strage segfault somewhere deep inside of the QWebEngine code
|
// this leads to a strange segfault somewhere deep inside of the QWebEngine code
|
||||||
class ExternalWebEnginePage : public QWebEnginePage {
|
class ExternalWebEnginePage : public QWebEnginePage {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
@ -90,7 +90,7 @@ WebView::WebView(QWidget *parent)
|
||||||
_profile->installUrlSchemeHandler("nc", _schemeHandler);
|
_profile->installUrlSchemeHandler("nc", _schemeHandler);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set a proper accept langauge to the language of the client
|
* Set a proper accept language to the language of the client
|
||||||
* code from: http://code.qt.io/cgit/qt/qtbase.git/tree/src/network/access/qhttpnetworkconnection.cpp
|
* code from: http://code.qt.io/cgit/qt/qtbase.git/tree/src/network/access/qhttpnetworkconnection.cpp
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
|
@ -137,7 +137,7 @@ void WebView::slotResizeToContents(const QSizeF &size){
|
||||||
|
|
||||||
WebView::~WebView() {
|
WebView::~WebView() {
|
||||||
/*
|
/*
|
||||||
* The Qt implmentation deletes children in the order they are added to the
|
* The Qt implementation deletes children in the order they are added to the
|
||||||
* object tree, so in this case _page is deleted after _profile, which
|
* object tree, so in this case _page is deleted after _profile, which
|
||||||
* violates the assumption that _profile should exist longer than
|
* violates the assumption that _profile should exist longer than
|
||||||
* _page [1]. Here I delete _page manually so that _profile can be safely
|
* _page [1]. Here I delete _page manually so that _profile can be safely
|
||||||
|
|
|
@ -85,7 +85,7 @@ public:
|
||||||
* This function reads the body of the reply and parses out the
|
* This function reads the body of the reply and parses out the
|
||||||
* error information, if possible.
|
* error information, if possible.
|
||||||
*
|
*
|
||||||
* \a body is optinally filled with the reply body.
|
* \a body is optionally filled with the reply body.
|
||||||
*
|
*
|
||||||
* Warning: Needs to call reply()->readAll().
|
* Warning: Needs to call reply()->readAll().
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -43,7 +43,7 @@ AccessManager::AccessManager(QObject *parent)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef Q_OS_LINUX
|
#ifndef Q_OS_LINUX
|
||||||
// Atempt to workaround for https://github.com/owncloud/client/issues/3969
|
// Attempt to workaround for https://github.com/owncloud/client/issues/3969
|
||||||
setConfiguration(QNetworkConfiguration());
|
setConfiguration(QNetworkConfiguration());
|
||||||
#endif
|
#endif
|
||||||
setCookieJar(new CookieJar);
|
setCookieJar(new CookieJar);
|
||||||
|
|
|
@ -99,7 +99,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* The user that can be used in dav url.
|
* The user that can be used in dav url.
|
||||||
*
|
*
|
||||||
* This can very well be different frome the login user that's
|
* This can very well be different from the login user that's
|
||||||
* stored in credentials()->user().
|
* stored in credentials()->user().
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] QString davUser() const;
|
[[nodiscard]] QString davUser() const;
|
||||||
|
|
|
@ -79,7 +79,7 @@ private slots:
|
||||||
const QByteArray &transmissionChecksumType,
|
const QByteArray &transmissionChecksumType,
|
||||||
const QByteArray &transmissionChecksum);
|
const QByteArray &transmissionChecksum);
|
||||||
|
|
||||||
// invoked on internal error to unlock a folder and faile
|
// invoked on internal error to unlock a folder and failed
|
||||||
void slotOnErrorStartFolderUnlock(OCC::SyncFileItemPtr item,
|
void slotOnErrorStartFolderUnlock(OCC::SyncFileItemPtr item,
|
||||||
const OCC::SyncFileItem::Status status,
|
const OCC::SyncFileItem::Status status,
|
||||||
const QString &errorString,
|
const QString &errorString,
|
||||||
|
|
|
@ -71,7 +71,7 @@ public:
|
||||||
[[nodiscard]] QColor serverColor() const;
|
[[nodiscard]] QColor serverColor() const;
|
||||||
[[nodiscard]] QColor serverTextColor() const;
|
[[nodiscard]] QColor serverTextColor() const;
|
||||||
|
|
||||||
/// Returns which kind of push notfications are available
|
/// Returns which kind of push notifications are available
|
||||||
[[nodiscard]] PushNotificationTypes availablePushNotifications() const;
|
[[nodiscard]] PushNotificationTypes availablePushNotifications() const;
|
||||||
|
|
||||||
/// Websocket url for files push notifications if available
|
/// Websocket url for files push notifications if available
|
||||||
|
|
|
@ -1534,7 +1534,7 @@ void FolderMetadata::setupExistingMetadata(const QByteArray& metadata)
|
||||||
qCInfo(lcCseMetadata()) << doc.toJson(QJsonDocument::Compact);
|
qCInfo(lcCseMetadata()) << doc.toJson(QJsonDocument::Compact);
|
||||||
|
|
||||||
// The metadata is being retrieved as a string stored in a json.
|
// The metadata is being retrieved as a string stored in a json.
|
||||||
// This *seems* to be broken but the RFC doesn't explicits how it wants.
|
// This *seems* to be broken but the RFC doesn't explicit how it wants.
|
||||||
// I'm currently unsure if this is error on my side or in the server implementation.
|
// I'm currently unsure if this is error on my side or in the server implementation.
|
||||||
// And because inside of the meta-data there's an object called metadata, without '-'
|
// And because inside of the meta-data there's an object called metadata, without '-'
|
||||||
// make it really different.
|
// make it really different.
|
||||||
|
|
|
@ -97,7 +97,7 @@ bool StoreMetaDataApiJob::finished()
|
||||||
emit error(_fileId, retCode);
|
emit error(_fileId, retCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
qCInfo(lcCseJob()) << "Metadata submited to the server successfully";
|
qCInfo(lcCseJob()) << "Metadata submitted to the server successfully";
|
||||||
emit success(_fileId);
|
emit success(_fileId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ bool UpdateMetadataApiJob::finished()
|
||||||
emit error(_fileId, retCode);
|
emit error(_fileId, retCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
qCInfo(lcCseJob()) << "Metadata submited to the server successfully";
|
qCInfo(lcCseJob()) << "Metadata submitted to the server successfully";
|
||||||
emit success(_fileId);
|
emit success(_fileId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -567,7 +567,7 @@ chrono::milliseconds ConfigFile::forceSyncInterval(const QString &connection) co
|
||||||
auto defaultInterval = chrono::hours(2);
|
auto defaultInterval = chrono::hours(2);
|
||||||
auto interval = millisecondsValue(settings, forceSyncIntervalC, defaultInterval);
|
auto interval = millisecondsValue(settings, forceSyncIntervalC, defaultInterval);
|
||||||
if (interval < pollInterval) {
|
if (interval < pollInterval) {
|
||||||
qCWarning(lcConfigFile) << "Force sync interval is less than the remote poll inteval, reverting to" << pollInterval.count();
|
qCWarning(lcConfigFile) << "Force sync interval is less than the remote poll interval, reverting to" << pollInterval.count();
|
||||||
interval = pollInterval;
|
interval = pollInterval;
|
||||||
}
|
}
|
||||||
return interval;
|
return interval;
|
||||||
|
|
|
@ -391,7 +391,7 @@ void HttpCredentials::slotReadJobDone(QKeychain::Job *incoming)
|
||||||
emit fetched();
|
emit fetched();
|
||||||
} else {
|
} else {
|
||||||
// we come here if the password is empty or any other keychain
|
// we come here if the password is empty or any other keychain
|
||||||
// error happend.
|
// error happened.
|
||||||
|
|
||||||
_fetchErrorString = job->error() != QKeychain::EntryNotFound ? job->errorString() : QString();
|
_fetchErrorString = job->error() != QKeychain::EntryNotFound ? job->errorString() : QString();
|
||||||
|
|
||||||
|
@ -528,7 +528,7 @@ void HttpCredentials::persist()
|
||||||
// write secrets to the keychain
|
// write secrets to the keychain
|
||||||
if (!_clientCertBundle.isEmpty()) {
|
if (!_clientCertBundle.isEmpty()) {
|
||||||
// Option 1: If we have a pkcs12 bundle, that'll be written to the config file
|
// Option 1: If we have a pkcs12 bundle, that'll be written to the config file
|
||||||
// and we'll just store the bundle password in the keychain. That's prefered
|
// and we'll just store the bundle password in the keychain. That's preferred
|
||||||
// since the keychain on older Windows platforms can only store a limited number
|
// since the keychain on older Windows platforms can only store a limited number
|
||||||
// of bytes per entry and key/cert may exceed that.
|
// of bytes per entry and key/cert may exceed that.
|
||||||
auto *job = new QKeychain::WritePasswordJob(Theme::instance()->appName());
|
auto *job = new QKeychain::WritePasswordJob(Theme::instance()->appName());
|
||||||
|
|
|
@ -109,7 +109,7 @@ public:
|
||||||
* Call this method to start the job synchronously.
|
* Call this method to start the job synchronously.
|
||||||
* Awaits completion with no need to connect some slot to the finished() signal first.
|
* Awaits completion with no need to connect some slot to the finished() signal first.
|
||||||
*
|
*
|
||||||
* @return Returns true on succeess (QKeychain::NoError).
|
* @return Returns true on success (QKeychain::NoError).
|
||||||
*/
|
*/
|
||||||
bool exec();
|
bool exec();
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ public:
|
||||||
* Call this method to start the job synchronously.
|
* Call this method to start the job synchronously.
|
||||||
* Awaits completion with no need to connect some slot to the finished() signal first.
|
* Awaits completion with no need to connect some slot to the finished() signal first.
|
||||||
*
|
*
|
||||||
* @return Returns true on succeess (QKeychain::NoError).
|
* @return Returns true on success (QKeychain::NoError).
|
||||||
*/
|
*/
|
||||||
bool exec();
|
bool exec();
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ public:
|
||||||
* Call this method to start the job synchronously.
|
* Call this method to start the job synchronously.
|
||||||
* Awaits completion with no need to connect some slot to the finished() signal first.
|
* Awaits completion with no need to connect some slot to the finished() signal first.
|
||||||
*
|
*
|
||||||
* @return Returns true on succeess (QKeychain::NoError).
|
* @return Returns true on success (QKeychain::NoError).
|
||||||
*/
|
*/
|
||||||
bool exec();
|
bool exec();
|
||||||
|
|
||||||
|
|
|
@ -771,7 +771,7 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo(
|
||||||
|
|
||||||
if (opts._vfs->mode() != Vfs::Off && !item->_encryptedFileName.isEmpty()) {
|
if (opts._vfs->mode() != Vfs::Off && !item->_encryptedFileName.isEmpty()) {
|
||||||
// We are syncing a file for the first time (local entry is invalid) and it is encrypted file that will be virtual once synced
|
// We are syncing a file for the first time (local entry is invalid) and it is encrypted file that will be virtual once synced
|
||||||
// to avoid having error of "file has changed during sync" when trying to hydrate it excplicitly - we must remove Constants::e2EeTagSize bytes from the end
|
// to avoid having error of "file has changed during sync" when trying to hydrate it explicitly - we must remove Constants::e2EeTagSize bytes from the end
|
||||||
// as explicit hydration does not care if these bytes are present in the placeholder or not, but, the size must not change in the middle of the sync
|
// as explicit hydration does not care if these bytes are present in the placeholder or not, but, the size must not change in the middle of the sync
|
||||||
// this way it works for both implicit and explicit hydration by making a placeholder size that does not includes encryption tag Constants::e2EeTagSize bytes
|
// this way it works for both implicit and explicit hydration by making a placeholder size that does not includes encryption tag Constants::e2EeTagSize bytes
|
||||||
// another scenario - we are syncing a file which is on disk but not in the database (database was removed or file was not written there yet)
|
// another scenario - we are syncing a file which is on disk but not in the database (database was removed or file was not written there yet)
|
||||||
|
@ -1503,7 +1503,7 @@ void ProcessDirectoryJob::processFileConflict(const SyncFileItemPtr &item, Proce
|
||||||
|
|
||||||
// Do we have an UploadInfo for this?
|
// Do we have an UploadInfo for this?
|
||||||
// Maybe the Upload was completed, but the connection was broken just before
|
// Maybe the Upload was completed, but the connection was broken just before
|
||||||
// we recieved the etag (Issue #5106)
|
// we received the etag (Issue #5106)
|
||||||
auto up = _discoveryData->_statedb->getUploadInfo(path._original);
|
auto up = _discoveryData->_statedb->getUploadInfo(path._original);
|
||||||
if (up._valid && up._contentChecksum == serverEntry.checksumHeader) {
|
if (up._valid && up._contentChecksum == serverEntry.checksumHeader) {
|
||||||
// Solve the conflict into an upload, or nothing
|
// Solve the conflict into an upload, or nothing
|
||||||
|
|
|
@ -518,7 +518,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief A basic job around a network request without extra funtionality
|
* @brief A basic job around a network request without extra functionality
|
||||||
* @ingroup libsync
|
* @ingroup libsync
|
||||||
*
|
*
|
||||||
* Primarily adds timeout and redirection handling.
|
* Primarily adds timeout and redirection handling.
|
||||||
|
|
|
@ -425,7 +425,7 @@ void OwncloudPropagator::adjustDeletedFoldersWithNewChildren(SyncFileItemVector
|
||||||
/*
|
/*
|
||||||
process each item that is new and is a directory and make sure every parent in its tree has the instruction CSYNC_INSTRUCTION_NEW
|
process each item that is new and is a directory and make sure every parent in its tree has the instruction CSYNC_INSTRUCTION_NEW
|
||||||
instead of CSYNC_INSTRUCTION_REMOVE
|
instead of CSYNC_INSTRUCTION_REMOVE
|
||||||
NOTE: We are iterating backwords to take advantage of optimization later, when searching for the parent of current it
|
NOTE: We are iterating backwards to take advantage of optimization later, when searching for the parent of current it
|
||||||
*/
|
*/
|
||||||
for (auto it = std::crbegin(items); it != std::crend(items); ++it) {
|
for (auto it = std::crbegin(items); it != std::crend(items); ++it) {
|
||||||
if ((*it)->_instruction != CSYNC_INSTRUCTION_NEW || (*it)->_direction != SyncFileItem::Up || !(*it)->isDirectory() || (*it)->_file == QStringLiteral("/")) {
|
if ((*it)->_instruction != CSYNC_INSTRUCTION_NEW || (*it)->_direction != SyncFileItem::Up || !(*it)->isDirectory() || (*it)->_file == QStringLiteral("/")) {
|
||||||
|
@ -441,7 +441,7 @@ void OwncloudPropagator::adjustDeletedFoldersWithNewChildren(SyncFileItemVector
|
||||||
if (itemRootFolderName.isEmpty()) {
|
if (itemRootFolderName.isEmpty()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// #2 iterate backwords (for optimization) and find the root folder by name
|
// #2 iterate backwards (for optimization) and find the root folder by name
|
||||||
const auto itemRootFolderReverseIt = std::find_if(it, std::crend(items), [&itemRootFolderName](const auto ¤tItem) {
|
const auto itemRootFolderReverseIt = std::find_if(it, std::crend(items), [&itemRootFolderName](const auto ¤tItem) {
|
||||||
return currentItem->_file == itemRootFolderName;
|
return currentItem->_file == itemRootFolderName;
|
||||||
});
|
});
|
||||||
|
|
|
@ -456,7 +456,7 @@ public:
|
||||||
bool _abortRequested = false;
|
bool _abortRequested = false;
|
||||||
|
|
||||||
/** The list of currently active jobs.
|
/** The list of currently active jobs.
|
||||||
This list contains the jobs that are currently using ressources and is used purely to
|
This list contains the jobs that are currently using resources and is used purely to
|
||||||
know how many jobs there is currently running for the scheduler.
|
know how many jobs there is currently running for the scheduler.
|
||||||
Jobs add themself to the list when they do an assynchronous operation.
|
Jobs add themself to the list when they do an assynchronous operation.
|
||||||
Jobs can be several time on the list (example, when several chunks are uploaded in parallel)
|
Jobs can be several time on the list (example, when several chunks are uploaded in parallel)
|
||||||
|
@ -468,7 +468,7 @@ public:
|
||||||
|
|
||||||
/** Per-folder quota guesses.
|
/** Per-folder quota guesses.
|
||||||
*
|
*
|
||||||
* This starts out empty. When an upload in a folder fails due to insufficent
|
* This starts out empty. When an upload in a folder fails due to insufficient
|
||||||
* remote quota, the quota guess is updated to be attempted_size-1 at maximum.
|
* remote quota, the quota guess is updated to be attempted_size-1 at maximum.
|
||||||
*
|
*
|
||||||
* Note that it will usually just an upper limit for the actual quota - but
|
* Note that it will usually just an upper limit for the actual quota - but
|
||||||
|
|
|
@ -82,7 +82,7 @@ inline SyncFileItem::Status classifyError(QNetworkReply::NetworkError nerror,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (httpCode == 503) {
|
if (httpCode == 503) {
|
||||||
// When the server is in maintenance mode, we want to exit the sync immediatly
|
// When the server is in maintenance mode, we want to exit the sync immediately
|
||||||
// so that we do not flood the server with many requests
|
// so that we do not flood the server with many requests
|
||||||
// BUG: This relies on a translated string and is thus unreliable.
|
// BUG: This relies on a translated string and is thus unreliable.
|
||||||
// In the future it should return a NormalError and trigger a status.php
|
// In the future it should return a NormalError and trigger a status.php
|
||||||
|
|
|
@ -285,8 +285,8 @@ ProgressInfo::Estimates ProgressInfo::totalProgress() const
|
||||||
// on the upload speed. That's particularly relevant for large file
|
// on the upload speed. That's particularly relevant for large file
|
||||||
// up/downloads, where files per second will be close to 0.
|
// up/downloads, where files per second will be close to 0.
|
||||||
//
|
//
|
||||||
// However, when many *small* files are transfered, the estimate
|
// However, when many *small* files are transferred, the estimate
|
||||||
// can become very pessimistic as the transfered amount per second
|
// can become very pessimistic as the transferred amount per second
|
||||||
// drops significantly.
|
// drops significantly.
|
||||||
//
|
//
|
||||||
// So, if we detect a high rate of files per second or a very low
|
// So, if we detect a high rate of files per second or a very low
|
||||||
|
@ -324,7 +324,7 @@ quint64 ProgressInfo::optimisticEta() const
|
||||||
{
|
{
|
||||||
// This assumes files and transfers finish as quickly as possible
|
// This assumes files and transfers finish as quickly as possible
|
||||||
// *but* note that maxPerSecond could be serious underestimate
|
// *but* note that maxPerSecond could be serious underestimate
|
||||||
// (if we never got to fully excercise transfer or files/second)
|
// (if we never got to fully exercise transfer or files/second)
|
||||||
|
|
||||||
return _fileProgress.remaining() / _maxFilesPerSecond * 1000
|
return _fileProgress.remaining() / _maxFilesPerSecond * 1000
|
||||||
+ _sizeProgress.remaining() / _maxBytesPerSecond * 1000;
|
+ _sizeProgress.remaining() / _maxBytesPerSecond * 1000;
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
/*
|
/*
|
||||||
* Removing the root encrypted folder is consisted of multiple steps:
|
* Removing the root encrypted folder is consisted of multiple steps:
|
||||||
* - 1st step is to obtain the folderID via LsColJob so it then can be used for the next step
|
* - 1st step is to obtain the folderID via LsColJob so it then can be used for the next step
|
||||||
* - 2nd step is to lock the root folder useing the folderID from the previous step. !!! NOTE: If there are no nested items in the folder, this, and subsequent steps are skipped until step 7.
|
* - 2nd step is to lock the root folder using the folderID from the previous step. !!! NOTE: If there are no nested items in the folder, this, and subsequent steps are skipped until step 7.
|
||||||
* - 3rd step is to obtain the root folder's metadata (it contains list of nested files and folders)
|
* - 3rd step is to obtain the root folder's metadata (it contains list of nested files and folders)
|
||||||
* - 4th step is to remove the nested files and folders from the metadata and send it to the server via UpdateMetadataApiJob
|
* - 4th step is to remove the nested files and folders from the metadata and send it to the server via UpdateMetadataApiJob
|
||||||
* - 5th step is to trigger DeleteJob for every nested file and folder of the root folder
|
* - 5th step is to trigger DeleteJob for every nested file and folder of the root folder
|
||||||
|
|
|
@ -368,7 +368,7 @@ void PropagateUploadFileCommon::slotComputeTransmissionChecksum(const QByteArray
|
||||||
|
|
||||||
void PropagateUploadFileCommon::slotStartUpload(const QByteArray &transmissionChecksumType, const QByteArray &transmissionChecksum)
|
void PropagateUploadFileCommon::slotStartUpload(const QByteArray &transmissionChecksumType, const QByteArray &transmissionChecksum)
|
||||||
{
|
{
|
||||||
// Remove ourselfs from the list of active job, before any posible call to done()
|
// Remove ourselves from the list of active job, before any possible call to done()
|
||||||
// When we start chunks, we will add it again, once for every chunks.
|
// When we start chunks, we will add it again, once for every chunks.
|
||||||
propagator()->_activeJobList.removeOne(this);
|
propagator()->_activeJobList.removeOne(this);
|
||||||
|
|
||||||
|
@ -723,7 +723,7 @@ void PropagateUploadFileCommon::slotJobDestroyed(QObject *job)
|
||||||
_jobs.erase(std::remove(_jobs.begin(), _jobs.end(), job), _jobs.end());
|
_jobs.erase(std::remove(_jobs.begin(), _jobs.end(), job), _jobs.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function is used whenever there is an error occuring and jobs might be in progress
|
// This function is used whenever there is an error occurring and jobs might be in progress
|
||||||
void PropagateUploadFileCommon::abortWithError(SyncFileItem::Status status, const QString &error)
|
void PropagateUploadFileCommon::abortWithError(SyncFileItem::Status status, const QString &error)
|
||||||
{
|
{
|
||||||
if (_aborting)
|
if (_aborting)
|
||||||
|
@ -864,7 +864,7 @@ void PropagateUploadFileCommon::abortNetworkJobs(
|
||||||
|
|
||||||
// Abort the job
|
// Abort the job
|
||||||
if (abortType == AbortType::Asynchronous) {
|
if (abortType == AbortType::Asynchronous) {
|
||||||
// Connect to finished signal of job reply to asynchonously finish the abort
|
// Connect to finished signal of job reply to asynchronously finish the abort
|
||||||
connect(reply, &QNetworkReply::finished, this, oneAbortFinished);
|
connect(reply, &QNetworkReply::finished, this, oneAbortFinished);
|
||||||
}
|
}
|
||||||
reply->abort();
|
reply->abort();
|
||||||
|
|
|
@ -264,7 +264,7 @@ private slots:
|
||||||
void slotStartUpload(const QByteArray &transmissionChecksumType, const QByteArray &transmissionChecksum);
|
void slotStartUpload(const QByteArray &transmissionChecksumType, const QByteArray &transmissionChecksum);
|
||||||
// invoked when encrypted folder lock has been released
|
// invoked when encrypted folder lock has been released
|
||||||
void slotFolderUnlocked(const QByteArray &folderId, int httpReturnCode);
|
void slotFolderUnlocked(const QByteArray &folderId, int httpReturnCode);
|
||||||
// invoked on internal error to unlock a folder and faile
|
// invoked on internal error to unlock a folder and failed
|
||||||
void slotOnErrorStartFolderUnlock(SyncFileItem::Status status, const QString &errorString);
|
void slotOnErrorStartFolderUnlock(SyncFileItem::Status status, const QString &errorString);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -325,7 +325,7 @@ private:
|
||||||
/**
|
/**
|
||||||
* @ingroup libsync
|
* @ingroup libsync
|
||||||
*
|
*
|
||||||
* Propagation job, impementing the old chunking agorithm
|
* Propagation job, implementing the old chunking algorithm
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class PropagateUploadFileV1 : public PropagateUploadFileCommon
|
class PropagateUploadFileV1 : public PropagateUploadFileCommon
|
||||||
|
@ -372,7 +372,7 @@ private slots:
|
||||||
/**
|
/**
|
||||||
* @ingroup libsync
|
* @ingroup libsync
|
||||||
*
|
*
|
||||||
* Propagation job, impementing the new chunking agorithm
|
* Propagation job, implementing the new chunking algorithm
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class PropagateUploadFileNG : public PropagateUploadFileCommon
|
class PropagateUploadFileNG : public PropagateUploadFileCommon
|
||||||
|
|
|
@ -63,7 +63,7 @@ void PropagateUploadEncrypted::start()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We try to lock a folder, if it's locked we try again in one second.
|
/* We try to lock a folder, if it's locked we try again in one second.
|
||||||
* if it's still locked we try again in one second. looping untill one minute.
|
* if it's still locked we try again in one second. looping until one minute.
|
||||||
* -> fail.
|
* -> fail.
|
||||||
* the 'loop': /
|
* the 'loop': /
|
||||||
* slotFolderEncryptedIdReceived -> slotTryLock -> lockError -> stillTime? -> slotTryLock
|
* slotFolderEncryptedIdReceived -> slotTryLock -> lockError -> stillTime? -> slotTryLock
|
||||||
|
@ -231,7 +231,7 @@ void PropagateUploadEncrypted::slotUpdateMetadataSuccess(const QByteArray& fileI
|
||||||
QFileInfo outputInfo(_completeFileName);
|
QFileInfo outputInfo(_completeFileName);
|
||||||
|
|
||||||
qCDebug(lcPropagateUploadEncrypted) << "Encrypted Info:" << outputInfo.path() << outputInfo.fileName() << outputInfo.size();
|
qCDebug(lcPropagateUploadEncrypted) << "Encrypted Info:" << outputInfo.path() << outputInfo.fileName() << outputInfo.size();
|
||||||
qCDebug(lcPropagateUploadEncrypted) << "Finalizing the upload part, now the actuall uploader will take over";
|
qCDebug(lcPropagateUploadEncrypted) << "Finalizing the upload part, now the actual uploader will take over";
|
||||||
emit finalized(outputInfo.path() + QLatin1Char('/') + outputInfo.fileName(),
|
emit finalized(outputInfo.path() + QLatin1Char('/') + outputInfo.fileName(),
|
||||||
_remoteParentPath + QLatin1Char('/') + outputInfo.fileName(),
|
_remoteParentPath + QLatin1Char('/') + outputInfo.fileName(),
|
||||||
outputInfo.size());
|
outputInfo.size());
|
||||||
|
|
|
@ -56,7 +56,7 @@ private slots:
|
||||||
void slotUpdateMetadataError(const QByteArray& fileId, int httpReturnCode);
|
void slotUpdateMetadataError(const QByteArray& fileId, int httpReturnCode);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
// Emmited after the file is encrypted and everythign is setup.
|
// Emitted after the file is encrypted and everything is setup.
|
||||||
void finalized(const QString& path, const QString& filename, quint64 size);
|
void finalized(const QString& path, const QString& filename, quint64 size);
|
||||||
void error();
|
void error();
|
||||||
void folderUnlocked(const QByteArray &folderId, int httpStatus);
|
void folderUnlocked(const QByteArray &folderId, int httpStatus);
|
||||||
|
|
|
@ -256,7 +256,7 @@ void PropagateUploadFileV1::slotPutFinished()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check whether the file changed since discovery. the file check here is the original and not the temprary.
|
// Check whether the file changed since discovery. the file check here is the original and not the temporary.
|
||||||
Q_ASSERT(_item->_modtime > 0);
|
Q_ASSERT(_item->_modtime > 0);
|
||||||
if (_item->_modtime <= 0) {
|
if (_item->_modtime <= 0) {
|
||||||
qCWarning(lcPropagateUpload()) << "invalid modified time" << _item->_file << _item->_modtime;
|
qCWarning(lcPropagateUpload()) << "invalid modified time" << _item->_file << _item->_modtime;
|
||||||
|
|
|
@ -198,7 +198,7 @@ void PushNotifications::handleAuthenticated()
|
||||||
emit ready();
|
emit ready();
|
||||||
|
|
||||||
// We maybe reconnected to websocket while being offline for a
|
// We maybe reconnected to websocket while being offline for a
|
||||||
// while. To not miss any notifications that may have happend,
|
// while. To not miss any notifications that may have happened,
|
||||||
// emit all the signals once.
|
// emit all the signals once.
|
||||||
emitFilesChanged();
|
emitFilesChanged();
|
||||||
emitNotificationsChanged();
|
emitNotificationsChanged();
|
||||||
|
|
|
@ -296,7 +296,7 @@ void SyncEngine::conflictRecordMaintenance()
|
||||||
// If so, add them now.
|
// If so, add them now.
|
||||||
//
|
//
|
||||||
// This happens when the conflicts table is new or when conflict files
|
// This happens when the conflicts table is new or when conflict files
|
||||||
// are downlaoded but the server doesn't send conflict headers.
|
// are downloaded but the server doesn't send conflict headers.
|
||||||
for (const auto &path : qAsConst(_seenConflictFiles)) {
|
for (const auto &path : qAsConst(_seenConflictFiles)) {
|
||||||
ASSERT(Utility::isConflictFile(path));
|
ASSERT(Utility::isConflictFile(path));
|
||||||
|
|
||||||
|
@ -1177,7 +1177,7 @@ void SyncEngine::wipeVirtualFiles(const QString &localPath, SyncJournalDb &journ
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!resGetFilesBelowPath) {
|
if (!resGetFilesBelowPath) {
|
||||||
qCWarning(lcEngine) << "Faied to get files below path" << localPath;
|
qCWarning(lcEngine) << "Failed to get files below path" << localPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
journal.forceRemoteDiscoveryNextSync();
|
journal.forceRemoteDiscoveryNextSync();
|
||||||
|
@ -1204,7 +1204,7 @@ void SyncEngine::switchToVirtualFiles(const QString &localPath, SyncJournalDb &j
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!res) {
|
if (!res) {
|
||||||
qCWarning(lcEngine) << "Faied to get files below path" << localPath;
|
qCWarning(lcEngine) << "Failed to get files below path" << localPath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -178,7 +178,7 @@ signals:
|
||||||
void started();
|
void started();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Emited when the sync engine detects that all the files have been removed or change.
|
* Emitted when the sync engine detects that all the files have been removed or change.
|
||||||
* This usually happen when the server was reset or something.
|
* This usually happen when the server was reset or something.
|
||||||
* Set *cancel to true in a slot connected from this signal to abort the sync.
|
* Set *cancel to true in a slot connected from this signal to abort the sync.
|
||||||
*/
|
*/
|
||||||
|
@ -211,7 +211,7 @@ private slots:
|
||||||
void slotItemCompleted(const OCC::SyncFileItemPtr &item, const OCC::ErrorCategory category);
|
void slotItemCompleted(const OCC::SyncFileItemPtr &item, const OCC::ErrorCategory category);
|
||||||
void slotDiscoveryFinished();
|
void slotDiscoveryFinished();
|
||||||
void slotPropagationFinished(bool success);
|
void slotPropagationFinished(bool success);
|
||||||
void slotProgress(const OCC::SyncFileItem &item, qint64 curent);
|
void slotProgress(const OCC::SyncFileItem &item, qint64 current);
|
||||||
void slotCleanPollsJobAborted(const QString &error, const OCC::ErrorCategory category);
|
void slotCleanPollsJobAborted(const QString &error, const OCC::ErrorCategory category);
|
||||||
|
|
||||||
/** Records that a file was touched by a job. */
|
/** Records that a file was touched by a job. */
|
||||||
|
@ -313,7 +313,7 @@ private:
|
||||||
|
|
||||||
static bool s_anySyncRunning; //true when one sync is running somewhere (for debugging)
|
static bool s_anySyncRunning; //true when one sync is running somewhere (for debugging)
|
||||||
|
|
||||||
// Must only be acessed during update and reconcile
|
// Must only be accessed during update and reconcile
|
||||||
QVector<SyncFileItemPtr> _syncItems;
|
QVector<SyncFileItemPtr> _syncItems;
|
||||||
|
|
||||||
AccountPtr _account;
|
AccountPtr _account;
|
||||||
|
|
|
@ -136,7 +136,7 @@ SyncFileStatus SyncFileStatusTracker::fileStatus(const QString &relativePath)
|
||||||
// that the status of CSYNC_FILE_EXCLUDE_LIST excludes will change if the user
|
// that the status of CSYNC_FILE_EXCLUDE_LIST excludes will change if the user
|
||||||
// update the exclude list at runtime and doing it statically here removes
|
// update the exclude list at runtime and doing it statically here removes
|
||||||
// our ability to notify changes through the fileStatusChanged signal,
|
// our ability to notify changes through the fileStatusChanged signal,
|
||||||
// it's an acceptable compromize to treat all exclude types the same.
|
// it's an acceptable compromise to treat all exclude types the same.
|
||||||
// Update: This extra check shouldn't hurt even though silently excluded files
|
// Update: This extra check shouldn't hurt even though silently excluded files
|
||||||
// are now available via slotAddSilentlyExcluded().
|
// are now available via slotAddSilentlyExcluded().
|
||||||
if (_syncEngine->excludedFiles().isExcluded(_syncEngine->localPath() + relativePath,
|
if (_syncEngine->excludedFiles().isExcluded(_syncEngine->localPath() + relativePath,
|
||||||
|
@ -287,7 +287,7 @@ void SyncFileStatusTracker::slotItemCompleted(const SyncFileItemPtr &item)
|
||||||
&& item->_instruction != CSYNC_INSTRUCTION_UPDATE_METADATA
|
&& item->_instruction != CSYNC_INSTRUCTION_UPDATE_METADATA
|
||||||
&& item->_instruction != CSYNC_INSTRUCTION_IGNORE
|
&& item->_instruction != CSYNC_INSTRUCTION_IGNORE
|
||||||
&& item->_instruction != CSYNC_INSTRUCTION_ERROR) {
|
&& item->_instruction != CSYNC_INSTRUCTION_ERROR) {
|
||||||
// decSyncCount calls *must* be symetric with incSyncCount calls in slotAboutToPropagate
|
// decSyncCount calls *must* be symmetric with incSyncCount calls in slotAboutToPropagate
|
||||||
decSyncCountAndEmitStatusChanged(item->destination(), sharedFlag);
|
decSyncCountAndEmitStatusChanged(item->destination(), sharedFlag);
|
||||||
} else {
|
} else {
|
||||||
emit fileStatusChanged(getSystemDestination(item->destination()), resolveSyncAndErrorStatus(item->destination(), sharedFlag));
|
emit fileStatusChanged(getSystemDestination(item->destination()), resolveSyncAndErrorStatus(item->destination(), sharedFlag));
|
||||||
|
|
|
@ -106,7 +106,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* Only sync files that mathc the expression
|
* Only sync files that match the expression
|
||||||
* Invalid pattern by default.
|
* Invalid pattern by default.
|
||||||
*/
|
*/
|
||||||
QRegularExpression _fileRegex = QRegularExpression(QStringLiteral("("));
|
QRegularExpression _fileRegex = QRegularExpression(QStringLiteral("("));
|
||||||
|
|
|
@ -278,9 +278,9 @@ public:
|
||||||
[[nodiscard]] bool doNotUseProxy() const;
|
[[nodiscard]] bool doNotUseProxy() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is only usefull when previous version had a different overrideServerUrl
|
* This is only useful when previous version had a different overrideServerUrl
|
||||||
* with a different auth type in that case You should then specify "http" or "shibboleth".
|
* with a different auth type in that case You should then specify "http" or "shibboleth".
|
||||||
* Normaly this should be left empty.
|
* Normally this should be left empty.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] QString forceConfigAuthType() const;
|
[[nodiscard]] QString forceConfigAuthType() const;
|
||||||
|
|
||||||
|
@ -352,7 +352,7 @@ public:
|
||||||
void setSystrayUseMonoIcons(bool mono);
|
void setSystrayUseMonoIcons(bool mono);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve wether to use mono icons for systray
|
* Retrieve whether to use mono icons for systray
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] bool systrayUseMonoIcons() const;
|
[[nodiscard]] bool systrayUseMonoIcons() const;
|
||||||
|
|
||||||
|
@ -458,7 +458,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @brief the server folder that should be queried for the quota information
|
* @brief the server folder that should be queried for the quota information
|
||||||
*
|
*
|
||||||
* This can be configured to show the quota infromation for a different
|
* This can be configured to show the quota information for a different
|
||||||
* folder than the root. This is the folder on which the client will do
|
* folder than the root. This is the folder on which the client will do
|
||||||
* PROPFIND calls to get "quota-available-bytes" and "quota-used-bytes"
|
* PROPFIND calls to get "quota-available-bytes" and "quota-used-bytes"
|
||||||
*
|
*
|
||||||
|
|
|
@ -143,7 +143,7 @@ void UpdateFileDropMetadataJob::slotUpdateMetadataSuccess(const QByteArray &file
|
||||||
Q_UNUSED(fileId);
|
Q_UNUSED(fileId);
|
||||||
qCDebug(lcUpdateFileDropMetadataJob) << "Uploading of the metadata success, Encrypting the file";
|
qCDebug(lcUpdateFileDropMetadataJob) << "Uploading of the metadata success, Encrypting the file";
|
||||||
|
|
||||||
qCDebug(lcUpdateFileDropMetadataJob) << "Finalizing the upload part, now the actuall uploader will take over";
|
qCDebug(lcUpdateFileDropMetadataJob) << "Finalizing the upload part, now the actual uploader will take over";
|
||||||
unlockFolder();
|
unlockFolder();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ if(NOT DEFINED CUSTOM_STATE_ICON_INDEX_OFFSET)
|
||||||
set(CUSTOM_STATE_ICON_INDEX_OFFSET 1)
|
set(CUSTOM_STATE_ICON_INDEX_OFFSET 1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# indeces used for referencing icon within the binary's resources and .rc file's IDI_ICON{i} entries 'i'
|
# indices used for referencing icon within the binary's resources and .rc file's IDI_ICON{i} entries 'i'
|
||||||
if(NOT DEFINED CUSTOM_STATE_ICON_LOCKED_INDEX)
|
if(NOT DEFINED CUSTOM_STATE_ICON_LOCKED_INDEX)
|
||||||
set(CUSTOM_STATE_ICON_LOCKED_INDEX 1)
|
set(CUSTOM_STATE_ICON_LOCKED_INDEX 1)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -1051,7 +1051,7 @@ QNetworkReply *FakeQNAM::createRequest(QNetworkAccessManager::Operation op, cons
|
||||||
|
|
||||||
auto verb = newRequest.attribute(QNetworkRequest::CustomVerbAttribute);
|
auto verb = newRequest.attribute(QNetworkRequest::CustomVerbAttribute);
|
||||||
if (verb == QLatin1String("PROPFIND")) {
|
if (verb == QLatin1String("PROPFIND")) {
|
||||||
// Ignore outgoingData always returning somethign good enough, works for now.
|
// Ignore outgoingData always returning something good enough, works for now.
|
||||||
reply = new FakePropfindReply { info, op, newRequest, this };
|
reply = new FakePropfindReply { info, op, newRequest, this };
|
||||||
} else if (verb == QLatin1String("GET") || op == QNetworkAccessManager::GetOperation) {
|
} else if (verb == QLatin1String("GET") || op == QNetworkAccessManager::GetOperation) {
|
||||||
reply = new FakeGetReply { info, op, newRequest, this };
|
reply = new FakeGetReply { info, op, newRequest, this };
|
||||||
|
|
|
@ -181,7 +181,7 @@ private slots:
|
||||||
QVERIFY(fakeFolder.syncOnce());
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
QCOMPARE(aboutToRemoveAllFilesCalled, 0);
|
QCOMPARE(aboutToRemoveAllFilesCalled, 0);
|
||||||
|
|
||||||
// Do some change localy
|
// Do some change locally
|
||||||
fakeFolder.localModifier().appendByte("A/a1");
|
fakeFolder.localModifier().appendByte("A/a1");
|
||||||
|
|
||||||
// reset the server.
|
// reset the server.
|
||||||
|
@ -259,7 +259,7 @@ private slots:
|
||||||
QVERIFY(fakeFolder.syncOnce());
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
QCOMPARE(fingerprintRequests, 2);
|
QCOMPARE(fingerprintRequests, 2);
|
||||||
auto currentState = fakeFolder.currentLocalState();
|
auto currentState = fakeFolder.currentLocalState();
|
||||||
// Altough the local file is kept as a conflict, the server file is downloaded
|
// Although the local file is kept as a conflict, the server file is downloaded
|
||||||
QCOMPARE(currentState.find("A/a1")->contentChar, 'O');
|
QCOMPARE(currentState.find("A/a1")->contentChar, 'O');
|
||||||
auto conflict = findConflict(currentState, "A/a1");
|
auto conflict = findConflict(currentState, "A/a1");
|
||||||
QVERIFY(conflict);
|
QVERIFY(conflict);
|
||||||
|
@ -325,7 +325,7 @@ private slots:
|
||||||
QStringList() << "A/" << "B/" << "C/" << "S/");
|
QStringList() << "A/" << "B/" << "C/" << "S/");
|
||||||
|
|
||||||
QVERIFY(fakeFolder.syncOnce());
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
QCOMPARE(fakeFolder.currentLocalState(), FileInfo{}); // all files should be one localy
|
QCOMPARE(fakeFolder.currentLocalState(), FileInfo{}); // all files should be one locally
|
||||||
QCOMPARE(fakeFolder.currentRemoteState(), FileInfo::A12_B12_C12_S12()); // Server not changed
|
QCOMPARE(fakeFolder.currentRemoteState(), FileInfo::A12_B12_C12_S12()); // Server not changed
|
||||||
QCOMPARE(aboutToRemoveAllFilesCalled, 0); // But we did not show the popup
|
QCOMPARE(aboutToRemoveAllFilesCalled, 0); // But we did not show the popup
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,7 +157,7 @@ private slots:
|
||||||
insertFile("err/single_error2", 300, waitAndChain(errorCallback));
|
insertFile("err/single_error2", 300, waitAndChain(errorCallback));
|
||||||
|
|
||||||
// First sync should finish by itself.
|
// First sync should finish by itself.
|
||||||
// All the things in "success/" should be transfered, the things in "err/" not
|
// All the things in "success/" should be transferred, the things in "err/" not
|
||||||
QVERIFY(!fakeFolder.syncOnce());
|
QVERIFY(!fakeFolder.syncOnce());
|
||||||
QCOMPARE(nGET, 0);
|
QCOMPARE(nGET, 0);
|
||||||
QCOMPARE(*fakeFolder.currentLocalState().find("success"),
|
QCOMPARE(*fakeFolder.currentLocalState().find("success"),
|
||||||
|
|
|
@ -408,7 +408,7 @@ private slots:
|
||||||
QVERIFY(fakeFolder.syncOnce());
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
|
||||||
// Modify the file localy and start the upload
|
// Modify the file locally and start the upload
|
||||||
fakeFolder.localModifier().setContents("A/a0", 'B');
|
fakeFolder.localModifier().setContents("A/a0", 'B');
|
||||||
fakeFolder.localModifier().appendByte("A/a0");
|
fakeFolder.localModifier().appendByte("A/a0");
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ using namespace OCC;
|
||||||
|
|
||||||
static constexpr qint64 stopAfter = 3'123'668;
|
static constexpr qint64 stopAfter = 3'123'668;
|
||||||
|
|
||||||
/* A FakeGetReply that sends max 'fakeSize' bytes, but whose ContentLength has the corect size */
|
/* A FakeGetReply that sends max 'fakeSize' bytes, but whose ContentLength has the correct size */
|
||||||
class BrokenFakeGetReply : public FakeGetReply
|
class BrokenFakeGetReply : public FakeGetReply
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -26,7 +26,7 @@ public:
|
||||||
{
|
{
|
||||||
if (aborted)
|
if (aborted)
|
||||||
return 0;
|
return 0;
|
||||||
return std::min(size, fakeSize) + QIODevice::bytesAvailable(); // NOLINT: This is intended to simulare the brokeness
|
return std::min(size, fakeSize) + QIODevice::bytesAvailable(); // NOLINT: This is intended to simulate the brokenness
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 readData(char *data, qint64 maxlen) override
|
qint64 readData(char *data, qint64 maxlen) override
|
||||||
|
|
|
@ -27,7 +27,7 @@ static void applyPermissionsFromName(FileInfo &info) {
|
||||||
// https://github.com/owncloud/client/issues/2038
|
// https://github.com/owncloud/client/issues/2038
|
||||||
static void assertCsyncJournalOk(SyncJournalDb &journal)
|
static void assertCsyncJournalOk(SyncJournalDb &journal)
|
||||||
{
|
{
|
||||||
// The DB is openend in locked mode: close to allow us to access.
|
// The DB is opened in locked mode: close to allow us to access.
|
||||||
journal.close();
|
journal.close();
|
||||||
|
|
||||||
SqlDatabase db;
|
SqlDatabase db;
|
||||||
|
@ -283,7 +283,7 @@ private slots:
|
||||||
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data" ));
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data" ));
|
||||||
// new still exist
|
// new still exist
|
||||||
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/newname_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data" ));
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/newname_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data" ));
|
||||||
// but is not on server: so remove it localy for the future comarison
|
// but is not on server: so remove it locally for the future comarison
|
||||||
fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_/newname_PERM_CK_");
|
fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_/newname_PERM_CK_");
|
||||||
|
|
||||||
//2.
|
//2.
|
||||||
|
|
|
@ -214,7 +214,7 @@ private slots:
|
||||||
|
|
||||||
QVERIFY(fakeServer.waitForTextMessages());
|
QVERIFY(fakeServer.waitForTextMessages());
|
||||||
// FIXME: This a little bit ugly but I had no better idea how to trigger a error on the websocket client.
|
// FIXME: This a little bit ugly but I had no better idea how to trigger a error on the websocket client.
|
||||||
// The websocket that is retrived through the server is not connected to the ssl error signal.
|
// The websocket that is retrieved through the server is not connected to the ssl error signal.
|
||||||
auto pushNotificationsWebSocketChildren = account->pushNotifications()->findChildren<QWebSocket *>();
|
auto pushNotificationsWebSocketChildren = account->pushNotifications()->findChildren<QWebSocket *>();
|
||||||
QVERIFY(pushNotificationsWebSocketChildren.size() == 1);
|
QVERIFY(pushNotificationsWebSocketChildren.size() == 1);
|
||||||
emit pushNotificationsWebSocketChildren[0]->sslErrors(QList<QSslError>());
|
emit pushNotificationsWebSocketChildren[0]->sslErrors(QList<QSslError>());
|
||||||
|
@ -274,7 +274,7 @@ private slots:
|
||||||
auto account = FakeWebSocketServer::createAccount();
|
auto account = FakeWebSocketServer::createAccount();
|
||||||
QVERIFY(fakeServer.authenticateAccount(account));
|
QVERIFY(fakeServer.authenticateAccount(account));
|
||||||
|
|
||||||
// Set the ping timeout interval to zero and check if the server attemps to authenticate again
|
// Set the ping timeout interval to zero and check if the server attempts to authenticate again
|
||||||
fakeServer.clearTextMessages();
|
fakeServer.clearTextMessages();
|
||||||
account->pushNotifications()->setPingInterval(0);
|
account->pushNotifications()->setPingInterval(0);
|
||||||
QVERIFY(fakeServer.authenticateAccount(
|
QVERIFY(fakeServer.authenticateAccount(
|
||||||
|
|
|
@ -77,7 +77,7 @@ private slots:
|
||||||
QCOMPARE(sizeRequests.count(), 1); // "A/newBigDir";
|
QCOMPARE(sizeRequests.count(), 1); // "A/newBigDir";
|
||||||
sizeRequests.clear();
|
sizeRequests.clear();
|
||||||
|
|
||||||
// Simulate that we accept all files by seting a wildcard white list
|
// Simulate that we accept all files by setting a wildcard white list
|
||||||
fakeFolder.syncEngine().journal()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList,
|
fakeFolder.syncEngine().journal()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList,
|
||||||
QStringList() << QLatin1String("/"));
|
QStringList() << QLatin1String("/"));
|
||||||
fakeFolder.syncEngine().journal()->schedulePathForRemoteDiscovery(QString("A/newBigDir"));
|
fakeFolder.syncEngine().journal()->schedulePathForRemoteDiscovery(QString("A/newBigDir"));
|
||||||
|
|
|
@ -25,7 +25,7 @@ private slots:
|
||||||
fakeFolder.remoteModifier().remove("A");
|
fakeFolder.remoteModifier().remove("A");
|
||||||
fakeFolder.localModifier().insert("A/hello.txt");
|
fakeFolder.localModifier().insert("A/hello.txt");
|
||||||
|
|
||||||
// Symetry
|
// Symmetry
|
||||||
fakeFolder.localModifier().remove("B");
|
fakeFolder.localModifier().remove("B");
|
||||||
fakeFolder.remoteModifier().insert("B/hello.txt");
|
fakeFolder.remoteModifier().insert("B/hello.txt");
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ private slots:
|
||||||
QVERIFY(!fakeFolder.currentRemoteState().find("A/a1"));
|
QVERIFY(!fakeFolder.currentRemoteState().find("A/a1"));
|
||||||
QVERIFY(fakeFolder.currentRemoteState().find("A/hello.txt"));
|
QVERIFY(fakeFolder.currentRemoteState().find("A/hello.txt"));
|
||||||
|
|
||||||
// Symetry
|
// Symmetry
|
||||||
QVERIFY(!fakeFolder.currentRemoteState().find("B/b1"));
|
QVERIFY(!fakeFolder.currentRemoteState().find("B/b1"));
|
||||||
QVERIFY(fakeFolder.currentRemoteState().find("B/hello.txt"));
|
QVERIFY(fakeFolder.currentRemoteState().find("B/hello.txt"));
|
||||||
|
|
||||||
|
|
|
@ -1091,7 +1091,7 @@ private slots:
|
||||||
return nullptr;
|
return nullptr;
|
||||||
});
|
});
|
||||||
|
|
||||||
// make sure the first sync failes and files get restored to original folder
|
// make sure the first sync fails and files get restored to original folder
|
||||||
QVERIFY(!fakeFolder.syncOnce());
|
QVERIFY(!fakeFolder.syncOnce());
|
||||||
|
|
||||||
QVERIFY(fakeFolder.syncOnce());
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
@ -1142,7 +1142,7 @@ private slots:
|
||||||
return nullptr;
|
return nullptr;
|
||||||
});
|
});
|
||||||
|
|
||||||
// make sure the first sync failes and files get restored to original folder
|
// make sure the first sync fails and files get restored to original folder
|
||||||
QVERIFY(!fakeFolder.syncOnce());
|
QVERIFY(!fakeFolder.syncOnce());
|
||||||
|
|
||||||
QVERIFY(fakeFolder.syncOnce());
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
|
|
@ -351,7 +351,7 @@ private slots:
|
||||||
QCOMPARE(counter.nGET, 1);
|
QCOMPARE(counter.nGET, 1);
|
||||||
counter.reset();
|
counter.reset();
|
||||||
|
|
||||||
// remove localy, and remote move at the same time
|
// remove locally, and remote move at the same time
|
||||||
fakeFolder.localModifier().remove("A/Q/W/a1m");
|
fakeFolder.localModifier().remove("A/Q/W/a1m");
|
||||||
remote.rename("A/Q/W/a1m", "A/Q/W/a1p");
|
remote.rename("A/Q/W/a1m", "A/Q/W/a1p");
|
||||||
remote.rename(prefix + "/A/Q/W/a1m", prefix + "/A/Q/W/a1p");
|
remote.rename(prefix + "/A/Q/W/a1m", prefix + "/A/Q/W/a1p");
|
||||||
|
@ -814,7 +814,7 @@ private slots:
|
||||||
|
|
||||||
// Test that renaming a file within a directory that was renamed on the other side actually do a rename.
|
// Test that renaming a file within a directory that was renamed on the other side actually do a rename.
|
||||||
|
|
||||||
// 1) move the folder alphabeticaly before
|
// 1) move the folder alphabetically before
|
||||||
fakeFolder.remoteModifier().rename("A/a1", "A/a1m");
|
fakeFolder.remoteModifier().rename("A/a1", "A/a1m");
|
||||||
fakeFolder.localModifier().rename("A", "_A");
|
fakeFolder.localModifier().rename("A", "_A");
|
||||||
fakeFolder.localModifier().rename("B/b1", "B/b1m");
|
fakeFolder.localModifier().rename("B/b1", "B/b1m");
|
||||||
|
|
|
@ -259,7 +259,7 @@ private slots:
|
||||||
// a single character
|
// a single character
|
||||||
QVERIFY(!isPathWindowsDrivePartitionRoot("a"));
|
QVERIFY(!isPathWindowsDrivePartitionRoot("a"));
|
||||||
|
|
||||||
// a missing second chracter
|
// a missing second character
|
||||||
QVERIFY(!isPathWindowsDrivePartitionRoot("c/"));
|
QVERIFY(!isPathWindowsDrivePartitionRoot("c/"));
|
||||||
QVERIFY(!isPathWindowsDrivePartitionRoot("c\\"));
|
QVERIFY(!isPathWindowsDrivePartitionRoot("c\\"));
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue