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.
- checksums.yaml +4 -4
- data/ChangeLog.md +8 -0
- data/README.md +14 -10
- data/bin/effuse +81 -76
- data/effuse.gemspec +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 1d68dcfbe45037643f26e40c799f57b68aa930d1
         | 
| 4 | 
            +
              data.tar.gz: 6867ba6d3a880dbf9a2a92068a0e7178c2b1e4fe
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 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 | 
| 34 | 
            -
            opinion on the matter using `effuse  | 
| 35 | 
            -
            talking to using a `.effuseignore` file? Just put one | 
| 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 [ | 
| 42 | 
            +
            Usage: effuse [OPTIONS] [DEST]
         | 
| 43 | 
            +
                -i, --import                     Import existing files
         | 
| 40 44 | 
             
                -c, --clean                      Remove symlinks
         | 
| 41 45 |  | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 46 | 
            +
                    --exclude GLOB               Exclude GLOB from symlinking
         | 
| 47 | 
            +
                    --include GLOB               Include GLOB in symlinking
         | 
| 44 48 |  | 
| 45 | 
            -
                -y, -- | 
| 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 | 
| 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)  | 
| 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 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
                 | 
| 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 [ | 
| 24 | 
            +
              o.banner = 'Usage: effuse [OPTIONS] [DEST]'
         | 
| 22 25 |  | 
| 23 | 
            -
              o.on('- | 
| 24 | 
            -
             | 
| 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(' | 
| 30 | 
            -
                 | 
| 31 | 
            +
              o.on('--exclude GLOB', 'Exclude GLOB from symlinking') do |glob|
         | 
| 32 | 
            +
                opts.exclude << glob
         | 
| 31 33 | 
             
              end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 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', '-- | 
| 40 | 
            -
                 | 
| 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 | 
            -
                 | 
| 44 | 
            +
                opts.backup = false
         | 
| 45 45 | 
             
              end
         | 
| 46 46 |  | 
| 47 47 | 
             
              o.separator ''
         | 
| 48 48 |  | 
| 49 | 
            -
              o.on('-p', '--prefix PREFIX', 'Prefix  | 
| 50 | 
            -
                 | 
| 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')  | 
| 56 | 
            -
             | 
| 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]  | 
| 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 | 
            -
             | 
| 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 | 
            -
               | 
| 100 | 
            +
              vputs "scanning '#{dir}'"
         | 
| 77 101 | 
             
              Dir.foreach(dir) do |file|
         | 
| 78 102 | 
             
                next if ['.', '..'].include?(file)
         | 
| 79 103 |  | 
| 80 | 
            -
                if  | 
| 81 | 
            -
                   | 
| 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 | 
            -
                 | 
| 94 | 
            -
                relpath = file.split('/') | 
| 95 | 
            -
                 | 
| 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  | 
| 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 | 
            -
                   | 
| 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 | 
            -
                     | 
| 136 | 
            +
                    vputs "already symlinked '#{dest}'"
         | 
| 114 137 | 
             
                    next
         | 
| 115 | 
            -
                   | 
| 116 | 
            -
                    if  | 
| 117 | 
            -
                       | 
| 118 | 
            -
                       | 
| 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 | 
            -
                       | 
| 121 | 
            -
                       | 
| 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 | 
            -
                     | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 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
    
    
    
        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:  | 
| 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- | 
| 11 | 
            +
            date: 2013-05-14 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies: []
         | 
| 13 13 | 
             
            description: A tool for managing symlinks
         | 
| 14 14 | 
             
            email:
         |