diff options
author | fuzzyray <fuzzyray@gentoo.org> | 2009-04-30 21:52:45 +0000 |
---|---|---|
committer | fuzzyray <fuzzyray@gentoo.org> | 2009-04-30 21:52:45 +0000 |
commit | 86eaf5e03289e45a95514b4f6011157972016e9d (patch) | |
tree | c16903693f2030c7b01b346b29b265dc1a473888 /src/ekeyword/ekeyword | |
parent | Fix has_key() deprecation message. (Bug #232797) (diff) | |
download | gentoolkit-0.2.4.tar.gz gentoolkit-0.2.4.tar.bz2 gentoolkit-0.2.4.zip |
Tagging the gentoolkit-0.2.4 releasegentoolkit-0.2.4
svn path=/tags/gentoolkit-0.2.4/; revision=564
Diffstat (limited to 'src/ekeyword/ekeyword')
-rw-r--r-- | src/ekeyword/ekeyword | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/ekeyword/ekeyword b/src/ekeyword/ekeyword new file mode 100644 index 0000000..e75ce93 --- /dev/null +++ b/src/ekeyword/ekeyword @@ -0,0 +1,114 @@ +#!/usr/bin/perl -w +# +# Copyright 2003-2004, Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# Written by Aron Griffis <agriffis@gentoo.org> +# +# ekeyword: Update the KEYWORDS in an ebuild. For example: +# +# $ ekeyword ~alpha oaf-0.6.8-r1.ebuild +# 12c12 +# < KEYWORDS="x86 ppc sparc" +# --- +# > KEYWORDS="x86 ppc sparc ~alpha" + + +my ($kw_re) = '^(?:([-~^]?)(\w[\w-]*)|([-^]\*))$'; +my (@kw); + +# make sure the cmdline consists of keywords and ebuilds +unless (@ARGV > 0) { + die "syntax: ekeyword { arch | ~[arch] | -[arch] } ebuild...\n" +} +for my $a (@ARGV) { + $a = '~all' if $a eq '~' or $a eq $ENV{'HOME'}; # for vapier + next if $a =~ /$kw_re/o; # keyword + next if $a =~ /^\S+\.ebuild$/; # ebuild + die "I don't understand $a\n"; +} + +for my $f (@ARGV) { + if ($f =~ /$kw_re/o) { + push @kw, $f; + next; + } + + print "$f\n"; + + open I, "<$f" or die "Can't read $f: $!\n"; + open O, ">$f.new" or die "Can't create $f.new: $!\n"; + select O; + + while (<I>) { + /^KEYWORDS/ or print, next; + + # extract the quoted section from KEYWORDS + (my $quoted = $_) =~ s/^.*?["'](.*?)["'].*/$1/s; + + # replace -* with -STAR for our convenience below + $quoted =~ s/-\*/-STAR/; + + for my $k (@kw) { + my ($leader, $arch, $star) = ($k =~ /$kw_re/o); + + # handle -* and ^* + if (defined $star) { + $leader = substr $star,0,1; + $arch = 'STAR'; + } + + # remove keywords + if ($leader eq '^') { + if ($arch eq 'all') { + $quoted = ''; + } else { + $quoted =~ s/[-~]?\Q$arch\E\b//; + } + } + + # add or modify keywords + else { + if ($arch eq 'all') { + # modify all non-masked keywords in the list + $quoted =~ s/(^|\s)~?(?=\w)/$1$leader/g; + } else { + # modify or add keyword + unless ($quoted =~ s/[-~]?\Q$arch\E(\s|$)/$leader$arch$1/) { + # modification failed, need to add + if ($arch eq 'STAR') { + $quoted = "$leader$arch $quoted"; + } else { + $quoted .= " $leader$arch"; + } + } + } + } + } + + # replace -STAR with -* + $quoted =~ s/-STAR\b/-*/; + + # sort keywords and fix spacing + $quoted = join " ", sort { + (my $sa = $a) =~ s/^\W//; + (my $sb = $b) =~ s/^\W//; + return -1 if $sa eq '*'; + return +1 if $sb eq '*'; + $sa cmp $sb; + } split " ", $quoted; + + # re-insert quoted to KEYWORDS + s/(["']).*?["']/$1$quoted$1/; + + print $_, <I> or die "Can't write $f.new: $!\n"; + } + + close I; + close O; + select STDOUT; + + system "diff $f $f.new | grep -v '^[0-1]'"; + rename "$f.new", "$f" or die "Can't rename: $!\n"; +} + +# vim:ts=8 sw=4 |