Merge branch 'master' of git://github.com/technicalpickles/homesick

This commit is contained in:
Jorge Dias
2011-05-31 14:09:35 +02:00
10 changed files with 150 additions and 52 deletions

1
.rspec Normal file
View File

@@ -0,0 +1 @@
--color

View File

@@ -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 # 0.5.0
* Fixed listing of castles cloned using `homesick clone <github-user>/<github-repo>` (issue 3) * Fixed listing of castles cloned using `homesick clone <github-user>/<github-repo>` (issue 3)

View File

@@ -7,9 +7,10 @@ gem "thor", ">= 0.14.0"
# Include everything needed to run rake, tests, features, etc. # Include everything needed to run rake, tests, features, etc.
group :development do group :development do
gem "rake" gem "rake"
gem "rspec", ">= 1.2.9" gem "rspec", "~> 2.1.0"
gem "bundler", ">= 0.9.5" gem "bundler", "~> 1.0.0"
gem "jeweler", ">= 1.5.0.pre2" gem "jeweler", ">= 1.5.0.pre6"
gem "rcov", ">= 0" gem "rcov", ">= 0"
gem "test-construct" gem "test-construct"
gem "ruby-debug"
end end

View File

@@ -1,14 +1,29 @@
GEM GEM
remote: http://rubygems.org/ remote: http://rubygems.org/
specs: specs:
columnize (0.3.2)
diff-lcs (1.1.2)
git (1.2.5) git (1.2.5)
jeweler (1.5.0.pre3) jeweler (1.5.0.pre6)
bundler (~> 1.0.0) bundler (~> 1.0.0)
git (>= 1.2.5) git (>= 1.2.5)
rake rake
linecache (0.43)
rake (0.8.7) rake (0.8.7)
rcov (0.9.8) 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) test-construct (1.2.0)
thor (0.14.0) thor (0.14.0)
@@ -16,10 +31,11 @@ PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
bundler (>= 0.9.5) bundler (~> 1.0.0)
jeweler (>= 1.5.0.pre2) jeweler (>= 1.5.0.pre6)
rake rake
rcov rcov
rspec (>= 1.2.9) rspec (~> 2.1.0)
ruby-debug
test-construct test-construct
thor (>= 0.14.0) thor (>= 0.14.0)

View File

@@ -25,7 +25,7 @@ With the castle cloned, you can now link its contents into your home dir:
homesick symlink pickled-vim 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 homesick symlink technicalpickles/pickled-vim

View File

@@ -22,7 +22,8 @@ Jeweler::Tasks.new do |gem|
gem.email = "josh@technicalpickles.com" gem.email = "josh@technicalpickles.com"
gem.homepage = "http://github.com/technicalpickles/homesick" gem.homepage = "http://github.com/technicalpickles/homesick"
gem.authors = ["Joshua Nichols"] gem.authors = ["Joshua Nichols"]
gem.version = "0.6.0" gem.version = "0.7.0"
gem.license = "MIT"
# Have dependencies? Add them to Gemfile # Have dependencies? Add them to Gemfile
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
@@ -30,18 +31,17 @@ end
Jeweler::GemcutterTasks.new Jeweler::GemcutterTasks.new
require 'spec/rake/spectask' require 'rspec/core/rake_task'
Spec::Rake::SpecTask.new(:spec) do |spec| RSpec::Core::RakeTask.new(:spec) do |spec|
spec.libs << 'lib' << 'spec' spec.pattern = FileList['spec/**/*_spec.rb']
spec.spec_files = FileList['spec/**/*_spec.rb']
end end
Spec::Rake::SpecTask.new(:rcov) do |spec| RSpec::Core::RakeTask.new(:rcov) do |spec|
spec.libs << 'lib' << 'spec'
spec.pattern = 'spec/**/*_spec.rb' spec.pattern = 'spec/**/*_spec.rb'
spec.rcov = true spec.rcov = true
end end
task :default => :spec task :default => :spec
require 'rake/rdoctask' require 'rake/rdoctask'

View File

