13 Commits

Author SHA1 Message Date
Joshua Nichols
e1901b3a83 Regenerated gemspec for version 0.4.1 2010-04-02 00:54:20 -04:00
Joshua Nichols
cc39d30f09 Version bump to 0.4.1. 2010-04-02 00:54:04 -04:00
Joshua Nichols
a798f3c562 Add a better error message when a repo's home doesn't exist. 2010-04-02 00:53:17 -04:00
Joshua Nichols
02c3fda939 Regenerated gemspec for version 0.4.0 2010-04-01 22:02:40 -04:00
Joshua Nichols
958ab3e09e Version bump to 0.4.0 2010-04-01 22:02:21 -04:00
Joshua Nichols
c0797dd607 Cloning will now try to init and update git submodules, if they exist. 2010-04-01 21:59:15 -04:00
Joshua Nichols
00b6f9b390 Regenerated gemspec. 2010-04-01 21:23:07 -04:00
Joshua Nichols
9a22513ba4 Allow symlinking existing directories into repos, instead of cloning. 2010-04-01 21:19:25 -04:00
Joshua Nichols
5ac2a0739a Clone github repos into username/repo instead of username_repo, for more consistent use with symlink. 2010-04-01 21:08:36 -04:00
Joshua Nichols
923c634377 Misc cleanup 2010-04-01 21:04:06 -04:00
Joshua Nichols
0579f94430 Moving towards testing list more. 2010-04-01 20:59:24 -04:00
Joshua Nichols
c50464e366 Added more clone specs. 2010-04-01 20:17:47 -04:00
Joshua Nichols
c5f8563f71 Shuffled specs around. 2010-04-01 20:14:29 -04:00
9 changed files with 173 additions and 85 deletions

View File

@@ -1,9 +1,20 @@
# 3.0.0 # 0.4.1
* Improved error message when a castle's home dir doesn't exist
# 0.4.0
* `homesick clone` can now take a path to a directory on the filesystem, which will be symlinked into place
* `homesick clone` now tries to `git submodule init` and `git submodule update` if git submodules are defined for a cloned repo
* Fixed missing dependency on thor and others
* Use HOME environment variable for where to store files, instead of assuming ~
# 0.3.0
* Renamed 'link' to 'symlink' * Renamed 'link' to 'symlink'
* Fixed conflict resolution when symlink destination exists and is a normal file * Fixed conflict resolution when symlink destination exists and is a normal file
# 2.0.0 # 0.2.0
* Better support for recognizing git urls (thanks jacobat!) * Better support for recognizing git urls (thanks jacobat!)
* if it looks like a github user/repo, do that * if it looks like a github user/repo, do that

View File

@@ -12,5 +12,5 @@ group :development do
gem "bundler", ">= 0.9.5" gem "bundler", ">= 0.9.5"
gem "jeweler", ">= 1.4.0" gem "jeweler", ">= 1.4.0"
gem "rcov", ">= 0" gem "rcov", ">= 0"
gem "devver-construct" gem "test-construct"
end end

View File

@@ -22,7 +22,7 @@ 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.3.0" gem.version = "0.4.1"
# 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

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.3.0" s.version = "0.4.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-04-01} s.date = %q{2010-04-02}
s.default_executable = %q{homesick} s.default_executable = %q{homesick}
s.description = %q{ s.description = %q{
A mans home (directory) is his castle, so dont leave home with out it. A mans home (directory) is his castle, so dont leave home with out it.
@@ -37,7 +37,7 @@ Gem::Specification.new do |s|
"lib/homesick.rb", "lib/homesick.rb",
"lib/homesick/actions.rb", "lib/homesick/actions.rb",
"lib/homesick/shell.rb", "lib/homesick/shell.rb",
"spec/homesick/homesick_spec.rb", "spec/homesick_spec.rb",
"spec/spec.opts", "spec/spec.opts",
"spec/spec_helper.rb" "spec/spec_helper.rb"
] ]
@@ -47,7 +47,7 @@ Gem::Specification.new do |s|
s.rubygems_version = %q{1.3.6} s.rubygems_version = %q{1.3.6}
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.}
s.test_files = [ s.test_files = [
"spec/homesick/homesick_spec.rb", "spec/homesick_spec.rb",
"spec/spec_helper.rb" "spec/spec_helper.rb"
] ]
@@ -56,9 +56,30 @@ Gem::Specification.new do |s|
s.specification_version = 3 s.specification_version = 3
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<thor>, [">= 0"])
s.add_development_dependency(%q<rake>, [">= 0"])
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
s.add_development_dependency(%q<bundler>, [">= 0.9.5"])
s.add_development_dependency(%q<jeweler>, [">= 1.4.0"])
s.add_development_dependency(%q<rcov>, [">= 0"])
s.add_development_dependency(%q<test-construct>, [">= 0"])
else else
s.add_dependency(%q<thor>, [">= 0"])
s.add_dependency(%q<rake>, [">= 0"])
s.add_dependency(%q<rspec>, [">= 1.2.9"])
s.add_dependency(%q<bundler>, [">= 0.9.5"])
s.add_dependency(%q<jeweler>, [">= 1.4.0"])
s.add_dependency(%q<rcov>, [">= 0"])
s.add_dependency(%q<test-construct>, [">= 0"])
end end
else else
s.add_dependency(%q<thor>, [">= 0"])
s.add_dependency(%q<rake>, [">= 0"])
s.add_dependency(%q<rspec>, [">= 1.2.9"])
s.add_dependency(%q<bundler>, [">= 0.9.5"])
s.add_dependency(%q<jeweler>, [">= 1.4.0"])
s.add_dependency(%q<rcov>, [">= 0"])
s.add_dependency(%q<test-construct>, [">= 0"])
end end
end end

