| #!/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() |