1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
Config file sharing
===================
[![CI](https://github.com/egor-tensin/config-links/actions/workflows/ci.yml/badge.svg)](https://github.com/egor-tensin/config-links/actions/workflows/ci.yml)
[![Packages (Debian)](https://github.com/egor-tensin/config-links/actions/workflows/debian.yml/badge.svg)](https://github.com/egor-tensin/config-links/actions/workflows/debian.yml)
[![Publish (Launchpad)](https://github.com/egor-tensin/config-links/actions/workflows/ppa.yml/badge.svg)](https://github.com/egor-tensin/config-links/actions/workflows/ppa.yml)
* Store your files in a repository.
* Checkout it on any machine.
* Create and maintain symlinks to these files easily.
How it works
------------
Actual files are stored in directories with names matching the `%VAR_NAME%`
pattern.
The part between the percent signs is the name of an environment variable.
Every file in such directory gets a symlink in the directory pointed to by the
environment variable.
Directory hierarchies are preserved.
A database of symlinks is maintained in case a shared file is deleted (the
corresponding symlink is then deleted too).
The default database file name is "links.bin", maintained in the top-level
directory with shared files.
For a complete usage example, see below.
Installation
------------
* For Arch Linux, use the [AUR package].
* For Ubuntu, use the [PPA].
* Alternatively, just checkout this repository.
* For macOS, see [this section].
[AUR package]: https://aur.archlinux.org/packages/config-links/
[PPA]: https://launchpad.net/~egor-tensin/+archive/ubuntu/config-links
[this section]: #macos
Usage
-----
Symlinks are created & maintained by `links-update`.
```
usage: links-update [-h|--help] [-d|--database PATH] [-s|--shared-dir DIR] [-m|--mode MODE] [-n|--dry-run]
```
To remove all symlinks, use `links-remove`.
```
usage: links-remove [-h|--help] [-d|--database PATH] [-s|--shared-dir DIR] [-n|--dry-run]
```
In this example, symlinks to files in "/test/src" must appear in "/test/dest".
```
$ tree /test/dest/
/test/dest/
0 directories, 0 files
$ tree /test/src/
/test/src/
└── %DEST%
├── a
│ └── b
│ └── c
│ └── test.txt
└── foo
└── bar
└── baz
6 directories, 2 files
$ echo "$DEST"
/test/dest
$ ./links-update --shared-dir /test/src/
...
$ tree /test/dest/
/test/dest/
├── a
│ └── b
│ └── c
│ └── test.txt -> /test/src/%DEST%/a/b/c/test.txt
└── foo
└── bar
└── baz -> /test/src/%DEST%/foo/bar/baz
5 directories, 2 files
```
For my personal real-life usage examples, see
* [my dotfiles],
* configuration files for various [Windows apps].
[my dotfiles]: https://github.com/egor-tensin/linux-home
[Windows apps]: https://github.com/egor-tensin/windows-home
Development
-----------
Run local tests using
make test
Run Docker tests using
make test/docker
Run all tests using
make test/all
Limitations
-----------
Variable names must be alphanumeric.
More precisely, the corresponding directory names must match the
`^%[_[:alpha:]][_[:alnum:]]*%$` regular expression.
Consequently, `ProgramFiles(x86)` (and other weird variable names Windows
allows) are not supported.
A special variable name `CONFIG_LINKS_ROOT` is resolved to the root path, "/".
macOS
-----
macOS is supported on a basic level.
GNU coreutils and findutils are required, which you can install using Homebrew.
Don't forget to add them to PATH!
License
-------
Distributed under the MIT License.
See [LICENSE.txt] for details.
[LICENSE.txt]: LICENSE.txt
|