فيسبوك يكشف عن نظام جديد للتحكم بالمصادر Sapling

نشر فيسبوك (المحظور في الاتحاد الروسي) نظام التحكم بالمصدر Sapling، المستخدم في تطوير مشاريع الشركة الداخلية. يهدف النظام إلى توفير واجهة مألوفة للتحكم في الإصدار يمكنها التوسع في المستودعات الكبيرة جدًا التي تغطي عشرات الملايين من الملفات والالتزامات والفروع. رمز العميل مكتوب بلغة Python وRust، وهو مفتوح بموجب ترخيص GPLv2.

تم تطوير جزء الخادم بشكل منفصل للعمل الفعال عن بعد مع المستودعات ونظام ملفات افتراضي للعمل مع شريحة محلية من جزء من المستودع كمستودع كامل (يرى المطور المستودع بأكمله، ولكن فقط البيانات المطلوبة التي يتم الوصول إليها يتم نسخها إلى النظام المحلي). ولم يتم بعد فتح الكود الخاص بهذه المكونات المستخدمة في البنية التحتية لفيسبوك، لكن الشركة وعدت بنشره في المستقبل. ومع ذلك، حاليًا في مستودع Sapling، يمكنك بالفعل العثور على نماذج أولية لخادم Mononoke (في Rust) وVFS EdenFS (في C++). هذه المكونات اختيارية ويكفي عميل Sapling للعمل، والذي يدعم استنساخ مستودعات Git والتفاعل مع الخوادم المعتمدة على Git LFS والعمل مع مواقع استضافة git مثل GitHub.

الفكرة الرئيسية للنظام هي أنه عند التفاعل مع جزء خادم خاص يوفر تخزين المستودع، يتم تحجيم جميع العمليات اعتمادًا على عدد الملفات المستخدمة فعليًا في الكود الذي يعمل عليه المطور، ولا تعتمد على الحجم الإجمالي للمستودع بأكمله. على سبيل المثال، قد يستخدم المطور جزءًا صغيرًا فقط من التعليمات البرمجية من مستودع كبير جدًا وسيتم ترحيل هذا الجزء الصغير فقط إلى نظامه، وليس المستودع بأكمله. يتم ملء دليل العمل ديناميكيًا عند الوصول إلى الملفات من المستودع، مما يسمح لك، من ناحية، بتسريع العمل بشكل كبير مع الجزء الخاص بك من التعليمات البرمجية، ولكن من ناحية أخرى يؤدي إلى تباطؤ عند الوصول إلى ملفات جديدة لـ لأول مرة ويتطلب الوصول المستمر إلى الشبكة (وضع منفصل وغير متصل لإعداد الالتزامات).

بالإضافة إلى تحميل البيانات التكيفية، تقوم Sapling أيضًا بتنفيذ تحسينات تهدف إلى تقليل تحميل المعلومات مع محفوظات التغييرات (على سبيل المثال، 3/4 من البيانات الموجودة في مستودع مع Linux kernel هي محفوظات التغييرات). للعمل بفعالية مع سجل التغييرات، يتم تخزين البيانات المرتبطة به في تمثيل مجزأ يسمح لك بتنزيل أجزاء فردية من الرسم البياني للالتزام من الخادم. يمكن للعميل أن يطلب معلومات من الخادم حول العلاقة بين العديد من الالتزامات وتنزيل الجزء الضروري فقط من الرسم البياني.

لقد تم تطوير المشروع على مدار السنوات العشر الماضية وتم إنشاؤه لحل المشكلات عند تنظيم الوصول إلى مستودعات متجانسة كبيرة جدًا بفرع رئيسي واحد يستخدم عملية "rebase" بدلاً من "الدمج". في ذلك الوقت، لم تكن هناك حلول مفتوحة للعمل مع مثل هذه المستودعات، وقرر مهندسو فيسبوك إنشاء نظام جديد للتحكم في الإصدار يلبي احتياجات الشركة، بدلاً من تقسيم المشاريع إلى مستودعات صغيرة، الأمر الذي من شأنه أن يؤدي إلى تعقيد إدارة التبعية (في وقت واحد، لحل مشكلة مماثلة، أنشأت Microsoft طبقة GVFS). في البداية استخدم فيسبوك نظام Mercurial وتم تطوير مشروع Sapling في المرحلة الأولى كإضافة لنظام Mercurial. وبمرور الوقت، تحول النظام إلى مشروع مستقل له بروتوكوله الخاص وتنسيق تخزينه وخوارزمياته، والتي تم توسيعها أيضًا مع القدرة على التفاعل مع مستودعات Git.

