<br><br>On Friday, October 11, 2019, Vladimir Sementsov-Ogievskiy &lt;<a href="mailto:vsementsov@virtuozzo.com">vsementsov@virtuozzo.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Add script to automatically commit tree-wide changes per-subsystem.<br>
<br>
Signed-off-by: Vladimir Sementsov-Ogievskiy &lt;<a href="mailto:vsementsov@virtuozzo.com">vsementsov@virtuozzo.com</a>&gt;<br>
---</blockquote><div><br></div><div>Great idea!</div><div><br></div><div>Can you just add a comment somewhere close to the top of the file on script usage? Or &quot;--help&quot; option? If you would like to be the script maintainer, please change the MAINTAINERS too.</div><div><br></div><div>Reviewed-by: Aleksandar Markovic &lt;<a href="mailto:amarkovic@wavecomp.com">amarkovic@wavecomp.com</a>&gt;</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
CC: Gerd Hoffmann &lt;<a href="mailto:kraxel@redhat.com">kraxel@redhat.com</a>&gt;<br>
CC: &quot;Gonglei (Arei)&quot; &lt;<a href="mailto:arei.gonglei@huawei.com">arei.gonglei@huawei.com</a>&gt;<br>
CC: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt;<br>
CC: Igor Mammedov &lt;<a href="mailto:imammedo@redhat.com">imammedo@redhat.com</a>&gt;<br>
CC: Laurent Vivier &lt;<a href="mailto:lvivier@redhat.com">lvivier@redhat.com</a>&gt;<br>
CC: Amit Shah &lt;<a href="mailto:amit@kernel.org">amit@kernel.org</a>&gt;<br>
CC: Kevin Wolf &lt;<a href="mailto:kwolf@redhat.com">kwolf@redhat.com</a>&gt;<br>
CC: Max Reitz &lt;<a href="mailto:mreitz@redhat.com">mreitz@redhat.com</a>&gt;<br>
CC: John Snow &lt;<a href="mailto:jsnow@redhat.com">jsnow@redhat.com</a>&gt;<br>
CC: Ari Sundholm &lt;<a href="mailto:ari@tuxera.com">ari@tuxera.com</a>&gt;<br>
CC: Pavel Dovgalyuk &lt;<a href="mailto:pavel.dovgaluk@ispras.ru">pavel.dovgaluk@ispras.ru</a>&gt;<br>
CC: Paolo Bonzini &lt;<a href="mailto:pbonzini@redhat.com">pbonzini@redhat.com</a>&gt;<br>
CC: Stefan Hajnoczi &lt;<a href="mailto:stefanha@redhat.com">stefanha@redhat.com</a>&gt;<br>
CC: Fam Zheng &lt;<a href="mailto:fam@euphon.net">fam@euphon.net</a>&gt;<br>
CC: Stefan Weil &lt;<a href="mailto:sw@weilnetz.de">sw@weilnetz.de</a>&gt;<br>
CC: Ronnie Sahlberg &lt;<a href="mailto:ronniesahlberg@gmail.com">ronniesahlberg@gmail.com</a>&gt;<br>
CC: Peter Lieven &lt;<a href="mailto:pl@kamp.de">pl@kamp.de</a>&gt;<br>
CC: Eric Blake &lt;<a href="mailto:eblake@redhat.com">eblake@redhat.com</a>&gt;<br>
CC: &quot;Denis V. Lunev&quot; &lt;<a href="mailto:den@openvz.org">den@openvz.org</a>&gt;<br>
CC: Markus Armbruster &lt;<a href="mailto:armbru@redhat.com">armbru@redhat.com</a>&gt;<br>
CC: Alberto Garcia &lt;<a href="mailto:berto@igalia.com">berto@igalia.com</a>&gt;<br>
CC: Jason Dillaman &lt;<a href="mailto:dillaman@redhat.com">dillaman@redhat.com</a>&gt;<br>
CC: Wen Congyang &lt;<a href="mailto:wencongyang2@huawei.com">wencongyang2@huawei.com</a>&gt;<br>
CC: Xie Changlong &lt;<a href="mailto:xiechanglong.d@gmail.com">xiechanglong.d@gmail.com</a>&gt;<br>
CC: Liu Yuan &lt;<a href="mailto:namei.unix@gmail.com">namei.unix@gmail.com</a>&gt;<br>
CC: &quot;Richard W.M. Jones&quot; &lt;<a href="mailto:rjones@redhat.com">rjones@redhat.com</a>&gt;<br>
CC: Jeff Cody &lt;<a href="mailto:codyprime@gmail.com">codyprime@gmail.com</a>&gt;<br>
CC: &quot;Marc-André Lureau&quot; &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;<br>
CC: &quot;Daniel P. Berrangé&quot; &lt;<a href="mailto:berrange@redhat.com">berrange@redhat.com</a>&gt;<br>
CC: Richard Henderson &lt;<a href="mailto:rth@twiddle.net">rth@twiddle.net</a>&gt;<br>
CC: Greg Kurz &lt;<a href="mailto:groug@kaod.org">groug@kaod.org</a>&gt;<br>
CC: &quot;Michael S. Tsirkin&quot; &lt;<a href="mailto:mst@redhat.com">mst@redhat.com</a>&gt;<br>
CC: Marcel Apfelbaum &lt;<a href="mailto:marcel.apfelbaum@gmail.com">marcel.apfelbaum@gmail.com</a>&gt;<br>
CC: Beniamino Galvani &lt;<a href="mailto:b.galvani@gmail.com">b.galvani@gmail.com</a>&gt;<br>
CC: Peter Maydell &lt;<a href="mailto:peter.maydell@linaro.org">peter.maydell@linaro.org</a>&gt;<br>
CC: &quot;Cédric Le Goater&quot; &lt;<a href="mailto:clg@kaod.org">clg@kaod.org</a>&gt;<br>
CC: Andrew Jeffery &lt;<a href="mailto:andrew@aj.id.au">andrew@aj.id.au</a>&gt;<br>
CC: Joel Stanley &lt;<a href="mailto:joel@jms.id.au">joel@jms.id.au</a>&gt;<br>
CC: Andrew Baumann &lt;<a href="mailto:Andrew.Baumann@microsoft.com">Andrew.Baumann@microsoft.com</a>&gt;<br>
CC: &quot;Philippe Mathieu-Daudé&quot; &lt;<a href="mailto:philmd@redhat.com">philmd@redhat.com</a>&gt;<br>
CC: Antony Pavlov &lt;<a href="mailto:antonynpavlov@gmail.com">antonynpavlov@gmail.com</a>&gt;<br>
CC: Jean-Christophe Dubois &lt;<a href="mailto:jcd@tribudubois.net">jcd@tribudubois.net</a>&gt;<br>
CC: Peter Chubb &lt;<a href="mailto:peter.chubb@nicta.com.au">peter.chubb@nicta.com.au</a>&gt;<br>
CC: Subbaraya Sundeep &lt;<a href="mailto:sundeep.lkml@gmail.com">sundeep.lkml@gmail.com</a>&gt;<br>
CC: Eric Auger &lt;<a href="mailto:eric.auger@redhat.com">eric.auger@redhat.com</a>&gt;<br>
CC: Alistair Francis &lt;<a href="mailto:alistair@alistair23.me">alistair@alistair23.me</a>&gt;<br>
CC: &quot;Edgar E. Iglesias&quot; &lt;<a href="mailto:edgar.iglesias@gmail.com">edgar.iglesias@gmail.com</a>&gt;<br>
CC: Stefano Stabellini &lt;<a href="mailto:sstabellini@kernel.org">sstabellini@kernel.org</a>&gt;<br>
CC: Anthony Perard &lt;<a href="mailto:anthony.perard@citrix.com">anthony.perard@citrix.com</a>&gt;<br>
CC: Paul Durrant &lt;<a href="mailto:paul@xen.org">paul@xen.org</a>&gt;<br>
CC: Paul Burton &lt;<a href="mailto:pburton@wavecomp.com">pburton@wavecomp.com</a>&gt;<br>
CC: Aleksandar Rikalo &lt;<a href="mailto:arikalo@wavecomp.com">arikalo@wavecomp.com</a>&gt;<br>
CC: Chris Wulff &lt;<a href="mailto:crwulff@gmail.com">crwulff@gmail.com</a>&gt;<br>
CC: Marek Vasut &lt;<a href="mailto:marex@denx.de">marex@denx.de</a>&gt;<br>
CC: David Gibson &lt;<a href="mailto:david@gibson.dropbear.id.au">david@gibson.dropbear.id.au</a>&gt;<br>
CC: Cornelia Huck &lt;<a href="mailto:cohuck@redhat.com">cohuck@redhat.com</a>&gt;<br>
CC: Halil Pasic &lt;<a href="mailto:pasic@linux.ibm.com">pasic@linux.ibm.com</a>&gt;<br>
CC: Christian Borntraeger &lt;<a href="mailto:borntraeger@de.ibm.com">borntraeger@de.ibm.com</a>&gt;<br>
CC: &quot;Hervé Poussineau&quot; &lt;<a href="mailto:hpoussin@reactos.org">hpoussin@reactos.org</a>&gt;<br>
CC: Xiao Guangrong &lt;<a href="mailto:xiaoguangrong.eric@gmail.com">xiaoguangrong.eric@gmail.com</a>&gt;<br>
CC: Aurelien Jarno &lt;<a href="mailto:aurelien@aurel32.net">aurelien@aurel32.net</a>&gt;<br>
CC: Aleksandar Markovic &lt;<a href="mailto:amarkovic@wavecomp.com">amarkovic@wavecomp.com</a>&gt;<br>
CC: Mark Cave-Ayland &lt;<a href="mailto:mark.cave-ayland@ilande.co.uk">mark.cave-ayland@ilande.co.uk</a>&gt;<br>
CC: Jason Wang &lt;<a href="mailto:jasowang@redhat.com">jasowang@redhat.com</a>&gt;<br>
CC: Laszlo Ersek &lt;<a href="mailto:lersek@redhat.com">lersek@redhat.com</a>&gt;<br>
CC: Yuval Shaia &lt;<a href="mailto:yuval.shaia@oracle.com">yuval.shaia@oracle.com</a>&gt;<br>
CC: Palmer Dabbelt &lt;<a href="mailto:palmer@sifive.com">palmer@sifive.com</a>&gt;<br>
CC: Sagar Karandikar &lt;<a href="mailto:sagark@eecs.berkeley.edu">sagark@eecs.berkeley.edu</a>&gt;<br>
CC: Bastian Koppelmann &lt;<a href="mailto:kbastian@mail.uni-paderborn.de">kbastian@mail.uni-paderborn.de</a>&gt;<br>
CC: David Hildenbrand &lt;<a href="mailto:david@redhat.com">david@redhat.com</a>&gt;<br>
CC: Thomas Huth &lt;<a href="mailto:thuth@redhat.com">thuth@redhat.com</a>&gt;<br>
CC: Eric Farman &lt;<a href="mailto:farman@linux.ibm.com">farman@linux.ibm.com</a>&gt;<br>
CC: Matthew Rosato &lt;<a href="mailto:mjrosato@linux.ibm.com">mjrosato@linux.ibm.com</a>&gt;<br>
CC: Hannes Reinecke &lt;<a href="mailto:hare@suse.com">hare@suse.com</a>&gt;<br>
CC: Michael Walle &lt;michael@walle.cc&gt;<br>
CC: Artyom Tarasenko &lt;<a href="mailto:atar4qemu@gmail.com">atar4qemu@gmail.com</a>&gt;<br>
CC: Stefan Berger &lt;<a href="mailto:stefanb@linux.ibm.com">stefanb@linux.ibm.com</a>&gt;<br>
CC: Samuel Thibault &lt;<a href="mailto:samuel.thibault@ens-lyon.org">samuel.thibault@ens-lyon.org</a>&gt;<br>
CC: Alex Williamson &lt;<a href="mailto:alex.williamson@redhat.com">alex.williamson@redhat.com</a>&gt;<br>
CC: Tony Krowiak &lt;<a href="mailto:akrowiak@linux.ibm.com">akrowiak@linux.ibm.com</a>&gt;<br>
CC: Pierre Morel &lt;<a href="mailto:pmorel@linux.ibm.com">pmorel@linux.ibm.com</a>&gt;<br>
CC: Michael Roth &lt;<a href="mailto:mdroth@linux.vnet.ibm.com">mdroth@linux.vnet.ibm.com</a>&gt;<br>
CC: Hailiang Zhang &lt;<a href="mailto:zhang.zhanghailiang@huawei.com">zhang.zhanghailiang@huawei.com</a>&gt;<br>
CC: Juan Quintela &lt;<a href="mailto:quintela@redhat.com">quintela@redhat.com</a>&gt;<br>
CC: &quot;Dr. David Alan Gilbert&quot; &lt;<a href="mailto:dgilbert@redhat.com">dgilbert@redhat.com</a>&gt;<br>
CC: Luigi Rizzo &lt;<a href="mailto:rizzo@iet.unipi.it">rizzo@iet.unipi.it</a>&gt;<br>
CC: Giuseppe Lettieri &lt;<a href="mailto:g.lettieri@iet.unipi.it">g.lettieri@iet.unipi.it</a>&gt;<br>
CC: Vincenzo Maffione &lt;<a href="mailto:v.maffione@gmail.com">v.maffione@gmail.com</a>&gt;<br>
CC: Jan Kiszka &lt;<a href="mailto:jan.kiszka@siemens.com">jan.kiszka@siemens.com</a>&gt;<br>
CC: Anthony Green &lt;<a href="mailto:green@moxielogic.com">green@moxielogic.com</a>&gt;<br>
CC: Stafford Horne &lt;<a href="mailto:shorne@gmail.com">shorne@gmail.com</a>&gt;<br>
CC: Guan Xuetao &lt;<a href="mailto:gxt@mprc.pku.edu.cn">gxt@mprc.pku.edu.cn</a>&gt;<br>
CC: Max Filippov &lt;<a href="mailto:jcmvbkbc@gmail.com">jcmvbkbc@gmail.com</a>&gt;<br>
CC: <a href="mailto:qemu-block@nongnu.org">qemu-block@nongnu.org</a><br>
CC: <a href="mailto:integration@gluster.org">integration@gluster.org</a><br>
CC: <a href="mailto:sheepdog@lists.wpkg.org">sheepdog@lists.wpkg.org</a><br>
CC: <a href="mailto:qemu-arm@nongnu.org">qemu-arm@nongnu.org</a><br>
CC: <a href="mailto:xen-devel@lists.xenproject.org">xen-devel@lists.xenproject.org</a><br>
CC: <a href="mailto:qemu-ppc@nongnu.org">qemu-ppc@nongnu.org</a><br>
CC: <a href="mailto:qemu-s390x@nongnu.org">qemu-s390x@nongnu.org</a><br>
CC: <a href="mailto:qemu-riscv@nongnu.org">qemu-riscv@nongnu.org</a><br>
<br>
 python/commit-per-subsystem.py | 204 ++++++++++++++++++++++++++++++<wbr>+++<br>
 1 file changed, 204 insertions(+)<br>
 create mode 100755 python/commit-per-subsystem.py<br>
