dotify 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +37 -6
- data/lib/dotify/cli.rb +65 -20
- data/lib/dotify/files.rb +13 -5
- data/lib/dotify/version.rb +1 -1
- data/spec/dotify/files_spec.rb +30 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -32,10 +32,28 @@ To setup Dotify, you must first run `dotify setup` in your terminal.
|
|
32
32
|
Do you want to add .gitconfig to Dotify? [Yn] y
|
33
33
|
...
|
34
34
|
|
35
|
-
This will first create a `.dotify` directory in your home directory (yes, only one more dot directory, but this time it is a good thing). It will then ask which files you want to copy from your home directory into your `.dotify` directory.
|
35
|
+
This will first create a `.dotify` directory in your home directory (yes, only one more dot directory, but this time it is a good thing). It will then ask which files you want to copy from your home directory into your `.dotify` directory.
|
36
36
|
|
37
37
|
**This will *not* link up the dotfiles. This command simply copies the files over for you without having to go searching for them manually.**
|
38
38
|
|
39
|
+
### Add single files
|
40
|
+
|
41
|
+
After you have setup Dotify, you can add files one by one if you did not add them during setup
|
42
|
+
|
43
|
+
$ dotify add .vimrc
|
44
|
+
create /Users/mattbridges/.vimrc
|
45
|
+
|
46
|
+
### Remove single files
|
47
|
+
|
48
|
+
If you don't want a particular dotfile anymore? You can just remove it.
|
49
|
+
|
50
|
+
***This actually removes the file from the home directory. Do this at your own risk***.
|
51
|
+
|
52
|
+
$ dotify remove .vimrc
|
53
|
+
remove /Users/mattbridges/.vimrc
|
54
|
+
|
55
|
+
If you do this and decide to change your mind, the file is still located in the `~/.dotify` directory. You can re-link it by running `dotify link` again.
|
56
|
+
|
39
57
|
### Link up your files
|
40
58
|
|
41
59
|
This is the heart of the Dotify tool. This command will link the files within the `~/.dotify` directory into your home directory.
|
@@ -64,22 +82,35 @@ Don't want any of the dotfiles anymore? Well, I'm not one to question. Go ahead
|
|
64
82
|
|
65
83
|
Should you run this horrid task accidentally, you can simply run `dotify link` again if you want to restore your previous settings.
|
66
84
|
|
85
|
+
## Confused?
|
86
|
+
|
87
|
+
Dotify can manages dotfiles from two different directions:
|
88
|
+
|
89
|
+
1. `add` and `remove` both look in the user's home directory for dotfiles to manage
|
90
|
+
2. `link` and `unlink` both look in the Dotify directory for dotfiles to manage.
|
91
|
+
|
92
|
+
In other words, when the user has dotfiles in the home directory that he/she wants Dotify to manage, they would use `dotify add [FILENAME]` (or even `setup`) to instruct Dotify to manage those files.
|
93
|
+
|
94
|
+
On the other hand, if he/she has files that they have instructed Dotify to manage but have removed them from the home directory, they would use `link` and `unlink` to re-link them into the home directory.
|
95
|
+
|
67
96
|
## Not sure what to do?
|
68
97
|
|
69
98
|
This tool is powered by the amazing library, [Thor](http://whatisthor.com/). You can use the `help` task like so:
|
70
99
|
|
71
100
|
$ dotify help
|
72
101
|
Tasks:
|
73
|
-
dotify
|
74
|
-
dotify
|
75
|
-
dotify
|
76
|
-
dotify
|
102
|
+
dotify add [FILENAME] # Add a single dotfile to the Dotify directory
|
103
|
+
dotify help [TASK] # Describe available tasks or one specific task
|
104
|
+
dotify link # Link up all of your dotfiles
|
105
|
+
dotify remove [FILENAME] # Remove a single dotfile from Dotify
|
106
|
+
dotify setup # Setup your system for Dotify to manage your dotfiles
|
107
|
+
dotify unlink # Unlink all of your dotfiles
|
77
108
|
|
78
109
|
And if you want a little clarity on one of the command you can run `dotify help [TASK]` to find out what other options you have in the other tasks.
|
79
110
|
|
80
111
|
## Contributing
|
81
112
|
|
82
|
-
This tool is developed with much influence from *37singals*' fantastic idea of **Do Less**. This is meant to be a *simple* tool.
|
113
|
+
This tool is developed with much influence from *37singals*' fantastic idea of **Do Less**. This is meant to be a *simple* tool.
|
83
114
|
|
84
115
|
Contributions are welcome and encouraged. The contrubution process is the typical Github one.
|
85
116
|
|
data/lib/dotify/cli.rb
CHANGED
@@ -11,34 +11,74 @@ module Dotify
|
|
11
11
|
include Thor::Actions
|
12
12
|
default_task :help
|
13
13
|
|
14
|
-
map "-l" =>
|
15
|
-
map "-u" =>
|
16
|
-
map "-
|
17
|
-
map "-
|
14
|
+
map "-l" => :link
|
15
|
+
map "-u" => :unlink
|
16
|
+
map "-s" => :setup
|
17
|
+
map "-a" => :add
|
18
|
+
map "-r" => :remove
|
18
19
|
|
19
20
|
def self.source_root
|
20
21
|
Config.home
|
21
22
|
end
|
22
23
|
|
23
24
|
desc :setup, "Setup your system for Dotify to manage your dotfiles"
|
25
|
+
method_option :link, :default => false, :type => :boolean, :aliases => '-l', :desc => "Link dotfiles when setup is complete"
|
24
26
|
def setup
|
25
27
|
empty_directory(Config.path) unless File.directory?(Config.path)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
28
|
+
Files.unlinked do |path, file|
|
29
|
+
add(file) unless Config.dirname == file
|
30
|
+
end
|
31
|
+
say "Dotify has been successfully setup.", :blue
|
32
|
+
if options[:link]
|
33
|
+
say "Linking up the new dotfiles...", :blue
|
34
|
+
invoke :link, nil, { :all => true } if options[:link]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "add [FILENAME]", "Add a single dotfile to the Dotify directory"
|
39
|
+
method_option :force, :default => false, :type => :boolean, :aliases => '-f', :desc => "Add file without confirmation"
|
40
|
+
def add(file)
|
41
|
+
file = Files.file_name(file)
|
42
|
+
dotfile = Files.dotfile(file)
|
43
|
+
dotify_file = Files.dotify(file)
|
44
|
+
case
|
45
|
+
when !File.exist?(dotfile)
|
46
|
+
say "'~/#{file}' does not exist", :blue
|
47
|
+
when File.identical?(dotfile, dotify_file)
|
48
|
+
say "'~/#{file}' is already identical to '~/.dotify/#{file}'", :blue
|
49
|
+
else
|
50
|
+
if options[:force] == true || yes?("Do you want to add #{file} to Dotify? [Yn]", :yellow)
|
51
|
+
if File.directory?(dotfile)
|
52
|
+
FileUtils.rm_rf dotify_file
|
53
|
+
FileUtils.cp_r dotfile, dotify_file
|
54
|
+
say_status :create, dotify_file
|
55
|
+
else
|
56
|
+
copy_file dotfile, dotify_file
|
38
57
|
end
|
39
58
|
end
|
40
59
|
end
|
41
|
-
|
60
|
+
end
|
61
|
+
|
62
|
+
desc "remove [FILENAME]", "Remove a single dotfile from Dotify"
|
63
|
+
long_desc <<-STRING
|
64
|
+
`dotify remove [FILENAME]` removes the dotfiles from the Dotify directory
|
65
|
+
and moves it back into the home directory. If you decide you want Dotify
|
66
|
+
to manage that file again, you can simply run `dotify add [FILENAME]` to
|
67
|
+
add it back again.
|
68
|
+
STRING
|
69
|
+
method_option :force, :default => false, :type => :boolean, :aliases => '-f', :desc => "Remove file without confirmation"
|
70
|
+
method_option :quiet, :default => false, :type => :boolean, :aliases => '-q', :desc => "Don't output anything"
|
71
|
+
def remove(file)
|
72
|
+
if !File.exists?(Files.dotify(file))
|
73
|
+
say "Dotify is not currently managing ~/#{file}.", :blue unless options.quiet?
|
74
|
+
return
|
75
|
+
end
|
76
|
+
if options[:force] == true || yes?("Are you sure you want to remove #{file} from Dotify? [Yn]", :yellow)
|
77
|
+
remove_file Files.dotfile(file), :verbose => false
|
78
|
+
copy_file Files.dotify(file), Files.dotfile(file), :verbose => false
|
79
|
+
remove_file Files.dotify(file), :verbose => false
|
80
|
+
say_status :removed, Files.dotify(file) unless options.quiet?
|
81
|
+
end
|
42
82
|
end
|
43
83
|
|
44
84
|
desc :link, "Link up all of your dotfiles"
|
@@ -54,21 +94,26 @@ module Dotify
|
|
54
94
|
end
|
55
95
|
count += 1
|
56
96
|
else
|
57
|
-
if yes?("Do you want to link ~/#{dot}? [Yn]", :
|
97
|
+
if yes?("Do you want to link ~/#{dot}? [Yn]", :yellow)
|
58
98
|
create_link Files.dotfile(file), file
|
59
99
|
count += 1
|
60
100
|
end
|
61
101
|
end
|
62
102
|
end
|
63
|
-
say "No files were linked.", :
|
103
|
+
say "No files were linked.", :blue if count == 0
|
64
104
|
end
|
65
105
|
|
66
106
|
desc :unlink, "Unlink all of your dotfiles"
|
107
|
+
long_desc <<-STRING
|
108
|
+
`dotify unlink` removes the dotfiles from the home directory and preserves the
|
109
|
+
files in the Dotify directory. This allows you to simply run `dotify link` again
|
110
|
+
should you decide you want to relink anything to the Dotify files.
|
111
|
+
STRING
|
67
112
|
method_option :all, :default => false, :type => :boolean, :aliases => '-a', :desc => 'Remove all installed dotfiles without confirmation'
|
68
113
|
def unlink
|
69
114
|
count = 0
|
70
115
|
Files.installed do |file, dot|
|
71
|
-
if options[:all] || yes?("Are you sure you want to remove ~/#{dot}? [Yn]", :
|
116
|
+
if options[:all] || yes?("Are you sure you want to remove ~/#{dot}? [Yn]", :yellow)
|
72
117
|
remove_file Files.dotfile(file)
|
73
118
|
count += 1
|
74
119
|
end
|
data/lib/dotify/files.rb
CHANGED
@@ -11,7 +11,7 @@ module Dotify
|
|
11
11
|
include Thor::Actions
|
12
12
|
|
13
13
|
def dots
|
14
|
-
@dots ||= file_list(File.join(
|
14
|
+
@dots ||= file_list(File.join(Config.path, "/.*"))
|
15
15
|
return @dots unless block_given?
|
16
16
|
@dots.each {|d| yield(d, file_name(d)) }
|
17
17
|
end
|
@@ -25,6 +25,14 @@ module Dotify
|
|
25
25
|
installed.each {|i| yield(i, file_name(i)) }
|
26
26
|
end
|
27
27
|
|
28
|
+
def unlinked
|
29
|
+
dots = self.dots.map { |f| file_name(f) }
|
30
|
+
installed = self.installed.map {|f| file_name(f)}
|
31
|
+
unlinked = (dots - installed).map{|f| dotfile(f) }
|
32
|
+
return unlinked unless block_given?
|
33
|
+
unlinked.each {|u| yield(u, file_name(u)) }
|
34
|
+
end
|
35
|
+
|
28
36
|
def file_name(file)
|
29
37
|
file.split("/").last
|
30
38
|
end
|
@@ -37,6 +45,10 @@ module Dotify
|
|
37
45
|
File.join(Config.home, file_name(file))
|
38
46
|
end
|
39
47
|
|
48
|
+
def dotify(file)
|
49
|
+
File.join(Config.path, file_name(file))
|
50
|
+
end
|
51
|
+
|
40
52
|
def link_dotfile(file)
|
41
53
|
FileUtils.ln_s(file_name(file), Config.home) == 0 ? true : false
|
42
54
|
end
|
@@ -55,10 +67,6 @@ module Dotify
|
|
55
67
|
files.select { |f| !['.', '..'].include?(file_name(f)) }
|
56
68
|
end
|
57
69
|
|
58
|
-
def dotify_path
|
59
|
-
Config.path
|
60
|
-
end
|
61
|
-
|
62
70
|
end
|
63
71
|
end
|
64
72
|
end
|
data/lib/dotify/version.rb
CHANGED
data/spec/dotify/files_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'dotify/config'
|
2
3
|
require 'dotify/files'
|
3
4
|
require 'fileutils'
|
4
5
|
|
@@ -13,6 +14,7 @@ describe Dotify::Files do
|
|
13
14
|
after do
|
14
15
|
Fake.teardown
|
15
16
|
end
|
17
|
+
|
16
18
|
it "should respond to the right methods" do
|
17
19
|
Dotify::Files.should respond_to :dots
|
18
20
|
Dotify::Files.should respond_to :installed
|
@@ -30,6 +32,13 @@ describe Dotify::Files do
|
|
30
32
|
end
|
31
33
|
end
|
32
34
|
|
35
|
+
describe Dotify::Files, "#dotify" do
|
36
|
+
it "should return the path to the file when it is linked in the root" do
|
37
|
+
Dotify::Files.dotify(".vimrc").should == File.join(Dotify::Config.path, ".vimrc")
|
38
|
+
Dotify::Files.dotify("/spec/home/.bashrc").should == File.join(Dotify::Config.path, ".bashrc")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
33
42
|
describe Dotify::Files, "#dots" do
|
34
43
|
before do
|
35
44
|
Dotify::Files.stub(:file_list) do
|
@@ -50,6 +59,26 @@ describe Dotify::Files do
|
|
50
59
|
end
|
51
60
|
end
|
52
61
|
|
62
|
+
describe Dotify::Files, "#unlinked" do
|
63
|
+
before do
|
64
|
+
Dotify::Files.stub(:dots) do
|
65
|
+
['/spec/test/.vimrc', '/spec/test/.bashrc', '/spec/test/.zshrc']
|
66
|
+
end
|
67
|
+
Dotify::Files.stub(:installed) do
|
68
|
+
['/root/test/.bashrc', '/root/test/.zshrc']
|
69
|
+
end
|
70
|
+
end
|
71
|
+
it "should return the list of unlinked dotfiles in the root path" do
|
72
|
+
unlinked = Dotify::Files.unlinked.map { |u| Dotify::Files.file_name(u) }
|
73
|
+
unlinked.should include '.vimrc'
|
74
|
+
unlinked.should_not include '.bashrc'
|
75
|
+
end
|
76
|
+
it "shoud yield the unlinked files if a block is given" do
|
77
|
+
unlinked = Dotify::Files.unlinked.map { |u| [u, Dotify::Files.file_name(u)] }
|
78
|
+
expect { |b| Dotify::Files.unlinked(&b) }.to yield_successive_args(*unlinked)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
53
82
|
describe Dotify::Files, "#installed" do
|
54
83
|
before do
|
55
84
|
fake_root, dotify = Fake.paths
|
@@ -87,7 +116,7 @@ describe Dotify::Files do
|
|
87
116
|
|
88
117
|
describe Dotify::Files, "#link_dotfile" do
|
89
118
|
it "should receive a file and link it into the root path" do
|
90
|
-
first = File.join(Dotify::
|
119
|
+
first = File.join(Dotify::Config.path, ".vimrc")
|
91
120
|
FileUtils.should_receive(:ln_s).with(Dotify::Files.file_name(first), Dotify::Config.home).once
|
92
121
|
Dotify::Files.link_dotfile first
|
93
122
|
end
|