homesick 1.1.2 → 1.1.3
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.
- 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:
|