diff --git a/etc/bash/05-bashrc.dotfiles.sh b/etc/bash/05-bashrc.dotfiles.sh index c22077f3..878ed98c 100644 --- a/etc/bash/05-bashrc.dotfiles.sh +++ b/etc/bash/05-bashrc.dotfiles.sh @@ -230,7 +230,6 @@ function dotfiles_postmkvirtualenv { workon_venv "${VIRTUAL_ENV_NAME}" echo "PWD=$(path)" echo "#" - dotfiles_postmkvirtualenv_help } function dotfiles_preactivate { diff --git a/etc/bash/07-bashrc.virtualenvwrapper.sh b/etc/bash/07-bashrc.virtualenvwrapper.sh index fbf1f547..398acd6e 100644 --- a/etc/bash/07-bashrc.virtualenvwrapper.sh +++ b/etc/bash/07-bashrc.virtualenvwrapper.sh @@ -122,9 +122,11 @@ function backup_virtualenvs { function dx { # dx() -- 'deactivate' (declare -f 'deactivate' 2>&1 > /dev/null \ - && deactivate) || \ - (declare -f 'dotfiles_postdeactivate' 2>&1 > /dev/null \ - && dotfiles_postdeactivate) + && deactivate) || (source deactivate; + declare -f '_conda_postdeactivate' 2>&1 > /dev/null \ + && _conda_postdeactivate) + declare -f 'dotfiles_postdeactivate' 2>&1 > /dev/null \ + && dotfiles_postdeactivate } function _rebuild_virtualenv { diff --git a/etc/bash/08-bashrc.conda.sh b/etc/bash/08-bashrc.conda.sh index 4e24496d..4de720a1 100644 --- a/etc/bash/08-bashrc.conda.sh +++ b/etc/bash/08-bashrc.conda.sh @@ -1,7 +1,48 @@ +#!/bin/bash ### bashrc.conda.sh - -## Conda / Anaconda +## Conda, Miniconda, Anaconda +# * | Src: https://github.com/conda/conda/ +# * | Docs: https://conda.readthedocs.org/en/latest/ +# * | Changelog: https://github.com/conda/conda/blob/master/CHANGELOG.txt +# * | Docs: http://conda.pydata.org/miniconda.html +# * | Docs: https://docs.continuum.io/anaconda/pkg-docs + +function _setup_conda_help { + # _setup_conda_help() -- _setup_conda, mkvirtualenv_conda, wec + echo '## _setup_conda() []' + echo ' $1 ' + echo ' $2 ' + echo '' + echo ' $ _setup_conda_help' + echo ' $ _setup_conda 27 #{ 27 , 2.7 }' + echo ' $ _setup_conda 3.5 #{ 34, 3.4, 35, 3.5 }' + echo ' $ _setup_conda ~/-wrk/-ce27 ~/-wrk/-conda27' + echo ' $ _setup_conda "$__WRK/-ce27" "$__WRK/-conda27"' + echo ' $ _setup_conda "$__WRK/-ce27" ' + echo '' + echo ' $ csc ; _conda_status_core' + echo ' $ csd ; _conda_status_defaults' + echo ' $ _conda_status ; (csd; csc)' + echo ' $ lscondaenvs' + echo ' $ lsce' + echo '' + echo ' $ mkvirtualenv_conda -h' + echo ' $ mkvirtualenv_conda dotfiles 2.7' + echo '' + echo ' $ workon_conda -h' + echo ' $ workon_conda dotfiles # _WRD=~/-wrk/-ce27/dotfiles' + echo ' $ wec -h # "workon env conda"' + echo ' $ wec dotfiles # _WRD=~/-wrk/-ce27/dotfiles' + echo ' $ wec dotfiles dotfiles # _WRD=~/-wrk/-ce27/dotfiles' + echo ' $ wec dotfiles etc/bash 3.4 # _WRD=~/-wrk/-ce34/src/etc/bash' + echo ' $ wec dotfiles dotfiles/etc 3.5 #_WRD=~/-wrk/-ce35/src/dotfiles/etc' + echo ' $ wec dotfiles dotfiles 2.7 # _WRD=~/-wrk/-ce27/src/dotfiles' + echo ' $ wec dotfiles dotfiles 3.5 # _WRD=~/-wrk/-ce35/src/dotfiles' + echo '' + echo ' $ dx; deactivate' + echo '' +} # see: 05-bashrc.dotfiles.sh #shell_escape_single() { @@ -11,10 +52,31 @@ # echo "'"${output}"'" #} + +function _conda_status { + # _conda_status() -- echo CONDA_* defaults, CONDA_ROOT, CONDA_ENVS_PATH + _conda_status_defaults + _conda_status_core +} + +function _conda_status_pathgrep { + local matchstr="conda" + echo PATH="$(shell_escape_single "${PATH}")" | grep -i "${matchstr}" +} + function _conda_status_core { # _conda_status_core() -- echo CONDA_ROOT and CONDA_ENVS_PATH echo CONDA_ROOT=$(shell_escape_single "${CONDA_ROOT}") echo CONDA_ENVS_PATH=$(shell_escape_single "${CONDA_ENVS_PATH}") + _conda_status_pathgrep || true + echo _CONDA="$(shell_escape_single "${_CONDA}")" + local _conda="$(which conda 2> /dev/null)" + echo \#conda="$(shell_escape_single "${_conda}")" +} + +function csc { + # csc() -- echo CONDA_ROOT, CONDA_ENVS_PATH + _conda_status_core } function _conda_status_defaults { @@ -27,77 +89,105 @@ function _conda_status_defaults { echo CONDA_ENVS__py35=$(shell_escape_single "${CONDA_ENVS__py35}") } -function _conda_status { - # _conda_status() -- echo CONDA_ROOT, CONDA_ENVS_PATH, and defaults - _conda_status_core - echo +function csd { + # csd() -- echo CONDA_ROOT__* and CONDA_ENVS_PATH_* _conda_status_defaults } -function csc { - # csc() -- echo CONDA_ROOT and CONDA_ENVS_PATH - _conda_status_core -} function _setup_conda_defaults { - # _setup_conda_defaults() -- configure CONDA_ENVS_PATH*, CONDA_ROOT* + # _setup_conda_defaults() -- set CONDA_ROOT[*] and CONDA_ENVS_PATH[*] # $1 (pathstr): prefix for CONDA_ENVS_PATHS and CONDA_ROOT # (default: ${__WRK}) - local __wrk="${1:-${__WRK}}" - export CONDA_ENVS__py27="${__wrk}/-ce27" - export CONDA_ENVS__py34="${__wrk}/-ce34" - export CONDA_ENVS__py35="${__wrk}/-ce35" + local __wrk="${1:-"${__WRK}"}" export CONDA_ROOT__py27="${__wrk}/-conda27" export CONDA_ROOT__py34="${__wrk}/-conda34" export CONDA_ROOT__py35="${__wrk}/-conda35" - #export CONDA_ROOT_DEFAULT="CONDA_ROOT__py27" - #export CONDA_ENVS_DEFAULT="CONDA_ENVS__py27" - export CONDA_ROOT="${__wrk}/-conda27" - export CONDA_ENVS_PATH="${__wrk}/-ce27" + export CONDA_ENVS__py27="${__wrk}/-ce27" + export CONDA_ENVS__py34="${__wrk}/-ce34" + export CONDA_ENVS__py35="${__wrk}/-ce35" + + export CONDA_ROOT_DEFAULT="${CONDA_ROOT_DEFAULT:-"${CONDA_ROOT__py35}"}" + export CONDA_ENVS_DEFAULT="${CONDA_ENVS_DEFAULT:-"${CONDA_ENVS__py35}"}" + + export CONDA_ROOT="${CONDA_ROOT_DEFAULT}" + export CONDA_ENVS_PATH="${CONDA_ENVS_DEFAULT}" +} + +function _unsetup_conda { + # _unsetup_conda() -- unset CONDA_ROOT[*] and CONDA_ENVS_PATH[*] vars + unset CONDA_ROOT + unset CONDA_ENVS_PATH + + unset _CONDA + + #unset CONDA_ROOT_DEFAULT + unset CONDA_ROOT__py27 + unset CONDA_ROOT__py34 + unset CONDA_ROOT__py35 + + #unset CONDA_ENVS_PATH_DEFAULT + unset CONDA_ENVS_PATH__py27 + unset CONDA_ENVS_PATH__py34 + unset CONDA_ENVS_PATH__py35 + + _unsetup_conda_path_all } function _setup_conda { - # _setup_anaconda() -- set CONDA_ENVS_PATH, CONDA_ROO - # $1 (pathstr or {27, 34}) -- lookup($1, CONDA_ENVS_PATH, + # _setup_conda() -- set CONDA_ENVS_PATH, CONDA_ROOT + # $1 (path or {27, 3.4, 35}) -- lookup($1, CONDA_ENVS_PATH, # CONDA_ENVS__py27) - # $2 (pathstr or "") -- lookup($2, CONDA_ROOT, + # $2 (path or "") -- lookup($2, CONDA_ROOT, # CONDA_ROOT__py27) - # # Usage: - # _setup_conda # __py27 - # _setup_conda 27 # __py27 - # _setup_conda 34 # __py34 - # _setup_conda 35 # __py35 - # _setup_conda ~/envs # __py27 - # _setup_conda ~/envs/ /opt/conda # /opt/conda - # _setup_conda # conda_root # - local _conda_envs_path="${1}" - local _conda_root_path="${2}" - _setup_conda_defaults "${__WRK}" - if [ -z "${_conda_envs_path}" ]; then - export CONDA_ENVS_PATH="${CONDA_ENVS_PATH:-${CONDA_ENVS__py27}}" - export CONDA_ROOT="${CONDA_ROOT:-${CONDA_ROOT__py27}}" - else - if [ "$_conda_envs_path" == "27" ]; then - export CONDA_ENVS_PATH="$CONDA_ENVS__py27" - export CONDA_ROOT="$CONDA_ROOT__py27" - elif [ "$_conda_envs_path" == "34" ]; then - export CONDA_ENVS_PATH="$CONDA_ENVS__py34" - export CONDA_ROOT="$CONDA_ROOT__py34" - elif [ "$_conda_envs_path" == "35" ]; then - export CONDA_ENVS_PATH="$CONDA_ENVS__py35" - export CONDA_ROOT="$CONDA_ROOT__py35" - else - export CONDA_ENVS_PATH="${_conda_envs_path}" + # $ _setup_conda_help + # + # $ _setup_conda [[] ] + # $ _setup_conda # __py27 + # $ _setup_conda 27 # __py27 + # $ _setup_conda 34 # __py34 + # $ _setup_conda 35 # __py35 + # $ _setup_conda ~/envs # __py27 + # $ _setup_conda ~/envs /opt/conda # /opt/conda + # + local _conda_envs_path="${1:-"${CONDA_ENVS_PATH}"}" + local _conda_root_path="${2:-"${CONDA_ROOT}"}" + local __wrk="${__WRK}" + _setup_conda_defaults "${__wrk}" + case "${_conda_envs_path}" in + 27|2.7) + export CONDA_ENVS_PATH=$CONDA_ENVS__py27 + export CONDA_ROOT=$CONDA_ROOT__py27 + ;; + 34|3.4) + export CONDA_ENVS_PATH=$CONDA_ENVS__py34 + export CONDA_ROOT=$CONDA_ROOT__py34 + ;; + 35|3.5) + export CONDA_ENVS_PATH=$CONDA_ENVS__py35 + export CONDA_ROOT=$CONDA_ROOT__py35 + ;; + *) + export CONDA_ENVS_PATH=( + ${_conda_envs_path:-${CONDA_ENVS_PATH:-${CONDA_ENVS__py27}}}) export CONDA_ROOT=( - "${_conda_root_path:-${CONDA_ROOT:-${CONDA_ROOT__py27}}}") - # CONDA_ROOT_DEFAULT=CONDA_ROOT__py27 - fi - fi + ${_conda_root_path:-${CONDA_ROOT:-${CONDA_ROOT__py27}}}) + ;; + esac _setup_conda_path + _setup_conda_CONDA + _conda_status_core # csc() +} + +function _unsetup_conda_core { + # _unsetup_conda_core() -- unset CONDA_ENVS_PATH, CONDA_ROOT, _CONDA + unset CONDA_ENVS_PATH + unset CONDA_ROOT + unset _CONDA } function _setup_conda_path { @@ -105,12 +195,19 @@ function _setup_conda_path { _unsetup_conda_path_all (set -x; test -n "${CONDA_ROOT}") || return 2 PATH_prepend "${CONDA_ROOT}/bin" 2>&1 > /dev/null + # [ conda activate script then TODO ] } function _unsetup_conda_path_all { # _unsetup_conda_path_all() -- remove CONDA_ROOT & defaults from $PATH - (set -x; test -n "${CONDA_ROOT}") || return 2 - PATH_remove "${CONDA_ROOT}/bin" 2>&1 > /dev/null + # (This aggressively avoids layering/nesting conda envs) + echo PATH="$(shell_escape_single "$PATH")" + if [ -n "${VIRTUAL_ENV}" ]; then + PATH_remove "${VIRTUAL_ENV}/bin" 2>&1 > /dev/null + fi + if [ -n "${CONDA_ROOT}" ]; then + PATH_remove "${CONDA_ROOT}/bin" 2>&1 > /dev/null + fi if [ -n "${CONDA_ROOT__py27}" ]; then PATH_remove "${CONDA_ROOT__py27}/bin" 2>&1 > /dev/null fi @@ -120,21 +217,23 @@ function _unsetup_conda_path_all { if [ -n "${CONDA_ROOT__py35}" ]; then PATH_remove "${CONDA_ROOT__py35}/bin" 2>&1 > /dev/null fi - declare -f 'dotfiles_status' 2>&1 > /dev/null && dotfiles_status - _conda_status + (declare -f 'dotfiles_status' 2>&1 > /dev/null && dotfiles_status) \ + || _conda_status_core + _conda_status_core } function deduplicate_lines { - # deduplicate_lines() -- deduplicate lines w/ an associative array - # (~OrderedMap) + # deduplicate_lines() -- deduplicate lines with a bash array and echo local -A lines_ary local line local lines_ary_value while IFS= read -r line; do - lines_ary_value=${lines_ary["${line}"]} - if [ -z "${lines_ary_value}" ]; then - lines_ary["${line}"]="${line}" - echo "${line}" + if [ -n "${line}" ]; then + lines_ary_value="${lines_ary[$line]}" + if [ -z "${lines_ary_value}" ]; then + lines_ary[$line]="${line}" + echo "${line}" + fi fi done unset lines_ary line lines_ary_value @@ -142,24 +241,96 @@ function deduplicate_lines { function echo_conda_envs_paths { # echo_conda_envs_paths() -- print (CONDA_ENVS_PATH & defaults) + local do_all= + for arg in ${@}; do + case "${arg}" in + -a|--all) + do_all="${arg}" + shift + ;; + esac + done + if [ -z "${do_all}" ]; then + echo "${CONDA_ENVS_PATH}" + return + fi local envs_paths=( "${CONDA_ENVS_PATH}" "${CONDA_ENVS__py27}" "${CONDA_ENVS__py34}" "${CONDA_ENVS__py35}" ) - echo "${envs_paths}" | deduplicate_lines + ( IFS=$'\n'; echo "${envs_paths[*]}" ) | deduplicate_lines + +} + +function _lscondaenvs_help { + echo "${0} -- lscondaenvs,lsce -- list conda envs in CONDA_ENVS_PATH" + echo ' -h/--help -- print this help text' + echo ' --path -- print absolute env paths' + echo ' --basename -- print env path basenames (default)' + echo ' --basename-first -- print ${basename}\t${abspath}' } function lscondaenvs { # lscondaenvs() -- list CONDA_ENVS_PATH/* (and _conda_status) # _conda_status>2 # find>1 - _conda_status >&2 + local do_print_help= + local do_print_abspath= + local do_print_basename= + local do_print_basename_first= + local do_all= + for arg in ${@}; do + case "${arg}" in + -h|--help) + do_print_help="${arg}" + shift + ;; + -a|--all) + do_print_abspath="${arg}" + do_all="${arg}" + ;; + --path) + do_print_abspath="${arg}" + shift + ;; + --basename) + do_print_basename="${arg}" + shift + ;; + --basename-first|--bf) + do_print_abspath="${arg}" + do_print_basename="${arg}" + do_print_basename_first="${arg}" + shift + ;; + esac + done + local findprintfstr='%f\n' + if [ -n "${do_print_abspath}" ]; then + if [ -n "${do_print_basename}" ]; then + if [ -n "${do_print_basename_first}" ]; then + findprintfstr='%f'$'\t''%p\n' + else + findprintfstr='%p'$'\t''%f\n' + fi + else + findprintfstr='%p\n' + fi + fi + if [ -n "${do_print_help}" ]; then + _lscondaenvs_help + return + fi + if [ -n "${do_all}" ]; then + _conda_status >&2 + else + _conda_status_core >&2 + fi while IFS= read -r line; do - find "${line}" -maxdepth 1 -type d | - sort - done < <(echo_conda_envs_paths) + find "${line}" -maxdepth 1 -type d -printf "${findprintfstr}" | sort + done < <(echo_conda_envs_paths "${@}") } function lsce { @@ -169,86 +340,221 @@ function lsce { function _condaenvs { # _condaenvs() -- list conda envs for tab-completion + if [ -z "${CONDA_ENVS_PATH}" ]; then + echo "#CONDA_ENVS_PATH=" >&2 + echo "see: $ _setup_conda_help " >&2 + _setup_conda_help >&2 + echo '' >&2 + COMPREPLY="" + return 2 + fi local -a files while IFS= read -r line; do files+=("${line}/$2"*) done < <(echo_conda_envs_paths) - [[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]##*/}" ) + [[ -e "${files[0]}" ]] && COMPREPLY=( "${files[@]##*/}" ) +} + +function lscondaenvs_pyvers { + lscondaenvs -a | xargs -s 10000 -I '%' '%/bin/python -V' +} + +function workon_conda_help { + ## workon_conda_help() -- print help for workon_conda + echo "workon_conda [ [ []]]" + echo ' $1 _conda_envname (pathstr) -- e.g. "dotfiles"' + echo ' $2 _venvstrapp (pathstr) -- e.g. "dotfiles" or "dotfiles/src/dotfiles"' + echo ' $3 _conda_envs_path (pathstr) -- e.g. "~/-wrk/-ce27" (${__WRK}/-ce27)' + echo 'Usage' + echo ' $ wec dotfiles # _WRD=~/-wrk/-ce27/dotfiles' + echo ' $ wec dotfiles etc/bash # _WRD=~/-wrk/-ce27/dotfiles/etc/bash' + echo ' $ wec dotfiles etc/bash 2.7 # _WRD=~/-wrk/-ce27/dotfiles/etc/bash' + echo ' $ wec dotfiles etc/bash 35 # _WRD=~/-wrk/-ce35/dotfiles/etc/bash' + echo '' + echo 'see also:' + echo ' $ _setup_conda_help' + echo ' $ mkvirtualenv_conda -h' + echo ' $ lsce; lscondaenvs' + echo ' $ csc; _conda_status_core' + echo ' $ csd; _conda_status_defaults' + echo '' } function workon_conda { # workon_conda() -- workon a conda + venv project + # $1 _conda_envname (pathstr) -- e.g. "dotfiles" + # $2 _venvstrapp (pathstr) -- e.g. "dotfiles" or "dotfiles/src/dotfiles" + # $3 _conda_envs_path (pathstr|version_str) -- e.g. "~/-wrk/-ce27" || 27 local _conda_envname="${1}" - local _venvstrapp="${2}" + local _venvstrapp="${2:-"${1}"}" local _conda_envs_path="${3}" + local do_help= + for arg in ${@}; do + case "${arg}" in + -h|--help) + do_help=1 + shift + ;; + esac + done + + if [ -n "${@}" ]]; then + do_help=1 + fi + + if [ -n "${do_help}" ]; then + _workon_conda_help + return 1 + fi + _setup_conda "${_conda_envs_path}" - local CONDA_ENV="${CONDA_ENVS_PATH}/${_conda_envname}" + + local CONDA_ENV="${CONDA_ENVS_PATH}"/"${_conda_envname}" + source "${CONDA_ROOT}/bin/activate" "${CONDA_ENV}" + + #TODO venv.py if unset {CONDA_ROOT, CONDA_ENVS_PATH} + source <(set -x; - $__VENV --wh="${CONDA_ENVS_PATH}" \ - --ve="${CONDA_ENV}" --venvstrapp="${_venvstrapp}" \ + $__VENV \ + --__WRK="${__WRK}" \ + --WORKON_HOME="${CONDA_ENVS_PATH}" \ + --VIRTUAL_ENV="${CONDA_ENV}" \ + --CONDA_ROOT="${CONDA_ROOT}" \ + --CONDA_ENVS_PATH="${CONDA_ENVS_PATH}" \ + --CONDA_ENV="${CONDA_ENV}" \ + --venvstrapp="${_venvstrapp}" \ --print-bash) - declare -f "_setup_venv_prompt" 2>&1 > /dev/null && _setup_venv_prompt - declare -f "dotfiles_status" 2>&1 > /dev/null && dotfiles_status + + # if declared, run _setup_venv_prompt + declare -f "_setup_venv_prompt" 2>&1 > /dev/null && \ + _setup_venv_prompt + + # if declared, print dotfiles_status + declare -f "dotfiles_status" 2>&1 > /dev/null && \ + dotfiles_status + + # print _conda_status [csc; csd] + _conda_status_core + + # declare a 'deactivate' function (like virtualenv) function deactivate { - source deactivate - declare -f "dotfiles_postdeactivate" 2>&1 > /dev/null && \ - dotfiles_postdeactivate + _conda_postdeactivate } } complete -o default -o nospace -F _condaenvs workon_conda + +function _conda_postdeactivate { + source deactivate + _unsetup_conda_path_all + # - update PATH [also] + _unsetup_conda_core + # - unset _CONDA + # - unset CONDA_ENVS_PATH + # - unset CONDA_ROOT + declare -f "dotfiles_postdeactivate" 2>&1 > /dev/null && \ + dotfiles_postdeactivate + _conda_status_core +} + +function deactivate_conda { + _conda_postdeactivate +} + function wec { # wec() -- workon a conda + venv project - # note: tab-completion only shows regular virtualenvs + # note: tab-completion depends on + # CONDA_ENVS_PATH + # $1 _conda_envname (pathstr) -- "dotfiles" + # $2 _venvstrapp (pathstr) -- "dotfiles" or "dotfiles/src/dotfiles" + # $3 _conda_envs_path (pathstr) -- "35" or "3.5" or "~/-wrk/-ce35" + # + # wec dotfiles dotfiles/etc/bash 35 workon_conda $@ } complete -o default -o nospace -F _condaenvs wec -function _mkvirtualenv_conda_usage { - # _mkvirtualenv_conda_usage() -- echo mkvirtualenv_conda usage information - echo "mkvirtualenv_conda " - echo "" - echo " $ mkvirtualenv_conda science" - echo " $ mkvirtualenv_conda science 27" - echo " $ mkvirtualenv_conda science 34" - echo " $ mkvirtualenv_conda science 35" - echo " $ mkvirtualenv_conda ~/science 35" +function _mkvirtualenv_conda_help { + # _mkvirtualenv_conda_help() -- echo mkvirtualenv_conda usage information + echo "_mkvirtualenv_conda [pkg+]" + echo ' $1 _conda_envname (pathstr) -- e.g. "dotfiles"' + echo ' $2 _conda_envs_path (pathstr) -- e.g. "~/-wrk/-ce35" (${__WRK}/-ce35)' + echo ' 27, 2.7 --> "python=2.7"' + echo ' 34, 3.4 --> "python=3.4"' + echo ' 35, 3.5 --> "python=3.5"' + echo ' $3+ _conda_pkgs: zero or more additional packages to install' + echo '' + echo ' Usage:' + echo '' + echo ' $ mkvirtualenv_conda science' + echo ' $ mkvirtualenv_conda science 27' + echo ' $ mkvirtualenv_conda science 34' + echo ' $ mkvirtualenv_conda science 35' + echo ' $ mkvirtualenv_conda ~/science 35' +} + +function _setup_conda_CONDA { + ## setup_conda_CONDA() -- _CONDA = $1 or $_CONDA or $(which conda) + export _CONDA="${1:-"${_CONDA:-"$(which conda 2> /dev/null)"}"}" } function mkvirtualenv_conda { - # mkvirtualenv_conda() -- mkvirtualenv and conda create + ## mkvirtualenv_conda() -- [pkg1 [pkgn]]' + # $1 _conda_envname (pathstr) -- e.g. "dotfiles" + # $2 _conda_envs_path (pathstr) -- e.g. "~/-wrk/-ce27" (${__WRK}/-ce27) + # 27, 2.7 --> "python=2.7" + # 34, 3.4 --> "python=3.4" + # 35, 3.5 --> "python=3.5" + # $3+ _conda_pkgs: zero or more additional packages to install + if [ -n "${@}" ]; then + _mkvirtualenv_conda_help + return 1 + fi local _conda_envname="${1}" - local _conda_envs_path="${2:-${CONDA_ENVS_PATH}}" + local _conda_envs_path="${2}" shift; shift local _conda_pkgs=${@} - local _conda_="conda" + _setup_conda_CONDA - echo '$1 $_conda_envname: '"${_conda_envname}"; - echo '$2 $_conda_envs_path: '"${_conda_envs_path}" ; - if [ -z "${_conda_envname}" ] || [ -z "${_conda_envs_path}" ]; then - return 2 - fi - - echo '_setup_conda '"${_conda_envs_path}" - _setup_conda "${_conda_envs_path}" - local CONDA_ENV="${_conda_envs_path}/${_conda_envname}" - if [ "$_conda_envs_path" == "27" ]; then - conda_python="python=2" - elif [ "$_conda_envs_path" == "34" ]; then - conda_python="python=3.4" - elif [ "$_conda_envs_path" == "35" ]; then - conda_python="python=3.5" - else - conda_python="python=2" + _setup_conda "${_conda_envs_path}" "${CONDA_ROOT}" + if [ -z "$CONDA_ENVS_PATH" ]; then + echo "\$CONDA_ENVS_PATH is not set. Exiting". + return fi - "${_conda_}" create --mkdir --prefix "${CONDA_ENV}" --yes \ + local CONDA_ENV="${CONDA_ENVS_PATH}/${_conda_envname}" + case "${_conda_envs_path}" in + 27|2.7) + conda_python="python=2.7" + ;; + 34|3.4) + conda_python="python=3.4" + ;; + 35|3.5) + conda_python="python=3.5" + ;; + *) + echo "Could not infer conda_python version from: " + echo ' _conda_envs_path='"$(\ + shell_escape_single "${_conda_envs_path}")" >&2 + local _python="${CONDA_ROOT}/bin/python" + echo "Defaulting to ${_python}" >&2 + echo " $(${_python} --version)" >&2 + echo 'Specify _conda_envs_path ($2) as e.g. {27,34,3.5} to ' + _mkvirtualenv_conda_help >&2 + return 2 + ;; + esac + + # create a new condaenv with `conda create` + "${_CONDA}" create --mkdir --prefix "${CONDA_ENV}" --yes \ "${conda_python}" readline pip ${_conda_pkgs} - export VIRTUAL_ENV="${CONDA_ENV}" - workon_conda "${_conda_envname}" "${_conda_envs_path}" + # TODO: set VIRTUAL_ENV and call dotfiles_postmkvirtualenv + # export VIRTUAL_ENV="${CONDA_ENV}" + workon_conda "${_conda_envname}" "${_conda_envname}" "${CONDA_ROOT}" export VIRTUAL_ENV="${CONDA_ENV}" # if there is a function named 'dotfiles_postmkvirtualenv', @@ -256,11 +562,12 @@ function mkvirtualenv_conda { declare -f 'dotfiles_postmkvirtualenv' 2>&1 >/dev/null && \ dotfiles_postmkvirtualenv + # echo CONDA, _CONDA_LIST echo "" - echo "$(which conda)" - conda_list="${_LOG}/conda.list.no-pip.postmkvirtualenv.txt" - echo "conda_list: ${conda_list}" - "${_conda_}" list -e --no-pip | tee "${conda_list}" + echo CONDA="$(shell_escape_single "${CONDA}")" + export _CONDA_LIST="${_LOG}/conda.list.no-pip.postmkvirtualenv.txt" + echo _CONDA_LIST="$(shell_escape_single "${_CONDA_LIST}")" + "${_CONDA}" list -e --no-pip | tee "${_CONDA_LIST}" } function rmvirtualenv_conda { @@ -301,3 +608,35 @@ function workon_conda_if_available { (declare -f 'workon' 2>&1 > /dev/null \ && workon $@) } + + +function test_setup_conda { + + local envname="test_setup_conda__default" + rmvirtualenv_conda "${envname}" + mkvirtualenv_conda "${envname}" + workon_conda "${envname}" + deactivate + workon_conda "${envname}" + #rmvirtualenv_conda "${envname}" + + + local envpyver="34" + + function test_setup_conda_env { + local envpyver="${1:-"34"}" + local envname="test_setup_conda__${envpyver}" + rmvirtualenv_conda "${envname}" + mkvirtualenv_conda "${envname}" "${envpyver}" + workon_conda "${envname}" '' "${envpyver}" + deactivate + workon_conda "${envname}" '' "${envpyver}" + deactivate + } + + test_setup_conda_env 27 + test_setup_conda_env 34 + test_setup_conda_env 35 + + +} diff --git a/scripts/git-changelog.py b/scripts/git-changelog.py index 68f0352c..953e36af 100755 --- a/scripts/git-changelog.py +++ b/scripts/git-changelog.py @@ -49,9 +49,55 @@ TAGRGX_VER = r'v.*' TAGRGX_DEFAULT = TAGRGX_VERSION_OPTION_NUM +BOLCHARSTOESCAPE = ['*', '.. ', '>>> '] +CHARSTOESCAPE = [ + #('\\', u'⧹'), #TODO double-escaping + ('`', '\`'), + ('|', '\|'), + ('[', '\['), + (']', '\]'), +] + def rst_escape(_str): - """XXX TODO""" - return _str + """XXX TODO + + References: + - http://docutils.sourceforge.net/docs/user/rst/quickref.html#escaping + - http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#escaping-mechanism + + .. warning:: There are not yet any test cases for this function. + """ + lines = _str.splitlines() + output_lines = [] + for line in lines: + # * -> \* + # '.. ' -> '\.. ' + # '>>> ' -> '\>>> ' + for c in BOLCHARSTOESCAPE: + r = '\\' + c + matchcount = line.count(c) + if matchcount == 0: + line = line + elif matchcount == 1: + if not line.lstrip().startswith(c): + line = line.replace(c, r) + else: + if line.lstrip().startswith(c): + beginning, rest = line.split(c, 1) + line = beginning + c + rest.replace(c, r) + else: + line = line.replace(c, r) + # characters to escape + for char, repl in CHARSTOESCAPE: + line = line.replace(char, repl) + if line.startswith('__ ') and line.endswith('_'): + # indirect hyperlink target + line = u'\%s' % line + # TODO: header lines + # TODO: footnotes, citations + output_lines.append(line) + return u'\n'.join(output_lines) + def git_changelog( path=None, @@ -171,7 +217,7 @@ def iter_tag_pairs(tags, heading_char='^'): changelog_cmdstr = "log --reverse --pretty=format:'* %s [%h]' " + logpath yield "::" yield "" - yield " git %s" % rst_escape(changelog_cmdstr) + yield " git %s" % (changelog_cmdstr) yield "" cmd = git_cmd + changelog_cmd logging.debug(cmd) diff --git a/scripts/setup_miniconda.sh b/scripts/setup_miniconda.sh index 11331064..6728f9bf 100755 --- a/scripts/setup_miniconda.sh +++ b/scripts/setup_miniconda.sh @@ -41,11 +41,15 @@ function miniconda_download { local verstr="${1}" local destdir="${2:-"${DOWNLOAD_DEST}"}" local filename=$(miniconda_get_download_filename "${verstr}") - local download_url="${REPO_URL_PREFIX}/${filename}" + local download_url="${REPO_URL_PREFIX}${filename}" local dest="${destdir}/${filename}" echo "Downloading: ${download_url}" >&2 echo "Dest: ${dest}" >&2 - (curl -SL "${download_url}" > "${dest}") 1>&2 >&2 \ + if [ -f "${dest}" ]; then + echo "${dest} exists. skipping" >&2 + return 0 + fi + (curl -C - -SL "${download_url}" > "${dest}") 1>&2 >&2 \ && echo "${dest}" \ && return 0 return 1 @@ -66,12 +70,13 @@ function miniconda_install { function miniconda_setup__dotfiles_minicondas { # miniconda_setup__dotfiles_minicondas -- install CONDA_ROOTs - # $1 (str) -- path for CONDA_ROOTs and CONDA_HOMEs (default: $__WRK) + # $1 (str) -- path for CONDA_ROOTs and CONDA_ENVSs (default: $__WRK) # Returns: # n: sum of Miniconda[3]-latest-*.sh return codes local prefix="${1:-"${__WRK}"}" local CONDA_ROOT__py27="${CONDA_ROOT__py27:-"${prefix}/-conda27"}" local CONDA_ROOT__py34="${CONDA_ROOT__py34:-"${prefix}/-conda34"}" + local CONDA_ROOT__py35="${CONDA_ROOT__py35:-"${prefix}/-conda35"}" local mc2=$(miniconda_download) echo $mc2 @@ -81,8 +86,9 @@ function miniconda_setup__dotfiles_minicondas { local ret=0; miniconda_install "${mc2}" "${CONDA_ROOT__py27}" ret=$(expr $ret+$?); - #miniconda_install "${mc2}" "${__WRK}/-ace34" - miniconda_install "${mc3}" "${CONDA_ROOT__py34}" + miniconda_install "${mc3}" "${CONDA_ROOT__py34}" # TODO: python=3.4 + ret=$(expr $ret+$?); + miniconda_install "${mc3}" "${CONDA_ROOT__py35}" # TODO: python=3.5 ret=$(expr $ret+$?); return $ret; } @@ -91,20 +97,51 @@ function miniconda_setup__dotfiles_condaenvs { local prefix="${1:-"${__WRK}"}" local CONDA_ROOT__py27="${CONDA_ROOT__py27:-"${prefix}/-conda27"}" local CONDA_ROOT__py34="${CONDA_ROOT__py34:-"${prefix}/-conda34"}" - local CONDA_HOME__py27="${CONDA_HOME__py27:-"${prefix}/-ce27"}" - local CONDA_HOME__py34="${CONDA_HOME__py34:-"${prefix}/-ce34"}" - - ## create environments with each conda instance: - "${CONDA_ROOT__py27}/bin/conda" install -y -n root conda-env python pip readline - "${CONDA_ROOT__py34}/bin/conda" install -y -n root conda-env python=3 pip readline - test -d "${CONDA_HOME__py27}/dotfiles" || "${CONDA_ROOT__py27}/bin/conda" create -n dotfiles - test -d "${CONDA_HOME__py34}/dotfiles" || "${CONDA_ROOT__py34}/bin/conda" create -n dotfiles + local CONDA_ROOT__py35="${CONDA_ROOT__py35:-"${prefix}/-conda35"}" + local CONDA_ENVS__py27="${CONDA_ENVS__py27:-"${prefix}/-ce27"}" + local CONDA_ENVS__py34="${CONDA_ENVS__py34:-"${prefix}/-ce34"}" + local CONDA_ENVS__py35="${CONDA_ENVS__py35:-"${prefix}/-ce35"}" + + ## with one CONDA_ROOT + # conda create -n dotfiles-27 python=2.7 + # conda create -n dotfiles-34 python=3.4 + # conda create -n dotfiles-35 python=3.5 + + ## with multiple CONDA_ROOT / CONDA_ENVS_PATH pairs + # mkvirtualenv_conda dotfiles 27 + # mkvirtualenv_conda dotfiles 34 + # mkvirtualenv_conda dotfiles 35 + + function mkcondaenv_dotfiles { + ## create environments with each conda instance: + local CONDA_ROOT="${1}" # ${CONDA_ROOT__py27} + local CONDA_ENVS_PATH="${2}" # ${CONDA_ENVS__py27}" + local pyver="${3}" # 2.7, 3.4, 3.5, 3.5.X + shift; + shift; + shift; + local basepkgs="conda-env pip readline ipython" + + # create a root conda w/ basepkgs installed and python=${pyver} + "${CONDA_ROOT}/bin/conda" install -y -n root python=${pyver} ${basepkgs} + + # create a conda env named "dotfiles" + if [ ! -d "${CONDA_ENVS_PATH}/dotfiles" ]; then + "${CONDA_ROOT}/bin/conda" create -f -y -n dotfiles \ + "python=${pyver}" \ + && mkdir -p "${CONDA_ENVS_PATH}/dotfiles/src" + fi + } + + mkcondaenv_dotfiles "${CONDA_ROOT__py27}" "${CONDA_ENVS__py27}" "2.7" + mkcondaenv_dotfiles "${CONDA_ROOT__py34}" "${CONDA_ENVS__py34}" "3.4" + mkcondaenv_dotfiles "${CONDA_ROOT__py35}" "${CONDA_ENVS__py35}" "3.5" } function miniconda_setup_main { ## install miniconda and configure condaenvs - miniconda_setup__dotfiles_minicondas ${@}; - miniconda_setup__dotfiles_condaenvs ${@}; + miniconda_setup__dotfiles_minicondas "${@}"; + miniconda_setup__dotfiles_condaenvs "${@}"; } if [ -n "${BASH_SOURCE}" ] && [ "${BASH_SOURCE}" == "${0}" ]; then