Abstracted kludges a little more.
Dan Brook [Wed, 20 Jan 2010 16:44:22 +0000 (23:44 +0700)]
lib/Gitalist/Git/Object.pm
lib/Gitalist/Git/Repository.pm

index 6126ab2..2daf3ec 100644 (file)
@@ -5,6 +5,18 @@ class Gitalist::Git::Object {
     use MooseX::Types::Moose qw/Str Int Bool Maybe ArrayRef/;
     use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
 
+    use Fcntl ':mode';
+    use constant {
+        S_IFINVALID => 0030000,
+        S_IFGITLINK => 0160000,
+    };
+
+    BEGIN {
+        no warnings;
+        *S_ISLNK = sub ($) {}
+            if $^O eq 'MSWin32';
+    }
+
     # repository and sha1 are required initargs
     has repository => ( isa => 'Gitalist::Git::Repository',
                      required => 1,
@@ -69,16 +81,10 @@ class Gitalist::Git::Object {
 
     method _build_modestr {
        # XXX The POSIX constants make win32 sad :(
-        return eval { _mode_str($self->mode) } || '?rwxrwxrwx';
+        return _mode_str($self->mode);
     }
 
-    # via gitweb.pm circa line 1305
-    use Fcntl ':mode';
-    use constant {
-        S_IFINVALID => 0030000,
-        S_IFGITLINK => 0160000,
-    };
-
+    # via gitweb.pm
     # submodule/subrepository, a commit object reference
     sub S_ISGITLINK($) {
         return (($_[0] & S_IFMT) == S_IFGITLINK)
index d6fefae..0269853 100644 (file)
@@ -10,7 +10,16 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
     use List::MoreUtils qw/any zip/;
     use DateTime;
     use Encode qw/decode/;
-#    use I18N::Langinfo qw/langinfo CODESET/;
+
+    use if $^O ne 'MSWin32', 'I18N::Langinfo', => qw/langinfo CODESET/;
+    BEGIN {
+        no strict 'subs';
+        *__owner = defined &langinfo
+            ? sub { map { decode(langinfo(CODESET), $_) } (getpwuid $_[0]->path->stat->uid)[6,0] }
+            : sub { return qw/OwnEr GroUp/ }
+        ;
+    }
+
     use Gitalist::Git::Object::Blob;
     use Gitalist::Git::Object::Tree;
     use Gitalist::Git::Object::Commit;
@@ -241,13 +250,7 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils {
     }
 
     method _build_owner {
-       # XXX No I18N::Langinfo & getpwuid make win32 sad :(
-        # my ($gecos, $name) = map { decode(langinfo(CODESET), $_) } (getpwuid $self->path->stat->uid)[6,0];
-       my ($gecos, $name) = do {
-           local $@;
-           my($g,$n) = eval { (getpwuid $self->path->stat->uid)[6,0] };
-           !$@ ? ($g,$n) : qw(OwenEr GroUp);
-       };
+        my ($gecos, $name) = $self->__owner;
         $gecos =~ s/,+$//;
         return length($gecos) ? $gecos : $name;
     }