यदि एक पैच को उलटने से सफलता मिलती है, तो इसका मतलब यह है कि पैच को पूरी तरह से लागू किया गया था?


9

इसे दो प्रश्नों में स्पर्श किया गया है, ' जांचें कि क्या किसी फाइल या फोल्डर को पहले ही पैच किया जा चुका है ' और ' पहले से ही लागू पैच को स्किप करते समय ' 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

क्या स्रोत कोड आपके नियंत्रण में है, अर्थात क्या आप गारंटी दे सकते हैं कि सभी पैच हमेशा एक बार ही लागू होंगे?
रोज़ा

1
@roamia अच्छी तरह से पैच और स्क्रिप्ट मेरे नियंत्रण में हैं। केवल मेरी स्क्रिप्ट पैच लागू होगी।
Jay

मुझे लगता है कि एक शुरुआती बिंदु और एक पैच को रोकना संभव है जो आगे और पीछे दोनों दिशाओं में पूरी तरह से सफल होगा।
जैसन

जवाबों:


3

इस अंतर के साथ:

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

तो आपके प्रश्न का उत्तर नहीं है।


उसे इंगित करने के लिए धन्यवाद। मैंने पाया है कि मैं उस मामले के लिए ठीक कर सकता हूं --posixक्योंकि यह एक त्रुटि सेट करेगा जब पैच करने के लिए कोई फ़ाइल नहीं है। हालाँकि POSIX मोड का उपयोग करने पर कोई त्रुटि नहीं होगी यदि डिलीट की जाने वाली फ़ाइल में पैच से भिन्न सामग्री है। उदाहरण के लिए अगर मैं उस रिवर्स कमांड को चलाता हूं --posixऔर बार फाइल में कुछ डेटा है तो POSIX मोड में फाइल डिलीट नहीं होगी और कोई त्रुटि नहीं होती है। इसलिए मेरा फिक्स इसे पॉज़िक्स मोड के साथ और बिना चलाया जाता है और अगर दोनों ठीक हैं तो मुझे लगता है कि पैच सफलतापूर्वक लागू किया गया था। मैं इसे प्रतिबिंबित करने के लिए अपने प्रश्न को अपडेट करूंगा।
जे

ऐसा लगता --posixहै कि इलाज नहीं हो सकता है-मुझे लगा कि यह सब है। यदि कोई फ़ाइल पैच से हटा दी जाती है और मैं चला जाता हूं --posix --reverseतो यह त्रुटी करता है कि फ़ाइल मौजूद नहीं है। मुझे कल इस पर गौर करना होगा।
जय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.