blob: 498cfae0325f4e04c8e1f1cacf1d14274a71b1d2 [file] [log] [blame] [edit]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Amlogic gerrit code auto-fix script
# Author: xiaobo.gu@amlogic.com
# Init version: 2015.05.01
import sys, os
import json
MESSAGE_INFO_1 = "trailing spaces"
MESSAGE_INFO_2 = "spacing around parenthesis"
MESSAGE_INFO_3 = "spacing around =="
MESSAGE_INFO_4 = "spacing around !="
MESSAGE_INFO_5 = "do {"
MESSAGE_INFO_6 = "file should not be executable"
MESSAGE_INFO_7 = "possibly incorrect mixed spaces then tabs indentation"
MESSAGE_INFO_8 = "file should not have carriage returns"
MESSAGE_INFO_9 = "make sure indent style matches rest of file"
MESSAGE_INFO_10 = "spacing around &&"
MESSAGE_INFO_11 = "spacing around ||"
MESSAGE_INFO_12 = "spacing around >="
MESSAGE_INFO_13 = "spacing around <="
class fixer(object):
def __init__(self, filename):
self.filename = filename
self.info_review = None
self.info_comment = None
self.info_labels = None
self.cur_file_name = ""
self.cur_file_lines = 0
self.cur_file_content = ""
self.cur_line_content = ""
self.cur_line = 0
self.cur_message = ""
self.verified = -1
def read_log(self):
self.file_handle = open(self.filename)
self.info_str = self.file_handle.read()
self.file_handle.close()
self.info_review = json.loads(self.info_str)
self.info_comment = self.info_review.get("comments")
self.info_labels = self.info_review.get("labels")
def fix(self):
self.verified = self.info_labels.get("Verified")
if(1 == self.verified):
print "Verified +1, Quit..."
return
for file_info in self.info_comment:
print file_info
#print self.cur_file_content
#for line in self.cur_file_content:
# print line,
# start fix for each warning line
for message_info in self.info_comment[file_info]:
self.cur_file_name = file_info
self.cur_message = message_info.get("message")
self.cur_line = (int)(message_info.get("line")) - 1 # index-1
if (self.cur_line >= 0):
# <0 always means line0 error,
# that means file format error etc..
# it's no need open the file
cur_file = open(file_info) # open current file
self.cur_file_content = cur_file.readlines() # get all content of current file, and split info lines
cur_file.close() # close current file
self.cur_file_lines = len(self.cur_file_content)
self.cur_line_content = str(self.cur_file_content[self.cur_line])
self.message_handler()
if (self.cur_line >= 0):
# <0 always means line0 error,
# that means file format error etc..
# it's no need write back current line
self.cur_file_content[self.cur_line] = self.cur_line_content
cur_file = open(file_info, 'w') # open current file
cur_file.writelines(self.cur_file_content) # save file
cur_file.close() # close current file
def message_handler(self):
if (self.cur_message.find(MESSAGE_INFO_1) >= 0):
self.message_1()
if (self.cur_message.find(MESSAGE_INFO_2) >= 0):
self.message_2()
if (self.cur_message.find(MESSAGE_INFO_3) >= 0):
self.message_3()
if (self.cur_message.find(MESSAGE_INFO_4) >= 0):
self.message_4()
if (self.cur_message.find(MESSAGE_INFO_5) >= 0):
self.message_5()
if (self.cur_message.find(MESSAGE_INFO_6) >= 0):
self.message_6()
if (self.cur_message.find(MESSAGE_INFO_7) >= 0):
self.message_7()
if (self.cur_message.find(MESSAGE_INFO_8) >= 0):
self.message_8()
if (self.cur_message.find(MESSAGE_INFO_9) >= 0):
self.message_9()
if (self.cur_message.find(MESSAGE_INFO_10) >= 0):
self.message_10()
if (self.cur_message.find(MESSAGE_INFO_11) >= 0):
self.message_11()
if (self.cur_message.find(MESSAGE_INFO_12) >= 0):
self.message_12()
if (self.cur_message.find(MESSAGE_INFO_13) >= 0):
self.message_13()
def message_1(self):
# acknowledge bug: can not fix last line with last blank character
'''MESSAGE_INFO_1 start'''
#print " -", self.cur_line, self.cur_line_content,
cur_line_length = len(self.cur_line_content)
#print "cur_line_length", cur_line_length
#print self.cur_line_content
for cur_length in range(cur_line_length-1):
#print cur_length
cur_char_pos = cur_line_length-2-cur_length
#print cur_char_pos
#print self.cur_line_content[cur_char_pos]
#print self.cur_line_content
#print self.cur_line_content[0:cur_char_pos], "test"
if (self.cur_line_content[cur_char_pos] == ' ') or \
(self.cur_line_content[cur_char_pos] == ' ') :
self.cur_line_content = self.cur_line_content[0:cur_char_pos] + '\n'
#print self.cur_line_content
else:
break
'''MESSAGE_INFO_1 end'''
def message_2(self):
'''MESSAGE_INFO_2 start'''
cur_line_length = len(self.cur_line_content)
# search parenthesis from left
pare_pos_left = self.cur_line_content.find('(')
#print "self.cur_line_content[pare_pos_left]:", self.cur_line_content[pare_pos_left-1]
#print self.cur_line_content
# insert blank char if doesn't have one
if (pare_pos_left > 0) and (' ' != self.cur_line_content[pare_pos_left-1]):
self.cur_line_content = self.cur_line_content[0:pare_pos_left] + ' ' + self.cur_line_content[pare_pos_left:cur_line_length]
#print self.cur_line_content
# re-calculate cur line length, maybe previous operations changed it's content
cur_line_length = len(self.cur_line_content)
# search parenthesis from right
pare_pos_right = self.cur_line_content.rfind(')')
if ((pare_pos_right+1) <= cur_line_length):
#print "self.cur_line_content[pare_pos_right]:", self.cur_line_content[pare_pos_right+1]
#print self.cur_line_content
if (pare_pos_right > 0) and (' ' != self.cur_line_content[pare_pos_right+1]) and \
('\n' != self.cur_line_content[pare_pos_right+1]):
self.cur_line_content = self.cur_line_content[0:pare_pos_right+1] + ' ' + self.cur_line_content[pare_pos_right+1:cur_line_length]
#print self.cur_line_content
'''MESSAGE_INFO_2 end'''
def message_3(self):
self.message_space_around("==")
def message_4(self):
self.message_space_around("!=")
def message_5(self):
cur_line_length = len(self.cur_line_content)
msg_pos = self.cur_line_content.find("do")
#print "self.cur_line_content[msg_pos+2]", self.cur_line_content[msg_pos+2]
if (' ' != self.cur_line_content[msg_pos+2]):
self.cur_line_content = self.cur_line_content[0:msg_pos+2] + ' ' + self.cur_line_content[msg_pos+2:cur_line_length]
def message_6(self):
shell_cmd = "chmod -x " + self.cur_file_name
os.system(shell_cmd)
def message_7(self):
cur_line_length = len(self.cur_line_content)
cur_line_first_noblank_pos = 0
# find out first non-blank(' '&' ') char
for cur_char_pos in range(cur_line_length):
if (' ' != self.cur_line_content[cur_char_pos]) and \
(' ' != self.cur_line_content[cur_char_pos]):
cur_line_first_noblank_pos = cur_char_pos
break
#print self.cur_line_content
# replace these 4' 's with tab, 1,2,3 blanks will be deleted
no_blank_str = self.cur_line_content[0:cur_line_first_noblank_pos]
no_blank_str = no_blank_str.replace(" ", " ")
no_blank_str = no_blank_str.replace(" ", "")
no_blank_str = no_blank_str.replace(" ", "")
no_blank_str = no_blank_str.replace(" ", "")
self.cur_line_content = no_blank_str + self.cur_line_content[cur_line_first_noblank_pos:cur_line_length]
def message_8(self):
shell_cmd = "dos2unix -o -f " + self.cur_file_name
os.system(shell_cmd)
def message_9(self):
cur_line_length = len(self.cur_line_content)
cur_line_first_noblank_pos = 0
# find out first non-blank(' '&' ') char
for cur_char_pos in range(cur_line_length):
if (' ' != self.cur_line_content[cur_char_pos]) and \
(' ' != self.cur_line_content[cur_char_pos]):
cur_line_first_noblank_pos = cur_char_pos
break
no_blank_str = self.cur_line_content[0:cur_line_first_noblank_pos]
no_blank_str_tmp = no_blank_str.replace(" ", " ")
if (no_blank_str_tmp == no_blank_str):
no_blank_str = no_blank_str.replace(" ", " ")
else:
no_blank_str = no_blank_str_tmp
#print self.cur_line_content
self.cur_line_content = no_blank_str + self.cur_line_content[cur_line_first_noblank_pos:cur_line_length]
#print self.cur_line_content
def message_10(self):
self.message_space_around("&&")
def message_11(self):
self.message_space_around("||")
def message_12(self):
self.message_space_around(">=")
def message_13(self):
self.message_space_around("<=")
def message_space_around(self, symbol):
replace_symbol = []
replace_symbol.append(' ' + symbol + ' ')
replace_symbol.append(' ' + symbol)
replace_symbol.append(symbol + ' ')
#print self.cur_line_content
for rep in range(len(replace_symbol)):
self.cur_line_content = self.cur_line_content.replace(replace_symbol[rep], symbol)
self.cur_line_content = self.cur_line_content.replace(symbol, replace_symbol[0])
#print self.cur_line_content
def printf(self):
#print "comment: ", self.info_comment
#print "labels: ", self.info_labels
for file_info in self.info_comment:
print file_info
for message_info in self.info_comment[file_info]:
print " ", message_info
def run(self):
self.read_log()
#self.printf()
self.fix()
if __name__=='__main__':
if len(sys.argv) != 2:
print 'auto_fix.py [review_log_file]'
exit(1)
fixer = fixer(sys.argv[1])
fixer.run()