mercoledì 10 ottobre 2012

Una macro in WinCvs per la copia di uno o più file in Python

L'esempio seguente è la creazione di una macro in WinCvs 2.0 e permette di selezionare uno o più file da una directory e copiarli in un' altra mantenendo il path iniziale.
Potrebbe essere utile per creare un pacchetto di file.
Ecco come fare:
- chiudere eventualmente WinCvs se aperto;
- creare il file AddFileToDirTest.py nella directory ".../wincvs/Macros";
- copiare il codice qui sotto;
- modificare eventualmente i path o parametri all'interno della macro;
- riavviare WinCvs (ricordarsi di avere python installato sul pc e aver fatto riferimento nelle impostazioni sulla dll di python);
- selezionare i file da copiare;
- selezionare la macro AddFileToDirTest.

# start copy here
from cvsgui.Macro import *
from cvsgui.CvsEntry import *
from cvsgui.ColorConsole import *
import cvsgui.App, os.path, os
import string
import copy
import shutil

class AddFileToDirTest(Macro):
 def __init__(self):
  Macro.__init__(self, "AddFileToDirTest", MACRO_SELECTION, 0, "Add File To Dir Test")

 def CreaDirectory(self,dirFile):
  if not os.path.isdir(dirFile):
   os.makedirs(dirFile)
   print "- directory created: " + dirFile
 
 def OnCmdUI(self, cmdui):
  sel = cvsgui.App.GetSelection()
  isOnlyExistingFiles = len(sel) > 0
  for s in sel:
   if not s.IsFile() or s.IsMissing():
    isOnlyExistingFiles = 0
    break

  cmdui.Enable(isOnlyExistingFiles)
  if isOnlyExistingFiles:
   cmdui.SetText("Add File selected to Directory")
  else:
   cmdui.SetText("Click on file to select")

 def Run(self):
  print "* Add file in progress... *"
  
  #+--------- start set here--------+
  #example directory root: c:\temp\test
  pathComuneDoveCopiareIFile ="c:\\" + "temp" + "\\" 
  nomeDirectoryComuneATuttiIProgetti="test" #insert the name into common directory
  #+--------- stop set here --------+
  
  sel = cvsgui.App.GetSelection()
  paths = []
  for s in sel:
   paths.append(s.GetFullName())
   nomeFile=os.path.split(s.GetFullName())
  
  dir = os.path.dirname(os.path.commonprefix(paths))
  print "- directory selected: ", dir
  where = dir.find(nomeDirectoryComuneATuttiIProgetti)      
  dirReplace = dir[(where):]
  dirDaCreare= pathComuneDoveCopiareIFile + dirReplace
  self.CreaDirectory(dirDaCreare)
 
  for s in sel:
   paths.append(s.GetFullName())
   nomeFile=os.path.split(s.GetFullName())
   pathDoveCopiare = dirDaCreare + "\\" + nomeFile[1]
   print "- copy file in:" + pathDoveCopiare
   shutil.copyfile(s.GetFullName(), pathDoveCopiare)
   print "-- filename copied: " + nomeFile[1]
   
  print "* End elaboration *"


AddFileToDirTest()
# end copy here
Un esempio in questa figura: