$git_dir =~ tr!/!/!s;
$git_dir =~ s!/*\z!!s;
# may contain {-tmp} field for File::Temp::Dir
- bless { git_dir => $git_dir, alt_st => '', -git_path => {} }, $class
+ bless { git_dir => $git_dir }, $class
}
sub git_path ($$) {
# can't rely on 'q' on some 32-bit builds, but `d' works
my $st = pack('dd', $st[10], $st[7]); # 10: ctime, 7: size
- return 0 if $self->{alt_st} eq $st;
+ return 0 if ($self->{alt_st} // '') eq $st;
$self->{alt_st} = $st; # always a true value
}
(split(/ /, <$fh> // time))[0] + 0; # integerize for JSON
}
+sub try_cat {
+ my ($path) = @_;
+ open(my $fh, '<', $path) or return '';
+ local $/;
+ <$fh> // '';
+}
+
+sub cat_desc ($) {
+ my $desc = try_cat($_[0]);
+ chomp $desc;
+ utf8::decode($desc);
+ $desc =~ s/\s+/ /smg;
+ $desc eq '' ? undef : $desc;
+}
+
+sub description {
+ cat_desc("$_[0]->{git_dir}/description") // 'Unnamed repository';
+}
+
+sub cloneurl {
+ my ($self) = @_;
+ $self->{cloneurl} // do {
+ my @urls = split(/\s+/s, try_cat("$self->{git_dir}/cloneurl"));
+ scalar(@urls) ? ($self->{cloneurl} = \@urls) : undef;
+ } // [];
+}
+
# for grokmirror, which doesn't read gitweb.description
# templates/hooks--update.sample and git-multimail in git.git
# only match "Unnamed repository", not the full contents of
chomp(my $owner = $self->qx('config', 'gitweb.owner'));
utf8::decode($owner);
$ent->{owner} = $owner eq '' ? undef : $owner;
- my $desc = '';
- if (open($fh, '<', "$git_dir/description")) {
- local $/ = "\n";
- chomp($desc = <$fh>);
- utf8::decode($desc);
- }
- $desc = 'Unnamed repository' if $desc eq '';
- if (defined $epoch && $desc =~ /\AUnnamed repository/) {
+ my $desc = description($self);
+ if (defined $epoch && index($desc, 'Unnamed repository') == 0) {
$desc = "$default_desc [epoch $epoch]";
}
$ent->{description} = $desc;