পাইথন দিয়ে গিট হুক

Picture credit: http://sebastian-feldmann.info

গিটহাবের একটা চমৎকার সার্ভিস হল গিটহাব পেজ। জিনিসটা এমন, আপনি আপনার প্রজেক্টে কিছু .md এক্সটেনশানের ফাইল রেখে দেবেন আর গিটহাব সেগুলো থেকে html জেনারেট করে সার্ভ করবে। এভাবে আপনি খুব অল্প এফোর্টে চমৎকার ওয়েবসাইট তৈরী করতে পারেন।

গিটহাব পেজ দিয়ে কিভাবে ব্লগিং করা যায় সেটা নিয়ে অন্য একদিন লেখার ইচ্ছা আছে। আজকে আমাদের টপিক হল গিট হুক। পেজর সাথে হুকের কি সম্পর্ক? আসুন দেখি।

মাহবুুুবুল হাসান স্যারের ‘সমস্যা ও সমাধান বই — ১’ এর পিডিএফ রিলিজ হওয়ার পর অতি উৎসাহ নিয়ে সমস্যাগুলো সমাধান করা শুরু করলাম। কোডগুলো রাখার জন্য একটা রিপোও খুলে ফেললাম। আমি চাচ্ছিলাম কোডের পাশাপাশি রিপোতে সমস্যাগুলো সমাধান করার অভিজ্ঞতাও নোট আকারে লিখে রাখব। তো প্রথমে প্রতি চ্যাপ্টারে README ফাইলে মার্কডাউন ফরম্যাটে লিখছিলাম। তারপরে ভাবলাম, ইচ্ছা করলেই তো লেখাগুলো নিয়ে গিটহাব পেজ ব্যবহার করে একটা সাইট বানাতে পারি। তো রিপোর সেটিংসে গিয়ে পেজ অন করে দিলাম। আর ব্যস, হয়ে গেল সাইট।

এখন সমস্যা হল প্রতিটি সমস্যা সমাধান করার পর আবার README ফাইলে গিয়ে নোট লিখতে হচ্ছে। যদি লেখার সাথে কোডও রাখতে চাই তাহলে কোডও পেস্ট করতে হচ্ছে। ব্যাপারটা বিরক্তিকর লাগছিল। আচ্ছা এমন যদি করা যেত যে, কোডের কমেন্টে আমার নোটগুলা লিখে রাখব আর পরে সেগুলো থেকে আটোম্যাটিক ‍ .md ফাইল তৈরী হবে ? একটু ঘেটে দেখলাম যে এখানে গিট হুক ব্যবহার করা যায়।

গিট হুক কি? গিট হুক হল স্ক্রিপ্ট, যেগুলো রিপোজিটরির বিভিন্ন ইভেন্ট যেমন কমিট, পুশ, পুল ইত্যাদির আগে ও পরে অট‌োম্যাটিক্যালি এক্সিকিউট হয়। গিট হুক ব্যবহার করে অনেককিছুই করা সম্ভাব। যেমন কোড পুশ করার পর অটোম্যাটিক প্রজেক্ট ডিপ্লয় করা। গিটহুক তৈরী করা খুব সহজ। রিপোর .git/hooks ডাইরেক্টরিতে স্ক্রিপ্ট রেখে দিলেই হল। ঐ ডিরেক্টরিতে আগে থেকেই কিছু স্ক্রিপ্ট তৈরী করা থাকে।

hooks
├── applypatch-msg.sample
├── commit-msg.sample
├── post-update.sample
├── pre-applypatch.sample
├── pre-commit.sample
├── prepare-commit-msg.sample
├── pre-push.sample
├── pre-rebase.sample
└── update.sample

আমি যা করতে চাচ্ছি তা হল, কমিটের আগে কোডের কমেন্ট এনালাইজ করে .md ফাইল তৈরী করতে। তাহলে এখন pre-commit.sample ফাইলটার নাম থেকে .sample মুছে দিলেই স্ক্রিপ্টটি প্রতিবার কমিটের আগে এক্সিকিউট হবে। এখন এই ফাইলে পাইথন কোড লিখে আমি আমার কাজ করতে পারি। খেয়াল করুন কোড পাইথনে লিখলেলেও কিন্তু .py‍‍ এক্সটেনশান দেয়া যাবে না। ফাইলের নাম এক্সাক্টলি pre-commit হলে তবেই সেটা কমিটের আগে এক্সিকিউট হবে।

এখন পাইথন দিয়ে কাজটা কিভাবে করব সেটা একটু বলে নিই। পাইথনের sub_process প্যাকেজের check_output ফাংশন দিয়ে git diff --cached --name-only কমান্ড এক্সিকিউট করব। তাহলে পেয়ে যাব এই কমিটে কোন কোন ফাইল চেন্জ হল। তারপর সেগুলো ওপেন করে কমেন্ট এনালাইজ করে মার্কডাউন ফাইল তৈরী করে সেগুলো docs ফোল্ডারে সেভ করব। তারপর আবার git add * কমান্ড এক্সিকিউট করে নতুন তৈরী করা ফাইলগুলো রিপোতে এড করে দেব।

পুরো কোড:

সাইটটি এখানে দেখতে পারেন। এই লেখাটি প্রথমে আমার ব্লগে প্রকাশ করেছিলাম। আজ আবার বাংলায় লিখলাম। আপনার মূল্যবান মতামত জানাতে ভুলবেন না। ভুল ত্রুটি ধরিয়ে দিলে খুবই উপকৃত হব। ধন্যবাদ।