gem-mirror 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/.yardopts +11 -0
- data/Gemfile +3 -0
- data/LICENSE +19 -0
- data/MANIFEST +33 -0
- data/README.md +80 -0
- data/Rakefile +12 -0
- data/bin/gem-mirror +5 -0
- data/doc/.gitkeep +0 -0
- data/doc/Contributing.md +125 -0
- data/doc/DCO.md +25 -0
- data/doc/css/.gitkeep +0 -0
- data/doc/css/common.css +68 -0
- data/gem-mirror.gemspec +26 -0
- data/lib/gem-mirror.rb +31 -0
- data/lib/gem-mirror/cli.rb +65 -0
- data/lib/gem-mirror/cli/checksum.rb +41 -0
- data/lib/gem-mirror/cli/index.rb +31 -0
- data/lib/gem-mirror/cli/init.rb +21 -0
- data/lib/gem-mirror/cli/update.rb +23 -0
- data/lib/gem-mirror/configuration.rb +132 -0
- data/lib/gem-mirror/gem.rb +53 -0
- data/lib/gem-mirror/gems_fetcher.rb +194 -0
- data/lib/gem-mirror/mirror_directory.rb +59 -0
- data/lib/gem-mirror/mirror_file.rb +63 -0
- data/lib/gem-mirror/source.rb +106 -0
- data/lib/gem-mirror/version.rb +3 -0
- data/lib/gem-mirror/versions_fetcher.rb +30 -0
- data/lib/gem-mirror/versions_file.rb +64 -0
- data/task/manifest.rake +8 -0
- data/template/config.rb +25 -0
- data/template/public/checksums/.gitkeep +0 -0
- data/template/public/gems/.gitkeep +0 -0
- metadata +174 -0
data/.gitignore
ADDED
data/.yardopts
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2013, Yorick Peterse
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/MANIFEST
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
.gitignore
|
2
|
+
.yardopts
|
3
|
+
Gemfile
|
4
|
+
LICENSE
|
5
|
+
MANIFEST
|
6
|
+
README.md
|
7
|
+
Rakefile
|
8
|
+
bin/gem-mirror
|
9
|
+
doc/.gitkeep
|
10
|
+
doc/Contributing.md
|
11
|
+
doc/DCO.md
|
12
|
+
doc/css/.gitkeep
|
13
|
+
doc/css/common.css
|
14
|
+
gem-mirror.gemspec
|
15
|
+
lib/gem-mirror.rb
|
16
|
+
lib/gem-mirror/cli.rb
|
17
|
+
lib/gem-mirror/cli/checksum.rb
|
18
|
+
lib/gem-mirror/cli/index.rb
|
19
|
+
lib/gem-mirror/cli/init.rb
|
20
|
+
lib/gem-mirror/cli/update.rb
|
21
|
+
lib/gem-mirror/configuration.rb
|
22
|
+
lib/gem-mirror/gem.rb
|
23
|
+
lib/gem-mirror/gems_fetcher.rb
|
24
|
+
lib/gem-mirror/mirror_directory.rb
|
25
|
+
lib/gem-mirror/mirror_file.rb
|
26
|
+
lib/gem-mirror/source.rb
|
27
|
+
lib/gem-mirror/version.rb
|
28
|
+
lib/gem-mirror/versions_fetcher.rb
|
29
|
+
lib/gem-mirror/versions_file.rb
|
30
|
+
task/manifest.rake
|
31
|
+
template/config.rb
|
32
|
+
template/public/checksums/.gitkeep
|
33
|
+
template/public/gems/.gitkeep
|
data/README.md
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
# Gem Mirror
|
2
|
+
|
3
|
+
Gem-mirror is a Ruby application that makes it easy to create your own RubyGems
|
4
|
+
mirror without having to stitch together ugly Bash scripts or deal with more
|
5
|
+
complex tools such as [Geminabox][geminabox]. Unlike tools such as Geminabox
|
6
|
+
and other gem-mirror does mirroring only, it has no authentication and you
|
7
|
+
can't upload Gems to it.
|
8
|
+
|
9
|
+
## Differences with Geminabox
|
10
|
+
|
11
|
+
Geminabox is basically a tiny DIY RubyGems that focuses more on uploading your
|
12
|
+
own Gems (e.g. company specific ones) instead of mirroring an external source.
|
13
|
+
Gem-mirror however purely focuses on generating a mirror that can be used by
|
14
|
+
the RubyGems CLI utility.
|
15
|
+
|
16
|
+
## Differences with gem-server
|
17
|
+
|
18
|
+
RubyGems comes with the command `gem-server` which can be used to serve the
|
19
|
+
Gems you have installed on that machine and user. Similar to Geminabox it does
|
20
|
+
not provide the means to actually mirror an external source. It's also Rack
|
21
|
+
based and uses WEBRick, which isn't exactly the best server around.
|
22
|
+
|
23
|
+
## How do I use it?
|
24
|
+
|
25
|
+
The process of setting up a mirror is fairly easy and can be done in a matter
|
26
|
+
of minutes depending on the amount of Gems you're mirroring and your internet
|
27
|
+
speed.
|
28
|
+
|
29
|
+
The first step is to set up a new, empty mirror. This is done by running the
|
30
|
+
`gem-mirror init` command similar to how you initialize a new Git repository:
|
31
|
+
|
32
|
+
$ gem-mirror init /srv/http/mirror.com/
|
33
|
+
|
34
|
+
Once created you should edit the main configuration file called `config.rb`.
|
35
|
+
This configuration file specifies what sources to mirror (you can mirror
|
36
|
+
multiple ones!), which Gems, etc.
|
37
|
+
|
38
|
+
Once configured you can pull all the Gems by running the following command:
|
39
|
+
|
40
|
+
$ gem-mirror update
|
41
|
+
|
42
|
+
If your configuration file is not located in the current directory you can
|
43
|
+
specify the path to it using the `-c` or `--config` option. The process of
|
44
|
+
downloading all the Gems takes a while and can use quite a bit of memory so
|
45
|
+
make sure you have plenty of time and RAM available.
|
46
|
+
|
47
|
+
Once all the Gems have been downloaded you'll need to generate an index of all
|
48
|
+
the installed files. This can be done as following:
|
49
|
+
|
50
|
+
$ gem-mirror index
|
51
|
+
|
52
|
+
Last but not least you'll want to generate a list of SHA512 checksums. Although
|
53
|
+
RubyGems doesn't use these they might come in handy when verifying Gems (e.g.
|
54
|
+
when RubyGems gets hacked again). This can be done using the following command:
|
55
|
+
|
56
|
+
$ gem-mirror checksum
|
57
|
+
|
58
|
+
If you want to do all this automatically (which is recommended) you can use a
|
59
|
+
simple Cronjob like the following one:
|
60
|
+
|
61
|
+
@hourly cd /srv/http/mirror.com && gem-mirror update && gem-mirror index
|
62
|
+
|
63
|
+
## Requirements
|
64
|
+
|
65
|
+
* Ruby 1.9.2 or newer
|
66
|
+
* Enough space to store Gems
|
67
|
+
|
68
|
+
## Installation
|
69
|
+
|
70
|
+
Assuming RubyGems isn't down you can install the Gem as following:
|
71
|
+
|
72
|
+
$ gem install gem-mirror
|
73
|
+
|
74
|
+
## License
|
75
|
+
|
76
|
+
All source code in this repository is licensed under the MIT license unless
|
77
|
+
specified otherwise. A copy of this license can be found in the file "LICENSE"
|
78
|
+
in the root directory of this repository.
|
79
|
+
|
80
|
+
[geminabox]: https://github.com/cwninja/geminabox
|
data/Rakefile
ADDED
data/bin/gem-mirror
ADDED
data/doc/.gitkeep
ADDED
File without changes
|
data/doc/Contributing.md
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
For those wishing to contribute code to gem-mirror there are several
|
4
|
+
requirements that have to be met before their code is accepted into the
|
5
|
+
repository. These requirements and the corresponding steps involved are
|
6
|
+
described in this document.
|
7
|
+
|
8
|
+
## Licenses
|
9
|
+
|
10
|
+
gem-mirror is licensed under the MIT license (see the file "LICENSE" for the
|
11
|
+
specific details of this license) and thus all contributed code must be
|
12
|
+
compliant with this license. To keep things simple I do not accept code that is
|
13
|
+
licensed under a different license, even if it is an open source license.
|
14
|
+
|
15
|
+
For example, if you were to contribute a patch but license it under a specific
|
16
|
+
license, such as the GPL, then I will not accept it. All code should and will
|
17
|
+
always be licensed under the MIT license.
|
18
|
+
|
19
|
+
## Signing Off
|
20
|
+
|
21
|
+
Each commit, no matter how small, must be signed off using `git commit --sign`.
|
22
|
+
When signing off a commit you indicate that you have read and accepted both the
|
23
|
+
Developer's Certificate of Origin (found in the file DCO.md) as well as the
|
24
|
+
license (found in the file LICENSE). Commits that are not signed off, no matter
|
25
|
+
how useful, will **not** be accepted.
|
26
|
+
|
27
|
+
When signing your commits make sure your username and Email address are set
|
28
|
+
correctly, these can be set as following:
|
29
|
+
|
30
|
+
$ git config --global --add user.name "YOUR NAME"
|
31
|
+
$ git config --global --add user.email "YOUR EMAIL"
|
32
|
+
|
33
|
+
Once configured properly you can sign off commits using the following command:
|
34
|
+
|
35
|
+
$ git commit --sign -m "Commit message goes in here"
|
36
|
+
|
37
|
+
## Commit Messages
|
38
|
+
|
39
|
+
Commit messages should follow the same standard as the Kernel/Git repository.
|
40
|
+
The first line of the commit acts as a short description of what the commit
|
41
|
+
does. Think of it as the subject of an Email: make it short and understandable.
|
42
|
+
The maximum amount of characters on this line is 50 characters.
|
43
|
+
|
44
|
+
Note that descriptions such as "Updated README.md" and "Changes" are not proper
|
45
|
+
descriptions and will result in me not accepting such commits.
|
46
|
+
|
47
|
+
The second line of the commit should be empty as it acts as a separator between
|
48
|
+
the subject and following lines. The following lines can be used to give a more
|
49
|
+
in-depth description of what the commit does. These lines must not be longer
|
50
|
+
than 79 characters per line.
|
51
|
+
|
52
|
+
An example of a good commit message is the following:
|
53
|
+
|
54
|
+
Started completely re-writing the AST.
|
55
|
+
|
56
|
+
The current AST that's being generated by RubyLint::Parser is overly complex
|
57
|
+
and confusing due to the large number of classes used for different node types.
|
58
|
+
After having a discussion about ASTs and the likes with @whitequark I decided
|
59
|
+
that the AST generated by the parser has to be re-written from scratch.
|
60
|
+
|
61
|
+
To make things easier I'm using "Furnace" which provides a simple, immutable
|
62
|
+
class that can be used for representing nodes in an AST. Along with changing
|
63
|
+
the AST will come various changes to the way the definitions list is built as
|
64
|
+
well as how callback classes work (due to different event names being used).
|
65
|
+
None of this will be backwards compatible with what I've currently pushed to
|
66
|
+
Rubygems but that's expected when something is still alpha quality software.
|
67
|
+
|
68
|
+
Signed-off-by: Yorick Peterse <yorickpeterse@gmail.com>
|
69
|
+
|
70
|
+
Example of a not so good commit message:
|
71
|
+
|
72
|
+
ensure a http 302 redirect
|
73
|
+
|
74
|
+
The latter is bad because although it does state what it does (up to a certain
|
75
|
+
point) there's no in depth explanation. This means that I have to start digging
|
76
|
+
through code in order to find out what's going on. While I will always check
|
77
|
+
every commit added by somebody else there are times when the code is not clear
|
78
|
+
enough and I have no interest in spending an entire evening trying to
|
79
|
+
understand what somebody was trying to do.
|
80
|
+
|
81
|
+
## Coding Standards
|
82
|
+
|
83
|
+
* 2 spaces per indentation level for Ruby files, 4 spaces for the CSS files
|
84
|
+
used for the documentation (chances are most people won't have to bother with
|
85
|
+
these). Code that includes tabs for indentation will not be accepted.
|
86
|
+
|
87
|
+
* Code must be documented using YARD. At minimum you should document the
|
88
|
+
parameters and return values, preferably it should also contain a short
|
89
|
+
description and some examples when needed. The formatting of generic text
|
90
|
+
(e.g. method descriptions) must be done using Markdown.
|
91
|
+
|
92
|
+
* The amount of dependencies, both runtime and development dependencies, should
|
93
|
+
be kept to a minimum. This reduces the amount of potential risk factors both
|
94
|
+
in terms of bugs as well as potential security issues.
|
95
|
+
|
96
|
+
* Nested modules/classes go into their own definitions, code such as `module
|
97
|
+
Foo::Bar; ...; end` is a no-no.
|
98
|
+
|
99
|
+
* Use common sense, I'm not going to hold your hands while you're writing
|
100
|
+
patches.
|
101
|
+
|
102
|
+
* Do yourself a favour and open an issue *before* starting on big changes that
|
103
|
+
I might reject. It would be a waste if you were to spend a week working on
|
104
|
+
something only for me to reject it. You're also welcome to send me an Email
|
105
|
+
but I prefer to keep gem-mirror related discussions on the issue tracker so
|
106
|
+
other people can see it and potentially give their feedback.
|
107
|
+
|
108
|
+
* Do not touch the files LICENSE, version.rb, MANIFEST and DCO.md. The Gemspec
|
109
|
+
(gem-mirror.gemspec) may only be modified when adding dependencies that are
|
110
|
+
absolutely required and only after I have approved it. Last I want is for the
|
111
|
+
gem to be broken because somebody messed with one of these files without me
|
112
|
+
noticing.
|
113
|
+
|
114
|
+
## Language Requirements
|
115
|
+
|
116
|
+
Besides the various coding standards and commit requirements I also require
|
117
|
+
both code and commits to be written in proper English. A typo or grammar error
|
118
|
+
happens and isn't the end of the world but please double check your spelling
|
119
|
+
before committing something. If you use Vim you can enable spell checking by
|
120
|
+
running the following:
|
121
|
+
|
122
|
+
set spell spelllang=en
|
123
|
+
|
124
|
+
The use of offensive or otherwise negative language aimed at other projects,
|
125
|
+
people, organizations and the likes is not allowed.
|
data/doc/DCO.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Developer's Certificate of Origin 1.0
|
2
|
+
|
3
|
+
By making a contribution to this project, I certify that:
|
4
|
+
|
5
|
+
1. The contribution was created in whole or in part by me and I
|
6
|
+
have the right to submit it under the open source license
|
7
|
+
indicated in the file LICENSE; or
|
8
|
+
|
9
|
+
2. The contribution is based upon previous work that, to the best
|
10
|
+
of my knowledge, is covered under an appropriate open source
|
11
|
+
license and I have the right under that license to submit that
|
12
|
+
work with modifications, whether created in whole or in part
|
13
|
+
by me, under the same open source license (unless I am
|
14
|
+
permitted to submit under a different license), as indicated
|
15
|
+
in the file LICENSE; or
|
16
|
+
|
17
|
+
3. The contribution was provided directly to me by some other
|
18
|
+
person who certified (1), (2) or (3) and I have not modified
|
19
|
+
it.
|
20
|
+
|
21
|
+
4. I understand and agree that this project and the contribution
|
22
|
+
are public and that a record of the contribution (including all
|
23
|
+
personal information I submit with it, including my sign-off) is
|
24
|
+
maintained indefinitely and may be redistributed consistent with
|
25
|
+
this project or the open source license(s) involved.
|
data/doc/css/.gitkeep
ADDED
File without changes
|
data/doc/css/common.css
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
body
|
2
|
+
{
|
3
|
+
font-size: 14px;
|
4
|
+
line-height: 1.6;
|
5
|
+
margin: 0 auto;
|
6
|
+
max-width: 960px;
|
7
|
+
}
|
8
|
+
|
9
|
+
p code
|
10
|
+
{
|
11
|
+
background: #f2f2f2;
|
12
|
+
padding-left: 3px;
|
13
|
+
padding-right: 3px;
|
14
|
+
}
|
15
|
+
|
16
|
+
pre.code
|
17
|
+
{
|
18
|
+
font-size: 13px;
|
19
|
+
line-height: 1.4;
|
20
|
+
}
|
21
|
+
|
22
|
+
/**
|
23
|
+
* YARD uses generic table styles, using a special class means those tables
|
24
|
+
* don't get messed up.
|
25
|
+
*/
|
26
|
+
.table
|
27
|
+
{
|
28
|
+
border: 1px solid #ccc;
|
29
|
+
border-right: none;
|
30
|
+
border-collapse: separate;
|
31
|
+
border-spacing: 0;
|
32
|
+
text-align: left;
|
33
|
+
}
|
34
|
+
|
35
|
+
.table.full
|
36
|
+
{
|
37
|
+
width: 100%;
|
38
|
+
}
|
39
|
+
|
40
|
+
.table .field_name
|
41
|
+
{
|
42
|
+
min-width: 160px;
|
43
|
+
}
|
44
|
+
|
45
|
+
.table thead tr th.no_sort:first-child
|
46
|
+
{
|
47
|
+
width: 25px;
|
48
|
+
}
|
49
|
+
|
50
|
+
.table thead tr th, .table tbody tr td
|
51
|
+
{
|
52
|
+
border-bottom: 1px solid #ccc;
|
53
|
+
border-right: 1px solid #ccc;
|
54
|
+
min-width: 20px;
|
55
|
+
padding: 8px 5px;
|
56
|
+
text-align: left;
|
57
|
+
vertical-align: top;
|
58
|
+
}
|
59
|
+
|
60
|
+
.table tbody tr:last-child td
|
61
|
+
{
|
62
|
+
border-bottom: none;
|
63
|
+
}
|
64
|
+
|
65
|
+
.table tr:nth-child(odd) td
|
66
|
+
{
|
67
|
+
background: #f9f9f9;
|
68
|
+
}
|
data/gem-mirror.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.expand_path('../lib/gem-mirror/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'gem-mirror'
|
5
|
+
s.version = GemMirror::VERSION
|
6
|
+
s.date = '2012-02-03'
|
7
|
+
s.authors = ['Yorick Peterse']
|
8
|
+
s.email = 'yorickpeterse@gmail.com'
|
9
|
+
s.summary = 'Gem for easily creating your own RubyGems mirror.'
|
10
|
+
s.homepage = 'https://github.com/yorickpeterse/gem-mirror'
|
11
|
+
s.description = s.summary
|
12
|
+
s.executables = ['gem-mirror']
|
13
|
+
|
14
|
+
s.files = File.read(File.expand_path('../MANIFEST', __FILE__)).split("\n")
|
15
|
+
|
16
|
+
s.has_rdoc = 'yard'
|
17
|
+
s.required_ruby_version = '>= 1.9.2'
|
18
|
+
|
19
|
+
s.add_dependency 'slop'
|
20
|
+
s.add_dependency 'httpclient'
|
21
|
+
s.add_dependency 'builder'
|
22
|
+
|
23
|
+
s.add_development_dependency 'yard'
|
24
|
+
s.add_development_dependency 'redcarpet'
|
25
|
+
s.add_development_dependency 'rake'
|
26
|
+
end
|
data/lib/gem-mirror.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubygems/user_interaction'
|
3
|
+
require 'rubygems/indexer'
|
4
|
+
require 'slop'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'digest/sha2'
|
7
|
+
require 'confstruct'
|
8
|
+
require 'zlib'
|
9
|
+
require 'httpclient'
|
10
|
+
require 'logger'
|
11
|
+
require 'stringio'
|
12
|
+
|
13
|
+
unless $:.include?(File.expand_path('../', __FILE__))
|
14
|
+
$:.unshift(File.expand_path('../', __FILE__))
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'gem-mirror/version'
|
18
|
+
require 'gem-mirror/configuration'
|
19
|
+
require 'gem-mirror/gem'
|
20
|
+
require 'gem-mirror/source'
|
21
|
+
require 'gem-mirror/mirror_directory'
|
22
|
+
require 'gem-mirror/mirror_file'
|
23
|
+
require 'gem-mirror/versions_file'
|
24
|
+
require 'gem-mirror/versions_fetcher'
|
25
|
+
require 'gem-mirror/gems_fetcher'
|
26
|
+
|
27
|
+
require 'gem-mirror/cli'
|
28
|
+
require 'gem-mirror/cli/init'
|
29
|
+
require 'gem-mirror/cli/update'
|
30
|
+
require 'gem-mirror/cli/index'
|
31
|
+
require 'gem-mirror/cli/checksum'
|