Skip to content

Instantly share code, notes, and snippets.

@brianoflan
Last active December 16, 2016 17:43
Show Gist options
  • Save brianoflan/5e4c7277476c83ff41298abb1d583c76 to your computer and use it in GitHub Desktop.
Save brianoflan/5e4c7277476c83ff41298abb1d583c76 to your computer and use it in GitHub Desktop.
Isolate RVM environment (rbenv, hash the Gemfile and don't re-fetch all those gems if they don't change, broken)
#!/bin/bash
[[ $isolateRvm ]] || isolateRvm=true ;
useRubyVersion=2.2.2 ;
main() {
local use_rvm_or_rbenv='rvm' ;
rvm -v &> /dev/null || use_rvm_or_rbenv='rbenv' ;
local x='' ;
if [[ "rbenv" == "$use_rvm_or_rbenv" ]] ; then
rbenv local "$useRubyVersion" ;
else
# # # THIS IS IMPORTANT FOR subRvm
[[ "false" == "$isolateRvm" ]] || subRvm ;
# # #
x=`echo "$GEM_HOME" | egrep '[.]rvm($|[\/])'` ;
x=true ;
[[ $x ]] && source $HOME/.rvm/scripts/rvm && rvm_install_on_use_flag=1 && rvm use --create "$useRubyVersion" || true ;
fi ;
[[ -z $global_gem_path1 ]] || export GEM_PATH="$GEM_PATH:$global_gem_path1" ;
# ...
# Near the end:
[[ "false" == "$isolateRvm" ]] || [[ "rvm" != "$use_rvm_or_rbenv" ]] || saveRvmDir ;
}
subRvm() {
echo subRvm ;
local home="/home/$(id -un)" ;
[[ -e "$home" ]] || home=$(grep $(id -un) /etc/passwd | awk -F: '{print $6}' | sed -e 's/[\/]$//') ;
[[ $home ]] || { echo "ERROR: Failed to determine true home." ; exit 1 ; }
local pwd=`pwd` ;
pwd=`echo "$pwd" | sed -e 's/[\/]$//'` ;
if [[ "$home" == "$pwd" ]] ; then
echo "ERROR: It doesn't make sense to run this script from HOME - it's for running an isolated RVM environment in a different folder." ;
exit 1 ;
fi ;
export HOME=$pwd ;
getRvmDir ;
export GEM_HOME='' ;
export GEM_PATH='' ;
export PATH="$pwd/bin:$home/.sdkman/candidates/groovy/current/bin:$home/.sdkman/candidates/grails/current/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/local/bin:/usr/local/go/bin:/opt/gradle/latest/bin:/opt/puppetlabs/bin" ;
}
saveRvmDir() {
local saveTo=$1 ;
[[ "" != "$saveTo" ]] || saveTo='..' ;
local gemHash=`getHash Gemfile.lock` ;
saveTo="$saveTo/.rvm.$gemHash" ;
[[ -z $gemHash ]] || [[ -e $saveTo ]] || cp -R -P -p .rvm $saveTo ;
}
getRvmDir() {
[[ ! -e .rvm ]] || rm -rf .rvm ;
altRvm ;
if [[ ! -e .rvm ]] ; then
mkdir .rvm ;
( cd .rvm ;
d=$home ;
ln="bin help hooks lib scripts VERSION RELEASE README LICENSE contrib docs "
ln="$ln examples man patches patchsets user installed.at" ;
#ln="$ln gem-cache" ;
#ln="$ln gemsets" ;
cp="config "
mk="gems tmp archives environments log rubies wrappers src" ;
mk="$mk gem-cache " ;
mk="$mk gemsets" ;
for y in $ln ; do
ln -s $d/.rvm/$y ./ ;
done ;
for y in $cp ; do
cp -rp $d/.rvm/$y ./ ;
done ;
for y in $mk ; do
mkdir $y ;
done ;
for y in '' ; do
[[ -z $y ]] || touch $y ;
done ;
) ;
fi ;
}
altRvm() {
if [[ -e Gemfile.lock ]] ; then
local gemHash=`getHash Gemfile.lock` ;
local d='' ;
for d in .rvm.$gemHash ../.rvm.$gemHash ; do
if [[ -e $d ]] ; then
break ;
else
d='' ;
fi ;
done ;
if [[ $d ]] ; then
[[ ! -e .rvm ]] || rm -rf .rvm ;
cp -R -P -p $d .rvm ;
fi ;
fi ;
}
getHash() {
local resultHash='' ;
local file=$1 ;
local awk='$' ; awk="$awk$pureHash" ;
local tmp=`$hash $hashArgs $file | awk "{print $awk}"` ;
[[ $tmp ]] || { echo "ERROR: Failed to getHash {$hash $hashArgs $file | $pureHash}." 1>&2 ; exit 1 ; } ;
resultHash="$hash.$tmp" ;
echo $resultHash ;
}
initHash() {
hash=md5sum ;
which $hash &> /dev/null || hash=openssl ;
which $hash &> /dev/null || hash=sha1sum ;
which $hash &> /dev/null || hash=cksum ;
[[ "openssl" != $hash ]] || hashArgs="dgst -md5 -hex"
pureHash="1" ;
[[ "openssl" != $hash ]] || pureHash="NF"
}
cd $(dirname $0) && main "$@" || { echo "ERROR: $? from 'cd dirname($0)'." ; exit 1 ; } ;
#
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment