homesick 0.9.3 → 0.9.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 570212cf6fd08cf5e57314355da62e1bf054d7e6
4
- data.tar.gz: 4a3efa488e1681a707df4302b1cb7a524509d330
3
+ metadata.gz: b018e996f0ee25166f43663c5e761e53f12f0f72
4
+ data.tar.gz: 8664e007c7b5b45e3dc298b7b1c16b9142b42c1d
5
5
  SHA512:
6
- metadata.gz: 878d890e857c3f8c9e4bc50472247682f8ee58e764be3036a2903aaacb2ea4dc877f587a1cd224ea0f2cc4c78e3892d2e08513d92909e9a53f308d1dc5f7609b
7
- data.tar.gz: 8d9ac9a0ed7e83d7d5192025b14df08c960a67787495430d741db07921a1e103114a578a74f8677477bb7676981fcfc47d05c261cbe020a7e6ac8e04481bb67d
6
+ metadata.gz: 5fae9ca5dea450348afde9f237eb1c357f74144b35bf1bce5695f46a8336bad5758fb73dab39341fb845a54f1f0100c994e04a7cfd4991a54e9c2251cfae5961
7
+ data.tar.gz: 82c49cbe96f65516c73cec976b9ae04e42cc8da176167b20174b3bbf3111fd96b3886e2d0d6b45758f4b4c8b403dd5a72855e81511b4ed74e42df14bbc17d9fa
data/ChangeLog.markdown CHANGED
@@ -1,3 +1,9 @@
1
+ # 0.9.4
2
+ * Use https protocol instead of git protocol
3
+ * Introduce new commands
4
+ * `homesick unlink`
5
+ * `homesick rc`
6
+
1
7
  # 0.9.3
2
8
  * Add recursive option to `homesick clone`
3
9
 
data/README.markdown CHANGED
@@ -31,6 +31,10 @@ If you use the shorthand syntax for GitHub repositories in your clone, please no
31
31
 
32
32
  homesick symlink technicalpickles/pickled-vim
33
33
 
34
+ You can remove symlinks anytime when you don't need them anymore
35
+
36
+ homesick unlink pickled-vim
37
+
34
38
  If you're not sure what castles you have around, you can easily list them:
35
39
 
36
40
  homesick list
data/Rakefile CHANGED
@@ -22,7 +22,7 @@ Jeweler::Tasks.new do |gem|
22
22
  gem.email = ["josh@technicalpickles.com", "info@muratayusuke.com"]
23
23
  gem.homepage = "http://github.com/technicalpickles/homesick"
24
24
  gem.authors = ["Joshua Nichols", "Yusuke Murata"]
25
- gem.version = "0.9.3"
25
+ gem.version = "0.9.4"
26
26
  gem.license = "MIT"
27
27
  # Have dependencies? Add them to Gemfile
28
28
 
data/homesick.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "homesick"
8
- s.version = "0.9.3"
8
+ s.version = "0.9.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Joshua Nichols", "Yusuke Murata"]
12
- s.date = "2013-07-06"
12
+ s.date = "2013-07-31"
13
13
  s.description = "\n A man's home (directory) is his castle, so don't leave home with out it.\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 "
14
14
  s.email = ["josh@technicalpickles.com", "info@muratayusuke.com"]
15
15
  s.executables = ["homesick"]
data/lib/homesick.rb CHANGED
@@ -34,7 +34,7 @@ class Homesick < Thor
34
34
  ln_s uri, destination
35
35
  elsif uri =~ GITHUB_NAME_REPO_PATTERN
36
36
  destination = Pathname.new($1)
37
- git_clone "git://github.com/#{$1}.git", :destination => destination
37
+ git_clone "https://github.com/#{$1}.git", :destination => destination
38
38
  elsif uri =~ /%r([^%r]*?)(\.git)?\Z/
39
39
  destination = Pathname.new($1)
40
40
  git_clone uri
@@ -52,13 +52,21 @@ class Homesick < Thor
52
52
  end
53
53
  end
54
54
 
55
+ rc(destination)
56
+ end
57
+ end
58
+
59
+ desc 'rc CASTLE', 'Run the .homesickrc for the specified castle'
60
+ def rc(name = DEFAULT_CASTLE_NAME)
61
+ inside repos_dir do
62
+ destination = Pathname.new(name)
55
63
  homesickrc = destination.join('.homesickrc').expand_path
56
64
  if homesickrc.exist?
57
- proceed = shell.yes?("#{uri} has a .homesickrc. Proceed with evaling it? (This could be destructive)")
65
+ proceed = shell.yes?("#{name} has a .homesickrc. Proceed with evaling it? (This could be destructive)")
58
66
  if proceed
59
67
  shell.say_status 'eval', homesickrc
60
68
  inside destination do
61
- eval homesickrc.read, binding, homesickrc.expand_path
69
+ eval homesickrc.read, binding, homesickrc.expand_path.to_s
62
70
  end
