Grammalecte  Hex Artifact Content

Artifact ee70e577f14f72cd5db7d432ae2775a00b982a7c42e6cdfc7abfcaad7084e04f:


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 73 68 75 74 69 6c 0a 69 6d 70 6f 72 74 20 65   shutil.import e
0030: 72 72 6e 6f 0a 69 6d 70 6f 72 74 20 7a 69 70 66  rrno.import zipf
0040: 69 6c 65 0a 0a 66 72 6f 6d 20 73 74 72 69 6e 67  ile..from string
0050: 20 69 6d 70 6f 72 74 20 54 65 6d 70 6c 61 74 65   import Template
0060: 0a 0a 0a 63 6c 61 73 73 20 63 64 3a 0a 20 20 20  ...class cd:.   
0070: 20 22 43 6f 6e 74 65 78 74 20 6d 61 6e 61 67 65   "Context manage
0080: 72 20 66 6f 72 20 63 68 61 6e 67 69 6e 67 20 74  r for changing t
0090: 68 65 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  he current worki
00a0: 6e 67 20 64 69 72 65 63 74 6f 72 79 22 0a 20 20  ng directory".  
00b0: 20 20 64 65 66 20 5f 5f 69 6e 69 74 5f 5f 20 28    def __init__ (
00c0: 73 65 6c 66 2c 20 6e 65 77 50 61 74 68 29 3a 0a  self, newPath):.
00d0: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 6e 65 77          self.new
00e0: 50 61 74 68 20 3d 20 6f 73 2e 70 61 74 68 2e 65  Path = os.path.e
00f0: 78 70 61 6e 64 75 73 65 72 28 6e 65 77 50 61 74  xpanduser(newPat
0100: 68 29 0a 0a 20 20 20 20 64 65 66 20 5f 5f 65 6e  h)..    def __en
0110: 74 65 72 5f 5f 20 28 73 65 6c 66 29 3a 0a 20 20  ter__ (self):.  
0120: 20 20 20 20 20 20 73 65 6c 66 2e 73 61 76 65 64        self.saved
0130: 50 61 74 68 20 3d 20 6f 73 2e 67 65 74 63 77 64  Path = os.getcwd
0140: 28 29 0a 20 20 20 20 20 20 20 20 6f 73 2e 63 68  ().        os.ch
0150: 64 69 72 28 73 65 6c 66 2e 6e 65 77 50 61 74 68  dir(self.newPath
0160: 29 0a 0a 20 20 20 20 64 65 66 20 5f 5f 65 78 69  )..    def __exi
0170: 74 5f 5f 20 28 73 65 6c 66 2c 20 65 74 79 70 65  t__ (self, etype
0180: 2c 20 76 61 6c 75 65 2c 20 74 72 61 63 65 62 61  , value, traceba
0190: 63 6b 29 3a 0a 20 20 20 20 20 20 20 20 6f 73 2e  ck):.        os.
01a0: 63 68 64 69 72 28 73 65 6c 66 2e 73 61 76 65 64  chdir(self.saved
01b0: 50 61 74 68 29 0a 0a 0a 64 65 66 20 75 6e 7a 69  Path)...def unzi
01c0: 70 20 28 73 70 66 5a 69 70 2c 20 73 70 44 65 73  p (spfZip, spDes
01d0: 74 2c 20 62 43 72 65 61 74 65 50 61 74 68 3d 46  t, bCreatePath=F
01e0: 61 6c 73 65 29 3a 0a 20 20 20 20 22 75 6e 7a 69  alse):.    "unzi
01f0: 70 20 66 69 6c 65 20 3c 73 70 66 5a 69 70 3e 20  p file <spfZip> 
0200: 61 74 20 3c 73 70 66 44 65 73 74 3e 22 0a 20 20  at <spfDest>".  
0210: 20 20 69 66 20 73 70 44 65 73 74 3a 0a 20 20 20    if spDest:.   
0220: 20 20 20 20 20 69 66 20 62 43 72 65 61 74 65 50       if bCreateP
0230: 61 74 68 20 61 6e 64 20 6e 6f 74 20 6f 73 2e 70  ath and not os.p
0240: 61 74 68 2e 65 78 69 73 74 73 28 73 70 44 65 73  ath.exists(spDes
0250: 74 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  t):.            
0260: 6f 73 2e 6d 61 6b 65 64 69 72 73 28 73 70 44 65  os.makedirs(spDe
0270: 73 74 2c 20 65 78 69 73 74 5f 6f 6b 3d 54 72 75  st, exist_ok=Tru
0280: 65 29 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  e).        print
0290: 28 22 3e 20 75 6e 7a 69 70 20 69 6e 3a 20 22 2b  ("> unzip in: "+
02a0: 20 73 70 44 65 73 74 29 0a 20 20 20 20 20 20 20   spDest).       
02b0: 20 73 70 49 6e 73 74 61 6c 6c 20 3d 20 6f 73 2e   spInstall = os.
02c0: 70 61 74 68 2e 61 62 73 70 61 74 68 28 73 70 44  path.abspath(spD
02d0: 65 73 74 29 0a 20 20 20 20 20 20 20 20 69 66 20  est).        if 
02e0: 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28 73 70  os.path.isdir(sp
02f0: 49 6e 73 74 61 6c 6c 29 3a 0a 20 20 20 20 20 20  Install):.      
0300: 20 20 20 20 20 20 65 72 61 73 65 46 6f 6c 64 65        eraseFolde
0310: 72 28 73 70 49 6e 73 74 61 6c 6c 29 0a 20 20 20  r(spInstall).   
0320: 20 20 20 20 20 20 20 20 20 77 69 74 68 20 7a 69           with zi
0330: 70 66 69 6c 65 2e 5a 69 70 46 69 6c 65 28 73 70  pfile.ZipFile(sp
0340: 66 5a 69 70 29 20 61 73 20 68 5a 69 70 3a 0a 20  fZip) as hZip:. 
0350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
0360: 5a 69 70 2e 65 78 74 72 61 63 74 61 6c 6c 28 73  Zip.extractall(s
0370: 70 44 65 73 74 29 0a 20 20 20 20 20 20 20 20 65  pDest).        e
0380: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
0390: 20 70 72 69 6e 74 28 22 23 20 66 6f 6c 64 65 72   print("# folder
03a0: 20 6e 6f 74 20 66 6f 75 6e 64 22 29 0a 20 20 20   not found").   
03b0: 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 70   else:.        p
03c0: 72 69 6e 74 28 22 70 61 74 68 20 64 65 73 74 69  rint("path desti
03d0: 6e 61 74 69 6f 6e 20 69 73 20 65 6d 70 74 79 22  nation is empty"
03e0: 29 0a 0a 0a 64 65 66 20 65 72 61 73 65 46 6f 6c  )...def eraseFol
03f0: 64 65 72 20 28 73 70 29 3a 0a 20 20 20 20 22 65  der (sp):.    "e
0400: 72 61 73 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  rase content of 
0410: 61 20 66 6f 6c 64 65 72 22 0a 20 20 20 20 66 6f  a folder".    fo
0420: 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64  r sf in os.listd
0430: 69 72 28 73 70 29 3a 0a 20 20 20 20 20 20 20 20  ir(sp):.        
0440: 73 70 66 20 3d 20 6f 73 2e 70 61 74 68 2e 6a 6f  spf = os.path.jo
0450: 69 6e 28 73 70 2c 20 73 66 29 0a 20 20 20 20 20  in(sp, sf).     
0460: 20 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20     try:.        
0470: 20 20 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69      if os.path.i
0480: 73 66 69 6c 65 28 73 70 66 29 3a 0a 20 20 20 20  sfile(spf):.    
0490: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 2e 75              os.u
04a0: 6e 6c 69 6e 6b 28 73 70 66 29 0a 20 20 20 20 20  nlink(spf).     
04b0: 20 20 20 20 20 20 20 65 6c 69 66 20 6f 73 2e 70         elif os.p
04c0: 61 74 68 2e 69 73 64 69 72 28 73 70 66 29 3a 0a  ath.isdir(spf):.
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 73 68 75 74 69 6c 2e 72 6d 74 72 65 65 28 73 70  shutil.rmtree(sp
04f0: 66 29 0a 20 20 20 20 20 20 20 20 65 78 63 65 70  f).        excep
0500: 74 20 45 78 63 65 70 74 69 6f 6e 20 61 73 20 65  t Exception as e
0510: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  :.            pr
0520: 69 6e 74 28 65 29 0a 0a 0a 64 65 66 20 63 72 65  int(e)...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 6f 73 2e 6d 61 6b 65  .        os.make
05b0: 64 69 72 73 28 73 70 2c 20 65 78 69 73 74 5f 6f  dirs(sp, exist_o
05c0: 6b 3d 54 72 75 65 29 0a 20 20 20 20 65 6c 73 65  k=True).    else
05d0: 3a 0a 20 20 20 20 20 20 20 20 65 72 61 73 65 46  :.        eraseF
05e0: 6f 6c 64 65 72 28 73 70 29 0a 0a 0a 64 65 66 20  older(sp)...def 
05f0: 63 6f 70 79 46 6f 6c 64 65 72 43 6f 6e 74 65 6e  copyFolderConten
0600: 74 20 28 73 70 53 72 63 2c 20 73 70 44 73 74 29  t (spSrc, spDst)
0610: 3a 0a 20 20 20 20 74 72 79 3a 0a 20 20 20 20 20  :.    try:.     
0620: 20 20 20 73 68 75 74 69 6c 2e 63 6f 70 79 74 72     shutil.copytr
0630: 65 65 28 73 70 53 72 63 2c 20 73 70 44 73 74 29  ee(spSrc, spDst)
0640: 0a 20 20 20 20 65 78 63 65 70 74 20 4f 53 45 72  .    except OSEr
0650: 72 6f 72 20 61 73 20 65 3a 0a 20 20 20 20 20 20  ror as e:.      
0660: 20 20 69 66 20 65 2e 65 72 72 6e 6f 20 3d 3d 20    if e.errno == 
0670: 65 72 72 6e 6f 2e 45 4e 4f 54 44 49 52 3a 0a 20  errno.ENOTDIR:. 
0680: 20 20 20 20 20 20 20 20 20 20 20 73 68 75 74 69             shuti
0690: 6c 2e 63 6f 70 79 28 73 70 53 72 63 2c 20 73 70  l.copy(spSrc, sp
06a0: 44 73 74 29 0a 20 20 20 20 20 20 20 20 65 6c 73  Dst).        els
06b0: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e:.            r
06c0: 61 69 73 65 0a 0a 0a 64 65 66 20 66 69 6c 65 46  aise...def fileF
06d0: 69 6c 65 20 28 73 70 66 2c 20 64 56 61 72 73 29  ile (spf, dVars)
06e0: 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 20 66 69  :.    "return fi
06f0: 6c 65 20 3c 73 70 66 3e 20 61 73 20 61 20 74 65  le <spf> as a te
0700: 78 74 20 66 69 6c 65 64 20 77 69 74 68 20 76 61  xt filed with va
0710: 72 69 61 62 6c 65 73 20 66 72 6f 6d 20 3c 64 56  riables from <dV
0720: 61 72 73 3e 22 0a 20 20 20 20 72 65 74 75 72 6e  ars>".    return
0730: 20 54 65 6d 70 6c 61 74 65 28 6f 70 65 6e 28 73   Template(open(s
0740: 70 66 2c 20 22 72 22 2c 20 65 6e 63 6f 64 69 6e  pf, "r", encodin
0750: 67 3d 22 75 74 66 2d 38 22 29 2e 72 65 61 64 28  g="utf-8").read(
0760: 29 29 2e 73 61 66 65 5f 73 75 62 73 74 69 74 75  )).safe_substitu
0770: 74 65 28 64 56 61 72 73 29 0a 0a 0a 64 65 66 20  te(dVars)...def 
0780: 63 6f 70 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c  copyAndFileTempl
0790: 61 74 65 20 28 73 70 66 53 72 63 2c 20 73 70 66  ate (spfSrc, spf
07a0: 44 73 74 2c 20 64 56 61 72 73 29 3a 0a 20 20 20  Dst, dVars):.   
07b0: 20 22 77 72 69 74 65 20 66 69 6c 65 20 3c 73 70   "write file <sp
07c0: 66 53 72 63 3e 20 61 73 20 3c 73 70 66 44 73 74  fSrc> as <spfDst
07d0: 3e 20 77 69 74 68 20 76 61 72 69 61 62 6c 65 73  > with variables
07e0: 20 66 69 6c 65 64 20 77 69 74 68 20 3c 64 56 61   filed with <dVa
07f0: 72 73 3e 22 0a 20 20 20 20 73 20 3d 20 54 65 6d  rs>".    s = Tem
0800: 70 6c 61 74 65 28 6f 70 65 6e 28 73 70 66 53 72  plate(open(spfSr
0810: 63 2c 20 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67  c, "r", encoding
0820: 3d 22 75 74 66 2d 38 22 29 2e 72 65 61 64 28 29  ="utf-8").read()
0830: 29 2e 73 61 66 65 5f 73 75 62 73 74 69 74 75 74  ).safe_substitut
0840: 65 28 64 56 61 72 73 29 0a 20 20 20 20 6f 70 65  e(dVars).    ope
0850: 6e 28 73 70 66 44 73 74 2c 20 22 77 22 2c 20 65  n(spfDst, "w", e
0860: 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c  ncoding="utf-8",
0870: 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 2e 77   newline="\n").w
0880: 72 69 74 65 28 73 29 0a 0a 0a 64 65 66 20 61 64  rite(s)...def ad
0890: 64 46 6f 6c 64 65 72 54 6f 5a 69 70 41 6e 64 46  dFolderToZipAndF
08a0: 69 6c 65 46 69 6c 65 20 28 68 5a 69 70 2c 20 73  ileFile (hZip, s
08b0: 70 53 72 63 2c 20 73 70 44 73 74 2c 20 64 56 61  pSrc, spDst, dVa
08c0: 72 73 2c 20 62 52 65 63 75 72 73 69 76 65 29 3a  rs, bRecursive):
08d0: 0a 20 20 20 20 23 20 72 65 63 75 72 73 69 76 65  .    # recursive
08e0: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 73 70   function.    sp
08f0: 53 72 63 20 3d 20 73 70 53 72 63 2e 73 74 72 69  Src = spSrc.stri
0900: 70 28 22 2f 20 22 29 0a 20 20 20 20 73 70 44 73  p("/ ").    spDs
0910: 74 20 3d 20 73 70 44 73 74 2e 73 74 72 69 70 28  t = spDst.strip(
0920: 22 2f 20 22 29 0a 20 20 20 20 66 6f 72 20 73 66  "/ ").    for sf
0930: 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 73   in os.listdir(s
0940: 70 53 72 63 29 3a 0a 20 20 20 20 20 20 20 20 73  pSrc):.        s
0950: 70 66 53 72 63 20 3d 20 28 73 70 53 72 63 20 2b  pfSrc = (spSrc +
0960: 20 22 2f 22 20 2b 20 73 66 29 2e 73 74 72 69 70   "/" + sf).strip
0970: 28 22 2f 20 22 29 0a 20 20 20 20 20 20 20 20 73  ("/ ").        s
0980: 70 66 44 73 74 20 3d 20 28 73 70 44 73 74 20 2b  pfDst = (spDst +
0990: 20 22 2f 22 20 2b 20 73 66 29 2e 73 74 72 69 70   "/" + sf).strip
09a0: 28 22 2f 20 22 29 0a 20 20 20 20 20 20 20 20 69  ("/ ").        i
09b0: 66 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28  f os.path.isdir(
09c0: 73 70 66 53 72 63 29 3a 0a 20 20 20 20 20 20 20  spfSrc):.       
09d0: 20 20 20 20 20 69 66 20 62 52 65 63 75 72 73 69       if bRecursi
09e0: 76 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ve:.            
09f0: 20 20 20 20 61 64 64 46 6f 6c 64 65 72 54 6f 5a      addFolderToZ
0a00: 69 70 41 6e 64 46 69 6c 65 46 69 6c 65 28 68 5a  ipAndFileFile(hZ
0a10: 69 70 2c 20 73 70 66 53 72 63 2c 20 73 70 66 44  ip, spfSrc, spfD
0a20: 73 74 2c 20 64 56 61 72 73 2c 20 62 52 65 63 75  st, dVars, bRecu
0a30: 72 73 69 76 65 29 0a 20 20 20 20 20 20 20 20 65  rsive).        e
0a40: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
0a50: 20 69 66 20 73 70 66 53 72 63 2e 65 6e 64 73 77   if spfSrc.endsw
0a60: 69 74 68 28 28 22 2e 70 79 22 2c 20 22 2e 6a 73  ith((".py", ".js
0a70: 22 2c 20 22 2e 63 73 73 22 2c 20 22 2e 78 63 75  ", ".css", ".xcu
0a80: 22 2c 20 22 2e 78 75 6c 22 2c 20 22 2e 72 64 66  ", ".xul", ".rdf
0a90: 22 2c 20 22 2e 64 74 64 22 2c 20 22 2e 70 72 6f  ", ".dtd", ".pro
0aa0: 70 65 72 74 69 65 73 22 29 29 3a 0a 20 20 20 20  perties")):.    
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 23 70 72 69              #pri
0ac0: 6e 74 28 73 70 66 53 72 63 20 2b 20 22 20 3e 20  nt(spfSrc + " > 
0ad0: 22 20 2b 20 73 70 66 44 73 74 29 0a 20 20 20 20  " + spfDst).    
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69 70              hZip
0af0: 2e 77 72 69 74 65 73 74 72 28 73 70 66 44 73 74  .writestr(spfDst
0b00: 2c 20 66 69 6c 65 46 69 6c 65 28 73 70 66 53 72  , fileFile(spfSr
0b10: 63 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 20  c, dVars)).     
0b20: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 70 72               #pr
0b40: 69 6e 74 28 73 70 66 53 72 63 20 2b 20 22 20 3e  int(spfSrc + " >
0b50: 20 22 20 2b 20 73 70 66 44 73 74 29 0a 20 20 20   " + spfDst).   
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69               hZi
0b70: 70 2e 77 72 69 74 65 28 73 70 66 53 72 63 2c 20  p.write(spfSrc, 
0b80: 73 70 66 44 73 74 29 0a                          spfDst).