View File

@@ -9,7 +9,7 @@ class Homesick < Thor
add_runtime_options! add_runtime_options!
GITHUB_NAME_REPO_PATTERN = /\A([A-Za-z_-]+)\/([A-Za-z_-]+)\Z/ GITHUB_NAME_REPO_PATTERN = /\A([A-Za-z_-]+\/[A-Za-z_-]+)\Z/
def initialize(args=[], options={}, config={}) def initialize(args=[], options={}, config={})
super super
@@ -18,31 +18,47 @@ class Homesick < Thor
desc "clone URI", "Clone +uri+ as a castle for homesick" desc "clone URI", "Clone +uri+ as a castle for homesick"
def clone(uri) def clone(uri)
empty_directory repos_dir, :verbose => false
inside repos_dir do inside repos_dir do
if uri =~ GITHUB_NAME_REPO_PATTERN destination = nil
git_clone "git://github.com/#{$1}/#{$2}.git", :destination => "#{$1}_#{$2}" if File.exist?(uri)
destination = Pathname.new(uri).basename
ln_s uri, destination
elsif uri =~ GITHUB_NAME_REPO_PATTERN
destination = Pathname.new($1)
git_clone "git://github.com/#{$1}.git", :destination => destination
else else
if uri =~ /\/([^\/]*).git\Z/
destination = Pathname.new($1)
end
git_clone uri git_clone uri
end end
if destination.join('.gitmodules').exist?
inside destination do
git_submodule_init
git_submodule_update
end
end
end end
end end
desc "symlink NAME", "Symlinks all dotfiles from the specified castle" desc "symlink NAME", "Symlinks all dotfiles from the specified castle"
def symlink(home) def symlink(name)
unless castle_dir(home).exist? unless castle_dir(name).exist?
say_status :error, "Castle #{home} did not exist in #{repos_dir}", :red say_status :error, "Could not symlink #{name}, expected #{castle_dir(name)} exist and contain dotfiles", :red
exit(1) exit(1)
end
else inside castle_dir(name) do
inside castle_dir(home) do
files = Pathname.glob('.*').reject{|a| [".",".."].include?(a.to_s)} files = Pathname.glob('.*').reject{|a| [".",".."].include?(a.to_s)}
files.each do |path| files.each do |path|
absolute_path = path.expand_path absolute_path = path.expand_path
inside user_dir do inside home_dir do
adjusted_path = (user_dir + path).basename adjusted_path = (home_dir + path).basename
ln_s absolute_path, adjusted_path ln_s absolute_path, adjusted_path
end end
@@ -50,41 +66,26 @@ class Homesick < Thor
end end
end end
end
desc "list", "List cloned castles" desc "list", "List cloned castles"
def list def list
inside repos_dir do Pathname.glob(repos_dir + "*") do |castle|
Pathname.glob('*') do |home| Dir.chdir castle do # so we can call git config from the right contxt
inside home do say_status castle.basename.to_s, `git config remote.origin.url`.chomp, :cyan
say_status home, `git config remote.origin.url`, :cyan
end end
end end
end end
end
no_tasks do
# class method, so it's convenient to stub out during tests
def self.user_dir
@user_dir ||= Pathname.new('~').expand_path
end
def self.repos_dir
@repos_dir ||= Pathname.new('~/.homesick/repos').expand_path
end
def repos_dir
self.class.repos_dir
end
end
protected protected
def user_dir def home_dir
self.class.user_dir @home_dir ||= Pathname.new(ENV['HOME'] || '~').expand_path
end end
def repos_dir
@repos_dir ||= home_dir.join('.homesick', 'repos').expand_path
end
def castle_dir(name) def castle_dir(name)
repos_dir.join(name, 'home') repos_dir.join(name, 'home')
end end

