| 
				
				
				
				 | 
			
			 | 
			@@ -0,0 +1,55 @@ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			""" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			Contains classes and utilities that help publishing a hyde website to | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			a filesystem using PyFilesystem FS objects. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			""" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			import getpass | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from hyde.fs import File, Folder | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from hyde.publisher import Publisher | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from hyde.util import getLoggerWithNullHandler | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			logger = getLoggerWithNullHandler('hyde.ext.publishers.pyfs') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from fs.osfs import OSFS | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from fs.path import pathjoin | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from fs.opener import fsopendir | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			class PyFS(Publisher): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def initialize(self, settings): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        self.settings = settings | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        self.url = settings.url | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        self.prompt_for_credentials() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        self.fs = fsopendir(self.url) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def prompt_for_credentials(self): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        credentials = {} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if "%(username)s" in self.url: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            print "Username: ", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            credentials["username"] = raw_input().strip() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if "%(password)s" in self.url: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            credentials["password"] = getpass.getpass("Password: ") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if credentials: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            self.url = self.url % credentials | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def publish(self): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        super(PyFS, self).publish() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        deploy_fs = OSFS(self.site.config.deploy_root_path.path) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        for (dirnm,filenms) in deploy_fs.walk(): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            logger.info("Making directory: %s",dirnm) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            self.fs.makedir(dirnm,allow_recreate=True) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            for filenm in filenms: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                filepath = pathjoin(dirnm,filenm) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                logger.info("Uploading file: %s",filepath) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                with deploy_fs.open(filepath,"rb") as f: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    self.fs.setcontents(filepath,f) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            for filenm in self.fs.listdir(dirnm,files_only=True): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                filepath = pathjoin(dirnm,filenm) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if filenm not in filenms: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    logger.info("Removing file: %s",filepath) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    self.fs.remove(filepath) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  |