#!/data/data/com.termux/files/usr/bin/python3 #!/usr/bin/env python3 <= fails in Termux:Widget (see also _etc shims) """ ======================================================================= Initial Copy to Phone, Part 2: Phone Run initial copies once, to propagate full content from PC to phone. Later, run syncs to propagate just changes to the phone on demand, and phone verifies and exports as desired. See _README.html for license, attribution, version, and docs. ----------------------------------------------------------------------- Usage: Run this on your phone second (after running Part 1 on your PC), with: python3 initial-copy-part2-phone.py Run this from the Termux app's console, or any other app with a console terminal. This file may also be run with no command line from a Python IDE app (e.g., Pydroid 3 or QPython), and/or a home-screen shortcut or widget (e.g., Termux:Widget). Run this from any folder. It uses paths set in config_phone.py, and finds that and common.py in its own folder automatically. Step runtimes are shown in the console after step completion. Step outputs go to files in LOGS; watch with 'tail -f LOGS/file'. ----------------------------------------------------------------------- Notes: 0) "PC" here means a Windows, macOS, or Linux device, but "phone" can be anything: though designed to sync changes to Android 11 and later, these scripts can also sync to earlier Androids and PCs. 1) Heritage: this is a Python translation of a same-named Bash script in folder _etc/bash-version/; hence the too-many globals. Translated for Windows portability: Cygwin and WSL have seams. The Bash originals more explicitly show command lines run here. 2) Caveat: this script requires space for both content and its uncompressed zip on the phone - essentially twice the size of content. If space is tight, manually copy content from proxy to phone, using an Android file explorer. 3) Coding: using a f'''..{STUFF}..{FROM}..''' string is tempting here, but would make Python 3.6 a minimum requirement, and the vars() scheme with dict keys seems just as good. As is, 3.5+ is needed for subprocess.run(), and that's from just 6 years ago. ======================================================================= """ import os, sys, shutil from os.path import join import config_phone, common # get phone settings and common code common.startup(config_phone, common) # copy and use phone config's settings from common import * # use both's top-level names as globals # subjects thezip = join(FROM, STUFF) + '.zip' # where user copies zipfile on phone thedst = join(TO, STUFF) # where content is stored on phone # nothing extra to verify here: subjects are created opener('Copying:\nfrom %s\nto %s\nlogs %s' % (thezip, thedst, LOGS)) #---------------------------------------------------------------- # 1) Copy content zip from proxy to phone with an explorer app #---------------------------------------------------------------- # Choose your app (but not Termux: POSIX cannot access USB in 11) msg = """ Manually copy or move %(STUFF)s.zip from the root of the USB drive to %(FROM)s using any Android file-explorer app with suitable storage permissions. """ % vars() print(msg) input('Press enter/return here when the copy is finished...') # did the copy work? if not os.path.isfile(thezip): print('Content zip not found at "%s"' % thezip) print('Please rerun this script to try again.') shutdown(bad=True) #---------------------------------------------------------------- # 2) Unzip content on phone with [zip-extract.py] in Termux #---------------------------------------------------------------- announce('Unzipping content on phone') logto = join(LOGS, '%s--init-1-unzip-log.txt' % DATE) # delete an existing content tree, iff approved removeExistingOrStop(thedst, 'phone') # perms may disable updates in app-specific storage permissions = ('-permissions',) if UnixPermissions else () runpy(join(ZIP, 'zip-extract.py'), thezip, TO, *permissions, # makes TO/STUFF == thedst logpath=logto, tailing=(1, 'Zip extract summary')) #---------------------------------------------------------------- # 3) Cleanup content zip on phone in Termux #---------------------------------------------------------------- # On-phone zip; user may have copied or moved the proxy zip, but can't check here print('Removing content zip from phone (remove manually from proxy as needed)') timefunc(lambda: os.remove(thezip)) #---------------------------------------------------------------- # Configurable: hook for custom post-propagate steps #---------------------------------------------------------------- import z_postcopy_hook_phone # no need for runpy() in __file__ here closer('See logs in "%s".' % LOGS)