#!/usr/bin/perl -w # # Copyright 2003-2004, Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # Written by Aron Griffis # # 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 () { /^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 $_, 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