from __future__ import division

try:
  from glob import glob
  import libtbx.load_env
  import os
  dials_path = libtbx.env.dist_path('dials')
  filenames = glob(os.path.join(dials_path, "extensions", "*.pyc"))
  if len(filenames) > 0:
    print "Cleaning up 'dials/extensions':"
    for filename in filenames:
      print " Deleting %s" % filename
      os.remove(filename)
except Exception:
  pass

try:
  from dials.framework import env
  env.cache.wipe()
except Exception:
  pass

try:
  from dials.util.version import dials_version
  print dials_version()
except Exception:
  pass

def _install_dials_autocompletion():
  '''generate init.sh and SConscript file in /build/dials/autocomplete'''
  import libtbx.load_env
  import os

  # Find the dials source directory
  dist_path = libtbx.env.dist_path('dials')

  # Set the location of the output directory
  output_directory = libtbx.env.under_build(os.path.join('dials', 'autocomplete'))
  try:
    os.makedirs(output_directory)
  except OSError:
    pass

  commands_dir = os.path.join(dist_path, 'command_line')
  command_list = []
  print 'Identifying autocompletable commands:',
  for file in sorted(os.listdir(commands_dir)):
    if not file.startswith('_') and file.endswith('.py'):
      if 'DIALS_ENABLE_COMMAND_LINE_COMPLETION' in open(os.path.join(commands_dir, file)).read():
        command_name = 'dials.%s' % file[:-3]
        print command_name,
        command_list.append(command_name)
  print

  # Generate the autocompletion SConscript.
  with open(os.path.join(output_directory, 'SConscript'), 'w') as builder:
    builder.write('''Import("env")
import os.path
import libtbx.load_env
def dispatcher_outer(name):
  return os.path.join(libtbx.env.under_build('bin'), name)
def dispatcher_inner(name):
  return os.path.join(libtbx.env.dist_path('dials'), 'command_line', '%%s.py' %% name.partition('.')[2])
env.Append( BUILDERS={'AutoComplete': Builder(action='$SOURCE --export-autocomplete-hints > $TARGET')} )
for cmd in [%s]:
  ac = env.AutoComplete(cmd, [dispatcher_outer(cmd), dispatcher_inner(cmd)])
  Requires(ac, Dir(libtbx.env.under_build('lib')))
  Depends(ac, os.path.join(libtbx.env.dist_path('dials'), 'util', 'options.py'))
  Depends(ac, os.path.join(libtbx.env.dist_path('dials'), 'util', 'autocomplete.sh'))
''' % ( ', '.join(["'%s'" % cmd for cmd in command_list]) ))

  # Generate a bash script activating command line completion for each relevant command
  with open(os.path.join(output_directory, 'bash.sh'), 'w') as script:
    script.write("type compopt &>/dev/null && {\n")
    for cmd in command_list:
      script.write(" complete -F _dials_autocomplete %s\n" % cmd)
    script.write("}\n")
    script.write("type compopt &>/dev/null || {\n")
    for cmd in command_list:
      script.write(" complete -o nospace -F _dials_autocomplete %s\n" % cmd)
    script.write("}\n")

  # Find the dials build directory
  build_path = abs(libtbx.env.build_path)

  # Permanently install the autocompletion script into setpaths-scripts.
  print "Installing autocompletion script into:",
  for file in os.listdir(build_path):
    if file.startswith('setpath') and file.endswith('.sh'):
      original_file = open(os.path.join(build_path, file)).read()
      if not 'DIALS_ENABLE_COMMAND_LINE_COMPLETION' in original_file:
        marker = "\nexport PATH\n"
        insert_position = original_file.find(marker) + len(marker)
        if insert_position >= 0:
          print file,
          added_script = \
            '# DIALS_ENABLE_COMMAND_LINE_COMPLETION\n' \
            '[ -z "$BASH_VERSIONINFO" ] && {\n' \
            ' source $(libtbx.find_in_repositories dials/util/autocomplete.sh)\n' \
            ' source %s\n' \
            '}\n' % (
              os.path.join('$LIBTBX_BUILD', 'dials', 'autocomplete', 'bash.sh'))
          with open(os.path.join(build_path, file), 'w') as script:
            script.write(original_file[:insert_position] +
                         added_script +
                         original_file[insert_position:])
  print

_install_dials_autocompletion()

@@ -3563,9 +3563,9 @@
 '%5B -
-z
+n
  %22$B
@@ -3579,12 +3579,8 @@
 SION
-INFO
 %22 %5D 

check for bash, not for non-bash. fixes #78, well spotted.