الخلاصة

  • CODEOWNERS إعداد لتوجيه المسؤولية بحسب المسار والفرع؛ ويمكن لـ GitHub أن يطلب تلقائياً مراجعة المالكين عندما يغير طلب سحب غير مسودة كوداً يملكونه.
  • النتيجة تتوقف على ملف الفرع الأساسي، وأولوية موضعه، وآخر نمط مطابق، والمسارات المعدلة، وأهلية المالك. الملف المعروض الآن لا يثبت نتيجة حدث سابق.
  • يجب أن يفصل سجل المراجعة بين الإعداد الساري والفرق والطلب ورد المراجع وشروط الدمج الأخرى؛ وهذه توصية تحريرية لإثبات الوقائع وليست شرطاً من GitHub.

قاعدة التوجيه ليست واقعة مراجعة

عبارة «راجع المالك التغيير» تبدو حاسمة، لكنها تخفي أسئلة مستقلة. ما الفرع الأساسي؟ ما المسارات التي تغيرت؟ أي نمط كانت له الأولوية؟ هل كان المستخدم أو الفريق المذكور يملك صلاحية كافية وقتها؟ هل أرسل طلب فعلاً، وهل وصل رد على الفرق المقصود؟ وهل كانت موافقة المالك مطلوبة أصلاً؟ وجود ملف في المتصفح لا يجيب عن سلسلة الأسئلة هذه.

يصف GitHub CODEOWNERS بأنه وسيلة لتعريف أفراد أو فرق مسؤولة عن كود المستودع. فعندما يعدل طلب سحب غير مسودة كوداً ذا مالك، يطلب GitHub مراجعة ذلك المالك تلقائياً. أما المسودة فلا تطلب المراجعة تلقائياً قبل تحويلها إلى حالة الجاهزية للمراجعة. القيمة هنا هي توجيه الانتباه إلى الاختصاص؛ وليست تحويل الإشعار إلى حكم مكتمل.

الفرع جزء من القاعدة. فكل ملف CODEOWNERS يحدد مالكين لفرع واحد، وتستخدم طلبات المراجعة النسخة الموجودة في الفرع الأساسي لطلب السحب. وعند الإرسال من fork إلى المستودع الأصلي، تحكم نسخة الفرع الأساسي في المستودع الأصلي. لذلك قد يحل التصحيح نفسه إلى مالكين مختلفين إذا استهدف main أو فرع صيانة. لا يصلح ملف الرأس أو ملف ظهر لاحقاً في الفرع الافتراضي دليلاً بديلاً عن السياسة التي كانت سارية.

ولموضع الملف أثره أيضاً. يبحث GitHub في .github/ ثم الجذر ثم docs/ ويستخدم أول ملف يعثر عليه. وإذا تجاوز الملف ثلاثة ميغابايت فلا يُحمّل، فلا تظهر ملكية ولا ترسل طلبات إلى المالكين المناسبين. وجود نص للسياسة في المستودع يختلف عن ثبوت أن ذلك النص شارك في توجيه واقعة بعينها.

آخر تطابق قد يبدل صاحب المسؤولية

تبدو الأنماط وكأنها تتراكم، لكن GitHub يعطي الأولوية لآخر نمط مطابق. يمكن لقاعدة * العامة أن تُستبدل بالنسبة لتغيير JavaScript بقاعدة *.js تليها. يشارك عدة مالكين النمط إذا وردوا في السطر نفسه؛ أما وضعهم على أسطر مختلفة تطابق المسار نفسه فيجعل النتيجة الأخيرة هي الحاكمة. من يقتبس القاعدة العامة من دون إعادة بناء ترتيبها ومسارات الفرق قد ينسب طلب المراجعة إلى طرف لم يُطلب منه شيء.

هناك شروط صلاحية إضافية: المسارات حساسة لحالة الأحرف، والسطر ذي الصياغة غير الصحيحة يُتجاوز، والمستخدم أو الفريق غير الموجود أو ناقص الصلاحية لا يُعيَّن مالكاً. هذه الحقائق لا تتهم مستودعاً بعينه؛ بل تمنع تحويل لقطة إعداد إلى برهان آلي على حدث.

وينصح GitHub كذلك بتعيين مالك لملف CODEOWNERS نفسه. هذه النصيحة تكشف بنية الحوكمة: القاعدة التي توزع المسؤولية تحتاج إلى مسار تعديل ظاهر خاص بها. وإلا عرف القارئ من يفترض أنه يملك الكود، ولم يعرف من كان يستطيع تغيير قاعدة الملكية.

الطلب والموافقة والدمج أسطح مختلفة

يفصل GitHub بين طلب المراجعة التلقائي وبين خيار اشتراط موافقة مالك الكود قبل الدمج؛ فالخيار الثاني يفعّله مسؤول أو مالك للمستودع بصورة مستقلة. وعندما يشترك عدة مالكين في النمط، قد تكفي موافقة واحد منهم عند تفعيل الشرط. لا يحول الملف وحده كل اسم فيه إلى حق نقض للدمج.

كما يمكن أن تعمل rulesets وحماية الفروع معاً. تتجمع القواعد المنطبقة، وإذا اختلفت صياغة القاعدة نفسها تسود النسخة الأشد تقييداً. وقد تكون طلبات السحب وعدد الموافقات وفحوص الحالة ونجاح النشر وحل التعليقات وطريقة الدمج وصلاحيات التجاوز شروطاً منفصلة. ويذكر GitHub أن طلب سحب اكتملت مراجعاته المطلوبة قد يبقى محجوباً إذا كان طلب آخر يشير إلى commit الرأس نفسه ويحمل مراجعة معلقة أو مرفوضة.

الموافقة ذات قيمة حقيقية: إنها تشير إلى أن التغييرات تبدو جاهزة للدمج. لكنها حالة مراجعة لنطاق محدد، وليست شهادة بأن كل قاعدة وكل فحص وكل إجراء لاحق قد تحقق.

سجل من الإعداد إلى المراجعة

ينبغي أن يبدأ السجل الصغير لأي ادعاء مهم بمعرف طلب السحب ومراجع القاعدة والرأس ومجموعة المسارات المعدلة. ثم يحفظ موضع ملف CODEOWNERS وهويته المحتوائية في الفرع الأساسي، والنمط الفائز ومجموعة المالكين التي حُلت. وبعدها فقط تأتي الوقائع: وقت طلب المراجعة، ورد المراجع، والفرق أو commit الذي غطاه الرد.

وعندما يصل الادعاء إلى الاستعداد للدمج، يجب أن يذكر على حدة قواعد الحماية أو rulesets السارية وحالات الشروط المرصودة وأي تجاوز موثق. حيث يغيب الدليل، يتوقف الادعاء عند الحلقة السابقة. لا ينشئ ذلك سلطة جديدة ولا إجراء GitHub جديداً؛ إنه يمنع أن تتحول سياسة حالية إلى رواية مكتملة عن واقعة ماضية.

المصادر

  1. GitHub Docs — About code owners
  2. GitHub Docs — Pull request reviews
  3. GitHub Docs — About rulesets
  4. GitHub Docs — Available rules for rulesets