레이블이 tab인 게시물을 표시합니다. 모든 게시물 표시
레이블이 tab인 게시물을 표시합니다. 모든 게시물 표시

2016년 12월 1일 목요일

git repo로 구성된 소스코드의 Tab과 Space 일괄 통일 작업 실행


예전에 작성한 git repo로 구성된 소스코드의 Tab과 Space 일괄 통일 작업 계획을 오늘 실제로 실행했기에 블로그를 적어 본다.

작업 전에 미리 생각해볼 문제들


Tab과 Space 중 Tab으로 결정
- 이유 1 : 개발팀원이 모두 Tab을 선호함
- 이유 2 : 이클립스의 기본 설정
- 이유 3 : 키보드의 Tab키를 눌러서 들여쓰기를 하니까 실제 행동과 결과를 맞추려고

Space 4개를 Tab 1개로 하고, 4개 미만의 Space는 버림
- 이유 1 : 단순한 계산이 가능해서
- 이유 2 : 이클립스의 기본 설정이 Space 4 = Tab 1

변경 후 혹시 틀어지게 되는 들여쓰기는 무시했다.
- 이유 1 : 나중에 그 부분을 수정할 때 고치겠지.
- 이유 2 : 어차피 지금도 일관된 규칙으로 들여쓰기 되지 않음
- 이유 3 : 일괄로 들여쓰기 정도를 고치면 들여쓰기가 틀어질 수 있음

일괄 작업 날짜는 특정 버전 릴리즈 직후로 했다.
- 이유 1 : 개별 개발자가 별도 branch를 만들 경우가 거의 없다.
- 이유 2 : 일괄 작업한 결과를 master와 development 모두 merge 가능

작업하는 김에 줄끝의 공백문자도 같이 지워주고, 줄바꿈문자도 UNIX(\n)로 같이 통일했다.


작업 방법


소스코드를 변경하는 java 프로그램을 작성해서 일괄로 작업했다. 이런 작업을 일괄로 하위 디렉토리까지 해주는 도구를 찾아볼까도 생각했는데, 프로그램을 직접 만드는게 간단할 것 같아서 그냥 구현했다.

파일을 한줄씩 읽어서 처리하고 다시 한줄씩 쓰는 형태인데, java7 nio 패키지의 Files를 이용해서 한번에 읽어서 처리하고 다시 한번에 쓰는 형태로 구현했다.

그리고 Files.write를 할 때 UNIX 줄바꿈 문자를 사용해야 하는데, 작업을 해보니 그대로 DOS형식이 유지되어 파일이 생성되고 있었다. javadoc을 보면 line.separator라는 시스템 프러퍼티에서 지정한 플랫폼별 줄바꿈문자를 사용한다고 한다. 그래서 시스템 프러퍼티를 강제로 \n으로 바꿔 주어야 한다.

```java
System.setProperty("line.separator", "\n");

List<String> readAllLines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);

for (int i = 0; i < readAllLines.size(); i++) {
String line = readAllLines.get(i);
String changedline = StringUtils.stripEnd(line, null);
changedline = changeToTab(changedline);
readAllLines.set(i, changedline);
}

Files.write(file.toPath(), readAllLines, StandardCharsets.UTF_8);
```

이 프로그램이 정말 소스코드의 앞뒤 공백문자와 줄바꿈문자만 변경했는지를 확인하고 싶었다. 그래서 생각해 낸 것이 git diff를 공백을 무시하여 확인하는 방법인데, command line에서 아래 명령을 실행해서 변경된 것이 아무것도 없는 것을 확인하여 예상대로 작업이 되었다고 확인할 수 있었다.

```
git diff --ignore-all-space
```


작업 후 처리


앞으로 변경되는 소스코드에서 일괄작업에서 적용한 규칙을 지켜서 git 형상에 들어올 수 있도록 개별 개발자의 개발편집환경을 맞출 필요가 생겼다. 우리 개발팀은 모두 이클립스를 사용하므로, 이클립스에서 각 프로젝트의 환경설정과 AnyEdit라는 플러그인의 옵션을 설정하는 것으로 이를 맞출 수 있었다.

.settings/org.eclipse.core.resources.prefs 파일 내용
eclipse.preferences.version=1
encoding/<project>=UTF-8

.settings/org.eclipse.core.runtime.prefs 파일 내용
eclipse.preferences.version=1
line.separator=\n

.settings/de.loskutov.anyedit.AnyEditTools.prefs 파일 내용
activeContentFilterList=
addNewLine=false
convertActionOnSaave=AnyEdit.CnvrtSpacesToTabs
eclipse.preferences.version=1
fixLineDelimiters=true
ignoreBlankLinesWhenTrimming=false
inActiveContentFilterList=
javaTabWidthForJava=false
org.eclipse.jdt.ui.editor.tab.width=4
projectPropsEnabled=true
removeTrailingSpaces=true
replaceAllSpaces=false
replaceAllTabs=false
saveAndAddLine=false
saveAndConvert=false
saveAndFixLineDelimiters=true
saveAndTrim=true
useModulo4Tabs=false

2016년 9월 7일 수요일

git repo로 구성된 소스코드의 Tab과 Space 일괄 통일 작업 계획

소스코드의 들여쓰기를 Tab과 Space 중에 무엇으로 하는가에 대한 이야기가 있다. 설문조사도 있고, github의 현황을 통계낸 자료도 있다. 업무로 개발중인 소스코드에서는 표준없이 마구 개발하다보니 통일되어 있지 않은데, 관련해서 생각을 정리해본다.

왜 통일하려고 하는가?

  • 머지 리퀘스트 diff 중에 공백문자로 인한 불필요한 diff를 보기 싫어서
  • 에디터 설정에 따라서 인덴트가 둘쑥날쑥하면 소스 보기 어려워서
  • 마음속 깊은 곳의 불편함을 없에고 싶어서
  • 그냥 해보고 싶어서

통일작업시 고려할 것은?

  • Tab과 Space중 무엇으로 할 것인가? (개발팀의 의견 중요)
  • Space로 하면 몇 칸으로 할 것인가? (2 or 4)
  • Space를 Tab으로 바꾸면 Space 몇 칸을 Tab 1개로 할 것인지?
  • Space 나머지는 어떻게 할 것인지? (ex: Space 4이 Tab1개인데, Space가 14칸일때 Tab은 몇개?)
  • 바꾸고 나면 인덴트가 틀어지는데, 파일 전체의 자동 인덴트를 할 수 있을지?

통일작업 이외에 고려할 것은?

  • 언제 BigBang 날짜를 잡을 것인가?
  • 작업중인 feature 들은 어떻게 할지? (머지 리퀘스트 할때 conflict 날텐데 ㅠㅠ)
  • 하는 김에 줄끝의 공백문자도 같이 지워주면 좋다.
  • 하는 김에 줄바꿈 문자도 통일하면 좋다.
  • 공백문자만 변경된 머지 리퀘스트는 공백문자만 바뀌었는지를 어떻게 보장할지?
  • development에서 작업하고나서, 다음 master 머지전까지 master에서 변경되는 hotfix는 develoment로 어떻게 (자동으로) 머지할지?

통일작업 완료되면 할일은?

  • 개발표준 문서/위키 변경 및 공지
  • 모든 개발자의 에디터의 Save Action 설정 통일
  • 커밋 훅 추가해서 안지켜진 소스는 reject
  • 머지 리퀘스트에서는 머 해줄거 없을까....
  • 작업 일지 남기기