Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
6ed42ebd
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6ed42ebd
编写于
3月 19, 2009
作者:
J
Jeremy Kemper
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into bodyparts
上级
0d5b50ee
93b98cb8
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
12 addition
and
436 deletion
+12
-436
railties/CHANGELOG
railties/CHANGELOG
+2
-0
railties/lib/commands/plugin.rb
railties/lib/commands/plugin.rb
+10
-436
未找到文件。
railties/CHANGELOG
浏览文件 @
6ed42ebd
*2.3.2 [Final] (March 15, 2009)*
* Remove outdated script/plugin options [Pratik Naik]
* Allow metal to live in plugins #2045 [Matthew Rudy]
* Added metal [Josh Peek]
...
...
railties/lib/commands/plugin.rb
浏览文件 @
6ed42ebd
# Rails Plugin Manager.
#
# Listing available plugins:
#
# $ ./script/plugin list
# continuous_builder http://dev.rubyonrails.com/svn/rails/plugins/continuous_builder
# asset_timestamping http://svn.aviditybytes.com/rails/plugins/asset_timestamping
# enumerations_mixin http://svn.protocool.com/rails/plugins/enumerations_mixin/trunk
# calculations http://techno-weenie.net/svn/projects/calculations/
# ...
#
# Installing plugins:
#
# $ ./script/plugin install continuous_builder asset_timestamping
#
# Finding Repositories:
#
# $ ./script/plugin discover
#
# Adding Repositories:
#
# $ ./script/plugin source http://svn.protocool.com/rails/plugins/
#
# How it works:
#
# * Maintains a list of subversion repositories that are assumed to have
# a plugin directory structure. Manage them with the (source, unsource,
# and sources commands)
#
# * The discover command scrapes the following page for things that
# look like subversion repositories with plugins:
# http://wiki.rubyonrails.org/rails/pages/Plugins
#
# * Unless you specify that you want to use svn, script/plugin uses plain old
# HTTP for downloads. The following bullets are true if you specify
# that you want to use svn.
#
# * If `vendor/plugins` is under subversion control, the script will
# modify the svn:externals property and perform an update. You can
# use normal subversion commands to keep the plugins up to date.
#
# * Or, if `vendor/plugins` is not under subversion control, the
# plugin is pulled via `svn checkout` or `svn export` but looks
# exactly the same.
#
# Specifying revisions:
#
...
...
@@ -156,13 +117,13 @@ def externals=(items)
class
Plugin
attr_reader
:name
,
:uri
def
initialize
(
uri
,
name
=
nil
)
def
initialize
(
uri
,
name
=
nil
)
@uri
=
uri
guess_name
(
uri
)
end
def
self
.
find
(
name
)
n
ame
=~
/\//
?
new
(
name
)
:
Repositories
.
instance
.
find_plugin
(
name
)
n
ew
(
name
)
end
def
to_s
...
...
@@ -208,10 +169,13 @@ def uninstall
else
puts
"Plugin doesn't exist:
#{
path
}
"
end
# clean up svn:externals
externals
=
rails_env
.
externals
externals
.
reject!
{
|
n
,
u
|
name
==
n
or
name
==
u
}
rails_env
.
externals
=
externals
if
rails_env
.
use_externals?
# clean up svn:externals
externals
=
rails_env
.
externals
externals
.
reject!
{
|
n
,
u
|
name
==
n
or
name
==
u
}
rails_env
.
externals
=
externals
end
end
def
info
...
...
@@ -310,129 +274,6 @@ def rails_env
end
end
class
Repositories
include
Enumerable
def
initialize
(
cache_file
=
File
.
join
(
find_home
,
".rails-plugin-sources"
))
@cache_file
=
File
.
expand_path
(
cache_file
)
load
!
end
def
each
(
&
block
)
@repositories
.
each
(
&
block
)
end
def
add
(
uri
)
unless
find
{
|
repo
|
repo
.
uri
==
uri
}
@repositories
.
push
(
Repository
.
new
(
uri
)).
last
end
end
def
remove
(
uri
)
@repositories
.
reject!
{
|
repo
|
repo
.
uri
==
uri
}
end
def
exist?
(
uri
)
@repositories
.
detect
{
|
repo
|
repo
.
uri
==
uri
}
end
def
all
@repositories
end
def
find_plugin
(
name
)
@repositories
.
each
do
|
repo
|
repo
.
each
do
|
plugin
|
return
plugin
if
plugin
.
name
==
name
end
end
return
nil
end
def
load!
contents
=
File
.
exist?
(
@cache_file
)
?
File
.
read
(
@cache_file
)
:
defaults
contents
=
defaults
if
contents
.
empty?
@repositories
=
contents
.
split
(
/\n/
).
reject
do
|
line
|
line
=~
/^\s*#/
or
line
=~
/^\s*$/
end
.
map
{
|
source
|
Repository
.
new
(
source
.
strip
)
}
end
def
save
File
.
open
(
@cache_file
,
'w'
)
do
|
f
|
each
do
|
repo
|
f
.
write
(
repo
.
uri
)
f
.
write
(
"
\n
"
)
end
end
end
def
defaults
<<-
DEFAULTS
http://dev.rubyonrails.com/svn/rails/plugins/
DEFAULTS
end
def
find_home
[
'HOME'
,
'USERPROFILE'
].
each
do
|
homekey
|
return
ENV
[
homekey
]
if
ENV
[
homekey
]
end
if
ENV
[
'HOMEDRIVE'
]
&&
ENV
[
'HOMEPATH'
]
return
"
#{
ENV
[
'HOMEDRIVE'
]
}
:
#{
ENV
[
'HOMEPATH'
]
}
"
end
begin
File
.
expand_path
(
"~"
)
rescue
StandardError
=>
ex
if
File
::
ALT_SEPARATOR
"C:/"
else
"/"
end
end
end
def
self
.
instance
@instance
||=
Repositories
.
new
end
def
self
.
each
(
&
block
)
self
.
instance
.
each
(
&
block
)
end
end
class
Repository
include
Enumerable
attr_reader
:uri
,
:plugins
def
initialize
(
uri
)
@uri
=
uri
.
chomp
(
'/'
)
<<
"/"
@plugins
=
nil
end
def
plugins
unless
@plugins
if
$verbose
puts
"Discovering plugins in
#{
@uri
}
"
puts
index
end
@plugins
=
index
.
reject
{
|
line
|
line
!~
/\/$/
}
@plugins
.
map!
{
|
name
|
Plugin
.
new
(
File
.
join
(
@uri
,
name
),
name
)
}
end
@plugins
end
def
each
(
&
block
)
plugins
.
each
(
&
block
)
end
private
def
index
@index
||=
RecursiveHTTPFetcher
.
new
(
@uri
).
ls
end
end
# load default environment and parse arguments
require
'optparse'
module
Commands
...
...
@@ -472,14 +313,8 @@ def options
o
.
separator
""
o
.
separator
"COMMANDS"
o
.
separator
" discover Discover plugin repositories."
o
.
separator
" list List available plugins."
o
.
separator
" install Install plugin(s) from known repositories or URLs."
o
.
separator
" update Update installed plugins."
o
.
separator
" remove Uninstall plugins."
o
.
separator
" source Add a plugin source repository."
o
.
separator
" unsource Remove a plugin repository."
o
.
separator
" sources List currently configured plugin repositories."
o
.
separator
""
o
.
separator
"EXAMPLES"
...
...
@@ -491,20 +326,6 @@ def options
o
.
separator
"
#{
@script_name
}
install git://github.com/SomeGuy/my_awesome_plugin.git
\n
"
o
.
separator
" Install a plugin and add a svn:externals entry to vendor/plugins"
o
.
separator
"
#{
@script_name
}
install -x continuous_builder
\n
"
o
.
separator
" List all available plugins:"
o
.
separator
"
#{
@script_name
}
list
\n
"
o
.
separator
" List plugins in the specified repository:"
o
.
separator
"
#{
@script_name
}
list --source=http://dev.rubyonrails.com/svn/rails/plugins/
\n
"
o
.
separator
" Discover and prompt to add new repositories:"
o
.
separator
"
#{
@script_name
}
discover
\n
"
o
.
separator
" Discover new repositories but just list them, don't add anything:"
o
.
separator
"
#{
@script_name
}
discover -l
\n
"
o
.
separator
" Add a new repository to the source list:"
o
.
separator
"
#{
@script_name
}
source http://dev.rubyonrails.com/svn/rails/plugins/
\n
"
o
.
separator
" Remove a repository from the source list:"
o
.
separator
"
#{
@script_name
}
unsource http://dev.rubyonrails.com/svn/rails/plugins/
\n
"
o
.
separator
" Show currently configured repositories:"
o
.
separator
"
#{
@script_name
}
sources
\n
"
end
end
...
...
@@ -513,7 +334,7 @@ def parse!(args=ARGV)
options
.
parse!
(
general
)
command
=
general
.
shift
if
command
=~
/^(
list|discover|install|source|unsource|sources|remove|update|info
)$/
if
command
=~
/^(
install|remove
)$/
command
=
Commands
.
const_get
(
command
.
capitalize
).
new
(
self
)
command
.
parse!
(
sub
)
else
...
...
@@ -535,218 +356,6 @@ def self.parse!(args=ARGV)
end
end
class
List
def
initialize
(
base_command
)
@base_command
=
base_command
@sources
=
[]
@local
=
false
@remote
=
true
end
def
options
OptionParser
.
new
do
|
o
|
o
.
set_summary_indent
(
' '
)
o
.
banner
=
"Usage:
#{
@base_command
.
script_name
}
list [OPTIONS] [PATTERN]"
o
.
define_head
"List available plugins."
o
.
separator
""
o
.
separator
"Options:"
o
.
separator
""
o
.
on
(
"-s"
,
"--source=URL1,URL2"
,
Array
,
"Use the specified plugin repositories."
)
{
|
sources
|
@sources
=
sources
}
o
.
on
(
"--local"
,
"List locally installed plugins."
)
{
|
local
|
@local
,
@remote
=
local
,
false
}
o
.
on
(
"--remote"
,
"List remotely available plugins. This is the default behavior"
,
"unless --local is provided."
)
{
|
remote
|
@remote
=
remote
}
end
end
def
parse!
(
args
)
options
.
order!
(
args
)
unless
@sources
.
empty?
@sources
.
map!
{
|
uri
|
Repository
.
new
(
uri
)
}
else
@sources
=
Repositories
.
instance
.
all
end
if
@remote
@sources
.
map
{
|
r
|
r
.
plugins
}.
flatten
.
each
do
|
plugin
|
if
@local
or
!
plugin
.
installed?
puts
plugin
.
to_s
end
end
else
cd
"
#{
@base_command
.
environment
.
root
}
/vendor/plugins"
Dir
[
"*"
].
select
{
|
p
|
File
.
directory?
(
p
)}.
each
do
|
name
|
puts
name
end
end
end
end
class
Sources
def
initialize
(
base_command
)
@base_command
=
base_command
end
def
options
OptionParser
.
new
do
|
o
|
o
.
set_summary_indent
(
' '
)
o
.
banner
=
"Usage:
#{
@base_command
.
script_name
}
sources [OPTIONS] [PATTERN]"
o
.
define_head
"List configured plugin repositories."
o
.
separator
""
o
.
separator
"Options:"
o
.
separator
""
o
.
on
(
"-c"
,
"--check"
,
"Report status of repository."
)
{
|
sources
|
@sources
=
sources
}
end
end
def
parse!
(
args
)
options
.
parse!
(
args
)
Repositories
.
each
do
|
repo
|
puts
repo
.
uri
end
end
end
class
Source
def
initialize
(
base_command
)
@base_command
=
base_command
end
def
options
OptionParser
.
new
do
|
o
|
o
.
set_summary_indent
(
' '
)
o
.
banner
=
"Usage:
#{
@base_command
.
script_name
}
source REPOSITORY [REPOSITORY [REPOSITORY]...]"
o
.
define_head
"Add new repositories to the default search list."
end
end
def
parse!
(
args
)
options
.
parse!
(
args
)
count
=
0
args
.
each
do
|
uri
|
if
Repositories
.
instance
.
add
(
uri
)
puts
"added:
#{
uri
.
ljust
(
50
)
}
"
if
$verbose
count
+=
1
else
puts
"failed:
#{
uri
.
ljust
(
50
)
}
"
end
end
Repositories
.
instance
.
save
puts
"Added
#{
count
}
repositories."
end
end
class
Unsource
def
initialize
(
base_command
)
@base_command
=
base_command
end
def
options
OptionParser
.
new
do
|
o
|
o
.
set_summary_indent
(
' '
)
o
.
banner
=
"Usage:
#{
@base_command
.
script_name
}
unsource URI [URI [URI]...]"
o
.
define_head
"Remove repositories from the default search list."
o
.
separator
""
o
.
on_tail
(
"-h"
,
"--help"
,
"Show this help message."
)
{
puts
o
;
exit
}
end
end
def
parse!
(
args
)
options
.
parse!
(
args
)
count
=
0
args
.
each
do
|
uri
|
if
Repositories
.
instance
.
remove
(
uri
)
count
+=
1
puts
"removed:
#{
uri
.
ljust
(
50
)
}
"
else
puts
"failed:
#{
uri
.
ljust
(
50
)
}
"
end
end
Repositories
.
instance
.
save
puts
"Removed
#{
count
}
repositories."
end
end
class
Discover
def
initialize
(
base_command
)
@base_command
=
base_command
@list
=
false
@prompt
=
true
end
def
options
OptionParser
.
new
do
|
o
|
o
.
set_summary_indent
(
' '
)
o
.
banner
=
"Usage:
#{
@base_command
.
script_name
}
discover URI [URI [URI]...]"
o
.
define_head
"Discover repositories referenced on a page."
o
.
separator
""
o
.
separator
"Options:"
o
.
separator
""
o
.
on
(
"-l"
,
"--list"
,
"List but don't prompt or add discovered repositories."
)
{
|
list
|
@list
,
@prompt
=
list
,
!
@list
}
o
.
on
(
"-n"
,
"--no-prompt"
,
"Add all new repositories without prompting."
)
{
|
v
|
@prompt
=
!
v
}
end
end
def
parse!
(
args
)
options
.
parse!
(
args
)
args
=
[
'http://wiki.rubyonrails.org/rails/pages/Plugins'
]
if
args
.
empty?
args
.
each
do
|
uri
|
scrape
(
uri
)
do
|
repo_uri
|
catch
(
:next_uri
)
do
if
@prompt
begin
$stdout
.
print
"Add
#{
repo_uri
}
? [Y/n] "
throw
:next_uri
if
$stdin
.
gets
!~
/^y?$/i
rescue
Interrupt
$stdout
.
puts
exit
1
end
elsif
@list
puts
repo_uri
throw
:next_uri
end
Repositories
.
instance
.
add
(
repo_uri
)
puts
"discovered:
#{
repo_uri
}
"
if
$verbose
or
!
@prompt
end
end
end
Repositories
.
instance
.
save
end
def
scrape
(
uri
)
require
'open-uri'
puts
"Scraping
#{
uri
}
"
if
$verbose
dupes
=
[]
content
=
open
(
uri
).
each
do
|
line
|
begin
if
line
=~
/<a[^>]*href=['"]([^'"]*)['"]/
||
line
=~
/(svn:\/\/[^<|\n]*)/
uri
=
$1
if
uri
=~
/^\w+:\/\//
&&
uri
=~
/\/plugins\//
&&
uri
!~
/\/browser\//
&&
uri
!~
/^http:\/\/wiki\.rubyonrails/
&&
uri
!~
/http:\/\/instiki/
uri
=
extract_repository_uri
(
uri
)
yield
uri
unless
dupes
.
include?
(
uri
)
||
Repositories
.
instance
.
exist?
(
uri
)
dupes
<<
uri
end
end
rescue
puts
"Problems scraping '
#{
uri
}
':
#{
$!
.
to_s
}
"
end
end
end
def
extract_repository_uri
(
uri
)
uri
.
match
(
/(svn|https?):.*\/plugins\//i
)[
0
]
end
end
class
Install
def
initialize
(
base_command
)
@base_command
=
base_command
...
...
@@ -817,41 +426,6 @@ def parse!(args)
end
end
class
Update
def
initialize
(
base_command
)
@base_command
=
base_command
end
def
options
OptionParser
.
new
do
|
o
|
o
.
set_summary_indent
(
' '
)
o
.
banner
=
"Usage:
#{
@base_command
.
script_name
}
update [name [name]...]"
o
.
on
(
"-r REVISION"
,
"--revision REVISION"
,
"Checks out the given revision from subversion."
,
"Ignored if subversion is not used."
)
{
|
v
|
@revision
=
v
}
o
.
define_head
"Update plugins."
end
end
def
parse!
(
args
)
options
.
parse!
(
args
)
root
=
@base_command
.
environment
.
root
cd
root
args
=
Dir
[
"vendor/plugins/*"
].
map
do
|
f
|
File
.
directory?
(
"
#{
f
}
/.svn"
)
?
File
.
basename
(
f
)
:
nil
end
.
compact
if
args
.
empty?
cd
"vendor/plugins"
args
.
each
do
|
name
|
if
File
.
directory?
(
name
)
puts
"Updating plugin:
#{
name
}
"
system
(
"svn
#{
$verbose
?
''
:
'-q'
}
up
\"
#{
name
}
\"
#{
@revision
?
"-r
#{
@revision
}
"
:
''
}
"
)
else
puts
"Plugin doesn't exist:
#{
name
}
"
end
end
end
end
class
Remove
def
initialize
(
base_command
)
@base_command
=
base_command
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录