#!/usr/bin/perl use strict; use warnings; my $config={ stageDir=>'/var/gitgot', gitgotUser=>'gitgot', gitDir=>'/var/git', gotwebDir=>'/var/www/got/public', }; # Sync changes from stageDir to the webdir opendir (my $DH, $config->{stageDir}) or die "Can't opendir " . $config->{stageDir} . " : $!"; while (my $user = readdir($DH)) { next if ($user =~ /^\./); # skip . files if (-d $config->{stageDir} . "/$user") { # Need the name of each repo so we can add username ass prefix opendir (my $uDH, $config->{stageDir} . "/$user") or die "Can't opendir ". $config->{stageDir} . "/$user/ : $!"; while (my $repo = readdir($uDH)) { next if ($repo =~ /^\./); # skip . files # need destination folder name to change to prefix # the username to it to prevent one user from clobbering # another users repos. Can't do a rename of the folder # with rsync so have to create the destination folder then # rsync the contents of it. my @stat=stat($config->{stageDir} . "/$user/$repo"); my $prefixName="$user-$repo"; my $dst=qq(/$config->{gitDir}/$prefixName/); mkdir $dst,$stat[2]; #stat[2] is mode of original dir opendir (my $rDH, $config->{stageDir} . "/$user/$repo") or die "Can't opendir ". $config->{stageDir} . "/$user/$repo : $!"; while (my $git = readdir($rDH)) { next if ($git eq '.' or $git eq '..'); # skip . and .. my $src=qq($config->{stageDir}/$user/$repo/$git); my $rv=system(qq{ openrsync --rsync-path=openrsync -a --delete $src $dst }); warn "rsync failed $prefixName\n$!\n" if ($rv != 0); } } } } #final sync of all repos from the /var/git to /var/www/got/public/ for gotweb my $rv=system(qq{ openrsync --rsync-path=openrsync -a --delete $config->{gitDir}/* $config->{gotwebDir}/ }); warn "rsync failed from " . $config->{gitDir} . " to ". $config->{gotwebDir} . "\n$!\n" if ($rv != 0);