This repository has been archived by the owner on Jun 30, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
ChangeLog
612 lines (577 loc) · 24.5 KB
/
ChangeLog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
../../2019 - minor update - version 1.3.1
* misc/strip-header:
- python script to strip oOfflineIMAP's headers, contributed by
Antoine Beaupré
* smd-translate:
- nodots2 mode compatible with evolution mail
17/03/2018 - protocol update - version 1.3.0
* syncmaildir.lua:
- automatic recover when interrupted just before
renaming *.db.new into *.db (was causing db-mismatch error)
* repo:
- switch to github
* README, DESIGN:
- switch to markdown
* Makefile:
- remove gconf leftover
18/11/2015 - minor bugfix - version 1.2.6.2
* smd-common:
- signal failure in creating a temp file (disk full?)
* mddiff:
- when acting as a sha1 slave, be resilient to empty files
* smd-common:
- consider an empty file as non-existing (no conflicts)
22/05/2015 - update vala code to 0.26 - version 1.2.6.1
* smd-applet:
- compile with valac 0.26
- use libgee ABI 2 (gee-0.8.pc)
14/03/2014 - feature improvement and gui redesign - version 1.2.6
* mddiff, smd-client, DESIGN:
- Emit MOVE command when appropriate. This optimization and its
implementation was desined by Jesus Cea to make smd ZFS friendly
- --no-move option for retrocompatibility with smd-uniform-names
* test.d/:
- new tests for the MOVE command
* smd-applet:
- Redesign the applet with GNOME3 in mind
- Do not use Gtk.HBox (deprecated in favour of Gtk.Grid)
- Switch from GConf to Gsettings
- Compile with valac 0.22
* smd-common, README:
- Suggest to use "User" and not "Username" for ssh configuration.
Thanks Kim Christensen for spotting that.
11/06/2012 - minor fix release - version 1.2.5
* mddiff:
- Hashtable from body sha1 to mail now holds a list of
mails so that COPY actions are generated whenever possible.
It used to be the case that on body collisions a COPYBODY
action could have been generated instead.
- Fix: --sha1sum works on empty files too
- Better error messages for malformed db-file (including line number)
* syncmaildir.lua:
- During handshake handle the case in which mddiff is unable to
sha1sum the db file
- Code for calling external tools refactored
- Optimize calls to external translator spawning only
one process (translators must be line bufferd now)
* smd-uniform-names, smd-client:
- Fix escaping of ~ that was always performed on the local host
- Handle server ERROR messages while computing renamings
- Generate better smd-rename.sh script that calls cp instead
of mv if the source message has to be used later on
* smd-client:
- Mode --dry-run prints the list of messages transferred over the
network
28/05/2012 - minor feature improvement - version 1.2.4
* smd-uniform-names:
- New tool to ease the migration from offlineimap.
When the mailboxes have roughly the same content but emails are
named differently this tool generates a shell script that
renames local mails to conform to the remote mailbox
* smd-applet:
- XDG compliant autostart, with a button in the options window
- Target GLib 2.32 and Gtk+ 3.0 for the .ui file
* smd-push, smd-pull, smd-common, smd-client, smd-server:
- New option -n --nodelete to not propagate deletions
- Support for local synchronizations: -l option to smd-client.
It is now possible to set SERVERNAME=localhost and pass -l
to smd-client (via SMDCLIENTOPTS) to obtain a synchronization
on the same host. (Thanks Miguel Fernandes for the idea
and his time for testing/debugging my prototype implementation).
- Do not use ssh if it is a local synchronization
- Support for SMDCLIENTOPTS and SMDSERVEROPTS in config file
- Code refactoring for external tools invocation
- Put a minimal README in the hooks/ directory to tell the user
what these directories are for
- Fix inconsistency in escaping of the value of TRANSLATOR_LR/RL
- Turn off grep buffered mode for progress reporting (Thanks
Stefano Zacchiroli for enlightening me on the subject)
* smd-translate:
- Fix bug in removing trailing / or " or ' from the
MAILBOX_REMOTE/LOCAL value
- New trasnlator mode: 'move'. It just replaces MAILBOX_LOCAL
with MAILBOX_REMOTE and vice versa, useful for local
synchronizations
* mddiff:
- New option -n --no-delete to not generate DELETE actions
* Makefile:
- Fix templates: C/LDFLAGS are now correctly preserved
* README:
- Update copyright dates to include 2012
- Document smd-uniform-names
03/03/2012 - minor feature improvement - version 1.2.3
* smd-pull, smd-push:
- print progress report if -v is passed
* smd-client:
- generate progress report if verbose mode is on
- generate verbose progress report during first synchronization
- log "translating:" only when meaningful (i.e. not a noop)
* smd-common:
- create a new fifo for progress reporters
- standard progress reporter printing on stdout PROGRESS: lines
- use mddiff as mkdir and mkfifo (no more calls to mkfifo and mkdir)
* smd-applet:
- ported to vala 0.16
* smd-loop:
- fixed cleanup process (Thanks Ralf Schmitt for the patch)
* smd-restricted-shell:
- new utility to be used in .ssh/authorized_keys, see the command=
option (Thanks Luca Capello for the idea and the documentation)
* syncmaildir.lua:
- When mddiff fails to sha1 a message print the file name (thanks
Zhengdao Wang for the idea)
01/12/2011 - minor fix - version 1.2.2
* smd-config.5:
- fixed typo and use `quotes' to delimit strings
* smd-common:
- fixed temp file leak
- fixed stale lock file detection
* mddiff:
- add --sha1sum to avoid depending on the sha1sum external utility
- add --mkdir-p to avoid depending on the mkdir external utility
- add --mkfifo to avoid depending on the mkfifo external utility
- print OK on successful symlink creation
- updated copyright
* syncmaildir.lua:
- use mddiff to create symlinks to remove dependency over ln
10/09/2011 - minor feature improvement - version 1.2.1
* mddiff:
- support for --exclude via fnmatch(3) to filter out unwanted
directories
* smd-server, smd-push, smd-common:
- thread around --exclude
* smd-check-conf:
- many bug fixes
* README:
- document EXCLUDE
- reorganized
* smd-applet:
- ported to vala 0.13.3
- removed embedded copy of libnotify.vapi/deps
07/09/2011 - major feature improvement - version 1.2.0
* all tools:
- support for renaming mailboxes thanks to translator programs:
useful to switch from offlineimap to smd
- -d option now implies -v
* smd-translate:
- common translator utility to handle renaming typical imap servers
- support dovecot imap server (removal of leading dots)
* smd-check-conf:
- utility to test for round trip of translators on the current
list of mailboxes and perform some other sanity checks
* mddiff:
- accept -l to list all mailboxes rooted in the given paths
- accept -s to create symlinks reading input on a fifo
- minor improvement: basename/g_path_basename now called
only once per mail folder
- directory handler leak fixed
* smd-common:
- accept -s to show tags, while -v is used for more verbose output
- sanitize input of MAILBOX like variables
* smd-client:
- reworked to fix once and for all (hopefully ;-) the problems with
names containing spaces
* syncmaildir.lua:
- better report a network error
* smd-applet:
- notification.set_hint "transient" called with a boolean GVariant
to avoid crashing the notification-daemon
* Makefile:
- minor improvements w.r.t. test running
- eye candy stats target
* tests.d:
- support tests for smd-push
- test for renaming
* smd-config.5:
- new manpage for the configuration file
24/07/2011 - minor fix 4 Faidon - version 1.1.6
* smd-pull, smd-push:
- mention --dry-run option in manpage
* mddiff,syncmaildir,smd-client,smd-server:
- properly handle file names with spaces
* test.d:
- new test for file names with spaces
* mddiff:
- if we get EPERM opening a mail we retry without O_NOATIME since
that option is allowed only on files owned by the euid of the
process (unless you have CAP_FOWNER). These files were previously
skipped, but it may be the case one has old crap owned by a
different user in his mailbox, like an old broken uid. Thanks
Faidon for debugging this issue
03/07/2011 - minor fix - version 1.1.5
* smd-applet:
- Ported to NetworkManager 0.9 APIs (GNOME 3)
- Ported to libnotify 0.7
- Ported to GTK+-3.0
- Windows spacings conforming to the GNOME guidelines
04/03/2011 - minor fix - version 1.1.4
* Makefile:
- add / in front PREFIX when generating smd-config.h
04/03/2011 - minor fix to the build system release - version 1.1.3
* Makefile:
- compact compilation output: CC, VALAC
call `make H=` to enable verbose output again
- error message for too old glib version improved
- automatic generation and update of smd-config.h based on Makefile
variables, both the static and the command line ones
- better warnings if there is no valac but any vala file changed
- no more -DVERSION compile flag, since all compiled code includes
the same smd-config.h file
* mddiff.c:
- include smd-config.h for SMD_CONF_VERSION
* smd-config.vapi:
- bind smd-config.h to vala
* config.vala:
- removed: smd-config.h is used by smd-applet.vala thanks to
smd-config.vapi
03/03/2011 - maintenance release - version 1.1.2
* smd-applet.vala:
- ported to valac 0.10
- ported to GDbus (package gio-2.0)
- build dependency over vala removed: config.c and smd-applet.c
are now included in the tarball
* mddiff.c:
- compile with additional -Wcast-align flag
- use %zc to print size_t, if available
- compute the default for --max-mailno using the number of lines
in the db-file (if available) and adding 1000 (as the max amount
of new mails). Overestimating the amount of memory needed can
make malloc fail if the system is under heavy loads. --max-mailno
still makes sense for the first run, since there is no db-file to
look at.
14/10/2010 - minor fix - version 1.1.1
* syncmaildir.lua:
- tmp_for fixed: the pid component is now a unique index instead of
a fixed one.
The old code Was causing troubles when receiving more then 10
mails during the same second and in the same mailbox and when
the pid component of the mail name was not made just of digits.
The regular expression to capture the pid component has also been
relaxed accepting "_" too.
01/09/2010 - minor feature release - version 1.1.0
* smd-loop:
- when run, immediately execute the first pull/push scheduled.
it used to sleep for its interval
* smd-applet:
- connect to NetworkManager to query network status, if the
connection is not present, we enter pause mode.
15/06/2010 - minor fix - version 1.0.0
* smd-applet:
- recognize mailto: actions so that a nice label is used
istead of the raw command that comprises subject and body
- ported to vala 0.9.1, use .connect instead of deprecated +=
* smd-client, syncmaildir.lua:
- generate as suggested action for internal errors:
gnome-open "mailto:...."
* smd-server:
- do not es.execute(touch), use io.open instead
* syncmaildir.lua:
- place fifo for mddiff in HOME/.smd/fifo/ if HOME is set, /tmp
otherwise
- added upperbound to loop generating a fresh name for the fifo
* sample-hooks/persistent-ssh:
- set +e so that if ssh fails smd-pull/push does not fail too and
generates proper tags
* Makefile:
- fixed upload target, used to overwrite the tarball with the
changelog
- substitute SMDVERSION, MKFIFO and MKDIR when installing scripts
- new test/SUITE target to run only one testsuite
* README:
- added notes about the first synchronization
* DESIGN:
- better doc for mddiff
* tests.d/:
- new tests for hooks logging
- new test for fifo creation (syncmaildir.lua function sha_file)
- allow disabling valgrind by exporting the VALGRIND variable
* Makefile, smd-common, syncmaildir.lua:
- remove all explicit mentions of my username on sourceforge
or my home directory layout
12/04/2010 - minor fix/speedup release - version 0.9.16 aka 1.0~rc5
* smd-client:
- fixed a little bug preventing copybody to work properly
if the target directory was not existing
* syncmaildir.lua, smd-client:
- call mddiff passing a pipe, and use the very same instance
every time the sha1 of a file needs to be computed. This improves
performances considerably when a large number of files needs to
be hashed, for example when two very similar mailboxes are
synced for the first time (here, 8x speedup)
- implement cp in lua to avoid spawning a new process every
time a file is copied/moved. The overhead, for small files,
is too high and the pure lua implementation of cp is 10 times
faster on small files (but could be way slower for big ones).
* mddiff:
- interface change: only a list of directories or a fifo can
be passed as arguments
- in case the fifo is passed, mddiff reads file names separated
by \n and outputs their sha1 sums
* smd-pull, smd-push:
- report an error if a wrong flag is supplied
23/03/2010 - minor fix release - version 0.9.15 aka 1.0~rc4
* smd-applet:
- the icon used to stay set to warning even after a successful
synchronization
* smd-client, smd-server, syncmaildir:
- never use the lua error() function, all errors should generate
a meaningful tag, only internal errors raise error and thus
are tagged as internal-error by the parachute that also prints
a backtrace
- always use log_tags_and_fail, that calls error but with
the exception {text=....} that is recognized by the parachute
so that no backtrace is printed
- parse mddiff opcodes with a function that is robust in
face of malformed arguments
* tests.d/:
- new test for database mismatch (indirectly testing correct
exception handling) and for malformed mddiff opcodes arguments
* sample-hooks:
- persistent-ssh: exploiting ssh connection sharing capability.
This allows to save a little amount of time every synchronization.
A single secure connection can be established once, at the very
beginning, and then reused for evry subsequent synchronization.
- documentation for hooks in markdown format generating hooks.html
12/03/2010 - major feature relase - version 0.9.14 aka too many changes to be rc
* syncmaildir.lua:
- mkdir_p creates always a maildir, if the last path component
is in { "new", "tmp", "cur" } (used to do that only if it was
"tmp".
* smd-common:
- major refactoring, almost all code is inside functions
- new function run_hooks
* smd-pull, smd-push:
- adapt to the new smd-common interface: call by hand init
functions instead of having them executed by side effect of
sourcing smd-common
* hooks support in smd-push and smd-pull:
- executables contained in the .smd/hooks/{pre,post}-{pull,push}.d/
directories are executed pre/post the pull/push process.
- hooks receive as argument:
- when: pre/post
- what: push/pull
- endpoint: the endpoint name (usually default)
- status: the current status, 0 for OK, 1 for error. pre-hooks
always receive 0, post hooks receive the value smd-push/pull
will return after hooks terminate
- thanks to Bart Trojanowsk for the hooks idea
* sample-hooks/:
- new directory with sample hooks, for now just a simple
mail-on-failure hook
* tests.d/:
- major redesign of the test framework, allowing multiple
test suites
- new test suite for smd-pull/push
- new test suite for mddiff
* smd-push/pull smd-client/server mddiff:
- support -d --dry-run (i.e. perform no action)
* manpages for mddiff, smd-client, smd-server, smd-pull, smd-push:
- added -d --dry-run doc
- mention hooks
* copyright:
- updated years in all files: 2008-2010
- added copyright banner where missing
* git archive:
- use git archive for the make dist target
* README:
- mention --dry-run
- document hooks
02/03/2010 - major fix release - version 0.9.13
* smd-server mddiff:
- big fat bug solved: the .mtime file was always updated.
the .mtime file used to be updated even if the synchronization
failed. This could have caused some changes (like in place eader
modifications, but not like new messages or renamings/flagging) to
be ignored in the following synchronization. Now .mtime works
exactly as .db.txt, a .new one is created by mddiff, and is up to
smd-server to rename both.
* mddiff.1.txt:
- fixed typo
27/12/2009 - minor fix release - version 0.9.12 aka 1.0rc3
* DESIGN:
- mention the ERROR action that mddiff can now emit
* smd-client:
- understand the ERROR action
* mddiff.c:
- use only EXIT_SUCCESS and EXIT_FAILURE as exit codes
- ERROR macro calls exit(EXIT_FAILURE) end emits the
ERROR action
- new macro WARNING, used for what used to be non
fatal errors
- improved argument check: stat is done in advance, and
we bail out if they are not omogeneous
* syncmaildir.lua:
- handshake function emits 'network' as probable failure
cause. Used to emit 'network-error', cheating smd-applet
* smd-client, smd-server, smd-common:
- check for the existence of external helper programs
to fail early if it is not the case
* smd-client, smd-server, syncmaildir.lua:
- more comments in the code and better organization
- littler refactoring for mkdir_p and tmp_for
- added function to check for the existence of an
external program using shell type command
* Makefile:
- added abspath/* template to install the software hardcoding
absolute paths for helper programs
* README, DESIGN:
- fixed indentation so that markdown displays all
blockquotes as such (kudos to Zack).
13/11/2009 - minor fix release - version 0.9.11 aka 1.0rc2
* smd-loop:
- save pid in lockfile so that lockfile referring
to dead instances can be ignored
- on receiving SIGTERM, do the cleanup and exit
- write log file ~/.smd/log/loop.log
* smd-push/pull:
- save pid in lockfile so that lockfile referring
to dead instances can be ignored
- print a tagged error message in case an instance is
already running
* smd-appled:
- ported to vala 0.7.8
- accept error messages from smd-pushpull (that is used
by both smd-push and smd-pull as the tool identifier)
- added pause checkbox menu item to pause smd-loop (actually
kill and restart)
- menu for left and right mouse button differ:
- right has preferences, about and quit
- left has pause and logs
- unrecoverable but non-network related errors are not silently
hidden, a popup shows their possible cause but the application
does not enter error handling mode
3/10/2009 - minor fix release - version 0.9.10
* smd-loop:
- fixed a bug regarding the lock file name, that was clashing
with the one of smd-push/pull
* smd-push/pull:
- print the date in the log, not on stdout
27/9/2009 - minor fix release - version 0.9.9 aka 1.0rc1
* mddiff:
- --help and manpage improved
- compile with -O2, why not?
- add strict compile time dependency over glib >= 2.19.1,
that fixes a bug concerning the checksum of data with
length < 2
* smd-push/pull:
- when -v is passed also print the date
* smd-applet:
- less noise when a network error occurrs, just notify the user
once and change the icon
- added manpage
- added view log menu item and relative window
- made vala 0.7.6 clean
* smd-loop:
- lockfile to not run two instances concurrently
* Makefile:
- sourceforge paths made variable, easier to change and more
readable Makefile
- added support for @variable@ substitution in installation
phse for SED, SHA1SUM, XDELTA, CPN, SSH, LUA and PREFIX
- added template for osx: make osx/FOO will make target FOO
with some variables customized for osx
* README:
- added some notes about installation from sources
16/8/2009 - minor fix release
* mddiff, smd-client:
- REPLACE command implemented
- tests added
* smd-applet:
- fixed a minor issue with Vala 0.7.5, GLib.Pid is not an int
anymore
- fixed a major issue with threading, all code regarding gtk is
now run by the main thread
- fixed a major issue with memory management, from List to
Gee.ArrayList, that have non-week references and thus prevent
their data from being collected
26/7/2009 - minor bugfix release
* smd-applet:
- when quit was clicked, it was killing every process in
its process group, not in the one of its child smd-loop,
thus it was killing all other applets started by gnome-applet
- configuration window is not pupped up if no config files are
found, an error icon and a notification are used instead, and
the software wants the configuration files to be available before
it actually does something.
26/7/2009 - major feature release
* smd-applet, eye-candy applet for smd-loop:
- attaches to the notification area
- stores its configuration using GConf
- notifies the user using libnotify
- runs smd-loop, interpreting its output
- shows the user possible errors and allows him to
perform suggested actions by clicking on buttons
- complains if smd-loop or smd-push/pull is not configured and
forces the user to configure it before starting
- automatically run by gnome-session (/etc/xdg/autostart)
- shows an item in gnome-control-center
* smd-loop, cron like push/pull iterator:
- use a line based configuration file ~/.smd/loop in the style
of cron, calling smd-push/pull with 1 minute granularity
- catches some transient errors giving them a second chance;
i.e. if the suggested solution is retry, it does so but only
once
* error report:
- smd-client and smd-server output tags describing the
error that caused a sync failure:
- context: which part of the software failed, like ssh,
message-deletion, copy-message, ...
- probable-cause: something like network, bad file permissions, ...
- human-intervention: avoidable or necessary
- suggested-actions: run( command ), display-mail, retry, ...
- smd-push/smd-pull catch early network errors, so that
some tags are output even if smd-client/smd-server is
not even run
* statistics:
- smd-client outputs tags describing its last run, comprising
the number of added/deleted messages, so that higher level tools
can notify the user or collect statistics
28/4/2009 - minor fix and minor feature release
* support for multiple servers/clients:
- config file is now ~/.smd/config.$FOO and smd-push/pull
can get an extra argument for FOO, defulat value of FOO is
`default`.
- backward-compatibility code added to automatically migrate
the old config file name to the new one
* cleanup in ~/.smd/:
- fifos are now in the fifo/ subdirectory
- logs are now in the log/ subdirectory
* bugfix to mddiff:
- COPYBODY action used to be always followed by an ADD action,
that was unnecessary (but not dangerous either).
* better error reporting:
- syncmaildir.lua improved to better report some errors
21/4/2009 - minor fix and minor feature release
* track only mailmessages (skip other stuff like dovecott indexes):
- scans only files in cur/ and new/
* add COPYBODY command to mddiff:
- mails that are moved around and then flagged by MUA
are not deteceted anymore as new messages, only the new header
is transmitted
- smd-client honors the command
* smd-client better reports network errors:
- if no data at all is readable from stdin, it means that
the transport (ssh) is not working and this is reported to
the user as such
19/4/2009 - major bugfix release
* major bugfix:
- the db file must be in sync too to grant all changes are detected
- the mtime has not to be the same on client and server (thus
has to be removed from the db file)
- adopt xdelta to calculate a patch for the db file (should be
better than diff and can scale to binary, compressed, db file)
* new client/server protocol:
- allows the server to ABORT
- handshake checking protocol version and dbfile hash
- at the end transmit and apply the xdelta patch
* db file format changed:
- no more mtime column
- added db.txt.mtime auxiliary file to stores a global timestamp
for the whole db
* minor bugfixes in the code (mostly better error reporting)
* more documentation
12/4/2009 - first public release
* end-user tools: smd-pull, smd-push
* stupid endpoint: smd-server
* endpoint implementing politics: smd-client
* low-level tool: mddiff