stickler 2.0.0a → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.bnsignore +14 -0
- data/.gitignore +17 -0
- data/HISTORY.asciidoc +20 -0
- data/README.asciidoc +126 -0
- data/Rakefile +22 -3
- data/bin/stickler +50 -0
- data/bin/stickler-passenger-config +112 -0
- data/bin/stickler-server +109 -0
- data/examples/config.ru +6 -3
- data/examples/gemcutter_repo.ru +2 -0
- data/examples/index_repo.ru +2 -0
- data/examples/local_repo.ru +6 -3
- data/examples/mirror_repo.ru +2 -0
- data/examples/not_found.ru +2 -0
- data/lib/stickler.rb +12 -0
- data/lib/stickler/client.rb +47 -0
- data/lib/stickler/client/config.rb +35 -0
- data/lib/stickler/client/config_file.rb +58 -0
- data/lib/stickler/client/mirror.rb +61 -0
- data/lib/stickler/client/push.rb +50 -0
- data/lib/stickler/client/yank.rb +51 -0
- data/lib/stickler/logable.rb +35 -0
- data/lib/stickler/middleware/gemcutter.rb +5 -0
- data/lib/stickler/middleware/helpers.rb +32 -0
- data/lib/stickler/middleware/index.rb +30 -4
- data/lib/stickler/middleware/mirror.rb +8 -3
- data/lib/stickler/middleware/not_found.rb +4 -2
- data/lib/stickler/paths.rb +53 -0
- data/lib/stickler/repository/local.rb +12 -12
- data/lib/stickler/repository/mirror.rb +13 -6
- data/lib/stickler/repository/null.rb +1 -0
- data/lib/stickler/repository/remote.rb +10 -4
- data/lib/stickler/repository/rubygems_authenticator.rb +32 -0
- data/lib/stickler/server.rb +34 -0
- data/lib/stickler/server/public/css/blueprint/LICENSE +22 -0
- data/lib/stickler/server/public/css/blueprint/ie.css +35 -0
- data/lib/stickler/server/public/css/blueprint/screen.css +266 -0
- data/lib/stickler/server/public/css/style.css +19 -0
- data/lib/stickler/server/public/images/apple-touch-icon.png +0 -0
- data/lib/stickler/server/public/images/favicon.ico +0 -0
- data/lib/stickler/server/public/js/modernizr-1.5.min.js +28 -0
- data/lib/stickler/server/views/index.erb +35 -0
- data/lib/stickler/server/views/layout.erb +42 -0
- data/lib/stickler/spec_lite.rb +16 -6
- data/lib/stickler/version.rb +1 -1
- data/man/asciidoc.conf +25 -0
- data/man/stickler-passenger-config.asciidoc +74 -0
- data/man/stickler-server.asciidoc +87 -0
- data/man/stickler.asciidoc +148 -0
- data/spec/middleware/common_gem_server_helpers.rb +4 -2
- data/spec/middleware/index_spec.rb +3 -3
- data/spec/middleware/legacy_gem_server_behavior.rb +0 -2
- data/spec/middleware/local_spec.rb +3 -3
- data/spec/middleware/modern_gem_server_behavior.rb +2 -0
- data/spec/paths_spec.rb +13 -0
- data/spec/spec_lite_spec.rb +14 -0
- data/tasks/man.rake +19 -0
- metadata +183 -56
- data/HISTORY.rdoc +0 -12
- data/README.rdoc +0 -88
- data/lib/stickler/web.rb +0 -19
- data/stickler.gemspec +0 -60
- data/views/index.erb +0 -19
- data/views/layout.erb +0 -39
data/man/asciidoc.conf
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
## linkstick: macro
|
2
|
+
#
|
3
|
+
# Usage: linkstick:command[manpage-section]
|
4
|
+
#
|
5
|
+
# Modelled after the linkgit macro
|
6
|
+
#
|
7
|
+
# {0} is the manpage section, {target} is the command
|
8
|
+
#
|
9
|
+
##
|
10
|
+
|
11
|
+
[macros]
|
12
|
+
(?su)[\\]?(?P<name>linkstick):(?P<target>\S*?)\[(?P<attrlist>.*?)\]=
|
13
|
+
|
14
|
+
ifdef::backend-docbook[]
|
15
|
+
[linkstick-inlinemacro]
|
16
|
+
{0%{target}}
|
17
|
+
{0#<citerefentry>}
|
18
|
+
{0#<refentrytitle>{target}</refentrytitle><manvolnum>{0}</manvolnum>}
|
19
|
+
{0#</citerefentry>}
|
20
|
+
endif::backend-docbook[]
|
21
|
+
|
22
|
+
ifdef::backend-xhtml11[]
|
23
|
+
[linkstick-inlinemacro]
|
24
|
+
<strong><a href="{target}.html">{target}{0?({0})}</a></strong>
|
25
|
+
endif::backend-xhtml11[]
|
@@ -0,0 +1,74 @@
|
|
1
|
+
STICKLER-PASSENGER-CONFIG(1)
|
2
|
+
============================
|
3
|
+
|
4
|
+
NAME
|
5
|
+
----
|
6
|
+
stickler-passenger-config - output a Phusion Passenger config for stickler
|
7
|
+
|
8
|
+
|
9
|
+
SYNOPSIS
|
10
|
+
--------
|
11
|
+
*stickler-passenger-config* ['--help'] ['COMMAND'] ['COMMAND_OPTIONS'] /path/to/stickler/root
|
12
|
+
|
13
|
+
|
14
|
+
DESCRIPTION
|
15
|
+
-----------
|
16
|
+
*stickler-passenger-config* will create a stickler web application directory,
|
17
|
+
including the config.ru file for use with link:http://modrails.com/[Phusion
|
18
|
+
Passenger]. It will then output the stanza to be incorporated into an
|
19
|
+
link:http://httpd.apache.org/[Apache] or link:http://nginx.net[Nginx]
|
20
|
+
configuration.
|
21
|
+
|
22
|
+
|
23
|
+
COMMANDS
|
24
|
+
--------
|
25
|
+
[horizontal]
|
26
|
+
*apache2*:: Output an Apache config.
|
27
|
+
|
28
|
+
*nginx*:: Output an Nginx config.
|
29
|
+
|
30
|
+
|
31
|
+
OPTIONS
|
32
|
+
-------
|
33
|
+
*-h, --help*::
|
34
|
+
Show the help message
|
35
|
+
|
36
|
+
*-v, --version*::
|
37
|
+
Output the version.
|
38
|
+
|
39
|
+
|
40
|
+
EXAMPLES
|
41
|
+
--------
|
42
|
+
Output a passenger config for use with apache.
|
43
|
+
|
44
|
+
---------------------------------------------------
|
45
|
+
stickler-passenger-config apache2 /var/lib/stickler
|
46
|
+
---------------------------------------------------
|
47
|
+
|
48
|
+
|
49
|
+
Output a pasenger a config to be integrated with an nginx config.
|
50
|
+
-------------------------------------------------
|
51
|
+
stickler-passenger-config nginx /var/lib/stickler
|
52
|
+
-------------------------------------------------
|
53
|
+
|
54
|
+
|
55
|
+
SEE ALSO
|
56
|
+
--------
|
57
|
+
linkstick:stickler[1], linkstick:stickler-server[1]
|
58
|
+
|
59
|
+
|
60
|
+
AUTHOR
|
61
|
+
------
|
62
|
+
Written by Jeremy Hinegardner <jeremy@hinegardner.org>
|
63
|
+
|
64
|
+
|
65
|
+
RESOURCES
|
66
|
+
---------
|
67
|
+
GitHub project: http://www.github.com/copiousfreetime/stickler
|
68
|
+
|
69
|
+
|
70
|
+
BUGS
|
71
|
+
----
|
72
|
+
Please report bugs to the github issue tracker
|
73
|
+
http://github.com/copiousfreetime/stickler/issues
|
74
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
STICKLER-SERVER(1)
|
2
|
+
==================
|
3
|
+
|
4
|
+
NAME
|
5
|
+
----
|
6
|
+
stickler-server - start and stop the stickler server process
|
7
|
+
|
8
|
+
|
9
|
+
SYNOPSIS
|
10
|
+
--------
|
11
|
+
*stickler-server* ['--help'] ['COMMAND'] ['COMMAND_OPTIONS'] /path/to/stickler/root
|
12
|
+
|
13
|
+
|
14
|
+
DESCRIPTION
|
15
|
+
-----------
|
16
|
+
stickler-server is the daemon process that houses the repositories of
|
17
|
+
proprietary gems and/or mirrors of third party gems.
|
18
|
+
|
19
|
+
|
20
|
+
COMMANDS
|
21
|
+
--------
|
22
|
+
[horizontal]
|
23
|
+
*start*:: Start the stickler server process
|
24
|
+
|
25
|
+
*stop*:: Stop the stickler server process
|
26
|
+
|
27
|
+
|
28
|
+
OPTIONS
|
29
|
+
-------
|
30
|
+
*-d, --daemonize*::
|
31
|
+
Daemonize the server
|
32
|
+
|
33
|
+
*--help*::
|
34
|
+
Show the help message
|
35
|
+
|
36
|
+
*-h, --host*='HOST'::
|
37
|
+
The host address to bind to (default: 0.0.0.0)
|
38
|
+
|
39
|
+
*-o, --port*='PORT'::
|
40
|
+
The port to bind to (default: 6789)
|
41
|
+
|
42
|
+
*-p, --pid*='PID_FILE'::
|
43
|
+
Path to wriate a pid file to after daemonizing
|
44
|
+
|
45
|
+
*-s, --server*='SERVER'::
|
46
|
+
The rack handler to use: thin, mongrel, webrick, etc.
|
47
|
+
|
48
|
+
*-v, --version*::
|
49
|
+
Output the version.
|
50
|
+
|
51
|
+
|
52
|
+
EXAMPLES
|
53
|
+
--------
|
54
|
+
Start the server, daemonized, using /var/lib/stickler as the root directory of
|
55
|
+
all the repositories.
|
56
|
+
|
57
|
+
---------------------------------------------------
|
58
|
+
stickler-server start --daemonize /var/lib/stickler
|
59
|
+
---------------------------------------------------
|
60
|
+
|
61
|
+
Stop the server that is using /var/lib/stickler as its root directory.
|
62
|
+
|
63
|
+
--------------------------------------
|
64
|
+
stickler-server stop /var/lib/stickler
|
65
|
+
--------------------------------------
|
66
|
+
|
67
|
+
|
68
|
+
SEE ALSO
|
69
|
+
--------
|
70
|
+
linkstick:stickler[1], linkstick:stickler-passenger-config[1]
|
71
|
+
|
72
|
+
|
73
|
+
AUTHOR
|
74
|
+
------
|
75
|
+
Written by Jeremy Hinegardner <jeremy@hinegardner.org>
|
76
|
+
|
77
|
+
|
78
|
+
RESOURCES
|
79
|
+
---------
|
80
|
+
GitHub project: http://www.github.com/copiousfreetime/stickler
|
81
|
+
|
82
|
+
|
83
|
+
BUGS
|
84
|
+
----
|
85
|
+
Please report bugs to the github issue tracker
|
86
|
+
http://github.com/copiousfreetime/stickler/issues
|
87
|
+
|
@@ -0,0 +1,148 @@
|
|
1
|
+
STICKLER(1)
|
2
|
+
===========
|
3
|
+
|
4
|
+
NAME
|
5
|
+
----
|
6
|
+
stickler - command line program to interact with a stickler-server
|
7
|
+
|
8
|
+
|
9
|
+
SYNOPSIS
|
10
|
+
--------
|
11
|
+
*stickler* ['--help'] ['COMMAND'] ['COMMAND_OPTIONS'] ['gemfile(s)']
|
12
|
+
|
13
|
+
|
14
|
+
DESCRIPTION
|
15
|
+
-----------
|
16
|
+
Stickler is a tool to organize and maintain an internal gem repository of
|
17
|
+
proprietary gems and/or a mirror of third party gems.
|
18
|
+
|
19
|
+
The linkstick:stickler[1] command interacts with an instance of
|
20
|
+
linkstick:stickler-server[1] to control the publishing and mirroring of ruby
|
21
|
+
gems.
|
22
|
+
|
23
|
+
|
24
|
+
COMMANDS
|
25
|
+
--------
|
26
|
+
[horizontal]
|
27
|
+
*push*:: Push one or more gems to a gemserver. This works the same as `gem
|
28
|
+
push` although there is no authorization mechanism.
|
29
|
+
|
30
|
+
*yank*:: Remove a gem from the gemserver's index. It will still be available
|
31
|
+
from direct download. This works the same as `gem yank`.
|
32
|
+
|
33
|
+
*mirror*:: Pull a specific version of a gem from an upstream gem server and
|
34
|
+
store it in a linkstick:stickler-server[1]
|
35
|
+
|
36
|
+
*config*:: Access or update the stickler client configuration.
|
37
|
+
|
38
|
+
|
39
|
+
OPTIONS
|
40
|
+
-------
|
41
|
+
These are the options for all commands. Not all options apply to all commands.
|
42
|
+
|
43
|
+
*-a, --add*::
|
44
|
+
Add the `--server` or `--upstream` items to the config file when using the
|
45
|
+
`config` command.
|
46
|
+
|
47
|
+
*-d, --debug*::
|
48
|
+
Output debug information
|
49
|
+
|
50
|
+
*-g, --gem-version*='VERSION'::
|
51
|
+
The version of the gem to yank from `--server` or to mirror from
|
52
|
+
`--upstream`.
|
53
|
+
|
54
|
+
*-h, --help*::
|
55
|
+
Show the help message
|
56
|
+
|
57
|
+
*-l, --list*::
|
58
|
+
Display the current configuration when using the `config` command.
|
59
|
+
|
60
|
+
*-p, --platform*='PLATFORM'::
|
61
|
+
The platform of the gem to yank from `--server` or to mirror from
|
62
|
+
`--upstream` (e.g. ruby, java, mswin32)
|
63
|
+
|
64
|
+
*-s, --server*='SERVER'::
|
65
|
+
The gem server or linkstick:stickler-server[1] URL. This is used by all the commands.
|
66
|
+
|
67
|
+
*-u, --upstream*='SERVER'::
|
68
|
+
The upstream server from which to mirror a gem when using the `mirror` command.
|
69
|
+
|
70
|
+
*-v, --version*::
|
71
|
+
Output the version.
|
72
|
+
|
73
|
+
|
74
|
+
CONFIGURATION
|
75
|
+
-------------
|
76
|
+
Stickler uses the `.gem/stickler` file to hold its configuration. It is a yaml
|
77
|
+
file and Currently there are two options. These are altered using the `stickler
|
78
|
+
config` command.
|
79
|
+
|
80
|
+
[horizontal]
|
81
|
+
*upstream*:: The default upstream server from which to mirror gems.
|
82
|
+
*server*:: The default linkstick:stickler-server[1] to interact with.
|
83
|
+
|
84
|
+
An example config file
|
85
|
+
|
86
|
+
------------------------------------
|
87
|
+
---
|
88
|
+
:server: http://stickler.example.com
|
89
|
+
:upstream: https://rubygems.org
|
90
|
+
------------------------------------
|
91
|
+
|
92
|
+
|
93
|
+
EXAMPLES
|
94
|
+
--------
|
95
|
+
Push the local `my_gem-1.0.0.gem` file to the linkstick:stickler-server[1] at
|
96
|
+
*stickler.example.com*
|
97
|
+
|
98
|
+
----------------------------------------------------------------------
|
99
|
+
stickler push ./my_gem-1.0.0.gem --server http://stickler.example.com/
|
100
|
+
----------------------------------------------------------------------
|
101
|
+
|
102
|
+
Push all the gems in the `pkg` directory to the linkstick:stickler-server[1] at
|
103
|
+
*stickler.example.com*
|
104
|
+
|
105
|
+
----------------------------------------------------------------------
|
106
|
+
stickler push --server http://stickler.example.com/ ./pkg/*.gem
|
107
|
+
----------------------------------------------------------------------
|
108
|
+
|
109
|
+
Yank vesion 1.0.0 of my_gem from the gem index on sticker.example.com
|
110
|
+
|
111
|
+
--------------------------------------------------------------------------
|
112
|
+
stickler yank my_gem --version 1.0.0 --server http://stickler.example.com/
|
113
|
+
--------------------------------------------------------------------------
|
114
|
+
|
115
|
+
Take the +third_party+ gem, version +1.4.2+ that is on *rubygems.org* and mirror it
|
116
|
+
on *stickler.example.com*
|
117
|
+
|
118
|
+
-----------------------------------------------------------------------------------------------------------------
|
119
|
+
stickler mirror third_party --version 0.4.2 --upstream http://rubygems.org/ --server http://stickler.example.com/
|
120
|
+
stickler mirror --help
|
121
|
+
-----------------------------------------------------------------------------------------------------------------
|
122
|
+
|
123
|
+
Set the `server` and `upstream` configration values in the `.gem/stickler` file.
|
124
|
+
|
125
|
+
------------------------------------------------------------------------------------------
|
126
|
+
stickler config --add --server http://stickler.example.com --upstream http://rubygems.org/
|
127
|
+
------------------------------------------------------------------------------------------
|
128
|
+
|
129
|
+
|
130
|
+
SEE ALSO
|
131
|
+
--------
|
132
|
+
linkstick:stickler-server[1], linkstick:stickler-passenger-config[1]
|
133
|
+
|
134
|
+
|
135
|
+
AUTHOR
|
136
|
+
------
|
137
|
+
Written by Jeremy Hinegardner <jeremy@hinegardner.org>
|
138
|
+
|
139
|
+
|
140
|
+
RESOURCES
|
141
|
+
---------
|
142
|
+
GitHub project: http://www.github.com/copiousfreetime/stickler
|
143
|
+
|
144
|
+
|
145
|
+
BUGS
|
146
|
+
----
|
147
|
+
Please report bugs to the github issue tracker
|
148
|
+
http://github.com/copiousfreetime/stickler/issues
|
@@ -4,9 +4,9 @@ require 'rubygems/server'
|
|
4
4
|
shared_examples_for "common gem server before after" do
|
5
5
|
|
6
6
|
before do
|
7
|
-
@
|
7
|
+
@webrick_spec_dir = File.join( @webrick_gem_dir, "specifications" )
|
8
8
|
|
9
|
-
@webrick = ::Gem::Server.new(@
|
9
|
+
@webrick = ::Gem::Server.new(@webrick_gem_dir,4567,false)
|
10
10
|
@underlying_server = @webrick.instance_variable_get("@server")
|
11
11
|
@webrick_thread = Thread.new( @webrick ) do |webrick|
|
12
12
|
webrick.run
|
@@ -58,6 +58,8 @@ shared_examples_for "common gem server before after" do
|
|
58
58
|
:body => last_response.body
|
59
59
|
}.should == verify_webrick
|
60
60
|
else
|
61
|
+
puts "webrick: #{verify_webrick[:body]}"
|
62
|
+
#puts "sinatra: #{last_response.body}"
|
61
63
|
last_response.status.should == verify_webrick[:status]
|
62
64
|
end
|
63
65
|
|
@@ -14,12 +14,12 @@ describe Stickler::Middleware::Index do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
before do
|
17
|
-
@
|
18
|
-
FileUtils.mkdir_p( File.join( @
|
17
|
+
@webrick_gem_dir = File.expand_path( File.join( File.dirname( __FILE__ ), "tmp" ) )
|
18
|
+
FileUtils.mkdir_p( File.join( @webrick_gem_dir , "specifications" ))
|
19
19
|
end
|
20
20
|
|
21
21
|
after do
|
22
|
-
FileUtils.rm_rf( @
|
22
|
+
FileUtils.rm_rf( @webrick_gem_dir )
|
23
23
|
end
|
24
24
|
|
25
25
|
it_should_behave_like "modern gem server indexes"
|
@@ -16,9 +16,7 @@ shared_examples_for "legacy gem server indexes" do
|
|
16
16
|
"/quick/index.rz",
|
17
17
|
"/quick/latest_index",
|
18
18
|
"/quick/latest_index.rz",
|
19
|
-
"/quick/Marshal.#{Gem.marshal_version}/foo-1.0.0.gemspec.rz",
|
20
19
|
"/quick/foo-1.0.0.gemspec.rz",
|
21
|
-
"/quick/Marshal.#{Gem.marshal_version}/bar-1.0.0.gemspec.rz",
|
22
20
|
"/quick/bar-1.0.0.gemspec.rz",
|
23
21
|
"/quick/does-not-exist-1.2.0.gemspec.rz"
|
24
22
|
]
|
@@ -7,16 +7,16 @@ require 'stickler/middleware/compression'
|
|
7
7
|
|
8
8
|
describe ::Stickler::Middleware::Local do
|
9
9
|
def app
|
10
|
-
|
10
|
+
repo_root = @sinatra_gem_dir
|
11
11
|
::Rack::Builder.new do
|
12
12
|
use ::Stickler::Middleware::Compression
|
13
|
-
use ::Stickler::Middleware::Local, :repo_root =>
|
13
|
+
use ::Stickler::Middleware::Local, :repo_root => repo_root
|
14
14
|
run ::Sinatra::Base
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
before do
|
19
|
-
@
|
19
|
+
@sinatra_gem_dir = @webrick_gem_dir = @gem_root
|
20
20
|
end
|
21
21
|
|
22
22
|
it_should_behave_like "modern gem server indexes"
|
@@ -10,6 +10,8 @@ shared_examples_for "modern gem server indexes" do
|
|
10
10
|
"/specs.#{Gem.marshal_version}.gz",
|
11
11
|
"/latest_specs.#{Gem.marshal_version}",
|
12
12
|
"/latest_specs.#{Gem.marshal_version}.gz",
|
13
|
+
"/quick/Marshal.#{Gem.marshal_version}/foo-1.0.0.gemspec.rz",
|
14
|
+
"/quick/Marshal.#{Gem.marshal_version}/bar-1.0.0.gemspec.rz",
|
13
15
|
]
|
14
16
|
|
15
17
|
MODERN_URLS.each do |url|
|
data/spec/paths_spec.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path( File.join( File.dirname( __FILE__ ), "spec_helper.rb" ) )
|
2
|
+
|
3
|
+
require 'stickler/paths'
|
4
|
+
|
5
|
+
describe Stickler::Paths do
|
6
|
+
it "can access the root dir of the project" do
|
7
|
+
Stickler::Paths.root_dir.should == File.expand_path( File.join( File.dirname( __FILE__ ), ".." ) ) + ::File::SEPARATOR
|
8
|
+
end
|
9
|
+
|
10
|
+
it "can access the lib path of the project" do
|
11
|
+
Stickler::Paths.lib_path.should == File.expand_path( File.join( File.dirname( __FILE__ ), "..", "lib" ) ) + ::File::SEPARATOR
|
12
|
+
end
|
13
|
+
end
|
data/spec/spec_lite_spec.rb
CHANGED
@@ -53,6 +53,20 @@ describe Stickler::SpecLite do
|
|
53
53
|
(@specs[:ruby] =~ @specs[:win]).should == false
|
54
54
|
end
|
55
55
|
|
56
|
+
it "can be compared against something with the same name and version but different platform" do
|
57
|
+
list = []
|
58
|
+
list << r = Stickler::SpecLite.new( 'alib', '4.2' )
|
59
|
+
list << u = Stickler::SpecLite.new( 'alib', '4.2', 'x86-mswin32' )
|
60
|
+
list.sort.should == [ r, u ]
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'converts platform comparisons to something that can be compared' do
|
64
|
+
list = []
|
65
|
+
list << h2 = Stickler::SpecLite.new( 'htimes', '1.1.1', 'x86-mingw32' )
|
66
|
+
list << h1 = Stickler::SpecLite.new( 'htimes', '1.1.1', 'java' )
|
67
|
+
list.sort.should == [ h1, h2 ]
|
68
|
+
end
|
69
|
+
|
56
70
|
it "can be sorted" do
|
57
71
|
list = @specs.values
|
58
72
|
alib = Stickler::SpecLite.new( 'alib', '4.2' )
|