Comparar commits
3 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 1af3373eb4 | |||
| 52d8cf39e7 | |||
| c0c9fb365d |
@@ -7,6 +7,7 @@ CMakeLists.txt.user*
|
|||||||
doc/_build/*
|
doc/_build/*
|
||||||
*.kate-swp
|
*.kate-swp
|
||||||
*.kdev4
|
*.kdev4
|
||||||
|
win/
|
||||||
admin/win/nsi/l10n/pofiles/*.po
|
admin/win/nsi/l10n/pofiles/*.po
|
||||||
*.swp
|
*.swp
|
||||||
*~$
|
*~$
|
||||||
|
|||||||
+1
-4
@@ -3,13 +3,10 @@
|
|||||||
url = https://github.com/owncloud/documentation
|
url = https://github.com/owncloud/documentation
|
||||||
[submodule "src/3rdparty/qtmacgoodies"]
|
[submodule "src/3rdparty/qtmacgoodies"]
|
||||||
path = src/3rdparty/qtmacgoodies
|
path = src/3rdparty/qtmacgoodies
|
||||||
url = https://github.com/guruz/qtmacgoodies.git
|
url = git://github.com/guruz/qtmacgoodies.git
|
||||||
[submodule "binary"]
|
[submodule "binary"]
|
||||||
path = binary
|
path = binary
|
||||||
url = git://github.com/owncloud/owncloud-client-binary.git
|
url = git://github.com/owncloud/owncloud-client-binary.git
|
||||||
[submodule "src/3rdparty/libcrashreporter-qt"]
|
[submodule "src/3rdparty/libcrashreporter-qt"]
|
||||||
path = src/3rdparty/libcrashreporter-qt
|
path = src/3rdparty/libcrashreporter-qt
|
||||||
url = git://github.com/dschmidt/libcrashreporter-qt.git
|
url = git://github.com/dschmidt/libcrashreporter-qt.git
|
||||||
[submodule "src/3rdparty/qtkeychain"]
|
|
||||||
path = src/3rdparty/qtkeychain
|
|
||||||
url = https://github.com/frankosterfeld/qtkeychain.git
|
|
||||||
|
|||||||
+4
-10
@@ -1,21 +1,15 @@
|
|||||||
sudo: required
|
|
||||||
|
|
||||||
language: cpp
|
language: cpp
|
||||||
|
|
||||||
services:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- coverity_scan
|
- coverity_scan
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- sudo sh -c "echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Ubuntu_14.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
|
- sudo sh -c "echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/xUbuntu_12.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
|
||||||
- sudo sh -c "echo 'deb-src http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Ubuntu_14.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
|
- sudo sh -c "echo 'deb-src http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/xUbuntu_12.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
|
||||||
- wget http://download.opensuse.org/repositories/isv:ownCloud:desktop/Ubuntu_14.04/Release.key
|
- wget http://download.opensuse.org/repositories/isv:ownCloud:desktop/xUbuntu_12.04/Release.key
|
||||||
- sudo apt-key add - < Release.key
|
- sudo apt-key add - < Release.key
|
||||||
- sudo apt-get update
|
- sudo apt-get update
|
||||||
- sudo apt-get -y build-dep owncloud-client
|
- sudo apt-get build-dep owncloud-client
|
||||||
- checkout=$(git show-ref --head --hash head)
|
- checkout=$(git show-ref --head --hash head)
|
||||||
- cd ../
|
- cd ../
|
||||||
- wget https://scan.coverity.com/download/linux-64 --post-data "token=$token&project=owncloud%2Fmirall" -O coverity_tool.tgz
|
- wget https://scan.coverity.com/download/linux-64 --post-data "token=$token&project=owncloud%2Fmirall" -O coverity_tool.tgz
|
||||||
|
|||||||
+29
-18
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 2.6)
|
||||||
cmake_policy(VERSION 2.8.0)
|
cmake_policy(VERSION 2.8.0)
|
||||||
|
|
||||||
@@ -21,11 +20,6 @@ if (NOT DEFINED APPLICATION_SHORTNAME)
|
|||||||
set ( APPLICATION_SHORTNAME ${APPLICATION_NAME} )
|
set ( APPLICATION_SHORTNAME ${APPLICATION_NAME} )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# For usage in XML files we preprocess
|
|
||||||
string(REPLACE "&" "&" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME}")
|
|
||||||
string(REPLACE "<" "<" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}")
|
|
||||||
string(REPLACE ">" ">" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}")
|
|
||||||
|
|
||||||
set(PACKAGE "${APPLICATION_SHORTNAME}-client")
|
set(PACKAGE "${APPLICATION_SHORTNAME}-client")
|
||||||
set( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
|
set( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
|
||||||
|
|
||||||
@@ -36,7 +30,7 @@ endif()
|
|||||||
include(Warnings)
|
include(Warnings)
|
||||||
|
|
||||||
include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
|
include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
|
||||||
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
|
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/src/mirall/")
|
||||||
|
|
||||||
# disable the crashreporter if libcrashreporter-qt is not available or we're building for ARM
|
# disable the crashreporter if libcrashreporter-qt is not available or we're building for ARM
|
||||||
if( CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/3rdparty/libcrashreporter-qt/CMakeLists.txt")
|
if( CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/3rdparty/libcrashreporter-qt/CMakeLists.txt")
|
||||||
@@ -57,7 +51,9 @@ endif()
|
|||||||
|
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
include(DefineInstallationPaths)
|
include(DefineInstallationPaths)
|
||||||
|
include(QtVersionAbstraction)
|
||||||
|
|
||||||
|
setup_qt()
|
||||||
|
|
||||||
include(GetGitRevisionDescription)
|
include(GetGitRevisionDescription)
|
||||||
|
|
||||||
@@ -126,23 +122,38 @@ if(OWNCLOUD_5XX_NO_BLACKLIST)
|
|||||||
add_definitions(-DOWNCLOUD_5XX_NO_BLACKLIST=1)
|
add_definitions(-DOWNCLOUD_5XX_NO_BLACKLIST=1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# When this option is enabled, a rename that is not allowed will be renamed back
|
|
||||||
# do the original as a restoration step. Withut this option, the restoration will
|
|
||||||
# re-download the file instead.
|
|
||||||
# The default is off because we don't want to rename the files back behind the user's back
|
|
||||||
# Added for IL issue #550
|
|
||||||
option(OWNCLOUD_RESTORE_RENAME "OWNCLOUD_RESTORE_RENAME" OFF)
|
|
||||||
if(OWNCLOUD_RESTORE_RENAME)
|
|
||||||
add_definitions(-DOWNCLOUD_RESTORE_RENAME=1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set( SOCKETAPI_TEAM_IDENTIFIER_PREFIX "" CACHE STRING "SocketApi prefix (including a following dot) that must match the codesign key's TeamIdentifier/Organizational Unit" )
|
set( SOCKETAPI_TEAM_IDENTIFIER_PREFIX "" CACHE STRING "SocketApi prefix (including a following dot) that must match the codesign key's TeamIdentifier/Organizational Unit" )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
#### find libs
|
||||||
|
#find_package(Qt4 4.7.0 COMPONENTS QtCore QtGui QtXml QtNetwork QtTest QtWebkit REQUIRED )
|
||||||
|
#if( UNIX AND NOT APPLE ) # Fdo notifications
|
||||||
|
# find_package(Qt4 4.7.0 COMPONENTS QtDBus REQUIRED )
|
||||||
|
#endif()
|
||||||
|
|
||||||
|
|
||||||
|
if(HAVE_QT5)
|
||||||
|
if (${Qt5Core_VERSION_MAJOR} EQUAL "5")
|
||||||
|
if (${Qt5Core_VERSION_MINOR} EQUAL "4" OR ${Qt5Core_VERSION_MINOR} GREATER 4)
|
||||||
|
else()
|
||||||
|
message(STATUS "If possible compile me with Qt 5.4 or higher.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(STATUS "If possible compile me with Qt 5.4 or higher.")
|
||||||
|
endif()
|
||||||
|
|
||||||
find_package(OpenSSL 1.0.0 REQUIRED)
|
find_package(OpenSSL 1.0.0 REQUIRED)
|
||||||
|
|
||||||
|
if(NOT TOKEN_AUTH_ONLY)
|
||||||
|
if (Qt5Core_DIR)
|
||||||
|
find_package(Qt5Keychain REQUIRED)
|
||||||
|
else()
|
||||||
|
find_package(QtKeychain REQUIRED)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
find_package(Sparkle)
|
find_package(Sparkle)
|
||||||
endif(APPLE)
|
endif(APPLE)
|
||||||
|
|||||||
-79
@@ -1,84 +1,5 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
version 2.2.3 (release 2016-08-08)
|
|
||||||
* SyncEngine: Fix detection of backup (#5104)
|
|
||||||
* Fix bug with overriding URL in config (#5016)
|
|
||||||
* Sharing: Fix bug with file names containing percent encodes (#5042, #5043)
|
|
||||||
* Sharing: Permissions for federated shares on servers >=9.1 (#4996, #5001)
|
|
||||||
* Overlays: Fix issues with file name casing on OS X and Windows
|
|
||||||
* Windows: Skip symlinks and junctions again (#5019)
|
|
||||||
* Only accept notification API Capability if endpoint is OCS-enabled (#5034)
|
|
||||||
* Fix windows HiDPI (#4994)
|
|
||||||
* SocketAPI: Use different pipe name to avoid unusual delay (#4977)
|
|
||||||
* Tray: Add minimal mode as workaround and testing tool for Linux issues (#4985, #4990)
|
|
||||||
* owncloudcmd: Fix --exclude regression #4979
|
|
||||||
* Small memleak: Use the full file stat destructors (#4992)
|
|
||||||
* Fix small QAction memleak (#5008)
|
|
||||||
* Fix crash on shutting down during propagation (#4979)
|
|
||||||
* Decrease memory usage during sync #4979
|
|
||||||
* Setup csync logging earlier to get all log output (#4991)
|
|
||||||
* Enable Shibboleth debug view with OWNCLOUD_SHIBBOLETH_DEBUG env
|
|
||||||
|
|
||||||
version 2.2.2 (release 2016-06-21)
|
|
||||||
* Excludes: Don't redundantly add the same exclude files (memleak) (#4967, #4988)
|
|
||||||
* Excludes: Only log if the pattern was really logged. (#4989)
|
|
||||||
|
|
||||||
version 2.2.1 (release 2016-06-06)
|
|
||||||
* Fix out of memory error when too many uploads happen (#4611)
|
|
||||||
* Fix display errors in progress display (#4803 #4856)
|
|
||||||
* LockWatcher: Remember to upload files after they become unlocked (#4865)
|
|
||||||
* Fix overlay icons for files with umlauts (#4884)
|
|
||||||
* Certs: Re-ask for different cert after rejection (#4898, #4911)
|
|
||||||
* Progress: Don't count items without propagation jobs (#4856, #4910)
|
|
||||||
* Utility: Fix for the translation of minutes, second (#4855)
|
|
||||||
* SyncEngine: invalid the blacklist entry when the rename destination change
|
|
||||||
|
|
||||||
version 2.2.0 (release 2016-05-12)
|
|
||||||
* Overlay icons: Refactoring - mainly for performance improvements
|
|
||||||
* Improved error handling with Sync Journal on USB storages (#4632)
|
|
||||||
* Sharing Completion: Improved UI of completion in sharing from desktop. (#3737)
|
|
||||||
* Show server notifications on the client (#3733)
|
|
||||||
* Improved Speed with small files by dynamic parallel request count (#4529)
|
|
||||||
* LockWatcher: Make sure to sync files after apps released exclusive locks on Windows.
|
|
||||||
* Improved handling of Win32 file locks and network files
|
|
||||||
* Workaround Ubuntu 16.04 tray icon bug (#4693)
|
|
||||||
* Removed the Alias field from the folder definition (#4695)
|
|
||||||
* Improved netrc parser (#4691)
|
|
||||||
* Improved user notifications about ignored files and conflicts (#4761, #3222)
|
|
||||||
* Add warnings for old server versions (#4523)
|
|
||||||
* Enable tranportation checksums if the server supports based on server capabilities (#3735)
|
|
||||||
|
|
||||||
* Default Chunk-size changed to 10MB (#4354)
|
|
||||||
* Documentation Improvements, ie. about overlay icons
|
|
||||||
* Translation fixes
|
|
||||||
* Countless other bugfixes
|
|
||||||
* Sqlite Update to recent version
|
|
||||||
* Update of QtKeyChain to support Windows credential store
|
|
||||||
* Packaging of dolphin overlay icon module for bleeding edge distros
|
|
||||||
|
|
||||||
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
|
|
||||||
* Several fixes/improvements to the sharing dialog
|
|
||||||
* Several fixes/improvements to the server activity tab
|
|
||||||
* Create the directory when using --confdir and it does not exist
|
|
||||||
* Windows Overlay icons: Fix DLL and icon oddities
|
|
||||||
* Mac Overlay icons: Don't install legacy Finder plugin on >= 10.10
|
|
||||||
* Linux Overlay icons: Nemo plugin
|
|
||||||
* Overlay icons: Fix several wrong icon state computations
|
|
||||||
* 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: Fixes for files becoming directories and vice versa (#4302)
|
|
||||||
* Misc other fixes/improvements
|
|
||||||
|
|
||||||
version 2.1 (release 2015-12-03)
|
version 2.1 (release 2015-12-03)
|
||||||
* GUI: Added a display of server activities
|
* GUI: Added a display of server activities
|
||||||
* GUI: Added a separate view for not synced items, ignores, errors
|
* GUI: Added a separate view for not synced items, ignores, errors
|
||||||
|
|||||||
externo
-58
@@ -1,58 +0,0 @@
|
|||||||
#!groovy
|
|
||||||
|
|
||||||
node('CLIENT') {
|
|
||||||
stage 'Checkout'
|
|
||||||
checkout scm
|
|
||||||
sh '''git submodule update --init'''
|
|
||||||
|
|
||||||
stage 'Qt4'
|
|
||||||
sh '''rm -rf build
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake -DUNIT_TESTING=1 -DBUILD_WITH_QT4=ON ..
|
|
||||||
make
|
|
||||||
ctest --output-on-failure'''
|
|
||||||
|
|
||||||
stage 'Qt4 - clang'
|
|
||||||
sh '''rm -rf build
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DUNIT_TESTING=1 -DBUILD_WITH_QT4=ON ..
|
|
||||||
make
|
|
||||||
ctest --output-on-failure'''
|
|
||||||
|
|
||||||
stage 'Qt5'
|
|
||||||
sh '''rm -rf build
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake -DUNIT_TESTING=1 -DBUILD_WITH_QT4=OFF ..
|
|
||||||
make
|
|
||||||
ctest --output-on-failure'''
|
|
||||||
|
|
||||||
stage 'Qt5 - clang'
|
|
||||||
sh '''rm -rf build
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DUNIT_TESTING=1 -DBUILD_WITH_QT4=OFF ..
|
|
||||||
make
|
|
||||||
ctest --output-on-failure'''
|
|
||||||
|
|
||||||
|
|
||||||
stage 'Win32'
|
|
||||||
def win32 = docker.image('deepdiver/docker-owncloud-client-win32:latest')
|
|
||||||
win32.pull() // make sure we have the latest available from Docker Hub
|
|
||||||
win32.inside {
|
|
||||||
sh '''
|
|
||||||
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 .
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
+1
-1
@@ -15,7 +15,7 @@ with your computer.
|
|||||||
|
|
||||||
### Binary packages
|
### Binary packages
|
||||||
|
|
||||||
* Refer to the download page https://owncloud.org/install/#install-clients
|
* Refer to the download page http://owncloud.org/sync-clients/
|
||||||
|
|
||||||
### Source code
|
### Source code
|
||||||
|
|
||||||
|
|||||||
+2
-3
@@ -1,11 +1,10 @@
|
|||||||
set( MIRALL_VERSION_MAJOR 2 )
|
set( MIRALL_VERSION_MAJOR 2 )
|
||||||
set( MIRALL_VERSION_MINOR 3 )
|
set( MIRALL_VERSION_MINOR 1 )
|
||||||
set( MIRALL_VERSION_PATCH 0 )
|
set( MIRALL_VERSION_PATCH 0 )
|
||||||
set( MIRALL_VERSION_YEAR 2016 )
|
|
||||||
set( MIRALL_SOVERSION 0 )
|
set( MIRALL_SOVERSION 0 )
|
||||||
|
|
||||||
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
||||||
set( MIRALL_VERSION_SUFFIX "git") #e.g. beta1, beta2, rc1
|
set( MIRALL_VERSION_SUFFIX "") #e.g. beta1, beta2, rc1
|
||||||
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
||||||
|
|
||||||
if( NOT DEFINED MIRALL_VERSION_BUILD )
|
if( NOT DEFINED MIRALL_VERSION_BUILD )
|
||||||
|
|||||||
@@ -25,8 +25,6 @@ def extractDeps(macho):
|
|||||||
deps = [macho]
|
deps = [macho]
|
||||||
otool = subprocess.Popen(['otool', '-L', macho], stdout=subprocess.PIPE)
|
otool = subprocess.Popen(['otool', '-L', macho], stdout=subprocess.PIPE)
|
||||||
for l in otool.communicate()[0].splitlines():
|
for l in otool.communicate()[0].splitlines():
|
||||||
if 'is not an object file' in l:
|
|
||||||
return []
|
|
||||||
m = re.search(r'@[^\s]+', l)
|
m = re.search(r'@[^\s]+', l)
|
||||||
if m:
|
if m:
|
||||||
path = resolvePath(m.group(0))
|
path = resolvePath(m.group(0))
|
||||||
|
|||||||
+22
-23
@@ -38,6 +38,8 @@ QT_PLUGINS = [
|
|||||||
'imageformats/libqgif.dylib',
|
'imageformats/libqgif.dylib',
|
||||||
'imageformats/libqico.dylib',
|
'imageformats/libqico.dylib',
|
||||||
'imageformats/libqjpeg.dylib',
|
'imageformats/libqjpeg.dylib',
|
||||||
|
'bearer/libqcorewlanbearer.dylib',
|
||||||
|
'bearer/libqgenericbearer.dylib',
|
||||||
'imageformats/libqsvg.dylib',
|
'imageformats/libqsvg.dylib',
|
||||||
'imageformats/libqmng.dylib',
|
'imageformats/libqmng.dylib',
|
||||||
]
|
]
|
||||||
@@ -249,38 +251,35 @@ def CopyPlugin(path, subdir):
|
|||||||
commands.append(args)
|
commands.append(args)
|
||||||
return new_path
|
return new_path
|
||||||
|
|
||||||
def CopyFramework(source_dylib):
|
def CopyFramework(path):
|
||||||
parts = source_dylib.split(os.sep)
|
parts = path.split(os.sep)
|
||||||
print "CopyFramework:", source_dylib
|
print "CopyFramework:", path
|
||||||
for i, part in enumerate(parts):
|
for i, part in enumerate(parts):
|
||||||
matchObj = re.match(r'(\w+\.framework)', part)
|
matchObj = re.match(r'(\w+\.framework)', part)
|
||||||
if matchObj:
|
if matchObj:
|
||||||
|
full_path = os.path.join(frameworks_dir, *parts[i:-1])
|
||||||
framework = matchObj.group(1)
|
framework = matchObj.group(1)
|
||||||
dylib_name = parts[-1]
|
|
||||||
source_path = os.path.join('/', *parts[:i+1])
|
|
||||||
dest_path = os.path.join(frameworks_dir, framework)
|
|
||||||
dest_dylib_path = os.path.join(frameworks_dir, *parts[i:-1])
|
|
||||||
break
|
break
|
||||||
if os.path.exists(dest_path):
|
args = ['mkdir', '-p', full_path]
|
||||||
print dest_path, "already exists, skipping copy..."
|
commands.append(args)
|
||||||
return os.path.join(dest_dylib_path, dylib_name)
|
args = ['ditto', '--arch=x86_64', path, full_path]
|
||||||
|
commands.append(args)
|
||||||
|
args = ['chmod', 'u+w', os.path.join(full_path, parts[-1])]
|
||||||
|
commands.append(args)
|
||||||
|
resources_dir = os.path.join(frameworks_dir, framework, "Resources")
|
||||||
|
|
||||||
args = ['mkdir', '-p', dest_dylib_path]
|
args = ['mkdir', resources_dir]
|
||||||
commands.append(args)
|
commands.append(args)
|
||||||
args = ['ditto', '--arch=x86_64', source_dylib, dest_dylib_path]
|
args = ['chmod', 'u+w', resources_dir]
|
||||||
commands.append(args)
|
|
||||||
args = ['chmod', 'u+w', os.path.join(dest_dylib_path, parts[-1])]
|
|
||||||
commands.append(args)
|
|
||||||
args = ['ln', '-s', '5', os.path.join(dest_path, 'Versions', 'Current')]
|
|
||||||
commands.append(args)
|
|
||||||
args = ['ln', '-s', os.path.join('Versions', 'Current', dylib_name), os.path.join(dest_path, dylib_name)]
|
|
||||||
commands.append(args)
|
|
||||||
args = ['ln', '-s', os.path.join('Versions', 'Current', 'Resources'), os.path.join(dest_path, 'Resources')]
|
|
||||||
commands.append(args)
|
|
||||||
args = ['cp', '-r', os.path.join(source_path, 'Versions', '5', 'Resources'), os.path.join(dest_path, 'Versions', '5')]
|
|
||||||
commands.append(args)
|
commands.append(args)
|
||||||
|
|
||||||
return os.path.join(dest_dylib_path, dylib_name)
|
info_plist = os.path.join(os.path.split(path)[0], '..', '..', 'Contents', 'Info.plist')
|
||||||
|
if not os.path.exists(info_plist):
|
||||||
|
info_plist = os.path.join(os.path.split(path)[0], 'Resources', 'Info.plist')
|
||||||
|
if os.path.exists(info_plist):
|
||||||
|
args = ['cp', '-r', info_plist, resources_dir]
|
||||||
|
commands.append(args)
|
||||||
|
return os.path.join(full_path, parts[-1])
|
||||||
|
|
||||||
def FixId(path, library_name):
|
def FixId(path, library_name):
|
||||||
id = '@executable_path/../Frameworks/%s' % library_name
|
id = '@executable_path/../Frameworks/%s' % library_name
|
||||||
|
|||||||
@@ -497,7 +497,7 @@
|
|||||||
<key>IDENTIFIER</key>
|
<key>IDENTIFIER</key>
|
||||||
<string>@APPLICATION_REV_DOMAIN_INSTALLER@</string>
|
<string>@APPLICATION_REV_DOMAIN_INSTALLER@</string>
|
||||||
<key>NAME</key>
|
<key>NAME</key>
|
||||||
<string>@APPLICATION_NAME_XML_ESCAPED@</string>
|
<string>@APPLICATION_NAME@</string>
|
||||||
<key>OVERWRITE_PERMISSIONS</key>
|
<key>OVERWRITE_PERMISSIONS</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>VERSION</key>
|
<key>VERSION</key>
|
||||||
@@ -1115,28 +1115,6 @@
|
|||||||
</dict>
|
</dict>
|
||||||
<key>PACKAGE_UUID</key>
|
<key>PACKAGE_UUID</key>
|
||||||
<string>39F61FCD-6EAA-4F3A-81C6-25E3F667DFB5</string>
|
<string>39F61FCD-6EAA-4F3A-81C6-25E3F667DFB5</string>
|
||||||
<key>REQUIREMENTS</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>BEHAVIOR</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>DICTIONARY</key>
|
|
||||||
<dict>
|
|
||||||
<key>IC_REQUIREMENT_JAVASCRIPT_FUNCTION</key>
|
|
||||||
<string>olderOsx</string>
|
|
||||||
<key>IC_REQUIREMENT_JAVASCRIPT_PARAMETERS</key>
|
|
||||||
<array/>
|
|
||||||
</dict>
|
|
||||||
<key>IDENTIFIER</key>
|
|
||||||
<string>fr.whitebox.Packages.requirement.javascript</string>
|
|
||||||
<key>MESSAGE</key>
|
|
||||||
<array/>
|
|
||||||
<key>NAME</key>
|
|
||||||
<string>JavaScript</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>TITLE</key>
|
<key>TITLE</key>
|
||||||
<array/>
|
<array/>
|
||||||
<key>TOOLTIP</key>
|
<key>TOOLTIP</key>
|
||||||
@@ -1245,7 +1223,7 @@
|
|||||||
<key>LANGUAGE</key>
|
<key>LANGUAGE</key>
|
||||||
<string>English</string>
|
<string>English</string>
|
||||||
<key>VALUE</key>
|
<key>VALUE</key>
|
||||||
<string>@APPLICATION_NAME_XML_ESCAPED@ Client</string>
|
<string>@APPLICATION_NAME@ Client</string>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
@@ -1445,23 +1423,11 @@
|
|||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>NAME</key>
|
<key>NAME</key>
|
||||||
<string>@APPLICATION_NAME_XML_ESCAPED@ Installer</string>
|
<string>@APPLICATION_NAME@ Installer</string>
|
||||||
<key>REFERENCE_FOLDER_PATH</key>
|
<key>REFERENCE_FOLDER_PATH</key>
|
||||||
<string>@CMAKE_INSTALL_DIR@</string>
|
<string>@CMAKE_INSTALL_DIR@</string>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
<key>SHARED_GLOBAL_DATA</key>
|
|
||||||
<dict>
|
|
||||||
<key>IC_REQUIREMENT_JAVASCRIPT_SHARED_SOURCE_CODE</key>
|
|
||||||
<string>
|
|
||||||
function olderOsx() {
|
|
||||||
if(system.compareVersions(system.version.ProductVersion, '10.10') == -1) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
</string>
|
|
||||||
</dict>
|
|
||||||
<key>TYPE</key>
|
<key>TYPE</key>
|
||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
<key>VERSION</key>
|
<key>VERSION</key>
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ EOF
|
|||||||
if [ -x "$(command -v pluginkit)" ]; then
|
if [ -x "$(command -v pluginkit)" ]; then
|
||||||
# add it to DB. This happens automatically too but we try to push it a bit harder for issue #3463
|
# add it to DB. This happens automatically too but we try to push it a bit harder for issue #3463
|
||||||
pluginkit -a "/Applications/@APPLICATION_EXECUTABLE@.app/Contents/PlugIns/FinderSyncExt.appex/"
|
pluginkit -a "/Applications/@APPLICATION_EXECUTABLE@.app/Contents/PlugIns/FinderSyncExt.appex/"
|
||||||
# Since El Capitan we need to sleep #4650
|
|
||||||
sleep 10s
|
|
||||||
# enable it
|
# enable it
|
||||||
pluginkit -e use -i @APPLICATION_REV_DOMAIN@.FinderSyncExt
|
pluginkit -e use -i @APPLICATION_REV_DOMAIN@.FinderSyncExt
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -9,9 +9,8 @@ team_identifier="$3"
|
|||||||
codesign -s "$identity" --force --preserve-metadata=entitlements --verbose=4 --deep "$src_app"
|
codesign -s "$identity" --force --preserve-metadata=entitlements --verbose=4 --deep "$src_app"
|
||||||
|
|
||||||
# Verify the signature
|
# Verify the signature
|
||||||
codesign -dv $src_app
|
|
||||||
codesign --verify -v $src_app
|
|
||||||
spctl -a -t exec -vv $src_app
|
spctl -a -t exec -vv $src_app
|
||||||
|
codesign -dv $src_app
|
||||||
|
|
||||||
# Validate that the key used for signing the binary matches the expected TeamIdentifier
|
# Validate that the key used for signing the binary matches the expected TeamIdentifier
|
||||||
# needed to pass the SocketApi through the sandbox
|
# needed to pass the SocketApi through the sandbox
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
From cf6881c03d9f08c6ace83defe461423bb87f30d8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?utf8?q?Tor=20Arne=20Vestb=C3=B8?= <tor.arne.vestbo@theqtcompany.com>
|
|
||||||
Date: Fri, 15 Jan 2016 14:15:51 +0100
|
|
||||||
Subject: [PATCH] OS X: Ensure system tray icon is prepared even when menu bar
|
|
||||||
is hidden
|
|
||||||
|
|
||||||
On OS X 10.11 (El Capitan) the system menu bar can be automatically
|
|
||||||
hidden, in which case the menu bar height is reported to be 0 when
|
|
||||||
using the menuBarHeight API.
|
|
||||||
|
|
||||||
This resulted in failing to prepare an image for the system tray
|
|
||||||
icon item, making the tray item "invisible".
|
|
||||||
|
|
||||||
Instead we now use the [[NSStatusBar systemStatusBar] thickness]
|
|
||||||
API, which returns the correct height regardless of the menu bar
|
|
||||||
being hidden or not.
|
|
||||||
|
|
||||||
Task-number: QTBUG-48960
|
|
||||||
Change-Id: I208fb8df13754964a6f254cadfbff06dd56c6bab
|
|
||||||
---
|
|
||||||
src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
|
|
||||||
index a3ffb5b..8152c57 100644
|
|
||||||
--- a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
|
|
||||||
+++ b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
|
|
||||||
@@ -198,7 +198,7 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon)
|
|
||||||
// current OS X versions is 22 points. Provide some future-proofing
|
|
||||||
// by deriving the icon height from the menu height.
|
|
||||||
const int padding = 4;
|
|
||||||
- const int menuHeight = [[[NSApplication sharedApplication] mainMenu] menuBarHeight];
|
|
||||||
+ const int menuHeight = [[NSStatusBar systemStatusBar] thickness];
|
|
||||||
const int maxImageHeight = menuHeight - padding;
|
|
||||||
|
|
||||||
// Select pixmap based on the device pixel height. Ideally we would use
|
|
||||||
--
|
|
||||||
2.6.2.2.g1b5ffa3
|
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
## Patches used
|
## Patches used
|
||||||
|
|
||||||
There are our patches on top of Qt 5.4.0, which we are currently
|
There are our patches on top of Qt 5.4.0, which we are currently
|
||||||
using for our binary packages on Windows and Mac OS X. Most of them
|
using for our binary packages on Windows and Mac OS. Most of them
|
||||||
have been sent upstream and are part of newer Qt releases.
|
have been sent upstream and are part of newer Qt releases.
|
||||||
|
|
||||||
All changes are designed to up upstream, and all those that are
|
All changes are designed to up upstream, and all those that are
|
||||||
@@ -28,26 +28,17 @@ purpose is outlined in each patches' front matter.
|
|||||||
* 0007-X-Network-Fix-up-previous-corruption-patch.patch
|
* 0007-X-Network-Fix-up-previous-corruption-patch.patch
|
||||||
* 0008-QNAM-Fix-reply-deadlocks-on-server-closing-connectio.patch
|
* 0008-QNAM-Fix-reply-deadlocks-on-server-closing-connectio.patch
|
||||||
* 0014-Fix-SNI-for-TlsV1_0OrLater-TlsV1_1OrLater-and-TlsV1_.patch
|
* 0014-Fix-SNI-for-TlsV1_0OrLater-TlsV1_1OrLater-and-TlsV1_.patch
|
||||||
* 0016-Fix-possible-crash-when-passing-an-invalid-PAC-URL.patch
|
|
||||||
* 0011-Make-sure-to-report-correct-NetworkAccessibility.patch
|
|
||||||
|
|
||||||
### Part of Qt v5.5.2 (UNRELEASED!)
|
### Upstreamed but not in any release yet (as of 2015-11-16)
|
||||||
* 0009-QNAM-Assign-proper-channel-before-sslErrors-emission.patch
|
|
||||||
* 0010-Don-t-let-closed-http-sockets-pass-as-valid-connecti.patch
|
|
||||||
* 0012-Make-sure-networkAccessibilityChanged-is-emitted.patch
|
|
||||||
|
|
||||||
### Part of Qt v5.6 and later
|
|
||||||
* 0009-QNAM-Assign-proper-channel-before-sslErrors-emission.patch
|
* 0009-QNAM-Assign-proper-channel-before-sslErrors-emission.patch
|
||||||
* 0010-Don-t-let-closed-http-sockets-pass-as-valid-connecti.patch
|
* 0010-Don-t-let-closed-http-sockets-pass-as-valid-connecti.patch
|
||||||
* 0011-Make-sure-to-report-correct-NetworkAccessibility.patch
|
* 0011-Make-sure-to-report-correct-NetworkAccessibility.patch
|
||||||
* 0012-Make-sure-networkAccessibilityChanged-is-emitted.patch
|
* 0012-Make-sure-networkAccessibilityChanged-is-emitted.patch
|
||||||
* 0013-Make-UnknownAccessibility-not-block-requests.patch
|
* 0013-Make-UnknownAccessibility-not-block-requests.patch
|
||||||
* 0019-Ensure-system-tray-icon-is-prepared-even-when-menu-bar.patch
|
|
||||||
|
|
||||||
### Part of Qt 5.7 and later
|
|
||||||
* 0015-Remove-legacy-platform-code-in-QSslSocket-for-OS-X-1.patch
|
* 0015-Remove-legacy-platform-code-in-QSslSocket-for-OS-X-1.patch
|
||||||
|
* 0016-Fix-possible-crash-when-passing-an-invalid-PAC-URL.patch
|
||||||
|
|
||||||
### Not submitted upstream to be part of any release:
|
### Not submitted to be part of any release:
|
||||||
* 0006-Fix-force-debug-info-with-macx-clang_NOUPSTREAM.patch
|
* 0006-Fix-force-debug-info-with-macx-clang_NOUPSTREAM.patch
|
||||||
This is only needed if you intent to harvest debugging symbols
|
This is only needed if you intent to harvest debugging symbols
|
||||||
for breakpad.
|
for breakpad.
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
#
|
|
||||||
# This script creates a new windows toolchain repository in OBS.
|
|
||||||
# It only works for versions that do not yet exist.
|
|
||||||
#
|
|
||||||
# Make sure to adopt the variable stableversion.
|
|
||||||
|
|
||||||
# Set the new stable version accordingly:
|
|
||||||
stableversion=2.1
|
|
||||||
targetproject="isv:ownCloud:toolchains:mingw:win32:${stableversion}"
|
|
||||||
|
|
||||||
# Create the new repo
|
|
||||||
|
|
||||||
# get the xml build description of the stable repo
|
|
||||||
xml=`osc meta prj isv:ownCloud:toolchains:mingw:win32:stable`
|
|
||||||
stable_xml="${xml/stable/$stableversion}"
|
|
||||||
|
|
||||||
echo $stable_xml
|
|
||||||
|
|
||||||
echo $stable_xml | osc meta prj -F - ${targetproject}
|
|
||||||
|
|
||||||
|
|
||||||
# now copy all packages
|
|
||||||
packs=`osc ls isv:ownCloud:toolchains:mingw:win32:stable`
|
|
||||||
|
|
||||||
for pack in $packs
|
|
||||||
do
|
|
||||||
osc copypac isv:ownCloud:toolchains:mingw:win32:stable $pack $targetproject
|
|
||||||
done
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
FROM opensuse:42.1
|
|
||||||
|
|
||||||
MAINTAINER Daniel Molkentin <danimo@owncloud.com>
|
|
||||||
|
|
||||||
ENV TERM ansi
|
|
||||||
ENV HOME /root
|
|
||||||
|
|
||||||
ENV REFRESHED_AT 20160421
|
|
||||||
|
|
||||||
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.2/openSUSE_Leap_42.1/isv:ownCloud:toolchains:mingw:win32:2.2.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}
|
useradd user -u ${2:-1000}
|
||||||
su - user << EOF
|
su - user << EOF
|
||||||
cd /home/user/$1
|
cd /home/user/$1
|
||||||
rm -rf build-win32
|
rm -rf build-win32
|
||||||
mkdir build-win32
|
mkdir build-win32
|
||||||
cd build-win32
|
cd build-win32
|
||||||
../admin/win/download_runtimes.sh
|
../admin/win/download_runtimes.sh
|
||||||
cmake .. -DCMAKE_TOOLCHAIN_FILE=../admin/win/Toolchain-mingw32-openSUSE.cmake -DWITH_CRASHREPORTER=ON
|
cmake .. -DCMAKE_TOOLCHAIN_FILE=../admin/win/Toolchain-mingw32-openSUSE.cmake -DWITH_CRASHREPORTER=ON
|
||||||
make -j4
|
make -j4
|
||||||
make package
|
make package
|
||||||
ctest .
|
ctest .
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -29,15 +29,15 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME}erako Abiarazle
|
|||||||
StrCpy $UNINSTALLER_FILE_Detail "Desinstalatzailea idazten"
|
StrCpy $UNINSTALLER_FILE_Detail "Desinstalatzailea idazten"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Instalatzaileko Erregistroko Giltzak idazten"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Instalatzaileko Erregistroko Giltzak idazten"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Bukatuta"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Bukatuta"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Ez dirudi ${APPLICATION_NAME} '$INSTDIR'.$ direktorioan instalatuta dagoenik.$\n$\nJarraitu hala ere (ez da aholkatzen)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Ez dirudi ${APPLICATION_NAME} '$INSTDIR'.$ direktorioan instalatuta dagoenik.\n$\nJarraitu hala ere (ez da aholkatzen)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Desinstalazioak erabiltzaileak bertan behera utzi du"
|
StrCpy $UNINSTALL_ABORT "Desinstalazioak erabiltzaileak bertan behera utzi du"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Abiarazle Bizkorreko Lasterbidea (E/E)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Abiarazle Bizkorreko Lasterbidea (E/E)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Mahaigaineko Lasterbidea (dagoena berridazten du)"
|
StrCpy $INIT_NO_DESKTOP "Mahaigaineko Lasterbidea (dagoena berridazten du)"
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Ezin izan da goratu, errorea:"
|
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Instalatzaileak administratzaile baimenak behar ditu, saiatu berriro"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Instalatzaileak administratzaile baimenak behar ditu, saiatu berriro"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Instalatzailea dagoeneko martxan da."
|
StrCpy $INIT_INSTALLER_RUNNING "Instalatzailea dagoeneko martxan da."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Desinstalatzaile honek administratzaile baimenak behar ditu, saiatu berriro"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Desinstalatzaile honek administratzaile baimenak behar ditu, saiatu berriro"
|
||||||
StrCpy $UAC_ERROR_LOGON_SERVICE "Saioa hasteko zerbitzua ez dago martxan, bertan behera uzten!"
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Desinstalatzailea dagoeneko martxan da."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Desinstalatzailea dagoeneko martxan da."
|
||||||
StrCpy $SectionGroup_Shortcuts "Lasterbideak"
|
StrCpy $SectionGroup_Shortcuts "Lasterbideak"
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
|
||||||
|
StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:"
|
||||||
|
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Z
|
|||||||
StrCpy $UNINSTALLER_FILE_Detail "Zapisuji odinstal tor"
|
StrCpy $UNINSTALLER_FILE_Detail "Zapisuji odinstal tor"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Zapisuji instal tor do registr…"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Zapisuji instal tor do registr…"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "DokonŸeno"
|
StrCpy $UNINSTALLER_FINISHED_Detail "DokonŸeno"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Nezd se, §e ${APPLICATION_NAME} je nainstalov na v adres ýi '$INSTDIR'.$\n$\nChcete pokraŸovat (nedoporuŸuje se)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Nezd se, §e ${APPLICATION_NAME} je nainstalov na ve slo§ce '$INSTDIR'.$\n$\nChcete pokraŸovat (nedoporuŸuje se)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Odinstalace zruçena u§ivatelem"
|
StrCpy $UNINSTALL_ABORT "Odinstalace zruçena u§ivatelem"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Z stupce rychl‚ho spuçtØn¡ (nen¡ k dispozici)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Z stupce rychl‚ho spuçtØn¡ (nen¡ k dispozici)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Z stupce na ploçe (pýep¡çe existuj¡c¡)"
|
StrCpy $INIT_NO_DESKTOP "Z stupce na ploçe (pýep¡çe existuj¡c¡)"
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Toon opmerkingen bij deze uitgave"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Toon releaseopmerkingen"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Gevonden ${APPLICATION_EXECUTABLE} proces(sen) moet worden gestopt.$\nWilt u dat het installatieprogramma dat voor u doet?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Gevonden ${APPLICATION_EXECUTABLE} proces(sen) moet worden gestopt.$\nWilt u dat het installatieprogramma dat voor u doet?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Stoppen ${APPLICATION_EXECUTABLE} processen."
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Stoppen ${APPLICATION_EXECUTABLE} processen."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Het te stoppen proces is niet gevonden!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Het te stoppen proces is niet gevonden!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "Er is een oudere versie van ${APPLICATION_NAME} geïnstalleerd op uw systeem. geadviseerd wordt om de huidige versie te de-installeren voordat de nieuwe versie wordt geïnstalleerd. Selecteer de uit te voeren actie en klik op Verder om door te gaan."
|
StrCpy $PageReinstall_NEW_Field_1 "Er is een oudere versie van ${APPLICATION_NAME} geïnstalleerd op uw systeem. geadviseerd wordt om de huidige versie te de-installeren voordat de nieuwe versie wordt geïnstalleerd. Selecteer de uit te voeren actie en klik op Verder om door te gaan."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Verwijder oude versie"
|
StrCpy $PageReinstall_NEW_Field_2 "De-installeren voor installeren"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Behoud oude versie"
|
StrCpy $PageReinstall_NEW_Field_3 "Niet de-installeren"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Al geïnstalleerd"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Al geïnstalleerd"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Kies hoe u ${APPLICATION_NAME} wilt installeren."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Kies hoe u ${APPLICATION_NAME} wilt installeren."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Er is al een recentere versie van ${APPLICATION_NAME} geïnstalleerd! Installeren van een oudere versie wordt niet aangeraden. Als u echt de oudere versie wilt installeren, adviseren we de huidige versie eerst te verwijderen. Kies de actie die u wilt uitvoeren en druk op Verder om door te gaan."
|
StrCpy $PageReinstall_OLD_Field_1 "Er is al een recentere versie van ${APPLICATION_NAME} geïnstalleerd! Installeren van een oudere versie wordt niet aangeraden. Als u echt de oudere versie wilt installeren, adviseren we de huidige versie eerst te verwijderen. Kies de actie die u wilt uitvoeren en druk op Verder om door te gaan."
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "میانبر اجرای سریع ب
|
|||||||
StrCpy $UNINSTALLER_FILE_Detail "نوشتن حذف کننده"
|
StrCpy $UNINSTALLER_FILE_Detail "نوشتن حذف کننده"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "در حال نوشتن کلید های رجیستری نصاب"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "در حال نوشتن کلید های رجیستری نصاب"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "اتمام"
|
StrCpy $UNINSTALLER_FINISHED_Detail "اتمام"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "به نظر نمی رسد نرم افزار ${APPLICATION_NAME} در '$INSTDIR'.$\n$\nنصب شده باشد.$\nآیا می خواهید ادامه دهید ( توصیه نشده است ) ؟"
|
StrCpy $UNINSTALL_MESSAGEBOX "به نظر نمی رسد نرم افزار ${APPLICATION_NAME} در '$INSTDIR'.$\n$\nنصب شده باشد.\nآیا می خواهید ادامه دهید ( توصیه نشده است ) ؟"
|
||||||
StrCpy $UNINSTALL_ABORT "عمل حذف توسط کاربر متوقف شد"
|
StrCpy $UNINSTALL_ABORT "عمل حذف توسط کاربر متوقف شد"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "میانبر بازکردن سریع ( N/A )"
|
StrCpy $INIT_NO_QUICK_LAUNCH "میانبر بازکردن سریع ( N/A )"
|
||||||
StrCpy $INIT_NO_DESKTOP "میانبر دسکتاپ (رونویسی وجود دارد)"
|
StrCpy $INIT_NO_DESKTOP "میانبر دسکتاپ (رونویسی وجود دارد)"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Näytä julkaisutiedot"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Näytä julkaisutiedot"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Havaittiin sovelluksen ${APPLICATION_EXECUTABLE} prosessi (tai prosesseja) jotka pitäisi pysäyttää.$\nHaluatko että asennusohjelma pysäyttää nämä puolestasi?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Havaittiin sovelluksen ${APPLICATION_EXECUTABLE} prosessi (tai prosesseja) jotka pitäisi pysäyttää.\nHaluatko että asennusohjelma pysäyttää nämä puolestasi?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Pysäytetään sovelluksen ${APPLICATION_EXECUTABLE} prosessit."
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Pysäytetään sovelluksen ${APPLICATION_EXECUTABLE} prosessit."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Tapettavaa prosessia ei löytynyt!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Tapettavaa prosessia ei löytynyt!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "Vanhempi versio sovelluksesta ${APPLICATION_NAME} on jo asennettu. On suositeltavaa että poistat vanhan asennuksen ensin. Valitse mikä toiminto suoritetaan ja napsauta Seuraava jatkaaksesi."
|
StrCpy $PageReinstall_NEW_Field_1 "Vanhempi versio sovelluksesta ${APPLICATION_NAME} on jo asennettu. On suositeltavaa että poistat vanhan asennuksen ensin. Valitse mikä toiminto suoritetaan ja napsauta Seuraava jatkaaksesi."
|
||||||
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Pikak
|
|||||||
StrCpy $UNINSTALLER_FILE_Detail "Kirjoitetaan poisto-ohjelmaa"
|
StrCpy $UNINSTALLER_FILE_Detail "Kirjoitetaan poisto-ohjelmaa"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Kirjoitetaan asennusohjelman rekisteriavaimia"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Kirjoitetaan asennusohjelman rekisteriavaimia"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Valmis"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Valmis"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Vaikuttaa siltä että sovellus ${APPLICATION_NAME} on asennettu kansioon '$INSTDIR'.$\n$\nHaluatko jatkaa tästä huolimatta (ei suositeltavaa)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Vaikuttaa siltä että sovellus ${APPLICATION_NAME} on asennettu kansioon '$INSTDIR'.\n\nHaluatko jatkaa tästä huolimatta (ei suositeltavaa)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Poistaminen keskeytettiin käyttäjän toimesta"
|
StrCpy $UNINSTALL_ABORT "Poistaminen keskeytettiin käyttäjän toimesta"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Pikakäynnistyksen pikakuvake (-)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Pikakäynnistyksen pikakuvake (-)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Työpöydän pikakuvake (korvaa nykyinen)"
|
StrCpy $INIT_NO_DESKTOP "Työpöydän pikakuvake (korvaa nykyinen)"
|
||||||
|
|||||||
@@ -38,6 +38,6 @@ StrCpy $UAC_ERROR_ELEVATE "Rechte k
|
|||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dieses Installationsprogramm erfordert Administrator-Rechte, bitte erneut versuchen"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dieses Installationsprogramm erfordert Administrator-Rechte, bitte erneut versuchen"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Das Installationsprogramm wird bereits ausgeführt."
|
StrCpy $INIT_INSTALLER_RUNNING "Das Installationsprogramm wird bereits ausgeführt."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Das Deinstallationsprogramm erfordert Administrator-Rechte. Bitte erneut versuchen."
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Das Deinstallationsprogramm erfordert Administrator-Rechte. Bitte erneut versuchen."
|
||||||
StrCpy $UAC_ERROR_LOGON_SERVICE "Anmeldedienst läuft nicht, abbruch!"
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Das Deinstallationsprogramm wird bereits ausgeführt."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Das Deinstallationsprogramm wird bereits ausgeführt."
|
||||||
StrCpy $SectionGroup_Shortcuts "Verknüpfungen"
|
StrCpy $SectionGroup_Shortcuts "Verknüpfungen"
|
||||||
|
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ StrCpy $PageReinstall_NEW_Field_1 "Az ${APPLICATION_NAME} alkalmazás egy régeb
|
|||||||
StrCpy $PageReinstall_NEW_Field_2 "Eltávolítás telepítés előtt"
|
StrCpy $PageReinstall_NEW_Field_2 "Eltávolítás telepítés előtt"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Ne távolítsa el"
|
StrCpy $PageReinstall_NEW_Field_3 "Ne távolítsa el"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Már telepítve"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Már telepítve"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Válassza ki, hogy szeretné telepíteni a következő alkalmazást: ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Válaszd ki, hogy szeretnéd telepíteni a következő alkalmazást ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Az ${APPLICATION_NAME} alkalmazás egy újabb verziója már megtalálható a rendszeren. Nem ajánlott egy régebbi verzió telepítése. Ha valóban szeretné a régebbi verziót telepíteni, akkor ajánlott a jelenleg telepített verzió eltávolítása. Válassza ki milyen műveletet szeretne végrehajtani, és nyomja meg a $\"Következő$\" gombot a folytatáshoz."
|
StrCpy $PageReinstall_OLD_Field_1 "Az ${APPLICATION_NAME} alkalmazás egy újabb verziója már megtalálható a rendszeren. Nem ajánlott egy régebbi verzió telepítése. Ha valóban szeretné a régebbi verziót telepíteni, akkor ajánlott a jelenleg telepített verzió eltávolítása. Válassza ki milyen műveletet szeretne végrehajtani, és nyomja meg a $\"Következő$\" gombot a folytatáshoz."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "Az ${APPLICATION_NAME} alkalmazás ${VERSION} verziója már telepítve van.$↩$\nKérjük válaszd ki milyen műveletet szeretnél végrehajtani, és nyomd meg a „Következő” gombot."
|
StrCpy $PageReinstall_SAME_Field_1 "Az ${APPLICATION_NAME} alkalmazás ${VERSION} verziója már telepítve van.$↩$\nKérjük válaszd ki milyen műveletet szeretnél végrehajtani, és nyomd meg a „Következő” gombot."
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Komponens hozzáadása/újratelepítése"
|
StrCpy $PageReinstall_SAME_Field_2 "Komponens hozzáadása/újratelepítése"
|
||||||
@@ -31,13 +31,13 @@ StrCpy $UNINSTALLER_FILE_Detail "Elltávolító írása"
|
|||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Telepítési registry kulcsok írása"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Telepítési registry kulcsok írása"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Befejezve!"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Befejezve!"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Nem sikerült az ${APPLICATION_NAME} alkalmazás telepítése a '$INSTDIR' könyvtárba.$\n$\nSzeretné mindenképpen folytatni (nem ajánlott)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Nem sikerült az ${APPLICATION_NAME} alkalmazás telepítése a '$INSTDIR' könyvtárba.$\n$\nSzeretné mindenképpen folytatni (nem ajánlott)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Az eltávolítást a felhasználó megszakította"
|
StrCpy $UNINSTALL_ABORT "Az eltávolítást egy felhasználó megszakította"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Gyorsindító hivatkozás (N/A)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Gyorsindító hivatkozás (N/A)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Asztali hivatkozás (felülírja a meglévőt)"
|
StrCpy $INIT_NO_DESKTOP "Asztali hivatkozás (felülírja a meglévőt)"
|
||||||
StrCpy $UAC_ERROR_ELEVATE "Nem sikerült felemelni, hiba:"
|
StrCpy $UAC_ERROR_ELEVATE "Nem sikerült felemelni, hiba:"
|
||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "A telepítő futtatásához adminisztrátori hozzáférés szükséges, próbálja újra."
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "A telepítő futtatásához adminisztrátori hozzáférés szükséges, próbáld újra."
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "A telepítő már fut."
|
StrCpy $INIT_INSTALLER_RUNNING "A telepítő már fut."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Az eltávolító futtatásához adminisztrátori hozzáférés szükséges, próbálja újra."
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Az eltávolító futtatásához adminisztrátori hozzáférés szükséges, próbáld újra."
|
||||||
StrCpy $UAC_ERROR_LOGON_SERVICE "A bejelentkező szolgáltatás nem fut, megszakítás!"
|
StrCpy $UAC_ERROR_LOGON_SERVICE "A bejelentkező szolgáltatás nem fut, megszakítás!"
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Az eltávolító már fut."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Az eltávolító már fut."
|
||||||
StrCpy $SectionGroup_Shortcuts "Parancsikonok"
|
StrCpy $SectionGroup_Shortcuts "Parancsikonok"
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Scorciatoia per ${APPLICATION_NAME}
|
|||||||
StrCpy $UNINSTALLER_FILE_Detail "Creazione del programma di disinstallazione"
|
StrCpy $UNINSTALLER_FILE_Detail "Creazione del programma di disinstallazione"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Scrittura delle chiavi di registro del programma di installazione"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Scrittura delle chiavi di registro del programma di installazione"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Completato"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Completato"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Non sembra che ${APPLICATION_NAME} sia installato nella cartella '$INSTDIR'.$$\nVuoi continuare comunque (non consigliato)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Non sembra che ${APPLICATION_NAME} sia installato nella cartella '$INSTDIR'.$\nVuoi continuare comunque (non consigliato)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Disinstallazione interrotta dall'utente"
|
StrCpy $UNINSTALL_ABORT "Disinstallazione interrotta dall'utente"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Scorciatoia dell'avvio veloce (N/D)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Scorciatoia dell'avvio veloce (N/D)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Scorciatoia del desktop (sovrascrivi se esistente)"
|
StrCpy $INIT_NO_DESKTOP "Scorciatoia del desktop (sovrascrivi se esistente)"
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "
|
|||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "${APPLICATION_EXECUTABLE} のプロセスを終了する必要があります。$\nインストーラーがそのプロセスを停止してもよろしいですか?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "${APPLICATION_EXECUTABLE} のプロセスを終了する必要があります。$\nインストーラーがそのプロセスを停止してもよろしいですか?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "${APPLICATION_EXECUTABLE} プロセスを停止しています。"
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "${APPLICATION_EXECUTABLE} プロセスを停止しています。"
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "終了するプロセスがありません"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "終了するプロセスがありません"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "システムに ${APPLICATION_NAME} の旧バージョンがインストールされています。$\n旧バージョンをアンインストールし、最新バージョンをインストールするのをお勧めします。$\nオペレーションを選択し、次へをクリックする。"
|
StrCpy $PageReinstall_NEW_Field_1 "システムに ${APPLICATION_NAME} の旧バージョンがインストールされています。\n旧バージョンをアンインストールし、最新バージョンをインストールするのをお勧めします。\nオペレーションを選択し、次へをクリックする。"
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "インストール前にアンインストールする"
|
StrCpy $PageReinstall_NEW_Field_2 "インストール前にアンインストールする"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "アンインストールしない"
|
StrCpy $PageReinstall_NEW_Field_3 "アンインストールしない"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "インストール済"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "インストール済"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "${APPLICATION_NAME} のインストール方法を選択する"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "${APPLICATION_NAME} のインストール方法を選択する"
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "${APPLICATION_NAME} の最新バージョンがすでにインストールされています。$\n旧バージョンのインストールはお勧めしません。旧バージョンのインストールが本当に必要な場合は、まず最新バージョンをアンインストールしてから、旧バージョンをインストールしてください。$\nオペレーションを選択し、次へをクリックする。"
|
StrCpy $PageReinstall_OLD_Field_1 "${APPLICATION_NAME} の最新バージョンがすでにインストールされています。\n旧バージョンのインストールはお勧めしません。旧バージョンのインストールが本当に必要な場合は、まず最新バージョンをアンインストールしてから、旧バージョンをインストールしてください。\nオペレーションを選択し、次へをクリックする。"
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} は、${VERSION} がすでにインストールされています。$\n$\n実行したい操作を選択して、次へをクリックしてください。"
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} は、${VERSION} が既にインストールされています。$\n$\n実行したい操作を選択し、次へをクリックする。"
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "追加/再インストールコンポーネント"
|
StrCpy $PageReinstall_SAME_Field_2 "追加/再インストールコンポーネント"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} をアンインストール"
|
StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} をアンインストール"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} をアンインストール"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} をアンインストール"
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ StrCpy $PageReinstall_NEW_Field_3 "Nie usuwaj "
|
|||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ju¿ zainstalowane"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ju¿ zainstalowane"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Wybierz jak chcesz zainstalowaæ ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Wybierz jak chcesz zainstalowaæ ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Zainstalowana jest nowsza wersja ${APPLICATION_NAME}! Niezalecane jest instalowanie starszej wersji. Jeœli naprawdê chcesz zainstalowaæ starsz¹ wersjê lepiej najpierw odinstalowaæ obecn¹ aplikacjê. Wybierz operacjê któr¹ chcesz wykonaæ i naciœnij przycisk Dalej."
|
StrCpy $PageReinstall_OLD_Field_1 "Zainstalowana jest nowsza wersja ${APPLICATION_NAME}! Niezalecane jest instalowanie starszej wersji. Jeœli naprawdê chcesz zainstalowaæ starsz¹ wersjê lepiej najpierw odinstalowaæ obecn¹ aplikacjê. Wybierz operacjê któr¹ chcesz wykonaæ i naciœnij przycisk Dalej."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} jest ju¿ zainstalowany.$\nWybierz operacjê któr¹ chcesz wykonaæ i naciœnij przycisk Dalej."
|
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Doda/Przeinstaluj komponenty"
|
StrCpy $PageReinstall_SAME_Field_2 "Doda/Przeinstaluj komponenty"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Odinstaluj ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Odinstaluj ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinstaluj ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinstaluj ${APPLICATION_NAME}"
|
||||||
@@ -38,6 +37,7 @@ StrCpy $UAC_ERROR_ELEVATE "Niemo
|
|||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Ten instalator potrzebuje uprawnieñ administratora, spróbuj ponownie"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Ten instalator potrzebuje uprawnieñ administratora, spróbuj ponownie"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Instalator ju¿ jest uruchomiony."
|
StrCpy $INIT_INSTALLER_RUNNING "Instalator ju¿ jest uruchomiony."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Ten dezinstalator potrzebuje uprawnieñ administratora, spróbuj ponownie"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Ten dezinstalator potrzebuje uprawnieñ administratora, spróbuj ponownie"
|
||||||
StrCpy $UAC_ERROR_LOGON_SERVICE "Proces logowania nie jest uruchomiony, przerywam !"
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Dezinstalator ju¿ jest uruchomiony."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Dezinstalator ju¿ jest uruchomiony."
|
||||||
StrCpy $SectionGroup_Shortcuts "Skróty"
|
StrCpy $SectionGroup_Shortcuts "Skróty"
|
||||||
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
|
||||||
|
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Encontrados ${APPLICATION_EXECUTABLE} processo(s) em execução que precisa(m) de ser interrompido(s).$\nDeseja que o instalador o(s) termine por si?"
|
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 de ${APPLICATION_EXECUTABLE}."
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar os processos ${APPLICATION_EXECUTABLE}."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado nenhum processo para terminar!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado o processo a terminar!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "Está instalada no sistema uma versão antiga de ${APPLICATION_NAME}. É recomendado que desinstale a versão atual antes de instalar a mais recente. Selecione a operação que deseja executar e clique em $\"Seguinte$\" para continuar."
|
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. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "Não desinstale"
|
StrCpy $PageReinstall_NEW_Field_3 "Não desinstale"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como pretende instalar ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como pretende instalar ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Uma versão mais recente da aplicação ${APPLICATION_NAME} já está instalada! Não é recomendada a instalação de uma versão mais antiga. Se realmente deseja instalar esta versão, aconselha-se a desinstalação da versão atual primeiro. Selecione a operação que deseja executar e clique em Avançar para continuar."
|
StrCpy $PageReinstall_OLD_Field_1 "Uma versão mais recente do ${APPLICATION_NAME} já está instalada! Não é recomendada a instalação de uma versão mais antiga. Se realmente deseja instalar esta versão, aconselha-se a desinstalação da versão atual primeiro. Selecione a operação que deseja executar e clique em Avançar para continuar."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalada.$\nSelecione a operação que deseja realizar e clique em 'Seguinte' para continuar."
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalada.\nSelecione a operação que deseja realizar e clique em 'Seguinte' para continuar."
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Adicionar/Reinstalar Componentes"
|
StrCpy $PageReinstall_SAME_Field_2 "Adicionar/Reinstalar Componentes"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
|
||||||
@@ -20,17 +20,17 @@ StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "A instalar integração para Wi
|
|||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Atalho do progama no Menu Inicial"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Atalho do progama no Menu Inicial"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "A adicionar o atalho de ${APPLICATION_NAME} ao Menu Inicial."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "A adicionar o atalho de ${APPLICATION_NAME} ao Menu Inicial."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Atalho da área de trabalho"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Atalho da área de trabalho"
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "A criar atalhos na área de trabalho"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "A criar atalhos da área de trabalho"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Atalho de início rápido"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Atalho de início rápido"
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "A criar atalho de início rápido"
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "A criar atalho de início rápido"
|
||||||
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "O essencial de ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "O essencial de ${APPLICATION_NAME}."
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Atalho de ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Atalho de ${APPLICATION_NAME}."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Atalho do ambiente de trabalho para ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Atalho no ambiente de trabalho de ${APPLICATION_NAME}."
|
||||||
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Atalho de início rápido de ${APPLICATION_NAME}."
|
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Atalho de início rápido de ${APPLICATION_NAME}."
|
||||||
StrCpy $UNINSTALLER_FILE_Detail "A escrever o Desinstalador"
|
StrCpy $UNINSTALLER_FILE_Detail "A escrever o Desinstalador"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "A escrever chaves de registo do instalador"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "A escrever chaves de registo do instalador"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Terminado"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Terminado"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Não parece que a aplicação ${APPLICATION_NAME} esteja instalada no diretório '$INSTDIR'.$\n$\nContinuar na mesma (não recomendado)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Não parece que ${APPLICATION_NAME} esteja instalado no diretório '$INSTDIR'.$\n$\nContinuar na mesma (não recomendado)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Desinstalação cancelada pelo utilizador"
|
StrCpy $UNINSTALL_ABORT "Desinstalação cancelada pelo utilizador"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Atalho de Início Rápido (N/A)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Atalho de Início Rápido (N/A)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Atalho do Ambiente de Trabalho (sobrepõe o existente)"
|
StrCpy $INIT_NO_DESKTOP "Atalho do Ambiente de Trabalho (sobrepõe o existente)"
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Ярлык в меню быстро
|
|||||||
StrCpy $UNINSTALLER_FILE_Detail "Сохранение деинсталлятора"
|
StrCpy $UNINSTALLER_FILE_Detail "Сохранение деинсталлятора"
|
||||||
StrCpy $UNINSTALLER_REGISTRY_Detail "Запись ключей реестра установщика"
|
StrCpy $UNINSTALLER_REGISTRY_Detail "Запись ключей реестра установщика"
|
||||||
StrCpy $UNINSTALLER_FINISHED_Detail "Завершено"
|
StrCpy $UNINSTALLER_FINISHED_Detail "Завершено"
|
||||||
StrCpy $UNINSTALL_MESSAGEBOX "Похоже, что приложение ${APPLICATION_NAME} не установлено в каталог '$INSTDIR'.$\nВсе равно продолжить (не рекомендуется)?"
|
StrCpy $UNINSTALL_MESSAGEBOX "Похоже, что приложение ${APPLICATION_NAME} не установлено в каталог '$INSTDIR'.\nВсе равно продолжить (не рекомендуется)?"
|
||||||
StrCpy $UNINSTALL_ABORT "Удаление отменено пользователем"
|
StrCpy $UNINSTALL_ABORT "Удаление отменено пользователем"
|
||||||
StrCpy $INIT_NO_QUICK_LAUNCH "Ярлык быстрого запуска (не доступен)"
|
StrCpy $INIT_NO_QUICK_LAUNCH "Ярлык быстрого запуска (не доступен)"
|
||||||
StrCpy $INIT_NO_DESKTOP "Ярлык на рабочем столе (перезапись существующего)"
|
StrCpy $INIT_NO_DESKTOP "Ярлык на рабочем столе (перезапись существующего)"
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "查看版本日志"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "查看版本日志"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "有 ${APPLICATION_EXECUTABLE} 项进程需要关闭。$\n您想让安装程序关闭这些进程吗?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "有 ${APPLICATION_EXECUTABLE} 项进程需要关闭。$\n您想让安装程序关闭这些进程吗?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "停止${APPLICATION_EXECUTABLE}进程。"
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "杀死${APPLICATION_EXECUTABLE}进程。"
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "未找到要停止的进程!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "未找到要杀死的进程!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "您的系统已经安装${APPLICATION_NAME}较老版本。建议安装前卸载当前版本。选择将要执行的操作,点击下一步继续。"
|
StrCpy $PageReinstall_NEW_Field_1 "您的系统已经安装${APPLICATION_NAME}较老版本。建议安装前卸载当前版本。选择将要执行的操作,点击下一步继续。"
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "在安装前先卸载"
|
StrCpy $PageReinstall_NEW_Field_2 "在安装前先卸载"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "不要卸载"
|
StrCpy $PageReinstall_NEW_Field_3 "不要卸载"
|
||||||
@@ -38,6 +38,6 @@ StrCpy $UAC_ERROR_ELEVATE "无法获得权限,错误:"
|
|||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "安装程序需要管理员权限,请重试"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "安装程序需要管理员权限,请重试"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "安装程序已经运行。"
|
StrCpy $INIT_INSTALLER_RUNNING "安装程序已经运行。"
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "卸载程序需要管理员权限,请重试"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "卸载程序需要管理员权限,请重试"
|
||||||
StrCpy $UAC_ERROR_LOGON_SERVICE "登录服务器未运行!"
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "卸载程序已经运行。"
|
StrCpy $INIT_UNINSTALLER_RUNNING "卸载程序已经运行。"
|
||||||
StrCpy $SectionGroup_Shortcuts "快捷方式"
|
StrCpy $SectionGroup_Shortcuts "快捷方式"
|
||||||
|
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ StrCpy $PageReinstall_NEW_Field_3 "Neodin
|
|||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Už je nainštalovaný"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Už je nainštalovaný"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Vyberte si, ako chcete nainštalova� ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Vyberte si, ako chcete nainštalova� ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Novšia verzia ${APPLICATION_NAME} je už nainštalovaná! Neodporúèam vám nainštalova� staršiu verziu. Ak naozaj chcete nainštalova� túto staršiu verziu, je lepšie najprv odinštalova� aktuálnu verziu. Vyberte operáciu, ktorú chcete vykona�, a kliknite na tlaèidlo Ïalej pre pokraèovanie."
|
StrCpy $PageReinstall_OLD_Field_1 "Novšia verzia ${APPLICATION_NAME} je už nainštalovaná! Neodporúèam vám nainštalova� staršiu verziu. Ak naozaj chcete nainštalova� túto staršiu verziu, je lepšie najprv odinštalova� aktuálnu verziu. Vyberte operáciu, ktorú chcete vykona�, a kliknite na tlaèidlo Ïalej pre pokraèovanie."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} je už nainštalovaná.$\n$\nVyberte operáciu, ktorú chcete vykona�, a kliknite na tlaèidlo Ïalej pre pokraèovanie."
|
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Prida�/Preinštalova� komponenty"
|
StrCpy $PageReinstall_SAME_Field_2 "Prida�/Preinštalova� komponenty"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Odinštalova� ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Odinštalova� ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinštalova� ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinštalova� ${APPLICATION_NAME}"
|
||||||
@@ -38,6 +37,7 @@ StrCpy $UAC_ERROR_ELEVATE "Nemo
|
|||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Tento inštalátor vyžaduje admin prístup, skúste to znova"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Tento inštalátor vyžaduje admin prístup, skúste to znova"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Inštalátor je už spustený."
|
StrCpy $INIT_INSTALLER_RUNNING "Inštalátor je už spustený."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Tento odinštalátor vyžaduje admin prístup, skúste to znova"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Tento odinštalátor vyžaduje admin prístup, skúste to znova"
|
||||||
StrCpy $UAC_ERROR_LOGON_SERVICE "Prihlasovacia služba nebeží! Prerušuje sa."
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Odinštalátor je už spustený."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Odinštalátor je už spustený."
|
||||||
StrCpy $SectionGroup_Shortcuts "Zástupcovia"
|
StrCpy $SectionGroup_Shortcuts "Zástupcovia"
|
||||||
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
|
||||||
|
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ StrCpy $PageReinstall_NEW_Field_3 "Ne odstrani namestitve"
|
|||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Program je že nameščen"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Program je že nameščen"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Izberite način namestitve programa ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Izberite način namestitve programa ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Novejša različica programa ${APPLICATION_NAME} je že nameščena! Ni priporočljivo namestiti starejše. V kolikor želite vseeno nadaljevati z namestitvijo, prej odstranite obstoječo različico. Izberite opravilo in pritisnite gumb za nadaljevanje."
|
StrCpy $PageReinstall_OLD_Field_1 "Novejša različica programa ${APPLICATION_NAME} je že nameščena! Ni priporočljivo namestiti starejše. V kolikor želite vseeno nadaljevati z namestitvijo, prej odstranite obstoječo različico. Izberite opravilo in pritisnite gumb za nadaljevanje."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "Program ${APPLICATION_NAME} ${VERSION} je že nameščen.$\n$\nIzberite opravilo, ki ga želite izvesti in kliknite za nadaljevanje."
|
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Dodaj/Ponovno namesti programe"
|
StrCpy $PageReinstall_SAME_Field_2 "Dodaj/Ponovno namesti programe"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Odstrani ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Odstrani ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Odstrani ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Odstrani ${APPLICATION_NAME}"
|
||||||
@@ -38,6 +37,7 @@ StrCpy $UAC_ERROR_ELEVATE "Ni mogo
|
|||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Namestilnik zahteva skrbniška dovoljenja."
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Namestilnik zahteva skrbniška dovoljenja."
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Namestilnik je že zagnan."
|
StrCpy $INIT_INSTALLER_RUNNING "Namestilnik je že zagnan."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Program za odstranjevanje namestitve zahteva skrbniška dovoljenja."
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Program za odstranjevanje namestitve zahteva skrbniška dovoljenja."
|
||||||
StrCpy $UAC_ERROR_LOGON_SERVICE "Storitev za prijavo ni zagnana. Opravilo je ustavljeno!"
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Program za odstranjevanje namestitve je že zagnan."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Program za odstranjevanje namestitve je že zagnan."
|
||||||
StrCpy $SectionGroup_Shortcuts "Bližnjice"
|
StrCpy $SectionGroup_Shortcuts "Bližnjice"
|
||||||
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
|
||||||
|
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar las notas de la versión"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar las notas de la versión"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "El/los proceso/s ${APPLICATION_EXECUTABLE} debe/n ser detenidos.$\n¿Quiere que el instalador lo haga por usted?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "El/los proceso/s ${APPLICATION_EXECUTABLE} debe/n ser detenidos.$\n¿Quiere que el instalador lo haga por usted?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Deteniendo el/los proceso/s ${APPLICATION_EXECUTABLE}."
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Deteniendo el/los proceso/s ${APPLICATION_EXECUTABLE}."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "¡Proceso para finalizar no encontrado!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "¡Proceso para detener no encontrado!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "Una versión anterior de ${APPLICATION_NAME} se encuentra instalada en el sistema. Se recomienda de instalar la versión actual antes de instalar la nueva. Seleccione la operacion deseada y haga click en Siguiente para continuar."
|
StrCpy $PageReinstall_NEW_Field_1 "Una versión anterior de ${APPLICATION_NAME} se encuentra instalada en el sistema. Se recomienda de instalar la versión actual antes de instalar la nueva. Seleccione la operacion deseada y haga click en Siguiente para continuar."
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "No desinstalar"
|
StrCpy $PageReinstall_NEW_Field_3 "No desinstalar"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de la versión"
|
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_KILLING_PROCESSES_TEXT "Parando el proceso ${APPLICATION_EXECUTABLE}."
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Proceso a detener no encontrado!"
|
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."
|
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."
|
||||||
|
|||||||
@@ -9,14 +9,11 @@ StrCpy $PageReinstall_NEW_Field_3 "Avinstallera inte"
|
|||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Redan installerad"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Redan installerad"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Välj hur du vill installera ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Välj hur du vill installera ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "En nyare version av ${APPLICATION_NAME} är redan installerad! Det rekommenderas inte att du installerar en äldre version. Om du verkligen vill installera denna äldre versionen, är det bättre att du avinstallerar den nuvarande versionen först. Välj den åtgärd du vill utföra och klicka Nästa för att fortsätta."
|
StrCpy $PageReinstall_OLD_Field_1 "En nyare version av ${APPLICATION_NAME} är redan installerad! Det rekommenderas inte att du installerar en äldre version. Om du verkligen vill installera denna äldre versionen, är det bättre att du avinstallerar den nuvarande versionen först. Välj den åtgärd du vill utföra och klicka Nästa för att fortsätta."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} är redan installerad.$\n$\nVälj den åtgärd du vill utföra och klicka på Nästa för att fortsätta."
|
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Lägg till/Ominstallera komponenter"
|
StrCpy $PageReinstall_SAME_Field_2 "Lägg till/Ominstallera komponenter"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Avinstallera ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Avinstallera ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Avinstallera ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Avinstallera ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Välj underhålls alternativ att utföra."
|
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Välj underhålls alternativ att utföra."
|
||||||
StrCpy $SEC_APPLICATION_DETAILS "Installerar ${APPLICATION_NAME} väsentligheter."
|
StrCpy $SEC_APPLICATION_DETAILS "Installerar ${APPLICATION_NAME} väsentligheter."
|
||||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration för Windows Explorer"
|
|
||||||
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installerar integration för Windows Explorer"
|
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start-meny program genväg"
|
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start-meny program genväg"
|
||||||
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Lägger till genväg för ${APPLICATION_NAME} till Start-menyn."
|
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Lägger till genväg för ${APPLICATION_NAME} till Start-menyn."
|
||||||
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Skrivbordsgenväg"
|
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Skrivbordsgenväg"
|
||||||
@@ -38,6 +35,9 @@ StrCpy $UAC_ERROR_ELEVATE "Kunde inte få förhöjda rättigheter, fel:"
|
|||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Detta installationsprogram kräver adminstratörs rättigheter, försök igen"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Detta installationsprogram kräver adminstratörs rättigheter, försök igen"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Installationsprogrammet körs redan."
|
StrCpy $INIT_INSTALLER_RUNNING "Installationsprogrammet körs redan."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Detta avinstallationsprogram kräver administratörsrättigheter, försök igen"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Detta avinstallationsprogram kräver administratörsrättigheter, försök igen"
|
||||||
StrCpy $UAC_ERROR_LOGON_SERVICE "Login-service körs inte, avbryter!"
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Avinstallationsprogrammet körs redan."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Avinstallationsprogrammet körs redan."
|
||||||
StrCpy $SectionGroup_Shortcuts "Genvägar"
|
StrCpy $SectionGroup_Shortcuts "Genvägar"
|
||||||
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer"
|
||||||
|
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer"
|
||||||
|
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
# Auto-generated - do not modify
|
# Auto-generated - do not modify
|
||||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "แสดงบันทึกที่มี"
|
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "แสดงบันทึกประจำรุ่น"
|
||||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "พบว่ากระบวนการ ${APPLICATION_EXECUTABLE} จะต้องหยุดทำงาน$\nคุณต้องการติดตั้งเพื่อหยุดการทำงานเหล่านี้ของคุณ?"
|
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "พบว่ากระบวนการ ${APPLICATION_EXECUTABLE} จะต้องหยุดทำงาน\nคุณต้องการติดตั้งเพื่อหยุดการทำงานเหล่านี้ของคุณ?"
|
||||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "ฆ่ากระบวนการทำงาน ${APPLICATION_EXECUTABLE}"
|
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "ฆ่ากระบวนการทำงาน ${APPLICATION_EXECUTABLE}"
|
||||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "ไม่พบการฆ่ากระบวนการ!"
|
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "ไม่พบการฆ่ากระบวนการ!"
|
||||||
StrCpy $PageReinstall_NEW_Field_1 "รุ่นเก่าของ ${APPLICATION_NAME} ได้ถูกติดตั้งในระบบของคุณ ขอแนะนำให้คุณถอนการติดตั้งรุ่นปัจจุบันออกก่อน แล้วเลือกการดำเนินการที่คุณต้องการหลังจากนั้นคลิกถัดไปเพื่อดำเนินการต่อ"
|
StrCpy $PageReinstall_NEW_Field_1 "รุ่นเก่าของ ${APPLICATION_NAME} มีการติดตั้งในระบบของคุณ ขอแนะนำให้คุณถอนการติดตั้งรุ่นปัจจุบันออกก่อน เลือกการดำเนินการที่คุณต้องการที่จะดำเนินการและคลิกถัดไปเพื่อดำเนินการต่อ"
|
||||||
StrCpy $PageReinstall_NEW_Field_2 "ถอนการติดตั้งก่อนการติดตั้ง"
|
StrCpy $PageReinstall_NEW_Field_2 "ถอนการติดตั้งก่อนการติดตั้ง"
|
||||||
StrCpy $PageReinstall_NEW_Field_3 "อย่าถอนการติดตั้ง"
|
StrCpy $PageReinstall_NEW_Field_3 "อย่าถอนการติดตั้ง"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "ติดตั้งแล้ว"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "ติดตั้งแล้ว"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "เลือกวิธีที่คุณต้องการติดตั้ง ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "เลือกวิธีที่คุณต้องการติดตั้ง ${APPLICATION_NAME}"
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "รุ่นใหม่ของ ${APPLICATION_NAME} ถูกติดตั้งแล้ว! เราไม่แนะนำให้คุณติดตั้งรุ่นที่เก่ากว่า ถ้าคุณอยากจะติดตั้งรุ่นเก่าก็สามารถถอนการติดตั้งได้"
|
StrCpy $PageReinstall_OLD_Field_1 "รุ่นใหม่ของ ${APPLICATION_NAME} ถูกติดตั้งแล้ว! เราไม่แนะนำให้คุณติดตั้งรุ่นเก่า ถ้าคุณอยากจะติดตั้งรุ่นเก่าก็สามารถสอนการติดตั้งได้"
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} รุ่น ${VERSION} ถูกติดตั้งไปแล้ว$ $\nเลือกดำเนินงานที่คุณต้องการและคลิกถัดไปเพื่อดำเนินการต่อ"
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} ถูกติดตั้งไปแล้ว$ $\nเลือกดำเนินงานที่คุณต้องการและคลิกถัดไปเพื่อดำเนินการต่อ"
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "ส่วนประกอบ เพิ่ม/ติดตั้งใหม่ "
|
StrCpy $PageReinstall_SAME_Field_2 "ส่วนประกอบ เพิ่ม/ติดตั้งใหม่ "
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "ถอนการติดตั้ง ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "ถอนการติดตั้ง ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "ถอนการติดตั้ง ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "ถอนการติดตั้ง ${APPLICATION_NAME}"
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ StrCpy $PageReinstall_NEW_Field_3 "Не видаляти"
|
|||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Установлено"
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Установлено"
|
||||||
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Оберіть, як ви хочете установити ${APPLICATION_NAME}."
|
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Оберіть, як ви хочете установити ${APPLICATION_NAME}."
|
||||||
StrCpy $PageReinstall_OLD_Field_1 "Знайдено новішу версію ${APPLICATION_NAME}! Ми не рекомендуємо встановлювати стару версію. Якщо ви все ж бажаєте встановити цю версію, спочатку видаліть поточну версію. Оберіть подальшу дію та натисніть $\"Далі$\"."
|
StrCpy $PageReinstall_OLD_Field_1 "Знайдено новішу версію ${APPLICATION_NAME}! Ми не рекомендуємо встановлювати стару версію. Якщо ви все ж бажаєте встановити цю версію, спочатку видаліть поточну версію. Оберіть подальшу дію та натисніть $\"Далі$\"."
|
||||||
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} вже встановлено.$\n$\nОберіть подальшу дію та натисніть $\"Далі$\" для продовження."
|
|
||||||
StrCpy $PageReinstall_SAME_Field_2 "Додати/Перевстановити компоненти"
|
StrCpy $PageReinstall_SAME_Field_2 "Додати/Перевстановити компоненти"
|
||||||
StrCpy $PageReinstall_SAME_Field_3 "Видалити ${APPLICATION_NAME}"
|
StrCpy $PageReinstall_SAME_Field_3 "Видалити ${APPLICATION_NAME}"
|
||||||
StrCpy $UNINSTALLER_APPDATA_TITLE "Видалити ${APPLICATION_NAME}"
|
StrCpy $UNINSTALLER_APPDATA_TITLE "Видалити ${APPLICATION_NAME}"
|
||||||
@@ -38,6 +37,7 @@ StrCpy $UAC_ERROR_ELEVATE "Неможливо підняти, помилка:"
|
|||||||
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Для установки потрібні права адміністратора, спробуйте ще раз"
|
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Для установки потрібні права адміністратора, спробуйте ще раз"
|
||||||
StrCpy $INIT_INSTALLER_RUNNING "Установка вже запущена."
|
StrCpy $INIT_INSTALLER_RUNNING "Установка вже запущена."
|
||||||
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Для видалення потрібні права адміністратора, спробуйте ще раз"
|
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Для видалення потрібні права адміністратора, спробуйте ще раз"
|
||||||
StrCpy $UAC_ERROR_LOGON_SERVICE "Сервіс авторизації не запущений, припиняю!"
|
|
||||||
StrCpy $INIT_UNINSTALLER_RUNNING "Програма видалення вже запущено."
|
StrCpy $INIT_UNINSTALLER_RUNNING "Програма видалення вже запущено."
|
||||||
StrCpy $SectionGroup_Shortcuts "Ярлики"
|
StrCpy $SectionGroup_Shortcuts "Ярлики"
|
||||||
|
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue."
|
||||||
|
StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!"
|
||||||
|
|||||||
@@ -104,13 +104,10 @@ localeToName = {
|
|||||||
def escapeNSIS(st):
|
def escapeNSIS(st):
|
||||||
return st.replace('\\', r'$\\')\
|
return st.replace('\\', r'$\\')\
|
||||||
.replace('\t', r'$\t')\
|
.replace('\t', r'$\t')\
|
||||||
.replace('\r', r'$\r')\
|
.replace('\r', r'\r')\
|
||||||
.replace('\n', r'$\n')\
|
.replace('\n', r'\n')\
|
||||||
.replace('\"', r'$\"')\
|
.replace('\"', r'$\"')\
|
||||||
.replace('$$\\', '$\\')\
|
.replace('$$\\', '$\\')
|
||||||
.replace('$\\n', r'$\n')\
|
|
||||||
.replace('$\\\\n', r'$\n')
|
|
||||||
|
|
||||||
|
|
||||||
translationCache = {}
|
translationCache = {}
|
||||||
|
|
||||||
|
|||||||
@@ -2,27 +2,27 @@
|
|||||||
!insertmacro MUI_LANGUAGE "Swedish"
|
!insertmacro MUI_LANGUAGE "Swedish"
|
||||||
!insertmacro MUI_LANGUAGE "Estonian"
|
!insertmacro MUI_LANGUAGE "Estonian"
|
||||||
!insertmacro MUI_LANGUAGE "Turkish"
|
!insertmacro MUI_LANGUAGE "Turkish"
|
||||||
!insertmacro MUI_LANGUAGE "PortugueseBR"
|
|
||||||
!insertmacro MUI_LANGUAGE "Slovenian"
|
!insertmacro MUI_LANGUAGE "Slovenian"
|
||||||
!insertmacro MUI_LANGUAGE "SpanishInternational"
|
!insertmacro MUI_LANGUAGE "SpanishInternational"
|
||||||
!insertmacro MUI_LANGUAGE "Dutch"
|
!insertmacro MUI_LANGUAGE "Dutch"
|
||||||
!insertmacro MUI_LANGUAGE "Norwegian"
|
|
||||||
!insertmacro MUI_LANGUAGE "Hungarian"
|
!insertmacro MUI_LANGUAGE "Hungarian"
|
||||||
!insertmacro MUI_LANGUAGE "Ukrainian"
|
!insertmacro MUI_LANGUAGE "Ukrainian"
|
||||||
!insertmacro MUI_LANGUAGE "French"
|
!insertmacro MUI_LANGUAGE "French"
|
||||||
!insertmacro MUI_LANGUAGE "Catalan"
|
!insertmacro MUI_LANGUAGE "Norwegian"
|
||||||
!insertmacro MUI_LANGUAGE "Russian"
|
!insertmacro MUI_LANGUAGE "Russian"
|
||||||
!insertmacro MUI_LANGUAGE "Thai"
|
!insertmacro MUI_LANGUAGE "Thai"
|
||||||
!insertmacro MUI_LANGUAGE "Finnish"
|
!insertmacro MUI_LANGUAGE "Finnish"
|
||||||
!insertmacro MUI_LANGUAGE "Basque"
|
!insertmacro MUI_LANGUAGE "Basque"
|
||||||
!insertmacro MUI_LANGUAGE "Greek"
|
!insertmacro MUI_LANGUAGE "Greek"
|
||||||
!insertmacro MUI_LANGUAGE "SimpChinese"
|
!insertmacro MUI_LANGUAGE "SimpChinese"
|
||||||
|
!insertmacro MUI_LANGUAGE "PortugueseBR"
|
||||||
|
!insertmacro MUI_LANGUAGE "Catalan"
|
||||||
!insertmacro MUI_LANGUAGE "Italian"
|
!insertmacro MUI_LANGUAGE "Italian"
|
||||||
!insertmacro MUI_LANGUAGE "Portuguese"
|
!insertmacro MUI_LANGUAGE "Portuguese"
|
||||||
!insertmacro MUI_LANGUAGE "Czech"
|
!insertmacro MUI_LANGUAGE "German"
|
||||||
!insertmacro MUI_LANGUAGE "Japanese"
|
!insertmacro MUI_LANGUAGE "Japanese"
|
||||||
!insertmacro MUI_LANGUAGE "Galician"
|
!insertmacro MUI_LANGUAGE "Galician"
|
||||||
!insertmacro MUI_LANGUAGE "German"
|
!insertmacro MUI_LANGUAGE "Czech"
|
||||||
!insertmacro MUI_LANGUAGE "Slovak"
|
!insertmacro MUI_LANGUAGE "Slovak"
|
||||||
!insertmacro MUI_LANGUAGE "Spanish"
|
!insertmacro MUI_LANGUAGE "Spanish"
|
||||||
!insertmacro MUI_LANGUAGE "Polish"
|
!insertmacro MUI_LANGUAGE "Polish"
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
[Paths]
|
|
||||||
Prefix = .
|
|
||||||
Plugins = .
|
|
||||||
Binaries = .
|
|
||||||
Imports = .
|
|
||||||
Qml2Imports = .
|
|
||||||
LibraryExecutables = .
|
|
||||||
+1
-1
Submodule binary updated: 0d89ac7766...8b72648a93
@@ -0,0 +1,5 @@
|
|||||||
|
--- binary
|
||||||
|
+++ binary
|
||||||
|
@@ -1 +1 @@
|
||||||
|
-Subproject commit 1fb9ddfa9a9a1b4dbc447eee10dbed89172d968a
|
||||||
|
+Subproject commit 01d73965dc8b862d1b2310d3ef801c297b697ec7
|
||||||
@@ -22,6 +22,5 @@
|
|||||||
<file>resources/account.png</file>
|
<file>resources/account.png</file>
|
||||||
<file>resources/more.png</file>
|
<file>resources/more.png</file>
|
||||||
<file>resources/delete.png</file>
|
<file>resources/delete.png</file>
|
||||||
<file>resources/bell.png</file>
|
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@@ -20,4 +20,15 @@ function (ADD_CMOCKA_TEST _testName _testSource)
|
|||||||
add_executable(${_testName} ${_testSource})
|
add_executable(${_testName} ${_testSource})
|
||||||
target_link_libraries(${_testName} ${ARGN})
|
target_link_libraries(${_testName} ${ARGN})
|
||||||
add_test(${_testName} ${CMAKE_CURRENT_BINARY_DIR}/${_testName})
|
add_test(${_testName} ${CMAKE_CURRENT_BINARY_DIR}/${_testName})
|
||||||
|
|
||||||
|
if(UNIT_TESTING)
|
||||||
|
INSTALL(
|
||||||
|
TARGETS
|
||||||
|
${_testName}
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
)
|
||||||
|
endif(UNIT_TESTING)
|
||||||
|
|
||||||
endfunction (ADD_CMOCKA_TEST)
|
endfunction (ADD_CMOCKA_TEST)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleLongVersionString</key>
|
<key>CFBundleLongVersionString</key>
|
||||||
<string>@APPLICATION_NAME_XML_ESCAPED@ @MIRALL_VERSION_STRING@</string>
|
<string>@APPLICATION_NAME@ @MIRALL_VERSION_STRING@</string>
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>@MIRALL_VERSION_STRING@</string>
|
<string>@MIRALL_VERSION_STRING@</string>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>(C) 2014-2016 @APPLICATION_VENDOR@</string>
|
<string>(C) 2014-2015 @APPLICATION_VENDOR@</string>
|
||||||
<key>SUShowReleaseNotes</key>
|
<key>SUShowReleaseNotes</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>LSMinimumBundleVersion</key>
|
<key>LSMinimumBundleVersion</key>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
!define QT_DLL_PATH "${MING_BIN}"
|
!define QT_DLL_PATH "${MING_BIN}"
|
||||||
!define ACCESSIBLE_DLL_PATH "${MING_LIB}/qt5/plugins/accessible"
|
!define ACCESSIBLE_DLL_PATH "${MING_LIB}/qt5/plugins/accessible"
|
||||||
!define SQLITE_DLL_PATH "${MING_LIB}/qt5/plugins/sqldrivers"
|
!define SQLITE_DLL_PATH "${MING_LIB}/qt5/plugins/sqldrivers"
|
||||||
|
!define BEARER_DLL_PATH "${MING_LIB}/qt5/plugins/bearer"
|
||||||
!define IMAGEFORMATS_DLL_PATH "${MING_LIB}/qt5/plugins/imageformats"
|
!define IMAGEFORMATS_DLL_PATH "${MING_LIB}/qt5/plugins/imageformats"
|
||||||
!define PLATFORMS_DLL_PATH "${MING_LIB}/qt5/plugins/platforms"
|
!define PLATFORMS_DLL_PATH "${MING_LIB}/qt5/plugins/platforms"
|
||||||
|
|
||||||
@@ -406,14 +407,15 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
|
|||||||
SetOutPath "$INSTDIR\sqldrivers"
|
SetOutPath "$INSTDIR\sqldrivers"
|
||||||
File "${SQLITE_DLL_PATH}\qsqlite.dll"
|
File "${SQLITE_DLL_PATH}\qsqlite.dll"
|
||||||
|
|
||||||
|
SetOutPath "$INSTDIR\bearer"
|
||||||
|
File "${BEARER_DLL_PATH}\qgenericbearer.dll"
|
||||||
|
File "${BEARER_DLL_PATH}\qnativewifibearer.dll"
|
||||||
|
|
||||||
SetOutPath "$INSTDIR"
|
SetOutPath "$INSTDIR"
|
||||||
;License & release notes.
|
;License & release notes.
|
||||||
File "@CPACK_RESOURCE_FILE_LICENSE@"
|
File "@CPACK_RESOURCE_FILE_LICENSE@"
|
||||||
;File /oname=NOTES.txt ${NSI_PATH}\RELEASE_NOTES.txt
|
;File /oname=NOTES.txt ${NSI_PATH}\RELEASE_NOTES.txt
|
||||||
|
|
||||||
;Qt config:
|
|
||||||
File "${NSI_PATH}\qt.conf"
|
|
||||||
|
|
||||||
;Qt stuff:
|
;Qt stuff:
|
||||||
File "${QT_DLL_PATH}\Qt5Core.dll"
|
File "${QT_DLL_PATH}\Qt5Core.dll"
|
||||||
File "${QT_DLL_PATH}\Qt5Gui.dll"
|
File "${QT_DLL_PATH}\Qt5Gui.dll"
|
||||||
@@ -623,6 +625,7 @@ Section Uninstall
|
|||||||
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x64.dll"
|
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x64.dll"
|
||||||
!insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCUtil_x64.dll"
|
!insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCUtil_x64.dll"
|
||||||
!undef LIBRARY_X64
|
!undef LIBRARY_X64
|
||||||
|
${Else}
|
||||||
DetailPrint "Uninstalling x86 overlay DLLs"
|
DetailPrint "Uninstalling x86 overlay DLLs"
|
||||||
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCContextMenu_x86.dll"
|
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCContextMenu_x86.dll"
|
||||||
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x86.dll"
|
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x86.dll"
|
||||||
@@ -759,12 +762,6 @@ Function .onInit
|
|||||||
|
|
||||||
;Shutdown ${APPLICATION_NAME} in case Add/Remove re-installer option used.
|
;Shutdown ${APPLICATION_NAME} in case Add/Remove re-installer option used.
|
||||||
Call EnsureOwncloudShutdown
|
Call EnsureOwncloudShutdown
|
||||||
|
|
||||||
ReadRegStr $R0 ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "InstallLocation"
|
|
||||||
${If} ${Silent}
|
|
||||||
${AndIf} $R0 != ""
|
|
||||||
ExecWait '"$R0\Uninstall.exe" /S _?=$R0'
|
|
||||||
${EndIf}
|
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
Function .onInstSuccess
|
Function .onInstSuccess
|
||||||
@@ -774,11 +771,6 @@ Function .onInstSuccess
|
|||||||
WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "skipUpdateCheck" "1"
|
WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "skipUpdateCheck" "1"
|
||||||
${EndIf}
|
${EndIf}
|
||||||
|
|
||||||
; TODO: Only needed to when updating from 2.1.{0,1}. Remove in due time.
|
|
||||||
Delete /REBOOTOK $INSTDIR\bearer\qgenericbearer.dll
|
|
||||||
Delete /REBOOTOK $INSTDIR\bearer\qnativewifibearer.dll
|
|
||||||
RMDir /REBOOTOK $INSTDIR\bearer
|
|
||||||
|
|
||||||
${If} ${Silent}
|
${If} ${Silent}
|
||||||
${AndIf} $InstallRunIfSilent == "yes"
|
${AndIf} $InstallRunIfSilent == "yes"
|
||||||
Call LaunchApplication
|
Call LaunchApplication
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
@@ -18,9 +18,6 @@ if( Qt5Core_FOUND )
|
|||||||
find_package(Qt5Network REQUIRED)
|
find_package(Qt5Network REQUIRED)
|
||||||
find_package(Qt5Xml REQUIRED)
|
find_package(Qt5Xml REQUIRED)
|
||||||
find_package(Qt5Concurrent REQUIRED)
|
find_package(Qt5Concurrent REQUIRED)
|
||||||
if(UNIT_TESTING)
|
|
||||||
find_package(Qt5Test REQUIRED)
|
|
||||||
endif()
|
|
||||||
if(NOT TOKEN_AUTH_ONLY)
|
if(NOT TOKEN_AUTH_ONLY)
|
||||||
find_package(Qt5WebKitWidgets REQUIRED)
|
find_package(Qt5WebKitWidgets REQUIRED)
|
||||||
find_package(Qt5WebKit REQUIRED)
|
find_package(Qt5WebKit REQUIRED)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# (c) 2014 Copyright ownCloud GmbH
|
# (c) 2014 Copyright ownCloud, Inc.
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING* file.
|
# For details see the accompanying COPYING* file.
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,4 @@
|
|||||||
#cmakedefine SYSCONFDIR "@SYSCONFDIR@"
|
#cmakedefine SYSCONFDIR "@SYSCONFDIR@"
|
||||||
#cmakedefine SHAREDIR "@SHAREDIR@"
|
#cmakedefine SHAREDIR "@SHAREDIR@"
|
||||||
|
|
||||||
#cmakedefine WITH_UNIT_TESTING 1
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -41,8 +41,6 @@ endif (MEM_NULL_TESTS)
|
|||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
if (UNIT_TESTING)
|
if (UNIT_TESTING)
|
||||||
set(WITH_UNIT_TESTING ON)
|
|
||||||
|
|
||||||
find_package(CMocka)
|
find_package(CMocka)
|
||||||
if (CMOCKA_FOUND)
|
if (CMOCKA_FOUND)
|
||||||
include(AddCMockaTest)
|
include(AddCMockaTest)
|
||||||
|
|||||||
@@ -62,4 +62,8 @@ if (WIN32)
|
|||||||
check_function_exists(__mingw_asprintf HAVE___MINGW_ASPRINTF)
|
check_function_exists(__mingw_asprintf HAVE___MINGW_ASPRINTF)
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
|
|
||||||
|
if (UNIT_TESTING)
|
||||||
|
set(WITH_UNIT_TESTING ON)
|
||||||
|
endif (UNIT_TESTING)
|
||||||
|
|
||||||
set(CSYNC_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL "csync required system libraries")
|
set(CSYNC_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL "csync required system libraries")
|
||||||
|
|||||||
@@ -128,4 +128,10 @@ else()
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# INSTALL(
|
||||||
|
# FILES
|
||||||
|
# ${csync_HDRS}
|
||||||
|
# DESTINATION
|
||||||
|
# ${INCLUDE_INSTALL_DIR}/${APPLICATION_NAME}
|
||||||
|
# )
|
||||||
|
|
||||||
|
|||||||
+71
-10
@@ -25,7 +25,6 @@
|
|||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -90,11 +89,14 @@ static int _data_cmp(const void *key, const void *data) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void csync_create(CSYNC **csync, const char *local, const char *remote) {
|
int csync_create(CSYNC **csync, const char *local, const char *remote) {
|
||||||
CSYNC *ctx;
|
CSYNC *ctx;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
|
||||||
ctx = c_malloc(sizeof(CSYNC));
|
ctx = c_malloc(sizeof(CSYNC));
|
||||||
|
if (ctx == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
ctx->status_code = CSYNC_STATUS_OK;
|
ctx->status_code = CSYNC_STATUS_OK;
|
||||||
|
|
||||||
@@ -119,21 +121,46 @@ void csync_create(CSYNC **csync, const char *local, const char *remote) {
|
|||||||
ctx->ignore_hidden_files = true;
|
ctx->ignore_hidden_files = true;
|
||||||
|
|
||||||
*csync = ctx;
|
*csync = ctx;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void csync_init(CSYNC *ctx) {
|
int csync_init(CSYNC *ctx) {
|
||||||
assert(ctx);
|
int rc;
|
||||||
/* Do not initialize twice */
|
|
||||||
|
if (ctx == NULL) {
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
assert(!(ctx->status & CSYNC_STATUS_INIT));
|
|
||||||
ctx->status_code = CSYNC_STATUS_OK;
|
ctx->status_code = CSYNC_STATUS_OK;
|
||||||
|
|
||||||
|
/* Do not initialize twice */
|
||||||
|
if (ctx->status & CSYNC_STATUS_INIT) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for uri */
|
||||||
|
if (csync_fnmatch("owncloud://*", ctx->remote.uri, 0) == 0 && csync_fnmatch("ownclouds://*", ctx->remote.uri, 0) == 0) {
|
||||||
|
ctx->status_code = CSYNC_STATUS_NO_MODULE;
|
||||||
|
rc = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
ctx->local.type = LOCAL_REPLICA;
|
ctx->local.type = LOCAL_REPLICA;
|
||||||
|
|
||||||
ctx->remote.type = REMOTE_REPLICA;
|
ctx->remote.type = REMOTE_REPLICA;
|
||||||
|
|
||||||
c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp);
|
if (c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp) < 0) {
|
||||||
c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp);
|
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
||||||
|
rc = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp) < 0) {
|
||||||
|
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
||||||
|
rc = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
ctx->remote.root_perms = 0;
|
ctx->remote.root_perms = 0;
|
||||||
|
|
||||||
@@ -141,6 +168,11 @@ void csync_init(CSYNC *ctx) {
|
|||||||
|
|
||||||
/* initialize random generator */
|
/* initialize random generator */
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
|
|
||||||
|
rc = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int csync_update(CSYNC *ctx) {
|
int csync_update(CSYNC *ctx) {
|
||||||
@@ -387,6 +419,7 @@ static int _csync_treewalk_visitor(void *obj, void *data) {
|
|||||||
trav.inode = cur->inode;
|
trav.inode = cur->inode;
|
||||||
|
|
||||||
trav.error_status = cur->error_status;
|
trav.error_status = cur->error_status;
|
||||||
|
trav.should_update_metadata = cur->should_update_metadata;
|
||||||
trav.has_ignored_files = cur->has_ignored_files;
|
trav.has_ignored_files = cur->has_ignored_files;
|
||||||
trav.checksum = cur->checksum;
|
trav.checksum = cur->checksum;
|
||||||
trav.checksumTypeId = cur->checksumTypeId;
|
trav.checksumTypeId = cur->checksumTypeId;
|
||||||
@@ -547,17 +580,29 @@ int csync_commit(CSYNC *ctx) {
|
|||||||
ctx->remote.read_from_db = 0;
|
ctx->remote.read_from_db = 0;
|
||||||
ctx->read_remote_from_db = true;
|
ctx->read_remote_from_db = true;
|
||||||
ctx->db_is_empty = false;
|
ctx->db_is_empty = false;
|
||||||
|
ctx->ignore_hidden_files = true; // do NOT sync hidden files by default.
|
||||||
|
|
||||||
|
|
||||||
/* Create new trees */
|
/* Create new trees */
|
||||||
c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp);
|
rc = c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp);
|
||||||
c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp);
|
if (rc < 0) {
|
||||||
|
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp);
|
||||||
|
if (rc < 0) {
|
||||||
|
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ctx->status = CSYNC_STATUS_INIT;
|
ctx->status = CSYNC_STATUS_INIT;
|
||||||
SAFE_FREE(ctx->error_string);
|
SAFE_FREE(ctx->error_string);
|
||||||
|
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -577,6 +622,9 @@ int csync_destroy(CSYNC *ctx) {
|
|||||||
}
|
}
|
||||||
ctx->statedb.db = NULL;
|
ctx->statedb.db = NULL;
|
||||||
|
|
||||||
|
/* destroy exclude list */
|
||||||
|
csync_exclude_destroy(ctx);
|
||||||
|
|
||||||
_csync_clean_ctx(ctx);
|
_csync_clean_ctx(ctx);
|
||||||
|
|
||||||
SAFE_FREE(ctx->local.uri);
|
SAFE_FREE(ctx->local.uri);
|
||||||
@@ -592,6 +640,19 @@ int csync_destroy(CSYNC *ctx) {
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int csync_add_exclude_list(CSYNC *ctx, const char *path) {
|
||||||
|
if (ctx == NULL || path == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return csync_exclude_load(path, &ctx->excludes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void csync_clear_exclude_list(CSYNC *ctx)
|
||||||
|
{
|
||||||
|
csync_exclude_clear(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
void *csync_get_userdata(CSYNC *ctx) {
|
void *csync_get_userdata(CSYNC *ctx) {
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
+52
-33
@@ -98,7 +98,6 @@ enum csync_status_codes_e {
|
|||||||
CSYNC_STATUS_INDIVIDUAL_IS_SYMLINK,
|
CSYNC_STATUS_INDIVIDUAL_IS_SYMLINK,
|
||||||
CSYNC_STATUS_INDIVIDUAL_IGNORE_LIST,
|
CSYNC_STATUS_INDIVIDUAL_IGNORE_LIST,
|
||||||
CSYNC_STATUS_INDIVIDUAL_IS_INVALID_CHARS,
|
CSYNC_STATUS_INDIVIDUAL_IS_INVALID_CHARS,
|
||||||
CSYNC_STATUS_INDIVIDUAL_TRAILING_SPACE,
|
|
||||||
CSYNC_STATUS_INDIVIDUAL_EXCLUDE_LONG_FILENAME,
|
CSYNC_STATUS_INDIVIDUAL_EXCLUDE_LONG_FILENAME,
|
||||||
CYSNC_STATUS_FILE_LOCKED_OR_OPEN,
|
CYSNC_STATUS_FILE_LOCKED_OR_OPEN,
|
||||||
CSYNC_STATUS_INDIVIDUAL_EXCLUDE_HIDDEN,
|
CSYNC_STATUS_INDIVIDUAL_EXCLUDE_HIDDEN,
|
||||||
@@ -125,22 +124,17 @@ typedef enum csync_status_codes_e CSYNC_STATUS;
|
|||||||
* the csync state of a file.
|
* the csync state of a file.
|
||||||
*/
|
*/
|
||||||
enum csync_instructions_e {
|
enum csync_instructions_e {
|
||||||
CSYNC_INSTRUCTION_NONE = 0x00000000, /* Nothing to do (UPDATE|RECONCILE) */
|
CSYNC_INSTRUCTION_NONE = 0x00000000, /* Nothing to do (UPDATE|RECONCILE) */
|
||||||
CSYNC_INSTRUCTION_EVAL = 0x00000001, /* There was changed compared to the DB (UPDATE) */
|
CSYNC_INSTRUCTION_EVAL = 0x00000001, /* There was changed compared to the DB (UPDATE) */
|
||||||
CSYNC_INSTRUCTION_REMOVE = 0x00000002, /* The file need to be removed (RECONCILE) */
|
CSYNC_INSTRUCTION_REMOVE = 0x00000002, /* The file need to be removed (RECONCILE) */
|
||||||
CSYNC_INSTRUCTION_RENAME = 0x00000004, /* The file need to be renamed (RECONCILE) */
|
CSYNC_INSTRUCTION_RENAME = 0x00000004, /* The file need to be renamed (RECONCILE) */
|
||||||
CSYNC_INSTRUCTION_EVAL_RENAME = 0x00000800, /* The file is new, it is the destination of a rename (UPDATE) */
|
CSYNC_INSTRUCTION_EVAL_RENAME= 0x00000800, /* The file is new, it is the destination of a rename (UPDATE) */
|
||||||
CSYNC_INSTRUCTION_NEW = 0x00000008, /* The file is new compared to the db (UPDATE) */
|
CSYNC_INSTRUCTION_NEW = 0x00000008, /* The file is new compared to the db (UPDATE) */
|
||||||
CSYNC_INSTRUCTION_CONFLICT = 0x00000010, /* The file need to be downloaded because it is a conflict (RECONCILE) */
|
CSYNC_INSTRUCTION_CONFLICT = 0x00000010, /* The file need to be downloaded because it is a conflict (RECONCILE) */
|
||||||
CSYNC_INSTRUCTION_IGNORE = 0x00000020, /* The file is ignored (UPDATE|RECONCILE) */
|
CSYNC_INSTRUCTION_IGNORE = 0x00000020, /* The file is ignored (UPDATE|RECONCILE) */
|
||||||
CSYNC_INSTRUCTION_SYNC = 0x00000040, /* The file need to be pushed to the other remote (RECONCILE) */
|
CSYNC_INSTRUCTION_SYNC = 0x00000040, /* The file need to be pushed to the other remote (RECONCILE) */
|
||||||
CSYNC_INSTRUCTION_STAT_ERROR = 0x00000080,
|
CSYNC_INSTRUCTION_STAT_ERROR = 0x00000080,
|
||||||
CSYNC_INSTRUCTION_ERROR = 0x00000100,
|
CSYNC_INSTRUCTION_ERROR = 0x00000100
|
||||||
CSYNC_INSTRUCTION_TYPE_CHANGE = 0x00000200, /* Like NEW, but deletes the old entity first (RECONCILE)
|
|
||||||
Used when the type of something changes from directory to file
|
|
||||||
or back. */
|
|
||||||
CSYNC_INSTRUCTION_UPDATE_METADATA = 0x00000400, /* If the etag has been updated and need to be writen to the db,
|
|
||||||
but without any propagation (UPDATE|RECONCILE) */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum csync_ftw_type_e {
|
enum csync_ftw_type_e {
|
||||||
@@ -256,6 +250,9 @@ struct csync_tree_walk_file_s {
|
|||||||
enum csync_ftw_type_e type;
|
enum csync_ftw_type_e type;
|
||||||
enum csync_instructions_e instruction;
|
enum csync_instructions_e instruction;
|
||||||
|
|
||||||
|
/* For directories: If the etag has been updated and need to be writen on the db */
|
||||||
|
int should_update_metadata;
|
||||||
|
|
||||||
/* For directories: Does it have children that were ignored (hidden or ignore pattern) */
|
/* For directories: Does it have children that were ignored (hidden or ignore pattern) */
|
||||||
int has_ignored_files;
|
int has_ignored_files;
|
||||||
|
|
||||||
@@ -316,8 +313,10 @@ typedef const char* (*csync_checksum_hook) (
|
|||||||
* @brief Allocate a csync context.
|
* @brief Allocate a csync context.
|
||||||
*
|
*
|
||||||
* @param csync The context variable to allocate.
|
* @param csync The context variable to allocate.
|
||||||
|
*
|
||||||
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
void csync_create(CSYNC **csync, const char *local, const char *remote);
|
int csync_create(CSYNC **csync, const char *local, const char *remote);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize the file synchronizer.
|
* @brief Initialize the file synchronizer.
|
||||||
@@ -325,15 +324,17 @@ void csync_create(CSYNC **csync, const char *local, const char *remote);
|
|||||||
* This function loads the configuration
|
* This function loads the configuration
|
||||||
*
|
*
|
||||||
* @param ctx The context to initialize.
|
* @param ctx The context to initialize.
|
||||||
|
*
|
||||||
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
void csync_init(CSYNC *ctx);
|
int csync_init(CSYNC *ctx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Update detection
|
* @brief Update detection
|
||||||
*
|
*
|
||||||
* @param ctx The context to run the update detection on.
|
* @param ctx The context to run the update detection on.
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_update(CSYNC *ctx);
|
int csync_update(CSYNC *ctx);
|
||||||
|
|
||||||
@@ -342,7 +343,7 @@ int csync_update(CSYNC *ctx);
|
|||||||
*
|
*
|
||||||
* @param ctx The context to run the reconciliation on.
|
* @param ctx The context to run the reconciliation on.
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_reconcile(CSYNC *ctx);
|
int csync_reconcile(CSYNC *ctx);
|
||||||
|
|
||||||
@@ -351,7 +352,7 @@ int csync_reconcile(CSYNC *ctx);
|
|||||||
*
|
*
|
||||||
* @param ctx The context to commit.
|
* @param ctx The context to commit.
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_commit(CSYNC *ctx);
|
int csync_commit(CSYNC *ctx);
|
||||||
|
|
||||||
@@ -362,17 +363,35 @@ int csync_commit(CSYNC *ctx);
|
|||||||
*
|
*
|
||||||
* @param ctx The context to destroy.
|
* @param ctx The context to destroy.
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_destroy(CSYNC *ctx);
|
int csync_destroy(CSYNC *ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Add an additional exclude list.
|
||||||
|
*
|
||||||
|
* @param ctx The context to add the exclude list.
|
||||||
|
*
|
||||||
|
* @param path The path pointing to the file.
|
||||||
|
*
|
||||||
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
|
*/
|
||||||
|
int csync_add_exclude_list(CSYNC *ctx, const char *path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Removes all items imported from exclude lists.
|
||||||
|
*
|
||||||
|
* @param ctx The context to add the exclude list.
|
||||||
|
*/
|
||||||
|
void csync_clear_exclude_list(CSYNC *ctx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the userdata saved in the context.
|
* @brief Get the userdata saved in the context.
|
||||||
*
|
*
|
||||||
* @param ctx The csync context.
|
* @param ctx The csync context.
|
||||||
*
|
*
|
||||||
* @return The userdata saved in the context, NULL if an error
|
* @return The userdata saved in the context, NULL if an error
|
||||||
* occurred.
|
* occured.
|
||||||
*/
|
*/
|
||||||
void *csync_get_userdata(CSYNC *ctx);
|
void *csync_get_userdata(CSYNC *ctx);
|
||||||
|
|
||||||
@@ -384,7 +403,7 @@ void *csync_get_userdata(CSYNC *ctx);
|
|||||||
*
|
*
|
||||||
* @param userdata The userdata to be stored in the context.
|
* @param userdata The userdata to be stored in the context.
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_set_userdata(CSYNC *ctx, void *userdata);
|
int csync_set_userdata(CSYNC *ctx, void *userdata);
|
||||||
|
|
||||||
@@ -394,7 +413,7 @@ int csync_set_userdata(CSYNC *ctx, void *userdata);
|
|||||||
* @param ctx The csync context.
|
* @param ctx The csync context.
|
||||||
*
|
*
|
||||||
* @return The authentication callback set or NULL if an error
|
* @return The authentication callback set or NULL if an error
|
||||||
* occurred.
|
* occured.
|
||||||
*/
|
*/
|
||||||
csync_auth_callback csync_get_auth_callback(CSYNC *ctx);
|
csync_auth_callback csync_get_auth_callback(CSYNC *ctx);
|
||||||
|
|
||||||
@@ -405,7 +424,7 @@ csync_auth_callback csync_get_auth_callback(CSYNC *ctx);
|
|||||||
*
|
*
|
||||||
* @param cb The authentication callback.
|
* @param cb The authentication callback.
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_set_auth_callback(CSYNC *ctx, csync_auth_callback cb);
|
int csync_set_auth_callback(CSYNC *ctx, csync_auth_callback cb);
|
||||||
|
|
||||||
@@ -414,7 +433,7 @@ int csync_set_auth_callback(CSYNC *ctx, csync_auth_callback cb);
|
|||||||
*
|
*
|
||||||
* @param[in] level The log verbosity.
|
* @param[in] level The log verbosity.
|
||||||
*
|
*
|
||||||
* @return 0 on success, < 0 if an error occurred.
|
* @return 0 on success, < 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_set_log_level(int level);
|
int csync_set_log_level(int level);
|
||||||
|
|
||||||
@@ -429,7 +448,7 @@ int csync_get_log_level(void);
|
|||||||
* @brief Get the logging callback set.
|
* @brief Get the logging callback set.
|
||||||
*
|
*
|
||||||
* @return The logging callback set or NULL if an error
|
* @return The logging callback set or NULL if an error
|
||||||
* occurred.
|
* occured.
|
||||||
*/
|
*/
|
||||||
csync_log_callback csync_get_log_callback(void);
|
csync_log_callback csync_get_log_callback(void);
|
||||||
|
|
||||||
@@ -438,7 +457,7 @@ csync_log_callback csync_get_log_callback(void);
|
|||||||
*
|
*
|
||||||
* @param cb The logging callback.
|
* @param cb The logging callback.
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_set_log_callback(csync_log_callback cb);
|
int csync_set_log_callback(csync_log_callback cb);
|
||||||
|
|
||||||
@@ -454,7 +473,7 @@ void *csync_get_log_userdata(void);
|
|||||||
*
|
*
|
||||||
* @param[in] data The userdata to set.
|
* @param[in] data The userdata to set.
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_set_log_userdata(void *data);
|
int csync_set_log_userdata(void *data);
|
||||||
|
|
||||||
@@ -473,7 +492,7 @@ typedef int csync_treewalk_visit_func(TREE_WALK_FILE* ,void*);
|
|||||||
* @param visitor A callback function to handle the file info.
|
* @param visitor A callback function to handle the file info.
|
||||||
* @param filter A filter, built from or'ed csync_instructions_e
|
* @param filter A filter, built from or'ed csync_instructions_e
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_walk_local_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter);
|
int csync_walk_local_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter);
|
||||||
|
|
||||||
@@ -484,7 +503,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 visitor A callback function to handle the file info.
|
||||||
* @param filter A filter, built from and'ed csync_instructions_e
|
* @param filter A filter, built from and'ed csync_instructions_e
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int csync_walk_remote_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter);
|
int csync_walk_remote_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int filter);
|
||||||
|
|
||||||
|
|||||||
+23
-66
@@ -40,64 +40,13 @@
|
|||||||
#define CSYNC_LOG_CATEGORY_NAME "csync.exclude"
|
#define CSYNC_LOG_CATEGORY_NAME "csync.exclude"
|
||||||
#include "csync_log.h"
|
#include "csync_log.h"
|
||||||
|
|
||||||
#ifndef WITH_UNIT_TESTING
|
#ifndef NDEBUG
|
||||||
static
|
static
|
||||||
#endif
|
#endif
|
||||||
int _csync_exclude_add(c_strlist_t **inList, const char *string) {
|
int _csync_exclude_add(c_strlist_t **inList, const char *string) {
|
||||||
size_t i = 0;
|
|
||||||
|
|
||||||
// We never want duplicates, so check whether the string is already
|
|
||||||
// in the list first.
|
|
||||||
if (*inList) {
|
|
||||||
for (i = 0; i < (*inList)->count; ++i) {
|
|
||||||
char *pattern = (*inList)->vector[i];
|
|
||||||
if (c_streq(pattern, string)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return c_strlist_add_grow(inList, string);
|
return c_strlist_add_grow(inList, string);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Expands C-like escape sequences.
|
|
||||||
*
|
|
||||||
* The returned string is heap-allocated and owned by the caller.
|
|
||||||
*/
|
|
||||||
static const char *csync_exclude_expand_escapes(const char * input)
|
|
||||||
{
|
|
||||||
size_t i_len = strlen(input) + 1;
|
|
||||||
char *out = c_malloc(i_len); // out can only be shorter
|
|
||||||
|
|
||||||
size_t i = 0;
|
|
||||||
size_t o = 0;
|
|
||||||
for (; i < i_len; ++i) {
|
|
||||||
if (input[i] == '\\') {
|
|
||||||
// at worst input[i+1] is \0
|
|
||||||
switch (input[i+1]) {
|
|
||||||
case '\'': out[o++] = '\''; break;
|
|
||||||
case '"': out[o++] = '"'; break;
|
|
||||||
case '?': out[o++] = '?'; break;
|
|
||||||
case '\\': out[o++] = '\\'; break;
|
|
||||||
case 'a': out[o++] = '\a'; break;
|
|
||||||
case 'b': out[o++] = '\b'; break;
|
|
||||||
case 'f': out[o++] = '\f'; break;
|
|
||||||
case 'n': out[o++] = '\n'; break;
|
|
||||||
case 'r': out[o++] = '\r'; break;
|
|
||||||
case 't': out[o++] = '\t'; break;
|
|
||||||
case 'v': out[o++] = '\v'; break;
|
|
||||||
default:
|
|
||||||
out[o++] = input[i];
|
|
||||||
out[o++] = input[i+1];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
} else {
|
|
||||||
out[o++] = input[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
int csync_exclude_load(const char *fname, c_strlist_t **list) {
|
int csync_exclude_load(const char *fname, c_strlist_t **list) {
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -150,12 +99,8 @@ int csync_exclude_load(const char *fname, c_strlist_t **list) {
|
|||||||
if (entry != buf + i) {
|
if (entry != buf + i) {
|
||||||
buf[i] = '\0';
|
buf[i] = '\0';
|
||||||
if (*entry != '#') {
|
if (*entry != '#') {
|
||||||
const char *unescaped = csync_exclude_expand_escapes(entry);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Adding entry: %s", entry);
|
||||||
rc = _csync_exclude_add(list, unescaped);
|
rc = _csync_exclude_add(list, entry);
|
||||||
if( rc == 0 ) {
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Adding entry: %s", unescaped);
|
|
||||||
}
|
|
||||||
SAFE_FREE(unescaped);
|
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -172,6 +117,23 @@ out:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void csync_exclude_clear(CSYNC *ctx) {
|
||||||
|
c_strlist_clear(ctx->excludes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void csync_exclude_destroy(CSYNC *ctx) {
|
||||||
|
c_strlist_destroy(ctx->excludes);
|
||||||
|
}
|
||||||
|
|
||||||
|
CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
|
||||||
|
|
||||||
|
CSYNC_EXCLUDE_TYPE match = CSYNC_NOT_EXCLUDED;
|
||||||
|
|
||||||
|
match = csync_excluded_no_ctx( ctx->excludes, path, filetype );
|
||||||
|
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
// See http://support.microsoft.com/kb/74496 and
|
// See http://support.microsoft.com/kb/74496 and
|
||||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
|
||||||
// Additionally, we ignore '$Recycle.Bin', see https://github.com/owncloud/client/issues/2955
|
// Additionally, we ignore '$Recycle.Bin', see https://github.com/owncloud/client/issues/2955
|
||||||
@@ -243,14 +205,9 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(c_strlist_t *excludes, const ch
|
|||||||
// distinguish files ending in '.' from files without an ending,
|
// distinguish files ending in '.' from files without an ending,
|
||||||
// as '.' is a separator that is not stored internally, so let's
|
// as '.' is a separator that is not stored internally, so let's
|
||||||
// not allow to sync those to avoid file loss/ambiguities (#416)
|
// not allow to sync those to avoid file loss/ambiguities (#416)
|
||||||
if (blen > 1) {
|
if (blen > 1 && (bname[blen-1]== ' ' || bname[blen-1]== '.' )) {
|
||||||
if (bname[blen-1]== ' ') {
|
match = CSYNC_FILE_EXCLUDE_INVALID_CHAR;
|
||||||
match = CSYNC_FILE_EXCLUDE_TRAILING_SPACE;
|
goto out;
|
||||||
goto out;
|
|
||||||
} else if (bname[blen-1]== '.' ) {
|
|
||||||
match = CSYNC_FILE_EXCLUDE_INVALID_CHAR;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (csync_is_windows_reserved_word(bname)) {
|
if (csync_is_windows_reserved_word(bname)) {
|
||||||
|
|||||||
@@ -27,14 +27,13 @@ enum csync_exclude_type_e {
|
|||||||
CSYNC_FILE_EXCLUDE_AND_REMOVE,
|
CSYNC_FILE_EXCLUDE_AND_REMOVE,
|
||||||
CSYNC_FILE_EXCLUDE_LIST,
|
CSYNC_FILE_EXCLUDE_LIST,
|
||||||
CSYNC_FILE_EXCLUDE_INVALID_CHAR,
|
CSYNC_FILE_EXCLUDE_INVALID_CHAR,
|
||||||
CSYNC_FILE_EXCLUDE_TRAILING_SPACE,
|
|
||||||
CSYNC_FILE_EXCLUDE_LONG_FILENAME,
|
CSYNC_FILE_EXCLUDE_LONG_FILENAME,
|
||||||
CSYNC_FILE_EXCLUDE_HIDDEN,
|
CSYNC_FILE_EXCLUDE_HIDDEN,
|
||||||
CSYNC_FILE_EXCLUDE_STAT_FAILED
|
CSYNC_FILE_EXCLUDE_STAT_FAILED
|
||||||
};
|
};
|
||||||
typedef enum csync_exclude_type_e CSYNC_EXCLUDE_TYPE;
|
typedef enum csync_exclude_type_e CSYNC_EXCLUDE_TYPE;
|
||||||
|
|
||||||
#ifdef WITH_UNIT_TESTING
|
#ifdef NDEBUG
|
||||||
int _csync_exclude_add(c_strlist_t **inList, const char *string);
|
int _csync_exclude_add(c_strlist_t **inList, const char *string);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -44,10 +43,41 @@ int _csync_exclude_add(c_strlist_t **inList, const char *string);
|
|||||||
* @param ctx The context of the synchronizer.
|
* @param ctx The context of the synchronizer.
|
||||||
* @param fname The filename to load.
|
* @param fname The filename to load.
|
||||||
*
|
*
|
||||||
* @return 0 on success, -1 if an error occurred with errno set.
|
* @return 0 on success, -1 if an error occured with errno set.
|
||||||
*/
|
*/
|
||||||
int csync_exclude_load(const char *fname, c_strlist_t **list);
|
int csync_exclude_load(const char *fname, c_strlist_t **list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clear the exclude list in memory.
|
||||||
|
*
|
||||||
|
* @param ctx The synchronizer context.
|
||||||
|
*/
|
||||||
|
void csync_exclude_clear(CSYNC *ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destroy the exclude list in memory.
|
||||||
|
*
|
||||||
|
* @param ctx The synchronizer context.
|
||||||
|
*/
|
||||||
|
void csync_exclude_destroy(CSYNC *ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if the given path should be excluded.
|
||||||
|
*
|
||||||
|
* This excludes also paths which can't be used without unix extensions.
|
||||||
|
*
|
||||||
|
* The exclude list is checked against the full path, each component of
|
||||||
|
* the path and all leading directory strings, e.g.
|
||||||
|
* '/foo/bar/file' checks ('/foo/bar/file', 'foo', 'bar', 'file',
|
||||||
|
* '/foo/bar', '/foo').
|
||||||
|
*
|
||||||
|
* @param ctx The synchronizer context.
|
||||||
|
* @param path The patch to check.
|
||||||
|
*
|
||||||
|
* @return 2 if excluded and needs cleanup, 1 if excluded, 0 if not.
|
||||||
|
*/
|
||||||
|
CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Check if the given path should be excluded in a traversal situation.
|
* @brief Check if the given path should be excluded in a traversal situation.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
* than fmmatch anyway, which does not care for flags.
|
* than fmmatch anyway, which does not care for flags.
|
||||||
**/
|
**/
|
||||||
#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
|
#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
|
||||||
#define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int csync_fnmatch(__const char *__pattern, __const char *__name, int __flags);
|
int csync_fnmatch(__const char *__pattern, __const char *__name, int __flags);
|
||||||
|
|||||||
@@ -186,11 +186,13 @@ struct csync_file_stat_s {
|
|||||||
mode_t mode; /* u32 */
|
mode_t mode; /* u32 */
|
||||||
unsigned int type : 4;
|
unsigned int type : 4;
|
||||||
unsigned int child_modified : 1;
|
unsigned int child_modified : 1;
|
||||||
|
unsigned int should_update_metadata : 1; /*specify that the etag, or the remote perm or fileid has
|
||||||
|
changed and need to be updated on the db even for INSTRUCTION_NONE */
|
||||||
unsigned int has_ignored_files : 1; /* specify that a directory, or child directory contains ignored files */
|
unsigned int has_ignored_files : 1; /* specify that a directory, or child directory contains ignored files */
|
||||||
|
|
||||||
char *destpath; /* for renames */
|
char *destpath; /* for renames */
|
||||||
const char *etag;
|
const char *etag;
|
||||||
char file_id[FILE_ID_BUF_SIZE+1]; /* the ownCloud file id is fixed width in ownCloud. */
|
char file_id[FILE_ID_BUF_SIZE+1]; /* the ownCloud file id is fixed width of 21 byte. */
|
||||||
char *directDownloadUrl;
|
char *directDownloadUrl;
|
||||||
char *directDownloadCookies;
|
char *directDownloadCookies;
|
||||||
char remotePerm[REMOTE_PERM_BUF_SIZE+1];
|
char remotePerm[REMOTE_PERM_BUF_SIZE+1];
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
|
|
||||||
#include "config_csync.h"
|
#include "config_csync.h"
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include "csync_private.h"
|
#include "csync_private.h"
|
||||||
#include "csync_reconcile.h"
|
#include "csync_reconcile.h"
|
||||||
#include "csync_util.h"
|
#include "csync_util.h"
|
||||||
@@ -131,7 +130,6 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
break;
|
break;
|
||||||
/* file has been removed on the opposite replica */
|
/* file has been removed on the opposite replica */
|
||||||
case CSYNC_INSTRUCTION_NONE:
|
case CSYNC_INSTRUCTION_NONE:
|
||||||
case CSYNC_INSTRUCTION_UPDATE_METADATA:
|
|
||||||
if (cur->has_ignored_files) {
|
if (cur->has_ignored_files) {
|
||||||
/* Do not remove a directory that has ignored files */
|
/* Do not remove a directory that has ignored files */
|
||||||
break;
|
break;
|
||||||
@@ -183,8 +181,13 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
|
|
||||||
if(!other) {
|
if(!other) {
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NEW;
|
cur->instruction = CSYNC_INSTRUCTION_NEW;
|
||||||
|
if (cur->type == CSYNC_FTW_TYPE_DIR) {
|
||||||
|
// For new directories we always want to update the etag once
|
||||||
|
// the directory has been propagated. Otherwise the directory
|
||||||
|
// could appear locally without being added to the database.
|
||||||
|
cur->should_update_metadata = true;
|
||||||
|
}
|
||||||
} else if (other->instruction == CSYNC_INSTRUCTION_NONE
|
} else if (other->instruction == CSYNC_INSTRUCTION_NONE
|
||||||
|| other->instruction == CSYNC_INSTRUCTION_UPDATE_METADATA
|
|
||||||
|| cur->type == CSYNC_FTW_TYPE_DIR) {
|
|| cur->type == CSYNC_FTW_TYPE_DIR) {
|
||||||
other->instruction = CSYNC_INSTRUCTION_RENAME;
|
other->instruction = CSYNC_INSTRUCTION_RENAME;
|
||||||
other->destpath = c_strdup( cur->path );
|
other->destpath = c_strdup( cur->path );
|
||||||
@@ -192,6 +195,7 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
csync_vio_set_file_id( other->file_id, cur->file_id );
|
csync_vio_set_file_id( other->file_id, cur->file_id );
|
||||||
}
|
}
|
||||||
other->inode = cur->inode;
|
other->inode = cur->inode;
|
||||||
|
other->should_update_metadata = true;
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
} else if (other->instruction == CSYNC_INSTRUCTION_REMOVE) {
|
} else if (other->instruction == CSYNC_INSTRUCTION_REMOVE) {
|
||||||
other->instruction = CSYNC_INSTRUCTION_RENAME;
|
other->instruction = CSYNC_INSTRUCTION_RENAME;
|
||||||
@@ -201,12 +205,12 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
csync_vio_set_file_id( other->file_id, cur->file_id );
|
csync_vio_set_file_id( other->file_id, cur->file_id );
|
||||||
}
|
}
|
||||||
other->inode = cur->inode;
|
other->inode = cur->inode;
|
||||||
|
other->should_update_metadata = true;
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
} else if (other->instruction == CSYNC_INSTRUCTION_NEW) {
|
} else if (other->instruction == CSYNC_INSTRUCTION_NEW) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO=> NEW detected in other tree!");
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO=> NEW detected in other tree!");
|
||||||
cur->instruction = CSYNC_INSTRUCTION_CONFLICT;
|
cur->instruction = CSYNC_INSTRUCTION_CONFLICT;
|
||||||
} else {
|
} else {
|
||||||
assert(other->type != CSYNC_FTW_TYPE_DIR);
|
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
other->instruction = CSYNC_INSTRUCTION_SYNC;
|
other->instruction = CSYNC_INSTRUCTION_SYNC;
|
||||||
}
|
}
|
||||||
@@ -218,19 +222,13 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bool is_conflict = true;
|
bool is_equal_files = false;
|
||||||
/*
|
/*
|
||||||
* file found on the other replica
|
* file found on the other replica
|
||||||
*/
|
*/
|
||||||
other = (csync_file_stat_t *) node->data;
|
other = (csync_file_stat_t *) node->data;
|
||||||
|
|
||||||
switch (cur->instruction) {
|
switch (cur->instruction) {
|
||||||
case CSYNC_INSTRUCTION_UPDATE_METADATA:
|
|
||||||
if (other->instruction == CSYNC_INSTRUCTION_UPDATE_METADATA && ctx->current == LOCAL_REPLICA) {
|
|
||||||
// Remote wins, the SyncEngine will pick relevant local metadata since the remote tree is walked last.
|
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case CSYNC_INSTRUCTION_EVAL_RENAME:
|
case CSYNC_INSTRUCTION_EVAL_RENAME:
|
||||||
/* If the file already exist on the other side, we have a conflict.
|
/* If the file already exist on the other side, we have a conflict.
|
||||||
Abort the rename and consider it is a new file. */
|
Abort the rename and consider it is a new file. */
|
||||||
@@ -255,40 +253,37 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
case CSYNC_INSTRUCTION_EVAL:
|
case CSYNC_INSTRUCTION_EVAL:
|
||||||
if (other->type == CSYNC_FTW_TYPE_DIR &&
|
if (other->type == CSYNC_FTW_TYPE_DIR &&
|
||||||
cur->type == CSYNC_FTW_TYPE_DIR) {
|
cur->type == CSYNC_FTW_TYPE_DIR) {
|
||||||
// Folders of the same path are always considered equals
|
is_equal_files = (other->modtime == cur->modtime);
|
||||||
is_conflict = false;
|
|
||||||
} else {
|
} else {
|
||||||
is_conflict = ((other->size != cur->size) || (other->modtime != cur->modtime));
|
is_equal_files = ((other->size == cur->size) && (other->modtime == cur->modtime));
|
||||||
// FIXME: do a binary comparision of the file here because of the following
|
// FIXME: do a binary comparision of the file here because of the following
|
||||||
// edge case:
|
// edge case:
|
||||||
// The files could still have different content, even though the mtime
|
// The files could still have different content, even though the mtime
|
||||||
// and size are the same.
|
// and size are the same.
|
||||||
}
|
}
|
||||||
if (ctx->current == REMOTE_REPLICA) {
|
if (is_equal_files) {
|
||||||
// If the files are considered equal, only update the DB with the etag from remote
|
/* The files are considered equal. */
|
||||||
cur->instruction = is_conflict ? CSYNC_INSTRUCTION_CONFLICT : CSYNC_INSTRUCTION_UPDATE_METADATA;
|
|
||||||
other->instruction = CSYNC_INSTRUCTION_NONE;
|
|
||||||
} else {
|
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
other->instruction = is_conflict ? CSYNC_INSTRUCTION_CONFLICT : CSYNC_INSTRUCTION_UPDATE_METADATA;
|
other->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
|
|
||||||
|
/* update DB with new etag from remote */
|
||||||
|
if (ctx->current == LOCAL_REPLICA) {
|
||||||
|
other->should_update_metadata = true;
|
||||||
|
} else {
|
||||||
|
cur->should_update_metadata = true;
|
||||||
|
}
|
||||||
|
} else if(ctx->current == REMOTE_REPLICA) {
|
||||||
|
cur->instruction = CSYNC_INSTRUCTION_CONFLICT;
|
||||||
|
other->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
|
} else {
|
||||||
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
|
other->instruction = CSYNC_INSTRUCTION_CONFLICT;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
/* file on the other replica has not been modified */
|
/* file on the other replica has not been modified */
|
||||||
case CSYNC_INSTRUCTION_NONE:
|
case CSYNC_INSTRUCTION_NONE:
|
||||||
case CSYNC_INSTRUCTION_UPDATE_METADATA:
|
cur->instruction = CSYNC_INSTRUCTION_SYNC;
|
||||||
if (cur->type != other->type) {
|
|
||||||
// If the type of the entity changed, it's like NEW, but
|
|
||||||
// needs to delete the other entity first.
|
|
||||||
cur->instruction = CSYNC_INSTRUCTION_TYPE_CHANGE;
|
|
||||||
other->instruction = CSYNC_INSTRUCTION_NONE;
|
|
||||||
} else if (cur->type == CSYNC_FTW_TYPE_DIR) {
|
|
||||||
cur->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
|
||||||
other->instruction = CSYNC_INSTRUCTION_NONE;
|
|
||||||
} else {
|
|
||||||
cur->instruction = CSYNC_INSTRUCTION_SYNC;
|
|
||||||
other->instruction = CSYNC_INSTRUCTION_NONE;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case CSYNC_INSTRUCTION_IGNORE:
|
case CSYNC_INSTRUCTION_IGNORE:
|
||||||
cur->instruction = CSYNC_INSTRUCTION_IGNORE;
|
cur->instruction = CSYNC_INSTRUCTION_IGNORE;
|
||||||
@@ -309,7 +304,7 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
if(cur->type == CSYNC_FTW_TYPE_DIR)
|
if(cur->type == CSYNC_FTW_TYPE_DIR)
|
||||||
{
|
{
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,
|
||||||
"%-30s %s dir: %s",
|
"%-20s %s dir: %s",
|
||||||
csync_instruction_str(cur->instruction),
|
csync_instruction_str(cur->instruction),
|
||||||
repo,
|
repo,
|
||||||
cur->path);
|
cur->path);
|
||||||
@@ -317,7 +312,7 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,
|
||||||
"%-30s %s file: %s",
|
"%-20s %s file: %s",
|
||||||
csync_instruction_str(cur->instruction),
|
csync_instruction_str(cur->instruction),
|
||||||
repo,
|
repo,
|
||||||
cur->path);
|
cur->path);
|
||||||
@@ -328,7 +323,7 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
if(cur->type == CSYNC_FTW_TYPE_DIR)
|
if(cur->type == CSYNC_FTW_TYPE_DIR)
|
||||||
{
|
{
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG,
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG,
|
||||||
"%-30s %s dir: %s",
|
"%-20s %s dir: %s",
|
||||||
csync_instruction_str(cur->instruction),
|
csync_instruction_str(cur->instruction),
|
||||||
repo,
|
repo,
|
||||||
cur->path);
|
cur->path);
|
||||||
@@ -336,7 +331,7 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG,
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG,
|
||||||
"%-30s %s file: %s",
|
"%-20s %s file: %s",
|
||||||
csync_instruction_str(cur->instruction),
|
csync_instruction_str(cur->instruction),
|
||||||
repo,
|
repo,
|
||||||
cur->path);
|
cur->path);
|
||||||
|
|||||||
@@ -472,7 +472,7 @@ int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
|
|||||||
|
|
||||||
if (excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE
|
if (excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE
|
||||||
|| excluded == CSYNC_FILE_SILENTLY_EXCLUDED) {
|
|| excluded == CSYNC_FILE_SILENTLY_EXCLUDED) {
|
||||||
csync_file_stat_free(st);
|
SAFE_FREE(st);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,7 +481,7 @@ int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
|
|||||||
|
|
||||||
/* store into result list. */
|
/* store into result list. */
|
||||||
if (c_rbtree_insert(ctx->remote.tree, (void *) st) < 0) {
|
if (c_rbtree_insert(ctx->remote.tree, (void *) st) < 0) {
|
||||||
csync_file_stat_free(st);
|
SAFE_FREE(st);
|
||||||
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ int csync_get_statedb_exists(CSYNC *ctx);
|
|||||||
* @param ctx The csync context.
|
* @param ctx The csync context.
|
||||||
* @param statedb Path to the statedb file (sqlite3 db).
|
* @param statedb Path to the statedb file (sqlite3 db).
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred with errno set.
|
* @return 0 on success, less than 0 if an error occured with errno set.
|
||||||
*/
|
*/
|
||||||
int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb);
|
int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb);
|
||||||
|
|
||||||
|
|||||||
+66
-117
@@ -106,42 +106,6 @@ static bool _last_db_return_error(CSYNC* ctx) {
|
|||||||
return ctx->statedb.lastReturnValue != SQLITE_OK && ctx->statedb.lastReturnValue != SQLITE_DONE && ctx->statedb.lastReturnValue != SQLITE_ROW;
|
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
|
/* 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
|
* We consider mtime that are one hour difference to be equal if they are one hour appart
|
||||||
@@ -245,9 +209,33 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
st->etag = NULL;
|
st->etag = NULL;
|
||||||
st->child_modified = 0;
|
st->child_modified = 0;
|
||||||
st->has_ignored_files = 0;
|
st->has_ignored_files = 0;
|
||||||
|
|
||||||
|
/* FIXME: Under which conditions are the following two ifs true and the code
|
||||||
|
* is executed? */
|
||||||
if (type == CSYNC_FTW_TYPE_FILE ) {
|
if (type == CSYNC_FTW_TYPE_FILE ) {
|
||||||
if (fs->mtime == 0) {
|
if (fs->mtime == 0) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - mtime is zero!", path);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - mtime is zero!", path);
|
||||||
|
|
||||||
|
tmp = csync_statedb_get_stat_by_hash(ctx, h);
|
||||||
|
if(_last_db_return_error(ctx)) {
|
||||||
|
SAFE_FREE(st);
|
||||||
|
SAFE_FREE(tmp);
|
||||||
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tmp == NULL) {
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - not found in db, IGNORE!", path);
|
||||||
|
st->instruction = CSYNC_INSTRUCTION_IGNORE;
|
||||||
|
} else {
|
||||||
|
SAFE_FREE(st);
|
||||||
|
st = tmp;
|
||||||
|
st->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - tmp non zero, mtime %lu", path, st->modtime );
|
||||||
|
tmp = NULL;
|
||||||
|
}
|
||||||
|
goto fastout; /* Skip copying of the etag. That's an important difference to upstream
|
||||||
|
* without etags. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,8 +257,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
tmp = csync_statedb_get_stat_by_hash(ctx, h);
|
tmp = csync_statedb_get_stat_by_hash(ctx, h);
|
||||||
|
|
||||||
if(_last_db_return_error(ctx)) {
|
if(_last_db_return_error(ctx)) {
|
||||||
csync_file_stat_free(st);
|
SAFE_FREE(st);
|
||||||
csync_file_stat_free(tmp);
|
|
||||||
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -285,12 +272,6 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
(uint64_t) fs->size, (uint64_t) tmp->size, fs->remotePerm, tmp->remotePerm, tmp->has_ignored_files );
|
(uint64_t) fs->size, (uint64_t) tmp->size, fs->remotePerm, tmp->remotePerm, tmp->has_ignored_files );
|
||||||
if (ctx->current == REMOTE_REPLICA && !c_streq(fs->etag, tmp->etag)) {
|
if (ctx->current == REMOTE_REPLICA && !c_streq(fs->etag, tmp->etag)) {
|
||||||
st->instruction = CSYNC_INSTRUCTION_EVAL;
|
st->instruction = CSYNC_INSTRUCTION_EVAL;
|
||||||
|
|
||||||
// Preserve the EVAL flag later on if the type has changed.
|
|
||||||
if (_csync_filetype_different(tmp, fs)) {
|
|
||||||
st->child_modified = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (ctx->current == LOCAL_REPLICA &&
|
if (ctx->current == LOCAL_REPLICA &&
|
||||||
@@ -298,10 +279,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
// zero size in statedb can happen during migration
|
// zero size in statedb can happen during migration
|
||||||
|| (tmp->size != 0 && fs->size != tmp->size))) {
|
|| (tmp->size != 0 && fs->size != tmp->size))) {
|
||||||
|
|
||||||
// Checksum comparison at this stage is only enabled for .eml files,
|
if (fs->size == tmp->size && tmp->checksumTypeId) {
|
||||||
// check #4754 #4755
|
|
||||||
bool isEmlFile = csync_fnmatch("*.eml", file, FNM_CASEFOLD) == 0;
|
|
||||||
if (isEmlFile && fs->size == tmp->size && tmp->checksumTypeId) {
|
|
||||||
if (ctx->callbacks.checksum_hook) {
|
if (ctx->callbacks.checksum_hook) {
|
||||||
st->checksum = ctx->callbacks.checksum_hook(
|
st->checksum = ctx->callbacks.checksum_hook(
|
||||||
file, tmp->checksumTypeId,
|
file, tmp->checksumTypeId,
|
||||||
@@ -313,17 +291,11 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
checksumIdentical = strncmp(st->checksum, tmp->checksum, 1000) == 0;
|
checksumIdentical = strncmp(st->checksum, tmp->checksum, 1000) == 0;
|
||||||
}
|
}
|
||||||
if (checksumIdentical) {
|
if (checksumIdentical) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "NOTE: Checksums are identical, file did not actually change: %s", path);
|
st->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
st->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
st->should_update_metadata = true;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Preserve the EVAL flag later on if the type has changed.
|
|
||||||
if (_csync_filetype_different(tmp, fs)) {
|
|
||||||
st->child_modified = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
st->instruction = CSYNC_INSTRUCTION_EVAL;
|
st->instruction = CSYNC_INSTRUCTION_EVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -340,24 +312,23 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Reading from database: %s", path);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Reading from database: %s", path);
|
||||||
ctx->remote.read_from_db = true;
|
ctx->remote.read_from_db = true;
|
||||||
}
|
}
|
||||||
|
if (metadata_differ) {
|
||||||
|
/* file id or permissions has changed. Which means we need to update them in the DB. */
|
||||||
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Need to update metadata for: %s", path);
|
||||||
|
st->should_update_metadata = true;
|
||||||
|
}
|
||||||
/* If it was remembered in the db that the remote dir has ignored files, store
|
/* If it was remembered in the db that the remote dir has ignored files, store
|
||||||
* that so that the reconciler can make advantage of.
|
* that so that the reconciler can make advantage of.
|
||||||
*/
|
*/
|
||||||
if( ctx->current == REMOTE_REPLICA ) {
|
if( ctx->current == REMOTE_REPLICA ) {
|
||||||
st->has_ignored_files = tmp->has_ignored_files;
|
st->has_ignored_files = tmp->has_ignored_files;
|
||||||
}
|
}
|
||||||
if (metadata_differ) {
|
st->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
/* file id or permissions has changed. Which means we need to update them in the DB. */
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Need to update metadata for: %s", path);
|
|
||||||
st->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
|
||||||
} else {
|
|
||||||
st->instruction = CSYNC_INSTRUCTION_NONE;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
enum csync_vio_file_type_e tmp_vio_type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
|
enum csync_vio_file_type_e tmp_vio_type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
|
||||||
|
|
||||||
/* tmp might point to malloc mem, so free it here before reusing tmp */
|
/* tmp might point to malloc mem, so free it here before reusing tmp */
|
||||||
csync_file_stat_free(tmp);
|
SAFE_FREE(tmp);
|
||||||
|
|
||||||
/* check if it's a file and has been renamed */
|
/* check if it's a file and has been renamed */
|
||||||
if (ctx->current == LOCAL_REPLICA) {
|
if (ctx->current == LOCAL_REPLICA) {
|
||||||
@@ -366,68 +337,50 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode);
|
tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode);
|
||||||
|
|
||||||
if(_last_db_return_error(ctx)) {
|
if(_last_db_return_error(ctx)) {
|
||||||
csync_file_stat_free(st);
|
SAFE_FREE(st);
|
||||||
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* translate the file type between the two stat types csync has. */
|
/* translate the file type between the two stat types csync has. */
|
||||||
if( tmp && tmp->type == CSYNC_FTW_TYPE_FILE ) {
|
if( tmp && tmp->type == 0 ) {
|
||||||
tmp_vio_type = CSYNC_VIO_FILE_TYPE_REGULAR;
|
tmp_vio_type = CSYNC_VIO_FILE_TYPE_REGULAR;
|
||||||
} else if( tmp && tmp->type == CSYNC_FTW_TYPE_DIR) {
|
} else if( tmp && tmp->type == 2 ) {
|
||||||
tmp_vio_type = CSYNC_VIO_FILE_TYPE_DIRECTORY;
|
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 {
|
} else {
|
||||||
tmp_vio_type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
|
tmp_vio_type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default to NEW unless we're sure it's a rename.
|
if (tmp && tmp->inode == fs->inode && tmp_vio_type == fs->type
|
||||||
st->instruction = CSYNC_INSTRUCTION_NEW;
|
|
||||||
|
|
||||||
bool isRename =
|
|
||||||
tmp && tmp->inode == fs->inode && tmp_vio_type == fs->type
|
|
||||||
&& (tmp->modtime == fs->mtime || fs->type == CSYNC_VIO_FILE_TYPE_DIRECTORY)
|
&& (tmp->modtime == fs->mtime || fs->type == CSYNC_VIO_FILE_TYPE_DIRECTORY)
|
||||||
#ifdef NO_RENAME_EXTENSION
|
#ifdef NO_RENAME_EXTENSION
|
||||||
&& _csync_sameextension(tmp->path, path)
|
&& _csync_sameextension(tmp->path, path)
|
||||||
#endif
|
#endif
|
||||||
;
|
) {
|
||||||
|
|
||||||
|
|
||||||
// Verify the checksum where possible
|
|
||||||
if (isRename && tmp->checksumTypeId && ctx->callbacks.checksum_hook
|
|
||||||
&& fs->type == CSYNC_VIO_FILE_TYPE_REGULAR) {
|
|
||||||
st->checksum = ctx->callbacks.checksum_hook(
|
|
||||||
file, tmp->checksumTypeId,
|
|
||||||
ctx->callbacks.checksum_userdata);
|
|
||||||
if (st->checksum) {
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "checking checksum of potential rename %s %s <-> %s", path, st->checksum, tmp->checksum);
|
|
||||||
st->checksumTypeId = tmp->checksumTypeId;
|
|
||||||
isRename = strncmp(st->checksum, tmp->checksum, 1000) == 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isRename) {
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "pot rename detected based on inode # %" PRId64 "", (uint64_t) fs->inode);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "pot rename detected based on inode # %" PRId64 "", (uint64_t) fs->inode);
|
||||||
/* inode found so the file has been renamed */
|
/* inode found so the file has been renamed */
|
||||||
st->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
st->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
||||||
if (fs->type == CSYNC_VIO_FILE_TYPE_DIRECTORY) {
|
if (fs->type == CSYNC_VIO_FILE_TYPE_DIRECTORY) {
|
||||||
csync_rename_record(ctx, tmp->path, path);
|
csync_rename_record(ctx, tmp->path, path);
|
||||||
}
|
}
|
||||||
|
goto out;
|
||||||
|
} else {
|
||||||
|
/* file not found in statedb */
|
||||||
|
st->instruction = CSYNC_INSTRUCTION_NEW;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
goto out;
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* Remote Replica Rename check */
|
/* Remote Replica Rename check */
|
||||||
tmp = csync_statedb_get_stat_by_file_id(ctx, fs->file_id);
|
tmp = csync_statedb_get_stat_by_file_id(ctx, fs->file_id);
|
||||||
|
|
||||||
if(_last_db_return_error(ctx)) {
|
if(_last_db_return_error(ctx)) {
|
||||||
csync_file_stat_free(st);
|
SAFE_FREE(st);
|
||||||
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(tmp ) { /* tmp existing at all */
|
if(tmp ) { /* tmp existing at all */
|
||||||
if ( _csync_filetype_different(tmp, fs)) {
|
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)) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "WARN: file types different is not!");
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "WARN: file types different is not!");
|
||||||
st->instruction = CSYNC_INSTRUCTION_NEW;
|
st->instruction = CSYNC_INSTRUCTION_NEW;
|
||||||
goto out;
|
goto out;
|
||||||
@@ -451,7 +404,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
|
|
||||||
if (fs->type == CSYNC_VIO_FILE_TYPE_DIRECTORY && ctx->current == REMOTE_REPLICA && ctx->callbacks.checkSelectiveSyncNewFolderHook) {
|
if (fs->type == CSYNC_VIO_FILE_TYPE_DIRECTORY && ctx->current == REMOTE_REPLICA && ctx->callbacks.checkSelectiveSyncNewFolderHook) {
|
||||||
if (ctx->callbacks.checkSelectiveSyncNewFolderHook(ctx->callbacks.update_callback_userdata, path)) {
|
if (ctx->callbacks.checkSelectiveSyncNewFolderHook(ctx->callbacks.update_callback_userdata, path)) {
|
||||||
csync_file_stat_free(st);
|
SAFE_FREE(st);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -461,7 +414,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Unable to open statedb" );
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Unable to open statedb" );
|
||||||
csync_file_stat_free(st);
|
SAFE_FREE(st);
|
||||||
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -477,8 +430,6 @@ out:
|
|||||||
st->error_status = CSYNC_STATUS_INDIVIDUAL_IGNORE_LIST; /* File listed on ignore list. */
|
st->error_status = CSYNC_STATUS_INDIVIDUAL_IGNORE_LIST; /* File listed on ignore list. */
|
||||||
} else if (excluded == CSYNC_FILE_EXCLUDE_INVALID_CHAR) {
|
} else if (excluded == CSYNC_FILE_EXCLUDE_INVALID_CHAR) {
|
||||||
st->error_status = CSYNC_STATUS_INDIVIDUAL_IS_INVALID_CHARS; /* File contains invalid characters. */
|
st->error_status = CSYNC_STATUS_INDIVIDUAL_IS_INVALID_CHARS; /* File contains invalid characters. */
|
||||||
} else if (excluded == CSYNC_FILE_EXCLUDE_TRAILING_SPACE) {
|
|
||||||
st->error_status = CSYNC_STATUS_INDIVIDUAL_TRAILING_SPACE; /* File ends with a trailing space. */
|
|
||||||
} else if (excluded == CSYNC_FILE_EXCLUDE_LONG_FILENAME) {
|
} else if (excluded == CSYNC_FILE_EXCLUDE_LONG_FILENAME) {
|
||||||
st->error_status = CSYNC_STATUS_INDIVIDUAL_EXCLUDE_LONG_FILENAME; /* File name is too long. */
|
st->error_status = CSYNC_STATUS_INDIVIDUAL_EXCLUDE_LONG_FILENAME; /* File name is too long. */
|
||||||
} else if (excluded == CSYNC_FILE_EXCLUDE_HIDDEN ) {
|
} else if (excluded == CSYNC_FILE_EXCLUDE_HIDDEN ) {
|
||||||
@@ -488,9 +439,7 @@ out:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (st->instruction != CSYNC_INSTRUCTION_NONE
|
if (st->instruction != CSYNC_INSTRUCTION_NONE && st->instruction != CSYNC_INSTRUCTION_IGNORE
|
||||||
&& st->instruction != CSYNC_INSTRUCTION_IGNORE
|
|
||||||
&& st->instruction != CSYNC_INSTRUCTION_UPDATE_METADATA
|
|
||||||
&& type != CSYNC_FTW_TYPE_DIR) {
|
&& type != CSYNC_FTW_TYPE_DIR) {
|
||||||
st->child_modified = 1;
|
st->child_modified = 1;
|
||||||
}
|
}
|
||||||
@@ -520,6 +469,7 @@ out:
|
|||||||
strncpy(st->remotePerm, fs->remotePerm, REMOTE_PERM_BUF_SIZE);
|
strncpy(st->remotePerm, fs->remotePerm, REMOTE_PERM_BUF_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fastout: /* target if the file information is read from database into st */
|
||||||
st->phash = h;
|
st->phash = h;
|
||||||
st->pathlen = len;
|
st->pathlen = len;
|
||||||
memcpy(st->path, (len ? path : ""), len + 1);
|
memcpy(st->path, (len ? path : ""), len + 1);
|
||||||
@@ -527,14 +477,14 @@ out:
|
|||||||
switch (ctx->current) {
|
switch (ctx->current) {
|
||||||
case LOCAL_REPLICA:
|
case LOCAL_REPLICA:
|
||||||
if (c_rbtree_insert(ctx->local.tree, (void *) st) < 0) {
|
if (c_rbtree_insert(ctx->local.tree, (void *) st) < 0) {
|
||||||
csync_file_stat_free(st);
|
SAFE_FREE(st);
|
||||||
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case REMOTE_REPLICA:
|
case REMOTE_REPLICA:
|
||||||
if (c_rbtree_insert(ctx->remote.tree, (void *) st) < 0) {
|
if (c_rbtree_insert(ctx->remote.tree, (void *) st) < 0) {
|
||||||
csync_file_stat_free(st);
|
SAFE_FREE(st);
|
||||||
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -564,11 +514,7 @@ int csync_walker(CSYNC *ctx, const char *file, const csync_vio_file_stat_t *fs,
|
|||||||
switch (flag) {
|
switch (flag) {
|
||||||
case CSYNC_FTW_FLAG_FILE:
|
case CSYNC_FTW_FLAG_FILE:
|
||||||
if (ctx->current == REMOTE_REPLICA) {
|
if (ctx->current == REMOTE_REPLICA) {
|
||||||
if (fs->fields & CSYNC_VIO_FILE_STAT_FIELDS_SIZE) {
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [file_id=%s size=%" PRIu64 "]", file, fs->file_id, fs->size);
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [file_id=%s size=%" PRIu64 "]", file, fs->file_id, fs->size);
|
|
||||||
} else {
|
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [file_id=%s size=UNKNOWN]", file, fs->file_id);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [inode=%" PRIu64 " size=%" PRIu64 "]", file, fs->inode, fs->size);
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [inode=%" PRIu64 " size=%" PRIu64 "]", file, fs->inode, fs->size);
|
||||||
}
|
}
|
||||||
@@ -825,9 +771,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
* local stat function.
|
* local stat function.
|
||||||
*/
|
*/
|
||||||
if( d_name[0] == '.' ) {
|
if( d_name[0] == '.' ) {
|
||||||
if (strcmp(".sys.admin#recall#", d_name) != 0) { /* recall file shall not be ignored (#4420) */
|
dirent->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN;
|
||||||
dirent->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( res == 0) {
|
if( res == 0) {
|
||||||
@@ -879,11 +823,10 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
|
|
||||||
if (ctx->current_fs && !ctx->current_fs->child_modified
|
if (ctx->current_fs && !ctx->current_fs->child_modified
|
||||||
&& ctx->current_fs->instruction == CSYNC_INSTRUCTION_EVAL) {
|
&& ctx->current_fs->instruction == CSYNC_INSTRUCTION_EVAL) {
|
||||||
if (ctx->current == REMOTE_REPLICA) {
|
ctx->current_fs->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
ctx->current_fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
if (ctx->current == REMOTE_REPLICA) {
|
||||||
} else {
|
ctx->current_fs->should_update_metadata = true;
|
||||||
ctx->current_fs->instruction = CSYNC_INSTRUCTION_NONE;
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->current_fs && previous_fs && ctx->current_fs->has_ignored_files) {
|
if (ctx->current_fs && previous_fs && ctx->current_fs->has_ignored_files) {
|
||||||
@@ -897,6 +840,12 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
previous_fs->child_modified = ctx->current_fs->child_modified;
|
previous_fs->child_modified = ctx->current_fs->child_modified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flag == CSYNC_FTW_FLAG_DIR && ctx->current_fs
|
||||||
|
&& (ctx->current_fs->instruction == CSYNC_INSTRUCTION_EVAL ||
|
||||||
|
ctx->current_fs->instruction == CSYNC_INSTRUCTION_NEW)) {
|
||||||
|
ctx->current_fs->should_update_metadata = true;
|
||||||
|
}
|
||||||
|
|
||||||
ctx->current_fs = previous_fs;
|
ctx->current_fs = previous_fs;
|
||||||
ctx->remote.read_from_db = read_from_db;
|
ctx->remote.read_from_db = read_from_db;
|
||||||
SAFE_FREE(filename);
|
SAFE_FREE(filename);
|
||||||
|
|||||||
@@ -55,8 +55,6 @@ static const _instr_code_struct _instr[] =
|
|||||||
{ "INSTRUCTION_SYNC", CSYNC_INSTRUCTION_SYNC },
|
{ "INSTRUCTION_SYNC", CSYNC_INSTRUCTION_SYNC },
|
||||||
{ "INSTRUCTION_STAT_ERR", CSYNC_INSTRUCTION_STAT_ERROR },
|
{ "INSTRUCTION_STAT_ERR", CSYNC_INSTRUCTION_STAT_ERROR },
|
||||||
{ "INSTRUCTION_ERROR", CSYNC_INSTRUCTION_ERROR },
|
{ "INSTRUCTION_ERROR", CSYNC_INSTRUCTION_ERROR },
|
||||||
{ "INSTRUCTION_TYPE_CHANGE", CSYNC_INSTRUCTION_TYPE_CHANGE },
|
|
||||||
{ "INSTRUCTION_UPDATE_METADATA", CSYNC_INSTRUCTION_UPDATE_METADATA },
|
|
||||||
{ NULL, CSYNC_INSTRUCTION_ERROR }
|
{ NULL, CSYNC_INSTRUCTION_ERROR }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -38,13 +38,14 @@
|
|||||||
#define NIL &_sentinel /* all leafs are sentinels */
|
#define NIL &_sentinel /* all leafs are sentinels */
|
||||||
static c_rbnode_t _sentinel = {NULL, NIL, NIL, NULL, NULL, BLACK};
|
static c_rbnode_t _sentinel = {NULL, NIL, NIL, NULL, NULL, BLACK};
|
||||||
|
|
||||||
void c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_rbtree_compare_func *data_compare) {
|
int c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_rbtree_compare_func *data_compare) {
|
||||||
assert(rbtree);
|
|
||||||
assert(key_compare);
|
|
||||||
assert(data_compare);
|
|
||||||
|
|
||||||
c_rbtree_t *tree = NULL;
|
c_rbtree_t *tree = NULL;
|
||||||
|
|
||||||
|
if (rbtree == NULL || key_compare == NULL || data_compare == NULL) {
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
tree = c_malloc(sizeof(*tree));
|
tree = c_malloc(sizeof(*tree));
|
||||||
tree->root = NIL;
|
tree->root = NIL;
|
||||||
tree->key_compare = key_compare;
|
tree->key_compare = key_compare;
|
||||||
@@ -52,6 +53,8 @@ void c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_
|
|||||||
tree->size = 0;
|
tree->size = 0;
|
||||||
|
|
||||||
*rbtree = tree;
|
*rbtree = tree;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static c_rbnode_t *_rbtree_subtree_dup(const c_rbnode_t *node, c_rbtree_t *new_tree, c_rbnode_t *new_parent) {
|
static c_rbnode_t *_rbtree_subtree_dup(const c_rbnode_t *node, c_rbtree_t *new_tree, c_rbnode_t *new_parent) {
|
||||||
|
|||||||
+14
-12
@@ -135,8 +135,10 @@ struct c_rbnode_s {
|
|||||||
*
|
*
|
||||||
* @param data_compare Callback function to compare a key as data with thee
|
* @param data_compare Callback function to compare a key as data with thee
|
||||||
* data inside a red-black tree node.
|
* data inside a red-black tree node.
|
||||||
|
*
|
||||||
|
* @return 0 on success, -1 if an error occured with errno set.
|
||||||
*/
|
*/
|
||||||
void c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_rbtree_compare_func *data_compare);
|
int c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_rbtree_compare_func *data_compare);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Duplicate a red-black tree.
|
* @brief Duplicate a red-black tree.
|
||||||
@@ -144,7 +146,7 @@ void c_rbtree_create(c_rbtree_t **rbtree, c_rbtree_compare_func *key_compare, c_
|
|||||||
* @param tree Tree to duplicate.
|
* @param tree Tree to duplicate.
|
||||||
*
|
*
|
||||||
* @return Pointer to a new allocated duplicated rbtree. NULL if an error
|
* @return Pointer to a new allocated duplicated rbtree. NULL if an error
|
||||||
* occurred.
|
* occured.
|
||||||
*/
|
*/
|
||||||
c_rbtree_t *c_rbtree_dup(const c_rbtree_t *tree);
|
c_rbtree_t *c_rbtree_dup(const c_rbtree_t *tree);
|
||||||
|
|
||||||
@@ -155,7 +157,7 @@ c_rbtree_t *c_rbtree_dup(const c_rbtree_t *tree);
|
|||||||
*
|
*
|
||||||
* @param tree The tree to free.
|
* @param tree The tree to free.
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int c_rbtree_free(c_rbtree_t *tree);
|
int c_rbtree_free(c_rbtree_t *tree);
|
||||||
|
|
||||||
@@ -196,7 +198,7 @@ int c_rbtree_free(c_rbtree_t *tree);
|
|||||||
* @param data The data to insert into the 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
|
* @return 0 on success, 1 if a duplicate has been found and < 0 if an error
|
||||||
* occurred with errno set.
|
* occured with errno set.
|
||||||
* EINVAL if a null pointer has been passed as the tree.
|
* EINVAL if a null pointer has been passed as the tree.
|
||||||
* ENOMEM if there is no memory left.
|
* ENOMEM if there is no memory left.
|
||||||
*/
|
*/
|
||||||
@@ -221,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.
|
* @param tree The tree to get the head for.
|
||||||
*
|
*
|
||||||
* @return The head node. NULL if an error occurred.
|
* @return The head node. NULL if an error occured.
|
||||||
*/
|
*/
|
||||||
c_rbnode_t *c_rbtree_head(c_rbtree_t *tree);
|
c_rbnode_t *c_rbtree_head(c_rbtree_t *tree);
|
||||||
|
|
||||||
@@ -230,7 +232,7 @@ c_rbnode_t *c_rbtree_head(c_rbtree_t *tree);
|
|||||||
*
|
*
|
||||||
* @param tree The tree to get the tail for.
|
* @param tree The tree to get the tail for.
|
||||||
*
|
*
|
||||||
* @return The tail node. NULL if an error occurred.
|
* @return The tail node. NULL if an error occured.
|
||||||
*/
|
*/
|
||||||
c_rbnode_t *c_rbtree_tail(c_rbtree_t *tree);
|
c_rbnode_t *c_rbtree_tail(c_rbtree_t *tree);
|
||||||
|
|
||||||
@@ -252,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 data Data which should be passed to the visitor function.
|
||||||
* @param visitor Visitor function. This will be called for each node passed.
|
* @param visitor Visitor function. This will be called for each node passed.
|
||||||
*
|
*
|
||||||
* @return 0 on sucess, less than 0 if an error occurred.
|
* @return 0 on sucess, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int c_rbtree_walk(c_rbtree_t *tree, void *data, c_rbtree_visit_func *visitor);
|
int c_rbtree_walk(c_rbtree_t *tree, void *data, c_rbtree_visit_func *visitor);
|
||||||
|
|
||||||
@@ -261,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.
|
* @param node Node which should be deleted.
|
||||||
*
|
*
|
||||||
* @return 0 on success, -1 if an error occurred.
|
* @return 0 on success, -1 if an error occured.
|
||||||
*/
|
*/
|
||||||
int c_rbtree_node_delete(c_rbnode_t *node);
|
int c_rbtree_node_delete(c_rbnode_t *node);
|
||||||
|
|
||||||
@@ -270,7 +272,7 @@ int c_rbtree_node_delete(c_rbnode_t *node);
|
|||||||
*
|
*
|
||||||
* @param node The node of which you want the next node.
|
* @param node The node of which you want the next node.
|
||||||
*
|
*
|
||||||
* @return The next node, NULL if an error occurred.
|
* @return The next node, NULL if an error occured.
|
||||||
*/
|
*/
|
||||||
c_rbnode_t *c_rbtree_node_next(c_rbnode_t *node);
|
c_rbnode_t *c_rbtree_node_next(c_rbnode_t *node);
|
||||||
|
|
||||||
@@ -279,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.
|
* @param node The node of which you want the previous node.
|
||||||
*
|
*
|
||||||
* @return The previous node, NULL if an error occurred.
|
* @return The previous node, NULL if an error occured.
|
||||||
*/
|
*/
|
||||||
c_rbnode_t *c_rbtree_node_prev(c_rbnode_t *node);
|
c_rbnode_t *c_rbtree_node_prev(c_rbnode_t *node);
|
||||||
|
|
||||||
@@ -288,7 +290,7 @@ c_rbnode_t *c_rbtree_node_prev(c_rbnode_t *node);
|
|||||||
*
|
*
|
||||||
* @param N The node to get the data from.
|
* @param N The node to get the data from.
|
||||||
*
|
*
|
||||||
* @return The data, NULL if an error occurred.
|
* @return The data, NULL if an error occured.
|
||||||
*/
|
*/
|
||||||
#define c_rbtree_node_data(N) ((N) ? ((N)->data) : NULL)
|
#define c_rbtree_node_data(N) ((N) ? ((N)->data) : NULL)
|
||||||
|
|
||||||
@@ -299,7 +301,7 @@ c_rbnode_t *c_rbtree_node_prev(c_rbnode_t *node);
|
|||||||
*
|
*
|
||||||
* @param tree The tree to check.
|
* @param tree The tree to check.
|
||||||
*
|
*
|
||||||
* @return 0 on success, less than 0 if an error occurred.
|
* @return 0 on success, less than 0 if an error occured.
|
||||||
*/
|
*/
|
||||||
int c_rbtree_check_sanity(c_rbtree_t *tree);
|
int c_rbtree_check_sanity(c_rbtree_t *tree);
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ void csync_vio_file_stat_destroy(csync_vio_file_stat_t *file_stat) {
|
|||||||
SAFE_FREE(file_stat->directDownloadUrl);
|
SAFE_FREE(file_stat->directDownloadUrl);
|
||||||
SAFE_FREE(file_stat->directDownloadCookies);
|
SAFE_FREE(file_stat->directDownloadCookies);
|
||||||
SAFE_FREE(file_stat->name);
|
SAFE_FREE(file_stat->name);
|
||||||
SAFE_FREE(file_stat->original_name);
|
|
||||||
SAFE_FREE(file_stat);
|
SAFE_FREE(file_stat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
|
|||||||
return file_stat;
|
return file_stat;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
csync_vio_file_stat_destroy(file_stat);
|
SAFE_FREE(file_stat);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
|
|||||||
|
|
||||||
dhandle_t *handle = NULL;
|
dhandle_t *handle = NULL;
|
||||||
csync_vio_file_stat_t *file_stat = NULL;
|
csync_vio_file_stat_t *file_stat = NULL;
|
||||||
|
ULARGE_INTEGER FileIndex;
|
||||||
DWORD rem;
|
DWORD rem;
|
||||||
|
|
||||||
handle = (dhandle_t *) dhandle;
|
handle = (dhandle_t *) dhandle;
|
||||||
@@ -167,20 +168,11 @@ csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
|
|||||||
}
|
}
|
||||||
file_stat->name = c_utf8_from_locale(handle->ffd.cFileName);
|
file_stat->name = c_utf8_from_locale(handle->ffd.cFileName);
|
||||||
|
|
||||||
file_stat->flags = CSYNC_VIO_FILE_FLAGS_NONE;
|
file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE;
|
||||||
file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE;
|
if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT
|
||||||
if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
|
&& handle->ffd.dwReserved0 & IO_REPARSE_TAG_SYMLINK) {
|
||||||
// Detect symlinks, and treat junctions as symlinks too.
|
file_stat->flags = CSYNC_VIO_FILE_FLAGS_SYMLINK;
|
||||||
if (handle->ffd.dwReserved0 == IO_REPARSE_TAG_SYMLINK
|
file_stat->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
|
||||||
|| handle->ffd.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT) {
|
|
||||||
file_stat->flags |= CSYNC_VIO_FILE_FLAGS_SYMLINK;
|
|
||||||
file_stat->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
|
|
||||||
} else {
|
|
||||||
// The SIS and DEDUP reparse points should be treated as
|
|
||||||
// regular files. We don't know about the other ones yet,
|
|
||||||
// but will also treat them normally for now.
|
|
||||||
file_stat->type = CSYNC_VIO_FILE_TYPE_REGULAR;
|
|
||||||
}
|
|
||||||
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE
|
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE
|
||||||
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
|
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
|
||||||
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) {
|
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) {
|
||||||
@@ -191,6 +183,7 @@ csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
|
|||||||
file_stat->type = CSYNC_VIO_FILE_TYPE_REGULAR;
|
file_stat->type = CSYNC_VIO_FILE_TYPE_REGULAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file_stat->flags = CSYNC_VIO_FILE_FLAGS_NONE;
|
||||||
/* Check for the hidden flag */
|
/* Check for the hidden flag */
|
||||||
if( handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) {
|
if( handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) {
|
||||||
file_stat->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN;
|
file_stat->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN;
|
||||||
@@ -233,10 +226,8 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
|
|||||||
ULARGE_INTEGER FileIndex;
|
ULARGE_INTEGER FileIndex;
|
||||||
mbchar_t *wuri = c_utf8_path_to_locale( uri );
|
mbchar_t *wuri = c_utf8_path_to_locale( uri );
|
||||||
|
|
||||||
h = CreateFileW( wuri, 0, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
|
h = CreateFileW( wuri, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
|
||||||
NULL, OPEN_EXISTING,
|
FILE_ATTRIBUTE_NORMAL+FILE_FLAG_BACKUP_SEMANTICS+FILE_FLAG_OPEN_REPARSE_POINT, NULL );
|
||||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
|
|
||||||
NULL );
|
|
||||||
if( h == INVALID_HANDLE_VALUE ) {
|
if( h == INVALID_HANDLE_VALUE ) {
|
||||||
CSYNC_LOG(CSYNC_LOG_PRIORITY_CRIT, "CreateFileW failed on %s", uri );
|
CSYNC_LOG(CSYNC_LOG_PRIORITY_CRIT, "CreateFileW failed on %s", uri );
|
||||||
errno = GetLastError();
|
errno = GetLastError();
|
||||||
@@ -259,17 +250,6 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
|
|||||||
/* printf("Index: %I64i\n", FileIndex.QuadPart); */
|
/* printf("Index: %I64i\n", FileIndex.QuadPart); */
|
||||||
buf->inode = FileIndex.QuadPart;
|
buf->inode = FileIndex.QuadPart;
|
||||||
|
|
||||||
if (!(buf->fields & CSYNC_VIO_FILE_STAT_FIELDS_SIZE)) {
|
|
||||||
buf->size = (fileInfo.nFileSizeHigh * ((int64_t)(MAXDWORD)+1)) + fileInfo.nFileSizeLow;
|
|
||||||
buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE;
|
|
||||||
}
|
|
||||||
if (!(buf->fields & CSYNC_VIO_FILE_STAT_FIELDS_MTIME)) {
|
|
||||||
DWORD rem;
|
|
||||||
buf->mtime = FileTimeToUnixTime(&fileInfo.ftLastWriteTime, &rem);
|
|
||||||
/* CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Local File MTime: %llu", (unsigned long long) buf->mtime ); */
|
|
||||||
buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME;
|
|
||||||
}
|
|
||||||
|
|
||||||
c_free_locale_string(wuri);
|
c_free_locale_string(wuri);
|
||||||
CloseHandle(h);
|
CloseHandle(h);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -53,3 +53,7 @@ add_cmocka_test(check_csync_update csync_tests/check_csync_update.c ${TEST_TARGE
|
|||||||
# encoding
|
# encoding
|
||||||
add_cmocka_test(check_encoding_functions encoding_tests/check_encoding.c ${TEST_TARGET_LIBRARIES})
|
add_cmocka_test(check_encoding_functions encoding_tests/check_encoding.c ${TEST_TARGET_LIBRARIES})
|
||||||
|
|
||||||
|
if(UNIT_TESTING)
|
||||||
|
INSTALL( FILES "${CMOCKA_LIBRARIES}" DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
endif(UNIT_TESTING)
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ static void setup(void **state) {
|
|||||||
rc = system("mkdir -p /tmp/check_csync2");
|
rc = system("mkdir -p /tmp/check_csync2");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
*state = csync;
|
*state = csync;
|
||||||
}
|
}
|
||||||
@@ -48,9 +49,10 @@ static void setup_module(void **state) {
|
|||||||
rc = system("mkdir -p /tmp/check_csync2");
|
rc = system("mkdir -p /tmp/check_csync2");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
csync_create(&csync, "/tmp/check_csync1", "dummy://foo/bar");
|
rc = csync_create(&csync, "/tmp/check_csync1", "dummy://foo/bar");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
csync_init(csync);
|
rc = csync_init(csync);
|
||||||
*state = csync;
|
*state = csync;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,6 +74,16 @@ static void teardown(void **state) {
|
|||||||
*state = NULL;
|
*state = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void check_csync_commit_null(void **state)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
(void) state; /* unused */
|
||||||
|
|
||||||
|
rc = csync_commit(NULL);
|
||||||
|
assert_int_equal(rc, -1);
|
||||||
|
}
|
||||||
|
|
||||||
static void check_csync_commit(void **state)
|
static void check_csync_commit(void **state)
|
||||||
{
|
{
|
||||||
CSYNC *csync = *state;
|
CSYNC *csync = *state;
|
||||||
@@ -98,6 +110,7 @@ static void check_csync_commit_dummy(void **state)
|
|||||||
int torture_run_tests(void)
|
int torture_run_tests(void)
|
||||||
{
|
{
|
||||||
const UnitTest tests[] = {
|
const UnitTest tests[] = {
|
||||||
|
unit_test_setup_teardown(check_csync_commit_null, setup, teardown),
|
||||||
unit_test_setup_teardown(check_csync_commit, setup, teardown),
|
unit_test_setup_teardown(check_csync_commit, setup, teardown),
|
||||||
unit_test_setup_teardown(check_csync_commit_dummy, setup_module, teardown),
|
unit_test_setup_teardown(check_csync_commit_dummy, setup_module, teardown),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ static void check_csync_create(void **state)
|
|||||||
|
|
||||||
(void) state; /* unused */
|
(void) state; /* unused */
|
||||||
|
|
||||||
csync_create(&csync, "/tmp/csync1", "/tmp/csync2");
|
rc = csync_create(&csync, "/tmp/csync1", "/tmp/csync2");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
rc = csync_destroy(csync);
|
rc = csync_destroy(csync);
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
|
|||||||
@@ -30,8 +30,10 @@
|
|||||||
|
|
||||||
static void setup(void **state) {
|
static void setup(void **state) {
|
||||||
CSYNC *csync;
|
CSYNC *csync;
|
||||||
|
int rc;
|
||||||
|
|
||||||
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
*state = csync;
|
*state = csync;
|
||||||
}
|
}
|
||||||
@@ -40,7 +42,8 @@ static void setup_init(void **state) {
|
|||||||
CSYNC *csync;
|
CSYNC *csync;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
rc = csync_exclude_load(EXCLUDE_LIST_FILE, &(csync->excludes));
|
rc = csync_exclude_load(EXCLUDE_LIST_FILE, &(csync->excludes));
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
@@ -50,12 +53,6 @@ static void setup_init(void **state) {
|
|||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
rc = _csync_exclude_add(&(csync->excludes), "пятницы.*");
|
rc = _csync_exclude_add(&(csync->excludes), "пятницы.*");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
rc = _csync_exclude_add(&(csync->excludes), "*/*.out");
|
|
||||||
assert_int_equal(rc, 0);
|
|
||||||
rc = _csync_exclude_add(&(csync->excludes), "latex*/*.run.xml");
|
|
||||||
assert_int_equal(rc, 0);
|
|
||||||
rc = _csync_exclude_add(&(csync->excludes), "latex/*/*.tex.tmp");
|
|
||||||
assert_int_equal(rc, 0);
|
|
||||||
|
|
||||||
*state = csync;
|
*state = csync;
|
||||||
}
|
}
|
||||||
@@ -99,99 +96,71 @@ static void check_csync_excluded(void **state)
|
|||||||
CSYNC *csync = *state;
|
CSYNC *csync = *state;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "/", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "krawel_krawel", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "krawel_krawel", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, ".kde/share/config/kwin.eventsrc", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, ".kde/share/config/kwin.eventsrc", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, ".htaccess/cache-maximegalon/cache1.txt", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, ".htaccess/cache-maximegalon/cache1.txt", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "mozilla/.htaccess", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, "mozilla/.htaccess", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Test for patterns in subdirs. '.beagle' is defined as a pattern and has
|
* Test for patterns in subdirs. '.beagle' is defined as a pattern and has
|
||||||
* to be found in top dir as well as in directories underneath.
|
* to be found in top dir as well as in directories underneath.
|
||||||
*/
|
*/
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, ".apdisk", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, ".apdisk", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "foo/.apdisk", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, "foo/.apdisk", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "foo/bar/.apdisk", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, "foo/bar/.apdisk", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, ".java", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, ".java", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
|
|
||||||
/* Files in the ignored dir .java will also be ignored. */
|
/* Files in the ignored dir .java will also be ignored. */
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, ".apdisk/totally_amazing.jar", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, ".apdisk/totally_amazing.jar", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
/* and also in subdirs */
|
/* and also in subdirs */
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "projects/.apdisk/totally_amazing.jar", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "projects/.apdisk/totally_amazing.jar", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
/* csync-journal is ignored in general silently. */
|
/* csync-journal is ignored in general silently. */
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, ".csync_journal.db", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, ".csync_journal.db", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
|
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, ".csync_journal.db.ctmp", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, ".csync_journal.db.ctmp", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
|
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "subdir/.csync_journal.db", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "subdir/.csync_journal.db", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
|
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
|
||||||
|
|
||||||
/* pattern ]*.directory - ignore and remove */
|
/* pattern ]*.directory - ignore and remove */
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "my.~directory", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "my.~directory", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_AND_REMOVE);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_AND_REMOVE);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/a_folder/my.~directory", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "/a_folder/my.~directory", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_AND_REMOVE);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_AND_REMOVE);
|
||||||
|
|
||||||
/* Not excluded because the pattern .netscape/cache requires directory. */
|
/* Not excluded because the pattern .netscape/cache requires directory. */
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, ".netscape/cache", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, ".netscape/cache", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
|
|
||||||
/* Not excluded */
|
/* Not excluded */
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "unicode/中文.hé", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "unicode/中文.hé", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
/* excluded */
|
/* excluded */
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "unicode/пятницы.txt", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "unicode/пятницы.txt", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "unicode/中文.💩", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "unicode/中文.💩", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
/* path wildcards */
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "foobar/my_manuscript.out", CSYNC_FTW_TYPE_FILE);
|
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "latex_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE);
|
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "word_tmp/my_manuscript.run.xml", CSYNC_FTW_TYPE_FILE);
|
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "latex/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE);
|
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "latex/songbook/my_manuscript.tex.tmp", CSYNC_FTW_TYPE_FILE);
|
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "file_trailing_space ", CSYNC_FTW_TYPE_FILE);
|
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_TRAILING_SPACE);
|
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "file_trailing_dot.", CSYNC_FTW_TYPE_FILE);
|
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_INVALID_CHAR);
|
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "AUX", CSYNC_FTW_TYPE_FILE);
|
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_INVALID_CHAR);
|
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "file_invalid_char<", CSYNC_FTW_TYPE_FILE);
|
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_INVALID_CHAR);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_csync_excluded_traversal(void **state)
|
static void check_csync_excluded_traversal(void **state)
|
||||||
@@ -252,45 +221,45 @@ static void check_csync_pathes(void **state)
|
|||||||
_csync_exclude_add( &(csync->excludes), "/exclude" );
|
_csync_exclude_add( &(csync->excludes), "/exclude" );
|
||||||
|
|
||||||
/* Check toplevel dir, the pattern only works for toplevel dir. */
|
/* Check toplevel dir, the pattern only works for toplevel dir. */
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/exclude", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, "/exclude", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/foo/exclude", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, "/foo/exclude", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
|
|
||||||
/* check for a file called exclude. Must still work */
|
/* check for a file called exclude. Must still work */
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/exclude", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "/exclude", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/foo/exclude", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "/foo/exclude", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
|
|
||||||
/* Add an exclude for directories only: excl/ */
|
/* Add an exclude for directories only: excl/ */
|
||||||
_csync_exclude_add( &(csync->excludes), "excl/" );
|
_csync_exclude_add( &(csync->excludes), "excl/" );
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/excl", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, "/excl", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "meep/excl", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, "meep/excl", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "meep/excl/file", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "meep/excl/file", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/excl", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "/excl", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
|
|
||||||
_csync_exclude_add(&csync->excludes, "/excludepath/withsubdir");
|
_csync_exclude_add(&csync->excludes, "/excludepath/withsubdir");
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, "/excludepath/withsubdir", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir", CSYNC_FTW_TYPE_FILE);
|
rc = csync_excluded(csync, "/excludepath/withsubdir", CSYNC_FTW_TYPE_FILE);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir2", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, "/excludepath/withsubdir2", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
|
||||||
|
|
||||||
rc = csync_excluded_no_ctx(csync->excludes, "/excludepath/withsubdir/foo", CSYNC_FTW_TYPE_DIR);
|
rc = csync_excluded(csync, "/excludepath/withsubdir/foo", CSYNC_FTW_TYPE_DIR);
|
||||||
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -318,16 +287,15 @@ static void check_csync_excluded_performance(void **state)
|
|||||||
|
|
||||||
const int N = 10000;
|
const int N = 10000;
|
||||||
int totalRc = 0;
|
int totalRc = 0;
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
// Being able to use QElapsedTimer for measurement would be nice...
|
// Being able to use QElapsedTimer for measurement would be nice...
|
||||||
{
|
{
|
||||||
struct timeval before, after;
|
struct timeval before, after;
|
||||||
gettimeofday(&before, 0);
|
gettimeofday(&before, 0);
|
||||||
|
|
||||||
for (i = 0; i < N; ++i) {
|
for (int i = 0; i < N; ++i) {
|
||||||
totalRc += csync_excluded_no_ctx(csync->excludes, "/this/is/quite/a/long/path/with/many/components", CSYNC_FTW_TYPE_DIR);
|
totalRc += csync_excluded(csync, "/this/is/quite/a/long/path/with/many/components", CSYNC_FTW_TYPE_DIR);
|
||||||
totalRc += csync_excluded_no_ctx(csync->excludes, "/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/29", CSYNC_FTW_TYPE_FILE);
|
totalRc += csync_excluded(csync, "/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/29", CSYNC_FTW_TYPE_FILE);
|
||||||
}
|
}
|
||||||
assert_int_equal(totalRc, CSYNC_NOT_EXCLUDED); // mainly to avoid optimization
|
assert_int_equal(totalRc, CSYNC_NOT_EXCLUDED); // mainly to avoid optimization
|
||||||
|
|
||||||
@@ -343,7 +311,7 @@ static void check_csync_excluded_performance(void **state)
|
|||||||
struct timeval before, after;
|
struct timeval before, after;
|
||||||
gettimeofday(&before, 0);
|
gettimeofday(&before, 0);
|
||||||
|
|
||||||
for (i = 0; i < N; ++i) {
|
for (int i = 0; i < N; ++i) {
|
||||||
totalRc += csync_excluded_traversal(csync->excludes, "/this/is/quite/a/long/path/with/many/components", CSYNC_FTW_TYPE_DIR);
|
totalRc += csync_excluded_traversal(csync->excludes, "/this/is/quite/a/long/path/with/many/components", CSYNC_FTW_TYPE_DIR);
|
||||||
totalRc += csync_excluded_traversal(csync->excludes, "/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/29", CSYNC_FTW_TYPE_FILE);
|
totalRc += csync_excluded_traversal(csync->excludes, "/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/29", CSYNC_FTW_TYPE_FILE);
|
||||||
}
|
}
|
||||||
@@ -358,25 +326,6 @@ static void check_csync_excluded_performance(void **state)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_csync_exclude_expand_escapes(void **state)
|
|
||||||
{
|
|
||||||
(void)state;
|
|
||||||
|
|
||||||
const char *str = csync_exclude_expand_escapes(
|
|
||||||
"keep \\' \\\" \\? \\\\ \\a \\b \\f \\n \\r \\t \\v \\z");
|
|
||||||
assert_true(0 == strcmp(
|
|
||||||
str, "keep ' \" ? \\ \a \b \f \n \r \t \v \\z"));
|
|
||||||
SAFE_FREE(str);
|
|
||||||
|
|
||||||
str = csync_exclude_expand_escapes("");
|
|
||||||
assert_true(0 == strcmp(str, ""));
|
|
||||||
SAFE_FREE(str);
|
|
||||||
|
|
||||||
str = csync_exclude_expand_escapes("\\");
|
|
||||||
assert_true(0 == strcmp(str, "\\"));
|
|
||||||
SAFE_FREE(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
int torture_run_tests(void)
|
int torture_run_tests(void)
|
||||||
{
|
{
|
||||||
const UnitTest tests[] = {
|
const UnitTest tests[] = {
|
||||||
@@ -387,7 +336,6 @@ int torture_run_tests(void)
|
|||||||
unit_test_setup_teardown(check_csync_pathes, setup_init, teardown),
|
unit_test_setup_teardown(check_csync_pathes, setup_init, teardown),
|
||||||
unit_test_setup_teardown(check_csync_is_windows_reserved_word, setup_init, teardown),
|
unit_test_setup_teardown(check_csync_is_windows_reserved_word, setup_init, teardown),
|
||||||
unit_test_setup_teardown(check_csync_excluded_performance, setup_init, teardown),
|
unit_test_setup_teardown(check_csync_excluded_performance, setup_init, teardown),
|
||||||
unit_test(check_csync_exclude_expand_escapes),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return run_tests(tests);
|
return run_tests(tests);
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ static void setup(void **state) {
|
|||||||
rc = system("mkdir -p /tmp/check_csync2");
|
rc = system("mkdir -p /tmp/check_csync2");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
*state = csync;
|
*state = csync;
|
||||||
}
|
}
|
||||||
@@ -48,7 +49,8 @@ static void setup_module(void **state) {
|
|||||||
rc = system("mkdir -p /tmp/check_csync2");
|
rc = system("mkdir -p /tmp/check_csync2");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
csync_create(&csync, "/tmp/check_csync1", "dummy://foo/bar");
|
rc = csync_create(&csync, "/tmp/check_csync1", "dummy://foo/bar");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
*state = csync;
|
*state = csync;
|
||||||
}
|
}
|
||||||
@@ -71,18 +73,34 @@ static void teardown(void **state) {
|
|||||||
*state = NULL;
|
*state = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void check_csync_init_null(void **state)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
(void) state; /* unused */
|
||||||
|
|
||||||
|
rc = csync_init(NULL);
|
||||||
|
assert_int_equal(rc, -1);
|
||||||
|
}
|
||||||
|
|
||||||
static void check_csync_init(void **state)
|
static void check_csync_init(void **state)
|
||||||
{
|
{
|
||||||
CSYNC *csync = *state;
|
CSYNC *csync = *state;
|
||||||
|
int rc;
|
||||||
|
|
||||||
csync_init(csync);
|
rc = csync_init(csync);
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
assert_int_equal(csync->status & CSYNC_STATUS_INIT, 1);
|
assert_int_equal(csync->status & CSYNC_STATUS_INIT, 1);
|
||||||
|
|
||||||
|
rc = csync_init(csync);
|
||||||
|
assert_int_equal(rc, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int torture_run_tests(void)
|
int torture_run_tests(void)
|
||||||
{
|
{
|
||||||
const UnitTest tests[] = {
|
const UnitTest tests[] = {
|
||||||
|
unit_test_setup_teardown(check_csync_init_null, setup, teardown),
|
||||||
unit_test_setup_teardown(check_csync_init, setup, teardown),
|
unit_test_setup_teardown(check_csync_init, setup, teardown),
|
||||||
unit_test_setup_teardown(check_csync_init, setup_module, teardown),
|
unit_test_setup_teardown(check_csync_init, setup_module, teardown),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ static void setup(void **state) {
|
|||||||
rc = system("mkdir -p /tmp/check_csync2");
|
rc = system("mkdir -p /tmp/check_csync2");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
*state = csync;
|
*state = csync;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ static void setup(void **state) {
|
|||||||
rc = system("mkdir -p /tmp/check_csync1");
|
rc = system("mkdir -p /tmp/check_csync1");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
csync->statedb.file = c_strdup( TESTDB );
|
csync->statedb.file = c_strdup( TESTDB );
|
||||||
*state = csync;
|
*state = csync;
|
||||||
|
|||||||
@@ -42,8 +42,10 @@ static void setup(void **state)
|
|||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
rc = system("mkdir -p /tmp/check_csync");
|
rc = system("mkdir -p /tmp/check_csync");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
||||||
csync_init(csync);
|
assert_int_equal(rc, 0);
|
||||||
|
rc = csync_init(csync);
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
sqlite3 *db = NULL;
|
sqlite3 *db = NULL;
|
||||||
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
|
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
|
||||||
|
|||||||
@@ -93,8 +93,10 @@ static void setup(void **state)
|
|||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
rc = system("mkdir -p /tmp/check_csync2");
|
rc = system("mkdir -p /tmp/check_csync2");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
rc = csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
|
||||||
csync_init(csync);
|
assert_int_equal(rc, 0);
|
||||||
|
rc = csync_init(csync);
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
/* Create a new db with metadata */
|
/* Create a new db with metadata */
|
||||||
sqlite3 *db;
|
sqlite3 *db;
|
||||||
@@ -124,8 +126,10 @@ static void setup_ftw(void **state)
|
|||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
rc = system("mkdir -p /tmp/check_csync2");
|
rc = system("mkdir -p /tmp/check_csync2");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
csync_create(&csync, "/tmp", "/tmp");
|
rc = csync_create(&csync, "/tmp", "/tmp");
|
||||||
csync_init(csync);
|
assert_int_equal(rc, 0);
|
||||||
|
rc = csync_init(csync);
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
sqlite3 *db = NULL;
|
sqlite3 *db = NULL;
|
||||||
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
|
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
|
||||||
|
|||||||
@@ -85,16 +85,6 @@ sub fromFileName($)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setCredentials
|
|
||||||
{
|
|
||||||
my ($dav, $user, $passwd) = @_;
|
|
||||||
|
|
||||||
$dav->credentials(-url=> $owncloud, -realm=>"sabre/dav",
|
|
||||||
-user=> $user, -pass=> $passwd);
|
|
||||||
$dav->credentials(-url=> $owncloud, -realm=>"ownCloud",
|
|
||||||
-user=> $user, -pass=> $passwd);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sub initTesting(;$)
|
sub initTesting(;$)
|
||||||
{
|
{
|
||||||
@@ -137,7 +127,9 @@ sub initTesting(;$)
|
|||||||
my $ua = HTTP::DAV::UserAgent->new(keep_alive => 1 );
|
my $ua = HTTP::DAV::UserAgent->new(keep_alive => 1 );
|
||||||
$d = HTTP::DAV->new(-useragent => $ua);
|
$d = HTTP::DAV->new(-useragent => $ua);
|
||||||
|
|
||||||
setCredentials($d, $user, $passwd);
|
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
|
||||||
|
-user=> $user,
|
||||||
|
-pass=> $passwd );
|
||||||
# $d->DebugLevel(3);
|
# $d->DebugLevel(3);
|
||||||
$prefix = "t1" unless( defined $prefix );
|
$prefix = "t1" unless( defined $prefix );
|
||||||
|
|
||||||
@@ -201,7 +193,9 @@ sub removeRemoteDir($;$)
|
|||||||
|
|
||||||
my $url = testDirUrl() . $dir;
|
my $url = testDirUrl() . $dir;
|
||||||
if( $optionsRef && $optionsRef->{user} && $optionsRef->{passwd} ) {
|
if( $optionsRef && $optionsRef->{user} && $optionsRef->{passwd} ) {
|
||||||
setCredentials($d, $optionsRef->{user}, $optionsRef->{passwd});
|
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
|
||||||
|
-user=> $optionsRef->{user},
|
||||||
|
-pass=> $optionsRef->{passwd} );
|
||||||
if( $optionsRef->{url} ) {
|
if( $optionsRef->{url} ) {
|
||||||
$url = $optionsRef->{url} . $dir;
|
$url = $optionsRef->{url} . $dir;
|
||||||
}
|
}
|
||||||
@@ -225,7 +219,9 @@ sub createRemoteDir(;$$)
|
|||||||
my $url = testDirUrl() . $dir;
|
my $url = testDirUrl() . $dir;
|
||||||
|
|
||||||
if( $optionsRef && $optionsRef->{user} && $optionsRef->{passwd} ) {
|
if( $optionsRef && $optionsRef->{user} && $optionsRef->{passwd} ) {
|
||||||
setCredentials($d, $optionsRef->{user}, $optionsRef->{passwd});
|
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
|
||||||
|
-user=> $optionsRef->{user},
|
||||||
|
-pass=> $optionsRef->{passwd} );
|
||||||
if( $optionsRef->{url} ) {
|
if( $optionsRef->{url} ) {
|
||||||
$url = $optionsRef->{url} . $dir;
|
$url = $optionsRef->{url} . $dir;
|
||||||
}
|
}
|
||||||
@@ -400,7 +396,9 @@ sub traverse( $$;$ )
|
|||||||
my %seen;
|
my %seen;
|
||||||
|
|
||||||
|
|
||||||
setCredentials($d, $user, $passwd);
|
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
|
||||||
|
-user=> $user,
|
||||||
|
-pass=> $passwd );
|
||||||
$d->open( $owncloud );
|
$d->open( $owncloud );
|
||||||
|
|
||||||
if( my $r = $d->propfind( -url => $url, -depth => 1 ) ) {
|
if( my $r = $d->propfind( -url => $url, -depth => 1 ) ) {
|
||||||
@@ -515,12 +513,14 @@ sub put_to_dir( $$;$ )
|
|||||||
my $targetUrl = testDirUrl();
|
my $targetUrl = testDirUrl();
|
||||||
|
|
||||||
if( $optionsRef && $optionsRef->{user} && $optionsRef->{passwd} ) {
|
if( $optionsRef && $optionsRef->{user} && $optionsRef->{passwd} ) {
|
||||||
setCredentials($d, $optionsRef->{user}, $optionsRef->{passwd});
|
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
|
||||||
|
-user=> $optionsRef->{user},
|
||||||
|
-pass=> $optionsRef->{passwd} );
|
||||||
if( $optionsRef->{url} ) {
|
if( $optionsRef->{url} ) {
|
||||||
$targetUrl = $optionsRef->{url};
|
$targetUrl = $optionsRef->{url};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$d->open($targetUrl . $dir);
|
$d->open($dir);
|
||||||
|
|
||||||
my $filename = $file;
|
my $filename = $file;
|
||||||
$filename =~ s/^.*\///;
|
$filename =~ s/^.*\///;
|
||||||
@@ -649,7 +649,9 @@ sub moveRemoteFile($$;$)
|
|||||||
{
|
{
|
||||||
my ($from, $to, $no_testdir) = @_;
|
my ($from, $to, $no_testdir) = @_;
|
||||||
|
|
||||||
setCredentials($d, $user, $passwd);
|
$d->credentials( -url=> $owncloud, -realm=>"ownCloud",
|
||||||
|
-user=> $user,
|
||||||
|
-pass=> $passwd );
|
||||||
|
|
||||||
my $fromUrl = testDirUrl(). $from;
|
my $fromUrl = testDirUrl(). $from;
|
||||||
my $toUrl = testDirUrl() . $to;
|
my $toUrl = testDirUrl() . $to;
|
||||||
@@ -723,7 +725,9 @@ sub createShare($$)
|
|||||||
|
|
||||||
my $dd = HTTP::DAV->new();
|
my $dd = HTTP::DAV->new();
|
||||||
|
|
||||||
setCredentials($dd, $share_user, $share_passwd);
|
$dd->credentials( -url=> $owncloud, -realm=>"ownCloud",
|
||||||
|
-user=> $share_user,
|
||||||
|
-pass=> $share_passwd );
|
||||||
$dd->open( $owncloud);
|
$dd->open( $owncloud);
|
||||||
|
|
||||||
# create a remote dir
|
# create a remote dir
|
||||||
@@ -765,7 +769,9 @@ sub removeShare($$)
|
|||||||
|
|
||||||
my $dd = HTTP::DAV->new();
|
my $dd = HTTP::DAV->new();
|
||||||
|
|
||||||
setCredentials($dd, $share_user, $share_passwd);
|
$dd->credentials( -url => $owncloud, -realm=>"ownCloud",
|
||||||
|
-user => $share_user,
|
||||||
|
-pass => $share_passwd );
|
||||||
$dd->open( $owncloud);
|
$dd->open( $owncloud);
|
||||||
|
|
||||||
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
|
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
|
||||||
|
|||||||
@@ -146,9 +146,9 @@ assertLocalAndRemoteDir( '', 0);
|
|||||||
|
|
||||||
# create a true conflict.
|
# create a true conflict.
|
||||||
printInfo( "Create a conflict." );
|
printInfo( "Create a conflict." );
|
||||||
system( "echo \"This is more server stuff\" >> /tmp/kernelcrash.txt" );
|
system( "echo \"This is more stuff\" >> /tmp/kernelcrash.txt" );
|
||||||
put_to_dir( '/tmp/kernelcrash.txt', 'remoteToLocal1' );
|
put_to_dir( '/tmp/kernelcrash.txt', 'remoteToLocal1' );
|
||||||
system( "sleep 2 && echo \"This is more client stuff\" >> " . localDir() . "remoteToLocal1/kernelcrash.txt" );
|
system( "sleep 2 && touch " . localDir() . "remoteToLocal1/kernelcrash.txt" );
|
||||||
csync();
|
csync();
|
||||||
assertLocalAndRemoteDir( '', 1);
|
assertLocalAndRemoteDir( '', 1);
|
||||||
|
|
||||||
|
|||||||
@@ -31,13 +31,6 @@ use strict;
|
|||||||
|
|
||||||
print "Hello, this is t6, a tester for csync with ownCloud.\n";
|
print "Hello, this is t6, a tester for csync with ownCloud.\n";
|
||||||
|
|
||||||
# Checking CURL is installed to avoid misleading errors later...
|
|
||||||
system(("curl", "--help", ">", "/dev/null"));
|
|
||||||
if ($? != 0) {
|
|
||||||
print "CURL is needed for this script, aborting with error\n";
|
|
||||||
exit 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
initTesting();
|
initTesting();
|
||||||
|
|
||||||
sub createPostUpdateScript($)
|
sub createPostUpdateScript($)
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ assert($emlpropafter->get_property( "getlastmodified" ) eq
|
|||||||
$emlpropbefore->get_property( "getlastmodified" ));
|
$emlpropbefore->get_property( "getlastmodified" ));
|
||||||
|
|
||||||
printInfo( "Change content of eml file (but not size)");
|
printInfo( "Change content of eml file (but not size)");
|
||||||
system( "sleep 1 && sed -i -e 's/in/IN/' $locDir/test.eml" );
|
system( "sed -i -e 's/in/IN/' $locDir/test.eml" );
|
||||||
|
|
||||||
csync( );
|
csync( );
|
||||||
|
|
||||||
|
|||||||
@@ -64,10 +64,6 @@ csync();
|
|||||||
assert( -e glob(localDir().'dir/file2_.sys.admin#recall#-*.dat' ) );
|
assert( -e glob(localDir().'dir/file2_.sys.admin#recall#-*.dat' ) );
|
||||||
assert( -e glob(localDir().'dir/file3_.sys.admin#recall#-*.dat' ) );
|
assert( -e glob(localDir().'dir/file3_.sys.admin#recall#-*.dat' ) );
|
||||||
|
|
||||||
# verify that the original files still exist
|
|
||||||
assert( -e glob(localDir().'dir/file2.dat' ) );
|
|
||||||
assert( -e glob(localDir().'dir/file3.dat' ) );
|
|
||||||
|
|
||||||
#Remove the recall file
|
#Remove the recall file
|
||||||
unlink(localDir() . ".sys.admin#recall#");
|
unlink(localDir() . ".sys.admin#recall#");
|
||||||
|
|
||||||
|
|||||||
@@ -84,8 +84,10 @@ static void destructor(void *data) {
|
|||||||
|
|
||||||
static void setup(void **state) {
|
static void setup(void **state) {
|
||||||
c_rbtree_t *tree = NULL;
|
c_rbtree_t *tree = NULL;
|
||||||
|
int rc;
|
||||||
|
|
||||||
c_rbtree_create(&tree, key_cmp, data_cmp);
|
rc = c_rbtree_create(&tree, key_cmp, data_cmp);
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
*state = tree;
|
*state = tree;
|
||||||
}
|
}
|
||||||
@@ -95,7 +97,8 @@ static void setup_complete_tree(void **state) {
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
c_rbtree_create(&tree, key_cmp, data_cmp);
|
rc = c_rbtree_create(&tree, key_cmp, data_cmp);
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
for (i = 0; i < 100; i++) {
|
for (i = 0; i < 100; i++) {
|
||||||
test_t *testdata = NULL;
|
test_t *testdata = NULL;
|
||||||
@@ -128,13 +131,31 @@ static void check_c_rbtree_create_free(void **state)
|
|||||||
|
|
||||||
(void) state; /* unused */
|
(void) state; /* unused */
|
||||||
|
|
||||||
c_rbtree_create(&tree, key_cmp, data_cmp);
|
rc = c_rbtree_create(&tree, key_cmp, data_cmp);
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
assert_int_equal(tree->size, 0);
|
assert_int_equal(tree->size, 0);
|
||||||
|
|
||||||
rc = c_rbtree_free(tree);
|
rc = c_rbtree_free(tree);
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void check_c_rbtree_create_null(void **state)
|
||||||
|
{
|
||||||
|
c_rbtree_t *tree = NULL;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
(void) state; /* unused */
|
||||||
|
|
||||||
|
rc = c_rbtree_create(NULL, key_cmp, data_cmp);
|
||||||
|
assert_int_equal(rc, -1);
|
||||||
|
|
||||||
|
rc = c_rbtree_create(&tree, NULL, data_cmp);
|
||||||
|
assert_int_equal(rc, -1);
|
||||||
|
|
||||||
|
rc = c_rbtree_create(&tree, key_cmp, NULL);
|
||||||
|
assert_int_equal(rc, -1);
|
||||||
|
}
|
||||||
|
|
||||||
static void check_c_rbtree_free_null(void **state)
|
static void check_c_rbtree_free_null(void **state)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
@@ -154,7 +175,8 @@ static void check_c_rbtree_insert_delete(void **state)
|
|||||||
|
|
||||||
(void) state; /* unused */
|
(void) state; /* unused */
|
||||||
|
|
||||||
c_rbtree_create(&tree, key_cmp, data_cmp);
|
rc = c_rbtree_create(&tree, key_cmp, data_cmp);
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
testdata = malloc(sizeof(test_t));
|
testdata = malloc(sizeof(test_t));
|
||||||
testdata->key = 42;
|
testdata->key = 42;
|
||||||
@@ -347,6 +369,7 @@ int torture_run_tests(void)
|
|||||||
{
|
{
|
||||||
const UnitTest tests[] = {
|
const UnitTest tests[] = {
|
||||||
unit_test(check_c_rbtree_create_free),
|
unit_test(check_c_rbtree_create_free),
|
||||||
|
unit_test(check_c_rbtree_create_null),
|
||||||
unit_test(check_c_rbtree_free_null),
|
unit_test(check_c_rbtree_free_null),
|
||||||
unit_test(check_c_rbtree_insert_delete),
|
unit_test(check_c_rbtree_insert_delete),
|
||||||
unit_test_setup_teardown(check_c_rbtree_insert_random, setup, teardown),
|
unit_test_setup_teardown(check_c_rbtree_insert_random, setup, teardown),
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ static void setup(void **state)
|
|||||||
rc = system("rm -rf /tmp/csync_test");
|
rc = system("rm -rf /tmp/csync_test");
|
||||||
assert_int_equal(rc, 0);
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
csync_create(&csync, "/tmp/csync1", "/tmp/csync2");
|
rc = csync_create(&csync, "/tmp/csync1", "/tmp/csync2");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
csync->replica = LOCAL_REPLICA;
|
csync->replica = LOCAL_REPLICA;
|
||||||
|
|
||||||
|
|||||||
@@ -97,7 +97,8 @@ static void setup_testenv(void **state) {
|
|||||||
statevar *mystate = malloc( sizeof(statevar) );
|
statevar *mystate = malloc( sizeof(statevar) );
|
||||||
mystate->result = NULL;
|
mystate->result = NULL;
|
||||||
|
|
||||||
csync_create(&(mystate->csync), "/tmp/csync1", "/tmp/csync2");
|
rc = csync_create(&(mystate->csync), "/tmp/csync1", "/tmp/csync2");
|
||||||
|
assert_int_equal(rc, 0);
|
||||||
|
|
||||||
mystate->csync->replica = LOCAL_REPLICA;
|
mystate->csync->replica = LOCAL_REPLICA;
|
||||||
|
|
||||||
|
|||||||
@@ -18,8 +18,3 @@ ownCloud Command Line Client
|
|||||||
----------------------------
|
----------------------------
|
||||||
.. index:: owncloudcmd
|
.. index:: owncloudcmd
|
||||||
.. include:: owncloudcmd.rst
|
.. include:: owncloudcmd.rst
|
||||||
|
|
||||||
Low Disk Space
|
|
||||||
--------------
|
|
||||||
.. index:: disk space
|
|
||||||
.. include:: lowdiskspace.rst
|
|
||||||
|
|||||||
+3
-10
@@ -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:
|
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.
|
Group Policies.
|
||||||
|
|
||||||
1. Edit this Registry key:
|
1. Edit this Registry key:
|
||||||
@@ -98,14 +98,6 @@ To prevent automatic updates and disallow manual overrides:
|
|||||||
|
|
||||||
3. Specify a value of ``1`` to the machine.
|
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
|
Preventing Automatic Updates in Mac OS X Environments
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -137,6 +129,7 @@ Preventing Automatic Updates in Linux Environments
|
|||||||
Because the Linux client does not provide automatic updating functionality, there is no
|
Because the Linux client does not provide automatic updating functionality, there is no
|
||||||
need to remove the automatic-update check. However, if you want to disable it edit your desktop
|
need to remove the automatic-update check. However, if you want to disable it edit your desktop
|
||||||
client configuration file, ``$HOME/.local/share/data/ownCloud/owncloud.cfg``.
|
client configuration file, ``$HOME/.local/share/data/ownCloud/owncloud.cfg``.
|
||||||
Add this line to the [General] section::
|
Add these lines::
|
||||||
|
|
||||||
|
[General]
|
||||||
skipUpdateCheck=true
|
skipUpdateCheck=true
|
||||||
|
|||||||
Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais
Referência em uma Nova Issue
Bloquear um usuário