Grammalecte  Hex Artifact Content

Artifact dc81791c7eb451ae4bc717487baddab8153850c366d95ecc8dd5657ca7f12792:


0000: 23 20 55 73 65 66 75 6c 20 74 6f 6f 6c 73 0a 0a  # Useful tools..
0010: 69 6d 70 6f 72 74 20 6f 73 0a 69 6d 70 6f 72 74  import os.import
0020: 20 7a 69 70 66 69 6c 65 0a 0a 66 72 6f 6d 20 64   zipfile..from d
0030: 69 73 74 75 74 69 6c 73 20 69 6d 70 6f 72 74 20  istutils import 
0040: 64 69 72 5f 75 74 69 6c 2c 20 66 69 6c 65 5f 75  dir_util, file_u
0050: 74 69 6c 0a 66 72 6f 6d 20 73 74 72 69 6e 67 20  til.from string 
0060: 69 6d 70 6f 72 74 20 54 65 6d 70 6c 61 74 65 0a  import Template.
0070: 0a 0a 63 6c 61 73 73 20 63 64 3a 0a 20 20 20 20  ..class cd:.    
0080: 22 43 6f 6e 74 65 78 74 20 6d 61 6e 61 67 65 72  "Context manager
0090: 20 66 6f 72 20 63 68 61 6e 67 69 6e 67 20 74 68   for changing th
00a0: 65 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  e current workin
00b0: 67 20 64 69 72 65 63 74 6f 72 79 22 0a 20 20 20  g directory".   
00c0: 20 64 65 66 20 5f 5f 69 6e 69 74 5f 5f 20 28 73   def __init__ (s
00d0: 65 6c 66 2c 20 6e 65 77 50 61 74 68 29 3a 0a 20  elf, newPath):. 
00e0: 20 20 20 20 20 20 20 73 65 6c 66 2e 6e 65 77 50         self.newP
00f0: 61 74 68 20 3d 20 6f 73 2e 70 61 74 68 2e 65 78  ath = os.path.ex
0100: 70 61 6e 64 75 73 65 72 28 6e 65 77 50 61 74 68  panduser(newPath
0110: 29 0a 0a 20 20 20 20 64 65 66 20 5f 5f 65 6e 74  )..    def __ent
0120: 65 72 5f 5f 20 28 73 65 6c 66 29 3a 0a 20 20 20  er__ (self):.   
0130: 20 20 20 20 20 73 65 6c 66 2e 73 61 76 65 64 50       self.savedP
0140: 61 74 68 20 3d 20 6f 73 2e 67 65 74 63 77 64 28  ath = os.getcwd(
0150: 29 0a 20 20 20 20 20 20 20 20 6f 73 2e 63 68 64  ).        os.chd
0160: 69 72 28 73 65 6c 66 2e 6e 65 77 50 61 74 68 29  ir(self.newPath)
0170: 0a 0a 20 20 20 20 64 65 66 20 5f 5f 65 78 69 74  ..    def __exit
0180: 5f 5f 20 28 73 65 6c 66 2c 20 65 74 79 70 65 2c  __ (self, etype,
0190: 20 76 61 6c 75 65 2c 20 74 72 61 63 65 62 61 63   value, tracebac
01a0: 6b 29 3a 0a 20 20 20 20 20 20 20 20 6f 73 2e 63  k):.        os.c
01b0: 68 64 69 72 28 73 65 6c 66 2e 73 61 76 65 64 50  hdir(self.savedP
01c0: 61 74 68 29 0a 0a 0a 64 65 66 20 75 6e 7a 69 70  ath)...def unzip
01d0: 20 28 73 70 66 5a 69 70 2c 20 73 70 44 65 73 74   (spfZip, spDest
01e0: 2c 20 62 43 72 65 61 74 65 50 61 74 68 3d 46 61  , bCreatePath=Fa
01f0: 6c 73 65 29 3a 0a 20 20 20 20 22 75 6e 7a 69 70  lse):.    "unzip
0200: 20 66 69 6c 65 20 3c 73 70 66 5a 69 70 3e 20 61   file <spfZip> a
0210: 74 20 3c 73 70 66 44 65 73 74 3e 22 0a 20 20 20  t <spfDest>".   
0220: 20 69 66 20 73 70 44 65 73 74 3a 0a 20 20 20 20   if spDest:.    
0230: 20 20 20 20 69 66 20 62 43 72 65 61 74 65 50 61      if bCreatePa
0240: 74 68 20 61 6e 64 20 6e 6f 74 20 6f 73 2e 70 61  th and not os.pa
0250: 74 68 2e 65 78 69 73 74 73 28 73 70 44 65 73 74  th.exists(spDest
0260: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ):.            d
0270: 69 72 5f 75 74 69 6c 2e 6d 6b 70 61 74 68 28 73  ir_util.mkpath(s
0280: 70 44 65 73 74 29 0a 20 20 20 20 20 20 20 20 70  pDest).        p
0290: 72 69 6e 74 28 22 3e 20 75 6e 7a 69 70 20 69 6e  rint("> unzip in
02a0: 3a 20 22 2b 20 73 70 44 65 73 74 29 0a 20 20 20  : "+ spDest).   
02b0: 20 20 20 20 20 73 70 49 6e 73 74 61 6c 6c 20 3d       spInstall =
02c0: 20 6f 73 2e 70 61 74 68 2e 61 62 73 70 61 74 68   os.path.abspath
02d0: 28 73 70 44 65 73 74 29 0a 20 20 20 20 20 20 20  (spDest).       
02e0: 20 69 66 20 6f 73 2e 70 61 74 68 2e 69 73 64 69   if os.path.isdi
02f0: 72 28 73 70 49 6e 73 74 61 6c 6c 29 3a 0a 20 20  r(spInstall):.  
0300: 20 20 20 20 20 20 20 20 20 20 65 72 61 73 65 46            eraseF
0310: 6f 6c 64 65 72 28 73 70 49 6e 73 74 61 6c 6c 29  older(spInstall)
0320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 69 74  .            wit
0330: 68 20 7a 69 70 66 69 6c 65 2e 5a 69 70 46 69 6c  h zipfile.ZipFil
0340: 65 28 73 70 66 5a 69 70 29 20 61 73 20 68 5a 69  e(spfZip) as hZi
0350: 70 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p:.             
0360: 20 20 20 68 5a 69 70 2e 65 78 74 72 61 63 74 61     hZip.extracta
0370: 6c 6c 28 73 70 44 65 73 74 29 0a 20 20 20 20 20  ll(spDest).     
0380: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
0390: 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 66 6f       print("# fo
03a0: 6c 64 65 72 20 6e 6f 74 20 66 6f 75 6e 64 22 29  lder not found")
03b0: 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20  .    else:.     
03c0: 20 20 20 70 72 69 6e 74 28 22 70 61 74 68 20 64     print("path d
03d0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65 6d  estination is em
03e0: 70 74 79 22 29 0a 0a 0a 64 65 66 20 65 72 61 73  pty")...def eras
03f0: 65 46 6f 6c 64 65 72 20 28 73 70 29 3a 0a 20 20  eFolder (sp):.  
0400: 20 20 22 65 72 61 73 65 20 63 6f 6e 74 65 6e 74    "erase content
0410: 20 6f 66 20 61 20 66 6f 6c 64 65 72 22 0a 20 20   of a folder".  
0420: 20 20 23 20 72 65 63 75 72 73 69 76 65 21 21 21    # recursive!!!
0430: 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f  .    for sf in o
0440: 73 2e 6c 69 73 74 64 69 72 28 73 70 29 3a 0a 20  s.listdir(sp):. 
0450: 20 20 20 20 20 20 20 73 70 66 20 3d 20 73 70 20         spf = sp 
0460: 2b 20 22 2f 22 20 2b 20 73 66 0a 20 20 20 20 20  + "/" + sf.     
0470: 20 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69 73     if os.path.is
0480: 64 69 72 28 73 70 66 29 3a 0a 20 20 20 20 20 20  dir(spf):.      
0490: 20 20 20 20 20 20 65 72 61 73 65 46 6f 6c 64 65        eraseFolde
04a0: 72 28 73 70 66 29 0a 20 20 20 20 20 20 20 20 65  r(spf).        e
04b0: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
04c0: 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20   try:.          
04d0: 20 20 20 20 20 20 6f 73 2e 72 65 6d 6f 76 65 28        os.remove(
04e0: 73 70 66 29 0a 20 20 20 20 20 20 20 20 20 20 20  spf).           
04f0: 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20 20 20   except:.       
0500: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
0510: 25 73 20 6e 6f 74 20 72 65 6d 6f 76 65 64 22 20  %s not removed" 
0520: 25 20 73 70 66 29 0a 0a 0a 64 65 66 20 63 72 65  % spf)...def cre
0530: 61 74 65 43 6c 65 61 6e 46 6f 6c 64 65 72 20 28  ateCleanFolder (
0540: 73 70 29 3a 0a 20 20 20 20 22 6d 61 6b 65 20 61  sp):.    "make a
0550: 6e 20 65 6d 70 74 79 20 66 6f 6c 64 65 72 20 6f  n empty folder o
0560: 72 20 65 72 61 73 65 20 69 74 73 20 63 6f 6e 74  r erase its cont
0570: 65 6e 74 20 69 66 20 6e 6f 74 20 65 6d 70 74 79  ent if not empty
0580: 22 0a 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e  ".    if not os.
0590: 70 61 74 68 2e 65 78 69 73 74 73 28 73 70 29 3a  path.exists(sp):
05a0: 0a 20 20 20 20 20 20 20 20 64 69 72 5f 75 74 69  .        dir_uti
05b0: 6c 2e 6d 6b 70 61 74 68 28 73 70 29 0a 20 20 20  l.mkpath(sp).   
05c0: 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 65   else:.        e
05d0: 72 61 73 65 46 6f 6c 64 65 72 28 73 70 29 0a 0a  raseFolder(sp)..
05e0: 0a 64 65 66 20 66 69 6c 65 46 69 6c 65 20 28 73  .def fileFile (s
05f0: 70 66 2c 20 64 56 61 72 73 29 3a 0a 20 20 20 20  pf, dVars):.    
0600: 22 72 65 74 75 72 6e 20 66 69 6c 65 20 3c 73 70  "return file <sp
0610: 66 3e 20 61 73 20 61 20 74 65 78 74 20 66 69 6c  f> as a text fil
0620: 65 64 20 77 69 74 68 20 76 61 72 69 61 62 6c 65  ed with variable
0630: 73 20 66 72 6f 6d 20 3c 64 56 61 72 73 3e 22 0a  s from <dVars>".
0640: 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d 70 6c      return Templ
0650: 61 74 65 28 6f 70 65 6e 28 73 70 66 2c 20 22 72  ate(open(spf, "r
0660: 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66  ", encoding="utf
0670: 2d 38 22 29 2e 72 65 61 64 28 29 29 2e 73 61 66  -8").read()).saf
0680: 65 5f 73 75 62 73 74 69 74 75 74 65 28 64 56 61  e_substitute(dVa
0690: 72 73 29 0a 0a 0a 64 65 66 20 63 6f 70 79 41 6e  rs)...def copyAn
06a0: 64 46 69 6c 65 54 65 6d 70 6c 61 74 65 20 28 73  dFileTemplate (s
06b0: 70 66 53 72 63 2c 20 73 70 66 44 73 74 2c 20 64  pfSrc, spfDst, d
06c0: 56 61 72 73 29 3a 0a 20 20 20 20 22 77 72 69 74  Vars):.    "writ
06d0: 65 20 66 69 6c 65 20 3c 73 70 66 53 72 63 3e 20  e file <spfSrc> 
06e0: 61 73 20 3c 73 70 66 44 73 74 3e 20 77 69 74 68  as <spfDst> with
06f0: 20 76 61 72 69 61 62 6c 65 73 20 66 69 6c 65 64   variables filed
0700: 20 77 69 74 68 20 3c 64 56 61 72 73 3e 22 0a 20   with <dVars>". 
0710: 20 20 20 73 20 3d 20 54 65 6d 70 6c 61 74 65 28     s = Template(
0720: 6f 70 65 6e 28 73 70 66 53 72 63 2c 20 22 72 22  open(spfSrc, "r"
0730: 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d  , encoding="utf-
0740: 38 22 29 2e 72 65 61 64 28 29 29 2e 73 61 66 65  8").read()).safe
0750: 5f 73 75 62 73 74 69 74 75 74 65 28 64 56 61 72  _substitute(dVar
0760: 73 29 0a 20 20 20 20 6f 70 65 6e 28 73 70 66 44  s).    open(spfD
0770: 73 74 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69 6e  st, "w", encodin
0780: 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c 69  g="utf-8", newli
0790: 6e 65 3d 22 5c 6e 22 29 2e 77 72 69 74 65 28 73  ne="\n").write(s
07a0: 29 0a 0a 0a 64 65 66 20 61 64 64 46 6f 6c 64 65  )...def addFolde
07b0: 72 54 6f 5a 69 70 41 6e 64 46 69 6c 65 46 69 6c  rToZipAndFileFil
07c0: 65 20 28 68 5a 69 70 2c 20 73 70 53 72 63 2c 20  e (hZip, spSrc, 
07d0: 73 70 44 73 74 2c 20 64 56 61 72 73 2c 20 62 52  spDst, dVars, bR
07e0: 65 63 75 72 73 69 76 65 29 3a 0a 20 20 20 20 23  ecursive):.    #
07f0: 20 72 65 63 75 72 73 69 76 65 20 66 75 6e 63 74   recursive funct
0800: 69 6f 6e 0a 20 20 20 20 73 70 53 72 63 20 3d 20  ion.    spSrc = 
0810: 73 70 53 72 63 2e 73 74 72 69 70 28 22 2f 20 22  spSrc.strip("/ "
0820: 29 0a 20 20 20 20 73 70 44 73 74 20 3d 20 73 70  ).    spDst = sp
0830: 44 73 74 2e 73 74 72 69 70 28 22 2f 20 22 29 0a  Dst.strip("/ ").
0840: 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73      for sf in os
0850: 2e 6c 69 73 74 64 69 72 28 73 70 53 72 63 29 3a  .listdir(spSrc):
0860: 0a 20 20 20 20 20 20 20 20 73 70 66 53 72 63 20  .        spfSrc 
0870: 3d 20 28 73 70 53 72 63 20 2b 20 22 2f 22 20 2b  = (spSrc + "/" +
0880: 20 73 66 29 2e 73 74 72 69 70 28 22 2f 20 22 29   sf).strip("/ ")
0890: 0a 20 20 20 20 20 20 20 20 73 70 66 44 73 74 20  .        spfDst 
08a0: 3d 20 28 73 70 44 73 74 20 2b 20 22 2f 22 20 2b  = (spDst + "/" +
08b0: 20 73 66 29 2e 73 74 72 69 70 28 22 2f 20 22 29   sf).strip("/ ")
08c0: 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73 2e 70  .        if os.p
08d0: 61 74 68 2e 69 73 64 69 72 28 73 70 66 53 72 63  ath.isdir(spfSrc
08e0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ):.            i
08f0: 66 20 62 52 65 63 75 72 73 69 76 65 3a 0a 20 20  f bRecursive:.  
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
0910: 64 46 6f 6c 64 65 72 54 6f 5a 69 70 41 6e 64 46  dFolderToZipAndF
0920: 69 6c 65 46 69 6c 65 28 68 5a 69 70 2c 20 73 70  ileFile(hZip, sp
0930: 66 53 72 63 2c 20 73 70 66 44 73 74 2c 20 64 56  fSrc, spfDst, dV
0940: 61 72 73 2c 20 62 52 65 63 75 72 73 69 76 65 29  ars, bRecursive)
0950: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20  .        else:. 
0960: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 70             if sp
0970: 66 53 72 63 2e 65 6e 64 73 77 69 74 68 28 28 22  fSrc.endswith(("
0980: 2e 63 73 73 22 2c 20 22 2e 6a 73 22 2c 20 22 2e  .css", ".js", ".
0990: 78 63 75 22 2c 20 22 2e 78 75 6c 22 2c 20 22 2e  xcu", ".xul", ".
09a0: 72 64 66 22 2c 20 22 2e 64 74 64 22 2c 20 22 2e  rdf", ".dtd", ".
09b0: 70 72 6f 70 65 72 74 69 65 73 22 29 29 3a 0a 20  properties")):. 
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
09d0: 70 72 69 6e 74 28 73 70 66 53 72 63 20 2b 20 22  print(spfSrc + "
09e0: 20 3e 20 22 20 2b 20 73 70 66 44 73 74 29 0a 20   > " + spfDst). 
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
0a00: 5a 69 70 2e 77 72 69 74 65 73 74 72 28 73 70 66  Zip.writestr(spf
0a10: 44 73 74 2c 20 66 69 6c 65 46 69 6c 65 28 73 70  Dst, fileFile(sp
0a20: 66 53 72 63 2c 20 64 56 61 72 73 29 29 0a 20 20  fSrc, dVars)).  
0a30: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a            else:.
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 23 70 72 69 6e 74 28 73 70 66 53 72 63 20 2b 20  #print(spfSrc + 
0a60: 22 20 3e 20 22 20 2b 20 73 70 66 44 73 74 29 0a  " > " + spfDst).
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 68 5a 69 70 2e 77 72 69 74 65 28 73 70 66 53 72  hZip.write(spfSr
0a90: 63 2c 20 73 70 66 44 73 74 29 0a                 c, spfDst).