اختاپوس خسته

یادداشت‌هایی پیرامون کد، زندگی و دوستان

محاسبهٔ مشارکت‌ها در پروژه‌های گروهی

چند وقت پیش در مورد پروژهٔ ترجمهٔ گروهی یکی از کتاب‌های معتبر لینوکس پستی گذاشته بودم. تو اون پست توضیح داده بودم که چطوری می‌خوام از یه سیستم خاصی برای محاسبهٔ دقیق میزان مشارکت هر نفر استفاده کنم. امروز می‌خوام نحوهٔ استفاده از این سیستم رو توضیح بدم. همه‌چیز اونقدرها هم ساده نیست که اولش به نظر می‌رسه. برای برقراری عدالت (حرفای گنده!) خیلی باید تلاش می‌کردم.

اول از همه باید توضیح بدم که از ابزار فوق‌العاده خوشگل و قشنگ gitstats استفاده می‌کنم. این برنامه با خوندن هیستوریِ یک رپوزیتوری گیت، میاد و خیلی خوشگل محاسبه می‌کنه که کی، چقدر کد نوشته و دقیقاً چند خط اضافه کرده و چند خط حذف کرده. پس بریم نصبش کنیم:

نصب گیت‌استاتس
1
sudo apt-get install gitstats

بعدش می‌تونیم امتحانش کنیم. اول از همه باید بریم به مسیری که مخزن گیت‌مون اونجا قرار داره:

اجرای گیت‌استاتس
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$ cd workspace/tlb8th/
soroush@precise:~/workspace/tlb8th$ gitstats . ./statistics
Output path: statistics
Git path: .
Collecting data...
[0.00770] >> git shortlog -s HEAD | wc -l
[0.00453] >> git show-ref --tags
[0.01050] >> git rev-list
             --pretty=format:"%at %ai %aN <%aE>" HEAD | grep -v ^commit
[0.01069] >> git rev-list
             --pretty=format:"%at %T" HEAD | grep -v ^commit
[0.00584] >> git ls-tree -r --name-only
             "41b277d16457a510dc05a553d0abee69538ace5c" | wc -l
# کلی توضیحات ... 
[0.03374] >> git log --shortstat --first-parent -m
             --pretty=format:"%at %aN" HEAD
Warning: unexpected line " 1 file changed, 339 insertions(+)"
Warning: unexpected line " 1 file changed, 8 insertions(+)"
Warning: unexpected line " 1 file changed, 2 insertions(+)"
Warning: failed to handle line " 2 files changed, 115 insertions(+)"
Warning: unexpected line " 1 file changed, 17 insertions(+)"
# و صدها پیغام دیگه مثل این ... بعدش:
Refining data...
Saving cache...
Generating report...
[0.00371] >> git --version
[0.00761] >> gnuplot --version
Generating graphs...
[0.02855] >> gnuplot "statistics/lines_of_code.plot"
[0.02795] >> gnuplot "statistics/domains.plot"
[0.01915] >> gnuplot "statistics/day_of_week.plot"
[0.01924] >> gnuplot "statistics/files_by_date.plot"
[0.01940] >> gnuplot "statistics/commits_by_year.plot"
[0.02842] >> gnuplot "statistics/lines_of_code_by_author.plot"
[0.02273] >> gnuplot "statistics/month_of_year.plot"
[0.03280] >> gnuplot "statistics/commits_by_author.plot"
>> gnuplot "statistics/commits_by_year_month.plot"
      Warning: empty y range [82:82], adjusting to [81.18:82.82]
[0.02960] >> gnuplot "statistics/commits_by_year_month.plot"
[0.02240] >> gnuplot "statistics/hour_of_day.plot"
Execution time 1.05387 secs, 0.99390 secs (94.31 %) in external commands)
You may now run:

   sensible-browser 'statistics/index.html'

soroush@precise:~/workspace/tlb8th$ 

خوب… گیت‌استات زحمت کشیده و برای ما تمام اطلاعات رپوزیتوری رو به شکل خیلی خوشگل و تمیز در فرمت HTML داخل پوشهٔ statistics ذخیره کرده. الان ما می‌تونیم با باز کردن فایل statistics/index.html محتویات گزارش‌های تولید شده رو ببینیم

توی صفحهٔ اول گزارش‌های کلی در مورد رپوزیتوری رو می‌تونیم ببینیم:

اگه روی لینک‌های دیگه کلیک کنیم اطلاعاتی با جزئیات بیشتر وجود داره

به همین سادگی؟

مسلماً نه :) این‌جا چند تا مشکل داریم. یکی این که متأسفانه دوستانمون از امضاهای متعددی استفاده کردن. یعنی یک نفر بیشتر از چهار امضا داشته. خوب این برای کسی که اولین بار از گیت استفاده کرده طبیعی‌یه. در ادامه روش حل این مشکل رو نشونتون میدم. اما مشکل دوم: برای محاسبهٔ هزینهٔ ترجمه‌ها تنها باید محتویات دایرکتوری fa محاسبه بشه. چون داخل en متون اصلی ور گذاشتم و همشون رو من کامیت کردم. بنابراین نباید هزینه‌ای بابت اون کامیت‌ها بگیرم. چون ترجمه‌شون نکردم.

چطوری امضاها رو اصلاح کنیم؟

خوشبختانه گیت به ما اجازه میده که هیستوری‌ها رو اصلاح کنیم. البته ریموت‌مون این اجازه رو بهمون نمیده. پس اول یه کلون از رپوزیتوری‌مون می‌گیریم و میریم اونجا:

کلون
1
2
3
4
5
6
~/$ cd ~/workspace
~/workspace/$ git clone ./tlb8th/ ./tlb8th-fa-only
Cloning into './tlb8th-fa-only'...
done.
~/workspace/$ cd ./tlb8th-fa-only
~/workspace/tlb8th-fa-only$

خوب حالا:

اصلاح
1
2
3
4
5
6
git filter-branch -f --commit-filter
> 'if [ "$GIT_AUTHOR_NAME" = "maryam" ];
> then export GIT_AUTHOR_NAME="Maryam Shirpour";
> export GIT_AUTHOR_EMAIL=████████@████████; # ایمیل سانسور شد
> fi;
> git commit-tree "$@"'

و همچنین برای بقیهٔ امضاها. این کار رو تکرار می‌کنیم. حالا اگر دوباره آمار بگیریم داریم:

ولی کامیت‌ها چی؟ اونا رو چطور حذف کنیم؟

ولی هنوز یه مشکل وجود داره. کامیت‌های من از همه بیشتره در حالی که ترجمه‌ای انجام ندادم :) باید تمام کامیت‌هایی که خارج از مسیر /fa داخل رپوزیتوری انجام شدن، از هیستوری حذف بشن. برای این‌کار می‌تونیم پدر هیستوری رو در بیاریم:

اصلاح هیستوری
1
2
3
4
5
$ git filter-branch -f --subdirectory-filter fa -- --all
Rewrite 17617ba5af08cfe93eef3ba4dd4660ad6546fde0 (52/52)
Ref 'refs/heads/master' was rewritten
Ref 'refs/remotes/origin/master' was rewritten
WARNING: Ref 'refs/remotes/origin/master' is unchanged

خوب وقتی دوباره آمار در میاریم ظاهراً همه‌چیز عادلانه‌ست؛ اما مشکل خیلی جدی وجود داره: اگه شما یه branch جدید ایجاد کرده باشید، gitstats کدهای شما رو نمی‌شماره: و صرفاً به همین دلیل هست که کلاً استفاده از گیت‌استاتس رو کنار می‌ذاریم :( به‌زودی یک گزارش خطا تنظیم می‌کنم و برای توسعه‌دهنده‌ها می‌فرستم. بعدش یه فورک از پروژه می‌گیرم و خودم شروع می‌کنم به اصلاح این برنامه و اضافه کردن چند تا ویژگی جدید.

تو پست بعدی در مورد یه برنامهٔ مشابه که خیلی خیلی جالب‌تره و البته مشکلات برنامهٔ فعلی رو نداره، توضیحاتی رو ارائه خواهم داد.

دیدگاه‌ها