From 984da79210890010b95e0c245c4aff8d624fbb26 Mon Sep 17 00:00:00 2001 From: Joshua Nichols Date: Sat, 13 Nov 2010 13:49:21 -0600 Subject: [PATCH 01/13] Update to rspec 2.1.0. --- .rspec | 1 + Gemfile | 6 +++--- Gemfile.lock | 18 +++++++++++++----- Rakefile | 11 +++++------ spec/spec_helper.rb | 6 +++--- 5 files changed, 25 insertions(+), 17 deletions(-) create mode 100644 .rspec diff --git a/.rspec b/.rspec new file mode 100644 index 0000000..4e1e0d2 --- /dev/null +++ b/.rspec @@ -0,0 +1 @@ +--color diff --git a/Gemfile b/Gemfile index 8210f97..b2b1830 100644 --- a/Gemfile +++ b/Gemfile @@ -7,9 +7,9 @@ gem "thor", ">= 0.14.0" # Include everything needed to run rake, tests, features, etc. group :development do gem "rake" - gem "rspec", ">= 1.2.9" - gem "bundler", ">= 0.9.5" - gem "jeweler", ">= 1.5.0.pre2" + gem "rspec", "~> 2.1.0" + gem "bundler", "~> 1.0.0" + gem "jeweler", ">= 1.5.0.pre6" gem "rcov", ">= 0" gem "test-construct" end diff --git a/Gemfile.lock b/Gemfile.lock index 6be927c..517dcb5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,14 +1,22 @@ GEM remote: http://rubygems.org/ specs: + diff-lcs (1.1.2) git (1.2.5) - jeweler (1.5.0.pre3) + jeweler (1.5.0.pre6) bundler (~> 1.0.0) git (>= 1.2.5) rake rake (0.8.7) rcov (0.9.8) - rspec (1.3.0) + rspec (2.1.0) + rspec-core (~> 2.1.0) + rspec-expectations (~> 2.1.0) + rspec-mocks (~> 2.1.0) + rspec-core (2.1.0) + rspec-expectations (2.1.0) + diff-lcs (~> 1.1.2) + rspec-mocks (2.1.0) test-construct (1.2.0) thor (0.14.0) @@ -16,10 +24,10 @@ PLATFORMS ruby DEPENDENCIES - bundler (>= 0.9.5) - jeweler (>= 1.5.0.pre2) + bundler (~> 1.0.0) + jeweler (>= 1.5.0.pre6) rake rcov - rspec (>= 1.2.9) + rspec (~> 2.1.0) test-construct thor (>= 0.14.0) diff --git a/Rakefile b/Rakefile index 7ca7a16..8b7b576 100644 --- a/Rakefile +++ b/Rakefile @@ -30,18 +30,17 @@ end Jeweler::GemcutterTasks.new -require 'spec/rake/spectask' -Spec::Rake::SpecTask.new(:spec) do |spec| - spec.libs << 'lib' << 'spec' - spec.spec_files = FileList['spec/**/*_spec.rb'] +require 'rspec/core/rake_task' +RSpec::Core::RakeTask.new(:spec) do |spec| + spec.pattern = FileList['spec/**/*_spec.rb'] end -Spec::Rake::SpecTask.new(:rcov) do |spec| - spec.libs << 'lib' << 'spec' +RSpec::Core::RakeTask.new(:rcov) do |spec| spec.pattern = 'spec/**/*_spec.rb' spec.rcov = true end + task :default => :spec require 'rake/rdoctask' diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 57ef7c8..f34d912 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,11 +1,11 @@ $LOAD_PATH.unshift(File.dirname(__FILE__)) $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require 'homesick' -require 'spec' -require 'spec/autorun' +require 'rspec' +require 'rspec/autorun' require 'construct' -Spec::Runner.configure do |config| +Rspec.configure do |config| config.include Construct::Helpers config.before do From 4a7e369c368379ae0be9db5bc347f31e4308dfae Mon Sep 17 00:00:00 2001 From: Joshua Nichols Date: Sat, 13 Nov 2010 13:51:22 -0600 Subject: [PATCH 02/13] Add license. --- Rakefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Rakefile b/Rakefile index 8b7b576..ed6610b 100644 --- a/Rakefile +++ b/Rakefile @@ -23,6 +23,7 @@ Jeweler::Tasks.new do |gem| gem.homepage = "http://github.com/technicalpickles/homesick" gem.authors = ["Joshua Nichols"] gem.version = "0.6.0" + gem.license = "MIT" # Have dependencies? Add them to Gemfile # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings From 6209080e0c8fcb479d3b0a8feed2a7c123c680c5 Mon Sep 17 00:00:00 2001 From: Joshua Nichols Date: Sat, 13 Nov 2010 13:57:55 -0600 Subject: [PATCH 03/13] Remove debug code. --- lib/homesick.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/homesick.rb b/lib/homesick.rb index f439542..f12ebca 100644 --- a/lib/homesick.rb +++ b/lib/homesick.rb @@ -107,7 +107,6 @@ class Homesick < Thor desc "list", "List cloned castles" def list - #require 'ruby-debug'; breakpoint Pathname.glob("#{repos_dir}/**/*/.git") do |git_dir| castle = git_dir.dirname Dir.chdir castle do # so we can call git config from the right contxt From 6cd51597a3fba94c9da25bae6295dacd616e72db Mon Sep 17 00:00:00 2001 From: Joshua Nichols Date: Sat, 13 Nov 2010 13:59:34 -0600 Subject: [PATCH 04/13] Version bump to 0.6.1. --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index ed6610b..1cb303d 100644 --- a/Rakefile +++ b/Rakefile @@ -22,7 +22,7 @@ Jeweler::Tasks.new do |gem| gem.email = "josh@technicalpickles.com" gem.homepage = "http://github.com/technicalpickles/homesick" gem.authors = ["Joshua Nichols"] - gem.version = "0.6.0" + gem.version = "0.6.1" gem.license = "MIT" # Have dependencies? Add them to Gemfile From 944988cb635d9e12a0b7b5734de3732af2085e59 Mon Sep 17 00:00:00 2001 From: Joshua Nichols Date: Sat, 13 Nov 2010 14:05:24 -0600 Subject: [PATCH 05/13] Regenerate gemspec for version 0.6.1 --- homesick.gemspec | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/homesick.gemspec b/homesick.gemspec index f83b4eb..31efe70 100644 --- a/homesick.gemspec +++ b/homesick.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{homesick} - s.version = "0.6.0" + s.version = "0.6.1" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Joshua Nichols"] - s.date = %q{2010-10-27} + s.date = %q{2010-11-13} s.default_executable = %q{homesick} s.description = %q{ A man's home (directory) is his castle, so don't leave home with out it. @@ -26,7 +26,7 @@ Gem::Specification.new do |s| ] s.files = [ ".document", - ".gitignore", + ".rspec", "ChangeLog.markdown", "Gemfile", "Gemfile.lock", @@ -43,6 +43,7 @@ Gem::Specification.new do |s| "spec/spec_helper.rb" ] s.homepage = %q{http://github.com/technicalpickles/homesick} + s.licenses = ["MIT"] s.require_paths = ["lib"] s.rubygems_version = %q{1.3.7} s.summary = %q{A man's home is his castle. Never leave your dotfiles behind.} @@ -58,26 +59,26 @@ Gem::Specification.new do |s| if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, [">= 0.14.0"]) s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 1.2.9"]) - s.add_development_dependency(%q, [">= 0.9.5"]) - s.add_development_dependency(%q, [">= 1.5.0.pre2"]) + s.add_development_dependency(%q, ["~> 2.1.0"]) + s.add_development_dependency(%q, ["~> 1.0.0"]) + s.add_development_dependency(%q, [">= 1.5.0.pre6"]) s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0.14.0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 1.2.9"]) - s.add_dependency(%q, [">= 0.9.5"]) - s.add_dependency(%q, [">= 1.5.0.pre2"]) + s.add_dependency(%q, ["~> 2.1.0"]) + s.add_dependency(%q, ["~> 1.0.0"]) + s.add_dependency(%q, [">= 1.5.0.pre6"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0.14.0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 1.2.9"]) - s.add_dependency(%q, [">= 0.9.5"]) - s.add_dependency(%q, [">= 1.5.0.pre2"]) + s.add_dependency(%q, ["~> 2.1.0"]) + s.add_dependency(%q, ["~> 1.0.0"]) + s.add_dependency(%q, [">= 1.5.0.pre6"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end From 06846afa770c4c26639f21a718370d02ba1beb3f Mon Sep 17 00:00:00 2001 From: Sam Whitlock Date: Tue, 22 Feb 2011 11:28:04 -0800 Subject: [PATCH 06/13] Fixed minor spelling error in README --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 5e5f227..6e3ee5b 100644 --- a/README.markdown +++ b/README.markdown @@ -25,7 +25,7 @@ With the castle cloned, you can now link its contents into your home dir: homesick symlink pickled-vim -If uou use the shorthand syntax for GitHub repositories in your clone, please note you will instead need to run: +If you use the shorthand syntax for GitHub repositories in your clone, please note you will instead need to run: homesick symlink technicalpickles/pickled-vim From c870bfe442bd81f2c5787a3ba4117b4931fedc5e Mon Sep 17 00:00:00 2001 From: Ilkka Laukkanen Date: Wed, 27 Apr 2011 21:01:29 +0300 Subject: [PATCH 07/13] Add --all option to pull to update all castles Abstracted the logic for doing some operation for all castles into Homesick.inside_each_castle() which takes a block argument. Homesick.list() is also reimplemented to use this new method, because that's where the logic was stolen from. The actual updating is also moved to the private method update_castle() to make pull() shorter. --- lib/homesick.rb | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/homesick.rb b/lib/homesick.rb index f12ebca..9733d37 100644 --- a/lib/homesick.rb +++ b/lib/homesick.rb @@ -60,14 +60,16 @@ class Homesick < Thor end desc "pull NAME", "Update the specified castle" - def pull(name) - check_castle_existance(name, "pull") - - inside repos_dir.join(name) do - git_pull - git_submodule_init - git_submodule_update + method_option :all, :type => :boolean, :default => false, :required => false, :desc => "Update all cloned castles" + def pull(name="") + if options[:all] + inside_each_castle do |castle| + update_castle castle + end + else + update_castle name end + end desc "symlink NAME", "Symlinks all dotfiles from the specified castle" @@ -107,11 +109,8 @@ class Homesick < Thor desc "list", "List cloned castles" def list - Pathname.glob("#{repos_dir}/**/*/.git") do |git_dir| - castle = git_dir.dirname - Dir.chdir castle do # so we can call git config from the right contxt - say_status castle.relative_path_from(repos_dir), `git config remote.origin.url`.chomp, :cyan - end + inside_each_castle do |castle| + say_status castle.relative_path_from(repos_dir), `git config remote.origin.url`.chomp, :cyan end end @@ -158,4 +157,21 @@ class Homesick < Thor end end + def inside_each_castle(&block) + Pathname.glob("#{repos_dir}/**/*/.git") do |git_dir| + castle = git_dir.dirname + Dir.chdir castle do # so we can call git config from the right contxt + yield castle + end + end + end + + def update_castle(castle) + check_castle_existance(castle, "pull") + inside repos_dir.join(castle) do + git_pull + git_submodule_init + git_submodule_update + end + end end From c3f6bef15256a059dde20d36c10fee80886669f4 Mon Sep 17 00:00:00 2001 From: Ilkka Laukkanen Date: Wed, 27 Apr 2011 21:39:02 +0300 Subject: [PATCH 08/13] Don't treat git repos in other repos as castles Further abstracted locating castles into Homesick.all_castles which globs as before, but after that rejects any paths that lie in other paths. This way castles that have submodules don't cause extra output in e.g. list. --- lib/homesick.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/homesick.rb b/lib/homesick.rb index 9733d37..7a96695 100644 --- a/lib/homesick.rb +++ b/lib/homesick.rb @@ -157,8 +157,16 @@ class Homesick < Thor end end + def all_castles + dirs = Pathname.glob("#{repos_dir}/**/*/.git") + # reject paths that lie inside another castle, like git submodules + return dirs.reject do |dir| + dirs.any? {|other| dir != other && dir.fnmatch(other.parent.join('*').to_s) } + end + end + def inside_each_castle(&block) - Pathname.glob("#{repos_dir}/**/*/.git") do |git_dir| + all_castles.each do |git_dir| castle = git_dir.dirname Dir.chdir castle do # so we can call git config from the right contxt yield castle From c3999f92b14f6b53c39e65a9965aa7feac92e7d1 Mon Sep 17 00:00:00 2001 From: Ilkka Laukkanen Date: Wed, 27 Apr 2011 21:51:08 +0300 Subject: [PATCH 09/13] Print each castle's name when pulling all castles --- lib/homesick.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/homesick.rb b/lib/homesick.rb index 7a96695..d458686 100644 --- a/lib/homesick.rb +++ b/lib/homesick.rb @@ -64,6 +64,7 @@ class Homesick < Thor def pull(name="") if options[:all] inside_each_castle do |castle| + shell.say castle.to_s.gsub(repos_dir.to_s + '/', '') + ':' update_castle castle end else From 8c1f0bd05c521510799224a6101f6d7420a6ee53 Mon Sep 17 00:00:00 2001 From: Josh Nichols Date: Mon, 30 May 2011 20:14:04 -0400 Subject: [PATCH 10/13] Add placeholder specs to fill out eventually. --- spec/homesick_spec.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/spec/homesick_spec.rb b/spec/homesick_spec.rb index d7b15d3..2d880af 100644 --- a/spec/homesick_spec.rb +++ b/spec/homesick_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Homesick do +describe "homesick" do before do @homesick = Homesick.new end @@ -91,6 +91,16 @@ describe Homesick do end end + describe "pull" do + + xit "needs testing" + + describe "--all" do + xit "needs testing" + end + + end + describe "track" do it "should move the tracked file into the castle" do some_rc_file = @user_dir.file '.some_rc_file' From 54697866f55fd5fcc47c88ed7ef18076f2e13d2d Mon Sep 17 00:00:00 2001 From: Josh Nichols Date: Mon, 30 May 2011 21:03:34 -0400 Subject: [PATCH 11/13] Add ruby-debug as a development dependency. --- Gemfile | 1 + Gemfile.lock | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/Gemfile b/Gemfile index b2b1830..bb0c7b0 100644 --- a/Gemfile +++ b/Gemfile @@ -12,4 +12,5 @@ group :development do gem "jeweler", ">= 1.5.0.pre6" gem "rcov", ">= 0" gem "test-construct" + gem "ruby-debug" end diff --git a/Gemfile.lock b/Gemfile.lock index 517dcb5..36fab0c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,12 +1,14 @@ GEM remote: http://rubygems.org/ specs: + columnize (0.3.2) diff-lcs (1.1.2) git (1.2.5) jeweler (1.5.0.pre6) bundler (~> 1.0.0) git (>= 1.2.5) rake + linecache (0.43) rake (0.8.7) rcov (0.9.8) rspec (2.1.0) @@ -17,6 +19,11 @@ GEM rspec-expectations (2.1.0) diff-lcs (~> 1.1.2) rspec-mocks (2.1.0) + ruby-debug (0.10.4) + columnize (>= 0.1) + ruby-debug-base (~> 0.10.4.0) + ruby-debug-base (0.10.4) + linecache (>= 0.3) test-construct (1.2.0) thor (0.14.0) @@ -29,5 +36,6 @@ DEPENDENCIES rake rcov rspec (~> 2.1.0) + ruby-debug test-construct thor (>= 0.14.0) From e19617be2fe5dc8ea4db9cbc4cb602b33395dd04 Mon Sep 17 00:00:00 2001 From: Josh Nichols Date: Mon, 30 May 2011 21:04:41 -0400 Subject: [PATCH 12/13] Don't try to symlink a castle to itself. Fixes #14 --- lib/homesick.rb | 7 ++++++- spec/homesick_spec.rb | 35 +++++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/lib/homesick.rb b/lib/homesick.rb index d458686..d156226 100644 --- a/lib/homesick.rb +++ b/lib/homesick.rb @@ -21,7 +21,12 @@ class Homesick < Thor inside repos_dir do destination = nil if File.exist?(uri) - destination = Pathname.new(uri).basename + uri = Pathname.new(uri).expand_path + if uri.to_s.start_with?(repos_dir) + raise "Castle already cloned to #{uri}" + end + + destination = uri.basename ln_s uri, destination elsif uri =~ GITHUB_NAME_REPO_PATTERN diff --git a/spec/homesick_spec.rb b/spec/homesick_spec.rb index 2d880af..222f7de 100644 --- a/spec/homesick_spec.rb +++ b/spec/homesick_spec.rb @@ -6,14 +6,37 @@ describe "homesick" do end describe "clone" do - it "should symlink existing directories" do - somewhere = create_construct - somewhere.directory('wtf') - wtf = somewhere + 'wtf' + context "of a file" do + it "should symlink existing directories" do + somewhere = create_construct + somewhere.directory('wtf') + wtf = somewhere + 'wtf' - @homesick.should_receive(:ln_s).with(wtf.to_s, wtf.basename) + @homesick.should_receive(:ln_s).with(wtf, wtf.basename) - @homesick.clone wtf.to_s + @homesick.clone wtf + end + + context "when it exists in a repo directory" do + before do + @repos_dir = create_construct + @existing_dir = @repos_dir.directory('existing_castle') + @homesick.stub!(:repos_dir).and_return(@repos_dir) + end + + it "should not symlink" do + @homesick.should_not_receive(:git_clone) + + @homesick.clone @existing_dir.to_s rescue nil + end + + it "should raise an error" do + @existing_castle = @homesick.send(:repos_dir) + 'existing_castle' + lambda { + @homesick.clone @existing_castle.to_s + }.should raise_error(/already cloned/i) + end + end end it "should clone git repo like git://host/path/to.git" do From f0c947a50ba365699197e8feca3d28350cdfb4cf Mon Sep 17 00:00:00 2001 From: Josh Nichols Date: Mon, 30 May 2011 21:22:21 -0400 Subject: [PATCH 13/13] Version bump to 0.7.0, and catch up on ChangeLog. --- ChangeLog.markdown | 17 +++++++++++++++++ Rakefile | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/ChangeLog.markdown b/ChangeLog.markdown index 8f55f82..63234e3 100644 --- a/ChangeLog.markdown +++ b/ChangeLog.markdown @@ -1,3 +1,20 @@ +# 0.7.0 + * Fixed double-cloning #14 + * New option for pull command: --all + * pulls each castle, instead of just one + +# 0.6.1 + + * Add a license + +# 0.6.0 + + * Introduce .homesickrc + * Castles can now have a .homesickrc inside them + * On clone, this is eval'd inside the destination directory + * Introduce track command + * Allows easily moving an existing file into a castle, and symlinking it back + # 0.5.0 * Fixed listing of castles cloned using `homesick clone /` (issue 3) diff --git a/Rakefile b/Rakefile index 1cb303d..40254bf 100644 --- a/Rakefile +++ b/Rakefile @@ -22,7 +22,7 @@ Jeweler::Tasks.new do |gem| gem.email = "josh@technicalpickles.com" gem.homepage = "http://github.com/technicalpickles/homesick" gem.authors = ["Joshua Nichols"] - gem.version = "0.6.1" + gem.version = "0.7.0" gem.license = "MIT" # Have dependencies? Add them to Gemfile