chiark / gitweb /
Merge branch 'gradleFlavor' into 'master'
authorHans-Christoph Steiner <hans@eds.org>
Thu, 30 Nov 2017 12:44:47 +0000 (13:44 +0100)
committerHans-Christoph Steiner <hans@eds.org>
Thu, 30 Nov 2017 12:44:47 +0000 (13:44 +0100)
gradle file: use flavour specific versionCode/versionName, fall back to parsing line by line

See merge request fdroid/fdroidserver!389

1  2 
fdroidserver/common.py

diff --combined fdroidserver/common.py
index a23ae2e994de07588adca2ff4078744b6fd1f84f,b2e918bafcb1d087d24631641c05c19ba48ff82b..6ed43d4c4e465eda49d752eb7ceea09d7eb6af5a
@@@ -40,7 -40,7 +40,7 @@@ import jso
  import xml.etree.ElementTree as XMLElementTree
  
  from binascii import hexlify
 -from datetime import datetime
 +from datetime import datetime, timedelta
  from distutils.version import LooseVersion
  from queue import Queue
  from zipfile import ZipFile
@@@ -444,16 -444,17 +444,16 @@@ def get_local_metadata_files()
      return glob.glob('.fdroid.[a-jl-z]*[a-rt-z]')
  
  
 -def read_pkg_args(args, allow_vercodes=False):
 +def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False):
      """
 -    :param args: arguments in the form of multiple appid:[vc] strings
 +    :param appids: arguments in the form of multiple appid:[vc] strings
      :returns: a dictionary with the set of vercodes specified for each package
      """
 -
      vercodes = {}
 -    if not args:
 +    if not appid_versionCode_pairs:
          return vercodes
  
 -    for p in args:
 +    for p in appid_versionCode_pairs:
          if allow_vercodes and ':' in p:
              package, vercode = p.split(':')
          else:
      return vercodes
  
  
 -def read_app_args(args, allapps, allow_vercodes=False):
 -    """
 -    On top of what read_pkg_args does, this returns the whole app metadata, but
 -    limiting the builds list to the builds matching the vercodes specified.
 +def read_app_args(appid_versionCode_pairs, allapps, allow_vercodes=False):
 +    """Build a list of App instances for processing
 +
 +    On top of what read_pkg_args does, this returns the whole app
 +    metadata, but limiting the builds list to the builds matching the
 +    appid_versionCode_pairs and vercodes specified.  If no appid_versionCode_pairs are specified, then
 +    all App and Build instances are returned.
 +
      """
  
 -    vercodes = read_pkg_args(args, allow_vercodes)
 +    vercodes = read_pkg_args(appid_versionCode_pairs, allow_vercodes)
  
      if not vercodes:
          return allapps
@@@ -1302,27 -1299,58 +1302,58 @@@ def parse_androidmanifests(paths, app)
          vercode = None
          package = None
  
+         flavour = ""
+         if app.builds and 'gradle' in app.builds[-1] and app.builds[-1].gradle:
+                 flavour = app.builds[-1].gradle[-1]
          if has_extension(path, 'gradle'):
+             # first try to get version name and code from correct flavour
              with open(path, 'r') as f:
-                 for line in f:
-                     if gradle_comment.match(line):
-                         continue
-                     # Grab first occurence of each to avoid running into
-                     # alternative flavours and builds.
-                     if not package:
-                         matches = psearch_g(line)
-                         if matches:
-                             s = matches.group(2)
-                             if app_matches_packagename(app, s):
-                                 package = s
-                     if not version:
-                         matches = vnsearch_g(line)
-                         if matches:
-                             version = matches.group(2)
-                     if not vercode:
-                         matches = vcsearch_g(line)
-                         if matches:
-                             vercode = matches.group(1)
+                 buildfile = f.read()
+                 regex_string = r"" + flavour + ".*?}"
+                 search = re.compile(regex_string, re.DOTALL)
+                 result = search.search(buildfile)
+             if result is not None:
+                 resultgroup = result.group()
+                 if not package:
+                     matches = psearch_g(resultgroup)
+                     if matches:
+                         s = matches.group(2)
+                         if app_matches_packagename(app, s):
+                             package = s
+                 if not version:
+                     matches = vnsearch_g(resultgroup)
+                     if matches:
+                         version = matches.group(2)
+                 if not vercode:
+                     matches = vcsearch_g(resultgroup)
+                     if matches:
+                         vercode = matches.group(1)
+             else:
+                 # fall back to parse file line by line
+                 with open(path, 'r') as f:
+                     for line in f:
+                         if gradle_comment.match(line):
+                             continue
+                         # Grab first occurence of each to avoid running into
+                         # alternative flavours and builds.
+                         if not package:
+                             matches = psearch_g(line)
+                             if matches:
+                                 s = matches.group(2)
+                                 if app_matches_packagename(app, s):
+                                     package = s
+                         if not version:
+                             matches = vnsearch_g(line)
+                             if matches:
+                                 version = matches.group(2)
+                         if not vercode:
+                             matches = vcsearch_g(line)
+                             if matches:
+                                 vercode = matches.group(1)
          else:
              try:
                  xml = parse_xml(path)
@@@ -1719,23 -1747,6 +1750,23 @@@ def natural_key(s)
      return [int(sp) if sp.isdigit() else sp for sp in re.split(r'(\d+)', s)]
  
  
 +def check_system_clock(dt_obj, path):
 +    """Check if system clock is updated based on provided date
 +
 +    If an APK has files newer than the system time, suggest updating
 +    the system clock.  This is useful for offline systems, used for
 +    signing, which do not have another source of clock sync info. It
 +    has to be more than 24 hours newer because ZIP/APK files do not
 +    store timezone info
 +
 +    """
 +    checkdt = dt_obj - timedelta(1)
 +    if datetime.today() < checkdt:
 +        logging.warning(_('System clock is older than date in {path}!').format(path=path)
 +                        + '\n' + _('Set clock to that time using:') + '\n'
 +                        + 'sudo date -s "' + str(dt_obj) + '"')
 +
 +
  class KnownApks:
      """permanent store of existing APKs with the date they were added
  
                          date = datetime.strptime(t[-1], '%Y-%m-%d')
                          filename = line[0:line.rfind(appid) - 1]
                          self.apks[filename] = (appid, date)
 +                        check_system_clock(date, self.path)
          self.changed = False
  
      def writeifchanged(self):