updated git and svn scripts
[xrzperl.git] / gsvn-init-repos
blobc2e59ec48675e30014e962fdbe944590c8e40f09
1 #!/usr/bin/perl -w
2 # $Id$
3 use strict;
4 require v5.10.0;
5 our $VERSION = 'v0.1';
7 BEGIN
9 my $PROGRAM_DIR = $0;
10 $PROGRAM_DIR =~ s/[^\/\\]+$//;
11 $PROGRAM_DIR = "./" unless($PROGRAM_DIR);
12 unshift @INC,
13 map "$PROGRAM_DIR$_",qw{modules lib ../modules ..lib};
16 my %OPTS;
17 my @OPTIONS = qw/help|h|? version|ver manual|man dump|d/;
19 if(@ARGV)
21 require Getopt::Long;
22 require MyPlace::Usage;
23 Getopt::Long::GetOptions(\%OPTS,@OPTIONS);
24 MyPlace::Usage::Process(\%OPTS,$VERSION);
27 sub run {
28 my $head = shift;
29 print "[$head] ",join(" ",@_),"\n";
30 system(@_) == 0;
33 sub run_or_die {
34 my $head = shift;
35 die("[$head] fatal: ",join(" ",@_)," failed!\n") unless(run($head,@_));
38 sub pull_remote {
39 my($name,$url) = @_;
40 run(qw/git remote add/,$name,$url);
41 print "fetch [$name]$url ...\n";
42 run_or_die(qw/git fetch -v/,$name);
45 sub cat_file {
46 my $file = shift;
47 open FI,"<",$file or return undef;
48 print <FI>;
49 close FI;
50 return 1;
53 sub parse_config {
54 my $MACRO = shift;
55 my %config;
56 foreach(@_) {
57 chomp;
58 if($MACRO) {
59 foreach my $m_from (keys %{$MACRO}) {
60 my $m_to = $MACRO->{$m_from};
61 s/$m_from/$m_to/g;
64 s/^\s+|\s+$//g;
65 next unless($_);
66 next if(m/^#/);
67 if(m/^([^.=]+)\.([^=]+?)\s*=\s*(.+)$/) {
68 $config{$1}->{$2} = $3;
69 if($1 eq 'v') {
70 $MACRO->{"\\\$$2\\\$"} = $3;
73 elsif(m/^([^=]+?)\s*=\s*(.+)$/) {
74 $config{$1} = $2;
76 else {
77 $config{$_} = 1;
80 $config{MACRO} = $MACRO;
81 return %config;
84 my $F_DUMP = $OPTS{dump};
86 my $REPO_FILE = ".repos";
87 my $REPO_PROP = "gsvn:repos";
88 my $AUTHOR_FILE = ".authors";
91 sub process {
92 my $target = shift;
93 $target =~ s/\/+$//;
94 $target =~ s/^.+\///;
95 $target = "." unless($target);
97 print "[$target] init project repos...\n";
99 my @CONFIG_DATA;
100 if (-f $REPO_FILE) {
101 open FI,"<",$REPO_FILE or die("$!\n");
102 @CONFIG_DATA = <FI>;
103 close FI;
105 elsif(-d ".svn" or -d ".SVN") {
106 print STDERR "[$target] reading $REPO_PROP...\n";
107 @CONFIG_DATA = split("\n",qx/git svn propget gsvn:repos ./);
110 my %CONFIG = parse_config({'\$target\$'=>$target},@CONFIG_DATA);
111 if($F_DUMP) {
112 use Data::Dumper;
113 print Data::Dumper->Dump([\%CONFIG],['*CONFIG']);
114 exit 0;
116 elsif(!%CONFIG) {
117 print "[$target] init stopped, no repos config data found\n";
119 else {
120 if($CONFIG{user} and $CONFIG{user} =~ m/\s*([^<]+)\s*<([^>]+)>/) {
121 my($name,$email) = ($1,$2);
122 run_or_die($target,qw/git config user.name/,$name);
123 $email =~ s/#/@/;
124 run_or_die($target,qw/git config user.email/,$email);
126 if($CONFIG{authors}) {
127 print "[$target] writting $AUTHOR_FILE ...\n";
128 open FO,">",$AUTHOR_FILE or die("$!\n");
129 foreach my $id (keys %{$CONFIG{authors}}) {
130 my $mapto = $CONFIG{authors}->{$id};
131 $mapto =~ s/#/@/;
132 print FO "$id = $mapto\n";
134 close FO;
135 # cat_file($AUTHOR_FILE);
136 # print "[$target] add $AUTHOR_FILE to .gitignore ...\n";
137 # open FO,">>",".gitignore" or die("$!\n");
138 # print FO $AUTHOR_FILE,"\n";
139 # close FO;
140 # cat_file(".gitignore");
141 run_or_die($target,qw/git config svn.authorsfile/,$AUTHOR_FILE);
143 if($CONFIG{git}) {
144 print "[$target] fetching git repositories ...\n";
145 foreach my $reponame (keys %{$CONFIG{git}}) {
146 my $url = $CONFIG{git}->{$reponame};
147 run($target,qw/git remote add/,$reponame,$url);
148 print "[$target] fetching [$reponame] $url ...\n";
149 run_or_die($target,qw/git fetch/,$reponame);
156 use Cwd qw/getcwd/;
157 my $cwd = getcwd();
159 if(@ARGV) {
160 foreach my $wd (@ARGV) {
161 chdir $wd or die("$!: $wd\n");
162 process($wd);
163 chdir $cwd;
166 else {
167 process($cwd);
172 __END__
174 =pod
176 =head1 NAME
178 gsvn-pull-remote - PERL script
180 =head1 SYNOPSIS
182 gsvn-pull-remote [options] ...
184 =head1 OPTIONS
186 =over 12
188 =item B<--version>
190 Print version infomation.
192 =item B<-h>,B<--help>
194 Print a brief help message and exits.
196 =item B<--manual>,B<--man>
198 View application manual
200 =item B<--edit-me>
202 Invoke 'editor' against the source
204 =back
206 =head1 DESCRIPTION
208 ___DESC___
210 =head1 CHANGELOG
212 2010-11-02 xiaoranzzz <xiaoranzzz@myplace.hell>
214 * file created.
216 =head1 AUTHOR
218 xiaoranzzz <xiaoranzzz@myplace.hell>
220 =cut
222 # vim:filetype=perl