effuse 1.1.1 → 2.0.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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog.md +8 -0
  3. data/README.md +14 -10
  4. data/bin/effuse +81 -76
  5. data/effuse.gemspec +1 -1
  6. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9af763c78ab8f6214154acfccb9ac9ae84597af4
4
- data.tar.gz: a1688e2e82a8cccad953594be015bf5717a3097e
3
+ metadata.gz: 1d68dcfbe45037643f26e40c799f57b68aa930d1
4
+ data.tar.gz: 6867ba6d3a880dbf9a2a92068a0e7178c2b1e4fe
5
5
  SHA512:
6
- metadata.gz: 0aa2d3fd247e8e99bfe7b878415936545bcf9ebeec5d03a457745ddc071f9ff197e818c5f4a0989933080547f7c493ce0570e0599c8e01d399aa2369d7b7fbe1
7
- data.tar.gz: 224a780aac1d07a85f92a4171d7a58a93a1ce0bb58571eca22c5d165679a49e6389b196f38810858a7f6b7a8f259d0322702ca4e5dd8a0ec358de19d8b78e705
6
+ metadata.gz: 4c6f1c2f9f94c3c7c95ff82668d9ec50e8d8c01c3c3547535306ed870f31ff56f42a81038335b980fb5acae42951172397dd62e842e3d282f7ee16866f4aac95
7
+ data.tar.gz: 7cfc78918e423fa35938dd5136d4382c8d2bf162ab26e145c26e1ff7bae097b6f7b6026e50311861cf7af401e4587e9b9d95e7f47e66c4bc8d9f9fdc77030a69
data/ChangeLog.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Change Log
2
2
 
3
+ ## 2.0.0 (May 13 2013)
4
+
5
+ * Replace existing files by default
6
+ * Added `--import` option to import existing files
7
+ * Changed `--noconfirm` to `--no-confirm`
8
+ * Backup files to `.file.effuse`
9
+ * Removed short forms of `--exclude` and `--include` options
10
+
3
11
  ## 1.1.1 (March 12 2013)
4
12
 
5
13
  * Dropped Ruby 1.8 compatibility
data/README.md CHANGED
@@ -26,26 +26,30 @@ symlinks to all your configurations in your home directory!
26
26
  Your configurations don't go in your home directory? No problem! Just run
27
27
  `effuse /path/` and the symlinks will be created wherever your heart desires.
28
28
 
29
+ Would you rather import a dotfile from your system into your repository
30
+ than replace it? No problem, just use `effuse --import`.
31
+
29
32
  Symlinks aren't working out for you? Effuse has got you covered. Just run
30
33
  `effuse --clean` in your dotfiles repository and it will remove all those nasty
31
34
  symlinks it created before.
32
35
 
33
- Don't want to symlink a certain bothersome file? Why not tell Effuse your
34
- opinion on the matter using `effuse -e file`? Or why not give it a stern
35
- talking to using a `.effuseignore` file? Just put one file glob to exclude per
36
- line in there and never worry again.
36
+ Don't want to symlink a certain bothersome file? Why not tell Effuse
37
+ your opinion on the matter using `effuse --exclude file`? Or why not
38
+ give it a stern talking to using a `.effuseignore` file? Just put one
39
+ file glob to exclude per line in there and never worry again.
37
40
 
