source -> datastore rename, improved terminology

The word "source" implies reading, while in fact access is read/write.
"datastore" avoids that misconception. Writing it in one word emphasizes
that it is single entity.

While renaming, also remove references to explicit --*-property
parameters. The only necessary use today is "--sync-property ?"
and "--datastore-property ?".

--datastore-property was used instead of the short --store-property
because "store" might be mistaken for the verb. It doesn't matter
that it is longer because it doesn't get typed often.

--source-property must remain valid for backward compatility.

As many user-visible instances of "source" as possible got replaced in
text strings by the newer term "datastore". Debug messages were left
unchanged unless some regex happened to match it.

The source code will continue to use the old variable and class names
based on "source".

Various documentation enhancements:
  Better explain what local sync is and how it involves two sync
  configs. "originating config" gets introduces instead of just
  "sync config".

  Better explain the relationship between contexts, sync configs,
  and source configs ("a sync config can use the datastore configs in
  the same context").

  An entire section on config properties in the terminology
  section. "item" added (Todd Wilson correctly pointed out that it was
  missing).

  Less focus on conflict resolution, as suggested by Graham Cobb.

  Fix examples that became invalid when fixing the password
  storage/lookup mechanism for GNOME keyring in 1.4.

  The "command line conventions", "Synchronization beyond SyncML" and
  "CalDAV and CardDAV" sections were updated. It's possible that the
  other sections also contain slightly incorrect usage of the
  terminology or are simply out-dated.
This commit is contained in:
Patrick Ohly 2014-07-28 15:29:41 +02:00
parent 581cee897e
commit 04f11b422e
15 changed files with 537 additions and 355 deletions

View File

@ -379,7 +379,7 @@ README.patched.rst: README.rst src/syncevolution
-e 's/^:Version: .*/:Version: $(VERSION)/;' \ -e 's/^:Version: .*/:Version: $(VERSION)/;' \
-e 's/:Date: .*/":Date: " . `date +%Y-%m-%d`/e;' \ -e 's/:Date: .*/":Date: " . `date +%Y-%m-%d`/e;' \
-e 'if (s;(<< see "syncevolution --sync-property ." >>\n);run("src/syncevolution --daemon=no --sync-property ?") || $$1;e) { $$syncfound=1; }' \ -e 'if (s;(<< see "syncevolution --sync-property ." >>\n);run("src/syncevolution --daemon=no --sync-property ?") || $$1;e) { $$syncfound=1; }' \
-e 'if (s;(<< see "syncevolution --source-property ." >>\n);run("src/syncevolution --daemon=no --source-property ?") || $$1;e) { $$sourcefound=1; }' \ -e 'if (s;(<< see "syncevolution --datastore-property ." >>\n);run("src/syncevolution --daemon=no --source-property ?") || $$1;e) { $$sourcefound=1; }' \
-e 'print;' \ -e 'print;' \
-e '}' \ -e '}' \
-e 'die "<<sync-property>> tag not in README.rst?!" unless $$syncfound;' \ -e 'die "<<sync-property>> tag not in README.rst?!" unless $$syncfound;' \

File diff suppressed because it is too large Load Diff

View File

@ -186,7 +186,7 @@ class ActiveSyncSource :
boost::shared_ptr<ConfigNode> m_itemNode; boost::shared_ptr<ConfigNode> m_itemNode;
private: private:
/** "source-config@<context>" instance which holds our username == ActiveSync account ID */ /** "target-config@<context>" instance which holds our username == ActiveSync account ID */
boost::shared_ptr<SyncConfig> m_context; boost::shared_ptr<SyncConfig> m_context;
/** account ID for libeas, must be set in "username" config property */ /** account ID for libeas, must be set in "username" config property */

View File

@ -204,7 +204,7 @@ static TestingSyncSource *createEASSource(const ClientTestConfig::createsource_t
return res.release(); return res.release();
} else { } else {
// sorry, no database // sorry, no database
SE_LOG_ERROR(NULL, "cannot create EAS source for database %s, check config", SE_LOG_ERROR(NULL, "cannot create EAS datastore for database %s, check config",
res->getDatabaseID().c_str()); res->getDatabaseID().c_str());
return NULL; return NULL;
} }

View File

@ -27,13 +27,13 @@ Query databases:
syncevolution syncevolution
Configuring syncevolution for contacts with Akonadi as backend: Configuring syncevolution for contacts with Akonadi as backend:
syncevolution --configure --source-property sync=none \ syncevolution --configure --datastore-property sync=none \
--sync-property username=... \ --sync-property username=... \
--sync-property password=... \ --sync-property password=... \
scheduleworld scheduleworld
syncevolution --configure --source-property sync=two-way \ syncevolution --configure --datastore-property sync=two-way \
--source-property type=kde-contacts \ --datastore-property type=kde-contacts \
--source-property evolutionsource=akonadi:?... \ --datastore-property evolutionsource=akonadi:?... \
scheduleworld addressbook scheduleworld addressbook
Initial run: Initial run:

View File

@ -21,7 +21,7 @@ Install /tmp/syncsqlite.so by moving it into the
installation. installation.
It then should show up as additional choice for the "type" property: It then should show up as additional choice for the "type" property:
syncevolution --source-property type=? syncevolution --datastore-property type=?
... ...
SQLite Address Book = addressbook = contacts = sqlite-contacts SQLite Address Book = addressbook = contacts = sqlite-contacts

View File

