패치 되돌리기에 성공하면 항상 패치가 완전히 적용되었음을 의미합니까?

패치 되돌리기에 성공하면 항상 패치가 완전히 적용되었음을 의미합니까?

이는 두 가지 질문으로 다뤄집니다.'파일이나 폴더가 패치되었는지 확인' 그리고'patch적용된 패치를 건너뛰면 0을 반환합니다.'그러나 둘 다 만족스러운 대답을 얻지 못했습니다.

스크립트를 작성 중이며 다음 패치를 테스트하고 싶습니다.

전체 적용: 계속

일부 앱: 종료

적용되지 않음: 성공적으로 적용할 수 있으면 계속하고, 그렇지 않으면 종료합니다.

문제는 부분적인 적용 상황을 처리하는 것입니다.

mkdir test && cd test

cat << EOF > foobar.patch
--- /dev/null
+++ foo
@@ -0,0 +1 @@
+foo
--- /dev/null
+++ bar
@@ -0,0 +1 @@
+bar
EOF

patch --forward -i foobar.patch
rm foo

따라서 bar는 존재하지만 foo는 존재하지 않습니다. 어느 시점에서 삭제되었기 때문입니다. 이제 테스트 실행으로 패치를 적용하면 성공적으로 적용되지 않았기 때문에 종료 코드가 1이 됩니다.

$ patch --dry-run --forward --force -i foobar.patch
checking file foo
The next patch would create the file bar,
which already exists!  Skipping patch.
1 out of 1 hunk ignored
$ echo $?
1

하지만 패치가 완전히 적용되었는지는 알 수 없으며 단지 테스트 실행에서 실패했다는 것뿐입니다. 이것이 올바른 stackoverflow 답변으로 표시되는 이유를 모르겠습니다. 되돌리려고 했지만 비대화형 스크립트이므로 다음을 통해서만 강제할 수 있습니다.

$ patch --dry-run --reverse --force -i foobar.patch
The next patch, when reversed, would delete the file foo,
which does not exist!  Applying it anyway.
checking file foo
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED
checking file bar
$ echo $?
1

그렇다면 테스트 실행에서 패치를 강제로 되돌리려고 시도하고 성공하면 패치가 완전히 적용되고, 실패하면 패치가 완전히 적용되지 않는(또는 전혀 적용되지 않는) 것으로 항상 가정됩니까? 그렇다면 나는 다음과 같은 일을 할 수 있기 때문입니다.

patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
 patch --forward --force -i foobar.patch) ||
exit 1

답변1

이 차이점은 다음과 같습니다.

diff --git a/bar b/bar
new file mode 100644
index 0000000..e69de29
diff --git a/foo b/foo
new file mode 100644
index 0000000..257cc56
--- /dev/null
+++ b/foo
@@ -0,0 +1 @@
+foo

때로는 다음과 같이 진행됩니다.

$ cd /tmp/test
$ patch --forward -i foobar.patch
patching file bar
patching file foo
$ echo $?
0
$ rm bar
$ patch --dry-run --reverse --force -i foobar.patch
The next patch, when reversed, would delete the file bar,
which does not exist!  Applying it anyway.
checking file bar
checking file foo
$ echo $?
0

따라서 귀하의 질문에 대한 대답은 '아니요'입니다.

관련 정보