diff --git a/python/change_paths.py b/python/change_paths.py new file mode 100644 index 000000000..0cff60459 --- /dev/null +++ b/python/change_paths.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python + +import fnmatch,os,string,sys + +def add_directory(dirname): + parent = os.path.dirname(dirname) + if not os.path.exists(parent) and parent != '': + add_directory(parent) + if not os.path.exists(dirname): + print 'creating directory',dirname + os.makedirs(dirname) + os.system('svn add %s'%dirname) + +def remove_directory(dirname): + if os.path.exists(dirname): + print 'removing directory',dirname + os.system('svn rm %s'%dirname) +# os.system('rm -rf %s'%dirname) + +def move_file(source_filename,target_filename): + print 'moving %s to %s' % (source_filename,target_filename) + os.system('svn mv %s %s'%(source_filename,target_filename)) +# os.system('mv %s %s'%(source_filename,target_filename)) + +target_public = 'public' +target_private = 'private' + +base_excludes = ['.svn','archive','tribble','integrationtests','settings',target_public,target_private] +private_paths = ['playground','oneoffprojects','oneoffs','archive','analysis','alignment','bwa','c','lua','matlab','perl','python','ruby','R','shell'] +paths_to_trim = ['playground','oneoffprojects','oneoffs'] +source_extensions = ['*.java','*.scala'] + +def intersect(a,b): + return list(set(a) & set(b)) + +def is_source_file(file): + for source_extension in source_extensions: + if fnmatch.fnmatch(file,source_extension): + return True + return False + +def modify_path(path): + tokens = path.split('/') + # compute proper target path: public or private? + if(intersect(tokens,private_paths)): + # kill private directory indicator only if private directory indicator is not the first element in the path. + modified_tokens = [token for token in tokens if token not in paths_to_trim] + return string.join(modified_tokens,'/').replace('./',target_private+'/') + else: + return path.replace('./',target_public+'/') + +add_directory(target_public) +add_directory(target_private) + +# just move archive wholesale; don't worry about processing at this point. +move_file('archive',target_private) + +for root,dirs,files in os.walk('.'): + # filter out non-processed files from root directory and base_excludes + tokens = string.split(root,'/') + if len(tokens) == 1: + continue + if len(intersect(tokens,base_excludes)) > 0: + continue + + # handle file move + for file in ["%s/%s"%(root,file) for file in files]: + modified_path = modify_path(file) + dirname = os.path.dirname(modified_path) + add_directory(dirname) + move_file(file,dirname) + +# handle source code modification +for root,dirs,files in os.walk('.'): + # process only public and private directories + if not (root.startswith('./'+target_public) or root.startswith('./'+target_private)): + continue + for file in ["%s/%s"%(root,file) for file in files if is_source_file(file)]: + f = open(file,'r') + lines = f.readlines() + for i in range(len(lines)): + line = lines[i] + if line.startswith('package') or line.startswith('import'): + tokens = line.split('.') + if intersect(tokens,private_paths): + tokens = [token for token in tokens if token not in paths_to_trim] + modified_line = string.join(tokens,'.') + print "%s: '%s' => '%s'" % (file,line.rstrip(),modified_line.rstrip()) + lines[i] = modified_line + f.close() + f = open(file,'w') + f.writelines(lines) + f.close() + +for file in os.listdir('.'): + if os.path.isdir(file) and not file in base_excludes and not file.startswith(target_public) and not file.startswith(target_private): + remove_directory(file)