File: android-deltas-sync/initial-copy-part2-phone.py

#!/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)



[Home page] Books Code Blog Python Author Train Find ©M.Lutz