clang-format에서 서식 변경이 필요한지 알려줄 수 있습니까?
clang-format
파일이 지정된 형식을 충족하는지보고하는 모드에서 실행할 수있는 방법이 있습니까? 변경이 필요한지보고하지만 변경하지는 않는 일종의 드라 이런 모드입니다. 이상적으로는 파일에 변경이 필요한 경우 clang-format이 0이 아닌 종료 코드를 반환하기를 원합니다. 또는 더 이상적으로는 0이 아닌 종료 코드와 표준 출력에서 변경이 필요한 파일 목록입니다.
나는 더 많은 사람들이 대답 할 수 있도록 질문을 일반화하려고 노력하고 있지만 내가하려는 것은 예상되는 .clang-format과 일치하지 않는 커밋을 거부하는 git pre-commit 후크를 작성하는 것입니다. 색인의 파일 목록에서 clang-format을 실행하는 것은 쉽습니다. 그러나 clang-format이 실제로 어떤 것을 변경했는지 알기는 어렵습니다.
나는 -output-replacements-xml
(답으로 게시 할) 기반으로 한 잠재적 솔루션이 있지만 해킹이며 이것이 더 간단해야한다고 생각합니다. 의견 / 제안, 편집, 다른 답변 / 접근은 모두 환영합니다.
run-clang-format 은 clang-format
후크 또는 지속적인 통합 스크립트로 사용되도록 정확하게 설계된 간단한 래퍼입니다 . diff를 출력하고 합리적인 상태로 종료됩니다.
홈 페이지에 제공된 예는 그 자체로 말합니다.
내가 이것이 더 쉬워야한다고 생각하는 이유 중 하나는 -output-replacements-xml이 본질적으로 내가 원하는 답을 제공하기 때문이며 소비하기 쉬운 방식으로 나에게 제공하지 않기 때문입니다. 그러나 대체가 필요하지 않은 경우 출력은 매우 예측 가능하므로 출력을 구문 분석하는 것은 그리 어렵지 않습니다.
내가 지금 가지고있는 것은
clang-format -style=file -output-replacements-xml | grep -c "<replacement " >/dev/null
이것은 실제로 내가 원하는 종료 코드의 역을 반환합니다. grep은 무언가 일치하면 0을 반환하고 아무것도 일치하지 않으면 1을 반환합니다. 그러나 그것은 처리하기에 충분히 쉽습니다.
따라서 내 자식 사전 커밋 후크의 관련 비트는
git diff --cached --name-only --diff-filter=ACMRT |
grep "\.[cmh]$" |
xargs -n1 clang-format -style=file -output-replacements-xml |
grep "<replacement " >/dev/null
if [ $? -ne 1 ]; then
echo "Commit did not match clang-format"
exit 1
fi
- 색인에있는 파일의 전체 파일 이름을 가져옵니다 (삭제중인 파일 및 파일을 처리하지 않을 수있는 기타 비정상적인 경우 제외).
- 형식을 확인하려는 항목의 파일 이름 만 유지하십시오 (제 경우에는 c, m 및 h 파일).
- xargs를 통해 결과를 실행하여 본질적으로 다음 명령을 "각각"
- 모든 파일에서 -output-replacements-xml 옵션을 사용하여 clang-format 실행
- clang-format이 만들고자하는 대체를 찾았 음을 나타내는 대체 (대체와 반대)를 검색합니다. (모든 출력을 XML로 버리는 것은 사용자에게 의미가 없습니다.)
- 마지막 명령은 1을 종료합니다 (grep은 아무것도 찾지 못했다고 말합니다). 우리가 완료되었고 모든 것이 정상입니다.
- 그렇지 않은 경우 메시지를 표시하고 1을 종료하면 커밋이 취소됩니다. 안타깝게도 사용자에게 어떤 파일이 문제인지 쉽게 알 수는 없지만 사용자가 직접 clang-format을 실행하여 확인할 수 있습니다.
귀하의 사용 사례가 무엇인지 확실하지 않지만 git-clang-format ( https://llvm.org/svn/llvm-project/cfe/trunk/tools/clang-format/git-clang-format )을 확인하십시오. . 기본적으로 git에 대한 clang 형식 통합을 제공하며 아마도 그것이 당신이 찾고있는 것일 수도 있습니다.
이 게시물의 phs에서 주석을 약간 조정하여 다음과 같이 생각했습니다.
find embedded/ -regex '.*\.\(ino\|cpp\|hpp\|cc\|cxx\|h\)' -exec cat {} \; | diff -u <(find embedded/ -regex '.*\.\(ino\|cpp\|hpp\|cc\|cxx\|h\)' -exec clang-format-3.9 -style=file {} \;) -
그건..
cat
모든 cpp-ish 파일과 파이프diff
( 끝에 지정하기 때문에diff
수락 합니다)stdin
-
- 동일한 파일
<( .. )
에서 실행 하려면 프로세스 대체 ( 구문)를 사용clang-format
하십시오. 여기에서 내부 서식을 사용하지 마십시오. 이것은 전송되는 나머지 절반입니다diff
diff
출력없이 종료 하면 성공! 다음을 통해 종료 코드를 확인할 수도$?
있습니다. 0이어야합니다.
내 CI 서비스 (travis)가 bash 스크립트 에서이 줄을 실행하여 올바르게 형식화되었는지 확인합니다. 실제로 포맷터를 제자리에서 실행하기위한 다른 스크립트가 있습니다. 이것은 나에게 경고를 상기시킨다 : 당신은 sub process를 할 수있는 쉘을 사용해야한다 ( posix 쉘은 그렇지 않다 ).
내가 사용 git-clang-format
하고 마이크 로즈 '블로그에서 스크립트를 미리 커밋 :
#!/bin/python
import subprocess
output = subprocess.check_output(["git", "clang-format", "--diff"])
if output not in ['no modified files to format\n', 'clang-format did not modify any files\n']:
print "Run git clang-format, then commit.\n"
exit(1)
else:
exit(0)
The script has a small error in that it doesn't work when there are no commits (trying to check against HEAD which doesn't exist yet). To bypass this, use the -n
or --no-verify
option.
Using -n
to skip the pre-commit script can also be helpful when you what to bypass the check because it can take a long time for a large codebase.
The original post is here: http://www.dx13.co.uk/articles/2015/4/3/Setting-up-git-clang-format.html
After I got inspired by David Ogren's post I made a pre-commit
hook that is able to work on the staged changes. This will ensure that the pre-commit
hook will work on the code that will actual make up the content of the commit and can't be fooled by a clang-format
run that didn't get staged.
#!/bin/bash
files=()
for file in `git diff --cached --name-only --diff-filter=ACMRT | grep -E "\.(cpp|hpp)$"`; do
if ! cmp -s <(git show :${file}) <(git show :${file}|clang-format); then
files+=("${file}")
fi
done
if [ -n "${files}" ]; then
echo Format error within the following files:
printf "%s\n" "${files[@]}"
exit 1
fi
'Programing' 카테고리의 다른 글
Android NDK의 파일 작업 (0) | 2020.11.23 |
---|---|
단일 값으로 배열 초기화 (0) | 2020.11.23 |
Amazon EC2 키 쌍 복구 (0) | 2020.11.22 |
Linux PID 재활용 (0) | 2020.11.22 |
Web API 1을 사용하는지 Web API 2를 사용하는지 어떻게 확인합니까? (0) | 2020.11.22 |