21 Commits

Author SHA1 Message Date
muratayusuke
10a9c0f482 Regenerate gemspec for version 0.9.2 2013-06-27 17:19:32 +00:00
muratayusuke
498ffa27f9 remove Gemfile.lock from repository 2013-06-27 17:11:56 +00:00
muratayusuke
ce8b46f300 bump up version 2013-06-27 17:08:33 +00:00
Yusuke Murata
995eff975f Merge pull request #45 from austinylin/master
Fix the path for .homesick_subdir in README.md
2013-06-27 09:47:49 -07:00
Yusuke Murata
2ab35e91e2 Merge pull request #44 from DavidMikeSimon/master
Added commands: show_path, status, diff
2013-06-27 09:47:18 -07:00
Austin Lin
4867ac2c7c Update readme with correct file path for .homesick_subdir per technicalpickles/homesick@360e8185f7 2013-06-27 12:06:54 -04:00
David Simon
a68149a87b Whoops, fixed typo 2013-06-26 14:34:43 -04:00
David Simon
8be3cdb6a0 Using DEFAULT_CASTLE_NAME in show_path, diff, status 2013-06-26 14:29:45 -04:00
David Simon
99760c27af Added three commands: show_path, status, diff 2013-06-25 16:11:08 -04:00
Yusuke Murata
4aa76ce444 Merge pull request #42 from akahigeg/default-castle-name
set default castle name: 'dotfiles' for some commands
2013-06-23 09:56:55 -07:00
akahige
82ae128429 default castle name to constant 2013-06-24 00:44:17 +09:00
akahige
dbf333c971 set default castle name: 'dotfiles' for some commands 2013-06-21 14:02:50 +09:00
Yusuke Murata
ca5dc3a4cc Merge pull request #41 from muratayusuke/feature/rubocop
Feature/rubocop
2013-06-20 16:44:12 -07:00
muratayusuke
a267a9c0b8 remove duplicate spec 2013-06-19 17:42:16 +00:00
muratayusuke
21cbb2c697 follow Ruby Style Guide for some points 2013-06-19 17:21:24 +00:00
muratayusuke
00f49be42c don't fail test even if rubocop detects some offence 2013-06-19 16:41:12 +00:00
muratayusuke
37b55bf934 use single-quate if don't need double-quate 2013-06-19 16:23:00 +00:00
muratayusuke
f2aca02b82 don't install rubocop under ruby 1.9.2 2013-06-19 15:58:45 +00:00
muratayusuke
dd101259f0 don't run rubocode on ruby 1.8.7 2013-06-19 15:41:53 +00:00
muratayusuke
b1f2742422 fix coding style 2013-06-19 15:30:18 +00:00
muratayusuke
114b44d4b6 use rubocop 2013-06-19 15:01:36 +00:00
12 changed files with 245 additions and 193 deletions

2
.gitignore vendored
View File

@@ -43,3 +43,5 @@ pkg
# For IDEA: # For IDEA:
.idea/ .idea/
*.iml *.iml
Gemfile.lock

View File

@@ -1,3 +1,10 @@
# 0.9.2
* Set "dotfiles" as default castle name
* Introduce new commands
* `homesick show_path`
* `homesick status`
* `homesick diff`
# 0.9.1 # 0.9.1
* Fixed small bugs: #35, #40 * Fixed small bugs: #35, #40

View File

@@ -12,4 +12,7 @@ group :development do
gem "rcov", :platforms => :mri_18 gem "rcov", :platforms => :mri_18
gem "simplecov", :platforms => :mri_19 gem "simplecov", :platforms => :mri_19
gem "test-construct" gem "test-construct"
if RUBY_VERSION >= '1.9.2'
gem "rubocop"
end
end end

View File

@@ -1,42 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
diff-lcs (1.2.4)
git (1.2.5)
jeweler (1.8.4)
bundler (~> 1.0)
git (>= 1.2.5)
rake
rdoc
json (1.8.0)
multi_json (1.7.3)
rake (10.0.4)
rcov (1.0.0)
rdoc (4.0.1)
json (~> 1.4)
rspec (2.13.0)
rspec-core (~> 2.13.0)
rspec-expectations (~> 2.13.0)
rspec-mocks (~> 2.13.0)
rspec-core (2.13.1)
rspec-expectations (2.13.0)
diff-lcs (>= 1.1.3, < 2.0)
rspec-mocks (2.13.1)
simplecov (0.7.1)
multi_json (~> 1.0)
simplecov-html (~> 0.7.1)
simplecov-html (0.7.1)
test-construct (1.2.0)
thor (0.18.1)
PLATFORMS
ruby
DEPENDENCIES
jeweler (>= 1.6.2)
rake (>= 0.8.7)
rcov
rspec (~> 2.10)
simplecov
test-construct
thor (>= 0.14.0)

View File

@@ -77,9 +77,9 @@ and have home like this:
|-- elisp |-- elisp
`-- inits `-- inits
You may want to symlink only to `castle/home/.config/fooapp` instead of `castle/home/.config` because you already have `~/.config/barapp`. In this case, you can use .homesick_subdir. Please write "directories you want to look up sub direcoties (instead of just first depth)" in this file. You may want to symlink only to `castle/home/.config/fooapp` instead of `castle/home/.config` because you already have `~/.config/barapp`. In this case, you can use .homesick_subdir. Please write "directories you want to look up sub directories (instead of just first depth)" in this file.
castle/home/.homesick_subdir castle/.homesick_subdir
.config .config
@@ -100,7 +100,7 @@ Or `homesick track NESTED_FILE CASTLE` adds a line automatically. For example:
homesick track .emacs.d/elisp castle homesick track .emacs.d/elisp castle
castle/home/.homesick_subdir castle/.homesick_subdir
.config .config
.emacs.d .emacs.d

View File

@@ -22,7 +22,7 @@ Jeweler::Tasks.new do |gem|
gem.email = ["josh@technicalpickles.com", "info@muratayusuke.com"] gem.email = ["josh@technicalpickles.com", "info@muratayusuke.com"]
gem.homepage = "http://github.com/technicalpickles/homesick" gem.homepage = "http://github.com/technicalpickles/homesick"
gem.authors = ["Joshua Nichols", "Yusuke Murata"] gem.authors = ["Joshua Nichols", "Yusuke Murata"]
gem.version = "0.9.1" gem.version = "0.9.2"
gem.license = "MIT" gem.license = "MIT"
# Have dependencies? Add them to Gemfile # Have dependencies? Add them to Gemfile
@@ -41,8 +41,18 @@ RSpec::Core::RakeTask.new(:rcov) do |spec|
spec.rcov = true spec.rcov = true
end end
task :rubocop do
if RUBY_VERSION >= '1.9.2'
system('rubocop')
end
end
task :default => :spec task :test do
Rake::Task['spec'].execute
Rake::Task['rubocop'].execute
end
task :default => :test
require 'rdoc/task' require 'rdoc/task'
Rake::RDocTask.new do |rdoc| Rake::RDocTask.new do |rdoc|

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.9.1" s.version = "0.9.2"
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 = [%q{Joshua Nichols}, %q{Yusuke Murata}] s.authors = [%q{Joshua Nichols}, %q{Yusuke Murata}]
s.date = %q{2013-06-17} s.date = %q{2013-06-27}
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.
@@ -29,7 +29,6 @@ Gem::Specification.new do |s|
".travis.yml", ".travis.yml",
"ChangeLog.markdown", "ChangeLog.markdown",
"Gemfile", "Gemfile",
"Gemfile.lock",
"LICENSE", "LICENSE",
"README.markdown", "README.markdown",
"Rakefile", "Rakefile",

View File

