asdf the “easy to write and hard to read” version manager

As a Rubyist one of the first thing you end up doing is to manage many different Ruby versions on the same machine. As a matter of fact, one of the first steps in setting up a new workstation is to install some kind of version manager like RVM or rbenv.

Unfortunately it doesn’t end up simply like this…

Continue reading “asdf the “easy to write and hard to read” version manager”

Fast Capistrano tasks completion

Starting with the assumption that I’m lazy and I make a lot of typos, I believe that command completion tools in a shell is indispensable.
My current bash configuration is pretty simple, for completion I’m using
bash-completion installed from Homebrew. I already get completions for almost everything I want out of the box but I am missing completions for Capistrano tasks.

Here’s what I came up with, without running the slow command cap -vT:

_cap_envs()
{
  local cur
  cur=${COMP_WORDS[COMP_CWORD]}

  if [[ -d "config/deploy/" ]]; then
    envs=$(ls config/deploy/*.rb | xargs -n1 basename | sed -e 's/..*$//')
    COMPREPLY=( $(compgen -W "${envs}" -- $cur) )
    COMPREPLY=( "${COMPREPLY[@]/%/ }" )
  fi
}

_cap_deploy_tasks_list()
{
  local task
  task=${COMP_WORDS[COMP_CWORD]#deploy:}

  DEPLOY_OPTS='
    check
    check:
    cleanup
    cleanup_assets
    cleanup_rollback
    compile_assets
    finished
    finishing
    finishing_rollback
    log_revision
    migrate
    normalize_assets
    published
    publishing
    revert_release
    reverted
    reverting
    rollback
    rollback_assets
    set_current_revision
    started
    starting
    symlink:
    updated
    updating'

  case "${task}" in
    check:* )
      COMPREPLY=($(compgen -W "directories linked_dirs linked_files make_linked_dirs" -- ${task#check:} ))
      ;;
    symlink:* )
      COMPREPLY=($(compgen -W "linked_dirs linked_files release shared" -- ${task#symlink:} ))
      ;;
    * )
      COMPREPLY=($(compgen -W "${DEPLOY_OPTS}" -- $task ))
      ;;
  esac
  COMPREPLY=( "${COMPREPLY[@]/%/ }" )
  return 0
}

_cap_nginx_tasks_list()
{
  local task
  task=${COMP_WORDS[COMP_CWORD]#nginx:}

  COMPREPLY=($(compgen -W "start stop stop restart setup" -- $task))
  COMPREPLY=( "${COMPREPLY[@]/%/ }" )
}

_cap_puma_tasks_list()
{
  local task
  task=${COMP_WORDS[COMP_CWORD]#puma:}

  COMPREPLY=($(compgen -W "start stop restart hot_restart setup" -- $task))
  COMPREPLY=( "${COMPREPLY[@]/%/ }" )
}

_cap_tasks_list()
{
  local cur
  cur=${COMP_WORDS[COMP_CWORD]}

  COMPREPLY=($(compgen -W "deploy deploy: nginx: puma:" -- $cur))
}

_cap_tasks()
{
  local cur
  cur=${COMP_WORDS[COMP_CWORD]}

  case "${cur}" in
    deploy:* ) _cap_deploy_tasks_list ;;
    nginx:* ) _cap_nginx_tasks_list ;;
    puma:* ) _cap_puma_tasks_list ;;
    * ) _cap_tasks_list ;;
  esac
}

_cap()
{
  if [[ ! -f ./Capfile ]]; then
    return
  fi
  COMPREPLY=()

  local pos
  pos=${COMP_CWORD}

  case "${pos}" in
    1 ) _cap_envs ;;
    2 ) _cap_tasks ;;
  esac
}
complete -F _cap -o nospace cap

Completion now includes default capistrano 3 tasks and I’ve added some tasks as examples. Paste this code inside your .bash_profile and fell free to add your personal capistrano tasks.