Last active
December 16, 2016 17:43
-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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