Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Tovok7 2012-01-10 21:13:41 +01:00
commit a2a0d9f4df
15 changed files with 183 additions and 136 deletions

1
.gitignore vendored
View file

@ -1,5 +1,6 @@
config.py config.py
repo/ repo/
logs/
built/ built/
build/ build/
build_*/ build_*/

View file

@ -74,13 +74,13 @@ if not os.path.isdir(build_dir):
for app in apps: for app in apps:
if app['disabled']: if app['Disabled']:
print "Skipping %s: disabled" % app['id'] print "Skipping %s: disabled" % app['id']
elif not app['builds']: elif not app['builds']:
print "Skipping %s: no builds specified" % app['id'] print "Skipping %s: no builds specified" % app['id']
if (app['disabled'] is None and app['repo'] != '' if (app['Disabled'] is None and app['Repo'] != ''
and app['repotype'] != '' and (options.package is None or and app['Repo Type'] != '' and (options.package is None or
options.package == app['id']) and len(app['builds']) > 0): options.package == app['id']) and len(app['builds']) > 0):
print "Processing " + app['id'] print "Processing " + app['id']
@ -88,7 +88,7 @@ for app in apps:
build_dir = 'build/' + app['id'] build_dir = 'build/' + app['id']
# Set up vcs interface and make sure we have the latest code... # Set up vcs interface and make sure we have the latest code...
vcs = common.getvcs(app['repotype'], app['repo'], build_dir) vcs = common.getvcs(app['Repo Type'], app['Repo'], build_dir)
refreshed_source = False refreshed_source = False

View file

@ -63,7 +63,7 @@ for app in apps:
print "...couldn't find version code" print "...couldn't find version code"
elif not version: elif not version:
print "...couldn't find version" print "...couldn't find version"
elif vercode == app['marketvercode'] and version == app['marketversion']: elif vercode == app['Market Version Code'] and version == app['Market Version']:
print "...up to date" print "...up to date"
else: else:
print '...updating to version:' + version + ' vercode:' + vercode print '...updating to version:' + version + ' vercode:' + vercode

