homesick 1.1.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/ChangeLog.markdown +6 -0
- data/Gemfile +3 -0
- data/homesick.gemspec +3 -3
- data/lib/homesick.rb +1 -1
- data/lib/homesick/actions/file_actions.rb +6 -8
- data/lib/homesick/actions/git_actions.rb +10 -10
- data/lib/homesick/cli.rb +28 -36
- data/lib/homesick/utils.rb +11 -11
- data/lib/homesick/version.rb +1 -1
- data/spec/homesick_cli_spec.rb +42 -69
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b921342f64064305be6b441b198208c20c3d6477
|
4
|
+
data.tar.gz: 8dee41e99c1fa490e46ff6aa3824b42c90bf9542
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 477bdf748078093e787b8ac05b400dc7841ab9510813f850a608a5363804a91d463b71753cddd6c751b093b549040dd9d3854c95a8949e659f70e74a8407c192
|
7
|
+
data.tar.gz: 0cca501be8f34e94fdc02a86c7dc6e2d4ac96d707ad32289f5177b579906b4f74ad1484b3997c8c5acceb375e007f726838bd248609df4b659321671b5efcc58
|
data/.travis.yml
CHANGED
data/ChangeLog.markdown
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
#1.1.3
|
2
|
+
* Allow a destinaton to be passed when cloning a castle
|
3
|
+
* Make sure `homesick edit` opens default editor in the root of the given castle
|
4
|
+
* Fixed bug when diffing edited files
|
5
|
+
* Fixed crashing bug when attempting to diff directories
|
6
|
+
* Ensure that messages are escaped correctly on `git commit all`
|
1
7
|
#1.1.2
|
2
8
|
* Added '--force' option to the rc command to bypass confirmation checks when running a .homesickrc file
|
3
9
|
* Added a check to make sure that a minimum of Git 1.8.0 is installed. This stops Homesick failing silently if Git is not installed.
|
data/Gemfile
CHANGED
@@ -19,6 +19,9 @@ group :development do
|
|
19
19
|
if RbConfig::CONFIG['host_os'] =~ /linux|freebsd|openbsd|sunos|solaris/
|
20
20
|
gem 'libnotify'
|
21
21
|
end
|
22
|
+
if RbConfig::CONFIG['host_os'] =~ /darwin|mac os/
|
23
|
+
gem 'terminal-notifier-guard', '~> 1.6.1'
|
24
|
+
end
|
22
25
|
if RUBY_VERSION >= '1.9.2'
|
23
26
|
gem "rubocop"
|
24
27
|
end
|
data/homesick.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: homesick 1.1.
|
5
|
+
# stub: homesick 1.1.3 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "homesick"
|
9
|
-
s.version = "1.1.
|
9
|
+
s.version = "1.1.3"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Joshua Nichols", "Yusuke Murata"]
|
14
|
-
s.date = "2015-
|
14
|
+
s.date = "2015-10-31"
|
15
15
|
s.description = "\n Your home directory is your castle. Don't leave your dotfiles behind.\n \n\n Homesick is sorta like rip, but for dotfiles. It uses git to clone a repository containing dotfiles, and saves them in ~/.homesick. It then allows you to symlink all the dotfiles into place with a single command. \n\n "
|
16
16
|
s.email = ["josh@technicalpickles.com", "info@muratayusuke.com"]
|
17
17
|
s.executables = ["homesick"]
|
data/lib/homesick.rb
CHANGED
@@ -7,7 +7,7 @@ require 'homesick/cli'
|
|
7
7
|
|
8
8
|
# Homesick's top-level module
|
9
9
|
module Homesick
|
10
|
-
GITHUB_NAME_REPO_PATTERN =
|
10
|
+
GITHUB_NAME_REPO_PATTERN = %r{\A([A-Za-z0-9_-]+/[A-Za-z0-9_-]+)\Z}
|
11
11
|
SUBDIR_FILENAME = '.homesick_subdir'
|
12
12
|
|
13
13
|
DEFAULT_CASTLE_NAME = 'dotfiles'
|
@@ -3,16 +3,14 @@ module Homesick
|
|
3
3
|
module Actions
|
4
4
|
# File-related helper methods for Homesick
|
5
5
|
module FileActions
|
6
|
-
def mv(source, destination
|
6
|
+
def mv(source, destination)
|
7
7
|
source = Pathname.new(source)
|
8
8
|
destination = Pathname.new(destination + source.basename)
|
9
|
-
|
10
|
-
|
9
|
+
case
|
10
|
+
when destination.exist? && (options[:force] || shell.file_collision(destination) { source })
|
11
11
|
say_status :conflict, "#{destination} exists", :red
|
12
|
-
|
13
|
-
FileUtils.mv source, destination if (options[:force] || shell.file_collision(destination) { source }) && !options[:pretend]
|
12
|
+
FileUtils.mv source, destination unless options[:pretend]
|
14
13
|
else
|
15
|
-
# this needs some sort of message here.
|
16
14
|
FileUtils.mv source, destination unless options[:pretend]
|
17
15
|
end
|
18
16
|
end
|
@@ -43,7 +41,7 @@ module Homesick
|
|
43
41
|
FileUtils.rm_r dir
|
44
42
|
end
|
45
43
|
|
46
|
-
def ln_s(source, destination
|
44
|
+
def ln_s(source, destination)
|
47
45
|
source = Pathname.new(source)
|
48
46
|
destination = Pathname.new(destination)
|
49
47
|
FileUtils.mkdir_p destination.dirname
|
@@ -75,7 +73,7 @@ module Homesick
|
|
75
73
|
when :conflict
|
76
74
|
say_status :conflict, "#{destination} exists", :red
|
77
75
|
|
78
|
-
if collision_accepted?(destination)
|
76
|
+
if collision_accepted?(destination, source)
|
79
77
|
FileUtils.rm_r destination, force: true unless options[:pretend]
|
80
78
|
FileUtils.ln_s source, destination, force: true unless options[:pretend]
|
81
79
|
end
|
@@ -14,7 +14,7 @@ module Homesick
|
|
14
14
|
def git_version_correct?
|
15
15
|
info = `git --version`.scan(/(\d+)\.(\d+)\.(\d+)/).flatten.map(&:to_i)
|
16
16
|
return false unless info.count == 3
|
17
|
-
current_version = Hash[
|
17
|
+
current_version = Hash[[:major, :minor, :patch].zip(info)]
|
18
18
|
return true if current_version.eql?(MIN_VERSION)
|
19
19
|
return true if current_version[:major] > MIN_VERSION[:major]
|
20
20
|
return true if current_version[:major] == MIN_VERSION[:major] && current_version[:minor] > MIN_VERSION[:minor]
|
@@ -27,7 +27,7 @@ module Homesick
|
|
27
27
|
config ||= {}
|
28
28
|
destination = config[:destination] || File.basename(repo, '.git')
|
29
29
|
|
30
|
-
destination = Pathname.new(destination) unless destination.
|
30
|
+
destination = Pathname.new(destination) unless destination.is_a?(Pathname)
|
31
31
|
FileUtils.mkdir_p destination.dirname
|
32
32
|
|
33
33
|
if destination.directory?
|
@@ -65,22 +65,22 @@ module Homesick
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
-
def git_submodule_init
|
68
|
+
def git_submodule_init
|
69
69
|
say_status 'git submodule', 'init', :green
|
70
70
|
system 'git submodule --quiet init'
|
71
71
|
end
|
72
72
|
|
73
|
-
def git_submodule_update
|
73
|
+
def git_submodule_update
|
74
74
|
say_status 'git submodule', 'update', :green
|
75
75
|
system 'git submodule --quiet update --init --recursive >/dev/null 2>&1'
|
76
76
|
end
|
77
77
|
|
78
|
-
def git_pull
|
78
|
+
def git_pull
|
79
79
|
say_status 'git pull', '', :green
|
80
80
|
system 'git pull --quiet'
|
81
81
|
end
|
82
82
|
|
83
|
-
def git_push
|
83
|
+
def git_push
|
84
84
|
say_status 'git push', '', :green
|
85
85
|
system 'git push'
|
86
86
|
end
|
@@ -88,23 +88,23 @@ module Homesick
|
|
88
88
|
def git_commit_all(config = {})
|
89
89
|
say_status 'git commit all', '', :green
|
90
90
|
if config[:message]
|
91
|
-
system
|
91
|
+
system %(git commit -a -m "#{config[:message]}")
|
92
92
|
else
|
93
93
|
system 'git commit -v -a'
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
|
-
def git_add(file
|
97
|
+
def git_add(file)
|
98
98
|
say_status 'git add file', '', :green
|
99
99
|
system "git add '#{file}'"
|
100
100
|
end
|
101
101
|
|
102
|
-
def git_status
|
102
|
+
def git_status
|
103
103
|
say_status 'git status', '', :green
|
104
104
|
system 'git status'
|
105
105
|
end
|
106
106
|
|
107
|
-
def git_diff
|
107
|
+
def git_diff
|
108
108
|
say_status 'git diff', '', :green
|
109
109
|
system 'git diff'
|
110
110
|
end
|
data/lib/homesick/cli.rb
CHANGED
@@ -25,38 +25,37 @@ module Homesick
|
|
25
25
|
exit(1)
|
26
26
|
end
|
27
27
|
# Hack in support for diffing symlinks
|
28
|
-
|
29
|
-
class << shell
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
28
|
+
# Also adds support for checking if destination or content is a directory
|
29
|
+
shell_metaclass = class << shell; self; end
|
30
|
+
shell_metaclass.send(:define_method, :show_diff) do |destination, content|
|
31
|
+
destination = Pathname.new(destination)
|
32
|
+
content = Pathname.new(content)
|
33
|
+
return 'Unable to create diff: destination or content is a directory' if destination.directory? || content.directory?
|
34
|
+
return super(destination, content) unless destination.symlink?
|
35
|
+
say "- #{destination.readlink}", :red, true
|
36
|
+
say "+ #{content.expand_path}", :green, true
|
39
37
|
end
|
40
38
|
end
|
41
39
|
|
42
|
-
desc 'clone URI', 'Clone +uri+ as a castle for homesick'
|
43
|
-
def clone(uri)
|
40
|
+
desc 'clone URI CASTLE_NAME', 'Clone +uri+ as a castle with name CASTLE_NAME for homesick'
|
41
|
+
def clone(uri, destination=nil)
|
42
|
+
destination = Pathname.new(destination) unless destination.nil?
|
43
|
+
|
44
44
|
inside repos_dir do
|
45
|
-
destination = nil
|
46
45
|
if File.exist?(uri)
|
47
46
|
uri = Pathname.new(uri).expand_path
|
48
47
|
fail "Castle already cloned to #{uri}" if uri.to_s.start_with?(repos_dir.to_s)
|
49
48
|
|
50
|
-
destination = uri.basename
|
49
|
+
destination = uri.basename if destination.nil?
|
51
50
|
|
52
51
|
ln_s uri, destination
|
53
52
|
elsif uri =~ GITHUB_NAME_REPO_PATTERN
|
54
|
-
destination = Pathname.new(uri).basename
|
53
|
+
destination = Pathname.new(uri).basename if destination.nil?
|
55
54
|
git_clone "https://github.com/#{Regexp.last_match[1]}.git",
|
56
55
|
destination: destination
|
57
56
|
elsif uri =~ /%r([^%r]*?)(\.git)?\Z/ || uri =~ /[^:]+:([^:]+)(\.git)?\Z/
|
58
|
-
destination = Pathname.new(Regexp.last_match[1])
|
59
|
-
git_clone uri
|
57
|
+
destination = Pathname.new(Regexp.last_match[1].gsub(/\.git$/, '')).basename if destination.nil?
|
58
|
+
git_clone uri, destination: destination
|
60
59
|
else
|
61
60
|
fail "Unknown URI format: #{uri}"
|
62
61
|
end
|
@@ -73,18 +72,12 @@ module Homesick
|
|
73
72
|
inside repos_dir do
|
74
73
|
destination = Pathname.new(name)
|
75
74
|
homesickrc = destination.join('.homesickrc').expand_path
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
else
|
84
|
-
say_status 'eval skip',
|
85
|
-
"not evaling #{homesickrc}, #{destination} may need manual configuration",
|
86
|
-
:blue
|
87
|
-
end
|
75
|
+
return unless homesickrc.exist?
|
76
|
+
proceed = options[:force] || shell.yes?("#{name} has a .homesickrc. Proceed with evaling it? (This could be destructive)")
|
77
|
+
return say_status 'eval skip', "not evaling #{homesickrc}, #{destination} may need manual configuration", :blue unless proceed
|
78
|
+
say_status 'eval', homesickrc
|
79
|
+
inside destination do
|
80
|
+
eval homesickrc.read, binding, homesickrc.expand_path.to_s
|
88
81
|
end
|
89
82
|
end
|
90
83
|
end
|
@@ -252,11 +245,10 @@ module Homesick
|
|
252
245
|
desc 'destroy CASTLE', 'Delete all symlinks and remove the cloned repository'
|
253
246
|
def destroy(name)
|
254
247
|
check_castle_existance name, 'destroy'
|
248
|
+
return unless shell.yes?('This will destroy your castle irreversible! Are you sure?')
|
255
249
|
|
256
|
-
|
257
|
-
|
258
|
-
rm_rf repos_dir.join(name)
|
259
|
-
end
|
250
|
+
unlink(name)
|
251
|
+
rm_rf repos_dir.join(name)
|
260
252
|
end
|
261
253
|
|
262
254
|
desc 'cd CASTLE', 'Open a new shell in the root of the given castle'
|
@@ -283,11 +275,11 @@ module Homesick
|
|
283
275
|
end
|
284
276
|
check_castle_existance castle, 'open'
|
285
277
|
castle_dir = repos_dir.join(castle)
|
286
|
-
say_status "#{ENV['EDITOR']}
|
278
|
+
say_status "#{castle_dir.realpath}: #{ENV['EDITOR']} .",
|
287
279
|
"Opening the root directory of castle '#{castle}' in editor '#{ENV['EDITOR']}'.",
|
288
280
|
:green
|
289
281
|
inside castle_dir do
|
290
|
-
system(ENV['EDITOR'])
|
282
|
+
system("#{ENV['EDITOR']} .")
|
291
283
|
end
|
292
284
|
end
|
293
285
|
|
data/lib/homesick/utils.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
+
require 'pathname'
|
3
|
+
|
2
4
|
module Homesick
|
3
5
|
# Various utility methods that are used by Homesick
|
4
6
|
module Utils
|
@@ -33,12 +35,11 @@ module Homesick
|
|
33
35
|
end
|
34
36
|
|
35
37
|
def check_castle_existance(name, action)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
38
|
+
return if castle_dir(name).exist?
|
39
|
+
say_status :error,
|
40
|
+
"Could not #{action} #{name}, expected #{castle_dir(name)} exist and contain dotfiles",
|
41
|
+
:red
|
42
|
+
exit(1)
|
42
43
|
end
|
43
44
|
|
44
45
|
def all_castles
|
@@ -51,7 +52,7 @@ module Homesick
|
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
54
|
-
def inside_each_castle
|
55
|
+
def inside_each_castle
|
55
56
|
all_castles.each do |git_dir|
|
56
57
|
castle = git_dir.dirname
|
57
58
|
Dir.chdir castle do # so we can call git config from the right contxt
|
@@ -128,7 +129,6 @@ module Homesick
|
|
128
129
|
def move_dir_contents(target, dir_path)
|
129
130
|
child_files = dir_path.children
|
130
131
|
child_files.each do |child|
|
131
|
-
|
132
132
|
target_path = target.join(child.basename)
|
133
133
|
if target_path.exist?
|
134
134
|
if more_recent?(child, target_path) && target.file?
|
@@ -148,8 +148,8 @@ module Homesick
|
|
148
148
|
first_p.mtime > second_p.mtime && !first_p.symlink?
|
149
149
|
end
|
150
150
|
|
151
|
-
def collision_accepted?(destination)
|
152
|
-
fail "
|
151
|
+
def collision_accepted?(destination, source)
|
152
|
+
fail "Arguments must be instances of Pathname, #{destination.class.name} and #{source.class.name} given" unless destination.instance_of?(Pathname) && source.instance_of?(Pathname)
|
153
153
|
options[:force] || shell.file_collision(destination) { source }
|
154
154
|
end
|
155
155
|
|
@@ -191,7 +191,7 @@ module Homesick
|
|
191
191
|
end
|
192
192
|
|
193
193
|
def unsymlink_each(castle, basedir, subdirs)
|
194
|
-
each_file(castle, basedir, subdirs) do |
|
194
|
+
each_file(castle, basedir, subdirs) do |_absolute_path, home_path|
|
195
195
|
rm_link home_path
|
196
196
|
end
|
197
197
|
end
|
data/lib/homesick/version.rb
CHANGED
data/spec/homesick_cli_spec.rb
CHANGED
@@ -26,10 +26,10 @@ describe Homesick::CLI do
|
|
26
26
|
|
27
27
|
context 'when a git version that doesn\'t meet the minimum required is installed' do
|
28
28
|
before do
|
29
|
-
expect_any_instance_of(Homesick::Actions::GitActions).to receive(:`).and_return(
|
29
|
+
expect_any_instance_of(Homesick::Actions::GitActions).to receive(:`).and_return('git version 1.7.6')
|
30
30
|
end
|
31
31
|
it 'should raise an exception' do
|
32
|
-
output = Capture.stdout{ expect{Homesick::CLI.new}.to raise_error SystemExit }
|
32
|
+
output = Capture.stdout { expect { Homesick::CLI.new }.to raise_error SystemExit }
|
33
33
|
expect(output.chomp).to include(Homesick::Actions::GitActions::STRING)
|
34
34
|
end
|
35
35
|
end
|
@@ -39,20 +39,19 @@ describe Homesick::CLI do
|
|
39
39
|
expect_any_instance_of(Homesick::Actions::GitActions).to receive(:`).at_least(:once).and_return("git version #{Homesick::Actions::GitActions::STRING}")
|
40
40
|
end
|
41
41
|
it 'should not raise an exception' do
|
42
|
-
output = Capture.stdout{ expect{Homesick::CLI.new}.not_to raise_error }
|
42
|
+
output = Capture.stdout { expect { Homesick::CLI.new }.not_to raise_error }
|
43
43
|
expect(output.chomp).not_to include(Homesick::Actions::GitActions::STRING)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
context 'when a git version that is greater than the minimum required is installed' do
|
48
48
|
before do
|
49
|
-
expect_any_instance_of(Homesick::Actions::GitActions).to receive(:`).at_least(:once).and_return(
|
49
|
+
expect_any_instance_of(Homesick::Actions::GitActions).to receive(:`).at_least(:once).and_return('git version 3.9.8')
|
50
50
|
end
|
51
51
|
it 'should not raise an exception' do
|
52
|
-
output = Capture.stdout{ expect{Homesick::CLI.new}.not_to raise_error }
|
52
|
+
output = Capture.stdout { expect { Homesick::CLI.new }.not_to raise_error }
|
53
53
|
expect(output.chomp).not_to include(Homesick::Actions::GitActions::STRING)
|
54
54
|
end
|
55
|
-
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
@@ -112,34 +111,35 @@ describe Homesick::CLI do
|
|
112
111
|
|
113
112
|
it 'clones git repo like git://host/path/to.git' do
|
114
113
|
expect(homesick).to receive(:git_clone)
|
115
|
-
|
114
|
+
.with('git://github.com/technicalpickles/pickled-vim.git', destination: Pathname.new('pickled-vim'))
|
116
115
|
|
117
116
|
homesick.clone 'git://github.com/technicalpickles/pickled-vim.git'
|
118
117
|
end
|
119
118
|
|
120
119
|
it 'clones git repo like git@host:path/to.git' do
|
121
120
|
expect(homesick).to receive(:git_clone)
|
122
|
-
|
121
|
+
.with('git@github.com:technicalpickles/pickled-vim.git', destination: Pathname.new('pickled-vim'))
|
123
122
|
|
124
123
|
homesick.clone 'git@github.com:technicalpickles/pickled-vim.git'
|
125
124
|
end
|
126
125
|
|
127
126
|
it 'clones git repo like http://host/path/to.git' do
|
128
127
|
expect(homesick).to receive(:git_clone)
|
129
|
-
|
128
|
+
.with('http://github.com/technicalpickles/pickled-vim.git', destination: Pathname.new('pickled-vim'))
|
130
129
|
|
131
130
|
homesick.clone 'http://github.com/technicalpickles/pickled-vim.git'
|
132
131
|
end
|
133
132
|
|
134
133
|
it 'clones git repo like http://host/path/to' do
|
135
134
|
expect(homesick).to receive(:git_clone)
|
136
|
-
|
135
|
+
.with('http://github.com/technicalpickles/pickled-vim', destination: Pathname.new('pickled-vim'))
|
137
136
|
|
138
137
|
homesick.clone 'http://github.com/technicalpickles/pickled-vim'
|
139
138
|
end
|
140
139
|
|
141
140
|
it 'clones git repo like host-alias:repos.git' do
|
142
|
-
expect(homesick).to receive(:git_clone).with('gitolite:pickled-vim.git'
|
141
|
+
expect(homesick).to receive(:git_clone).with('gitolite:pickled-vim.git',
|
142
|
+
destination: Pathname.new('pickled-vim'))
|
143
143
|
|
144
144
|
homesick.clone 'gitolite:pickled-vim.git'
|
145
145
|
end
|
@@ -151,11 +151,18 @@ describe Homesick::CLI do
|
|
151
151
|
|
152
152
|
it 'clones a github repo' do
|
153
153
|
expect(homesick).to receive(:git_clone)
|
154
|
-
|
155
|
-
destination: Pathname.new('dotfiles'))
|
154
|
+
.with('https://github.com/wfarr/dotfiles.git', destination: Pathname.new('dotfiles'))
|
156
155
|
|
157
156
|
homesick.clone 'wfarr/dotfiles'
|
158
157
|
end
|
158
|
+
|
159
|
+
it 'accepts a destination', :focus do
|
160
|
+
expect(homesick).to receive(:git_clone)
|
161
|
+
.with('https://github.com/wfarr/dotfiles.git',
|
162
|
+
destination: Pathname.new('other-name'))
|
163
|
+
|
164
|
+
homesick.clone 'wfarr/dotfiles', 'other-name'
|
165
|
+
end
|
159
166
|
end
|
160
167
|
|
161
168
|
describe 'rc' do
|
@@ -220,7 +227,7 @@ describe Homesick::CLI do
|
|
220
227
|
end
|
221
228
|
end
|
222
229
|
|
223
|
-
describe '
|
230
|
+
describe 'link_castle' do
|
224
231
|
let(:castle) { given_castle('glencairn') }
|
225
232
|
|
226
233
|
it 'links dotfiles from a castle to the home folder' do
|
@@ -308,11 +315,9 @@ describe Homesick::CLI do
|
|
308
315
|
home_config_dir = home.join('.config')
|
309
316
|
home_someapp_dir = home_config_dir.join('someapp')
|
310
317
|
expect(home_config_dir.symlink?).to eq(false)
|
311
|
-
expect(home_config_dir.join('.some_dotfile').readlink)
|
312
|
-
.to eq(config_dotfile)
|
318
|
+
expect(home_config_dir.join('.some_dotfile').readlink).to eq(config_dotfile)
|
313
319
|
expect(home_someapp_dir.symlink?).to eq(false)
|
314
|
-
expect(home_someapp_dir.join('.some_appfile').readlink)
|
315
|
-
.to eq(someapp_dotfile)
|
320
|
+
expect(home_someapp_dir.join('.some_appfile').readlink).to eq(someapp_dotfile)
|
316
321
|
end
|
317
322
|
end
|
318
323
|
|
@@ -421,13 +426,9 @@ describe Homesick::CLI do
|
|
421
426
|
given_castle('wtf/zomg')
|
422
427
|
|
423
428
|
expect(homesick).to receive(:say_status)
|
424
|
-
|
425
|
-
'git://github.com/technicalpickles/zomg.git',
|
426
|
-
:cyan)
|
429
|
+
.with('zomg', 'git://github.com/technicalpickles/zomg.git', :cyan)
|
427
430
|
expect(homesick).to receive(:say_status)
|
428
|
-
|
429
|
-
'git://github.com/technicalpickles/zomg.git',
|
430
|
-
:cyan)
|
431
|
+
.with('wtf/zomg', 'git://github.com/technicalpickles/zomg.git', :cyan)
|
431
432
|
|
432
433
|
homesick.list
|
433
434
|
end
|
@@ -437,7 +438,7 @@ describe Homesick::CLI do
|
|
437
438
|
it 'says "nothing to commit" when there are no changes' do
|
438
439
|
given_castle('castle_repo')
|
439
440
|
text = Capture.stdout { homesick.status('castle_repo') }
|
440
|
-
expect(text).to match(
|
441
|
+
expect(text).to match(%r{nothing to commit \(create/copy files and use "git add" to track\)$})
|
441
442
|
end
|
442
443
|
|
443
444
|
it 'says "Changes to be committed" when there are changes' do
|
@@ -445,9 +446,7 @@ describe Homesick::CLI do
|
|
445
446
|
some_rc_file = home.file '.some_rc_file'
|
446
447
|
homesick.track(some_rc_file.to_s, 'castle_repo')
|
447
448
|
text = Capture.stdout { homesick.status('castle_repo') }
|
448
|
-
expect(text).to match(
|
449
|
-
/Changes to be committed:.*new file:\s*home\/.some_rc_file/m
|
450
|
-
)
|
449
|
+
expect(text).to match(%r{Changes to be committed:.*new file:\s*home\/.some_rc_file}m)
|
451
450
|
end
|
452
451
|
end
|
453
452
|
|
@@ -519,7 +518,6 @@ describe Homesick::CLI do
|
|
519
518
|
end
|
520
519
|
end
|
521
520
|
end
|
522
|
-
|
523
521
|
end
|
524
522
|
|
525
523
|
describe 'push' do
|
@@ -531,9 +529,7 @@ describe Homesick::CLI do
|
|
531
529
|
|
532
530
|
it 'prints an error message when trying to push a non-existant castle' do
|
533
531
|
expect(homesick).to receive('say_status').once
|
534
|
-
|
535
|
-
/Could not push castle_repo, expected .* exist and contain dotfiles/,
|
536
|
-
:red)
|
532
|
+
.with(:error, /Could not push castle_repo, expected .* exist and contain dotfiles/, :red)
|
537
533
|
expect { homesick.push 'castle_repo' }.to raise_error(SystemExit)
|
538
534
|
end
|
539
535
|
end
|
@@ -617,7 +613,6 @@ describe Homesick::CLI do
|
|
617
613
|
# Note that this is a test for the subdir_file related feature of track,
|
618
614
|
# not for the subdir_file method itself.
|
619
615
|
describe 'subdir_file' do
|
620
|
-
|
621
616
|
it 'adds the nested files parent to the subdir_file' do
|
622
617
|
castle = given_castle('castle_repo')
|
623
618
|
|
@@ -692,9 +687,7 @@ describe Homesick::CLI do
|
|
692
687
|
|
693
688
|
it 'returns an error message when the given castle does not exist' do
|
694
689
|
expect(homesick).to receive('say_status').once
|
695
|
-
|
696
|
-
/Could not cd castle_repo, expected .* exist and contain dotfiles/,
|
697
|
-
:red)
|
690
|
+
.with(:error, /Could not cd castle_repo, expected .* exist and contain dotfiles/, :red)
|
698
691
|
expect { homesick.cd 'castle_repo' }.to raise_error(SystemExit)
|
699
692
|
end
|
700
693
|
end
|
@@ -707,7 +700,7 @@ describe Homesick::CLI do
|
|
707
700
|
allow(ENV).to receive(:[]).with('EDITOR').and_return('vim')
|
708
701
|
given_castle 'castle_repo'
|
709
702
|
expect(homesick).to receive('inside').once.with(kind_of(Pathname)).and_yield
|
710
|
-
expect(homesick).to receive('system').once.with('vim')
|
703
|
+
expect(homesick).to receive('system').once.with('vim .')
|
711
704
|
Capture.stdout { homesick.open 'castle_repo' }
|
712
705
|
end
|
713
706
|
|
@@ -715,9 +708,7 @@ describe Homesick::CLI do
|
|
715
708
|
# Set the default editor to make sure it fails.
|
716
709
|
allow(ENV).to receive(:[]).with('EDITOR').and_return(nil)
|
717
710
|
expect(homesick).to receive('say_status').once
|
718
|
-
|
719
|
-
'The $EDITOR environment variable must be set to use this command',
|
720
|
-
:red)
|
711
|
+
.with(:error, 'The $EDITOR environment variable must be set to use this command', :red)
|
721
712
|
expect { homesick.open 'castle_repo' }.to raise_error(SystemExit)
|
722
713
|
end
|
723
714
|
|
@@ -725,9 +716,7 @@ describe Homesick::CLI do
|
|
725
716
|
# Set a default just in case none is set
|
726
717
|
allow(ENV).to receive(:[]).with('EDITOR').and_return('vim')
|
727
718
|
allow(homesick).to receive('say_status').once
|
728
|
-
|
729
|
-
/Could not open castle_repo, expected .* exist and contain dotfiles/,
|
730
|
-
:red)
|
719
|
+
.with(:error, /Could not open castle_repo, expected .* exist and contain dotfiles/, :red)
|
731
720
|
expect { homesick.open 'castle_repo' }.to raise_error(SystemExit)
|
732
721
|
end
|
733
722
|
end
|
@@ -746,9 +735,7 @@ describe Homesick::CLI do
|
|
746
735
|
it 'executes a single command with no arguments inside a given castle' do
|
747
736
|
allow(homesick).to receive('inside').once.with(kind_of(Pathname)).and_yield
|
748
737
|
allow(homesick).to receive('say_status').once
|
749
|
-
|
750
|
-
be_a(String),
|
751
|
-
:green)
|
738
|
+
.with(be_a(String), be_a(String), :green)
|
752
739
|
allow(homesick).to receive('system').once.with('ls')
|
753
740
|
Capture.stdout { homesick.exec 'castle_repo', 'ls' }
|
754
741
|
end
|
@@ -756,18 +743,14 @@ describe Homesick::CLI do
|
|
756
743
|
it 'executes a single command with arguments inside a given castle' do
|
757
744
|
allow(homesick).to receive('inside').once.with(kind_of(Pathname)).and_yield
|
758
745
|
allow(homesick).to receive('say_status').once
|
759
|
-
|
760
|
-
be_a(String),
|
761
|
-
:green)
|
746
|
+
.with(be_a(String), be_a(String), :green)
|
762
747
|
allow(homesick).to receive('system').once.with('ls -la')
|
763
748
|
Capture.stdout { homesick.exec 'castle_repo', 'ls', '-la' }
|
764
749
|
end
|
765
750
|
|
766
751
|
it 'raises an error when the method is called without a command' do
|
767
752
|
allow(homesick).to receive('say_status').once
|
768
|
-
|
769
|
-
be_a(String),
|
770
|
-
:red)
|
753
|
+
.with(:error, be_a(String), :red)
|
771
754
|
allow(homesick).to receive('exit').once.with(1)
|
772
755
|
Capture.stdout { homesick.exec 'castle_repo' }
|
773
756
|
end
|
@@ -775,9 +758,7 @@ describe Homesick::CLI do
|
|
775
758
|
context 'pretend' do
|
776
759
|
it 'does not execute a command when the pretend option is passed' do
|
777
760
|
allow(homesick).to receive('say_status').once
|
778
|
-
|
779
|
-
match(/.*Would execute.*/),
|
780
|
-
:green)
|
761
|
+
.with(be_a(String), match(/.*Would execute.*/), :green)
|
781
762
|
expect(homesick).to receive('system').never
|
782
763
|
Capture.stdout { homesick.invoke 'exec', %w(castle_repo ls -la), pretend: true }
|
783
764
|
end
|
@@ -787,7 +768,7 @@ describe Homesick::CLI do
|
|
787
768
|
it 'does not print status information when quiet is passed' do
|
788
769
|
expect(homesick).to receive('say_status').never
|
789
770
|
allow(homesick).to receive('system').once
|
790
|
-
|
771
|
+
.with('ls -la')
|
791
772
|
Capture.stdout { homesick.invoke 'exec', %w(castle_repo ls -la), quiet: true }
|
792
773
|
end
|
793
774
|
end
|
@@ -802,9 +783,7 @@ describe Homesick::CLI do
|
|
802
783
|
it 'executes a command without arguments inside the root of each cloned castle' do
|
803
784
|
allow(homesick).to receive('inside_each_castle').exactly(:twice).and_yield('castle_repo').and_yield('another_castle_repo')
|
804
785
|
allow(homesick).to receive('say_status').at_least(:once)
|
805
|
-
|
806
|
-
be_a(String),
|
807
|
-
:green)
|
786
|
+
.with(be_a(String), be_a(String), :green)
|
808
787
|
allow(homesick).to receive('system').at_least(:once).with('ls')
|
809
788
|
Capture.stdout { homesick.exec_all 'ls' }
|
810
789
|
end
|
@@ -812,18 +791,14 @@ describe Homesick::CLI do
|
|
812
791
|
it 'executes a command with arguments inside the root of each cloned castle' do
|
813
792
|
allow(homesick).to receive('inside_each_castle').exactly(:twice).and_yield('castle_repo').and_yield('another_castle_repo')
|
814
793
|
allow(homesick).to receive('say_status').at_least(:once)
|
815
|
-
|
816
|
-
be_a(String),
|
817
|
-
:green)
|
794
|
+
.with(be_a(String), be_a(String), :green)
|
818
795
|
allow(homesick).to receive('system').at_least(:once).with('ls -la')
|
819
796
|
Capture.stdout { homesick.exec_all 'ls', '-la' }
|
820
797
|
end
|
821
798
|
|
822
799
|
it 'raises an error when the method is called without a command' do
|
823
800
|
allow(homesick).to receive('say_status').once
|
824
|
-
|
825
|
-
be_a(String),
|
826
|
-
:red)
|
801
|
+
.with(:error, be_a(String), :red)
|
827
802
|
allow(homesick).to receive('exit').once.with(1)
|
828
803
|
Capture.stdout { homesick.exec_all }
|
829
804
|
end
|
@@ -831,9 +806,7 @@ describe Homesick::CLI do
|
|
831
806
|
context 'pretend' do
|
832
807
|
it 'does not execute a command when the pretend option is passed' do
|
833
808
|
allow(homesick).to receive('say_status').at_least(:once)
|
834
|
-
|
835
|
-
match(/.*Would execute.*/),
|
836
|
-
:green)
|
809
|
+
.with(be_a(String), match(/.*Would execute.*/), :green)
|
837
810
|
expect(homesick).to receive('system').never
|
838
811
|
Capture.stdout { homesick.invoke 'exec_all', %w(ls -la), pretend: true }
|
839
812
|
end
|
@@ -843,7 +816,7 @@ describe Homesick::CLI do
|
|
843
816
|
it 'does not print status information when quiet is passed' do
|
844
817
|
expect(homesick).to receive('say_status').never
|
845
818
|
allow(homesick).to receive('system').at_least(:once)
|
846
|
-
|
819
|
+
.with('ls -la')
|
847
820
|
Capture.stdout { homesick.invoke 'exec_all', %w(ls -la), quiet: true }
|
848
821
|
end
|
849
822
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: homesick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Nichols
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-10-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -221,8 +221,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
221
|
version: '0'
|
222
222
|
requirements: []
|
223
223
|
rubyforge_project:
|
224
|
-
rubygems_version: 2.
|
224
|
+
rubygems_version: 2.4.8
|
225
225
|
signing_key:
|
226
226
|
specification_version: 4
|
227
227
|
summary: Your home directory is your castle. Don't leave your dotfiles behind.
|
228
228
|
test_files: []
|
229
|
+
has_rdoc:
|