File Coverage

lib/Devel/Trepan/CmdProcessor/Command/Info_Subcmd/Files.pm
Criterion Covered Total %
statement 51 213 23.9
branch 0 92 0.0
condition 0 42 0.0
subroutine 17 21 80.9
pod n/a
total 68 368 18.4


line stmt bran cond sub pod time code
1             # -*- coding: utf-8 -*-
2             # Copyright (C) 2011-2014 Rocky Bernstein <rocky@cpan.org>
3 12     12   107 use warnings;
  12     1   40  
  12         464  
  1         7  
  1         3  
  1         26  
4 12     12   73 use rlib '../../../../..';
  12     1   33  
  12         71  
  1         6  
  1         3  
  1         5  
5              
6             package Devel::Trepan::CmdProcessor::Command::Info::Files;
7 12     12   5124 use Cwd 'abs_path';
  12     1   32  
  12         663  
  1         581  
  1         2  
  1         57  
8              
9 12     12   83 use Devel::Trepan::CmdProcessor::Command::Subcmd::Core;
  12     1   31  
  12         318  
  1         6  
  1         2  
  1         29  
10 12     12   79 use Devel::Trepan::DB::LineCache;
  12     1   38  
  12         2560  
  1         5  
  1         3  
  1         204  
11              
12 12     12   87 use strict;
  12     1   37  
  12         582  
  1         8  
  1         2  
  1         42  
13             our (@ISA, @SUBCMD_VARS);
14             # Values inherited from parent
15 12     12   79 use vars @Devel::Trepan::CmdProcessor::Command::Subcmd::SUBCMD_VARS;
  12     1   46  
  12         2992  
  1         5  
  1         4  
  1         194  
16              
17             our @DEFAULT_FILE_ARGS = qw(size mtime sha1);
18             our $DEFAULT_FILE_ARGS = join(' ', @DEFAULT_FILE_ARGS);
19              
20             ## FIXME: do automatically.
21             our $CMD = "info files";
22              
23             unless (@ISA) {
24 12     12   99 eval <<"EOE";
  12         40  
  12         740  
25             use constant MAX_ARGS => 8; # Need at most this many - undef -> unlimited.
26             EOE
27             }
28              
29             @ISA = qw(Devel::Trepan::CmdProcessor::Command::Subcmd);
30             =pod
31              
32             =head2 Synopsis:
33              
34             =cut
35             our $HELP = <<'HELP';
36             =pod
37              
38             B<info files> [{I<filename>|B<*>} [B<all>|B<ctime>|B<brkpts>|B<mtime>|B<sha1>|B<size>|B<stat>]]
39              
40             Show information about the current file. If no filename is given and
41             the program is running, then the current file associated with the
42             current stack entry is used. Giving . has the same effect.
43              
44             B<*> gives a list of all files we know about.
45              
46             Sub-options which can be shown about a file are:
47              
48             =over 2
49              
50             =item *
51              
52             B<brkpts> E<mdash> Line numbers where there are statement boundaries.
53             These lines can be used in breakpoint commands.
54              
55             =item *
56              
57             B<ctime> E<mdash> File creation time
58              
59             =item *
60              
61             B<time> E<mdash> File modification time
62              
63             =item *
64              
65             B<sha1> E<mdash> A SHA1 hash of the source text. This may be useful in
66             comparing source code.
67              
68             =item *
69              
70             B<size> E<mdash> The number of lines in the file.
71              
72             =item *
73              
74             B<stat> E<mdash> I<stat()> information
75              
76             =item *
77              
78             B<all> E<mdash> All of the above information.
79              
80             =back
81              
82             If no sub-options are given, I<size mtime sha1> are assumed.
83              
84             =head2 Examples:
85              
86             info files # Show "size mtime sha1" information about current file
87             info files . # same as above
88             info files . brkpts # show the number of lines in the current file
89             info files . brkpts size # above plus file size
90             info files * # Give a list of files we know about
91             =cut
92             HELP
93              
94             our $SHORT_HELP = 'Show information about the current loaded file(s)';
95             our $MIN_ABBREV = length('fi');
96              
97 12     12   89 no warnings 'redefine';
  12     1   70  
  12         11187  
  1         6  
  1         2  
  1         843  
