aboutsummaryrefslogtreecommitdiffstats
path: root/find-lang.pl
blob: f12af1f5bb59afd4d066fe133f8731300613eb7b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/perl

# $Id$

use strict;
use warnings;
use File::Find;
use Getopt::Long;
use Pod::Usage;

GetOptions(
    'all-name'   => \my $allname,
    'with-gnome' => \my $withgnome,
    'with-kde'   => \my $withkde,
    'with-html'  => \my $withhtml,
    'without-mo' => \my $withoutmo,
    'with-man' => \my $withman,
    'debug' =>  \my $debug,
) or pod2usage();

my ($buildroot, @searchname) = @ARGV;
$buildroot or die "No buildroot given\n";
$buildroot =~ s:/+$::; # removing trailing /
my ($pkgname) = @searchname or die "Main name to find missing\n";

sub debug {
    $debug or return;
    my ($msg, @val) = @_;
    printf("DEBUG: $msg\n", @val);
}

my %finallist; # filename => attr, easy way to perform uniq

File::Find::find(
    sub {
        my $file = substr($File::Find::name, length($buildroot));
        my ($pkg, $lang, $parent);
        if ($file =~ m:^((.*/share/locale)/([^/_@]+)[^/]*).*/([^/]+)\.mo:) {
            if ($withoutmo) {
                return;
            }
            ($pkg, $lang, $parent) = ($4, $3, $2);
        } elsif ($file =~ m:^(.*/gnome/help/([^/]+))/([^/_]+)$:) {
            if (!$withgnome) {
                return;
            }
            ($pkg, $lang, $parent) = ($2, $3, $1);
        } elsif ($file =~ m:^(.*/doc/kde/HTML)/([^/_@]+)[^/]*/([^/]+)$:) {
            if (!$withkde) {
                return;
            }
            ($pkg, $lang, $parent) = ($2, $3, $1);
        } elsif ($file =~ m:^(.*/doc/HTML)/([^/_@]+)[^/]*/([^/]+)$:) {
            if (!$withhtml) {
                return;
            }
            ($pkg, $lang, $parent) = ($3, $2, $1);
        } elsif ($file =~ m:^(/+usr/share/man)/([^/@\.]+)[^/]*/man[^/]+/([^/.]+)\.\d[^/]*$:) {
            if (!$withman) {
                return;
            }
            ($pkg, $lang, $parent) = ($3, $2, $1);
            $file .= '*';
        } else {
            return;
        }
        if (! ((grep { $_ eq $pkg } @searchname) || $allname)) {
            return;
        }
        my $rpmlang = $lang eq 'C' ? "" : "%lang($lang)";

        parent_to_own($parent, $file, $rpmlang);
        if (defined($finallist{$file})) {
            # Own multiple time, match all lang, so no %lang()
            $finallist{$file} = "";
        } else {
            $finallist{$file} = "$rpmlang ";
        }
        debug("File %s will be %s", $file, $finallist{$file});

    },
    $buildroot || '/'
);

open(my $hlang, '>', "$pkgname.lang") or die "canno't open $pkgname.lang\n";

foreach (sort keys %finallist) {
    print $hlang "$finallist{$_}$_\n";
}

close($hlang);

exit(0);

sub parent_to_own {
    my ($parent, $file, $lang) = @_;
    my @subdir = grep { $_ } split('/', substr($file, length($parent)));
    pop(@subdir);
    while (my $part = shift(@subdir)) {
        $parent .= "/$part";
        if (defined($finallist{$parent})) {
            # Own multiple time, match all lang, so no %lang()
            $finallist{$parent} = "%dir ";
        } else {
            $finallist{$parent} = "$lang %dir ";
        }
        debug("Parent %s will be %s", $parent, $finallist{$parent});
    }
}