File Coverage

perllib/Arch/Library.pm
Criterion Covered Total %
statement 24 151 15.8
branch 0 46 0.0
condition 0 41 0.0
subroutine 8 25 32.0
pod 15 16 93.7
total 47 279 16.8


line stmt bran cond sub pod time code
1             # Arch Perl library, Copyright (C) 2004 Mikhael Goikhman
2             #
3             # This program is free software; you can redistribute it and/or modify
4             # it under the terms of the GNU General Public License as published by
5             # the Free Software Foundation; either version 2 of the License, or
6             # (at your option) any later version.
7             #
8             # This program is distributed in the hope that it will be useful,
9             # but WITHOUT ANY WARRANTY; without even the implied warranty of
10             # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11             # GNU General Public License for more details.
12             #
13             # You should have received a copy of the GNU General Public License
14             # along with this program; if not, write to the Free Software
15             # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16              
17 3     3   66 use 5.005;
  3         10  
  3         111  
18 3     3   16 use strict;
  3         5  
  3         127  
19              
20             package Arch::Library;
21              
22 3     3   18 use base 'Arch::Storage';
  3         7  
  3         801  
23              
24 3     3   17 use Arch::Util qw(run_tla load_file standardize_date parse_creator_email date2age);
  3         7  
  3         242  
25 3     3   16 use Arch::Changeset;
  3         5  
  3         56  
26 3     3   1847 use Arch::Log;
  3         7  
  3         105  
27 3     3   25 use Arch::Backend qw(has_revlib_patch_set_dir);
  3         5  
  3         275  
28 3     3   441 use Arch::TempFiles qw(temp_dir);
  3         7  
  3         5200  