200
common.py
View file

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# common.py - part of the FDroid server tools # common.py - part of the FDroid server tools
# Copyright (C) 2010-11, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2010-12, Ciaran Gultnieks, ciaran@ciarang.com
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by # it under the terms of the GNU Affero General Public License as published by
@ -245,15 +245,53 @@ class vcs_bzr(vcs):
raise VCSException("Bzr update failed") raise VCSException("Bzr update failed")
# Get the type expected for a given metadata field.
def metafieldtype(name):
if name == 'Description':
return 'multiline'
if name == 'Requires Root':
return 'flag'
if name == 'Build Version':
return 'build'
if name == 'Use Built':
return 'obsolete'
return 'string'
# Parse metadata for a single application.
#
# 'metafile' - the filename to read. The package id for the application comes
# from this filename.
#
# Returns a dictionary containing all the details of the application. There are
# two major kinds of information in the dictionary. Keys beginning with capital
# letters correspond directory to identically named keys in the metadata file.
# Keys beginning with lower case letters are generated in one way or another,
# and are not found verbatim in the metadata.
#
# Known keys not originating from the metadata are:
#
# 'id' - the application's package ID
# 'builds' - a list of dictionaries containing build information
# for each defined build
# 'comments' - a list of comments from the metadata file. Each is
# a tuple of the form (field, comment) where field is
# the name of the field it preceded in the metadata
# file
# 'name' - the application's name, as displayed. This will
# always be None on return from this parser. The name
# is discovered from built APK files.
#
def parse_metadata(metafile, **kw): def parse_metadata(metafile, **kw):
def parse_buildline(value): def parse_buildline(lines):
value = "".join(lines)
parts = [p.replace("\\,", ",") parts = [p.replace("\\,", ",")
for p in re.split(r"(?<!\\),", value)] for p in re.split(r"(?<!\\),", value)]
if len(parts) < 3: if len(parts) < 3:
raise MetaDataException("Invalid build format: " + value + " in " + metafile.name) raise MetaDataException("Invalid build format: " + value + " in " + metafile.name)
thisbuild = {} thisbuild = {}
thisbuild['origlines'] = lines
thisbuild['version'] = parts[0] thisbuild['version'] = parts[0]
thisbuild['vercode'] = parts[1] thisbuild['vercode'] = parts[1]
thisbuild['commit'] = parts[2] thisbuild['commit'] = parts[2]
@ -268,29 +306,37 @@ def parse_metadata(metafile, **kw):
thisinfo['id'] = metafile.name[9:-4] thisinfo['id'] = metafile.name[9:-4]
if kw.get("verbose", False): if kw.get("verbose", False):
print "Reading metadata for " + thisinfo['id'] print "Reading metadata for " + thisinfo['id']
thisinfo['description'] = ''
thisinfo['name'] = None # Defaults for fields that come from metadata...
thisinfo['summary'] = '' thisinfo['Description'] = ''
thisinfo['license'] = 'Unknown' thisinfo['Summary'] = ''
thisinfo['web'] = '' thisinfo['License'] = 'Unknown'
thisinfo['source'] = '' thisinfo['Web Site'] = ''
thisinfo['tracker'] = '' thisinfo['Source Code'] = ''
thisinfo['donate'] = None thisinfo['Issue Tracker'] = ''
thisinfo['disabled'] = None thisinfo['Donate'] = None
thisinfo['antifeatures'] = None thisinfo['Disabled'] = None
thisinfo['marketversion'] = '' thisinfo['AntiFeatures'] = None
thisinfo['marketvercode'] = '0' thisinfo['Market Version'] = ''
thisinfo['repotype'] = '' thisinfo['Market Version Code'] = '0'
thisinfo['repo'] = '' thisinfo['Repo Type'] = ''
thisinfo['Repo'] = ''
thisinfo['Requires Root'] = False
# General defaults...
thisinfo['builds'] = [] thisinfo['builds'] = []
thisinfo['requiresroot'] = False thisinfo['name'] = None
thisinfo['comments'] = []
mode = 0 mode = 0
buildline = [] buildlines = []
curcomments = []
for line in metafile: for line in metafile:
line = line.rstrip('\r\n') line = line.rstrip('\r\n')
if line.startswith("#"): if line.startswith("#"):
continue curcomments.append(line)
if mode == 0: elif mode == 0:
if len(line) == 0: if len(line) == 0:
continue continue
index = line.find(':') index = line.find(':')
@ -298,83 +344,77 @@ def parse_metadata(metafile, **kw):
raise MetaDataException("Invalid metadata in " + metafile.name + " at: " + line) raise MetaDataException("Invalid metadata in " + metafile.name + " at: " + line)
field = line[:index] field = line[:index]
value = line[index+1:] value = line[index+1:]
if field == 'Description':
for comment in curcomments:
thisinfo['comments'].append((field,comment))
fieldtype = metafieldtype(field)
if fieldtype == 'multiline':
mode = 1 mode = 1
elif field == 'Name': if len(value) > 0:
thisinfo['name'] = value raise MetaDataException("Unexpected text on same line as " + field + " in " + metafile.name)
elif field == 'Summary': elif fieldtype == 'string':
thisinfo['summary'] = value thisinfo[field] = value
elif field == 'Source Code': elif fieldtype == 'flag':
thisinfo['source'] = value if value == 'Yes':
elif field == 'License': thisinfo[field] = True
thisinfo['license'] = value elif value == 'No':
elif field == 'Category': thisinfo[field] = False
thisinfo['category'] = value else:
elif field == 'Web Site': raise MetaDataException("Expected Yes or No for " + field + " in " + metafile.name)
thisinfo['web'] = value elif fieldtype == 'build':
elif field == 'Issue Tracker':
thisinfo['tracker'] = value
elif field == 'Donate':
thisinfo['donate'] = value
elif field == 'Disabled':
thisinfo['disabled'] = value
elif field == 'Use Built':
pass #Ignoring this - will be removed
elif field == 'AntiFeatures':
parts = value.split(",")
for part in parts:
if (part != "Ads" and
part != "Tracking" and
part != "NonFreeNet" and
part != "NonFreeDep" and
part != "NonFreeAdd"):
raise MetaDataException("Unrecognised antifeature '" + part + "' in " \
+ metafile.name)
thisinfo['antifeatures'] = value
elif field == 'Market Version':
thisinfo['marketversion'] = value
elif field == 'Market Version Code':
thisinfo['marketvercode'] = value
elif field == 'Repo Type':
thisinfo['repotype'] = value
elif field == 'Repo':
thisinfo['repo'] = value
elif field == 'Build Version':
if value.endswith("\\"): if value.endswith("\\"):
mode = 2 mode = 2
buildline = [value[:-1]] buildlines = [value[:-1]]
else: else:
thisinfo['builds'].append(parse_buildline(value)) thisinfo['builds'].append(parse_buildline([value]))
elif field == "Requires Root": elif fieldtype == 'obsolete':
if value == "Yes": pass # Just throw it away!
thisinfo['requiresroot'] = True
else: else:
raise MetaDataException("Unrecognised field " + field + " in " + metafile.name) raise MetaDataException("Unrecognised field type for " + field + " in " + metafile.name)
elif mode == 1: # multi-line description elif mode == 1: # Multiline field
if line == '.': if line == '.':
mode = 0 mode = 0
else: else:
if len(line) == 0: if len(line) == 0:
thisinfo['description'] += '\n\n' thisinfo[field] += '\n\n'
else: else:
if (not thisinfo['description'].endswith('\n') and if (not thisinfo[field].endswith('\n') and
len(thisinfo['description']) > 0): len(thisinfo[field]) > 0):
thisinfo['description'] += ' ' thisinfo[field] += ' '
thisinfo['description'] += line thisinfo[field] += line
elif mode == 2: # line continuation elif mode == 2: # Line continuation mode in Build Version
if line.endswith("\\"): if line.endswith("\\"):
buildline.append(line[:-1]) buildlines.append(line[:-1])
else: else:
buildline.append(line) buildlines.append(line)
thisinfo['builds'].append( thisinfo['builds'].append(
parse_buildline("".join(buildline))) parse_buildline(buildlines))
mode = 0 mode = 0
if mode == 1: if mode == 1:
raise MetaDataException("Description not terminated in " + metafile.name) raise MetaDataException(field + " not terminated in " + metafile.name)
if len(thisinfo['description']) == 0: elif mode == 2:
thisinfo['description'] = 'No description available' raise MetaDataException("Unterminated continuation in " + metafile.name)
if len(thisinfo['Description']) == 0:
thisinfo['Description'] = 'No description available'
# Ensure all AntiFeatures are recognised...
if thisinfo['AntiFeatures']:
parts = thisinfo['AntiFeatures'].split(",")
for part in parts:
if (part != "Ads" and
part != "Tracking" and
part != "NonFreeNet" and
part != "NonFreeDep" and
part != "NonFreeAdd"):
raise MetaDataException("Unrecognised antifeature '" + part + "' in " \
+ metafile.name)
return thisinfo return thisinfo
def read_metadata(verbose=False): def read_metadata(verbose=False):
apps = [] apps = []
for metafile in sorted(glob.glob(os.path.join('metadata', '*.txt'))): for metafile in sorted(glob.glob(os.path.join('metadata', '*.txt'))):

