Система синхронизатора модульная: на самом деле синхронизатор только вычисляет хеш-суммы файлов, сравнивает их с хранящимися на сервере и запрашивает выполнение определенных действий над полученной разницой. Реализация всех действий кроме чисто локальных лежит на модулях.
API для модуля:
(defgeneric digester (storage)
(:documentation
"Returns preferable digester.
Possible values :MD5, :SHA1 and other, supported by `ironclad'."))
(defgeneric initialize-empty (storage)
(:documentation "Initializes empty storage. If needed.")
(:method ((storage t)) nil))
(defgeneric retrieve-hashes (storage)
(:documentation
"Retrieves hashes in the same form as STORE-HASHES."))
(defgeneric store-hashes (storage hashes)
(:documentation
"Stores hashes, given as list."))
(defgeneric retrieve-files (storage local-root paths)
(:documentation
"Retrieves files.
Directories assumed to be existing."))
(defgeneric store-files (storage local-root local-paths)
(:documentation
"Stores files, given by relative path in the same relative remote path.
Overwrites existing files."))
(defgeneric make-remote-directories (storage paths)
(:documentation
"Makes remote directories."))
(defgeneric delete-remote (storage remote)
(:documentation
"Deletes remote files and directories"))
Прежде всего, необходимо определить место хранения, делается это так:
(make-instance 'woengine:ftp-storage
:digester :md5
:host "ftp.server.url"
:username "username"
:password "password"
:root "path/to/storage/root/")
К полученному объекту можно применить метод
woengine:initialize-empty
, который инициализирует директорию на ftp
для работы с wöngine, а после этого, функцию woengine:sync
, которая
кроме первого параметра — объекта-места хранения принимает один
обязательный параметр — путь к локальному корню синхронизации, а
также один необязательный — направление синхронизации (по умолчанию
nil
— на сервер).
Поскольку хеши передаются как ascii, использование кириллицы в именах файлов не допускается! По моему, это к лучшему. :)