chiark / gitweb /
Keep track of what attrs were modified in apps/builds
authorDaniel Martí <mvdan@mvdan.cc>
Thu, 3 Dec 2015 15:46:21 +0000 (16:46 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Thu, 3 Dec 2015 15:46:21 +0000 (16:46 +0100)
This allows us to run checks and fix types only on those that were
really modified. On our fdroiddata repo, with 2k apps with many unset
fields and flags, this reduces readmeta runtime from ~1.3s to ~1.1s.

fdroidserver/metadata.py

index b0d32db0b3174ec8a5068f517c9e217f1f4ceb18..6115fed6d3b4da01f35cea716b2f26c98ff879f5 100644 (file)
@@ -137,6 +137,7 @@ class App():
         self.comments = {}
         self.added = None
         self.lastupdated = None
+        self._modified = set()
 
     # Translates human-readable field names to attribute names, e.g.
     # 'Auto Name' to 'AutoName'
@@ -180,6 +181,7 @@ class App():
             raise MetaDataException('Unrecognised app field: ' + f)
         k = App.field_to_attr(f)
         self.__dict__[k] = v
+        self._modified.add(k)
 
     # Appends to the value associated to a field name, e.g. 'Auto Name'
     def append_field(self, f, v):
@@ -299,6 +301,8 @@ class Build():
         self.antcommands = None
         self.novcheck = False
 
+        self._modified = set()
+
     def get_flag(self, f):
         if f not in build_flags:
             raise MetaDataException('Unrecognised build flag: ' + f)
@@ -312,6 +316,7 @@ class Build():
         if f not in build_flags:
             raise MetaDataException('Unrecognised build flag: ' + f)
         self.__dict__[f] = v
+        self._modified.add(f)
 
     def append_flag(self, f, v):
         if f not in build_flags:
@@ -836,12 +841,16 @@ esc_newlines = re.compile(r'\\( |\n)')
 def post_metadata_parse(app):
 
     for k, v in app.__dict__.iteritems():
+        if k not in app._modified:
+            continue
         if type(v) in (float, int):
             app.__dict__[k] = str(v)
 
     for build in app.builds:
         for k, v in build.__dict__.iteritems():
 
+            if k not in build._modified:
+                continue
             if type(v) in (float, int):
                 build.__dict__[k] = str(v)
                 continue