diff --git a/lib/Git/IssueManager.pm b/lib/Git/IssueManager.pm index 5a8b78c..ac6da62 100644 --- a/lib/Git/IssueManager.pm +++ b/lib/Git/IssueManager.pm @@ -188,7 +188,7 @@ sub parseIssue my $d = shift; my $tag = shift; my $status = shift; - my $subject = $d->mypath(); + my $subject = $d->find("subject"); my $description = $d->find("description"); my $priority = $d->find("priority"); my $severity = $d->find("severity"); @@ -199,7 +199,7 @@ sub parseIssue my $estimated = $d->find("estimated"); my $working = $d->find("working"); my $tags = $d->find("tags"); - my $id = $tag . "-" . substr($d->hash(),0,8); + my $id = $tag . "-" . substr($subject->hash(),0,8); my $cd = $d->timestamp_added(); my $ld = $d->timestamp_last(); my $author = $d->committer(); @@ -212,7 +212,7 @@ sub parseIssue my $tz=DateTime::TimeZone->new( name => 'local' ); - my $issue = Git::IssueManager::Issue->new(subject => $subject); + my $issue = Git::IssueManager::Issue->new(subject => $subject->content); $issue->status($status); $issue->description($description->content()); $issue->priority($priority->content()); @@ -297,7 +297,8 @@ sub delete { if (ref($i) eq "Git::LowLevel::Tree") { - my $mytag = $tag . "-" . substr($i->hash(),0,8); + my $subject = $i->find("subject"); + my $mytag = $tag . "-" . substr($subject->hash(),0,8); if ($id eq $mytag) { $status->del($i); @@ -312,16 +313,20 @@ sub delete } -=method close +=method changeStatus - set a issue as closed + set status of an issue =cut -sub close +sub changeStatus { my $self = shift; my $id = shift; - my @statusse = ("open","assigned","inprogress"); + my $status= shift; + + die("unknown status") unless $status eq "open" || $status eq "closed" || $status eq "inprogress" || $status eq "assigned"; + + my @statusse = ("open","assigned","inprogress","closed"); die("IssueManager not initialized") unless $self->ready(); my $ref = $self->repository->getReference('refs/heads/issues'); @@ -331,27 +336,30 @@ sub close for my $s (@statusse) { - for my $status ($root->find($s)) + next unless $s ne $status; + for my $stat ($root->find($s)) { - for my $i ($status->get()) + for my $i ($stat->get()) { if (ref($i) eq "Git::LowLevel::Tree") { - my $mytag = $tag . "-" . substr($i->hash(),0,8); + my $subject = $i->find("subject"); + my $mytag = $tag . "-" . substr($subject->hash(),0,8); if ($id eq $mytag) { - $status->del($i); - my $issue = $self->parseIssue($i, $tag, "open"); - $issue->status("closed"); + my $base=$root->find($status); + $stat->del($i); + my $issue = $self->parseIssue($i, $tag, $s); + $issue->status($status); my $issueTree=$issue->createIssue($self->repository); - my $closed=$root->find("closed"); - if (!defined($closed)) + + if (!defined($base)) { - $closed = $root->newTree(); - $closed->path("closed"); - $root->add($closed); + $base = $root->newTree(); + $base->path($status); + $root->add($base); } - $closed->add($issueTree); + $base->add($issueTree); $ref->commit("closed issue " . $i->mypath); return; } @@ -362,5 +370,106 @@ sub close die("issue " . $id . " not found\n"); } +=method assign + + assign a worker to an issue + +=cut +sub assign +{ + my $self = shift; + my $id = shift; + my $worker_name = shift; + my $worker_email = shift; + my $status = "assigned"; + my @statusse = ("open","assigned","inprogress","closed"); + + die("IssueManager not initialized") unless $self->ready(); + my $ref = $self->repository->getReference('refs/heads/issues'); + my $tag = $ref->find(".tag")->content(); + my $root = $ref->getTree(); + + + for my $s (@statusse) + { + next unless $s ne $status; + for my $stat ($root->find($s)) + { + for my $i ($stat->get()) + { + if (ref($i) eq "Git::LowLevel::Tree") + { + my $subject = $i->find("subject"); + my $mytag = $tag . "-" . substr($subject->hash(),0,8); + if ($id eq $mytag) + { + my $base=$root->find($status); + $stat->del($i); + my $issue = $self->parseIssue($i, $tag, $s); + $issue->status($status); + $issue->worker($worker_name); + $issue->worker_email($worker_email); + + my $issueTree=$issue->createIssue($self->repository); + + if (!defined($base)) + { + $base = $root->newTree(); + $base->path($status); + $root->add($base); + } + $base->add($issueTree); + $ref->commit("closed issue " . $i->mypath); + return; + } + } + } + } + } + die("issue " . $id . " not found\n"); + +} + + + +=method close + + close an issue + +=cut +sub close +{ + my $self = shift; + my $id = shift; + + $self->changeStatus($id, "closed"); +} + +=method open + + open an issue + +=cut +sub open +{ + my $self = shift; + my $id = shift; + + $self->changeStatus($id, "open"); +} + +=method start + + start an issue + +=cut +sub start +{ + my $self = shift; + my $id = shift; + + $self->changeStatus($id, "inprogress"); +} + 1;