98             sub complete($$)
99             {
100 0     0     my ($self, $prefix) = @_;
  0     0      
101 0           my @completions = ('.', DB::LineCache::file_list());
  0            
102 0           Devel::Trepan::Complete::complete_token(\@completions, $prefix);
  0            
103             }
104              
105             sub run($$)
106             {
107 0     0     my ($self, $args) = @_;
  0     0      
108 0           my $proc = $self->{proc};
  0            
109 0           my @args = @$args; shift @args; shift @args;
  0            
  0            
  0            
  0            
  0            
110 0 0         push(@args, '.') if scalar @args == 0;
  0 0          
111 0 0         if ($args[0] eq '*') {
  0 0          
112 0           $proc->section('Cached files:');
  0            
113 0           my @primary = DB::LineCache::cached_files();
  0            
114 0           @primary = sort @primary;
  0            
115 0           $proc->msg($self->{cmd}->columnize_commands(\@primary));
  0            
116 0           return;
  0            
117             }
118 0           my $filename = shift @args;
  0            
119 0 0         if ($filename eq '.') {
  0 0          
120 0           my $frame_file = $proc->filename;
  0            
121 0   0       $filename = map_file($frame_file) ||
  0   0        
122             abs_path($frame_file);
123             }
124 0 0         @args = @DEFAULT_FILE_ARGS if 0 == scalar @args;
  0 0          
125              
126 0           my $m = $filename;
  0            
127 0           my $canonic_name = $proc->canonic_file($filename);
  0            
128 0   0       $canonic_name = map_file($canonic_name) || $canonic_name;
  0   0        
129 0 0         if (is_cached($canonic_name)) {
  0 0          
130 0           $m .= " is cached in debugger";
  0            
131 0 0         if ($canonic_name ne $filename) {
  0 0          
132 0           $m .= (" as:\n " . $canonic_name);
  0            
133             }
134 0           $m .= '.';
  0            
135 0           $proc->msg($m);
  0            
136             # } elsif (!(matches = find_scripts(filename)).empty?) {
137             # if (matches.size > 1) {
138             # $self->msg("Multiple files found:");
139             # matches.sort.each { |match_file| msg "\t%s" % match_file }
140             # return;
141             # } else {
142             # $self->msg('File "%s" just now cached.' % filename);
143             # LineCache::cache(matches[0]);
144             # remap_file(filename, matches[0]);
145             # canonic_name = matches[0];
146             # }
147             } else {
148 0           my @matches = ();
  0            
149 0           for my $try (file_list()) {
  0            
150 0 0         push @matches, $try unless -1 == rindex($try, $filename);
  0 0          
151             }
152 0 0         if (scalar(@matches) > 1) {
  0 0          
    0          
    0          
153 0           $proc->msg("Multiple files found ending filename string:");
  0            
154 0           for my $match_file (@matches) {
  0            
155 0           $proc->msg("\t$match_file");
  0            
156             }
157             return
158 0           } elsif (1 == scalar(@matches)) {
  0            
159 0           $canonic_name = map_file($matches[0]);
  0            
160 0           $m .= " matched debugger cache file:\n\t" . $canonic_name;
  0            
161 0           $proc->msg($m);
  0            
162             } else {
163 0           $proc->msg($m . ' is not cached in debugger.');
  0            
164 0           return;
  0            
165             }
166             }
167 0           my %seen;
  0            
168 0           for my $arg (@args) {
  0            
169 0           my $processed_arg = 0;
  0            
170 0           my $arg = lc($arg);
  0            
171              
172 0 0 0       if ($arg eq 'all' || $arg eq 'size') {
  0 0 0        
173 0 0         unless ($seen{size}) {
  0 0          
174 0           my $max_line =
  0            
175             Devel::Trepan::DB::LineCache::size($canonic_name);
176 0 0         $proc->msg("File has $max_line lines.") if defined $max_line;
  0 0          
177             }
178 0           $processed_arg = $seen{size} = 1;
  0            
179             }
180              
181 0 0 0       if ($arg eq 'all' || $arg eq 'sha1') {
  0 0 0        
182 0 0         unless ($seen{sha1}) {
  0 0          
183 0           my $sha1 = Devel::Trepan::DB::LineCache::sha1($canonic_name);
  0            
184 0           $proc->msg("SHA1: ${sha1}");
  0            
185             }
186 0           $processed_arg = $seen{sha1} = 1;
  0            
187             }
188              
189             ## Breakpoints are broken. Something changed to break it and
190             ## I haven't a clue. Furthermore, %{'_<'.$filename} no longer seems
191             ## be set so we can't test for == 1 or == 0 in numeric context and
192             ## get something.
193 0 0 0       if ($arg eq 'all' || $arg eq 'brkpts') {
  0 0 0        
194 0 0         unless ($seen{brkpts}) {
  0 0          
195 0           $proc->msg("Possible breakpoint line numbers:");
  0            
196 0           my @lines = trace_line_numbers($canonic_name);
  0            
197 0           my $fmt_lines = $self->{cmd}->columnize_numbers(\@lines);
  0            
198 0           chomp $fmt_lines;
  0            
199 0           $proc->msg($fmt_lines);
  0            
200             }
201 0           $processed_arg = $seen{brkpts} = 1;
  0            
202             }
203              
204 0 0 0       if ($arg eq 'all' || $arg eq 'ctime') {
  0 0 0        
205 0 0         unless ($seen{ctime}) {
  0 0          
206 0           my $stat = Devel::Trepan::DB::LineCache::stat($canonic_name);
  0            
207 0 0         if (defined $stat) {
  0 0          
208 0           my $ctime =
  0            
209             Devel::Trepan::DB::LineCache::stat($canonic_name)->ctime;
210 0           $ctime = localtime($ctime);
  0            
211 0           $proc->msg("Creation time:\t$ctime");
  0            
212             }
213             }
214 0           $processed_arg = $seen{ctime} = 1;
  0            
215             }
216              
217 0 0 0       if ($arg eq 'all' || $arg eq 'mtime') {
  0 0 0        
218 0 0         unless ($seen{mtime}) {
  0 0          
219 0           my $stat = Devel::Trepan::DB::LineCache::stat($canonic_name);
  0            
220 0 0         if (defined($stat)) {
  0 0          
221 0           my $mtime = localtime($stat->mtime);
  0            
222 0           $proc->msg("Modify time:\t$mtime");
  0            
223             }
224             }
225 0           $processed_arg = $seen{mtime} = 1;
  0            
226             }
227              
228             # if ($arg eq 'all' || $arg eq 'stat') {
229             # unless ($seen{stat}) {
230             # require Enbugger; Enbugger->stop;
231             # my $stat = Devel::Trepan::DB::LineCache::stat($canonic_name);
232             # my $msg = sprintf "File attributes:\t%s", join(', ', @$stat);
233             # $proc->msg($msg);
234             # }
235             # $processed_arg = $seen{stat} = 1;
236             # }
237              
238 0 0         unless ($processed_arg) {
  0 0          
239 0           $proc->errmsg("I don't understand sub-option \"$arg\"");
  0            
240             }
241             }
242             }
243              
244             unless (caller) {
245             require Devel::Trepan;
246             require Devel::Trepan::DB::LineCache;
247             cache_file(__FILE__);
248             print join(', ', file_list), "\n";
249             # Demo it.
250             # require_relative '../../mock'
251             # my($dbgr, $parent_cmd) = MockDebugger::setup('show');
252             # $cmd = __PACKAGE__->new(parent_cmd);
253             # $cmd->run(@$cmd->prefix);
254             }
255              
256             # Suppress a "used-once" warning;
257             $HELP || scalar @SUBCMD_VARS;