履歴もしくは日誌
2013 年 12 月の履歴(もしくは日誌)
2013 年 12 月
12 月 31 日
rbenv install -l でずらずら長いリストが出て困る
Ruby 2.1.0 が出ましたね.ところで rbenv install で簡単にインストールできるにしても,rbenv install -l の長いリストで新しいバージョンが加わったかどうか確認するのは面倒では無いですか? で rbenv install -l で 1.8 系や 1.9 系の最新だけをリストして,さらに rbenv versions の結果と比較してインストールされているかどうか表示するとか,そんな感じのものを ruby で書いてみました.
$ rbversion 1.8.7-p375 1.9.3-p484 installed 2.0.0-p353 installed 2.1.0 installed jruby-1.7.9 installed maglev-1.0.0 maglev-2.0.0-dev rbx-2.2.1 installed ree-1.8.7-2012.02
最初に動けば良いって感じで書いたら,こうなりました.
#!/usr/bin/env ruby
# rbenv versions でインストールされている ruby を確認し
# rbenv install -l でインストール可能なものと比較する.-dev とか -rc とか -preview は無視する
installed = Hash.new
`rbenv versions`.split("\n").each do |line|
line.sub!(/^\s*\*?\s*/,'')
line.sub!(/\s*\(.*\)$/,'')
if line =~ /([^-]*)-(.*)/
#
else
line =~ /^(2\.\d+)\.(.*)/
end
if $1
installed[$1] = $2
else
installed[line] = ''
end
end
rb = nil
v = nil
pline = nil
`rbenv install -l`.split("\n").map {|line| line.sub!(/^\s*\*?\s*/,''); line}.push('').each do |line|
next if line == "Available versions:"
if line =~ /([^-]*)-(.*)/
#
else
line =~ /^(2\.\d+)\.(.*)/
end
vr = $2
if $1
l = $1
else
l = line
end
#p [line,l,vr]
next if vr =~ /rc|dev|preview/
if l != rb
if v
print pline
print " " if pline !~ /-/
if installed[rb]
#p [:test,v.to_f ,installed[rb].to_f ,v.to_f > installed[rb].to_f ]
case
when v.to_f > installed[rb].to_f
print " *new* (#{installed[rb]})"
when v == installed[rb]
print "\tinstalled"
else
print "\t(#{installed[rb]})"
end
end
print "\n"
elsif rb
print "#{rb}\n"
end
rb = l
end
v = vr
pline = line
end
いろいろ駄目だなと自分でも思います.
そしてある記事を見ました.
これをみて Enumerable#chunk って便利そう.これを使って書き直したら良くなるかも! って思ったので書き直しました.
#!/usr/bin/env ruby
# rbenv versions でインストールされている ruby を確認し
# rbenv install -l でインストール可能なものと比較する.-dev とか -rc とか -preview は無視する
pr = lambda{|line| line=~/^((\d+\.\d)|(\w+))/;$1 }
installed = `rbenv versions`.each_line.
map {|line| line.gsub(/(^\s*\*?\s*|\s*\(.*\)$)/,'').chomp}.
compact.chunk(&pr).to_h
available = `rbenv install -l`.each_line.
map {|line| next if line=~/(Available versions|-dev|-rc|-preview)/; line.strip}.
compact.chunk(&pr).to_a
available.each {|a|
i = installed[a.first] ? installed[a.first].last : ''
puts "%-20s %-20s" % [a.last.last, i == a.last.last ? "installed" : i]
}
これが良いのかどうか分からないけど,短くなった.
ついでに Perl でも書いてみた.Perl で Enumerable#chunk みたいなのって何かあるのかなって調べてみたけど良くわからりませんでした.
#!/usr/bin/perl
use strict;
use warnings;
my %installed;
foreach my $line (split m/\n/, `plenv versions`) {
next if $line =~ m/^system/;
my $test = q{};
$line =~ s/^\s*\*?\s*//g;
$line =~ s/\([^\)]+\)//g;
if ($line =~ m/((^\d+\.\d+)|(^[A-Za-z]+))/ ) {
$test = "$1";
}
else {
$test = 'unknown';
}
if (exists $installed{$test}) {
push($installed{$test}, $line);
}
else {
$installed{$test} = [$line];
}
}
my %available;
my @keys = ();
foreach my $line (split m/\n/, `plenv install -l`) {
next if $line =~ m/(Available|-RC|-TRIAL)/;
my $test = 'unknown';
$line =~ s/^\s*\*?\s*//g;
if ($line =~ m/((^\d+\.\d+)|(^[A-Za-z]+))/ ) {
$test = "$1";
}
if (exists $available{$test}) {
push($available{$test}, $line);
}
else {
$available{$test} = [$line];
push @keys, $test;
}
}
foreach my $k (@keys) {
my $i = exists($installed{$k}) ? $installed{$k}[-1] : q{};
$i = $i eq $available{$k}[-1] ? "installed" : $i;
printf("%-10s %-20s\n", $available{$k}[-1],$i);
}
Permalink Trackback URI http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20131231n1 TrackBack