diff --git a/.rspec b/.rspec new file mode 100644 index 0000000..4e1e0d2 --- /dev/null +++ b/.rspec @@ -0,0 +1 @@ +--color 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/Gemfile b/Gemfile index 8210f97..bb0c7b0 100644 --- a/Gemfile +++ b/Gemfile @@ -7,9 +7,10 @@ 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" + gem "ruby-debug" end diff --git a/Gemfile.lock b/Gemfile.lock index 6be927c..36fab0c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,14 +1,29 @@ GEM remote: http://rubygems.org/ specs: + columnize (0.3.2) + 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 + linecache (0.43) 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) + 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) @@ -16,10 +31,11 @@ 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) + ruby-debug test-construct thor (>= 0.14.0) 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 diff --git a/Rakefile b/Rakefile index 7ca7a16..40254bf 100644 --- a/Rakefile +++ b/Rakefile @@ -22,7 +22,8 @@ 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.7.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 @@ -30,18 +31,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/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 diff --git a/lib/homesick.rb b/lib/homesick.rb index 13976d5..84ce84c 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 @@ -60,14 +65,17 @@ 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| + shell.say castle.to_s.gsub(repos_dir.to_s + '/', '') + ':' + update_castle castle + end + else + update_castle name end + end desc "symlink NAME", "Symlinks all dotfiles from the specified castle" @@ -107,12 +115,8 @@ 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 - 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 @@ -159,4 +163,29 @@ 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) + 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 + 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 diff --git a/spec/homesick_spec.rb b/spec/homesick_spec.rb index d7b15d3..222f7de 100644 --- a/spec/homesick_spec.rb +++ b/spec/homesick_spec.rb @@ -1,19 +1,42 @@ require 'spec_helper' -describe Homesick do +describe "homesick" do before do @homesick = Homesick.new 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 @@ -91,6 +114,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' 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