2007年 10月 08日

使うかどうかはともかく gem のあれをつくった

http://lab.lowreal.net/gems/
scp で特定のディレクトリに投げつける Raketask を書いて ( http://coderepos.org/share/changeset/427 )、更新された gem の rdoc を生成して gem index を更新するスクリプトを叩く。

#!/usr/bin/env ruby
puts "Content-Type: text/plain"
puts

$stderr = $stdout

require "pp"
require "pathname"
require "rubygems"
require "rubygems/doc_manager"

begin
	class Gem::Format
		def extract_to(dir)
			dir = Pathname.new(dir)
			self.file_entries.each do |info,content|
				path = Pathname.new(info["path"])
				if path.absolute?
					raise "Damedayo"
				end

				f = dir + path
				f.parent.mkpath
				f.open("wb") do |o|
					o.write content
				end
			end
		end
	end
	Gem::DocManager.configured_args = ["--template", "/Users/cho45/coderepos/lang/ruby/rdoc/generators/template/html/resh/resh.rb"]
	Gem::DocManager.configured_args = ["--template", "resh", "--line-numbers"]

	load "/usr/bin/index_gem_repository.rb"
	path = Pathname.new("/srv/www/lab.lowreal.net/public/gems")
	options = {
		:directory => path.to_s,
		:verbose   => true,
		:quick     => true,
	}
	prev = (path + "quick/index").read.split(/¥n/) rescue []
	#prev = []
	indexer = Indexer.new(options)
	indexer.build_index
	diff = (path + "quick/index").read.split(/¥n/) - prev
	diff.each do |gem|
		puts gem
		g = path + "gems/#{gem}.gem"
		gem = Gem::Format.from_file_by_path(g.to_s)
		dir = path+"gems/#{gem.spec.full_name}"
		dir.rmtree rescue nil
		gem.extract_to(dir)
		#gem.spec.loaded_from = "docs"
		spec = gem.spec
		spec.instance_eval { @path = path }
		def spec.installation_path
			@path.to_s
		end
		p spec.full_gem_path
		doc_manager = Gem::DocManager.new(gem.spec)
		doc_manager.generate_rdoc
	end

rescue Exception => e
	puts e
	puts e.backtrace
end

ブラウザでアクセスしたときに表示されるインデックスはてきとうに gem spec よんで表示してるだけ