ambuild2/util.py
author David Anderson <dvander@alliedmods.net>
Thu Sep 26 01:22:30 2013 -0700 (2013-09-26)
changeset 68 f6119b15c6aa
parent 67 403dbf216108
child 75 7119ae4a5419
permissions -rw-r--r--
Port --show-graph and --show-damage to the new backend.
danderson@56
     1
# vim: set sts=2 ts=8 sw=2 tw=99 et: 
danderson@56
     2
import os
danderson@56
     3
import sys
danderson@56
     4
import subprocess
danderson@56
     5
import multiprocessing
dvander@67
     6
try:
dvander@67
     7
  import __builtin__ as builtins
dvander@67
     8
except:
dvander@67
     9
  import builtins
dvander@67
    10
try:
dvander@67
    11
  import cPickle as pickle
dvander@67
    12
except:
dvander@67
    13
  import pickle
danderson@56
    14
danderson@56
    15
def Platform():
danderson@56
    16
  if IsWindows():
danderson@56
    17
    return 'windows'
danderson@56
    18
  if IsMac():
danderson@56
    19
    return 'mac'
danderson@56
    20
  if sys.platform[0:5] == 'linux':
danderson@56
    21
    return 'linux'
danderson@56
    22
  return 'unknown'
danderson@56
    23
danderson@56
    24
def IsWindows():
danderson@56
    25
  return sys.platform == 'win32' or sys.platform == 'cygwin'
danderson@56
    26
danderson@56
    27
def IsMac():
danderson@56
    28
  return sys.platform == 'darwin'
danderson@56
    29
danderson@56
    30
def IsUnixy():
danderson@56
    31
  return sys.platform[0:5] == 'linux' or IsMac()
danderson@56
    32
danderson@56
    33
def ExecutableSuffix():
danderson@56
    34
  if IsWindows():
danderson@56
    35
    return '.exe'
danderson@56
    36
  else:
danderson@56
    37
    return ''
danderson@56
    38
danderson@56
    39
def SharedLibSuffix():
danderson@56
    40
  if IsWindows():
danderson@56
    41
    return '.dll'
danderson@56
    42
  elif sys.platform == 'darwin':
danderson@56
    43
    return '.dylib'
danderson@56
    44
  else:
danderson@56
    45
    return '.so'
danderson@56
    46
danderson@56
    47
def StaticLibSuffix():
danderson@56
    48
  if IsUnixy():
danderson@56
    49
    return '.a'
danderson@56
    50
  return '.lib'
danderson@56
    51
danderson@56
    52
def StaticLibPrefix():
danderson@56
    53
  if IsWindows():
danderson@56
    54
    return ''
danderson@56
    55
  else:
danderson@56
    56
    return 'lib'
danderson@56
    57
danderson@56
    58
def WaitForProcess(process):
danderson@56
    59
  out, err = process.communicate()
danderson@56
    60
  process.stdoutText = out.decode()
danderson@56
    61
  process.stderrText = err.decode()
danderson@56
    62
  return process.returncode
danderson@56
    63
danderson@56
    64
def CreateProcess(argv, executable = None):
danderson@56
    65
  pargs = { 'args': argv }
danderson@56
    66
  pargs['stdout'] = subprocess.PIPE
danderson@56
    67
  pargs['stderr'] = subprocess.PIPE
danderson@56
    68
  if executable != None:
danderson@56
    69
    pargs['executable'] = executable
danderson@56
    70
  try:
danderson@56
    71
    process = subprocess.Popen(**pargs)
danderson@56
    72
  except:
danderson@56
    73
    return None
danderson@56
    74
  return process
danderson@56
    75
danderson@56
    76
def MakePath(*list):
danderson@56
    77
  path = os.path.join(*list)
danderson@56
    78
  if IsWindows():
danderson@56
    79
    path = path.replace('\\\\', '\\')
danderson@56
    80
  return path
danderson@56
    81
danderson@56
    82
def RemoveFolderAndContents(path):
danderson@56
    83
  for file in os.listdir(path):
danderson@56
    84
    subpath = os.path.join(path, file)
danderson@56
    85
    try:
danderson@56
    86
      if os.path.isfile(subpath) or os.path.islink(subpath):
danderson@56
    87
        os.unlink(subpath)
danderson@56
    88
      elif os.path.isdir(subpath):
danderson@56
    89
        RemoveFolderAndContents(subpath)
danderson@56
    90
    except:
danderson@56
    91
      pass
danderson@56
    92
  os.rmdir(path)
danderson@56
    93
danderson@56
    94
class FolderChanger:
danderson@56
    95
  def __init__(self, folder):
danderson@56
    96
    self.old = os.getcwd()
danderson@56
    97
    self.new = folder
danderson@56
    98
danderson@56
    99
  def __enter__(self):
danderson@56
   100
    os.chdir(self.new)
danderson@56
   101
danderson@56
   102
  def __exit__(self, type, value, traceback):
danderson@56
   103
    os.chdir(self.old)
danderson@56
   104
danderson@56
   105
class Guard:
danderson@56
   106
  def __init__(self, obj):
danderson@56
   107
    self.obj = obj
danderson@56
   108
danderson@56
   109
  def __enter__(self):
danderson@56
   110
    return self.obj
danderson@56
   111
danderson@56
   112
  def __exit__(self, type, value, traceback):
danderson@56
   113
    self.obj.close()
danderson@56
   114
dvander@61
   115
def Execute(argv):
dvander@61
   116
  p = subprocess.Popen(
dvander@61
   117
      args=argv,
dvander@61
   118
      stdout=subprocess.PIPE,
dvander@61
   119
      stderr=subprocess.PIPE,
dvander@61
   120
      shell=False
dvander@61
   121
  )
danderson@56
   122
  stdout, stderr = p.communicate()
dvander@61
   123
  out = stdout.decode()
dvander@61
   124
  err = stderr.decode()
danderson@56
   125
dvander@61
   126
  out = (' '.join([i for i in argv])) + out
dvander@61
   127
  return p, out, err
dvander@67
   128
dvander@67
   129
def typeof(x):
dvander@67
   130
  return builtins.type(x)
dvander@67
   131
dvander@67
   132
if str == bytes:
dvander@67
   133
  # Python 2.7. sqlite blob is buffer
dvander@67
   134
  BlobType = buffer
dvander@67
   135
else:
dvander@67
   136
  BlobType = bytes
dvander@68
   137
dvander@68
   138
def Unpickle(blob):
dvander@68
   139
  if type(blob) != bytes:
dvander@68
   140
    blob = bytes(blob)
dvander@68
   141
  return pickle.loads(blob)