Mercurial > pub > Impl
comparison Lib/Deployment/Batch.pm @ 0:03e58a454b20
Создан репозитарий
author | Sergey |
---|---|
date | Tue, 14 Jul 2009 12:54:37 +0400 |
parents | |
children | 16ada169ca75 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:03e58a454b20 |
---|---|
1 use strict; | |
2 | |
3 package Deployment::Batch; | |
4 | |
5 require URI::file; | |
6 | |
7 my %Provider; | |
8 our $AUTOLOAD; | |
9 | |
10 our %Dirs; | |
11 our %Context; | |
12 | |
13 $Context{DieOnError} = 1; # dies by default if the action fails to run | |
14 | |
15 our @history; | |
16 | |
17 # make all inc absolute; | |
18 @INC = map { URI::file->new_abs($_)->dir } @INC; | |
19 | |
20 sub AUTOLOAD { | |
21 my $method = $AUTOLOAD; | |
22 | |
23 shift if $_[0] eq __PACKAGE__; | |
24 | |
25 my $class = "$method"; | |
26 | |
27 if (not $Provider{$method}) { | |
28 (my $file = "$class.pm") =~ s/::/\//g; | |
29 require $file; | |
30 $Provider{$method} = 1; | |
31 } | |
32 | |
33 my $action = $class->new(@_); | |
34 | |
35 push @history,$action; | |
36 if ($Context{Immediate}) { | |
37 $action->_Run or ($Context{DieOnError} ? die $_->LastError : return 0); | |
38 } | |
39 | |
40 return 1; | |
41 } | |
42 | |
43 sub SetDir { | |
44 shift if $_[0] eq __PACKAGE__; | |
45 my ($name,$dir) = @_; | |
46 | |
47 $Dirs{$name} = URI::file->new_abs($dir); | |
48 } | |
49 | |
50 sub Rollback { | |
51 return 1 if not @history; | |
52 | |
53 $_->_Rollback or $_->Log('Rollback: ',$_->LastError) foreach reverse grep { $_->isProcessed } @history; | |
54 undef @history; | |
55 return 1; | |
56 } | |
57 | |
58 sub Commit { | |
59 return 1 if not @history; | |
60 | |
61 # during commit we are in the immediate mode | |
62 local $Context{Immediate} = 1; | |
63 | |
64 $_->_Run or $_->Log('Run: ',$_->LastError) and Rollback() and last foreach grep { not $_->isProcessed } @history; | |
65 return 0 if not @history; | |
66 undef @history; | |
67 return 1; | |
68 } | |
69 | |
70 sub DoPackage { | |
71 shift if $_[0] eq __PACKAGE__; | |
72 my ($package,$inline) = @_; | |
73 | |
74 Log( "The package is required" ) and return 0 if not $package; | |
75 Log( "Processing $package" ); | |
76 my $t0 = [Time::HiRes::gettimeofday]; | |
77 | |
78 if ($inline and $inline eq 'inline') { | |
79 $inline = 1; | |
80 } else { | |
81 $inline = 0; | |
82 } | |
83 | |
84 if (not $inline) { | |
85 my %copy = %Context; | |
86 local %Context = %copy; | |
87 local @history = (); | |
88 $Context{Package} = $Context{PackageDir} ? URI::file->new($package)->abs($Context{PackageDir}) : URI::file->new_abs($package); | |
89 $Context{PackageDir} = URI::file->new('./')->abs($Context{Package}); | |
90 | |
91 undef $@; | |
92 do $package or Log("$package: ". ($@ || $!)) and Rollback() and Log("Rollback completed in ",Time::HiRes::tv_interval($t0)," s") and return 0; | |
93 | |
94 Log("Commiting"); | |
95 Commit or Log("Commit failed in ",Time::HiRes::tv_interval($t0)) and return 0; | |
96 Log("Commit successful in ",Time::HiRes::tv_interval($t0),' s'); | |
97 return 1; | |
98 } else { | |
99 local $Context{Package} = $Context{PackageDir} ? URI::file->new($package)->abs($Context{PackageDir}) : URI::file->new_abs($package); | |
100 local $Context{PackageDir} = URI::file->new('./')->abs($Context{Package}); | |
101 | |
102 do $package or Log("$package: ". ($@ || $!)) and Rollback() and Log("Rollback completed in ",Time::HiRes::tv_interval($t0),' s') and return 0; | |
103 | |
104 return 1; | |
105 } | |
106 } | |
107 | |
108 sub Dir { | |
109 shift if $_[0] eq __PACKAGE__; | |
110 my $uriDir = $Dirs{$_[0]} or die "No such directory entry $_[0]"; | |
111 shift; | |
112 return $uriDir->dir.join('/',@_); | |
113 } | |
114 | |
115 sub PackageDir { | |
116 shift if $_[0] eq __PACKAGE__; | |
117 return $Context{PackageDir}->dir.join('/',@_); | |
118 } | |
119 | |
120 sub Log { | |
121 shift if $_[0] eq __PACKAGE__; | |
122 | |
123 if (my $hout = $Context{LogOutput}) { | |
124 print $hout 'DoPackage: ',@_,"\n"; | |
125 } | |
126 1; | |
127 } | |
128 | |
129 1; |