use PublicInbox::MsgTime qw(msg_timestamp msg_datestamp);
use PublicInbox::ContentId qw(content_digest);
use PublicInbox::MDA;
+use PublicInbox::Eml;
use POSIX qw(strftime);
sub new {
$info =~ m!\A100644 blob ([a-f0-9]{40})\t!s or die "not blob: $info";
my $oid = $1;
my $msg = _cat_blob($r, $w, $oid) or die "BUG: cat-blob $1 failed";
- my $cur = PublicInbox::MIME->new($msg);
+ my $cur = PublicInbox::Eml->new($msg);
my $cur_s = $cur->header('Subject');
$cur_s = '' unless defined $cur_s;
my $cur_m = $mime->header('Subject');
}
sub extract_cmt_info ($;$) {
- my ($mime, $v2w) = @_;
+ my ($mime, $smsg) = @_;
my $sender = '';
my $from = $mime->header('From');
utf8::encode($subject);
my $at = git_timestamp(my @at = msg_datestamp($hdr));
my $ct = git_timestamp(my @ct = msg_timestamp($hdr));
- if ($v2w) { # set fallbacks in case message had no date
- $v2w->{autime} = $at[0];
- $v2w->{cotime} = $ct[0];
+ if ($smsg) {
+ $smsg->{ds} = $at[0];
+ $smsg->{ts} = $ct[0];
}
($name, $email, $at, $ct, $subject);
}
my $hdr = $mime->header_obj;
my $mids = mids($hdr);
- if (!scalar(@$mids)) { # spam often has no Message-Id
+ if (!scalar(@$mids)) { # spam often has no Message-ID
my $mid0 = digest2mid(content_digest($mime), $hdr);
append_mid($hdr, $mid0);
return $mid0;
# returns undef on duplicate
# returns the :MARK of the most recent commit
sub add {
- my ($self, $mime, $check_cb, $v2w) = @_; # mime = Email::MIME
+ my ($self, $mime, $check_cb, $smsg) = @_; # mime = Email::MIME
- my ($name, $email, $at, $ct, $subject) = extract_cmt_info($mime, $v2w);
+ my ($name, $email, $at, $ct, $subject) = extract_cmt_info($mime, $smsg);
my $path_type = $self->{path_type};
my $path;
if ($path_type eq '2/38') {
print $w $raw_email, "\n" or wfail;
# v2: we need this for Xapian
- if ($self->{want_object_info}) {
- my $oid = $self->get_mark(":$blob");
- $self->{last_object} = [ $oid, $n, \$raw_email ];
+ if ($smsg) {
+ $smsg->{blob} = $self->get_mark(":$blob");
+ $smsg->{bytes} = $n;
+ $smsg->{-raw_email} = \$raw_email;
}
my $ref = $self->{ref};
my $commit = $self->{mark}++;
$? == 0 or die join(' ', @$cmd) . " failed: $?\n";
}
+my @INIT_FILES = ('HEAD' => "ref: refs/heads/master\n",
+ 'description' => <<EOD,
+Unnamed repository; edit this file 'description' to name the repository.
+EOD
+ 'config' => <<EOC);
+[core]
+ repositoryFormatVersion = 0
+ filemode = true
+ bare = true
+[repack]
+ writeBitmaps = true
+EOC
+
sub init_bare {
- my ($dir) = @_;
- my @cmd = (qw(git init --bare -q), $dir);
- run_die(\@cmd);
- # set a reasonable default:
- @cmd = (qw/git config/, "--file=$dir/config",
- 'repack.writeBitmaps', 'true');
- run_die(\@cmd);
+ my ($dir) = @_; # or self
+ $dir = $dir->{git}->{git_dir} if ref($dir);
+ require File::Path;
+ File::Path::mkpath([ map { "$dir/$_" } qw(objects/info refs/heads) ]);
+ for (my $i = 0; $i < @INIT_FILES; $i++) {
+ my $f = $dir.'/'.$INIT_FILES[$i++];
+ next if -f $f;
+ open my $fh, '>', $f or die "open $f: $!";
+ print $fh $INIT_FILES[$i] or die "print $f: $!";
+ close $fh or die "close $f: $!";
+ }
}
sub done {