#+TITLE: Manafiles #+AUTHOR: Riyyi #+LANGUAGE: en #+OPTIONS: toc:nil Config file and package tracking utility. - Manage dotfiles and system config files. - Selectively comment and uncomment depending on machine configuration. - Store a list of all installed packages. - Install packages from a stored list. ** Getting started *** Installation If you are using *Arch Linux*, you can install the AUR package [[https://aur.archlinux.org/packages/manafiles-git/][manafiles-git]]. Alternatively, you will have to [[#building][build from source]]. *** Configuration **** Install the example configuration During installation, manafiles will install the example config to: \\ ~/usr/share/doc/manafiles/examples/manafiles.json~ From there you can copy it to anywhere in the working directory, the config file is searched recursively. \\ ~$HOME//~ **** Exclude paths Everything in this list will get excluded when pulling/pushing config files from the working directory. \\ Currently two types of file matching are supported: - ~literal~ matches a file or directory literally - ~wildcard~ the asterisk matches zero or more characters These behave similarly to a ~.gitignore~ pattern. - If the pattern starts with a slash, it matches files and directories in the working directory root only. - If the pattern doesn’t start with a slash, it matches files and directories in any directory or subdirectory. - If the pattern ends with a slash, it matches only directories. When a directory is ignored, \\ all of its files and subdirectories are also ignored. The excluded paths from the example config: #+BEGIN_SRC javascript "excludePaths" : [ ".git/", "*.md", "manafiles.json", "packages", "README.org", "screenshot.png" ] #+END_SRC **** System config files Directories in this list will be pushed to the root ~/~ of the system, instead of ~$HOME~. The system directories from the example config: #+BEGIN_SRC javascript "systemDirectories": [ "/boot", "/etc", "/usr/share" ] #+END_SRC *** Usage **** Selectively comment and uncomment Config files can be pushed from the working directory to the system like so: #+BEGIN_SRC shell-script $ manafiles -Fs #+END_SRC When pushing files to the system, manafiles recognizes special blocks and comments or uncomments them depending on the machine's configuration. Such a block looks like this: #+BEGIN_SRC shell-script # >>> distro=arch hostname=arch-desktop user=anon export PATH="$PATH:$HOME/.local/bin" # <<< #+END_SRC This block uses all of the supported configurations, ~distro~, ~hostname~ and ~user~. These can be used in any combination and order. If *all* of the given configurations match, manafiles will make sure that the contents of the block are uncommented. If *any* of them do *not* match, then manafiles will make sure that the contents of the block are commented. ** Building *** Build dependencies - ~gcc-libs~ - (make) ~cmake~ - (make) ~git~ - (make) ~gzip~ - (make) ~nlohmann-json~ [[https://archlinux.org/packages/community/any/nlohmann-json/][arch]], [[https://packages.debian.org/search?keywords=nlohmann-json][debian]], [[https://packages.ubuntu.com/search?keywords=nlohmann-json][ubuntu]] - (optional) ~grep~ - (optional) ~pacman~ + ~pacman-contrib~ - (optional) ~apt~ + ~dpkg~ The optional requirements are for the package tracking functionality. *** Build compilation #+BEGIN_SRC shell-script $ mkdir build $ cd build $ cmake .. $ make #+END_SRC *** Build installation #+BEGIN_SRC shell-script $ sudo make install #+END_SRC