Space Build Status

Space is a multi-repository monitoring and shell helper tool to ease development across multiple dependent repositories.

Here's a screenshot of my setup (iterm, tmux, vim, space) for working on travis.

tmux based travis workspace

The thing on the right side is an iterm split pane running space. The main screen is take by a tmux session that has a vim and a zsh pane. (I use an iterm pane for space so that I can switch between tmux windows but keep the space view.)

The space view gives an overview of:

  • current branch
  • current commit
  • bundler local flag
  • git status (clean, dirty, ahead)
  • bundle status (bundle check)
  • dependencies

E.g. one can easily see that:

  • repos 1-5 are using the bundler local flag, while 6-7 are using remote references
  • repos 4, 6, 7 have dirty working directories
  • repo 6 is 1 commit ahead of origin
  • the bundle in repo 7 is not installed

Space checks for each dependency listed in a repo's Gemfile if the bundle is locked to the hash that is currently checked out locally and display that status information.

Also note that the repo numbers are referring to the tmux windows where possible.

This screencast is from a very early version but still mostly valid. It also demonstrates how screen can be used to run commands on multiple repositories at once:

screencast

Installation

gem install space

Add a space config file. This is what the ~/.space/travis.yml file for the setup above looks like:

base_dir: ~/Development/projects/travis
repositories:
  - travis-ci
  - travis-hub
  - travis-listener
  - travis-core
  - travis-support
  - travis-worker
  - travis-build

Then run:

space [project]

e.g. space travis.

Usage

Commands are always run for a given scope of repos. If no scope is specified then commands are run for all repos in the project.

Scoping/unscoping

One can set a scope like so:

> [name|number]  # scope to the given repo and all of its deps, can scope to multiple repos
> -              # unscope

Builtin commands

> [refresh|!]    # refresh
> r[emote]       # use remote repos
> l[ocal]        # use local repos

Running shell commands across all repos

> git co -b foo  # run this in all repos

Scoping a single command

You can specify a scope for a single command. The command is then run within the specified repos.

> 1 2 3 bundle update # run the command in the repos 1, 2, 3