File Coverage

blib/lib/Filename/Type/Backup.pm
Criterion Covered Total %
statement 31 31 100.0
branch 9 10 90.0
condition 2 2 100.0
subroutine 5 5 100.0
pod 1 1 100.0
total 48 49 97.9


line stmt bran cond sub pod time code
1             package Filename::Type::Backup;
2              
3 2     2   431853 use 5.010001;
  2         8  
4 2     2   14 use strict;
  2         4  
  2         97  
5 2     2   34 use warnings;
  2         4  
  2         242  
6              
7             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
8             our $DATE = '2024-12-20'; # DATE
9             our $DIST = 'Filename-Type-Backup'; # DIST
10             our $VERSION = '0.040'; # VERSION
11              
12 2     2   14 use Exporter qw(import);
  2         6  
  2         1357  
13             our @EXPORT_OK = qw(check_backup_filename);
14              
15             our %SPEC;
16              
17             our %SUFFIXES = (
18             '~' => 1,
19             '.bak' => 1,
20             '.old' => 1,
21             '.orig' => 1, # patch
22             '.rej' => 1, # patch
23             '.swp' => 1,
24             # XXX % (from /etc/mime.types)
25             # XXX sik? (from /etc/mime.types)
26             # XXX .dpkg*
27             # XXX .rpm*
28             );
29              
30             $SPEC{check_backup_filename} = {
31             v => 1.1,
32             summary => 'Check whether filename indicates being a backup file',
33             description => <<'MARKDOWN',
34              
35              
36             MARKDOWN
37             args => {
38             filename => {
39             schema => 'str*',
40             req => 1,
41             pos => 0,
42             },
43             # XXX recurse?
44             ci => {
45             summary => 'Whether to match case-insensitively',
46             schema => 'bool',
47             default => 1,
48             },
49             },
50             result_naked => 1,
51             result => {
52             schema => ['any*', of=>['bool*', 'hash*']],
53             description => <<'MARKDOWN',
54              
55             Return false if not detected as backup name. Otherwise return a hash, which may
56             contain these keys: `original_filename`. In the future there will be extra
57             information returned, e.g. editor name (if filename indicates backup from
58             certain backup program), date (if filename contains date information), and so
59             on.
60              
61             MARKDOWN
62             },
63             };
64             sub check_backup_filename {
65 10     10 1 420309 my %args = @_;
66              
67 10         16 my $filename = $args{filename};
68 10         12 my $orig_filename;
69              
70 10 100       36 if ($filename =~ /\A#(.+)#\z/) {
71 1         2 $orig_filename = $1;
72 1         5 goto RETURN;
73             }
74              
75 9 50       67 $filename =~ /(~|\.\w+)\z/ or return 0;
76 9   100     43 my $ci = $args{ci} // 1;
77              
78 9         24 my $suffix = $1;
79              
80 9         11 my $spec;
81 9 100       16 if ($ci) {
82 8         18 my $suffix_lc = lc($suffix);
83 8         27 for (keys %SUFFIXES) {
84 31 100       70 if (lc($_) eq $suffix_lc) {
85 7         10 $spec = $SUFFIXES{$_};
86 7         13 last;
87             }
88             }
89             } else {
90 1         2 $spec = $SUFFIXES{$suffix};
91             }
92 9 100       27 return 0 unless $spec;
93              
94 7         157 ($orig_filename = $filename) =~ s/\Q$suffix\E\z//;
95              
96 8         61 RETURN:
97             return {
98             original_filename => $orig_filename,
99             };
100             }
101              
102             1;
103             # ABSTRACT: Check whether filename indicates being a backup file
104              
105             __END__