REDO-STAMP(1) User Commands REDO-STAMP(1)

redo-stamp - تشخیص اینکه آیا هدف فعلی تغییر معناداری داشته است یا خیر

redo-stamp <$3

به طور معمول، هنگامی که redo(1) یک هدف T را می‌سازد، تمام اهداف دیگری که به T وابسته‌اند، قدیمی (out of date) علامت‌گذاری می‌شوند. حتی اگر T بازسازی‌شده با نسخه قبلی همسان باشد، تمام وابستگان آن باید بازسازی شوند.

با فراخوانی redo-stamp از درون اسکریپت .do خود، می‌توانید به redo اعلام کنید که حتی اگر هدف فعلی در حال ساخت باشد، ممکن است خروجی آن در نهایت بدون تغییر باقی بماند. اگر تغییر نکرده باشد، redo ممکن است بتواند از ساخت سایر اهدافی که به این هدف وابسته‌اند جلوگیری کند.

دستور redo-stamp هدف فعلی را با مقایسه stdin خود با ورودی ارسال‌شده در آخرین باری که redo-stamp برای این هدف فراخوانی شده بود، به عنوان تغییریافته یا بدون تغییر علامت‌گذاری می‌کند.

داده‌های مهر (stamp) می‌توانند هر چیزی باشند که می‌خواهید. برخی از موارد محتمل عبارتند از:

•
محتوای واقعی فایل هدف:
redo-stamp <$3
•
فهرستی از نام فایل‌ها:
find -name '*.[ch]' | sort | redo-stamp
•
محتوای یک صفحه وب:
curl http://example.org | redo-stamp

برای اطمینان از اینکه هدف شما هر بار بررسی می‌شود، ممکن است بخواهید از redo-always(1) استفاده کنید.

در حالی که استفاده از redo-stamp ساده است، نحوه کارکرد آن برای توضیح دشوارتر است. تصمیم‌گیری درباره اینکه آیا یک هدف به‌روز است یا خیر، بر عهده redo-ifchange(1) است. به طور معمول، یک هدف زمانی قدیمی (out of date) در نظر گرفته می‌شود که هر یک از وابستگی‌های آن (مستقیم یا غیرمستقیم) تغییر کرده باشند. هنگامی که این اتفاق می‌افتد، redo-ifchange اسکریپت .do مربوط به هدف را اجرا می‌کند، که کل فهرست وابستگی‌ها را بازتولید کرده و شامل بازسازی هر یک از وابستگی‌ها در صورت لزوم می‌شود.

تصور کنید که زنجیره وابستگی زیر را داریم:

T -> X -> Y -> Z

هدف T به X وابسته است، که به Y وابسته است، که آن هم به Z وابسته است. حال تصور کنید فردی Z را تغییر داده است.

اگر کسی redo-ifchange T را اجرا کند، آنگاه redo-ifchange بررسی می‌کند که آیا X به‌روز است یا خیر؛ برای این کار، بررسی می‌کند که آیا Y به‌روز است؛ و برای انجام آن، بررسی می‌کند که آیا Z به‌روز است یا خیر — که نیست. در نتیجه، Y به‌روز نیست، به این معنی که X هم به‌روز نیست، و این یعنی T نیز به‌روز نیست و بنابراین باید T.do را اجرا کنیم. دستور redo-ifchange صرفاً به این دلیل که X تغییر کرده است مستقیماً redo X را اجرا نمی‌کند؛ بلکه T را بازسازی می‌کند، و در نهایت اسکریپت T.do در صورت لزوم ممکن است redo-ifchange X را فراخوانی کند.

هنگام استفاده از redo-stamp، رفتار متفاوت است. فرض کنیم Y از redo-stamp استفاده کرده باشد. در توالی بالا، Y قدیمی و از رده خارج است زیرا Z تغییر کرده است. با این حال، هنوز نمی‌دانیم که آیا مهر (stamp) مربوط به Y تغییر کرده است یا خیر، بنابراین هنوز نمی‌دانیم آیا باید X را بازسازی کنیم یا خیر، و در نتیجه نمی‌دانیم آیا نیاز است T را بازسازی کنیم یا خیر. نمی‌توانیم صرفاً redo T را اجرا کنیم، زیرا اگر مشخص شود که در نهایت نیازی به بازسازی T نبوده است، ممکن است زمان زیادی تلف شود.

کاری که در عوض انجام می‌دهیم این است که بررسی کنیم آیا تنها وابستگی‌های قدیمی‌شده T، اهداف ممهور ('stamped') هستند یا خیر. اگر هر یک از وابستگی‌های T اهداف معمولی و قدیمی redo باشند، در هر صورت T باید بازسازی شود؛ و نیازی به انجام کار خاصی نیست.

اگر تنها وابستگی تغییریافته T همان Y باشد (یک هدف «ممهور»)، در این صورت باید به طور خودکار redo Y را اجرا کنیم تا مشخص شود آیا T نیاز به بازسازی دارد یا خیر. این تنها باری است که redo هدفی را بازسازی می‌کند که صراحتاً به عنوان بخشی از یک اسکریپت .do در حال اجرا درخواست نشده باشد.

بخشی از مجموعه redo(1).

مفهوم اولیه redo توسط D. J. Bernstein خلق شده و در وب‌سایت او (http://cr.yp.to/redo.html) مستند گردیده است. این پیاده‌سازی مستقل توسط Avery Pennarun ایجاد شده است و می‌توانید کد منبع آن را در http://github.com/apenwarr/redo بیابید.

redo(1), redo-ifcreate(1), redo-ifchange(1), redo-always(1)

Avery Pennarun <apenwarr@gmail.com>

2021-07-27 Redo 0.42d