كيف يمكن للمرء استخراج موحد-فرق أسلوب التصحيح فرعية؟

StackOverflow https://stackoverflow.com/questions/710845

  •  22-08-2019
  •  | 
  •  

سؤال

وفي كل مرة كنت تريد أن تأخذ مجموعة فرعية من التصحيح، وأنا أجبر على كتابة السيناريو لاستخراج فقط بالمؤشرات التي أريد.

ومنها مثلا. لدي التصحيح الذي ينطبق على الدلائل الفرعية "ياي" و "فو".

هل هناك وسيلة لخلق رقعة جديدة أو تطبيق مجموعة فرعية فقط من التصحيح؟ أي خلق رقعة جديدة من التصحيح الحالية التي تأخذ فقط كل المؤشرات التي هي تحت الدليل الفرعي "ياي". أو جميع المؤشرات التي ليست تحت الدليل الفرعي 'فو'

إذا لدي التصحيح مثل (عذر أدناه الزائفة التصحيح):

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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top