63
71
  else
64
72
  shell.say_status 'eval skip', "not evaling #{homesickrc}, #{destination} may need manual configuration", :blue
@@ -90,7 +98,23 @@ class Homesick < Thor
90
98
  desc 'push CASTLE', 'Push the specified castle'
91
99
  def push(name = DEFAULT_CASTLE_NAME)
92
100
  push_castle name
101
+ end
102
+
103
+ desc 'unlink CASTLE', 'Unsymlinks all dotfiles from the specified castle'
104
+ def unlink(name = DEFAULT_CASTLE_NAME)
105
+ check_castle_existance(name, 'symlink')
106
+
107
+ inside castle_dir(name) do
108
+ subdirs = subdirs(name)
109
+
110
+ # unlink files
111
+ unsymlink_each(name, castle_dir(name), subdirs)
93
112
 
113
+ # unlink files in subdirs
114
+ subdirs.each do |subdir|
115
+ unsymlink_each(name, subdir, subdirs)
116
+ end
117
+ end
94
118
  end
95
119
 
96
120
  desc 'symlink CASTLE', 'Symlinks all dotfiles from the specified castle'
@@ -331,7 +355,7 @@ class Homesick < Thor
331
355
  first_p.mtime > second_p.mtime && !first_p.symlink?
332
356
  end
333
357
 
334
- def symlink_each(castle, basedir, subdirs)
358
+ def each_file(castle, basedir, subdirs)
335
359
  absolute_basedir = Pathname.new(basedir).expand_path
336
360
  inside basedir do
337
361
  files = Pathname.glob('{.*,*}').reject{ |a| ['.', '..'].include?(a.to_s) }
@@ -360,8 +384,21 @@ class Homesick < Thor
360
384
 
361
385
  relative_dir = absolute_basedir.relative_path_from(castle_home)
362
386
  home_path = home_dir.join(relative_dir).join(path)
363
- ln_s absolute_path, home_path
387
+
388
+ yield(absolute_path, home_path)
364
389
  end
365
390
  end
366
391
  end
392
+
393
+ def unsymlink_each(castle, basedir, subdirs)
394
+ each_file(castle, basedir, subdirs) do |absolute_path, home_path|
395
+ rm_link home_path
396
+ end
397
+ end
398
+
399
+ def symlink_each(castle, basedir, subdirs)
400
+ each_file(castle, basedir, subdirs) do |absolute_path, home_path|
401
+ ln_s absolute_path, home_path
402
+ end
403
+ end
367
404
  end
@@ -97,6 +97,17 @@ class Homesick
97
97
  end
98
98
  end
99
99
 
100
+ def rm_link(target)
101
+ target = Pathname.new(target)
102
+
103
+ if target.symlink?
104
+ say_status :unlink, "#{target.expand_path}", :green unless options[:quiet]
105
+ FileUtils.rm_rf target
106
+ else
107
+ say_status :conflict, "#{target} is not a symlink", :red unless options[:quiet]
108
+ end
109
+ end
110
+
100
111
  def ln_s(source, destination, config = {})
101
112
  source = Pathname.new(source)
102
113
  destination = Pathname.new(destination)
@@ -8,9 +8,25 @@ describe 'homesick' do
8
8
 
9
9
  let(:homesick) { Homesick.new }
10
10
 
11
- before { homesick.stub!(:repos_dir).and_return(castles) }
11
+ before { homesick.stub(:repos_dir).and_return(castles) }
12
12
 
13
13
  describe 'clone' do
14
+ context 'has a .homesickrc' do
15
+ it 'should run the .homesickrc' do
16
+ somewhere = create_construct
17
+ local_repo = somewhere.directory('some_repo')
18
+ local_repo.file('.homesickrc') do |file|
19
+ file << "File.open(Dir.pwd + '/testing', 'w') { |f| f.print 'testing' }"
20
+ end
21
+
22
+ expect($stdout).to receive(:print)
23
+ expect($stdin).to receive(:gets).and_return('y')
24
+ homesick.clone local_repo
25
+
26
+ castles.join('some_repo').join('testing').should exist
27
+ end
28
+ end
29
+
14
30
  context 'of a file' do
15
31
  it 'should symlink existing directories' do
16
32
  somewhere = create_construct
@@ -78,12 +94,50 @@ describe 'homesick' do
78
94
  end
79
95
 
80
96
  it 'should clone a github repo' do
81
- homesick.should_receive(:git_clone).with('git://github.com/wfarr/dotfiles.git', :destination => Pathname.new('wfarr/dotfiles'))
97
+ homesick.should_receive(:git_clone).with('https://github.com/wfarr/dotfiles.git', :destination => Pathname.new('wfarr/dotfiles'))
82
98
 
83
99
  homesick.clone 'wfarr/dotfiles'
84
100
  end
85
101
  end
86
102
 
