dotpack 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/dotpack/cli/app.rb +25 -1
- data/lib/dotpack/cli/flavor.rb +15 -17
- data/lib/dotpack/cli/repo.rb +38 -0
- data/lib/dotpack/config.rb +22 -5
- data/lib/dotpack/package.rb +23 -0
- data/lib/dotpack/repo.rb +44 -0
- data/lib/dotpack/runner.rb +90 -0
- data/lib/dotpack/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 539c18bfaa268973a4c4495a4a66b46df2ee2444
|
4
|
+
data.tar.gz: 43450e8fcbc340c1148a025e9ebd3033a1224267
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f74a38d9c30a5a09957e0f03a2289aca5b5c57cfcfe11ef1aa1d0a6e46fee45b6c117fc66ee528355b3405faa26226d255309abcdec639d9bfbc5c7964cdb81
|
7
|
+
data.tar.gz: 2b8f7f16dc328af5b52fb95e157b3c428bcb9b25edd76e1c31b367924073dec57ecca4d0c46c2ea3be4f5449dca7d4c6569ee6f4c3f8ee960799f1443fa9df36
|
data/lib/dotpack/cli/app.rb
CHANGED
@@ -1,10 +1,34 @@
|
|
1
1
|
require 'thor'
|
2
2
|
require 'dotpack/cli/flavor'
|
3
|
+
require 'dotpack/cli/repo'
|
4
|
+
require 'dotpack/package'
|
5
|
+
require 'dotpack/runner'
|
3
6
|
|
4
7
|
module Dotpack
|
5
8
|
module Cli
|
6
9
|
class App < Thor
|
7
|
-
register(Cli::Flavor, 'flavor', 'flavor <command>', 'Add, remove or list flavors
|
10
|
+
register(Cli::Flavor, 'flavor', 'flavor <command>', 'Add, remove or list flavors')
|
11
|
+
register(Cli::Repo, 'repo', 'repo <command>', 'Manage repositories')
|
12
|
+
|
13
|
+
desc "relink", "Create or recreate dotfiles and link them"
|
14
|
+
def relink
|
15
|
+
Runner.clear
|
16
|
+
runner = Runner.new
|
17
|
+
Package.all.each do |package|
|
18
|
+
runner.start package
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "update", "Update the dotfiles from source"
|
23
|
+
def update
|
24
|
+
repos = Dotpack::Repo.all
|
25
|
+
relink if repos.map(&:update).any?
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "clear", "Clear every symlink"
|
29
|
+
def clear
|
30
|
+
Runner.clear
|
31
|
+
end
|
8
32
|
end
|
9
33
|
end
|
10
34
|
end
|
data/lib/dotpack/cli/flavor.rb
CHANGED
@@ -5,31 +5,29 @@ require 'dotpack/config'
|
|
5
5
|
module Dotpack
|
6
6
|
module Cli
|
7
7
|
class Flavor < Thor
|
8
|
-
desc('add [
|
9
|
-
def add(
|
10
|
-
|
11
|
-
|
12
|
-
next if Config.flavors.include? a
|
13
|
-
Config.flavors << a
|
14
|
-
puts "Added flavor: #{a}".bold
|
15
|
-
end
|
8
|
+
desc('add FLAVOR [VALUE]', 'Add flavor.')
|
9
|
+
def add(f, value='')
|
10
|
+
f = f.downcase
|
11
|
+
Config.set_flavor(f, value)
|
16
12
|
Config.save
|
17
13
|
end
|
18
14
|
|
19
|
-
desc('remove
|
20
|
-
def remove(
|
21
|
-
|
22
|
-
|
23
|
-
next unless Config.flavors.include? a
|
24
|
-
Config.flavors.delete a
|
25
|
-
puts "Removed flavor: #{a}".bold
|
26
|
-
end
|
15
|
+
desc('remove FLAVOR', 'Remove flavor.')
|
16
|
+
def remove(f)
|
17
|
+
f = f.downcase
|
18
|
+
Config.remove_flavor f
|
27
19
|
Config.save
|
28
20
|
end
|
29
21
|
|
30
22
|
desc('list', 'List used flavors.')
|
31
23
|
def list
|
32
|
-
|
24
|
+
Config.flavors.each do |k, v|
|
25
|
+
if v == '' || v.nil?
|
26
|
+
puts k
|
27
|
+
else
|
28
|
+
puts "#{k} = #{v}"
|
29
|
+
end
|
30
|
+
end
|
33
31
|
end
|
34
32
|
end
|
35
33
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'dotpack/repo'
|
3
|
+
|
4
|
+
module Dotpack
|
5
|
+
module Cli
|
6
|
+
class Repo < Thor
|
7
|
+
desc "list", "List installed repositories"
|
8
|
+
def list
|
9
|
+
::Dotpack::Repo.all.each{|r| puts r.name}
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "clone [ARG]", "Clone a new repository"
|
13
|
+
def clone(arg)
|
14
|
+
url = arg
|
15
|
+
name = arg.split('/').last
|
16
|
+
if name.include? ".git"
|
17
|
+
name[".git"] = ''
|
18
|
+
end
|
19
|
+
if arg =~ /\A[a-zA-Z0-9_-]+\/[\.a-zA-Z0-9_-]+\z/
|
20
|
+
url = "https://github.com/#{arg}.git"
|
21
|
+
name = arg.sub('/', '__')
|
22
|
+
end
|
23
|
+
Dir.chdir Config::BASE_DIR + '/repositories'
|
24
|
+
return if Dir.exist? name
|
25
|
+
system("git", "clone", url, name)
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "remove [ARGS]", "Remove repositories"
|
29
|
+
def remove(*args)
|
30
|
+
args.each do |repo|
|
31
|
+
r = ::Dotpack::Repo.find_by_name repo
|
32
|
+
next if r.nil?
|
33
|
+
FileUtils.rm_rf r.path
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/dotpack/config.rb
CHANGED
@@ -1,16 +1,33 @@
|
|
1
1
|
require 'fileutils'
|
2
|
+
require 'json'
|
2
3
|
|
3
4
|
module Dotpack
|
4
5
|
module Config
|
5
6
|
BASE_DIR = Dir.home + '/.dotpack'
|
6
7
|
FLAVORS_PATH = BASE_DIR + '/flavors'
|
7
8
|
|
8
|
-
@flavors =
|
9
|
+
@flavors = {}
|
9
10
|
@flavors_cached = false
|
10
11
|
|
12
|
+
def self.flavor(f)
|
13
|
+
cache_flavors
|
14
|
+
@flavors[f]
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.set_flavor(f, value='')
|
18
|
+
value = '' if value.nil?
|
19
|
+
cache_flavors
|
20
|
+
@flavors[f] = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.remove_flavor(f)
|
24
|
+
cache_flavors
|
25
|
+
@flavors.delete f
|
26
|
+
end
|
27
|
+
|
11
28
|
def self.flavors
|
12
29
|
cache_flavors
|
13
|
-
|
30
|
+
@flavors.clone
|
14
31
|
end
|
15
32
|
|
16
33
|
def self.save
|
@@ -20,7 +37,7 @@ module Dotpack
|
|
20
37
|
def self.save_flavors
|
21
38
|
return unless @flavors_cached
|
22
39
|
File.open(FLAVORS_PATH, 'w') do |file|
|
23
|
-
|
40
|
+
file.puts JSON.unparse(@flavors)
|
24
41
|
end
|
25
42
|
end
|
26
43
|
|
@@ -30,9 +47,9 @@ module Dotpack
|
|
30
47
|
|
31
48
|
FileUtils.mkdir_p BASE_DIR
|
32
49
|
unless File.exist? FLAVORS_PATH
|
33
|
-
|
50
|
+
File.write FLAVORS_PATH, "{}"
|
34
51
|
end
|
35
|
-
@flavors = File.read(FLAVORS_PATH)
|
52
|
+
@flavors = JSON.parse(File.read(FLAVORS_PATH))
|
36
53
|
@flavors_cached = true
|
37
54
|
end
|
38
55
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'dotpack/repo'
|
2
|
+
|
3
|
+
module Dotpack
|
4
|
+
class Package
|
5
|
+
attr_reader :path
|
6
|
+
|
7
|
+
@packages = nil
|
8
|
+
|
9
|
+
def self.all
|
10
|
+
return @packages unless @packages.nil?
|
11
|
+
repos = Repo.all
|
12
|
+
packages = repos.map{|x| Dir[x.path + "/*"]}.flatten
|
13
|
+
packages.select!{|x| File.exist? x + "/Dotpackfile"}
|
14
|
+
@packages = packages.map{|x| Package.new(x)}
|
15
|
+
@packages
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def initialize(path)
|
20
|
+
@path = path
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/dotpack/repo.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'dotpack/config'
|
3
|
+
|
4
|
+
module Dotpack
|
5
|
+
REPO_DIR = Config::BASE_DIR + '/repositories'
|
6
|
+
|
7
|
+
class Repo
|
8
|
+
attr_reader :path, :name
|
9
|
+
|
10
|
+
@repos = nil
|
11
|
+
|
12
|
+
def self.all
|
13
|
+
return @repos unless @repos.nil?
|
14
|
+
FileUtils.mkdir_p REPO_DIR
|
15
|
+
@repos = Dir[REPO_DIR + '/*'].map{|p| Repo.new(p)}
|
16
|
+
@repos
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.find_by_name(name)
|
20
|
+
repos = all()
|
21
|
+
repos.each do |r|
|
22
|
+
return r if r.name == name
|
23
|
+
end
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def update
|
28
|
+
Dir.chdir @path
|
29
|
+
return false unless system "git fetch origin >/dev/null 2>&1"
|
30
|
+
commits = `git log HEAD..origin/master --oneline`
|
31
|
+
return false if commits == ""
|
32
|
+
last = commits.lines.last.split(' ').first
|
33
|
+
puts "Updated #{@name} to #{last}"
|
34
|
+
system "git pull -f origin master >/dev/null"
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def initialize(path)
|
40
|
+
@path = path
|
41
|
+
@name = File.basename(path).sub(/(.*)__/, '\1/')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'erb'
|
3
|
+
require 'dotpack/config'
|
4
|
+
|
5
|
+
module Dotpack
|
6
|
+
class Runner
|
7
|
+
LOCAL_DIR = Config::BASE_DIR + '/local'
|
8
|
+
|
9
|
+
def self.clear
|
10
|
+
FileUtils.rm_rf(LOCAL_DIR)
|
11
|
+
if File.exist? Config::BASE_DIR + '/links'
|
12
|
+
File.foreach(Config::BASE_DIR + '/links') do |line|
|
13
|
+
line.chomp!
|
14
|
+
if File.exist?(line) || File.symlink?(line)
|
15
|
+
File.unlink(line)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
File.unlink(Config::BASE_DIR + '/links')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def start(package)
|
23
|
+
@links = File.open(Config::BASE_DIR + '/links', "a")
|
24
|
+
pwd = Dir.pwd
|
25
|
+
Dir.chdir package.path
|
26
|
+
instance_eval File.read(package.path + "/Dotpackfile")
|
27
|
+
Dir.chdir pwd
|
28
|
+
@links.close
|
29
|
+
@links = nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def pack(path)
|
33
|
+
return unless File.exist? path
|
34
|
+
target = path.split('/').map do |p|
|
35
|
+
if p[0] == '_'
|
36
|
+
'.' + p[1..-1]
|
37
|
+
else
|
38
|
+
p
|
39
|
+
end
|
40
|
+
end
|
41
|
+
target = target.join "/"
|
42
|
+
sym = Dir.home + '/' + target
|
43
|
+
|
44
|
+
if File.directory? path
|
45
|
+
FileUtils.mkdir_p sym
|
46
|
+
FileUtils.mkdir_p LOCAL_DIR + '/' + target
|
47
|
+
else
|
48
|
+
if path.include? '/'
|
49
|
+
pack(File.dirname path)
|
50
|
+
end
|
51
|
+
if File.exist?(sym) || File.symlink?(sym)
|
52
|
+
File.unlink sym
|
53
|
+
end
|
54
|
+
erb = ERB.new(File.read(path))
|
55
|
+
result = erb.result(binding)
|
56
|
+
File.write LOCAL_DIR + '/' + target, result
|
57
|
+
File.symlink(File.expand_path(LOCAL_DIR + '/' + target), sym)
|
58
|
+
@links.puts sym
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def pack_recurse(path)
|
63
|
+
return unless File.exist? path
|
64
|
+
if File.directory? path
|
65
|
+
Dir[path + '/**/*'].each {|x| pack(x)}
|
66
|
+
else
|
67
|
+
pack(path)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def flavor?(f)
|
72
|
+
!!flavor(f)
|
73
|
+
end
|
74
|
+
|
75
|
+
def flavor(f)
|
76
|
+
f = f.to_s if f.is_a? Symbol
|
77
|
+
Config.flavor(f)
|
78
|
+
end
|
79
|
+
|
80
|
+
def flavor_present?(f)
|
81
|
+
return !!flavor!
|
82
|
+
end
|
83
|
+
|
84
|
+
def flavor!(f)
|
85
|
+
v = flavor(f)
|
86
|
+
return nil if v == ''
|
87
|
+
v
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/dotpack/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dotpack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nax
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -79,7 +79,11 @@ files:
|
|
79
79
|
- lib/dotpack/cli.rb
|
80
80
|
- lib/dotpack/cli/app.rb
|
81
81
|
- lib/dotpack/cli/flavor.rb
|
82
|
+
- lib/dotpack/cli/repo.rb
|
82
83
|
- lib/dotpack/config.rb
|
84
|
+
- lib/dotpack/package.rb
|
85
|
+
- lib/dotpack/repo.rb
|
86
|
+
- lib/dotpack/runner.rb
|
83
87
|
- lib/dotpack/version.rb
|
84
88
|
homepage: https://github.com/Nax/dotpack
|
85
89
|
licenses:
|