@@ -5,11 +5,11 @@
Gem::Specification.new do |s| Gem::Specification.new do |s|
s.name = %q{homesick} 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.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["Joshua Nichols"] s.authors = ["Joshua Nichols"]
s.date = %q{2010-10-27} s.date = %q{2010-11-13}
s.default_executable = %q{homesick} s.default_executable = %q{homesick}
s.description = %q{ s.description = %q{
A man's home (directory) is his castle, so don't leave home with out it. 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 = [ s.files = [
".document", ".document",
".gitignore", ".rspec",
"ChangeLog.markdown", "ChangeLog.markdown",
"Gemfile", "Gemfile",
"Gemfile.lock", "Gemfile.lock",
@@ -43,6 +43,7 @@ Gem::Specification.new do |s|
"spec/spec_helper.rb" "spec/spec_helper.rb"
] ]
s.homepage = %q{http://github.com/technicalpickles/homesick} s.homepage = %q{http://github.com/technicalpickles/homesick}
s.licenses = ["MIT"]
s.require_paths = ["lib"] s.require_paths = ["lib"]
s.rubygems_version = %q{1.3.7} s.rubygems_version = %q{1.3.7}
s.summary = %q{A man's home is his castle. Never leave your dotfiles behind.} 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 if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<thor>, [">= 0.14.0"]) s.add_runtime_dependency(%q<thor>, [">= 0.14.0"])
s.add_development_dependency(%q<rake>, [">= 0"]) s.add_development_dependency(%q<rake>, [">= 0"])
s.add_development_dependency(%q<rspec>, [">= 1.2.9"]) s.add_development_dependency(%q<rspec>, ["~> 2.1.0"])
s.add_development_dependency(%q<bundler>, [">= 0.9.5"]) s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
s.add_development_dependency(%q<jeweler>, [">= 1.5.0.pre2"]) s.add_development_dependency(%q<jeweler>, [">= 1.5.0.pre6"])
s.add_development_dependency(%q<rcov>, [">= 0"]) s.add_development_dependency(%q<rcov>, [">= 0"])
s.add_development_dependency(%q<test-construct>, [">= 0"]) s.add_development_dependency(%q<test-construct>, [">= 0"])
else else
s.add_dependency(%q<thor>, [">= 0.14.0"]) s.add_dependency(%q<thor>, [">= 0.14.0"])
s.add_dependency(%q<rake>, [">= 0"]) s.add_dependency(%q<rake>, [">= 0"])
s.add_dependency(%q<rspec>, [">= 1.2.9"]) s.add_dependency(%q<rspec>, ["~> 2.1.0"])
s.add_dependency(%q<bundler>, [">= 0.9.5"]) s.add_dependency(%q<bundler>, ["~> 1.0.0"])
s.add_dependency(%q<jeweler>, [">= 1.5.0.pre2"]) s.add_dependency(%q<jeweler>, [">= 1.5.0.pre6"])
s.add_dependency(%q<rcov>, [">= 0"]) s.add_dependency(%q<rcov>, [">= 0"])
s.add_dependency(%q<test-construct>, [">= 0"]) s.add_dependency(%q<test-construct>, [">= 0"])
end end
else else
s.add_dependency(%q<thor>, [">= 0.14.0"]) s.add_dependency(%q<thor>, [">= 0.14.0"])
s.add_dependency(%q<rake>, [">= 0"]) s.add_dependency(%q<rake>, [">= 0"])
s.add_dependency(%q<rspec>, [">= 1.2.9"]) s.add_dependency(%q<rspec>, ["~> 2.1.0"])
s.add_dependency(%q<bundler>, [">= 0.9.5"]) s.add_dependency(%q<bundler>, ["~> 1.0.0"])
s.add_dependency(%q<jeweler>, [">= 1.5.0.pre2"]) s.add_dependency(%q<jeweler>, [">= 1.5.0.pre6"])
s.add_dependency(%q<rcov>, [">= 0"]) s.add_dependency(%q<rcov>, [">= 0"])
s.add_dependency(%q<test-construct>, [">= 0"]) s.add_dependency(%q<test-construct>, [">= 0"])
end end

View File

@@ -21,7 +21,12 @@ class Homesick < Thor
inside repos_dir do inside repos_dir do
destination = nil destination = nil
if File.exist?(uri) 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 ln_s uri, destination
elsif uri =~ GITHUB_NAME_REPO_PATTERN elsif uri =~ GITHUB_NAME_REPO_PATTERN
@@ -60,14 +65,17 @@ class Homesick < Thor
end end
desc "pull NAME", "Update the specified castle" desc "pull NAME", "Update the specified castle"
def pull(name) method_option :all, :type => :boolean, :default => false, :required => false, :desc => "Update all cloned castles"
check_castle_existance(name, "pull") def pull(name="")
if options[:all]
inside repos_dir.join(name) do inside_each_castle do |castle|
git_pull shell.say castle.to_s.gsub(repos_dir.to_s + '/', '') + ':'
git_submodule_init update_castle castle
git_submodule_update end
else
update_castle name
end end
end end
desc "symlink NAME", "Symlinks all dotfiles from the specified castle" desc "symlink NAME", "Symlinks all dotfiles from the specified castle"
@@ -107,12 +115,8 @@ class Homesick < Thor
desc "list", "List cloned castles" desc "list", "List cloned castles"
def list def list
#require 'ruby-debug'; breakpoint inside_each_castle do |castle|
Pathname.glob("#{repos_dir}/**/*/.git") do |git_dir| say_status castle.relative_path_from(repos_dir), `git config remote.origin.url`.chomp, :cyan
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
end end
end end
@@ -159,4 +163,29 @@ class Homesick < Thor
end end
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 end

View File

@@ -1,19 +1,42 @@
require 'spec_helper' require 'spec_helper'
describe Homesick do describe "homesick" do
before do before do
@homesick = Homesick.new @homesick = Homesick.new
end end
describe "clone" do describe "clone" do
it "should symlink existing directories" do context "of a file" do
somewhere = create_construct it "should symlink existing directories" do
somewhere.directory('wtf') somewhere = create_construct
wtf = somewhere + 'wtf' 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 end
it "should clone git repo like git://host/path/to.git" do it "should clone git repo like git://host/path/to.git" do
@@ -91,6 +114,16 @@ describe Homesick do
end end
end end
describe "pull" do
xit "needs testing"
describe "--all" do
xit "needs testing"
end
end
describe "track" do describe "track" do
it "should move the tracked file into the castle" do it "should move the tracked file into the castle" do
some_rc_file = @user_dir.file '.some_rc_file' some_rc_file = @user_dir.file '.some_rc_file'

View File

@@ -1,11 +1,11 @@
$LOAD_PATH.unshift(File.dirname(__FILE__)) $LOAD_PATH.unshift(File.dirname(__FILE__))
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
require 'homesick' require 'homesick'
require 'spec' require 'rspec'
require 'spec/autorun' require 'rspec/autorun'
require 'construct' require 'construct'
Spec::Runner.configure do |config| Rspec.configure do |config|
config.include Construct::Helpers config.include Construct::Helpers
config.before do config.before do