مواد پر جائیں

PR گفتگوئیں

pull request پہلے ہی وہ جگہ ہے جہاں کوڈ کے بارے میں گفتگو ہوتی ہے۔ PR گفتگوئیں اُسے Control Center کے ورک اسپیس کی ایک سطح بنا دیتی ہیں، بالکل اُسی طرح جیسے چیٹ برج Slack کو بناتا ہے: کسی PR پر سرور کے GitHub App بوٹ کا @-ذکر کریں، اُس کے ریویو تھریڈز میں جواب دیں، یا ai-review لیبل شامل کریں — اور کام PR کے ریویو اسپیس میں ہوتا ہے، اُنہی انتساب اور گارڈریلز کے تحت جو ایپ میں ٹائپ کی گئی کسی بھی چیز پر لاگو ہوتے ہیں۔ تبصرے پر رکنیت کی بھی شرط لگتی ہے؛ لیبل پر نہیں، کیونکہ اُس کا کوئی مصنف نہیں ہوتا۔ بوٹ کے جواب GitHub پر واپس آتے ہیں، اُسی لین میں جہاں سوال پوچھا گیا تھا۔

اِس خصوصیت کی ساخت تین فیصلے کرتے ہیں، اور ہر فیصلہ وہی ہے جو چیٹ برج نے چیٹ کے لیے کیا تھا، بس forge کے لیے دہرایا گیا: کنکشن کس سمت چلتا ہے، باہر سے آنے والے تبصرے کو کیا اجازت دیتا ہے اور ہر فریق کس سے منسوب ہوتا ہے۔

کسی ایپ کے لیے GitHub کا واحد پش چینل ویب ہک ہے، اور ویب ہک کو ایک اِن باؤنڈ URL چاہیے — اور یہی وہ واحد چیز ہے جس کی اِس سطح کو جان بوجھ کر کبھی ضرورت نہیں پڑتی۔ چنانچہ دریافت ایک اسکین کی صورت میں ہوتی ہے: تقریباً ہر منٹ، فی ایپ انسٹالیشن ایک ہی عرفی تلاش GitHub سے وہ PRs مانگتی ہے جن میں بوٹ کا ذکر ہو (یا اُس کا مختصر slug)، اور وہ کھلے PRs جن پر ریویو لیبل ہو؛ جن PRs کا ریویو اسپیس پہلے سے موجود ہو اُن کے تبصرہ تھریڈز پڑھے جاتے ہیں، اور ہر چیز کا موازنہ تبصرے کے id کی بنیاد پر پچھلے اسکین میں دیکھی گئی چیزوں سے کیا جاتا ہے۔

اِس ڈیزائن کے نتائج قابلِ ذکر ہیں:

  • تاخیر ایک اسکین وقفے کے برابر ہے، کسی ایونٹ کے برابر نہیں۔ 👀 کی تصدیق تقریباً ایک منٹ میں پہنچ جاتی ہے۔ اِس پر کوئی فوری کام منحصر نہیں۔
  • بالکل ایک بار، فی تبصرہ۔ تبصرے کے id پورے GitHub میں منفرد ہوتے ہیں؛ ہر ایک کو اُسی لمحے ریکارڈ کر لیا جاتا ہے جب اُسے اہل قرار دیا جاتا ہے، کسی کے اُس پر عمل کرنے سے پہلے۔ ایک کریش تبصرے کی کارروائی ضائع کر سکتا ہے، مگر اُسے دو بار نہیں چلا سکتا۔
  • ڈاؤن ٹائم کی بھرپائی ہوتی ہے، دوبارہ چلایا نہیں جاتا۔ دیکھی گئی چیزوں کا سیٹ محفوظ رہتا ہے، اس لیے دوبارہ شروع ہونے پر وہ سب پہنچ جاتا ہے جو بندش کے دوران آیا۔ صرف ایک استثنا ہے: سب سے پہلا اسکین — موازنے کے لیے کوئی یادداشت نہ ہونے کے سبب، ہر زیرِ التوا چیز خاموشی سے ریکارڈ کر لی جاتی ہے۔ جو آپریٹر اِس سرور کے وجود میں آنے سے پہلے بیس PRs پر لیبل لگا چکا ہو، اُسے واپسی پر بیس چلتی ہوئی ریویوز نہیں ملنی چاہئیں۔
  • لیبل ایک سیٹ ہے، کوئی ایونٹ نہیں۔ تلاش لیبل کی موجودگی بتاتی ہے، اس لیے لیبل والا PR صرف ایک بار چلتا ہے، بس۔ لیبل ہٹانے کے بعد اُسے دوبارہ لگانا اسکین کو نظر نہیں آتا؛ دوبارہ چلانے کا راستہ ذکر ہے۔

تلاش فی انسٹالیشن اکاؤنٹ ایک بار، اُسی مالک کے اپنے کلائنٹ پر چلتی ہے، کیونکہ انسٹالیشن ٹوکن صرف اپنی ہی انسٹالیشن کے ریپوز دیکھتا ہے — پورے سرور کے لیے ایک واحد اسناد ایپ کی دوسری انسٹالیشنز کے تمام PRs کو خاموشی سے نظر انداز کر دیتی۔

PR کا تبصرہ اپنے ساتھ مصنف کے لاگ اِن سے زیادہ کچھ نہیں لاتا — ثابت ہونے تک ایک غیر تصدیق شدہ بیرونی شناخت۔ بوٹ اُسے ورک اسپیس کے اراکین اور اُن کے جڑے GitHub اکاؤنٹس کے ایک معکوس انڈیکس کے خلاف حل کرتا ہے، جو TTL پر دوبارہ بنایا جاتا ہے کیونکہ سرور چلتے ہوئے لوگ سائن اِن کرتے ہیں اور دعوتیں ملتی ہیں۔

بند ہو کر ناکام ہونا ایک سیڑھی کی صورت ہے، اور ہر زینہ اُسی تھریڈ میں جواب دیتا ہے جس میں اُس نے انکار کیا:

  • نامعلوم لاگ اِن — جو جڑا ہوا نہ ہو، یا کسی ایسے شخص نے جڑا ہو جو اِس ورک اسپیس کا رکن نہ ہو — اُسے کہا جاتا ہے کہ سائن اِن کرے اور یقینی بنائے کہ وہ اِسی ورک اسپیس کا حصہ ہے
  • صرف پڑھنے والے رکن (viewer یا guest) کو بتایا جاتا ہے کہ اُس کا کردار کام شروع نہیں کر سکتا

نامعلوم لاگ اِن کی دونوں صورتیں ایک ہی جواب پاتی ہیں: معکوس انڈیکس صرف اِسی ورک اسپیس کا رکن واپس کرتا ہے، اس لیے نہ جڑا ہوا اکاؤنٹ اور جڑا ہوا غیر رکن ایک ہی طرح مس ہوتے ہیں۔ اِن میں سے کوئی آگے نہیں بڑھتا۔ کوئی تبصرہ کبھی کسی ایسے شخص سے منسوب نہیں ہوتا جس نے اُسے بھیجا نہ ہو، اور کسی اجنبی کے الفاظ کبھی ایسے ورک اسپیس میں داخل نہیں ہوتے جسے وہ دیکھ نہیں سکتا۔

ai-review لیبل کا کوئی مصنف نہیں جسے حل کیا جائے، اس لیے وہ اِس سیڑھی پر نہیں چڑھتا۔ اُسے شامل کرنے سے ریویو اُس ورک اسپیس میں شروع ہو جاتا ہے جو پہلے سے ریپوزٹری سے جڑا ہوا ہے۔

گفتگو کا ہر فریق ایک الگ شناخت رکھتا ہے، اور یہی فرق اصل خصوصیت ہے:

  • GitHub پر بوٹ ہی سرور ہے۔ برج جو بھی تبصرہ، ردعمل اور جواب پوسٹ کرتا ہے، وہ ایپ کے انسٹالیشن ٹوکن کے تحت جاتا ہے۔ کسی کلائنٹ میں کسی نے کچھ کلک نہیں کیا، اس لیے کوئی چیز کسی شخص کا اکاؤنٹ مستعار نہیں لیتی — وہی اصول جو ویب ہکس اور پولنگ کو انسانی اسناد سے دور رکھتا ہے۔
  • اسپیس میں سوال آپ کا ہے۔ پیغام اُس رکن سے منسوب ہوتا ہے جس پر مصنف حل ہوا، اور ایجنٹ رن اُن کی طرف سے چلتا ہے: کمیٹس اُنہیں بطور معاون مصنف درج کرتے ہیں، اور اسپیس کا خود مختاری کا ڈائل اور ایکشن گارڈریلز بالکل ویسے ہی لاگو ہوتے ہیں جیسے ایپ میں ٹائپ کیے گئے پیغام پر۔ رن سے ہونے والی forge کی تحریریں پھر بھی بطور ایپ ہی جاتی ہیں — وہی اصول جو اوپر والے نکتے میں ہے — رکن کے ذاتی ٹوکن پر نہیں۔

ریویو کے نتائج واپس GitHub پر شائع کرنا اب بھی کسی انسان کا فیصلہ ہے، جو Control Center میں ہوتا ہے۔ کوئی ذکر ریویو شروع کر سکتا ہے؛ شائع کوئی انسان ہی کرتا ہے۔

کسی بوٹ اکاؤنٹ کی لکھی ہر چیز کسی بھی گیٹ کے چلنے سے پہلے ہی خارج کر دی جاتی ہے — خاص طور پر ہمارا، اور ہر [bot] لاحقہ، تاکہ کسی دوسری ایپ کا ریویو بوٹ بھی ہمارے بوٹ کو نہ جگا سکے۔ یہ نہ ہوتا تو بوٹ کے اپنے جواب نئے تبصرے بن کر آتے اور اُسے ہمیشہ کے لیے دوبارہ متحرک کرتے رہتے۔

[bot] لاحقہ ہی وہ وجہ ہے کہ مختصر شکل موجود ہے۔ GitHub کسی ایپ اکاؤنٹ کا لاگ اِن <slug>[bot] پر مقرر کر دیتا ہے، اُس کے لیے کوئی آٹو کمپلیٹ نہیں دیتا، اور @slug کو کبھی ایپ پر حل نہیں کرتا — چنانچہ ننگے slug کو قبول کرنا ہمارے میچر کا فیصلہ ہے، اور اُسے دریافت کرنے کے لیے GitHub کے ذکر انڈیکس کے بجائے تبصرے کے متن پر خام تلاش کا ایک لین درکار ہے۔ لاگت چھپانے کے بجائے صاف بتا دی جاتی ہے: جو انسانی صارف ایپ کا slug شیئر کرتا ہو، اپنے ہر مختصر شکل والے ذکر سے بوٹ کو مخاطب کرتا ہے۔ نمایاں ناموں والی ایپس میں یہ ٹکراؤ فرضی رہتا ہے۔

  • خودکار اشاعت نہیں۔ نتائج ریویو اسپیس میں پہنچتے ہیں؛ GitHub پر شائع کرنا ایک الگ، انسانی عمل ہے
  • دھندلی شناخت نہیں۔ مصنف بالکل ایک ہی رکن پر حل ہوتا ہے یا مسترد کر دیا جاتا ہے — کوئی اندازے والا انتساب نہیں
  • کوئی GitHub App ویب ہک نہیں۔ یہ سطح کبھی کوئی ویب ہک رجسٹر نہیں کرتی، اس لیے PR تبصروں کے لیے ظاہر کرنے کو کوئی اِن باؤنڈ URL نہیں ہوتا۔ پروڈکٹ کے دیگر ویب ہکس (پائپ لائنز، ٹکٹ سنک) ایک الگ، اختیاری سیٹ اپ ہیں۔