इसे दो प्रश्नों में स्पर्श किया गया है, ' जांचें कि क्या किसी फाइल या फोल्डर को पहले ही पैच किया जा चुका है ' और ' पहले से ही लागू पैच को स्किप करते समय ' 0 कमाएंpatch
'लेकिन न तो इसका संतोषजनक जवाब था।
मैं एक स्क्रिप्ट लिख रहा हूं और पैच के लिए निम्नलिखित परीक्षण करना चाहता हूं:
पूरी तरह से लागू: जारी
आंशिक रूप से लागू किया गया: बाहर निकलें
लागू नहीं: यदि इसे लागू किया जा सकता है तो इसे सफलतापूर्वक करें और जारी रखें, अन्यथा बाहर निकलें
समस्या आंशिक रूप से लागू मामले को संभाल रही है:
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
तो बार मौजूद है, लेकिन फू नहीं है क्योंकि कुछ बिंदु पर इसे हटा दिया गया था। अब अगर मैं पैच को ड्राई-रन में लागू करता हूं तो एग्जिट कोड 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
यह मुझे नहीं बताता कि पैच पूरी तरह से लागू है या नहीं, बस यह सूखा चलाने में विफल रहा। मुझे नहीं पता कि स्टैकओवरफ्लो उत्तर के रूप में यह सही क्यों है। मैंने पलटने की कोशिश की, लेकिन चूंकि यह एक गैर-संवादात्मक स्क्रिप्ट है इसलिए केवल बल के साथ काम किया:
$ 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