homesick 0.4.1 → 0.5.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.
@@ -1,3 +1,9 @@
1
+ # 0.5.0
2
+
3
+ * Fixed listing of castles cloned using `homesick clone <github-user>/<github-repo>` (issue 3)
4
+ * Added `homesick pull <CASTLE>` for updating castles (thanks Jorge Dias!)
5
+ * Added a very basic `homesick generate <CASTLE>`
6
+
1
7
  # 0.4.1
2
8
 
3
9
  * Improved error message when a castle's home dir doesn't exist
@@ -2,7 +2,7 @@
2
2
 
3
3
  A man's home (directory) is his castle, so don't leave home with out it.
4
4
 
5
- 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.
5
+ Homesick is sorta like [rip](http://github.com/defunkt/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.
6
6
 
7
7
  We call a repository that is compatible with homesick to be a 'castle'. To act as a castle, a repository must be organized like so:
8
8
 
@@ -25,6 +25,10 @@ With the castle cloned, you can now link its contents into your home dir:
25
25
 
26
26
  homesick symlink pickled-vim
27
27
 
28
+ If uou use the shorthand syntax for GitHub repositories in your clone, please note you will instead need to run:
29
+
30
+ homesick symlink technicalpickles/pickled-vim
31
+
28
32
  If you're not sure what castles you have around, you can easily list them:
29
33
 
30
34
  homesick list
data/Rakefile CHANGED
@@ -22,7 +22,7 @@ Jeweler::Tasks.new do |gem|
22
22
  gem.email = "josh@technicalpickles.com"
23
23
  gem.homepage = "http://github.com/technicalpickles/homesick"
24
24
  gem.authors = ["Joshua Nichols"]
25
- gem.version = "0.4.1"
25
+ gem.version = "0.5.1"
26
26
  # Have dependencies? Add them to Gemfile
27
27
 
28
28
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{homesick}
8
- s.version = "0.4.1"
8
+ s.version = "0.5.1"
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"]
12
- s.date = %q{2010-04-02}
12
+ s.date = %q{2010-05-18}
13
13
  s.default_executable = %q{homesick}
14
14
  s.description = %q{
15
15
  A man’s home (directory) is his castle, so don’t leave home with out it.
@@ -44,13 +44,20 @@ class Homesick < Thor
44
44
  end
45
45
  end
46
46
 
47
+ desc "pull NAME", "Update the specified castle"
48
+ def pull(name)
49
+ check_castle_existance(name, "pull")
50
+
51
+ inside repos_dir.join(name) do
52
+ git_pull
53
+ git_submodule_init
54
+ git_submodule_update
55
+ end
56
+ end
57
+
47
58
  desc "symlink NAME", "Symlinks all dotfiles from the specified castle"
48
59
  def symlink(name)
49
- unless castle_dir(name).exist?
50
- say_status :error, "Could not symlink #{name}, expected #{castle_dir(name)} exist and contain dotfiles", :red
51
-
52
- exit(1)
53
- end
60
+ check_castle_existance(name, "symlink")
54
61
 
55
62
  inside castle_dir(name) do
56
63
  files = Pathname.glob('.*').reject{|a| [".",".."].include?(a.to_s)}
@@ -68,10 +75,33 @@ class Homesick < Thor
68
75
 
69
76
  desc "list", "List cloned castles"
70
77
  def list
71
- Pathname.glob(repos_dir + "*") do |castle|
78
+ #require 'ruby-debug'; breakpoint
79
+ Pathname.glob("#{repos_dir}/**/*/.git") do |git_dir|
80
+ castle = git_dir.dirname
72
81
  Dir.chdir castle do # so we can call git config from the right contxt
73
- say_status castle.basename.to_s, `git config remote.origin.url`.chomp, :cyan
82
+ say_status castle.relative_path_from(repos_dir), `git config remote.origin.url`.chomp, :cyan
83
+ end
84
+ end
85
+ end
86
+
87
+ desc "generate PATH", "generate a homesick-ready git repo at PATH"
88
+ def generate(castle)
89
+ castle = Pathname.new(castle).expand_path
90
+
91
+ github_user = `git config github.user`.chomp
92
+ github_user = nil if github_user == ""
93
+ github_repo = castle.basename
94
+
95
+
96
+ empty_directory castle
97
+ inside castle do
98
+ git_init
99
+ if github_user
100
+ url = "git@github.com:#{github_user}/#{github_repo}.git"
101
+ git_remote_add 'origin', url
74
102
  end
103
+
104
+ empty_directory "home"
75
105
  end
76
106
  end
77
107
 
@@ -85,9 +115,16 @@ class Homesick < Thor
85
115
  @repos_dir ||= home_dir.join('.homesick', 'repos').expand_path
86
116
  end
87
117
 
88
-
89
118
  def castle_dir(name)
90
119
  repos_dir.join(name, 'home')
91
120
  end
92
121
 
122
+ def check_castle_existance(name, action)
123
+ unless castle_dir(name).exist?
124
+ say_status :error, "Could not #{action} #{name}, expected #{castle_dir(name)} exist and contain dotfiles", :red
125
+
126
+ exit(1)
127
+ end
128
+ end
129
+
93
130
  end
@@ -19,6 +19,31 @@ class Homesick
19
19
  end
20
20
  end
21
21
 
22
+ def git_init(path = ".")
23
+ path = Pathname.new(path)
24
+
25
+ inside path do
26
+ unless path.join('.git').exist?
27
+ say_status 'git init', '' unless options[:quiet]
28
+ system "git init >/dev/null" unless options[:pretend]
29
+ else
30
+ say_status 'git init', 'already initialized', :blue unless options[:quiet]
31
+ end
32
+ end
33
+ end
34
+
35
+ def git_remote_add(name, url)
36
+ existing_remote = `git config remote.#{name}.url`.chomp
37
+ existing_remote = nil if existing_remote == ''
38
+
39
+ unless existing_remote
40
+ say_status 'git remote', "add #{name} #{url}" unless options[:quiet]
41
+ system "git remote add #{name} #{url}" unless options[:pretend]
42
+ else
43
+ say_status 'git remote', "#{name} already exists", :blue unless options[:quiet]
44
+ end
45
+ end
46
+
22
47
  def git_submodule_init(config = {})
23
48
  say_status 'git submodule', 'init', :green unless options[:quiet]
24
49
  system "git submodule --quiet init" unless options[:pretend]
@@ -29,6 +54,11 @@ class Homesick
29
54
  system "git submodule --quiet update >/dev/null 2>&1" unless options[:pretend]
30
55
  end
31
56
 
57
+ def git_pull(config = {})
58
+ say_status 'git pull', '', :green unless options[:quiet]
59
+ system "git pull --quiet" unless options[:pretend]
60
+ end
61
+
32
62
  def ln_s(source, destination, config = {})
33
63
  source = Pathname.new(source)
34
64
  destination = Pathname.new(destination)
@@ -11,10 +11,11 @@ describe Homesick do
11
11
  somewhere.directory('wtf')
12
12
  wtf = somewhere + 'wtf'
13
13
 
14
- @homesick.should_receive(:ln_s).with(wtf.to_s, wtf.basename.to_s)
14
+ @homesick.should_receive(:ln_s).with(wtf.to_s, wtf.basename)
15
15
 
16
16
  @homesick.clone wtf.to_s
17
17
  end
18
+
18
19
  it "should clone git repo like git://host/path/to.git" do
19
20
  @homesick.should_receive(:git_clone).with('git://github.com/technicalpickles/pickled-vim.git')
20
21
 
@@ -34,7 +35,7 @@ describe Homesick do
34
35
  end
35
36
 
36
37
  it "should clone a github repo" do
37
- @homesick.should_receive(:git_clone).with('git://github.com/wfarr/dotfiles.git', :destination => 'wfarr/dotfiles')
38
+ @homesick.should_receive(:git_clone).with('git://github.com/wfarr/dotfiles.git', :destination => Pathname.new('wfarr/dotfiles'))
38
39
 
39
40
  @homesick.clone "wfarr/dotfiles"
40
41
  end
@@ -51,9 +52,17 @@ describe Homesick do
51
52
  system "git remote add origin git://github.com/technicalpickles/zomg.git >/dev/null 2>&1"
52
53
  end
53
54
  end
55
+
56
+ repos_dir.directory 'wtf/zomg' do |zomg|
57
+ Dir.chdir do
58
+ system "git init >/dev/null 2>&1"
59
+ system "git remote add origin git://github.com/technicalpickles/zomg.git >/dev/null 2>&1"
60
+ end
61
+ end
54
62
  end
55
63
 
56
64
  @homesick.should_receive(:say_status).with("zomg", "git://github.com/technicalpickles/zomg.git", :cyan)
65
+ @homesick.should_receive(:say_status).with("wtf/zomg", "git://github.com/technicalpickles/zomg.git", :cyan)
57
66
 
58
67
  @homesick.list
59
68
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 4
7
+ - 5
8
8
  - 1
9
- version: 0.4.1
9
+ version: 0.5.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Joshua Nichols
@@ -14,37 +14,36 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-02 00:00:00 -04:00
17
+ date: 2010-05-18 00:00:00 -04:00
18
18
  default_executable: homesick
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: thor
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ type: :runtime
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
23
  requirements:
25
24
  - - ">="
26
25
  - !ruby/object:Gem::Version
27
26
  segments:
28
27
  - 0
29
28
  version: "0"
30
- type: :runtime
31
- version_requirements: *id001
32
- - !ruby/object:Gem::Dependency
33
- name: rake
29
+ name: thor
30
+ requirement: *id001
34
31
  prerelease: false
35
- requirement: &id002 !ruby/object:Gem::Requirement
32
+ - !ruby/object:Gem::Dependency
33
+ type: :development
34
+ version_requirements: &id002 !ruby/object:Gem::Requirement
36
35
  requirements:
37
36
  - - ">="
38
37
  - !ruby/object:Gem::Version
39
38
  segments:
40
39
  - 0
41
40
  version: "0"
42
- type: :development
43
- version_requirements: *id002
44
- - !ruby/object:Gem::Dependency
45
- name: rspec
41
+ name: rake
42
+ requirement: *id002
46
43
  prerelease: false
47
- requirement: &id003 !ruby/object:Gem::Requirement
44
+ - !ruby/object:Gem::Dependency
45
+ type: :development
46
+ version_requirements: &id003 !ruby/object:Gem::Requirement
48
47
  requirements:
49
48
  - - ">="
50
49
  - !ruby/object:Gem::Version
@@ -53,12 +52,12 @@ dependencies:
53
52
  - 2
54
53
  - 9
55
54
  version: 1.2.9
56
- type: :development
57
- version_requirements: *id003
58
- - !ruby/object:Gem::Dependency
59
- name: bundler
55
+ name: rspec
56
+ requirement: *id003
60
57
  prerelease: false
61
- requirement: &id004 !ruby/object:Gem::Requirement
58
+ - !ruby/object:Gem::Dependency
59
+ type: :development
60
+ version_requirements: &id004 !ruby/object:Gem::Requirement
62
61
  requirements:
63
62
  - - ">="
64
63
  - !ruby/object:Gem::Version
@@ -67,12 +66,12 @@ dependencies:
67
66
  - 9
68
67
  - 5
69
68
  version: 0.9.5
70
- type: :development
71
- version_requirements: *id004
72
- - !ruby/object:Gem::Dependency
73
- name: jeweler
69
+ name: bundler
70
+ requirement: *id004
74
71
  prerelease: false
75
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ - !ruby/object:Gem::Dependency
73
+ type: :development
74
+ version_requirements: &id005 !ruby/object:Gem::Requirement
76
75
  requirements:
77
76
  - - ">="
78
77
  - !ruby/object:Gem::Version
@@ -81,32 +80,33 @@ dependencies:
81
80
  - 4
82
81
  - 0
83
82
  version: 1.4.0
84
- type: :development
85
- version_requirements: *id005
86
- - !ruby/object:Gem::Dependency
87
- name: rcov
83
+ name: jeweler
84
+ requirement: *id005
88
85
  prerelease: false
89
- requirement: &id006 !ruby/object:Gem::Requirement
86
+ - !ruby/object:Gem::Dependency
87
+ type: :development
88
+ version_requirements: &id006 !ruby/object:Gem::Requirement
90
89
  requirements:
91
90
  - - ">="
92
91
  - !ruby/object:Gem::Version
93
92
  segments:
94
93
  - 0
95
94
  version: "0"
96
- type: :development
97
- version_requirements: *id006
98
- - !ruby/object:Gem::Dependency
99
- name: test-construct
95
+ name: rcov
96
+ requirement: *id006
100
97
  prerelease: false
101
- requirement: &id007 !ruby/object:Gem::Requirement
98
+ - !ruby/object:Gem::Dependency
99
+ type: :development
100
+ version_requirements: &id007 !ruby/object:Gem::Requirement
102
101
  requirements:
103
102
  - - ">="
104
103
  - !ruby/object:Gem::Version
105
104
  segments:
106
105
  - 0
107
106
  version: "0"
108
- type: :development
109
- version_requirements: *id007
107
+ name: test-construct
108
+ requirement: *id007
109
+ prerelease: false
110
110
  description: "\n A man\xE2\x80\x99s home (directory) is his castle, so don\xE2\x80\x99t 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 "
111
111
  email: josh@technicalpickles.com
112
112
  executables: