1*4bdc9457SAndroid Build Coastguard Worker#!/usr/bin/python3 2*4bdc9457SAndroid Build Coastguard Workerimport re 3*4bdc9457SAndroid Build Coastguard Workerimport argparse 4*4bdc9457SAndroid Build Coastguard Worker 5*4bdc9457SAndroid Build Coastguard Workerparser = argparse.ArgumentParser() 6*4bdc9457SAndroid Build Coastguard Workerparser.add_argument('inputs', nargs='+', help='Input filename') 7*4bdc9457SAndroid Build Coastguard Workerparser.add_argument('--min_lines', type=int, default=1, help='Specify the min number of lines to rearrange') 8*4bdc9457SAndroid Build Coastguard Workerargs = parser.parse_args() 9*4bdc9457SAndroid Build Coastguard Worker 10*4bdc9457SAndroid Build Coastguard Workermin_num_lines = args.min_lines 11*4bdc9457SAndroid Build Coastguard Worker 12*4bdc9457SAndroid Build Coastguard Workerfilename_regex = '(src|source|unit_test|include)/.*$' 13*4bdc9457SAndroid Build Coastguard Worker 14*4bdc9457SAndroid Build Coastguard Worker# caveat: Does fully not handle numbers with different number of digits. 15*4bdc9457SAndroid Build Coastguard Workerdef compare_strs(str1, str2, num_sort=True): 16*4bdc9457SAndroid Build Coastguard Worker winner = 0 # which one's bigger 17*4bdc9457SAndroid Build Coastguard Worker num_sort_mode = False 18*4bdc9457SAndroid Build Coastguard Worker for i in range(min(len(str1),len(str2))): 19*4bdc9457SAndroid Build Coastguard Worker if winner == 0: 20*4bdc9457SAndroid Build Coastguard Worker if num_sort: 21*4bdc9457SAndroid Build Coastguard Worker if str1[i].isdigit() and str2[i].isdigit(): 22*4bdc9457SAndroid Build Coastguard Worker if num_sort_mode: 23*4bdc9457SAndroid Build Coastguard Worker str1_num += str1[i] 24*4bdc9457SAndroid Build Coastguard Worker str2_num += str2[i] 25*4bdc9457SAndroid Build Coastguard Worker else: 26*4bdc9457SAndroid Build Coastguard Worker num_sort_mode = True 27*4bdc9457SAndroid Build Coastguard Worker str1_num = str1[i] 28*4bdc9457SAndroid Build Coastguard Worker str2_num = str2[i] 29*4bdc9457SAndroid Build Coastguard Worker elif num_sort_mode: 30*4bdc9457SAndroid Build Coastguard Worker if str1[i].isdigit(): str1_num += str1[i] 31*4bdc9457SAndroid Build Coastguard Worker if str2[i].isdigit(): str2_num += str2[i] 32*4bdc9457SAndroid Build Coastguard Worker winner = int(str1_num) - int(str2_num) 33*4bdc9457SAndroid Build Coastguard Worker num_sort_mode = False 34*4bdc9457SAndroid Build Coastguard Worker if winner != 0: break 35*4bdc9457SAndroid Build Coastguard Worker if str1[i] != str2[i] and not num_sort_mode: 36*4bdc9457SAndroid Build Coastguard Worker if str2[i].isdigit(): 37*4bdc9457SAndroid Build Coastguard Worker winner = -1 38*4bdc9457SAndroid Build Coastguard Worker elif str1[i].isdigit() or str1[i] > str2[i]: 39*4bdc9457SAndroid Build Coastguard Worker winner = 1 40*4bdc9457SAndroid Build Coastguard Worker else: 41*4bdc9457SAndroid Build Coastguard Worker winner = -1 42*4bdc9457SAndroid Build Coastguard Worker if num_sort_mode: # if it's still in num_sort_mode then find the results 43*4bdc9457SAndroid Build Coastguard Worker if len(str1)-1 > i: 44*4bdc9457SAndroid Build Coastguard Worker i += 1 45*4bdc9457SAndroid Build Coastguard Worker if str1[i].isdigit(): str1_num += str1[i] 46*4bdc9457SAndroid Build Coastguard Worker elif len(str2)-1 > i: 47*4bdc9457SAndroid Build Coastguard Worker i += 1 48*4bdc9457SAndroid Build Coastguard Worker if str2[i].isdigit(): str2_num += str2[i] 49*4bdc9457SAndroid Build Coastguard Worker if int(str1_num) > int(str2_num): 50*4bdc9457SAndroid Build Coastguard Worker winner = 1 51*4bdc9457SAndroid Build Coastguard Worker elif int(str1_num) < int(str2_num): 52*4bdc9457SAndroid Build Coastguard Worker winner = -1 53*4bdc9457SAndroid Build Coastguard Worker num_sort_mode = False 54*4bdc9457SAndroid Build Coastguard Worker 55*4bdc9457SAndroid Build Coastguard Worker if winner == 0: 56*4bdc9457SAndroid Build Coastguard Worker if str2[i].isdigit(): 57*4bdc9457SAndroid Build Coastguard Worker winner = -1 58*4bdc9457SAndroid Build Coastguard Worker elif str1[i].isdigit() or str1[i] > str2[i]: 59*4bdc9457SAndroid Build Coastguard Worker winner = 1 60*4bdc9457SAndroid Build Coastguard Worker else: 61*4bdc9457SAndroid Build Coastguard Worker winner = -1 62*4bdc9457SAndroid Build Coastguard Worker return winner 63*4bdc9457SAndroid Build Coastguard Worker 64*4bdc9457SAndroid Build Coastguard Worker 65*4bdc9457SAndroid Build Coastguard Workerdef cmp_to_key(mycmp): 66*4bdc9457SAndroid Build Coastguard Worker 'Convert a cmp= function into a key= function' 67*4bdc9457SAndroid Build Coastguard Worker class K: 68*4bdc9457SAndroid Build Coastguard Worker def __init__(self, obj, *args): 69*4bdc9457SAndroid Build Coastguard Worker self.obj = obj 70*4bdc9457SAndroid Build Coastguard Worker def __lt__(self, other): 71*4bdc9457SAndroid Build Coastguard Worker return mycmp(self.obj, other.obj) < 0 72*4bdc9457SAndroid Build Coastguard Worker def __gt__(self, other): 73*4bdc9457SAndroid Build Coastguard Worker return mycmp(self.obj, other.obj) > 0 74*4bdc9457SAndroid Build Coastguard Worker def __eq__(self, other): 75*4bdc9457SAndroid Build Coastguard Worker return mycmp(self.obj, other.obj) == 0 76*4bdc9457SAndroid Build Coastguard Worker def __le__(self, other): 77*4bdc9457SAndroid Build Coastguard Worker return mycmp(self.obj, other.obj) <= 0 78*4bdc9457SAndroid Build Coastguard Worker def __ge__(self, other): 79*4bdc9457SAndroid Build Coastguard Worker return mycmp(self.obj, other.obj) >= 0 80*4bdc9457SAndroid Build Coastguard Worker def __ne__(self, other): 81*4bdc9457SAndroid Build Coastguard Worker return mycmp(self.obj, other.obj) != 0 82*4bdc9457SAndroid Build Coastguard Worker return K 83*4bdc9457SAndroid Build Coastguard Worker 84*4bdc9457SAndroid Build Coastguard Workerdef custom_sort(listy): 85*4bdc9457SAndroid Build Coastguard Worker for _ in range(len(listy)-1+1): 86*4bdc9457SAndroid Build Coastguard Worker for i in range(len(listy)-1): 87*4bdc9457SAndroid Build Coastguard Worker bigger = compare_strs(listy[i], listy[i+1]) 88*4bdc9457SAndroid Build Coastguard Worker if bigger > 0: 89*4bdc9457SAndroid Build Coastguard Worker tmp_str = listy[i] 90*4bdc9457SAndroid Build Coastguard Worker listy[i] = listy[i+1] 91*4bdc9457SAndroid Build Coastguard Worker listy[i+1] = tmp_str 92*4bdc9457SAndroid Build Coastguard Worker return listy 93*4bdc9457SAndroid Build Coastguard Worker 94*4bdc9457SAndroid Build Coastguard Worker# file_lines = [l.strip(stripchars) for l in file_lines] 95*4bdc9457SAndroid Build Coastguard Worker# currently sorting by first number in filename. smallest numbers first 96*4bdc9457SAndroid Build Coastguard Worker# this thing may need the ability to recognize filenames 97*4bdc9457SAndroid Build Coastguard Worker# file_lines = sorted(file_lines, key=lambda line: int(re.search('\d+', line.split('/')[-1] + ' 0').group(0))) 98*4bdc9457SAndroid Build Coastguard Workerinput_filenames=args.inputs 99*4bdc9457SAndroid Build Coastguard Workerfor input_filename in input_filenames: 100*4bdc9457SAndroid Build Coastguard Worker with open(input_filename,'r') as file: 101*4bdc9457SAndroid Build Coastguard Worker file_lines = file.read().split('\n') 102*4bdc9457SAndroid Build Coastguard Worker output_filename=input_filename 103*4bdc9457SAndroid Build Coastguard Worker files_range = [] # is a tuple 104*4bdc9457SAndroid Build Coastguard Worker filenames_ranges = [] 105*4bdc9457SAndroid Build Coastguard Worker for i, line in enumerate(file_lines): 106*4bdc9457SAndroid Build Coastguard Worker if re.search(filename_regex, line): 107*4bdc9457SAndroid Build Coastguard Worker if files_range == []: 108*4bdc9457SAndroid Build Coastguard Worker files_range.append(i) 109*4bdc9457SAndroid Build Coastguard Worker else: 110*4bdc9457SAndroid Build Coastguard Worker if files_range != []: 111*4bdc9457SAndroid Build Coastguard Worker files_range.append(i-1) 112*4bdc9457SAndroid Build Coastguard Worker # manages min num lines 113*4bdc9457SAndroid Build Coastguard Worker if files_range[1] - files_range[0] + 1 >= min_num_lines:filenames_ranges.append(files_range) 114*4bdc9457SAndroid Build Coastguard Worker files_range = [] 115*4bdc9457SAndroid Build Coastguard Worker if files_range != []: 116*4bdc9457SAndroid Build Coastguard Worker files_range.append(i-1) 117*4bdc9457SAndroid Build Coastguard Worker # manages min num lines 118*4bdc9457SAndroid Build Coastguard Worker if files_range[1] - files_range[0] + 1 >= min_num_lines:filenames_ranges.append(files_range) 119*4bdc9457SAndroid Build Coastguard Worker files_range = [] 120*4bdc9457SAndroid Build Coastguard Worker 121*4bdc9457SAndroid Build Coastguard Worker 122*4bdc9457SAndroid Build Coastguard Worker for x in filenames_ranges: 123*4bdc9457SAndroid Build Coastguard Worker # accommodate for a close bracket at the end of the last filename 124*4bdc9457SAndroid Build Coastguard Worker if file_lines[x[1]][-1] == ')': 125*4bdc9457SAndroid Build Coastguard Worker append_chars = ')' 126*4bdc9457SAndroid Build Coastguard Worker file_lines[x[1]] = file_lines[x[1]][:-1] 127*4bdc9457SAndroid Build Coastguard Worker else: 128*4bdc9457SAndroid Build Coastguard Worker append_chars = '' 129*4bdc9457SAndroid Build Coastguard Worker 130*4bdc9457SAndroid Build Coastguard Worker new_lines = sorted(file_lines[x[0]:x[1]+1], key=cmp_to_key(compare_strs)) 131*4bdc9457SAndroid Build Coastguard Worker for i, l in enumerate(range(x[0], x[1]+1)): 132*4bdc9457SAndroid Build Coastguard Worker file_lines[l] = new_lines[i] 133*4bdc9457SAndroid Build Coastguard Worker if l == x[1]: 134*4bdc9457SAndroid Build Coastguard Worker file_lines[l] += append_chars 135*4bdc9457SAndroid Build Coastguard Worker 136*4bdc9457SAndroid Build Coastguard Worker with open(output_filename, 'w') as file: 137*4bdc9457SAndroid Build Coastguard Worker file.write('\n'.join(file_lines)) 138