91
91
# if we are called with a pserver argument,
92
92
# deal with the authentication cat before entering the
94
$state->{method} = 'ext';
94
95
if (@ARGV && $ARGV[0] eq 'pserver') {
96
$state->{method} = 'pserver';
95
97
my $line = <STDIN>; chomp $line;
96
98
unless( $line eq 'BEGIN AUTH REQUEST') {
97
99
die "E Do not understand $line - expecting BEGIN AUTH REQUEST\n";
182
185
foreach my $line ( @gitvars )
184
next unless ( $line =~ /^(.*?)\.(.*?)=(.*)$/ );
187
next unless ( $line =~ /^(gitcvs)\.(?:(ext|pserver)\.)?([\w-]+)=(.*)$/ );
191
$cfg->{$1}{$2}{$3} = $4;
188
unless ( defined ( $cfg->{gitcvs}{enabled} ) and $cfg->{gitcvs}{enabled} =~ /^\s*(1|true|yes)\s*$/i )
195
unless ( ($cfg->{gitcvs}{$state->{method}}{enabled}
196
and $cfg->{gitcvs}{$state->{method}}{enabled} =~ /^\s*(1|true|yes)\s*$/i)
197
or ($cfg->{gitcvs}{enabled}
198
and $cfg->{gitcvs}{enabled} =~ /^\s*(1|true|yes)\s*$/i) )
190
200
print "E GITCVS emulation needs to be enabled on this repo\n";
191
201
print "E the repo config file needs a [gitcvs] section added, and the parameter 'enabled' set to 1\n";
364
my $updater = GITCVS::updater->new($state->{CVSROOT}, $state->{module}, $log);
367
argsfromdir($updater);
353
369
my $addcount = 0;
355
371
foreach my $filename ( @{$state->{args}} )
357
373
$filename = filecleanup($filename);
375
my $meta = $updater->getmeta($filename);
376
my $wrev = revparse($filename);
378
if ($wrev && $meta && ($wrev < 0))
380
# previously removed file, add back
381
$log->info("added file $filename was previously removed, send 1.$meta->{revision}");
383
print "MT +updated\n";
384
print "MT text U \n";
385
print "MT fname $filename\n";
386
print "MT newline\n";
387
print "MT -updated\n";
389
unless ( $state->{globaloptions}{-n} )
391
my ( $filepart, $dirpart ) = filenamesplit($filename,1);
393
print "Created $dirpart\n";
394
print $state->{CVSROOT} . "/$state->{module}/$filename\n";
396
# this is an "entries" line
397
my $kopts = kopts_from_path($filepart);
398
$log->debug("/$filepart/1.$meta->{revision}//$kopts/");
399
print "/$filepart/1.$meta->{revision}//$kopts/\n";
401
$log->debug("SEND : u=$meta->{mode},g=$meta->{mode},o=$meta->{mode}");
402
print "u=$meta->{mode},g=$meta->{mode},o=$meta->{mode}\n";
404
transmitfile($meta->{filehash});
359
410
unless ( defined ( $state->{entries}{$filename}{modified_filename} ) )
361
412
print "E cvs add: nothing known about `$filename'\n";
2133
2184
bless $self, $class;
2135
$self->{dbdir} = $config . "/";
2136
die "Database dir '$self->{dbdir}' isn't a directory" unless ( defined($self->{dbdir}) and -d $self->{dbdir} );
2138
2186
$self->{module} = $module;
2139
$self->{file} = $self->{dbdir} . "/gitcvs.$module.sqlite";
2141
2187
$self->{git_path} = $config . "/";
2143
2189
$self->{log} = $log;
2145
2191
die "Git repo '$self->{git_path}' doesn't exist" unless ( -d $self->{git_path} );
2147
$self->{dbh} = DBI->connect("dbi:SQLite:dbname=" . $self->{file},"","");
2193
$self->{dbdriver} = $cfg->{gitcvs}{$state->{method}}{dbdriver} ||
2194
$cfg->{gitcvs}{dbdriver} || "SQLite";
2195
$self->{dbname} = $cfg->{gitcvs}{$state->{method}}{dbname} ||
2196
$cfg->{gitcvs}{dbname} || "%Ggitcvs.%m.sqlite";
2197
$self->{dbuser} = $cfg->{gitcvs}{$state->{method}}{dbuser} ||
2198
$cfg->{gitcvs}{dbuser} || "";
2199
$self->{dbpass} = $cfg->{gitcvs}{$state->{method}}{dbpass} ||
2200
$cfg->{gitcvs}{dbpass} || "";
2201
my %mapping = ( m => $module,
2202
a => $state->{method},
2203
u => getlogin || getpwuid($<) || $<,
2204
G => $self->{git_path},
2205
g => mangle_dirname($self->{git_path}),
2207
$self->{dbname} =~ s/%([mauGg])/$mapping{$1}/eg;
2208
$self->{dbuser} =~ s/%([mauGg])/$mapping{$1}/eg;
2210
die "Invalid char ':' in dbdriver" if $self->{dbdriver} =~ /:/;
2211
die "Invalid char ';' in dbname" if $self->{dbname} =~ /;/;
2212
$self->{dbh} = DBI->connect("dbi:$self->{dbdriver}:dbname=$self->{dbname}",
2215
die "Error connecting to database\n" unless defined $self->{dbh};
2149
2217
$self->{tables} = {};
2150
foreach my $table ( $self->{dbh}->tables )
2218
foreach my $table ( keys %{$self->{dbh}->table_info(undef,undef,undef,'TABLE')->fetchall_hashref('TABLE_NAME')} )
2154
2220
$self->{tables}{$table} = 1;
2848
2914
return wantarray ? @output : join('',@output);
2917
=head2 mangle_dirname
2919
create a string from a directory name that is suitable to use as
2920
part of a filename, mainly by converting all chars except \w.- to _
2923
sub mangle_dirname {
2924
my $dirname = shift;
2925
return unless defined $dirname;
2927
$dirname =~ s/[^\w.-]/_/g;