Comparar commits

..

14 Commits

Autor SHA1 Mensagem Data
Daniel Molkentin 942136167a Add travis file 2014-08-27 14:01:35 +02:00
Daniel Molkentin 2c6324e3e5 Fix tests 2014-08-27 10:27:29 +02:00
Jenkins for ownCloud e442ba863a [tx-robot] updated from transifex 2014-08-27 01:25:26 -04:00
Daniel Molkentin e5471d8318 Build after merge 2014-08-26 14:33:21 +02:00
Daniel Molkentin 902bb7a198 Merge remote-tracking branch 'origin/master' into move_lib_to_sep_dir
Conflicts:
	src/CMakeLists.txt
	src/gui/accountsettings.cpp
	src/gui/folderwizard.cpp
	src/gui/settingsdialog.cpp
	src/libsync/syncengine.h
2014-08-26 11:29:42 +02:00
Daniel Molkentin 4fc044d368 Merge branch 'master' into move_lib_to_sep_dir
Conflicts:
	cmake/modules/NSIS.template.in
	src/CMakeLists.txt
	src/creds/shibboleth/authenticationdialog.cpp
	src/creds/shibboleth/authenticationdialog.h
	src/gui/owncloudgui.cpp
	src/libsync/creds/shibboleth/authenticationdialog.cpp
	src/libsync/creds/shibboleth/authenticationdialog.h
	src/libsync/mirallaccessmanager.cpp
	src/mirall/authenticationdialog.cpp
	src/mirall/authenticationdialog.h
2014-08-12 21:08:44 +02:00
Daniel Molkentin bb32831a60 Merge remote-tracking branch 'origin/master' into move_lib_to_sep_dir
Conflicts:
	src/gui/folderman.cpp