@@ -10,14 +10,16 @@ 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/
SUBDIR_FILENAME = ".homesick_subdir" SUBDIR_FILENAME = '.homesick_subdir'
def initialize(args=[], options={}, config={}) DEFAULT_CASTLE_NAME = 'dotfiles'
def initialize(args = [], options = {}, config = {})
super super
self.shell = Homesick::Shell.new self.shell = Homesick::Shell.new
end end
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)
inside repos_dir do inside repos_dir do
destination = nil destination = nil
@@ -33,7 +35,7 @@ class Homesick < Thor
elsif uri =~ GITHUB_NAME_REPO_PATTERN elsif uri =~ GITHUB_NAME_REPO_PATTERN
destination = Pathname.new($1) destination = Pathname.new($1)
git_clone "git://github.com/#{$1}.git", :destination => destination git_clone "git://github.com/#{$1}.git", :destination => destination
elsif uri =~ /\/([^\/]*?)(\.git)?\Z/ elsif uri =~ /%r([^%r]*?)(\.git)?\Z/
destination = Pathname.new($1) destination = Pathname.new($1)
git_clone uri git_clone uri
elsif uri =~ /[^:]+:([^:]+)(\.git)?\Z/ elsif uri =~ /[^:]+:([^:]+)(\.git)?\Z/
@@ -54,20 +56,20 @@ class Homesick < Thor
if homesickrc.exist? if homesickrc.exist?
proceed = shell.yes?("#{uri} has a .homesickrc. Proceed with evaling it? (This could be destructive)") proceed = shell.yes?("#{uri} has a .homesickrc. Proceed with evaling it? (This could be destructive)")
if proceed if proceed
shell.say_status "eval", homesickrc shell.say_status 'eval', homesickrc
inside destination do inside destination do
eval homesickrc.read, binding, homesickrc.expand_path eval homesickrc.read, binding, homesickrc.expand_path
end end
else else
shell.say_status "eval skip", "not evaling #{homesickrc}, #{destination} may need manual configuration", :blue shell.say_status 'eval skip', "not evaling #{homesickrc}, #{destination} may need manual configuration", :blue
end end
end end
end end
end end
desc "pull CASTLE", "Update the specified castle" desc 'pull CASTLE', 'Update the specified castle'
method_option :all, :type => :boolean, :default => false, :required => false, :desc => "Update all cloned castles" method_option :all, :type => :boolean, :default => false, :required => false, :desc => 'Update all cloned castles'
def pull(name="") def pull(name = DEFAULT_CASTLE_NAME)
if options[:all] if options[:all]
inside_each_castle do |castle| inside_each_castle do |castle|
shell.say castle.to_s.gsub(repos_dir.to_s + '/', '') + ':' shell.say castle.to_s.gsub(repos_dir.to_s + '/', '') + ':'
@@ -79,22 +81,22 @@ class Homesick < Thor
end end
desc "commit CASTLE", "Commit the specified castle's changes" desc 'commit CASTLE', "Commit the specified castle's changes"
def commit(name) def commit(name = DEFAULT_CASTLE_NAME)
commit_castle name commit_castle name
end end
desc "push CASTLE", "Push the specified castle" desc 'push CASTLE', 'Push the specified castle'
def push(name) def push(name = DEFAULT_CASTLE_NAME)
push_castle name push_castle name
end end
desc "symlink CASTLE", "Symlinks all dotfiles from the specified castle" desc 'symlink CASTLE', 'Symlinks all dotfiles from the specified castle'
method_option :force, :default => false, :desc => "Overwrite existing conflicting symlinks without prompting." method_option :force, :default => false, :desc => 'Overwrite existing conflicting symlinks without prompting.'
def symlink(name) def symlink(name = DEFAULT_CASTLE_NAME)
check_castle_existance(name, "symlink") check_castle_existance(name, 'symlink')
inside castle_dir(name) do inside castle_dir(name) do
subdirs = subdirs(name) subdirs = subdirs(name)
@@ -109,8 +111,8 @@ class Homesick < Thor
end end
end end
desc "track FILE CASTLE", "add a file to a castle" desc 'track FILE CASTLE', 'add a file to a castle'
def track(file, castle) def track(file, castle = DEFAULT_CASTLE_NAME)
castle = Pathname.new(castle) castle = Pathname.new(castle)
file = Pathname.new(file.chomp('/')) file = Pathname.new(file.chomp('/'))
check_castle_existance(castle, 'track') check_castle_existance(castle, 'track')
@@ -149,24 +151,44 @@ class Homesick < Thor
end end
# are we tracking something nested? Add the parent dir to the manifest # are we tracking something nested? Add the parent dir to the manifest
unless relative_dir.eql?(Pathname.new('.')) subdir_add(castle, relative_dir) unless relative_dir.eql?(Pathname.new('.'))
subdir_add(castle, relative_dir)
end
end end
desc "list", "List cloned castles" desc 'list', 'List cloned castles'
def list def list
inside_each_castle do |castle| inside_each_castle do |castle|
say_status castle.relative_path_from(repos_dir).to_s, `git config remote.origin.url`.chomp, :cyan say_status castle.relative_path_from(repos_dir).to_s, `git config remote.origin.url`.chomp, :cyan
end end
end end
desc "generate PATH", "generate a homesick-ready git repo at PATH" desc 'status CASTLE', 'Shows the git status of a castle'
def status(castle = DEFAULT_CASTLE_NAME)
check_castle_existance(castle, 'status')
inside repos_dir.join(castle) do
git_status
end
end
desc 'diff CASTLE', 'Shows the git diff of uncommitted changes in a castle'
def diff(castle = DEFAULT_CASTLE_NAME)
check_castle_existance(castle, 'diff')
inside repos_dir.join(castle) do
git_diff
end
end
desc 'show_path CASTLE', 'Prints the path of a castle'
def show_path(castle = DEFAULT_CASTLE_NAME)
check_castle_existance(castle, 'show_path')
say repos_dir.join(castle)
end
desc 'generate PATH', 'generate a homesick-ready git repo at PATH'
def generate(castle) def generate(castle)
castle = Pathname.new(castle).expand_path castle = Pathname.new(castle).expand_path
github_user = `git config github.user`.chomp github_user = `git config github.user`.chomp
github_user = nil if github_user == "" github_user = nil if github_user == ''
github_repo = castle.basename github_repo = castle.basename
empty_directory castle empty_directory castle
@@ -177,7 +199,7 @@ class Homesick < Thor
git_remote_add 'origin', url git_remote_add 'origin', url
end end
empty_directory "home" empty_directory 'home'
end end
end end
@@ -208,7 +230,9 @@ class Homesick < Thor
dirs = Pathname.glob("#{repos_dir}/**/.git", File::FNM_DOTMATCH) dirs = Pathname.glob("#{repos_dir}/**/.git", File::FNM_DOTMATCH)
# reject paths that lie inside another castle, like git submodules # reject paths that lie inside another castle, like git submodules
return dirs.reject do |dir| return dirs.reject do |dir|
dirs.any? {|other| dir != other && dir.fnmatch(other.parent.join('*').to_s) } dirs.any? do |other|
dir != other && dir.fnmatch(other.parent.join('*').to_s)
end
end end
end end
@@ -222,7 +246,7 @@ class Homesick < Thor
end end
def update_castle(castle) def update_castle(castle)
check_castle_existance(castle, "pull") check_castle_existance(castle, 'pull')
inside repos_dir.join(castle) do inside repos_dir.join(castle) do
git_pull git_pull
git_submodule_init git_submodule_init
@@ -231,14 +255,14 @@ class Homesick < Thor
end end
def commit_castle(castle) def commit_castle(castle)
check_castle_existance(castle, "commit") check_castle_existance(castle, 'commit')
inside repos_dir.join(castle) do inside repos_dir.join(castle) do
git_commit_all git_commit_all
end end
end end
def push_castle(castle) def push_castle(castle)
check_castle_existance(castle, "push") check_castle_existance(castle, 'push')
inside repos_dir.join(castle) do inside repos_dir.join(castle) do
git_push git_push
end end
@@ -262,7 +286,9 @@ class Homesick < Thor
def subdir_add(castle, path) def subdir_add(castle, path)
subdir_filepath = subdir_file(castle) subdir_filepath = subdir_file(castle)
File.open(subdir_filepath, 'a+') do |subdir| File.open(subdir_filepath, 'a+') do |subdir|
subdir.puts path unless subdir.readlines.inject(false) { |memo, line| line.eql?("#{path.to_s}\n") || memo } subdir.puts path unless subdir.readlines.reduce(false) do |memo, line|
line.eql?("#{path.to_s}\n") || memo
end
end end
inside castle_dir(castle) do inside castle_dir(castle) do
@@ -308,7 +334,7 @@ class Homesick < Thor
def symlink_each(castle, basedir, subdirs) def symlink_each(castle, basedir, subdirs)
absolute_basedir = Pathname.new(basedir).expand_path absolute_basedir = Pathname.new(basedir).expand_path
inside basedir do inside basedir 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
castle_home = castle_dir(castle) castle_home = castle_dir(castle)

View File

@@ -16,13 +16,13 @@ class Homesick
end end
end end
def git_init(path = ".") def git_init(path = '.')
path = Pathname.new(path) path = Pathname.new(path)
inside path do inside path do
unless path.join('.git').exist? if !path.join('.git').exist?
say_status 'git init', '' unless options[:quiet] say_status 'git init', '' unless options[:quiet]
system "git init >/dev/null" unless options[:pretend] system 'git init >/dev/null' unless options[:pretend]
else else
say_status 'git init', 'already initialized', :blue unless options[:quiet] say_status 'git init', 'already initialized', :blue unless options[:quiet]
end end
@@ -33,7 +33,7 @@ class Homesick
existing_remote = `git config remote.#{name}.url`.chomp existing_remote = `git config remote.#{name}.url`.chomp
existing_remote = nil if existing_remote == '' existing_remote = nil if existing_remote == ''
unless existing_remote if !existing_remote
say_status 'git remote', "add #{name} #{url}" unless options[:quiet] say_status 'git remote', "add #{name} #{url}" unless options[:quiet]
system "git remote add #{name} #{url}" unless options[:pretend] system "git remote add #{name} #{url}" unless options[:pretend]
else else
@@ -43,27 +43,27 @@ class Homesick
def git_submodule_init(config = {}) def git_submodule_init(config = {})
say_status 'git submodule', 'init', :green unless options[:quiet] say_status 'git submodule', 'init', :green unless options[:quiet]
system "git submodule --quiet init" unless options[:pretend] system 'git submodule --quiet init' unless options[:pretend]
end end
def git_submodule_update(config = {}) def git_submodule_update(config = {})
say_status 'git submodule', 'update', :green unless options[:quiet] say_status 'git submodule', 'update', :green unless options[:quiet]
system "git submodule --quiet update --init --recursive >/dev/null 2>&1" unless options[:pretend] system 'git submodule --quiet update --init --recursive >/dev/null 2>&1' unless options[:pretend]
end end
def git_pull(config = {}) def git_pull(config = {})
say_status 'git pull', '', :green unless options[:quiet] say_status 'git pull', '', :green unless options[:quiet]
system "git pull --quiet" unless options[:pretend] system 'git pull --quiet' unless options[:pretend]
end end
def git_push(config = {}) def git_push(config = {})
say_status 'git push', '', :green unless options[:quiet] say_status 'git push', '', :green unless options[:quiet]
system "git push" unless options[:pretend] system 'git push' unless options[:pretend]
end end
def git_commit_all(config = {}) def git_commit_all(config = {})
say_status 'git commit all', '', :green unless options[:quiet] say_status 'git commit all', '', :green unless options[:quiet]
system "git commit -v -a" unless options[:pretend] system 'git commit -v -a' unless options[:pretend]
end end
def git_add(file, config = {}) def git_add(file, config = {})
@@ -71,6 +71,16 @@ class Homesick
system "git add #{file}" unless options[:pretend] system "git add #{file}" unless options[:pretend]
end end
def git_status(config = {})
say_status 'git status', '', :green unless options[:quiet]
system "git status" unless options[:pretend]
end
def git_diff(config = {})
say_status 'git diff', '', :green unless options[:quiet]
system "git diff" unless options[:pretend]
end
def mv(source, destination, config = {}) def mv(source, destination, config = {})
source = Pathname.new(source) source = Pathname.new(source)
destination = Pathname.new(destination + source.basename) destination = Pathname.new(destination + source.basename)

