Skip to main content

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/) !

Project details


Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page