dotmodule 0.0.1 → 0.0.2
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/README.md +105 -15
- data/lib/dotmodule.rb +34 -13
- data/lib/dotmodule/version.rb +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: 97a5f89a98b981463d33e24efb62b8027fe11064
|
4
|
+
data.tar.gz: 29f5b4893fe4355a1ab607566761abd20d9d5471
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54885352278cd8a5f1dc30adf05446d2028e3ffb43e368038ac4bd34ab5ab7d4697a891a483673577e0263fba78fc80dbf81bfcf24b594d1097bdcc896b83445
|
7
|
+
data.tar.gz: 2b0a4f1f1800763430233ea4dd4c1c5c50f777f9e0b5e091174415f5c8e4c6de44210e59c0fa09778248a3492e9409131e2f4a3e092b8a4294404e3938d96996
|
data/README.md
CHANGED
@@ -1,38 +1,128 @@
|
|
1
1
|
# Dotmodule
|
2
2
|
|
3
|
-
|
3
|
+
## Overview
|
4
4
|
|
5
|
-
|
5
|
+
This is a simple management helper for modular dotfile repositories.
|
6
|
+
|
7
|
+
It decorates [GNU Stow](https://www.gnu.org/software/stow/) with a couple of minor but useful (to me) features:
|
8
|
+
- Pre- and post- installation scripts (e.g. to check out other projects from git -- i.e. spacemacs)
|
9
|
+
- Shared directory configuration via an optional config file (to safeguard against collisions between GNU Stow and other applications -- more detail below)
|
10
|
+
- Defining a subset of 'core' modules to be installed on all systems
|
11
|
+
|
12
|
+
This can be used with an existing stow link farm as-is, adding use of new features as needed on a per-module basis.
|
13
|
+
|
14
|
+
The (optional) configuration file is `dotmodule.collection`, a file in YAML format located at the collection root.
|
15
|
+
It is only required if defining shared folders and/or a core module set.
|
6
16
|
|
7
17
|
## Installation
|
8
18
|
|
9
|
-
|
19
|
+
$ gem install dotmodule
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
### Basic usage
|
24
|
+
|
25
|
+
Organise your dotfiles in modules, one per directory (i.e. a standard link farm for GNU Stow). Given a dotmodule collection at ~/dotfiles...
|
10
26
|
|
11
|
-
```ruby
|
12
|
-
gem 'dotmodule'
|
13
27
|
```
|
28
|
+
$ cd ~/dotfiles
|
29
|
+
|
30
|
+
$ dotmodule install
|
14
31
|
|
15
|
-
|
32
|
+
Collection root: /home/cormacc/dotfiles
|
33
|
+
Default target: /home/cormacc
|
16
34
|
|
17
|
-
|
35
|
+
Shared target subdirectories:
|
36
|
+
bin, .config, .profile.d
|
18
37
|
|
19
|
-
|
38
|
+
Modules:
|
39
|
+
i3, vscode, fish, ruby, zsh, emacs, xorg, base, ssh, macbook
|
20
40
|
|
21
|
-
|
41
|
+
Core modules:
|
42
|
+
base, zsh, emacs, ssh, ruby
|
22
43
|
|
23
|
-
## Usage
|
24
44
|
|
25
|
-
|
45
|
+
No module argument passed. Install (c)ore/(a)ll/(n)one? [n]: c
|
46
|
+
Installing 5 modules ...
|
47
|
+
.. Module base ..
|
48
|
+
.. Module zsh ..
|
49
|
+
.. Module emacs ..
|
50
|
+
... running hook 'pre': '/home/cormacc/dotfiles/emacs-pre'
|
51
|
+
.... WARNING: ~/.emacs.d found -- skipping spacemacs checkout
|
52
|
+
.. Module ssh ..
|
53
|
+
.. Module ruby ..
|
54
|
+
|
55
|
+
```
|
56
|
+
|
57
|
+
N.B. Shared target subdirectories and core modules will be blank, unless configured in the optional collection config file
|
58
|
+
|
59
|
+
To install a specific module or modules
|
60
|
+
|
61
|
+
$dotmodule install MODULE_NAME
|
62
|
+
|
63
|
+
or
|
64
|
+
|
65
|
+
$dotmodule install MODULE_NAME, ANOTHER_MODULE_NAME
|
66
|
+
|
67
|
+
To display module collection parameters
|
68
|
+
|
69
|
+
$dotmodule info
|
70
|
+
|
71
|
+
|
72
|
+
### Pre- and post-installation hooks (Optional)
|
73
|
+
|
74
|
+
Any file in the farm root matching the pattern '<modulename>-pre' or '<modulename>-post' will be treated as a pre- or post-
|
75
|
+
installation hook and executed before/after GNU stow. I use an 'emacs-pre' hook to clone the spacemacs repository. Similarly, could use a pre or post hook to copy your ssh keys from somewhere else (as you probably don't want them in a public dotfile repo).
|
76
|
+
|
77
|
+
|
78
|
+
### Shared folders (Optional)
|
79
|
+
|
80
|
+
GNU Stow is clever at managing collisions between modules in a link farm, however we can run into issues when constructing symlinks into directory trees that are used by multiple applications -- e.g. `~/.config` -- resulting in unwanted data in your dotfile repo. To guard against this, you can declare these shared directories as a YAML list in a file called `dotmodule.collection` located at the root of your dotfile repository.
|
81
|
+
|
82
|
+
```yaml
|
83
|
+
:shared_directories:
|
84
|
+
- bin
|
85
|
+
- .config
|
86
|
+
- .profile.d
|
87
|
+
- this/also/works/with/nested/paths
|
88
|
+
```
|
89
|
+
|
90
|
+
The `dotmodule` gem will ensure these directories are created before installing any modules to prevent GNU Stow from creating them as links into your dotfile repository instead.
|
91
|
+
|
92
|
+
### Core modules (Optional)
|
93
|
+
|
94
|
+
This is purely a convenience -- allowing you to quickly install essential modules without having to remove modules that are platform-specific you're not using any more but may again at a later date from your repo. These core modules are also defined in `dotmodule.collection`
|
95
|
+
|
96
|
+
```yaml
|
97
|
+
:core_modules:
|
98
|
+
- base
|
99
|
+
- zsh
|
100
|
+
- emacs
|
101
|
+
- ssh
|
102
|
+
- ruby
|
103
|
+
```
|
104
|
+
|
105
|
+
### Examples
|
106
|
+
|
107
|
+
See [my dotfiles](https://github.com/cormacc/dotfiles) for an example.
|
108
|
+
|
109
|
+
|
110
|
+
## Development / improvements
|
111
|
+
|
112
|
+
This is a pretty basic gem.
|
113
|
+
|
114
|
+
The majority of the functionality is defined in [DotModule::Collection](lib/dotmodule.rb)
|
26
115
|
|
27
|
-
|
116
|
+
This is wrapped in a basic [CLI](lib/dotmodule/CLI.rb) using [Thor](https://github.com/erikhuda/thor).
|
28
117
|
|
29
|
-
|
118
|
+
Unlike GNU Stow, the installation target directory is always the user home directory (internally, `Dir.home`) rather than the parent directory of the module collection. `DotModule::Collection` is setup to allow explicit target specification, but the CLI wrapper doesn't yet,
|
119
|
+
as I don't currently need it to. That said, it would probably only take slightly more time to change that than it has to write this paragraph :)
|
30
120
|
|
31
|
-
|
121
|
+
If you add to a module, you can just `dotmodule install` it again. However if you remove content you need to clean out stale links manually. Might be worth adding some logic to detect/delete stale links, and/or uninstall a module.
|
32
122
|
|
33
123
|
## Contributing
|
34
124
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
125
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/cormacc/dotmodule.
|
36
126
|
|
37
127
|
|
38
128
|
## License
|
data/lib/dotmodule.rb
CHANGED
@@ -49,7 +49,7 @@ module DotModule
|
|
49
49
|
# Currently, this supports a single array entry listing any folders shared with other applications / the system
|
50
50
|
def load_config
|
51
51
|
file = root+CONFIG_FILE_NAME
|
52
|
-
@config = file.file? ? YAML.load_file(file) : { :shared_directories =>
|
52
|
+
@config = file.file? ? YAML.load_file(file) : { :shared_directories => [], :core_modules => [] }
|
53
53
|
end
|
54
54
|
|
55
55
|
def modules
|
@@ -65,7 +65,7 @@ module DotModule
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def default_target
|
68
|
-
|
68
|
+
Pathname.new(Dir.home)
|
69
69
|
end
|
70
70
|
|
71
71
|
def create_shared_directories(target_root)
|
@@ -80,10 +80,11 @@ module DotModule
|
|
80
80
|
|
81
81
|
def install_module(name, target=default_target)
|
82
82
|
create_shared_directories(target)
|
83
|
-
puts "
|
83
|
+
puts ".. Module #{name} .."
|
84
84
|
raise ArgumentError, "Module '#{name}' not found" unless (@root+name).directory?
|
85
|
-
|
85
|
+
preinstall(name)
|
86
86
|
system "stow -d #{@root} -t #{target} #{name}"
|
87
|
+
postinstall(name)
|
87
88
|
end
|
88
89
|
|
89
90
|
def install_modules(module_names, target=default_target)
|
@@ -103,22 +104,42 @@ module DotModule
|
|
103
104
|
end
|
104
105
|
|
105
106
|
def to_s
|
106
|
-
<<~HEREDOC
|
107
|
+
# <<~HEREDOC would be nicer, but not worth sacrificing compatibility with rubies <2.3 for
|
108
|
+
<<-HEREDOC
|
107
109
|
|
108
|
-
|
109
|
-
|
110
|
+
Collection root: #{@root}
|
111
|
+
Default target: #{default_target}
|
110
112
|
|
111
|
-
|
112
|
-
|
113
|
+
Shared target subdirectories:
|
114
|
+
#{shared_directories.join(', ')}
|
113
115
|
|
114
|
-
|
115
|
-
|
116
|
+
Modules:
|
117
|
+
#{modules.join(', ')}
|
116
118
|
|
117
|
-
|
118
|
-
|
119
|
+
Core modules:
|
120
|
+
#{core_modules.join(', ')}
|
119
121
|
|
120
122
|
HEREDOC
|
121
123
|
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def preinstall(module_name)
|
128
|
+
runhook(module_name, 'pre')
|
129
|
+
end
|
130
|
+
|
131
|
+
def postinstall(module_name)
|
132
|
+
runhook(module_name, 'post')
|
133
|
+
end
|
134
|
+
|
135
|
+
def runhook(module_name, hook)
|
136
|
+
hook_file = @root + "#{module_name}-#{hook}"
|
137
|
+
return unless hook_file.file?
|
138
|
+
puts "... running hook '#{hook}': '#{hook_file}'"
|
139
|
+
IO.popen("sh #{hook_file}").each do |line|
|
140
|
+
puts ".... #{line}"
|
141
|
+
end
|
142
|
+
end
|
122
143
|
end
|
123
144
|
|
124
145
|
end
|
data/lib/dotmodule/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dotmodule
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cormac Cannon
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|