View file

@ -5,7 +5,8 @@ Web Site:http://code.google.com/p/anstop/
Source Code:http://code.google.com/p/anstop/source/checkout Source Code:http://code.google.com/p/anstop/source/checkout
Issue Tracker:http://code.google.com/p/anstop/issues/list Issue Tracker:http://code.google.com/p/anstop/issues/list
Summary:A simple stopwatch Summary:A simple stopwatch
Description:A simple stopwatch, that also supports lap timing and a countdown Description:
A simple stopwatch, that also supports lap timing and a countdown
timer. timer.
. .

View file

@ -5,7 +5,7 @@ Web Site:http://www.funambol.com
Source Code:https://android-client.forge.funambol.org/source/browse/android-client/ Source Code:https://android-client.forge.funambol.org/source/browse/android-client/
Issue Tracker: Issue Tracker:
Summary:Funambol sync client Summary:Funambol sync client
Description:Sync Client Description:
Funambol sync client. Funambol sync client.
. .
Repo Type:svn Repo Type:svn

View file

@ -5,7 +5,8 @@ Source Code:http://github.com/bherrmann7/Car-Cast/
Issue Tracker:https://github.com/bherrmann7/Car-Cast/issues Issue Tracker:https://github.com/bherrmann7/Car-Cast/issues
Donate:https://market.android.com/details?id=com.jadn.ccpro Donate:https://market.android.com/details?id=com.jadn.ccpro
Summary:A podcast downloader and player. Summary:A podcast downloader and player.
Description:Car Cast is a simple audio podcast downloader and player. Description:
Car Cast is a simple audio podcast downloader and player.
Optimized for use in a daily commute, it features big buttons, large text, remembers last played location. Optimized for use in a daily commute, it features big buttons, large text, remembers last played location.
1. Subscribe to podcasts 1. Subscribe to podcasts

View file

@ -27,5 +27,5 @@ Build Version:1.32,34,r1.32,target=android-8
Build Version:1.33,35,r1.33,target=android-8 Build Version:1.33,35,r1.33,target=android-8
Build Version:1.34,36,r1.34,target=android-8 Build Version:1.34,36,r1.34,target=android-8
Market Version:1.33 Market Version:1.34
Market Version Code:35 Market Version Code:36

View file

@ -4,8 +4,9 @@ Category:Office
Web Site:http://solidsushi.com/lab/teatimer Web Site:http://solidsushi.com/lab/teatimer
Source Code:http://github.com/ralphleon/TeaTimer Source Code:http://github.com/ralphleon/TeaTimer
Issue Tracker:https://github.com/ralphleon/TeaTimer/issues Issue Tracker:https://github.com/ralphleon/TeaTimer/issues
Summary:A Simple Tea Timer for Android Summary:Simple Tea Timer
Description:A straight-forward tea timer Description:
A straight-forward tea timer
. .
Repo Type:git Repo Type:git

View file

@ -14,13 +14,14 @@ The recipient is sent a link to a web service. (The source for the web
service is in the same repository as the client). service is in the same repository as the client).
. .
Repo Type:svn Repo Type:git-svn
Repo:http://sharemyposition.googlecode.com/svn/trunk/
#Note - deliberately pulling from trunk, not trunk/ShareMyPosition-android, #Note - deliberately pulling from trunk, not trunk/ShareMyPosition-android,
#even though that would be more efficient, in order to preserve the #even though that would be more efficient, in order to preserve the
#corresponding source for the web service in our source tarball. #corresponding source for the web service in our source tarball.
Repo:http://sharemyposition.googlecode.com/svn/trunk/
Build Version:1.0.11,16,64,subdir=ShareMyPosition-android Build Version:1.0.11,16,64,subdir=ShareMyPosition-android
Build Version:1.1.0-beta3,20,70,subdir=ShareMyPosition-android,target=android-11,prebuild=mv lib libs
Market Version:1.1.0-beta1 Market Version:1.1.0-beta3
Market Version Code:18 Market Version Code:20

View file

@ -13,11 +13,12 @@ Blocks advertisements via the /etc/hosts file. Supports automatic updates.
Repo Type:git Repo Type:git
Repo:git://gitorious.org/adaway/adaway.git Repo:git://gitorious.org/adaway/adaway.git
Requires Root:yes Requires Root:Yes
Build Version:1.12,13,ea5378a94ee0dc1d99d2cec95fae7e6d81afb2b9,subdir=org_adaway/,buildjni=yes Build Version:1.12,13,ea5378a94ee0dc1d99d2cec95fae7e6d81afb2b9,subdir=org_adaway/,buildjni=yes
Build Version:1.15,16,4128e59da2eac5c2904c7c7568d298ca51e79540,subdir=org_adaway/,buildjni=yes,patch=defprop.patch Build Version:1.15,16,4128e59da2eac5c2904c7c7568d298ca51e79540,subdir=org_adaway/,buildjni=yes,patch=defprop.patch
Build Version:1.18,19,0b9985398b9eef7baf6aadd0dbb12002bc199d2e,subdir=org_adaway/,buildjni=yes,patch=defprop.patch Build Version:1.18,19,0b9985398b9eef7baf6aadd0dbb12002bc199d2e,subdir=org_adaway/,buildjni=yes,patch=defprop.patch
Build Version:1.19,20,ab27f4dab5f3ea5e228cfb4a6b0e1fbf53695f22,subdir=org_adaway/,buildjni=yes,patch=defprop.patch
Market Version:1.18 Market Version:1.19
Market Version Code:19 Market Version Code:20

View file

