Simplified Repository BUILDARGS logic.
[catagits/Gitalist.git] / lib / Gitalist / Git / Repository.pm
index 5259eb8..2977c59 100644 (file)
@@ -16,18 +16,24 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
     use Gitalist::Git::Object::Commit;
     use Gitalist::Git::Object::Tag;
     use Gitalist::Git::Head;
+    use Gitalist::Git::Tag;
 
     our $SHA1RE = qr/[0-9a-fA-F]{40}/;
 
-    around BUILDARGS (ClassName $class: Dir $dir) {
+    around BUILDARGS (ClassName $class: Dir $dir, Str $override_name = '') {
         # Allows us to be called as Repository->new($dir)
         # Last path component becomes $self->name
         # Full path to git objects becomes $self->path
         my $name = $dir->dir_list(-1);
-        $dir = $dir->subdir('.git') if (-f $dir->file('.git', 'HEAD'));
+        if(-f $dir->file('.git', 'HEAD')) { # Non-bare repo above .git
+            $dir  = $dir->subdir('.git');
+            $name = $dir->dir_list(-2, 1); # .../name/.git
+        } elsif('.git' eq $dir->dir_list(-1)) { # Non-bare repo in .git
+            $name = $dir->dir_list(-2);
+        }
         confess("Can't find a git repository at " . $dir)
-            unless ( -f $dir->file('HEAD') );
-        return $class->$orig(name => $name,
+            unless -f $dir->file('HEAD');
+        return $class->$orig(name => $override_name || $name,
                              path => $dir);
     }
 
@@ -63,7 +69,7 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
     has heads => ( isa => ArrayRef['Gitalist::Git::Head'],
                    is => 'ro',
                    lazy_build => 1);
-    has tags => ( isa => ArrayRef[HashRef],
+    has tags => ( isa => ArrayRef['Gitalist::Git::Tag'],
                    is => 'ro',
                    lazy_build => 1);
     has references => ( isa => HashRef[ArrayRef[Str]],
@@ -209,8 +215,8 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
             $description = $self->path->file('description')->slurp;
             chomp $description;
         };
-       $description = "Unnamed repository, edit the .git/description file to set a description"
-           if $description eq "Unnamed repository; edit this file 'description' to name the repository.";
+        $description = "Unnamed repository, edit the .git/description file to set a description"
+            if $description eq "Unnamed repository; edit this file 'description' to name the repository.";
         return $description;
     }
 
@@ -249,24 +255,10 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
           '--format=%(objectname) %(objecttype) %(refname) %(*objectname) %(*objecttype) %(subject)%00%(creator)',
           'refs/tags'
         );
-        my @ret;
-        for my $line (@revlines) {
-            my($refinfo, $creatorinfo) = split /\0/, $line;
-            my($rev, $type, $name, $refid, $reftype, $title) = split(' ', $refinfo, 6);
-            my($creator, $epoch, $tz) = ($creatorinfo =~ /^(.*) ([0-9]+) (.*)$/);
-            $name =~ s!^refs/tags/!!;
-
-            push @ret, { sha1 => $rev, name => $name };
-
-            #FIXME: That isn't the time I'm looking for..
-            if($epoch and $tz) {
-                my $dt = DateTime->from_epoch(epoch => $epoch);
-                $dt->set_time_zone($tz);
-                $ret[-1]->{last_change} = $dt;
-            }
-        }
-
-        return \@ret;
+        return [
+            map  Gitalist::Git::Tag->new($_),
+            grep Gitalist::Git::Tag::is_valid_tag($_), @revlines
+        ];
     }
 
     method _build_references {