2014-07-17 11:31:45 +02:00
Daniel Molkentin ea690c285b Make NSIS installer work with new structure 2014-07-14 13:12:31 +02:00
Daniel Molkentin 28879712e9 Make krazy target work again 2014-07-14 12:19:32 +02:00
Daniel Molkentin 3c2e43d883 Merge remote-tracking branch 'origin/master' into move_lib_to_sep_dir 2014-07-14 10:50:53 +02:00
Daniel Molkentin 5041880854 Try to handle BUILD_LIBRARIES_ONLY correctly
Also, try to fix OS X build
2014-07-11 12:36:01 +02:00
Daniel Molkentin 2c904afd04 OS X explicitly requires the neon include path to be set 2014-07-11 12:11:04 +02:00
Daniel Molkentin 2cc13fb74a Fix includes in mac specific headers 2014-07-11 11:38:01 +02:00
Daniel Molkentin df3c3bca02 Split into three separate projects: library, gui and cmd 2014-07-11 11:07:31 +02:00
383 arquivos alterados com 26783 adições e 188451 exclusões
+1 -1
Ver Arquivo
@@ -2,4 +2,4 @@
.gitignore export-ignore
.gitattributes export-ignore
.commit-template export-ignore
binary/ export-ignore
/binary export-ignore
+1 -1
Ver Arquivo
@@ -3,7 +3,7 @@
url = https://github.com/owncloud/documentation
[submodule "src/3rdparty/qtmacgoodies"]
path = src/3rdparty/qtmacgoodies
url = git://github.com/shadone/qtmacgoodies.git
url = git://github.com/guruz/qtmacgoodies.git
[submodule "binary"]
path = binary
url = git://github.com/owncloud/owncloud-client-binary.git
+35
Ver Arquivo
@@ -0,0 +1,35 @@
language: cpp
compiler:
- gcc
- clang
env:
- QT=qt4
- QT=qt5 PATH=/opt/Qt/5.3/gcc_64/bin:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin
os:
- linux
- osx
before_install:
- sh -c "if [ '$QT' = 'qt4' ]; then wget http://download.opensuse.org/repositories/isv:ownCloud:desktop/xUbuntu_12.04/Release.key; sudo apt-key add - < Release.key; fi"
- sudo sh -c "if [ '$QT' = 'qt4' ]; then echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/xUbuntu_12.04/ /' > /etc/apt/sources.list.d/qtkeychain.list; fi"
- sh -c "if [ '$QT' = 'qt4' ]; then sudo apt-get update -qq; sudo apt-get install -qq libqt4-dev qt4-dev-tools libqtkeychain-dev; fi"
- sh -c "if [ '$QT' = 'qt5' ]; then sudo apt-add-repository -y ppa:canonical-qt5-edgers/qt5-daily; sudo apt-get update -qq; sudo apt-get install -qq qtdeclarative5-dev libqt5webkit5-dev qttools5-dev; fi"
- sh -c "if [ '$QT' = 'qt5' ]; then wget http://download.opensuse.org/repositories/home:/DeepDiver1975:/branches:/isv:/ownCloud:/desktop/xUbuntu_13.10/Release.key; sudo apt-key add - < Release.key; fi"
- sudo sh -c "if [ '$QT' = 'qt5' ]; then echo 'deb http://download.opensuse.org/repositories/home:/DeepDiver1975:/branches:/isv:/ownCloud:/desktop/xUbuntu_13.10/ /' > /etc/apt/sources.list.d/qt5keychain.list; fi"
- sh -c "if [ '$QT' = 'qt5' ]; then wget http://download.owncloud.com/download/qt-5.3-travis.tar.xz; fi"
- sh -c "if [ '$QT' = 'qt5' ]; then sudo tar xif -C /opt ~/qt-5.3-travis.tar.xz; fi"
- sudo apt-get update -qq
- sudo apt-get install -qq cmake sqlite3 libneon27-gnutls-dev
before_script:
- mkdir build
- cd build
- cmake -DUNIT_TESTING=1 ..
script:
- make
- ctest --output-on-failure
+3 -24
Ver Arquivo
@@ -14,19 +14,12 @@ if ( EXISTS ${OEM_THEME_DIR}/OEM.cmake )
else ()
include ( ${CMAKE_SOURCE_DIR}/OWNCLOUD.cmake )
endif()
# need this logic to not mess with re/uninstallations via macosx.pkgproj
if(${APPLICATION_REV_DOMAIN} STREQUAL "com.owncloud.desktopclient")
set(APPLICATION_REV_DOMAIN_INSTALLER "com.ownCloud.client")
else()
set(APPLICATION_REV_DOMAIN_INSTALLER ${APPLICATION_REV_DOMAIN})
endif()
if (NOT DEFINED APPLICATION_SHORTNAME)
set ( APPLICATION_SHORTNAME ${APPLICATION_NAME} )
endif()
include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
configure_file( ${CMAKE_SOURCE_DIR}/src/mirall/version.h.in "${CMAKE_CURRENT_BINARY_DIR}/src/mirall/version.h" )
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/src/mirall/")
#####
@@ -58,7 +51,6 @@ if (${GIT_SHA1} STREQUAL "GITDIR-NOTFOUND")
set (GIT_SHA1 "${sha1_candidate}")
endif()
endif()
message(STATUS "GIT_SHA1 ${GIT_SHA1}")
endif()
set(SYSCONFDIR ${SYSCONF_INSTALL_DIR})
@@ -69,9 +61,9 @@ set(DATADIR ${DATA_INSTALL_DIR})
# BUILD_OWNCLOUD_OSX_BUNDLE was not initialized OR set to true on OSX
if(APPLE AND (NOT DEFINED BUILD_OWNCLOUD_OSX_BUNDLE OR BUILD_OWNCLOUD_OSX_BUNDLE))
set(BUILD_OWNCLOUD_OSX_BUNDLE ON)
set(OWNCLOUD_OSX_BUNDLE "${APPLICATION_EXECUTABLE}.app")
set(LIB_INSTALL_DIR "${APPLICATION_EXECUTABLE}.app/Contents/MacOS")
set(BIN_INSTALL_DIR "${APPLICATION_EXECUTABLE}.app/Contents/MacOS")
set(OWNCLOUD_OSX_BUNDLE "bin/${APPLICATION_EXECUTABLE}.app")
set(LIB_INSTALL_DIR "bin/${APPLICATION_EXECUTABLE}.app/Contents/MacOS")
set(BIN_INSTALL_DIR "bin/${APPLICATION_EXECUTABLE}.app/Contents/MacOS")
# BUILD_OWNCLOUD_OSX_BUNDLE was disabled on OSX
elseif(APPLE AND NOT BUILD_OWNCLOUD_OSX_BUNDLE)
@@ -130,22 +122,11 @@ find_package(Sphinx)
find_package(PdfLatex)
find_package(SQLite3 3.8.0 REQUIRED)
# On some OS, we want to use our own, not the system sqlite
if (USE_OUR_OWN_SQLITE3)
include_directories(BEFORE ${SQLITE3_INCLUDE_DIR})
endif()
configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
configure_file(test/test_journal.db "${CMAKE_BINARY_DIR}/test/test_journal.db" COPYONLY)
# Copy that logo, the installer uses it later
if(BUILD_OWNCLOUD_OSX_BUNDLE)
install(FILES resources/owncloud_logo_blue.png DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/)
endif()
include(OwnCloudCPack.cmake)
add_definitions(-DUNICODE)
@@ -162,7 +143,6 @@ add_subdirectory(csync)
add_subdirectory(src)
add_subdirectory(shell_integration)
add_subdirectory(doc)
add_subdirectory(admin)
if(UNIT_TESTING)
include(CTest)
@@ -174,5 +154,4 @@ if(BUILD_OWNCLOUD_OSX_BUNDLE)
configure_file(sync-exclude.lst ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/sync-exclude.lst COPYONLY)
else()
install( FILES sync-exclude.lst DESTINATION ${SYSCONFDIR}/${APPLICATION_SHORTNAME} )
configure_file(sync-exclude.lst bin/sync-exclude.lst COPYONLY)
endif()
+1 -84
Ver Arquivo
@@ -1,89 +1,6 @@
ChangeLog
=========
version 1.7.1 (release 2014-12-18)
* Documentation fixes and updates
* Nautilus Python plugin fixed for Python 3
* GUI wording fixes plus improved log messages
* Fix hidning of the database files in the sync directories
* Compare http download size with the header value to avoid broken
downloads, bug #2528
* Avoid initial ETag fetch job at startup, which is not needed.
* Add chunk size http header to PUT requests
* Fixed deteteCookie method of our CookieJar, fix for Shibboleth
* Added fallback for distros where XDG_RUNTIME_DIR is undefined
* Fix the setup wizard, bug #1989, #2264
* Fix scheduling of ETag check jobs, bug #2553
* Fix to avoid syncing more than one folder at a time, bug #2407
* Use fife minutes timeout for all network jobs
* Cleanup for Folderwizard wording
* Improve journal check: Remove corrupted journal files, bug #2547
* Fix item count in progress dialog for deletes, bug #1132
* Display correct file count on deletion (#1132)
* Fix reinitializing the folder using the wizard in certain cases (#2606)
* Mac OS: Fixed branding of the pkg file
* Mac OS: Fix display of overlay icons in certain situations (#1132)
* Mac OS: Use a bundled version of OpenSSL (#764, #2600, #2510)
* Win32: improved filesystem watcher
* Win32: Improve threading with shell integration
* Win32: Upgraded to OpenSSL 1.0.1j
* Win32: Improve reliability of Installer, fix removal of Shell Extensions
version 1.7.0 (release 2014-11-07)
* oC7 Sharing: Handle new sharing options of ownCloud 7 correctly.
* Added Selective sync: Ability to unselect server folders which are
excluded from syncing, plus GUI and setup GUI
* Added overlay icons for Windows Explorer, Mac OS Finder and GNOME Nautilus.
Information is provided by the client via a local socket / named pipe API
which provides information about the sync status of files.
* Improved local change detection: consider file size, detect files
with ongoing changes and do not upload immediately
* Improved HTTP request timeout handler: all successful requests reset
the timeout counter
* Improvements for syncing command line tool: netrc support, improved
SSL support, non interactive mode
* Permission system: ownCloud 7 delivers file and folder permissions,
added ability to deal with it for shared folders and more.
* Ignore handling: Do not recurse into ignored or excluded directories
* Major sync journal database improvements for more stability and performance
* New library interface to sqlite3
* Improve "resync handling" if errors occur
* Blacklist improvements
* Improved logging: more useful meta info, removed noise
* Updated to latest Qt5 versions on Windows and OS X
* Fixed data loss when renaming a download temporary fails and there was
a conflict at the same time.
* Fixed missing warnings about reusing a sync folder when the back button
was used in the advanced folder setup wizard.
* The 'Retry Sync' button now also restarts all downloads.
* Clean up temporary downloads and some extra database files when wiping a
folder.
* OS X: Sparkle update to provide pkg format properly
* OS X: Change distribution format from dmg to pkg with new installer.
* Windows: Fix handling of filenames with trailing dot or space
* Windows: Don't use the wrong way to get file mtimes in the legacy propagator.
version 1.6.4 (release 2014-10-22)
* Fix startup logic, fixes bug #1989
* Fix raise dialog on X11
* Win32: fix overflow when computing the size of file > 4GiB
* Use a fixed function to get files modification time, the
original one was broken for certain timezone issues, see
core bug #9781 for details
* Added some missing copyright headers
* Avoid data corruption due to wrong error handling, bug #2280
* Do improved request timeout handling to reduce the number of
timed out jobs, bug #2155
version 1.6.3 (release 2014-09-03)
* Fixed updater on OS X
* Fixed memory leak in SSL button that could lead to quick memory draining
* Fixed upload problem with files >4 GB
* MacOSX, Linux: Bring Settings window to front properly
* Branded clients: If no configuration is detected, try to import the data
from a previously configured community edition.
version 1.6.2 (release 2014-07-28 )
* Limit the HTTP buffer size when downloading to limit memory consumption.
version 1.6.2 (release 2014-07-x )
* Another small mem leak fixed in HTTP Credentials.
* Fix local file name clash detection for MacOSX.
* Limit maximum wait time to ten seconds in network limiting.
-4
Ver Arquivo
@@ -8,9 +8,5 @@ set( APPLICATION_UPDATE_URL "https://updates.owncloud.com/client/" CACHE string
set( THEME_CLASS "ownCloudTheme" )
set( APPLICATION_REV_DOMAIN "com.owncloud.desktopclient" )
set( WIN_SETUP_BITMAP_PATH "${CMAKE_SOURCE_DIR}/admin/win/nsi" )
set( MAC_INSTALLER_BACKGROUND_FILE "${CMAKE_SOURCE_DIR}/admin/osx/installer-background.png" CACHE STRING "The MacOSX installer background image")
# set( THEME_INCLUDE "${OEM_THEME_DIR}/mytheme.h" )
# set( APPLICATION_LICENSE "${OEM_THEME_DIR}/license.txt )
+1 -1
Ver Arquivo
@@ -18,7 +18,7 @@ It uses OCSync as its syncing backend.
## Building the source code
Please refer to doc/building.rst, or
[Building the Client](http://doc.owncloud.org/desktop/1.7/building.html)
[Building the Client](http://doc.owncloud.org/desktop/1.5/building.html)
in the ownCloud client manual.
## Authors
+2 -2
Ver Arquivo
@@ -1,10 +1,10 @@
set( MIRALL_VERSION_MAJOR 1 )
set( MIRALL_VERSION_MINOR 7 )
set( MIRALL_VERSION_PATCH 1 )
set( MIRALL_VERSION_PATCH 0 )
set( MIRALL_SOVERSION 0 )
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
set( MIRALL_VERSION_SUFFIX "") #e.g. beta1, beta2, rc1
set( MIRALL_VERSION_SUFFIX "beta1") #e.g. beta1, beta2, rc1
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
if( NOT DEFINED MIRALL_VERSION_BUILD )
-2
Ver Arquivo
@@ -1,2 +0,0 @@
# traverse into osx subdirectory to install and patch the create-pack script
add_subdirectory(osx)
-16
Ver Arquivo
@@ -1,16 +0,0 @@
# Check if varialbe MAC_INSTALLER_BACKGROUND_FILE is defined. That might come
# from the OEM.cmake for branded clients or from OWNCLOUD.cmake for the non
# branded client.
# Make sure that the MAC_INSTALLER_BACKGROUND_FILE contains the full path, ie.
# includes CMAKE_SOURCE_DIR or so.
if (DEFINED MAC_INSTALLER_BACKGROUND_FILE )
set(MAC_INSTALLER_DO_CUSTOM_BACKGROUND "1")
else()
set(MAC_INSTALLER_DO_CUSTOM_BACKGROUND "0")
endif()
configure_file(create_mac_pkg.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/create_mac.sh)
configure_file(macosx.pkgproj ${CMAKE_CURRENT_BINARY_DIR}/macosx.pkgproj)
configure_file(pre_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh)
Arquivo executável
+45
Ver Arquivo
@@ -0,0 +1,45 @@
#!/bin/bash
# Script to create the Mac installer using the packages tool from
# http://s.sudre.free.fr/Software/Packages/about.html
#
# the path of installation must be given as parameter
if [ -z "$1" ]; then
echo "ERROR: Provide the CMAKE_INSTALL_DIR to this script."
exit 1
fi
prjfile="admin/osx/macosx.pkgproj"
if [ ! -f $prjfile ]; then
echo "ERROR: macosx.pkgproj not in admin dir, start from CMAKE_SOURCE_DIR!"
exit 2
fi
pack="admin/ownCloud Installer.pkg"
rm -f $pack
install_path=$1
# The name of the installer package
installer=ownCloud\ Installer.pkg
# The command line tool of the "Packages" tool, see link above.
pkgbuild=/usr/local/bin/packagesbuild
$pkgbuild -F $install_path $prjfile
rc=$?
if [ $rc == 0 ]; then
echo "Successfully created $pack"
else
echo "Failed to create $pack"
exit 3
fi
# FIXME: Sign the finished package.
# See http://s.sudre.free.fr/Software/documentation/Packages/en/Project_Configuration.html#5
# certname=gdbsign
# productsign --cert $certname admin/$installer ./$installer
-74
Ver Arquivo
@@ -1,74 +0,0 @@
#!/bin/bash
# Script to create the Mac installer using the packages tool from
# http://s.sudre.free.fr/Software/Packages/about.html
#
[ "$#" -lt 2 ] && echo "Usage: create_mac_pkg.sh <CMAKE_INSTALL_DIR> <build dir> <installer sign identity>" && exit
# the path of installation must be given as parameter
if [ -z "$1" ]; then
echo "ERROR: Provide the path to CMAKE_INSTALL_DIR to this script as first parameter."
exit 1
fi
if [ -z "$2" ]; then
echo "ERROR: Provide the path to build directory as second parameter."
exit 1
fi
install_path="$1"
build_path="$2"
identity="$3"
prjfile=$build_path/admin/osx/macosx.pkgproj
# The name of the installer package
installer="@APPLICATION_NAME@-@MIRALL_VERSION_FULL@@MIRALL_VERSION_SUFFIX@"
installer_file="$installer.pkg"
installer_file_tar="$installer.pkg.tar"
installer_file_tar_bz2="$installer.pkg.tar.bz2"
installer_file_tbz="$installer.pkg.tbz"
# set the installer name to the copied prj config file
/usr/local/bin/packagesutil --file $prjfile set project name "$installer"
# The command line tool of the "Packages" tool, see link above.
pkgbuild=/usr/local/bin/packagesbuild
$pkgbuild -F $install_path $prjfile
rc=$?
if [ $rc == 0 ]; then
echo "Successfully created $installer_file"
else
echo "Failed to create $installer_file"
exit 3
fi
# Sign the finished package if desired.
if [ ! -z "$identity" ]; then
echo "Will try to sign the installer"
pushd $install_path
productsign --sign "$identity" "$installer_file" "$installer_file.new"
mv "$installer_file".new $installer_file
popd
else
echo "No certificate given, will not sign the pkg"
fi
# FIXME: OEMs?
# they will need to do their own signing..
# Sparkle wants a tbz, it cannot install raw pkg
cd $install_path
tar cf "$installer_file_tar" "$installer_file"
bzip2 -9 "$installer_file_tar"
mv "$installer_file_tar_bz2" "$installer_file_tbz"
rc=$?
if [ $rc == 0 ]; then
echo "Successfully created $installer_file"
else
echo "Failed to create $installer_file"
exit 3
fi
Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 6.2 KiB

-51
Ver Arquivo
@@ -1,51 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
enable-background="new 0 0 595.275 311.111"
xml:space="preserve"
height="200"
width="320"
version="1.1"
y="0px"
x="0px"
viewBox="0 0 35 0"
id="svg2"
inkscape:version="0.48.4 r9939"
sodipodi:docname="installer-background.svg"><metadata
id="metadata12"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs10" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1002"
id="namedview8"
showgrid="false"
inkscape:zoom="0.734375"
inkscape:cx="-49.141255"
inkscape:cy="236.17459"
inkscape:window-x="0"
inkscape:window-y="34"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" /><path
style="text-indent:0;text-transform:none;block-progression:tb;color:#000000;fill:#ffffff;fill-opacity:1;enable-background:accumulate"
d="m 75.63384,28.421489 c -29.36582,0 -53.09172,23.724901 -53.09172,53.091701 0,12.1047 4.03087,23.2455 10.82647,32.1667 14.74225,-17.0631 36.50138,-27.8988 60.79508,-27.8988 11.88546,0 23.15644,2.6467 33.31219,7.2871 0.82221,-3.7185 1.24924,-7.5856 1.24924,-11.555 0,-29.3658 -23.72491,-53.091701 -53.09172,-53.091701 z M 6.30358,52.98809 c -15.29297,0 -27.58645,12.3977 -27.58645,27.6906 0,4.9515 1.27738,9.6301 3.53933,13.6373 9.22826,-5.206 19.89756,-8.2239 31.23002,-8.2239 1.09366,0 2.14708,0.039 3.22713,0.1052 -0.12231,-1.5502 -0.20806,-3.103 -0.20806,-4.6844 0,-8.5178 1.85002,-16.6223 5.10106,-23.9429 -4.37708,-2.9351 -9.62115,-4.5803 -15.30284,-4.5803 z m 130.95716,19.0502 c -1.12983,0 -2.21885,0.1381 -3.33122,0.2078 0.48121,3.0338 0.83274,6.097 0.83274,9.2651 0,4.9298 -0.62692,9.6869 -1.7697,14.2616 13.39754,7.4144 24.52385,18.5084 31.8547,31.9586 7.60342,-3.9586 16.08566,-6.4754 25.08804,-7.0787 -2.32015,-27.2093 -24.86184,-48.6137 -52.67416,-48.6137 z m -43.09675,19.7789 c -41.09117,0 -74.32775,33.2333 -74.32775,74.3278 0,41.0911 33.23329,74.3277 74.32775,74.3277 41.09447,0 74.32775,-33.2366 74.32775,-74.3277 0,-41.0945 -33.23657,-74.3278 -74.32775,-74.3278 z m -80.67652,0.3117 c -31.87937,0 -57.67166,25.792 -57.67166,57.6717 0,18.7668 8.94156,35.3802 22.79774,45.9078 5.84147,-11.2667 17.57406,-18.9461 31.1258,-18.9461 1.63789,0 3.21,0.1986 4.78871,0.4169 -0.49554,-3.6054 -0.72871,-7.2937 -0.72871,-11.0346 0,-17.8847 5.82174,-34.4234 15.71907,-47.7819 -5.92466,-7.4133 -10.1643,-16.321 -11.97162,-26.025 -1.33935,-0.092 -2.69673,-0.2078 -4.05979,-0.2078 z m 180.71831,34.3544 c -9.68,0 -18.74781,2.4714 -26.75364,6.6625 4.54607,10.0696 7.07867,21.2422 7.07867,32.9998 0,22.0146 -8.85114,42.0052 -23.21431,56.5275 10.5516,11.7145 25.861,19.0503 42.88961,19.0503 31.87937,0 57.67165,-25.7916 57.67165,-57.6717 0,-31.8793 -25.79195,-57.5664 -57.67165,-57.5664 z m -244.00885,7.5998 c -29.3701,0 -53.19693,23.6164 -53.19693,52.9832 0,29.3669 23.82815,53.1937 53.19364,53.1937 11.17727,0 21.53161,-3.4825 30.08487,-9.369 -3.5344,-5.492 -5.62151,-12.0581 -5.62151,-19.0503 0,-3.6291 0.53552,-7.1158 1.56148,-10.4099 -16.01267,-11.5721 -26.44131,-30.4034 -26.44131,-51.6319 0,-5.394 0.71083,-10.6098 1.97792,-15.6152 -0.52591,-0.013 -1.03171,-0.1052 -1.56152,-0.1052 z m 312.19495,45.5955 c -1.56661,0 -3.08252,0.1789 -4.58026,0.4169 0.0829,1.3242 0.1039,2.6108 0.1039,3.9559 0,16.9326 -6.68118,32.3015 -17.4889,43.7214 5.31706,6.1831 13.12695,10.0976 21.96526,10.0976 16.09849,0 29.14785,-12.9451 29.14785,-29.0439 0,-16.0985 -13.04936,-29.1479 -29.14785,-29.1479 z m -252.64924,3.1229 c -16.09783,0 -29.04395,12.9461 -29.04395,29.044 0,16.0978 12.94612,29.1478 29.04395,29.1478 12.33919,0 22.81287,-7.6994 27.06599,-18.5298 -10.378,-10.57 -17.83675,-24.0544 -21.13213,-39.0363 -1.92854,-0.3985 -3.88588,-0.6247 -5.93386,-0.6247 z"
id="path6"
inkscape:connector-curvature="0" /></svg>

Antes

Largura:  |  Altura:  |  Tamanho: 4.6 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 13 KiB

-336
Ver Arquivo
@@ -1,336 +0,0 @@
#!/usr/bin/python
# This file is part of ownCloud.
# It was inspired in large part by the macdeploy script in Clementine
# and Tomahawk
#
# ownCloud is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# ownCLoud is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ownCloud. If not, see <http://www.gnu.org/licenses/>.
import os
import re
import subprocess
import commands
import sys
from glob import glob
def QueryQMake(attrib):
return subprocess.check_output([qmake_path, '-query', attrib]).rstrip('\n')
FRAMEWORK_SEARCH_PATH=[
'/Library/Frameworks',
os.path.join(os.environ['HOME'], 'Library/Frameworks')
]
LIBRARY_SEARCH_PATH=['/usr/local/lib', '.']
QT_PLUGINS = [
'sqldrivers/libqsqlite.dylib',
'platforms/libqcocoa.dylib',
'imageformats/libqgif.dylib',
'imageformats/libqico.dylib',
'imageformats/libqjpeg.dylib',
'imageformats/libqsvg.dylib',
'imageformats/libqmng.dylib',
]
QT_PLUGINS_SEARCH_PATH=[
# os.path.join(os.environ['QTDIR'], 'plugins'),
'/usr/local/Cellar/qt/5.2.1/plugins',
]
class Error(Exception):
pass
class CouldNotFindQtPluginErrorFindFrameworkError(Error):
pass
class InstallNameToolError(Error):
pass
class CouldNotFindQtPluginError(Error):
pass
class CouldNotFindScriptPluginError(Error):
pass
class CouldNotFindFrameworkError(Error):
pass
if len(sys.argv) < 3:
print 'Usage: %s <bundle.app> <path-to-qmake>' % sys.argv[0]
exit()
def is_exe(fpath):
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
bundle_dir = sys.argv[1]
qmake_path = sys.argv[2]
bundle_name = os.path.basename(bundle_dir).split('.')[0]
commands = []
binary_dir = os.path.join(bundle_dir, 'Contents', 'MacOS')
frameworks_dir = os.path.join(bundle_dir, 'Contents', 'Frameworks')
commands.append(['mkdir', '-p', frameworks_dir])
resources_dir = os.path.join(bundle_dir, 'Contents', 'Resources')
commands.append(['mkdir', '-p', resources_dir])
plugins_dir = os.path.join(bundle_dir, 'Contents', 'PlugIns')
binaries = [i for i in glob(os.path.join(bundle_dir, 'Contents', 'MacOS', "*")) if is_exe(i)];
fixed_libraries = []
fixed_frameworks = []
def WriteQtConf():
print "Writing qt.conf..."
with open(os.path.join(resources_dir, 'qt.conf'), 'w') as f:
f.write("[Paths]\nPlugins = PlugIns\n");
f.close()
def GetBrokenLibraries(binary):
#print "Checking libs for binary: %s" % binary
output = subprocess.Popen(['otool', '-L', binary], stdout=subprocess.PIPE).communicate()[0]
broken_libs = {
'frameworks': [],
'libs': []}
for line in [x.split(' ')[0].lstrip() for x in output.split('\n')[1:]]:
#print "Checking line: %s" % line
if not line: # skip empty lines
continue
if os.path.basename(binary) == os.path.basename(line):
#print "mnope %s-%s" % (os.path.basename(binary), os.path.basename(line))
continue
if re.match(r'^\s*/System/', line):
continue # System framework
elif re.match(r'^\s*/usr/lib/', line):
#print "unix style system lib"
continue # unix style system library
elif re.match(r'Breakpad', line):
continue # Manually added by cmake.
elif re.match(r'^\s*@executable_path', line) or re.match(r'^\s*@loader_path', line):
# Potentially already fixed library
if '.framework' in line:
relative_path = os.path.join(*line.split('/')[3:])
if not os.path.exists(os.path.join(frameworks_dir, relative_path)):
broken_libs['frameworks'].append(relative_path)
else:
relative_path = os.path.join(*line.split('/')[1:])
#print "RELPATH %s %s" % (relative_path, os.path.join(binary_dir, relative_path))
if not os.path.exists(os.path.join(binary_dir, relative_path)):
broken_libs['libs'].append(relative_path)
elif re.search(r'\w+\.framework', line):
broken_libs['frameworks'].append(line)
else:
broken_libs['libs'].append(line)
return broken_libs
def FindFramework(path):
search_pathes = FRAMEWORK_SEARCH_PATH
search_pathes.insert(0, QueryQMake('QT_INSTALL_LIBS'))
for search_path in search_pathes:
abs_path = os.path.join(search_path, path)
if os.path.exists(abs_path):
return abs_path
raise CouldNotFindFrameworkError(path)
def FindLibrary(path):
if os.path.exists(path):
return path
search_pathes = LIBRARY_SEARCH_PATH
search_pathes.insert(0, QueryQMake('QT_INSTALL_LIBS'))
for search_path in search_pathes:
abs_path = os.path.join(search_path, path)
if os.path.exists(abs_path):
return abs_path
else: # try harder---look for lib name in library folders
newpath = os.path.join(search_path,os.path.basename(path))
if os.path.exists(newpath):
return newpath
return ""
#raise CouldNotFindFrameworkError(path)
def FixAllLibraries(broken_libs):
for framework in broken_libs['frameworks']:
FixFramework(framework)
for lib in broken_libs['libs']:
FixLibrary(lib)
def FixFramework(path):
if path in fixed_libraries:
return
else:
fixed_libraries.append(path)
abs_path = FindFramework(path)
broken_libs = GetBrokenLibraries(abs_path)
FixAllLibraries(broken_libs)
new_path = CopyFramework(abs_path)
id = os.sep.join(new_path.split(os.sep)[3:])
FixFrameworkId(new_path, id)
for framework in broken_libs['frameworks']:
FixFrameworkInstallPath(framework, new_path)
for library in broken_libs['libs']:
FixLibraryInstallPath(library, new_path)
def FixLibrary(path):
if path in fixed_libraries or FindSystemLibrary(os.path.basename(path)) is not None:
return
else:
fixed_libraries.append(path)
abs_path = FindLibrary(path)
if abs_path == "":
print "Could not resolve %s, not fixing!" % path
return
broken_libs = GetBrokenLibraries(abs_path)
FixAllLibraries(broken_libs)
new_path = CopyLibrary(abs_path)
FixLibraryId(new_path)
for framework in broken_libs['frameworks']:
FixFrameworkInstallPath(framework, new_path)
for library in broken_libs['libs']:
FixLibraryInstallPath(library, new_path)
def FixPlugin(abs_path, subdir):
broken_libs = GetBrokenLibraries(abs_path)
FixAllLibraries(broken_libs)
new_path = CopyPlugin(abs_path, subdir)
for framework in broken_libs['frameworks']:
FixFrameworkInstallPath(framework, new_path)
for library in broken_libs['libs']:
FixLibraryInstallPath(library, new_path)
def FixBinary(path):
broken_libs = GetBrokenLibraries(path)
FixAllLibraries(broken_libs)
for framework in broken_libs['frameworks']:
FixFrameworkInstallPath(framework, path)
for library in broken_libs['libs']:
FixLibraryInstallPath(library, path)
def CopyLibrary(path):
new_path = os.path.join(binary_dir, os.path.basename(path))
args = ['ditto', '--arch=x86_64', path, new_path]
commands.append(args)
args = ['chmod', 'u+w', new_path]
commands.append(args)
return new_path
def CopyPlugin(path, subdir):
new_path = os.path.join(plugins_dir, subdir, os.path.basename(path))
args = ['mkdir', '-p', os.path.dirname(new_path)]
commands.append(args)
args = ['ditto', '--arch=x86_64', path, new_path]
commands.append(args)
args = ['chmod', 'u+w', new_path]
commands.append(args)
return new_path
def CopyFramework(path):
parts = path.split(os.sep)
print "CopyFramework:", path
for i, part in enumerate(parts):
matchObj = re.match(r'(\w+\.framework)', part)
if matchObj:
full_path = os.path.join(frameworks_dir, *parts[i:-1])
framework = matchObj.group(1)
break
args = ['mkdir', '-p', full_path]
commands.append(args)
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)
args = ['chmod', 'u+w', os.path.join(frameworks_dir, framework, "Resources")]
commands.append(args)
info_plist = os.path.join(os.path.split(path)[0], '..', '..', 'Contents', 'Info.plist')
if os.path.exists(info_plist):
args = ['cp', '-r', info_plist, os.path.join(frameworks_dir, framework, "Resources")]
commands.append(args)
return os.path.join(full_path, parts[-1])
def FixId(path, library_name):
id = '@executable_path/../Frameworks/%s' % library_name
args = ['install_name_tool', '-id', id, path]
commands.append(args)
def FixLibraryId(path):
library_name = os.path.basename(path)
FixId(path, library_name)
def FixFrameworkId(path, id):
FixId(path, id)
def FixInstallPath(library_path, library, new_path):
args = ['install_name_tool', '-change', library_path, new_path, library]
commands.append(args)
def FindSystemLibrary(library_name):
for path in ['/lib', '/usr/lib']:
full_path = os.path.join(path, library_name)
if os.path.exists(full_path):
return full_path
return None
def FixLibraryInstallPath(library_path, library):
system_library = FindSystemLibrary(os.path.basename(library_path))
if system_library is None:
new_path = '@executable_path/../MacOS/%s' % os.path.basename(library_path)
FixInstallPath(library_path, library, new_path)
else:
FixInstallPath(library_path, library, system_library)
def FixFrameworkInstallPath(library_path, library):
parts = library_path.split(os.sep)
for i, part in enumerate(parts):
if re.match(r'\w+\.framework', part):
full_path = os.path.join(*parts[i:])
break
new_path = '@executable_path/../Frameworks/%s' % full_path
FixInstallPath(library_path, library, new_path)
def FindQtPlugin(name):
search_path = QT_PLUGINS_SEARCH_PATH
search_path.insert(0, QueryQMake('QT_INSTALL_PLUGINS'))
for path in search_path:
if os.path.exists(path):
if os.path.exists(os.path.join(path, name)):
return os.path.join(path, name)
raise CouldNotFindQtPluginError(name)
for binary in binaries:
FixBinary(binary)
for plugin in QT_PLUGINS:
FixPlugin(FindQtPlugin(plugin), os.path.dirname(plugin))
if len(sys.argv) <= 2:
print 'Will run %d commands:' % len(commands)
for command in commands:
print ' '.join(command)
for command in commands:
p = subprocess.Popen(command)
os.waitpid(p.pid, 0)
WriteQtConf()
+22 -27
Ver Arquivo
@@ -22,7 +22,7 @@
<key>GID</key>
<integer>80</integer>
<key>PATH</key>
<string>@APPLICATION_EXECUTABLE@.app</string>
<string>owncloud.app</string>
<key>PATH_TYPE</key>
<integer>3</integer>
<key>PERMISSIONS</key>
@@ -471,18 +471,13 @@
</dict>
<key>PACKAGE_SCRIPTS</key>
<dict>
<key>POSTINSTALL_PATH</key>
<dict/>
<key>PREINSTALL_PATH</key>
<dict>
<key>PATH</key>
<string>@CMAKE_CURRENT_BINARY_DIR@/pre_install.sh</string>
<key>PATH_TYPE</key>
<integer>0</integer>
</dict>
<key>RESOURCES</key>
<array/>
</dict>
<key>POSTINSTALL_PATH</key>
<dict/>
<key>PREINSTALL_PATH</key>
<dict/>
<key>RESOURCES</key>
<array/>
</dict>
<key>PACKAGE_SETTINGS</key>
<dict>
<key>AUTHENTICATION</key>
@@ -490,13 +485,13 @@
<key>CONCLUSION_ACTION</key>
<integer>0</integer>
<key>IDENTIFIER</key>
<string>@APPLICATION_REV_DOMAIN_INSTALLER@</string>
<string>com.ownCloud.client</string>
<key>NAME</key>
<string>@APPLICATION_NAME@</string>
<string>ownCloud Client</string>
<key>OVERWRITE_PERMISSIONS</key>
<false/>
<key>VERSION</key>
<string>@MIRALL_VERSION_FULL@</string>
<string>1.6.2</string>
</dict>
<key>UUID</key>
<string>7D7219B7-1897-48C3-8533-842BDEC46F71</string>
@@ -798,7 +793,7 @@
<key>GID</key>
<integer>0</integer>
<key>PATH</key>
<string>Library/ScriptingAdditions/SyncStateFinder.osax/Contents</string>
<string>Library/ScriptingAdditions/OwnCloudFinder.osax/Contents</string>
<key>PATH_TYPE</key>
<integer>3</integer>
<key>PERMISSIONS</key>
@@ -812,7 +807,7 @@
<key>GID</key>
<integer>0</integer>
<key>PATH</key>
<string>SyncStateFinder.osax</string>
<string>OwnCloudFinder.osax</string>
<key>PATH_TYPE</key>
<integer>0</integer>
<key>PERMISSIONS</key>
@@ -1024,7 +1019,7 @@
<key>OVERWRITE_PERMISSIONS</key>
<false/>
<key>VERSION</key>
<string>@MIRALL_VERSION_FULL@</string>
<string>1.6.2</string>
</dict>
<key>TYPE</key>
<integer>0</integer>
@@ -1046,7 +1041,7 @@
ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp
dGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u
dGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD
b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjEzNDMuMTQiPgo8c3R5bGUg
b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjExMzguNTEiPgo8c3R5bGUg
dHlwZT0idGV4dC9jc3MiPgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5
Pgo8L2JvZHk+CjwvaHRtbD4K
</data>
@@ -1060,12 +1055,12 @@
<key>BACKGROUND_PATH</key>
<dict>
<key>PATH</key>
<string>@MAC_INSTALLER_BACKGROUND_FILE@</string>
<string>/Users/mackie/owncloud.com/mirall/resources/owncloud_logo_blue.png</string>
<key>PATH_TYPE</key>
<integer>0</integer>
</dict>
<key>CUSTOM</key>
<integer>@MAC_INSTALLER_DO_CUSTOM_BACKGROUND@</integer>
<integer>1</integer>
<key>SCALING</key>
<integer>0</integer>
</dict>
@@ -1218,7 +1213,7 @@
<key>LANGUAGE</key>
<string>English</string>
<key>VALUE</key>
<string>@APPLICATION_NAME@ Client</string>
<string>ownCloud Client</string>
</dict>
</array>
</dict>
@@ -1245,9 +1240,9 @@
<key>BUILD_PATH</key>
<dict>
<key>PATH</key>
<string>../install/.</string>
<string>/Users/mackie/owncloud.com/mirall/admin</string>
<key>PATH_TYPE</key>
<integer>3</integer>
<integer>0</integer>
</dict>
<key>EXCLUDED_FILES</key>
<array>
@@ -1418,9 +1413,9 @@
</dict>
</array>
<key>NAME</key>
<string>@APPLICATION_NAME@ Installer</string>
<string>ownCloud Installer</string>
<key>REFERENCE_FOLDER_PATH</key>
<string>@CMAKE_INSTALL_DIR@</string>
<string>/Users/mackie/install</string>
</dict>
</dict>
<key>TYPE</key>
-8
Ver Arquivo
@@ -1,8 +0,0 @@
#!/bin/sh
# kill the old version. see issue #2044
killall @APPLICATION_EXECUTABLE@
# Unload the Finder plugin. see issue #2105
killall Finder
-12
Ver Arquivo
@@ -1,12 +0,0 @@
#!/bin/sh -x
[ "$#" -lt 2 ] && echo "Usage: sign_app.sh <app> <identity>" && exit
src_app="$1"
identity="$2"
codesign -s "$identity" --force --verbose=4 --deep "$src_app"
# Just for our debug purposes:
spctl -a -t exec -vv $src_app
codesign -dv $src_app
+2 -2
Ver Arquivo
@@ -15,8 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "Odinstalovat ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Odinstalovat ${APPLICATION_NAME}"
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Vyberte možnost údržby k provedení."
StrCpy $SEC_APPLICATION_DETAILS "Instalují se náležitosti ${APPLICATION_NAME}."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Stavové ikony pro Windows Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instaluji stavové ikony pro Windows Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Stavová ikona pro Windows Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instaluji stavovou ikonu pro Windows Explorer"
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Zástupce v Nabídce Start"
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Přidávám zástupce pro ${APPLICATION_NAME} do Nabídky Start."
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Zástupce na ploše"
+2 -2
Ver Arquivo
@@ -15,8 +15,6 @@ StrCpy $PageReinstall_SAME_Field_3 "Desinstalli ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalli ${APPLICATION_NAME}"
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Vali hooldustegevus, mida sa soovid sooritada."
StrCpy $SEC_APPLICATION_DETAILS "Paigaldan ${APPLICATION_NAME} põhiosa."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Windows Exploreri staatuse ikoon"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Windows Exploreri staatuse ikooni paigaldamine"
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start Menüü Programmide viit"
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Lisan ${APPLICATION_NAME} viida Start menüüsse."
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Töölaua otsetee"
@@ -44,3 +42,5 @@ StrCpy $INIT_INSTALLER_RUNNING "Paigaldaja on juba k
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "See desinstallija vajab admini ligipääsu, proovi uuesti"
StrCpy $INIT_UNINSTALLER_RUNNING "See desinstallija on juba käimas"
StrCpy $SectionGroup_Shortcuts "Viidad"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Status icons for Windows Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing status icons for Windows Explorer"
+16 -16
Ver Arquivo
@@ -1,28 +1,26 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Afficher les notes de version"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Le(s) processus en cours dexécution ${APPLICATION_EXECUTABLE} doit (doivent) être stoppé(s) afin de poursuivre.$\nVoulez-vous que le programme dinstallation sen charge pour vous ?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Fermeture des processus ${APPLICATION_EXECUTABLE}."
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Montrer les notes de version"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Le(s) processus en cours dexécution ${APPLICATION_EXECUTABLE} doit être stoppé afin de poursuivre.$\nVoulez-vous que le programme dinstallation sen charge pour vous ?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Fermeture du processus ${APPLICATION_EXECUTABLE}."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Les processus à stopper n'ont pas été trouvés."
StrCpy $PageReinstall_NEW_Field_1 "Une ancienne version de ${APPLICATION_NAME} est installée sur votre système. Il est recommandé de désinstaller cette version avant de continuer. Sélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
StrCpy $PageReinstall_NEW_Field_1 "Une vieille version de ${APPLICATION_NAME} est installée sur votre système. Il est recommandé que vous désinstalliez cette version avant l'installation. Sélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
StrCpy $PageReinstall_NEW_Field_2 "Désinstaller avant d'installer à nouveau"
StrCpy $PageReinstall_NEW_Field_3 "Ne pas désinstaller"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Déjà installée"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Choisissez comment installer ${APPLICATION_NAME}."
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Choisissez comment vous voulez installer ${APPLICATION_NAME}."
StrCpy $PageReinstall_OLD_Field_1 "Une version plus récente de ${APPLICATION_NAME} est déjà installée ! Il n'est pas recommandé d'installer une version plus ancienne. Si vous voulez vraiment installer cette version plus ancienne, il est préférable de d'abord désinstaller la version courante. Sélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} est déjà installé.\nSélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} est déjà installée.\nSélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer."
StrCpy $PageReinstall_SAME_Field_2 "Ajouter/Réinstaller des composants"
StrCpy $PageReinstall_SAME_Field_3 "Désinstaller ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Désinstaller ${APPLICATION_NAME}"
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choisir l'opération de maintenance à effectuer."
StrCpy $SEC_APPLICATION_DETAILS "Installation des essentiels de ${APPLICATION_NAME}."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Icônes d'état pour l'Explorateur Windows"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installation des icones d'état pour l'Explorateur Windows"
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choisir l'option de maintenance à appliquer."
StrCpy $SEC_APPLICATION_DETAILS "Installer les essentiels de ${APPLICATION_NAME}."
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Raccourci programme du menu Démarrer"
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Ajout d'un raccourci pour ${APPLICATION_NAME} au menu Démarrer."
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Ajouter un raccourci pour ${APPLICATION_NAME} au menu Démarrer."
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Raccourci Bureau"
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Création d'un raccourci sur le Bureau"
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Créer un raccourci Bureau"
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Raccourci de lancement rapide"
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Création d'un raccourci de lancement rapide"
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Créer un raccourci de lancement rapide"
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Essentiels de ${APPLICATION_NAME}."
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Raccourci de ${APPLICATION_NAME}"
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Raccourci Bureau de ${APPLICATION_NAME}."
@@ -34,13 +32,15 @@ StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Oui, supprimer ce dossier de données."
StrCpy $UNINSTALLER_FILE_Detail "Écriture du désinstallateur"
StrCpy $UNINSTALLER_REGISTRY_Detail "Écriture des clefs de registre du désinstallateur"
StrCpy $UNINSTALLER_FINISHED_Detail "Terminé"
StrCpy $UNINSTALL_MESSAGEBOX "Il semble que ${APPLICATION_NAME} ne soit pas installé dans le dossier '$INSTDIR'.$\n$\nVoulez-vous poursuivre (non recommandé) ?"
StrCpy $UNINSTALL_MESSAGEBOX "Il semble que ${APPLICATION_NAME} ne soit pas installée dans le dossier '$INSTDIR'.$\n$\nVoulez-vous poursuivre (non recommandé) ?"
StrCpy $UNINSTALL_ABORT "Désinstallation interrompue par l'utilisateur"
StrCpy $INIT_NO_QUICK_LAUNCH "Raccourci de lancement rapide (non disponible)"
StrCpy $INIT_NO_QUICK_LAUNCH "Raccourci de lancement rapide (N/A)"
StrCpy $INIT_NO_DESKTOP "Raccourci bureau (remplace lexistant)"
StrCpy $UAC_ERROR_ELEVATE "Échec d'élévation, erreur :"
StrCpy $UAC_ERROR_ELEVATE "Echec d'élévation, erreur :"
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Cet installateur requiert les droits administrateur, essayez à nouveau"
StrCpy $INIT_INSTALLER_RUNNING "Une installation est déjà en cours."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Ce désinstallateur requiert les droits administrateur, essayez à nouveau"
StrCpy $INIT_UNINSTALLER_RUNNING "Une désinstallation est déjà en cours."
StrCpy $SectionGroup_Shortcuts "Raccourcis"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Status icons for Windows Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing status icons for Windows Explorer"
+3 -3
Ver Arquivo
@@ -15,8 +15,8 @@ StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} entfernen"
StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} entfernen"
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Wählen Sie zur Ausführung die Wartungsoption."
StrCpy $SEC_APPLICATION_DETAILS "Installiere ${APPLICATION_NAME} Basis."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Statussymbole für den Windows-Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Statussymbole für den Windows-Explorer werden installiert"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Status-Icons für den Windows-Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installiere Status-Icons für den Windows-Explorer"
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Installiere Verknüpfung im Programmmenü"
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Füge Verknüpfung für ${APPLICATION_NAME} dem Startmenü hinzu."
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Desktop-Verknüpfung"
@@ -38,7 +38,7 @@ StrCpy $UNINSTALL_MESSAGEBOX "Es scheint, als ob ${APPLICATION_NAME} nicht im Ve
StrCpy $UNINSTALL_ABORT "Deinstallation vom Benutzer abgebrochen"
StrCpy $INIT_NO_QUICK_LAUNCH "Schnellstart-Verknüpfung (Nicht verfügbar)"
StrCpy $INIT_NO_DESKTOP "Desktop-Verknüpfung (überschreibt vorhandene)"
StrCpy $UAC_ERROR_ELEVATE "Rechte können nicht erhöht werden, Fehler:"
StrCpy $UAC_ERROR_ELEVATE "Kann Rechte nicht erhöhen, Fehler:"
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dieses Installationsprogramm erfordert Administrator-Rechte, bitte erneut versuchen"
StrCpy $INIT_INSTALLER_RUNNING "Das Installationsprogramm wird bereits ausgeführt."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Das Deinstallationsprogramm erfordert Administrator-Rechte. Bitte erneut versuchen."
+1 -1
Ver Arquivo
@@ -16,7 +16,7 @@ StrCpy $UNINSTALLER_APPDATA_TITLE "
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Επιλέξτε την επιλογή συντήρησης που θα πραγματοποιηθεί."
StrCpy $SEC_APPLICATION_DETAILS "Εγκατάσταση βάσης ${APPLICATION_NAME} σε εξέλιξη."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Εικονίδια κατάστασης για την Εξερεύνηση των Windows"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Εγκατάσταση εικονιδίων κατάστασης για την Εξερεύνηση των Windows"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Εγκατάσταση εικονιδίων κατάστασης στην Εξερεύνηση των Windows"
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Συντόμευση στο Αρχικό Μενού"
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Προσθήκη συντόμευσης για την ${APPLICATION_NAME} στο Αρχικό Μενού."
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Συντόμευση επιφάνειας εργασίας"
+10 -10
Ver Arquivo
@@ -1,19 +1,19 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Processos(s) ${APPLICATION_EXECUTABLE} em execução. Estes processos precisam de ser interrompidos.$\\nDeseja que o instalador os termine automaticamente?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar os processos ${APPLICATION_EXECUTABLE}."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado o processo a terminar!"
StrCpy $PageReinstall_NEW_Field_1 "Uma versão antiga de ${APPLICATION_NAME} está instalada no sistema. É recomendado que você desinstale a versão atual antes de instalar. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar."
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Encontrados processos ${APPLICATION_EXECUTABLE} que precisam de ser parados.$\nDeseja que o instalador os pare ?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar processos ${APPLICATION_EXECUTABLE}."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Processo para terminar não foi encontrado!"
StrCpy $PageReinstall_NEW_Field_1 "Está instalada uma versão anterior de ${APPLICATION_NAME} no seu sistema. Recomenda-se que desinstale primeiro a versão atual antes de instalar. Selecione a operação que pretende fazer, e clique Seguinte para continuar."
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
StrCpy $PageReinstall_NEW_Field_3 "Não desinstale"
StrCpy $PageReinstall_NEW_Field_3 "Não desinstalar"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado"
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 "Já esta instalada uma nova versão dfe ${APPLICATION_NAME}! Não se recomenda instalar uma versão anterior. Se quer mesmo instalar esta versão mais antiga, é melhor desinstalar primeiro a versão atual. Selecione a operação que pretende fazer e clique Seguinte para continuar."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalado.\nSelecione a operação que deseja fazer, e clique Seguinte para continuar."
StrCpy $PageReinstall_SAME_Field_2 "Adicionar/Reinstalar Componentes"
StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}"
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolha a opção de manutenção a realizar."
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolha a opção de manutenção a fazer."
StrCpy $SEC_APPLICATION_DETAILS "A instalar o essencial de ${APPLICATION_NAME}."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Icons de estado para Windows Explorer"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "A instalar icons de estado para Windows Explorer"
@@ -40,7 +40,7 @@ StrCpy $INIT_NO_QUICK_LAUNCH "Atalho de Início Rápido (N/A)"
StrCpy $INIT_NO_DESKTOP "Atalho do Ambiente de Trabalho (sobrepõe o existente)"
StrCpy $UAC_ERROR_ELEVATE "Incapaz de elevar, erro:"
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este instalador precisa de permissões de administrador, tente novamente"
StrCpy $INIT_INSTALLER_RUNNING "O instalador já está em execução."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador requer permissões de administrador, tente novamente"
StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador já está em execução."
StrCpy $INIT_INSTALLER_RUNNING "O instalador já está a correr."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador precisa de acesso de administrador; tente novamente"
StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador já está a correr."
StrCpy $SectionGroup_Shortcuts "Atalhos"
+5 -5
Ver Arquivo
@@ -27,14 +27,14 @@ StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Зависимости прилож
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Ярлык приложения ${APPLICATION_NAME}."
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Ярлык на рабочем столе для ${APPLICATION_NAME}."
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Ярлык в меню быстрого запуска для ${APPLICATION_NAME}."
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Удалить каталог данных ${APPLICATION_NAME} с вашего компьютера."
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Вы хотите удалить каталог с данными ${APPLICATION_NAME} ?"
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Оставьте неактивным, для сохранения каталога с данными приложения, для последующего их использования."
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Да, удалить этот каталог с данными."
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Удалить папку данных ${APPLICATION_NAME} с вашего компьютера."
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Вы хотите удалить папку с данными ${APPLICATION_NAME} ?"
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Оставьте неактивным, для сохранения папки с данными приложения, для последующего их использования."
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Да, удалить эту папку с данными."
StrCpy $UNINSTALLER_FILE_Detail "Сохранение деинсталятора"
StrCpy $UNINSTALLER_REGISTRY_Detail "Запись ключей реестра"
StrCpy $UNINSTALLER_FINISHED_Detail "Завершено"
StrCpy $UNINSTALL_MESSAGEBOX "Скорее всего, приложение ${APPLICATION_NAME} уже установлено в каталог '$INSTDIR'.\nВсе равно продолжить (не рекомендуется)?"
StrCpy $UNINSTALL_MESSAGEBOX "Скорее всего, приложение ${APPLICATION_NAME} уже установлено в директорию '$INSTDIR'.\nВсе равно продолжить (не рекомендуется)?"
StrCpy $UNINSTALL_ABORT "Удаление отменено пользователем"
StrCpy $INIT_NO_QUICK_LAUNCH "Ярлык быстрого запуска (недоступен)"
StrCpy $INIT_NO_DESKTOP "Ярлык на рабочем столе (перезаписать существующий)"
+10 -10
Ver Arquivo
@@ -2,12 +2,12 @@
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar las notas de la versión"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "El/los proceso/s ${APPLICATION_EXECUTABLE} debe/n ser detenidos.$\n¿Quiere que el instalador lo haga por usted?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Deteniendo el/los proceso/s ${APPLICATION_EXECUTABLE}."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "¡Proceso para 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} se encuentra instalada en el sistema. Se recomienda de instalar la versión actual antes de instalar la nueva. Seleccione la operacion deseada y haga click en Siguiente para continuar."
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
StrCpy $PageReinstall_NEW_Field_3 "No desinstalar"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ya está instalado"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Elija cómo quiere instalar ${APPLICATION_NAME}."
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Elija como quiere instalar ${APPLICATION_NAME}."
StrCpy $PageReinstall_OLD_Field_1 "Una nueva versión de ${APPLICATION_NAME} ya está instalada. No es recomendable instalar una versión anterior. Si realmente quiere instalar esta versión anterior, es mejor que desinstale la versión actual primero. Seleccione la operación que desea realizar y pulse Next para continuar."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} ya está instalada.\nSeleccione la operación que desea realizar y pulse Next para continuar."
StrCpy $PageReinstall_SAME_Field_2 "Añadir/Reinstalar componentes"
@@ -17,7 +17,7 @@ StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Elija la opcion de mantenim
StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} esenciales."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Íconos de estado para el Explorador de Windows"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalando íconos de estado para el Explorador de Windows"
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso directo al programa Menú de Inicio"
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso Directo al Programa Menú de Inicio"
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Añadiendo accesos directos para ${APPLICATION_NAME} en el Menú de Inicio."
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Acceso directo de Escritorio"
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creando Accesos Directos de Escritorio"
@@ -27,20 +27,20 @@ StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} esencial."
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Acceso Directo de ${APPLICATION_NAME}"
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Acceso Directo de Escritorio para ${APPLICATION_NAME}"
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Lanzador Rápido de Accesos Director para ${APPLICATION_NAME}."
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Elimine la carpeta de datos de ${APPLICATION_NAME} del computador."
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Remueva la carpeta de datos de ${APPLICATION_NAME} del computador."
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "¿Desea eliminar la carpeta de datos de ${APPLICATION_NAME}?"
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Déjelo sin marcar para mantener la carpeta de datos para uso posterior o márquelo para eliminar la carpeta de datos."
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Sí, elimine esta carpeta de datos."
StrCpy $UNINSTALLER_FILE_Detail "Escribiendo desinstalador"
StrCpy $UNINSTALLER_REGISTRY_Detail "Escribiendo claves en el registro del instalador"
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Deja sin marcar para mantener la carpeta de datos para uso posterior, o del marque para eliminar la carpeta de datos."
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Si, Elimine esta carpeta de datos."
StrCpy $UNINSTALLER_FILE_Detail "Escribiendo Desinstalador"
StrCpy $UNINSTALLER_REGISTRY_Detail "Escribiendo Llaves en el Registro del Instalador"
StrCpy $UNINSTALLER_FINISHED_Detail "Terminado"
StrCpy $UNINSTALL_MESSAGEBOX "Parece que ${APPLICATION_NAME} no está instalado en el directorio '$INSTDIR'.$$ ¿Continuar de todos modos? (No Recomendado)"
StrCpy $UNINSTALL_ABORT "Desinstalación cancelada por el usuario"
StrCpy $INIT_NO_QUICK_LAUNCH "Acceso Directo al Lanzador Rápido (N/A)"
StrCpy $INIT_NO_DESKTOP "Atajo de escritorio (sobreescribe el existente)"
StrCpy $UAC_ERROR_ELEVATE "No se ha podido elevar, error:"
StrCpy $UAC_ERROR_ELEVATE "No se ha podido elevar, Error:"
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "El instalador requiere acceso administrativo, intente de nuevo"
StrCpy $INIT_INSTALLER_RUNNING "El instalador ya se encuentra en ejecución"
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "El desinstalador requiere acceso administrativo, intente de nuevo"
StrCpy $INIT_UNINSTALLER_RUNNING "El desinstalador ya se encuentra en ejecución."
StrCpy $SectionGroup_Shortcuts "Accesos directos"
StrCpy $SectionGroup_Shortcuts "Accesos Directos"
+1 -1
Ver Arquivo
@@ -41,6 +41,6 @@ StrCpy $INIT_NO_DESKTOP "Skrivbordsgenväg (skriver över nuvarande)"
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 $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örs rättigheter, försök igen"
StrCpy $INIT_UNINSTALLER_RUNNING "Avinstallationsprogrammet körs redan."
StrCpy $SectionGroup_Shortcuts "Genvägar"
-46
Ver Arquivo
@@ -1,46 +0,0 @@
# Auto-generated - do not modify
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Показати примітки до випуску"
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Знайдено процес(и) ${APPLICATION_EXECUTABLE}, які необхідно зупинити.$\nХочете щоб програма установки зробила це самостійно?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Завершення процесів ${APPLICATION_EXECUTABLE}."
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Не знайдено процеси, які необхідно зупинити!"
StrCpy $PageReinstall_NEW_Field_1 "Знайдено застарілу версію програми ${APPLICATION_NAME}. Рекомендуємо її спочатку видалити. Оберіть подальшу дію та натисніть $\"Далі$\"."
StrCpy $PageReinstall_NEW_Field_2 "Видалити перед установкою"
StrCpy $PageReinstall_NEW_Field_3 "Не видаляти"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Установлено"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Оберіть, як ви хочете установити ${APPLICATION_NAME}."
StrCpy $PageReinstall_OLD_Field_1 "Знайдено новішу версію ${APPLICATION_NAME}! Ми не рекомендуємо встановлювати стару версію. Якщо ви все ж бажаєте встановити цю версію, спочатку видаліть поточну версію. Оберіть подальшу дію та натисніть $\"Далі$\"."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} вже встановлено.↩\nОберіть подальшу дію та натисніть $\"Далі$\"."
StrCpy $PageReinstall_SAME_Field_2 "Додати/Перевстановити компоненти"
StrCpy $PageReinstall_SAME_Field_3 "Видалити ${APPLICATION_NAME}"
StrCpy $UNINSTALLER_APPDATA_TITLE "Видалити ${APPLICATION_NAME}"
StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Оберіть опцію обслуговування для виконання."
StrCpy $SEC_APPLICATION_DETAILS "Установка залежностей ${APPLICATION_NAME}."
StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Значки стану для провідника Windows"
StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Установка значків стану для провідника Windows"
StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Ярлик в меню Пуск"
StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Створення ярлика ${APPLICATION_NAME} в меню Пуск."
StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Ярлик на Робочому столі"
StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Створення ярлика на Робочому столі"
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Ярлик на панелі швидкого запуску"
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Створення ярлика на панелі швидкого запуску"
StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} залежності."
StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} ярлик."
StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Ярлик ${APPLICATION_NAME} на Робочому столі."
StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Ярлик ${APPLICATION_NAME} на панелі швидкого запуску."
StrCpy $UNINSTALLER_APPDATA_SUBTITLE "Видалити теку даних ${APPLICATION_NAME} з вашого комп'ютера."
StrCpy $UNINSTALLER_APPDATA_LABEL_1 "Ви дійсно бажаєте видалити теку даних ${APPLICATION_NAME}?"
StrCpy $UNINSTALLER_APPDATA_LABEL_2 "Залиште неактивним, для збереження теки з даними програми, для подальшого використання."
StrCpy $UNINSTALLER_APPDATA_CHECKBOX "Так, видалити теку даних."
StrCpy $UNINSTALLER_FILE_Detail "Збереження Програми видалення"
StrCpy $UNINSTALLER_REGISTRY_Detail "Запис ключів реєстру"
StrCpy $UNINSTALLER_FINISHED_Detail "Завершено"
StrCpy $UNINSTALL_MESSAGEBOX "Скоріш за все ${APPLICATION_NAME} вже встановлено в теку '$INSTDIR'.$↩$\nВсе одно продовжити (не рекомендується)?"
StrCpy $UNINSTALL_ABORT "Видалення перервано користувачем."
StrCpy $INIT_NO_QUICK_LAUNCH "Ярлик в області швидкого запуску (недоступний)"
StrCpy $INIT_NO_DESKTOP "Ярлик на Робочому столі (перезаписати існуючий)"
StrCpy $UAC_ERROR_ELEVATE "Неможливо підняти, помилка:"
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Для установки потрібні права адміністратора, спробуйте ще раз"
StrCpy $INIT_INSTALLER_RUNNING "Установка вже запущена."
StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Для видалення потрібні права адміністратора, спробуйте ще раз"
StrCpy $INIT_UNINSTALLER_RUNNING "Програма видалення вже запущено."
StrCpy $SectionGroup_Shortcuts "Ярлики"
-1
Ver Arquivo
@@ -6,7 +6,6 @@
!insertmacro MUI_LANGUAGE "SpanishInternational"
!insertmacro MUI_LANGUAGE "Dutch"
!insertmacro MUI_LANGUAGE "Hungarian"
!insertmacro MUI_LANGUAGE "Ukrainian"
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "Catalan"
!insertmacro MUI_LANGUAGE "Russian"
+1 -1
Submodule binary updated: 139acd195b...82d72bc62d
+2 -2
Ver Arquivo
@@ -1,4 +1,4 @@
SET(WINDRES_EXECUTABLE_BASE ${CMAKE_RC_COMPILER})
SET(WINDRES_EXECUTABLE ${CMAKE_RC_COMPILER})
# This macro is taken from kdelibs/cmake/modules/KDE4Macros.cmake.
#
@@ -21,7 +21,7 @@ macro (KDE4_ADD_APP_ICON appsources pattern)
else(NOT WINCE)
find_program(PNG2ICO_EXECUTABLE NAMES png2ico PATHS ${HOST_BINDIR} NO_DEFAULT_PATH )
endif(NOT WINCE)
find_program(WINDRES_EXECUTABLE NAMES ${WINDRES_EXECUTABLE_BASE})
find_program(WINDRES_EXECUTABLE NAMES windres)
if(MSVC)
set(WINDRES_EXECUTABLE TRUE)
endif(MSVC)
-4
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
# Always include srcdir and builddir in include path
# This saves typing ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY} in
# about every subdir
+1 -6
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
# define system dependent compiler flags
include(CheckCCompilerFlag)
@@ -14,8 +10,7 @@ if (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
# add -Wconversion ?
# cannot be pedantic with sqlite3 directly linked
# FIXME Can we somehow not use those flags for sqlite3.* but use them for the rest of csync?
if (NOT USE_OUR_OWN_SQLITE3)
if (NOT CSYNC_STATIC_COMPILE_DIR)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -pedantic -pedantic-errors")
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wshadow -Wmissing-prototypes")
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
if (UNIX)
# Suffix for Linux
SET(LIB_SUFFIX
-4
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
# Set system vars
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
-4
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
# This module defines
# INOTIFY_INCLUDE_DIR, where to find inotify.h, etc.
# INOTIFY_FOUND, If false, do not try to use inotify.
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
# FIND_PACKAGE_VERSION_CHECK(NAME (DEFAULT_MSG|"Custom failure message"))
# This function is intended to be used in FindXXX.cmake modules files.
# It handles NAME_FIND_VERSION and NAME_VERSION variables in a Module.
-4
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
find_program(PDFLATEX_EXECUTABLE NAMES pdflatex
HINTS
$ENV{PDFLATEX_DIR}
-4
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
# - Try to find QtKeychain
# Once done this will define
# QTKEYCHAIN_FOUND - System has QtKeychain
-4
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
# - Try to find QtKeychain
# Once done this will define
# QTKEYCHAIN_FOUND - System has QtKeychain
+2 -12
Ver Arquivo
@@ -50,18 +50,8 @@ if (SQLite3_FIND_VERSION AND _SQLITE3_VERSION)
set(SQLite3_VERSION _SQLITE3_VERSION)
endif (SQLite3_FIND_VERSION AND _SQLITE3_VERSION)
if (APPLE OR WIN32)
set(USE_OUR_OWN_SQLITE3 TRUE)
set(SQLITE3_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/src/3rdparty/sqlite3)
set(SQLITE3_LIBRARIES "")
set(SQLITE3_SOURCE ${SQLITE3_INCLUDE_DIR}/sqlite3.c)
MESSAGE(STATUS "Using own sqlite3 from " ${SQLITE3_INCLUDE_DIR})
else()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SQLite3 DEFAULT_MSG SQLITE3_LIBRARIES SQLITE3_INCLUDE_DIRS)
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SQLite3 DEFAULT_MSG SQLITE3_LIBRARIES SQLITE3_INCLUDE_DIRS)
# show the SQLITE3_INCLUDE_DIRS and SQLITE3_LIBRARIES variables only in the advanced view
mark_as_advanced(SQLITE3_INCLUDE_DIRS SQLITE3_LIBRARIES)
-4
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
find_program(SPHINX_EXECUTABLE NAMES sphinx-build
HINTS
$ENV{SPHINX_DIR}
-2
Ver Arquivo
@@ -30,8 +30,6 @@
<string>(C) 2014 @APPLICATION_VENDOR@</string>
<key>SUShowReleaseNotes</key>
<false/>
<key>LSMinimumBundleVersion</key>
<string>10.7.0</string>
<key>SUPublicDSAKeyFile</key>
<string>dsa_pub.pem</string>
</dict>
-4
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
# - macro_copy_file(_src _dst)
# Copies a file to ${_dst} only if ${_src} is different (newer) than ${_dst}
#
+11 -21
Ver Arquivo
@@ -384,18 +384,19 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
File "${BUILD_PATH}\bin\${APPLICATION_EXECUTABLE}"
File "${BUILD_PATH}\bin\${APPLICATION_CMD_EXECUTABLE}"
File "${BUILD_PATH}\bin\socketapiclient.exe"
File "${BUILD_PATH}\src\lib${APPLICATION_SHORTNAME}sync.dll"
File "${BUILD_PATH}\src\libsync\lib${APPLICATION_SHORTNAME}sync.dll"
File "${BUILD_PATH}\csync\src\libocsync.dll"
File "${BUILD_PATH}\src\mirall_*.qm"
File "${BUILD_PATH}\src\gui\mirall_*.qm"
; Make sure only to copy qt, not qt_help, etc
File "${MING_SHARE}\qt5\translations\qt_??.qm"
File "${MING_SHARE}\qt5\translations\qt_??_??.qm"
File "${MING_SHARE}\qt5\translations\qtbase_*.qm"
File "${MING_SHARE}\qt5\translations\qtkeychain_*.qm"
SetOutPath "$INSTDIR\platforms"
File "${PLATFORMS_DLL_PATH}\qwindows.dll"
SetOutPath "$INSTDIR\accessible"
File "${ACCESSIBLE_DLL_PATH}\qtaccessiblewidgets.dll"
SetOutPath "$INSTDIR\imageformats"
File "${IMAGEFORMATS_DLL_PATH}\qgif.dll"
File "${IMAGEFORMATS_DLL_PATH}\qjpeg.dll"
@@ -417,17 +418,13 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
File "${QT_DLL_PATH}\Qt5PrintSupport.dll"
File "${QT_DLL_PATH}\Qt5Qml.dll"
File "${QT_DLL_PATH}\Qt5Quick.dll"
File "${QT_DLL_PATH}\Qt5Sensors.dll"
File "${QT_DLL_PATH}\Qt5Sql.dll"
File "${QT_DLL_PATH}\Qt5WebKit.dll"
File "${QT_DLL_PATH}\Qt5WebKitWidgets.dll"
File "${QT_DLL_PATH}\Qt5Widgets.dll"
File "${QT_DLL_PATH}\Qt5Xml.dll"
;QtWebKit dependencies
File "${QT_DLL_PATH}\Qt5Multimedia.dll"
File "${QT_DLL_PATH}\Qt5MultimediaWidgets.dll"
File "${QT_DLL_PATH}\Qt5Sensors.dll"
;Qt deps
File "${MING_BIN}\libpng16-16.dll"
File "${MING_BIN}\icudata53.dll"
@@ -458,6 +455,7 @@ Section "${APPLICATION_NAME}" SEC_APPLICATION
File "${MING_BIN}\libproxy.dll"
File "${MING_BIN}\libmodman.dll"
File "${MING_BIN}\libxml2-2.dll"
;MinGW stuff
File "${MING_BIN}\libgcc_s_sjlj-1.dll"
File "${MING_BIN}\libstdc++-6.dll"
@@ -477,8 +475,6 @@ SectionEnd
File "${BUILD_PATH}\vcredist_x64.exe"
Call InstallRedistributables
CreateDirectory "$INSTDIR\shellext"
!define LIBRARY_COM
!define LIBRARY_SHELL_EXTENSION
${If} ${RunningX64}
!define LIBRARY_X64
!insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCUtil_x64.dll" "$INSTDIR\shellext\OCUtil_x64.dll" "$INSTDIR\shellext"
@@ -488,8 +484,6 @@ SectionEnd
!insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCUtil_x86.dll" "$INSTDIR\shellext\OCUtil_x86.dll" "$INSTDIR\shellext"
!insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCOverlays_x86.dll" "$INSTDIR\shellext\OCOverlays_x86.dll" "$INSTDIR\shellext"
${Endif}
!undef LIBRARY_COM
!undef LIBRARY_SHELL_EXTENSION
${MementoSectionEnd}
!endif
@@ -645,19 +639,15 @@ Section Uninstall
!define LIBRARY_COM
!define LIBRARY_SHELL_EXTENSION
${If} ${HasSection} SEC_SHELL_EXT
DetailPrint "Uninstalling x64 overlay DLLs"
!define LIBRARY_X64
!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"
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR/shellext/OCOverlays_x64.dll"
!undef LIBRARY_X64
${Else}
DetailPrint "Uninstalling x86 overlay DLLs"
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x86.dll"
!insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCUtil_x86.dll"
!insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR/shellext/OCUtil_x86.dll"
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR/shellext/OCOverlays_x86.dll"
${EndIf}
!undef LIBRARY_COM
!undef LIBRARY_SHELL_EXTENSION
!endif
!endif
;Start menu shortcut
!ifdef OPTION_SECTION_SC_START_MENU
+1 -16
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
include (MacroOptionalFindPackage)
include (MacroLogFeature)
@@ -153,18 +149,7 @@ if(NOT Qt5Core_FOUND)
include( ${QT_USE_FILE} )
endmacro()
if (CMAKE_COMPILER_IS_GNUCC)
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
OUTPUT_VARIABLE GCC_VERSION)
if (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7)
add_definitions("-DQ_DECL_OVERRIDE=override")
else()
add_definitions("-DQ_DECL_OVERRIDE=")
endif()
else() #clang or others
add_definitions("-DQ_DECL_OVERRIDE=override")
endif()
add_definitions("-DQ_DECL_OVERRIDE=override")
endif()
if( Qt5Core_DIR )
-4
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
# -helper macro to add a "doc" target with CMake build system.
# and configure doxy.config.in to doxy.config
#
-4
Ver Arquivo
@@ -1,7 +1,3 @@
# (c) 2014 Copyright ownCloud, Inc.
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING* file.
if(CMAKE_COMPILER_IS_GNUCXX)
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
OUTPUT_VARIABLE GCC_VERSION)
+9 -2
Ver Arquivo
@@ -4,6 +4,13 @@ add_subdirectory(std)
add_subdirectory(httpbf)
# Statically include sqlite
if (CSYNC_STATIC_COMPILE_DIR)
set(SQLITE3_INCLUDE_DIRS "")
set(SQLITE3_LIBRARIES "")
include_directories(${CSYNC_STATIC_COMPILE_DIR})
else (CSYNC_STATIC_COMPILE_DIR)
find_package(SQLite3 3.3.9 REQUIRED)
endif()
set(CSYNC_PUBLIC_INCLUDE_DIRS
${CMAKE_CURRENT_BINARY_DIR}
@@ -79,8 +86,8 @@ set(csync_HDRS
)
# Statically include sqlite
if (USE_OUR_OWN_SQLITE3)
list(APPEND csync_SRCS ${SQLITE3_SOURCE})
if (CSYNC_STATIC_COMPILE_DIR)
list(APPEND csync_SRCS ${CSYNC_STATIC_COMPILE_DIR}/dictionary.c ${CSYNC_STATIC_COMPILE_DIR}/sqlite3.c)
endif()
include_directories(
+20 -23
Ver Arquivo
@@ -228,10 +228,9 @@ int csync_update(CSYNC *ctx) {
rc = csync_ftw(ctx, ctx->local.uri, csync_walker, MAX_DEPTH);
if (rc < 0) {
if(ctx->status_code == CSYNC_STATUS_OK) {
if(ctx->status_code == CSYNC_STATUS_OK)
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_UPDATE_ERROR);
}
goto out;
return -1;
}
csync_gettime(&finish);
@@ -248,10 +247,9 @@ int csync_update(CSYNC *ctx) {
rc = csync_ftw(ctx, ctx->remote.uri, csync_walker, MAX_DEPTH);
if (rc < 0) {
if(ctx->status_code == CSYNC_STATUS_OK) {
if(ctx->status_code == CSYNC_STATUS_OK)
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_UPDATE_ERROR);
}
goto out;
return -1;
}
csync_gettime(&finish);
@@ -264,11 +262,7 @@ int csync_update(CSYNC *ctx) {
ctx->status |= CSYNC_STATUS_UPDATE;
rc = 0;
out:
csync_statedb_close(ctx);
return rc;
return 0;
}
int csync_reconcile(CSYNC *ctx) {
@@ -284,12 +278,6 @@ int csync_reconcile(CSYNC *ctx) {
/* Reconciliation for local replica */
csync_gettime(&start);
if (csync_statedb_load(ctx, ctx->statedb.file, &ctx->statedb.db) < 0) {
ctx->status_code = CSYNC_STATUS_STATEDB_LOAD_ERROR;
rc = -1;
return rc;
}
ctx->current = LOCAL_REPLICA;
ctx->replica = ctx->local.type;
@@ -305,7 +293,7 @@ int csync_reconcile(CSYNC *ctx) {
if (!CSYNC_STATUS_IS_OK(ctx->status_code)) {
ctx->status_code = csync_errno_to_status( errno, CSYNC_STATUS_RECONCILE_ERROR );
}
goto out;
return -1;
}
/* Reconciliation for remote replica */
@@ -326,15 +314,11 @@ int csync_reconcile(CSYNC *ctx) {
if (!CSYNC_STATUS_IS_OK(ctx->status_code)) {
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_RECONCILE_ERROR );
}
goto out;
return -1;
}
ctx->status |= CSYNC_STATUS_RECONCILE;
rc = 0;
out:
csync_statedb_close(ctx);
return 0;
}
@@ -538,6 +522,8 @@ static void _tree_destructor(void *data) {
* used by csync_commit and csync_destroy */
static void _csync_clean_ctx(CSYNC *ctx)
{
c_list_t * walk;
/* destroy the rbtrees */
if (c_rbtree_size(ctx->local.tree) > 0) {
c_rbtree_destroy(ctx->local.tree, _tree_destructor);
@@ -549,14 +535,25 @@ static void _csync_clean_ctx(CSYNC *ctx)
csync_rename_destroy(ctx);
for (walk = c_list_last(ctx->local.ignored_cleanup); walk != NULL; walk = c_list_prev(walk)) {
SAFE_FREE(walk->data);
}
for (walk = c_list_last(ctx->remote.ignored_cleanup); walk != NULL; walk = c_list_prev(walk)) {
SAFE_FREE(walk->data);
}
/* free memory */
c_rbtree_free(ctx->local.tree);
c_list_free(ctx->local.list);
c_list_free(ctx->local.ignored_cleanup);
c_rbtree_free(ctx->remote.tree);
c_list_free(ctx->remote.list);
c_list_free(ctx->remote.ignored_cleanup);
ctx->remote.list = 0;
ctx->local.list = 0;
ctx->remote.ignored_cleanup = 0;
ctx->local.ignored_cleanup = 0;
SAFE_FREE(ctx->statedb.file);
}
-1
Ver Arquivo
@@ -94,7 +94,6 @@ enum csync_status_codes_e {
CSYNC_STATUS_ABORTED,
/* Codes for file individual status: */
CSYNC_STATUS_INDIVIDUAL_IS_SYMLINK,
CSYNC_STATUS_INDIVIDUAL_IS_HARDLINK,
CSYNC_STATUS_INDIVIDUAL_IGNORE_LIST,
CSYNC_STATUS_INDIVIDUAL_IS_INVALID_CHARS,
CYSNC_STATUS_FILE_LOCKED_OR_OPEN
+7 -59
Ver Arquivo
@@ -40,10 +40,7 @@
#define CSYNC_LOG_CATEGORY_NAME "csync.exclude"
#include "csync_log.h"
#ifndef NDEBUG
static
#endif
int _csync_exclude_add(c_strlist_t **inList, const char *string) {
static int _csync_exclude_add(c_strlist_t **inList, const char *string) {
c_strlist_t *list;
if (*inList == NULL) {
@@ -153,43 +150,15 @@ CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype) {
match = csync_excluded_no_ctx( ctx->excludes, path, filetype );
if (match == CSYNC_NOT_EXCLUDED && ctx->checkBlackListHook) {
if (ctx->checkBlackListHook(ctx->checkBlackListData, path)) {
match = CSYNC_FILE_EXCLUDE_LIST;
}
}
return match;
}
// See http://support.microsoft.com/kb/74496
static const char *win_reserved_words[] = {"CON","PRN","AUX", "NUL",
"COM1", "COM2", "COM3", "COM4",
"LPT1", "LPT2", "LPT3", "CLOCK$" };
bool csync_is_windows_reserved_word(const char* filename) {
size_t win_reserve_words_len = sizeof(win_reserved_words) / sizeof(char*);
size_t j;
for (j = 0; j < win_reserve_words_len; j++) {
int len_reserved_word = strlen(win_reserved_words[j]);
int len_filename = strlen(filename);
if (len_filename == 2 && filename[1] == ':') {
if (filename[0] >= 'a' && filename[0] <= 'z') {
return true;
}
if (filename[0] >= 'A' && filename[0] <= 'Z') {
return true;
}
}
if (c_strncasecmp(filename, win_reserved_words[j], len_reserved_word) == 0) {
if (len_filename == len_reserved_word) {
return true;
}
if ((len_filename > len_reserved_word) && (filename[len_reserved_word] == '.')) {
return true;
}
}
}
return false;
}
CSYNC_EXCLUDE_TYPE csync_excluded_no_ctx(c_strlist_t *excludes, const char *path, int filetype) {
size_t i = 0;
const char *p = NULL;
@@ -236,27 +205,6 @@ CSYNC_EXCLUDE_TYPE csync_excluded_no_ctx(c_strlist_t *excludes, const char *path
goto out;
}
#ifdef _WIN32
// Windows cannot sync files ending in spaces (#2176). It also cannot
// distinguish files ending in '.' from files without an ending,
// as '.' is a separator that is not stored internally, so let's
// not allow to sync those to avoid file loss/ambiguities (#416)
size_t blen = strlen(bname);
if (blen > 1 && (bname[blen-1]== ' ' || bname[blen-1]== '.' )) {
match = CSYNC_FILE_EXCLUDE_INVALID_CHAR;
SAFE_FREE(bname);
SAFE_FREE(dname);
goto out;
}
if (csync_is_windows_reserved_word(bname)) {
match = CSYNC_FILE_EXCLUDE_INVALID_CHAR;
SAFE_FREE(bname);
SAFE_FREE(dname);
goto out;
}
#endif
rc = csync_fnmatch(".owncloudsync.log*", bname, 0);
if (rc == 0) {
match = CSYNC_FILE_SILENTLY_EXCLUDED;
-13
Ver Arquivo
@@ -29,11 +29,6 @@ enum csync_exclude_type_e {
CSYNC_FILE_EXCLUDE_INVALID_CHAR
};
typedef enum csync_exclude_type_e CSYNC_EXCLUDE_TYPE;
#ifdef NDEBUG
int _csync_exclude_add(c_strlist_t **inList, const char *string);
#endif
/**
* @brief Load exclude list
*
@@ -80,12 +75,4 @@ CSYNC_EXCLUDE_TYPE csync_excluded(CSYNC *ctx, const char *path, int filetype);
CSYNC_EXCLUDE_TYPE csync_excluded_no_ctx(c_strlist_t *excludes, const char *path, int filetype);
#endif /* _CSYNC_EXCLUDE_H */
/**
* @brief Checks if filename is considered reserved by Windows
* @param file_name filename
* @return true if file is reserved, false otherwise
*/
bool csync_is_windows_reserved_word(const char *file_name);
/* vim: set ft=c.doxygen ts=8 sw=2 et cindent: */
+1 -2
Ver Arquivo
@@ -110,7 +110,7 @@ static int ssl_callback_by_neon(void *userdata, int failures,
}
}
DEBUG_WEBDAV("## VERIFY_SSL CERT: %d", ret );
return ret;
return ret;
}
/*
@@ -761,7 +761,6 @@ int owncloud_commit(CSYNC* ctx) {
}
ctx->owncloud_context->is_first_propfind = true;
ctx->owncloud_context->dav_session.no_recursive_propfind = true;
/* DEBUG_WEBDAV( "********** vio_module_shutdown" ); */
ctx->owncloud_context->dav_session.ctx = 0;
-2
Ver Arquivo
@@ -339,8 +339,6 @@ void fill_webdav_properties_into_resource(struct resource* newres, const ne_prop
file_id = ne_propset_value( set, &ls_props[4] );
directDownloadUrl = ne_propset_value( set, &ls_props[5] );
directDownloadCookies = ne_propset_value( set, &ls_props[6] );
// permission flags: Defined in https://github.com/owncloud/core/issues/8322
perm = ne_propset_value( set, &ls_props[7] );
if( resourcetype && strncmp( resourcetype, "<DAV:collection>", 16 ) == 0) {
+4 -5
Ver Arquivo
@@ -100,8 +100,6 @@ struct csync_s {
sqlite3_stmt* by_hash_stmt;
sqlite3_stmt* by_fileid_stmt;
sqlite3_stmt* by_inode_stmt;
int lastReturnValue;
} statedb;
struct {
@@ -109,6 +107,7 @@ struct csync_s {
c_rbtree_t *tree;
c_list_t *list;
enum csync_replica_e type;
c_list_t *ignored_cleanup;
} local;
struct {
@@ -117,6 +116,7 @@ struct csync_s {
c_list_t *list;
enum csync_replica_e type;
int read_from_db;
c_list_t *ignored_cleanup;
} remote;
#if defined(HAVE_ICONV) && defined(WITH_ICONV)
@@ -148,8 +148,8 @@ struct csync_s {
struct csync_owncloud_ctx_s *owncloud_context;
/* hooks for checking the white list */
void *checkSelectiveSyncBlackListData;
int (*checkSelectiveSyncBlackListHook)(void*, const char*);
void *checkBlackListData;
int (*checkBlackListHook)(void*, const char*);
};
@@ -167,7 +167,6 @@ struct csync_file_stat_s {
int type; /* u32 */
int child_modified;/*bool*/
int should_update_etag; /*bool */
int has_ignored_files; /*bool: specify that a directory, or child directory contains ignored files */
char *destpath; /* for renames */
const char *etag;
-13
Ver Arquivo
@@ -134,15 +134,6 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
break;
/* file has been removed on the opposite replica */
case CSYNC_INSTRUCTION_NONE:
if (cur->has_ignored_files) {
/* Do not remove a directory that has ignored files */
break;
}
if (cur->child_modified) {
/* re-create directory that has modified contents */
cur->instruction = CSYNC_INSTRUCTION_NEW;
break;
}
cur->instruction = CSYNC_INSTRUCTION_REMOVE;
break;
case CSYNC_INSTRUCTION_EVAL_RENAME:
@@ -254,10 +245,6 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) {
is_equal_files = (other->modtime == cur->modtime);
} else {
is_equal_files = ((other->size == cur->size) && (other->modtime == cur->modtime));
// FIXME: do a binary comparision of the file here because of the following
// edge case:
// The files could still have different content, even though the mtime
// and size are the same.
}
if (is_equal_files) {
/* The files are considered equal. */
+108 -75
Ver Arquivo
@@ -50,22 +50,6 @@
#define BUF_SIZE 16
#define sqlite_open(A, B) sqlite3_open_v2(A,B, SQLITE_OPEN_READONLY+SQLITE_OPEN_NOMUTEX, NULL)
#define SQLTM_TIME 150000
#define SQLTM_COUNT 10
#define SQLITE_BUSY_HANDLED(F) if(1) { \
int n = 0; \
do { rc = F ; \
if( (rc == SQLITE_BUSY) || (rc == SQLITE_LOCKED) ) { \
n++; \
usleep(SQLTM_TIME); \
} \
}while( (n < SQLTM_COUNT) && ((rc == SQLITE_BUSY) || (rc == SQLITE_LOCKED))); \
}
void csync_set_statedb_exists(CSYNC *ctx, int val) {
ctx->statedb.exists = val;
}
@@ -89,12 +73,85 @@ static int _csync_check_db_integrity(sqlite3 *db) {
c_strlist_destroy(result);
}
if( sqlite3_threadsafe() == 0 ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "* WARNING: SQLite module is not threadsafe!");
rc = -1;
return rc;
}
static int _csync_statedb_check(const char *statedb) {
int fd = -1, rc;
ssize_t r;
char buf[BUF_SIZE] = {0};
sqlite3 *db = NULL;
csync_stat_t sb;
mbchar_t *wstatedb = c_utf8_to_locale(statedb);
if (wstatedb == NULL) {
return -1;
}
/* check db version */
#ifdef _WIN32
_fmode = _O_BINARY;
#endif
fd = _topen(wstatedb, O_RDONLY);
if (fd >= 0) {
/* Check size. Size of zero is a valid database actually. */
rc = _tfstat(fd, &sb);
if (rc == 0) {
if (sb.st_size == 0) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Database size is zero byte!");
close(fd);
} else {
r = read(fd, (void *) buf, sizeof(buf) - 1);
close(fd);
if (r >= 0) {
buf[BUF_SIZE - 1] = '\0';
if (c_streq(buf, "SQLite format 3")) {
if (sqlite3_open(statedb, &db ) == SQLITE_OK) {
rc = _csync_check_db_integrity(db);
if( sqlite3_close(db) != 0 ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "WARN: sqlite3_close error!");
}
if( rc >= 0 ) {
/* everything is fine */
c_free_locale_string(wstatedb);
return 0;
}
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Integrity check failed!");
} else {
/* resources need to be freed even when open failed */
sqlite3_close(db);
CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "database corrupted, removing!");
}
} else {
CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "sqlite version mismatch");
}
}
}
} else {
close(fd);
}
/* if it comes here, the database is broken and should be recreated. */
_tunlink(wstatedb);
}
return rc;
c_free_locale_string(wstatedb);
/* create database */
rc = sqlite3_open(statedb, &db);
if (rc == SQLITE_OK) {
sqlite3_close(db);
csync_win32_set_file_hidden(statedb, true);
return 1;
}
sqlite3_close(db);
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "sqlite3_open failed: %s %s", sqlite3_errmsg(db), statedb);
return -1;
}
static int _csync_statedb_is_empty(sqlite3 *db) {
@@ -122,6 +179,7 @@ static void sqlite_profile( void *x, const char* sql, sqlite3_uint64 time)
int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb) {
int rc = -1;
int check_rc = -1;
c_strlist_t *result = NULL;
sqlite3 *db = NULL;
@@ -129,15 +187,19 @@ int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb) {
return -1;
}
if (ctx->statedb.db) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "ERR: DB already open");
return -1;
/* csync_statedb_check tries to open the statedb and creates it in case
* its not there.
*/
check_rc = _csync_statedb_check(statedb);
if (check_rc < 0) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "ERR: checking csync database failed - bail out.");
rc = -1;
goto out;
}
ctx->statedb.lastReturnValue = SQLITE_OK;
/* Openthe database */
if (sqlite_open(statedb, &db) != SQLITE_OK) {
/* Open or create the temporary database */
if (sqlite3_open(statedb, &db) != SQLITE_OK) {
const char *errmsg= sqlite3_errmsg(ctx->statedb.db);
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "ERR: Failed to sqlite3 open statedb - bail out: %s.",
errmsg ? errmsg : "<no sqlite3 errormsg>");
@@ -146,31 +208,16 @@ int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb) {
goto out;
}
if (_csync_check_db_integrity(db) != 0) {
const char *errmsg= sqlite3_errmsg(db);
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "ERR: sqlite3 integrity check failed - bail out: %s.",
errmsg ? errmsg : "<no sqlite3 errormsg>");
rc = -1;
goto out;
}
if (_csync_statedb_is_empty(db)) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "statedb contents doesn't exist");
/* If check_rc == 1 the database is new and empty as a result. */
if ((check_rc == 1) || _csync_statedb_is_empty(db)) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "statedb doesn't exist");
csync_set_statedb_exists(ctx, 0);
} else {
csync_set_statedb_exists(ctx, 1);
}
/* Print out the version */
//
result = csync_statedb_query(db, "SELECT sqlite_version();");
if (result && result->count >= 1) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "sqlite3 version \"%s\"", *result->vector);
}
c_strlist_destroy(result);
/* optimization for speeding up SQLite */
result = csync_statedb_query(db, "PRAGMA synchronous = NORMAL;");
result = csync_statedb_query(db, "PRAGMA synchronous = FULL;");
c_strlist_destroy(result);
result = csync_statedb_query(db, "PRAGMA case_sensitive_like = ON;");
c_strlist_destroy(result);
@@ -183,8 +230,6 @@ int csync_statedb_load(CSYNC *ctx, const char *statedb, sqlite3 **pdb) {
#endif
*pdb = db;
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "Success");
return 0;
out:
sqlite3_close(db);
@@ -199,25 +244,22 @@ int csync_statedb_close(CSYNC *ctx) {
}
/* deallocate query resources */
if( ctx->statedb.by_fileid_stmt ) {
sqlite3_finalize(ctx->statedb.by_fileid_stmt);
ctx->statedb.by_fileid_stmt = NULL;
}
if( ctx->statedb.by_hash_stmt ) {
sqlite3_finalize(ctx->statedb.by_hash_stmt);
rc = sqlite3_finalize(ctx->statedb.by_hash_stmt);
ctx->statedb.by_hash_stmt = NULL;
}
if( ctx->statedb.by_inode_stmt) {
sqlite3_finalize(ctx->statedb.by_inode_stmt);
if( ctx->statedb.by_fileid_stmt ) {
rc = sqlite3_finalize(ctx->statedb.by_fileid_stmt);
ctx->statedb.by_fileid_stmt = NULL;
}
if( ctx->statedb.by_inode_stmt ) {
rc = sqlite3_finalize(ctx->statedb.by_inode_stmt);
ctx->statedb.by_inode_stmt = NULL;
}
ctx->statedb.lastReturnValue = SQLITE_OK;
int sr = sqlite3_close(ctx->statedb.db);
CSYNC_LOG(CSYNC_LOG_PRIORITY_NOTICE, "sqlite3_close=%d", sr);
ctx->statedb.db = 0;
sqlite3_close(ctx->statedb.db);
return rc;
}
@@ -239,7 +281,7 @@ static int _csync_file_stat_from_metadata_table( csync_file_stat_t **st, sqlite3
column_count = sqlite3_column_count(stmt);
SQLITE_BUSY_HANDLED( sqlite3_step(stmt) );
rc = sqlite3_step(stmt);
if( rc == SQLITE_ROW ) {
if(column_count > 7) {
@@ -302,8 +344,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx,
if( ctx->statedb.by_hash_stmt == NULL ) {
const char *hash_query = "SELECT * FROM metadata WHERE phash=?1";
SQLITE_BUSY_HANDLED(sqlite3_prepare_v2(ctx->statedb.db, hash_query, strlen(hash_query), &ctx->statedb.by_hash_stmt, NULL));
ctx->statedb.lastReturnValue = rc;
rc = sqlite3_prepare_v2(ctx->statedb.db, hash_query, strlen(hash_query), &ctx->statedb.by_hash_stmt, NULL);
if( rc != SQLITE_OK ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for hash query.");
return NULL;
@@ -317,7 +358,6 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx,
sqlite3_bind_int64(ctx->statedb.by_hash_stmt, 1, (long long signed int)phash);
rc = _csync_file_stat_from_metadata_table(&st, ctx->statedb.by_hash_stmt);
ctx->statedb.lastReturnValue = rc;
if( !(rc == SQLITE_ROW || rc == SQLITE_DONE) ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Could not get line from metadata: %d!", rc);
}
@@ -345,8 +385,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_file_id(CSYNC *ctx,
if( ctx->statedb.by_fileid_stmt == NULL ) {
const char *query = "SELECT * FROM metadata WHERE fileid=?1";
SQLITE_BUSY_HANDLED(sqlite3_prepare_v2(ctx->statedb.db, query, strlen(query), &ctx->statedb.by_fileid_stmt, NULL));
ctx->statedb.lastReturnValue = rc;
rc = sqlite3_prepare_v2(ctx->statedb.db, query, strlen(query), &ctx->statedb.by_fileid_stmt, NULL);
if( rc != SQLITE_OK ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for file id query.");
return NULL;
@@ -357,7 +396,6 @@ csync_file_stat_t *csync_statedb_get_stat_by_file_id(CSYNC *ctx,
sqlite3_bind_text(ctx->statedb.by_fileid_stmt, 1, file_id, -1, SQLITE_STATIC);
rc = _csync_file_stat_from_metadata_table(&st, ctx->statedb.by_fileid_stmt);
ctx->statedb.lastReturnValue = rc;
if( !(rc == SQLITE_ROW || rc == SQLITE_DONE) ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Could not get line from metadata: %d!", rc);
}
@@ -385,8 +423,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx,
if( ctx->statedb.by_inode_stmt == NULL ) {
const char *inode_query = "SELECT * FROM metadata WHERE inode=?1";
SQLITE_BUSY_HANDLED(sqlite3_prepare_v2(ctx->statedb.db, inode_query, strlen(inode_query), &ctx->statedb.by_inode_stmt, NULL));
ctx->statedb.lastReturnValue = rc;
rc = sqlite3_prepare_v2(ctx->statedb.db, inode_query, strlen(inode_query), &ctx->statedb.by_inode_stmt, NULL);
if( rc != SQLITE_OK ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for inode query.");
return NULL;
@@ -400,7 +437,6 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx,
sqlite3_bind_int64(ctx->statedb.by_inode_stmt, 1, (long long signed int)inode);
rc = _csync_file_stat_from_metadata_table(&st, ctx->statedb.by_inode_stmt);
ctx->statedb.lastReturnValue = rc;
if( !(rc == SQLITE_ROW || rc == SQLITE_DONE) ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Could not get line from metadata by inode: %d!", rc);
}
@@ -449,8 +485,7 @@ int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
return -1;
}
SQLITE_BUSY_HANDLED(sqlite3_prepare_v2(ctx->statedb.db, BELOW_PATH_QUERY, -1, &stmt, NULL));
ctx->statedb.lastReturnValue = rc;
rc = sqlite3_prepare_v2(ctx->statedb.db, BELOW_PATH_QUERY, -1, &stmt, NULL);
if( rc != SQLITE_OK ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Unable to create stmt for below path query.");
return -1;
@@ -472,7 +507,6 @@ int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
cnt = 0;
ctx->statedb.lastReturnValue = rc;
do {
csync_file_stat_t *st = NULL;
@@ -488,7 +522,6 @@ int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) {
}
} while( rc == SQLITE_ROW );
ctx->statedb.lastReturnValue = rc;
if( rc != SQLITE_DONE ) {
ctx->status_code = CSYNC_STATUS_TREE_ERROR;
} else {
+21
Ver Arquivo
@@ -98,6 +98,27 @@ int csync_statedb_get_below_path(CSYNC *ctx, const char *path);
*/
c_strlist_t *csync_statedb_query(sqlite3 *db, const char *statement);
/**
* @brief Insert function for the statedb.
*
* @param ctx The csync context.
* @param statement The SQL statement to insert into the statedb.
*
* @return The rowid of the most recent INSERT on success, 0 if the query
* wasn't successful.
*/
typedef struct csync_progressinfo_s {
struct csync_progressinfo_s *next;
uint64_t phash;
uint64_t modtime;
char *md5;
int error;
int chunk;
int transferId;
char *tmpfile;
char *error_string;
} csync_progressinfo_t;
#ifdef __cplusplus
}
#endif
+25 -96
Ver Arquivo
@@ -100,10 +100,6 @@ static bool _csync_sameextension(const char *p1, const char *p2) {
}
#endif
static bool _last_db_return_error(CSYNC* ctx) {
return ctx->statedb.lastReturnValue != SQLITE_OK && ctx->statedb.lastReturnValue != SQLITE_DONE && ctx->statedb.lastReturnValue != SQLITE_ROW;
}
static int _csync_detect_update(CSYNC *ctx, const char *file,
const csync_vio_file_stat_t *fs, const int type) {
uint64_t h = 0;
@@ -150,21 +146,21 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
if (excluded != CSYNC_NOT_EXCLUDED) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "%s excluded (%d)", path, excluded);
if (excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
return 1;
switch (ctx->current) {
case LOCAL_REPLICA:
ctx->local.ignored_cleanup = c_list_append(ctx->local.ignored_cleanup, c_strdup(path));
break;
case REMOTE_REPLICA:
ctx->remote.ignored_cleanup = c_list_append(ctx->remote.ignored_cleanup, c_strdup(path));
break;
default:
break;
}
return 0;
}
if (excluded == CSYNC_FILE_SILENTLY_EXCLUDED) {
return 1;
return 0;
}
if (ctx->current_fs) {
ctx->current_fs->has_ignored_files = true;
}
}
if (ctx->current == REMOTE_REPLICA && ctx->checkSelectiveSyncBlackListHook) {
if (ctx->checkSelectiveSyncBlackListHook(ctx->checkSelectiveSyncBlackListData, path)) {
return 1;
}
}
h = _hash_of_file(ctx, file );
@@ -183,26 +179,17 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
st->instruction = CSYNC_INSTRUCTION_NONE;
st->etag = NULL;
st->child_modified = 0;
st->has_ignored_files = 0;
/* check hardlink count */
if (type == CSYNC_FTW_TYPE_FILE ) {
if( fs->nlink > 1) {
st->instruction = CSYNC_INSTRUCTION_IGNORE;
st->error_status = CSYNC_STATUS_INDIVIDUAL_IS_HARDLINK;
goto out;
}
if (fs->mtime == 0) {
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);
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
return -1;
}
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - mtime is zero!", path);
if (tmp == NULL) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s - not found in db, IGNORE!", path);
st->instruction = CSYNC_INSTRUCTION_IGNORE;
@@ -239,28 +226,16 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
if (csync_get_statedb_exists(ctx)) {
tmp = csync_statedb_get_stat_by_hash(ctx, h);
if(_last_db_return_error(ctx)) {
SAFE_FREE(st);
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
return -1;
}
if(tmp && tmp->phash == h ) { /* there is an entry in the database */
/* we have an update! */
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Database entry found, compare: %" PRId64 " <-> %" PRId64
", etag: %s <-> %s, inode: %" PRId64 " <-> %" PRId64
", size: %" PRId64 " <-> %" PRId64 ", perms: %s <-> %s",
((int64_t) fs->mtime), ((int64_t) tmp->modtime),
fs->etag, tmp->etag, (uint64_t) fs->inode, (uint64_t) tmp->inode,
(uint64_t) fs->size, (uint64_t) tmp->size, fs->remotePerm, tmp->remotePerm );
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Database entry found, compare: %" PRId64 " <-> %" PRId64 ", etag: %s <-> %s, inode: %" PRId64 " <-> %" PRId64,
((int64_t) fs->mtime), ((int64_t) tmp->modtime), fs->etag, tmp->etag, (uint64_t) fs->inode, (uint64_t) tmp->inode);
if( !fs->etag) {
st->instruction = CSYNC_INSTRUCTION_EVAL;
goto out;
}
if((ctx->current == REMOTE_REPLICA && !c_streq(fs->etag, tmp->etag ))
|| (ctx->current == LOCAL_REPLICA && (fs->mtime != tmp->modtime
// zero size in statedb can happen during migration
|| (tmp->size != 0 && fs->size != tmp->size)
#if 0
|| fs->inode != tmp->inode
#endif
@@ -310,12 +285,6 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode);
if(_last_db_return_error(ctx)) {
SAFE_FREE(st);
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
return -1;
}
/* translate the file type between the two stat types csync has. */
if( tmp && tmp->type == 0 ) {
tmp_vio_type = CSYNC_VIO_FILE_TYPE_REGULAR;
@@ -346,12 +315,6 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
} else {
/* Remote Replica Rename check */
tmp = csync_statedb_get_stat_by_file_id(ctx, fs->file_id);
if(_last_db_return_error(ctx)) {
SAFE_FREE(st);
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
return -1;
}
if(tmp ) { /* tmp existing at all */
if ((tmp->type == CSYNC_FTW_TYPE_DIR && fs->type != CSYNC_VIO_FILE_TYPE_DIRECTORY) ||
(tmp->type == CSYNC_FTW_TYPE_FILE && fs->type != CSYNC_VIO_FILE_TYPE_REGULAR)) {
@@ -379,9 +342,8 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
}
}
} else {
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Unable to open statedb" );
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
return -1;
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Unable to open statedb, setting inst to NEW" );
st->instruction = CSYNC_INSTRUCTION_NEW;
}
out:
@@ -469,19 +431,11 @@ int csync_walker(CSYNC *ctx, const char *file, const csync_vio_file_stat_t *fs,
switch (flag) {
case CSYNC_FTW_FLAG_FILE:
if (ctx->current == REMOTE_REPLICA) {
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 [inode=%" PRIu64 " size=%" PRIu64 "]", file, fs->inode, fs->size);
}
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s [file_id=%s]", file, fs->file_id);
type = CSYNC_FTW_TYPE_FILE;
break;
case CSYNC_FTW_FLAG_DIR: /* enter directory */
if (ctx->current == REMOTE_REPLICA) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "directory: %s [file_id=%s]", file, fs->file_id);
} else {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "directory: %s [inode=%" PRIu64 "]", file, fs->inode);
}
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "directory: %s [file_id=%s]", file, fs->file_id);
type = CSYNC_FTW_TYPE_DIR;
break;
case CSYNC_FTW_FLAG_NSTAT: /* not statable file */
@@ -581,17 +535,6 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
if (asp < 0) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "asprintf failed!");
}
} else if(errno == ERRNO_SERVICE_UNAVAILABLE) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "Service was not available!");
if (ctx->current_fs) {
ctx->current_fs->instruction = CSYNC_INSTRUCTION_IGNORE;
ctx->current_fs->error_status = CSYNC_STATUS_SERVICE_UNAVAILABLE;
/* If a directory has ignored files, put the flag on the parent directory as well */
if( previous_fs ) {
previous_fs->has_ignored_files = true;
}
goto done;
}
} else {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "opendir failed for %s - errno %d", uri, errno);
}
@@ -648,13 +591,10 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
path = filename + ulen;
/* skip ".csync_journal.db" and ".csync_journal.db.ctmp" */
/* Isn't this done via csync_exclude already? */
if (c_streq(path, ".csync_journal.db")
|| c_streq(path, ".csync_journal.db.ctmp")
|| c_streq(path, ".csync_journal.db.ctmp-journal")
|| c_streq(path, ".csync-progressdatabase")
|| c_streq(path, ".csync_journal.db-shm")
|| c_streq(path, ".csync_journal.db-wal")) {
|| c_streq(path, ".csync-progressdatabase")) {
csync_vio_file_stat_destroy(dirent);
dirent = NULL;
SAFE_FREE(filename);
@@ -700,11 +640,6 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
uint64_t h = c_jhash64((uint8_t *) path, len, 0);
etag = csync_statedb_get_etag( ctx, h );
if(_last_db_return_error(ctx)) {
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
goto error;
}
if( etag ) {
SAFE_FREE(fs->etag);
fs->etag = etag;
@@ -724,6 +659,10 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
rc = fn(ctx, filename, fs, flag);
/* this function may update ctx->current and ctx->read_from_db */
if (ctx->current_fs && previous_fs && ctx->current_fs->child_modified) {
previous_fs->child_modified = ctx->current_fs->child_modified;
}
/* Only for the local replica we have to destroy stat(), for the remote one it is a pointer to dirent */
if (ctx->replica == LOCAL_REPLICA) {
csync_vio_file_stat_destroy(fs);
@@ -738,7 +677,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
goto error;
}
if (flag == CSYNC_FTW_FLAG_DIR && depth && rc == 0
if (flag == CSYNC_FTW_FLAG_DIR && depth
&& (!ctx->current_fs || ctx->current_fs->instruction != CSYNC_INSTRUCTION_IGNORE)) {
rc = csync_ftw(ctx, filename, fn, depth - 1);
if (rc < 0) {
@@ -751,16 +690,6 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
ctx->current_fs->instruction = CSYNC_INSTRUCTION_NONE;
ctx->current_fs->should_update_etag = true;
}
if (ctx->current_fs && previous_fs && ctx->current_fs->has_ignored_files) {
/* If a directory has ignored files, put the flag on the parent directory as well */
previous_fs->has_ignored_files = ctx->current_fs->has_ignored_files;
}
}
if (ctx->current_fs && previous_fs && ctx->current_fs->child_modified) {
/* If a directory has modified files, put the flag on the parent directory as well */
previous_fs->child_modified = ctx->current_fs->child_modified;
}
if (flag == CSYNC_FTW_FLAG_DIR && ctx->current_fs
+2 -5
Ver Arquivo
@@ -96,7 +96,6 @@ hbf_transfer_t *hbf_init_transfer( const char *dest_uri ) {
transfer->block_size = DEFAULT_BLOCK_SIZE;
transfer->threshold = transfer->block_size;
transfer->modtime_accepted = 0;
transfer->oc_header_modtime = 0;
return transfer;
}
@@ -492,8 +491,8 @@ Hbf_State hbf_transfer( ne_session *session, hbf_transfer_t *transfer, const cha
snprintf(buf, sizeof(buf), "%"PRId64, transfer->stat_size);
ne_add_request_header(req, "OC-Total-Length", buf);
if( transfer->oc_header_modtime > 0 ) {
snprintf(buf, sizeof(buf), "%"PRId64, transfer->oc_header_modtime);
if( transfer->modtime > 0 ) {
snprintf(buf, sizeof(buf), "%"PRId64, transfer->modtime);
ne_add_request_header(req, "X-OC-Mtime", buf);
}
@@ -503,8 +502,6 @@ Hbf_State hbf_transfer( ne_session *session, hbf_transfer_t *transfer, const cha
if( transfer->block_cnt > 1 ) {
ne_add_request_header(req, "OC-Chunked", "1");
snprintf(buf, sizeof(buf), "%"PRId64, transfer->threshold);
ne_add_request_header(req, "OC-Chunk-Size", buf);
}
ne_add_request_header( req, "Content-Type", "application/octet-stream");
-1
Ver Arquivo
@@ -92,7 +92,6 @@ struct hbf_transfer_s {
int64_t stat_size;
time_t modtime;
time_t oc_header_modtime;
int64_t block_size;
int64_t threshold;
-8
Ver Arquivo
@@ -134,14 +134,6 @@ static char *c_iconv(const char* str, enum iconv_direction dir)
}
#endif /* defined(HAVE_ICONV) && defined(WITH_ICONV) */
int c_strncasecmp(const char *a, const char *b, size_t n) {
#ifdef _WIN32
return _strnicmp(a, b, n);
#else
return strncasecmp(a, b, n);
#endif
}
int c_streq(const char *a, const char *b) {
register const char *s1 = a;
register const char *s2 = b;
-11
Ver Arquivo
@@ -59,17 +59,6 @@ struct c_strlist_s {
size_t size;
};
/**
* @brief Compare to strings case insensitively.
*
* @param a First string to compare.
* @param b Second string to compare.
* @param n Max comparison length.
*
* @return see strncasecmp
*/
int c_strncasecmp(const char *a, const char *b, size_t n);
/**
* @brief Compare to strings if they are equal.
*
+1 -1
Ver Arquivo
@@ -237,7 +237,7 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
/* printf("Index: %I64i\n", FileIndex.QuadPart); */
buf->inode = FileIndex.QuadPart;
buf->size = (fileInfo.nFileSizeHigh * ((int64_t)(MAXDWORD)+1)) + fileInfo.nFileSizeLow;
buf->size = (fileInfo.nFileSizeHigh * (int64_t)(MAXDWORD+1)) + fileInfo.nFileSizeLow;
buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE;
/* Get the file time with a win32 call rather than through stat. See
@@ -141,57 +141,6 @@ static void check_csync_excluded(void **state)
}
static void check_csync_pathes(void **state)
{
CSYNC *csync = *state;
int rc;
_csync_exclude_add( &(csync->excludes), "/exclude" );
/* Check toplevel dir, the pattern only works for toplevel dir. */
rc = csync_excluded(csync, "/exclude", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "/foo/exclude", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
/* check for a file called exclude. Must still work */
rc = csync_excluded(csync, "/exclude", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "/foo/exclude", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
/* Add an exclude for directories only: excl/ */
_csync_exclude_add( &(csync->excludes), "excl/" );
rc = csync_excluded(csync, "/excl", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "meep/excl", CSYNC_FTW_TYPE_DIR);
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded(csync, "/excl", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
}
static void check_csync_is_windows_reserved_word() {
assert_true(csync_is_windows_reserved_word("CON"));
assert_true(csync_is_windows_reserved_word("con"));
assert_true(csync_is_windows_reserved_word("CON."));
assert_true(csync_is_windows_reserved_word("con."));
assert_true(csync_is_windows_reserved_word("CON.ference"));
assert_false(csync_is_windows_reserved_word("CONference"));
assert_false(csync_is_windows_reserved_word("conference"));
assert_false(csync_is_windows_reserved_word("conf.erence"));
assert_false(csync_is_windows_reserved_word("co"));
assert_true(csync_is_windows_reserved_word("A:"));
assert_true(csync_is_windows_reserved_word("a:"));
assert_true(csync_is_windows_reserved_word("z:"));
assert_true(csync_is_windows_reserved_word("Z:"));
assert_true(csync_is_windows_reserved_word("M:"));
assert_true(csync_is_windows_reserved_word("m:"));
}
int torture_run_tests(void)
{
@@ -199,8 +148,6 @@ int torture_run_tests(void)
unit_test_setup_teardown(check_csync_exclude_add, setup, teardown),
unit_test_setup_teardown(check_csync_exclude_load, setup, teardown),
unit_test_setup_teardown(check_csync_excluded, 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),
};
return run_tests(tests);
@@ -42,13 +42,6 @@ static void setup(void **state) {
csync->statedb.file = c_strdup( TESTDB );
*state = csync;
sqlite3 *db = NULL;
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
assert_int_equal(rc, SQLITE_OK);
rc = sqlite3_close(db);
assert_int_equal(rc, SQLITE_OK);
}
static void teardown(void **state) {
@@ -64,6 +57,37 @@ static void teardown(void **state) {
*state = NULL;
}
static void check_csync_statedb_check(void **state)
{
int rc;
(void) state; /* unused */
rc = system("mkdir -p /tmp/check_csync1");
/* old db */
rc = system("echo \"SQLite format 2\" > /tmp/check_csync1/test.db");
assert_int_equal(rc, 0);
rc = _csync_statedb_check(TESTDB);
assert_int_equal(rc, 1);
/* db already exists */
rc = _csync_statedb_check(TESTDB);
assert_int_equal(rc, 1);
/* no db exists */
rc = system("rm -f /tmp/check_csync1/test.db");
assert_int_equal(rc, 0);
rc = _csync_statedb_check(TESTDB);
assert_int_equal(rc, 1);
rc = _csync_statedb_check("/tmp/check_csync1/");
assert_int_equal(rc, -1);
rc = system("rm -rf /tmp/check_csync1");
assert_int_equal(rc, 0);
}
static void check_csync_statedb_load(void **state)
{
CSYNC *csync = *state;
@@ -119,6 +143,7 @@ static void check_csync_statedb_close(void **state)
int torture_run_tests(void)
{
const UnitTest tests[] = {
unit_test_setup_teardown(check_csync_statedb_check, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_load, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_close, setup, teardown),
};
@@ -47,12 +47,6 @@ static void setup(void **state)
rc = csync_init(csync);
assert_int_equal(rc, 0);
sqlite3 *db = NULL;
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
assert_int_equal(rc, SQLITE_OK);
rc = sqlite3_close(db);
assert_int_equal(rc, SQLITE_OK);
rc = csync_statedb_load(csync, TESTDB, &csync->statedb.db);
assert_int_equal(rc, 0);
@@ -61,11 +55,19 @@ static void setup(void **state)
static void setup_db(void **state)
{
char *errmsg;
CSYNC *csync;
char *stmt = NULL;
int rc = 0;
sqlite3 *db = NULL;
c_strlist_t *result = NULL;
const char *sql = "CREATE TABLE IF NOT EXISTS metadata ("
setup(state);
csync = *state;
// rc = csync_statedb_create_tables(csync->statedb.db);
assert_int_equal(rc, 0);
result = csync_statedb_query(csync->statedb.db,
"CREATE TABLE IF NOT EXISTS metadata ("
"phash INTEGER(8),"
"pathlen INTEGER,"
"path VARCHAR(4096),"
@@ -77,25 +79,29 @@ static void setup_db(void **state)
"type INTEGER,"
"md5 VARCHAR(32),"
"PRIMARY KEY(phash)"
");";
");"
);
const char *sql2 = "INSERT INTO metadata"
assert_non_null(result);
c_strlist_destroy(result);
stmt = sqlite3_mprintf("INSERT INTO metadata"
"(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5) VALUES"
"(42, 42, 'Its funny stuff', 23, 42, 43, 55, 66, 2, 54);";
setup(state);
rc = sqlite3_open( TESTDB, &db);
assert_int_equal(rc, SQLITE_OK);
rc = sqlite3_exec( db, sql, NULL, NULL, &errmsg );
assert_int_equal(rc, SQLITE_OK);
rc = sqlite3_exec( db, sql2, NULL, NULL, &errmsg );
assert_int_equal(rc, SQLITE_OK);
sqlite3_close(db);
"(%lu, %d, '%q', %d, %d, %d, %d, %lu, %d, %lu);",
42,
42,
"It's a rainy day",
23,
42,
42,
42,
42,
2,
43);
// rc = csync_statedb_insert(csync->statedb.db, stmt);
sqlite3_free(stmt);
}
static void teardown(void **state) {
@@ -133,6 +139,41 @@ static void check_csync_statedb_query_statement(void **state)
}
}
static void check_csync_statedb_create_error(void **state)
{
CSYNC *csync = *state;
c_strlist_t *result;
result = csync_statedb_query(csync->statedb.db, "CREATE TABLE test(phash INTEGER, text VARCHAR(10));");
assert_non_null(result);
c_strlist_destroy(result);
result = csync_statedb_query(csync->statedb.db, "CREATE TABLE test(phash INTEGER, text VARCHAR(10));");
assert_null(result);
c_strlist_destroy(result);
}
static void check_csync_statedb_insert_statement(void **state)
{
CSYNC *csync = *state;
c_strlist_t *result;
int rc = 0;
result = csync_statedb_query(csync->statedb.db, "CREATE TABLE test(phash INTEGER, text VARCHAR(10));");
assert_non_null(result);
c_strlist_destroy(result);
// rc = csync_statedb_insert(csync->statedb.db, "INSERT;");
assert_int_equal(rc, 0);
// rc = csync_statedb_insert(csync->statedb.db, "INSERT");
assert_int_equal(rc, 0);
// rc = csync_statedb_insert(csync->statedb.db, "");
assert_int_equal(rc, 0);
}
static void check_csync_statedb_drop_tables(void **state)
{
// CSYNC *csync = *state;
@@ -214,6 +255,8 @@ int torture_run_tests(void)
{
const UnitTest tests[] = {
unit_test_setup_teardown(check_csync_statedb_query_statement, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_create_error, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_insert_statement, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_drop_tables, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_insert_metadata, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_write, setup, teardown),
+22 -76
Ver Arquivo
@@ -23,64 +23,11 @@
#define TESTDB "/tmp/check_csync/journal.db"
static int firstrun = 1;
static void statedb_create_metadata_table(sqlite3 *db)
{
int rc = 0;
if( db ) {
const char *sql = "CREATE TABLE IF NOT EXISTS metadata("
"phash INTEGER(8),"
"pathlen INTEGER,"
"path VARCHAR(4096),"
"inode INTEGER,"
"uid INTEGER,"
"gid INTEGER,"
"mode INTEGER,"
"modtime INTEGER(8),"
"type INTEGER,"
"md5 VARCHAR(32),"
"PRIMARY KEY(phash));";
rc = sqlite3_exec(db, sql, NULL, NULL, NULL);
const char *msg = sqlite3_errmsg(db);
assert_int_equal( rc, SQLITE_OK );
}
}
static void statedb_insert_metadata(sqlite3 *db)
{
int rc = 0;
if( db ) {
char *stmt = sqlite3_mprintf("INSERT INTO metadata"
"(phash, pathlen, path, inode, uid, gid, mode, modtime,type,md5) VALUES"
"(%lld, %d, '%q', %d, %d, %d, %d, %lld, %d, '%q');",
(long long signed int)42,
42,
"I_was_wurst_before_I_became_wurstsalat",
619070,
42,
42,
42,
(long long signed int)42,
0,
"4711");
char *errmsg;
rc = sqlite3_exec(db, stmt, NULL, NULL, &errmsg);
sqlite3_free(stmt);
assert_int_equal( rc, SQLITE_OK );
}
}
static void setup(void **state)
{
CSYNC *csync;
int rc;
unlink(TESTDB);
rc = system("mkdir -p /tmp/check_csync");
assert_int_equal(rc, 0);
rc = system("mkdir -p /tmp/check_csync1");
@@ -91,21 +38,10 @@ static void setup(void **state)
assert_int_equal(rc, 0);
rc = csync_init(csync);
assert_int_equal(rc, 0);
/* Create a new db with metadata */
sqlite3 *db;
csync->statedb.file = c_strdup(TESTDB);
rc = sqlite3_open(csync->statedb.file, &db);
statedb_create_metadata_table(db);
if( firstrun ) {
statedb_insert_metadata(db);
firstrun = 0;
}
sqlite3_close(db);
rc = csync_statedb_load(csync, TESTDB, &csync->statedb.db);
assert_int_equal(rc, 0);
*state = csync;
}
@@ -124,18 +60,9 @@ static void setup_ftw(void **state)
assert_int_equal(rc, 0);
rc = csync_init(csync);
assert_int_equal(rc, 0);
sqlite3 *db = NULL;
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
assert_int_equal(rc, SQLITE_OK);
statedb_create_metadata_table(db);
rc = sqlite3_close(db);
assert_int_equal(rc, SQLITE_OK);
rc = csync_statedb_load(csync, TESTDB, &csync->statedb.db);
assert_int_equal(rc, 0);
csync->statedb.file = c_strdup( TESTDB );
*state = csync;
}
@@ -144,7 +71,6 @@ static void teardown(void **state)
CSYNC *csync = *state;
int rc;
unlink( csync->statedb.file);
rc = csync_destroy(csync);
assert_int_equal(rc, 0);
@@ -323,7 +249,6 @@ static void check_csync_detect_update_db_eval(void **state)
csync_vio_file_stat_destroy(fs);
}
static void check_csync_detect_update_db_rename(void **state)
{
CSYNC *csync = *state;
@@ -331,6 +256,27 @@ static void check_csync_detect_update_db_rename(void **state)
csync_vio_file_stat_t *fs;
int rc = 0;
char *stmt = NULL;
// rc = csync_statedb_create_tables(csync->statedb.db);
assert_int_equal(rc, 0);
stmt = sqlite3_mprintf("INSERT INTO metadata"
"(phash, pathlen, path, inode, uid, gid, mode, modtime,type,md5) VALUES"
"(%lld, %d, '%q', %d, %d, %d, %d, %lld, %d, '%q');",
(long long signed int)42,
42,
"I_was_wurst_before_I_became_wurstsalat",
619070,
42,
42,
42,
(long long signed int)42,
0,
"4711");
// rc = csync_statedb_insert(csync->statedb.db, stmt);
sqlite3_free(stmt);
fs = create_fstat("wurst.txt", 0, 1, 42);
assert_non_null(fs);
-1
Ver Arquivo
@@ -1 +0,0 @@
t1.cfg
+10 -1
Ver Arquivo
@@ -1,7 +1,12 @@
t1 - an integration test script for csync syncing to ownCloud.
Note: This test script uses perl HTTP::DAV. This package needs to
be in version 0.47 at least. Many distros deliver older versions.
be in version 0.46 at least. Many distros deliver older versions.
A working version is part of the github checkout.
Note: This test script uses perl HTTP::DAV. This package needs to
be in version 0.46 at least. Many distros deliver older versions.
Update than.
t1 uses a perl WebDAV client lib to sync to an existing instance of
ownCloud. For that, various files are copied around, synced and the
@@ -15,6 +20,10 @@ First, configure the script. For that, create a file t1.cfg. There
is t1.cfg.in as an example. Yeah, this test script is not secure,
make sure to run it with a weak account and in a save environment.
Second, unpack the test file collection with
tar xf testfiles.tar.xz
in the directory where the tarball can be found.
To start the script, call ./t1.pl on the commandline. A lot of
output is generated. If the script does not fail, everything works.
+1 -3
Ver Arquivo
@@ -1,3 +1 @@
*.part
]*.directory
*_conflict-*
+40 -52
Ver Arquivo
@@ -27,6 +27,7 @@ use Exporter;
use HTTP::DAV 0.47;
use Data::Dumper;
use File::Glob ':glob';
use Carp::Assert;
use Digest::MD5;
use Unicode::Normalize;
use LWP::UserAgent;
@@ -35,7 +36,6 @@ use HTTP::Request::Common qw( POST GET DELETE );
use File::Basename;
use IO::Handle;
use POSIX qw/strftime/;
use Carp;
use Encode qw(from_to);
use utf8;
@@ -63,22 +63,22 @@ our %config;
@ISA = qw(Exporter);
@EXPORT = qw( initTesting createRemoteDir removeRemoteDir createLocalDir cleanup csync
assertLocalDirs assertLocalAndRemoteDir glob_put put_to_dir
assertLocalDirs assertLocalAndRemoteDir glob_put put_to_dir
putToDirLWP localDir remoteDir localCleanup createLocalFile md5OfFile
remoteCleanup server initLocalDir initRemoteDir moveRemoteFile
printInfo remoteFileId createShare removeShare assert
printInfo remoteFileId createShare removeShare
configValue testDirUrl getToFileLWP getToFileCurl);
sub server
{
return $owncloud;
}
sub fromFileName($)
{
my ($file) = @_;
if ( $^O eq "darwin" ) {
my $fromFileName = NFC( Encode::decode('utf-8', $file) );
my $fromFileName = NFC( Encode::decode('utf-8', $file) );
return $fromFileName;
} else {
return $file;
@@ -89,7 +89,7 @@ sub fromFileName($)
sub initTesting(;$)
{
my ($prefix) = @_;
my $cfgFile = "./t1.cfg";
$cfgFile = "/etc/ownCloud/t1.cfg" if( -r "/etc/ownCloud/t1.cfg" );
@@ -115,8 +115,6 @@ sub initTesting(;$)
$owncloud .= "/" unless( $owncloud =~ /\/$/ );
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
print "Connecting to ownCloud at ". $owncloud ."\n";
# For SSL set the environment variable needed by the LWP module for SSL
@@ -131,15 +129,15 @@ sub initTesting(;$)
-pass=> $passwd );
# $d->DebugLevel(3);
$prefix = "t1" unless( defined $prefix );
my $dirId = sprintf("%02d", rand(100));
my $dateTime = strftime('%Y%m%d%H%M%S',localtime);
my $dir = sprintf( "%s-%s-%s/", $prefix, $dateTime, $dirId );
$localDir = $dir;
$localDir .= "/" unless( $localDir =~ /\/$/ );
$remoteDir = $dir;
initRemoteDir();
initLocalDir();
printf( "Test directory name is %s\n", $dir );
@@ -168,9 +166,7 @@ sub testDirUrl()
# the global var $remoteDir;
sub initRemoteDir
{
$d->open( $owncloud )
or die("Couldn't open $owncloud: " .$d->message . "\n");
$d->open( $owncloud );
my $url = testDirUrl();
my $re = $d->mkcol( $url );
@@ -208,7 +204,7 @@ sub removeRemoteDir($;$)
if( $re == 0 ) {
print "Failed to remove directory <$url>:" . $d->message() ."\n";
}
return $re;
}
@@ -309,7 +305,7 @@ sub csync( ;$ )
print "CSync URL: $url\n";
my $args = "--trust --exclude exclude.cfg"; # Trust crappy SSL certificates
my $args = "--trust"; # Trust crappy SSL certificates
my $cmd = "LD_LIBRARY_PATH=$ld_libpath $csync $args $localDir $url";
print "Starting: $cmd\n";
@@ -340,7 +336,7 @@ sub localDir()
return $localDir;
}
sub remoteDir()
sub remoteDir()
{
return $remoteDir;
}
@@ -362,8 +358,6 @@ sub assertFile($$)
}
my $stat_ok = stat( $localFile2 );
print " *** STAT failed for $localFile2\n" unless( $stat_ok );
assert($stat_ok, "Stat failed for file $localFile");
my @info = stat( $localFile2 );
my $localModTime = $info[9];
assert( $remoteModTime == $localModTime, "Modified-Times differ: remote: $remoteModTime <-> local: $localModTime" );
@@ -373,7 +367,7 @@ sub assertFile($$)
my $remoteSize = $res->get_property( "getcontentlength" );
if( $remoteSize ) { # directories do not have a contentlength
print "Local versus Remote size: $localSize <-> $remoteSize\n";
# assert( $localSize == $remoteSize, "File sizes differ" ); # FIXME enable this again but it causes trouble on Jenkins all the time.
assert( $localSize == $remoteSize, "File sizes differ" );
}
}
@@ -387,7 +381,7 @@ sub traverse( $$;$ )
{
my ($remote, $acceptConflicts, $aurl) = @_;
$remote .= '/' unless $remote =~ /(^|\/)$/;
my $url = testDirUrl() . $remote;
if( $aurl ) {
$url = $aurl . $remote;
@@ -495,13 +489,13 @@ sub glob_put( $$;$ )
print " *** Putting $lfile to $puturl\n";
# putToDirLWP( $lfile, $puturl );
put_to_dir($lfile, $puturl, $optionsRef);
# if( ! $d->put( -local=>$lfile, -url=> $puturl ) ) {
#print " ### FAILED to put: ". $d->message . '\n';
# s}
}
}
}
}
@@ -531,7 +525,7 @@ sub put_to_dir( $$;$ )
}
}
# The HTTP DAV module often does a PROPFIND before it really PUTs. That
# The HTTP DAV module often does a PROPFIND before it really PUTs. That
# is not neccessary if we know that the directory is really there.
# Use this function in this case:
sub putToDirLWP($$)
@@ -551,13 +545,13 @@ sub putToDirLWP($$)
my $string = <FILE>;
close FILE;
my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 0 });
my $ua = LWP::UserAgent->new();
$ua->agent( "ownCloudTest_$localDir");
my $req = PUT $puturl, Content_Type => 'application/octet-stream',
Content => $string;
$req->authorization_basic($user, $passwd);
my $response = $ua->request($req);
if ($response->is_success()) {
# print "OK: ", $response->content;
} else {
@@ -585,7 +579,7 @@ sub getToFileLWP( $$ )
my $geturl = testDirUrl() . $file;
print "GETting $geturl to $localFile\n";
my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 0 });
my $ua = LWP::UserAgent->new();
$ua->agent( "ownCloudTest_$localDir");
$ua->credentials( server(), "foo", $user, $passwd);
my $req = $ua->get($geturl, ":content_file" => $localFile);
@@ -600,15 +594,15 @@ sub getToFileLWP( $$ )
}
}
sub createLocalFile( $$ )
sub createLocalFile( $$ )
{
my ($fname, $size) = @_;
$size = 1024 unless( $size );
my $md5 = Digest::MD5->new;
open(FILE, ">", $fname) or die "Can't open $fname for writing ($!)";
my $minimum = 32;
my $range = 96;
@@ -626,20 +620,20 @@ sub createLocalFile( $$ )
print FILE $s;
$md5->add($s);
close FILE;
return $md5->hexdigest;
return $md5->hexdigest;
}
sub md5OfFile( $ )
sub md5OfFile( $ )
{
my ($file) = @_;
open FILE, "$file";
my $ctx = Digest::MD5->new;
$ctx->addfile (*FILE);
my $hash = $ctx->hexdigest;
close (FILE);
return $hash;
}
@@ -653,27 +647,27 @@ sub moveRemoteFile($$;$)
my $fromUrl = testDirUrl(). $from;
my $toUrl = testDirUrl() . $to;
if( $no_testdir ) {
$fromUrl = $from;
$toUrl = $to;
}
$d->move($fromUrl, $toUrl);
}
sub printInfo($)
{
my ($info) = @_;
my $tt = 6+length( $info );
print "#" x $tt;
printf( "\n# %2d. %s", $infoCnt, $info );
print "\n" unless $info =~ /\n$/;
print "#" x $tt;
print "\n";
$infoCnt++;
}
@@ -724,15 +718,16 @@ sub createShare($$)
my $re = $dd->mkcol( $url );
if( $re == 0 ) {
print "Failed to create test dir $url\n";
}
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 } );
my $ua = LWP::UserAgent->new();
$ua->agent( "ownCloudTest_sharing");
# http://localhost/ocm/ocs/v1.php/apps/files_sharing/api/v1/shares
my $puturl = $ocs_url . "apps/files_sharing/api/v1/shares";
my $string = "path=$dir&shareType=0&shareWith=$user&publicUpload=false&permissions=$readWrite";
print ">>>>>>>>>> $puturl $string\n";
print ">>>>>>>>>> $string\n";
my $req = POST $puturl, Content => $string;
$req->authorization_basic($share_user, $share_passwd);
@@ -762,16 +757,17 @@ sub removeShare($$)
-pass => $share_passwd );
$dd->open( $owncloud);
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
my $ua = LWP::UserAgent->new();
$ua->agent( "ownCloudTest_sharing");
my $url = $ocs_url . "ocs/v1.php/apps/files_sharing/api/v1/shares/" . $shareId;
# http://localhost/ocm/ocs/v1.php/apps/files_sharing/api/v1/shares
my $url = $ocs_url . "apps/files_sharing/api/v1/shares/" . $shareId;
my $req = DELETE $url;
$req->authorization_basic($share_user, $share_passwd);
my $response = $ua->request($req);
if ($response->is_success()) {
# print "OK: ", $response->content;
print $response->decoded_content;
if( $response->decoded_content =~ /<status_code>(\d+)<\/status_code>/m) {
my $code = $1;
@@ -787,12 +783,4 @@ sub removeShare($$)
my $response = $ua->request($req);
}
sub assert($;$)
{
unless( $_[0] ) {
print Carp::confess(@_);
exit(1);
}
}
#
+2 -2
Ver Arquivo
@@ -1,8 +1,8 @@
user => "joe",
passwd => "secret",
url => "http://localhost/ocm/remote.php/webdav/",
ld_libpath => "/home/joe/owncloud/mirall-install/lib",
csync => "/home/joe/owncloud/mirall-install/bin/owncloudcmd",
ld_libpath => "/home/joe/owncloud/csync/csync-build/modules",
csync => "/home/joe/owncloud/csync/csync-build/client/csync",
ocs_url => "http://localhost/owncloud/ocs/v1.php/",
share_user => "jenny",
share_passwd => "also_secret"
+3 -31
Ver Arquivo
@@ -23,6 +23,7 @@
use lib ".";
use Carp::Assert;
use File::Copy;
use ownCloud::Test;
@@ -122,24 +123,8 @@ assertLocalAndRemoteDir( '', 0);
# The previous sync should have updated the etags, and this should NOT be a conflict
printInfo( "Update the file again");
my $f1 = localDir() . "remoteToLocal1/kernelcrash.txt";
my $s1 = 2136;
createLocalFile( $f1, $s1);
# stat the file
my @stat1 = stat $f1;
print "Updating File $f1 to $s1, size is $stat1[7]\n";
my $f2 = localDir() . "remoteToLocal1/kraft_logo.gif";
my $s2 = 2332;
createLocalFile( $f2, $s2);
# stat the file
my @stat2 = stat $f2;
print "Updating File $f2 to $s2, size is $stat2[7]\n";
createLocalFile( localDir() . "remoteToLocal1/kernelcrash.txt", 2136 );
createLocalFile( localDir() . "remoteToLocal1/kraft_logo.gif", 2332 );
system( "sleep 2 && touch " . localDir() . "remoteToLocal1/kernelcrash.txt" );
csync( );
assertLocalAndRemoteDir( '', 0);
@@ -185,19 +170,6 @@ assertLocalAndRemoteDir( '', 0);
assert( -e localDir().'remoteToLocal1/rtlX' );
assert( -e localDir().'remoteToLocal1/rtlX/rtl11/file.txt' );
printInfo( "Remove a directory on the server with new files on the client");
removeRemoteDir('remoteToLocal1/rtlX');
system("echo hello > " . localDir(). "remoteToLocal1/rtlX/rtl11/hello.txt");
csync();
assertLocalAndRemoteDir( '', 0);
# file.txt must be gone because the directory was removed on the server, but hello.txt must be there
# as it is a new file
assert( ! -e localDir().'remoteToLocal1/rtlX/rtl11/file.txt' );
assert( -e localDir().'remoteToLocal1/rtlX/rtl11/hello.txt' );
# ==================================================================
cleanup();
+1 -1
Ver Arquivo
@@ -23,7 +23,7 @@
use lib ".";
use Carp::Assert;
use File::Copy;
use ownCloud::Test;
+2 -5
Ver Arquivo
@@ -23,7 +23,7 @@
use lib ".";
use Carp::Assert;
use File::Copy;
use ownCloud::Test;
@@ -91,10 +91,7 @@ assertLocalAndRemoteDir( 'newdir', 0);
assert( -e localDir().'newdir/rtl1/rtl11/newfile.dat' );
assert( -e localDir().'newdir/rtl1/rtl11/myfile.txt' );
assert( ! -e localDir().'newdir/rtl11/test.txt' );
# BUG! remoteToLocal1 is not deleted because changes were detected
# (even if the changed fileswere moved)
# assert( ! -e localDir().'remoteToLocal1' );
assert( ! -e localDir().'remoteToLocal1/rtl1' );
assert( ! -e localDir().'remoteToLocal1' );
printInfo("Move file and create another one with the same name.");
move( localDir() . 'newdir/myfile.txt', localDir() . 'newdir/oldfile.txt' );
+2 -18
Ver Arquivo
@@ -23,7 +23,7 @@
use lib ".";
use Carp::Assert;
use File::Copy;
use ownCloud::Test;
@@ -38,10 +38,6 @@ printInfo( "Copy some files to the remote location" );
mkdir( localDir() . 'test_stat' );
system( "echo foobar > " . localDir() . 'test_stat/file.txt' );
mkdir( localDir() . 'test_ignored' );
mkdir( localDir() . 'test_ignored/sub' );
system( "echo foobarfoo > " . localDir() . 'test_ignored/sub/file.txt' );
# call csync, sync local t1 to remote t1
csync();
@@ -95,25 +91,15 @@ my $realMD5 = md5OfFile( '/tmp/kernelcrash.txt' );
print "MD5 compare $localMD5 <-> $realMD5\n";
assert( $localMD5 eq $realMD5 );
printInfo("Added a file that is on the ignore list");
# (*.directory is in the ignored list that needs cleanup)
# (it is names with _conflict) because i want the conflicft detection of assertLocalAndRemoteDir to work
system( "echo dir >> " . localDir() . 'test_stat/file_conflict.directory' );
# this one should retain the directory
system( "echo foobarfoo > " . localDir() . 'test_ignored/sub/ignored_conflict.part' );
csync();
# The file_conflict.directory is seen as a conflict
assertLocalAndRemoteDir( '', 1 );
# TODO: check that the file_conflict.directory is indeed NOT on the server
# TODO: check that test_ignored/sub/ignored_conflict.part is NOT on the server
assert(-e localDir() . 'test_ignored/sub/ignored_conflict.part');
printInfo("Remove a directory containing an ignored file that should not be removed\n");
remoteCleanup('test_ignored');
csync();
assert(-e localDir() . 'test_ignored/sub/ignored_conflict.part');
#remove the file so next sync allow the directory to be removed
system( "rm " . localDir() . 'test_ignored/sub/ignored_conflict.part' );
printInfo("Remove a directory containing a local file\n");
remoteCleanup('test_stat');
@@ -164,8 +150,6 @@ printInfo("Now remove the symlink\n");
system( "rm -f " . localDir() . 'anotherdir' );
csync();
assertLocalAndRemoteDir( '', 0 );
assert(! -e localDir(). 'anotherdir' );
cleanup();
+2 -6
Ver Arquivo
@@ -23,7 +23,7 @@
use lib ".";
use Carp::Assert;
use File::Copy;
use ownCloud::Test;
@@ -51,11 +51,6 @@ print "Created share with id <$shareId>\n";
assert( $shareId > 0 );
if( $ENV{SERVER_VERSION} eq "owncloud6" ) {
print "This test does not make more sense for ownCloud6, leaving for good!\n\n";
exit;
}
# put a couple of files into the shared directory in the sharer account
glob_put( 'sharing/*', $share_dir, $sharee);
@@ -67,6 +62,7 @@ moveRemoteFile( server() . $share_dir, localDir(), 1 );
printInfo("Initial sync, sync stuff down.");
csync();
assertLocalAndRemoteDir( '', 0 );
# Local file to a read/write share should be synced up
+18 -33
Ver Arquivo
@@ -23,7 +23,7 @@
use lib ".";
use Carp::Assert;
use File::Copy;
use ownCloud::Test;
@@ -33,13 +33,11 @@ print "Hello, this is t6, a tester for csync with ownCloud.\n";
initTesting();
sub createPostUpdateScript($)
sub createPostUpdateScript()
{
my ($name) = @_;
my $srcFile = localDir().'BIG1.file';
my $srcFile = localDir()."BIG.file";
my $cred = configValue("user") . ":" . configValue("passwd");
my $cmd = "curl -T $srcFile -u $cred --insecure " . testDirUrl().$name;
my $cmd = "curl -T $srcFile -u $cred " . testDirUrl();
my $script = "/tmp/post_update_script.sh";
open SC, ">$script" || die("Can not create script file");
print SC "#!/bin/bash\n";
@@ -50,11 +48,11 @@ sub createPostUpdateScript($)
return $script;
}
sub getETagFromJournal($$)
sub getETagFromJournal($)
{
my ($name,$num) = @_;
my $sql = "sqlite3 " . localDir() . ".csync_journal.db \"SELECT md5 FROM metadata WHERE path='$name';\"";
my ($num) = @_;
my $sql = "sqlite3 " . localDir() . ".csync_journal.db \"SELECT md5 FROM metadata WHERE path='BIG.file';\"";
open(my $fh, '-|', $sql) or die $!;
my $etag = <$fh>;
close $fh;
@@ -63,14 +61,14 @@ sub getETagFromJournal($$)
return $etag;
}
sub chunkFileTest( $$ )
sub chunkFileTest( $$ )
{
my ($name, $size) = @_;
# Big file chunking
createLocalFile( localDir().$name, $size );
assert( -e localDir().$name );
my $bigMd5 = md5OfFile( localDir().$name );
csync();
@@ -91,39 +89,26 @@ sub chunkFileTest( $$ )
}
printInfo("Big file that needs chunking with default chunk size");
chunkFileTest( "BIG1.file", 23251233 );
chunkFileTest( "BIG.file", 23251233 );
printInfo("Update the existing file and trigger reupload");
# change the existing file again -> update
chunkFileTest( "BIG2.file", 21762122 );
chunkFileTest( "BIG.file", 21762122 );
printInfo("Cause a precondition failed error");
# Now overwrite the existing file to change it
createLocalFile( localDir()."BIG3.file", 21832 );
sleep(2);
csync();
createLocalFile( localDir().'BIG3.file', 34323 );
sleep(2);
createLocalFile( localDir()."BIG.file", 21832199 );
# and create a post update script
my $script = createPostUpdateScript('BIG3.file');
my $script = createPostUpdateScript();
$ENV{'OWNCLOUD_POST_UPDATE_SCRIPT'} = $script;
# Save the etag before the sync
my $firstETag = getETagFromJournal('BIG3.file', 'First');
sleep(2);
csync(); # Sync, which ends in a precondition failed error
my $firstETag = getETagFromJournal('First');
csync(); # Sync, which ends in a precondition failed error
# get the etag again. It has to be unchanged because of the error.
my $secondETag = getETagFromJournal('BIG3.file', 'Second');
my $secondETag = getETagFromJournal('Second');
assert( $firstETag eq $secondETag, "Different ETags, no precondition error." );
# Now the result is that there is a conflict file because since 1.7
# the sync is stopped on preconditoin failed and done again.
my $seen = 0;
opendir(my $dh, localDir() );
while(readdir $dh) {
$seen = 1 if ( /BIG3_conflict.*\.file/ );
}
closedir $dh;
assert( $seen == 1, "No conflict file created on precondition failed!" );
unlink($script);
# Set a custom chunk size in environment.
+5 -1
Ver Arquivo
@@ -23,7 +23,7 @@
use lib ".";
use Carp::Assert;
use File::Copy;
use ownCloud::Test;
@@ -176,6 +176,8 @@ system("sqlite3 " . localDir().'.csync_journal.db .dump');
#new directory should be uploaded
system("mv " . localDir().'readonlyDirectory_PERM_M_/subdir_PERM_CK_ ' . localDir().'normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_' );
# two syncs may be necessary for now: https://github.com/owncloud/mirall/issues/2038
csync();
csync();
system("sqlite3 " . localDir().'.csync_journal.db .dump');
assertCsyncJournalOk(localDir());
@@ -207,6 +209,8 @@ system("mv " . localDir().'readonlyDirectory_PERM_M_/subdir_PERM_CK_ ' . localDi
#2. move a directory from read to read only (move the directory from previous step)
system("mv " . localDir().'normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_ ' . localDir().'readonlyDirectory_PERM_M_/moved_PERM_CK_' );
# two syncs may be necessary for now: https://github.com/owncloud/mirall/issues/2038
csync();
csync();
assertCsyncJournalOk(localDir());
+3 -29
Ver Arquivo
@@ -23,7 +23,7 @@
use lib ".";
use Carp::Assert;
use File::Copy;
use ownCloud::Test;
@@ -35,7 +35,7 @@ print "Hello, this is t8, a tester for syncing of files on a case sensitive FS\n
# The test is run on a 'normal' file system, but we tell pwncloud that it is case preserving anyway
$ENV{OWNCLOUD_TEST_CASE_PRESERVING} = "1";
# No parallelism for more deterministic action.
# FIXME! the code does not work with parallelism
$ENV{OWNCLOUD_MAX_PARALLEL}="1";
initTesting();
@@ -48,7 +48,6 @@ mkdir($tmpdir);
createLocalFile( $tmpdir . "HELLO.dat", 100 );
createLocalFile( $tmpdir . "Hello.dat", 150 );
createLocalFile( $tmpdir . "Normal.dat", 110 );
createLocalFile( $tmpdir . "test.dat", 170 );
#put them in some directories
createRemoteDir( "dir" );
@@ -74,20 +73,14 @@ assertLocalAndRemoteDir( '', 0);
printInfo( "Renaming one file to the same name as another one with different casing" );
moveRemoteFile( 'dir/Hello.dat', 'dir/NORMAL.dat');
moveRemoteFile( 'dir/test.dat', 'dir/TEST.dat');
csync();
# Hello -> NORMAL should not have do the move since the case conflict
#It should not have do the move
assert( -e localDir() . 'dir/Hello.dat' );
assert( !-e localDir() . 'dir/NORMAL.dat' );
assert( -e localDir() . 'dir/Normal.dat' );
#test->TEST should have been worked.
assert( -e localDir() . 'dir/TEST.dat' );
assert( !-e localDir() . 'dir/test.dat' );
printInfo( "Another directory with the same name but different casing is created" );
createRemoteDir( "DIR" );
@@ -112,25 +105,6 @@ assert( !-e localDir() . 'dir' );
# dir/NORMAL.dat is still on the server
printInfo( "Attempt downloading two clashing files in parallel" );
# Enable parallelism
$ENV{OWNCLOUD_MAX_PARALLEL}="2";
my $tmpdir2 = "/tmp/t8/parallel/";
mkdir($tmpdir2);
createLocalFile( $tmpdir2 . "FILE.dat", 23251233 );
createLocalFile( $tmpdir2 . "file.dat", 33 );
createRemoteDir( "parallel" );
glob_put( "$tmpdir2/*", "parallel" );
csync();
# only one file must exist
assert( (!-e localDir() . 'parallel/FILE.dat' ) or (!-e localDir() . 'parallel/file.dat') );
assert( (-e localDir() . 'parallel/FILE.dat' ) or (-e localDir() . 'parallel/file.dat') );
cleanup();
system("rm -r " . $tmpdir);
+14 -16
Ver Arquivo
@@ -1,33 +1,34 @@
Setting up an Account
=====================
When you run the ownCloud Desktop Sync client the first time, it automatically
opens the account setup wizard. Just follow these steps:
If no account has been configured, the ownCloud Client automatically assist in
connecting to your ownCloud server after the application has been started.
1. Enter the URL to your Server. This is the same address used by your Web
browser, for example ``https://example.com/owncloud``
To set up an account:
1. Specify the URL to your Server. This is the same address that is used in the browser.
.. image:: images/wizard_url.png
:scale: 50 %
.. note:: Always use ``https://`` if SSL encryption is enabled on your server.
Otherwise, your password and all traffic between your computer and the
ownCloud server will be transmitted in the clear and wide open for
eavesdroppers.
.. note:: Make sure to use ``https://`` if the server supports it. Otherwise,
your password and all data will be transferred to the server unencrypted. This
makes it easy for third parties to intercept your communication, and getting
hold of your password!
2. Enter your username and password. These are the same credentials used to
log into the ownCloud Web interface.
2. Enter the username and password. These are the same credentials used to log into the web interface.
.. image:: images/wizard_user.png
:scale: 50 %
3. Choose the local folder you want to store your ownCloud files in. By
default, this is a folder called ``ownCloud`` in your home directory.
3. Choose the folder with which you want the ownCloud Client to synchronize the
contents of your ownCloud account. By default, this is a folder called
`ownCloud`. This folder is created in the home directory.
.. image:: images/wizard_targetfolder.png
:scale: 50 %
4. The synchronization automatically begins.
The synchronization between the root directories of the ownCloud server begins.
.. image:: images/wizard_overview.png
:scale: 50 %
@@ -39,6 +40,3 @@ When selecting a local folder that already contains data, you can choose from tw
* :guilabel:`Start a clean sync`: When selected, all files in the local folder on the
client are deleted. These files are not syncrhonized to the ownCloud server.
See :doc:`navigating` to learn how to choose specific folders to sync with on
your ownCloud server.
-1
Ver Arquivo
@@ -1,4 +1,3 @@
==============
Advanced Usage
==============
+8 -10
Ver Arquivo
@@ -25,17 +25,16 @@ result, the ownCloud Client runs on Linux, Windows, and MacOS.
The Synchronization Process
---------------------------
The process of synchronization keeps files in two separate repositories the
same. When synchronized:
The process of synchronization keeps files in two separate repositories the same. When syncrhonized:
- If a file is added to one repository it is copied to the other synchronized repository.
- When a file is changed in one repository, the change is propagated to any other
synchronized repository.
- If a file is deleted in one repository, it is deleted in any other.
- When a file is changed in one repository, the change is propagated to any
syncrhonized other repositories- If a file is deleted in one repository, it
is deleted in any other.
It is important to note that the ownCloud synchronization process does not use
a typical client/server system where the server is always master. This is a
major difference between the ownCloud synchronization process and other systems
major difference between the ownCloud syncrhonizatin process and other systems
like a file backup, where only changes to files or folders and the addition of
new files are propagated, but these files and folders are never deleted unless
explicitly deleted in the backup.
@@ -65,7 +64,7 @@ To compare the modification times of two files from different systems, csync
must operate on the same base. Before ownCloud Client version 1.1.0, csync
required both device repositories to run on the exact same time. This
requirement was achieved through the use of enterprise standard `NTP time
synchronization`_ on all machines.
synchronisation`_ on all machines.
Because this timing strategy is rather fragile without the use of NTP, ownCloud
4.5 introduced a unique number (for each file?) that changes whenever the file
@@ -124,9 +123,8 @@ traverses the file tree and compares the modification time of each file with an
expected value stored in its database. If the value is not the same, the client
determines that the file has been modified in the local repository.
.. note:: On the local side, the modification time a good attribute to use for
detecting changes, because
the value does not depend on time shifts and such.
.. note:: On the local side, the modificaton time a good attribute to use for detecting changes, because
the value does not depend on time shifts and such.
For the remote (that is, ownCloud server) repository, the client compares the
ETag of each file with its expected value. Again, the expected ETag value is
+27 -29
Ver Arquivo
@@ -1,23 +1,16 @@
The Automatic Updater
=====================
The Automatic Updater ensures that you always have the
latest features and bugfixes for your ownCloud synchronization client.
To ensure that you are always using the latest version of the ownCloud client,
an auto-update mechanism has been added in Version 1.5.1. The Automatic Updater
ensures that you automatically profit from the latest features and bugfixes.
The Automatic Updater updates only on Mac OS X and Windows computers; Linux
users only need to use their normal package managers. However, on Linux systems
the Updater will check for updates and notify you when a new version is
available.
.. note:: Because of various technical issues, desktop sync clients older than
1.7 will not be allowed to connect and sync with the ownCloud 8.1 server. It is
highly recommended to keep your client updated.
.. note:: The Automatic Updater functions differently, depending on the operating system.
Basic Workflow
--------------
The following sections describe how to use the Automatic Updater on different
operating systems:
The following sections describe how to use the Automatic Updater on different operating systems:
Windows
^^^^^^^
@@ -43,10 +36,11 @@ process for Mac OS X applications.
Linux
^^^^^
Linux distributions provide their own update tools, so ownCloud clients that use
the Linux operating system do not perform any updates on their own. The client
will inform you (``Settings -> General -> Updates``) when an update is
available.
Linux distributions provide their own update tool, so ownCloud clients that use
the Linux operating system do not perform any updates on their own. Linux
operating systems do, however, check for the latest version of the ownCloud
client and passively notify the user (``Settings -> General -> Updates``) when
an update is available.
Preventing Automatic Updates
@@ -58,7 +52,7 @@ deployment tools and policies. To address this case, it is possible to disable
the auto-updater entirely. The following sections describe how to disable the
auto-update mechanism for different operating systems.
Preventing Automatic Updates in Windows Environments
Preventing Automatic Updates in Windows Environents
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can prevent automatic updates from occuring in Windows environments using
@@ -67,10 +61,9 @@ update check mechanism whereas the second method prevents any manual overrides.
To prevent automatic updates, but allow manual overrides:
1. Edit these Registry keys:
1. Migrate to the following directory::
a. (32-bit) ``HKEY_LOCAL_MACHINE\Software\ownCloud\ownCloud``
b. (64-bit) ``HKEY_LOCAL_MACHINE\Software\Wow6432Node\ownCloud\ownCloud``
HKEY_LOCAL_MACHINE\Software\ownCloud\ownCloud
2. Add the key ``skipUpdateCheck`` (of type DWORD).
@@ -80,8 +73,7 @@ To manually override this key, use the same value in ``HKEY_CURRENT_USER``.
To prevent automatic updates and disallow manual overrides:
.. note::This is the preferred method of controlling the updater behavior using
Group Policies.
.. note::This is the preferred method of controlling the updater behavior using Group Policies.
1. Migrate to the following directory::
@@ -95,10 +87,10 @@ To prevent automatic updates and disallow manual overrides:
Preventing Automatic Updates in Mac OS X Environments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can disable the automatic update mechanism in Mac OS X operating systems
You can disable the automatic update mechanism in MAC OS X operating systems
using the system-wide ``.plist`` file. To access this file:
1. Go to this directory::
1. Using the Windows explorer, migrate to the following location::
/Library/Preferences/
@@ -119,10 +111,16 @@ to ``/Library/Preferences/com.owncloud.desktopclient.plist``.
Preventing Automatic Updates in Linux Environments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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
client configuration file, ``$HOME/.local/share/data/ownCloud/owncloud.cfg``. Add these lines:
Because Linux does not provide automatic updating functionality, there is no
need to remove the automatic-update check. However, if you want to disable
this check:
[General]
skipUpdateCheck=true
1. Locate and open the following file::
/etc/ownCloud/ownCloud.conf
2. Add the following content to the file::
[General]
skipUpdateCheck=true
+50 -69
Ver Arquivo
@@ -8,33 +8,27 @@ major platforms. You should read this section if you want to develop for the
desktop client.
.. note:: Building instruction 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 built.
The instructions contained in this topic were updated to work with version 1.7 of the ownCloud Client.
The instructions contained in this topic were updated to work with version 1.5 of the ownCloud Client.
Linux
-----
1. Add the `ownCloud repository from OBS`_.
2. Install the dependencies (as root, or using ``sudo``) using the following
commands for your specific Linux distribution:
* Debian/Ubuntu: ``apt-get update; apt-get build-dep owncloud-client``
* openSUSE: ``zypper ref; zypper si -d owncloud-client``
* Fedora/CentOS: ``yum install yum-utils; yum-builddep owncloud-client``
2. Install the dependencies (as root, or using ``sudo``) using the following commands for your specific Linux distribution:
* Debian/Ubuntu: ``apt-get update; apt-get build-dep owncloud-client``
* openSUSE: ``zypper ref; zypper si -d owncloud-client``
* Fedora/CentOS: ``yum install yum-utils; yum-builddep owncloud-client``
3. Follow the `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
--------
In additon to needing XCode (along with the command line tools), developing in
the Mac OS X environment requires extra dependencies. You can install these
the MAC OS X environment requires extra dependencies. You can install these
dependencies through MacPorts_ or Homebrew_. These dependencies are required
only on the build machine, because non-standard libs are deployed in the app
bundle.
@@ -47,30 +41,17 @@ To set up your build enviroment for development using HomeBrew_:
1. Add the ownCloud repository using the following command::
brew tap owncloud/owncloud
brew tap owncloud/owncloud
2. Install any missing dependencies::
brew install $(brew deps mirall)
brew install $(brew deps mirall)
3. Add Qt from brew to the path::
To build mirall, follow the `generic build instructions`_.
export PATH=/usr/local/Cellar/qt5/5.x.y/bin/qmake
Where ``x.z`` is the current version of Qt 5 that brew has installed
on your machine.
5. For compilation of mirall, follow the `generic build instructions`_.
6. In the build directory, run ``admin/osx/create_mac.sh <build_dir>
<install_dir>``. If you have a developer signing certificate, you can specify
its Common Name as a third parameter (use quotes) to have the package
signed automatically.
.. note:: Contrary to earlier versions, ownCloud 1.7 and later are packaged
as a ``pkg`` installer. Do not call "make package" at any time when
compiling for OS X, as this will build a disk image, and will not
work correctly.
.. note:: Because the product from the mirall build is an app bundle, do not
call ``make install`` at any time. Instead, call ``make package`` to create an
install-ready disk image.
Windows (Cross-Compile)
-----------------------
@@ -82,14 +63,15 @@ have it installed already.
To cross-compile:
1. Add the following repositories using YaST or ``zypper ar`` (adjust when using openSUSE 12.2 or 13.1)::
1. Add the following repositories using YaST or ``zypper ar`` (adjust when using openSUSE 12.2 or 13.1):
zypper ar http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_13.1/windows:mingw:win32.repo
zypper ar http://download.opensuse.org/repositories/windows:/mingw/openSUSE_13.1/windows:mingw.repo
- ``zypper ar http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_13.1/windows:mingw:win32.repo``
- ``zypper ar http://download.opensuse.org/repositories/windows:/mingw/openSUSE_13.1/windows:mingw.repo``
2. Install the cross-compiler packages and the cross-compiled dependencies::
zypper install cmake make mingw32-cross-binutils mingw32-cross-cpp mingw32-cross-gcc \
``zypper install cmake make mingw32-cross-binutils mingw32-cross-cpp mingw32-cross-gcc \
mingw32-cross-gcc-c++ mingw32-cross-pkg-config mingw32-filesystem \
mingw32-headers mingw32-runtime site-config mingw32-libqt4-sql \
mingw32-libqt4-sql-sqlite mingw32-sqlite mingw32-libsqlite-devel \
@@ -100,92 +82,91 @@ To cross-compile:
mingw32-libpng-devel mingw32-libsqlite mingw32-qtkeychain \
mingw32-qtkeychain-devel mingw32-dlfcn mingw32-libintl-devel \
mingw32-libneon-devel mingw32-libopenssl-devel mingw32-libproxy-devel \
mingw32-libxml2-devel mingw32-zlib-devel
mingw32-libxml2-devel mingw32-zlib-devel``
3. For the installer, install the NSIS installer package::
zypper install mingw32-cross-nsis
``zypper install mingw32-cross-nsis``
4. Install the following plugin::
mingw32-cross-nsis-plugin-processes mingw32-cross-nsis-plugin-uac
``mingw32-cross-nsis-plugin-processes mingw32-cross-nsis-plugin-uac``
.. note:: This plugin is typically required. However, due to a current bug
in ``mingw``, the plugins do not currently build properly from source.
5. Manually download and install the following files using ``rpm -ivh <package>``:
.. note:: These files also work for more recent openSUSE versions!
..note:: These files operate using openSUSE 12.2 and newer.
::
- ``rpm -ihv http://download.tomahawk-player.org/packman/mingw:32/openSUSE_12.1/x86_64/mingw32-cross-nsis-plugin-processes-0-1.1.x86_64.rpm``
rpm -ivh http://download.tomahawk-player.org/packman/mingw:32/openSUSE_12.1/x86_64/mingw32-cross-nsis-plugin-processes-0-1.1.x86_64.rpm
rpm -ivh http://download.tomahawk-player.org/packman/mingw:32/openSUSE_12.1/x86_64/mingw32-cross-nsis-plugin-uac-0-3.1.x86_64.rpm
- ``rpm -ihv http://download.tomahawk-player.org/packman/mingw:32/openSUSE_12.1/x86_64/mingw32-cross-nsis-plugin-uac-0-3.1.x86_64.rpm``
6. Follow the `generic build instructions`_
.. note:: When building for Windows platforms, you must specify a special
toolchain file that enables cmake to locate the platform-specific tools. To add
this parameter to the call to cmake, enter
``-DCMAKE_TOOLCHAIN_FILE=../mirall/admin/win/Toolchain-mingw32-openSUSE.cmake``.
``DCMAKE_TOOLCHAIN_FILE=../mirall/admin/win/Toolchain-mingw32-openSUSE.cmake``.
7. Build by running ``make``.
.. note:: Using ``make package`` produces an NSIS-based installer, provided
..note:: Using ``make package`` produces an NSIS-based installer, provided
the NSIS mingw32 packages are installed.
.. _`generic build instructions`:
Generic Build Instructions
--------------------------
.. _`generic build instructions`
Compared to previous versions, building the desktop sync client has become
easier. Unlike 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.
Compared to previous versions, building Mirall has become easier. Unlike
earlier versions, CSync, which is the sync engine library of Mirall, is now
part of the Mirall source repository and not a separate module.
You can download the client from the ownCloud `Client Download Page`_.
You can download Mirall from the ownCloud `Client Download Page`_.
To build the most up to date version of the client:
1. Clone the latest versions of the client from Git_ as follows:
1. Clone the latest versions of Mirall from Git_ as follows:
``git clone git://github.com/owncloud/client.git``
``git clone git://github.com/owncloud/mirall.git``
2. Create build directories:
``mkdir client-build``
``mkdir mirall-build``
3. Build the client:
3. Build mirall:
``cd ../client-build``
``cmake -DCMAKE_BUILD_TYPE="Debug" ../client``
``cd ../mirall-build``
``cmake -DCMAKE_BUILD_TYPE="Debug" ../mirall``
..note:: You must use absolute paths for the ``include`` and ``library``
directories.
..note:: On Mac OS X, you need to specify ``-DCMAKE_INSTALL_PREFIX=target``,
where ``target`` is a private location, i.e. in parallel to your build
dir by specifying ``../install``.
..note:: You must use absolute pathes for the ``include`` and ``library`` directories.
4. Call ``make``.
The owncloud binary appear in the ``bin`` directory.
5. (Optional) Call ``make install`` to install the client to the ``/usr/local/bin`` directory.
6. (Optional) Call ``make package`` to build an installer/app bundle
..note:: This step requires the ``mingw32-cross-nsis`` packages be installed on Windows.
The following are known cmake parameters:
* ``QTKEYCHAIN_LIBRARY=/path/to/qtkeychain.dylib -DQTKEYCHAIN_INCLUDE_DIR=/path/to/qtkeychain/``:
Used for stored credentials. When compiling with Qt5, the library is called ``qt5keychain.dylib.``
You need to compile QtKeychain with the same Qt version.
* ``WITH_DOC=TRUE``: Creates doc and manpages through running ``make``; also adds install statements,
providing the ability to install using ``make install``.
* ``WITH_DOC=TRUE``: Creates doc and manpages through running ``make``; also
* adds install statements, providing the ability to install using ``make
* install``.
* ``CMAKE_PREFIX_PATH=/path/to/Qt5.2.0/5.2.0/yourarch/lib/cmake/``: Builds using Qt5.
* ``BUILD_WITH_QT4=ON``: Builds using Qt4 (even if Qt5 is found).
* ``CMAKE_INSTALL_PREFIX=path``: Set an install prefix. This is mandatory on Mac OS
.. _`ownCloud repository from OBS`: http://software.opensuse.org/download/package?project=isv:ownCloud:desktop&package=owncloud-client
.. _`ownCloud repository from OBS`: http://software.opensuse.org/download/package?project=isv:ownCloud:devel&package=owncloud-client
.. _CSync: http://www.csync.org
.. _`Client Download Page`: http://owncloud.org/sync-clients/
.. _Git: http://git-scm.com
.. _MacPorts: http://www.macports.org
.. _Homebrew: http://mxcl.github.com/homebrew/
.. _QtKeychain: https://github.com/frankosterfeld/qtkeychain
.. _QtKeychain https://github.com/frankosterfeld/qtkeychain
+3 -3
Ver Arquivo
@@ -1,12 +1,12 @@
The ownCloud Client reads a configuration file. You can locate this configuration files as follows:
On Linux distributions:
- On Linux distributions:
``$HOME/.local/share/data/ownCloud/owncloud.cfg``
On Microsoft Windows systems:
- In Microsoft Windows systems:
``%LOCALAPPDATA%\ownCloud\owncloud.cfg``
On MAC OS X systems:
- In MAC OS X systems:
``$HOME/Library/Application Support/ownCloud``
Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 4.9 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 4.1 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 3.8 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 4.7 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 4.9 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 4.5 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 1.3 KiB

Arquivo binário não exibido.

Antes

Largura:  |  Altura:  |  Tamanho: 48 KiB

Depois

Largura:  |  Altura:  |  Tamanho: 96 KiB

+2 -2
Ver Arquivo
@@ -1,7 +1,7 @@
.. _contents:
ownCloud Desktop Client Manual
==============================
Contents
========
.. toctree::
:maxdepth: 3
+7 -7
Ver Arquivo
@@ -1,11 +1,11 @@
Installing the Desktop Synchronization Client
=============================================
Installing the Synchronization Client
=====================================
The latest version of the ownCloud Desktop Synchronization Client can be
obtained from the `ownCloud Website <http://www.owncloud.com>`_. You can
download and install the client on Windows, Mac OS X, and various Linux software
distrubutions. The following sections describe specific support and installation
procedures for the different software platforms:
The latest version of the ownCloud Synchronization Client can be obtained from
the `ownCloud Website <http://www.owncloud.com>`_. You can download and install
the client on Windows, MAC OSX, and various Linux software distrubutions. The
following sections describe specific support and installation procedures for
the different software platforms:
- :ref:`installing-windows`
- :ref:`installing-macosx`
+5 -7
Ver Arquivo
@@ -1,16 +1,14 @@
Introduction
============
Available for Windows, Mac OS X, and various Linux distributions, the ownCloud
Desktop Sync client enables you to:
Available for Windows, MAC OS X, and various Linux distributions, the ownCloud
Sync client is a desktop program installed on your computer. The client enables
you to:
- Specify one or more directories on your computer that you want to synchronize
to the ownCloud server.
- Always have the latest files synchronized, wherever they are located.
Your files are always automatically synchronized between your ownCloud server
and local PC.
Changes made to any synchronized file on the computer are automatically made to
the files on the ownCloud server using the sync client.
.. note:: Because of various technical issues, desktop sync clients older than
1.7 will not be allowed to connect and sync with the ownCloud 8.1 server. It is
highly recommended to keep your client updated.
+120 -138
Ver Arquivo
@@ -3,45 +3,18 @@ Using the Synchronization Client
.. index:: navigating, usage
The ownCloud Desktop Client remains in the background and is visible as an icon
in the system tray (Windows, KDE), status bar (Mac OS X), or notification area
(Linux).
The ownCloud Client remains in the background and is visible as an icon in the
system tray (Windows, KDE), status bar (MAC OS X), or notification area
(Ubuntu).
.. image:: images/icon.png
The status indicator uses overlay icons to indicate the current status of your
synchronization. The green circle with the white checkmark tells you that your
synchronization is current and you are connected to your ownCloud server.
.. image:: images/icon-syncing.png
The blue icon with the white semi-circles means synchronization is in progress.
.. image:: images/icon-paused.png
The yellow overlay icon with the parallel lines tells you your synchronization
has been paused. (Most likely by you, by opening the client and clicking
Account > Pause.)
.. image:: images/icon-offline.png
The gray icon with three white dots means your sync client has lost its
connection with your ownCloud server.
.. image:: images/icon-information.png
When you see a white circle with the letter "i" that is the informational icon,
so you should click it to see what it has to tell you.
.. image:: images/icon-error.png
The red circle with the white "x" indicates a configuration error, such as an
incorrect login or server URL.
**ownCloud Desktop Client icon**
Using the Desktop Client Menu
-----------------------------
A right-click on the icon opens the
A right click on the icon (left click on Ubuntu and Mac OS X) provides the
following menu:
.. image:: images/menu.png
@@ -50,20 +23,14 @@ following menu:
The Desktop Client menu provides the following options:
* ``Open ownCloud in browser``: Launches the ownCloud Web interface.
* ``Open folder 'ownCloud'``: Opens your local ownCloud folder. If you have
defined multiple synchronization targets, the window displays each local
folder.
* **Disk space indicator**: Indicates the amount of space currently used on the
server.
* **Operation indicator**: Displays the status of the current synchronization
process or indicates ``Up to date`` if the server and client are in sync.
* **Recent Changes**: Displays the last six files modified, and shows the
current synchronization status listing all changes since the last restart of the
ownCloud client.
* ``Settings...``: The settings menu.
* ``Open ownCloud in browser``: Launches the ownCloud WEB interface.
* ``Open folder 'ownCloud'``: Opens the ownCloud local folder. If you have defined multiple synchronization targets, the window displays each local folder.
* **Disk space indicator**: Indicates the amount of space currently used on the server.
* Operation indicator: Displays the status of the current synchronization process or indicates ``Up to date`` if the server and client are in sync.
* **Recent Changes**: Displays the last six files modified by the synchronization operations and provides access to the current synchronization status listing all changes since the last restart of the ownCloud client.
* ``Settings...``: Provides access to the settings menu.
* ``Help``: Opens a browser to display ownCloud Desktop Client Guide.
* ``Sign out``: Stops synchronization.
* ``Sign out``: Disables the client from continued synchronizations.
* ``Quit ownCloud``: Quits the ownCloud Client, ending any currently running
synchronizations.
@@ -72,9 +39,7 @@ Using the Account Settings Window
.. index:: account settings, user, password, Server URL
The ``Account`` window provides a summary for your ownCloud account settings.
You can manage which folders and files you want to synchronize, change your
account settings, and pause and resume synchronization.
The ``Account`` window provides a summary for general settings associated with the ownCloud account. This window enalbes you to manage any synchronized folders in the account and enables you to modify them.
To access and modify the account settings:
@@ -83,32 +48,25 @@ To access and modify the account settings:
The fields and options in this window include:
* ``Connected to <ownCloud instance> as <user>`` field: Your user account on an ownCloud
server.
* ``Connected to <ownCloud instance> as <user>`` field: Indicates the ownCloud server to which the client is synchronizing and the user account on that server.
* ``Add Folder...`` button: Add another folder to the
synchronization process (see ``Adding a Folder``).
* ``Add Folder...`` button: Provides the ability to add another folder to the synchronization process (see ``Adding a Folder``).
* ``Pause/Resume`` button: Pauses the current sync (or prevents the client from
starting a new sync), or resumes the sync process.
* ``Pause/Resume`` button: Pauses the current sync (or prevents the client from starting a new sync) or resumes the sync process.
* ``Remove`` button: Removes the selected folder from the sync process. This
button is used when you want to synchronize only a few folders and not the
root folder.
* ``Remove`` button: Removes the selected folder from the sync process. This button is used when you want to synchronize only a few folders and not the root folder. If only the root folder is available, you must first remove the root from the synchronization and then add individual folders that you want to synchronize as desired.
* ``Storage Usage`` field: Displays how much space your files are using on the
ownCloud server.
* ``Storage Usage`` field: Indicates the storage utilization on the ownCloud server.
* ``Edit Ignored Files`` button: Launches the Ignored Files Editor.
* ``Modify Account`` button: Use this to change your ownCloud server settings
by launching the account setup wizard (see :doc:`accountsetup`).
* ``Modify Account`` button: Enables you to change the ownCloud server to which you are synchronizing. This option launches the ``Setting up an Account`` windows (See ??).
Adding a Folder
^^^^^^^^^^^^^^^
The ``Add Folder ...`` button enables you to add a new local folder to the
synchronization process.
The ``Add a Folder ...`` button enables you to add a new folder to the syncrhonization process.
To add a new folder:
@@ -116,61 +74,66 @@ To add a new folder:
The ``Add Folder...`` window opens
.. image:: images/folderwizard_local.png
.. image:: images/folderwizard_local.png
:scale: 50 %
2. Type a *unique* path and alias name to the folder, or use the ``Choose...``
button to open a graphical file picker.
**``Add Folder...`` window (local folder)**
.. note:: Nested synchronizations are not supported. You
2. Specify a *unique* path and alias name to the folder or use the ``Choose...`` button to locate the new folder on your system to which you want to synchronize.
..note:: Nested synchronizations are not supported. In other words, you
cannot add a folder that is already contained within another synchronized
folder. In addition, you cannot add a higher level (parent) folder that
contains a folder to which you are already synchronizing. By default, the
ownCloud Set Up Wizard synchronizes your entire ownCloud account to the root
folder of the ownCloud server. If you wish to sync certain specific folders and not
the entire root, you must first remove the root folder.
ownCloud Set Up Wizard syncrhonizes your entire ownCloud account to the root
folder of the ownCloud server. Due to this default setup, you must first remove
the top-level folder prior to specifying new synchronizations.
3. Click 'Next' to continue.
A window opens prompting you to select a remote destination folder on the
ownCloud server to synchronize.
ownCloud server to which you want to synchronize.
.. image:: images/folderwizard_remote.png
.. image:: images/folderwizard_remote.png
:scale: 50 %
4. Select a folder on the ownCloud server to which you want to synchronize your
newly added local folder.
**``Add Folder...`` window (remote destination)**
.. note:: A server folder can only be synchronized with a particular client
once. If you attempt to sync the root directory, you cannot sync with
other folders on the server. Similarly, if you sync with folder ``/a``, you
cannot create another sync with ``/a/b``, since ``b`` is already being
synched.
4. Select a folder on the ownCloud server to which you want to synchronize your newly added folder.
..note:: A server folder can only be synchronized with a particular client once.
If you attempt to sync the root directory, you cannot sync with other folders
on the server. Similarly, if you sync with folder ``/a``, you cannot create
another sync with ``/a/b``, since ``b`` is already being synched.
Editing Ignored Files
^^^^^^^^^^^^^^^^^^^^^
The :guilabel:`Ignored Files Editor` provides a list of files that are ignored
(that is, not synchronized) by the client and server during synchronizations.
You may add additional files or directories that you want to exclude from the
synchronization process. In addition to using standard characters, the Ignored
Files Editor enables you to use wild cards (for example, using an asterisk *
to indicate multiple characters or a question mark ? to incidate a single
character).
The :guilabel:`Ignored Files Editor` provides a list of preconfigured files
that are ignored (that is, not synchronized) by the client and server during
synchronizations. The Ignored Files Editor enables you to add patterns for
files or directories that you want to exclude from the synchronization process.
In addition to using standard characters, the Ignored Files Editor enables you
to use wild cards (for example, using an asterisk * to indicate multiple
characters or a question mark ? to incidate a single character).
For additional information see `Using the Ignored Files
Editor`_
For additional information about this editor, see `Using the Ignored Files Editor`_
Using the Activity Settings Window
----------------------------------
.. index:: activity, recent changes, sync activity
The Activity window provides an in-depth account of recent synchronization activity. It
shows files that have not been synchronized because they are on the ignored files list,
or
because they cannot be synced due to containing special characters that cannot be stored
on certain file systems.
The Activity window provides an in-depth account of recent synchronization
activity. It shows files that have not been synchronized because they are on
the ignored files list or because they cannot be synced in a cross-platform
manner due to containing special characters that cannot be stored on certain
file systems.
.. image:: images/settings_activity.png
:scale: 50 %
**Activity settings window**
You can open the Activity window in one of the following ways:
@@ -184,76 +147,89 @@ Using the General Settings Window
.. index:: general settings, auto start, startup, desktop notifications
The General settings window has options for launching the client at system
startup, notifications, and using monochrome icons.
The General settings window enables you to set general settings for the
ownCloud Desktop Client and provides information about the software version,
its creator, and the existance of any updates.
.. image:: images/settings_general.png
:scale: 50 %
**General settings window**
The settings and information contained in this window are as follows:
* ``Launch on System Startup`` checkbox: Provides the option to check (enable)
or uncheck (disable) whether the ownCloud Desktop Client launches at system
startup. By default, this option is enabled (checked) after you have configured
or uncheck (disable) whether the ownCloud Desktop Client launches upon system
startup. By default, this option is enabled (checked)once you have configured
your account.
* ``Show Desktop Nofications`` checkbox: Provides the option to check (enable)
or uncheck (disable) notifications about sync activity.
or uncheck (disable) bubble notifications alerting you as to when a set of
synchronization operations is performed.
* ``Use Monochrome Icons`` checkbox: Provides the option to check (enable) or
uncheck (disable) the use of monochrome (visually less obtrusive) icons.
.. note:: This option can be useful on Mac OS X platforms.
.. note:: This option can be useful on MAC OSX platforms.
* ``About`` field: Provides information about the software authors along with
pertinent build conditions.
.. note:: Information in this field can be valuable when submitting a support
request.
.. note:: Information in this field can be valuable when submitting a support request.
* ``Updates`` field: Notifies you of any available updates for the ownCloud Desktop
Client.
* ``Updates`` field: Provides information about any available updates for the
ownCloud Desktop Client.
Using the Network Settings Window
---------------------------------
.. index:: proxy settings, SOCKS, bandwith, throttling, limiting
The Network settings window enables you to define network proxy settings, and also to
limit download and upload bandwidth.
The Network settings window enables you to define network proxy settings as
well as limit the download and upload bandwidth utilization of file
synchronizations.
.. image:: images/settings_network.png
:scale: 50 %
**Network settings window**
Specifying Proxy Settings
^^^^^^^^^^^^^^^^^^^^^^^^^
* ``No Proxy`` option: Do not use a proxy.
A proxy server is a server (for example, a computer system or an application)
that functions as an intermediary contact for requests from clients that are
seeking resources from other servers. For the ownCloud Desktop Client, you can
define the following proxy settings:
* ``No Proxy`` option: Specifies that the ownCloud Client circumvent the default proxy configured on the system.
* ``Use system proxy`` option: Default setting. Follows the systems proxy
settings.
settings. On Linux systems, this setting uses the value of the variable
``http_proxy``.
* ``Specify proxy manually as`` option: Enables you to specify
the following custom proxy settings:
- ``HTTP(S)``: Used when you are required to use an HTTP(S) proxy server (for
example, Squid or Microsoft Forefront TMG).
- ``SOCKSv5``: Typically used in special company LAN setups, or in
combination with the OpenSSH dynamic application level forwarding feature
(see ``ssh -D``).
- ``Host``: Host name or IP address of the proxy server along with the port
number. HTTP proxies typically listen over Ports 8080 (default) or 3128.
SOCKS servers typically listen over port 1080.
* ``Proxy Server requires authentication`` checkbox: Provides the option to
check (enable/require) or uncheck (disable/not require) proxy server
authentication. When not checked, the proxy server must be configured to
allow anonymous usage. When checked, a proxy server username and password is
required.
- ``HTTP(S)``: Used when you are required to use an HTTP(S) proxy server (for example, Squid or Microsoft Forefront TMG).
- ``SOCKSv5``: Typically used in special company LAN setups, or in combination with the OpenSSH
dynamic application level forwarding feature (see ``ssh -D``).
- ``Host``: Host name or IP address of the proxy server along with the port number. HTTP proxies
typically listen over Ports 8080 (default) or 3128. SOCKS servers typically listen over port 1080.
* ``Proxy Server requires authentication`` checkbox: Provides the option to check (enable/require) or
uncheck (disable/not require) proxy server authentication. When not checked, the proxy server must
be configured to allow anonymous usage. When checked, a proxy server username and password is required.
Bandwidth Limiting
^^^^^^^^^^^^^^^^^^
Synchronization of files between a client and server can use a lot of
bandwidth, so you can limit how much your ownCloud sync client uses.
Synchronization of files between a client and server can utilized a lot of
bandwidth. Bandwidth limiting can assist in shaping the total download or
upload bandwidth (or both) of your client/server connection to a more
manageable level. By limiting your bandwidth usage, you can maintain free
bandwidth for other applications to use.
The ownCloud Desktop Client enables you to limit (throttle) the bandwidth usage
for both file downloads and file uploads. The Download Bandwidth field (for
data flowing from the ownCloud server to the client) provides the following
options:
- ``No limit`` option: The default setting for the client; specifies that there
are no limit settings on the amount of data downloaded from the server.
@@ -283,14 +259,20 @@ Using the Ignored Files Editor
.. index:: ignored files, exclude files, pattern
You might have some local files or directories that you do not want to backup
and store on the server. To identify and exclude these files or directories, you
can use the *Ignored Files Editor*.
You might have some files or directories that you do not want to backup and
store on the server. To identify and exclude these files or directories, you
can use the *Ignored Files Editor* that is embedded in the ownCloud Desktop
Client.
.. image:: images/ignored_files_editor.png
:scale: 50%
For your convenience, the editor is
pre-populated with a default list of typical ignore patterns. These patterns
Ignored Files Editor window
The :guilabel:`Ignored Files Editor` enables you to define customized patterns that the
ownCloud Client uses to identify files and directories that you want to exclude
from the synchronization process. For your convenience, the editor is
pre-populated with a default list of typically ignore patterns. These patterns
are contained in a system file (typically ``sync-exclude.lst``) located in the
ownCloud Client application directory. You cannot modify these pre-populated
patterns directly from the editor. However, if necessary, you can hover over
@@ -303,15 +285,14 @@ pattern, locate the file, and edit the ``sync-exclude.lst`` file.
Each line in the editor contains an ignore pattern string. When creating custom
patterns, in addition to being able to use normal characters to define an
ignore pattern, you can use wildcards characters for matching values. As an
example, you can use an asterisk (``*``) to identify an arbitrary number of
example, you can use an asterisk (``*``) to idenfify an arbitrary number of
characters or a question mark (``?``) to identify a single character.
Patterns that end with a slash character (``/``) are applied to only directory
components of the path being checked.
.. note:: Custom entries are currently not validated for syntactical
correctness by the editor, so you will not see any warnings for bad
syntax. If your synchronization does not work as you expected, check your syntax.
correctness by the editor, but might fail to load correctly.
Each pattern string in the list is preceded by a checkbox. When the check box
contains a check mark, in addition to ignoring the file or directory component
@@ -324,8 +305,9 @@ this list:
- The ownCloud Client always excludes files containing characters that cannot
be synchronized to other file systems.
- Files are removed that cause individual errors three times during a synchronization.
However, the client provides the option of retrying a synchronization three additional
times on files that produce errors.
- As of ownCloud Desktop Client version 1.5.0, files are removed that cause
individual errors three times during a synchronization. However, the client
provides the option of retrying a synchronization three additional times on
files that produce errors.
For more detailed information see :ref:`ignored-files-label`.

Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais