X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FGitalist.git;a=blobdiff_plain;f=lib%2FGitalist%2FUtils.pm;fp=lib%2FGitalist%2FUtils.pm;h=6d32446f0cdb339804da2bc9f4b3b5f2f4d9c2cf;hp=f11dc3402935b752f98cc524f50f6098204036d6;hb=d3f6d19341def5501b751fe4aba828f328a1d4aa;hpb=af2c5a6d465a126c3158967289bf8fb57d4010de diff --git a/lib/Gitalist/Utils.pm b/lib/Gitalist/Utils.pm index f11dc34..6d32446 100644 --- a/lib/Gitalist/Utils.pm +++ b/lib/Gitalist/Utils.pm @@ -5,6 +5,7 @@ use Exporter qw/import/; our @EXPORT_OK = qw/ age_string + mode_string /; sub age_string { @@ -50,6 +51,40 @@ sub is_binary { return $_[0] !~ /^[[:print:]]+$ (?: \s ^[[:print:]]+$ )?/mx; } +# via gitweb.pm circa line 1305 +use Fcntl ':mode'; +use constant { + S_IFINVALID => 0030000, + S_IFGITLINK => 0160000, +}; + +# submodule/subrepository, a commit object reference +sub S_ISGITLINK($) { + return (($_[0] & S_IFMT) == S_IFGITLINK) +} + +# convert file mode in octal to symbolic file mode string +sub mode_string { + my $mode = shift; + + if (S_ISGITLINK($mode)) { + return 'm---------'; + } elsif (S_ISDIR($mode & S_IFMT)) { + return 'drwxr-xr-x'; + } elsif ($^O ne 'MSWin32' and S_ISLNK($mode)) { # this is ENOLINKS country, we can't stop here! + return 'lrwxrwxrwx'; + } elsif (S_ISREG($mode)) { + # git cares only about the executable bit + if ($mode & S_IXUSR) { + return '-rwxr-xr-x'; + } else { + return '-rw-r--r--'; + } + } else { + return '----------'; + } +} + 1; __END__