<br>
diff --git a/python/commit-per-subsystem.<wbr>py b/python/commit-per-subsystem.<wbr>py<br>
new file mode 100755<br>
index 0000000000..2ccf84cb15<br>
--- /dev/null<br>
+++ b/python/commit-per-subsystem.<wbr>py<br>
@@ -0,0 +1,204 @@<br>
+#!/usr/bin/env python3<br>
+#<br>
+# Copyright (c) 2019 Virtuozzo International GmbH<br>
+#<br>
+# This program is free software; you can redistribute it and/or modify<br>
+# it under the terms of the GNU General Public License as published by<br>
+# the Free Software Foundation; either version 2 of the License, or<br>
+# (at your option) any later version.<br>
+#<br>
+# This program is distributed in the hope that it will be useful,<br>
+# but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>
+# GNU General Public License for more details.<br>
+#<br>
+# You should have received a copy of the GNU General Public License<br>
+# along with this program.  If not, see &lt;<a href="http://www.gnu.org/licenses/" target="_blank">http://www.gnu.org/licenses/</a>&gt;<wbr>.<br>
+#<br>
+<br>
+import subprocess<br>
+import sys<br>
+import os<br>
+import glob<br>
+<br>
+<br>
+def git_add(pattern):<br>
+    subprocess.run([&#39;git&#39;, &#39;add&#39;, pattern])<br>
+<br>
+<br>
+def git_commit(msg):<br>
+    subprocess.run([&#39;git&#39;, &#39;commit&#39;, &#39;-m&#39;, msg], capture_output=True)<br>
+<br>
+<br>
+def git_changed_files():<br>
+    ret = subprocess.check_output([&#39;git&#39;<wbr>, &#39;diff&#39;, &#39;--name-only&#39;], encoding=&#39;utf-8&#39;).split(&#39;\n&#39;)<br>
+    if ret[-1] == &#39;&#39;:<br>
+        del ret[-1]<br>
+    return ret<br>
+<br>
+<br>
+maintainers = sys.argv[1]<br>
+message = sys.argv[2].strip()<br>
+<br>
+subsystem = None<br>
+<br>
+remap = {<br>
+    &#39;Block layer core&#39;: &#39;block&#39;,<br>
+    &#39;Block Jobs&#39;: &#39;block&#39;,<br>
+    &#39;Dirty Bitmaps&#39;: &#39;block&#39;,<br>
+    &#39;Block QAPI, monitor, command line&#39;: &#39;block&#39;,<br>
+    &#39;Block I/O path&#39;: &#39;block&#39;,<br>
+    &#39;Throttling infrastructure&#39;: &#39;block&#39;,<br>
+    &#39;Architecture support&#39;: &#39;s390x&#39;,<br>
+    &#39;Guest CPU Cores (KVM)&#39;: &#39;kvm&#39;,<br>
+    &#39;Guest CPU Cores (Xen)&#39;: &#39;xen&#39;,<br>
+    &#39;Guest CPU cores (TCG)&#39;: &#39;tcg&#39;,<br>
+    &#39;Network Block Device (NBD)&#39;: &#39;nbd&#39;,<br>
+    &#39;Parallel NOR Flash devices&#39;: &#39;pflash&#39;,<br>
+    &#39;Firmware configuration (fw_cfg)&#39;: &#39;fw_cfg&#39;,<br>
+    &#39;Block SCSI subsystem&#39;: &#39;scsi&#39;,<br>
+    &#39;Network device backends&#39;: &#39;net&#39;,<br>
+    &#39;Netmap network backend&#39;: &#39;net&#39;,<br>
+    &#39;Host Memory Backends&#39;: &#39;hostmem&#39;,<br>
+    &#39;Cryptodev Backends&#39;: &#39;cryptodev&#39;,<br>
+    &#39;QEMU Guest Agent&#39;: &#39;qga&#39;,<br>
+    &#39;COLO Framework&#39;: &#39;colo&#39;,<br>
+    &#39;Command line option argument parsing&#39;: &#39;cmdline&#39;,<br>
+    &#39;Character device backends&#39;: &#39;chardev&#39;<br>
+}<br>
+<br>
+<br>
+class Maintainers:<br>
+    def add(self, subsystem, path, mapper, mapper_name, glob_count=1):<br>
+        if subsystem in remap:<br>
+            subsystem = remap[subsystem]<br>
+        if subsystem not in self.subsystems:<br>
+            self.subsystems.append(<wbr>subsystem)<br>
+<br>
+        if path[-1] == &#39;/&#39;:<br>
+            path = path[:-1]<br>
+<br>
+        if path in mapper:<br>
+            if mapper[path][1] == glob_count:<br>
+                print(&#39;Warning: &quot;{}&quot; both in &quot;{}&quot; and &quot;{}&quot; in {} mapper with &#39;<br>
+                      &#39;same glob-count={}. {} ignored for this path.&#39;.format(<br>
+                        path, mapper[path][0], subsystem, mapper_name, glob_count,<br>
+                          subsystem))<br>
+                return<br>
+            if mapper[path][1] &lt; glob_count:<br>
+                # silently ignore worse match<br>
+                return<br>
+<br>
+        mapper[path] = (subsystem, glob_count)<br>
+<br>
+    def __init__(self, file_name):<br>
+        self.map_file = {}<br>
+        self.map_glob_file = {}<br>
+        self.map_dir = {}<br>
+        self.map_glob_dir = {}<br>
+        self.map_unmaintained_dir = {<br>
+            &#39;python&#39;: (&#39;python&#39;, 1),<br>
+            &#39;hw/misc&#39;: (&#39;misc&#39;, 1)<br>
+        }<br>
+        self.subsystems = [&#39;python&#39;, &#39;misc&#39;]<br>
+        subsystem = None<br>
+<br>
+        with open(file_name) as f:<br>
+            mode2 = False<br>
+            prevline = &#39;&#39;<br>
+            for line in f:<br>
+                line = line.rstrip()<br>
+                if not line:<br>
+                    continue<br>
+                if len(line) &gt;= 2 and line[1] == &#39;:&#39;:<br>
+                    if line[0] == &#39;F&#39;:<br>
+                        fname = line[3:]<br>
+                        if fname in [&#39;*&#39;, &#39;*/&#39;]:<br>
+                            continue<br>
+                        if os.path.isfile(fname):<br>
+                            self.add(subsystem, fname, self.map_file, &#39;file&#39;)<br>
+                        elif os.path.isdir(fname):<br>
+                            self.add(subsystem, fname, self.map_dir, &#39;dir&#39;)<br>
+                        else:<br>
+                            paths = glob.glob(fname)<br>
+                            if not paths:<br>
+                                print(&#39;Warning: nothing corresponds to &quot;{}&quot;&#39;.format(fname))<br>
+                                continue<br>
+<br>
+                            n = len(paths)<br>
+                            for f in paths:<br>
+                                if os.path.isfile(f):<br>
+                                    self.add(subsystem, f, self.map_glob_file, &#39;glob-file&#39;, n)<br>
+                                else:<br>
+                                    assert os.path.isdir(f)<br>
+                                    self.add(subsystem, f, self.map_glob_dir, &#39;glob-dir&#39;, n)<br>
+                elif line[:3] == &#39;---&#39;:<br>
+                    subsystem = prevline<br>
+                    if subsystem == &#39;Devices&#39;:<br>
+                        mode2 = True<br>
+                elif mode2:<br>
+                    subsystem = line<br>
+                prevline = line<br>
+<br>
+    def find_in_map_dir(self, file_name, mapper):<br>
+        while file_name != &#39;&#39; and file_name not in mapper:<br>
+            file_name = os.path.dirname(file_name)<br>
+<br>
+        return None if file_name == &#39;&#39; else mapper[file_name][0]<br>
+<br>
+    def find_in_map_file(self, file_name, mapper):<br>
+        if file_name in mapper:<br>
+            return mapper[file_name][0]<br>
+<br>
+    def find_subsystem(self, file_name):<br>
+        s = self.find_in_map_file(file_<wbr>name, self.map_file)<br>
+        if s is not None:<br>
+            return s<br>
+<br>
+        s = self.find_in_map_file(file_<wbr>name, self.map_glob_file)<br>
+        if s is not None:<br>
+            return s<br>
+<br>
+        s = self.find_in_map_dir(file_<wbr>name, self.map_dir)<br>
+        if s is not None:<br>
+            return s<br>
+<br>
+        s = self.find_in_map_dir(file_<wbr>name, self.map_glob_dir)<br>
+        if s is not None:<br>
+            return s<br>
+<br>
+        s = self.find_in_map_dir(file_<wbr>name, self.map_unmaintained_dir)<br>
+        if s is not None:<br>
+            return s<br>
+<br>
+        self.subsystems.append(file_<wbr>name)<br>
+        return file_name<br>
+<br>
+<br>
+def commit(subsystem):<br>
+    msg = subsystem<br>
+    if msg in remap:<br>
+        msg = remap[msg]<br>
+    msg += &#39;: &#39; + message<br>
+    git_commit(msg)<br>
+<br>
+mnt = Maintainers(maintainers)<br>
+res = {}<br>
+for f in git_changed_files():<br>
+    s = mnt.find_subsystem(f)<br>
+    if s in res:<br>
+        res[s].append(f)<br>
+    else:<br>
+        res[s] = [f]<br>
+<br>
+for s in mnt.subsystems:<br>
+    if s in res:<br>
+        print(s)<br>
+        for f in res[s]:<br>
+            print(&#39;  &#39;, f)<br>
+<br>
+for s in mnt.subsystems:<br>
+    if s in res:<br>
+        for f in res[s]:<br>
+            git_add(f)<br>
+        commit(s)<br>
-- <br>
2.21.0<br>
<br>
<br>
</blockquote>