197 lines
5.6 KiB
Python
197 lines
5.6 KiB
Python
|
|
import re
|
|
import socket
|
|
import time
|
|
import os
|
|
import os.path
|
|
import itertools
|
|
import subprocess
|
|
import sys
|
|
# various utilities that are handy
|
|
|
|
def getAllSourceFiles( arr=None , prefix="." ):
|
|
if arr is None:
|
|
arr = []
|
|
|
|
for x in os.listdir( prefix ):
|
|
if x.startswith( "." ) or x.startswith( "pcre-" ) or x.startswith( "32bit" ) or x.startswith( "mongodb-" ) or x.startswith("debian") or x.startswith( "mongo-cxx-driver" ):
|
|
continue
|
|
full = prefix + "/" + x
|
|
if os.path.isdir( full ) and not os.path.islink( full ):
|
|
getAllSourceFiles( arr , full )
|
|
else:
|
|
if full.endswith( ".cpp" ) or full.endswith( ".h" ) or full.endswith( ".c" ):
|
|
arr.append( full )
|
|
|
|
return arr
|
|
|
|
|
|
def getGitBranch():
|
|
if not os.path.exists( ".git" ):
|
|
return None
|
|
|
|
version = open( ".git/HEAD" ,'r' ).read().strip()
|
|
if not version.startswith( "ref: " ):
|
|
return version
|
|
version = version.split( "/" )
|
|
version = version[len(version)-1]
|
|
return version
|
|
|
|
def getGitBranchString( prefix="" , postfix="" ):
|
|
t = re.compile( '[/\\\]' ).split( os.getcwd() )
|
|
if len(t) > 2 and t[len(t)-1] == "mongo":
|
|
par = t[len(t)-2]
|
|
m = re.compile( ".*_([vV]\d+\.\d+)$" ).match( par )
|
|
if m is not None:
|
|
return prefix + m.group(1).lower() + postfix
|
|
if par.find("Nightly") > 0:
|
|
return ""
|
|
|
|
|
|
b = getGitBranch()
|
|
if b == None or b == "master":
|
|
return ""
|
|
return prefix + b + postfix
|
|
|
|
def getGitVersion():
|
|
if not os.path.exists( ".git" ):
|
|
return "nogitversion"
|
|
|
|
version = open( ".git/HEAD" ,'r' ).read().strip()
|
|
if not version.startswith( "ref: " ):
|
|
return version
|
|
version = version[5:]
|
|
f = ".git/" + version
|
|
if not os.path.exists( f ):
|
|
return version
|
|
return open( f , 'r' ).read().strip()
|
|
|
|
def execsys( args ):
|
|
import subprocess
|
|
if isinstance( args , str ):
|
|
r = re.compile( "\s+" )
|
|
args = r.split( args )
|
|
p = subprocess.Popen( args , stdout=subprocess.PIPE , stderr=subprocess.PIPE )
|
|
r = p.communicate()
|
|
return r;
|
|
|
|
def getprocesslist():
|
|
raw = ""
|
|
try:
|
|
raw = execsys( "/bin/ps -ax" )[0]
|
|
except Exception,e:
|
|
print( "can't get processlist: " + str( e ) )
|
|
|
|
r = re.compile( "[\r\n]+" )
|
|
return r.split( raw )
|
|
|
|
def removeIfInList( lst , thing ):
|
|
if thing in lst:
|
|
lst.remove( thing )
|
|
|
|
def findVersion( root , choices ):
|
|
for c in choices:
|
|
if ( os.path.exists( root + c ) ):
|
|
return root + c
|
|
raise "can't find a version of [" + root + "] choices: " + choices
|
|
|
|
def choosePathExist( choices , default=None):
|
|
for c in choices:
|
|
if c != None and os.path.exists( c ):
|
|
return c
|
|
return default
|
|
|
|
def filterExists(paths):
|
|
return filter(os.path.exists, paths)
|
|
|
|
def ensureDir( name ):
|
|
d = os.path.dirname( name )
|
|
if not os.path.exists( d ):
|
|
print( "Creating dir: " + name );
|
|
os.makedirs( d )
|
|
if not os.path.exists( d ):
|
|
raise "Failed to create dir: " + name
|
|
|
|
|
|
def distinctAsString( arr ):
|
|
s = set()
|
|
for x in arr:
|
|
s.add( str(x) )
|
|
return list(s)
|
|
|
|
def checkMongoPort( port=27017 ):
|
|
sock = socket.socket()
|
|
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
|
sock.settimeout(1)
|
|
sock.connect(("localhost", port))
|
|
sock.close()
|
|
|
|
|
|
def didMongodStart( port=27017 , timeout=20 ):
|
|
while timeout > 0:
|
|
time.sleep( 1 )
|
|
try:
|
|
checkMongoPort( port )
|
|
return True
|
|
except Exception,e:
|
|
print( e )
|
|
timeout = timeout - 1
|
|
return False
|
|
|
|
def which(executable):
|
|
if sys.platform == 'win32':
|
|
paths = os.environ.get('Path', '').split(';')
|
|
else:
|
|
paths = os.environ.get('PATH', '').split(':')
|
|
|
|
for path in paths:
|
|
path = os.path.expandvars(path)
|
|
path = os.path.expanduser(path)
|
|
path = os.path.abspath(path)
|
|
executable_path = os.path.join(path, executable)
|
|
if os.path.exists(executable_path):
|
|
return executable_path
|
|
|
|
return executable
|
|
|
|
def find_python(min_version=(2, 5)):
|
|
# if this script is being run by py2.5 or greater,
|
|
# then we assume that "python" points to a 2.5 or
|
|
# greater python VM. otherwise, explicitly use 2.5
|
|
# which we assume to be installed.
|
|
version = re.compile(r'[Pp]ython ([\d\.]+)', re.MULTILINE)
|
|
binaries = ('python27', 'python2.7', 'python26', 'python2.6', 'python25', 'python2.5', 'python')
|
|
for binary in binaries:
|
|
try:
|
|
out, err = subprocess.Popen([binary, '-V'], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
|
|
for stream in (out, err):
|
|
match = version.search(stream)
|
|
if match:
|
|
versiontuple = tuple(map(int, match.group(1).split('.')))
|
|
if versiontuple >= (2, 5):
|
|
return which(binary)
|
|
except:
|
|
pass
|
|
|
|
raise Exception('could not find suitable Python (version >= %s)' % '.'.join(min_version))
|
|
|
|
def smoke_command(*args):
|
|
here = os.path.dirname(__file__)
|
|
smoke_py = os.path.join(here, 'smoke.py')
|
|
return ' '.join(itertools.chain(
|
|
(find_python(), smoke_py),
|
|
args))
|
|
|
|
def run_s3tool(settings_file, bucket_name, command, *args):
|
|
if settings_file.endswith('.pyc'):
|
|
settings_file = settings_file[:-1]
|
|
|
|
here = os.path.dirname(__file__)
|
|
s3tool = os.path.join(here, 's3tool')
|
|
cmd = [find_python(), s3tool, '--config=%s' % settings_file, bucket_name, command]
|
|
cmd.extend(args)
|
|
print ' '.join(cmd)
|
|
exitcode = subprocess.call(cmd)
|
|
return exitcode == 0
|
|
|