بالنسبة للعمل، يتم تقديم أداة مساعدة لسطر الأوامر "sl"، والتي تنفذ المفاهيم النموذجية وسير العمل وواجهة مألوفة للمطورين المطلعين على Git وMercurial. تختلف المصطلحات والأوامر في Sapling قليلاً عن Git وهي أقرب إلى Mercurial. على سبيل المثال، بدلاً من الفروع، يتم استخدام "الإشارات المرجعية" (الفروع المسماة غير مدعومة)، بشكل افتراضي، عند تنفيذ الاستنساخ/السحب، لا يتم تحميل المستودع بأكمله، ولكن الفرع الرئيسي فقط، ولا توجد علامات أولية على الالتزامات ( منطقة التدريج)، بدلاً من "git fetch"، يتم استخدام الأمر "sl" pull"، بدلاً من "git pull" - "sl pull -rebase"، بدلاً من "git checkout COMMIT" - "sl goto COMMIT"، بدلاً من "git reflog" - "sl Journal"، لإلغاء التغيير بدلاً من "git checkout - FILE"، تم تحديد "sl revert FILE"، ويتم استخدام "." لتحديد فرع "HEAD". ولكن بشكل عام، يتم الحفاظ على المفاهيم العامة للفروع وعمليات الاستنساخ/السحب/الدفع/الالتزام/إعادة الأساس.

من بين الميزات الإضافية لمجموعة أدوات Sapling، يبرز دعم "smartlog"، والذي يسمح لك بتقييم حالة مستودعك بشكل مرئي، وتسليط الضوء على أهم المعلومات وتصفية التفاصيل غير المهمة. على سبيل المثال، عند تشغيل الأداة المساعدة sl بدون وسيطات، يتم عرض التغييرات المحلية الخاصة بك فقط على الشاشة (يتم تصغير التغييرات الأخرى)، وتظهر حالة الفروع الخارجية والملفات التي تم تغييرها والإصدارات الجديدة من الالتزامات. بالإضافة إلى ذلك، يتم تقديم واجهة ويب تفاعلية، مما يجعل من الممكن التنقل بسرعة عبر السجل الذكي وتغيير الشجرة والالتزامات.

فيسبوك يكشف عن نظام جديد للتحكم بالمصادر Sapling

هناك تحسين ملحوظ آخر في Sapling وهو أنه يسهل إصلاح الأخطاء وحلها والعودة إلى الحالة السابقة. على سبيل المثال، يتم تقديم الأوامر "sl undo" و"sl redo" و"sl uncommit" و"sl unamend" للتراجع عن العديد من العمليات، ويتم استخدام الأوامر "sl Hide" و"sl unhide" لإخفاء الالتزامات مؤقتًا؛ وللتنقل التفاعلي عبر الحالات القديمة والعودة إلى النقطة المحددة باستخدام الأمر "sl undo -i command". يدعم Sapling أيضًا مفهوم مكدس الالتزام، والذي يسمح لك بتنظيم مراجعات خطوة بخطوة عن طريق تقسيم الوظائف المعقدة إلى مجموعة من التغييرات الإضافية الأصغر والأكثر قابلية للفهم (من إطار عمل أساسي إلى وظيفة منتهية).

تم إعداد العديد من الإضافات لـ Sapling، بما في ذلك واجهة ReviewStack لمراجعة التغييرات (الكود الموجود ضمن GPLv2)، والذي يسمح لك بمعالجة طلبات السحب على GitHub واستخدام عرض مكدس للتغييرات. بالإضافة إلى ذلك، تم نشر إضافات للتكامل مع محرري VSCode وTextMate، بالإضافة إلى تنفيذ واجهة وخادم ISL (Interactive SmartLog).

المصدر: opennet.ru

إضافة تعليق