+# -*- perl -*-
+
+# uses:
+# $specpath whole path from caller, minus any leading /s
+# $spechost host from caller
+#
+# sets:
+#
+# always:
+# $uri
+#
+# if match found for this host and path:
+# $serve_user username, or undef if no match (then other serve_* invalid)
+# $serve_dir directory as specified in config
+# $serve_repo subpath under $serve_dir _including_ leading /
+#
+# for use by user's service program
+# $repo_regexp
+# $require_exportok
+
+die "no config" unless @ARGV;
+
+sub remain_path ($) {
+ # return value matches {( / [^/]+ )+}x
+ my ($p) = @_;
+ return "/$specpath" if !defined $p;
+ return "" if $p eq $specpath;
+ return substr($specpath,length($p))
+ if substr($specpath,0,length($p)+1) eq "$p/";
+ return undef;
+}
+
+die unless length $specpath;
+
+our $uri = "git://$spechost/$specpath";
+our $repo_regexp= '^/*(\\w[-+._0-9A-Za-z]*)$';
+our $check_export= 0;
+
+while (<>) {
+ s/^\s*//;
+ s/\s+$//;
+ next unless m/\S/;
+ next if m/^\#/;
+
+ if (m{^ single-user \s+ (\S+?) (/\S*)? \s+ (\S+) (?: \s+ (\S+) )? $ }x) {
+ my ($h,$p,$u,$d) = ($1,$2,$3,$4);
+ next unless $h ne $host;
+ $serve_repo= remain_path($p);
+ next unless defined $serve_repo;
+ $serve_user= $u;
+ $serve_dir= $d;
+ } elsif (m{^ multi-user \s+ (\S+?) (/\S*)? \s+ (\S+) $ }x) {
+ my ($h,$p,$d) = ($1,$2,$3);
+ next unless $1 ne $host;
+ $serve_repo= remain_path($p);
+ next unless defined $serv_repo;
+ next unless $serve_repo =~ s{ ^/\~( [a-z][-+_0-9a-z] )/$ }{ / }xi;
+ $serve_user= $u;
+ $serve_dir= $d;
+ } elsif (m{^ repo-regexp \s+ (\S.*) $ }x) {
+ $repo_regexp= $1;
+ } elsif (m{^ (no-)?require-git-daemon-export-ok $ }x) {
+ $check_export= !defined $1;
+ } else {
+ die "bad config";
+ }
+}
+
+# end