sub access_nomdistro () {
my $base = access_basedistro();
- return cfg("dgit-distro.$base.nominal-distro",'RETURN-UNDEF') // $base;
+ my $r = cfg("dgit-distro.$base.nominal-distro",'RETURN-UNDEF') // $base;
+ $r =~ m/^$distro_re$/ or badcfg
+ "bad syntax for (nominal) distro \`$r' (does not match /^$distro_re$/)";
+ return $r;
}
sub access_quirk () {
}
our ($dsc_hash,$lastpush_mergeinput);
+our ($dsc_distro, $dsc_hint_tag, $dsc_hint_url);
our $ud = '.git/dgit/unpack';
}
sub parse_dsc_field ($$) {
- my ($f, $what) = @_;
+ my ($dsc, $what) = @_;
+ my $f;
+ foreach my $field (@ourdscfield) {
+ $f = $dsc->{$field};
+ last if defined $f;
+ }
if (!defined $f) {
progress "$what: NO git hash";
- } elsif ($f =~ m/^\w+/) {
+ } elsif (($dsc_hash, $dsc_distro, $dsc_hint_tag, $dsc_hint_url)
+ = $f =~ m/^(\w+) ($distro_re) ($versiontag_re) (\S+)(?:\s|$)/) {
+ progress "$what: specified git info ($dsc_distro)";
+ $dsc_hint_tag = [ $dsc_hint_tag ];
+ } elsif ($f =~ m/^\w+\s*$/) {
$dsc_hash = $&;
+ $dsc_distro //= 'debian';
+ $dsc_hint_tag = [ debiantags +(getfield $dsc, 'Version'),
+ $dsc_distro ];
progress "$what: specified git hash";
} else {
fail "$what: invalid Dgit info";
}
}
+sub resolve_dsc_field_commit ($$) {
+ my ($already_distro, $already_mapref) = @_;
+
+ return unless defined $dsc_hash;
+
+ my $rewritemapdata = git_cat_file $already_mapref.':map';
+ if (defined $rewritemapdata
+ && $rewritemapdata =~ m/^$dsc_hash(?:[ \t](\w+))/m) {
+ progress "server's git history rewrite map contains a relevant entry!";
+
+ $dsc_hash = $1;
+ if (defined $dsc_hash) {
+ progress "using rewritten git hash in place of .dsc value";
+ } else {
+ progress "server data says .dsc hash is to be disregarded";
+ }
+ }
+}
+
sub fetch_from_archive () {
ensure_setup_existing_tree();
get_archive_dsc();
if ($dsc) {
- my $f;
- foreach my $field (@ourdscfield) {
- $f = $dsc->{$field};
- last if defined $f;
- }
- parse_dsc_field($f, 'last upload to archive');
+ parse_dsc_field($dsc, 'last upload to archive');
+ resolve_dsc_field_commit access_basedistro,
+ lrfetchrefs."/".$rewritemap
} else {
progress "no version available from the archive";
}
- my $rewritemapdata = git_cat_file lrfetchrefs."/".$rewritemap.':map';
- if (defined $rewritemapdata
- && $rewritemapdata =~ m/^$dsc_hash(?:[ \t](\w+))/m) {
- progress "server's git history rewrite map contains a relevant entry!";
- $dsc_hash = $1;
- if (defined $dsc_hash) {
- progress "using rewritten git hash in place of .dsc value";
- } else {
- progress "server data says .dsc hash is to be disregarded";
- }
- }
-
# If the archive's .dsc has a Dgit field, there are three
# relevant git commitids we need to choose between and/or merge
# together:
parse_dscdata();
- my $dgit_field = $dsc->{$ourdscfield[0]};
- parse_dsc_field($dgit_field, "$ourdscfield[0] field in .dsc");
+ parse_dsc_field($dsc, "Dgit metadata in .dsc");
if (defined $dsc_hash
&& !forceing [qw(import-dsc-with-dgit-field)]) {