aboutsummaryrefslogtreecommitdiffstats
path: root/lib/LXRng/Repo/Git/File.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/LXRng/Repo/Git/File.pm')
-rw-r--r--lib/LXRng/Repo/Git/File.pm80
1 files changed, 80 insertions, 0 deletions
diff --git a/lib/LXRng/Repo/Git/File.pm b/lib/LXRng/Repo/Git/File.pm
new file mode 100644
index 0000000..b0bb9a3
--- /dev/null
+++ b/lib/LXRng/Repo/Git/File.pm
@@ -0,0 +1,80 @@
+package LXRng::Repo::Git::File;
+
+use strict;
+
+use base qw(LXRng::Repo::File);
+use LXRng::Repo::TmpFile;
+use File::Temp qw(tempdir);
+
+sub new {
+ my ($class, $repo, $name, $ref, $rel) = @_;
+
+ return bless({repo => $repo, name => $name, ref => $ref, rel => $rel},
+ $class);
+}
+
+sub time {
+ my ($self) = @_;
+
+ if ($$self{'repo'}->_use_author_timestamp) {
+ # This is painfully slow. It is only performed index-time,
+ # but that might stil be bad enough that you would want to
+ # just use the release-timestamp insted.
+ my $cinfo = $$self{'repo'}->_git_cmd('log', '--pretty=raw',
+ '--max-count=1', '--all',
+ '..'.$$self{'rel'},
+ '--', $self->name);
+
+ my $time;
+ while (<$cinfo>) {
+ $time = $1 if /^author .*? (\d+(?: [-+]\d+|))$/ ;
+ $time ||= $1 if /^committer .*? (\d+(?: [-+]\d+|))$/ ;
+ }
+
+ return $time if $time;
+ }
+
+ return $$self{'repo'}->_release_timestamp($$self{'rel'});
+}
+
+sub size {
+ my ($self) = @_;
+
+ my $git = $$self{'repo'}->_git_cmd('cat-file', '-s', $$self{'ref'});
+ my $size = <$git>;
+ close($git);
+ chomp($size);
+ return $size;
+}
+
+sub handle {
+ my ($self) = @_;
+
+ return $$self{'repo'}->_git_cmd('cat-file', 'blob', $$self{'ref'});
+}
+
+sub revision {
+ my ($self) = @_;
+
+ return $$self{'ref'};
+}
+
+sub phys_path {
+ my ($self) = @_;
+
+ my $tmpdir = tempdir() or die($!);
+ open(my $phys, ">", $tmpdir.'/'.$self->node) or die($!);
+
+ my $handle = $self->handle();
+ my $buf = '';
+ while (sysread($handle, $buf, 64*1024) > 0) {
+ print($phys $buf) or die($!);
+ }
+ close($handle);
+ close($phys) or die($!);
+
+ return LXRng::Repo::TmpFile->new(dir => $tmpdir,
+ node => $self->node);
+}
+
+1;