# -*- 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