Grammalecte  Hex Artifact Content

Artifact 226a504fe3c7cccfc1ce95c560aac0015eba9332567b25ae539fa369c4de84a0:


0000: 22 22 22 0a 54 6f 6f 6c 73 20 66 6f 72 20 68 61  """.Tools for ha
0010: 6e 64 6c 69 6e 67 20 66 69 6c 65 73 0a 22 22 22  ndling files."""
0020: 0a 0a 69 6d 70 6f 72 74 20 6f 73 0a 69 6d 70 6f  ..import os.impo
0030: 72 74 20 73 68 75 74 69 6c 0a 69 6d 70 6f 72 74  rt shutil.import
0040: 20 65 72 72 6e 6f 0a 69 6d 70 6f 72 74 20 7a 69   errno.import zi
0050: 70 66 69 6c 65 0a 0a 66 72 6f 6d 20 73 74 72 69  pfile..from stri
0060: 6e 67 20 69 6d 70 6f 72 74 20 54 65 6d 70 6c 61  ng import Templa
0070: 74 65 0a 0a 0a 63 6c 61 73 73 20 43 44 3a 0a 20  te...class CD:. 
0080: 20 20 20 22 43 6f 6e 74 65 78 74 20 6d 61 6e 61     "Context mana
0090: 67 65 72 20 66 6f 72 20 63 68 61 6e 67 69 6e 67  ger for changing
00a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 6f 72   the current wor
00b0: 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 22 0a  king directory".
00c0: 20 20 20 20 64 65 66 20 5f 5f 69 6e 69 74 5f 5f      def __init__
00d0: 20 28 73 65 6c 66 2c 20 6e 65 77 50 61 74 68 29   (self, newPath)
00e0: 3a 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 6e  :.        self.n
00f0: 65 77 50 61 74 68 20 3d 20 6f 73 2e 70 61 74 68  ewPath = os.path
0100: 2e 65 78 70 61 6e 64 75 73 65 72 28 6e 65 77 50  .expanduser(newP
0110: 61 74 68 29 0a 20 20 20 20 20 20 20 20 73 65 6c  ath).        sel
0120: 66 2e 73 61 76 65 64 50 61 74 68 20 3d 20 22 22  f.savedPath = ""
0130: 0a 0a 20 20 20 20 64 65 66 20 5f 5f 65 6e 74 65  ..    def __ente
0140: 72 5f 5f 20 28 73 65 6c 66 29 3a 0a 20 20 20 20  r__ (self):.    
0150: 20 20 20 20 73 65 6c 66 2e 73 61 76 65 64 50 61      self.savedPa
0160: 74 68 20 3d 20 6f 73 2e 67 65 74 63 77 64 28 29  th = os.getcwd()
0170: 0a 20 20 20 20 20 20 20 20 6f 73 2e 63 68 64 69  .        os.chdi
0180: 72 28 73 65 6c 66 2e 6e 65 77 50 61 74 68 29 0a  r(self.newPath).
0190: 0a 20 20 20 20 64 65 66 20 5f 5f 65 78 69 74 5f  .    def __exit_
01a0: 5f 20 28 73 65 6c 66 2c 20 65 74 79 70 65 2c 20  _ (self, etype, 
01b0: 76 61 6c 75 65 2c 20 74 72 61 63 65 62 61 63 6b  value, traceback
01c0: 29 3a 0a 20 20 20 20 20 20 20 20 6f 73 2e 63 68  ):.        os.ch
01d0: 64 69 72 28 73 65 6c 66 2e 73 61 76 65 64 50 61  dir(self.savedPa
01e0: 74 68 29 0a 0a 0a 64 65 66 20 75 6e 7a 69 70 20  th)...def unzip 
01f0: 28 73 70 66 5a 69 70 2c 20 73 70 44 65 73 74 2c  (spfZip, spDest,
0200: 20 62 43 72 65 61 74 65 50 61 74 68 3d 46 61 6c   bCreatePath=Fal
0210: 73 65 29 3a 0a 20 20 20 20 22 75 6e 7a 69 70 20  se):.    "unzip 
0220: 66 69 6c 65 20 3c 73 70 66 5a 69 70 3e 20 61 74  file <spfZip> at
0230: 20 3c 73 70 66 44 65 73 74 3e 22 0a 20 20 20 20   <spfDest>".    
0240: 69 66 20 73 70 44 65 73 74 3a 0a 20 20 20 20 20  if spDest:.     
0250: 20 20 20 69 66 20 62 43 72 65 61 74 65 50 61 74     if bCreatePat
0260: 68 20 61 6e 64 20 6e 6f 74 20 6f 73 2e 70 61 74  h and not os.pat
0270: 68 2e 65 78 69 73 74 73 28 73 70 44 65 73 74 29  h.exists(spDest)
0280: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  :.            os
0290: 2e 6d 61 6b 65 64 69 72 73 28 73 70 44 65 73 74  .makedirs(spDest
02a0: 2c 20 65 78 69 73 74 5f 6f 6b 3d 54 72 75 65 29  , exist_ok=True)
02b0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22  .        print("
02c0: 3e 20 75 6e 7a 69 70 20 69 6e 3a 20 22 2b 20 73  > unzip in: "+ s
02d0: 70 44 65 73 74 29 0a 20 20 20 20 20 20 20 20 73  pDest).        s
02e0: 70 49 6e 73 74 61 6c 6c 20 3d 20 6f 73 2e 70 61  pInstall = os.pa
02f0: 74 68 2e 61 62 73 70 61 74 68 28 73 70 44 65 73  th.abspath(spDes
0300: 74 29 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73  t).        if os
0310: 2e 70 61 74 68 2e 69 73 64 69 72 28 73 70 49 6e  .path.isdir(spIn
0320: 73 74 61 6c 6c 29 3a 0a 20 20 20 20 20 20 20 20  stall):.        
0330: 20 20 20 20 65 72 61 73 65 46 6f 6c 64 65 72 28      eraseFolder(
0340: 73 70 49 6e 73 74 61 6c 6c 29 0a 20 20 20 20 20  spInstall).     
0350: 20 20 20 20 20 20 20 77 69 74 68 20 7a 69 70 66         with zipf
0360: 69 6c 65 2e 5a 69 70 46 69 6c 65 28 73 70 66 5a  ile.ZipFile(spfZ
0370: 69 70 29 20 61 73 20 68 5a 69 70 3a 0a 20 20 20  ip) as hZip:.   
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69               hZi
0390: 70 2e 65 78 74 72 61 63 74 61 6c 6c 28 73 70 44  p.extractall(spD
03a0: 65 73 74 29 0a 20 20 20 20 20 20 20 20 65 6c 73  est).        els
03b0: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e:.            p
03c0: 72 69 6e 74 28 22 23 20 66 6f 6c 64 65 72 20 3c  rint("# folder <
03d0: 22 20 2b 20 73 70 44 65 73 74 20 2b 20 22 3e 20  " + spDest + "> 
03e0: 6e 6f 74 20 66 6f 75 6e 64 22 29 0a 20 20 20 20  not found").    
03f0: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 70 72  else:.        pr
0400: 69 6e 74 28 22 70 61 74 68 20 64 65 73 74 69 6e  int("path destin
0410: 61 74 69 6f 6e 20 69 73 20 65 6d 70 74 79 22 29  ation is empty")
0420: 0a 0a 0a 64 65 66 20 65 72 61 73 65 46 6f 6c 64  ...def eraseFold
0430: 65 72 20 28 73 70 29 3a 0a 20 20 20 20 22 65 72  er (sp):.    "er
0440: 61 73 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ase content of a
0450: 20 66 6f 6c 64 65 72 22 0a 20 20 20 20 66 6f 72   folder".    for
0460: 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69   sf in os.listdi
0470: 72 28 73 70 29 3a 0a 20 20 20 20 20 20 20 20 73  r(sp):.        s
0480: 70 66 20 3d 20 6f 73 2e 70 61 74 68 2e 6a 6f 69  pf = os.path.joi
0490: 6e 28 73 70 2c 20 73 66 29 0a 20 20 20 20 20 20  n(sp, sf).      
04a0: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
04b0: 20 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69 73     if os.path.is
04c0: 66 69 6c 65 28 73 70 66 29 3a 0a 20 20 20 20 20  file(spf):.     
04d0: 20 20 20 20 20 20 20 20 20 20 20 6f 73 2e 75 6e             os.un
04e0: 6c 69 6e 6b 28 73 70 66 29 0a 20 20 20 20 20 20  link(spf).      
04f0: 20 20 20 20 20 20 65 6c 69 66 20 6f 73 2e 70 61        elif os.pa
0500: 74 68 2e 69 73 64 69 72 28 73 70 66 29 3a 0a 20  th.isdir(spf):. 
0510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0520: 68 75 74 69 6c 2e 72 6d 74 72 65 65 28 73 70 66  hutil.rmtree(spf
0530: 29 0a 20 20 20 20 20 20 20 20 65 78 63 65 70 74  ).        except
0540: 20 28 4f 53 45 72 72 6f 72 2c 20 73 68 75 74 69   (OSError, shuti
0550: 6c 2e 45 72 72 6f 72 29 20 61 73 20 65 3a 0a 20  l.Error) as e:. 
0560: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
0570: 28 65 29 0a 0a 0a 64 65 66 20 63 72 65 61 74 65  (e)...def create
0580: 43 6c 65 61 6e 46 6f 6c 64 65 72 20 28 73 70 29  CleanFolder (sp)
0590: 3a 0a 20 20 20 20 22 6d 61 6b 65 20 61 6e 20 65  :.    "make an e
05a0: 6d 70 74 79 20 66 6f 6c 64 65 72 20 6f 72 20 65  mpty folder or e
05b0: 72 61 73 65 20 69 74 73 20 63 6f 6e 74 65 6e 74  rase its content
05c0: 20 69 66 20 6e 6f 74 20 65 6d 70 74 79 22 0a 20   if not empty". 
05d0: 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74     if not os.pat
05e0: 68 2e 65 78 69 73 74 73 28 73 70 29 3a 0a 20 20  h.exists(sp):.  
05f0: 20 20 20 20 20 20 6f 73 2e 6d 61 6b 65 64 69 72        os.makedir
0600: 73 28 73 70 2c 20 65 78 69 73 74 5f 6f 6b 3d 54  s(sp, exist_ok=T
0610: 72 75 65 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20  rue).    else:. 
0620: 20 20 20 20 20 20 20 65 72 61 73 65 46 6f 6c 64         eraseFold
0630: 65 72 28 73 70 29 0a 0a 0a 64 65 66 20 63 6f 70  er(sp)...def cop
0640: 79 46 6f 6c 64 65 72 43 6f 6e 74 65 6e 74 20 28  yFolderContent (
0650: 73 70 53 72 63 2c 20 73 70 44 73 74 29 3a 0a 20  spSrc, spDst):. 
0660: 20 20 20 22 63 6f 70 79 20 66 6f 6c 64 65 72 20     "copy folder 
0670: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 73 72 63  content from src
0680: 20 74 6f 20 64 73 74 22 0a 20 20 20 20 74 72 79   to dst".    try
0690: 3a 0a 20 20 20 20 20 20 20 20 73 68 75 74 69 6c  :.        shutil
06a0: 2e 63 6f 70 79 74 72 65 65 28 73 70 53 72 63 2c  .copytree(spSrc,
06b0: 20 73 70 44 73 74 29 0a 20 20 20 20 65 78 63 65   spDst).    exce
06c0: 70 74 20 4f 53 45 72 72 6f 72 20 61 73 20 65 3a  pt OSError as e:
06d0: 0a 20 20 20 20 20 20 20 20 69 66 20 65 2e 65 72  .        if e.er
06e0: 72 6e 6f 20 3d 3d 20 65 72 72 6e 6f 2e 45 4e 4f  rno == errno.ENO
06f0: 54 44 49 52 3a 0a 20 20 20 20 20 20 20 20 20 20  TDIR:.          
0700: 20 20 73 68 75 74 69 6c 2e 63 6f 70 79 28 73 70    shutil.copy(sp
0710: 53 72 63 2c 20 73 70 44 73 74 29 0a 20 20 20 20  Src, spDst).    
0720: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
0730: 20 20 20 20 20 20 72 61 69 73 65 0a 0a 0a 64 65        raise...de
0740: 66 20 66 69 6c 65 46 69 6c 65 20 28 73 70 66 2c  f fileFile (spf,
0750: 20 64 56 61 72 73 29 3a 0a 20 20 20 20 22 72 65   dVars):.    "re
0760: 74 75 72 6e 20 66 69 6c 65 20 3c 73 70 66 3e 20  turn file <spf> 
0770: 61 73 20 61 20 74 65 78 74 20 66 69 6c 65 64 20  as a text filed 
0780: 77 69 74 68 20 76 61 72 69 61 62 6c 65 73 20 66  with variables f
0790: 72 6f 6d 20 3c 64 56 61 72 73 3e 22 0a 20 20 20  rom <dVars>".   
07a0: 20 72 65 74 75 72 6e 20 54 65 6d 70 6c 61 74 65   return Template
07b0: 28 6f 70 65 6e 28 73 70 66 2c 20 22 72 22 2c 20  (open(spf, "r", 
07c0: 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22  encoding="utf-8"
07d0: 29 2e 72 65 61 64 28 29 29 2e 73 61 66 65 5f 73  ).read()).safe_s
07e0: 75 62 73 74 69 74 75 74 65 28 64 56 61 72 73 29  ubstitute(dVars)
07f0: 0a 0a 0a 64 65 66 20 63 6f 70 79 41 6e 64 46 69  ...def copyAndFi
0800: 6c 65 54 65 6d 70 6c 61 74 65 20 28 73 70 66 53  leTemplate (spfS
0810: 72 63 2c 20 73 70 66 44 73 74 2c 20 64 56 61 72  rc, spfDst, dVar
0820: 73 29 3a 0a 20 20 20 20 22 77 72 69 74 65 20 66  s):.    "write f
0830: 69 6c 65 20 3c 73 70 66 53 72 63 3e 20 61 73 20  ile <spfSrc> as 
0840: 3c 73 70 66 44 73 74 3e 20 77 69 74 68 20 76 61  <spfDst> with va
0850: 72 69 61 62 6c 65 73 20 66 69 6c 65 64 20 77 69  riables filed wi
0860: 74 68 20 3c 64 56 61 72 73 3e 22 0a 20 20 20 20  th <dVars>".    
0870: 73 20 3d 20 54 65 6d 70 6c 61 74 65 28 6f 70 65  s = Template(ope
0880: 6e 28 73 70 66 53 72 63 2c 20 22 72 22 2c 20 65  n(spfSrc, "r", e
0890: 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29  ncoding="utf-8")
08a0: 2e 72 65 61 64 28 29 29 2e 73 61 66 65 5f 73 75  .read()).safe_su
08b0: 62 73 74 69 74 75 74 65 28 64 56 61 72 73 29 0a  bstitute(dVars).
08c0: 20 20 20 20 6f 70 65 6e 28 73 70 66 44 73 74 2c      open(spfDst,
08d0: 20 22 77 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22   "w", encoding="
08e0: 75 74 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d  utf-8", newline=
08f0: 22 5c 6e 22 29 2e 77 72 69 74 65 28 73 29 0a 0a  "\n").write(s)..
0900: 0a 64 65 66 20 61 64 64 46 6f 6c 64 65 72 54 6f  .def addFolderTo
0910: 5a 69 70 41 6e 64 46 69 6c 65 46 69 6c 65 20 28  ZipAndFileFile (
0920: 68 5a 69 70 2c 20 73 70 53 72 63 2c 20 73 70 44  hZip, spSrc, spD
0930: 73 74 2c 20 64 56 61 72 73 2c 20 62 52 65 63 75  st, dVars, bRecu
0940: 72 73 69 76 65 29 3a 0a 20 20 20 20 22 61 64 64  rsive):.    "add
0950: 20 66 6f 6c 64 65 72 20 63 6f 6e 74 65 6e 74 20   folder content 
0960: 74 6f 20 7a 69 70 20 61 72 63 68 69 76 65 20 61  to zip archive a
0970: 6e 64 20 66 69 6c 65 20 66 69 6c 65 73 20 77 69  nd file files wi
0980: 74 68 20 3c 64 56 61 72 73 3e 22 0a 20 20 20 20  th <dVars>".    
0990: 23 20 72 65 63 75 72 73 69 76 65 20 66 75 6e 63  # recursive func
09a0: 74 69 6f 6e 0a 20 20 20 20 73 70 53 72 63 20 3d  tion.    spSrc =
09b0: 20 73 70 53 72 63 2e 73 74 72 69 70 28 22 2f 20   spSrc.strip("/ 
09c0: 22 29 0a 20 20 20 20 73 70 44 73 74 20 3d 20 73  ").    spDst = s
09d0: 70 44 73 74 2e 73 74 72 69 70 28 22 2f 20 22 29  pDst.strip("/ ")
09e0: 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f  .    for sf in o
09f0: 73 2e 6c 69 73 74 64 69 72 28 73 70 53 72 63 29  s.listdir(spSrc)
0a00: 3a 0a 20 20 20 20 20 20 20 20 73 70 66 53 72 63  :.        spfSrc
0a10: 20 3d 20 28 73 70 53 72 63 20 2b 20 22 2f 22 20   = (spSrc + "/" 
0a20: 2b 20 73 66 29 2e 73 74 72 69 70 28 22 2f 20 22  + sf).strip("/ "
0a30: 29 0a 20 20 20 20 20 20 20 20 73 70 66 44 73 74  ).        spfDst
0a40: 20 3d 20 28 73 70 44 73 74 20 2b 20 22 2f 22 20   = (spDst + "/" 
0a50: 2b 20 73 66 29 2e 73 74 72 69 70 28 22 2f 20 22  + sf).strip("/ "
0a60: 29 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73 2e  ).        if os.
0a70: 70 61 74 68 2e 69 73 64 69 72 28 73 70 66 53 72  path.isdir(spfSr
0a80: 63 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  c):.            
0a90: 69 66 20 62 52 65 63 75 72 73 69 76 65 3a 0a 20  if bRecursive:. 
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0ab0: 64 64 46 6f 6c 64 65 72 54 6f 5a 69 70 41 6e 64  ddFolderToZipAnd
0ac0: 46 69 6c 65 46 69 6c 65 28 68 5a 69 70 2c 20 73  FileFile(hZip, s
0ad0: 70 66 53 72 63 2c 20 73 70 66 44 73 74 2c 20 64  pfSrc, spfDst, d
0ae0: 56 61 72 73 2c 20 62 52 65 63 75 72 73 69 76 65  Vars, bRecursive
0af0: 29 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a  ).        else:.
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73              if s
0b10: 70 66 53 72 63 2e 65 6e 64 73 77 69 74 68 28 28  pfSrc.endswith((
0b20: 22 2e 70 79 22 2c 20 22 2e 6a 73 22 2c 20 22 2e  ".py", ".js", ".
0b30: 6a 73 6f 6e 22 2c 20 22 2e 63 73 73 22 2c 20 22  json", ".css", "
0b40: 2e 78 63 75 22 2c 20 22 2e 78 75 6c 22 2c 20 22  .xcu", ".xul", "
0b50: 2e 72 64 66 22 2c 20 22 2e 64 74 64 22 2c 20 22  .rdf", ".dtd", "
0b60: 2e 70 72 6f 70 65 72 74 69 65 73 22 29 29 3a 0a  .properties")):.
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 73 70  hZip.writestr(sp
0b90: 66 44 73 74 2c 20 66 69 6c 65 46 69 6c 65 28 73  fDst, fileFile(s
0ba0: 70 66 53 72 63 2c 20 64 56 61 72 73 29 29 0a 20  pfSrc, dVars)). 
0bb0: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a             else:
0bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0bd0: 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70 66 53   hZip.write(spfS
0be0: 72 63 2c 20 73 70 66 44 73 74 29 0a              rc, spfDst).