Git-IssueManager/lib/Git/IssueManager.pm

301 lines
6.3 KiB
Perl
Raw Normal View History

2018-07-04 10:46:13 +02:00
package Git::IssueManager;
#ABSTRACT: Module for managing issues in a git branch within your repository
use Moose;
2018-07-04 18:33:10 +02:00
use MooseX::Privacy;
2018-07-04 10:46:13 +02:00
use DateTime;
use DateTime::TimeZone;
use Data::Dumper;
2018-09-10 22:41:49 +02:00
use Git::LowLevel;
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
=attr gitcmd
the path to the git command, default is using your path
=cut
has 'gitcmd' => (is => 'ro', isa => 'Str', default=>"git");
2018-07-04 10:46:13 +02:00
=attr repository
Git::Repository object on which to do the issue management
=cut
2018-09-10 22:41:49 +02:00
has 'repository' => (is =>'rw', isa => 'Git::LowLevel');
2018-07-04 10:46:13 +02:00
2018-07-04 18:33:10 +02:00
=attr _open
B<private attribute>
=cut
2018-09-10 22:41:49 +02:00
has '_open' => (is => 'rw', isa => 'Git::LowLevel::Tree', traits => [qw/Private/]);
2018-07-04 18:33:10 +02:00
=attr _assigned
B<private attribute>
=cut
2018-09-10 22:41:49 +02:00
has '_assigned' => (is => 'rw', isa => 'Git::LowLevel::Tree', traits => [qw/Private/]);
2018-07-04 18:33:10 +02:00
=attr _inprogress
B<private attribute>
=cut
2018-09-10 22:41:49 +02:00
has '_inprogress' => (is => 'rw', isa => 'Git::LowLevel::Tree', traits => [qw/Private/]);
2018-07-04 18:33:10 +02:00
=attr _closed
B<private attribute>
=cut
2018-09-10 22:41:49 +02:00
has '_closed' => (is => 'rw', isa => 'Git::LowLevel::Tree', traits => [qw/Private/]);
2018-07-04 18:33:10 +02:00
=attr _root
B<private attribute>
=cut
2018-09-10 22:41:49 +02:00
has '_root' => (is => 'rw', isa => 'Git::LowLevel::Tree', traits => [qw/Private/]);
2018-07-04 10:46:13 +02:00
=method ready
validates if everything is in place for issue management
=cut
sub ready
{
my $self = shift;
2018-09-10 22:41:49 +02:00
my $ref = $self->repository->getReference('refs/heads/issues');
return 0 unless $ref->exist;
my $version = $ref->find('.version');
return 0 unless defined($version) && ref($version) eq "Git::LowLevel::Blob";
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
my $tag = $ref->find('.tag');
return 0 unless defined($tag) && ref($tag) eq "Git::LowLevel::Blob";
2018-07-04 10:46:13 +02:00
return 1;
}
=method version
returns the version number of the issue system within the issue branch
=cut
sub version
{
my $self = shift;
return unless $self->ready();
2018-09-10 22:41:49 +02:00
my $ref = $self->repository->getReference('refs/heads/issues');
my $version = $ref->find(".version");
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
return $version->content;
2018-07-04 10:46:13 +02:00
}
=method tag
returns the issue tag to prepend in front of all issue ids
=cut
sub tag
{
my $self = shift;
return unless $self->ready();
2018-09-10 22:41:49 +02:00
my $ref = $self->repository->getReference('refs/heads/issues');
my $tag = $ref->find(".tag");
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
return $tag->content;
2018-07-04 10:46:13 +02:00
}
=method init
initialize the repository for managing issues
=cut
sub init
{
my $self = shift;
my $issue_tag = shift;
return unless ! $self->ready();
2018-09-10 22:41:49 +02:00
die("no issue tag given") unless defined($issue_tag) && length($issue_tag) > 0;
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
my $ref = $self->repository->getReference('refs/heads/issues');
my $root = $ref->getTree();
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
my $version = $root->newBlob();
$version->path(".version");
$version->_content("0.1");
$root->add($version);
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
my $tag = $root->newBlob();
$tag->path(".tag");
$tag->_content($issue_tag);
$root->add($tag);
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
$ref->commit("initialized issue manager");
2018-07-04 10:46:13 +02:00
}
2018-07-04 18:33:10 +02:00
=method add
2018-09-10 22:41:49 +02:00
add an issue to the repository
first paramter is an GitIssueManager::Issue object
2018-07-04 18:33:10 +02:00
=cut
sub add
{
2018-09-10 22:41:49 +02:00
my $self = shift;
my $issue = shift;
2018-07-04 18:33:10 +02:00
die("IssueManager not initialized") unless $self->ready();
2018-09-10 22:41:49 +02:00
die("no issue given") unless defined($issue) && ref($issue) eq "Git::IssueManager::Issue";
2018-07-04 18:33:10 +02:00
2018-09-10 22:41:49 +02:00
my $ref = $self->repository->getReference('refs/heads/issues');
my $root = $ref->getTree();
2018-07-04 18:33:10 +02:00
2018-09-10 22:41:49 +02:00
my $issueTree=$issue->createIssue($self->repository);
2018-07-04 18:33:10 +02:00
2018-09-10 22:41:49 +02:00
my $base=$root->find($issue->status);
if (!defined($base))
2018-07-04 18:33:10 +02:00
{
2018-09-10 22:41:49 +02:00
$base = $root->newTree();
$base->path($issue->status);
$root->add($base);
2018-07-04 18:33:10 +02:00
}
2018-09-10 22:41:49 +02:00
$base->add($issueTree);
$ref->commit("added issue " . $issue->subject);
2018-07-04 10:46:13 +02:00
}
2018-09-10 22:41:49 +02:00
=method parseIssue
2018-07-09 21:17:13 +02:00
2018-09-10 22:41:49 +02:00
parsed the given Git::LowLevel::Tree object as an Issue
2018-07-04 10:46:13 +02:00
=cut
2018-09-10 22:41:49 +02:00
sub parseIssue
2018-07-04 10:46:13 +02:00
{
my $self = shift;
2018-09-10 22:41:49 +02:00
my $d = shift;
my $tag = shift;
my $subject = $d->mypath();
my $description = $d->find("description");
my $priority = $d->find("priority");
my $severity = $d->find("severity");
my $type = $d->find("type");
my $worker = $d->find("worker");
my $substatus = $d->find("substatus");
my $comment = $d->find("comment");
my $estimated = $d->find("estimated");
my $working = $d->find("working");
my $tags = $d->find("tags");
my $id = $tag . "-" . substr($d->hash(),0,8);
my $cd = $d->timestamp_added();
my $ld = $d->timestamp_last();
my $author = $d->committer();
# check for required attributes
die("description not available for issue " . $id) unless defined($description);
die("priority not available for issue " . $id) unless defined($priority);
die("severity not available for issue " . $id) unless defined($severity);
die("type not available for issue " . $id) unless defined($type);
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
my $tz=DateTime::TimeZone->new( name => 'local' );
my $issue = Git::IssueManager::Issue->new(subject => $subject);
$issue->description($description->content());
$issue->priority($priority->content());
$issue->severity($severity->content());
$issue->type($type->content());
$issue->id($id);
$issue->creation_date(DateTime->from_epoch( epoch =>$cd, time_zone=>$tz));
$issue->last_change_date(DateTime->from_epoch( epoch =>$ld, time_zone=>$tz));
2018-07-04 10:46:13 +02:00
if (defined($worker))
{
2018-09-10 22:41:49 +02:00
$worker->content()=~/^(.*)\<(.*)\>$/;
$issue->worker($1);
$issue->worker_email($2);
2018-07-04 10:46:13 +02:00
}
2018-09-10 22:41:49 +02:00
if (defined($author))
2018-07-04 10:46:13 +02:00
{
2018-09-10 22:41:49 +02:00
$author=~/^(.*)\<(.*)\>$/;
$issue->author($1);
$issue->author_email($2);
2018-07-04 10:46:13 +02:00
}
return $issue;
}
2018-09-10 22:41:49 +02:00
sub list
2018-07-04 10:46:13 +02:00
{
my $self = shift;
2018-09-10 22:41:49 +02:00
my @issues;
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
die("IssueManager not initialized") unless $self->ready();
my $ref = $self->repository->getReference('refs/heads/issues');
my $root = $ref->getTree();
my $open = $ref->find("open");
my $closed = $ref->find("closed");
my $assigned = $ref->find("assigned");
my $inprogress = $ref->find("inprogess");
my $tag = $ref->find(".tag")->content();
my @all;
2018-07-04 10:46:13 +02:00
2018-09-10 22:41:49 +02:00
# merge all issues into one array
if (defined($open))
2018-07-04 10:46:13 +02:00
{
2018-09-10 22:41:49 +02:00
push(@all,$open->get());
2018-07-04 10:46:13 +02:00
}
2018-09-10 22:41:49 +02:00
if (defined($closed))
2018-07-04 10:46:13 +02:00
{
2018-09-10 22:41:49 +02:00
push(@all,$closed->get());
2018-07-04 10:46:13 +02:00
}
2018-09-10 22:41:49 +02:00
if (defined($assigned))
2018-07-04 10:46:13 +02:00
{
2018-09-10 22:41:49 +02:00
push(@all,$assigned->get());
2018-07-04 10:46:13 +02:00
}
2018-09-10 22:41:49 +02:00
if (defined($inprogress))
2018-07-04 10:46:13 +02:00
{
2018-09-10 22:41:49 +02:00
push(@all,$inprogress->get());
2018-07-04 10:46:13 +02:00
}
2018-09-10 22:41:49 +02:00
for my $d (@all)
2018-07-04 10:46:13 +02:00
{
2018-09-10 22:41:49 +02:00
my $issue = $self->parseIssue($d,$tag);
push(@issues,$issue);
2018-07-04 10:46:13 +02:00
}
2018-09-10 22:41:49 +02:00
return @issues;
2018-07-04 10:46:13 +02:00
}
2018-07-04 16:17:12 +02:00
sub delete
{
2018-09-10 22:41:49 +02:00
my $self = shift;
my $id = shift;
2018-07-09 21:17:13 +02:00
2018-09-10 22:41:49 +02:00
die("IssueManager not initialized") unless $self->ready();
my $ref = $self->repository->getReference('refs/heads/issues');
my $root = $ref->getTree();
2018-07-09 21:17:13 +02:00
}
2018-07-04 10:46:13 +02:00
1;