@ -21,5 +21,5 @@ Repo:http://android.svn.wordpress.org/trunk/
Build Version:1.3.9,31,202,prebuild=mkdir libs && mv *.jar libs && sed -i "s@checkStats(accounts.size());@// MY PRIVACY > YOUR STATS@" src/org/wordpress/android/wpAndroid.java,encoding=utf-8 Build Version:1.3.9,31,202,prebuild=mkdir libs && mv *.jar libs && sed -i "s@checkStats(accounts.size());@// MY PRIVACY > YOUR STATS@" src/org/wordpress/android/wpAndroid.java,encoding=utf-8
Build Version:1.4.1,33,228,prebuild=mkdir libs && mv *.jar libs && sed -i "s@checkStats(accounts.size());@// MY PRIVACY > YOUR STATS@" src/org/wordpress/android/wpAndroid.java,encoding=utf-8 Build Version:1.4.1,33,228,prebuild=mkdir libs && mv *.jar libs && sed -i "s@checkStats(accounts.size());@// MY PRIVACY > YOUR STATS@" src/org/wordpress/android/wpAndroid.java,encoding=utf-8
Market Version:2.0.2 Market Version:2.0.3
Market Version Code:40 Market Version Code:42

View file

@ -3,9 +3,10 @@ Category:Internet
Web Site:https://code.google.com/p/weather-notification-android/ Web Site:https://code.google.com/p/weather-notification-android/
Source Code:https://code.google.com/p/weather-notification-android/source/browse/ Source Code:https://code.google.com/p/weather-notification-android/source/browse/
Issue Tracker:https://code.google.com/p/weather-notification-android/issues/list Issue Tracker:https://code.google.com/p/weather-notification-android/issues/list
Summary: Displays the air temperature and other weather conditions in the Android notification bar. Summary:Weather info in notification bar
Description:Simple application which displays the air temperature Description:
and other weather conditions in the Android notification bar. Simple application which displays the air temperature
and other weather conditions in the notification bar.
The air temperature is always visible like a system clock. The air temperature is always visible like a system clock.
. .

View file

@ -55,7 +55,7 @@ for app in apps:
skip = False skip = False
if options.package and app['id'] != options.package: if options.package and app['id'] != options.package:
skip = True skip = True
elif app['disabled']: elif app['Disabled']:
print "Skipping %s: disabled" % app['id'] print "Skipping %s: disabled" % app['id']
skip = True skip = True
elif not app['builds']: elif not app['builds']:
@ -71,7 +71,7 @@ for app in apps:
build_dir = 'build/' + app['id'] build_dir = 'build/' + app['id']
# Set up vcs interface and make sure we have the latest code... # Set up vcs interface and make sure we have the latest code...
vcs = common.getvcs(app['repotype'], app['repo'], build_dir) vcs = common.getvcs(app['Repo Type'], app['Repo'], build_dir)
refreshed_source = False refreshed_source = False

View file