@ -81,7 +81,7 @@ public:
if (sourceName.empty()) { if (sourceName.empty()) {
sourceName = "<none>"; sourceName = "<none>";
} }
description = StringPrintf("sync config '%s', source config '%s', database='%s'", description = StringPrintf("sync config '%s', datastore config '%s', database='%s'",
syncName.c_str(), syncName.c_str(),
sourceName.c_str(), sourceName.c_str(),
url.c_str()); url.c_str());
@ -219,14 +219,14 @@ void ContextSettings::lookupAuthProvider()
if (m_sourceConfig) { if (m_sourceConfig) {
identity = m_sourceConfig->getUser(); identity = m_sourceConfig->getUser();
password = m_sourceConfig->getPassword(); password = m_sourceConfig->getPassword();
credentialsFrom = "source config"; credentialsFrom = "datastore config";
} }
// fall back to context // fall back to context
if (m_context && !identity.wasSet() && !password.wasSet()) { if (m_context && !identity.wasSet() && !password.wasSet()) {
identity = m_context->getSyncUser(); identity = m_context->getSyncUser();
password = m_context->getSyncPassword(); password = m_context->getSyncPassword();
credentialsFrom = "source context"; credentialsFrom = "context";
} }
SE_LOG_DEBUG(NULL, "using username '%s' from %s for WebDAV, password %s", SE_LOG_DEBUG(NULL, "using username '%s' from %s for WebDAV, password %s",
identity.toString().c_str(), identity.toString().c_str(),

View File

@ -225,7 +225,7 @@ void Connection::process(const Caller_t &caller,
uint32_t contentType; uint32_t contentType;
std::string serverURI; std::string serverURI;
if (!numSources) { if (!numSources) {
SE_LOG_DEBUG(NULL, "SAN message with no sources, using selected modes"); SE_LOG_DEBUG(NULL, "SAN message with no datastores, using selected modes");
// Synchronize all known sources with the default mode. // Synchronize all known sources with the default mode.
if (san.GetNthSync(0, syncType, contentType, serverURI)) { if (san.GetNthSync(0, syncType, contentType, serverURI)) {
SE_LOG_DEBUG(NULL, "SAN invalid header, using default modes"); SE_LOG_DEBUG(NULL, "SAN invalid header, using default modes");
@ -233,7 +233,7 @@ void Connection::process(const Caller_t &caller,
SE_LOG_DEBUG(NULL, "SAN invalid sync type %d, using default modes", syncType); SE_LOG_DEBUG(NULL, "SAN invalid sync type %d, using default modes", syncType);
} else { } else {
m_syncMode = PrettyPrintSyncMode(SyncMode(syncType), true); m_syncMode = PrettyPrintSyncMode(SyncMode(syncType), true);
SE_LOG_DEBUG(NULL, "SAN sync mode for all configured sources: %s", m_syncMode.c_str()); SE_LOG_DEBUG(NULL, "SAN sync mode for all configured datastores: %s", m_syncMode.c_str());
} }
} else { } else {
for (int sync = 1; sync <= numSources; sync++) { for (int sync = 1; sync <= numSources; sync++) {
@ -604,7 +604,7 @@ void Connection::ready()
// range selection for events) // range selection for events)
if (boost::starts_with(sourceConfig->getURINonEmpty(), serverURI)) { if (boost::starts_with(sourceConfig->getURINonEmpty(), serverURI)) {
SE_LOG_DEBUG(NULL, SE_LOG_DEBUG(NULL,
"SAN entry #%d = source %s with mode %s", "SAN entry #%d = datastore %s with mode %s",
(int)sync, source.c_str(), syncMode.c_str()); (int)sync, source.c_str(), syncMode.c_str());
m_sourceModes[source] = syncMode; m_sourceModes[source] = syncMode;
found = true; found = true;

View File

@ -289,7 +289,7 @@ void ReadOperations::checkSource(const std::string &sourceName)
} }
} }
if(it == sourceNames.end()) { if(it == sourceNames.end()) {
SE_THROW_EXCEPTION(NoSuchSource, "'" + m_configName + "' has no '" + sourceName + "' source"); SE_THROW_EXCEPTION(NoSuchSource, "'" + m_configName + "' has no '" + sourceName + "' datastore");
} }
bool checked = false; bool checked = false;
try { try {
@ -307,7 +307,7 @@ void ReadOperations::checkSource(const std::string &sourceName)
} }
if (!checked) { if (!checked) {
SE_THROW_EXCEPTION(SourceUnusable, "The source '" + sourceName + "' is not usable"); SE_THROW_EXCEPTION(SourceUnusable, "The datastore '" + sourceName + "' is not usable");
} }
} }
void ReadOperations::getDatabases(const string &sourceName, SourceDatabases_t &databases) void ReadOperations::getDatabases(const string &sourceName, SourceDatabases_t &databases)
@ -322,14 +322,14 @@ void ReadOperations::getDatabases(const string &sourceName, SourceDatabases_t &d
if (!source.get()) { if (!source.get()) {
continue; continue;
} else if (source->isInactive()) { } else if (source->isInactive()) {
SE_THROW_EXCEPTION(NoSuchSource, "'" + m_configName + "' backend of source '" + sourceName + "' is not supported"); SE_THROW_EXCEPTION(NoSuchSource, "'" + m_configName + "' backend of datastore '" + sourceName + "' is not supported");
} else { } else {
databases = source->getDatabases(); databases = source->getDatabases();
return; return;
} }
} }
SE_THROW_EXCEPTION(NoSuchSource, "'" + m_configName + "' has no '" + sourceName + "' source"); SE_THROW_EXCEPTION(NoSuchSource, "'" + m_configName + "' has no '" + sourceName + "' datastore");
} }
SE_END_CXX SE_END_CXX

View File

@ -179,6 +179,7 @@ bool Cmdline::parse(vector<string> &parsed)
} }
parsed.push_back(m_argv[opt]); parsed.push_back(m_argv[opt]);
} else if(boost::iequals(m_argv[opt], "--source-property") || } else if(boost::iequals(m_argv[opt], "--source-property") ||
boost::iequals(m_argv[opt], "--datastore-property") ||
boost::iequals(m_argv[opt], "-z")) { boost::iequals(m_argv[opt], "-z")) {
opt++; opt++;
if (!parseProp(SOURCE_PROPERTY_TYPE, if (!parseProp(SOURCE_PROPERTY_TYPE,
@ -770,7 +771,7 @@ bool Cmdline::run() {
if (!m_server.empty()) { if (!m_server.empty()) {
// list for specific backend chosen via config // list for specific backend chosen via config
if (m_sources.size() != 1) { if (m_sources.size() != 1) {
SE_THROW(StringPrintf("must specify exactly one source after the config name '%s'", SE_THROW(StringPrintf("must specify exactly one datastore after the config name '%s'",
m_server.c_str())); m_server.c_str()));
} }
sourceName = *m_sources.begin(); sourceName = *m_sources.begin();
@ -959,7 +960,7 @@ bool Cmdline::run() {
string origPeer; string origPeer;
if (m_migrate) { if (m_migrate) {
if (!m_sources.empty()) { if (!m_sources.empty()) {
SE_LOG_ERROR(NULL, "cannot migrate individual sources"); SE_LOG_ERROR(NULL, "cannot migrate individual datastores");
return false; return false;
} }
@ -1295,7 +1296,7 @@ bool Cmdline::run() {
} }
if (!sources.empty()) { if (!sources.empty()) {
Exception::throwError(SE_HERE, string("no such source(s): ") + boost::join(sources, " ")); Exception::throwError(SE_HERE, string("no such datastore(s): ") + boost::join(sources, " "));
} }
} }
@ -1368,9 +1369,9 @@ bool Cmdline::run() {
explanation.push_back(StringPrintf("configuration '%s' does not exist", m_server.c_str())); explanation.push_back(StringPrintf("configuration '%s' does not exist", m_server.c_str()));
} }
if (haveSourceName && !sourceNodes.exists()) { if (haveSourceName && !sourceNodes.exists()) {
explanation.push_back(StringPrintf("source '%s' does not exist", sourceName.c_str())); explanation.push_back(StringPrintf("datastore '%s' does not exist", sourceName.c_str()));
} else if (!haveSourceName) { } else if (!haveSourceName) {
explanation.push_back("no source selected"); explanation.push_back("no datastore selected");
} }
SyncSourceConfig sourceConfig(sourceName, sourceNodes); SyncSourceConfig sourceConfig(sourceName, sourceNodes);
if (!sourceConfig.getBackend().wasSet()) { if (!sourceConfig.getBackend().wasSet()) {
@ -1650,7 +1651,7 @@ bool Cmdline::run() {
// check whether there were any sources specified which do not exist // check whether there were any sources specified which do not exist
if (!unmatchedSources.empty()) { if (!unmatchedSources.empty()) {
Exception::throwError(SE_HERE, string("no such source(s): ") + boost::join(unmatchedSources, " ")); Exception::throwError(SE_HERE, string("no such datastore(s): ") + boost::join(unmatchedSources, " "));
} }
if (m_status) { if (m_status) {
@ -1682,7 +1683,7 @@ bool Cmdline::run() {
return false; return false;
} }
if (m_sources.empty()) { if (m_sources.empty()) {
usage(false, "Sources must be selected explicitly for --restore to prevent accidental restore."); usage(false, "Datastores must be selected explicitly for --restore to prevent accidental restore.");
return false; return false;
} }
context->restore(m_restore, context->restore(m_restore,
@ -1811,7 +1812,7 @@ bool Cmdline::parseProp(PropertyType propertyType,
if (isSyncProp) { if (isSyncProp) {
if (isSourceProp) { if (isSourceProp) {
usage(false, StringPrintf("property '%s' in %s could be both a sync and a source property, use --sync-property or --source-property to disambiguate it", propname, args.c_str())); usage(false, StringPrintf("property '%s' in %s could be both a sync and a datastore property, use --sync-property or --datastore-property to disambiguate it", propname, args.c_str()));
return false; return false;
} else { } else {
validProps = &m_validSyncProps; validProps = &m_validSyncProps;
@ -1888,7 +1889,7 @@ bool Cmdline::parseProp(PropertyType propertyType,
if (validProps == &m_validSyncProps) { if (validProps == &m_validSyncProps) {
// complain if sync property includes source prefix // complain if sync property includes source prefix
if (!spec.m_source.empty()) { if (!spec.m_source.empty()) {
SE_LOG_ERROR(NULL, "%s: source name '%s' not allowed in sync property", SE_LOG_ERROR(NULL, "%s: datastore name '%s' not allowed in sync property",
args.c_str(), args.c_str(),
spec.m_source.c_str()); spec.m_source.c_str());
return false; return false;
@ -3190,7 +3191,8 @@ protected:
{ {
TestCmdline cmdline("--configure", TestCmdline cmdline("--configure",
"--source-property", "uri = dummy", // Intentionally use legacy parameter name here.
"--datastore-property", "uri = dummy",
"scheduleworld", "scheduleworld",
"xyz", "xyz",
NULL); NULL);
@ -3262,7 +3264,7 @@ protected:
" not always obvious.\n" " not always obvious.\n"
" \n" " \n"
" When accepting a sync session in a SyncML server (HTTP server), only\n" " When accepting a sync session in a SyncML server (HTTP server), only\n"
" sources with sync != disabled are made available to the client,\n" " datastores with sync != disabled are made available to the client,\n"
" which chooses the final sync mode based on its own configuration.\n" " which chooses the final sync mode based on its own configuration.\n"
" When accepting a sync session in a SyncML client (local sync with\n" " When accepting a sync session in a SyncML client (local sync with\n"
" the server contacting SyncEvolution on a device), the sync mode\n" " the server contacting SyncEvolution on a device), the sync mode\n"
@ -3278,7 +3280,7 @@ protected:
string(filter.m_cmdline->m_props[""].m_sourceProps[""])); string(filter.m_cmdline->m_props[""].m_sourceProps[""]));
CPPUNIT_ASSERT_EQUAL_DIFF("", string(filter.m_cmdline->m_props[""].m_syncProps)); CPPUNIT_ASSERT_EQUAL_DIFF("", string(filter.m_cmdline->m_props[""].m_syncProps));
TestCmdline filter2("--source-property", "sync=refresh", NULL); TestCmdline filter2("--datastore-property", "sync=refresh", NULL);
CPPUNIT_ASSERT(filter2.m_cmdline->parse()); CPPUNIT_ASSERT(filter2.m_cmdline->parse());
CPPUNIT_ASSERT(!filter2.m_cmdline->run()); CPPUNIT_ASSERT(!filter2.m_cmdline->run());
CPPUNIT_ASSERT_NO_THROW(filter2.expectUsageError("[ERROR] No configuration name specified.\n")); CPPUNIT_ASSERT_NO_THROW(filter2.expectUsageError("[ERROR] No configuration name specified.\n"));
@ -3287,10 +3289,10 @@ protected:
CPPUNIT_ASSERT_EQUAL_DIFF("", CPPUNIT_ASSERT_EQUAL_DIFF("",
string(filter2.m_cmdline->m_props[""].m_syncProps)); string(filter2.m_cmdline->m_props[""].m_syncProps));
TestCmdline filter3("--source-property", "xyz=1", NULL); TestCmdline filter3("--datastore-property", "xyz=1", NULL);
CPPUNIT_ASSERT(!filter3.m_cmdline->parse()); CPPUNIT_ASSERT(!filter3.m_cmdline->parse());
CPPUNIT_ASSERT_EQUAL(string(""), filter3.m_out.str()); CPPUNIT_ASSERT_EQUAL(string(""), filter3.m_out.str());
CPPUNIT_ASSERT_EQUAL(string("[ERROR] '--source-property xyz=1': no such property\n"), filter3.m_err.str()); CPPUNIT_ASSERT_EQUAL(string("[ERROR] '--datastore-property xyz=1': no such property\n"), filter3.m_err.str());
TestCmdline filter4("xyz=1", NULL); TestCmdline filter4("xyz=1", NULL);
CPPUNIT_ASSERT(!filter4.m_cmdline->parse()); CPPUNIT_ASSERT(!filter4.m_cmdline->parse());
@ -3602,7 +3604,7 @@ protected:
// updating "type" for peer is mapped to updating "backend", // updating "type" for peer is mapped to updating "backend",
// "databaseFormat", "syncFormat", "forceSyncFormat" // "databaseFormat", "syncFormat", "forceSyncFormat"
TestCmdline cmdline("--configure", TestCmdline cmdline("--configure",
"--source-property", "addressbook/type=file:text/vcard:3.0", "--datastore-property", "addressbook/type=file:text/vcard:3.0",
"scheduleworld", "scheduleworld",
NULL); NULL);
cmdline.doit(); cmdline.doit();
@ -3624,7 +3626,7 @@ protected:
{ {
// updating type for context must not affect peer // updating type for context must not affect peer
TestCmdline cmdline("--configure", TestCmdline cmdline("--configure",
"--source-property", "type=file:text/x-vcard:2.1", "--datastore-property", "type=file:text/x-vcard:2.1",
"@default", "addressbook", "@default", "addressbook",
NULL); NULL);
cmdline.doit(); cmdline.doit();
@ -3742,7 +3744,7 @@ protected:
} }
{ {
TestCmdline cmdline("--source-property", "?", TestCmdline cmdline("--datastore-property", "?",
NULL); NULL);
cmdline.doit(); cmdline.doit();
CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str());
@ -3751,7 +3753,7 @@ protected:
} }
{ {
TestCmdline cmdline("--source-property", "?", TestCmdline cmdline("--datastore-property", "?",
"--sync-property", "?", "--sync-property", "?",
NULL); NULL);
cmdline.doit(); cmdline.doit();
@ -3762,7 +3764,7 @@ protected:
{ {
TestCmdline cmdline("--sync-property", "?", TestCmdline cmdline("--sync-property", "?",
"--source-property", "?", "--datastore-property", "?",
NULL); NULL);
cmdline.doit(); cmdline.doit();
CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str());
@ -3771,11 +3773,11 @@ protected:
} }
{ {
TestCmdline cmdline("--source-property", "sync=?", TestCmdline cmdline("--datastore-property", "sync=?",
NULL); NULL);
cmdline.doit(); cmdline.doit();
CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str());
CPPUNIT_ASSERT_EQUAL_DIFF("'--source-property sync=?'\n", CPPUNIT_ASSERT_EQUAL_DIFF("'--datastore-property sync=?'\n",
filterIndented(cmdline.m_out.str())); filterIndented(cmdline.m_out.str()));
} }
@ -3806,8 +3808,8 @@ protected:
// create from scratch with only addressbook configured // create from scratch with only addressbook configured
{ {
TestCmdline cmdline("--configure", TestCmdline cmdline("--configure",
"--source-property", "database = file://tmp/test", "--datastore-property", "database = file://tmp/test",
"--source-property", "type = file:text/x-vcard", "--datastore-property", "type = file:text/x-vcard",
"@foobar", "@foobar",
"addressbook", "addressbook",
NULL); NULL);
@ -3835,8 +3837,8 @@ protected:
// add calendar // add calendar
{ {
TestCmdline cmdline("--configure", TestCmdline cmdline("--configure",
"--source-property", "database@foobar = file://tmp/test2", "--datastore-property", "database@foobar = file://tmp/test2",
"--source-property", "backend = calendar", "--datastore-property", "backend = calendar",
"@foobar", "@foobar",
"calendar", "calendar",
NULL); NULL);
@ -3880,8 +3882,8 @@ protected:
// disable all sources except for addressbook // disable all sources except for addressbook
{ {
TestCmdline cmdline("--configure", TestCmdline cmdline("--configure",
"--source-property", "addressbook/sync=two-way", "--datastore-property", "addressbook/sync=two-way",
"--source-property", "sync=none", "--datastore-property", "sync=none",
"scheduleworld@foobar", "scheduleworld@foobar",
NULL); NULL);
cmdline.doit(); cmdline.doit();
@ -3896,8 +3898,8 @@ protected:
{ {
TestCmdline cmdline("--configure", TestCmdline cmdline("--configure",
"--template", "SyncEvolution", "--template", "SyncEvolution",
"--source-property", "addressbook/type=file:text/vcard:3.0", "--datastore-property", "addressbook/type=file:text/vcard:3.0",
"--source-property", "calendar/type=file:text/calendar:2.0", "--datastore-property", "calendar/type=file:text/calendar:2.0",
"syncevo@syncevo", "syncevo@syncevo",
NULL); NULL);
cmdline.doit(); cmdline.doit();
@ -3969,7 +3971,7 @@ protected:
{ {
TestCmdline cmdline("--configure", TestCmdline cmdline("--configure",
"--source-property", "sync = disabled", "--datastore-property", "sync = disabled",
"scheduleworld", "scheduleworld",
NULL); NULL);
cmdline.doit(); cmdline.doit();
@ -3985,7 +3987,7 @@ protected:
{ {
TestCmdline cmdline("--configure", TestCmdline cmdline("--configure",
"--source-property", "sync = one-way-from-server", "--datastore-property", "sync = one-way-from-server",
"scheduleworld", "scheduleworld",
"addressbook", "addressbook",
NULL); NULL);
@ -4007,7 +4009,7 @@ protected:
{ {
TestCmdline cmdline("--configure", TestCmdline cmdline("--configure",
"--sync", "two-way", "--sync", "two-way",
"-z", "database=source", "-z", "database=datastore",
// note priority of suffix: most specific wins // note priority of suffix: most specific wins
"--sync-property", "maxlogdirs@scheduleworld@default=20", "--sync-property", "maxlogdirs@scheduleworld@default=20",
"--sync-property", "maxlogdirs@default=10", "--sync-property", "maxlogdirs@default=10",
@ -4026,10 +4028,10 @@ protected:
"sync = two-way"); "sync = two-way");
boost::replace_all(expected, boost::replace_all(expected,
"# database = ", "# database = ",
"database = source"); "database = datastore");
boost::replace_all(expected, boost::replace_all(expected,
"database = xyz", "database = xyz",
"database = source"); "database = datastore");
boost::replace_all(expected, boost::replace_all(expected,
"# maxlogdirs = 10", "# maxlogdirs = 10",
"maxlogdirs = 20"); "maxlogdirs = 20");
@ -4501,7 +4503,7 @@ private:
CPPUNIT_ASSERT(out.find("\nOptions:\n") == std::string::npos); CPPUNIT_ASSERT(out.find("\nOptions:\n") == std::string::npos);
CPPUNIT_ASSERT(boost::ends_with(out, CPPUNIT_ASSERT(boost::ends_with(out,
"Remove item(s):\n" "Remove item(s):\n"
" syncevolution --delete-items [--] <config> <source> (<luid> ... | '*')\n\n")); " syncevolution --delete-items [--] <config> <store> (<luid> ... | '*')\n\n"));
// exact error message // exact error message
CPPUNIT_ASSERT_EQUAL(error, err); CPPUNIT_ASSERT_EQUAL(error, err);

View File

@ -833,9 +833,9 @@ class LocalTransportAgentChild : public TransportAgent
if (!targetNodes.dataConfigExists()) { if (!targetNodes.dataConfigExists()) {
if (targetName.empty()) { if (targetName.empty()) {
Exception::throwError(SE_HERE, "missing URI for one of the sources"); Exception::throwError(SE_HERE, "missing URI for one of the datastores");
} else { } else {
Exception::throwError(SE_HERE, StringPrintf("%s: source not configured", Exception::throwError(SE_HERE, StringPrintf("%s: datastore not configured",
fullTargetName.c_str())); fullTargetName.c_str()));
} }
} }
@ -846,7 +846,7 @@ class LocalTransportAgentChild : public TransportAgent
// done before in this loop => error in original config. // done before in this loop => error in original config.
if (!targetSource.isDisabled()) { if (!targetSource.isDisabled()) {
Exception::throwError(SE_HERE, Exception::throwError(SE_HERE,
StringPrintf("%s: source targetted twice by %s", StringPrintf("%s: datastore targetted twice by %s",
fullTargetName.c_str(), fullTargetName.c_str(),
serverConfig.first.c_str())); serverConfig.first.c_str()));
} }

View File

@ -1302,7 +1302,7 @@ static ConfigProperty syncPropSyncURL("syncURL",
"Identifies how to contact the peer,\n" "Identifies how to contact the peer,\n"
"best explained with some examples.\n\n" "best explained with some examples.\n\n"
"HTTP(S) SyncML servers::\n\n" "HTTP(S) SyncML servers::\n\n"
" http://example.com/sync\n" " http://example.com/sync\n\n"
"OBEX over Bluetooth uses the MAC address, with\n" "OBEX over Bluetooth uses the MAC address, with\n"
"the channel chosen automatically::\n\n" "the channel chosen automatically::\n\n"
" obex-bt://00:0A:94:03:F3:7E\n\n" " obex-bt://00:0A:94:03:F3:7E\n\n"
@ -1427,7 +1427,7 @@ static BoolConfigProperty syncPropPreventSlowSync("preventSlowSync",
"side with a refresh-from-client/server sync instead of doing\n" "side with a refresh-from-client/server sync instead of doing\n"
"a slow sync.\n" "a slow sync.\n"
"When this option is enabled, slow syncs that could cause problems\n" "When this option is enabled, slow syncs that could cause problems\n"
"are not allowed to proceed. Instead, the affected sources are\n" "are not allowed to proceed. Instead, the affected datastores are\n"
"skipped, allowing the user to choose a suitable sync mode in\n" "skipped, allowing the user to choose a suitable sync mode in\n"
"the next run (slow sync selected explicitly, refresh sync).\n" "the next run (slow sync selected explicitly, refresh sync).\n"
"The following situations are handled:\n\n" "The following situations are handled:\n\n"
@ -2007,7 +2007,7 @@ void PasswordConfigProperty::checkPassword(UserInterface &ui,
serverName.c_str(), serverName.c_str(),
username.c_str()); username.c_str());
} else { } else {
SE_LOG_DEBUG(NULL, "checking password property '%s' in source '%s' of config '%s' with user identity '%s'", SE_LOG_DEBUG(NULL, "checking password property '%s' in datastore '%s' of config '%s' with user identity '%s'",
getMainName().c_str(), getMainName().c_str(),
sourceName.c_str(), sourceName.c_str(),
serverName.c_str(), serverName.c_str(),
@ -2154,7 +2154,7 @@ void PasswordConfigProperty::savePassword(UserInterface &ui,
serverName.c_str(), serverName.c_str(),
username.c_str()); username.c_str());
} else { } else {
SE_LOG_DEBUG(NULL, "possibly saving password property '%s' in source '%s' of config '%s' with user identity '%s'", SE_LOG_DEBUG(NULL, "possibly saving password property '%s' in datastore '%s' of config '%s' with user identity '%s'",
getMainName().c_str(), getMainName().c_str(),
sourceName.c_str(), sourceName.c_str(),
serverName.c_str(), serverName.c_str(),
@ -2681,7 +2681,7 @@ StringConfigProperty SyncSourceConfig::m_sourcePropSync("sync",
"not always obvious.\n" "not always obvious.\n"
"\n" "\n"
"When accepting a sync session in a SyncML server (HTTP server), only\n" "When accepting a sync session in a SyncML server (HTTP server), only\n"
"sources with sync != disabled are made available to the client,\n" "datastores with sync != disabled are made available to the client,\n"
"which chooses the final sync mode based on its own configuration.\n" "which chooses the final sync mode based on its own configuration.\n"
"When accepting a sync session in a SyncML client (local sync with\n" "When accepting a sync session in a SyncML client (local sync with\n"
"the server contacting SyncEvolution on a device), the sync mode\n" "the server contacting SyncEvolution on a device), the sync mode\n"
@ -2710,25 +2710,25 @@ public:
SourceBackendConfigProperty() : SourceBackendConfigProperty() :
StringConfigProperty("backend", StringConfigProperty("backend",
"Specifies the SyncEvolution backend and thus the\n" "Specifies the SyncEvolution backend and thus the\n"
"data which is synchronized by this source. Each\n" "data which is synchronized by this datastore. Each\n"
"backend may support multiple databases (see 'database'\n" "backend may support multiple databases (see 'database'\n"
"property), different formats inside that database (see\n" "property), different formats inside that database (see\n"
"'databaseFormat'), and different formats when talking to\n" "'databaseFormat'), and different formats when talking to\n"
"the sync peer (see 'syncFormat' and 'forceSyncFormat').\n" "the sync peer (see 'syncFormat' and 'forceSyncFormat').\n"
"\n" "\n"
"A special 'virtual' backend combines several other\n" "A special 'virtual' backend combines several other\n"
"data sources and presents them as one set of items\n" "datastores and presents them as one set of items\n"
"to the peer. For example, Nokia phones typically\n" "to the peer. For example, Nokia phones typically\n"
"exchange tasks and events as part of one set of\n" "exchange tasks and events as part of one set of\n"
"calendar items.\n" "calendar items.\n"
"\n" "\n"
"Right now such a virtual backend is limited to\n" "Right now such a virtual backend is limited to\n"
"combining one calendar source with events and one\n" "combining one calendar datastore with events and one\n"
"task source. They have to be specified in the\n" "task datastore. They have to be specified in the\n"
"``database`` property, typically like this:\n" "``database`` property, typically like this:\n"
"``calendar,todo``\n" "``calendar,todo``\n"
"\n" "\n"
"Different sources combined in one virtual source must\n" "Different datastores combined in one virtual datastore must\n"
"have a common format. As with other backends,\n" "have a common format. As with other backends,\n"
"the preferred format can be influenced via the 'syncFormat'\n" "the preferred format can be influenced via the 'syncFormat'\n"
"attribute.\n" "attribute.\n"
@ -2821,7 +2821,7 @@ static ConfigProperty sourcePropDatabaseID(Aliases("database") + "evolutionsourc
"like for example the system address book.\n" "like for example the system address book.\n"
"Not setting this property selects that default\n" "Not setting this property selects that default\n"
"database.\n\n" "database.\n\n"
"If the backend is a virtual data source,\n" "If the backend is a virtual data datastore,\n"
"this field must contain comma seperated list of\n" "this field must contain comma seperated list of\n"
"sub datasources actually used to store data.\n" "sub datasources actually used to store data.\n"
"If your sub datastore has a comma in name, you\n" "If your sub datastore has a comma in name, you\n"
@ -2833,8 +2833,8 @@ static ConfigProperty sourcePropDatabaseID(Aliases("database") + "evolutionsourc
"run ``syncevolution --print-databases``. The name\n" "run ``syncevolution --print-databases``. The name\n"
"is printed in front of the colon, followed by\n" "is printed in front of the colon, followed by\n"
"an identifier in brackets. Usually the name is unique and can be\n" "an identifier in brackets. Usually the name is unique and can be\n"
"used to reference the data source. The default\n" "used to reference the data datastore. The default\n"
"data source is marked with <default> at the end\n" "data datastore is marked with <default> at the end\n"
"of the line, if there is a default.\n"); "of the line, if there is a default.\n");
static StringConfigProperty sourcePropDatabaseFormat("databaseFormat", static StringConfigProperty sourcePropDatabaseFormat("databaseFormat",
@ -2845,11 +2845,11 @@ static StringConfigProperty sourcePropDatabaseFormat("databaseFormat",
static ConfigProperty sourcePropURI("uri", static ConfigProperty sourcePropURI("uri",
"this is appended to the server's URL to identify the\n" "this is appended to the server's URL to identify the\n"
"server's database; if unset, the source name is used as\n" "server's database; if unset, the datastore name is used as\n"
"fallback"); "fallback");
static ConfigProperty sourcePropUser(Aliases("databaseUser") + "evolutionuser", static ConfigProperty sourcePropUser(Aliases("databaseUser") + "evolutionuser",
"authentication for backend data source; password can be specified\n" "authentication for backend data datastore; password can be specified\n"
"in multiple ways, see SyncML server password for details\n" "in multiple ways, see SyncML server password for details\n"
"\n" "\n"
"Warning: setting database user/password in cases where it is not\n" "Warning: setting database user/password in cases where it is not\n"
@ -2889,7 +2889,7 @@ public:
key.object += " "; key.object += " ";
key.object += sourceName; key.object += sourceName;
key.object += " backend"; key.object += " backend";
key.description = StringPrintf("databasePassword for %s in source %s", key.description = StringPrintf("databasePassword for %s in datastore %s",
descr.c_str(), sourceName.c_str()); descr.c_str(), sourceName.c_str());
return key; return key;
} }
@ -3004,11 +3004,11 @@ SyncSourceNodes::getNode(const ConfigProperty &prop) const
{ {
switch (prop.getSharing()) { switch (prop.getSharing()) {
case ConfigProperty::GLOBAL_SHARING: case ConfigProperty::GLOBAL_SHARING:
return boost::shared_ptr<FilterConfigNode>(new FilterConfigNode(boost::shared_ptr<ConfigNode>(new DevNullConfigNode("no global source properties")))); return boost::shared_ptr<FilterConfigNode>(new FilterConfigNode(boost::shared_ptr<ConfigNode>(new DevNullConfigNode("no global datastore properties"))));
break; break;
case ConfigProperty::SOURCE_SET_SHARING: case ConfigProperty::SOURCE_SET_SHARING:
if (prop.isHidden()) { if (prop.isHidden()) {
return boost::shared_ptr<FilterConfigNode>(new FilterConfigNode(boost::shared_ptr<ConfigNode>(new DevNullConfigNode("no hidden source set properties")))); return boost::shared_ptr<FilterConfigNode>(new FilterConfigNode(boost::shared_ptr<ConfigNode>(new DevNullConfigNode("no hidden datastore set properties"))));
} else { } else {
return m_sharedNode; return m_sharedNode;
} }

View File

@ -1407,7 +1407,7 @@ public:
m_doLogging && m_doLogging &&
(m_client.getDumpData() || m_client.getPrintChanges())) { (m_client.getDumpData() || m_client.getPrintChanges())) {
// dump initial databases // dump initial databases
SE_LOG_INFO(NULL, "creating complete data backup of source %s before sync (%s)", SE_LOG_INFO(NULL, "creating complete data backup of datastore %s before sync (%s)",
sourceName.c_str(), sourceName.c_str(),
(m_client.getDumpData() && m_client.getPrintChanges()) ? "enabled with dumpData and needed for printChanges" : (m_client.getDumpData() && m_client.getPrintChanges()) ? "enabled with dumpData and needed for printChanges" :
m_client.getDumpData() ? "because it was enabled with dumpData" : m_client.getDumpData() ? "because it was enabled with dumpData" :
@ -2224,12 +2224,12 @@ void SyncContext::initSources(SourceList &sourceList)
= getSyncSourceConfig(source); = getSyncSourceConfig(source);
if (!source_config || !source_config->exists()) { if (!source_config || !source_config->exists()) {
Exception::throwError(SE_HERE, Exception::throwError(SE_HERE,
StringPrintf("Virtual data source \"%s\" references a nonexistent datasource \"%s\".", name.c_str(), source.c_str())); StringPrintf("Virtual datastore \"%s\" references a nonexistent datasource \"%s\".", name.c_str(), source.c_str()));
} }
pair< map<string, string>::iterator, bool > res = subSources.insert(make_pair(source, name)); pair< map<string, string>::iterator, bool > res = subSources.insert(make_pair(source, name));
if (!res.second) { if (!res.second) {
Exception::throwError(SE_HERE, Exception::throwError(SE_HERE,
StringPrintf("Data source \"%s\" included in the virtual sources \"%s\" and \"%s\". It can only be included in one virtual source at a time.", StringPrintf("Datastore \"%s\" included in the virtual datastores \"%s\" and \"%s\". It can only be included in one virtual datastore at a time.",
source.c_str(), res.first->second.c_str(), name.c_str())); source.c_str(), res.first->second.c_str(), name.c_str()));
} }
@ -2865,13 +2865,13 @@ void SyncContext::getConfigXML(string &xml, string &configname)
sourceType.m_format != subType.m_format || sourceType.m_format != subType.m_format ||
sourceType.m_forceFormat != subType.m_forceFormat)) { sourceType.m_forceFormat != subType.m_forceFormat)) {
SE_LOG_WARNING(NULL, SE_LOG_WARNING(NULL,
"Virtual data source \"%s\" and sub data source \"%s\" have different data format. Will use the format in virtual data source.", "Virtual datastore \"%s\" and sub datastore \"%s\" have different data format. Will use the format in virtual datastore.",
vSource->getDisplayName().c_str(), source.c_str()); vSource->getDisplayName().c_str(), source.c_str());
} }
} }
if (mappedSources.size() !=2) { if (mappedSources.size() !=2) {
vSource->throwError(SE_HERE, "virtual data source currently only supports events+tasks combinations"); vSource->throwError(SE_HERE, "virtual datastore currently only supports events+tasks combinations");
} }
string name = vSource->getName(); string name = vSource->getName();
@ -3379,7 +3379,7 @@ SyncMLStatus SyncContext::sync(SyncReport *report)
// instantiate backends, but do not open them yet // instantiate backends, but do not open them yet
initSources(sourceList); initSources(sourceList);
if (sourceList.empty()) { if (sourceList.empty()) {
Exception::throwError(SE_HERE, "no sources active, check configuration"); Exception::throwError(SE_HERE, "no datastores active, check configuration");
} }
// request all config properties once: throwing exceptions // request all config properties once: throwing exceptions
@ -3555,7 +3555,7 @@ bool SyncContext::sendSAN(uint16_t version)
mode = SA_TWO_WAY; mode = SA_TWO_WAY;
} }
if (mode < SA_FIRST || mode > SA_LAST) { if (mode < SA_FIRST || mode > SA_LAST) {
SE_LOG_DEV(NULL, "Ignoring data source %s with an invalid sync mode", name.c_str()); SE_LOG_DEV(NULL, "Ignoring datastore %s with an invalid sync mode", name.c_str());
continue; continue;
} }
syncMode = mode; syncMode = mode;
@ -3576,7 +3576,7 @@ bool SyncContext::sendSAN(uint16_t version)
contentTypeB = 0; contentTypeB = 0;
SE_LOG_DEBUG(NULL, "Unknown datasource mimetype, use 0 as default"); SE_LOG_DEBUG(NULL, "Unknown datasource mimetype, use 0 as default");
} }
SE_LOG_DEBUG(NULL, "SAN source %s uri %s type %u mode %d", SE_LOG_DEBUG(NULL, "SAN datastore %s uri %s type %u mode %d",
name.c_str(), name.c_str(),
uri.c_str(), uri.c_str(),
contentTypeB, contentTypeB,
@ -3586,7 +3586,7 @@ bool SyncContext::sendSAN(uint16_t version)
}; };
} else { } else {
string mimetype = GetLegacyMIMEType(sourceType.m_format, sourceType.m_forceFormat); string mimetype = GetLegacyMIMEType(sourceType.m_format, sourceType.m_forceFormat);
SE_LOG_DEBUG(NULL, "SAN source %s uri %s type %s", SE_LOG_DEBUG(NULL, "SAN datastore %s uri %s type %s",
name.c_str(), name.c_str(),
uri.c_str(), uri.c_str(),
mimetype.c_str()); mimetype.c_str());
@ -3595,7 +3595,7 @@ bool SyncContext::sendSAN(uint16_t version)
} }
if (!hasSource) { if (!hasSource) {
SE_THROW ("No source enabled for server alerted sync!"); SE_THROW ("No datastore enabled for server alerted sync!");
} }
/* Generate the SAN Package */ /* Generate the SAN Package */
@ -3709,7 +3709,7 @@ bool SyncContext::setFreeze(bool freeze)
} }
if (m_sourceListPtr) { if (m_sourceListPtr) {
BOOST_FOREACH (SyncSource *source, *m_sourceListPtr) { BOOST_FOREACH (SyncSource *source, *m_sourceListPtr) {
SE_LOG_DEBUG(NULL, "SyncContext::setFreeze(): source %s", source->getDisplayName().c_str()); SE_LOG_DEBUG(NULL, "SyncContext::setFreeze(): datastore %s", source->getDisplayName().c_str());
source->setFreeze(freeze); source->setFreeze(freeze);
} }
} }
@ -4054,7 +4054,7 @@ SyncMLStatus SyncContext::doSync()
if (!explanation.empty()) { if (!explanation.empty()) {
string sourceparam = boost::join(sources, " "); string sourceparam = boost::join(sources, " ");
SE_LOG_ERROR(NULL, SE_LOG_ERROR(NULL,
"Aborting because of unexpected slow sync for source(s): %s", "Aborting because of unexpected slow sync for datastore(s): %s",
sourceparam.c_str()); sourceparam.c_str());
SE_LOG_INFO(NULL, "%s", explanation.c_str()); SE_LOG_INFO(NULL, "%s", explanation.c_str());
} else { } else {

View File

@ -438,7 +438,7 @@ SyncSource *SyncSource::createSource(const SyncSourceParams &params, bool error,
SyncSource *source = NULL; SyncSource *source = NULL;
source = new VirtualSyncSource(params, config); source = new VirtualSyncSource(params, config);
if (error && !source) { if (error && !source) {
Exception::throwError(SE_HERE, params.getDisplayName() + ": virtual source cannot be instantiated"); Exception::throwError(SE_HERE, params.getDisplayName() + ": virtual datastore cannot be instantiated");
} }
return source; return source;
} }
@ -507,7 +507,7 @@ VirtualSyncSource::VirtualSyncSource(const SyncSourceParams &params, SyncConfig
std::string evoSyncSource = getDatabaseID(); std::string evoSyncSource = getDatabaseID();
BOOST_FOREACH(std::string name, getMappedSources()) { BOOST_FOREACH(std::string name, getMappedSources()) {
if (name.empty()) { if (name.empty()) {
throwError(SE_HERE, StringPrintf("configuration of underlying sources contains empty source name: database = '%s'", throwError(SE_HERE, StringPrintf("configuration of underlying datastores contains empty datastore name: database = '%s'",
evoSyncSource.c_str())); evoSyncSource.c_str()));
} }
SyncSourceNodes source = config->getSyncSourceNodes(name); SyncSourceNodes source = config->getSyncSourceNodes(name);
@ -516,7 +516,7 @@ VirtualSyncSource::VirtualSyncSource(const SyncSourceParams &params, SyncConfig
m_sources.push_back(syncSource); m_sources.push_back(syncSource);
} }
if (m_sources.size() != 2) { if (m_sources.size() != 2) {
throwError(SE_HERE, StringPrintf("configuration of underlying sources must contain exactly one calendar and one todo source (like calendar+todo): database = '%s'", throwError(SE_HERE, StringPrintf("configuration of underlying datastores must contain exactly one calendar and one todo datastore (like calendar+todo): database = '%s'",
evoSyncSource.c_str())); evoSyncSource.c_str()));
} }
} }

View File

@ -2299,7 +2299,7 @@ class TestSessionAPIsEmptyName(DBusUtil, unittest.TestCase):
self.session.CheckSource("", utf8_strings=True) self.session.CheckSource("", utf8_strings=True)
except dbus.DBusException, ex: except dbus.DBusException, ex:
self.assertEqual(str(ex), self.assertEqual(str(ex),
"org.syncevolution.NoSuchSource: '' has no '' source") "org.syncevolution.NoSuchSource: '' has no '' datastore")
else: else:
self.fail("no exception thrown") self.fail("no exception thrown")
@ -2309,7 +2309,7 @@ class TestSessionAPIsEmptyName(DBusUtil, unittest.TestCase):
self.session.GetDatabases("", utf8_strings=True) self.session.GetDatabases("", utf8_strings=True)
except dbus.DBusException, ex: except dbus.DBusException, ex:
self.assertEqual(str(ex), self.assertEqual(str(ex),
"org.syncevolution.NoSuchSource: '' has no '' source") "org.syncevolution.NoSuchSource: '' has no '' datastore")
else: else:
self.fail("no exception thrown") self.fail("no exception thrown")
@ -2567,19 +2567,19 @@ class TestSessionAPIsDummy(DBusUtil, unittest.TestCase):
self.session.CheckSource("", utf8_strings=True) self.session.CheckSource("", utf8_strings=True)
except dbus.DBusException, ex: except dbus.DBusException, ex:
self.assertEqual(str(ex), self.assertEqual(str(ex),
"org.syncevolution.NoSuchSource: 'dummy-test' has no '' source") "org.syncevolution.NoSuchSource: 'dummy-test' has no '' datastore")
else: else:
self.fail("no exception thrown") self.fail("no exception thrown")
def testCheckSourceNoSourceName(self): def testCheckSourceNoSourceName(self):
"""TestSessionAPIsDummy.testCheckSourceNoSourceName - test the right error is reported when the source doesn't exist """ """TestSessionAPIsDummy.testCheckSourceNoSourceName - test the right error is reported when the datastore doesn't exist """
self.setupConfig() self.setupConfig()
try: try:
self.session.CheckSource("dummy", utf8_strings=True) self.session.CheckSource("dummy", utf8_strings=True)
except dbus.DBusException, ex: except dbus.DBusException, ex:
self.assertEqual(str(ex), self.assertEqual(str(ex),
"org.syncevolution.NoSuchSource: 'dummy-test' " "org.syncevolution.NoSuchSource: 'dummy-test' "
"has no 'dummy' source") "has no 'dummy' datastore")
else: else:
self.fail("no exception thrown") self.fail("no exception thrown")
@ -2592,7 +2592,7 @@ class TestSessionAPIsDummy(DBusUtil, unittest.TestCase):
self.session.CheckSource("memo", utf8_strings=True) self.session.CheckSource("memo", utf8_strings=True)
except dbus.DBusException, ex: except dbus.DBusException, ex:
self.assertEqual(str(ex), self.assertEqual(str(ex),
"org.syncevolution.SourceUnusable: The source 'memo' is not usable") "org.syncevolution.SourceUnusable: The datastore 'memo' is not usable")
else: else:
self.fail("no exception thrown") self.fail("no exception thrown")
@ -2609,7 +2609,7 @@ class TestSessionAPIsDummy(DBusUtil, unittest.TestCase):
self.fail("no exception thrown") self.fail("no exception thrown")
def testCheckSourceNoBackend(self): def testCheckSourceNoBackend(self):
"""TestSessionAPIsDummy.testCheckSourceNoBackend - test the right error is reported when the source is unusable""" """TestSessionAPIsDummy.testCheckSourceNoBackend - test the right error is reported when the datastore is unusable"""
self.setupConfig() self.setupConfig()
config = { "source/memo" : { "backend" : "file", config = { "source/memo" : { "backend" : "file",
"databaseFormat" : "text/calendar", "databaseFormat" : "text/calendar",
@ -2619,12 +2619,12 @@ class TestSessionAPIsDummy(DBusUtil, unittest.TestCase):
self.session.CheckSource("memo", utf8_strings=True) self.session.CheckSource("memo", utf8_strings=True)
except dbus.DBusException, ex: except dbus.DBusException, ex:
self.assertEqual(str(ex), self.assertEqual(str(ex),
"org.syncevolution.SourceUnusable: The source 'memo' is not usable") "org.syncevolution.SourceUnusable: The datastore 'memo' is not usable")
else: else:
self.fail("no exception thrown") self.fail("no exception thrown")
def testCheckSource(self): def testCheckSource(self):
"""TestSessionAPIsDummy.testCheckSource - testCheckSource - test all sources are okay""" """TestSessionAPIsDummy.testCheckSource - testCheckSource - test all datastores are okay"""
self.setupConfig() self.setupConfig()
try: try:
for source in self.sources: for source in self.sources:
@ -2646,18 +2646,18 @@ class TestSessionAPIsDummy(DBusUtil, unittest.TestCase):
self.session.GetDatabases("", utf8_strings=True) self.session.GetDatabases("", utf8_strings=True)
except dbus.DBusException, ex: except dbus.DBusException, ex:
self.assertEqual(str(ex), self.assertEqual(str(ex),
"org.syncevolution.NoSuchSource: 'dummy-test' has no '' source") "org.syncevolution.NoSuchSource: 'dummy-test' has no '' datastore")
else: else:
self.fail("no exception thrown") self.fail("no exception thrown")
def testGetDatabasesEmpty(self): def testGetDatabasesEmpty(self):
"""TestSessionAPIsDummy.testGetDatabasesEmpty - test the right error is reported for non-existing source""" """TestSessionAPIsDummy.testGetDatabasesEmpty - test the right error is reported for non-existing datastore"""
self.setupConfig() self.setupConfig()
try: try:
databases = self.session.GetDatabases("never_use_this_source_name", utf8_strings=True) databases = self.session.GetDatabases("never_use_this_source_name", utf8_strings=True)
except dbus.DBusException, ex: except dbus.DBusException, ex:
self.assertEqual(str(ex), self.assertEqual(str(ex),
"org.syncevolution.NoSuchSource: 'dummy-test' has no 'never_use_this_source_name' source") "org.syncevolution.NoSuchSource: 'dummy-test' has no 'never_use_this_source_name' datastore")
else: else:
self.fail("no exception thrown") self.fail("no exception thrown")
@ -6195,7 +6195,7 @@ spds/sources/todo/config.txt:# evolutionpassword =
self.assertTrue(out.startswith("List and manipulate databases:\n")) self.assertTrue(out.startswith("List and manipulate databases:\n"))
self.assertEqual(out.find("\nOptions:\n"), -1) self.assertEqual(out.find("\nOptions:\n"), -1)
self.assertTrue(out.endswith("Remove item(s):\n" \ self.assertTrue(out.endswith("Remove item(s):\n" \
" syncevolution --delete-items [--] <config> <source> (<luid> ... | '*')\n\n")) " syncevolution --delete-items [--] <config> <store> (<luid> ... | '*')\n\n"))
self.assertEqualDiff(specific_error, stripOutput(err)) self.assertEqualDiff(specific_error, stripOutput(err))
@property('debug', False) @property('debug', False)
@ -6855,7 +6855,7 @@ sources/xyz/config.ini:# databasePassword = """)
not always obvious. not always obvious.
When accepting a sync session in a SyncML server (HTTP server), only When accepting a sync session in a SyncML server (HTTP server), only
sources with sync != disabled are made available to the client, datastores with sync != disabled are made available to the client,
which chooses the final sync mode based on its own configuration. which chooses the final sync mode based on its own configuration.
When accepting a sync session in a SyncML client (local sync with When accepting a sync session in a SyncML client (local sync with
the server contacting SyncEvolution on a device), the sync mode the server contacting SyncEvolution on a device), the sync mode
@ -7341,7 +7341,7 @@ syncevolution/default/sources/eds_event/config.ini:backend = calendar
expectSuccess = False) expectSuccess = False)
self.assertEqualDiff('', out) self.assertEqualDiff('', out)
err = stripOutput(err) err = stripOutput(err)
self.assertEqualDiff('[ERROR] error code from SyncEvolution fatal error (local, status 10500): no such source(s): eds_event\n', err) self.assertEqualDiff('[ERROR] error code from SyncEvolution fatal error (local, status 10500): no such datastore(s): eds_event\n', err)
shutil.rmtree(self.configdir, True) shutil.rmtree(self.configdir, True)
# allow user to proceed if they wish and possible: here # allow user to proceed if they wish and possible: here
@ -7350,7 +7350,7 @@ syncevolution/default/sources/eds_event/config.ini:backend = calendar
expectSuccess = False) expectSuccess = False)
self.assertEqualDiff('', out) self.assertEqualDiff('', out)
err = stripOutput(err) err = stripOutput(err)
self.assertEqualDiff('[ERROR] error code from SyncEvolution fatal error (local, status 10500): no such source(s): eds_event\n', err) self.assertEqualDiff('[ERROR] error code from SyncEvolution fatal error (local, status 10500): no such datastore(s): eds_event\n', err)
shutil.rmtree(self.configdir, True) shutil.rmtree(self.configdir, True)
# allow user to proceed if they wish: configure exactly the # allow user to proceed if they wish: configure exactly the
@ -7961,20 +7961,20 @@ sources/memo/config.ini:type = todo
expectSuccess = False) expectSuccess = False)
# Information about supported modules is optional, depends on compilation of # Information about supported modules is optional, depends on compilation of
# SyncEvolution. # SyncEvolution.
self.assertRegexpMatches(err, r'''\[ERROR\] error code from SyncEvolution error parsing config file \(local, status 20010\): bar: backend not supported (by any of the backend modules \((\S+, )+\S+\) )?or not correctly configured \(backend=select backend databaseFormat= syncFormat=\)\n\[ERROR\] configuration 'foo' does not exist\n\[ERROR\] source 'bar' does not exist\n\[ERROR\] backend property not set\n''') self.assertRegexpMatches(err, r'''\[ERROR\] error code from SyncEvolution error parsing config file \(local, status 20010\): bar: backend not supported (by any of the backend modules \((\S+, )+\S+\) )?or not correctly configured \(backend=select backend databaseFormat= syncFormat=\)\n\[ERROR\] configuration 'foo' does not exist\n\[ERROR\] datastore 'bar' does not exist\n\[ERROR\] backend property not set\n''')
self.assertEqualDiff('', out) self.assertEqualDiff('', out)
# "foo" not configured, no source named # "foo" not configured, no source named
out, err, code = self.runCmdline(["--print-items", out, err, code = self.runCmdline(["--print-items",
"foo"], "foo"],
expectSuccess = False) expectSuccess = False)
self.assertRegexpMatches(err, r'''\[ERROR\] error code from SyncEvolution error parsing config file \(local, status 20010\): backend not supported (by any of the backend modules \((\S+, )+\S+\) )?or not correctly configured \(backend=select backend databaseFormat= syncFormat=\)\n\[ERROR\] configuration 'foo' does not exist\n\[ERROR\] no source selected\n\[ERROR\] backend property not set\n''') self.assertRegexpMatches(err, r'''\[ERROR\] error code from SyncEvolution error parsing config file \(local, status 20010\): backend not supported (by any of the backend modules \((\S+, )+\S+\) )?or not correctly configured \(backend=select backend databaseFormat= syncFormat=\)\n\[ERROR\] configuration 'foo' does not exist\n\[ERROR\] no datastore selected\n\[ERROR\] backend property not set\n''')
self.assertEqualDiff('', out) self.assertEqualDiff('', out)
# nothing known about source # nothing known about source
out, err, code = self.runCmdline(["--print-items"], out, err, code = self.runCmdline(["--print-items"],
expectSuccess = False) expectSuccess = False)
self.assertRegexpMatches(err, r'''\[ERROR\] error code from SyncEvolution error parsing config file \(local, status 20010\): backend not supported (by any of the backend modules \((\S+, )+\S+\) )?or not correctly configured \(backend=select backend databaseFormat= syncFormat=\)\n\[ERROR\] no source selected\n\[ERROR\] backend property not set\n''') self.assertRegexpMatches(err, r'''\[ERROR\] error code from SyncEvolution error parsing config file \(local, status 20010\): backend not supported (by any of the backend modules \((\S+, )+\S+\) )?or not correctly configured \(backend=select backend databaseFormat= syncFormat=\)\n\[ERROR\] no datastore selected\n\[ERROR\] backend property not set\n''')
self.assertEqualDiff('', out) self.assertEqualDiff('', out)
# now create "foo" # now create "foo"
@ -7987,7 +7987,7 @@ sources/memo/config.ini:type = todo
out, err, code = self.runCmdline(["--print-items", out, err, code = self.runCmdline(["--print-items",
"foo"], "foo"],
expectSuccess = False) expectSuccess = False)
self.assertRegexpMatches(err, r'''\[ERROR\] error code from SyncEvolution error parsing config file \(local, status 20010\): backend not supported (by any of the backend modules \((\S+, )+\S+\) )?or not correctly configured \(backend=select backend databaseFormat= syncFormat=\)\n\[ERROR\] no source selected\n\[ERROR\] backend property not set\n''') self.assertRegexpMatches(err, r'''\[ERROR\] error code from SyncEvolution error parsing config file \(local, status 20010\): backend not supported (by any of the backend modules \((\S+, )+\S+\) )?or not correctly configured \(backend=select backend databaseFormat= syncFormat=\)\n\[ERROR\] no datastore selected\n\[ERROR\] backend property not set\n''')
self.assertEqualDiff('', out) self.assertEqualDiff('', out)
# "foo" configured, but "bar" is not # "foo" configured, but "bar" is not
@ -7995,7 +7995,7 @@ sources/memo/config.ini:type = todo
"foo", "foo",
"bar"], "bar"],
expectSuccess = False) expectSuccess = False)
self.assertRegexpMatches(err, r'''\[ERROR\] error code from SyncEvolution error parsing config file \(local, status 20010\): bar: backend not supported (by any of the backend modules \((\S+, )+\S+\) )?or not correctly configured \(backend=select backend databaseFormat= syncFormat=\)\n\[ERROR\] source 'bar' does not exist\n\[ERROR\] backend property not set\n''') self.assertRegexpMatches(err, r'''\[ERROR\] error code from SyncEvolution error parsing config file \(local, status 20010\): bar: backend not supported (by any of the backend modules \((\S+, )+\S+\) )?or not correctly configured \(backend=select backend databaseFormat= syncFormat=\)\n\[ERROR\] datastore 'bar' does not exist\n\[ERROR\] backend property not set\n''')
self.assertEqualDiff('', out) self.assertEqualDiff('', out)
# add "bar" source, using file backend # add "bar" source, using file backend
@ -8367,13 +8367,13 @@ END:VCARD''')
out = self.stripSyncTime(out) out = self.stripSyncTime(out)
self.assertEqualDiff('''[INFO remote@client] target side of local sync ready self.assertEqualDiff('''[INFO remote@client] target side of local sync ready
[INFO remote@client] @client/addressbook: starting first time sync, two-way (peer is server) [INFO remote@client] @client/addressbook: starting first time sync, two-way (peer is server)
[INFO remote@client] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@client data changes to be applied during synchronization: @client data changes to be applied during synchronization:
*** @client/addressbook *** *** @client/addressbook ***
Comparison was impossible. Comparison was impossible.
[INFO] @default/addressbook: starting first time sync, two-way (peer is client) [INFO] @default/addressbook: starting first time sync, two-way (peer is client)
[INFO] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@default data changes to be applied during synchronization: @default data changes to be applied during synchronization:
*** @default/addressbook *** *** @default/addressbook ***
Comparison was impossible. Comparison was impossible.
@ -8462,13 +8462,13 @@ no changes
out = self.stripSyncTime(out) out = self.stripSyncTime(out)
self.assertEqualDiff('''[INFO remote@client] target side of local sync ready self.assertEqualDiff('''[INFO remote@client] target side of local sync ready
[INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server) [INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server)
[INFO remote@client] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@client data changes to be applied during synchronization: @client data changes to be applied during synchronization:
*** @client/addressbook *** *** @client/addressbook ***
no changes no changes
[INFO] @default/addressbook: starting normal sync, two-way (peer is client) [INFO] @default/addressbook: starting normal sync, two-way (peer is client)
[INFO] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@default data changes to be applied during synchronization: @default data changes to be applied during synchronization:
*** @default/addressbook *** *** @default/addressbook ***
no changes no changes
@ -8544,13 +8544,13 @@ END:VCARD''')
out = self.stripSyncTime(out) out = self.stripSyncTime(out)
self.assertEqualDiff('''[INFO remote@client] target side of local sync ready self.assertEqualDiff('''[INFO remote@client] target side of local sync ready
[INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server) [INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server)
[INFO remote@client] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@client data changes to be applied during synchronization: @client data changes to be applied during synchronization:
*** @client/addressbook *** *** @client/addressbook ***
no changes no changes
[INFO] @default/addressbook: starting normal sync, two-way (peer is client) [INFO] @default/addressbook: starting normal sync, two-way (peer is client)
[INFO] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@default data changes to be applied during synchronization: @default data changes to be applied during synchronization:
*** @default/addressbook *** *** @default/addressbook ***
after last sync | current data after last sync | current data
@ -8640,13 +8640,13 @@ no changes
out = self.stripSyncTime(out) out = self.stripSyncTime(out)
self.assertEqualDiff('''[INFO remote@client] target side of local sync ready self.assertEqualDiff('''[INFO remote@client] target side of local sync ready
[INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server) [INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server)
[INFO remote@client] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@client data changes to be applied during synchronization: @client data changes to be applied during synchronization:
*** @client/addressbook *** *** @client/addressbook ***
no changes no changes
[INFO] @default/addressbook: starting normal sync, two-way (peer is client) [INFO] @default/addressbook: starting normal sync, two-way (peer is client)
[INFO] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@default data changes to be applied during synchronization: @default data changes to be applied during synchronization:
*** @default/addressbook *** *** @default/addressbook ***
after last sync | current data after last sync | current data
@ -8751,24 +8751,24 @@ END:VCARD''')
self.assertEqualDiff('''[INFO remote@client] target side of local sync ready self.assertEqualDiff('''[INFO remote@client] target side of local sync ready
[INFO remote@client] @client/addressbook: starting first time sync, two-way (peer is server) [INFO remote@client] @client/addressbook: starting first time sync, two-way (peer is server)
[INFO remote@client] @client/calendar: starting first time sync, two-way (peer is server) [INFO remote@client] @client/calendar: starting first time sync, two-way (peer is server)
[INFO remote@client] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@client data changes to be applied during synchronization: @client data changes to be applied during synchronization:
*** @client/addressbook *** *** @client/addressbook ***
Comparison was impossible. Comparison was impossible.
[INFO remote@client] creating complete data backup of source calendar before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore calendar before sync (enabled with dumpData and needed for printChanges)
*** @client/calendar *** *** @client/calendar ***
Comparison was impossible. Comparison was impossible.
[INFO] @default/addressbook: starting first time sync, two-way (peer is client) [INFO] @default/addressbook: starting first time sync, two-way (peer is client)
[INFO] @default/calendar: starting first time sync, two-way (peer is client) [INFO] @default/calendar: starting first time sync, two-way (peer is client)
[INFO] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@default data changes to be applied during synchronization: @default data changes to be applied during synchronization:
*** @default/addressbook *** *** @default/addressbook ***
Comparison was impossible. Comparison was impossible.
[INFO] @default/addressbook: started [INFO] @default/addressbook: started
[INFO] creating complete data backup of source calendar before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore calendar before sync (enabled with dumpData and needed for printChanges)
*** @default/calendar *** *** @default/calendar ***
Comparison was impossible. Comparison was impossible.
@ -8867,24 +8867,24 @@ no changes
self.assertEqualDiff('''[INFO remote@client] target side of local sync ready self.assertEqualDiff('''[INFO remote@client] target side of local sync ready
[INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server) [INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server)
[INFO remote@client] @client/calendar: starting normal sync, two-way (peer is server) [INFO remote@client] @client/calendar: starting normal sync, two-way (peer is server)
[INFO remote@client] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@client data changes to be applied during synchronization: @client data changes to be applied during synchronization:
*** @client/addressbook *** *** @client/addressbook ***
no changes no changes
[INFO remote@client] creating complete data backup of source calendar before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore calendar before sync (enabled with dumpData and needed for printChanges)
*** @client/calendar *** *** @client/calendar ***
no changes no changes
[INFO] @default/addressbook: starting normal sync, two-way (peer is client) [INFO] @default/addressbook: starting normal sync, two-way (peer is client)
[INFO] @default/calendar: starting normal sync, two-way (peer is client) [INFO] @default/calendar: starting normal sync, two-way (peer is client)
[INFO] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@default data changes to be applied during synchronization: @default data changes to be applied during synchronization:
*** @default/addressbook *** *** @default/addressbook ***
no changes no changes
[INFO] @default/addressbook: started [INFO] @default/addressbook: started
[INFO] creating complete data backup of source calendar before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore calendar before sync (enabled with dumpData and needed for printChanges)
*** @default/calendar *** *** @default/calendar ***
no changes no changes
@ -8975,18 +8975,18 @@ END:VCARD''')
self.assertEqualDiff('''[INFO remote@client] target side of local sync ready self.assertEqualDiff('''[INFO remote@client] target side of local sync ready
[INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server) [INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server)
[INFO remote@client] @client/calendar: starting normal sync, two-way (peer is server) [INFO remote@client] @client/calendar: starting normal sync, two-way (peer is server)
[INFO remote@client] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@client data changes to be applied during synchronization: @client data changes to be applied during synchronization:
*** @client/addressbook *** *** @client/addressbook ***
no changes no changes
[INFO remote@client] creating complete data backup of source calendar before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore calendar before sync (enabled with dumpData and needed for printChanges)
*** @client/calendar *** *** @client/calendar ***
no changes no changes
[INFO] @default/addressbook: starting normal sync, two-way (peer is client) [INFO] @default/addressbook: starting normal sync, two-way (peer is client)
[INFO] @default/calendar: starting normal sync, two-way (peer is client) [INFO] @default/calendar: starting normal sync, two-way (peer is client)
[INFO] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@default data changes to be applied during synchronization: @default data changes to be applied during synchronization:
*** @default/addressbook *** *** @default/addressbook ***
after last sync | current data after last sync | current data
@ -9001,7 +9001,7 @@ END:VCARD END:VCARD
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
[INFO] @default/addressbook: started [INFO] @default/addressbook: started
[INFO] creating complete data backup of source calendar before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore calendar before sync (enabled with dumpData and needed for printChanges)
*** @default/calendar *** *** @default/calendar ***
no changes no changes
@ -9097,18 +9097,18 @@ no changes
self.assertEqualDiff('''[INFO remote@client] target side of local sync ready self.assertEqualDiff('''[INFO remote@client] target side of local sync ready
[INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server) [INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server)
[INFO remote@client] @client/calendar: starting normal sync, two-way (peer is server) [INFO remote@client] @client/calendar: starting normal sync, two-way (peer is server)
[INFO remote@client] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@client data changes to be applied during synchronization: @client data changes to be applied during synchronization:
*** @client/addressbook *** *** @client/addressbook ***
no changes no changes
[INFO remote@client] creating complete data backup of source calendar before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore calendar before sync (enabled with dumpData and needed for printChanges)
*** @client/calendar *** *** @client/calendar ***
no changes no changes
[INFO] @default/addressbook: starting normal sync, two-way (peer is client) [INFO] @default/addressbook: starting normal sync, two-way (peer is client)
[INFO] @default/calendar: starting normal sync, two-way (peer is client) [INFO] @default/calendar: starting normal sync, two-way (peer is client)
[INFO] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@default data changes to be applied during synchronization: @default data changes to be applied during synchronization:
*** @default/addressbook *** *** @default/addressbook ***
after last sync | current data after last sync | current data
@ -9123,7 +9123,7 @@ END:VCARD <
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
[INFO] @default/addressbook: started [INFO] @default/addressbook: started
[INFO] creating complete data backup of source calendar before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore calendar before sync (enabled with dumpData and needed for printChanges)
*** @default/calendar *** *** @default/calendar ***
no changes no changes
@ -9219,13 +9219,13 @@ no changes
[INFO remote@client] target side of local sync ready [INFO remote@client] target side of local sync ready
[INFO remote@client] @client/calendar: inactive [INFO remote@client] @client/calendar: inactive
[INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server) [INFO remote@client] @client/addressbook: starting normal sync, two-way (peer is server)
[INFO remote@client] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO remote@client] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@client data changes to be applied during synchronization: @client data changes to be applied during synchronization:
*** @client/addressbook *** *** @client/addressbook ***
no changes no changes
[INFO] @default/addressbook: starting normal sync, two-way (peer is client) [INFO] @default/addressbook: starting normal sync, two-way (peer is client)
[INFO] creating complete data backup of source addressbook before sync (enabled with dumpData and needed for printChanges) [INFO] creating complete data backup of datastore addressbook before sync (enabled with dumpData and needed for printChanges)
@default data changes to be applied during synchronization: @default data changes to be applied during synchronization:
*** @default/addressbook *** *** @default/addressbook ***
no changes no changes