Sparrow as a reasonable alternative to dotfiles
Tags: dotfiles, linux, perl5, automation
Published: 2018-11-07 23:29:23

---
title: Sparrow as a reasonable alternative to dotfiles
published: true
description: How you can use Sparrow plugin manager to manager dotfiles configuration
tags: dotfiles, linux, perl5, automation
---

Almost every month or oftener I can see posts on dev.to and other sites on how people manage their bashrc/dot files using git and bash.

It's ok to use those tools to manage your servers configuration, but let me show your more flexible and powerful way.

[Sparrow](https://github.com/melezhik/sparrow) is a tool to effectively manage and port servers configurations.


The approach consists of following steps:


* Define pieces of configurations as sparrow tasks

* Save tasks as plain old files in local directory

* Push files to remote git repository

* On target server clone tasks through `git clone` from remote git repository

* Finally run tasks to apply desired configurations


It might seem extra steps here in comparison with `git push / git pull` approach but gives your flexibility and power. 

* Complex configurations get split to **tiny bits** which are easier to manage.

* Because sparrow tasks are not just configuration, it's possible to run **extra steps** required to configure your server ( install packages and so on )



# Let's see this in action


For simplicity I confine my post to 2 simple use cases. 

* Configuring nano editor ( some  basic settings )
* Configuring git global settings ( name and email )


Sparrow comes with a lot of plugins, so you don't need to code anything, just use existed ones:


```
$ sparrow index update # get the latest updates of sparrow repository
$ sparrow plg install nano-rc
$ sparrow plg install git-base

``` 


Now having installed plugins let's create a couple of tasks to reflect desired settings.


For git setup:

```
$ sparrow project create git
$ sparrow task add git setup git-base
$ sparrow task ini git/setup


install_git: on 
email: melezhik@gmail.com
name: Alexey Melezhik

```

For nano configuration file:


```
$ sparrow plg install nano-setup
$ sparrow task add nano rc nano-setup
$ sparrow task ini nano/rc

tabsize: 2
speller: hunspell -x -c

```

If we list our current task now we could see them here:


```
sparrow root: [/home/suslik/sparrow]
[sparrow task list]
 [utils]
  git/setup
  nano/rc

```


# Save tasks to the git repository 


The rest of workflow is similar to saving dotfile to GitHub repository. We will use `sparrow task save` command to save tasks to directory and then push files to git:


```
$ mkdir tasks

$ git init .

$ git remote add origin https://github.com/user/tasks.git

$ sparrow task save $PWD

$ git add . && git commit -a -m "my sparrow tasks" && git push

```


# Restore tasks from git repository


Once tasks are saved to git repository we can install them on any server:


```
$ git clone https://github.com/user/tasks.git my-tasks

$ sparrow task restore my-tasks

```


We are all set. To start using our task just run:


```
$ sparrow task run git/setup # set up my git client
$ sparrow task run nano/rc # configure nano editor
```


Finally here is my [tasks repository](https://bitbucket.org/melezhik2/tasks/src/master/) - take a look at it as an example.

---

Thank you for reading.