@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# update.py - part of the FDroid server tools # update.py - part of the FDroid server tools
# Copyright (C) 2010-11, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2010-12, Ciaran Gultnieks, ciaran@ciarang.com
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by # it under the terms of the GNU Affero General Public License as published by
@ -196,7 +196,7 @@ for app in apps:
if app['name'] is None: if app['name'] is None:
app['name'] = app['id'] app['name'] = app['id']
app['icon'] = '' app['icon'] = ''
if app['disabled'] is None: if app['Disabled'] is None:
print "WARNING: Application " + app['id'] + " has no packages" print "WARNING: Application " + app['id'] + " has no packages"
else: else:
if app['name'] is None: if app['name'] is None:
@ -283,14 +283,14 @@ apps_nopkg = 0
for app in apps: for app in apps:
if app['disabled'] is None: if app['Disabled'] is None:
# Get a list of the apks for this app... # Get a list of the apks for this app...
gotmarketver = False gotmarketver = False
apklist = [] apklist = []
for apk in apks: for apk in apks:
if apk['id'] == app['id']: if apk['id'] == app['id']:
if str(apk['versioncode']) == app['marketvercode']: if str(apk['versioncode']) == app['Market Version Code']:
gotmarketver = True gotmarketver = True
apklist.append(apk) apklist.append(apk)
@ -304,22 +304,22 @@ for app in apps:
addElement('id', app['id'], doc, apel) addElement('id', app['id'], doc, apel)
addElement('name', app['name'], doc, apel) addElement('name', app['name'], doc, apel)
addElement('summary', app['summary'], doc, apel) addElement('summary', app['Summary'], doc, apel)
addElement('icon', app['icon'], doc, apel) addElement('icon', app['icon'], doc, apel)
addElement('description', app['description'], doc, apel) addElement('description', app['Description'], doc, apel)
addElement('license', app['license'], doc, apel) addElement('license', app['License'], doc, apel)
if 'category' in app: if 'Category' in app:
addElement('category', app['category'], doc, apel) addElement('category', app['Category'], doc, apel)
addElement('web', app['web'], doc, apel) addElement('web', app['Web Site'], doc, apel)
addElement('source', app['source'], doc, apel) addElement('source', app['Source Code'], doc, apel)
addElement('tracker', app['tracker'], doc, apel) addElement('tracker', app['Issue Tracker'], doc, apel)
if app['donate'] != None: if app['Donate'] != None:
addElement('donate', app['donate'], doc, apel) addElement('donate', app['Donate'], doc, apel)
addElement('marketversion', app['marketversion'], doc, apel) addElement('marketversion', app['Market Version'], doc, apel)
addElement('marketvercode', app['marketvercode'], doc, apel) addElement('marketvercode', app['Market Version Code'], doc, apel)
if not (app['antifeatures'] is None): if not (app['AntiFeatures'] is None):
addElement('antifeatures', app['antifeatures'], doc, apel) addElement('antifeatures', app['AntiFeatures'], doc, apel)
if app['requiresroot']: if app['Requires Root']:
addElement('requirements', 'root', doc, apel) addElement('requirements', 'root', doc, apel)
# Sort the apk list into version order, just so the web site # Sort the apk list into version order, just so the web site
@ -370,38 +370,38 @@ for app in apps:
if options.buildreport: if options.buildreport:
if len(app['builds']) == 0: if len(app['builds']) == 0:
print ("WARNING: No builds defined for " + app['id'] + print ("WARNING: No builds defined for " + app['id'] +
" Source: " + app['source']) " Source: " + app['Source Code'])
warnings += 1 warnings += 1
else: else:
if app['marketvercode'] != '0': if app['Market Version Code'] != '0':
gotbuild = False gotbuild = False
for build in app['builds']: for build in app['builds']:
if build['vercode'] == app['marketvercode']: if build['vercode'] == app['Market Version Code']:
gotbuild = True gotbuild = True
if not gotbuild: if not gotbuild:
print ("WARNING: No build data for market version of " print ("WARNING: No build data for market version of "
+ app['id'] + " (" + app['marketversion'] + app['id'] + " (" + app['Market Version']
+ ") " + app['source']) + ") " + app['Source Code'])
warnings += 1 warnings += 1
# If we don't have the market version, check if there is a build # If we don't have the market version, check if there is a build
# with a commit ID starting with '!' - this means we can't build it # with a commit ID starting with '!' - this means we can't build it
# for some reason, and don't want hassling about it... # for some reason, and don't want hassling about it...
if not gotmarketver and app['marketvercode'] != '0': if not gotmarketver and app['Market Version Code'] != '0':
for build in app['builds']: for build in app['builds']:
if build['vercode'] == app['marketvercode']: if build['vercode'] == app['Market Version Code']:
gotmarketver = True gotmarketver = True
# Output a message of harassment if we don't have the market version: # Output a message of harassment if we don't have the market version:
if not gotmarketver and app['marketvercode'] != '0': if not gotmarketver and app['Market Version Code'] != '0':
addr = app['source'] addr = app['Source Code']
print "WARNING: Don't have market version (" + app['marketversion'] + ") of " + app['name'] print "WARNING: Don't have market version (" + app['Market Version'] + ") of " + app['name']
print " (" + app['id'] + ") " + addr print " (" + app['id'] + ") " + addr
warnings += 1 warnings += 1
if options.verbose: if options.verbose:
# A bit of extra debug info, basically for diagnosing # A bit of extra debug info, basically for diagnosing
# app developer mistakes: # app developer mistakes:
print " Market vercode:" + app['marketvercode'] print " Market vercode:" + app['Market Version Code']
print " Got:" print " Got:"
for apk in apks: for apk in apks:
if apk['id'] == app['id']: if apk['id'] == app['id']: