Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

executable file 273 lines (195 sloc) 7.57 kb
#!/usr/bin/env bash
sys=$( uname -s )
if [[ "${sys}" == AIX ]] ; then
name_opt=-name
else
name_opt=-iname
fi
unset GREP_COLOR
unset GREP_OPTIONS
source "$rvm_scripts_path/base"
__error_on_result()
{
if [[ "$1" -gt 0 ]]; then
rvm_error "$2 - Aborting now."
return 0
else
return 1
fi
}
snapshot_save()
{
typeset snapshot_temp_path snapshot_ruby_name_file \
snapshot_alias_name_file snapshot_installable_file \
snapshot_primary_ruby snapshot_ruby_order destination_path
if [[ -z "$1" ]]
then
printf "%b" "
Usage:
rvm snapshot save name
Description:
Saves a snapshot describing the rvm installation
to <name>.tar.gz in the current working directory.\
" >&2
return 1
fi
# Create the temporary directory.
snapshot_temp_path="${rvm_tmp_path}/$$-snapshot"
__rvm_rm_rf "$snapshot_temp_path"
mkdir -p "$snapshot_temp_path"
rvm_log "Backing up a list of aliases"
cp "$rvm_path/config/alias" "$snapshot_temp_path/"
rvm_log "Backing up your user preferences"
cp "$rvm_user_path/db" "$snapshot_temp_path/"
rvm_log "Backing up your installed packages"
sed -e 's/-//' -e 's/^lib//' < "$rvm_path/config/pkg" | awk -F= '{print $1}' | sort | uniq > "$snapshot_temp_path/pkg"
rvm_log "Backing up all of your gemsets"
mkdir -p "$snapshot_temp_path/gems"
(
builtin cd "$snapshot_temp_path/gems"
for snapshot_gemset in $("$rvm_scripts_path/list" gemsets strings) ; do
__rvm_become "$snapshot_gemset" ; result="$?"
__error_on_result "$result" "Error becoming ruby $snapshot_gemset" && return "$result"
"$rvm_scripts_path/gemsets" export "${snapshot_gemset}.gems" >/dev/null ; result="$?"
__error_on_result "$result" "Error exporting gemset contents for $snapshot_gemset" && return "$result"
mkdir -p "./$snapshot_gemset/"
[[ -d "$GEM_HOME/cache/" ]] && \cp -R "$GEM_HOME/cache/" "./$snapshot_gemset/"
done
)
rvm_log "Backing up all of your installed rubies"
printf "%b" "#!/usr/bin/env bash\n\nset -e\n\n" > "$snapshot_temp_path/install-rubies.sh"
echo "source \"\$rvm_scripts_path/rvm\" || true" >> "$snapshot_temp_path/install-rubies.sh"
snapshot_ruby_name_file="${rvm_tmp_path}/$$-rubies"
snapshot_alias_name_file="${rvm_tmp_path}/$$-aliases"
snapshot_installable_file="${rvm_tmp_path}/$$-installable"
"$rvm_scripts_path/alias" list | awk -F ' => ' '{print $1}' | sort | uniq 2>/dev/null > "$snapshot_alias_name_file"
"$rvm_scripts_path/list" strings | \tr ' ' '\n' | sort | uniq > "$snapshot_ruby_name_file"
comm -2 -3 "$snapshot_ruby_name_file" "$snapshot_alias_name_file" > "$snapshot_installable_file"
__rvm_rm_rf "$snapshot_ruby_name_file"
__rvm_rm_rf "$snapshot_alias_name_file"
snapshot_primary_ruby="$(GREP_OPTIONS="" \grep '^\(ree\|ruby-1.8.7\)' < "$snapshot_installable_file" | \grep -v '-head$' | sort -r | head -n1)"
snapshot_ruby_order="$snapshot_primary_ruby $(GREP_OPTIONS="" \grep -v "$snapshot_primary_ruby" < "$snapshot_installable_file")"
for snapshot_ruby_name in $snapshot_ruby_order
do
snapshot_install_command="$(__rvm_recorded_install_command "$snapshot_ruby_name")"
if [[ -n "$snapshot_install_command" ]]
then
echo "rvm install $snapshot_install_command" | sed "s#$rvm_path#'\\\"\$rvm_path\\\"'#" >> "$snapshot_temp_path/install-rubies.sh"
else
__rvm_become "$snapshot_ruby_name"
ruby "$rvm_path/lib/rvm/install_command_dumper.rb" >> "$snapshot_temp_path/install-rubies.sh"
fi
unset snapshot_install_command
done
unset snapshot_ruby_name snapshot_primary_ruby
__rvm_rm_rf "$snapshot_installable_file"
rvm_log "Compressing snapshotting"
destination_path="$PWD"
(
builtin cd "$snapshot_temp_path"
__rvm_rm_rf "$destination_path/$1.tar.gz"
$rvm_tar_command czf "$destination_path/$1.tar.gz" .
result="$?"
__error_on_result "$result" "Error creating archive $destination_path/$1.tar.gz" && return "$result"
)
rvm_log "Cleaning up"
__rvm_rm_rf "$snapshot_temp_path"
rvm_log "Snapshot complete"
}
snapshot_load()
{
typeset package_info snapshot_archive snapshot_temp_path \
alias_name alias_ruby
export rvm_create_flag
if [[ -z "$1" ]]
then
echo "Usage: rvm snapshot load name" >&2
echo "Loads a snapshot from <name>.tar.gz in the current directory." >&2
return 1
fi
snapshot_archive="$PWD/$(echo "$1" | sed 's/.tar.gz$//').tar.gz"
if ! [[ -s "$snapshot_archive" ]]
then
echo "The provides snapshot '$(basename "$snapshot_archive")' doesn't exist." >&2
return 1
fi
snapshot_temp_path="${rvm_tmp_path}/$$-snapshot"
__rvm_rm_rf "$snapshot_temp_path"
\mkdir -p "$snapshot_temp_path"
rvm_log "Extracting snapshot"
(
builtin cd "$snapshot_temp_path"
$rvm_tar_command xzf "$snapshot_archive"
result="$?"
__error_on_result "$result" "Error extracting the archive '$snapshot_archive'" && return "$result"
)
rvm_log "Restoring user settings"
\cp -f "$snapshot_temp_path/db" "$rvm_user_path/db"
rvm_log "Installing rvm-managed packages"
for snapshot_package in $(cat "$snapshot_temp_path/pkg")
do
"$rvm_scripts_path/package" install "$snapshot_package"
result="$?"
__error_on_result "$result" "Error installing package '$snapshot_package'" && return "$result"
done
unset snapshot_package
rvm_log "Installing rubies"
chmod +x "$snapshot_temp_path/install-rubies.sh"
sed -i'' '1 s/#!\/usr\/bin\/env bash -e/#!\/usr\/bin\/env bash\n\nset -e/' "$snapshot_temp_path/install-rubies.sh"
"$snapshot_temp_path/install-rubies.sh"
result="$?"
__error_on_result "$result" "Error importing rubies." && return "$result"
rvm_create_flag=1
rvm_log "Setting up gemsets"
(
builtin cd "$snapshot_temp_path/gems"
gems=($(find . -mindepth 0 -maxdepth 0 -type f "${name_opt}" '*.gems' | sed 's/.gems$//'))
for snapshot_gemset in "${gems[@]//.\/}"
do
__rvm_become "$snapshot_gemset"
result="$?"
__error_on_result "$result" \
"Error becoming '$snapshot_gemset'" && return "$result"
mkdir -p "$GEM_HOME/cache/"
cp -Rf "$snapshot_gemset/" "$GEM_HOME/cache/"
result="$?"
__error_on_result "$result" \
"Error copying across cache for $snapshot_gemset" && return "$result"
"$rvm_scripts_path/gemsets" import "$snapshot_gemset" >/dev/null 2>&1
result="$?"
__error_on_result "$result" \
"Error importing gemset for $snapshot_gemset" && return "$result"
done
)
rvm_log "Restoring aliases"
while read -r package_info
do
# Note: this assumes an '=' int the input...
alias_name="${package_info/=*}"
alias_ruby="${package_info/*=}"
"$rvm_scripts_path/alias" create "$alias_name" "$alias_ruby"
if [[ "$alias_name" == "default" ]]
then
(source "$rvm_scripts_path/rvm" && rvm use "$alias_ruby" --default) >/dev/null 2>&1
result="$?"
__error_on_result "$result" "Error setting default to $alias_ruby" && return "$result"
fi
done < "$snapshot_temp_path/alias"
rvm_log "Cleaning up load process"
__rvm_rm_rf "$snapshot_temp_path"
rvm_log "Loaded snapshot from $(basename "$snapshot_archive")"
}
snapshot_usage()
{
echo "Usage: rvm snapshot {save,load} file" >&2
return 1
}
args=($*)
action="${args[0]}"
args="$(echo ${args[@]:1})" # Strip trailing / leading / extra spacing.
case "$action" in
save) snapshot_save "$args" ;;
load) snapshot_load "$args" ;;
*) snapshot_usage ;;
esac
exit $?
Jump to Line
Something went wrong with that request. Please try again.