38
41
  ```
39
- Usage: effuse [OPTION...] [DEST]
42
+ Usage: effuse [OPTIONS] [DEST]
43
+ -i, --import Import existing files
40
44
  -c, --clean Remove symlinks
41
45
 
42
- -e, --exclude GLOB Exclude GLOB from symlinking
43
- -i, --include GLOB Include GLOB in symlinking
46
+ --exclude GLOB Exclude GLOB from symlinking
47
+ --include GLOB Include GLOB in symlinking
44
48
 
45
- -y, --noconfirm CHOICE Assume CHOICE on file conflicts
49
+ -y, --no-confirm Do not ask before replacing files
46
50
  -n, --no-backup Do not create backup files
47
51
 
48
- -p --prefix PREFIX Prefix relative paths with PREFIX
52
+ -p, --prefix PREFIX Prefix symlinked paths with PREFIX
49
53
 
50
54
  -v, --verbose Show verbose output
51
55
  -h, --help Show this message
@@ -53,7 +57,7 @@ Usage: effuse [OPTION...] [DEST]
53
57
 
54
58
  ## License
55
59
 
56
- Copyright (c) 2011, Curtis McEnroe <programble@gmail.com>
60
+ Copyright (c) 2012-2013, Curtis McEnroe <programble@gmail.com>
57
61
 
58
62
  Permission to use, copy, modify, and/or distribute this software for any
59
63
  purpose with or without fee is hereby granted, provided that the above
data/bin/effuse CHANGED
@@ -1,155 +1,160 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'fileutils'
3
4
  require 'optparse'
4
5
  require 'ostruct'
5
- require 'fileutils'
6
-
7
- options = OpenStruct.new(:verbose => false,
8
- :clean => false,
9
- :noconfirm => nil,
10
- :backup => true,
11
- :prefix => '',
12
- :exclude => %w[.effuseignore .git .gitignore .gitmodules *~ .*~ .*.swp])
13
6
 
14
- if File.exist?('.effuseignore')
15
- File.open('.effuseignore').each_line do |line|
16
- options.exclude << line.chomp
7
+ opts = OpenStruct.new(dest_dir: Dir.home,
8
+ import: false,
9
+ clean: false,
10
+ confirm: true,
11
+ backup: true,
12
+ prefix: '',
13
+ verbose: false,
14
+ exclude: %w[.effuseignore .git .gitignore .gitmodules
15
+ *~ .*~ .*.swp])
16
+
17
+ if File.file?('.effuseignore')
18
+ File.open('.effuseignore').each_line do |glob|
19
+ opts.exclude << glob.chomp
17
20
  end
18
21
  end
19
22
 
20
23
  OptionParser.new do |o|
21
- o.banner = 'Usage: effuse [OPTION...] [DEST]'
24
+ o.banner = 'Usage: effuse [OPTIONS] [DEST]'
22
25
 
23
- o.on('-c', '--clean', 'Remove symlinks') do
24
- options.clean = true
25
- end
26
+ o.on('-i', '--import', 'Import existing files') { opts.import = true }
27
+ o.on('-c', '--clean', 'Remove symlinks') { opts.clean = true }
26
28
 
27
29
  o.separator ''
28
30
 
29
- o.on('-e', '--exclude GLOB', 'Exclude GLOB from symlinking') do |glob|
30
- options.exclude << glob
31
+ o.on('--exclude GLOB', 'Exclude GLOB from symlinking') do |glob|
32
+ opts.exclude << glob
31
33
  end
32
-
33
- o.on('-i', '--include GLOB', 'Include GLOB in symlinking') do |glob|
34
- options.exclude.delete(glob)
34
+ o.on('--include GLOB', 'Include GLOB in symlinking') do |glob|
35
+ opts.exclude.delete(glob)
35
36
  end
36
37
 
37
38
  o.separator ''
38
39
 
39
- o.on('-y', '--noconfirm CHOICE', 'Assume CHOICE on file conflicts') do |choice|
40
- options.noconfirm = choice.downcase[0]
40
+ o.on('-y', '--no-confirm', 'Do not ask before replacing files') do
41
+ opts.confirm = false
41
42
  end
42
-
43
43
  o.on('-n', '--no-backup', 'Do not create backup files') do
44
- options.backup = false
44
+ opts.backup = false
45
45
  end
46
46
 
47
47
  o.separator ''
48
48
 
49
- o.on('-p', '--prefix PREFIX', 'Prefix relative paths with PREFIX') do |prefix|
50
- options.prefix = prefix
49
+ o.on('-p', '--prefix PREFIX', 'Prefix symlinked paths with PREFIX') do |prefix|
50
+ opts.prefix = prefix
51
51
  end
52
52
 
53
53
  o.separator ''
54
54
 
55
- o.on('-v', '--verbose', 'Show verbose output') do
56
- options.verbose = true
57
- end
58
-
59
- o.on_tail("-h", "--help", "Show this message") do
55
+ o.on('-v', '--verbose', 'Show verbose output') { opts.verbose = true }
56
+ o.on_tail('-h', '--help', 'Show this message') do
60
57
  puts o
61
58
  exit
62
59
  end
63
60
  end.parse!
64
61
 
65
- dest_dir = ARGV[0] || Dir.home
62
+ opts.dest_dir = ARGV[0] if ARGV[0]
66
63
 
67
- if File.identical?(dest_dir, '.')
64
+ if File.identical?(opts.dest_dir, '.')
68
65
  puts 'error: destination directory is current directory'
69
66
  exit 1
70
67
  end
71
68
 
72
- files = {}
69
+ $opts = opts # Don't hate me
70
+
71
+ def vputs(s)
72
+ puts s if $opts.verbose
73
+ end
74
+
75
+ def confirm?(s)
76
+ return true unless $opts.confirm
77
+ loop do
78
+ print "#{s} [Y/n] "
79
+ input = $stdin.gets.chomp
80
+ return true if input.empty? || input[0].downcase == ?y
81
+ return false if input[0].downcase == ?n
82
+ end
83
+ end
84
+
85
+ def backup(src)
86
+ if $opts.backup
87
+ dest = File.join(File.dirname(src), ".#{File.basename(src)}.effuse")
88
+ vputs "renaming '#{src}' -> '#{dest}'"
89
+ File.rename(src, dest)
90
+ else
91
+ vputs "deleting '#{src}'"
92
+ File.delete(src)
93
+ end
94
+ end
95
+
73
96
  dirs = ['.']
97
+ files = {}
74
98
 
75
99
  dirs.each do |dir|
76
- puts "scanning #{dir}" if options.verbose
100
+ vputs "scanning '#{dir}'"
77
101
  Dir.foreach(dir) do |file|
78
102
  next if ['.', '..'].include?(file)
79
103
 
80
- if options.exclude.any? {|e| File.fnmatch(e, file)}
81
- puts "excluding #{File.join(dir, file)}" if options.verbose
104
+ if opts.exclude.any? {|glob| File.fnmatch(glob, file) }
105
+ vputs "excluding '#{File.join(dir, file)}'"
82
106
  next
83
107
  end
84
108
 
85
109
  file = File.join(dir, file)
86
110
 
87
111
  if File.directory?(file)
112
+ vputs "adding '#{file}'"
88
113
  dirs << file
89
- puts "adding #{file}" if options.verbose
90
114
  next
91
115
  end
92
116
 
93
- puts "found #{file}" if options.verbose
94
- relpath = file.split('/')[1..-1]
95
- dest = File.join([dest_dir, options.prefix + relpath[0]] + relpath[1..-1])
96
- files[File.absolute_path(file)] = dest
117
+ vputs "found '#{file}'"
118
+ relpath = opts.prefix + File.join(file.split('/').drop(1))
119
+ files[File.absolute_path(file)] = File.join(opts.dest_dir, relpath)
97
120
  end
98
121
  end
99
122
 
100
- if options.clean
123
+ if opts.clean
101
124
  files.each_pair do |src, dest|
102
125
  if File.exist?(dest) && File.identical?(src, dest)
103
126
  puts dest
104
127
  File.delete(dest)
105
128
  else
106
- puts "not symlinked #{dest}" if options.verbose
129
+ vputs "not symlinked '#{dest}'"
107
130
  end
108
131
  end
109
132
  else
110
133
  files.each_pair do |src, dest|
111
134
  if File.exist?(dest)
112
135
  if File.identical?(src, dest)
113
- puts "already symlinked #{dest}" if options.verbose
136
+ vputs "already symlinked '#{dest}'"
114
137
  next
115
- else
116
- if options.noconfirm
117
- input = options.noconfirm
118
- puts "assuming '#{input}' for #{dest}" if options.verbose
138
+ elsif opts.import
139
+ if confirm?("'#{dest}' already exists. Import it?")
140
+ backup(src)
141
+ vputs "renaming '#{dest}' -> '#{src}'"
142
+ File.rename(dest, src)
119
143
  else
120
- puts "File already exists: #{dest}"
121
- puts " [R] Backup and replace"
122
- puts " [i] Import original file and symlink"
123
- puts " [k] Keep original file"
124
-
125
- loop do
126
- input = gets.chomp.downcase[0] || 'r'
127
- break if 'rik'.include?(input)
128
- puts "Error: '#{input}' is not an option"
129
- end
144
+ vputs "skipping '#{dest}'"
145
+ next
130
146
  end
131
-
132
- case input
133
- when 'r'
134
- if options.backup
135
- puts "renaming #{dest} -> #{dest + '~'}" if options.verbose
136
- File.rename(dest, dest + '~')
137
- end
138
- when 'i'
139
- if options.backup
140
- puts "renaming #{src} -> #{src + '~'}" if options.verbose
141
- File.rename(src, src + '~')
142
- end
143
- puts "renaming #{dest} -> #{src}" if options.verbose
144
- File.rename(dest, src)
145
- when 'k'
146
- puts "skipping #{dest}" if options.verbose
147
+ else # Replace destination file
148
+ if confirm?("'#{dest}' already exists. Replace it?")
149
+ backup(dest)
150
+ else
151
+ vputs "skipping '#{dest}'"
147
152
  next
148
153
  end
149
154
  end
150
155
  end
151
156
 
152
- puts "#{dest} -> #{src}"
157
+ puts "'#{dest}' -> '#{src}'"
153
158
  FileUtils.mkdir_p(File.dirname(dest))
154
159
  File.symlink(src, dest)
155
160
  end
data/effuse.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'effuse'
3
- s.version = '1.1.1'
3
+ s.version = '2.0.0'
4
4
  s.authors = ['Curtis McEnroe']
5
5
  s.email = ['programble@gmail.com']
6
6
  s.homepage = 'https://github.com/programble/effuse'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effuse
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Curtis McEnroe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-12 00:00:00.000000000 Z
11
+ date: 2013-05-14 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A tool for managing symlinks
14
14
  email: