]> mj.ucw.cz Git - gallery.git/blob - gal
gal-mj-digikam: Use image title
[gallery.git] / gal
1 #!/usr/bin/perl
2 # UCW Gallery -- Master Program
3 # (c) 2012--2015 Martin Mares <mj@ucw.cz>
4
5 use common::sense;
6 use Getopt::Long;
7
8 use FindBin;
9 my $gallery_root = $FindBin::Bin;
10
11 my $all;
12 my $parallel;
13
14 sub show_help() {
15         print <<AMEN ;
16 Usage: gal <general-options> <command> <command-options> <args>
17
18 General options:
19     --all               Run on all galleries in subdirectories
20 -p, --parallel=<n>      Run in parallel and use <n> processes
21
22 Common commands:
23 scan                    Scan directory and obtain originals
24 gen                     Generate web photos from originals
25 cache                   Rebuild thumbnails and other cached info
26
27 Other commands:
28 dump-config             Show configuration settings
29 dump-meta               Show contents of metadata files
30 from-gqview             Parse gqview/geeqie collections
31 AMEN
32         exit 0;
33 }
34
35 Getopt::Long::Configure('require_order', 'bundling');
36 GetOptions(
37         "help" => \&show_help,
38         "version" => sub {
39                         print "UCW Gallery 2.1 (c) 2004-2015 Martin Mares <mj\@ucw.cz>\n";
40                 },
41         "all!" => \$all,
42         "p|parallel=i" => \$parallel,
43 ) or die "Try `gal help' for more information.\n";
44 Getopt::Long::Configure('default');
45
46 @ARGV or die "Missing subcommand.\n";
47 my $sub = shift @ARGV;
48 $sub =~ /^[0-9a-zA-Z-]+$/ or die "Invalid subcommand $sub\n";
49
50 if ($sub eq 'help') { show_help(); }
51
52 my $sub_path = "$gallery_root/bin/gal-$sub";
53 -x $sub_path or die "Unknown subcommand $sub\n";
54
55 $ENV{"GALLERY_ROOT"} = $gallery_root;
56 $ENV{"PERL5LIB"} = join(":", $gallery_root . "/lib", $ENV{"PERL5LIB"} // ());
57
58 if (!$all) {
59         exec $sub_path, @ARGV;
60         die "Cannot execute $sub_path: $!\n";
61 }
62
63 ### Parallel execution ###
64
65 my @dirs = sort map { chomp; s{^\./}{}; s{\/gallery.cf}{}; $_; } `find . -mindepth 2 -name gallery.cf`;
66 my $done = 0;
67 my $need = @dirs;
68 my $logging = $parallel ? 1 : 0;
69 my $threads = $parallel // 1;
70
71 my $running = 0;
72 my $errors = 0;
73 my %pid_to_dir = ();
74
75 while ($running || @dirs) {
76         if ($running == $threads || !@dirs) {
77                 # Wait for children
78                 my $pid = wait; die if $pid < 0;
79                 my $dir = $pid_to_dir{$pid} or die;
80                 if ($?) {
81                         print "!! $dir FAILED";
82                         print " [see $dir/gallery.log]" if $logging;
83                         $errors++;
84                 } else {
85                         print "++ $dir";
86                         unlink "$dir/gallery.log" if $logging;
87                 }
88                 delete $pid_to_dir{$pid};
89                 $running--;
90                 $done++;
91                 print " (done $done/$need)\n";
92         } else {
93                 my $dir = shift @dirs;
94                 print "<< $dir\n";
95                 my $pid = fork;
96                 if (!$pid) {
97                         if ($logging) {
98                                 close STDOUT;
99                                 open STDOUT, '>', "$dir/gallery.log" or die "Unable to create $dir/gallery.log: $!\n";
100                                 close STDERR;
101                                 open STDERR, '>&STDOUT';
102                         }
103                         chdir $dir or die "Cannot chdir to $dir: $!\n";
104                         exec $sub_path, @ARGV;
105                         die "Cannot execute $sub_path: $!\n";
106                 }
107                 $pid_to_dir{$pid} = $dir;
108                 $running++;
109         }
110 }
111
112 print "$done jobs, $errors errors.\n";
113 exit ($errors > 0);