X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=sa;h=d09a139cf33998982f9b08938f226d421a8e4eb0;hb=f3872bf5d964f8df005095640b7883352be82d27;hp=54530d2de61cf5d858c8e8eea9ea6550722edff0;hpb=7c5739a677884afa8824b6fe8da7968535940457;p=bin.git diff --git a/sa b/sa index 54530d2..d09a139 100755 --- a/sa +++ b/sa @@ -1,15 +1,128 @@ -#!/bin/sh +#!/usr/bin/perl -# sync all script +use warnings; +use strict; -# attempt to sync all known svn projects +use Getopt::Long; +use Pod::Usage; -if [ "$1" == "quick" ]; then - $IGNORE="--ignore-externals"; -fi; +=head1 NAME -for dir in ~/ ~/.hide ~/projects/propel ~/bin ~/lib; do - if [ -e $dir/.svn ]; then - svn update $IGNORE $dir; - fi; -done; \ No newline at end of file +sa - sync all + +=head1 SYNOPSIS + +sa [options] [status|update|checkout] [directories to sync] + + Options: + --quick, -Q don't update external projects + --quiet, -q be quiet + --debug, -d debugging level (Default 0) + --help, -h display this help + --man, -m display manual + +=head1 OPTIONS + +=over + +=item B<--debug, -d> + +Debug verbosity. (Default 0) + +=item B<--help, -h> + +Display brief useage information. + +=item B<--man, -m> + +Display this manual. + +=back + +=head1 EXAMPLES + +=cut + + + +use User; +use IO::File; +use vars qw($DEBUG); + +my %options = (quick => 1, + quiet => 1, + debug => 0, + help => 0, + man => 0, + ); + +GetOptions(\%options,'quick|Q+','quiet|q!','debug|d+','help|h|?','man|m'); + +pod2usage() if $options{help}; +pod2usage({verbose=>2}) if $options{man}; + +# parse configuration file + +=head1 CONFIGURATION + +Reads configuration information from Start by parsing /etc/sa.conf, +then ~/.sarc then ~/.sarc_$hostname, then ~/.sarc_local + +The configuration file contains a list of svn repositories which +should be queried; each line can contain a tab, which indicates that +the command following the tab should be run fater the svn directory is +updated. + +The configuration files are read in the order given above. + +=cut + +sub parse_config_file { + my ($repos,$filename,$home) = @_; + return unless -e $filename and -r _; + my $fh = new IO::File $filename, 'r' or die "Unable to read configuration file $filename $!"; + while (<$fh>) { + chomp; + next if /^#/; + my ($repo,$command) = split /\t/,$_,2; + $repo =~ s/^\~/$home/; + $$repos{$repo} = $command; + } +} + + +my $HOME=User->Home; +my $HOSTNAME=qx(hostname); +$HOSTNAME=~s/\n//g; +my %repos; +for ('/etc/sa.conf', "${HOME}/.sarc", "${HOME}/.sarc_${HOSTNAME}", "${HOME}/.sarc_local") { + if (-e $_) { + parse_config_file(\%repos,$_,$HOME); + } +} + +$DEBUG = $options{debug}; + +my $command; + +if (@ARGV and $ARGV[0] =~ /^(st(?:atus)?|up(?:date)?|checkout)$/) { + $command = $ARGV[0]; +} +else { + $command = 'status'; +} + +while (my ($repo,$run_after) = each(%repos)) { + if (-e "$repo/.svn") { + system('svn', + $command, + $options{quiet}?'-q':(), + $options{quick}?'--ignore-externals':(), + $options{quick}>1?'-N':(), + $repo, + ); + } + if ($command =~ /^up(?:date)|checkout$/) { + system($run_after,$repo) if defined $run_after and length $run_after; + } +}