103
+ describe 'rc' do
104
+ let(:castle) { given_castle('glencairn') }
105
+
106
+ context 'when told to do so' do
107
+ before do
108
+ expect($stdout).to receive(:print)
109
+ expect($stdin).to receive(:gets).and_return('y')
110
+ end
111
+
112
+ it 'executes the .homesickrc' do
113
+ castle.file('.homesickrc') do |file|
114
+ file << "File.open(Dir.pwd + '/testing', 'w') { |f| f.print 'testing' }"
115
+ end
116
+
117
+ homesick.rc castle
118
+
119
+ castle.join('testing').should exist
120
+ end
121
+ end
122
+
123
+ context 'when told not to do so' do
124
+ before do
125
+ expect($stdout).to receive(:print)
126
+ expect($stdin).to receive(:gets).and_return('n')
127
+ end
128
+
129
+ it 'does not execute the .homesickrc' do
130
+ castle.file('.homesickrc') do |file|
131
+ file << "File.open(Dir.pwd + '/testing', 'w') { |f| f.print 'testing' }"
132
+ end
133
+
134
+ homesick.rc castle
135
+
136
+ castle.join('testing').should_not exist
137
+ end
138
+ end
139
+ end
140
+
87
141
  describe 'symlink' do
88
142
  let(:castle) { given_castle('glencairn') }
89
143
 
@@ -188,6 +242,91 @@ describe 'homesick' do
188
242
  end
189
243
  end
190
244
 
245
+ describe 'unlink' do
246
+ let(:castle) { given_castle('glencairn') }
247
+
248
+ it 'unlinks dotfiles in the home folder' do
249
+ castle.file('.some_dotfile')
250
+
251
+ homesick.symlink('glencairn')
252
+ homesick.unlink('glencairn')
253
+
254
+ home.join('.some_dotfile').should_not exist
255
+ end
256
+
257
+ it 'unlinks non-dotfiles from the home folder' do
258
+ castle.file('bin')
259
+
260
+ homesick.symlink('glencairn')
261
+ homesick.unlink('glencairn')
262
+
263
+ home.join('bin').should_not exist
264
+ end
265
+
266
+ context "with '.config' in .homesick_subdir" do
267
+ let(:castle) { given_castle('glencairn', ['.config']) }
268
+
269
+ it 'can unlink sub directories' do
270
+ castle.directory('.config').file('.some_dotfile')
271
+
272
+ homesick.symlink('glencairn')
273
+ homesick.unlink('glencairn')
274
+
275
+ home_dotdir = home.join('.config')
276
+ home_dotdir.should exist
277
+ home_dotdir.join('.some_dotfile').should_not exist
278
+ end
279
+ end
280
+
281
+ context "with '.config/appA' in .homesick_subdir" do
282
+ let(:castle) { given_castle('glencairn', ['.config/appA']) }
283
+
284
+ it 'can unsymlink in nested sub directory' do
285
+ castle.directory('.config').directory('appA').file('.some_dotfile')
286
+
287
+ homesick.symlink('glencairn')
288
+ homesick.unlink('glencairn')
289
+
290
+ home_dotdir = home.join('.config').join('appA')
291
+ home_dotdir.should exist
292
+ home_dotdir.join('.some_dotfile').should_not exist
293
+ end
294
+ end
295
+
296
+ context "with '.config' and '.config/someapp' in .homesick_subdir" do
297
+ let(:castle) { given_castle('glencairn', ['.config', '.config/someapp']) }
298
+
299
+ it 'can unsymlink under both of .config and .config/someapp' do
300
+ config_dir = castle.directory('.config')
301
+ config_dir.file('.some_dotfile')
302
+ config_dir.directory('someapp').file('.some_appfile')
303
+
304
+ homesick.symlink('glencairn')
305
+ homesick.unlink('glencairn')
306
+
307
+ home_config_dir = home.join('.config')
308
+ home_someapp_dir = home_config_dir.join('someapp')
309
+ home_config_dir.should exist
310
+ home_config_dir.join('.some_dotfile').should_not exist
311
+ home_someapp_dir.should exist
312
+ home_someapp_dir.join('.some_appfile').should_not exist
313
+ end
314
+ end
315
+
316
+ context "when call with no castle name" do
317
+ let(:castle) { given_castle('dotfiles') }
318
+
319
+ it 'using default castle name: "dotfiles"' do
320
+ castle.file('.some_dotfile')
321
+
322
+ homesick.symlink
323
+ homesick.unlink
324
+
325
+ home.join('.some_dotfile').should_not exist
326
+ end
327
+ end
328
+ end
329
+
191
330
  describe 'list' do
192
331
  it 'should say each castle in the castle directory' do
193
332
  given_castle('zomg')
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: 0.9.3
4
+ version: 0.9.4
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: 2013-07-06 00:00:00.000000000 Z
12
+ date: 2013-07-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor