dotfu 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/dotfu/repos.rb +80 -22
- data/lib/dotfu/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3be9876e7c3827258b2d2fbf1efd68a6963df450
|
4
|
+
data.tar.gz: 948c87f6da4ea64b88ee514543cecf3fa80cbe12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 416127a74da102f1c562a98ed28315d1b23ffce0eede1f8dcfb621e85e1d6c9de62dcc389f17877c5e84a7c053c4a24227cbe0b86434ef03931468f098268589
|
7
|
+
data.tar.gz: 0c963d190761c0f9e64ad9789b89960b4bcce6047e1c7c15c7b36e34bf4fe692d9f99f8253ea3a2822f492778a6e9aad5cce026ffe97a2a5e0cb85e20a9962cc
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# 0.2.0
|
2
|
+
* Backups! sooner then expected.
|
3
|
+
* Will now only make dot files in the home dir.
|
4
|
+
* updating actually works now, though needs to be refactored.
|
5
|
+
|
1
6
|
# 0.1.1
|
2
7
|
* Switched from calling git myself to using the one on rubygems. Has issues, but less.
|
3
8
|
* Fixed branch logic.
|
data/lib/dotfu/repos.rb
CHANGED
@@ -6,6 +6,7 @@ module Dotfu
|
|
6
6
|
attr_accessor :config_file
|
7
7
|
attr_accessor :working_dir
|
8
8
|
attr_accessor :target_dir
|
9
|
+
attr_accessor :backup_dir
|
9
10
|
|
10
11
|
# r can be either a repo, or a user:repo pair.
|
11
12
|
def initialize(arg = nil)
|
@@ -14,13 +15,12 @@ module Dotfu
|
|
14
15
|
end
|
15
16
|
|
16
17
|
### Specialized attribute methods
|
17
|
-
def
|
18
|
-
return @
|
18
|
+
def backup_dir
|
19
|
+
return @backup_dir ? @backup_dir : "#{Bini.data_dir}/backups/#{repo}"
|
19
20
|
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
return @repo = word.start_with?('dotfiles-') ? word : "dotfiles-#{word}"
|
22
|
+
def config_file
|
23
|
+
return @config_file ? @config_file : "dotfu.json"
|
24
24
|
end
|
25
25
|
|
26
26
|
# target_dir should always return something.
|
@@ -28,9 +28,9 @@ module Dotfu
|
|
28
28
|
return @target_dir ? @target_dir : Dir.home
|
29
29
|
end
|
30
30
|
|
31
|
-
#
|
32
|
-
def
|
33
|
-
return @
|
31
|
+
# prepend repo with dotfiles- if it doesn't exist as it is set.
|
32
|
+
def repo=(word)
|
33
|
+
return @repo = word.start_with?('dotfiles-') ? word : "dotfiles-#{word}"
|
34
34
|
end
|
35
35
|
|
36
36
|
# return the explicit directory this repo is cloned into.
|
@@ -39,7 +39,35 @@ module Dotfu
|
|
39
39
|
return "#{Bini.data_dir}/repos/#{user}/#{repo}"
|
40
40
|
end
|
41
41
|
|
42
|
+
# return user or the user in the config file.
|
43
|
+
def user
|
44
|
+
return @user ? @user : Dotfu.config_user
|
45
|
+
end
|
46
|
+
|
42
47
|
### Work methods
|
48
|
+
def backup
|
49
|
+
return nil if installed?
|
50
|
+
files = existing_files false
|
51
|
+
|
52
|
+
if files.any?
|
53
|
+
FileUtils.mkdir_p backup_dir
|
54
|
+
|
55
|
+
files.each do |target_file|
|
56
|
+
working_file = target_file.split("#{target_dir}/").last
|
57
|
+
next if is_my_file? target_file
|
58
|
+
|
59
|
+
begin
|
60
|
+
FileUtils.mv target_file, "#{backup_dir}/#{working_file}"
|
61
|
+
rescue Exception => e
|
62
|
+
puts e
|
63
|
+
exit
|
64
|
+
#puts raise RuntimeError.new "File move failed for: #{working_file} to #{backup_dir}/#{working_file} failed: #{e}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
return true
|
70
|
+
end
|
43
71
|
|
44
72
|
# initial clone
|
45
73
|
def clone
|
@@ -64,13 +92,12 @@ module Dotfu
|
|
64
92
|
r = Git.init working_dir
|
65
93
|
|
66
94
|
result = r.checkout(@branch ? branch : "master")
|
67
|
-
|
68
95
|
raise RuntimeError.new result unless result
|
69
96
|
|
70
|
-
#
|
71
|
-
|
72
|
-
|
73
|
-
|
97
|
+
# Backup!
|
98
|
+
if existing_files(false)
|
99
|
+
puts "wtf, backup failed" unless backup
|
100
|
+
end
|
74
101
|
|
75
102
|
# And now that we are ok with everything, lets make some fucking files.
|
76
103
|
# TODO: add deep linking (mkdir + ln_s for each target) or shallow (just the first directory)
|
@@ -83,17 +110,31 @@ module Dotfu
|
|
83
110
|
def pull
|
84
111
|
return nil if !repo || !user
|
85
112
|
r = Git.init working_dir
|
86
|
-
|
87
|
-
# to muck something up for someone. Find a way to do this explicitly.
|
113
|
+
r.fetch
|
114
|
+
#TODO: I'm confident that the implicit decleration of first here is going to muck something up for someone. Find a way to do this explicitly.
|
88
115
|
return r.remote.merge
|
89
116
|
end
|
90
117
|
|
118
|
+
# Restore files (as neccessary)
|
119
|
+
def restore
|
120
|
+
files = Dir.glob("#{backup_dir}/**/*")
|
121
|
+
|
122
|
+
raise "Files in the way" if existing_files
|
123
|
+
|
124
|
+
return true if files.empty?
|
125
|
+
|
126
|
+
files.each do |f|
|
127
|
+
FileUtils.mv f, target_dir
|
128
|
+
end
|
129
|
+
|
130
|
+
return true
|
131
|
+
end
|
132
|
+
|
91
133
|
def uninstall
|
92
134
|
raise RuntimeError.new "Not installed." unless installed?
|
93
135
|
|
94
|
-
# ok we are not installed, lets clear the links. Later, this will restore
|
95
|
-
# the backups (or something similiar).
|
96
136
|
target_files.each {|f| FileUtils.rm f}
|
137
|
+
restore
|
97
138
|
return true
|
98
139
|
end
|
99
140
|
|
@@ -124,11 +165,12 @@ module Dotfu
|
|
124
165
|
return true
|
125
166
|
end
|
126
167
|
|
127
|
-
# Return true if this file
|
168
|
+
# Return true if this file is linked to this repo.
|
128
169
|
def is_my_file?(file)
|
129
170
|
return true if File.exist?(file) && File.symlink?(file) && File.readlink(file).start_with?(working_dir)
|
130
171
|
return false
|
131
172
|
end
|
173
|
+
|
132
174
|
# return an [Array] of base filenames.
|
133
175
|
def files
|
134
176
|
if !@files
|
@@ -139,10 +181,26 @@ module Dotfu
|
|
139
181
|
return @files
|
140
182
|
end
|
141
183
|
|
184
|
+
# return an array of existing files in the way.
|
185
|
+
# Accepts a [Boolean] as the only argument, true to return files we linked (default),
|
186
|
+
# false if we want just the files that are in the way.
|
187
|
+
def existing_files(my_files = true)
|
188
|
+
# I can do this in a convoluted set of if checks, of a couple readable selects.
|
189
|
+
output = target_files.select { |f| File.exist? f }
|
190
|
+
output.delete_if { |f| my_files && is_my_file?(f)}
|
191
|
+
|
192
|
+
return output
|
193
|
+
end
|
194
|
+
|
142
195
|
# Return the target file.
|
143
196
|
# Takes a [String] (explicit conversion) or [Array] for index lookup.
|
144
|
-
|
145
|
-
|
197
|
+
# dot_home is a [Boolean] that will dot the target dir if it is the home
|
198
|
+
# dir only.
|
199
|
+
def target_file(file, dot_home = true)
|
200
|
+
output = "#{target_dir}/"
|
201
|
+
output += "." if dot_home && target_dir == Dir.home
|
202
|
+
output += file_string(file)
|
203
|
+
return output
|
146
204
|
end
|
147
205
|
|
148
206
|
# Return an [Array] of target files.
|
@@ -161,7 +219,6 @@ module Dotfu
|
|
161
219
|
files.map {|f| working_file f}
|
162
220
|
end
|
163
221
|
|
164
|
-
|
165
222
|
private
|
166
223
|
# So our input is now username@repo:branch
|
167
224
|
# Repo is the only one required.
|
@@ -181,7 +238,7 @@ module Dotfu
|
|
181
238
|
return nil unless config_file?
|
182
239
|
|
183
240
|
content = Yajl.load open("#{working_dir}/#{config_file}")
|
184
|
-
@target_dir = content["target_directory"] if content["target_directory"]
|
241
|
+
@target_dir = content["target_directory"].chomp("/") if content["target_directory"]
|
185
242
|
end
|
186
243
|
|
187
244
|
# Accepts a string or fixnum. Returns either the string or the files[fixnum]
|
@@ -191,3 +248,4 @@ module Dotfu
|
|
191
248
|
end
|
192
249
|
end
|
193
250
|
end
|
251
|
+
|
data/lib/dotfu/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dotfu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ernie Brodeur
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bini
|
@@ -132,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
132
|
version: '0'
|
133
133
|
requirements: []
|
134
134
|
rubyforge_project:
|
135
|
-
rubygems_version: 2.0.
|
135
|
+
rubygems_version: 2.0.2
|
136
136
|
signing_key:
|
137
137
|
specification_version: 4
|
138
138
|
summary: More to come . . .
|