Comparar commits
52 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 10d6a99c20 | |||
| f9b4aa0926 | |||
| 78934f4cd7 | |||
| 12a4635249 | |||
| 0d73ef1d7c | |||
| 8ed9f62d6d | |||
| d880e8db29 | |||
| 434d16941b | |||
| 3d157cbb02 | |||
| 80b5f3f43d | |||
| 4900703970 | |||
| ecd44f70de | |||
| 9d5307d04c | |||
| 9460aa7f21 | |||
| 6493421109 | |||
| 0052386b41 | |||
| e1909c3bd1 | |||
| 8ce9388d29 | |||
| c13637b105 | |||
| 424bf6f06a | |||
| 46c3c9e0fc | |||
| 85f6c5fda8 | |||
| 74f74e0363 | |||
| bd72408e7a | |||
| a32381a2a4 | |||
| cd83772112 | |||
| 893e22691d | |||
| c98bf174ed | |||
| ae3b9f112c | |||
| 7fd9e751e0 | |||
| 95a58e74ca | |||
| b70a95ba30 | |||
| 72e14643f7 | |||
| f140d3447c | |||
| 6b643c7501 | |||
| 24920a4ad1 | |||
| 65655584e9 | |||
| e397056d2e | |||
| 54a278edb9 | |||
| b0acc475b0 | |||
| 834a971e2a | |||
| 6701927840 | |||
| e4ae279f7b | |||
| 25e0d1eac3 | |||
| d42faa80a6 | |||
| a92c756fa9 | |||
| 4cf94ed62a | |||
| 57c7727479 | |||
| 8480fc7ae5 | |||
| 5ae81aa96c | |||
| 28907ec0c3 | |||
| 7ddfa79950 |
@@ -7,7 +7,6 @@ CMakeLists.txt.user*
|
||||
doc/_build/*
|
||||
*.kate-swp
|
||||
*.kdev4
|
||||
win/
|
||||
admin/win/nsi/l10n/pofiles/*.po
|
||||
*.swp
|
||||
*~$
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
url = https://github.com/owncloud/documentation
|
||||
[submodule "src/3rdparty/qtmacgoodies"]
|
||||
path = src/3rdparty/qtmacgoodies
|
||||
url = git://github.com/guruz/qtmacgoodies.git
|
||||
url = https://github.com/guruz/qtmacgoodies.git
|
||||
[submodule "binary"]
|
||||
path = binary
|
||||
url = git://github.com/owncloud/owncloud-client-binary.git
|
||||
|
||||
+4
-2
@@ -1,6 +1,6 @@
|
||||
ChangeLog
|
||||
=========
|
||||
version 2.1.1 (release 2016-01-2x)
|
||||
version 2.1.1 (release 2016-02-10)
|
||||
* UI improvements for HiDPI screens, error messages, RTL languages
|
||||
* Fix occurences of "Connection Closed" when a new unauthenticated TCP socket is used
|
||||
* Fix undeliberate WiFi scanning done by Qt Network classes
|
||||
@@ -14,9 +14,11 @@ version 2.1.1 (release 2016-01-2x)
|
||||
* Allow changeable upload chunk size in owncloud.cfg
|
||||
* Crash fixes on account deletion
|
||||
* Forget password on explicit sign-out
|
||||
* OS X: Fix the file system watcher ignoring unicode paths (#4424)
|
||||
* Windows Installer: Update to NSIS 2.50, fixes possible DLL injection
|
||||
* Sync Engine: .lnk files
|
||||
* Sync Engine: symlinked syn directories
|
||||
* Sync Engine: Windows: Fix deleting and replacing of read-only files (#4308 #4277)
|
||||
* Sync Engine: Windows: Fix deleting and replacing of read-only files (#4308, #4277)
|
||||
* Sync Engine: Fixes for files becoming directories and vice versa (#4302)
|
||||
* Misc other fixes/improvements
|
||||
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ set( MIRALL_VERSION_PATCH 1 )
|
||||
set( MIRALL_SOVERSION 0 )
|
||||
|
||||
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
||||
set( MIRALL_VERSION_SUFFIX "rc1") #e.g. beta1, beta2, rc1
|
||||
set( MIRALL_VERSION_SUFFIX "git") #e.g. beta1, beta2, rc1
|
||||
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
||||
|
||||
if( NOT DEFINED MIRALL_VERSION_BUILD )
|
||||
|
||||
@@ -262,8 +262,8 @@ def CopyFramework(source_dylib):
|
||||
dest_dylib_path = os.path.join(frameworks_dir, *parts[i:-1])
|
||||
break
|
||||
if os.path.exists(dest_path):
|
||||
print dest_path, "already exists, skipping..."
|
||||
return
|
||||
print dest_path, "already exists, skipping copy..."
|
||||
return os.path.join(dest_dylib_path, dylib_name)
|
||||
|
||||
args = ['mkdir', '-p', dest_dylib_path]
|
||||
commands.append(args)
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
FROM opensuse:42.1
|
||||
|
||||
MAINTAINER Daniel Molkentin <danimo@owncloud.com>
|
||||
|
||||
ENV TERM ansi
|
||||
ENV HOME /root
|
||||
|
||||
ENV REFRESHED_AT 20160202
|
||||
|
||||
RUN zypper --non-interactive --gpg-auto-import-keys refresh
|
||||
RUN zypper --non-interactive --gpg-auto-import-keys ar http://download.opensuse.org/repositories/windows:/mingw/openSUSE_42.1/windows:mingw.repo
|
||||
RUN zypper --non-interactive --gpg-auto-import-keys ar http://download.opensuse.org/repositories/isv:ownCloud:toolchains:mingw:win32:2.1/openSUSE_Leap_42.1/isv:ownCloud:toolchains:mingw:win32:2.1.repo
|
||||
RUN zypper --non-interactive --gpg-auto-import-keys install cmake make mingw32-cross-binutils mingw32-cross-cpp mingw32-cross-gcc \
|
||||
mingw32-cross-gcc-c++ mingw32-cross-pkg-config mingw32-filesystem \
|
||||
mingw32-headers mingw32-runtime site-config mingw32-libwebp \
|
||||
mingw32-cross-libqt5-qmake mingw32-cross-libqt5-qttools mingw32-libqt5* \
|
||||
mingw32-qt5keychain* mingw32-angleproject* \
|
||||
mingw32-cross-nsis mingw32-libopenssl* \
|
||||
mingw32-sqlite* kdewin-png2ico \
|
||||
osslsigncode wget
|
||||
|
||||
# RPM depends on curl for installs from HTTP
|
||||
RUN zypper --non-interactive --gpg-auto-import-keys install curl
|
||||
|
||||
# sudo needed for building as user
|
||||
RUN zypper --non-interactive --gpg-auto-import-keys install sudo
|
||||
|
||||
# Use packaged UAC dependencies
|
||||
RUN zypper --non-interactive --gpg-auto-import-keys install mingw32-cross-nsis-plugin-uac mingw32-cross-nsis-plugin-nsprocess
|
||||
|
||||
# Required for checksumming
|
||||
RUN zypper --non-interactive --gpg-auto-import-keys install mingw32-zlib-devel
|
||||
|
||||
# Required for windres not to crash
|
||||
RUN zypper --non-interactive --gpg-auto-import-keys install glibc-locale
|
||||
|
||||
CMD /bin/bash
|
||||
@@ -7,13 +7,13 @@ fi
|
||||
|
||||
useradd user -u ${2:-1000}
|
||||
su - user << EOF
|
||||
cd /home/user/$1
|
||||
rm -rf build-win32
|
||||
mkdir build-win32
|
||||
cd build-win32
|
||||
../admin/win/download_runtimes.sh
|
||||
cmake .. -DCMAKE_TOOLCHAIN_FILE=../admin/win/Toolchain-mingw32-openSUSE.cmake -DWITH_CRASHREPORTER=ON
|
||||
make -j4
|
||||
make package
|
||||
ctest .
|
||||
cd /home/user/$1
|
||||
rm -rf build-win32
|
||||
mkdir build-win32
|
||||
cd build-win32
|
||||
../admin/win/download_runtimes.sh
|
||||
cmake .. -DCMAKE_TOOLCHAIN_FILE=../admin/win/Toolchain-mingw32-openSUSE.cmake -DWITH_CRASHREPORTER=ON
|
||||
make -j4
|
||||
make package
|
||||
ctest .
|
||||
EOF
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Auto-generated - do not modify
|
||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento"
|
||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Processos(s) ${APPLICATION_EXECUTABLE} em execução. Estes processos precisam de ser interrompidos.$\\nDeseja que o instalador os termine automaticamente?"
|
||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Processos(s) ${APPLICATION_EXECUTABLE} em execução. Estes processos precisam de ser interrompidos.$\nDeseja que o instalador os termine automaticamente?"
|
||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar os processos ${APPLICATION_EXECUTABLE}."
|
||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado o processo a terminar!"
|
||||
StrCpy $PageReinstall_NEW_Field_1 "Uma versão antiga de ${APPLICATION_NAME} está instalada no sistema. É recomendado que você desinstale a versão atual antes de instalar a mais recente. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar."
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Auto-generated - do not modify
|
||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de la versión"
|
||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Se encontrarion ${APPLICATION_EXECUTABLE} proceso(s) que debe/n ser detenidos.$\"$\\n$\"¿Quiere que el instalador lo haga por usted?"
|
||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Se encontrarion ${APPLICATION_EXECUTABLE} proceso(s) que debe/n ser detenidos.$\"$\n$\"¿Quiere que el instalador lo haga por usted?"
|
||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Parando el proceso ${APPLICATION_EXECUTABLE}."
|
||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Proceso a detener no encontrado!"
|
||||
StrCpy $PageReinstall_NEW_Field_1 "Una versión anterior de ${APPLICATION_NAME} esta instalada en el sistema. Es recomendado que quite esta versión antes de instalar. Elija la operación a realizar y seleccione Siguiente para continuar."
|
||||
|
||||
@@ -108,7 +108,8 @@ def escapeNSIS(st):
|
||||
.replace('\n', r'$\n')\
|
||||
.replace('\"', r'$\"')\
|
||||
.replace('$$\\', '$\\')\
|
||||
.replace('$\\n', r'$\n')
|
||||
.replace('$\\n', r'$\n')\
|
||||
.replace('$\\\\n', r'$\n')
|
||||
|
||||
|
||||
translationCache = {}
|
||||
|
||||
+17
-17
@@ -317,7 +317,7 @@ typedef const char* (*csync_checksum_hook) (
|
||||
*
|
||||
* @param csync The context variable to allocate.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_create(CSYNC **csync, const char *local, const char *remote);
|
||||
|
||||
@@ -328,7 +328,7 @@ int csync_create(CSYNC **csync, const char *local, const char *remote);
|
||||
*
|
||||
* @param ctx The context to initialize.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_init(CSYNC *ctx);
|
||||
|
||||
@@ -337,7 +337,7 @@ int csync_init(CSYNC *ctx);
|
||||
*
|
||||
* @param ctx The context to run the update detection on.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_update(CSYNC *ctx);
|
||||
|
||||
@@ -346,7 +346,7 @@ int csync_update(CSYNC *ctx);
|
||||
*
|
||||
* @param ctx The context to run the reconciliation on.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_reconcile(CSYNC *ctx);
|
||||
|
||||
@@ -355,7 +355,7 @@ int csync_reconcile(CSYNC *ctx);
|
||||
*
|
||||
* @param ctx The context to commit.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_commit(CSYNC *ctx);
|
||||
|
||||
@@ -366,7 +366,7 @@ int csync_commit(CSYNC *ctx);
|
||||
*
|
||||
* @param ctx The context to destroy.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_destroy(CSYNC *ctx);
|
||||
|
||||
@@ -377,7 +377,7 @@ int csync_destroy(CSYNC *ctx);
|
||||
*
|
||||
* @param path The path pointing to the file.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_add_exclude_list(CSYNC *ctx, const char *path);
|
||||
|
||||
@@ -394,7 +394,7 @@ void csync_clear_exclude_list(CSYNC *ctx);
|
||||
* @param ctx The csync context.
|
||||
*
|
||||
* @return The userdata saved in the context, NULL if an error
|
||||
* occured.
|
||||
* occurred.
|
||||
*/
|
||||
void *csync_get_userdata(CSYNC *ctx);
|
||||
|
||||
@@ -406,7 +406,7 @@ void *csync_get_userdata(CSYNC *ctx);
|
||||
*
|
||||
* @param userdata The userdata to be stored in the context.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_set_userdata(CSYNC *ctx, void *userdata);
|
||||
|
||||
@@ -416,7 +416,7 @@ int csync_set_userdata(CSYNC *ctx, void *userdata);
|
||||
* @param ctx The csync context.
|
||||
*
|
||||
* @return The authentication callback set or NULL if an error
|
||||
* occured.
|
||||
* occurred.
|
||||
*/
|
||||
csync_auth_callback csync_get_auth_callback(CSYNC *ctx);
|
||||
|
||||
@@ -427,7 +427,7 @@ csync_auth_callback csync_get_auth_callback(CSYNC *ctx);
|
||||
*
|
||||
* @param cb The authentication callback.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_set_auth_callback(CSYNC *ctx, csync_auth_callback cb);
|
||||
|
||||
@@ -436,7 +436,7 @@ int csync_set_auth_callback(CSYNC *ctx, csync_auth_callback cb);
|
||||
*
|
||||
* @param[in] level The log verbosity.
|
||||
*
|
||||
* @return 0 on success, < 0 if an error occured.
|
||||
* @return 0 on success, < 0 if an error occurred.
|
||||
*/
|
||||
int csync_set_log_level(int level);
|
||||
|
||||
@@ -451,7 +451,7 @@ int csync_get_log_level(void);
|
||||
* @brief Get the logging callback set.
|
||||
*
|
||||
* @return The logging callback set or NULL if an error
|
||||
* occured.
|
||||
* occurred.
|
||||
*/
|
||||
csync_log_callback csync_get_log_callback(void);
|
||||
|
||||
@@ -460,7 +460,7 @@ csync_log_callback csync_get_log_callback(void);
|
||||
*
|
||||
* @param cb The logging callback.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_set_log_callback(csync_log_callback cb);
|
||||
|
||||
@@ -476,7 +476,7 @@ void *csync_get_log_userdata(void);
|
||||
*
|
||||
* @param[in] data The userdata to set.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_set_log_userdata(void *data);
|
||||
|
||||
@@ -495,7 +495,7 @@ typedef int csync_treewalk_visit_func(TREE_WALK_FILE* ,void*);
|
||||
* @param visitor A callback function to handle the file info.
|
||||
* @param filter A filter, built from or'ed csync_instructions_e
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_walk_local_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter);
|
||||
|
||||
@@ -506,7 +506,7 @@ int csync_walk_local_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int fi
|
||||
* @param visitor A callback function to handle the file info.
|
||||
* @param filter A filter, built from and'ed csync_instructions_e
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int csync_walk_remote_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter);
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ int _csync_exclude_add(c_strlist_t **inList, const char *string);
|
||||
* @param ctx The context of the synchronizer.
|
||||
* @param fname The filename to load.
|
||||
*
|
||||
* @return 0 on success, -1 if an error occured with errno set.
|
||||
* @return 0 on success, -1 if an error occurred with errno set.
|
||||
*/
|
||||
int csync_exclude_load(const char *fname, c_strlist_t **list);
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ int csync_get_statedb_exists(CSYNC *ctx);
|
||||
* @param ctx The csync context.
|
||||
* @param statedb Path to the statedb file (sqlite3 db).
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured with errno set.
|
||||
* @return 0 on success, less than 0 if an error occurred with errno set.
|
||||
*/
|
||||
int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb);
|
||||
|
||||
|
||||
@@ -106,6 +106,42 @@ static bool _last_db_return_error(CSYNC* ctx) {
|
||||
return ctx->statedb.lastReturnValue != SQLITE_OK && ctx->statedb.lastReturnValue != SQLITE_DONE && ctx->statedb.lastReturnValue != SQLITE_ROW;
|
||||
}
|
||||
|
||||
/*
|
||||
* This static method is needed because the type members of the two structs use
|
||||
* different enum values. A direct comparion is not neccessarily correct.
|
||||
*
|
||||
* tmp is csync_file_stat_t
|
||||
* fs is csync_vio_file_stat_t with this vio type:
|
||||
* enum csync_vio_file_type_e {
|
||||
* CSYNC_VIO_FILE_TYPE_UNKNOWN,
|
||||
* CSYNC_VIO_FILE_TYPE_REGULAR,
|
||||
* CSYNC_VIO_FILE_TYPE_DIRECTORY,
|
||||
* CSYNC_VIO_FILE_TYPE_FIFO,
|
||||
* CSYNC_VIO_FILE_TYPE_SOCKET,
|
||||
* CSYNC_VIO_FILE_TYPE_CHARACTER_DEVICE,
|
||||
* CSYNC_VIO_FILE_TYPE_BLOCK_DEVICE,
|
||||
* CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK
|
||||
* };
|
||||
*
|
||||
* csync_file_stat_t can be:
|
||||
* CSYNC_FTW_TYPE_SKIP, CSYNC_FTW_TYPE_FILE
|
||||
* CSYNC_FTW_TYPE_DIR, CSYNC_FTW_TYPE_SLINK
|
||||
*/
|
||||
static bool _csync_filetype_different( const csync_file_stat_t *tmp, const csync_vio_file_stat_t *fs)
|
||||
{
|
||||
if( !(tmp && fs)) return false;
|
||||
|
||||
if( tmp->type == CSYNC_FTW_TYPE_SKIP ) return true;
|
||||
|
||||
if( tmp->type == CSYNC_FTW_TYPE_DIR && fs->type != CSYNC_VIO_FILE_TYPE_DIRECTORY )
|
||||
return true;
|
||||
if( tmp->type == CSYNC_FTW_TYPE_FILE && fs->type != CSYNC_VIO_FILE_TYPE_REGULAR )
|
||||
return true;
|
||||
if( tmp->type == CSYNC_FTW_TYPE_SLINK && fs->type != CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK )
|
||||
return true;
|
||||
|
||||
return false; // both are NOT different.
|
||||
}
|
||||
|
||||
/* Return true if two mtime are considered equal
|
||||
* We consider mtime that are one hour difference to be equal if they are one hour appart
|
||||
@@ -274,8 +310,9 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
||||
st->instruction = CSYNC_INSTRUCTION_EVAL;
|
||||
|
||||
// Preserve the EVAL flag later on if the type has changed.
|
||||
if (tmp->type != fs->type)
|
||||
if (_csync_filetype_different(tmp, fs)) {
|
||||
st->child_modified = 1;
|
||||
}
|
||||
|
||||
goto out;
|
||||
}
|
||||
@@ -303,8 +340,9 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
||||
}
|
||||
|
||||
// Preserve the EVAL flag later on if the type has changed.
|
||||
if (tmp->type != fs->type)
|
||||
if (_csync_filetype_different(tmp, fs)) {
|
||||
st->child_modified = 1;
|
||||
}
|
||||
|
||||
st->instruction = CSYNC_INSTRUCTION_EVAL;
|
||||
goto out;
|
||||
@@ -353,10 +391,12 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
||||
}
|
||||
|
||||
/* translate the file type between the two stat types csync has. */
|
||||
if( tmp && tmp->type == 0 ) {
|
||||
if( tmp && tmp->type == CSYNC_FTW_TYPE_FILE ) {
|
||||
tmp_vio_type = CSYNC_VIO_FILE_TYPE_REGULAR;
|
||||
} else if( tmp && tmp->type == 2 ) {
|
||||
} else if( tmp && tmp->type == CSYNC_FTW_TYPE_DIR) {
|
||||
tmp_vio_type = CSYNC_VIO_FILE_TYPE_DIRECTORY;
|
||||
} else if( tmp && tmp->type == CSYNC_FTW_TYPE_SLINK ) {
|
||||
tmp_vio_type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
|
||||
} else {
|
||||
tmp_vio_type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
|
||||
}
|
||||
@@ -389,8 +429,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
||||
return -1;
|
||||
}
|
||||
if(tmp ) { /* tmp existing at all */
|
||||
if ((tmp->type == CSYNC_FTW_TYPE_DIR && fs->type != CSYNC_VIO_FILE_TYPE_DIRECTORY) ||
|
||||
(tmp->type == CSYNC_FTW_TYPE_FILE && fs->type != CSYNC_VIO_FILE_TYPE_REGULAR)) {
|
||||
if ( _csync_filetype_different(tmp, fs)) {
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "WARN: file types different is not!");
|
||||
st->instruction = CSYNC_INSTRUCTION_NEW;
|
||||
goto out;
|
||||
@@ -781,7 +820,9 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
||||
* local stat function.
|
||||
*/
|
||||
if( d_name[0] == '.' ) {
|
||||
dirent->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN;
|
||||
if (strcmp(".sys.admin#recall#", d_name) != 0) { /* recall file shall not be ignored (#4420) */
|
||||
dirent->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN;
|
||||
}
|
||||
}
|
||||
|
||||
if( res == 0) {
|
||||
@@ -808,6 +849,8 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
||||
flag = CSYNC_FTW_FLAG_NSTAT;
|
||||
}
|
||||
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Flag for %s: %d", filename, flag);
|
||||
|
||||
previous_fs = ctx->current_fs;
|
||||
|
||||
/* Call walker function for each file */
|
||||
|
||||
+12
-12
@@ -136,7 +136,7 @@ struct c_rbnode_s {
|
||||
* @param data_compare Callback function to compare a key as data with thee
|
||||
* data inside a red-black tree node.
|
||||
*
|
||||
* @return 0 on success, -1 if an error occured with errno set.
|
||||
* @return 0 on success, -1 if an error occurred with errno set.
|
||||
*/
|
||||
int c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_rbtree_compare_func *data_compare);
|
||||
|
||||
@@ -146,7 +146,7 @@ int c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_r
|
||||
* @param tree Tree to duplicate.
|
||||
*
|
||||
* @return Pointer to a new allocated duplicated rbtree. NULL if an error
|
||||
* occured.
|
||||
* occurred.
|
||||
*/
|
||||
c_rbtree_t *c_rbtree_dup(const c_rbtree_t *tree);
|
||||
|
||||
@@ -157,7 +157,7 @@ c_rbtree_t *c_rbtree_dup(const c_rbtree_t *tree);
|
||||
*
|
||||
* @param tree The tree to free.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int c_rbtree_free(c_rbtree_t *tree);
|
||||
|
||||
@@ -198,7 +198,7 @@ int c_rbtree_free(c_rbtree_t *tree);
|
||||
* @param data The data to insert into the tree.
|
||||
*
|
||||
* @return 0 on success, 1 if a duplicate has been found and < 0 if an error
|
||||
* occured with errno set.
|
||||
* occurred with errno set.
|
||||
* EINVAL if a null pointer has been passed as the tree.
|
||||
* ENOMEM if there is no memory left.
|
||||
*/
|
||||
@@ -223,7 +223,7 @@ c_rbnode_t *c_rbtree_find(c_rbtree_t *tree, const void *key);
|
||||
*
|
||||
* @param tree The tree to get the head for.
|
||||
*
|
||||
* @return The head node. NULL if an error occured.
|
||||
* @return The head node. NULL if an error occurred.
|
||||
*/
|
||||
c_rbnode_t *c_rbtree_head(c_rbtree_t *tree);
|
||||
|
||||
@@ -232,7 +232,7 @@ c_rbnode_t *c_rbtree_head(c_rbtree_t *tree);
|
||||
*
|
||||
* @param tree The tree to get the tail for.
|
||||
*
|
||||
* @return The tail node. NULL if an error occured.
|
||||
* @return The tail node. NULL if an error occurred.
|
||||
*/
|
||||
c_rbnode_t *c_rbtree_tail(c_rbtree_t *tree);
|
||||
|
||||
@@ -254,7 +254,7 @@ c_rbnode_t *c_rbtree_tail(c_rbtree_t *tree);
|
||||
* @param data Data which should be passed to the visitor function.
|
||||
* @param visitor Visitor function. This will be called for each node passed.
|
||||
*
|
||||
* @return 0 on sucess, less than 0 if an error occured.
|
||||
* @return 0 on sucess, less than 0 if an error occurred.
|
||||
*/
|
||||
int c_rbtree_walk(c_rbtree_t *tree, void *data, c_rbtree_visit_func *visitor);
|
||||
|
||||
@@ -263,7 +263,7 @@ int c_rbtree_walk(c_rbtree_t *tree, void *data, c_rbtree_visit_func *visitor);
|
||||
*
|
||||
* @param node Node which should be deleted.
|
||||
*
|
||||
* @return 0 on success, -1 if an error occured.
|
||||
* @return 0 on success, -1 if an error occurred.
|
||||
*/
|
||||
int c_rbtree_node_delete(c_rbnode_t *node);
|
||||
|
||||
@@ -272,7 +272,7 @@ int c_rbtree_node_delete(c_rbnode_t *node);
|
||||
*
|
||||
* @param node The node of which you want the next node.
|
||||
*
|
||||
* @return The next node, NULL if an error occured.
|
||||
* @return The next node, NULL if an error occurred.
|
||||
*/
|
||||
c_rbnode_t *c_rbtree_node_next(c_rbnode_t *node);
|
||||
|
||||
@@ -281,7 +281,7 @@ c_rbnode_t *c_rbtree_node_next(c_rbnode_t *node);
|
||||
*
|
||||
* @param node The node of which you want the previous node.
|
||||
*
|
||||
* @return The previous node, NULL if an error occured.
|
||||
* @return The previous node, NULL if an error occurred.
|
||||
*/
|
||||
c_rbnode_t *c_rbtree_node_prev(c_rbnode_t *node);
|
||||
|
||||
@@ -290,7 +290,7 @@ c_rbnode_t *c_rbtree_node_prev(c_rbnode_t *node);
|
||||
*
|
||||
* @param N The node to get the data from.
|
||||
*
|
||||
* @return The data, NULL if an error occured.
|
||||
* @return The data, NULL if an error occurred.
|
||||
*/
|
||||
#define c_rbtree_node_data(N) ((N) ? ((N)->data) : NULL)
|
||||
|
||||
@@ -301,7 +301,7 @@ c_rbnode_t *c_rbtree_node_prev(c_rbnode_t *node);
|
||||
*
|
||||
* @param tree The tree to check.
|
||||
*
|
||||
* @return 0 on success, less than 0 if an error occured.
|
||||
* @return 0 on success, less than 0 if an error occurred.
|
||||
*/
|
||||
int c_rbtree_check_sanity(c_rbtree_t *tree);
|
||||
|
||||
|
||||
@@ -137,45 +137,48 @@ static time_t FileTimeToUnixTime(FILETIME *filetime, DWORD *remainder)
|
||||
|
||||
csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
|
||||
|
||||
dhandle_t *handle = NULL;
|
||||
csync_vio_file_stat_t *file_stat = NULL;
|
||||
ULARGE_INTEGER FileIndex;
|
||||
DWORD rem;
|
||||
dhandle_t *handle = NULL;
|
||||
csync_vio_file_stat_t *file_stat = NULL;
|
||||
ULARGE_INTEGER FileIndex;
|
||||
DWORD rem;
|
||||
|
||||
handle = (dhandle_t *) dhandle;
|
||||
handle = (dhandle_t *) dhandle;
|
||||
|
||||
errno = 0;
|
||||
file_stat = csync_vio_file_stat_new();
|
||||
if (file_stat == NULL) {
|
||||
errno = ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
file_stat->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE;
|
||||
errno = 0;
|
||||
file_stat = csync_vio_file_stat_new();
|
||||
if (file_stat == NULL) {
|
||||
errno = ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
file_stat->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE;
|
||||
|
||||
// the win32 functions get the first valid entry with the opendir
|
||||
// thus we must not jump to next entry if it was the first find.
|
||||
if( handle->firstFind ) {
|
||||
handle->firstFind = 0;
|
||||
} else {
|
||||
if( FindNextFile(handle->hFind, &(handle->ffd)) == 0 ) {
|
||||
// might be error, check!
|
||||
int dwError = GetLastError();
|
||||
if (dwError != ERROR_NO_MORE_FILES) {
|
||||
errno = EACCES; // no more files is fine. Otherwise EACCESS
|
||||
}
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
file_stat->name = c_utf8_from_locale(handle->ffd.cFileName);
|
||||
// the win32 functions get the first valid entry with the opendir
|
||||
// thus we must not jump to next entry if it was the first find.
|
||||
if( handle->firstFind ) {
|
||||
handle->firstFind = 0;
|
||||
} else {
|
||||
if( FindNextFile(handle->hFind, &(handle->ffd)) == 0 ) {
|
||||
// might be error, check!
|
||||
int dwError = GetLastError();
|
||||
if (dwError != ERROR_NO_MORE_FILES) {
|
||||
errno = EACCES; // no more files is fine. Otherwise EACCESS
|
||||
}
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
file_stat->name = c_utf8_from_locale(handle->ffd.cFileName);
|
||||
|
||||
file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE;
|
||||
if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT
|
||||
&& handle->ffd.dwReserved0 & IO_REPARSE_TAG_SYMLINK) {
|
||||
file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE;
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "WinStat info: %ld - %ld %s", handle->ffd.dwFileAttributes, handle->ffd.dwReserved0, file_stat->name);
|
||||
if ( (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
|
||||
&& (handle->ffd.dwReserved0 & IO_REPARSE_TAG_SYMLINK)
|
||||
&& (! (handle->ffd.dwReserved0 & IO_REPARSE_TAG_SIS))
|
||||
&& (! (handle->ffd.dwReserved0 & IO_REPARSE_TAG_DEDUP)) ) { // The SIS flag means MS Deduplication. It is not a normal symlink that we want to ignore.
|
||||
file_stat->flags = CSYNC_VIO_FILE_FLAGS_SYMLINK;
|
||||
file_stat->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
|
||||
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE
|
||||
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
|
||||
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) {
|
||||
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
|
||||
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) {
|
||||
file_stat->type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
|
||||
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||
file_stat->type = CSYNC_VIO_FILE_TYPE_DIRECTORY;
|
||||
@@ -199,7 +202,7 @@ csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
|
||||
file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_ATIME;
|
||||
|
||||
file_stat->mtime = FileTimeToUnixTime(&handle->ffd.ftLastWriteTime, &rem);
|
||||
/* CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Local File MTime: %llu", (unsigned long long) buf->mtime ); */
|
||||
/* CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Local File MTime: %llu", (unsigned long long) buf->mtime ); */
|
||||
file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME;
|
||||
|
||||
file_stat->ctime = FileTimeToUnixTime(&handle->ffd.ftCreationTime, &rem);
|
||||
@@ -208,9 +211,9 @@ csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
|
||||
return file_stat;
|
||||
|
||||
err:
|
||||
SAFE_FREE(file_stat);
|
||||
SAFE_FREE(file_stat);
|
||||
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -229,15 +232,15 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
|
||||
h = CreateFileW( wuri, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL+FILE_FLAG_BACKUP_SEMANTICS+FILE_FLAG_OPEN_REPARSE_POINT, NULL );
|
||||
if( h == INVALID_HANDLE_VALUE ) {
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_CRIT, "CreateFileW failed on %s", uri );
|
||||
errno = GetLastError();
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_CRIT, "CreateFileW failed on %s, error code %ld", uri, errno);
|
||||
c_free_locale_string(wuri);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!GetFileInformationByHandle( h, &fileInfo ) ) {
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_CRIT, "GetFileInformationByHandle failed on %s", uri );
|
||||
errno = GetLastError();
|
||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_CRIT, "GetFileInformationByHandle failed on %s, error code %ld", uri, errno );
|
||||
c_free_locale_string(wuri);
|
||||
CloseHandle(h);
|
||||
return -1;
|
||||
|
||||
@@ -87,7 +87,7 @@ To manually override this key, use the same value in ``HKEY_CURRENT_USER``.
|
||||
|
||||
To prevent automatic updates and disallow manual overrides:
|
||||
|
||||
.. note::This is the preferred method of controlling the updater behavior using
|
||||
.. note:: This is the preferred method of controlling the updater behavior using
|
||||
Group Policies.
|
||||
|
||||
1. Edit this Registry key:
|
||||
@@ -98,6 +98,14 @@ To prevent automatic updates and disallow manual overrides:
|
||||
|
||||
3. Specify a value of ``1`` to the machine.
|
||||
|
||||
.. note:: Enterprise branded clients
|
||||
(see `Building Branded ownCloud Clients
|
||||
<https://doc.owncloud.org/branded_clients/>`_) have different key names,
|
||||
which are set in ownBrander using the Application Vendor and Application
|
||||
Name fields. Your key names look like this::
|
||||
|
||||
``HKEY_LOCAL_MACHINE\Software\Policies\myCompanyName\myAppName``
|
||||
|
||||
|
||||
Preventing Automatic Updates in Mac OS X Environments
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
+98
-74
@@ -11,25 +11,44 @@ desktop client.
|
||||
.. note:: Build instructions are subject to change as development proceeds.
|
||||
Please check the version for which you want to build.
|
||||
|
||||
The instructions contained in this topic were updated to work with version 1.7 of the ownCloud Client.
|
||||
These instructions are updated to work with version 2.1 of the ownCloud Client.
|
||||
|
||||
Getting Source Code
|
||||
-------------------
|
||||
|
||||
The :ref:`generic-build-instructions` pull the latest code directly from
|
||||
GitHub, and work on Linux, Mac OS X, and Windows.
|
||||
|
||||
See the next section for instructions on getting source code from Linux
|
||||
packages.
|
||||
|
||||
Linux
|
||||
-----
|
||||
|
||||
1. Add the `ownCloud repository from OBS`_.
|
||||
2. Install the dependencies (as root, or using ``sudo``) using the following
|
||||
commands for your specific Linux distribution:
|
||||
You may wish to use source packages for your Linux distribution, as these give
|
||||
you the exact sources from which the binary packages are built. These are
|
||||
hosted on the `ownCloud repository from OBS`_. Go to the `Index of
|
||||
repositories`_ to see all the Linux client repos.
|
||||
|
||||
1. At the `bottom of the page for each distribution
|
||||
<https://software.opensuse.org/download/package?project=isv:ownCloud:desktop&
|
||||
package=owncloud-client>`_ is a "Grab binary packages directly" section.
|
||||
These contain source RPMs for CentOS, RHEL, Fedora, SLES, and openSUSE.
|
||||
|
||||
To get the .deb source packages add the source
|
||||
repo for your Debian or Ubuntu version, like this example for Debian 8
|
||||
(run as root)::
|
||||
|
||||
echo 'deb-src
|
||||
http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Debian_8.0/ /' >> /etc/apt/sources.list.d/owncloud-client.list
|
||||
|
||||
2. Install the dependencies using the following commands for your specific Linux distribution:
|
||||
|
||||
* Debian/Ubuntu: ``apt-get update; apt-get build-dep owncloud-client``
|
||||
* openSUSE: ``zypper ref; zypper si -d owncloud-client``
|
||||
* Fedora/CentOS: ``yum install yum-utils; yum-builddep owncloud-client``
|
||||
* openSUSE/SLES: ``zypper ref; zypper si -d owncloud-client``
|
||||
* Fedora/CentOS/RHEL: ``yum install yum-utils; yum-builddep owncloud-client``
|
||||
|
||||
3. Follow the :ref:`generic-build-instructions`.
|
||||
|
||||
4. (Optional) Call ``make install`` to install the client to the ``/usr/local/bin`` directory.
|
||||
|
||||
.. note:: This step requires the ``mingw32-cross-nsis`` packages be installed on
|
||||
Windows.
|
||||
3. Follow the :ref:`generic-build-instructions`, starting with step 2.
|
||||
|
||||
Mac OS X
|
||||
--------
|
||||
@@ -63,15 +82,17 @@ To set up your build environment for development using HomeBrew_:
|
||||
|
||||
5. For compilation of the client, follow the :ref:`generic-build-instructions`.
|
||||
|
||||
6. In the build directory, run ``admin/osx/create_mac.sh <build_dir>
|
||||
6. Install the Packages_ package creation tool.
|
||||
|
||||
7. In the build directory, run ``admin/osx/create_mac.sh <build_dir>
|
||||
<install_dir>``. If you have a developer signing certificate, you can specify
|
||||
its Common Name as a third parameter (use quotes) to have the package
|
||||
signed automatically.
|
||||
|
||||
.. note:: Contrary to earlier versions, ownCloud 1.7 and later are packaged
|
||||
as a ``pkg`` installer. Do not call "make package" at any time when
|
||||
compiling for OS X, as this will build a disk image, and will not
|
||||
work correctly.
|
||||
.. note:: Contrary to earlier versions, ownCloud 1.7 and later are packaged
|
||||
as a ``pkg`` installer. Do not call "make package" at any time when
|
||||
compiling for OS X, as this will build a disk image, and will not
|
||||
work correctly.
|
||||
|
||||
Windows Development Build
|
||||
-----------------------
|
||||
@@ -111,64 +132,62 @@ follow `Windows Installer Build (Cross-Compile)`_ instead.
|
||||
|
||||
6. Create the build directory::
|
||||
|
||||
mkdir client-build
|
||||
cd client-build
|
||||
mkdir client-build
|
||||
cd client-build
|
||||
|
||||
7. Build the client::
|
||||
|
||||
cmake -G "MinGW Makefiles" ../client
|
||||
mingw32-make
|
||||
cmake -G "MinGW Makefiles" ../client
|
||||
mingw32-make
|
||||
|
||||
.. note:: You can try using ninja to build in parallel using
|
||||
``cmake -G Ninja ../client`` and ``ninja`` instead.
|
||||
.. note:: Refer to the :ref:`generic-build-instructions` section for additional options.
|
||||
.. note:: You can try using ninja to build in parallel using
|
||||
``cmake -G Ninja ../client`` and ``ninja`` instead.
|
||||
.. note:: Refer to the :ref:`generic-build-instructions` section for additional options.
|
||||
|
||||
The ownCloud binary will appear in the ``bin`` directory.
|
||||
The ownCloud binary will appear in the ``bin`` directory.
|
||||
|
||||
Windows Installer Build (Cross-Compile)
|
||||
---------------------------------------
|
||||
|
||||
Due to the large number of dependencies, building the client installer for Windows
|
||||
is **currently only officially supported on openSUSE**, by using the MinGW cross compiler.
|
||||
You can set up openSUSE 13.1, 13.2 or openSUSE Factory in a virtual machine if you do not
|
||||
You can set up any currently supported version of openSUSE in a virtual machine if you do not
|
||||
have it installed already.
|
||||
|
||||
To cross-compile:
|
||||
In order to make setup simple, you can use the provided Dockerfile to build your own image.
|
||||
|
||||
1. Add the following repository using YaST or ``zypper ar`` (adjust when using another openSUSE version)::
|
||||
1. Assuming you are in the root of the ownCloud Client's source tree, you can
|
||||
build an image from this Dockerfile like this::
|
||||
|
||||
zypper ar https://build.opensuse.org/project/show/isv:ownCloud:toolchains:mingw:win32:stable
|
||||
cd admin/win32/docker
|
||||
docker build . -t ownCloud-client-win32:<version>
|
||||
|
||||
2. Install the cross-compiler packages and the cross-compiled dependencies::
|
||||
Replace ``<version>`` by the version of the client you are building, e.g.
|
||||
|version| for the release of the client that this document describes.
|
||||
If you do not wish to use docker, you can run the commands in ``RUN`` manually
|
||||
in a shell, e.g. to create your own build environment in a virtual machine.
|
||||
|
||||
zypper install cmake make mingw32-cross-binutils mingw32-cross-cpp mingw32-cross-gcc \
|
||||
mingw32-cross-gcc-c++ mingw32-cross-pkg-config mingw32-filesystem \
|
||||
mingw32-headers mingw32-runtime site-config mingw32-libwebp \
|
||||
mingw32-cross-libqt5-qmake mingw32-cross-libqt5-qttools mingw32-libqt5*
|
||||
.. note:: Docker images are specific to releases. This one refers to |version|.
|
||||
Newer releases may have different dependencies, and thus require a later
|
||||
version of the docker image! Always pick the docker image fitting your release
|
||||
of ownCloud client!
|
||||
|
||||
3. For the installer, install the NSIS installer package::
|
||||
2. From within the source tree Run the docker instance::
|
||||
|
||||
zypper install mingw32-cross-nsis mingw32-cross-nsis-plugin-uac mingw32-cross-nsis-plugin-nsprocess
|
||||
docker run ownCloud-client-win32:<version> -v "$PWD:/home/jenkins/client" \
|
||||
admin/win32/docker/build.sh $(id -u)
|
||||
|
||||
4. Follow the :ref:`generic-build-instructions`
|
||||
It will run the build, create an NSIS based installer, as well as run tests.
|
||||
You will find the resulting binary in an newly created ``build-win32`` subfolder.
|
||||
|
||||
.. note:: When building for Windows platforms, you must specify a special
|
||||
toolchain file that enables cmake to locate the platform-specific tools. To add
|
||||
this parameter to the call to cmake, enter
|
||||
``-DCMAKE_TOOLCHAIN_FILE=../client/admin/win/Toolchain-mingw32-openSUSE.cmake``.
|
||||
If you do not wish to use docker, and ran the ``RUN`` commands above in a virtual machine,
|
||||
you can run the indented commands in the lower section of ``build.sh`` manually in your
|
||||
source tree.
|
||||
|
||||
5. Build by running ``make``.
|
||||
4. Finally, you should sign the installer to avoid warnings upon installation.
|
||||
This requires a `Microsoft Authenticode`_ Certificate ``osslsigncode`` to sign the installer::
|
||||
|
||||
.. note:: Using ``make package`` produces an NSIS-based installer, provided
|
||||
the NSIS mingw32 packages are installed.
|
||||
|
||||
6. If you want to sign the installer, acquire a `Microsoft Authenticode`_ Certificate and install ``osslsigncode`` to sign the installer::
|
||||
|
||||
zypper install osslsigncode
|
||||
|
||||
7. Sign the package::
|
||||
|
||||
osslsigncode -pkcs12 $HOME/.codesign/packages.pfx -h sha1 \
|
||||
osslsigncode -pkcs12 $HOME/.codesign/packages.pfx -h sha256 \
|
||||
-pass yourpass \
|
||||
-n "ACME Client" \
|
||||
-i "http://acme.com" \
|
||||
@@ -179,6 +198,7 @@ To cross-compile:
|
||||
for ``-in``, use the URL to the time stamping server provided by your CA along with the Authenticode certificate. Alternatively,
|
||||
you may use the official Microsoft ``signtool`` utility on Microsoft Windows.
|
||||
|
||||
If you're familiar with docker, you can use the version of ``osslsigncode`` that is part of the docker image.
|
||||
|
||||
.. _generic-build-instructions:
|
||||
|
||||
@@ -189,35 +209,36 @@ Compared to previous versions, building the desktop sync client has become easie
|
||||
earlier versions, CSync, which is the sync engine library of the client, is now
|
||||
part of the client source repository and not a separate module.
|
||||
|
||||
You can download the desktop sync client from the ownCloud `Client Download Page`_.
|
||||
To build the most up-to-date version of the client:
|
||||
|
||||
To build the most up to date version of the client:
|
||||
1. Clone the latest versions of the client from Git_ as follows::
|
||||
|
||||
1. Clone the latest versions of the client from Git_ as follows:
|
||||
git clone git://github.com/owncloud/client.git
|
||||
git submodule init
|
||||
git submodule update
|
||||
|
||||
``git clone git://github.com/owncloud/client.git``
|
||||
``git submodule init``
|
||||
``git submodule update``
|
||||
2. Create the build directory::
|
||||
|
||||
2. Create the build directory:
|
||||
mkdir client-build
|
||||
cd client-build
|
||||
|
||||
``mkdir client-build``
|
||||
``cd client-build``
|
||||
3. Configure the client build::
|
||||
|
||||
3. Configure the client build:
|
||||
cmake -DCMAKE_BUILD_TYPE="Debug" ../client
|
||||
|
||||
``cmake -DCMAKE_BUILD_TYPE="Debug" ../client``
|
||||
.. note:: You must use absolute paths for the ``include`` and ``library``
|
||||
directories.
|
||||
|
||||
..note:: You must use absolute paths for the ``include`` and ``library``
|
||||
directories.
|
||||
|
||||
..note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``,
|
||||
where ``target`` is a private location, i.e. in parallel to your build
|
||||
dir by specifying ``../install``.
|
||||
.. note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``,
|
||||
where ``target`` is a private location, i.e. in parallel to your build
|
||||
dir by specifying ``../install``.
|
||||
|
||||
4. Call ``make``.
|
||||
|
||||
The owncloud binary will appear in the ``bin`` directory.
|
||||
The owncloud binary will appear in the ``bin`` directory.
|
||||
|
||||
5. (Optional) Call ``make install`` to install the client to the
|
||||
``/usr/local/bin`` directory.
|
||||
|
||||
The following are known cmake parameters:
|
||||
|
||||
@@ -230,14 +251,17 @@ The following are known cmake parameters:
|
||||
* ``BUILD_WITH_QT4=ON``: Builds using Qt4 (even if Qt5 is found).
|
||||
* ``CMAKE_INSTALL_PREFIX=path``: Set an install prefix. This is mandatory on Mac OS
|
||||
|
||||
.. _`ownCloud repository from OBS`: http://software.opensuse.org/download/package?project=isv:ownCloud:desktop&package=owncloud-client
|
||||
.. _ownCloud repository from OBS: http://software.opensuse.org/download/package?
|
||||
project=isv:ownCloud:desktop&package=owncloud-client
|
||||
.. _CMake: http://www.cmake.org/download
|
||||
.. _CSync: http://www.csync.org
|
||||
.. _`Client Download Page`: http://owncloud.org/sync-clients/
|
||||
.. _Client Download Page: https://owncloud.org/install/#desktop
|
||||
.. _Git: http://git-scm.com
|
||||
.. _MacPorts: http://www.macports.org
|
||||
.. _Homebrew: http://mxcl.github.com/homebrew/
|
||||
.. _`OpenSSL Windows Build`: http://slproweb.com/products/Win32OpenSSL.html
|
||||
.. _OpenSSL Windows Build: http://slproweb.com/products/Win32OpenSSL.html
|
||||
.. _Qt: http://www.qt.io/download
|
||||
.. _`Microsoft Authenticode`: https://msdn.microsoft.com/en-us/library/ie/ms537361%28v=vs.85%29.aspx
|
||||
.. _Microsoft Authenticode: https://msdn.microsoft.com/en-us/library/ie/ms537361%28v=vs.85%29.aspx
|
||||
.. _QtKeychain: https://github.com/frankosterfeld/qtkeychain
|
||||
.. _Packages: http://s.sudre.free.fr/Software/Packages/about.html
|
||||
.. _Index of repositories: http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/
|
||||
|
||||
@@ -288,3 +288,5 @@ epub_copyright = u'2013, The ownCloud developers'
|
||||
|
||||
# Include todos?
|
||||
todo_include_todos = True
|
||||
|
||||
rst_epilog = '.. |version| replace:: %s' % version
|
||||
|
||||
Arquivo binário não exibido.
|
Antes Largura: | Altura: | Tamanho: 82 KiB Depois Largura: | Altura: | Tamanho: 72 KiB |
Arquivo binário não exibido.
|
Antes Largura: | Altura: | Tamanho: 52 KiB Depois Largura: | Altura: | Tamanho: 86 KiB |
Arquivo binário não exibido.
|
Antes Largura: | Altura: | Tamanho: 99 KiB Depois Largura: | Altura: | Tamanho: 23 KiB |
@@ -22,8 +22,16 @@ Improvements and New Features
|
||||
The 2.1 release of the ownCloud desktop sync client has many new features and
|
||||
improvements. (See the `complete changelog
|
||||
<https://owncloud.org/changelog/desktop/>`_.)
|
||||
|
||||
|
||||
* Improved appearance on HiDPI screens
|
||||
* Improved error messages
|
||||
* Several fixes/improvements to the sharing dialog
|
||||
* Several fixes/improvements to the server activity tab
|
||||
* Allow changeable upload chunk size in owncloud.cfg
|
||||
* Forget password on explicit sign-out
|
||||
* Windows: Fix deleting and replacing of read-only files
|
||||
* Share with internal ownCloud users from your desktop
|
||||
* Separate views for server activity, sync activity, and errors
|
||||
* Don't re-upload *eml-files if size and checksum are unchanged
|
||||
* Improved upload/download progress indicator
|
||||
|
||||
+12
-7
@@ -58,11 +58,12 @@ operations.
|
||||
This menu provides the following options:
|
||||
|
||||
* Quick access to your accounts
|
||||
* Sync status
|
||||
* Recent Changes, showing latest activities
|
||||
* Status of your client version (whether it is up to date)
|
||||
* Settings
|
||||
* Help menu
|
||||
* An option to log in or log out of all of your accounts at once
|
||||
* Quit ownCloud
|
||||
* Quit ownCloud, logging out and closing the client
|
||||
|
||||
A left-click on your systray icon opens the desktop client to the account
|
||||
settings window.
|
||||
@@ -82,7 +83,7 @@ have the following features:
|
||||
* Connection status, showing which ownCloud server you are connected to, and
|
||||
your ownCloud username.
|
||||
* An **Account** button, which contains a dropdown menu with **Add New**,
|
||||
**Sign In/Sign Out**, and **Remove**.
|
||||
**Log In/Log Out**, and **Remove**.
|
||||
* Used and available space on the server.
|
||||
* Current synchronization status.
|
||||
* **Add Folder Sync Connection** button, which is active only when you have
|
||||
@@ -124,10 +125,12 @@ button, and re-select the folder tree that you want to sync.
|
||||
Adding New Accounts
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
You may configure multiple ownCloud accounts in your desktop sync client. Simply
|
||||
You may configure multiple ownCloud accounts in your desktop sync client.
|
||||
Simply
|
||||
click the **Account** > **Add New** button on any account tab to add a new
|
||||
account, and then follow the account creation wizard. The new account will
|
||||
appear as a new tab in the settings dialog, where you can adjust its settings at
|
||||
appear as a new tab in the settings dialog, where you can adjust its settings
|
||||
at
|
||||
any time. Use **Account** > **Remove** to delete accounts.
|
||||
|
||||
Sharing From Your Desktop
|
||||
@@ -206,10 +209,12 @@ can use the *Ignored Files Editor* (General tab.)
|
||||
|
||||
.. figure:: images/ignored_files_editor.png
|
||||
|
||||
For your convenience, the editor is pre-populated with a default list of typical
|
||||
For your convenience, the editor is pre-populated with a default list of
|
||||
typical
|
||||
ignore patterns. These patterns are contained in a system file (typically
|
||||
``sync-exclude.lst``) located in the ownCloud Client application directory. You
|
||||
cannot modify these pre-populated patterns directly from the editor. However, if
|
||||
cannot modify these pre-populated patterns directly from the editor. However,
|
||||
if
|
||||
necessary, you can hover over any pattern in the list to show the path and
|
||||
filename associated with that pattern, locate the file, and edit the
|
||||
``sync-exclude.lst`` file.
|
||||
|
||||
+1
-1
Submodule doc/ocdoc updated: a8fc638c26...2fdd8b2833
Arquivo executável
+6
@@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
# this script creates a plugin for nemo, just be replacing
|
||||
# all occurences of Nautilus with Nemo.
|
||||
|
||||
sed -i.org -e 's/autilus/emo/g' syncstate_nemo.py
|
||||
@@ -3,4 +3,4 @@
|
||||
# this script replaces the line
|
||||
# appname = 'ownCloud'
|
||||
# with the correct branding name in the syncstate.py script
|
||||
/usr/bin/sed -i.org -e 's/appname\s*=\s*'"'"'ownCloud'"'/appname = '$1'/" syncstate.py
|
||||
sed -i.org -e 's/appname\s*=\s*'"'"'ownCloud'"'/appname = '$1'/" syncstate.py
|
||||
|
||||
@@ -63,7 +63,7 @@ static void callback(
|
||||
qstring.resize(pathLength);
|
||||
CFStringGetCharacters(path, CFRangeMake(0, pathLength), reinterpret_cast<UniChar *>(qstring.data()));
|
||||
|
||||
paths.append(qstring);
|
||||
paths.append(qstring.normalized(QString::NormalizationForm_C));
|
||||
}
|
||||
|
||||
reinterpret_cast<FolderWatcherPrivate*>(clientCallBackInfo)->doNotifyParent(paths);
|
||||
|
||||
@@ -249,7 +249,7 @@ void SelectiveSyncTreeView::slotLscolFinishedWithError(QNetworkReply *r)
|
||||
if (r->error() == QNetworkReply::ContentNotFoundError) {
|
||||
_loading->setText(tr("No subfolders currently on the server."));
|
||||
} else {
|
||||
_loading->setText(tr("An error occured while loading the list of sub folders."));
|
||||
_loading->setText(tr("An error occurred while loading the list of sub folders."));
|
||||
}
|
||||
_loading->resize(_loading->sizeHint()); // because it's not in a layout
|
||||
}
|
||||
|
||||
@@ -545,7 +545,7 @@ SyncJournalFileRecord SocketApi::dbFileRecord_capi( Folder *folder, QString file
|
||||
rec._fileId = query->baValue(4);
|
||||
rec._remotePerm = query->baValue(5);
|
||||
}
|
||||
query->reset();
|
||||
query->reset_and_clear_bindings();
|
||||
}
|
||||
return rec;
|
||||
}
|
||||
|
||||
@@ -67,11 +67,16 @@ set(libsync_SRCS
|
||||
creds/dummycredentials.cpp
|
||||
creds/abstractcredentials.cpp
|
||||
creds/credentialscommon.cpp
|
||||
creds/httpcredentials.cpp
|
||||
../3rdparty/qjson/json.cpp
|
||||
../3rdparty/certificates/p12topem.cpp
|
||||
)
|
||||
|
||||
if(TOKEN_AUTH_ONLY)
|
||||
set (libsync_SRCS ${libsync_SRCS} creds/tokencredentials.cpp)
|
||||
else()
|
||||
set (libsync_SRCS ${libsync_SRCS} creds/httpcredentials.cpp)
|
||||
endif()
|
||||
|
||||
# These headers are installed for libowncloudsync to be used by 3rd party apps
|
||||
set(owncloudsync_HEADERS
|
||||
account.h
|
||||
|
||||
@@ -24,10 +24,6 @@
|
||||
#include "accessmanager.h"
|
||||
#include "utility.h"
|
||||
|
||||
#include <QInputDialog>
|
||||
#include <QMutexLocker>
|
||||
#include <QApplication>
|
||||
|
||||
namespace OCC
|
||||
{
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ void ConnectionValidator::checkAuthentication()
|
||||
job->setTimeout(timeoutToUseMsec);
|
||||
job->setProperties(QList<QByteArray>() << "getlastmodified");
|
||||
connect(job, SIGNAL(result(QVariantMap)), SLOT(slotAuthSuccess()));
|
||||
connect(job, SIGNAL(networkError(QNetworkReply*)), SLOT(slotAuthFailed(QNetworkReply*)));
|
||||
connect(job, SIGNAL(finishedWithError(QNetworkReply*)), SLOT(slotAuthFailed(QNetworkReply*)));
|
||||
job->start();
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include <QDebug>
|
||||
#include <QNetworkReply>
|
||||
#include <QSettings>
|
||||
#include <QInputDialog>
|
||||
|
||||
#include <keychain.h>
|
||||
|
||||
|
||||
@@ -121,11 +121,17 @@ bool TokenCredentials::ready() const
|
||||
return _ready;
|
||||
}
|
||||
|
||||
void TokenCredentials::fetch()
|
||||
void TokenCredentials::fetchFromKeychain()
|
||||
{
|
||||
Q_EMIT fetched();
|
||||
}
|
||||
|
||||
void TokenCredentials::askFromUser()
|
||||
{
|
||||
emit asked();
|
||||
}
|
||||
|
||||
|
||||
bool TokenCredentials::stillValid(QNetworkReply *reply)
|
||||
{
|
||||
return ((reply->error() != QNetworkReply::AuthenticationRequiredError)
|
||||
|
||||
@@ -44,7 +44,8 @@ public:
|
||||
QString authType() const Q_DECL_OVERRIDE;
|
||||
QNetworkAccessManager* getQNAM() const Q_DECL_OVERRIDE;
|
||||
bool ready() const Q_DECL_OVERRIDE;
|
||||
void fetch() Q_DECL_OVERRIDE;
|
||||
void askFromUser() Q_DECL_OVERRIDE;
|
||||
void fetchFromKeychain() Q_DECL_OVERRIDE;
|
||||
bool stillValid(QNetworkReply *reply) Q_DECL_OVERRIDE;
|
||||
void persist() Q_DECL_OVERRIDE;
|
||||
QString user() const Q_DECL_OVERRIDE;
|
||||
|
||||
@@ -325,9 +325,6 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file, con
|
||||
if( slashPos > -1 ) {
|
||||
fileRef = file.midRef(slashPos+1);
|
||||
}
|
||||
if( fileRef.startsWith(QChar('.')) ) {
|
||||
file_stat->flags = CSYNC_VIO_FILE_FLAGS_HIDDEN;
|
||||
}
|
||||
//qDebug() << "!!!!" << file_stat << file_stat->name << file_stat->file_id << map.count();
|
||||
_results.append(file_stat);
|
||||
}
|
||||
|
||||
@@ -558,7 +558,7 @@ bool PropfindJob::finished()
|
||||
} else {
|
||||
qDebug() << "PROPFIND request *not* successful, http result code is" << http_result_code
|
||||
<< (http_result_code == 302 ? reply()->header(QNetworkRequest::LocationHeader).toString() : QLatin1String(""));
|
||||
emit finishedWithError();
|
||||
emit finishedWithError(reply());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ public:
|
||||
|
||||
signals:
|
||||
void result(const QVariantMap &values);
|
||||
void finishedWithError();
|
||||
void finishedWithError(QNetworkReply *reply = 0);
|
||||
|
||||
private slots:
|
||||
virtual bool finished() Q_DECL_OVERRIDE;
|
||||
|
||||
@@ -300,8 +300,7 @@ void SqlQuery::bindValue(int pos, const QVariant& value)
|
||||
res = sqlite3_bind_text16(_stmt, pos, str->utf16(),
|
||||
(str->size()) * sizeof(QChar), SQLITE_TRANSIENT);
|
||||
} else {
|
||||
// unbound value create a null entry.
|
||||
res = SQLITE_OK;
|
||||
res = sqlite3_bind_null(_stmt, pos);
|
||||
}
|
||||
break; }
|
||||
default: {
|
||||
@@ -365,9 +364,10 @@ void SqlQuery::finish()
|
||||
_stmt = 0;
|
||||
}
|
||||
|
||||
void SqlQuery::reset()
|
||||
void SqlQuery::reset_and_clear_bindings()
|
||||
{
|
||||
SQLITE_DO(sqlite3_reset(_stmt));
|
||||
SQLITE_DO(sqlite3_clear_bindings(_stmt));
|
||||
}
|
||||
|
||||
} // namespace OCC
|
||||
|
||||
@@ -82,7 +82,7 @@ public:
|
||||
void bindValue(int pos, const QVariant& value);
|
||||
QString lastQuery() const;
|
||||
int numRowsAffected();
|
||||
void reset();
|
||||
void reset_and_clear_bindings();
|
||||
void finish();
|
||||
|
||||
private:
|
||||
|
||||
@@ -160,6 +160,10 @@ void PropagateRemoteMove::finalize()
|
||||
record._path = _item->_renameTarget;
|
||||
record._contentChecksum = oldRecord._contentChecksum;
|
||||
record._contentChecksumType = oldRecord._contentChecksumType;
|
||||
if (record._fileSize != oldRecord._fileSize) {
|
||||
qDebug() << "Warning: file sizes differ on server vs csync_journal: " << record._fileSize << oldRecord._fileSize;
|
||||
record._fileSize = oldRecord._fileSize; // server might have claimed different size, we take the old one from the DB
|
||||
}
|
||||
|
||||
_propagator->_journal->setFileRecord(record);
|
||||
_propagator->_journal->commit("Remote Rename");
|
||||
|
||||
@@ -494,6 +494,8 @@ int SyncEngine::treewalkFile( TREE_WALK_FILE *file, bool remote )
|
||||
// Even if the mtime is different on the server, we always want to keep the mtime from
|
||||
// the file system in the DB, this is to avoid spurious upload on the next sync
|
||||
item->_modtime = file->other.modtime;
|
||||
// same for the size
|
||||
item->_size = file->other.size;
|
||||
|
||||
// If the 'W' remote permission changed, update the local filesystem
|
||||
SyncJournalFileRecord prev = _journal->getFileRecord(item->_file);
|
||||
@@ -523,6 +525,7 @@ int SyncEngine::treewalkFile( TREE_WALK_FILE *file, bool remote )
|
||||
item->_isDirectory = isDirectory;
|
||||
_syncItemMap.insert(key, item);
|
||||
}
|
||||
emit syncItemDiscovered(*item);
|
||||
return re;
|
||||
}
|
||||
break;
|
||||
@@ -1040,8 +1043,17 @@ void SyncEngine::checkForPermission()
|
||||
(*it)->_status = SyncFileItem::NormalError;
|
||||
(*it)->_errorString = tr("Not allowed because you don't have permission to add subfolders to that folder");
|
||||
|
||||
for (SyncFileItemVector::iterator it_next = it + 1; it_next != _syncedItems.end() && (*it_next)->_file.startsWith(path); ++it_next) {
|
||||
for (SyncFileItemVector::iterator it_next = it + 1; it_next != _syncedItems.end() && (*it_next)->destination().startsWith(path); ++it_next) {
|
||||
it = it_next;
|
||||
if ((*it)->_instruction == CSYNC_INSTRUCTION_RENAME) {
|
||||
// The file was most likely moved in this directory.
|
||||
// If the file was read only or could not be moved or removed, it should
|
||||
// be restored. Do that in the next sync by not considering as a rename
|
||||
// but delete and upload. It will then be restored if needed.
|
||||
_journal->avoidRenamesOnNextSync((*it)->_file);
|
||||
_anotherSyncNeeded = true;
|
||||
qDebug() << "Moving of " << (*it)->_file << " canceled because no permission to add parent folder";
|
||||
}
|
||||
(*it)->_instruction = CSYNC_INSTRUCTION_ERROR;
|
||||
(*it)->_status = SyncFileItem::NormalError;
|
||||
(*it)->_errorString = tr("Not allowed because you don't have permission to add parent folder");
|
||||
|
||||
@@ -613,6 +613,13 @@ bool SyncJournalDb::updateErrorBlacklistTableStructure()
|
||||
commitInternal("update database structure: add lastTryTime, ignoreDuration cols");
|
||||
}
|
||||
|
||||
SqlQuery query(_db);
|
||||
query.prepare("CREATE INDEX IF NOT EXISTS blacklist_index ON blacklist(path collate nocase);");
|
||||
if( !query.exec()) {
|
||||
sqlFail("updateErrorBlacklistTableStructure: create index blacklit", query);
|
||||
re = false;
|
||||
}
|
||||
|
||||
return re;
|
||||
}
|
||||
|
||||
@@ -686,7 +693,7 @@ bool SyncJournalDb::setFileRecord( const SyncJournalFileRecord& _record )
|
||||
QString remotePerm (record._remotePerm);
|
||||
if (remotePerm.isEmpty()) remotePerm = QString(); // have NULL in DB (vs empty)
|
||||
int contentChecksumTypeId = mapChecksumType(record._contentChecksumType);
|
||||
_setFileRecordQuery->reset();
|
||||
_setFileRecordQuery->reset_and_clear_bindings();
|
||||
_setFileRecordQuery->bindValue(1, QString::number(phash));
|
||||
_setFileRecordQuery->bindValue(2, plen);
|
||||
_setFileRecordQuery->bindValue(3, record._path );
|
||||
@@ -715,7 +722,7 @@ bool SyncJournalDb::setFileRecord( const SyncJournalFileRecord& _record )
|
||||
<< record._etag << record._fileId << record._remotePerm << record._fileSize << (record._serverHasIgnoredFiles ? 1:0)
|
||||
<< record._contentChecksum << record._contentChecksumType << contentChecksumTypeId;
|
||||
|
||||
_setFileRecordQuery->reset();
|
||||
_setFileRecordQuery->reset_and_clear_bindings();
|
||||
return true;
|
||||
} else {
|
||||
qDebug() << "Failed to connect database.";
|
||||
@@ -732,7 +739,7 @@ bool SyncJournalDb::deleteFileRecord(const QString& filename, bool recursively)
|
||||
// always delete the actual file.
|
||||
|
||||
qlonglong phash = getPHash(filename);
|
||||
_deleteFileRecordPhash->reset();
|
||||
_deleteFileRecordPhash->reset_and_clear_bindings();
|
||||
_deleteFileRecordPhash->bindValue( 1, QString::number(phash) );
|
||||
|
||||
if( !_deleteFileRecordPhash->exec() ) {
|
||||
@@ -742,9 +749,9 @@ bool SyncJournalDb::deleteFileRecord(const QString& filename, bool recursively)
|
||||
return false;
|
||||
}
|
||||
qDebug() << _deleteFileRecordPhash->lastQuery() << phash << filename;
|
||||
_deleteFileRecordPhash->reset();
|
||||
_deleteFileRecordPhash->reset_and_clear_bindings();
|
||||
if( recursively) {
|
||||
_deleteFileRecordRecursively->reset();
|
||||
_deleteFileRecordRecursively->reset_and_clear_bindings();
|
||||
_deleteFileRecordRecursively->bindValue(1, filename);
|
||||
if( !_deleteFileRecordRecursively->exec() ) {
|
||||
qWarning() << "Exec error of SQL statement: "
|
||||
@@ -753,7 +760,7 @@ bool SyncJournalDb::deleteFileRecord(const QString& filename, bool recursively)
|
||||
return false;
|
||||
}
|
||||
qDebug() << _deleteFileRecordRecursively->lastQuery() << filename;
|
||||
_deleteFileRecordRecursively->reset();
|
||||
_deleteFileRecordRecursively->reset_and_clear_bindings();
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
@@ -771,7 +778,7 @@ SyncJournalFileRecord SyncJournalDb::getFileRecord( const QString& filename )
|
||||
SyncJournalFileRecord rec;
|
||||
|
||||
if( checkConnect() ) {
|
||||
_getFileRecordQuery->reset();
|
||||
_getFileRecordQuery->reset_and_clear_bindings();
|
||||
_getFileRecordQuery->bindValue(1, QString::number(phash));
|
||||
|
||||
if (!_getFileRecordQuery->exec()) {
|
||||
@@ -801,7 +808,7 @@ SyncJournalFileRecord SyncJournalDb::getFileRecord( const QString& filename )
|
||||
QString err = _getFileRecordQuery->error();
|
||||
qDebug() << "No journal entry found for " << filename;
|
||||
}
|
||||
_getFileRecordQuery->reset();
|
||||
_getFileRecordQuery->reset_and_clear_bindings();
|
||||
}
|
||||
return rec;
|
||||
}
|
||||
@@ -900,7 +907,7 @@ bool SyncJournalDb::updateFileRecordChecksum(const QString& filename,
|
||||
int checksumTypeId = mapChecksumType(contentChecksumType);
|
||||
auto & query = _setFileRecordChecksumQuery;
|
||||
|
||||
query->reset();
|
||||
query->reset_and_clear_bindings();
|
||||
query->bindValue(1, QString::number(phash));
|
||||
query->bindValue(2, contentChecksum);
|
||||
query->bindValue(3, checksumTypeId);
|
||||
@@ -915,7 +922,7 @@ bool SyncJournalDb::updateFileRecordChecksum(const QString& filename,
|
||||
qDebug() << query->lastQuery() << phash << contentChecksum
|
||||
<< contentChecksumType << checksumTypeId;
|
||||
|
||||
query->reset();
|
||||
query->reset_and_clear_bindings();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -957,7 +964,7 @@ static bool deleteBatch(SqlQuery & query, const QStringList & entries, const QSt
|
||||
qDebug() << "Removing stale " << qPrintable(name) << " entries: " << entries.join(", ");
|
||||
// FIXME: Was ported from execBatch, check if correct!
|
||||
foreach( const QString& entry, entries ) {
|
||||
query.reset();
|
||||
query.reset_and_clear_bindings();
|
||||
query.bindValue(1, entry);
|
||||
if (!query.exec()) {
|
||||
QString err = query.error();
|
||||
@@ -966,7 +973,7 @@ static bool deleteBatch(SqlQuery & query, const QStringList & entries, const QSt
|
||||
return false;
|
||||
}
|
||||
}
|
||||
query.reset(); // viel hilft viel ;-)
|
||||
query.reset_and_clear_bindings(); // viel hilft viel ;-)
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -978,7 +985,7 @@ SyncJournalDb::DownloadInfo SyncJournalDb::getDownloadInfo(const QString& file)
|
||||
DownloadInfo res;
|
||||
|
||||
if( checkConnect() ) {
|
||||
_getDownloadInfoQuery->reset();
|
||||
_getDownloadInfoQuery->reset_and_clear_bindings();
|
||||
_getDownloadInfoQuery->bindValue(1, file);
|
||||
|
||||
if (!_getDownloadInfoQuery->exec()) {
|
||||
@@ -992,7 +999,7 @@ SyncJournalDb::DownloadInfo SyncJournalDb::getDownloadInfo(const QString& file)
|
||||
} else {
|
||||
res._valid = false;
|
||||
}
|
||||
_getDownloadInfoQuery->reset();
|
||||
_getDownloadInfoQuery->reset_and_clear_bindings();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@@ -1006,7 +1013,7 @@ void SyncJournalDb::setDownloadInfo(const QString& file, const SyncJournalDb::Do
|
||||
}
|
||||
|
||||
if (i._valid) {
|
||||
_setDownloadInfoQuery->reset();
|
||||
_setDownloadInfoQuery->reset_and_clear_bindings();
|
||||
_setDownloadInfoQuery->bindValue(1, file);
|
||||
_setDownloadInfoQuery->bindValue(2, i._tmpfile);
|
||||
_setDownloadInfoQuery->bindValue(3, i._etag );
|
||||
@@ -1018,10 +1025,10 @@ void SyncJournalDb::setDownloadInfo(const QString& file, const SyncJournalDb::Do
|
||||
}
|
||||
|
||||
qDebug() << _setDownloadInfoQuery->lastQuery() << file << i._tmpfile << i._etag << i._errorCount;
|
||||
_setDownloadInfoQuery->reset();
|
||||
_setDownloadInfoQuery->reset_and_clear_bindings();
|
||||
|
||||
} else {
|
||||
_deleteDownloadInfoQuery->reset();
|
||||
_deleteDownloadInfoQuery->reset_and_clear_bindings();
|
||||
_deleteDownloadInfoQuery->bindValue( 1, file );
|
||||
|
||||
if( !_deleteDownloadInfoQuery->exec() ) {
|
||||
@@ -1029,7 +1036,7 @@ void SyncJournalDb::setDownloadInfo(const QString& file, const SyncJournalDb::Do
|
||||
return;
|
||||
}
|
||||
qDebug() << _deleteDownloadInfoQuery->lastQuery() << file;
|
||||
_deleteDownloadInfoQuery->reset();
|
||||
_deleteDownloadInfoQuery->reset_and_clear_bindings();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1097,7 +1104,7 @@ SyncJournalDb::UploadInfo SyncJournalDb::getUploadInfo(const QString& file)
|
||||
|
||||
if( checkConnect() ) {
|
||||
|
||||
_getUploadInfoQuery->reset();
|
||||
_getUploadInfoQuery->reset_and_clear_bindings();
|
||||
_getUploadInfoQuery->bindValue(1, file);
|
||||
|
||||
if (!_getUploadInfoQuery->exec()) {
|
||||
@@ -1115,7 +1122,7 @@ SyncJournalDb::UploadInfo SyncJournalDb::getUploadInfo(const QString& file)
|
||||
res._modtime = Utility::qDateTimeFromTime_t(_getUploadInfoQuery->int64Value(4));
|
||||
res._valid = ok;
|
||||
}
|
||||
_getUploadInfoQuery->reset();
|
||||
_getUploadInfoQuery->reset_and_clear_bindings();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@@ -1129,7 +1136,7 @@ void SyncJournalDb::setUploadInfo(const QString& file, const SyncJournalDb::Uplo
|
||||
}
|
||||
|
||||
if (i._valid) {
|
||||
_setUploadInfoQuery->reset();
|
||||
_setUploadInfoQuery->reset_and_clear_bindings();
|
||||
_setUploadInfoQuery->bindValue(1, file);
|
||||
_setUploadInfoQuery->bindValue(2, i._chunk);
|
||||
_setUploadInfoQuery->bindValue(3, i._transferid );
|
||||
@@ -1143,9 +1150,9 @@ void SyncJournalDb::setUploadInfo(const QString& file, const SyncJournalDb::Uplo
|
||||
}
|
||||
|
||||
qDebug() << _setUploadInfoQuery->lastQuery() << file << i._chunk << i._transferid << i._errorCount;
|
||||
_setUploadInfoQuery->reset();
|
||||
_setUploadInfoQuery->reset_and_clear_bindings();
|
||||
} else {
|
||||
_deleteUploadInfoQuery->reset();
|
||||
_deleteUploadInfoQuery->reset_and_clear_bindings();
|
||||
_deleteUploadInfoQuery->bindValue(1, file);
|
||||
|
||||
if( !_deleteUploadInfoQuery->exec() ) {
|
||||
@@ -1153,7 +1160,7 @@ void SyncJournalDb::setUploadInfo(const QString& file, const SyncJournalDb::Uplo
|
||||
return;
|
||||
}
|
||||
qDebug() << _deleteUploadInfoQuery->lastQuery() << file;
|
||||
_deleteUploadInfoQuery->reset();
|
||||
_deleteUploadInfoQuery->reset_and_clear_bindings();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1196,7 +1203,7 @@ SyncJournalErrorBlacklistRecord SyncJournalDb::errorBlacklistEntry( const QStrin
|
||||
// SELECT lastTryEtag, lastTryModtime, retrycount, errorstring
|
||||
|
||||
if( checkConnect() ) {
|
||||
_getErrorBlacklistQuery->reset();
|
||||
_getErrorBlacklistQuery->reset_and_clear_bindings();
|
||||
_getErrorBlacklistQuery->bindValue( 1, file );
|
||||
if( _getErrorBlacklistQuery->exec() ){
|
||||
if( _getErrorBlacklistQuery->next() ) {
|
||||
@@ -1208,7 +1215,7 @@ SyncJournalErrorBlacklistRecord SyncJournalDb::errorBlacklistEntry( const QStrin
|
||||
entry._ignoreDuration = _getErrorBlacklistQuery->int64Value(5);
|
||||
entry._file = file;
|
||||
}
|
||||
_getErrorBlacklistQuery->reset();
|
||||
_getErrorBlacklistQuery->reset_and_clear_bindings();
|
||||
} else {
|
||||
qWarning() << "Exec error blacklist: " << _getErrorBlacklistQuery->lastQuery() << " : "
|
||||
<< _getErrorBlacklistQuery->error();
|
||||
@@ -1324,7 +1331,7 @@ void SyncJournalDb::updateErrorBlacklistEntry( const SyncJournalErrorBlacklistRe
|
||||
qDebug() << "set blacklist entry for " << item._file << item._retryCount
|
||||
<< item._errorString << item._lastTryTime << item._ignoreDuration
|
||||
<< item._lastTryModtime << item._lastTryEtag;
|
||||
_setErrorBlacklistQuery->reset();
|
||||
_setErrorBlacklistQuery->reset_and_clear_bindings();
|
||||
|
||||
}
|
||||
|
||||
@@ -1395,7 +1402,7 @@ QStringList SyncJournalDb::getSelectiveSyncList(SyncJournalDb::SelectiveSyncList
|
||||
return result;
|
||||
}
|
||||
|
||||
_getSelectiveSyncListQuery->reset();
|
||||
_getSelectiveSyncListQuery->reset_and_clear_bindings();
|
||||
_getSelectiveSyncListQuery->bindValue(1, int(type));
|
||||
if (!_getSelectiveSyncListQuery->exec()) {
|
||||
qWarning() << "SQL query failed: "<< _getSelectiveSyncListQuery->error();
|
||||
@@ -1427,7 +1434,7 @@ void SyncJournalDb::setSelectiveSyncList(SyncJournalDb::SelectiveSyncListType ty
|
||||
|
||||
SqlQuery insQuery("INSERT INTO selectivesync VALUES (?1, ?2)" , _db);
|
||||
foreach(const auto &path, list) {
|
||||
insQuery.reset();
|
||||
insQuery.reset_and_clear_bindings();
|
||||
insQuery.bindValue(1, path);
|
||||
insQuery.bindValue(2, int(type));
|
||||
if (!insQuery.exec()) {
|
||||
@@ -1519,7 +1526,7 @@ QByteArray SyncJournalDb::getChecksumType(int checksumTypeId)
|
||||
|
||||
// Retrieve the id
|
||||
auto & query = *_getChecksumTypeQuery;
|
||||
query.reset();
|
||||
query.reset_and_clear_bindings();
|
||||
query.bindValue(1, checksumTypeId);
|
||||
if( !query.exec() ) {
|
||||
qWarning() << "Error SQL statement getChecksumType: "
|
||||
@@ -1542,7 +1549,7 @@ int SyncJournalDb::mapChecksumType(const QByteArray& checksumType)
|
||||
}
|
||||
|
||||
// Ensure the checksum type is in the db
|
||||
_insertChecksumTypeQuery->reset();
|
||||
_insertChecksumTypeQuery->reset_and_clear_bindings();
|
||||
_insertChecksumTypeQuery->bindValue(1, checksumType);
|
||||
if( !_insertChecksumTypeQuery->exec() ) {
|
||||
qWarning() << "Error SQL statement insertChecksumType: "
|
||||
@@ -1552,7 +1559,7 @@ int SyncJournalDb::mapChecksumType(const QByteArray& checksumType)
|
||||
}
|
||||
|
||||
// Retrieve the id
|
||||
_getChecksumTypeIdQuery->reset();
|
||||
_getChecksumTypeIdQuery->reset_and_clear_bindings();
|
||||
_getChecksumTypeIdQuery->bindValue(1, checksumType);
|
||||
if( !_getChecksumTypeIdQuery->exec() ) {
|
||||
qWarning() << "Error SQL statement getChecksumTypeId: "
|
||||
|
||||
@@ -161,7 +161,7 @@ QByteArray Utility::userAgentString()
|
||||
{
|
||||
QString re = QString::fromLatin1("Mozilla/5.0 (%1) mirall/%2")
|
||||
.arg(platform())
|
||||
.arg(QLatin1String(MIRALL_STRINGIFY(MIRALL_VERSION)));
|
||||
.arg(QLatin1String(MIRALL_VERSION_STRING));
|
||||
|
||||
QLatin1String appName(APPLICATION_SHORTNAME);
|
||||
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Aturat per l'usuari</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Zrušeno uživatelem</translation>
|
||||
</message>
|
||||
|
||||
@@ -518,7 +518,7 @@ Diese Funktion ist nur für Wartungszwecke gedacht. Es werden keine Dateien entf
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Abbruch durch den Benutzer</translation>
|
||||
</message>
|
||||
@@ -2368,7 +2368,7 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
|
||||
<message>
|
||||
<location filename="../src/gui/shareusergroupwidget.cpp" line="217"/>
|
||||
<source>No results for '%1'</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Keine Ergebnisse für '%1'</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Ματαιώθηκε από το χρήστη</translation>
|
||||
</message>
|
||||
|
||||
@@ -519,7 +519,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Interrumpido por el usuario</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Interrumpido por el usuario</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Kasutaja poolt tühistatud</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Erabiltzaileak bertan behera utzita</translation>
|
||||
</message>
|
||||
@@ -2855,7 +2855,7 @@ Ez da gomendagarria erabltzea.</translation>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="826"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategi izenak behintzat baliogabeko karaktere bat du</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1015"/>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>متوقف شده توسط کاربر</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Keskeytetty käyttäjän toimesta</translation>
|
||||
</message>
|
||||
|
||||
@@ -340,7 +340,7 @@
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="419"/>
|
||||
<source>List of ignored or erroneous files</source>
|
||||
<translation>Liste de fichiers ignorés ou erronés</translation>
|
||||
<translation>Liste des fichiers ignorés ou en erreur</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="423"/>
|
||||
@@ -355,7 +355,7 @@
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="429"/>
|
||||
<source>Not Synced</source>
|
||||
<translation>Non Synchronisé</translation>
|
||||
<translation>Fichiers non synchronisés</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="450"/>
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Interrompu par l'utilisateur</translation>
|
||||
</message>
|
||||
@@ -1123,7 +1123,7 @@ Temps restant total %5</translation>
|
||||
<message>
|
||||
<location filename="../src/gui/generalsettings.ui" line="129"/>
|
||||
<source>S&how crash reporter</source>
|
||||
<translation>A&fficher le rapport d'incident</translation>
|
||||
<translation>Affic&her le rapport d'incident</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/generalsettings.ui" line="156"/>
|
||||
@@ -1457,7 +1457,7 @@ Les éléments dont la suppression automatique est permise seront supprimés s&a
|
||||
<message>
|
||||
<location filename="../src/gui/networksettings.cpp" line="128"/>
|
||||
<source>Qt >= 5.4 is required in order to use the bandwidth limit</source>
|
||||
<translation>Qt >= 5.4 est requis pour pouvoir utiliser la limite de bande passante</translation>
|
||||
<translation>Qt >= 5.4 est requis pour utiliser la limite de bande passante</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1492,7 +1492,7 @@ L'assistant peut demander des privilèges additionnels durant le processus.
|
||||
<message>
|
||||
<location filename="../src/gui/updater/ocupdater.cpp" line="143"/>
|
||||
<source>%1 version %2 available. Restart application to start the update.</source>
|
||||
<translation>%1 version %2 disponible. Redémarrez l'application pour démarrer la mise à jour.</translation>
|
||||
<translation>%1 version %2 disponible. Redémarrez l'application pour commencer la mise à jour.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/updater/ocupdater.cpp" line="149"/>
|
||||
@@ -2352,7 +2352,7 @@ Il est déconseillé de l'utiliser.</translation>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="505"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="506"/>
|
||||
<source>&Share link</source>
|
||||
<translation>&Partager par lien public</translation>
|
||||
<translation>Partager par &lien public</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Interrompido polo usuario</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Felhasználó megszakította</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Interrotto dall'utente</translation>
|
||||
</message>
|
||||
|
||||
@@ -322,7 +322,7 @@
|
||||
<message>
|
||||
<location filename="../src/gui/activityitemdelegate.cpp" line="147"/>
|
||||
<source>%1 on %2 (disconnected)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%2 中 %1 (切断しました)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>ユーザーによって中止されました</translation>
|
||||
</message>
|
||||
@@ -3329,7 +3329,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/gui/application.cpp" line="571"/>
|
||||
<source>QT_LAYOUT_DIRECTION</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>QT_LAYOUT_DIRECTION</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Avbrutt av brukeren</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Afgebroken door de gebruiker</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Anulowane przez użytkownika</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Cancelado pelo utilizador</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Abortado pelo usuário</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Прервано пользов</translation>
|
||||
</message>
|
||||
@@ -3336,7 +3336,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/gui/application.cpp" line="571"/>
|
||||
<source>QT_LAYOUT_DIRECTION</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>QT_LAYOUT_DIRECTION</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Zrušené používateľom</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Opravilo je bilo prekinjeno s strani uporabnika</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Прекинуо корисник</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Avbruten av användare</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>ยกเลิกโดยผู้ใช้</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Kullanıcı tarafından iptal edildi</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>Перервано користувачем</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>用户撤销</translation>
|
||||
</message>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<context>
|
||||
<name>OCC::DiscoveryMainThread</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="539"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="536"/>
|
||||
<source>Aborted by the user</source>
|
||||
<translation>使用者中斷</translation>
|
||||
</message>
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário