Tuesday, April 22, 2008

Distributed Issue Tracker

หลังจาก Distributed Version Control เริ่มแพร่หลายกันมากขึ้น
สิ่งที่ติดตามมา ก็คือ Distributed Issue Tracker

Issue Tracker 2 ตัว ที่ลองเล่นก็คือ

ทั้งสองตัวนี้มีความเหมือนกัน 2 ประการคือ
  • implement ด้วย ruby
  • ใช้ควบคู่กับ git ได้ (ผ่านทาง ruby/git)


เริ่มที่เจ้า ticgit ก่อน
วิธีการใช้งาน ก็ตรงไปตรงมา
เริ่มจาก command line ของมัน ใช้ชื่อว่า 'ti'
การสั่ง ti ครั้งแรก มันจะแอบไปสร้าง branch ใน git repository ที่ชื่อ ticgit

$ git branch
* master

$ ti
I, [2008-04-22T12:21:53.049764 #7521] INFO -- : creating ticgit repo branch
Please specify at least one action to execute.
list state show new checkout comment tag

$ git branch
* master
ticgit

การสร้าง ticket ทำได้โดยการสั่ง
$ ti new -t 'my ticket'
I, [2008-04-22T12:24:38.588505 #7551] INFO -- : saving 1208841878_my-ticket_57

Title : my ticket
TicId : d00a299473633b5bd617375d1441617e56fea90d

Assigned : anon
Opened : Tue Apr 22 12:24:38 +0700 2008 (0 days)
State : OPEN

สังเกตุเลข Ticket Id ที่ใช้ SHA 40 ตัวอักษร สอดคล้องกับ Id ที่ git ใช้

ถ้าต้องการแสดง ticket ทั้งหมดที่มี ก็ใช้คำสั่ง list
$ ti list

# TicId Title State Date Assgn Tags
--------------------------------------------------------------------------------
1 d00a29 my ticket open 04/22 anon


การทำงานกับ ticket ก็ให้ใช้คำสั่ง checkout
$ ti checkout 1

$ ti list

# TicId Title State Date Assgn Tags
--------------------------------------------------------------------------------
* 1 d00a29 my ticket open 04/22 anon

สังเกตุว่าหลังจาก checkout แล้ว จะมี marker '*' ที่หน้าบรรทัด

แน่นอน เมื่อเป็น Issue Tracker, ดังนั้นในแต่ละ ticket เราสามารถใส่ comment ได้
$ ti comment -m 'my comment'

$ ti show

Title : my ticket
TicId : d00a299473633b5bd617375d1441617e56fea90d

Assigned : anon
Opened : Tue Apr 22 12:24:38 +0700 2008 (0 days)
State : OPEN

Comments (1):
* Added 04/22 12:32 by anon
my comment

feature ที่ขาดไม่ได้ ก็คือการ tag
ซึ่งช่วยให้เราสามารถค้น issue ได้ง่ายขึ้น
$ ti tag 1 ui

$ ti list -t ui

# TicId Title State Date Assgn Tags
--------------------------------------------------------------------------------
* 1 d00a29 my ticket open 04/22 anon ui

ลองดูวิธีการเก็บข้อมูลของมันบ้าง
เนื่องจากเรารู้ว่ามันแอบเก็บข้อมูลไว้ใน branch "ticget" เราก็เลยสามารถใช้คำสั่ง checkout เพื่อดู file ที่มันเก็บได้เลย
$ ls
hello

$ git checkout ticgit
Switched to branch "ticgit"

$ ls
1208841878_my-ticket_57

$ ls 1208841878_my-ticket_57/
ASSIGNED_anon COMMENT_1208842341_anon STATE_open TAG_main TAG_ui TICKET_ID

$ cat 1208841878_my-ticket_57/COMMENT_1208842341_anon
my comment

ดูจากชื่อ file แล้ว จะเห็นว่ามันเก็บ meaning ไว้ในชื่อ file เลย

ที่นี้ลองไปดูเจ้า ditz บ้าง
การใช้งาน ditz เริ่มต้นด้วย การ init database ก่อน
$ ditz init
Name (enter for "pok"): projectName
Issues can be tracked across the project as a whole, or the project can be
split into components, and issues tracked separately for each component.
Track issues separately for different components? (y/n): y

Current components:
None!

(A)dd component, (r)emove component, or (d)one: a
Component name: ui

Current components:
1) ui

(A)dd component, (r)emove component, or (d)one: a
Component name: domain

Current components:
1) ui
2) domain

(A)dd component, (r)emove component, or (d)one: d
Ok, bugs directory created successfully.

จะเห็นว่า ditz มี data model มากกว่า ticgit
Issue แต่ละอันที่สร้้างขึ้นมา จะต้องระบุว่ามันเป็นของ component ไหนด้วย

นอกจากมุมมองในส่วน component, ditz ยังเพิ่มมุมมองในส่วนของ release ด้วย
$ ditz add-release
Name: 0.1
Comments (ctrl-d, ., or /stop to stop, /edit to edit, /reset to reset):
> remark for release 0.1
> Added release 0.1.


ลองเพิ่ม issue ลงใน ditz
$ ditz add
Title: feature x
Description (ctrl-d, ., or /stop to stop, /edit to edit, /reset to reset):
> long remark for feature x
> Is this a (b)ugfix or a (f)eature? f
Choose a component:
1) projectName
2) ui
3) domain
Component (1--3): 3
Assign to a release now? (y/n): y
Assigning to release 0.1.
Issue creator (enter for "Polawat Phetra "):
Comments (ctrl-d, ., or /stop to stop, /edit to edit, /reset to reset):
> Added issue domain-1.
You may have to inform your SCM that the following files have been added:
bugs/issue-911f48717bbca30266d6ed1cdea7819b57158afc.yaml


Issue แต่ละ Issue สามารถเลือก assign ให้กับ release ได้

$ ditz todo
Version 0.1 (unreleased):
_ domain-1: feature x

Unassigned:
_ ui-1: hi

$ ditz assign ui-1
Issue ui-1 currently not assigned to any release.
Choose a release:
1) 0.1 (unreleased)
Release (1--1): 1
Comments (ctrl-d, ., or /stop to stop, /edit to edit, /reset to reset):
> Assigned ui-1 to 0.1.

การที่มี release ทำให้เราสามารถ track ความคืบหน้าได้ (ทำนองเดียวกับ trac)

$ ditz status
0.1 0/ 0 (100%) bugs, 0/ 2 ( 0%) features __


ส่วนรูปแบบการเก็บ เจ้า ditz เลือกเก็บโดยใช้ format yaml
ซึ่งสะดวกมากสำหรับการแก้ไขด้วยมือ
$ ls
bugs hello

$ ls bugs
issue-911f48717bbca30266d6ed1cdea7819b57158afc.yaml project.yaml
issue-fd2e35242ef0bd1db18fc8c0415ffedcf2dbf0cd.yaml

$ cat bugs/issue-911f48717bbca30266d6ed1cdea7819b57158afc.yaml
--- !ditz.rubyforge.org,2008-03-06/issue
title: feature x
desc: long remark for feature x
type: :feature
component: domain
release: "0.1"
reporter: Polawat Phetra
status: :unstarted
disposition:
creation_time: 2008-04-22 06:42:19.702124 Z
references: []

id: 911f48717bbca30266d6ed1cdea7819b57158afc
log_events:
- - 2008-04-22 06:42:21.838025 Z
- Polawat Phetra
- created
- ""

$ cat bugs/project.yaml
--- !ditz.rubyforge.org,2008-03-06/project
name: projectName
version: "0.2"
components:
- !ditz.rubyforge.org,2008-03-06/component
name: projectName
- !ditz.rubyforge.org,2008-03-06/component
name: ui
- !ditz.rubyforge.org,2008-03-06/component
name: domain
releases:
- !ditz.rubyforge.org,2008-03-06/release
name: "0.1"
status: :unreleased
release_time:
log_events:
- - 2008-04-22 06:40:33.376540 Z
- Polawat Phetra
- created
- remark for release 0.1

Related link from Roti