كيف يمكن للمرء استخراج موحد-فرق أسلوب التصحيح فرعية؟
سؤال
وفي كل مرة كنت تريد أن تأخذ مجموعة فرعية من التصحيح، وأنا أجبر على كتابة السيناريو لاستخراج فقط بالمؤشرات التي أريد.
ومنها مثلا. لدي التصحيح الذي ينطبق على الدلائل الفرعية "ياي" و "فو".
هل هناك وسيلة لخلق رقعة جديدة أو تطبيق مجموعة فرعية فقط من التصحيح؟ أي خلق رقعة جديدة من التصحيح الحالية التي تأخذ فقط كل المؤشرات التي هي تحت الدليل الفرعي "ياي". أو جميع المؤشرات التي ليست تحت الدليل الفرعي 'فو'
إذا لدي التصحيح مثل (عذر أدناه الزائفة التصحيح):
Index : foo/bar
yada
yada
- asdf
+ jkl
yada
yada
Index : foo/bah
blah
blah
- 28
+ 29
blah
blah
blah
Index : yay/team
go
huskies
- happy happy
+ joy joy
cougars
suck
وكيف يمكنني استخراج أو لا تنطبق إلا دليل فرعي "ياي" مثل:
Index : yay/team
go
huskies
- happy happy
+ joy joy
cougars
suck
وأنا أعرف ما إذا كنت النصي تصل إلى حل سأكون إعادة اختراع العجلة ...
المحلول
ونلقي نظرة على الأداة المساعدة filterdiff
، الذي هو جزء من patchutils .
وعلى سبيل المثال، إذا كان لديك التصحيح التالي:
$ cat example.patch
diff -Naur orig/a/bar new/a/bar
--- orig/a/bar 2009-12-02 12:41:38.353745751 -0800
+++ new/a/bar 2009-12-02 12:42:17.845745951 -0800
@@ -1,3 +1,3 @@
4
-5
+e
6
diff -Naur orig/a/foo new/a/foo
--- orig/a/foo 2009-12-02 12:41:32.845745768 -0800
+++ new/a/foo 2009-12-02 12:42:25.697995617 -0800
@@ -1,3 +1,3 @@
1
2
-3
+c
diff -Naur orig/b/baz new/b/baz
--- orig/b/baz 2009-12-02 12:41:42.993745756 -0800
+++ new/b/baz 2009-12-02 12:42:37.585745735 -0800
@@ -1,3 +1,3 @@
-7
+z
8
9
وبعد ذلك يمكنك تشغيل الأمر التالي لاستخراج التصحيح عن الأشياء الوحيدة في الدليل a
مثل هذا:
$ cat example.patch | filterdiff -i 'new/a/*'
--- orig/a/bar 2009-12-02 12:41:38.353745751 -0800
+++ new/a/bar 2009-12-02 12:42:17.845745951 -0800
@@ -1,3 +1,3 @@
4
-5
+e
6
--- orig/a/foo 2009-12-02 12:41:32.845745768 -0800
+++ new/a/foo 2009-12-02 12:42:25.697995617 -0800
@@ -1,3 +1,3 @@
1
2
-3
+c
نصائح أخرى
إليك يا سريعة وقذرة الحل بيرل.
perl -ne '@a = split /^Index :/m, join "", <>; END { for(@a) {print "Index :", $_ if (m, yay/team,)}}' < foo.patch
في استجابة لطلب sigjuice في التعليقات، وأنا نشر بلدي حل النصي. انها ليست 100٪ اقية من الرصاص، وأنا على الأرجح سوف تستخدم filterdiff
بدلا من ذلك.
base_usage_str=r'''
python %prog index_regex patch_file
description:
Extracts all indices from a patch-file matching 'index_regex'
e.g.
python %prog '^evc_lib' p.patch > evc_lib_p.patch
Will extract all indices which begin with evc_lib.
-or-
python %prog '^(?!evc_lib)' p.patch > not_evc_lib_p.patch
Will extract all indices which do *not* begin with evc_lib.
authors:
Ross Rogers, 2009.04.02
'''
import re,os,sys
from optparse import OptionParser
def main():
parser = OptionParser(usage=base_usage_str)
(options, args) = parser.parse_args(args=sys.argv[1:])
if len(args) != 2:
parser.print_help()
if len(args) == 0:
sys.exit(0)
else:
sys.exit(1)
(index_regex,patch_file) = args
sys.stderr.write('Extracting patches for indices found by regex:%s\n'%index_regex)
#print 'user_regex',index_regex
user_index_match_regex = re.compile(index_regex)
# Index: verification/ring_td_cte/tests/mmio_wr_td_target.e
# --- sw/cfg/foo.xml 2009-04-30 17:59:11 -07:00
# +++ sw/cfg/foo.xml 2009-05-11 09:26:58 -07:00
index_cre = re.compile(r'''(?:(?<=^)|(?<=\n))(--- (?:.*\n){2,}?(?![ @\+\-]))''')
patch_file = open(patch_file,'r')
all_patch_sets = index_cre.findall(patch_file.read())
patch_file.close()
for file_edit in all_patch_sets:
# extract index subset
index_path = re.compile('\+\+\+ (?P<index>[\w_\-/\.]+)').search(file_edit).group('index').strip()
if user_index_match_regex.search(index_path):
sys.stderr.write("Index regex matched index: "+index_path+"\n")
print file_edit,
if __name__ == '__main__':
main()