View File

@@ -9,6 +9,7 @@ class Homesick
end end
destination = Pathname.new(destination) unless destination.kind_of?(Pathname) destination = Pathname.new(destination) unless destination.kind_of?(Pathname)
FileUtils.mkdir_p destination.dirname
if ! destination.directory? if ! destination.directory?
say_status 'git clone', "#{repo} to #{destination.expand_path}", :green unless options[:quiet] say_status 'git clone', "#{repo} to #{destination.expand_path}", :green unless options[:quiet]
@@ -18,7 +19,18 @@ class Homesick
end end
end end
def git_submodule_init(config = {})
say_status 'git submodule', 'init', :green unless options[:quiet]
system "git submodule --quiet init" unless options[:pretend]
end
def git_submodule_update(config = {})
say_status 'git submodule', 'update', :green unless options[:quiet]
system "git submodule --quiet update >/dev/null 2>&1" unless options[:pretend]
end
def ln_s(source, destination, config = {}) def ln_s(source, destination, config = {})
source = Pathname.new(source)
destination = Pathname.new(destination) destination = Pathname.new(destination)
if destination.symlink? if destination.symlink?

View File

@@ -1,19 +0,0 @@
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe "Homesick" do
before do
@homesick = Homesick.new
end
it "should clone any git repo" do
@homesick.should_receive(:git_clone).with('git://github.com/technicalpickles/pickled-vim.git')
@homesick.clone "git://github.com/technicalpickles/pickled-vim.git"
end
it "should clone a github repo" do
@homesick.should_receive(:git_clone).with('git://github.com/wfarr/dotfiles.git', 'wfarr_dotfiles')
@homesick.clone "wfarr/dotfiles"
end
end

62
spec/homesick_spec.rb Normal file
View File

@@ -0,0 +1,62 @@
require 'spec_helper'
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'
@homesick.should_receive(:ln_s).with(wtf.to_s, wtf.basename.to_s)
@homesick.clone wtf.to_s
end
it "should clone git repo like git://host/path/to.git" do
@homesick.should_receive(:git_clone).with('git://github.com/technicalpickles/pickled-vim.git')
@homesick.clone "git://github.com/technicalpickles/pickled-vim.git"
end
it "should clone git repo like git@host:path/to.git" do
@homesick.should_receive(:git_clone).with('git@github.com:technicalpickles/pickled-vim.git')
@homesick.clone 'git@github.com:technicalpickles/pickled-vim.git'
end
it "should clone git repo like http://host/path/to.git" do
@homesick.should_receive(:git_clone).with('http://github.com/technicalpickles/pickled-vim.git')
@homesick.clone 'http://github.com/technicalpickles/pickled-vim.git'
end
it "should clone a github repo" do
@homesick.should_receive(:git_clone).with('git://github.com/wfarr/dotfiles.git', :destination => 'wfarr/dotfiles')
@homesick.clone "wfarr/dotfiles"
end
end
describe "list" do
# FIXME only passes in isolation. need to setup data a bit better
xit "should say each castle in the castle directory" do
@user_dir.directory '.homesick/repos' do |repos_dir|
repos_dir.directory 'zomg' do |zomg|
Dir.chdir do
system "git init >/dev/null 2>&1"
system "git remote add origin git://github.com/technicalpickles/zomg.git >/dev/null 2>&1"
end
end
end
@homesick.should_receive(:say_status).with("zomg", "git://github.com/technicalpickles/zomg.git", :cyan)
@homesick.list
end
end
end

View File

@@ -10,7 +10,7 @@ Spec::Runner.configure do |config|
config.before do config.before do
@user_dir = create_construct @user_dir = create_construct
Homesick.stub!(:user_dir).and_return(@user_dir) ENV['HOME'] = @user_dir.to_s
end end
config.after do config.after do