Kale Worsley


Scripts and snippets
update-each-gem(1)
update-each-gem(1)
Name
update-each-gem - Update each gem in a project individually, running the tests and commiting after each.
Synopsis
  • update-each-gem 'bundle exec rake spec:models spec:controllers'
  • update-each-gem ./path/to/script
Description
#!/bin/bash

function quit() {
  echo "Goodbye."
  exit
}
trap quit SIGINT SIGTERM

failed_gems=""

# Use arg 1 as the test command if it's present
# 
#    update-each-gem 'bundle exec rake spec:models spec:controllers'
#    update-each-gem ./path/to/script
#
if [ "$1" != "" ] ; then
  runSpecsCommand=$1
  function runSpecs() {
    $runSpecsCommand
  }
else
  function runSpecs() {
    SPEC_OPTS='--fail-fast --no-colour --no-profile' bundle exec rake &> /dev/null
  }
fi

function die() {
  echo "$1"
  exit 1
}

# Don't run if there are uncommitted changes.
if [ "$(git status --porcelain)" != "" ] ; then
  die "Stash any changes first."
fi

# Don't run on master.
if [ "$(git rev-parse --abbrev-ref HEAD)" == "master" ] ; then
  die "Don't run this on master."
fi

echo "Intitial spec run..."

runSpecs

if [ "$?" == "1" ] ; then
  echo "SPECS FAILED"
  die "Fix specs before re-running!"
else
  echo "SPECS PASSED"
fi

echo "Checking for outdated gems..."

gems=$(bundle outdated --strict --no-color | grep '^\s+*' | awk '{print $2}')

echo "Outdated:"
echo "$gems"

for gem in $gems ; do
  echo "Updating $gem..."
  bundle update "$gem" > /dev/null

  echo "Gemfile.lock diff..."

  git diff Gemfile.lock

  if [ "$(git diff Gemfile.lock)" == "" ] ; then
    echo "Skipping $gem..."

    continue
  fi

  echo "Running specs..."

  runSpecs

  if [ "$?" == "1" ] ; then
    echo "SPECS FAILED"
    echo "Skipping $gem..."
    failed_gems="$failed_gems $gem"
    echo "Rolling back Gemfile.lock..."
    git checkout Gemfile.lock
  else
    git commit -a -m "Update $gem gem."
  fi
done

if [ "$failed_gems" != "" ] ; then
  die "Failed gems:$failed_gems"
else
  echo "All gems have been updated."
fi
Copyright
update-each-gem is made available under the MIT License. See MIT LICENSE for details.
2015-09-11 00:00:00 +0000
update-each-gem(1)
update-each-gem(1)