From 29c244efe66295c168ac16e910862ce1632eb8b9 Mon Sep 17 00:00:00 2001
From: "Silas S. Brown" <ssb22@cam.ac.uk>
Date: Tue, 30 Apr 2019 08:05:29 +0100
Subject: [PATCH] Update Annotator Generator

---
 annogen.py | 34 +++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 13 deletions(-)

diff --git a/annogen.py b/annogen.py
index 157634f..438aec4 100755
--- a/annogen.py
+++ b/annogen.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python2
 
-program_name = "Annotator Generator v0.6589 (c) 2012-19 Silas S. Brown"
+program_name = "Annotator Generator v0.659 (c) 2012-19 Silas S. Brown"
 
 # See http://people.ds.cam.ac.uk/ssb22/adjuster/annogen.html
 
@@ -4394,24 +4394,23 @@ def outputParser(rulesAndConds):
       # started reading from its output.
       global toReannotateSet, reannotateDict
       l = [ll for ll in toReannotateSet if ll and not "\n" in ll] # TODO: handle the case where "\n" is in ll?  (shouldn't happen in 'sensible' annotators)
-      def reader_thread():
-        global threadReading,threadRead
-        threadReading = True
-        threadRead = cout.read().decode(outcode).splitlines() # TODO: reannotatorCode instead of outcode?
+      def reader_thread(comms):
+        comms[0] = True
+        comms[1] = cout.read().decode(outcode).splitlines() # TODO: reannotatorCode instead of outcode?
       if reannotator.startswith('##'): cmd=reannotator[2:]
       elif reannotator[0]=='#': cmd=reannotator[1:]
       else: cmd = reannotator
       import thread ; sys.setcheckinterval(100)
       global cout ; cin,cout = os.popen2(cmd)
-      global threadReading,threadRead ; threadReading=threadRead=False
-      thread.start_new_thread(reader_thread,())
-      while threadReading == False: time.sleep(0.1)
+      comms = [False,False]
+      thread.start_new_thread(reader_thread,(comms,))
+      while comms[0] == False: time.sleep(0.1)
       # NOW ready to start writing:
       cin.write("\n".join(l).encode(outcode)+"\n") ; cin.close() # TODO: reannotatorCode instead of outcode?
-      while threadRead == False: time.sleep(1)
-      l2 = threadRead
+      while comms[1] == False: time.sleep(1)
+      l2 = comms[1]
       sys.setcheckinterval(32767)
-      del cin,cout,cmd,threadRead
+      del cin,cout,cmd,comms
       while len(l2)>len(l) and not l2[-1]: del l2[-1] # don't mind extra blank line(s) at end of output
       if not len(l)==len(l2):
         open('reannotator-debug-in.txt','w').write("\n".join(l).encode(outcode)+"\n")
@@ -4731,7 +4730,14 @@ if main:
      rm_f("../"+dirName0+".apk") ; cmd_or_exit("$BUILD_TOOLS/zipalign 4 bin/"+dirName+".apk ../"+dirName+".apk")
      rm_f("bin/"+dirName0+".ap_")
      rm_f("bin/"+dirName0+".apk")
-     cmd_or_exit("du -h ../"+dirName+".apk")
+     if 'SERVICE_ACCOUNT_KEY' in os.environ:
+       import httplib2,googleapiclient.discovery,oauth2client.service_account
+       service = googleapiclient.discovery.build('androidpublisher', 'v2', http=oauth2client.service_account.ServiceAccountCredentials.from_json_keyfile_name(os.environ['SERVICE_ACCOUNT_KEY'],'https://www.googleapis.com/auth/androidpublisher').authorize(httplib2.Http()))
+       eId = service.edits().insert(body={},packageName=jPackage).execute()['id']
+       v = service.edits().apks().upload(editId=eId,packageName=jPackage,media_body="../"+dirName+".apk").execute()['versionCode'] ; sys.stderr.write("Uploaded "+dirName+".apk (version code "+str(v)+")\n")
+       service.edits().tracks().update(editId=eId,track='beta',packageName=jPackage,body={u'versionCodes':[v]}).execute()
+       sys.stderr.write("Committed edit %s: %s.apk v%s to beta\n" % (service.edits().commit(editId=eId,packageName=jPackage).execute()['id'],dirName,v))
+     else: cmd_or_exit("du -h ../"+dirName+".apk")
    else: sys.stderr.write("Android source has been written to "+jSrc[:-3]+"""
 (You might need to change targetSdkVersion in AndroidManifest.xml if
    your SDK insists on a different target version)
@@ -4741,10 +4747,12 @@ before the Annogen run (change the examples obviously) :
    export NDK=/usr/local/android-ndk-r10c # if using --ndk and it's not in $SDK/ndk-bundle or on PATH
    export PLATFORM=$SDK/platforms/android-19
    export BUILD_TOOLS=$SDK/build-tools/21.0.2
+   # To get a release build, additionally set:
    export KEYSTORE_FILE=/path/to/keystore
    export KEYSTORE_USER='your user name'
    export KEYSTORE_PASS='your password'
-   # (if the KEYSTORE variables are unset, you'll get a 'debug' build)
+   # To upload the release to Google Play, additionally set:
+   export SERVICE_ACCOUNT_KEY=/path/to/api-*.json
 
 You may also wish to create some icons in res/drawable*
    (using Android Studio or the earlier ADT tools)
-- 
GitLab