본문 바로가기

Slack 채널 정리

empty cathc block 처리 하기위한 python 스크립트

소스품질에 걸린 '비어있는 catch 블락'건 일괄 처리하기 위해 몇 광년만에 파이썬 코딩 중. 우선 비어있거나, Comment 만 있는(이클립스 기본 템플릿 설정에 의해서 //ToDo 같은게 자동으로 생성된 경우들 있을 듯 해서 또는 /* ... */ 이런 식을 코멘트만 있는 경우도 있겠지 싶어서)  경우를 찾는 것까지 + 빈 catch 블록에 log.debug 구문 삽입하는 기능.

#-*- coding: utf-8 -*-
import re
import os

regex = re.compile(r"(catch\s*\([^\)]*\)\s*\{)((/\*(.|[\r\n])*?\*/)|\s|(\/\/.*))*\}")
regexWord = re.compile(r"\w+")
wdir = 'D:\\tmp\\emptyc1'

def repl(matchobj):
    catch_str = matchobj.group(1)
    txt = re.findall(regexWord, catch_str)
    # print(catch_str, " : ", matchobj.start())
    indent = " " * 8
    indent1 = " " * 12

    comment = ""
    if matchobj.group(3) != None:
        comment = indent1 + matchobj.group(3) + "\n"

    if matchobj.group(5) != None:
        comment = indent1 + matchobj.group(5) + "\n"

    return catch_str + "\n" + indent1 + "log.debug(" +  txt[2] + ".toString());\n" + comment + indent + "}"

def emptyCatch(cmd):
    for dirpath, dirname, filename in os.walk(wdir):
        for fname in filename:
            if fname.endswith(".java"):
                path = os.path.join(dirpath, fname)
                strg = open(path, encoding='UTF8').read()
                # strg = open(path).read()

                if cmd == "R":
                    listEmptyCatch(path, strg)
                elif cmd == "U":
                    replaceEmptyCatch(path, strg)


def listEmptyCatch(path, strg):
    matches = regex.finditer(strg)

    for m in matches:
        print(path, " : ", m.group())


def replaceEmptyCatch(path, strg):
    if re.search(regex, strg):
        strg = re.sub(regex, repl, strg)
        f = open(path, 'w')
        f.write(strg)
        f.close()

emptyCatch("U")

처음 코드 짜서 실제 작업 대상인 프로젝트의 자바 소스들에 적용했더니 인코딩 문제 발생. utf8 로 인코딩 적용해주고 다시 했더니 잘 되다가 이상하게 몇 파일에서만 또다시 인코딩 문제 발생. 그래서 strg = open(path, encoding='UTF-8', errors="surrogateescape").read() 이런 식으로 errors="surrogateescape" 옵션 추가해줬더니 잘 되네요. surrogateescape 옵션이 정확히 어떤 용도인지 혹 아시는 분 계신가요?

September 11th, 2017