syncevolution 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/se-config +46 -26
- data/lib/syncevolution/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb5ee760a7b2cd3658ab16b0054a9c091495a1d0
|
4
|
+
data.tar.gz: 714bcd11a734b172fe66a5506852f09afdb3e420
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10b386dde8ea85515288ca74d4d2ce75633124c2a6baa1feda8d447578e14e41fe8c26198f05e304b03e602885bd85e95edb7e0d23f0efca5db1d894151f4cb2
|
7
|
+
data.tar.gz: bd0f973461089131ac7010e7e8533ed943a563cbd8600a2d5a4866485443c8889b2eed3f9212f8a155061217f3d847bdb9b5cfcdb66e08a25bb84d2dfe5a54af
|
data/bin/se-config
CHANGED
@@ -4,6 +4,7 @@ require 'inifile'
|
|
4
4
|
require 'nokogiri'
|
5
5
|
require 'pp'
|
6
6
|
require 'trollop'
|
7
|
+
require 'uri'
|
7
8
|
|
8
9
|
module SyncEvolution
|
9
10
|
class SyncEvolution
|
@@ -21,23 +22,20 @@ module SyncEvolution
|
|
21
22
|
def to_gv
|
22
23
|
gv = "digraph syncevolution {\n"
|
23
24
|
|
24
|
-
|
25
|
+
gv_id = lambda{|node| id(node).split('/').collect{|n| n.gsub(/[^a-z0-9]/i, '').downcase}.join('_').gsub(/^_/, '') }
|
26
|
+
|
25
27
|
syncs = 0
|
26
28
|
|
27
29
|
@doc.xpath('//context').each{|context|
|
28
|
-
|
29
|
-
gv << " subgraph cluster_#{objects[context['name']]} {\n"
|
30
|
+
gv << " subgraph cluster_#{gv_id.call(context)} {\n"
|
30
31
|
gv << " label = #{context['name'].inspect};\n"
|
31
32
|
|
32
33
|
context.xpath('./store').each{|store|
|
33
|
-
|
34
|
-
gv << " #{objects[context['name'] + ':' + store['name']]} [ shape = folder, label = #{store['name'].inspect}];\n"
|
34
|
+
gv << " #{gv_id.call(store)} [ shape = folder, label = #{store['name'].inspect}];\n"
|
35
35
|
}
|
36
36
|
|
37
37
|
context.xpath('./sync').each{|sync|
|
38
|
-
|
39
|
-
gv << " #{objects[context['name'] + ':' + sync['name']]} [ shape = component, label = #{sync['name'].inspect}];\n"
|
40
|
-
|
38
|
+
gv << " #{gv_id.call(sync)} [ shape = component, label = #{sync['name'].inspect}];\n"
|
41
39
|
|
42
40
|
sync.xpath('./store').each{|store|
|
43
41
|
}
|
@@ -48,7 +46,6 @@ module SyncEvolution
|
|
48
46
|
|
49
47
|
@doc.xpath('//sync/store').each{|store|
|
50
48
|
sync = store.parent
|
51
|
-
context = sync.parent
|
52
49
|
|
53
50
|
if sync['syncURL'] =~ /^local:\/\/@(.+)/
|
54
51
|
targetcontext = $1.downcase
|
@@ -58,17 +55,17 @@ module SyncEvolution
|
|
58
55
|
|
59
56
|
syncs += 1
|
60
57
|
|
61
|
-
|
62
|
-
|
58
|
+
targetsync = @doc.at("//context[@name=#{_inspect(targetcontext)}]/sync[@name='target-config']")
|
59
|
+
targetstore = @doc.at("//context[@name=#{_inspect(targetcontext)}]/store[@name=#{_inspect(store['uri'])}]")
|
63
60
|
|
64
61
|
dir = case store['sync']
|
65
62
|
when 'two-way' then 'both'
|
66
63
|
else throw store['sync'].inspect
|
67
64
|
end
|
68
65
|
|
69
|
-
gv << " #{
|
70
|
-
gv << " #{
|
71
|
-
gv << " #{
|
66
|
+
gv << " #{gv_id.call(store)} -> #{gv_id.call(store.parent)} [label=\"#{syncs}\", dir=#{dir}, style=dashed];\n"
|
67
|
+
gv << " #{gv_id.call(store.parent)} -> #{gv_id.call(targetsync)} [label=\"#{syncs}\", dir=#{dir}, style=dashed];\n"
|
68
|
+
gv << " #{gv_id.call(targetsync)} -> #{gv_id.call(targetstore)} [label=\"#{syncs}\", dir=#{dir}, style=dashed];\n"
|
72
69
|
}
|
73
70
|
|
74
71
|
gv << "}\n"
|
@@ -101,7 +98,7 @@ module SyncEvolution
|
|
101
98
|
}
|
102
99
|
|
103
100
|
ctx_s.xpath('./sync').each{|sn_s|
|
104
|
-
sn_t = @doc.at("//context[@name=#{_inspect(ctx_s['name'])}]/
|
101
|
+
sn_t = @doc.at("//context[@name=#{_inspect(ctx_s['name'])}]/sync[@name=#{_inspect(sn_s['name'])}]")
|
105
102
|
if sn_s.at('./clear') && sn_t
|
106
103
|
sn_t.unlink
|
107
104
|
sn_t = add(context: ctx_s['name'], sync: sn_s['name'])
|
@@ -122,13 +119,36 @@ module SyncEvolution
|
|
122
119
|
}
|
123
120
|
end
|
124
121
|
|
122
|
+
def id(node)
|
123
|
+
if node.name == 'context'
|
124
|
+
return "/#{node['name'].downcase}"
|
125
|
+
elsif node.parent.name == 'context' and ['store', 'sync'].include?(node.name)
|
126
|
+
return "/#{node.parent['name'].downcase}/#{node['name'].downcase}"
|
127
|
+
elsif node.name == 'store'
|
128
|
+
return "/#{node.parent.parent['name'].downcase}/#{node.parent['name'].downcase}/#{node['name'].downcase}"
|
129
|
+
end
|
130
|
+
|
131
|
+
throw "Unexpected node #{node.inspect}"
|
132
|
+
end
|
133
|
+
|
125
134
|
def to_bash(indent)
|
126
135
|
bash = ''
|
127
136
|
|
128
|
-
|
137
|
+
doc = @doc.clone
|
138
|
+
|
139
|
+
doc.xpath("//*[@password='-' or @databasePassword='-']").each{|node|
|
140
|
+
['password', 'databasePassword'].each{|attr|
|
141
|
+
next unless node[attr] == '-'
|
142
|
+
var = (id(node).gsub(/^\//, '').gsub(/\//, '__').gsub(/[^A-Z0-9]/i, '_') + '__' + attr).upcase
|
143
|
+
node[attr]="$#{var}"
|
144
|
+
bash << "#{var}=XXXXXXXXXXXXXXXX\n"
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
params = to_params(doc.root.attributes.reject{|k, v| k == 'name'}, indent, '')
|
129
149
|
bash << "syncevolution --configure --template none #{params}\n" if params != ''
|
130
150
|
|
131
|
-
|
151
|
+
doc.xpath('//context').each{|context|
|
132
152
|
bash << "syncevolution --remove #{escape('@' + context['name'])}\n" if context.at('./clear')
|
133
153
|
|
134
154
|
params = to_params(context.attributes.reject{|k, v| k == 'name'}, indent)
|
@@ -260,27 +280,27 @@ module SyncEvolution
|
|
260
280
|
|
261
281
|
def verify
|
262
282
|
@doc.xpath("//sync[@name='target-config']/store[@sync != 'none' and @sync != 'disabled']").each{|store|
|
263
|
-
|
283
|
+
warn "target-config@#{store.parent.parent['name']} has set sync of #{store['name']} to #{store['sync']}, but sync is not used in a target-config"
|
264
284
|
}
|
265
285
|
|
266
286
|
@doc.xpath("//sync[@name='target-config' and @syncURL]").each{|sync|
|
267
|
-
|
287
|
+
warn "target-config@#{sync.parent['name']} has set an syncURL, but syncURL is not used in a target-config"
|
268
288
|
}
|
269
289
|
|
270
290
|
@doc.xpath("//sync").each{|sync|
|
271
291
|
if !sync['syncURL']
|
272
|
-
|
292
|
+
warn "sync-config #{sync['name']}@#{sync.parent['name']} has no syncURL" unless sync['name'] == 'target-config'
|
273
293
|
else
|
274
294
|
targetcontext = sync['syncURL'].gsub(/^local:\/\//i, '')
|
275
295
|
|
276
296
|
if targetcontext != sync['syncURL'].to_s
|
277
|
-
|
297
|
+
warn "sync-config #{sync['name']}@#{sync.parent['name']} set up for local sync with #{targetcontext}, which doesn't start with '@'" if targetcontext !~ /^@/
|
278
298
|
targetcontext.sub!(/^@/, '')
|
279
299
|
targetcontext.downcase!
|
280
300
|
if !@doc.at("//context[@name=#{_inspect(targetcontext)}]")
|
281
|
-
|
301
|
+
warn "sync-config #{sync['name']}@#{sync.parent['name']} set up for local sync with non-existent context #{targetcontext}"
|
282
302
|
elsif !@doc.at("//context[@name=#{_inspect(targetcontext)}]/sync[@name='target-config']")
|
283
|
-
|
303
|
+
warn "sync-config #{sync['name']}@#{sync.parent['name']} set up for local sync with non-existent target-config@#{targetcontext}"
|
284
304
|
else
|
285
305
|
sync.xpath('./store').each{|store|
|
286
306
|
local = @doc.at("//context[@name=#{_inspect(sync.parent['name'])}]/store[@name=#{_inspect(store['name'])}]")
|
@@ -289,9 +309,9 @@ module SyncEvolution
|
|
289
309
|
if remote
|
290
310
|
lbe = backend_type(local)
|
291
311
|
rbe = backend_type(remote)
|
292
|
-
|
312
|
+
warn "sync-config #{sync['name']}@#{sync.parent['name']} connects store #{local['name']}@#{sync.parent['name']} of type #{lbe} to incompatible #{remote['name']}@#{targetcontext} of type #{rbe}" if lbe != rbe
|
293
313
|
else
|
294
|
-
|
314
|
+
warn "sync-config #{sync['name']}@#{sync.parent['name']} connects store #{store['name']}@#{sync.parent['name']} to non-existent #{store['uri']}@#{targetcontext}"
|
295
315
|
end
|
296
316
|
end
|
297
317
|
}
|
@@ -302,7 +322,7 @@ module SyncEvolution
|
|
302
322
|
|
303
323
|
@doc.xpath("//sync/store").each{|store|
|
304
324
|
if !store.parent.at(".//store[@name=#{_inspect(store['name'])}]")
|
305
|
-
|
325
|
+
warn "sync-config #{store.parent['name']}@#{store.parent.parent['name']} references non-existent store #{store['name']}"
|
306
326
|
end
|
307
327
|
}
|
308
328
|
end
|