View File

@@ -1,236 +1,258 @@
require 'spec_helper' require 'spec_helper'
describe "homesick" do describe 'homesick' do
let(:home) { create_construct } let(:home) { create_construct }
after { home.destroy! } after { home.destroy! }
let(:castles) { home.directory(".homesick/repos") } let(:castles) { home.directory('.homesick/repos') }
let(:homesick) { Homesick.new } let(:homesick) { Homesick.new }
before { homesick.stub!(:repos_dir).and_return(castles) } before { homesick.stub!(:repos_dir).and_return(castles) }
describe "clone" do describe 'clone' do
context "of a file" do context 'of a file' do
it "should symlink existing directories" do it 'should symlink existing directories' do
somewhere = create_construct somewhere = create_construct
local_repo = somewhere.directory('wtf') local_repo = somewhere.directory('wtf')
homesick.clone local_repo homesick.clone local_repo
castles.join("wtf").readlink.should == local_repo castles.join('wtf').readlink.should == local_repo
end end
context "when it exists in a repo directory" do context 'when it exists in a repo directory' do
before do before do
existing_castle = given_castle("existing_castle") existing_castle = given_castle('existing_castle')
@existing_dir = existing_castle.parent @existing_dir = existing_castle.parent
end end
it "should not symlink" do it 'should raise an error' do
homesick.should_not_receive(:git_clone) homesick.should_not_receive(:git_clone)
homesick.clone @existing_dir.to_s rescue nil
end
it "should raise an error" do
expect { homesick.clone @existing_dir.to_s }.to raise_error(/already cloned/i) expect { homesick.clone @existing_dir.to_s }.to raise_error(/already cloned/i)
end end
end end
end end
it "should clone git repo like file:///path/to.git" do it 'should clone git repo like file:///path/to.git' do
bare_repo = File.join(create_construct.to_s, "dotfiles.git") bare_repo = File.join(create_construct.to_s, 'dotfiles.git')
system "git init --bare #{bare_repo} >/dev/null 2>&1" system "git init --bare #{bare_repo} >/dev/null 2>&1"
homesick.clone "file://#{bare_repo}" homesick.clone "file://#{bare_repo}"
File.directory?(File.join(home.to_s, '.homesick/repos/dotfiles')).should be_true File.directory?(File.join(home.to_s, '.homesick/repos/dotfiles')).should be_true
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
homesick.should_receive(:git_clone).with('git://github.com/technicalpickles/pickled-vim.git') homesick.should_receive(:git_clone).with('git://github.com/technicalpickles/pickled-vim.git')
homesick.clone "git://github.com/technicalpickles/pickled-vim.git" homesick.clone 'git://github.com/technicalpickles/pickled-vim.git'
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
homesick.should_receive(:git_clone).with('git@github.com:technicalpickles/pickled-vim.git') homesick.should_receive(:git_clone).with('git@github.com:technicalpickles/pickled-vim.git')
homesick.clone 'git@github.com:technicalpickles/pickled-vim.git' homesick.clone 'git@github.com:technicalpickles/pickled-vim.git'
end end
it "should clone git repo like http://host/path/to.git" do 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.should_receive(:git_clone).with('http://github.com/technicalpickles/pickled-vim.git')
homesick.clone 'http://github.com/technicalpickles/pickled-vim.git' homesick.clone 'http://github.com/technicalpickles/pickled-vim.git'
end end
it "should clone git repo like http://host/path/to" do it 'should clone git repo like http://host/path/to' do
homesick.should_receive(:git_clone).with('http://github.com/technicalpickles/pickled-vim') homesick.should_receive(:git_clone).with('http://github.com/technicalpickles/pickled-vim')
homesick.clone 'http://github.com/technicalpickles/pickled-vim' homesick.clone 'http://github.com/technicalpickles/pickled-vim'
end end
it "should clone git repo like host-alias:repos.git" do it 'should clone git repo like host-alias:repos.git' do
homesick.should_receive(:git_clone).with('gitolite:pickled-vim.git') homesick.should_receive(:git_clone).with('gitolite:pickled-vim.git')
homesick.clone 'gitolite:pickled-vim.git' homesick.clone 'gitolite:pickled-vim.git'
end end
it "should not try to clone a malformed uri like malformed" do it 'should throw an exception when trying to clone a malformed uri like malformed' do
homesick.should_not_receive(:git_clone) homesick.should_not_receive(:git_clone)
homesick.clone 'malformed' rescue nil
end
it "should throw an exception when trying to clone a malformed uri like malformed" do
expect { homesick.clone 'malformed' }.to raise_error expect { homesick.clone 'malformed' }.to raise_error
end end
it "should clone a github repo" do it 'should clone a github repo' do
homesick.should_receive(:git_clone).with('git://github.com/wfarr/dotfiles.git', :destination => Pathname.new('wfarr/dotfiles')) homesick.should_receive(:git_clone).with('git://github.com/wfarr/dotfiles.git', :destination => Pathname.new('wfarr/dotfiles'))
homesick.clone "wfarr/dotfiles" homesick.clone 'wfarr/dotfiles'
end end
end end
describe "symlink" do describe 'symlink' do
let(:castle) { given_castle("glencairn") } let(:castle) { given_castle('glencairn') }
it "links dotfiles from a castle to the home folder" do it 'links dotfiles from a castle to the home folder' do
dotfile = castle.file(".some_dotfile") dotfile = castle.file('.some_dotfile')
homesick.symlink("glencairn") homesick.symlink('glencairn')
home.join(".some_dotfile").readlink.should == dotfile home.join('.some_dotfile').readlink.should == dotfile
end end
it "links non-dotfiles from a castle to the home folder" do it 'links non-dotfiles from a castle to the home folder' do
dotfile = castle.file("bin") dotfile = castle.file('bin')
homesick.symlink("glencairn") homesick.symlink('glencairn')
home.join("bin").readlink.should == dotfile home.join('bin').readlink.should == dotfile
end end
context "when forced" do context 'when forced' do
let(:homesick) { Homesick.new [], :force => true } let(:homesick) { Homesick.new [], :force => true }
it "can override symlinks to directories" do it 'can override symlinks to directories' do
somewhere_else = create_construct somewhere_else = create_construct
existing_dotdir_link = home.join(".vim") existing_dotdir_link = home.join('.vim')
FileUtils.ln_s somewhere_else, existing_dotdir_link FileUtils.ln_s somewhere_else, existing_dotdir_link
dotdir = castle.directory(".vim") dotdir = castle.directory('.vim')
homesick.symlink("glencairn") homesick.symlink('glencairn')
existing_dotdir_link.readlink.should == dotdir existing_dotdir_link.readlink.should == dotdir
end end
it "can override existing directory" do it 'can override existing directory' do
somewhere_else = create_construct existing_dotdir = home.directory('.vim')
existing_dotdir = home.directory(".vim")
dotdir = castle.directory(".vim") dotdir = castle.directory('.vim')
homesick.symlink("glencairn") homesick.symlink('glencairn')
existing_dotdir.readlink.should == dotdir existing_dotdir.readlink.should == dotdir
end end
end end
context "with '.config' in .homesick_subdir" do context "with '.config' in .homesick_subdir" do
let(:castle) { given_castle("glencairn", [".config"]) } let(:castle) { given_castle('glencairn', ['.config']) }
it "can symlink in sub directory" do it 'can symlink in sub directory' do
dotdir = castle.directory(".config") dotdir = castle.directory('.config')
dotfile = dotdir.file(".some_dotfile") dotfile = dotdir.file('.some_dotfile')
homesick.symlink("glencairn") homesick.symlink('glencairn')
home_dotdir = home.join(".config") home_dotdir = home.join('.config')
home_dotdir.symlink?.should == false home_dotdir.symlink?.should be == false
home_dotdir.join(".some_dotfile").readlink.should == dotfile home_dotdir.join('.some_dotfile').readlink.should == dotfile
end end
end end
context "with '.config/appA' in .homesick_subdir" do context "with '.config/appA' in .homesick_subdir" do
let(:castle) { given_castle("glencairn", [".config/appA"]) } let(:castle) { given_castle('glencairn', ['.config/appA']) }
it "can symlink in nested sub directory" do it 'can symlink in nested sub directory' do
dotdir = castle.directory(".config").directory("appA") dotdir = castle.directory('.config').directory('appA')
dotfile = dotdir.file(".some_dotfile") dotfile = dotdir.file('.some_dotfile')
homesick.symlink("glencairn") homesick.symlink('glencairn')
home_dotdir = home.join(".config").join("appA") home_dotdir = home.join('.config').join('appA')
home_dotdir.symlink?.should == false home_dotdir.symlink?.should be == false
home_dotdir.join(".some_dotfile").readlink.should == dotfile home_dotdir.join('.some_dotfile').readlink.should == dotfile
end end
end end
context "with '.config' and '.config/appA' in .homesick_subdir" do context "with '.config' and '.config/someapp' in .homesick_subdir" do
let(:castle) { given_castle("glencairn", [".config", ".config/appA"]) } let(:castle) { given_castle('glencairn', ['.config', '.config/someapp']) }
it "can symlink under both of .config and .config/appA" do it 'can symlink under both of .config and .config/someapp' do
config_dir = castle.directory(".config") config_dir = castle.directory('.config')
config_dotfile = config_dir.file(".some_dotfile") config_dotfile = config_dir.file('.some_dotfile')
appA_dir = config_dir.directory("appA") someapp_dir = config_dir.directory('someapp')
appA_dotfile = appA_dir.file(".some_appfile") someapp_dotfile = someapp_dir.file('.some_appfile')
homesick.symlink("glencairn") homesick.symlink('glencairn')
home_config_dir = home.join(".config") home_config_dir = home.join('.config')
home_appA_dir = home_config_dir.join("appA") home_someapp_dir = home_config_dir.join('someapp')
home_config_dir.symlink?.should == false home_config_dir.symlink?.should be == false
home_config_dir.join(".some_dotfile").readlink.should == config_dotfile home_config_dir.join('.some_dotfile').readlink.should be == config_dotfile
home_appA_dir.symlink?.should == false home_someapp_dir.symlink?.should be == false
home_appA_dir.join(".some_appfile").readlink.should == appA_dotfile home_someapp_dir.join('.some_appfile').readlink.should == someapp_dotfile
end
end
context "when call with no castle name" do
let(:castle) { given_castle('dotfiles') }
it 'using default castle name: "dotfiles"' do
dotfile = castle.file('.some_dotfile')
homesick.symlink
home.join('.some_dotfile').readlink.should == dotfile
end end
end end
end end
describe "list" do describe 'list' do
it "should say each castle in the castle directory" do it 'should say each castle in the castle directory' do
given_castle('zomg') given_castle('zomg')
given_castle('wtf/zomg') given_castle('wtf/zomg')
homesick.should_receive(:say_status).with("zomg", "git://github.com/technicalpickles/zomg.git", :cyan) homesick.should_receive(:say_status).with('zomg', 'git://github.com/technicalpickles/zomg.git', :cyan)
homesick.should_receive(:say_status).with("wtf/zomg", "git://github.com/technicalpickles/zomg.git", :cyan) homesick.should_receive(:say_status).with('wtf/zomg', 'git://github.com/technicalpickles/zomg.git', :cyan)
homesick.list homesick.list
end end
end end
describe "pull" do describe 'status' do
xit "needs testing" xit 'needs testing'
describe "--all" do end
xit "needs testing"
describe 'diff' do
xit 'needs testing'
end
describe 'show_path' do
it 'should say the path of a castle' do
castle = given_castle('castle_repo')
homesick.should_receive(:say).with(castle.dirname)
homesick.show_path('castle_repo')
end
end
describe 'pull' do
xit 'needs testing'
describe '--all' do
xit 'needs testing'
end end
end end
describe "commit" do describe 'commit' do
xit "needs testing" xit 'needs testing'
end end
describe "push" do describe 'push' do
xit "needs testing" 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
castle = given_castle('castle_repo') castle = given_castle('castle_repo')
some_rc_file = home.file '.some_rc_file' some_rc_file = home.file '.some_rc_file'
homesick.track(some_rc_file.to_s, 'castle_repo') homesick.track(some_rc_file.to_s, 'castle_repo')
tracked_file = castle.join(".some_rc_file") tracked_file = castle.join('.some_rc_file')
tracked_file.should exist tracked_file.should exist
some_rc_file.readlink.should == tracked_file some_rc_file.readlink.should == tracked_file
@@ -258,7 +280,22 @@ describe "homesick" do
some_nested_dir.realpath.should == tracked_file.realpath some_nested_dir.realpath.should == tracked_file.realpath
end end
describe "subdir_file" do context "when call with no castle name" do
it 'using default castle name: "dotfiles"' do
castle = given_castle('dotfiles')
some_rc_file = home.file '.some_rc_file'
homesick.track(some_rc_file.to_s)
tracked_file = castle.join('.some_rc_file')
tracked_file.should exist
some_rc_file.readlink.should == tracked_file
end
end
describe 'subdir_file' do
it 'should add the nested files parent to the subdir_file' do it 'should add the nested files parent to the subdir_file' do
castle = given_castle('castle_repo') castle = given_castle('castle_repo')

View File

@@ -16,19 +16,19 @@ RSpec.configure do |config|
homesick.stub(:say_status) homesick.stub(:say_status)
end end
def given_castle(path, subdirs=[]) def given_castle(path, subdirs = [])
name = Pathname.new(path).basename name = Pathname.new(path).basename
castles.directory(path) do |castle| castles.directory(path) do |castle|
Dir.chdir(castle) do Dir.chdir(castle) do
system "git init >/dev/null 2>&1" system 'git init >/dev/null 2>&1'
system "git remote add origin git://github.com/technicalpickles/#{name}.git >/dev/null 2>&1" system "git remote add origin git://github.com/technicalpickles/#{name}.git >/dev/null 2>&1"
if subdirs then if subdirs
subdir_file = castle.join(Homesick::SUBDIR_FILENAME) subdir_file = castle.join(Homesick::SUBDIR_FILENAME)
subdirs.each do |subdir| subdirs.each do |subdir|
system "echo #{subdir} >> #{subdir_file}" system "echo #{subdir} >> #{subdir_file}"
end end
end end
return castle.directory("home") return castle.directory('home')
end end
end end
end end