16 Commits

Author SHA1 Message Date
Josh Nichols
a03e580b36 Regenerate gemspec for version 0.7.0 2012-05-28 15:02:10 -04:00
Josh Nichols
79e982d198 Update jeweler to a non-prelease 2012-05-28 15:01:25 -04:00
Josh Nichols
453bd8fc04 Add link to homeshick. 2012-05-28 15:58:08 -03:00
Josh Nichols
f0c947a50b Version bump to 0.7.0, and catch up on ChangeLog. 2011-05-30 21:22:21 -04:00
Josh Nichols
e19617be2f Don't try to symlink a castle to itself. Fixes #14 2011-05-30 21:04:41 -04:00
Josh Nichols
54697866f5 Add ruby-debug as a development dependency. 2011-05-30 21:03:34 -04:00
Josh Nichols
8c1f0bd05c Add placeholder specs to fill out eventually. 2011-05-30 20:14:04 -04:00
Ilkka Laukkanen
c3999f92b1 Print each castle's name when pulling all castles 2011-04-27 21:51:08 +03:00
Ilkka Laukkanen
c3f6bef152 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.
2011-04-27 21:39:02 +03:00
Ilkka Laukkanen
c870bfe442 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.
2011-04-27 21:01:29 +03:00
Sam Whitlock
06846afa77 Fixed minor spelling error in README 2011-03-02 08:22:21 -05:00
Joshua Nichols
944988cb63 Regenerate gemspec for version 0.6.1 2010-11-13 14:05:24 -06:00
Joshua Nichols
6cd51597a3 Version bump to 0.6.1. 2010-11-13 13:59:34 -06:00
Joshua Nichols
6209080e0c Remove debug code. 2010-11-13 13:57:55 -06:00
Joshua Nichols
4a7e369c36 Add license. 2010-11-13 13:51:22 -06:00
Joshua Nichols
984da79210 Update to rspec 2.1.0. 2010-11-13 13:49:21 -06:00
10 changed files with 163 additions and 74 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,9 @@ 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 "jeweler", ">= 1.6.2"
gem "jeweler", ">= 1.5.0.pre2"
gem "rcov", ">= 0" gem "rcov", ">= 0"
gem "test-construct" gem "test-construct"
gem "ruby-debug"
end end

View File

@@ -1,25 +1,40 @@
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.6.2)
bundler (~> 1.0.0) bundler (~> 1.0)
git (>= 1.2.5) git (>= 1.2.5)
rake rake
rake (0.8.7) linecache (0.43)
rcov (0.9.8) rake (0.9.2)
rspec (1.3.0) rcov (0.9.9)
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.6)
PLATFORMS PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
bundler (>= 0.9.5) jeweler (>= 1.6.2)
jeweler (>= 1.5.0.pre2)
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
@@ -45,6 +45,10 @@ Not sure what else homesick has up its sleeve? There's always the built in help:
* Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull) * Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
* Send me a pull request. Bonus points for topic branches. * Send me a pull request. Bonus points for topic branches.
## Need homesick without the ruby dependency?
Check out [homeshick](https://github.com/andsens/homeshick).
## Copyright ## Copyright
Copyright (c) 2010 Joshua Nichols. See LICENSE for details. Copyright (c) 2010 Joshua Nichols. See LICENSE for details.

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

@@ -1,23 +1,17 @@
# Generated by jeweler # Generated by jeweler
# DO NOT EDIT THIS FILE DIRECTLY # DO NOT EDIT THIS FILE DIRECTLY
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
Gem::Specification.new do |s| Gem::Specification.new do |s|
s.name = %q{homesick} s.name = "homesick"
s.version = "0.6.0" s.version = "0.7.0"
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 = "2012-05-28"
s.default_executable = %q{homesick} 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 "
s.description = %q{ s.email = "josh@technicalpickles.com"
A man's home (directory) is his castle, so don't leave home with out it.
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.
}
s.email = %q{josh@technicalpickles.com}
s.executables = ["homesick"] s.executables = ["homesick"]
s.extra_rdoc_files = [ s.extra_rdoc_files = [
"ChangeLog.markdown", "ChangeLog.markdown",
@@ -26,7 +20,7 @@ Gem::Specification.new do |s|
] ]
s.files = [ s.files = [
".document", ".document",
".gitignore", ".rspec",
"ChangeLog.markdown", "ChangeLog.markdown",
"Gemfile", "Gemfile",
"Gemfile.lock", "Gemfile.lock",
@@ -42,44 +36,40 @@ Gem::Specification.new do |s|
"spec/spec.opts", "spec/spec.opts",
"spec/spec_helper.rb" "spec/spec_helper.rb"
] ]
s.homepage = %q{http://github.com/technicalpickles/homesick} s.homepage = "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 = "1.8.15"
s.summary = %q{A man's home is his castle. Never leave your dotfiles behind.} s.summary = "A man's home is his castle. Never leave your dotfiles behind."
s.test_files = [
"spec/homesick_spec.rb",
"spec/spec_helper.rb"
]
if s.respond_to? :specification_version then if s.respond_to? :specification_version then
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
s.specification_version = 3 s.specification_version = 3
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<jeweler>, [">= 1.6.2"])
s.add_development_dependency(%q<jeweler>, [">= 1.5.0.pre2"])
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"])
s.add_development_dependency(%q<ruby-debug>, [">= 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<jeweler>, [">= 1.6.2"])
s.add_dependency(%q<jeweler>, [">= 1.5.0.pre2"])
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"])
s.add_dependency(%q<ruby-debug>, [">= 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<jeweler>, [">= 1.6.2"])
s.add_dependency(%q<jeweler>, [">= 1.5.0.pre2"])
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"])
s.add_dependency(%q<ruby-debug>, [">= 0"])
end end
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