[buildout]
extends =
	../pygolang/buildout.cfg

parts =

[virtual-env-base]
recipe = slapos.recipe.build
name = ${:_buildout_section_name_}
default-instance = true
init =
  from zc.buildout.easy_install import working_set
  import os
  name = options['name']
  eggs = options.get('eggs')
  self.message = options.get('message')
  self.chain = options.get('chain')
  environment = options.get('environment')
  scripts = options.get('scripts')

  eggs_template = """
  [.%(name)s.install-eggs]
  recipe = zc.recipe.egg
  eggs =
    %(eggs)s
  %(scripts)s

  [.%(name)s.install-interpreter]
  <= python-interpreter
  eggs +=
    %(eggs)s
  """

  instance_template = """
  [.%(name)s.instance]
  recipe = slapos.recipe.template
  output = ${buildout:directory}/instance.cfg
  depends = $%(cookbook)s
  inline =
    [buildout]
    parts = publish

    eggs-directory = ${buildout:eggs-directory}
    develop-eggs-directory = ${buildout:develop-eggs-directory}

    [publish]
    recipe = slapos.cookbook:publish
    activate-script = %(location)s
  """

  if eggs:
    self.buildout.parse(eggs_template % {
      "eggs": "\n  ".join(e.strip() for e in eggs.splitlines()),
      "name": name,
      "scripts": "scripts = " + scripts if scripts else "",
    })

  if is_true(options.get('default-instance')):
    self.buildout.parse(instance_template % {
      "cookbook": "{slapos-cookbook:recipe}",
      "location": location,
      "name": name,
    })

  env = {
    "PATH": self.buildout['buildout']['bin-directory'] + ":\$PATH",
    "PS1": "\"(" + self.name + ") \$PS1\"",
  }

  if environment:
    for line in environment.splitlines():
      key, value = line.split("=", 1)
      env[key.strip()] = value.strip()

  self.env = env

install =
  message = ""
  if self.message:
    message = "echo " + "\n  echo ".join(
      "%r" % line for line in self.message.splitlines())
    message += "\n  echo \'\'"

  chain = ""
  if self.chain:
    chain = "source " + "\n  source ".join(
      "%r" % line for line in self.chain.splitlines())

  with open(location, "w") as f:
    f.write(options['template'] % {
      "env": " ".join("%s %s" % (k, v) for k, v in self.env.items()),
      "message": message,
      "chain": chain,
    })

# Template virtual env for bash shell in posix
[virtual-env-base:posix]
template =
  if type deactivate > /dev/null 2>&1
  then
    export _OLD_PARAM=( "$@")
    set %(env)s
    while [ "$1" ]; do
      if ! ( echo $_LIST_OLD_VENV | grep $1 ) > /dev/null 2>&1
      then
        eval "export _OLD_VENV_$1=\$$1"
        eval "export _LIST_OLD_VENV=\"$1 \$_LIST_OLD_VENV\""
      fi
      eval "export $1=\"$2\""
      shift
      shift
    done
    if [[ -n "$_OLD_PARAM" ]]; then
      set "$${_OLD_PARAM[@]}"
    fi
    unset _OLD_PARAM
    %(chain)s
    %(message)s
  else
    deactivate () {
      set $_LIST_OLD_VENV
      while [ "$1" ]; do
        eval "if [ \"\$_OLD_VENV_$1\" ]; then $1=\$_OLD_VENV_$1; else unset $1; fi; unset \$_OLD_VENV_$1"
        shift
      done
      unset -f deactivate
      unset _LIST_OLD_VENV
    }
    export _OLD_PARAM=( "$@" )
    set %(env)s
    while [ "$1" ]; do
      eval "_OLD_VENV_$1=\$$1"
      eval "export $1=\"$2\""
      eval "export _LIST_OLD_VENV=\"$1 \$_LIST_OLD_VENV\""
      shift
      shift
    done
    if [[ -n "$_OLD_PARAM" ]]; then
      set "$${_OLD_PARAM[@]}"
    fi
    unset _OLD_PARAM
    %(chain)s
    %(message)s
  fi
