1
0
mirror of https://github.com/chylex/Nextcloud-Desktop.git synced 2026-04-11 02:57:42 +02:00

Compare commits

..

1 Commits

Author SHA1 Message Date
Daniel Molkentin
c0c9fb365d Bump to 2.1.0 final 2015-12-03 10:19:51 +01:00
382 changed files with 32738 additions and 57843 deletions

1
.gitignore vendored
View File

@@ -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
*~$ *~$

5
.gitmodules vendored
View File

@@ -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

View File

@@ -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

View File

@@ -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 "&" "&amp;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME}")
string(REPLACE "<" "&lt;" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}")
string(REPLACE ">" "&gt;" 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)

View File

@@ -1,93 +1,5 @@
ChangeLog ChangeLog
========= =========
version 2.2.4 (release 2016-09-27)
* Dolphin Plugin: Use the Application name for the socket path (#5172)
* SyncEngine: Fix renaming of folder when file are changed (#5195)
* Selective Sync: Fix HTTP request loop and show error in view (#5154)
* ConnectionValidator: properly handle error in status.php request (#5188)
* Discovery: Set thread priority to low (#5017)
* ExcludeFiles: Fix when the folder casing is not the same in the settings and in the FS
* ShareLink: Ensure the password line edit is enabled (#5117)
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

58
Jenkinsfile vendored
View File

@@ -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 .
'''
}
}

View File

@@ -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

View File

@@ -1,7 +1,6 @@
set( MIRALL_VERSION_MAJOR 2 ) set( MIRALL_VERSION_MAJOR 2 )
set( MIRALL_VERSION_MINOR 2 ) set( MIRALL_VERSION_MINOR 1 )
set( MIRALL_VERSION_PATCH 4 ) 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 )

View File

@@ -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))

View File

@@ -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

View File

@@ -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>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -29,7 +29,7 @@ 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)"

View File

@@ -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."

View File

@@ -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 "میانبر دسکتاپ (رونویسی وجود دارد)"

View File

@@ -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)"

View File

@@ -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!"

View File

@@ -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"

View File

@@ -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)"

View File

@@ -3,12 +3,12 @@ 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} をアンインストール"

View File

@@ -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!"

View File

@@ -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 "Existem ${APPLICATION_EXECUTABLE} processo(s) em execução que precisa(m) de ser interrompido(s).$\nDeseja que o instalador o(s) termine automaticamente?" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Processos(s) ${APPLICATION_EXECUTABLE} em execução. Estes processos precisam de ser interrompidos.$\\nDeseja que o instalador os termine automaticamente?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar os processos ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar os processos ${APPLICATION_EXECUTABLE}."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado o processo a terminar!" StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado o processo a terminar!"
StrCpy $PageReinstall_NEW_Field_1 "Uma versão antiga de ${APPLICATION_NAME} está instalada no sistema. É recomendado que você desinstale a versão atual antes de instalar a mais recente. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar." 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 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_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}"

View File

@@ -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 "Ярлык на рабочем столе (перезапись существующего)"

View File

@@ -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!"

View File

@@ -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!"

View File

@@ -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."

View File

@@ -14,8 +14,6 @@ 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"
@@ -37,7 +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 $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!"

View File

@@ -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}"

View File

@@ -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!"

View File

@@ -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 = {}

View File

@@ -1,7 +0,0 @@
[Paths]
Prefix = .
Plugins = .
Binaries = .
Imports = .
Qml2Imports = .
LibraryExecutables = .

2
binary

Submodule binary updated: 0d89ac7766...8b72648a93

5
binary.rej Normal file
View File

@@ -0,0 +1,5 @@
--- binary
+++ binary
@@ -1 +1 @@
-Subproject commit 1fb9ddfa9a9a1b4dbc447eee10dbed89172d968a
+Subproject commit 01d73965dc8b862d1b2310d3ef801c297b697ec7

View File

@@ -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>

View File

@@ -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)

View 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.

View 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.

View 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.

View 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.

View 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.

View 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.

View 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.

View 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.

View 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.

View 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.

View 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>

View 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.

View 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

View 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.
@@ -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)

View 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.

View 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.

View File

@@ -128,4 +128,10 @@ else()
) )
endif() endif()
# INSTALL(
# FILES
# ${csync_HDRS}
# DESTINATION
# ${INCLUDE_INSTALL_DIR}/${APPLICATION_NAME}
# )

View File

@@ -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) {
@@ -548,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;
} }
@@ -578,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);
@@ -593,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;

View File

@@ -134,10 +134,7 @@ enum csync_instructions_e {
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 = 0x0000200, /* Like NEW, but deletes the old entity first (RECONCILE)
Used when the type of something changes from directory to file
or back. */
}; };
enum csync_ftw_type_e { enum csync_ftw_type_e {
@@ -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);

View File

@@ -44,60 +44,9 @@
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

View File

@@ -43,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.
* *

View File

@@ -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);

View File

@@ -192,7 +192,7 @@ struct csync_file_stat_s {
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];

View File

@@ -283,13 +283,7 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
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:
if (cur->type != other->type) { cur->instruction = CSYNC_INSTRUCTION_SYNC;
// 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;
} else {
cur->instruction = CSYNC_INSTRUCTION_SYNC;
}
break; break;
case CSYNC_INSTRUCTION_IGNORE: case CSYNC_INSTRUCTION_IGNORE:
cur->instruction = CSYNC_INSTRUCTION_IGNORE; cur->instruction = CSYNC_INSTRUCTION_IGNORE;

View File

@@ -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;
} }

View File

@@ -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);

View File

@@ -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,18 +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_NONE;
st->should_update_metadata = true; 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;
} }
@@ -357,7 +328,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
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;
} }
@@ -516,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);
@@ -523,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;
} }
@@ -560,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);
} }
@@ -821,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) {

View File

@@ -55,7 +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 },
{ NULL, CSYNC_INSTRUCTION_ERROR } { NULL, CSYNC_INSTRUCTION_ERROR }
}; };

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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);
} }

View File

@@ -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;
} }

View File

@@ -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;

View File

@@ -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)

View File

@@ -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),
}; };

View File

@@ -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);

View File

@@ -32,7 +32,8 @@ static void setup(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);
*state = csync; *state = csync;
} }
@@ -41,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);
@@ -51,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;
} }
@@ -100,85 +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);
} }
static void check_csync_excluded_traversal(void **state) static void check_csync_excluded_traversal(void **state)
@@ -239,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);
} }
@@ -312,8 +294,8 @@ static void check_csync_excluded_performance(void **state)
gettimeofday(&before, 0); gettimeofday(&before, 0);
for (int 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
@@ -344,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[] = {
@@ -373,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);

View File

@@ -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,19 +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; 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),
}; };

View File

@@ -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;
} }

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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,7 +513,9 @@ 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};
} }
@@ -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 });

View File

@@ -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);

View File

@@ -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( );

View File

@@ -56,8 +56,6 @@ assertLocalAndRemoteDir( '', 0);
printInfo( "Testing with a .sys.admin#recall#" ); printInfo( "Testing with a .sys.admin#recall#" );
system("echo 'dir/file2.dat' > ". $tmpdir . ".sys.admin\#recall\#"); system("echo 'dir/file2.dat' > ". $tmpdir . ".sys.admin\#recall\#");
system("echo 'dir/file3.dat' >> ". $tmpdir . ".sys.admin\#recall\#"); system("echo 'dir/file3.dat' >> ". $tmpdir . ".sys.admin\#recall\#");
system("echo 'nonexistant' >> ". $tmpdir . ".sys.admin\#recall\#");
system("echo '/tmp/t_recall/file4.dat' >> ". $tmpdir . ".sys.admin\#recall\#");
glob_put( "$tmpdir/.sys.admin\#recall\#", "" ); glob_put( "$tmpdir/.sys.admin\#recall\#", "" );
csync(); csync();
@@ -66,14 +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' ) );
assert( !-e glob(localDir().'nonexistant*' ) );
assert( !-e glob('/tmp/t_recall/file4_.sys.admin#recall#-*.dat' ) );
assert( -e glob('/tmp/t_recall/file4.dat' ) );
#Remove the recall file #Remove the recall file
unlink(localDir() . ".sys.admin#recall#"); unlink(localDir() . ".sys.admin#recall#");

View File

@@ -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),

View File

@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -11,44 +11,25 @@ desktop client.
.. note:: Build instructions are subject to change as development proceeds. .. note:: Build instructions are subject to change as development proceeds.
Please check the version for which you want to build. Please check the version for which you want to build.
These instructions are updated to work with version 2.2 of the ownCloud Client. The instructions contained in this topic were updated to work with version 1.7 of the ownCloud Client.
Getting Source Code
-------------------
The :ref:`generic-build-instructions` pull the latest code directly from
GitHub, and work on Linux, Mac OS X, and Windows.
See the next section for instructions on getting source code from Linux
packages.
Linux Linux
----- -----
You may wish to use source packages for your Linux distribution, as these give 1. Add the `ownCloud repository from OBS`_.
you the exact sources from which the binary packages are built. These are 2. Install the dependencies (as root, or using ``sudo``) using the following
hosted on the `ownCloud repository from OBS`_. Go to the `Index of commands for your specific Linux distribution:
repositories`_ to see all the Linux client repos.
1. At the `bottom of the page for each distribution
<https://software.opensuse.org/download/package?project=isv:ownCloud:desktop&
package=owncloud-client>`_ is a "Grab binary packages directly" section.
These contain source RPMs for CentOS, RHEL, Fedora, SLES, and openSUSE.
To get the .deb source packages add the source
repo for your Debian or Ubuntu version, like this example for Debian 8
(run as root)::
echo 'deb-src
http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Debian_8.0/ /' >> /etc/apt/sources.list.d/owncloud-client.list
2. Install the dependencies using the following commands for your specific Linux distribution:
* Debian/Ubuntu: ``apt-get update; apt-get build-dep owncloud-client`` * Debian/Ubuntu: ``apt-get update; apt-get build-dep owncloud-client``
* openSUSE/SLES: ``zypper ref; zypper si -d owncloud-client`` * openSUSE: ``zypper ref; zypper si -d owncloud-client``
* Fedora/CentOS/RHEL: ``yum install yum-utils; yum-builddep owncloud-client`` * Fedora/CentOS: ``yum install yum-utils; yum-builddep owncloud-client``
3. Follow the :ref:`generic-build-instructions`, starting with step 2. 3. Follow the :ref:`generic-build-instructions`.
4. (Optional) Call ``make install`` to install the client to the ``/usr/local/bin`` directory.
.. note:: This step requires the ``mingw32-cross-nsis`` packages be installed on
Windows.
Mac OS X Mac OS X
-------- --------
@@ -82,17 +63,15 @@ To set up your build environment for development using HomeBrew_:
5. For compilation of the client, follow the :ref:`generic-build-instructions`. 5. For compilation of the client, follow the :ref:`generic-build-instructions`.
6. Install the Packages_ package creation tool. 6. In the build directory, run ``admin/osx/create_mac.sh <build_dir>
7. In the build directory, run ``admin/osx/create_mac.sh <build_dir>
<install_dir>``. If you have a developer signing certificate, you can specify <install_dir>``. If you have a developer signing certificate, you can specify
its Common Name as a third parameter (use quotes) to have the package its Common Name as a third parameter (use quotes) to have the package
signed automatically. signed automatically.
.. note:: Contrary to earlier versions, ownCloud 1.7 and later are packaged .. note:: Contrary to earlier versions, ownCloud 1.7 and later are packaged
as a ``pkg`` installer. Do not call "make package" at any time when as a ``pkg`` installer. Do not call "make package" at any time when
compiling for OS X, as this will build a disk image, and will not compiling for OS X, as this will build a disk image, and will not
work correctly. work correctly.
Windows Development Build Windows Development Build
----------------------- -----------------------
@@ -132,62 +111,64 @@ follow `Windows Installer Build (Cross-Compile)`_ instead.
6. Create the build directory:: 6. Create the build directory::
mkdir client-build mkdir client-build
cd client-build cd client-build
7. Build the client:: 7. Build the client::
cmake -G "MinGW Makefiles" ../client cmake -G "MinGW Makefiles" ../client
mingw32-make mingw32-make
.. note:: You can try using ninja to build in parallel using .. note:: You can try using ninja to build in parallel using
``cmake -G Ninja ../client`` and ``ninja`` instead. ``cmake -G Ninja ../client`` and ``ninja`` instead.
.. note:: Refer to the :ref:`generic-build-instructions` section for additional options. .. note:: Refer to the :ref:`generic-build-instructions` section for additional options.
The ownCloud binary will appear in the ``bin`` directory. The ownCloud binary will appear in the ``bin`` directory.
Windows Installer Build (Cross-Compile) Windows Installer Build (Cross-Compile)
--------------------------------------- ---------------------------------------
Due to the large number of dependencies, building the client installer for Windows Due to the large number of dependencies, building the client installer for Windows
is **currently only officially supported on openSUSE**, by using the MinGW cross compiler. is **currently only officially supported on openSUSE**, by using the MinGW cross compiler.
You can set up any currently supported version of openSUSE in a virtual machine if you do not You can set up openSUSE 13.1, 13.2 or openSUSE Factory in a virtual machine if you do not
have it installed already. have it installed already.
In order to make setup simple, you can use the provided Dockerfile to build your own image. To cross-compile:
1. Assuming you are in the root of the ownCloud Client's source tree, you can 1. Add the following repository using YaST or ``zypper ar`` (adjust when using another openSUSE version)::
build an image from this Dockerfile like this::
cd admin/win/docker zypper ar https://build.opensuse.org/project/show/isv:ownCloud:toolchains:mingw:win32:stable
docker build . -t owncloud-client-win32:<version>
Replace ``<version>`` by the version of the client you are building, e.g. 2. Install the cross-compiler packages and the cross-compiled dependencies::
|version| for the release of the client that this document describes.
If you do not wish to use docker, you can run the commands in ``RUN`` manually
in a shell, e.g. to create your own build environment in a virtual machine.
.. note:: Docker images are specific to releases. This one refers to |version|. zypper install cmake make mingw32-cross-binutils mingw32-cross-cpp mingw32-cross-gcc \
Newer releases may have different dependencies, and thus require a later mingw32-cross-gcc-c++ mingw32-cross-pkg-config mingw32-filesystem \
version of the docker image! Always pick the docker image fitting your release mingw32-headers mingw32-runtime site-config mingw32-libwebp \
of ownCloud client! mingw32-cross-libqt5-qmake mingw32-cross-libqt5-qttools mingw32-libqt5*
2. From within the source tree Run the docker instance:: 3. For the installer, install the NSIS installer package::
docker run -v "$PWD:/home/user/client" owncloud-client-win32:<version> \ zypper install mingw32-cross-nsis mingw32-cross-nsis-plugin-uac mingw32-cross-nsis-plugin-nsprocess
/home/user/client/admin/win/docker/build.sh client/ $(id -u)
It will run the build, create an NSIS based installer, as well as run tests. 4. Follow the :ref:`generic-build-instructions`
You will find the resulting binary in an newly created ``build-win32`` subfolder.
If you do not wish to use docker, and ran the ``RUN`` commands above in a virtual machine, .. note:: When building for Windows platforms, you must specify a special
you can run the indented commands in the lower section of ``build.sh`` manually in your toolchain file that enables cmake to locate the platform-specific tools. To add
source tree. this parameter to the call to cmake, enter
``-DCMAKE_TOOLCHAIN_FILE=../client/admin/win/Toolchain-mingw32-openSUSE.cmake``.
4. Finally, you should sign the installer to avoid warnings upon installation. 5. Build by running ``make``.
This requires a `Microsoft Authenticode`_ Certificate ``osslsigncode`` to sign the installer::
osslsigncode -pkcs12 $HOME/.codesign/packages.pfx -h sha256 \ .. note:: Using ``make package`` produces an NSIS-based installer, provided
the NSIS mingw32 packages are installed.
6. If you want to sign the installer, acquire a `Microsoft Authenticode`_ Certificate and install ``osslsigncode`` to sign the installer::
zypper install osslsigncode
7. Sign the package::
osslsigncode -pkcs12 $HOME/.codesign/packages.pfx -h sha1 \
-pass yourpass \ -pass yourpass \
-n "ACME Client" \ -n "ACME Client" \
-i "http://acme.com" \ -i "http://acme.com" \
@@ -198,7 +179,6 @@ In order to make setup simple, you can use the provided Dockerfile to build your
for ``-in``, use the URL to the time stamping server provided by your CA along with the Authenticode certificate. Alternatively, for ``-in``, use the URL to the time stamping server provided by your CA along with the Authenticode certificate. Alternatively,
you may use the official Microsoft ``signtool`` utility on Microsoft Windows. you may use the official Microsoft ``signtool`` utility on Microsoft Windows.
If you're familiar with docker, you can use the version of ``osslsigncode`` that is part of the docker image.
.. _generic-build-instructions: .. _generic-build-instructions:
@@ -209,37 +189,35 @@ Compared to previous versions, building the desktop sync client has become easie
earlier versions, CSync, which is the sync engine library of the client, is now earlier versions, CSync, which is the sync engine library of the client, is now
part of the client source repository and not a separate module. part of the client source repository and not a separate module.
To build the most up-to-date version of the client: You can download the desktop sync client from the ownCloud `Client Download Page`_.
1. Clone the latest versions of the client from Git_ as follows:: To build the most up to date version of the client:
git clone git://github.com/owncloud/client.git 1. Clone the latest versions of the client from Git_ as follows:
cd client
git submodule init
git submodule update
2. Create the build directory:: ``git clone git://github.com/owncloud/client.git``
``git submodule init``
``git submodule update``
mkdir client-build 2. Create the build directory:
cd client-build
3. Configure the client build:: ``mkdir client-build``
``cd client-build``
cmake -DCMAKE_BUILD_TYPE="Debug" .. 3. Configure the client build:
.. note:: You must use absolute paths for the ``include`` and ``library`` ``cmake -DCMAKE_BUILD_TYPE="Debug" ../client``
directories.
.. note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``, ..note:: You must use absolute paths for the ``include`` and ``library``
where ``target`` is a private location, i.e. in parallel to your build directories.
dir by specifying ``../install``.
..note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``,
where ``target`` is a private location, i.e. in parallel to your build
dir by specifying ``../install``.
4. Call ``make``. 4. Call ``make``.
The owncloud binary will appear in the ``bin`` directory. The owncloud binary will appear in the ``bin`` directory.
5. (Optional) Call ``make install`` to install the client to the
``/usr/local/bin`` directory.
The following are known cmake parameters: The following are known cmake parameters:
@@ -252,17 +230,14 @@ The following are known cmake parameters:
* ``BUILD_WITH_QT4=ON``: Builds using Qt4 (even if Qt5 is found). * ``BUILD_WITH_QT4=ON``: Builds using Qt4 (even if Qt5 is found).
* ``CMAKE_INSTALL_PREFIX=path``: Set an install prefix. This is mandatory on Mac OS * ``CMAKE_INSTALL_PREFIX=path``: Set an install prefix. This is mandatory on Mac OS
.. _ownCloud repository from OBS: http://software.opensuse.org/download/package? .. _`ownCloud repository from OBS`: http://software.opensuse.org/download/package?project=isv:ownCloud:desktop&package=owncloud-client
project=isv:ownCloud:desktop&package=owncloud-client
.. _CMake: http://www.cmake.org/download .. _CMake: http://www.cmake.org/download
.. _CSync: http://www.csync.org .. _CSync: http://www.csync.org
.. _Client Download Page: https://owncloud.org/install/#desktop .. _`Client Download Page`: http://owncloud.org/sync-clients/
.. _Git: http://git-scm.com .. _Git: http://git-scm.com
.. _MacPorts: http://www.macports.org .. _MacPorts: http://www.macports.org
.. _Homebrew: http://mxcl.github.com/homebrew/ .. _Homebrew: http://mxcl.github.com/homebrew/
.. _OpenSSL Windows Build: http://slproweb.com/products/Win32OpenSSL.html .. _`OpenSSL Windows Build`: http://slproweb.com/products/Win32OpenSSL.html
.. _Qt: http://www.qt.io/download .. _Qt: http://www.qt.io/download
.. _Microsoft Authenticode: https://msdn.microsoft.com/en-us/library/ie/ms537361%28v=vs.85%29.aspx .. _`Microsoft Authenticode`: https://msdn.microsoft.com/en-us/library/ie/ms537361%28v=vs.85%29.aspx
.. _QtKeychain: https://github.com/frankosterfeld/qtkeychain .. _QtKeychain: https://github.com/frankosterfeld/qtkeychain
.. _Packages: http://s.sudre.free.fr/Software/Packages/about.html
.. _Index of repositories: http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/

View File

@@ -41,7 +41,7 @@ master_doc = 'index'
# General information about the project. # General information about the project.
project = u'ownCloud Client Manual' project = u'ownCloud Client Manual'
copyright = u'2013-2016, The ownCloud developers' copyright = u'2013, The ownCloud developers'
# The version info for the project you're documenting, acts as replacement for # The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the # |version| and |release|, also used in various other places throughout the
@@ -250,7 +250,7 @@ texinfo_documents = [
epub_title = u'ownCloud Client Manual' epub_title = u'ownCloud Client Manual'
epub_author = u'The ownCloud developers' epub_author = u'The ownCloud developers'
epub_publisher = u'The ownCloud developers' epub_publisher = u'The ownCloud developers'
epub_copyright = u'2013-2016, The ownCloud developers' epub_copyright = u'2013, The ownCloud developers'
# The language of the text. It defaults to the language option # The language of the text. It defaults to the language option
# or en if the language is not set. # or en if the language is not set.
@@ -288,5 +288,3 @@ epub_copyright = u'2013-2016, The ownCloud developers'
# Include todos? # Include todos?
todo_include_todos = True todo_include_todos = True
rst_epilog = '.. |version| replace:: %s' % version

View File

@@ -22,9 +22,3 @@ You can change the following configuration settings (must be under the ``[ownClo
- ``maxLogLines`` (default: ``20000``) -- Specifies the maximum number of log lines displayed in the log window. - ``maxLogLines`` (default: ``20000``) -- Specifies the maximum number of log lines displayed in the log window.
- ``chunkSize`` (default: ``5242880``) -- Specifies the chunk size of uploaded files in bytes.
- ``promptDeleteAllFiles`` (default: ``true``) -- If a UI prompt should ask for confirmation if it was detected that all files and folders were deleted.
- ``notificationRefreshInterval`` (default``300,000``) -- Specifies the default interval of checking for new server notifications in milliseconds.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

Some files were not shown because too many files have changed in this diff Show More