From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7A4D3A0C3F for ; Thu, 15 Apr 2021 23:15:05 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5D756162479; Thu, 15 Apr 2021 23:15:05 +0200 (CEST) Received: from mail-oi1-f182.google.com (mail-oi1-f182.google.com [209.85.167.182]) by mails.dpdk.org (Postfix) with ESMTP id 04BF816245C for ; Thu, 15 Apr 2021 23:15:04 +0200 (CEST) Received: by mail-oi1-f182.google.com with SMTP id x77so16332226oix.8 for ; Thu, 15 Apr 2021 14:15:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=atUNWZzJOmD8buUXTdCxAJIeTuqwKxS0lR0x33lLs8I=; b=Nrwv1FnEhv/5yJ0P/1j0wRGJgaMcG6Riy4PY2KSGU5VHs+PD93MgDzOlEMagEPzXb8 rcjW+C5KI4FhaY1xEgoHa/VDKE4scpO1DIWmjSfHIyWPkX3/5+nu3sUlfMQCTonrrjMy tjnMMWGNe6pF1WwFH+g1TWqNnhI+71X0iAGpI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=atUNWZzJOmD8buUXTdCxAJIeTuqwKxS0lR0x33lLs8I=; b=ra/F5WYvHoBza8rs2mxp7bc/0wj7lSnPY1unId37YVCyNV/py7KVHSr3zBbCiK+/W+ jhmWBHPV9Cf6cgw8eD8bziFs9zJpMLmmDyFFXKlDprOFz5Ec3N6b9HhGdSEpj2CAPFBh /9phtQyQ26PsqjVn0gvUc1F6Ebww0Dgqw2kNZXq657BNk1li/sMhi5FWvW0erbg50PJW tykyKic1duNLMethAJe+dXoEu/qpnEiS493kUUzoTyqqIrRu9cSeNJauHMG4avuq7H9b jm3x1JY4ElIoZluljyLGdZkViU3Lu3S7BnKT8exNdXQUmoabpjaKjz63jFZOZfeDhxsc EMSg== X-Gm-Message-State: AOAM533Q1+JcDlyEEfKjKX0/2g3B2B+Qj0NpKBvJGekQb9SBrnIpdnJI TKmOsNj8DVHPGHZBgU98mQmqW/o85uuwXvn4l90leg== X-Google-Smtp-Source: ABdhPJwnZh8Cu8ozPJkZayZGgcaT2JUBQZp/HhjWUZ9aJwgOwrTqg563/e+qT8lotdLFYRHVDwI5n40ca1KnL3lR/28= X-Received: by 2002:a05:6808:ab6:: with SMTP id r22mr2613653oij.69.1618521303229; Thu, 15 Apr 2021 14:15:03 -0700 (PDT) MIME-Version: 1.0 References: <20210114175925.570013-1-ohilyard@iol.unh.edu> In-Reply-To: From: Owen Hilyard Date: Thu, 15 Apr 2021 17:14:20 -0400 Message-ID: To: Aaron Conole Cc: ci@dpdk.org, Thomas Monjalon Content-Type: multipart/alternative; boundary="00000000000057388f05c0095be7" Subject: Re: [dpdk-ci] [PATCH V2] patch-tagging: Added tool to convert tags into dts execution file X-BeenThere: ci@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK CI discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ci-bounces@dpdk.org Sender: "ci" --00000000000057388f05c0095be7 Content-Type: text/plain; charset="UTF-8" It seems like the v2 never got properly sent. It's in my outbox but the mailing list archive doesn't have a record of it. I've sent in another patch with a couple of stability changes and minor feature tweaks that were made. That should complete the list of features in the original commit. Sorry about that On Thu, Apr 15, 2021 at 4:42 PM Aaron Conole wrote: > Owen Hilyard writes: > > > Please ignore this patch. I messed up directories and this patch was not > created from the correct file. > > Is there an update for this that I missed? > > > On Thu, Jan 14, 2021 at 12:59 PM wrote: > > > > Fixed parsing bugs with the tag parsing script > > Parsing the patch file directly proved to be too unreliabler, > so the approach to patch parsing was changed so that > > it relies instead on using a directory with those patches already > applied in them and then use a git diff command to get > > the changed files. This avoids needing to parse the patch files > directly and should be more reliable. > > > > Added a tool to create an execution file from tags using another > execution file as a template > > This tool is intended to allow a list of patch tags to be used > in combination with an execution file containing > > information on crbs to only change which test suites are run. This tool > enables using the mappings in the > > tests_for_tag.cfg file to run only necessary tests. At present, the > mappings represent how tests are currently run at the > > UNH-IOL Community Lab, with the same tests being run for every patch, > with the requested change from bug 511 > > where documentation changes do not cause any testing. > > > > Signed-off-by: Owen Hilyard > > --- > > config/tests_for_tag.cfg | 19 ++++++++++++-- > > tools/patch_parser.py | 54 ++++++++++++++++++++++++---------------- > > 2 files changed, 49 insertions(+), 24 deletions(-) > > > > diff --git a/config/tests_for_tag.cfg b/config/tests_for_tag.cfg > > index 77f797f..7d95c4a 100644 > > --- a/config/tests_for_tag.cfg > > +++ b/config/tests_for_tag.cfg > > @@ -5,11 +5,26 @@ core = dynamic_config, > > mtu_update, > > scatter, > > stats_checks, > > + unit_tests_mbuf > > +driver = dynamic_config, > > + link_status_interrupt, > > + mac_filter, > > + mtu_update, > > + scatter, > > + stats_checks, > > + unit_tests_mbuf > > +application = dynamic_config, > > + link_status_interrupt, > > + mac_filter, > > + mtu_update, > > + scatter, > > stats_checks, > > unit_tests_mbuf > > - > > ; Nothing in documentation > > documentation = > > > > [performance] > > -core = nic_single_core_perf, > > +core = nic_single_core_perf > > +driver = nic_single_core_perf > > +application = nic_single_core_perf > > +documentation = > > diff --git a/tools/patch_parser.py b/tools/patch_parser.py > > index 80b8194..73df91f 100755 > > --- a/tools/patch_parser.py > > +++ b/tools/patch_parser.py > > @@ -31,30 +31,39 @@ > > # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > > # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > > # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > - > > +import subprocess > > > > import itertools > > from configparser import ConfigParser > > from typing import List, Dict, Set > > import argparse > > +import re > > > > def get_patch_files(patch_file: str) -> List[str]: > > + file_match_pattern = re.compile(r"[\w\-\/.]+ +\| +\d+ [+\-]+") > > with open(patch_file, 'r') as f: > > - lines = list(itertools.takewhile( > > - lambda line: line.strip().endswith('+') or > line.strip().endswith('-'), > > - itertools.dropwhile( > > - lambda line: not line.strip().startswith("---"), > > - f.readlines() > > + file_lines = f.readlines() > > + lines = list(filter( > > + lambda line: file_match_pattern.match(line.strip()), > > + itertools.takewhile( > > + lambda line: not line.startswith('---'), > > + list( > > + itertools.dropwhile( > > + lambda line: not > line.strip().startswith("---"), > > + file_lines > > + ) > > + )[1:] > > ) > > )) > > filenames = map(lambda line: line.strip().split(' ')[0], lines) > > - # takewhile includes the --- which starts the filenames > > - return list(filenames)[1:] > > + return list(filenames) > > > > def get_all_files_from_patches(patch_files: List[str]) -> Set[str]: > > - return set(itertools.chain.from_iterable(map(get_patch_files, > patch_files))) > > + num_patch_files: int = len(patch_files) > > + files = subprocess.check_output(f"cd dpdk && git diff --name-only > HEAD~{num_patch_files}", shell=True).decode > > ('utf-8').splitlines() > > + return set(files) > > > > def parse_comma_delimited_list_from_string(mod_str: str) -> List[str]: > > @@ -80,21 +89,22 @@ def get_tags_for_patches(patch_files: Set[str], > dir_attrs: Dict[str, Set[str]]) > > )) > > > > -parser = argparse.ArgumentParser( > > - description='Takes a patch file and a config file and creates a > list of tags for that patch') > > -parser.add_argument('config_file_path', help='The path to > patch_parser.cfg', default='config/patch_parser.cfg') > > -parser.add_argument('patch_file_paths', help='A list of patch files', > type=str, metavar='patch file', nargs='+') > > +if __name__ == '__main__': > > + parser = argparse.ArgumentParser( > > + description='Takes a patch file and a config file and creates > a list of tags for that patch') > > + parser.add_argument('config_file_path', help='The path to > patch_parser.cfg', default='config/patch_parser.cfg') > > + parser.add_argument('patch_file_paths', help='A list of patch > files', type=str, metavar='patch file', nargs='+') > > > > -args = parser.parse_args() > > + args = parser.parse_args() > > > > -conf_obj = ConfigParser() > > -conf_obj.read(args.config_file_path) > > + conf_obj = ConfigParser() > > + conf_obj.read(args.config_file_path) > > > > -patch_files = get_all_files_from_patches(args.patch_file_paths) > > -dir_attrs = get_dictionary_attributes_from_config_file(conf_obj) > > -priority_list = > parse_comma_delimited_list_from_string(conf_obj['Priority']['priority_list']) > > + patch_files = get_all_files_from_patches(args.patch_file_paths) > > + dir_attrs = get_dictionary_attributes_from_config_file(conf_obj) > > + priority_list = > parse_comma_delimited_list_from_string(conf_obj['Priority']['priority_list']) > > > > -unordered_tags: Set[str] = get_tags_for_patches(patch_files, dir_attrs) > > -ordered_tags: List[str] = [tag for tag in priority_list if tag in > unordered_tags] > > + unordered_tags: Set[str] = get_tags_for_patches(patch_files, > dir_attrs) > > + ordered_tags: List[str] = [tag for tag in priority_list if tag in > unordered_tags] > > > > -print("\n".join(ordered_tags)) > > + print("\n".join(ordered_tags)) > > -- > > 2.27.0 > > --00000000000057388f05c0095be7 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
It seems like the v2 never got properly sent. It's in = my outbox but the mailing list archive doesn't have a record of it. I&#= 39;ve sent in another patch with a couple of stability changes and minor fe= ature tweaks that were made. That should complete the list of features in t= he original commit.=C2=A0

