EOC
sub init_bare {
- my ($dir) = @_; # or self
+ my ($dir, $head) = @_; # or self
$dir = $dir->{git}->{git_dir} if ref($dir);
require File::Path;
File::Path::mkpath([ map { "$dir/$_" } qw(objects/info refs/heads) ]);
$INIT_FILES[1] //= 'ref: '.default_branch."\n";
- for (my $i = 0; $i < @INIT_FILES; $i++) {
- my $f = $dir.'/'.$INIT_FILES[$i++];
+ my @fn_contents = @INIT_FILES;
+ $fn_contents[1] = "ref: refs/heads/$head\n" if defined $head;
+ while (my ($fn, $contents) = splice(@fn_contents, 0, 2)) {
+ my $f = $dir.'/'.$fn;
next if -f $f;
open my $fh, '>', $f or die "open $f: $!";
- print $fh $INIT_FILES[$i] or die "print $f: $!";
+ print $fh $contents or die "print $f: $!";
close $fh or die "close $f: $!";
}
}
('lei user', 'x@example.com')
}
+# We will support users combining storage across multiple machines
+# somehow. Use per-machine refnames to make it easy-to-identify
+# where a message came from
+sub host_head () {
+ state $h = do {
+ my $x = PublicInbox::ExtSearchIdx::host_ident;
+ # Similar rules found in git.git/remote.c::valid_remote_nick
+ # and git.git/refs.c::check_refname_component
+ $x =~ s!(?:\.lock|/)+\z!!gs; # must not end with ".lock" or "/"
+ $x =~ tr/././s; # no dot-dot, collapse them
+ $x =~ s/@\{/\@-/gs;
+ $x =~ s/\A\./-/s;
+ # no "*", ":", "?", "[", "\", "^", "~", SP, TAB; "]" is OK
+ $x =~ tr^a-zA-Z0-9!"#$%&'()+,\-.;<=>@]_`{|}^-^c;
+ $x
+ };
+}
+
sub importer {
my ($self) = @_;
my $max;
while (1) {
my $latest = "$pfx/$max.git";
my $old = -e $latest;
+ PublicInbox::Import::init_bare($latest, host_head);
my $git = PublicInbox::Git->new($latest);
- PublicInbox::Import::init_bare({ git => $git });
$git->qx(qw(config core.sharedRepository 0600)) if !$old;
my $packed_bytes = $git->packed_bytes;
my $unpacked_bytes = $packed_bytes / $self->packing_factor;
$im->{bytes_added} = int($packed_bytes / $self->packing_factor);
$im->{lock_path} = undef;
$im->{path_type} = 'v2';
+ $im->{'ref'} = host_head;
return $im;
}
}