pullable 0.0.2 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +24 -3
- data/bin/pullable +1 -1
- data/lib/pullable/directory.rb +60 -0
- data/lib/pullable/version.rb +1 -1
- data/lib/pullable.rb +7 -35
- data/pullable.gemspec +11 -9
- data/spec/lib/pullable/directory_spec.rb +60 -0
- data/spec/pullable_spec.rb +15 -0
- data/spec/spec_helper.rb +8 -0
- metadata +33 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba1c8bbf6d383e5772d0cf55811f4afc961e3b63
|
4
|
+
data.tar.gz: e83d49e8d69e26d12babda9ccf6778720372995d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab68f3c9aacd86de1e4fc6f349bbfba9867b0f8302dbe41cb6b1762bcd4c29cc85d6fae38cd2f159fc0db087269238ca7c315c7199ac9f8890e9e3353ee52726
|
7
|
+
data.tar.gz: 66c727d42f2cfccd7ea70789fd64b2b341a6bb5caed73554a629c9103b919858d3c5277982ebc43850e7b0f81a7fa322b4d8bf9e75deb85f20aaa0aa83218bfe
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Pullable
|
2
2
|
|
3
|
+
[![Build Status](https://travis-ci.org/itsmeduncan/pullable.png?branch=master)](https://travis-ci.org/itsmeduncan/pullable)
|
4
|
+
|
3
5
|
Loop over a directory of Git repositories, fetch, and fast-forward merge from
|
4
6
|
origin.
|
5
7
|
|
@@ -19,9 +21,28 @@ Or install it yourself as:
|
|
19
21
|
|
20
22
|
## Usage
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
ls ~/Projects
|
25
|
+
foo bar .DS_Store
|
26
|
+
|
27
|
+
pullable ~/Projects
|
28
|
+
# cd ~/Projects
|
29
|
+
# cd ~/Projects/foo
|
30
|
+
# git fetch -p && git merge --ff-only origin/master
|
31
|
+
# cd ~/Projects/bar
|
32
|
+
# git fetch -p && git merge --ff-only origin/master
|
33
|
+
|
34
|
+
pullable ~/Projects pull
|
35
|
+
# cd ~/Projects
|
36
|
+
# cd ~/Projects/foo
|
37
|
+
# git fetch -p && git pull origin master
|
38
|
+
# cd ~/Projects/bar
|
39
|
+
# git fetch -p && git pull origin master
|
40
|
+
|
41
|
+
## TODO
|
42
|
+
|
43
|
+
* Logging
|
44
|
+
* Finer grain command line options
|
45
|
+
* Grit?
|
25
46
|
|
26
47
|
## Contributing
|
27
48
|
|
data/bin/pullable
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Pullable
|
4
|
+
class Directory
|
5
|
+
|
6
|
+
VALID_METHODS = ['pull', 'merge']
|
7
|
+
SKIPPED_DIRECTORIES = ['.DS_Store']
|
8
|
+
|
9
|
+
attr_reader :path, :method
|
10
|
+
|
11
|
+
def initialize(path, method)
|
12
|
+
unless File.directory?(path)
|
13
|
+
raise ArgumentError.new('Please pass a directory that exists!')
|
14
|
+
end
|
15
|
+
|
16
|
+
unless VALID_METHODS.include?(method)
|
17
|
+
raise ArgumentError.new("#{method} cannot be used to update the repo!")
|
18
|
+
end
|
19
|
+
|
20
|
+
@path = path
|
21
|
+
@method = method
|
22
|
+
end
|
23
|
+
|
24
|
+
def process!
|
25
|
+
Dir.foreach(path) do |directory|
|
26
|
+
if File.directory?(directory)
|
27
|
+
unless SKIPPED_DIRECTORIES.include?(directory)
|
28
|
+
FileUtils.cd(directory)
|
29
|
+
|
30
|
+
if File.directory?('.git')
|
31
|
+
puts "Updated:\t#{directory}"
|
32
|
+
update!
|
33
|
+
end
|
34
|
+
|
35
|
+
FileUtils.cd(path)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.process!(path, method = 'merge')
|
42
|
+
new(path, method).process!
|
43
|
+
end
|
44
|
+
|
45
|
+
def update!
|
46
|
+
system "git fetch -p && #{command} > /dev/null"
|
47
|
+
end
|
48
|
+
|
49
|
+
def command
|
50
|
+
case @method
|
51
|
+
when 'merge'
|
52
|
+
'git merge --ff-only origin/master'
|
53
|
+
when 'pull'
|
54
|
+
'git pull origin master'
|
55
|
+
else
|
56
|
+
raise NotImplementedError
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/pullable/version.rb
CHANGED
data/lib/pullable.rb
CHANGED
@@ -1,42 +1,14 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
SKIPPED_DIRECTORIES = ['.DS_Store']
|
1
|
+
require 'pullable/directory'
|
2
|
+
require 'pullable/version'
|
5
3
|
|
6
4
|
module Pullable
|
7
5
|
|
8
|
-
def self.process!(
|
9
|
-
|
10
|
-
|
11
|
-
raise ArgumentError.new("Please pass a root directoy!") if root.nil?
|
12
|
-
raise ArgumentError.new("Please pass a valid root directoy!") unless File.directory?(root)
|
13
|
-
|
14
|
-
Dir.foreach(root) do |directory|
|
15
|
-
if File.directory?(directory)
|
16
|
-
unless SKIPPED_DIRECTORIES.include?(directory)
|
17
|
-
FileUtils.cd(directory)
|
18
|
-
|
19
|
-
if File.directory?('.git')
|
20
|
-
puts "Pulling:\t#{directory}"
|
21
|
-
`git fetch -p`
|
22
|
-
`git merge --ff-only origin/master`
|
23
|
-
end
|
24
|
-
|
25
|
-
unless $?.success?
|
26
|
-
failed << directory
|
27
|
-
else
|
28
|
-
pulled << directory
|
29
|
-
end
|
30
|
-
|
31
|
-
FileUtils.cd(root)
|
32
|
-
end
|
33
|
-
else
|
34
|
-
skipped << directory
|
35
|
-
end
|
6
|
+
def self.process!(path, method = 'merge')
|
7
|
+
if method == '' || method == nil
|
8
|
+
method = 'merge'
|
36
9
|
end
|
37
10
|
|
38
|
-
|
39
|
-
puts "Skipped:\t#{skipped.inspect}" unless skipped.empty?
|
40
|
-
puts "Failed:\t\t#{failed.inspect}" unless failed.empty?
|
11
|
+
Pullable::Directory.process!(path, method)
|
41
12
|
end
|
13
|
+
|
42
14
|
end
|
data/pullable.gemspec
CHANGED
@@ -4,21 +4,23 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'pullable/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'pullable'
|
8
8
|
spec.version = Pullable::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Duncan Grazier']
|
10
|
+
spec.email = ['itsmeduncan@gmail.com']
|
11
11
|
spec.description = %q{Update your Git repositories}
|
12
12
|
spec.summary = %q{A simple tool to update your local repositories}
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
13
|
+
spec.homepage = 'https://github.com/itsmeduncan/pullable'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
+
spec.add_development_dependency 'mocha'
|
23
|
+
spec.add_development_dependency 'rake'
|
24
|
+
spec.add_development_dependency 'rspec'
|
25
|
+
spec.add_development_dependency 'simplecov'
|
24
26
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Pullable::Directory do
|
4
|
+
|
5
|
+
describe '.new' do
|
6
|
+
it 'raises if the directory does not exist' do
|
7
|
+
File.expects(:directory?).with('foo').returns(false)
|
8
|
+
|
9
|
+
expect {
|
10
|
+
described_class.new('foo', 'merge')
|
11
|
+
}.to raise_error(ArgumentError, 'Please pass a directory that exists!')
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'raises if the method is invalid' do
|
15
|
+
expect {
|
16
|
+
described_class.new('.', 'foo')
|
17
|
+
}.to raise_error(ArgumentError, 'foo cannot be used to update the repo!')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#process!' do
|
22
|
+
it 'initializes a new Pullable::Directory with the given parameters' do
|
23
|
+
Pullable::Directory.expects(:new).with('foo', 'bar').returns(mock(:process! => true))
|
24
|
+
Pullable::Directory.process!('foo', 'bar')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'defaults the method to merge' do
|
28
|
+
Pullable::Directory.expects(:new).with('foo', 'merge').returns(mock(:process! => true))
|
29
|
+
Pullable::Directory.process!('foo')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '.process!' do
|
34
|
+
it 'calls update for each directory that has a .git under the root'
|
35
|
+
it 'skips known weird directories'
|
36
|
+
it 'skips non-git repos'
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#update!' do
|
40
|
+
it 'calls the correct system command' do
|
41
|
+
directory = described_class.new('.', 'merge')
|
42
|
+
directory.expects(:system).with('git fetch -p && git merge --ff-only origin/master > /dev/null')
|
43
|
+
|
44
|
+
directory.update!
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#command" do
|
49
|
+
it 'generates the merge command' do
|
50
|
+
directory = described_class.new('.', 'merge')
|
51
|
+
directory.command.should == 'git merge --ff-only origin/master'
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'generates the pull command' do
|
55
|
+
directory = described_class.new('.', 'pull')
|
56
|
+
directory.command.should == 'git pull origin master'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
data/spec/pullable_spec.rb
CHANGED
@@ -6,4 +6,19 @@ describe Pullable do
|
|
6
6
|
Pullable::VERSION.should_not be_nil
|
7
7
|
end
|
8
8
|
|
9
|
+
it 'calls process! with the correct arguments' do
|
10
|
+
Pullable::Directory.expects(:process!).with('foo', 'bar')
|
11
|
+
Pullable.process!('foo', 'bar')
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'handles a blank string for the method' do
|
15
|
+
Pullable::Directory.expects(:process!).with('foo', 'merge')
|
16
|
+
Pullable.process!('foo', '')
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'handles a nil method' do
|
20
|
+
Pullable::Directory.expects(:process!).with('foo', 'merge')
|
21
|
+
Pullable.process!('foo')
|
22
|
+
end
|
23
|
+
|
9
24
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pullable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Duncan Grazier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mocha
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - '>='
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
description: Update your Git repositories
|
56
84
|
email:
|
57
85
|
- itsmeduncan@gmail.com
|
@@ -71,8 +99,10 @@ files:
|
|
71
99
|
- Rakefile
|
72
100
|
- bin/pullable
|
73
101
|
- lib/pullable.rb
|
102
|
+
- lib/pullable/directory.rb
|
74
103
|
- lib/pullable/version.rb
|
75
104
|
- pullable.gemspec
|
105
|
+
- spec/lib/pullable/directory_spec.rb
|
76
106
|
- spec/pullable_spec.rb
|
77
107
|
- spec/spec_helper.rb
|
78
108
|
homepage: https://github.com/itsmeduncan/pullable
|
@@ -100,5 +130,6 @@ signing_key:
|
|
100
130
|
specification_version: 4
|
101
131
|
summary: A simple tool to update your local repositories
|
102
132
|
test_files:
|
133
|
+
- spec/lib/pullable/directory_spec.rb
|
103
134
|
- spec/pullable_spec.rb
|
104
135
|
- spec/spec_helper.rb
|