Sorry about that
On Thu, = Apr 15, 2021 at 4:42 PM Aaron Conole <aconole@redhat.com> wrote:
Owen Hilyard <ohilyard@iol.unh.edu> writes:

> Please ignore this patch. I messed up directories and this patch was n= ot created from the correct file.

Is there an update for this that I missed?

> On Thu, Jan 14, 2021 at 12:59 PM <ohilyard@iol.unh.edu> wrote:
>
>=C2=A0 Fixed parsing bugs with the tag parsing script
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Parsing the patch file directly prov= ed to be too unreliabler, so the approach to patch parsing was changed so t= hat
>=C2=A0 it relies instead on using a directory with those patches alread= y applied in them and then use a git diff command to get
>=C2=A0 the changed files. This avoids needing to parse the patch files = directly and should be more reliable.
>
>=C2=A0 Added a tool to create an execution file from tags using another= execution file as a template
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 This tool is intended to allow a lis= t of patch tags to be used in combination with an execution file containing=
>=C2=A0 information on crbs to only change which test suites are run. Th= is tool enables using the mappings in the
>=C2=A0 tests_for_tag.cfg file to run only necessary tests. At present, = the mappings represent how tests are currently run at the
>=C2=A0 UNH-IOL Community Lab, with the same tests being run for every p= atch, with the requested change from bug 511
>=C2=A0 where documentation changes do not cause any testing.
>
>=C2=A0 Signed-off-by: Owen Hilyard <ohilyard@iol.unh.edu>
>=C2=A0 ---
>=C2=A0 =C2=A0config/tests_for_tag.cfg | 19 ++++++++++++--
>=C2=A0 =C2=A0tools/patch_parser.py=C2=A0 =C2=A0 | 54 ++++++++++++++++++= ++++++----------------
>=C2=A0 =C2=A02 files changed, 49 insertions(+), 24 deletions(-)
>
>=C2=A0 diff --git a/config/tests_for_tag.cfg b/config/tests_for_tag.cfg=
>=C2=A0 index 77f797f..7d95c4a 100644
>=C2=A0 --- a/config/tests_for_tag.cfg
>=C2=A0 +++ b/config/tests_for_tag.cfg
>=C2=A0 @@ -5,11 +5,26 @@ core =3D dynamic_config,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 mtu_update,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 scatter,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 stats_checks,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0unit_tests_mbuf
>=C2=A0 +driver =3D dynamic_config,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0link_status_interrupt,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0mac_filter,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0mtu_update,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0scatter,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0stats_checks,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0unit_tests_mbuf
>=C2=A0 +application =3D dynamic_config,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0link_status_interrupt,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0mac_filter,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0mtu_update,
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0scatter,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 stats_checks,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 unit_tests_mbuf
>=C2=A0 -
>=C2=A0 =C2=A0; Nothing in documentation
>=C2=A0 =C2=A0documentation =3D
>
>=C2=A0 =C2=A0[performance]
>=C2=A0 -core =3D nic_single_core_perf,
>=C2=A0 +core =3D nic_single_core_perf
>=C2=A0 +driver =3D nic_single_core_perf
>=C2=A0 +application =3D nic_single_core_perf
>=C2=A0 +documentation =3D
>=C2=A0 diff --git a/tools/patch_parser.py b/tools/patch_parser.py
>=C2=A0 index 80b8194..73df91f 100755
>=C2=A0 --- a/tools/patch_parser.py
>=C2=A0 +++ b/tools/patch_parser.py
>=C2=A0 @@ -31,30 +31,39 @@
>=C2=A0 =C2=A0# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILI= TY, OR TORT
>=C2=A0 =C2=A0# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY O= UT OF THE USE
>=C2=A0 =C2=A0# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF = SUCH DAMAGE.
>=C2=A0 -
>=C2=A0 +import subprocess
>
>=C2=A0 =C2=A0import itertools
>=C2=A0 =C2=A0from configparser import ConfigParser
>=C2=A0 =C2=A0from typing import List, Dict, Set
>=C2=A0 =C2=A0import argparse
>=C2=A0 +import re
>
>=C2=A0 =C2=A0def get_patch_files(patch_file: str) -> List[str]:
>=C2=A0 +=C2=A0 =C2=A0 file_match_pattern =3D re.compile(r"[\w\-\/.= ]+ +\| +\d+ [+\-]+")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0with open(patch_file, 'r') as f:
>=C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 lines =3D list(itertools.takewhile(=
>=C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 lambda line: line.str= ip().endswith('+') or line.strip().endswith('-'),
>=C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 itertools.dropwhile(<= br> >=C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 lambda = line: not line.strip().startswith("---"),
>=C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 f.readl= ines()
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 file_lines =3D f.readlines()
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 lines =3D list(filter(
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 lambda line: file_mat= ch_pattern.match(line.strip()),
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 itertools.takewhile(<= br> >=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 lambda = line: not line.startswith('---'),
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 list( >=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 itertools.dropwhile(
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 lambda line: not line.strip().startswith("---&quo= t;),
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 file_lines
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 )
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 )[1:] >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0filenames =3D map(lambda line:= line.strip().split(' ')[0], lines)
>=C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 # takewhile includes the --- which = starts the filenames
>=C2=A0 -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return list(filenames)[1:]
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return list(filenames)
>
>=C2=A0 =C2=A0def get_all_files_from_patches(patch_files: List[str]) -&g= t; Set[str]:
>=C2=A0 -=C2=A0 =C2=A0 return set(itertools.chain.from_iterable(map(get_= patch_files, patch_files)))
>=C2=A0 +=C2=A0 =C2=A0 num_patch_files: int =3D len(patch_files)
>=C2=A0 +=C2=A0 =C2=A0 files =3D subprocess.check_output(f"cd dpdk = && git diff --name-only HEAD~{num_patch_files}", shell=3DTrue)= .decode
>=C2=A0 ('utf-8').splitlines()
>=C2=A0 +=C2=A0 =C2=A0 return set(files)
>
>=C2=A0 =C2=A0def parse_comma_delimited_list_from_string(mod_str: str) -= > List[str]:
>=C2=A0 @@ -80,21 +89,22 @@ def get_tags_for_patches(patch_files: Set[st= r], dir_attrs: Dict[str, Set[str]])
>=C2=A0 =C2=A0 =C2=A0 =C2=A0))
>
>=C2=A0 -parser =3D argparse.ArgumentParser(
>=C2=A0 -=C2=A0 =C2=A0 description=3D'Takes a patch file and a confi= g file and creates a list of tags for that patch')
>=C2=A0 -parser.add_argument('config_file_path', help=3D'The= path to patch_parser.cfg', default=3D'config/patch_parser.cfg'= )
>=C2=A0 -parser.add_argument('patch_file_paths', help=3D'A l= ist of patch files', type=3Dstr, metavar=3D'patch file', nargs= =3D'+')
>=C2=A0 +if __name__ =3D=3D '__main__':
>=C2=A0 +=C2=A0 =C2=A0 parser =3D argparse.ArgumentParser(
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 description=3D'Takes a patch fi= le and a config file and creates a list of tags for that patch')
>=C2=A0 +=C2=A0 =C2=A0 parser.add_argument('config_file_path', h= elp=3D'The path to patch_parser.cfg', default=3D'config/patch_p= arser.cfg')
>=C2=A0 +=C2=A0 =C2=A0 parser.add_argument('patch_file_paths', h= elp=3D'A list of patch files', type=3Dstr, metavar=3D'patch fil= e', nargs=3D'+')
>
>=C2=A0 -args =3D parser.parse_args()
>=C2=A0 +=C2=A0 =C2=A0 args =3D parser.parse_args()
>
>=C2=A0 -conf_obj =3D ConfigParser()
>=C2=A0 -conf_obj.read(args.config_file_path)
>=C2=A0 +=C2=A0 =C2=A0 conf_obj =3D ConfigParser()
>=C2=A0 +=C2=A0 =C2=A0 conf_obj.read(args.config_file_path)
>
>=C2=A0 -patch_files =3D get_all_files_from_patches(args.patch_file_path= s)
>=C2=A0 -dir_attrs =3D get_dictionary_attributes_from_config_file(conf_o= bj)
>=C2=A0 -priority_list =3D parse_comma_delimited_list_from_string(conf_o= bj['Priority']['priority_list'])
>=C2=A0 +=C2=A0 =C2=A0 patch_files =3D get_all_files_from_patches(args.p= atch_file_paths)
>=C2=A0 +=C2=A0 =C2=A0 dir_attrs =3D get_dictionary_attributes_from_conf= ig_file(conf_obj)
>=C2=A0 +=C2=A0 =C2=A0 priority_list =3D parse_comma_delimited_list_from= _string(conf_obj['Priority']['priority_list'])
>
>=C2=A0 -unordered_tags: Set[str] =3D get_tags_for_patches(patch_files, = dir_attrs)
>=C2=A0 -ordered_tags: List[str] =3D [tag for tag in priority_list if ta= g in unordered_tags]
>=C2=A0 +=C2=A0 =C2=A0 unordered_tags: Set[str] =3D get_tags_for_patches= (patch_files, dir_attrs)
>=C2=A0 +=C2=A0 =C2=A0 ordered_tags: List[str] =3D [tag for tag in prior= ity_list if tag in unordered_tags]
>
>=C2=A0 -print("\n".join(ordered_tags))
>=C2=A0 +=C2=A0 =C2=A0 print("\n".join(ordered_tags))
>=C2=A0 --
>=C2=A0 2.27.0

--00000000000057388f05c0095be7--