create-package-feed.pl: Skip 'OldFiles' and 'pkgsrc' directories
[privoxy.git] / utils / create-package-feed.pl
1 #!/usr/local/bin/perl
2 #< LICENSE: WTFPL >
3 use warnings;
4 use strict;
5 use Digest::SHA1;
6 my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
7 my @days   = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
8
9 #< Config START >
10 my $scan_dir   = '/xxxxxxxxxxxxxxxxxxxxxx/sf-download/';
11 my $base_dlurl = 'https://www.privoxy.org/sf-download-mirror/';
12 my $save_rss_file ='/xxxxxxxxxxxxxxxxxxxxxx/release.xml'; # e.g., release.rss
13 my $maxlimit = 1000;
14
15 #< Config END >
16
17 my @Array = ();
18 my $i     = 0;
19 my $sec;
20 my $min;
21 my $hour;
22 my $mday;
23 my $mon;
24 my $year;
25 my $wday;
26 my $yday;
27 my $isdst;
28 my $target;
29 my $target_sha1;
30 my $target_uri;
31 my $target_time;
32 my $target_line;
33
34 #
35 # 1st & 2nd directory should NOT contain ANY 'FILES'. (expecting only 'Directory')
36 #
37 opendir(D1, $scan_dir) or die "Can't open 1st directory! /";
38 while (my $fi1 = readdir(D1)) {
39     next if ($fi1 =~ m/^\./);
40
41     next if ($fi1 eq 'OldFiles' or $fi1 eq 'pkgsrc');
42     opendir(D2, $scan_dir . $fi1 . '/')
43         or die "Can't open 2nd directory! /$fi1";
44     while (my $fi2 = readdir(D2)) {
45         next if ($fi2 =~ m/^\./);
46
47 ## start listing /OS/Version/FILE
48         opendir(D3, $scan_dir . $fi1 . '/' . $fi2 . '/')
49             or die "Can't open 3rd directory! /$fi1/$fi2";
50         while (my $fi3 = readdir(D3)) {
51             next if ($fi3 =~ m/^\./);
52             $target = $scan_dir . $fi1 . '/' . $fi2 . '/' . $fi3;
53             next if (!-e $target);    # skip if file is not exist
54
55             # Get SHA-1 hash
56             my $filedata;
57             unless (open $filedata, $target) { next; }
58             my $sha1 = Digest::SHA1->new;
59             $sha1->addfile($filedata);
60             close $filedata;
61             $target_sha1 = $sha1->hexdigest;
62
63             # URI and Time
64             $target_uri  = $fi1 . '/' . $fi2 . '/' . $fi3;
65             $target_time = (stat $target)[9];
66
67             # RSS line
68             $target_line =
69                 '<item><title><![CDATA[' . $target_uri . ']]></title>';
70             $target_line .=
71                   '<description><![CDATA['
72                 . $target_uri
73                 . ' (SHA-1: '
74                 . $target_sha1
75                 . ')]]></description>';
76             $target_line .=
77                   '<link>'
78                 . $base_dlurl
79                 . $target_uri
80                 . '</link><guid>'
81                 . $base_dlurl
82                 . $target_uri
83                 . '</guid>';
84             $target_line .= '<pubDate>';
85             ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
86                 gmtime($target_time);
87             $target_line .=
88                   "$days[$wday], $mday $months[$mon] "
89                 . ($year + 1900)
90                 . " $hour:$min:$sec GMT";
91             $target_line .= '</pubDate></item>';
92
93             # Add it to Array
94             $Array[$i] = ([$target_time, $target_line]);
95             $i++;
96             die "maxlimit $maxlimit reached!" unless ($i < $maxlimit);
97         }
98         closedir D3;
99 ## end listing /OS/Version/FILE
100
101     }
102     closedir D2;
103
104 }
105 closedir D1;
106
107 # Result = Full XML Codes
108 my $result =
109     '<?xml version="1.0" encoding="utf-8"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"><channel><title>Privoxy Releases</title><link>https://www.privoxy.org/announce.txt</link><description><![CDATA[Privoxy Releases RSS feed]]></description><pubDate>';
110 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime();
111 $result .=
112       "$days[$wday], $mday $months[$mon] "
113     . ($year + 1900)
114     . " $hour:$min:$sec GMT";
115 $result .= '</pubDate>';
116
117 # Sort Array
118 my @resArray = sort { @$a[0] <=> @$b[0] } @Array;
119 $i--;
120 while ($i >= 0) { $result .= $resArray[$i][1]; $i--; }
121 $result .= '</channel></rss>';
122
123 # Save it.
124 open(XMLF, "> $save_rss_file") or die "Failed to write XML file";
125 print XMLF $result;
126 close(XMLF);