29              
30             sub _default_fields ($) {
31 0     0     my $this = shift;
32             return (
33 0           $this->SUPER::_default_fields,
34             fallback_dir => undef,
35             ready_to_add => 0,
36             path => undef,
37             working_revision => undef,
38             revision_trees => {},
39             );
40             }
41              
42             sub archives ($) {
43 0     0 1   my $self = shift;
44 0           return [ run_tla('library-archives') ];
45             }
46              
47             sub categories ($;$) {
48 0     0 1   my $self = shift;
49 0   0       my $archive = shift || $self->working_name;
50 0           return [ run_tla('library-categories', $archive) ];
51             }
52              
53             sub branches ($;$) {
54 0     0 1   my $self = shift;
55 0   0       my $full_category = shift || $self->working_name;
56 0           return [ run_tla('library-branches', $full_category) ];
57             }
58              
59             sub versions ($;$) {
60 0     0 1   my $self = shift;
61 0   0       my $full_branch = shift || $self->working_name;
62 0           return [ run_tla('library-versions', $full_branch) ];
63             }
64              
65             sub revisions ($;$) {
66 0     0 1   my $self = shift;
67 0   0       my $full_version = shift || $self->working_name;
68 0           return [ run_tla('library-revisions', $full_version) ];
69             }
70              
71             sub get_revision_descs ($;$) {
72 0     0 1   my $self = shift;
73 0   0       my $full_version = shift || $self->working_name;
74 0           my @lines = run_tla('library-revisions -Dcs', $full_version);
75              
76 0           my @revision_descs = ();
77 0           while (@lines) {
78 0           my ($name, $date, $creator) = splice @lines, 0, 3;
79 0 0         die "Unexpected date line ($date) in tla library-revisions -Dcs\n"
80             unless $date =~ s/^ //;
81 0 0         die "Unexpected creator line ($creator) in tla library-revisions -Dcs\n"
82             unless $creator =~ s/^ //;
83              
84 0           my @summary_lines = ();
85 0   0       push @summary_lines, shift @lines while @lines && $lines[0] =~ /^ |^\t/;
86 0           my $summary = join("\n", @summary_lines);
87 0           $summary =~ s/^ |^\t//mg;
88              
89 0           $date = standardize_date($date);
90 0           my $age = date2age($date);
91 0           my ($creator1, $email, $username) = parse_creator_email($creator);
92              
93 0           push @revision_descs, {
94             name => $name,
95             summary => $summary,
96             creator => $creator1,
97             email => $email,
98             username => $username,
99             date => $date,
100             age => $age,
101             kind => 'lib',
102             };
103             }
104 0           return \@revision_descs;
105             }
106              
107             *revision_details = *get_revision_descs; *revision_details = *revision_details;
108              
109             sub expanded_archive_info ($;$$) {
110 0     0 1   my $self = shift;
111              
112 0           my $old_working_name = $self->working_name;
113 0   0       my $archive_name = shift || $old_working_name;
114 0           $self->working_name($archive_name);
115 0           my ($archive, $category0, $branch0) = $self->working_names;
116 0   0       my $full_listing = shift || 0;
117              
118 0           my $infos = [];
119 0           $self->working_names($archive);
120 0 0         foreach my $category ($category0? ($category0): @{$self->categories}) {
  0            
121 0           $self->working_names($archive, $category);
122 0           push @$infos, [ $category, [] ];
123 0 0         foreach my $branch ($branch0? ("$category--$branch0"): @{$self->branches}) {
  0            
124 0 0         $branch = "" unless $branch =~ s/^\Q$category\E--//;
125 0           $self->working_names($archive, $category, $branch);
126 0           push @{$infos->[-1]->[1]}, [ $branch, [] ];
  0            
127 0           foreach my $version (@{$self->versions}) {
  0            
128 0 0         die unless $version =~ s/^\Q$category\E(?:--)?\Q$branch\E--//;
129 0           $self->working_names($archive, $category, $branch, $version);
130 0           my $revisions = $self->revisions;
131 0           my $revisions2 = [];
132 0 0         if ($full_listing) {
133 0           $revisions2 = $revisions;
134             } else {
135 0   0       my $revision0 = $revisions->[0] || '';
136 0   0       my $revisionl = $revisions->[-1] || '';
137 0 0         $revisionl = '' if $revision0 eq $revisionl;
138 0           push @$revisions2, $revision0, $revisionl;
139             }
140 0           push @{$infos->[-1]->[1]->[-1]->[1]}, [ $version, @$revisions2 ];
  0            
141             }
142             }
143             }
144              
145 0           $self->working_name($old_working_name);
146 0           return $infos;
147             }
148              
149             sub fallback_dir ($;$) {
150 0     0 1   my $self = shift;
151 0 0         if (@_) {
152 0           my $dir = shift;
153 0           $self->{fallback_dir} = $dir;
154             }
155 0           return $self->{fallback_dir};
156             }
157              
158             sub working_revision ($;$) {
159 0     0 1   my $self = shift;
160 0 0         if (@_) {
161 0           my $revision = shift;
162 0           $self->{working_revision} = $revision;
163             }
164 0           return $self->{working_revision};
165             }
166              
167             sub add_revision ($$) {
168 0     0 0   my $self = shift;
169 0           my $revision = shift;
170 0 0         unless ($self->{ready_to_add}) {
171 0           ($self->{path}) = run_tla("my-revision-library --silent --add");
172 0           my $fallback_dir = $self->{fallback_dir};
173 0 0 0       if (!$self->{path} && $fallback_dir) {
174             # don't create more than one directory level to avoid typos
175 0 0         mkdir($fallback_dir, 0777) unless -d $fallback_dir;
176 0           run_tla("my-revision-library $fallback_dir");
177 0           ($self->{path}) = run_tla("my-revision-library --silent --add");
178             }
179 0 0         $self->{ready_to_add} = 1 if $self->{path};
180             }
181 0 0         die "Can't attempt to add revision. No revision-library is defined?\n"
182             unless $self->{ready_to_add};
183 0           run_tla("library-add --sparse $revision");
184 0           my $dir = $self->find_revision_tree($revision);
185 0 0         die "Adding revision $revision to library failed.\nBad permissions or corrupt archive?\n"
186             unless $dir;
187 0           return $dir;
188             }
189              
190             sub find_revision_tree ($$;$) {
191 0     0 1   my $self = shift;
192 0   0       my $revision = shift || die "find_revision_tree: No revision given\n";
193 0   0       my $auto_add = shift || 0;
194 0 0         return $self->{revision_trees}->{$revision} if $self->{revision_tree};
195 0           my ($dir) = run_tla("library-find -s $revision");
196 0 0 0       if (!$dir && $auto_add) {
197 0           $dir = $self->add_revision($revision);
198             }
199 0           return $self->{revision_trees}->{$revision} = $dir;
200             }
201              
202             sub find_tree ($;$) {
203 0     0 1   my $self = shift;
204 0           $self->find_revision_tree($self->{working_revision}, @_);
205             }
206              
207             sub get_revision_changeset ($$) {
208 0     0 1   my $self = shift;
209 0   0       my $revision = shift || die "get_revision_changeset: No revision given\n";
210              
211 0           my $dir;
212 0 0         if (has_revlib_patch_set_dir()) {
213 0           my $tree_root = $self->find_revision_tree($revision);
214 0 0         die "No revision $revision found in library\n" unless $tree_root;
215              
216 0           $dir = "$tree_root/,,patch-set";
217             } else {
218 0           $dir = temp_dir();
219 0           run_tla('get-changeset', $revision, $dir);
220             }
221              
222 0           return Arch::Changeset->new($revision, $dir);
223             }
224              
225             sub get_changeset ($) {
226 0     0 1   my $self = shift;
227 0           $self->get_revision_changeset($self->{working_revision}, @_);
228             }
229              
230             sub get_revision_log ($$) {
231 0     0 1   my $self = shift;
232 0   0       my $revision = shift || die "get_revision_log: No revision given\n";
233              
234 0           my $message;
235 0 0         if (has_revlib_patch_set_dir()) {
236 0           my $tree_root = $self->find_revision_tree($revision);
237 0 0         die "No revision $revision found in library\n" unless $tree_root;
238              
239 0           my $log_file = "$tree_root/,,patch-set/=log.txt";
240 0 0         die "Missing log $log_file in revision library\n" unless -f $log_file;
241 0           $message = load_file($log_file);
242             } else {
243 0           $message = run_tla('library-log', $revision);
244             }
245              
246 0           return Arch::Log->new($message);
247             }
248              
249             sub get_log ($) {
250 0     0 1   my $self = shift;
251 0           $self->get_revision_log($self->{working_revision}, @_);
252             }
253              
254             1;
255              
256             __END__