.\" Man page generated from reStructuredText .\" by the Docutils 0.23 manpage writer. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "VDIRSYNCER" "1" "Sep 05, 2026" "0.21" "vdirsyncer" .SH "نام (NAME)" vdirsyncer \- مستندات vdirsyncer .INDENT 0.0 .IP \(bu 2 مستندات \% .IP \(bu 2 کد منبع \% .UNINDENT .sp برنامهٔ \fBvdirsyncer\fP یک ابزار خط‌فرمانی برای همگام‌سازی تقویم‌ها و دفترچه‌های نشانی میان انواع سرورها و فایل‌سیستم محلی است. رایج‌ترین مورد استفاده، همگام‌سازی یک سرور با یک پوشهٔ محلی و استفاده از مجموعه‌ای از برنامه‌های دیگر \%<> برای تغییر رویدادها و مخاطبین محلی است. سپس \fBvdirsyncer\fP می‌تواند آن تغییرات را مجدداً با سرور همگام‌سازی کند. .sp با این حال، \fBvdirsyncer\fP به همگام‌سازی میان کلاینت‌ها و سرورها محدود نمی‌شود؛ بلکه می‌توان از آن برای همگام‌سازی مستقیم تقویم‌ها و/یا دفترچه‌های نشانی میان دو سرور نیز استفاده کرد. .sp هدف این ابزار آن است که همان نقشی را برای تقویم‌ها و مخاطبین ایفا کند که \fBOfflineIMAP\fP \% برای ایمیل‌ها دارد. .SH "چه زمانی به VDIRSYNCER نیاز دارم؟ (WHEN DO I NEED VDIRSYNCER?)" .SS "چرا Dropbox + todo.txt نه؟ (Why not Dropbox + todo.txt?)" .sp پروژه‌هایی مانند \fBtodo.txt\fP \% پیچیدگی برنامه‌های مدرن بهره‌وری را به درستی نقد می‌کنند. بنابراین آن‌ها دست به کار شدند تا قالبی جدید، فوق‌العاده ساده و خوانا برای انسان ایجاد کنند، به طوری که \fBvim\fP برای مشاهدهٔ داده‌های خام کافی باشد. با این حال، هنگامی که با این پرسش روبرو شدند که چگونه آن داده‌ها را میان چندین دستگاه همگام‌سازی کنند، به نظر می‌رسد با ایدهٔ نوآورانهٔ خود به بن‌بست رسیدند: \(dqبیایید فقط از \fBDropbox\fP استفاده کنیم\(dq. .sp نرم‌افزارهای همگام‌سازی فایل در صورتی که هر دو فایل از زمان آخرین همگام‌سازی تغییر کرده باشند چه می‌کنند؟ پاسخ این است که صورت‌مسئله را نادیده می‌گیرند، تا جای ممکن مکرراً همگام‌سازی می‌کنند و به بهترین نتیجه امید می‌بندند. زیرا اگر تداخل همگام‌سازی پیش بیاید، اغلب سرویس‌های همگام‌سازی جرئت ادغام فایل‌ها را ندارند و در عوض دو نسخه از آن را در هر رایانه ایجاد می‌کنند. ادغام این دو فهرست وظایف بر عهدهٔ کاربر گذاشته می‌شود. .sp ایدهٔ بهتر می‌توانست استفاده از \fBgit\fP برای همگام‌سازی فایل \fBtodo.txt\fP باشد، که حداقل قادر است برخی تداخل‌های پایه‌ای را حل و فصل کند. .SS "چرا همگام‌سازی فایل (Dropbox، git و ...) + vdir نه؟ (Why not file sync (Dropbox, git, ...) + vdir?)" .sp از آنجا که \fBvdir\fPها \%<> صرفاً مجموعه‌ای از فایل‌ها هستند، امتحان کردن \fIهمگام‌سازی فایل\fP برای همگام‌سازی داده‌هایتان میان چندین رایانه بدیهی به نظر می‌رسد، مانند: .INDENT 0.0 .IP \(bu 2 \fBSyncthing\fP \% .IP \(bu 2 \fBDropbox\fP \% یا یکی از بی‌شمار سرویس‌های مشابه آن .IP \(bu 2 \fBunison\fP \% .IP \(bu 2 صرفاً \fBgit\fP به همراه یک \fBsshd\fP\&. .UNINDENT .sp معایب این راه‌حل‌ها تا حد زیادی به برنامهٔ دقیق همگام‌سازی فایلِ انتخاب‌شده بستگی دارد: .INDENT 0.0 .IP \(bu 2 مشابه \fBtodo.txt\fP، برنامهٔ \fBDropbox\fP و ابزارهای مشابه آشکارا از محتوای فایل‌ها بی‌خبر هستند (نسبت به محتوا ناآگاهند). اگر فایلی در هر دو طرف تغییر کرده باشد، \fBDropbox\fP صرفاً هر دو نسخه را در هر دو طرف کپی می‌کند. .sp این ایده زمانی خوب است که کاربر مستقیماً با فایل‌سیستم تعامل داشته باشد و خود قادر به حل تداخل‌ها باشد. اما در اینجا ممکن است منجر به رفتار اشتباه در برنامه‌هایی نظیر \fBkhal\fP شود، زیرا اکنون دو رویداد با \fBUID\fP یکسان وجود دارند. .sp این نکته در مورد \fBgit\fP صدق نمی‌کند: این ابزار قابلیت‌های ادغام بسیار خوبی دارد، حتی بهتر از آنچه \fBvdirsyncer\fP در حال حاضر ارائه می‌دهد. .IP \(bu 2 چنین ساختاری اصلاً بر روی تلفن‌های هوشمند کار نمی‌کند. از سوی دیگر، \fBvdirsyncer\fP با سرورهای CardDAV/CalDAV همگام‌سازی می‌کند، سرورهایی که می‌توان از طریق برنامه‌هایی مانند DAVx⁵ \% یا سایر برنامه‌های پیش‌فرض موجود در تلفن‌های هوشمند به آن‌ها دسترسی داشت. .UNINDENT.SH "نصب (INSTALLATION)" .SS "بسته‌های سیستم‌عامل/توزیع" .sp بسته‌های زیر با مشارکت جامعه آماده شده‌اند و در زمان نگارش این مستند به‌روز بوده‌اند: .INDENT 0.0 .IP \(bu 2 Arch Linux \% .IP \(bu 2 Ubuntu و Debian، فقط برای x86_64 \% (بسته‌ها در مخازن رسمی نیز موجود هستند اما ممکن است قدیمی باشند) .IP \(bu 2 GNU Guix \% .IP \(bu 2 macOS (homebrew) \% .IP \(bu 2 NetBSD \% .IP \(bu 2 OpenBSD \% .IP \(bu 2 Slackware (اسکریپت SlackBuild در Slackbuilds.org) \% .UNINDENT .sp ما فقط از آخرین نسخهٔ vdirsyncer پشتیبانی می‌کنیم که در زمان نگارش این متن 0.21.0 است\&. لطفاً \fBدر صورت استفاده از نسخه‌های قدیمی‌تر، باگی گزارش نکنید\fP\&. .sp برخی از توزیع‌ها دارای چندین کانال انتشار هستند. به عنوان مثال Debian و Fedora دارای یک کانال انتشار \(dqstable\(dq (پایدار) هستند که نسخهٔ قدیمی‌تری از vdirsyncer را ارائه می‌دهد. از آن نسخه‌ها نیز پشتیبانی نمی‌شود. .sp اگر بستهٔ مناسبی برای توزیع شما وجود ندارد، باید vdirsyncer را به‌صورت دستی نصب کنید\&. یک دستور ساده برای رونویسی و جای‌گذاری (copy\-and\-paste) برای این کار وجود دارد، اما باید از پیامدهای آن آگاه باشید. .SS "نصب دستی" .sp اگر توزیع شما بسته‌ای برای vdirsyncer ارائه نمی‌دهد، همچنان می‌توانید از مدیر بستهٔ Python یعنی \(dqpip\(dq استفاده کنید. ابتدا باید بررسی کنید که موارد زیر نصب شده باشند: .INDENT 0.0 .IP \(bu 2 Python نسخهٔ 3.9 تا 3.14 و pip. .IP \(bu 2 \fBlibxml\fP و \fBlibxslt\fP .IP \(bu 2 \fBzlib\fP .IP \(bu 2 Linux یا macOS. \fBسیستم‌عامل Windows پشتیبانی نمی‌شود\fP، گزارش شمارهٔ #535 را در \% ببینید\&. .UNINDENT .sp در سیستم‌های Linux، استفاده از مدیر بستهٔ توزیع بهترین راه برای انجام این کار است، برای مثال در Ubuntu: .INDENT 0.0 .INDENT 3.5 .sp .EX sudo apt\-get install libxml2 libxslt1.1 zlib1g python3 .EE .UNINDENT .UNINDENT .sp سپس چندین گزینه پیش رو دارید. ضمناً متن زیر برای بیشتر نرم‌افزارهای Python صدق می‌کند. .SS "ابزار pipx: روش تمیز و آسان" .sp ابزار pipx \% یک مدیر بستهٔ جدید برای نرم‌افزارهای مبتنی بر Python است که به‌طور خودکار برای هر برنامه‌ای که نصب می‌کند یک محیط مجازی ایجاد می‌نماید. لطفاً توجه داشته باشید که نصب از طریق pipx شامل صفحات راهنما (man pages) یا سرویس‌های systemd نخواهد بود. .sp ابزار pipx برنامهٔ vdirsyncer را در مسیر \fB~/.local/pipx/venvs/vdirsyncer\fP نصب خواهد کرد. .sp با فرض اینکه pipx نصب شده است، vdirsyncer را می‌توان با دستور زیر نصب کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX pipx install vdirsyncer .EE .UNINDENT .UNINDENT .sp بعداً می‌توان آن را با دستور زیر به آخرین نسخه به‌روزرسانی کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX pipx upgrade vdirsyncer .EE .UNINDENT .UNINDENT .sp و با این دستور می‌توان آن را حذف کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX pipx uninstall vdirsyncer .EE .UNINDENT .UNINDENT .sp این دستور آخر، vdirsyncer و تمام وابستگی‌های نصب‌شده در مکان فوق را حذف خواهد کرد..SS روش کثیف، اما آسان .sp اگر pipx روی توزیع شما در دسترس نیست، ساده‌ترین راه برای نصب vdirsyncer در این مرحله اجرای دستور زیر است: .INDENT 0.0 .INDENT 3.5 .sp .EX pip install \-\-ignore\-installed vdirsyncer .EE .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 گزینهٔ \fB\-\-ignore\-installed\fP برای دور زدن بسته‌های احتمالاً معیوب دبیان (Debian) است (خطاهای ImportError مرتبط با Requests را در \%<#\:debian-urllib3> ببینید). .UNINDENT .sp با این حال این روش یک نقص عمده دارد: Pip فایل‌هایی را که نصب می‌کند ردگیری نمی‌کند. فایل‌های vdirsyncer در جایی درون \fB~/.local/lib/python*\fP قرار خواهند گرفت، اما اگر تصمیم به حذف آن بگیرید، به هیچ وجه نمی‌توانید بدانید کدام بسته‌ها به عنوان وابستگی‌های vdirsyncer نصب شده‌اند و کدام‌ها نصب نشده‌اند. به عبارت دیگر، استفاده از pip به این شکل دایرکتوری خانگی شما را آلوده می‌کند. .SS روش تمیز، اما سخت .sp راهی برای نصب نرم‌افزارهای پایتون بدون پراکنده کردن فایل‌ها در سراسر سیستم‌فایل شما وجود دارد: virtualenv \%\&. منابع زیادی دربارهٔ نحوهٔ استفاده از آن وجود دارد، ساده‌ترین حالت ممکن چیزی شبیه به این خواهد بود: .INDENT 0.0 .INDENT 3.5 .sp .EX virtualenv ~/vdirsyncer_env ~/vdirsyncer_env/bin/pip install vdirsyncer alias vdirsyncer=\(dq~/vdirsyncer_env/bin/vdirsyncer\(dq .EE .UNINDENT .UNINDENT .sp شما باید خط آخر را در \fB\&.bashrc\fP یا \fB\&.bash_profile\fP خود قرار دهید. .sp این روش دو مزیت دارد: .INDENT 0.0 .IP \(bu 2 همهٔ بسته‌های پایتون را به‌طور جداگانه و بدون اتکا به بسته‌های سیستم در \fB~/vdirsyncer_env/\fP نصب می‌کند. این کار مشکلات خاص سیستم‌عامل یا توزیع را دور می‌زند. .IP \(bu 2 برای حذف کامل vdirsyncer می‌توانید \fB~/vdirsyncer_env/\fP را حذف کنید. .UNINDENT .SH "آموزش (TUTORIAL)" .sp پیش از شروع، در نظر بگیرید که آیا واقعاً به vdirsyncer نیاز دارید \%<>\&. برای کاربردهای خاص، جایگزین‌های بهتری در دسترس است. .SS "نصب (Installation)" .sp بخش نصب \%<#\:installation>\& را ببینید. .SS "پیکربندی (Configuration)" .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 فایل config.example از مخزن پروژه \% شامل نسخه‌ای بسیار خلاصه از این پیکربندی است. .IP \(bu 2 در این مثال ما همگام‌سازی مخاطبین را راه‌اندازی می‌کنیم، اما همگام‌سازی تقویم نیز تقریباً به همین شکل کار می‌کند. تنها کافی است \fBtype = \(dqcarddav\(dq\fP را به \fBtype = \(dqcaldav\(dq\fP و \fBfileext = \(dq.vcf\(dq\fP را به \fBfileext = \(dq.ics\(dq\fP تغییر دهید. .IP \(bu 2 اگر چیزی مطابق برنامه پیش نرفت، نگاهی به صفحهٔ Known Problems \%<> بیندازید. .UNINDENT .UNINDENT .UNINDENT .sp به‌طور پیش‌فرض، vdirsyncer فایل پیکربندی خود را در مکان‌های زیر جستجو می‌کند: .INDENT 0.0 .IP \(bu 2 فایلی که متغیر محیطی \fBVDIRSYNCER_CONFIG\fP به آن اشاره می‌کند. .IP \(bu 2 \fB~/.vdirsyncer/config\fP\&. .IP \(bu 2 \fB$XDG_CONFIG_HOME/vdirsyncer/config\fP که معمولاً \fB~/.config/vdirsyncer/config\fP است. مشخصات XDG\-Basedir \% را ببینید. .UNINDENT .sp فایل پیکربندی باید با بخش general \%<#\:general-config> آغاز شود، که در آن تنها پارامتر الزامی \fBstatus_path\fP است. در ادامه یک نمونهٔ کمینه آمده است: .INDENT 0.0 .INDENT 3.5 .sp .EX [general] status_path = \(dq~/.vdirsyncer/status/\(dq .EE .UNINDENT .UNINDENT .sp پس از بخش general، ممکن است تعداد دلخواهی از \fIبخش‌های pair و storage\fP قرار گیرند. .sp در vdirsyncer، همگام‌سازی همیشه بین دو فضای ذخیره‌سازی انجام می‌شود. این فضاهای ذخیره‌سازی در بخش‌های storage تعریف می‌شوند \%<#\:storage-config>، و اینکه کدام جفت‌های ذخیره‌سازی در عمل باید همگام‌سازی شوند در بخش pair تعریف می‌گردد \%<#\:pair-config>\&. این ساختار از OfflineIMAP الگوبرداری شده است، جایی که فضاها repository و جفت‌ها account نامیده می‌شوند. .sp مثال زیر دفترچه‌های نشانی ownCloud را در \fB~/.contacts/\fP همگام‌سازی می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX [pair my_contacts] a = \(dqmy_contacts_local\(dq b = \(dqmy_contacts_remote\(dq collections = [\(dqfrom a\(dq, \(dqfrom b\(dq] [storage my_contacts_local] type = \(dqfilesystem\(dq path = \(dq~/.contacts/\(dq fileext = \(dq.vcf\(dq [storage my_contacts_remote] type = \(dqcarddav\(dq # We can simplify this URL here as well. In theory it shouldn\(aqt matter. url = \(dqhttps://owncloud.example.com/remote.php/carddav/\(dq username = \(dqbob\(dq password = \(dqasdf\(dq .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 پیکربندی سایر سرورها را می‌توان در بخش Servers \%<#\:supported-servers> یافت. .UNINDENT .UNINDENT .sp پس از اجرای \fBvdirsyncer discover\fP و \fBvdirsyncer sync\fP، دایرکتوری \fB~/.contacts/\fP شامل زیرپوشه‌هایی برای هر دفترچه نشانی خواهد بود، که هر یک به نوبهٔ خود شامل تعدادی فایل \fB\&.vcf\fP هستند که هر کدام حاوی یک مخاطب با قالب \fBVCARD\fP است. می‌توانید محتوای آن‌ها را تغییر دهید، موارد جدید اضافه کنید و برخی را حذف نمایید [1]، و پس از اجرای مجدد \fBvdirsyncer sync\fP، تغییرات شما با سرور CalDAV همگام خواهد شد. برای اطلاعات بیشتر، این روش از فضاهای ذخیره‌سازی \fBfilesystem\fP \%<#\:storage-filesystem> و \fBcarddav\fP \%<#\:storage-carddav> استفاده می‌کند. .sp با این حال، اگر مجموعه‌های جدیدی روی سرور ایجاد شوند، همگام‌سازی آن‌ها به‌طور خودکار شروع نخواهد شد [2]\&. در عوض باید \fBvdirsyncer discover\fP را دوباره اجرا کنید تا این فهرست مجدداً دریافت شود. .IP [1] 5 احتمالاً برای این کار می‌خواهید از یک برنامهٔ کمکی استفاده کنید \%<>\&. .IP [2] 5 زیرا مجموعه‌ها به ندرت اضافه می‌شوند، و بررسی این موضوع قبل از هر بار همگام‌سازی ارزش بار پردازشی اضافه را ندارد..SS "پیکربندی بیشتر (More Configuration)" .SS "رفع تعارض (Conflict resolution)" .sp اگر یک آیتم در هر دو طرف تغییر کند چه می‌شود؟ vdirsyncer چه کاری باید انجام دهد؟ در حال حاضر سه گزینه پیش‌بینی شده است: .INDENT 0.0 .IP 1. 3 vdirsyncer یک پیام خطا نمایش می‌دهد (پیش‌فرض)؛ .IP 2. 3 vdirsyncer یکی از نسخه‌ها را به جای دیگری انتخاب می‌کند؛ .IP 3. 3 vdirsyncer دستور انتخابی شما را اجرا می‌کند که وظیفه دارد دو نسخه متفاوت را ادغام کند. .UNINDENT .sp گزینه‌های ۲ و ۳ نیازمند افزودن پارامتر \fB\(dqconflict_resolution\(dq\fP به بخش pair هستند. گزینه ۲ نیازمند تعیین یکی از مقادیر \fB\(dqa wins\(dq\fP یا \fB\(dqb wins\(dq\fP برای این پارامتر است: .INDENT 0.0 .INDENT 3.5 .sp .EX [pair my_contacts] \&... conflict_resolution = \(dqb wins\(dq .EE .UNINDENT .UNINDENT .sp پیش‌تر نوشتیم که \fBb = \(dqmy_contacts_remote\(dq\fP، بنابراین هنگامی که vdirsyncer با شرایطی مواجه شود که یک آیتم در هر دو طرف تغییر کرده باشد، صرفاً آیتم محلی را با نسخه سرور بازنویسی می‌کند. .sp گزینه ۳ نیازمند تعیین آرایه‌ای به عنوان مقدار \fB\(dqconflict_resolution\(dq\fP است که با \fB\(dqcommand\(dq\fP آغاز شده و شامل مسیرها و آرگومان‌های یک دستور باشد. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX [pair my_contacts] \&... conflict_resolution = [\(dqcommand\(dq, \(dqvimdiff\(dq] .EE .UNINDENT .UNINDENT .sp در این مثال، \fBvimdiff \fP فراخوانی خواهد شد که در آن \fB\fP و \fB\fP دو فایل موقت شامل فایل‌های دارای تعارض هستند. فایل‌ها باید در زمان پایان و بازگشت دستور دقیقاً یکسان شده باشند. با افزودن عناصر بیشتر به آرایه، می‌توان آرگومان‌های بیشتری را به دستور ارسال کرد. .sp برای مستندات مرجع، به Pair Section \%<#\:pair-config> مراجعه کنید. .SS "همگام‌سازی فراداده (Metadata synchronization)" .sp افزون بر آیتم‌ها، vdirsyncer همچنین می‌تواند فراداده‌هایی مانند نام «کاربرپسند» دفترچه مخاطبین یا تقویم (که در ساختار داخلی \(dqdisplayname\(dq نامیده می‌شود) یا رنگ مرتبط با یک تقویم را همگام‌سازی کند. به منظور شرح این قابلیت، بیایید به سراغ یک مثال پایهٔ دیگر برویم. این بار تقویم‌ها را همگام‌سازی می‌کنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX [pair my_calendars] a = \(dqmy_calendars_local\(dq b = \(dqmy_calendars_remote\(dq collections = [\(dqfrom a\(dq, \(dqfrom b\(dq] metadata = [\(dqcolor\(dq] [storage my_calendars_local] type = \(dqfilesystem\(dq path = \(dq~/.calendars/\(dq fileext = \(dq.ics\(dq [storage my_calendars_remote] type = \(dqcaldav\(dq url = \(dqhttps://owncloud.example.com/remote.php/caldav/\(dq username = \(dqbob\(dq password = \(dqasdf\(dq .EE .UNINDENT .UNINDENT .sp برای شناسایی، دستور \fBvdirsyncer discover\fP را اجرا کنید. سپس می‌توانید از \fBvdirsyncer metasync\fP برای همگام‌سازی ویژگی \fBcolor\fP بین تقویم‌های محلی خود در \fB~/.calendars/\fP و ownCloud استفاده کنید. به صورت محلی، رنگ صرفاً در قالب فایلی به نام \fBcolor\fP درون پوشهٔ تقویم نمایش داده می‌شود..SS اطلاعات بیشتر درباره مجموعه‌ها .sp «مجموعه» (\(dqCollection\(dq) یک اصطلاح کلی برای دفترچه‌های نشانی و تقویم‌ها است. یک سرور Carddav یا Caldav می‌تواند شامل چندین «مجموعه» باشد که با چندین دفترچه نشانی یا تقویم مطابقت دارند. .sp هر مجموعه از یک مخزن (storage) دارای یک «نام مجموعه» (\(dqcollection name\(dq) است که شناسه‌ای یکتا برای هر مجموعه به‌شمار می‌رود. در مورد مخزن \fBfilesystem\fP \%<#\:storage-filesystem>\-storage، این مقدار نام پوشه‌ای است که بیانگر مجموعه است؛ در مورد مخازن DAV، این مقدار آخرین بخش URL می‌باشد. ما از این شناسه در پارامتر \fBcollections\fP در بخش \fBpair\fP استفاده می‌کنیم. .sp این شناسه حتی اگر تقویم خود را در هر واسط کاربری تغییر نام دهید عوض نمی‌شود، زیرا آن کار تنها ویژگی اصطلاحاً \(dqdisplayname\(dq [3]\& را تغییر می‌دهد. در برخی سرورها (مانند iCloud یا Google) این شناسه به‌صورت تصادفی تولید می‌شود و هیچ ارتباطی با نام نمایشی (displayname) انتخابی شما ندارد. .IP [3] 5 که می‌توانید آن را نیز با \fBmetasync\fP و با استفاده از \fBmetadata = [\(dqdisplayname\(dq]\fP همگام‌سازی کنید\&. .sp سه نام مجموعه وجود دارند که معنای خاصی دارند: .INDENT 0.0 .IP \(bu 2 \fB\(dqfrom a\(dq\fP، \fB\(dqfrom b\(dq\fP: جای‌بانی برای تمام مجموعه‌هایی که هنگام اجرای \fBvdirsyncer discover\fP در سمت A/B یافت می‌شوند\&. .IP \(bu 2 \fBnull\fP: پارامترهای داده‌شده به مخزن دقیق هستند و نیازی به کشف (discovery) ندارند. .UNINDENT .sp مورد آخر به کمی توضیح بیشتر نیاز دارد. این پیکربندی را فرض کنید که دو دایرکتوری از دفترچه‌های نشانی را همگام‌سازی می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX [pair foobar] a = \(dqfoo\(dq b = \(dqbar\(dq collections = [\(dqfrom a\(dq, \(dqfrom b\(dq] [storage foo] type = \(dqfilesystem\(dq fileext = \(dq.vcf\(dq path = \(dq./contacts_foo/\(dq [storage bar] type = \(dqfilesystem\(dq fileext = \(dq.vcf\(dq path = \(dq./contacts_bar/\(dq .EE .UNINDENT .UNINDENT .sp همان‌طور که قبلاً دیدیم، این کار تمام مجموعه‌های موجود در \fB\&./contacts_foo/\fP را با هر مجموعه هم‌نام در \fB\&./contacts_bar/\fP همگام‌سازی می‌کند\&. اگر مجموعه‌ای وجود داشته باشد که در یک سمت هست اما در سمت دیگر نیست، vdirsyncer خواهد پرسید که آیا آن پوشه در سمت دیگر ایجاد شود یا خیر. .sp اگر مقدار \fBcollections = null\fP را تنظیم کنیم، با \fB\&./contacts_foo/\fP و \fB\&./contacts_bar/\fP دیگر به‌عنوان پوشه‌های حاوی مجموعه‌ها رفتار نمی‌شود، بلکه خودشان به‌عنوان مجموعه در نظر گرفته می‌شوند. این بدان معناست که \fB\&./contacts_foo/\fP و \fB\&./contacts_bar/\fP مستقیماً شامل فایل‌های \fB\&.vcf\fP خواهند بود، نه زیرپوشه‌هایی که شامل فایل‌های \fB\&.vcf\fP هستند. .sp این قابلیت در شرایطی مفید است که برای مثال، فهرست‌کردن تمام مجموعه‌ها به دلیل عدم پشتیبانی سرور DAV شما با شکست مواجه می‌شود. در این حالت، می‌توانید \fBurl\fP مخزن \fBcarddav\fP \%<#\:storage-carddav>\- یا \fBcaldav\fP \%<#\:storage-caldav>\-storage خود را روی نشانی‌ای تنظیم کنید که مستقیماً به مجموعه CalDAV/CardDAV شما اشاره می‌کند. .sp توجه داشته باشید که همه مخازن از مجموعه \fBnull\fP پشتیبانی نمی‌کنند؛ به عنوان مثال \fBgoogle_contacts\fP \%<#\:storage-google_contacts> و \fBgoogle_calendar\fP \%<#\:storage-google_calendar> از آن پشتیبانی نمی‌کنند. .SS پیکربندی پیشرفته مجموعه‌ها (همگام‌سازی سرور به سرور) .sp مثال‌های بالا در صورتی که بخواهید یک سرور دوردست را با یک دیسک از قبل خالی همگام‌سازی کنید، به اندازه کافی مناسب هستند. با این حال، زمانی که دو سرور با مجموعه‌هایی \fIاز قبل موجود\fP داشته باشید که می‌خواهید آن‌ها را با یکدیگر همگام کنید، به ترفندهای بیشتری نیاز است. .sp مشکل اصلی در این شرایط این است که vdirsyncer به‌طور پیش‌فرض مجموعه‌ها را بر اساس نام مجموعه جفت می‌کند (تعریف آن در بخش قبل را ببینید، اساساً یک نام پوشه یا یک UUID از راه دور). هنگامی که دو سرور دارید، این نام‌های مجموعه ممکن است به این زیبایی با یکدیگر تطابق نداشته باشند. فرض کنید دو تقویم با نام \(dqTest\(dq ایجاد کرده‌اید، یکی روی سرور NextCloud و دیگری روی iCloud، با استفاده از واسط‌های وب مربوط به هرکدام. نشانی‌های وب چیزی شبیه به این خواهند بود: .INDENT 0.0 .INDENT 3.5 .sp .EX NextCloud: https://example.com/remote.php/dav/calendars/user/test iCloud: https://p\-XX.caldav.icloud.com/YYY/calendars/3b4c9995\-5c67\-4021\-9fa0\-be4633623e1c .EE .UNINDENT .UNINDENT .sp این‌ها دو مجموعه تقویم DAV هستند. نام‌های مجموعه آن‌ها به ترتیب \fBtest\fP و \fB3b4c9995\-5c67\-4021\-9fa0\-be4633623e1c\fP خواهد بود، بنابراین نام واحدی ندارید که بتوانید با آن به هر دوی آن‌ها اشاره کنید. شما باید به‌صورت دستی این مجموعه‌ها را به این صورت «جفت» (pair) کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [pair doublecloud] a = \(dqmy_nextcloud\(dq b = \(dqmy_icloud\(dq collections = [[\(dqmytest\(dq, \(dqtest\(dq, \(dq3b4c9995\-5c67\-4021\-9fa0\-be4633623e1c\(dq]] .EE .UNINDENT .UNINDENT .sp نام \fBmytest\fP به این ترکیب از تقویم‌ها یک نام مناسب می‌دهد که می‌توانید هنگام اشاره به آن استفاده کنید، بنابراین می‌توانید از \fBvdirsyncer sync doublecloud/mytest\fP استفاده کنید تا بگویید: \(dqفقط این دو مخزن را همگام‌سازی کن، و نه چیز دیگری که ممکن است پیکربندی شده باشد\(dq. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 چرا از displaynameها استفاده نکنیم؟ .sp ممکن است این پرسش برایتان پیش بیاید که چرا vdirsyncer نتوانست خودش این موضوع را تشخیص دهد؟ به هر حال، شما هر دو مجموعه را \(dqTest\(dq نام‌گذاری کرده‌اید (که \(dqdisplayname\(dq نامیده می‌شود)، پس چرا مجموعه‌ها بر اساس این مقدار جفت نمی‌شوند؟ .sp چند مشکل در رابطه با این ایده وجود دارد: .INDENT 0.0 .IP \(bu 2 دو تقویم ممکن است دقیقاً displayname یکسانی داشته باشند. .IP \(bu 2 یک تقویم ممکن است فاقد displayname (غیرخالی) باشد. .IP \(bu 2 ممکن است displayname تغییر کند؛ چه به این دلیل که شما تقویم را تغییر نام دهید، چه به این دلیل که تقویم خود به دلیل تغییر تنظیمات زبان نامش را تغییر دهد. .UNINDENT .sp در نهایت، این ویژگی هیچ‌گاه برای تجزیه و پردازش توسط ماشین‌ها طراحی نشده است. .UNINDENT .UNINDENT.SH "اعتبارسنجی SSL و گواهی‌ها (SSL AND CERTIFICATE VALIDATION)" .sp تمام پیکربندی‌های SSL به‌ازای هر فضای ذخیره‌سازی انجام می‌شود. .SS "سنجاق کردن بر اساس اثر انگشت (Pinning by fingerprint)" .sp برای سنجاق کردن گواهی بر اساس اثر انگشت: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage foo] type = \(dqcaldav\(dq \&... verify_fingerprint = \(dq6D:83:EA:32:6C:39:BA:08:ED:EB:C9:BC:BE:12:BB:BF:0F:D9:83:00:CC:89:7E:C7:32:05:94:96:CA:C5:59:5E\(dq .EE .UNINDENT .UNINDENT .sp باید از اثر انگشت‌های SHA256 استفاده شود؛ الگوریتم‌های MD5 و SHA\-1 ناامن هستند و پشتیبانی نمی‌شوند. هنگام سنجاق کردن اثر انگشت، اعتبارسنجی CA غیرفعال می‌شود. .sp می‌توانید از دستور زیر برای دریافت اثر انگشت SHA256 استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX echo \-n | openssl s_client \-connect unterwaditzer.net:443 | openssl x509 \-noout \-fingerprint \-sha256 .EE .UNINDENT .UNINDENT .sp با این حال، لطفاً استفاده از Let\(aqs Encrypt \% را مد نظر قرار دهید تا نیازی به این کارها نباشد. دریافت و به‌کارگیری یک گواهی رایگان از آن‌ها بسیار آسان‌تر از پیکربندی تک‌تک کلاینت‌هایتان برای پذیرش گواهی خودامضا (self\-signed) است. .SS "مراجع صدور گواهی ریشه سفارشی (Custom root CAs)" .sp برای هدایت vdirsyncer به مجموعه‌ای سفارشی از CAهای ریشه: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage foo] type = \(dqcaldav\(dq \&... verify = \(dq/path/to/cert.pem\(dq .EE .UNINDENT .UNINDENT .sp برنامه Vdirsyncer از کتابخانه aiohttp \% بهره می‌برد که به‌طور پیش‌فرض از .nf \(gassl.SSLContext https://docs.python.org/3/library/ssl.html#ssl.SSLContext\(ga_ .fi پیش‌فرض استفاده می‌کند. .sp مواردی وجود دارد که اعتبارسنجی گواهی با شکست مواجه می‌شود، حتی اگر بتوانید برای مثال از طریق مرورگر خود به‌راحتی به سرور دسترسی داشته باشید. این موضوع معمولاً نشان می‌دهد که نصب \fBpython\fP یا کتابخانه \fBaiohttp\fP شما به نحوی ناقص یا خراب است. در چنین مواردی، تعیین صریح \fBverify\fP یا \fBverify_fingerprint\fP همان‌طور که در بالا نشان داده شد، منطقی است. .SS "گواهی‌های کلاینت (Client Certificates)" .sp گواهی‌های کلاینت را می‌توان با پارامتر \fBauth_cert\fP مشخص کرد. اگر کلید و گواهی در یک فایل ذخیره شده باشند، مقدار آن می‌تواند یک رشته باشد: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage foo] type = \(dqcaldav\(dq \&... auth_cert = \(dq/path/to/certificate.pem\(dq .EE .UNINDENT .UNINDENT .sp اگر کلید و گواهی جدا از هم باشند، می‌توان از یک لیست استفاده کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage foo] type = \(dqcaldav\(dq \&... auth_cert = [\(dq/path/to/certificate.crt\(dq, \(dq/path/to/key.key\(dq] .EE .UNINDENT .UNINDENT.SH "ذخیره‌سازی گذرواژه‌ها (STORING PASSWORDS)" .sp تغییر یافته در نسخه 0.7.0: پیکربندی گذرواژه به‌طور کامل دگرگون شده است. .sp برنامه Vdirsyncer می‌تواند گذرواژه‌ها را از چندین منبع دیگر به‌جز فایل پیکربندی دریافت کند. .SS "دستور (Command)" .sp فرض کنید پیکربندی زیر را دارید: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage foo] type = \(dqcaldav\(dq url = ... username = \(dqfoo\(dq password = \(dqbar\(dq .EE .UNINDENT .UNINDENT .sp اما این‌که گذرواژه به‌صورت متن آشکار (cleartext) در فایل پیکربندی ذخیره شده است شما را نگران می‌کند. می‌توانید این‌گونه عمل کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage foo] type = \(dqcaldav\(dq url = ... username = \(dqfoo\(dq password.fetch = [\(dqcommand\(dq, \(dq~/get\-password.sh\(dq, \(dqmore\(dq, \(dqargs\(dq] .EE .UNINDENT .UNINDENT .sp می‌توانید نام کاربری را نیز به همین ترتیب دریافت کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage foo] type = \(dqcaldav\(dq url = ... username.fetch = [\(dqcommand\(dq, \(dq~/get\-username.sh\(dq] password.fetch = [\(dqcommand\(dq, \(dq~/get\-password.sh\(dq] .EE .UNINDENT .UNINDENT .sp یا در واقع هر نوع پارامتر دیگری در یک بخش storage. .sp همچنین می‌توانید دستور را به‌عنوان یک رشته برای اجرا در شل (shell) ارسال کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage foo] \&... password.fetch = [\(dqshell\(dq, \(dq~/.local/bin/get\-my\-password | head \-n1\(dq] .EE .UNINDENT .UNINDENT .sp به‌عنوان مثال با pass \%، ممکن است بخواهید چیزی شبیه به این را در فایل پیکربندی خود بنویسید: .INDENT 0.0 .INDENT 3.5 .sp .EX password.fetch = [\(dqcommand\(dq, \(dqpass\(dq, \(dqcaldav\(dq] .EE .UNINDENT .UNINDENT .SS "دسترسی به جاکلیدی سیستم (Accessing the system keyring)" .sp همان‌طور که در بالا نشان داده شد، می‌توانید از راهبرد \fBcommand\fP برای دریافت اعتبارنامه‌های خود از منابع دلخواه استفاده کنید. یک مورد استفاده بسیار رایج، دریافت گذرواژه از جاکلیدی سیستم است. .sp بسته پایتون keyring \% شامل یک ابزار خط فرمانی برای دریافت گذرواژه‌ها از مخزن گذرواژه سیستم‌عامل است. نصب: .INDENT 0.0 .INDENT 3.5 .sp .EX pip install keyring .EE .UNINDENT .UNINDENT .sp کاربرد پایه: .INDENT 0.0 .INDENT 3.5 .sp .EX password.fetch = [\(dqcommand\(dq, \(dqkeyring\(dq, \(dqget\(dq, \(dqexample.com\(dq, \(dqfoouser\(dq] .EE .UNINDENT .UNINDENT.SS "درخواست گذرواژه (Password Prompt)" .sp همچنین می‌توانید به سادگی گذرواژه را به صورت تعاملی درخواست کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage foo] type = \(dqcaldav\(dq username = \(dqmyusername\(dq password.fetch = [\(dqprompt\(dq, \(dqPassword for CalDAV\(dq] .EE .UNINDENT .UNINDENT .SS "متغیر محیطی (Environment variable)" .sp برای خواندن گذرواژه از یک متغیر محیطی: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage foo] type = \(dqcaldav\(dq username = \(dqmyusername\(dq password.fetch = [\(dqcommand\(dq, \(dqprintenv\(dq, \(dqDAV_PW\(dq] .EE .UNINDENT .UNINDENT .sp این روش به‌ویژه زمانی کارآمد است که از یک گذرواژه چندین بار استفاده می‌کنید (به عنوان مثال، برای یک فضای ذخیره‌سازی CardDAV و یک CalDAV). در bash، می‌توانید بدون چاپ گذرواژه روی صفحه، آن را خوانده و export کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX read \-s DAV_PW \(dqDAV Password: \(dq && export DAV_PW .EE .UNINDENT .UNINDENT .SH "همگام‌سازی با فضاهای ذخیره‌سازی فقط‌خواندنی (SYNCING WITH READ-ONLY STORAGES)" .sp اگر می‌خواهید در یک تقویم عمومی و فقط‌خواندنی WebCAL \% مشترک شوید، اما نه سرور شما و نه برنامه‌های تقویمتان از آن پشتیبانی نمی‌کنند (یا پشتیبانی ناقصی دارند)، می‌توان از vdirsyncer برای همگام‌سازی چنین تقویم عمومی \fBA\fP با یک تقویم جدید \fBB\fP از خودتان و به‌روز نگه داشتن \fBB\fP استفاده کرد. .SS "گام ۱: ایجاد تقویم مقصد (Step 1: Create the target calendar)" .sp ابتدا باید تقویمی را ایجاد کنید که می‌خواهید تقویم WebCAL را با آن همگام‌سازی نمایید. بیشتر سرورها یک رابط تحت وب برای این کار ارائه می‌دهند. سپس باید نشانی URL پروتکل CalDAV تقویم خود را یادداشت کنید. توجه داشته باشید که این URL باید مستقیماً به تقویمی که تازه ایجاد کرده‌اید اشاره کند؛ به این معنی که برای هر تقویمی که دارید، یک نشانی اختصاصی خواهید داشت. .SS "گام ۲: ایجاد پیکربندی (Step 2: Creating the config)" .sp این تنظیمات را در پیکربندی vdirsyncer خود قرار دهید: .INDENT 0.0 .INDENT 3.5 .sp .EX [pair holidays] a = \(dqholidays_public\(dq b = \(dqholidays_private\(dq collections = null [storage holidays_public] type = \(dqhttp\(dq # The URL to your iCalendar file. url = \(dq...\(dq [storage holidays_private] type = \(dqcaldav\(dq # The direct URL to your calendar. url = \(dq...\(dq # The credentials to your CalDAV server username = \(dq...\(dq password = \(dq...\(dq .EE .UNINDENT .UNINDENT .sp سپس \fBvdirsyncer discover holidays\fP و \fBvdirsyncer sync holidays\fP را اجرا کنید؛ تقویمی که پیش‌تر ایجاد کرده بودید باید با رویدادها پر شود..SS "گام ۳: پارامتر partial_sync" .sp در نسخهٔ 0.14 اضافه شد. .sp ممکن است در شرایطی قرار بگیرید که بخواهید برخی رویدادها را از تقویم \fBholidays\fP خود پنهان کرده یا تغییر دهید. اگر در این مرحله چنین کاری انجام دهید، متوجه خواهید شد که vdirsyncer پس از چند بار اجرای \fBsync\fP\& تمام تغییرات اعمال‌شده توسط شما را بازگردانی (revert) خواهد کرد. دلیل این امر آن است که vdirsyncer می‌خواهد همه‌چیز را همگام نگه دارد، و از آنجا که دسترسی‌های لازم برای اعمال تغییرات در تقویم عمومی تعطیلات (public holidays\-calendar) را ندارد، نمی‌تواند تغییرات را در آن همگام‌سازی کند. .sp برای چنین اهدافی می‌توانید پارامتر \fBpartial_sync\fP را روی \fBignore\fP تنظیم کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [pair holidays] a = \(dqholidays_public\(dq b = \(dqholidays_private\(dq collections = null partial_sync = ignore .EE .UNINDENT .UNINDENT .sp برای اطلاعات بیشتر، مستندات پیکربندی \%<#\:partial-sync-def> را ببینید. .SH "راهنمای جامع پیکربندی (FULL CONFIGURATION MANUAL)" .sp برنامهٔ vdirsyncer برای ذخیرهٔ پیکربندی خود از قالبی شبیه به ini استفاده می‌کند. تمام مقادیر در قالب JSON هستند؛ مقادیر نامعتبر JSON به‌صورت رشته (string) تفسیر خواهند شد: .INDENT 0.0 .INDENT 3.5 .sp .EX x = \(dqfoo\(dq # String x = foo # Shorthand for same string x = 42 # Integer x = [\(dqa\(dq, \(dqb\(dq, \(dqc\(dq] # List of strings x = true # Boolean x = false x = null # Also known as None .EE .UNINDENT .UNINDENT .SS "بخش عمومی (General Section)" .INDENT 0.0 .INDENT 3.5 .sp .EX [general] status_path = ... .EE .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 \fBstatus_path\fP: دایرکتوری‌ای که vdirsyncer برخی داده‌های اضافی را برای همگام‌سازی بعدی در آن ذخیره می‌کند. .sp این داده‌ها برای تشخیص این موضوع لازم است که آیا یک آیتم جدید به این معناست که در یک طرف اضافه شده یا در طرف دیگر حذف شده است. مسیرهای نسبی نسبت به دایرکتوری فایل پیکربندی تفسیر خواهند شد. .sp برای مشاهدهٔ جزئیات آنچه دقیقاً در آنجا قرار دارد، مقالهٔ «الگوریتم همگام‌سازی ساده» را در \% ببینید. .UNINDENT .SS "بخش جفت (Pair Section)" .INDENT 0.0 .INDENT 3.5 .sp .EX [pair pair_name] a = ... b = ... #collections = null #conflict_resolution = null .EE .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 نام‌های جفت (Pair names) می‌توانند از هر نویسهٔ الفبایی\-عددی و خط زیرین (underscore) تشکیل شوند. .IP \(bu 2 \fBa\fP و \fBb\fP با استفاده از نام‌هایشان، به فضاهای ذخیره‌سازی جهت همگام‌سازی ارجاع می‌دهند. .IP \(bu 2 \fBcollections\fP: فهرستی از مجموعه‌ها (collections) برای همگام‌سازی در زمان اجرای \fBvdirsyncer sync\fP\&. همچنین «اطلاعات بیشتر دربارهٔ مجموعه‌ها» را در \%<#\:collections-tutorial>\& ببینید. .sp مقادیر ویژهٔ \fB\(dqfrom a\(dq\fP و \fB\(dqfrom b\(dq\fP به vdirsyncer می‌گویند که کشف خودکار (autodiscovery) را روی یک فضای ذخیره‌سازی مشخص امتحان کند. این به معنای تمام مجموعه‌های سمت A / سمت B است. .sp اگر مجموعه‌ای که می‌خواهید همگام‌سازی کنید در هر دو طرف نام یکسانی ندارد، می‌توانید از مقداری به شکل \fB[\(dqconfig_name\(dq, \(dqname_a\(dq, \(dqname_b\(dq]\fP استفاده کنید. این کار مجموعهٔ \fBname_a\fP در سمت A را با مجموعهٔ \fBname_b\fP در سمت B همگام‌سازی می‌کند. از \fBconfig_name\fP برای نمایش در آرگومان‌های CLI و ثبت رخدادها (logging) استفاده خواهد شد. .sp مثال‌ها: .INDENT 2.0 .IP \(bu 2 مقدار \fBcollections = [\(dqfrom b\(dq, \(dqfoo\(dq, \(dqbar\(dq]\fP باعث می‌شود vdirsyncer تمام مجموعه‌های سمت B و همچنین مجموعه‌های با نام \(dqfoo\(dq و \(dqbar\(dq را همگام‌سازی کند. .IP \(bu 2 مقدار \fBcollections = [\(dqfrom b\(dq, \(dqfrom a\(dq]\fP باعث می‌شود vdirsyncer تمام مجموعه‌های موجود در هر دو طرف را همگام‌سازی کند. .IP \(bu 2 مقدار \fBcollections = [[\(dqbar\(dq, \(dqbar_a\(dq, \(dqbar_b\(dq], \(dqfoo\(dq]\fP باعث می‌شود vdirsyncer مجموعهٔ \fBbar_a\fP از سمت A را با \fBbar_b\fP از سمت B، و همچنین مجموعهٔ \fBfoo\fP را در هر دو طرف با یکدیگر همگام‌سازی نماید. .UNINDENT .IP \(bu 2 \fBconflict_resolution\fP: اختیاری است؛ نحوهٔ مدیریت تداخل‌ها (conflicts) را مشخص می‌کند. تداخل زمانی رخ می‌دهد که یک آیتم (رویداد، وظیفه) از زمان آخرین همگام‌سازی، در هر دو طرف تغییر کرده باشد. همچنین «حل تداخل» را در \%<#\:conflict-resolution-tutorial>\& ببینید. .sp مقادیر معتبر عبارتند از: .INDENT 2.0 .IP \(bu 2 \fBnull\fP، که در آن یک خطا نمایش داده شده و هیچ تغییری اعمال نمی‌شود. .IP \(bu 2 \fB\(dqa wins\(dq\fP و \fB\(dqb wins\(dq\fP، که در آن کل آیتم از یک طرف برداشته می‌شود. .IP \(bu 2 \fB[\(dqcommand\(dq, \(dqvimdiff\(dq]\fP: دستور \fBvimdiff \fP فراخوانی خواهد شد که در آن \fB\fP و \fB\fP فایل‌های موقتی هستند که به ترتیب شامل آیتم هر یک از طرف‌ها می‌باشند. فایل‌ها باید در هنگام بازگشت دستور کاملاً یکسان باشند. .INDENT 2.0 .IP \(bu 2 \fBvimdiff\fP را می‌توان با هر دستور دیگری جایگزین کرد. برای مثال، در POSIX مقدار \fB[\(dqcommand\(dq, \(dqcp\(dq]\fP معادل با \fB\(dqa wins\(dq\fP است. .IP \(bu 2 آیتم‌های اضافی فهرست، به‌عنوان آرگومان ارسال خواهند شد. برای مثال، \fB[\(dqcommand\(dq, \(dqvimdiff\(dq, \(dq\-\-noplugin\(dq]\fP دستور \fBvimdiff \-\-noplugin\fP را اجرا می‌کند. .UNINDENT .UNINDENT .sp برنامهٔ vdirsyncer هرگز تلاش نمی‌کند دو آیتم را «به‌طور خودکار ادغام» کند. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fBpartial_sync\fP: فرض کنید A فقط\-خواندنی (read\-only) است و B خیر. اگر آیتم‌ها را در B تغییر دهید، vdirsyncer نمی‌تواند تغییرات را در A همگام کند. در عوض چه باید رخ دهد؟ .INDENT 2.0 .IP \(bu 2 \fBerror\fP: یک خطا نمایش داده می‌شود. .IP \(bu 2 \fBignore\fP: تغییر نادیده گرفته می‌شود. با این حال: رویدادهای حذف‌شده در B در صورتی که در A به‌روزرسانی شوند، دوباره ظاهر خواهند شد. .IP \(bu 2 \fBrevert\fP (پیش‌فرض): تغییر در همگام‌سازی بعدی بازگردانی می‌شود. .UNINDENT .sp همچنین «همگام‌سازی با فضاهای ذخیره‌سازی فقط\-خواندنی» را در \%<#\:partial-sync-tutorial>\& ببینید. .IP \(bu 2 \fBmetadata\fP: کلیدهای متاداده‌ای که باید هنگام اجرای \fBvdirsyncer metasync\fP همگام‌سازی شوند. مثال: .INDENT 2.0 .INDENT 3.5 .sp .EX metadata = [\(dqcolor\(dq, \(dqdisplayname\(dq, \(dqdescription\(dq, \(dqorder\(dq] .EE .UNINDENT .UNINDENT .sp این کار ویژگی‌های زیر را همگام‌سازی می‌کند: .INDENT 2.0 .IP \(bu 2 color: \fBhttp://apple.com/ns/ical/:calendar\-color\fP .IP \(bu 2 displayname: \fBDAV:displayname\fP .IP \(bu 2 description: \fBCalDAV:calendar\-description\fP و \fBCardDAV:addressbook\-description\fP .IP \(bu 2 order: \fBhttp://apple.com/ns/ical/:calendar\-order\fP .UNINDENT.sp پارامتر \fBconflict_resolution\fP برای این ویژگی‌ها نیز اعمال می‌شود. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fBimplicit\fP: فعال‌سازی ایجاد ضمنی مجموعه‌ها (collections). مثال: .INDENT 2.0 .INDENT 3.5 .sp .EX implicit = \(dqcreate\(dq .EE .UNINDENT .UNINDENT .sp هنگامی که روی \(dqcreate\(dq تنظیم شود، مجموعه‌های ناموجود به‌طور خودکار در طول همگام‌سازی و بدون پرسش از کاربر در هر دو طرف ایجاد می‌شوند. این امر جریان‌های کاری را که در آن‌ها همه مجموعه‌ها باید به‌صورت دوطرفه همگام‌سازی شوند، ساده می‌کند. .UNINDENT .SS بخش Storage .INDENT 0.0 .INDENT 3.5 .sp .EX [storage storage_name] type = ... .EE .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 نام‌های storage می‌توانند از هر نویسهٔ حرفی\-عددی و خط زیر (underscore) تشکیل شوند. .IP \(bu 2 \fBtype\fP مشخص می‌کند که چه نوع فضایی تعریف شده است. بخش Supported Storages را ببینید\&. .IP \(bu 2 \fBread_only\fP تعیین می‌کند که آیا فضای ذخیره‌سازی باید فقط‌خواندنی در نظر گرفته شود یا خیر. مقدار \fBtrue\fP به این معنی است که همگام‌سازی هرگونه تغییر ایجادشده در طرف دیگر را نادیده می‌گیرد. مقدار \fBfalse\fP به معنای همگام‌سازی عادی دوطرفه است. .IP \(bu 2 هر پارامتر دیگری به کلاس storage فرستاده می‌شود. .UNINDENT .SS فضاهای ذخیره‌سازی پشتیبانی‌شده (Supported Storages) .SS پروتکل‌های CalDAV و CardDAV .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 لطفاً بخش Servers \%<#\:supported-servers> را نیز ببینید، چرا که ممکن است برخی سرورها به‌خوبی کار نکنند. .UNINDENT .UNINDENT .INDENT 0.0 .TP .B caldav CalDAV. .INDENT 7.0 .INDENT 3.5 .sp .EX [storage example_for_caldav] type = \(dqcaldav\(dq #start_date = null #end_date = null #item_types = [] url = \(dq...\(dq #username = \(dq\(dq #password = \(dq\(dq #verify = /path/to/custom_ca.pem #auth = null #useragent = \(dqvdirsyncer/0.16.4\(dq #verify_fingerprint = null #auth_cert = null .EE .UNINDENT .UNINDENT .sp شما می‌توانید با استفاده از پارامترهای \fBstart_date\fP و \fBend_date\fP یک محدوده زمانی را برای همگام‌سازی تنظیم کنید\&. درون این پارامترها، می‌توانید از هر عبارت پایتونی برای برگرداندن یک شیء معتبر \fBdatetime.datetime\fP استفاده کنید. برای نمونه، کد زیر محدوده زمانی از یک سال پیش تا یک سال آینده را همگام می‌کند: .INDENT 7.0 .INDENT 3.5 .sp .EX start_date = \(dqdatetime.now() \- timedelta(days=365)\(dq end_date = \(dqdatetime.now() + timedelta(days=365)\(dq .EE .UNINDENT .UNINDENT .sp باید هر دو مشخص شوند یا هیچ‌کدام. پیش‌فرض، همگام‌سازی همه‌چیز است. .sp می‌توانید \fBitem_types\fP را برای محدود کردن \fIنوع آیتم‌های\fP مورد نظر جهت همگام‌سازی تنظیم کنید. برای مثال، اگر فقط می‌خواهید رویدادها را همگام‌سازی کنید (اما هیچ وظیفه‌ای (task) را از سرور بارگیری نکنید)، عبارت \fBitem_types = [\(dqVEVENT\(dq]\fP را تنظیم کنید\&. اگر می‌خواهید رویدادها و وظایف را همگام‌سازی کنید، اما برخی آیتم‌های \fBVJOURNAL\fP در سرور وجود دارند که نمی‌خواهید همگام شوند، از \fBitem_types = [\(dqVEVENT\(dq, \(dqVTODO\(dq]\fP استفاده کنید\&. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBstart_date\fP \-\- تاریخ شروع محدوده زمانی برای نمایش، پیش‌فرض \-inf است. .IP \(bu 2 \fBend_date\fP \-\- تاریخ پایان محدوده زمانی برای نمایش، پیش‌فرض +inf است. .IP \(bu 2 \fBitem_types\fP \-\- نوع آیتم‌ها برای نمایش. پیش‌فرض، فهرست خالی است که به معنی نمایش همه است. این ویژگی به قابلیت‌های خاص سرور بستگی دارد و نتایج اعتبارسنجی نمی‌شوند. .IP \(bu 2 \fBurl\fP \-\- نشانی URL پایه یا یک URL به تقویم. .IP \(bu 2 \fBusername\fP \-\- نام کاربری برای احراز هویت. .IP \(bu 2 \fBpassword\fP \-\- گذرواژه برای احراز هویت. .IP \(bu 2 \fBverify\fP \-\- اختیاری. مسیر محلی به گواهی خودامضاشدهٔ SSL. برای اطلاعات بیشتر SSL and certificate validation \%<#\:ssl-tutorial> را ببینید. .IP \(bu 2 \fBverify_fingerprint\fP \-\- اختیاری. اثرانگشت SHA256 گواهی مورد انتظار سرور. برای اطلاعات بیشتر SSL and certificate validation \%<#\:ssl-tutorial> را ببینید. .IP \(bu 2 \fBauth\fP \-\- اختیاری. یکی از مقادیر \fBbasic\fP، \fBdigest\fP یا \fBguess\fP\&. پیش‌فرض Basic auth پیش‌دستانه است که اطلاعات احراز هویت را حتی در صورت عدم درخواست سرور ارسال می‌کند. این کار از یک رفت‌وبرگشت اضافی در هر درخواست جلوگیری می‌کند. در صورتی که این مورد با سرور شما مشکلی ایجاد می‌کند، \fBguess\fP را تنظیم کنید. .IP \(bu 2 \fBauth_cert\fP \-\- اختیاری. مسیری به گواهی شامل گواهی کلاینت و کلید یا فهرستی از مسیرها به فایل‌های مربوط به آن‌ها. .IP \(bu 2 \fBuseragent\fP \-\- پیش‌فرض \fBvdirsyncer\fP است\&. .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B carddav CardDAV. .INDENT 7.0 .INDENT 3.5 .sp .EX [storage example_for_carddav] type = \(dqcarddav\(dq url = \(dq...\(dq #username = \(dq\(dq #password = \(dq\(dq #verify = /path/to/custom_ca.pem #auth = null #useragent = \(dqvdirsyncer/0.16.4\(dq #verify_fingerprint = null #auth_cert = null #use_vcard_4 = false .EE .UNINDENT .UNINDENT .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBurl\fP \-\- نشانی URL پایه یا یک URL به یک دفترچه نشانی (addressbook). .IP \(bu 2 \fBusername\fP \-\- نام کاربری برای احراز هویت. .IP \(bu 2 \fBpassword\fP \-\- گذرواژه برای احراز هویت. .IP \(bu 2 \fBverify\fP \-\- اختیاری. مسیر محلی به گواهی خودامضاشدهٔ SSL. برای اطلاعات بیشتر SSL and certificate validation \%<#\:ssl-tutorial> را ببینید. .IP \(bu 2 \fBverify_fingerprint\fP \-\- اختیاری. اثرانگشت SHA256 گواهی مورد انتظار سرور. برای اطلاعات بیشتر SSL and certificate validation \%<#\:ssl-tutorial> را ببینید. .IP \(bu 2 \fBauth\fP \-\- اختیاری. یکی از مقادیر \fBbasic\fP، \fBdigest\fP یا \fBguess\fP\&. پیش‌فرض Basic auth پیش‌دستانه است که اطلاعات احراز هویت را حتی در صورت عدم درخواست سرور ارسال می‌کند. این امر مانع از یک رفت‌وبرگشت اضافی در هر درخواست می‌شود. در صورتی که این مورد مشکلی برای سرور شما ایجاد می‌کند، \fBguess\fP را تنظیم کنید..IP \(bu 2 \fBauth_cert\fP \-\- اختیاری. یا مسیری به یک گواهی شامل گواهی کلاینت و کلید، یا فهرستی از مسیرها به فایل‌های حاوی آن‌ها. .IP \(bu 2 \fBuseragent\fP \-\- پیش‌فرض \fBvdirsyncer\fP\&. .IP \(bu 2 \fBuse_vcard_4\fP \-\- اینکه آیا سرور از vCard 4.0 استفاده می‌کند یا خیر. .UNINDENT .UNINDENT .UNINDENT .SS Google .sp برنامه Vdirsyncer از همگام‌سازی با تقویم‌های Google پشتیبانی می‌کند، با این محدودیت که فایل‌های \fBVTODO\fP توسط سرور رد می‌شوند. .sp همگام‌سازی با مخاطبین Google به دلیل غفلت در CardDAV API گوگل، قابلیت اطمینان کمتری دارد. \fBادعا شده است که پیاده‌سازی CardDAV گوگل از نظر امنیت داده‌ها یک فاجعه است\fP\&. برای جزئیات به این پست وبلاگ \% مراجعه کنید. همیشه از داده‌های خود نسخه پشتیبان تهیه کنید. .sp اشکال دیگر این است که برچسب‌های گروه در Google با ویژگی CATEGORIES در vCard \% همگام‌سازی نمی‌شوند (همچنین برای مرجع به شماره موضوع #814 \% و شماره موضوع بالادستی #36761530 \% مراجعه کنید) و ویژگی BDAY \% زمانی که تنها بخشی از اطلاعات تاریخ موجود باشد (برای مثال سال وجود نداشته باشد) همگام‌سازی نمی‌شود. .sp در اولین اجرا از شما خواسته می‌شود برنامه را برای دسترسی به حساب Google احراز هویت کنید. .sp برای استفاده از این نوع فضای ذخیره‌سازی، باید برخی وابستگی‌های اضافی را نصب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX pip install vdirsyncer[google] .EE .UNINDENT .UNINDENT .sp علاوه بر این، شما باید خودتان vdirsyncer را به عنوان یک برنامه ثبت کنید تا \fBclient_id\fP و \fBclient_secret\fP را دریافت نمایید، زیرا قرار دادن ثابت (hardcode) آن‌ها در نرم‌افزارهای متن‌باز خلاف شرایط خدمات Google است [googleterms] \%<#\:googleterms>: .INDENT 0.0 .IP 1. 3 به Google API Manager بروید \% .IP 2. 3 یک پروژه جدید با هر نام دلخواهی ایجاد کنید. .UNINDENT .INDENT 0.0 .IP 2. 3 درون آن پروژه، APIهای \(dqCalDAV\(dq و \(dqCardDAV\(dq را فعال کنید (\fBنه\fP APIهای Calendar و Contacts، چرا که آن‌ها متفاوت هستند و کار نخواهند کرد). باید یک جعبه جستجو وجود داشته باشد که بتوانید این عبارات را در آن وارد کنید. .IP 3. 3 در نوار کناری، \(dqCredentials\(dq، سپس \(dqCreate Credentials\(dq را انتخاب کرده و یک \(dqOAuth Client ID\(dq جدید بسازید. .sp ابتدا از شما خواسته می‌شود یک OAuth consent screen بسازید. آن فرم را به هر شکلی که مایلید پر کنید. .sp پس از راه‌اندازی صفحه رضایت (consent screen)، ایجاد \(dqOAuth Client ID\(aq جدید را به پایان برسانید. نوع برنامه صحیح، \(dqDesktop application\(dq است. .IP 4. 3 در نهایت باید یک Client ID و یک Client secret در اختیار داشته باشید. این موارد را در پیکربندی فضای ذخیره‌سازی خود وارد کنید. .UNINDENT .sp پارامتر \fBtoken_file\fP باید مسیری به فایلی باشد که vdirsyncer بتواند بعداً داده‌های مربوط به احراز هویت را در آن ذخیره کند. نیازی به ایجاد این فایل توسط خودتان یا نوشتن چیزی درون آن نیست. .IP [googleterms] 5 شرایط خدمات (ToS) \% را ببینید، بخش \(dqConfidential Matters\(dq. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 شما باید با استفاده از یک صفحه مخفی تنظیمات \%\& مشخص کنید که Google کدام تقویم‌ها را به vdirsyncer ارائه دهد. .UNINDENT .UNINDENT .INDENT 0.0 .TP .B google_calendar تقویم Google. .INDENT 7.0 .INDENT 3.5 .sp .EX [storage example_for_google_calendar] type = \(dqgoogle_calendar\(dq token_file = \(dq...\(dq client_id = \(dq...\(dq client_secret = \(dq...\(dq #start_date = null #end_date = null #item_types = [] .EE .UNINDENT .UNINDENT .sp لطفاً برای اطلاعات بیشتر درباره پارامترهای \fBitem_types\fP و بازه زمانی به \fBcaldav\fP مراجعه کنید. .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBtoken_file\fP \-\- مسیر فایلی که توکن‌های دسترسی در آن ذخیره می‌شوند. .IP \(bu 2 \fBclient_id/client_secret\fP \-\- اطلاعات احراز هویت OAuth، به‌دست‌آمده از Google API Manager. .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B google_contacts مخاطبین Google. .INDENT 7.0 .INDENT 3.5 .sp .EX [storage example_for_google_contacts] type = \(dqgoogle_contacts\(dq token_file = \(dq...\(dq client_id = \(dq...\(dq client_secret = \(dq...\(dq .EE .UNINDENT .UNINDENT .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBtoken_file\fP \-\- مسیر فایلی که توکن‌های دسترسی در آن ذخیره می‌شوند. .IP \(bu 2 \fBclient_id/client_secret\fP \-\- اطلاعات احراز هویت OAuth، به‌دست‌آمده از Google API Manager. .UNINDENT .UNINDENT .UNINDENT .sp فرآیند فعلی ایده‌آل نیست، اما Google رابط‌های برنامه‌نویسی قبلی مورد استفاده برای این کار را بدون ارائه جایگزینی مناسب منسوخ کرده است. برای گفتگو پیرامون این موضوع به شماره موضوع #975 \% مراجعه کنید..SS محلی (Local) .INDENT 0.0 .TP .B filesystem با مشخص کردن یک دایرکتوری، هر مورد را در فایل اختصاصی خودش ذخیره می‌کند. .INDENT 7.0 .INDENT 3.5 .sp .EX [storage example_for_filesystem] type = \(dqfilesystem\(dq path = \(dq...\(dq fileext = \(dq...\(dq #encoding = \(dqutf\-8\(dq #post_hook = null #pre_deletion_hook = null #fileignoreext = \(dq.tmp\(dq .EE .UNINDENT .UNINDENT .sp می‌تواند همراه با khal \%\& استفاده شود. برای توصیف رسمی‌تر این قالب، The Vdir Storage Format \%<> را ببینید. .sp دایرکتوری‌هایی که نامشان با نقطه آغاز می‌شود نادیده گرفته می‌شوند تا برای مثال استفاده از کنترل نسخه آسان‌تر شود. .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBpath\fP \-\- مسیر مطلق به یک vdir/مجموعه (collection). اگر این پارامتر در ترکیب با پارامتر \fBcollections\fP در بخش pair استفاده شود، در عوض باید به یک دایرکتوری از vdirها اشاره کند. .IP \(bu 2 \fBfileext\fP \-\- پسوند فایل مورد استفاده (برای نمونه \fB\&.txt\fP). در href گنجانده شده است، بنابراین اگر پسوند فایل را پس از همگام‌سازی تغییر دهید، باعث بارگیری مجدد همه چیز خواهد شد (اما \fIنباید\fP باعث هیچ نوع از دست رفتن داده‌ای شود). برای سازگاری با قالب \fBvset\fP باید از \fB\&.vcf\fP یا \fB\&.ics\fP استفاده کنید. توجه داشته باشید که اگر در اینجا از یک رشته خالی استفاده کنید، metasync کار نخواهد کرد. .IP \(bu 2 \fBencoding\fP \-\- کدگذاری فایل برای موارد، هم محتوا و هم نام فایل. .IP \(bu 2 \fBpost_hook\fP \-\- فرمانی برای اجرا به ازای ایجاد یا تغییر هر مورد. این فرمان به همراه مسیر فایل جدید/به‌روزشده فراخوانی خواهد شد. .IP \(bu 2 \fBpre_deletion_hook\fP \-\- فرمانی برای اجرا به ازای حذف هر مورد. این فرمان به همراه مسیر فایل حذف‌شده فراخوانی خواهد شد. .IP \(bu 2 \fBfileeignoreext\fP \-\- پسوند فایل برای نادیده گرفتن. این گزینه تنها در صورتی مفید است که fileext روی یک رشته خالی تنظیم شده باشد. مقدار پیش‌فرض \fB\&.tmp\fP است. .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B singlefile داده‌ها را در یک فایل محلی واحد \fB\&.vcf\fP یا \fB\&.ics\fP ذخیره می‌کند. .sp این فضای ذخیره‌سازی اساساً نحوه پیوند موارد در فایل را حدس می‌زند. .sp در نسخه 0.1.6 اضافه شد. .sp \fBنکته:\fP .INDENT 7.0 .INDENT 3.5 این فضای ذخیره‌سازی بسیار کُند است و بعید است این وضعیت تغییر کند. اگر با سناریوی کاربردی شما همخوانی دارد، باید استفاده از \fBfilesystem\fP را در نظر بگیرید. .UNINDENT .UNINDENT .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBpath\fP \-\- مسیر فایلی که باید در آن نوشته شود. در صورت استفاده از مجموعه‌ها، این مسیر باید شامل \fB%s\fP به عنوان یک جانگهدار برای نام مجموعه باشد. .IP \(bu 2 \fBencoding\fP \-\- این که فایل باید از چه کدگذاری استفاده کند. مقدار پیش‌فرض UTF\-8 است. .UNINDENT .UNINDENT .sp مثال برای همگام‌سازی با \fBcaldav\fP: .INDENT 7.0 .INDENT 3.5 .sp .EX [pair my_calendar] a = my_calendar_local b = my_calendar_remote collections = [\(dqfrom a\(dq, \(dqfrom b\(dq] [storage my_calendar_local] type = \(dqsinglefile\(dq path = ~/.calendars/%s.ics [storage my_calendar_remote] type = \(dqcaldav\(dq url = https://caldav.example.org #username = #password = .EE .UNINDENT .UNINDENT .sp مثال برای همگام‌سازی با \fBcaldav\fP با استفاده از یک مجموعه \fBnull\fP: .INDENT 7.0 .INDENT 3.5 .sp .EX [pair my_calendar] a = my_calendar_local b = my_calendar_remote [storage my_calendar_local] type = \(dqsinglefile\(dq path = ~/my_calendar.ics [storage my_calendar_remote] type = \(dqcaldav\(dq url = https://caldav.example.org/username/my_calendar #username = #password = .EE .UNINDENT .UNINDENT .UNINDENT.SS "فضاهای ذخیره‌سازی فقط‌خواندنی (Read\-only storages)" .sp این فضاهای ذخیره‌سازی از نوشتن روی آیتم‌های خود پشتیبانی نمی‌کنند، در نتیجه \fBread_only\fP به‌طور پیش‌فرض بر روی \fBtrue\fP تنظیم شده است. تغییر \fBread_only\fP به \fBfalse\fP در آن‌ها منجر به بروز خطا می‌شود. .INDENT 0.0 .TP .B http استفاده از یک فایل سادهٔ \fB\&.ics\fP (یا مشابه آن) از وب. تقویم‌های \fBwebcal://\fP باید با این مورد استفاده شوند، اما شما باید \fBwebcal://\fP را با \fBhttp://\fP، یا بهتر از آن با \fBhttps://\fP جایگزین کنید\&. .INDENT 7.0 .INDENT 3.5 .sp .EX [pair holidays] a = holidays_local b = holidays_remote collections = null [storage holidays_local] type = \(dqfilesystem\(dq path = ~/.config/vdir/calendars/holidays/ fileext = .ics [storage holidays_remote] type = \(dqhttp\(dq url = https://example.com/holidays_from_hicksville.ics #filter_hook = null .EE .UNINDENT .UNINDENT .sp بسیاری از ارائه‌دهندگان WebCAL شناسه‌های یکتای (UID) تمام مؤلفه‌های \fBVEVENT\fP را به‌صورت آنی (on\-the\-fly) تولید می‌کنند؛ یعنی هر بار که تقویم بارگیری می‌شود، همه UIDها تغییر می‌کنند. این امر باعث می‌شود بسیاری از برنامه‌های همگام‌سازی چنین برداشت کنند که تمام رویدادها حذف شده و موارد جدیدی ایجاد شده‌اند، و متعاقباً باعث بارگذاری‌ها و حذف‌های غیرضروری فراوانی در طرف دیگر می‌شود. Vdirsyncer شناسه‌های UID حاصل از \fBhttp\fP را کاملاً نادیده می‌گیرد و آن‌ها را با یک هش از محتوای استانداردسازی‌شده آیتم جایگزین می‌کند. .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBurl\fP \-\- نشانی اینترنتی (URL) فایل \fB\&.ics\fP. .IP \(bu 2 \fBusername\fP \-\- نام کاربری برای احراز هویت. .IP \(bu 2 \fBpassword\fP \-\- گذرواژه برای احراز هویت. .IP \(bu 2 \fBverify\fP \-\- اختیاری. مسیر محلی به یک گواهی SSL خودامضاشده. برای اطلاعات بیشتر، بخش اعتبارسنجی گواهی و SSL را ببینید: \%<#\:ssl-tutorial> .IP \(bu 2 \fBverify_fingerprint\fP \-\- اختیاری. اثر انگشت (fingerprint) از نوع SHA256 برای گواهی مورد انتظار سرور. برای اطلاعات بیشتر، بخش اعتبارسنجی گواهی و SSL را ببینید: \%<#\:ssl-tutorial> .IP \(bu 2 \fBauth\fP \-\- اختیاری. یکی از مقادیر \fBbasic\fP، \fBdigest\fP یا \fBguess\fP\&. پیش‌فرض Basic auth پیش‌دستانه است که اطلاعات احراز هویت را حتی در صورت درخواست نکردن سرور ارسال می‌کند. این کار از یک رفت‌وبرگشت (roundtrip) اضافه در هر درخواست جلوگیری می‌کند. در صورتی که این مورد با سرور شما مشکل ایجاد می‌کند، مقدار آن را روی \fBguess\fP قرار دهید. .IP \(bu 2 \fBauth_cert\fP \-\- اختیاری. یا مسیری به یک گواهی حاوی گواهی کلاینت و کلید، یا فهرستی از مسیرها به فایل‌های شامل آن‌ها. .IP \(bu 2 \fBuseragent\fP \-\- پیش‌فرض \fBvdirsyncer\fP است\&. .IP \(bu 2 \fBfilter_hook\fP \-\- اختیاری. یک دستور فیلتر برای فراخوانی به‌ازای هر آیتم دریافت‌شده، که به‌صورت خام به stdin ارسال شده و نتیجه را از طریق stdout بازمی‌گرداند. اگر هیچ خروجی توسط دستور فیلتر بازگردانده نشود، آیتم نادیده گرفته می‌شود. از این قابلیت می‌توان برای تغییر فیلدها در صورت نیاز هنگام کار با ارائه‌دهندگانی که رویدادهای ناقص یا ناصحیح تولید می‌کنند استفاده کرد. .UNINDENT .UNINDENT .UNINDENT .SH "آموزش‌های دیگر (OTHER TUTORIALS)" .sp بخش زیر شامل آموزش‌هایی است که صریحاً دربارهٔ هیچ‌یک از عملکردهای اصلی vdirsyncer نیستند. آن‌ها معمولاً نحوهٔ یکپارچه‌سازی vdirsyncer با نرم‌افزارهای شخص ثالث را نشان می‌دهند. به همین دلیل، ممکن است اطلاعات مربوط به آن نرم‌افزارها تنها برای نسخه‌های خاصی از آن‌ها صدق کند. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 لطفاً آموزش‌های خود را نیز مشارکت دهید \%<>! این صفحات معمولاً تنها ناقص (stub) هستند و مثال‌های جامعی ندارند. .UNINDENT .UNINDENT.SS برنامه‌های کلاینت .SS Vdirsyncer همراه با Claws Mail .sp پیش از هر چیز، Claws\-Mail فقط از قابلیت‌های \fBفقط‌خواندنی (read\-only)\fP برای vCardها پشتیبانی می‌کند. این برنامه تنها می‌تواند مخاطبین را بخواند، اما فاقد ویرایشگر است. .SS آماده‌سازی .sp ما باید vdirsyncer را نصب کنیم؛ برای این منظور به اینجا مراجعه کنید: \%<>\&. سپس باید چند پوشه ایجاد کنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX mkdir ~/.vdirsyncer mkdir ~/.contacts .EE .UNINDENT .UNINDENT .SS پیکربندی .sp اکنون پیکربندی را برای vdirsyncer ایجاد می‌کنیم. فایل \fB~/.vdirsyncer/config\fP را با یک ویرایشگر متن باز کنید. پیکربندی باید به این صورت باشد: .INDENT 0.0 .INDENT 3.5 .sp .EX [general] status_path = \(dq~/.vdirsyncer/status/\(dq [storage local] type = \(dqsinglefile\(dq path = \(dq~/.contacts/%s.vcf\(dq [storage online] type = \(dqcarddav\(dq url = \(dqCARDDAV_LINK\(dq username = \(dqUSERNAME\(dq password = \(dqPASSWORD\(dq read_only = true [pair contacts] a = \(dqlocal\(dq b = \(dqonline\(dq collections = [\(dqfrom a\(dq, \(dqfrom b\(dq] conflict_resolution = \(dqb wins\(dq .EE .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 در بخش general، مسیر پوشه وضعیت (status) را برای مجموعه‌های شناسایی‌شده و به‌طور کلی مواردی که باید بین دفعات همگام‌سازی حفظ شوند، تعیین می‌کنیم. .IP \(bu 2 در بخش local مشخص می‌کنیم که تمام مخاطبین باید در یک تک‌فایل همگام شوند و همچنین مسیر قرارگیری مخاطبین را تعیین می‌کنیم. .IP \(bu 2 در بخش online باید مقادیر url، username و password را مطابق با مشخصات خود تغییر دهید. ما همچنین این فضای ذخیره‌سازی را روی read\-only قرار می‌دهیم تا هیچ تغییری به سرور بازگردانده و همگام نشود. در هر صورت Claws\-Mail نباید قادر به اعمال هیچ تغییری باشد، اما این یک گام ایمنی بیشتر است تا در صورت خرابی فایل‌ها یا عملکرد غیرمنتظره vdirsyncer مشکلی پیش نیاید. اگر می‌خواهید قادر به ویرایش این فایل‌ها به‌صورت محلی باشید، می‌توانید این بخش را نادیده بگیرید. .IP \(bu 2 در بخش آخر پیکربندی می‌کنیم که در صورت بروز تداخل (conflict)، مخاطبین آنلاین اولویت داشته باشند (برنده شوند). این بخش را به هر شکل که مایلید تنظیم کنید؛ مقدار مناسب بستگی به این دارد که کدام سمت به احتمال زیاد به‌روزتر است. .UNINDENT .SS همگام‌سازی .sp اکنون مخاطبین خود را شناسایی و همگام‌سازی می‌کنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX vdirsyncer discover contacts vdirsyncer sync contacts .EE .UNINDENT .UNINDENT.SS Claws Mail .sp برنامه Claws\-Mail را باز کنید. به مسیر \fBTools\fP => \fBAddressbook\fP بروید\&. .sp روی \fBAddressbook\fP => \fBNew vCard\fP کلیک کنید\&. نامی برای دفترچه مخاطبین انتخاب نمایید\&. .sp سپس در پوشه \fB~/.contacts/\fP به دنبال vCard بگردید\&. روی ok کلیک کنید، تا مخاطبین خود را ببینید\&. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 برنامه Claws\-Mail تنها مخاطبینی را نشان می‌دهد که دارای نشانی رایانامه باشند\&. .UNINDENT .UNINDENT .SS Crontab .sp در پایان یک crontab ایجاد می‌کنیم تا vdirsyncer مخاطبین ما را به‌طور خودکار هر ۳۰ دقیقه همگام‌سازی کند: .INDENT 0.0 .INDENT 3.5 .sp .EX crontab \-e .EE .UNINDENT .UNINDENT .sp در انتهای آن فایل این خط را وارد کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX */30 * * * * /usr/local/bin/vdirsyncer sync > /dev/null .EE .UNINDENT .UNINDENT .sp و کار تمام است! .SS "اجرا به عنوان systemd.timer" .sp ابزار vdirsyncer شامل فایل‌های واحد (unit files) برای اجرا در بازه‌های زمانی مشخص (به‌طور پیش‌فرض هر ۵±۱۵ دقیقه) است\&. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این فایل‌ها هنگام نصب از طریق pip نصب نمی‌شوند و فقط همراه با بسته‌های توزیع ارائه می‌گردند\&. اگر برنامه را از طریق pip نصب کرده‌اید یا توزیع شما فایل‌های واحد systemd را ارائه نمی‌دهد، باید vdirsyncer.service \% و vdirsyncer.timer \% را در یکی از مسیرهای \fB/etc/systemd/user/\fP یا \fB~/.local/share/systemd/user\fP بارگیری نمایید\&. .UNINDENT .UNINDENT .SS فعال‌سازی .sp برای فعال‌سازی تایمر، کافی است دستور \fBsystemctl \-\-user enable vdirsyncer.timer\fP را اجرا کنید\&. جهت مشاهده لاگ‌های اجراهای پیشین، از \fBjournalctl \-\-user \-u vdirsyncer\fP استفاده کنید\&. .SS پیکربندی .sp کاملاً محتمل است که بازه زمانی پیش‌فرض \(dqهر پانزده دقیقه\(dq مطابق میل شما نباشد\&. هیچ پیش‌فرضی مناسب همگان نخواهد بود، اما این مورد با اجرای دستور زیر به‌سادگی قابل پیکربندی است: .INDENT 0.0 .INDENT 3.5 .sp .EX systemctl \-\-user edit vdirsyncer.timer .EE .UNINDENT .UNINDENT .sp این دستور یک ویرایشگر خالی باز می‌کند که در آن می‌توانید با افزودن خطوط زیر، تایمر را بازنویسی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX OnBootSec=5m # This is how long after boot the first run takes place. OnUnitActiveSec=15m # This is how often subsequent runs take place. .EE .UNINDENT .UNINDENT.SS Todoman .sp قالب iCalendar همچنین از ذخیره‌سازی وظایف در قالب ورودی‌های \fBVTODO\fP با همان پسوند فایل رویدادهای عادی پشتیبانی می‌کند: \fB\&.ics\fP\&. بسیاری از سرورهای CalDAV از همگام‌سازی وظایف پشتیبانی می‌کنند و vdirsyncer نیز همین‌طور است. .sp برنامه todoman \% یک مدیر وظیفه تحت خط فرمان (CLI) با پشتیبانی از vdir \%<>\& است. رابط کاربری آن شبیه به Taskwarrior یا برنامه خط فرمانی todo.txt است. می‌توانید \fBfilesystem\fP \%<#\:storage-filesystem> را به همراه آن به کار ببرید. .SS "راه‌اندازی vdirsyncer" .sp برای این آموزش از NextCloud استفاده خواهیم کرد. .sp با فرض داشتن چنین پیکربندی‌ای: .INDENT 0.0 .INDENT 3.5 .sp .EX [general] status_path = \(dq~/.vdirsyncer/status/\(dq [pair calendars] conflict_resolution = \(dqb wins\(dq a = \(dqcalendars_local\(dq b = \(dqcalendars_dav\(dq collections = [\(dqfrom b\(dq] metadata = [\(dqcolor\(dq, \(dqdisplayname\(dq] [storage calendars_local] type = \(dqfilesystem\(dq path = \(dq~/.calendars/\(dq fileext = \(dq.ics\(dq [storage calendars_dav] type = \(dqcaldav\(dq url = \(dqhttps://nextcloud.example.net/\(dq username = \(dq...\(dq password = \(dq...\(dq .EE .UNINDENT .UNINDENT .sp سپس دستور \fBvdirsyncer sync\fP تقویم‌های نمونه NextCloud \% شما را با زیرپوشه‌های \fB~/.calendar/\fP همگام‌سازی خواهد کرد. .SS "راه‌اندازی todoman" .sp این متن را در \fB~/.config/todoman/config.py\fP بنویسید: .INDENT 0.0 .INDENT 3.5 .sp .EX path = \(dq~/.calendars/*\(dq .EE .UNINDENT .UNINDENT .sp الگوی glob \% در \fBpath\fP با تمام زیرپوشه‌های درون \fB~/.calendars/\fP تطابق خواهد داشت، که دقیقاً همان فهرست‌های وظایف مدنظر ما است. اکنون می‌توانید همان‌گونه که در مستندات آن \% آمده است از \fBtodoman\fP استفاده کنید و برای همگام‌سازی تغییرات با NextCloud دستور \fBvdirsyncer sync\fP را اجرا نمایید. .SS "سایر کلاینت‌ها" .sp برنامه‌های کلاینت زیر نیز بر بستر CalDAV همگام‌سازی می‌کنند: .INDENT 0.0 .IP \(bu 2 برنامه Tasks موجود در iOS .IP \(bu 2 برنامه OpenTasks برای Android \% .IP \(bu 2 برنامه Tasks \% برای رابط کاربری وب NextCloud .UNINDENT .sp برنامه‌های بیشتر، با صفحه‌های ناموجود: .INDENT 0.0 .IP \(bu 2 برنامه khal \%، یک برنامه تقویم CLI با پشتیبانی از vdir \%<>\&. می‌توانید \fBfilesystem\fP \%<#\:storage-filesystem> را به همراه آن به کار ببرید. .IP \(bu 2 بسیاری از برنامه‌های تقویم گرافیکی مانند dayplanner \%، Orage \% یا rainlendar \% یک تقویم را در یک فایل منفرد \fB\&.ics\fP ذخیره می‌کنند. برای آن‌ها می‌توانید از \fBsinglefile\fP \%<#\:storage-singlefile> استفاده کنید. .IP \(bu 2 برنامه khard \%، یک دفترچه نشانی خط فرمانی با پشتیبانی از vdir \%<>\&. می‌توانید \fBfilesystem\fP \%<#\:storage-filesystem> را به همراه آن به کار ببرید. .IP \(bu 2 برنامه contactquery.c \%، برنامه‌ای کوچک که صریحاً برای پرس‌وجوی vdirها از mutt نوشته شده است. .IP \(bu 2 برنامه mates \%، یک دفترچه نشانی خط فرمانی با پشتیبانی از vdir \%<>\&. .IP \(bu 2 برنامه vdirel \%، دسترسی به مخاطبین vdir \%<> از طریق Emacs. .UNINDENT.SS سرورها (Servers) .SS Baikal .sp برنامهٔ Vdirsyncer به‌طور مداوم با آخرین نسخهٔ Baikal \%\& آزمایش می‌شود. .INDENT 0.0 .IP \(bu 2 برنامهٔ Baikal تا نسخهٔ \fB0.2.7\fP نیز از یک نسخهٔ قدیمی SabreDAV با همان مشکل ownCloud استفاده می‌کند؛ گزارش #160 \%\& را ببینید. این مشکل در نسخه‌های بعدی برطرف شده است. .UNINDENT .SS DavMail (Exchange, Outlook) .sp نرم‌افزار DavMail \% یک برنامهٔ پراکسی (پیشکار) است که امکان استفاده از کلاینت‌های Card\- و CalDAV را با Outlook فراهم می‌کند. این ابزار به شما اجازه می‌دهد از vdirsyncer به همراه Outlook استفاده کنید. .sp در عمل، میزان موفقیت شما با DavMail ممکن است بسیار متغیر باشد. بسته به سرور Exchange شما، ممکن است با انواع خطاهای عجیب‌وغریب (از جمله از دست رفتن داده‌ها) مواجه شوید. .sp \fBکاملاً مطمئن شوید که از آخرین نسخهٔ DavMail استفاده می‌کنید\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage outlook] type = \(dqcaldav\(dq url = \(dqhttp://localhost:1080/users/user@example.com/calendar/\(dq username = \(dquser@example.com\(dq password = \(dq...\(dq .EE .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 نسخه‌های قدیمی‌تر DavMail با URLها به‌صورت غیرحساس به حروف بزرگ و کوچک (case\-insensitively) رفتار می‌کنند. گزارش #144 \%\& را ببینید. .IP \(bu 2 برنامهٔ DavMail داده‌های معیوب و ناهنجار را در سرور Exchange بسیار ضعیف مدیریت می‌کند. در چنین مواردی، ابزار Calendar Checking Tool for Outlook \% ممکن است کمک‌کننده باشد. .IP \(bu 2 در برخی موارد، ممکن است خطاهایی دربارهٔ رویدادهای تکراری مشاهده کنید؛ چیزی شبیه به این: .INDENT 2.0 .INDENT 3.5 .sp .EX error: my_calendar/calendar: Storage \(dqmy_calendar_remote/calendar\(dq contains multiple items with the same UID or even content. Vdirsyncer will now abort the synchronization of this collection, because the fix for this is not clear; It could be the result of a badly behaving server. You can try running: error: error: vdirsyncer repair my_calendar_remote/calendar error: error: But make sure to have a backup of your data in some form. The offending hrefs are: [...] .EE .UNINDENT .UNINDENT .sp به‌منظور برطرف کردن این مورد، می‌توانید اسکریپت پاورشل Remove\-DuplicateAppointments.ps1 \% را که مایکروسافت برای حذف موارد تکراری ارائه داده است، امتحان کنید. .UNINDENT .SS FastMail .sp برنامهٔ Vdirsyncer به‌طور مداوم با FastMail \% آزمایش می‌شود؛ با تشکر از آن‌ها بابت ارائهٔ یک حساب رایگان برای این منظور. هیچ مشکل شناخته‌شده‌ای با آن وجود ندارد. صفحات پشتیبانی FastMail \% تنظیمات لازم برای استفاده را ارائه می‌دهند: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage cal] type = \(dqcaldav\(dq url = \(dqhttps://caldav.fastmail.com/\(dq username = \(dq...\(dq password = \(dq...\(dq [storage card] type = \(dqcarddav\(dq url = \(dqhttps://carddav.fastmail.com/\(dq username = \(dq...\(dq password = \(dq...\(dq .EE .UNINDENT .UNINDENT.SS Google .sp استفاده از vdirsyncer با Google Calendar از نسخهٔ 0.10 امکان‌پذیر است، اما مرتباً آزمایش نمی‌شود. می‌توانید از \fBgoogle_contacts\fP \%<#\:storage-google_contacts> و \fBgoogle_calendar\fP \%<#\:storage-google_calendar>\& استفاده کنید. .sp برای اطلاعات بیشتر، issue #202 \% و issue #8 \%\& را ببینید. .SS iCloud .sp ابزار vdirsyncer به‌طور منظم با iCloud \%\& آزمایش می‌شود. .INDENT 0.0 .INDENT 3.5 .sp .EX [storage cal] type = \(dqcaldav\(dq url = \(dqhttps://caldav.icloud.com/\(dq username = \(dq...\(dq password = \(dq...\(dq [storage card] type = \(dqcarddav\(dq url = \(dqhttps://contacts.icloud.com/\(dq username = \(dq...\(dq password = \(dq...\(dq .EE .UNINDENT .UNINDENT .sp مشکلات: .INDENT 0.0 .IP \(bu 2 ابزار vdirsyncer نمی‌تواند احراز هویت دومرحله‌ای (two\-factor auth) را با iCloud انجام دهد (به نظر نمی‌رسد راهی برای انجام احراز هویت دومرحله‌ای از طریق APIهای DAV وجود داشته باشد). در عوض باید از گذرواژه‌های مخصوص برنامه (app\-specific passwords) \% استفاده کنید. .IP \(bu 2 سرویس iCloud هنگام ایجاد مجموعه‌ها نیازمندی‌های خاصی دارد. در اصل vdirsyncer قادر به انجام آن است، اما توصیه می‌شود آن‌ها را از طریق یک کلاینت Apple (یا واسط وب iCloud) ایجاد کنید. .INDENT 2.0 .IP \(bu 2 سرویس iCloud حداقل طولی را برای نام‌های مجموعه الزامی می‌داند. .IP \(bu 2 تقویم‌های ایجادشده توسط vdirsyncer نمی‌توانند به‌عنوان فهرست وظایف (tasklists) استفاده شوند. .UNINDENT .UNINDENT .SS nextCloud .sp ابزار vdirsyncer به‌طور مداوم با آخرین نسخهٔ nextCloud \% آزمایش می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage cal] type = \(dqcaldav\(dq url = \(dqhttps://nextcloud.example.com/\(dq username = \(dq...\(dq password = \(dq...\(dq [storage card] type = \(dqcarddav\(dq url = \(dqhttps://nextcloud.example.com/\(dq .EE .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 اشتراک‌های WebCAL توسط vdirsyncer قابل شناسایی نیستند. این issue مرتبط را ببینید: \%\&. .UNINDENT .SS ownCloud .sp ابزار vdirsyncer به‌طور مداوم با آخرین نسخهٔ ownCloud \% آزمایش می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage cal] type = \(dqcaldav\(dq url = \(dqhttps://example.com/remote.php/dav/\(dq username = ... password = ... [storage card] type = \(dqcarddav\(dq url = \(dqhttps://example.com/remote.php/dav/\(dq username = ... password = ... .EE .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 \fIنسخه‌های قدیمی‌تر از 7.0.0:\fP سرویس ownCloud از SabreDAV استفاده می‌کند که در تشخیص تداخل‌ها و شرایط رقابتی (race\-conditions) مشکلاتی داشت. این مشکلات گزارش شده و در مخزن SabreDAV رفع شده‌اند، و اصلاحیهٔ متناظر نیز از نسخهٔ 7.0.0 در ownCloud اعمال شده است. برای اطلاعات بیشتر issue #16 \% را ببینید. .UNINDENT.SS Radicale .sp سرور Radicale \% بسیار سبک است؛ با این حال، استانداردهای CalDAV و CardDAV را به‌صورت عمدی به‌طور کامل پیاده‌سازی نمی‌کند، که ممکن است حتی با کلاینت‌های بسیار خوش‌ساخت نیز به بروز مشکلاتی بینجامد. فارغ از عدم انطباق آن با استانداردها، چندین مشکل دیگر در کیفیت کد و شیوهٔ نگهداری آن وجود دارد. به‌جای آن، استفاده از مواردی مانند Xandikos \%<> را در نظر بگیرید. .sp با این وجود، vdirsyncer به‌طور مداوم با نسخهٔ git و آخرین انتشار PyPI از Radicale آزمایش می‌شود. .INDENT 0.0 .IP \(bu 2 ابزار Vdirsyncer نمی‌تواند روی Radicale مجموعه (collection) ایجاد کند. .IP \(bu 2 سرور Radicale از بازه‌های زمانی در calendar\-query پروتکل CalDAV \% پشتیبانی نمی‌کند، بنابراین مقداردهی \fBstart_date\fP و \fBend_date\fP برای \fBcaldav\fP \%<#\:storage-caldav> هیچ اثری نداشته یا عواقب پیش‌بینی‌نشده‌ای خواهد داشت. .IP \(bu 2 نسخه‌های Radicale قدیمی‌تر از 0.9b1 هنگام پردازش پرس‌وجوهای منطبق با RFC برای تمام آیتم‌های یک مجموعه \%\& با شکست مواجه می‌شوند. .sp برای اینکه vdirsyncer با آن نسخه‌ها کار کند، باید مقدار \fBitem_types = [\(dqVTODO\(dq, \(dqVEVENT\(dq]\fP را در \fBcaldav\fP \%<#\:storage-caldav> تنظیم کنید. .UNINDENT .SS Xandikos .sp برنامهٔ Xandikos \% یک سرور سبک و در عین حال کامل برای CalDAV و CardDAV است که از git به‌عنوان پشتیبان استفاده می‌کند. ابزار vdirsyncer به‌طور مداوم در برابر آخرین نسخهٔ آن آزمایش می‌شود. .sp پس از اجرای \fB\&./bin/xandikos \-\-defaults \-d $HOME/dav\fP، باید بتوانید vdirsyncer را به‌صورت زیر به ریشهٔ Xandikos متصل کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [storage cal] type = \(dqcaldav\(dq url = \(dqhttps://xandikos.example.com/\(dq username = \(dq...\(dq password = \(dq...\(dq [storage card] type = \(dqcarddav\(dq url = \(dqhttps://xandikos.example.com/\(dq username = \(dq...\(dq password = \(dq...\(dq .EE .UNINDENT .UNINDENT .SH "مشکلات شناخته‌شده (KNOWN PROBLEMS)" .sp برای هرگونه پرسش یا مشکل بی‌پاسخ، بخش Support and Contact \%<>\& را ببینید. .SS خطاهای ImportError مرتبط با Requests .INDENT 0.0 .INDENT 3.5 ImportError: No module named packages.urllib3.poolmanager .sp ImportError: cannot import name iter_field_objects .UNINDENT .UNINDENT .sp توزیع دبیان و امروزه حتی سایر توزیع‌ها تغییراتی را روی بستهٔ \fBrequests\fP اعمال می‌کنند که با بسته‌هایی که یک \fBrequests\fP استاندارد را فرض می‌کنند سازگار نیست. این موضوع به دلیل سرسختی هر دو طرف است. .sp برای مشاهدهٔ بحث‌های پیشین، گزارش شمارهٔ #82 \% و گزارش شمارهٔ #140 \% را ببینید. برای دور زدن این مشکل یک راهکار دارید؛ یعنی نصب vdirsyncer در یک محیط مجازی (virtual environment)، بخش Manual installation \%<#\:manual-installation>\& را ببینید. .SH "مشارکت در این پروژه (CONTRIBUTING TO THIS PROJECT)" .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 لطفاً برای پرسش‌ها و درخواست‌های پشتیبانی، بخش Support and Contact \%<> را بخوانید. .IP \(bu 2 همهٔ شرکت‌کنندگان باید از مرام‌نامهٔ رفتاری pimutils Code of Conduct \%\& پیروی کنند. .UNINDENT .UNINDENT .UNINDENT.SS سامانه پیگیری اشکالات .sp ما از بخش مسائل گیت‌هاب (GitHub issues) \% برای سازمان‌دهی گزارش‌های باگ و درخواست‌های ویژگی‌های جدید استفاده می‌کنیم. .sp برچسب‌های زیر \% قابل توجه هستند: .INDENT 0.0 .IP \(bu 2 برچسب \(dqPlanning\(dq برای مواردی است که هنوز درباره آن‌ها تصمیم‌گیری نشده است، اما دست‌کم گفتگوهایی پیرامونشان وجود دارد. .IP \(bu 2 برچسب \(dqBlocked\(dq برای مواردی است که در حال حاضر به دلیل وجود مشکلی دیگر که هنوز حل نشده، امکان کار روی آن‌ها نیست. این مشکل ممکن است برای نمونه، یک باگ در یکی از وابستگی‌های نرم‌افزاری باشد. .IP \(bu 2 برچسب \(dqReady\(dq شامل مواردی است که آماده کار و پیاده‌سازی هستند. .UNINDENT .sp اگر صرفاً قصد دارید مشارکت را آغاز کنید، موارد \(dqready\(dq گزینه مناسبی هستند. مواردی که همچنان در وضعیت \(dqPlanning\(dq قرار دارند نیز گزینه دیگرند، اما نیازمند تفکر اولیه بیشتری بوده و ممکن است در عمل غیرقابل‌حل از آب درآیند یا دست‌کم سخت‌تر از حد انتظار باشند. از سوی دیگر، بسته به نوع نگاه شما، این موارد معمولاً چالش‌برانگیزتر و جالب‌تر نیز هستند. .sp تمام این برچسب‌ها همچنین به صورت تابلوی کانبان در waffle.io \%\& در دسترس هستند. این نما صرفاً دیدگاهی جایگزین از تمامی مسائل است، اما ممکن است درک آن ساده‌تر باشد. .sp برای اطلاعات بیشتر، با من تماس بگیرید \%<> یا روی موارد مربوطه دیدگاه بگذارید. .SS گزارش باگ‌ها .INDENT 0.0 .IP \(bu 2 اطمینان حاصل کنید که مشکل شما قبلاً در مشکلات شناخته‌شده (Known Problems) \%<>\& فهرست نشده باشد. .IP \(bu 2 مطمئن شوید که قطعاً از آخرین نسخه vdirsyncer استفاده می‌کنید. برای کاربران برخی از توزیع‌های لینوکس مانند Debian یا Fedora، ممکن است این نسخه همان نسخه‌ای نباشد که توزیع شما ارائه می‌دهد. در چنین مواردی لطفاً باگ را برای بسته توزیع ثبت کنید، نه برای بالادست (upstream) vdirsyncer. .IP \(bu 2 هنگام قرار دادن خروجی vdirsyncer، از \fB\-\-verbosity=DEBUG\fP استفاده کنید. .UNINDENT .SS پیشنهاد ویژگی‌ها .sp اگر ویژگی جدیدی پیشنهاد می‌کنید، به یاد داشته باشید که vdirsyncer تلاش می‌کند تا یک کلاینت کامل تقویم یا مخاطبین نباشد، بلکه تنها نرم‌افزاری باشد که تمام داده‌ها را همگام‌سازی می‌کند. نگاهی به مستندات نرم‌افزارهایی که با vdirsyncer کار می‌کنند \%<>\& بیندازید. .SS ارسال وصله‌ها و پول ریکوئست‌ها .INDENT 0.0 .IP \(bu 2 پیش از پیاده‌سازی، \fBابتدا همه‌چیز را در سامانه پیگیری اشکالات به بحث بگذارید\fP (یا از راهی دیگر با من ارتباط برقرار کنید). .IP \(bu 2 مطمئن شوید که آزمون‌ها با موفقیت پاس می‌شوند. برای اجرای آن‌ها بخش زیر را ببینید. .IP \(bu 2 اما نه صرفاً به این دلیل که آزمون‌های بسیار کمی نوشته‌اید. .IP \(bu 2 نام خود را به \fBAUTHORS.rst\fP اضافه کنید، و همچنین یادداشتی به \fBCHANGELOG.rst\fP بیفزایید. .UNINDENT .SS اجرای آزمون‌ها و نحوه راه‌اندازی محیط توسعه .sp برای بسیاری از وصله‌ها، ممکن است واگذاری اجرای آزمون‌ها به CI کافی باشد. با این حال، CI کند است، بنابراین ممکن است بخواهید آن‌ها را به صورت محلی نیز اجرا کنید. برای این کار، یک virtualenv \% راه‌اندازی کرده و دستورات زیر را درون آن اجرا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX # Install development dependencies, including: # \- vdirsyncer from the repo into the virtualenv # \- style checks and formatting (ruff) make install\-dev # Install git commit hook for some extra linting and checking pre\-commit install .EE .UNINDENT .UNINDENT .sp سپس می‌توانید دستورات زیر را اجرا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX pytest # The normal testsuite pre\-commit run \-\-all # Run all linters (which also run via pre\-commit) make \-C docs html # Build the HTML docs, output is at docs/_build/html/ make \-C docs linkcheck # Check docs for any broken links .EE .UNINDENT .UNINDENT .sp فایل \fBMakefile\fP گزینه‌های فراوانی دارد که به شما اجازه می‌دهد کنترل کنید چه آزمون‌هایی اجرا شوند و کدام سرورها مورد آزمایش قرار گیرند. به کدهای آن نگاهی بیندازید که در آنجا همگی مقداردهی اولیه و مستند شده‌اند. .sp برای اجرای آزمون در برابر یک سرور DAV خاص، از \fBDAV_SERVER\fP استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX make DAV_SERVER=xandikos test .EE .UNINDENT .UNINDENT .sp سرور درون یک کانتینر docker راه‌اندازی شده و در پایان اجرای مجموعه آزمون‌ها متوقف خواهد شد. .sp اگر هرگونه سؤالی دارید، بدون تردید در این زمینه ایشو (issue) باز کنید..SS "ساختار مجموعه آزمون (Structure of the testsuite)" .sp درون \fBtests/\fP، سه پوشه اصلی وجود دارد: .INDENT 0.0 .IP \(bu 2 پوشه \fBsystem\fP شامل آزمون‌های سیستم و همچنین یکپارچه‌سازی است. یک قاعده کلی این است: اگر آزمون از فایل‌های موقت استفاده می‌کند، آن را اینجا قرار دهید. .IP \(bu 2 پوشه \fBunit\fP، که در آن هر مورد آزمون، یک کلاس یا تابع واحد را می‌آزماید. .IP \(bu 2 پوشه \fBstorage\fP یک مجموعه آزمون ذخیره‌سازی عمومی را روی تمام فضاهای ذخیره‌سازی اجرا می‌کند. .UNINDENT .sp دلیل این تفکیک این است: ما قصد داریم برای هر یک از این مجموعه‌های آزمون، گزارش‌های پوشش کُد جداگانه‌ای تولید کنیم. در حالت ایده‌آل، \fBunit\fP باید \fIبه‌تنهایی\fP پوشش مناسبی از کل کُد منبع ارائه دهد، و همچنین \fIترکیب\fP \fBsystem\fP و \fBstorage\fP نیز به همین صورت باشد. .SH "قالب ذخیره‌سازی VDIR (THE VDIR STORAGE FORMAT)" .sp این سند استانداردی را برای ذخیره‌سازی گاه‌شمارها و مخاطبان در یک سیستم‌فایل تشریح می‌کند که هدف اصلی آن، پیاده‌سازی آسان است. .sp ابزار Vdirsyncer از طریق \fBfilesystem\fP \%<#\:storage-filesystem>\& با vdirها همگام‌سازی می‌شود. هر vdir (که اساساً تنها یک دایرکتوری حاوی تعدادی فایل است) نمایانگر یک گاه‌شمار یا دفترچه نشانی است. .SS "ساختار پایه (Basic Structure)" .sp پوشه اصلی (ریشه) شامل تعداد دلخواهی زیرپوشه (مجموعه‌ها یا collections) است که فقط حاوی فایل‌ها (آیتم‌ها یا items) هستند. مترادف‌های \(dqcollection\(dq می‌توانند \(dqaddressbook\(dq یا \(dqcalendar\(dq باشند. .sp یک آیتم عبارت است از: .INDENT 0.0 .IP \(bu 2 یک فایل vCard \%، که در این صورت پسوند فایل \fIباید\fP \fI\&.vcf\fP باشد، \fIیا\fP .IP \(bu 2 یک فایل iCalendar \%، که در این صورت پسوند فایل \fIباید\fP \fI\&.ics\fP باشد\&. .UNINDENT .sp یک آیتم \fIباید\fP شامل مشخصه \fBUID\fP همان‌گونه که در استانداردهای vCard و iCalendar تعریف شده باشد. در صورتی که شامل بیش از یک مشخصه \fBUID\fP باشد، مقادیر آن‌ها \fIنباید\fP متفاوت باشند. .sp فایل \fIباید\fP دقیقاً شامل یک رویداد، وظیفه یا مخاطب باشد. در بیشتر موارد، این امر به معنای وجود تنها یک مؤلفه \fBVEVENT\fP/\fBVTODO\fP/\fBVCARD\fP در هر فایل است، اما برای مثال، استثنائات تکرار نیازمند چندین مؤلفه \fBVEVENT\fP برای هر رویداد خواهند بود. .sp نام فایل باید ویژگی‌های مشابهی با \fBUID\fP محتوای فایل داشته باشد. با این حال، هیچ الزامی برای یکسان بودن این دو وجود ندارد. برنامه‌ها می‌توانند فراداده‌های اضافی را در نام فایل ذخیره کنند، اما در عین حال \fIنباید\fP فرض کنند که فراداده‌های گنجانده‌شده توسط آن‌ها در سایر برنامه‌ها نیز حفظ خواهد شد. .SS "فراداده (Metadata)" .sp هر یک از فایل‌های فراداده زیر ممکن است وجود نداشته باشند. هیچ‌یک از فایل‌های فهرست‌شده در زیر دارای پسوند فایل نیستند. .INDENT 0.0 .IP \(bu 2 فایلی به نام \fBcolor\fP درون vdir رنگ vdir را مشخص می‌کند؛ این مشخصه صرفاً در طراحی رابط کاربری (UI) اهمیت دارد. .sp محتوای آن یک مقدار hex\-RGB با کدگذاری ASCII به قالب \fB#RRGGBB\fP است\&. برای نمونه، محتوای فایل \fB#FF0000\fP مشخص می‌کند که vdir رنگ قرمز (قابل مشاهده برای کاربر) دارد. استفاده از اشکال کوتاه یا مقادیر غیررسمی مانند \fBred\fP (برای مثال آن‌گونه که در CSS وجود دارد) مجاز نیست. علامت پیشوند \fB#\fP باید وجود داشته باشد. .IP \(bu 2 فایل‌هایی به نام‌های \fBdisplayname\fP و \fBdescription\fP حاوی عنوان/توضیحاتی با کدگذاری UTF\-8 هستند که ممکن است برای نمایش vdir در رابط‌های کاربری به کار روند. .IP \(bu 2 فایلی به نام \fBorder\fP درون vdir شامل ترتیب نسبی گاه‌شمار است؛ مشخصه‌ای که صرفاً در طراحی رابط کاربری اهمیت دارد. .UNINDENT .SS "نوشتن در vdirها (Writing to vdirs)" .sp ایجاد و تغییر آیتم‌ها یا فایل‌های فراداده \fIباید\fP به‌صورت اتمیک انجام شود \%\&. .sp نوشتن در یک فایل موقت روی همان دستگاه فیزیکی و سپس انتقال آن به مکان مناسب، معمولاً راهکاری بسیار کارآمد است. به این منظور، ممکن است فایل‌هایی با پسوند \fB\&.tmp\fP درون مجموعه‌ها ایجاد شوند. .sp هنگام تغییر یک آیتم، \fIباید\fP از نام فایل اصلی استفاده شود..SS خواندن از vdirها .INDENT 0.0 .IP \(bu 2 هر فایلی که به \fB\&.tmp\fP ختم شود یا فاقد پسوند فایل باشد، \fIنباید\fP به عنوان یک آیتم در نظر گرفته شود. .IP \(bu 2 بخش \fBident\fP از نام فایل \fIنباید\fP به منظور افزایش سرعت جستجوی آیتم‌ها تجزیه شود. .UNINDENT .SS ملاحظات .sp دلیل اصلی انتخاب این قالب، سازگاری آن با استانداردهای CardDAV \% و CalDAV \% است. .SS کارایی .sp در حال حاضر، vdirها از یک مشکل کارایی نسبتاً عمده رنج می‌برند؛ مشکلی که پیاده‌سازی‌های فعلی با ایجاد نمایه (index) از مجموعه‌ها به منظور جستجو و یافتن سریع‌تر، سعی در کاهش آن دارند. .sp دلیل اینکه نام فایل آیتم‌ها شامل اطلاعات اضافی نیست ساده است: راه‌حل‌های ارائه‌شده موجب تکثیر داده‌ها می‌شدند، جایی که ممکن بود یکی از نسخه‌های تکراری به دلیل پیاده‌سازی‌های نامناسب قدیمی و منسوخ شود. با این حال در وضعیت کنونی، می‌توان قالب نمایه را به طور جداگانه فرمول‌بندی کرد. .sp برنامه vdirsyncer واقعاً نیازی ندارد که نگران جستجوی بهینه‌ی آیتم‌ها باشد، زیرا الگوریتم همگام‌سازی آن در هر صورت باید کل فهرست آیتم‌ها را واکشی کند. تشخیص تغییرات نیز به سادگی با بررسی زمان تغییر (modification time) فایل‌ها انجام می‌شود. .SH "دستورالعمل‌های بسته‌بندی (PACKAGING GUIDELINES)" .sp از شما برای بسته‌بندی vdirsyncer بسیار سپاسگزاریم! دستورالعمل‌های زیر باید به شما در اجتناب از برخی تله‌ها و خطاهای رایج کمک کنند. .sp اگر نیاز به وصله کردن (patch) چیزی پیدا کردید یا در مسیری متفاوت پیش رفتید، لطفاً یک issue باز کنید تا بتوانیم آن را به شیوه‌ای که برای همه مناسب باشد برطرف کنیم. در غیر این صورت، گزارش‌های باگی برای کدها یا سناریوهایی دریافت می‌کنیم که در نسخه‌ی بالادست (upstream) vdirsyncer وجود ندارند. .SS دریافت کد منبع .sp کانال اصلی توزیع PyPI \% است و تاربال‌های منبع را می‌توان از آنجا دریافت کرد. ما همان تاربال بسته و wheel را در انتشارهای GitHub بازتاب (mirror) می‌دهیم. لطفاً این‌ها را با تاربال‌های تولید خودکار \(dqSource Code\(dq در GitHub اشتباه نگیرید؛ آن‌ها فاقد برخی فراداده‌های مهم هستند و ساخت (build) شما با شکست مواجه خواهد شد. .sp ما در مخزن git به هر انتشار یک تگ اختصاص می‌دهیم. اگر می‌خواهید از انتشارهای جدید مطلع شوید، خوراک GitHub در \% روش بسیار خوبی است. .sp تگ‌ها توسط نگه‌دارنده‌ای که فرآیند انتشار را انجام می‌دهد امضا خواهند شد (از نسخه‌ی 0.16.8 به بعد)، و تولید tarball و wheel توسط CI انجام می‌شود. بنابراین، تنها خود تگ امضا شده است. .SS نسخه‌های وابستگی‌ها .sp همانند بیشتر بسته‌های Python، فایل \fBsetup.py\fP وابستگی‌های vdirsyncer را مشخص می‌کند. این فایل همچنین شامل حد پایین نسخه‌های هر وابستگی است. نگارش‌های قدیمی‌تر توسط مجموعه‌ی آزمون رد خواهند شد. .SS آزمون .sp همه‌چیز در ارتباط با آزمون‌ها از طریق \fBMakefile\fP در ریشه‌ی مخزن یا بسته‌ی PyPI انجام می‌شود. تلاش برای اجرای مستقیم مواردی مانند \fBpytest\fP نیازمند تنظیم متغیرهای محیطی فراوانی (جهت پیکربندی) خواهد بود و احتمالاً شما تمایلی به درگیر شدن با آن ندارید. .sp می‌توانید تمام وابستگی‌های توسعه را با دستور زیر نصب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX make install\-dev .EE .UNINDENT .UNINDENT .sp احتمالاً این روش را ترجیح نمی‌دهید، زیرا برای بارگیری وابستگی‌ها از pip استفاده خواهد کرد. در عوض، وابستگی‌های آزمون به عنوان وابستگی‌های اختیاری \fBtest\fP در \fBpyproject.toml\fP فهرست شده‌اند که مجدداً الزامات حداقل نسخه را به همراه دارند. .sp همچنین در این مرحله باید vdirsyncer به طور کامل نصب شده باشد. صرفاً اجرای دستور \fBcd\fP به داخل تاربال کافی نخواهد بود. .sp اجرای آزمون‌ها با دستور زیر انجام می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX pytest .EE .UNINDENT .UNINDENT .sp کتابخانه‌ی Hypothesis داده‌های ورودی آزمون را به صورت تصادفی تولید می‌کند. اگر آزمون‌های قطعی (deterministic) برایتان مهم است، متغیر \fBDETERMINISTIC_TESTS\fP را روی \fB\(dqtrue\(dq\fP تنظیم کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX make DETERMINISTIC_TESTS=true test .EE .UNINDENT .UNINDENT .sp متغیرهای اضافی فراوانی وجود دارند که به شما اجازه می‌دهند vdirsyncer را در برابر یک کارگزار خاص بیازمایید. آن متغیرها \(dqپایدار\(dq نیستند و ممکن است در نسخه‌های جزئی به شدت تغییر کنند. از آن‌ها استفاده نکنید؛ بسیار بعید است باگ‌هایی را پیدا کنید که CI پروژه vdirsyncer از قبل نیافته باشد..SS مستندات .sp با استفاده از Sphinx \% می‌توانید مستنداتی را که هم‌اکنون می‌خوانید در قالب‌های گوناگونی چون HTML، PDF، یا حتی صفحه راهنما (manpage) تولید کنید. با این وجود، من فقط به قالب‌بندی مستندات HTML رسیدگی می‌کنم. .sp فهرست وابستگی‌ها را می‌توانید در \fBpyproject.toml\fP، در بخش \fBproject.optional\-dependencies\fP با عنوان \fBdocs\fP بیابید. همچنین، می‌توانید آن‌ها را با استفاده از pip با دستور زیر نصب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX pip install \(aq.[docs]\(aq .EE .UNINDENT .UNINDENT .sp سپس به دایرکتوری \fBdocs/\fP رفته و هر قالبی را که می‌خواهید با استفاده از \fBMakefile\fP موجود در آن بسازید (برای مشاهده قالب‌هایی که می‌توانید بسازید، \fBmake\fP را اجرا کنید). .SS فایل‌های کمکی (Contrib) .sp فایل‌های واحد مرجع \fBsystemd.service\fP و \fBsystemd.timer\fP ارائه شده‌اند. اگر توزیع شما مبتنی بر systemd است، نصب این فایل‌ها توصیه می‌شود. .SH "پشتیبانی و تماس (SUPPORT AND CONTACT)" .INDENT 0.0 .IP \(bu 2 کانال IRC با نام \fB#pimutils\fP در Libera.Chat \% بسته به منطقه زمانی شما ممکن است فعال باشد. از آن برای دریافت پشتیبانی و گفتگوهای عمومی (شامل موضوعات متفرقه) استفاده کنید. .IP \(bu 2 برای گزارش‌های مشخص اشکال (باگ) و درخواست‌های قابلیت جدید، یک issue در GitHub باز کنید \%\&. .IP \(bu 2 برای مسائل امنیتی، با \fBcontact@pimutils.org\fP تماس بگیرید. .UNINDENT .SH "تغییرات (CHANGELOG)" .sp این گزارش تغییرات فقط شامل اطلاعاتی است که ممکن است برای کاربران نهایی و نگه‌دارندگان بسته مفید باشد. برای اطلاعات بیشتر، لاگ کامیت‌های git را ببینید. .sp نگه‌دارندگان بسته و کاربرانی که باید نصب خود را به صورت دستی به‌روزرسانی کنند، ممکن است بخواهند در خوراک تگ‌های GitHub مشترک شوند \%\&. .SS نسخه 0.21.0 .INDENT 0.0 .IP \(bu 2 پیاده‌سازی تلاش مجدد برای نوع ذخیره‌سازی \fBgoogle\fP در صورت رسیدن به سقف نرخ درخواست (rate limit). .IP \(bu 2 بسته \fBtenacity\fP اکنون یک وابستگی الزامی است. .IP \(bu 2 پایان پشتیبانی از Python 3.8. .IP \(bu 2 تلاش مجدد برای خطاهای گذرا شبکه در درخواست‌های بی‌اثر (nullipotent). .IP \(bu 2 افزودن پشتیبانی از Python 3.14. .UNINDENT .SS نسخه 0.20.0 .INDENT 0.0 .IP \(bu 2 حذف وابستگی به کتابخانه متروکه \fBatomicwrites\fP\&. .IP \(bu 2 پیاده‌سازی \fBfilter_hook\fP برای فضای ذخیره‌سازی HTTP. .IP \(bu 2 پایان پشتیبانی از Python 3.7. .IP \(bu 2 افزودن پشتیبانی از Python 3.12 و Python 3.13. .IP \(bu 2 بستن صحیح پایگاه داده وضعیت پس از استفاده. این موضوع به‌ویژه بر آزمون‌ها تأثیر می‌گذارد، جایی که شمار زیادی از توصیف‌کننده‌های فایل (file descriptors) نشت می‌کردند. .IP \(bu 2 گسترش نسخه‌های پشتیبانی‌شده از \fBaiostream\fP برای دربرگرفتن 0.7.x. .UNINDENT .SS نسخه 0.19.3 .INDENT 0.0 .IP \(bu 2 افزودن گزینه no_delete به پیکربندی فضای ذخیره‌سازی. issue #1090 \% .IP \(bu 2 رفع خرابی (crash) هنگام اجرای \fBvdirsyncer repair\fP روی یک مجموعه. issue #1019 \% .IP \(bu 2 افزودن گزینه‌ای برای درخواست vCard v4.0. issue #1066 \% .IP \(bu 2 الزام تطابق خطوط \fBBEGIN\fP و \fBEND\fP در vobjectها. issue #1103 \% .IP \(bu 2 یک محیط Docker برای Vdirsyncer تحت عنوان Vdirsyncer DOCKERIZED افزوده شده است \%\&. .IP \(bu 2 پیاده‌سازی احراز هویت digest. issue #1137 \% .IP \(bu 2 افزودن پارامتر \fBfilter_hook\fP به \fBhttp\fP \%<#\:storage-http>\&. issue #1136 \% .UNINDENT.SS "نسخه 0.19.2 (Version 0.19.2)" .INDENT 0.0 .IP \(bu 2 بهبود کارایی \fBSingleFileStorage\fP\&. issue #818 \% .IP \(bu 2 مستندسازی مناسب برخی از نکات و هشدارهای ذخیره‌ساز Google Contacts. .IP \(bu 2 رفع کرش هنگام استفاده از گواهی‌های احراز هویت. issue #1033 \% .IP \(bu 2 ذخیره‌ساز \fBfilesystem\fP را می‌توان با \fBtype = \(dqfilesystem/icalendar\(dq\fP یا \fBtype = \(dqfilesystem/vcard\(dq\fP تعیین کرد. این موضوع هیچ تأثیر عملکردی ندارد و صرفاً برای سازگاری رو به جلو با پیاده‌سازی Rust برنامه vdirsyncer است. .IP \(bu 2 پشتیبانی رسمی از Python 3.10 و 3.11 اضافه شد. .IP \(bu 2 دستورالعمل‌های یکپارچه‌سازی با Google CalDav/CardDav تغییر کرده است. اکنون برنامه‌ها باید به عنوان \(dqDesktop applications\(dq ثبت شوند. استفاده از \(dqWeb application\(dq به دلیل تغییرات سمت گوگل دیگر کار نمی‌کند. issue #1078 \% .UNINDENT .SS "نسخه 0.19.1 (Version 0.19.1)" .INDENT 0.0 .IP \(bu 2 رفع کرش هنگام پردازش Google Contacts. issue #994 \% .IP \(bu 2 متغیرهای محیطی \fBHTTP_PROXY\fP و \fBHTTPS_PROXY\fP اکنون رعایت و اعمال می‌شوند. issue #1031 \% .IP \(bu 2 دستورالعمل‌های یکپارچه‌سازی با Google CalDav/CardDav تغییر کرده است. برنامه‌ها اکنون باید به عنوان \(dqWeb Application\(dq ثبت شوند. issue #975 \% .IP \(bu 2 به‌روزرسانی‌های گوناگون در مستندات. .UNINDENT .SS "نسخه 0.19.0 (Version 0.19.0)" .INDENT 0.0 .IP \(bu 2 افزودن راهبرد دریافت گذرواژه \(dqshell\(dq برای فرستادن رشته دستور به یک شل. .IP \(bu 2 افزودن \(dqdescription\(dq و \(dqorder\(dq به عنوان متادیتا. این مقادیر به ترتیب ویژگی‌های CalDAV: calendar\-description، \fBCardDAV:addressbook\-description\fP و \fBapple\-ns:calendar\-order\fP را دریافت می‌کنند. .IP \(bu 2 افزودن وضعیت جدید \fBshowconfig\fP. این دستور \fIبرخی\fP از مقادیر پیکربندی را به صورت JSON نمایش می‌دهد. این قابلیت برای استفاده توسط ابزارها و برنامه‌های کمکی خارجی که با \fBvdirsyncer\fP در تعامل هستند در نظر گرفته شده و آزمایشی محسوب می‌شود. .IP \(bu 2 افزودن گزینه \fBimplicit\fP به بخش pair \%<#\:pair-config>\&. هنگامی که روی \(dqcreate\(dq تنظیم شود، مجموعه‌های مفقود را در حین همگام‌سازی بدون نیاز به تأیید کاربر ایجاد می‌کند. این امر جریان‌های کاری را که در آن‌ها مجموعه‌ها باید به طور خودکار در هر دو طرف ایجاد شوند ساده می‌کند. .IP \(bu 2 به‌روزرسانی آزمون‌های مرتبط با TLS که به دلیل MDهای ضعیف با شکست مواجه می‌شدند. issue #903 \% .IP \(bu 2 بسته‌های \fBpytest\-httpserver\fP و \fBtrustme\fP اکنون برای اجرای آزمون‌ها الزامی هستند. .IP \(bu 2 بسته \fBpytest\-localserver\fP دیگر برای اجرای آزمون‌ها الزامی نیست. .IP \(bu 2 پشتیبانی از چندنخی (Multithreaded) متوقف شد. گزینه \fB\(dq\-\-max\-workers\fP حذف شده است. .IP \(bu 2 اکنون از بک‌اند جدید \fBasyncio\fP استفاده می‌شود. تا اینجا، این تغییر باعث بهبود چشمگیر سرعت در \fBdiscovery\fP و \fBmetasync\fP شده، اما تغییر اندکی در \fIsync\fP داشته است. این مورد احتمالاً در طول زمان بهبود بیشتری خواهد یافت. issue #906 \% .IP \(bu 2 انواع ذخیره‌ساز \fBgoogle\fP دیگر به \fBrequests\-oauthlib\fP نیازی ندارند، و به جای آن نیازمند \fBpython\-aiohttp\-oauthlib\fP هستند. .IP \(bu 2 برنامه Vdirsyncer دیگر پشتیبانی آزمایشی از EteSync \%\& را شامل نمی‌شود. یکپارچه‌سازی موجود مدت‌ها بود که پشتیبانی نمی‌شد و دیگر کار نمی‌کرد. در صورت تمایل افراد به نگهداری یک افزونه برای EteSync، ممکن است پشتیبانی از ذخیره‌سازهای خارجی اضافه شود. به کاربران EteSync پیشنهاد می‌شود استفاده از etesync\-dav \%\& را مد نظر قرار دهند. .IP \(bu 2 فایل \fBplist\fP برای macOS حذف شد. این فایل ایراد داشت و homebrew نسخه خودش را بر اساس متادیتای بسته تولید می‌کند. به کاربران macOS توصیه می‌شود از آن به عنوان مرجع استفاده کنند. .UNINDENT .SS "تغییرات در پیکربندی SSL (Changes to SSL configuration)" .sp پشتیبانی از اثر انگشت‌های گواهی (fingerprints) از نوع \fBmd5\fP و \fBsha1\fP متوقف شده است. اگر اثر انگشت‌های گواهی را اعتبارسنجی می‌کنید، به جای آن‌ها از \fBsha256\fP استفاده نمایید. .sp هنگام استفاده از \fBverify_fingerprint\fP سفارشی، اعتبارسنجی CA همواره غیرفعال است. .sp اگر \fBverify_fingerprint\fP تنظیم نشده باشد، اعتبارسنجی CA همیشه فعال است. غیرفعال کردن هر دو ویژگی ناامن بوده و دیگر پشتیبانی نمی‌شود. .sp پارامتر \fBverify\fP دیگر مقادیر بولی نمی‌پذیرد، اکنون اختیاری است و تنها یک رشته شامل مسیر CA سفارشی را برای اعتبارسنجی قبول می‌کند. .sp پارامترهای \fBverify\fP و \fBverify_fingerprint\fP احتمالاً در آینده در قالب یک پارامتر واحد ادغام خواهند شد..SS نسخه 0.18.0 .sp نکته: نسخه 0.17 شامل چند انتشار آلفا بود اما در نهایت هرگز نهایی نشد. نسخه 0.18 در واقع از همان‌جایی ادامه می‌یابد که 0.16 متوقف شده بود. .INDENT 0.0 .IP \(bu 2 پشتیبانی از Python 3.5 و 3.6 پایان یافته است. این انتشار عمدتاً بر حفظ سازگاری vdirsyncer با محیط‌های جدیدتر تمرکز دارد. .IP \(bu 2 اکنون نسخه‌های click 8 و click\-threading 0.5.0 مورد نیاز هستند. .IP \(bu 2 برای کسانی که از \fBpipsi\fP استفاده می‌کنند، اکنون استفاده از جانشین آن، \fBpipx\fP، توصیه می‌شود. .IP \(bu 2 اکنون از Python 3.9 پشتیبانی می‌شود. .IP \(bu 2 اسکریپت‌های ساخت Debian/Ubuntu به‌روزرسانی شده‌اند. نسخه‌های جدید باید به‌زودی به آن مخازن فرستاده شوند. .UNINDENT .SS نسخه 0.16.8 .sp \fIمنتشرشده در 09 ژوئن 2020\fP .INDENT 0.0 .IP \(bu 2 پشتیبانی از Python 3.7 و 3.8. .UNINDENT .sp این انتشار از نظر عملکردی همسان با 0.16.7 است. با نسخه‌های اخیر Python آزمایش شده و به عنوان پشتیبانی‌کننده از آن‌ها علامت‌گذاری شده است. این نسخه همچنین آخرین انتشاری خواهد بود که از Python 3.5 و 3.6 پشتیبانی می‌کند. .SS نسخه 0.16.7 .sp \fIمنتشرشده در 19 ژوئیه 2018\fP .INDENT 0.0 .IP \(bu 2 رفع اشکال‌ها برای Python 3.7 .UNINDENT .SS نسخه 0.16.6 .sp \fIمنتشرشده در 13 ژوئن 2018\fP .INDENT 0.0 .IP \(bu 2 \fBبسته‌سازان:\fP ساخت مستندات دیگر نیازی به یک نسخهٔ نصب‌شده و فعال از vdirsyncer ندارد. .UNINDENT .SS نسخه 0.16.5 .sp \fIمنتشرشده در 13 ژوئن 2018\fP .INDENT 0.0 .IP \(bu 2 \fBبسته‌سازان:\fP نسخه click\-log 0.3 مورد نیاز است. .IP \(bu 2 تمام خروجی‌ها اکنون روی stderr ارسال خواهند شد (به دلیل ارتقای \fBclick\-log\fP). .UNINDENT .SS نسخه 0.16.4 .sp \fIمنتشرشده در 05 فوریه 2018\fP .INDENT 0.0 .IP \(bu 2 اصلاح آزمون‌ها برای نسخه جدید Hypothesis. (دقیقاً هیچ تغییر دیگری اعمال نشده است) .UNINDENT .SS نسخه 0.16.3 .sp \fIمنتشرشده در 03 اکتبر 2017\fP .INDENT 0.0 .IP \(bu 2 اولین نسخه با بسته‌های سفارشی Debian و Ubuntu. مسئلهٔ #663 را ببینید \%\&. .IP \(bu 2 حذف نویسه‌های کنترلی نامعتبر ASCII از پاسخ‌های سرور. مسئلهٔ #626 را ببینید \%\&. .IP \(bu 2 \fBبسته‌سازان:\fP از Python 3.3 دیگر پشتیبانی نمی‌شود. درخواست تغییرات (pull request) شماره #674 را ببینید \%\&. .UNINDENT .SS نسخه 0.16.2 .sp \fIمنتشرشده در 24 اوت 2017\fP .INDENT 0.0 .IP \(bu 2 رفع خرابی ناگهانی هنگام استفاده از فیلترهای daterange یا item_type در \fBgoogle_calendar\fP \%<#\:storage-google_calendar>، مسئلهٔ #657 را ببینید \%\&. .IP \(bu 2 \fBبسته‌سازان:\fP اصلاحات مربوط به نسخهٔ جدید \fB0.2.0\fP از \fBclick\-log\fP\&. نیازمندی‌های نسخه برای وابستگی \fBclick\-log\fP تغییر یافته است. .UNINDENT.SS نسخه 0.16.1 .sp \fIمنتشرشده در 8 اوت 2017\fP .INDENT 0.0 .IP \(bu 2 حذف پشتیبانی از remoteStorage؛ گزارش شماره #647 \%\& را ببینید. .IP \(bu 2 رفع خطاهای آزمون ناشی از آخرین نسخه requests؛ گزارش شماره #660 \%\& را ببینید. .UNINDENT .SS نسخه 0.16.0 .sp \fIمنتشرشده در 2 ژوئن 2017\fP .INDENT 0.0 .IP \(bu 2 حذف \fBMETHOD:PUBLISH\fP اضافه‌شده توسط برخی ارائه‌دهندگان تقویم؛ گزارش شماره #502 \%\& را ببینید. .IP \(bu 2 رفع مشکل از کار افتادن (crash) فضاهای ذخیره‌سازی Google هنگام ذخیره فایل توکن. .IP \(bu 2 انطباق بیشتر شناسایی DAV با استانداردهای RFC؛ درخواست ادغام #585 \%\& را ببینید. .IP \(bu 2 ابزار vdirsyncer اکنون در برابر Xandikos آزمایش می‌شود؛ درخواست ادغام #601 \%\& را ببینید. .IP \(bu 2 زیرپوشه‌های دارای نقطه در ابتدای نام اکنون در طول فرایند شناسایی برای فضای ذخیره‌سازی \fBfilesystem\fP نادیده گرفته می‌شوند. این امر ادغام آن را با سیستم‌های کنترل نسخه آسان‌تر می‌کند. .IP \(bu 2 وضعیت‌ها اکنون در یک پایگاه داده sqlite ذخیره می‌شوند. داده‌های قدیمی به‌طور خودکار مهاجرت داده می‌شوند. کاربران دارای مجموعه‌داده‌های بسیار بزرگ باید شاهد بهبود عملکرد باشند. این بدان معناست که \fBsqlite3 اکنون یک وابستگی برای vdirsyncer است\fP\&. .IP \(bu 2 \fBVdirsyncer اکنون تحت مجوز 3\-بندی BSD منتشر می‌شود\fP؛ گزارش شماره #610 \%\& را ببینید. .IP \(bu 2 ابزار vdirsyncer اکنون شامل پشتیبانی آزمایشی از EteSync \% است؛ درخواست ادغام #614 \%\& را ببینید. .IP \(bu 2 ابزار vdirsyncer اکنون برای تشخیص تغییر یک آیتم، از متاداده‌های بیشتری از سامانه فایل استفاده می‌کند. ممکن است در \fBنخستین همگام‌سازی پس از ارتقا متوجه افزایش ناگهانی و شدید بار پردازنده و ورودی/خروجی (CPU/IO) شوید\fP\&. .IP \(bu 2 \fBبسته‌بندها:\fP فایل‌های واحد مرجع \fBsystemd.service\fP و \fBsystemd.timer\fP ارائه شده‌اند. توصیه می‌شود اگر توزیع شما مبتنی بر systemd است، این فایل‌ها را به‌عنوان مستندات نصب کنید. .UNINDENT .SS نسخه 0.15.0 .sp \fIمنتشرشده در 28 فوریه 2017\fP .INDENT 0.0 .IP \(bu 2 نحو منسوخ‌شده برای مقادیر پیکربندی اکنون کاملاً رد می‌شود. تمامی مقادیر اکنون باید ساختار معتبر JSON داشته باشند. .IP \(bu 2 چندین بهبود تجربه کاربری برای فضاهای ذخیره‌سازی Google؛ گزارش شماره #549 \% و گزارش شماره #552 \%\& را ببینید. .IP \(bu 2 رفع مشکل شناسایی مجموعه برای \fBgoogle_contacts\fP \%<#\:storage-google_contacts>؛ گزارش شماره #564 \%\& را ببینید. .IP \(bu 2 سرویس iCloud اکنون در Travis آزمایش می‌شود؛ گزارش شماره #567 \%\& را ببینید. .UNINDENT .SS نسخه 0.14.1 .sp \fIمنتشرشده در 05 ژانویه 2017\fP .INDENT 0.0 .IP \(bu 2 دستور \fBvdirsyncer repair\fP دیگر به‌طور پیش‌فرض \(dqUIDهای ناامن\(dq را تغییر نمی‌دهد؛ یک گزینه اضافی باید مشخص شود. گزارش شماره #527 \%\& را ببینید. .IP \(bu 2 به‌روزرسانی‌های مهم متعددی در مستندات. .UNINDENT .SS نسخه 0.14.0 .sp \fIمنتشرشده در 26 اکتبر 2016\fP .INDENT 0.0 .IP \(bu 2 دستور \fBvdirsyncer sync\fP اکنون در صورت شکست یک بارگذاری، بارگذاری‌های دیگر را ادامه می‌دهد. کد خروج در چنین شرایطی همچنان غیر صفر خواهد بود. .IP \(bu 2 افزودن گزینه \fBpartial_sync\fP به بخش pair. مستندات پیکربندی \%<#\:partial-sync-def>\& را ببینید. .IP \(bu 2 ابزار vdirsyncer اکنون در صورت وجود رشته‌های بدون نقل‌قول در پیکربندی شما هشدار می‌دهد. لطفاً در صورت مشاهده مستنداتی که از رشته‌های بدون نقل‌قول استفاده می‌کنند، گزارش خطا ارسال کنید. .IP \(bu 2 رفع مشکلی که باعث از کار افتادن دستیار پیکربندی ابزار khal می‌شد. .UNINDENT.SS نسخه 0.13.1 .sp \fIمنتشر شده در ۳۰ سپتامبر ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 رفع باگی که شناسایی مجموعه‌ها (collection discovery) را کاملاً از کار می‌انداخت. .UNINDENT .SS نسخه 0.13.0 .sp \fIمنتشر شده در ۲۹ سپتامبر ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 پشتیبانی از Python 2 به طور کامل متوقف شد. گزارش #219 را ببینید: \%\&. .IP \(bu 2 اکنون بخش‌های پیکربندی از نظر نام‌های تکراری بررسی می‌شوند. این بدان معناست که شما نمی‌توانید یک بخش ذخیره‌سازی \fB[storage foo]\fP و یک جفت \fB[pair foo]\fP با نام یکسان در پیکربندی خود داشته باشید؛ آنها باید نام‌های متفاوتی داشته باشند. این کار انجام شد تا خروجی کنسول همیشه بدون ابهام باشد. گزارش #459 را ببینید: \%\&. .IP \(bu 2 اکنون می‌توان از دستورات سفارشی برای حل تعارض در حین همگام‌سازی استفاده کرد. گزارش #127 را ببینید: \%\&. .IP \(bu 2 ذخیره‌ساز \fBhttp\fP \%<#\:storage-http> اکنون UIDها را کاملاً نادیده می‌گیرد. این کار از بارگیری و بارگذاری‌های غیرضروری بسیاری جلوگیری می‌کند. .UNINDENT .SS نسخه 0.12.1 .sp \fIمنتشر شده در ۲۰ اوت ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 رفع کرش در فضاهای ذخیره‌سازی Google و DAV. درخواست ادغام #492 را ببینید: \%\&. .IP \(bu 2 رفع مشکل URL\-encoding با DavMail. گزارش #491 را ببینید: \%\&. .UNINDENT .SS نسخه 0.12 .sp \fIمنتشر شده در ۱۹ اوت ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 ذخیره‌ساز \fBsinglefile\fP \%<#\:storage-singlefile> اکنون از مجموعه‌ها پشتیبانی می‌کند. درخواست ادغام #488 را ببینید: \%\&. .UNINDENT .SS نسخه 0.11.3 .sp \fIمنتشر شده در ۲۹ ژوئیه ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 مقدار پیش‌فرض پارامتر \fBauth\fP از \fBguess\fP به \fBbasic\fP تغییر یافت تا مشکلات با Apple Calendar Server برطرف شود (گزارش #457 \%) و کارایی بهبود یابد. گزارش #461 را ببینید: \%\&. .IP \(bu 2 \fBبسته‌بندها:\fP نیازمندی به \fBclick\-threading\fP اکنون \fB>=0.2\fP است. این مقدار پیش‌تر نادرست بود. گزارش #478 را ببینید: \%\&. .IP \(bu 2 رفع باگی در کد تجزیه XML مربوط به DAV که باعث کرش کردن vdirsyncer با برخی ورودی‌های خاص می‌شد. گزارش #480 را ببینید: \%\&. .IP \(bu 2 زنجیره‌های بازهدایت (redirect chains) هنگام تحلیل نشانی‌های وب \fBwell\-known\fP اکنون باید به درستی مدیریت شوند. درخواست ادغام #481 را ببینید: \%\&. .UNINDENT .SS نسخه 0.11.2 .sp \fIمنتشر شده در ۱۵ ژوئن ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 رفع غلط املایی که آزمون‌ها را با شکست مواجه می‌کرد. .UNINDENT .SS نسخه 0.11.1 .sp \fIمنتشر شده در ۱۵ ژوئن ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 رفع باگ در اعتبارسنجی مجموعه‌ها. .IP \(bu 2 رفع باگ ظاهری در خروجی اشکال‌زدایی (debug). .IP \(bu 2 بهبودهای مختلف در مستندات. .UNINDENT .SS نسخه 0.11.0 .sp \fIمنتشر شده در ۱۹ مه ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 شناسایی (Discovery) دیگر به طور خودکار هنگام اجرای \fBvdirsyncer sync\fP انجام نمی‌شود. اکنون باید \fBvdirsyncer discover\fP صریحاً فراخوانی شود. .IP \(bu 2 افزودن یک نمونه \fB\&.plist\fP برای Mac OS X. .IP \(bu 2 استفاده تحت Python 2 اکنون نیازمند تنظیم یک پارامتر پیکربندی ویژه است. .IP \(bu 2 چندین پارامتر پیکربندی منسوخ‌شده دیگر پیام‌های خطای اختصاصی ندارند. پیام خطای عمومی برای پارامترهای ناشناخته نمایش داده می‌شود. .INDENT 2.0 .IP \(bu 2 برنامه Vdirsyncer دیگر درباره تغییر نام پارامتر \fBpasswordeval\fP به \fBpassword_command\fP هشدار نمی‌دهد. .IP \(bu 2 راهبرد واکشی \fBkeyring\fP چند نسخه پیش کنار گذاشته شد و اکنون پیام خطای اختصاصی آن نیز حذف شده است. .IP \(bu 2 یک قالب قدیمی وضعیت مربوط به نسخه 0.4 دیگر پشتیبانی نمی‌شود. اگر با مشکلی مواجه شدید، کافی است پوشه status خود را حذف کنید. .UNINDENT .UNINDENT.SS نسخه 0.10.0 .sp \fIمنتشرشده در ۲۳ آوریل ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 انواع جدید ذخیره‌سازی \fBgoogle_calendar\fP \%<#\:storage-google_calendar> و \fBgoogle_contacts\fP \%<#\:storage-google_contacts> افزوده شده‌اند. .IP \(bu 2 گزینه خط فرمان سراسری جدید \fI\-\-config\fP، برای مشخص کردن فایل پیکربندی جایگزین. گزارش مشکل شماره ۴۰۹ را ببینید: \%\&. .IP \(bu 2 اکنون می‌توان از پارامتر \fBcollections\fP برای همگام‌سازی مجموعه‌هایی با نام‌های متفاوت با یکدیگر استفاده کرد. .IP \(bu 2 \fBبسته‌بندها:\fP وابستگی \fBlxml\fP حذف شده است. .IP \(bu 2 تجزیه XML اکنون بسیار سخت‌گیرانه‌تر شده است. سرورهای دارای عملکرد نادرست که قبلاً با vdirsyncer کار می‌کردند ممکن است از کار بیفتند. .UNINDENT .SS نسخه 0.9.3 .sp \fIمنتشرشده در ۲۲ مارس ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 اکنون \fBsinglefile\fP \%<#\:storage-singlefile> و \fBhttp\fP \%<#\:storage-http> رویدادهای تکرارشونده را به‌درستی مدیریت می‌کنند. .IP \(bu 2 رفع یک غلط املایی در دستورالعمل‌های بسته‌بندی. .IP \(bu 2 انتقال به سازمان \fBpimutils\fP در GitHub. پیوندهای قدیمی \fIباید\fP تغییر مسیر دهند، اما مراقب نرم‌افزارهای کلاینتی که تغییر مسیرها را به‌درستی مدیریت نمی‌کنند باشید. .UNINDENT .SS نسخه 0.9.2 .sp \fIمنتشرشده در ۱۳ مارس ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 مجموعه آزمون برای محیط‌هایی که هیچ مرورگر وبی در آن‌ها نصب نشده اصلاح شد. درخواست ادغام شماره ۳۸۴ را ببینید: \%\&. .UNINDENT .SS نسخه 0.9.1 .sp \fIمنتشرشده در ۱۳ مارس ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 دستور چاپ اشکال‌زدایی باقی‌مانده در \fBvdirsyncer discover\fP حذف شد؛ کامیت \fB3d856749f37639821b148238ef35f1acba82db36\fP را ببینید. .IP \(bu 2 دستور \fBmetasync\fP اکنون فاصله‌های خالی را از ابتدا و انتهای مقادیر حذف می‌کند. گزارش مشکل شماره ۳۵۸ را ببینید: \%\&. .IP \(bu 2 بخش جدید \fBPackaging Guidelines\fP به مستندات افزوده شده است. .UNINDENT .SS نسخه 0.9.0 .sp \fIمنتشرشده در ۱۵ فوریه ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 پارامتر \fBcollections\fP اکنون در پیکربندی‌های جفت الزامی است. Vdirsyncer در پیام خطای خود به شما خواهد گفت چه کاری انجام دهید. گزارش مشکل شماره ۳۲۸ را ببینید: \%\&. .UNINDENT .SS نسخه 0.8.1 .sp \fIمنتشرشده در ۳۰ ژانویه ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 اصلاح پیام‌های خطا هنگام استفاده از راهبرد نامعتبر برای واکشی پارامتر. این مورد از آنجا اهمیت دارد که کاربران به دلیل استفاده از روش منسوخ‌شده واکشی با \fBkeyring\fP خطاهای نامفهومی دریافت می‌کردند. .UNINDENT .SS نسخه 0.8.0 .sp \fIمنتشرشده در ۲۷ ژانویه ۲۰۱۶\fP .INDENT 0.0 .IP \(bu 2 پشتیبانی از Keyring حذف شده است، به این معنی که \fBpassword.fetch = [\(dqkeyring\(dq, \(dqexample.com\(dq, \(dqmyuser\(dq]\fP دیگر کار نمی‌کند. .sp برای راه‌اندازی‌های موجود: در عوض از \fBpassword.fetch = [\(dqcommand\(dq, \(dqkeyring\(dq, \(dqget\(dq, \(dqexample.com\(dq, \(dqmyuser\(dq]\fP استفاده کنید که عمومی‌تر است. برای جزئیات به مستندات مراجعه کنید. .IP \(bu 2 اکنون هنگام اجرا تحت Python 2 یک هشدار صادر می‌شود. گزارش مشکل شماره ۲۱۹ را ببینید: \%\&. .UNINDENT.SS "نسخه 0.7.5 (Version 0.7.5)" .sp \fIمنتشرشده در ۲۳ دسامبر ۲۰۱۵\fP .INDENT 0.0 .IP \(bu 2 رفع باگی در \fBremotestorage\fP که تلاش می‌کرد یک مرورگر CLI را برای OAuth باز کند. .IP \(bu 2 رفع یک باگ بسته‌بندی که مانع از کارکرد vdirsyncer با نسخه‌های جدیدتر lxml می‌شد. .UNINDENT .SS "نسخه 0.7.4 (Version 0.7.4)" .sp \fIمنتشرشده در ۲۲ دسامبر ۲۰۱۵\fP .INDENT 0.0 .IP \(bu 2 بهبود پیام‌های خطا به جای رفتار نادرست سرور؛ گزارش مشکل #290 \% و گزارش مشکل #300 \%\& را ببینید. .IP \(bu 2 خاموش‌سازی ایمن‌تر threadpool و جلوگیری از بروز استثناها؛ گزارش مشکل #291 \%\& را ببینید. .IP \(bu 2 رفع باگ همگام‌سازی برای حافظه‌های ذخیره‌سازی فقط\-خواندنی (read\-only)؛ کامیت \fBed22764921b2e5bf6a934cf14aa9c5fede804d8e\fP\& را ببینید. .IP \(bu 2 تغییرات Etag دیگر برای راه‌اندازی عملیات همگام‌سازی کافی نیستند. تغییر واقعی محتوا نیز ضروری است. گزارش مشکل #257 \%\& را ببینید. .IP \(bu 2 اکنون \fBremotestorage\fP به‌طور خودکار کادرهای گفتگوی احراز هویت را در مرورگر GUI پیکربندی‌شده شما باز می‌کند. .IP \(bu 2 \fBبسته‌بندها (Packagers):\fP اکنون \fBlxml>=3.1\fP مورد نیاز است (نسخه حداقل جدیدتر). .UNINDENT .SS "نسخه 0.7.3 (Version 0.7.3)" .sp \fIمنتشرشده در ۰۵ نوامبر ۲۰۱۵\fP .INDENT 0.0 .IP \(bu 2 واقعاً اختیاری کردن وابستگی‌های remotestorage (remotestorage\-dependencies). .UNINDENT .SS "نسخه 0.7.2 (Version 0.7.2)" .sp \fIمنتشرشده در ۰۵ نوامبر ۲۰۱۵\fP .INDENT 0.0 .IP \(bu 2 رفع خرابی مجموعه آزمون (testsuite). .UNINDENT .SS "نسخه 0.7.1 (Version 0.7.1)" .sp \fIمنتشرشده در ۰۵ نوامبر ۲۰۱۵\fP .INDENT 0.0 .IP \(bu 2 \fBبسته‌بندها (Packagers):\fP موارد اضافی (extras) در setuptools با عنوان‌های \fBkeyring\fP و \fBremotestorage\fP اضافه شده‌اند. آن‌ها اساساً وابستگی‌های اختیاری هستند. برای جزئیات بیشتر \fBsetup.py\fP را ببینید. .IP \(bu 2 پشتیبانی بسیار آزمایشی از remoteStorage اضافه شده است. ممکن است این قابلیت در هر نسخه‌ای کاملاً بازنویسی شود یا حتی حذف گردد. .IP \(bu 2 حذف ارجاعات به \fBpassword_command\fP قدیمی در مستندات. .UNINDENT .SS "نسخه 0.7.0 (Version 0.7.0)" .sp \fIمنتشرشده در ۲۷ اکتبر ۲۰۱۵\fP .INDENT 0.0 .IP \(bu 2 \fBبسته‌بندها (Packagers):\fP وابستگی‌های جدید عبارتند از \fBclick_threading\fP، \fBclick_log\fP و \fBclick>=5.0\fP\&. .IP \(bu 2 دستور \fBpassword_command\fP حذف شده است. پشتیبانی از Keyring کاملاً بازنویسی شد. بخش ذخیره‌سازی گذرواژه‌ها (Storing passwords) \%<>\& را ببینید. .UNINDENT .SS "نسخه 0.6.0 (Version 0.6.0)" .sp \fIمنتشرشده در ۰۶ اوت ۲۰۱۵\fP .INDENT 0.0 .IP \(bu 2 فراخوانی‌های \fBpassword_command\fP با کد خروج غیرصفر اکنون مهلک تلقی شده (و همگام‌سازی را متوقف می‌کنند) به جای اینکه صرفاً هشداری تولید کنند. .IP \(bu 2 برنامه Vdirsyncer اکنون قادر به همگام‌سازی متاداده‌های مجموعه‌ها است. مقدار \fBmetadata = [\(dqdisplayname\(dq]\fP را تنظیم کرده و \fBvdirsyncer metasync\fP را اجرا کنید\&. .IP \(bu 2 \fBبسته‌بندها (Packagers):\fP از بسته‌های tarball گیت‌هاب استفاده نکنید، بلکه از بسته‌های PyPI استفاده کنید. .IP \(bu 2 \fBبسته‌بندها (Packagers):\fP اسکریپت \fBbuild.sh\fP حذف شده و \fBMakefile\fP در بسته‌های tarball گنجانده شده است. برای چگونگی اجرای آزمون‌ها پس از بسته‌بندی، محتوای \fBMakefile\fP را ببینید. .IP \(bu 2 گزینه \fBverify_fingerprint\fP دیگر به‌طور خودکار \fBverify\fP را غیرفعال نمی‌کند. .UNINDENT.SS "نسخه 0.5.2 (Version 0.5.2)" .sp \fIمنتشر شده در 15 ژوئن 2015\fP .INDENT 0.0 .IP \(bu 2 برنامه Vdirsyncer اکنون مجوزهای فایل‌های وضعیت را بررسی و اصلاح می‌کند. .IP \(bu 2 برنامه Vdirsyncer اکنون در برابر تغییر UIDها درون آیتم‌ها پایدارتر است. .IP \(bu 2 برنامه Vdirsyncer اکنون hrefها و UIDهای یونیکد را به درستی مدیریت می‌کند. نرم‌افزاری که UIDهای غیر ASCII تولید کند معیوب است، اما ظاهراً چنین نرم‌افزارهایی وجود دارند. .UNINDENT .SS "نسخه 0.5.1 (Version 0.5.1)" .sp \fIمنتشر شده در 29 مه 2015\fP .INDENT 0.0 .IP \(bu 2 \fBتوجه: نسخه آپلود شده 0.5.0 روی PyPI کاملاً معیوب است.\fP .IP \(bu 2 ارتقای نسخه مورد نیاز requests\-toolbelt به \fB0.4.0\fP\&. .IP \(bu 2 خط فرمان زمانی که کاری برای انجام دادن وجود ندارد (مانند خروجی راهنما)، باید بسیار سریع‌تر باشد. .IP \(bu 2 رفع مجدد سازگاری با iCloud. .IP \(bu 2 استفاده از تنها یک worker در صورت فعال بودن حالت اشکال‌زدایی (debug mode). .IP \(bu 2 استفاده از \fBverify=false\fP اکنون در vdirsyncer غیرمجاز است؛ لطفاً به جای آن از \fBverify_fingerprint\fP استفاده کنید. .IP \(bu 2 رفع باگی که در آن فضای ذخیره‌سازی DAV در vdirsyncer از useragent پیکربندی‌شده برای کشف مجموعه (collection discovery) استفاده نمی‌کرد. .UNINDENT .SS "نسخه 0.4.4 (Version 0.4.4)" .sp \fIمنتشر شده در 12 مارس 2015\fP .INDENT 0.0 .IP \(bu 2 پشتیبانی از گواهی‌های کلاینت از طریق پارامتر جدید \fBauth_cert\fP، گزارش باگ شماره 182 \% و pull request شماره 183 \%\& را ببینید. .IP \(bu 2 بسته \fBicalendar\fP دیگر مورد نیاز نیست. .IP \(bu 2 چندین رفع باگ مربوط به ساخت مجموعه. .UNINDENT .SS "نسخه 0.4.3 (Version 0.4.3)" .sp \fIمنتشر شده در 20 فوریه 2015\fP .INDENT 0.0 .IP \(bu 2 بهبودهای عملکردی بیشتر برای فضای ذخیره‌سازی \fBsinglefile\fP. .IP \(bu 2 افزودن پارامتر \fBpost_hook\fP به فضای ذخیره‌سازی \fBfilesystem\fP. .IP \(bu 2 ایجاد مجموعه اکنون با سرورهای مبتنی بر SabreDAV مانند Baikal یا ownCloud نیز کار می‌کند. .IP \(bu 2 حذف برخی راه‌حل‌های موقت برای Radicale. ارتقا به آخرین نسخه Radicale این مشکلات را برطرف خواهد کرد. .IP \(bu 2 رفع مشکلات مربوط به کشف در iCloud. .IP \(bu 2 برنامه Vdirsyncer اکنون شامل یک دستور ساده \fBrepair\fP است که تلاش می‌کند برخی آیتم‌های معیوب را اصلاح کند. .UNINDENT .SS "نسخه 0.4.2 (Version 0.4.2)" .sp \fIمنتشر شده در 30 ژانویه 2015\fP .INDENT 0.0 .IP \(bu 2 برنامه Vdirsyncer اکنون هنگام بارگذاری و به‌روزرسانی آیتم‌ها از تغییرمسیرها پیروی می‌کند. این امر ممکن است مشکلات مربوط به Zimbra را رفع کند. .IP \(bu 2 مقادیر نسبی \fBstatus_path\fP اکنون به عنوان مسیر نسبی نسبت به دایرکتوری فایل پیکربندی تفسیر می‌شوند. .IP \(bu 2 رفع سازگاری با سرورهای سفارشی SabreDAV. گزارش باگ شماره 166 را ببینید: \%\&. .IP \(bu 2 گرفتن استثناهای بی‌خطر ریسه‌بندی (threading) که هنگام متوقف شدن vdirsyncer رخ می‌دهند. گزارش باگ شماره 167 را ببینید: \%\&. .IP \(bu 2 برنامه Vdirsyncer اکنون به \fBatomicwrites\fP وابسته است. .IP \(bu 2 بهبودهای عملکردی چشمگیر در فضای ذخیره‌سازی \fBsinglefile\fP. .IP \(bu 2 آیتم‌هایی با UIDهای بسیار طولانی اکنون باید به درستی در فضای ذخیره‌سازی \fBfilesystem\fP ذخیره شوند. گزارش باگ شماره 173 را ببینید: \%\&. .UNINDENT.SS نسخه 0.4.1 .sp \fIمنتشرشده در ۵ ژانویه ۲۰۱۵\fP .INDENT 0.0 .IP \(bu 2 تمام آرگومان‌های \fBcreate\fP از همهٔ فضاهای ذخیره‌سازی حذف شده‌اند. اکنون vdirsyncer می‌پرسد که آیا باید برای ایجاد مجموعه‌ها تلاش کند یا خیر. .IP \(bu 2 مقادیر پیکربندی قدیمی \fBTrue\fP، \fBFalse\fP، \fBon\fP، \fBoff\fP و \fBNone\fP اکنون نامعتبر هستند. .IP \(bu 2 تداخل‌های UID اکنون به جای نادیده گرفتن یکی از موارد، به درستی مدیریت می‌شوند؛ هرچند انتظار می‌رود سرورهای CardDAV و CalDAV خود به این موارد رسیدگی کنند. .IP \(bu 2 پشتیبانی رسمی از Baikal اضافه شد. .UNINDENT .SS نسخه 0.4.0 .sp \fIمنتشرشده در ۳۱ دسامبر ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 پارامتر \fBpasswordeval\fP به \fBpassword_command\fP تغییر نام یافته است\&. .IP \(bu 2 روش قدیمی برای نوشتن برخی مقادیر پیکربندی مانند فهرست‌ها حذف شده است. .IP \(bu 2 شناسایی مجموعه (Collection discovery) بازنویسی شده است. فایل‌های پیکربندی قدیمی باید با آن سازگار باشند، اما اکنون vdirsyncer نتایج شناسایی مجموعه را کَش می‌کند. در صورتی که مجموعه‌ها در یک طرف اضافه یا حذف شوند، باید دستور \fBvdirsyncer discover\fP را اجرا کنید. .IP \(bu 2 نام‌های جفت (pair) و فضای ذخیره‌سازی (storage) اکنون به نویسه‌های خاصی محدود شده‌اند. اگر فایل پیکربندی شما از این نظر نامعتبر باشد، vdirsyncer یک پیام خطای واضح صادر خواهد کرد. .IP \(bu 2 اکنون vdirsyncer از مشخصات XDG\-Basedir پشتیبانی می‌کند. اگر متغیر محیطی \fBVDIRSYNCER_CONFIG\fP تنظیم نشده باشد و فایل \fB~/.vdirsyncer/config\fP وجود نداشته باشد، به دنبال فایل پیکربندی در مسیر \fB$XDG_CONFIG_HOME/vdirsyncer/config\fP خواهد گشت\&. .IP \(bu 2 بهبودهایی در شناسایی CardDAV و CalDAV بر پایهٔ مشکلات مشاهده‌شده با FastMail صورت گرفته است. پشتیبانی از URIهای \fB\&.well\-known\fP اضافه شد. .UNINDENT .SS نسخه 0.3.4 .sp \fIمنتشرشده در ۸ دسامبر ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 چند رفع اشکال دیگر در مدیریت پیکربندی. .UNINDENT .SS نسخه 0.3.3 .sp \fIمنتشرشده در ۸ دسامبر ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 برنامهٔ vdirsyncer اکنون با iCloud نیز کار می‌کند. به‌ویژه شناسایی مجموعه و مدیریت etag اصلاح شده‌اند. .IP \(bu 2 اکنون vdirsyncer درخواست‌های CalDAV و CardDAV را به شکلی متفاوت کُدگذاری می‌کند. این تغییر با سرورهایی مانند Zimbra یا SoGo به طور کامل آزمایش نشده است، اما انتظار نمی‌رود مشکلی ایجاد کند. .IP \(bu 2 برنامهٔ vdirsyncer اکنون در برابر پاسخ‌های نامعتبر از سرورهای CalDAV مقاوم‌تر است. این امر به سازگاری آینده با Davmail/Outlook کمک خواهد کرد. .IP \(bu 2 رفع یک اشکال هنگام تعیین \fBitem_types\fP برای \fBcaldav\fP \%<#\:storage-caldav> در قالب منسوخ‌شدهٔ پیکربندی. .IP \(bu 2 رفع اشکالی که در آن vdirsyncer همهٔ نویسه‌ها به جز یک مورد را در مقدار مشخص‌شدهٔ \fBunsafe_href_chars\fP برای \fBcaldav\fP \%<#\:storage-caldav> و \fBcarddav\fP \%<#\:storage-carddav> نادیده می‌گرفت\&. .UNINDENT .SS نسخه 0.3.2 .sp \fIمنتشرشده در ۳ دسامبر ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 قالب فعلی پیکربندی منسوخ شده است و پشتیبانی از آن در نسخه 0.4.0 حذف خواهد شد. اکنون vdirsyncer در این باره هشدار می‌دهد. .UNINDENT .SS نسخه 0.3.1 .sp \fIمنتشرشده در ۲۴ نوامبر ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 رفع اشکالی که در آن اگر مواردی در سمت A حذف ولی در سمت B تغییر داده می‌شدند، vdirsyncer آن‌ها را حذف می‌کرد. اکنون در عوض، vdirsyncer موارد جدید را در سمت A بارگذاری خواهد کرد. گزارش مشکل شماره ۱۲۸ \% را ببینید\&. .IP \(bu 2 در صورت بروز نقص در یک جفت، همگام‌سازی با جفت‌های باقی‌مانده ادامه می‌یابد؛ گزارش مشکل شماره ۱۲۱ \% را ببینید\&. .IP \(bu 2 کلید پیکربندی \fBprocesses\fP حذف شده است. اکنون گزینهٔ \fB\-\-max\-workers\fP در خط فرمان وجود دارد که هدف مشابهی دارد. درخواست ادغام شماره ۱۲۶ \% را ببینید\&. .IP \(bu 2 پوستهٔ Read The Docs دیگر برای ساخت مستندات الزامی نیست. اگر نصب نباشد، پوستهٔ پیش‌فرض استفاده خواهد شد. گزارش مشکل شماره ۱۳۴ \% را ببینید\&. .UNINDENT.SS نسخه 0.3.0 .sp \fIمنتشر شده در ۲۰ سپتامبر ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 افزودن پارامتر \fBverify_fingerprint\fP به \fBhttp\fP \%<#\:storage-http>، \fBcaldav\fP \%<#\:storage-caldav> و \fBcarddav\fP \%<#\:storage-carddav>، گزارش مشکل #99 \% و درخواست ادغام #106 \%\& را ببینید. .IP \(bu 2 افزودن پارامتر \fBpasswordeval\fP به General Section \%<#\:general-config>، گزارش مشکل #108 \% و درخواست ادغام #117 \%\& را ببینید. .IP \(bu 2 صدور هشدار (به‌جای استثنا) در رابطه با برخی پاسخ‌های نامعتبر از سرور، گزارش مشکل #113 \%\& را ببینید. این مورد ظاهراً برای سازگاری با Davmail الزامی است. .UNINDENT .SS نسخه 0.2.5 .sp \fIمنتشر شده در ۲۷ اوت ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 عدم درخواست گذرواژه یک سرور بیش از یک‌بار و رفع چندین مشکل هم‌زمانی، گزارش مشکل #101 \%\& را ببینید. .IP \(bu 2 اعتبارسنجی بهتر نقطه‌های پایانی DAV. .UNINDENT .SS نسخه 0.2.4 .sp \fIمنتشر شده در ۱۸ اوت ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 گنجاندن راه‌حل موقت برای کشف مجموعه‌ها با آخرین نسخه Radicale. .IP \(bu 2 گنجاندن فایل‌های متادیتا مانند changelog یا مجوز در بسته توزیع منبع، گزارش مشکل #97 \% و گزارش مشکل #98 \%\& را ببینید. .UNINDENT .SS نسخه 0.2.3 .sp \fIمنتشر شده در ۱۱ اوت ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 اکنون vdirsyncer دارای پرچم \fB\-\-version\fP است، گزارش مشکل #92 \%\& را ببینید. .IP \(bu 2 رفع تعداد زیادی از باگ‌های مربوط به نویسه‌های خاص در URLها، گزارش مشکل #49 \%\& را ببینید. .UNINDENT .SS نسخه 0.2.2 .sp \fIمنتشر شده در ۰۴ اوت ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 حذف یک بررسی امنیتی که در نشانی‌های وب DAV با نویسه‌های خاص و سرورهای معینی ایجاد مشکل می‌کرد. علاوه بر این، آن بررسی امنیتی بی‌معنی بود. گزارش مشکل #87 \% و گزارش مشکل #91 \%\& را ببینید. .IP \(bu 2 تغییر برخی خطاها به هشدار، گزارش مشکل #88 \%\& را ببینید. .IP \(bu 2 بهبود کشف خودکار مجموعه‌ها برای سرورهای فاقد پشتیبانی کامل. .UNINDENT .SS نسخه 0.2.1 .sp \fIمنتشر شده در ۰۵ ژوئیه ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 رفع باگی که در آن vdirsyncer هنگام استفاده از CardDAV با Zimbra دفترچه‌های نشانی را خالی نشان می‌داد. .IP \(bu 2 رفع حلقه بی‌نهایت هنگام عدم وجود گذرواژه در keyring سامانه. .IP \(bu 2 رنگی‌سازی خطاها، هشدارها و پیام‌های اشکال‌زدایی (debug). .IP \(bu 2 اکنون vdirsyncer به‌جای argvard به بسته \fBclick\fP وابسته است. .UNINDENT .SS نسخه 0.2.0 .sp \fIمنتشر شده در ۱۲ ژوئن ۲۰۱۴\fP .INDENT 0.0 .IP \(bu 2 اکنون vdirsyncer برای رهایی از تجزیه‌کننده خراب خود، به بسته \fBicalendar\fP از PyPI وابسته است. .IP \(bu 2 اکنون vdirsyncer به \fBrequests_toolbelt\fP نیز وابسته است. این موضوع حدس زدن نوع احراز هویت را به‌جای پیش‌فرض گرفتن بی‌چون‌وچرای \fBbasic\fP ممکن می‌سازد. .IP \(bu 2 رفع یک شبه‌باگ در ذخیره‌سازهای caldav و carddav که در آن به‌جای etag صحیح، یک چندتایی (href, etag) از متد upload بازگردانده می‌شد. ممکن است vdirsyncer هنگام ارتقا به این نسخه، کپی‌برداری غیرضروری انجام دهد. .IP \(bu 2 افزودن ذخیره‌ساز \fBsinglefile\fP \%<#\:storage-singlefile>\&. گزارش مشکل #48 \%\& را ببینید. .IP \(bu 2 پارامتر \fBcollections\fP برای بخش‌های pair اکنون مقادیر خاص \fBfrom a\fP و \fBfrom b\fP را برای کشف خودکار مجموعه‌ها می‌پذیرد. بخش Pair Section \%<#\:pair-config>\& را ببینید. .IP \(bu 2 پارامتر \fBread_only\fP به بخش‌های ذخیره‌ساز اضافه شد. بخش Storage Section \%<#\:storage-config>\& را ببینید. .UNINDENT.SS نسخه 0.1.5 .sp \fIمنتشر شده در 14 مه 2014\fP .INDENT 0.0 .IP \(bu 2 معرفی گزارش تغییرات (changelogs) .IP \(bu 2 رفع بسیاری از باگ‌ها .IP \(bu 2 اصلاحات متعدد در مستندات .IP \(bu 2 اکنون vdirsyncer برای همگام‌سازی لزوماً نیازی به UIDها ندارد. .IP \(bu 2 اکنون اگر یک مجموعه در فاصله بین دو همگام‌سازی کاملاً خالی شده باشد، vdirsyncer متوقف می‌شود. گزارش شماره 42 را ببینید: \%\&. .UNINDENT .SH "دست‌اندرکاران و مجوز (CREDITS AND LICENSE)" .SS مشارکت‌کنندگان .sp به ترتیب حروف الفبا: .INDENT 0.0 .IP \(bu 2 Ben Boeckel .IP \(bu 2 Bleala .IP \(bu 2 Christian Geier .IP \(bu 2 Clément Mondon .IP \(bu 2 Corey Hinshaw .IP \(bu 2 Kai Herlemann .IP \(bu 2 Hugo Osvaldo Barrera .IP \(bu 2 Jason Cox .IP \(bu 2 Julian Mehne .IP \(bu 2 Malte Kiefer .IP \(bu 2 Marek Marczykowski\-Górecki .IP \(bu 2 Markus Unterwaditzer .IP \(bu 2 Michael Adler .IP \(bu 2 rEnr3n .IP \(bu 2 Thomas Weißschuh .IP \(bu 2 Witcher01 .IP \(bu 2 samm81 .UNINDENT .sp تشکر ویژه از: .INDENT 0.0 .IP \(bu 2 FastMail \% که یک حساب پولی را برای آزمایش سرورهایشان حمایت مالی می‌کند. .IP \(bu 2 Packagecloud \% که مخازن بسته‌های Debian برنامه vdirsyncer را فراهم می‌کند. .UNINDENT .SS مجوز .sp حق نشر (c) 2014\-2020 متعلق به Markus Unterwaditzer و مشارکت‌کنندگان. برای جزئیات بیشتر AUTHORS.rst را ببینید. .sp برخی حقوق محفوظ است. .sp توزیع مجدد و استفاده از این نرم‌افزار و مستندات آن در قالب‌های سورس و باینری، با یا بدون تغییر، به شرط رعایت شرایط زیر مجاز است: .INDENT 0.0 .IP \(bu 2 توزیع‌های مجدد کد منبع باید اعلان حق نشر بالا، این فهرست شرایط و سلب مسئولیت زیر را حفظ کنند. .IP \(bu 2 توزیع‌های مجدد در قالب باینری باید اعلان حق نشر بالا، این فهرست شرایط و سلب مسئولیت زیر را در مستندات و/یا سایر موارد ارائه‌شده همراه با توزیع، بازتولید کنند. .IP \(bu 2 نام‌های مشارکت‌کنندگان نباید بدون مجوز کتبی و قبلی مشخص، برای تأیید یا تبلیغ محصولات مشتق‌شده از این نرم‌افزار به کار رود. .UNINDENT .sp این نرم‌افزار و مستندات توسط دارندگان حق نشر و مشارکت‌کنندگان به صورت \(dqهمان‌گونه که هست\(dq ارائه شده است و هرگونه ضمانت صریح یا ضمنی، از جمله ضمانت‌های ضمنی خریدوفروش و تناسب برای یک هدف خاص، سلب می‌شود. در هیچ موردی مالک حق نشر یا مشارکت‌کنندگان مسئول هرگونه خسارت مستقیم، غیرمستقیم، تصادفی، خاص، نمونه‌ای یا تبعی (از جمله تهیه کالاها یا خدمات جایگزین؛ از دست دادن استفاده، داده‌ها یا سودها؛ یا وقفه در کسب‌وکار) به هر نحوی که ایجاد شده باشد و بر پایه هر نظریه مسئولیتی، چه قراردادی، چه مسئولیت مدنی یا شبه‌جرم (از جمله سهل‌انگاری یا موارد دیگر) که به هر نحو ناشی از استفاده از این نرم‌افزار و مستندات باشد نخواهند بود، حتی اگر احتمال وقوع چنین خسارتی گوشزد شده باشد..SH "حمایت‌های مالی (DONATIONS)" .sp vdirsyncer یک نرم‌افزار آزاد و متن‌باز است و همواره چنین خواهد ماند. ما از حامیانی که مایل به تأمین مالی ادامهٔ کار ما روی آن هستند، قدردانی می‌کنیم. .sp اگر کار من برایتان مفید بوده است، لطفاً حمایت مالی از آن را مد نظر داشته باشید. با سپاس! .INDENT 0.0 .IP \(bu 2 بیت‌کوین (Bitcoin): \fB13p42uWDL62bNRH3KWA6cSpSgvnHy1fs2E\fP\&. .IP \(bu 2 حمایت از طریق پرداخت‌های یک‌باره یا کمک‌های مالی دوره‌ای از طریق Ko\-fi \%\&. .IP \(bu 2 حمایت از طریق کمک‌های مالی دوره‌ای از طریق liberapay \%\&. .UNINDENT .SH "نویسندگان (AUTHORS)" Markus Unterwaditzer .SH "کپی‌رایت و تکثیر (COPYRIGHT)" 2014-2026, Markus Unterwaditzer و مشارکت‌کنندگان .\" End of generated man page.