Sync your packages with your dotfiles (and vice versa).
Project description
Sync your packages with your dotfiles
=====================================
When we use a package manager (be it apt, pip, npm,…), we want to sync
the list of installed packages in requirement files. We then declare a
mapping that links a package manager to its requirements file:
``` {.python}
REQUIREMENTS_ROOT_DIR = "~/dotfiles/"
REQUIREMENTS_FILES = {
"apt": {
"file": "apt.txt", # => ~/dotfiles/apt.txt
"pacman": "apt-get",
"install": "install -y --force-yes",
"uninstall": "remove",
},
# and so on for pip, pip3, gem, npm, etc
}
```
and we call
``` {.example}
syp --pm apt foo bar
```
to add the two packages "foo" and "bar" in `~/dotfiles/apt.txt` and at
the same time, to check if this list has been edited manually (with
packages added or removed) and act accordingly (we make diffs against
the cache at `~/.syp/apt.txt`).
See the command `syp --init` and the Settings section below.
Tested on python 2.7 and 3.4.
Usage
-----
The basic usage is to check all of the package managers, and install and
remove what's necessary:
Example:
``` {.example}
syp
```
can output:
<img src="http://i.imgur.com/NXiddZB.png" </img>
We set the package manager with `--pm` and **give one or many packages
to install**:
``` {.example}
syp --pm pip syp foo bar
```
will append "syp", "foo" and "bar" at the bottom of `~/dotfiles/pip.txt`
(if they are not there yet), check if pip.txt was manually edited, and
suggest a list of packages to install and remove.
So a suggested alias is
``` {.example}
alias sypip="syp --pm pip "
```
If no package manager is specified, **we use apt by default** (see
Settings below).
To **remove packages**, use `--rm`:
``` {.example}
syp --pm pip foo --rm
```
We can **add a message** with `-m`. It will be appended on the same
line:
``` {.example}
syp --pm pip foo -m "foo is a cool package"
```
We can **edit the list** of packages for that package maneger before the
operations with `-e` (`--editor`):
``` {.example}
syp --pm pip foo --rm -e
```
Settings
========
The default settings come with a configuration for `apt`, `pip`, `pip3`,
`gem`, `npm`, `docker` and `guix`.
The user settings, stored at `~/.syp/settings.py`, is a regular python
file that will be `exec`'ed on startup. So, if you want to add or
overide a package manager settings, edit the `REQUIREMENTS_FILES`
dictionnary accordingly. Only the key "file" is required:
``` {.python}
REQUIREMENTS_FILES['apt'] = {
"file": "requirements-apt.txt", # required. appended to REQUIREMENTS_ROOT_DIR
"pacman": "aptitude", # by default, same as the package manager name, here 'apt'
"install": "install -y", # 'install' by default
"uninstall": "remove", # 'uninstall' by default.
}
```
See also
``` {.python}
#: The base directory where lies the configuration files.
REQUIREMENTS_ROOT_DIR = "~/dotfiles/"
#: System package manager, as a default.
SYSTEM_PACMAN = "apt-get"
```
Develop
=======
``` {.example}
pip install -e .
```
TODOs and ideas
===============
- more tests
- auto-recognize a virtualenv
- undo last action
- auto commit
- allow for more than a requirement file for one package manager.
Bust most of all... use [Guix](https://gnu.org/software/guix/) !
=====================================
When we use a package manager (be it apt, pip, npm,…), we want to sync
the list of installed packages in requirement files. We then declare a
mapping that links a package manager to its requirements file:
``` {.python}
REQUIREMENTS_ROOT_DIR = "~/dotfiles/"
REQUIREMENTS_FILES = {
"apt": {
"file": "apt.txt", # => ~/dotfiles/apt.txt
"pacman": "apt-get",
"install": "install -y --force-yes",
"uninstall": "remove",
},
# and so on for pip, pip3, gem, npm, etc
}
```
and we call
``` {.example}
syp --pm apt foo bar
```
to add the two packages "foo" and "bar" in `~/dotfiles/apt.txt` and at
the same time, to check if this list has been edited manually (with
packages added or removed) and act accordingly (we make diffs against
the cache at `~/.syp/apt.txt`).
See the command `syp --init` and the Settings section below.
Tested on python 2.7 and 3.4.
Usage
-----
The basic usage is to check all of the package managers, and install and
remove what's necessary:
Example:
``` {.example}
syp
```
can output:
<img src="http://i.imgur.com/NXiddZB.png" </img>
We set the package manager with `--pm` and **give one or many packages
to install**:
``` {.example}
syp --pm pip syp foo bar
```
will append "syp", "foo" and "bar" at the bottom of `~/dotfiles/pip.txt`
(if they are not there yet), check if pip.txt was manually edited, and
suggest a list of packages to install and remove.
So a suggested alias is
``` {.example}
alias sypip="syp --pm pip "
```
If no package manager is specified, **we use apt by default** (see
Settings below).
To **remove packages**, use `--rm`:
``` {.example}
syp --pm pip foo --rm
```
We can **add a message** with `-m`. It will be appended on the same
line:
``` {.example}
syp --pm pip foo -m "foo is a cool package"
```
We can **edit the list** of packages for that package maneger before the
operations with `-e` (`--editor`):
``` {.example}
syp --pm pip foo --rm -e
```
Settings
========
The default settings come with a configuration for `apt`, `pip`, `pip3`,
`gem`, `npm`, `docker` and `guix`.
The user settings, stored at `~/.syp/settings.py`, is a regular python
file that will be `exec`'ed on startup. So, if you want to add or
overide a package manager settings, edit the `REQUIREMENTS_FILES`
dictionnary accordingly. Only the key "file" is required:
``` {.python}
REQUIREMENTS_FILES['apt'] = {
"file": "requirements-apt.txt", # required. appended to REQUIREMENTS_ROOT_DIR
"pacman": "aptitude", # by default, same as the package manager name, here 'apt'
"install": "install -y", # 'install' by default
"uninstall": "remove", # 'uninstall' by default.
}
```
See also
``` {.python}
#: The base directory where lies the configuration files.
REQUIREMENTS_ROOT_DIR = "~/dotfiles/"
#: System package manager, as a default.
SYSTEM_PACMAN = "apt-get"
```
Develop
=======
``` {.example}
pip install -e .
```
TODOs and ideas
===============
- more tests
- auto-recognize a virtualenv
- undo last action
- auto commit
- allow for more than a requirement file for one package manager.
Bust most of all... use [Guix](https://gnu.org/software/guix/) !