myserver-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myserver-commit] [3006] first step developing myserver-get: implemented


From: Daniele Perrone
Subject: [myserver-commit] [3006] first step developing myserver-get: implemented simple skeleton and update command.
Date: Fri, 20 Feb 2009 23:23:23 +0000

Revision: 3006
          http://svn.sv.gnu.org/viewvc/?view=rev&root=myserver&revision=3006
Author:   dperrone
Date:     2009-02-20 23:23:22 +0000 (Fri, 20 Feb 2009)

Log Message:
-----------
first step developing myserver-get: implemented simple skeleton and update 
command.

Added Paths:
-----------
    trunk/misc/myserver-get/
    trunk/misc/myserver-get/list/
    trunk/misc/myserver-get/myserver-get.py
    trunk/misc/myserver-get/myserverGetLib/
    trunk/misc/myserver-get/myserverGetLib/__init__.py
    trunk/misc/myserver-get/myserverGetLib/config.py
    trunk/misc/myserver-get/myserverGetLib/error.py
    trunk/misc/myserver-get/myserverGetLib/general.py
    trunk/misc/myserver-get/myserverGetLib/local.py
    trunk/misc/myserver-get/myserverGetLib/remote.py
    trunk/misc/myserver-get/myserverGetLib/remoteSvn.py
    trunk/misc/myserver-get/repositories.xml

Added: trunk/misc/myserver-get/myserver-get.py
===================================================================
--- trunk/misc/myserver-get/myserver-get.py                             (rev 0)
+++ trunk/misc/myserver-get/myserver-get.py     2009-02-20 23:23:22 UTC (rev 
3006)
@@ -0,0 +1,34 @@
+from myserverGetLib.general import MyServerGet
+import sys
+import getopt
+
+def usage(arg):
+    print "usage: myserver-get update "    
+        
+def main(argv):
+    myserverGet = MyServerGet()
+    argument = "" 
+    command = ""                        
+    
+    commands = {"":usage, "update":myserverGet.update}
+        
+    try:                                
+        opts, args = getopt.getopt(argv, "h", ["help"]) 
+    except getopt.GetoptError:           
+        usage()                          
+        sys.exit(2)
+    for opt, arg in opts:                
+        if opt in ("-h", "--help"):      
+            usage("")                     
+            sys.exit()                  
+    
+    for arg in args:
+        if arg in ("update"):
+            command = arg
+        else:
+            argument = arg
+    
+    commands[command](argument)
+
+if __name__ == "__main__":
+    main(sys.argv[1:])
\ No newline at end of file


Property changes on: trunk/misc/myserver-get/myserverGetLib
___________________________________________________________________
Added: svn:mergeinfo
   + 

Added: trunk/misc/myserver-get/myserverGetLib/__init__.py
===================================================================
--- trunk/misc/myserver-get/myserverGetLib/__init__.py                          
(rev 0)
+++ trunk/misc/myserver-get/myserverGetLib/__init__.py  2009-02-20 23:23:22 UTC 
(rev 3006)
@@ -0,0 +1,2 @@
+#
+

Added: trunk/misc/myserver-get/myserverGetLib/config.py
===================================================================
--- trunk/misc/myserver-get/myserverGetLib/config.py                            
(rev 0)
+++ trunk/misc/myserver-get/myserverGetLib/config.py    2009-02-20 23:23:22 UTC 
(rev 3006)
@@ -0,0 +1,16 @@
+
+CNFG_FILE = "myserver-get.xml"
+
+REP_LIST_FILE = "repositories.xml"
+
+PLUGIN_LIST_FILES_DIR = "list"
+
+PLUGIN_LIST_PREFIX = "myserver-get-"
+
+PLUGIN_LIST_SUFFIX = "-plugin-list.xml"
+
+
+
+class ConfigLoader:
+    def __init__(self, configFile):
+        self.__configFile = configFile
\ No newline at end of file

Added: trunk/misc/myserver-get/myserverGetLib/error.py
===================================================================
--- trunk/misc/myserver-get/myserverGetLib/error.py                             
(rev 0)
+++ trunk/misc/myserver-get/myserverGetLib/error.py     2009-02-20 23:23:22 UTC 
(rev 3006)
@@ -0,0 +1,24 @@
+
+
+class Error(Exception):
+    def __init__(self, value):
+        self.value = value
+    
+    def __str__(self):
+        return repr(self.value)
+
+class FatalError(Error):
+    def __init__(self, value):
+        self.value = value
+    
+    def __str__(self):
+        return repr(self.value)
+    
+class Warning(Exception):
+    def __init__(self, value):
+        self.value = value
+    
+    def __str__(self):
+        return repr(self.value)
+    
+

Added: trunk/misc/myserver-get/myserverGetLib/general.py
===================================================================
--- trunk/misc/myserver-get/myserverGetLib/general.py                           
(rev 0)
+++ trunk/misc/myserver-get/myserverGetLib/general.py   2009-02-20 23:23:22 UTC 
(rev 3006)
@@ -0,0 +1,25 @@
+import xml.dom.minidom
+import local
+import config
+import remote
+import remoteSvn
+
+class MyServerGet:
+    def __init__(self, repositoryFile = config.REP_LIST_FILE, listDir = 
config.PLUGIN_LIST_FILES_DIR):
+        self.__rep = repositoryFile
+        self.__listDir = listDir
+        self.__repManager = remote.RepositoryManager()
+        self.__repManager.addSupportedRepository("svn",remoteSvn.RepositorySvn)
+        self.__list = []
+    
+    def loadRepositoryList(self):
+        list = xml.dom.minidom.parse(self.__rep)
+        repXmlList = list.getElementsByTagName("REPOSITORY")
+        self.__list = 
[local.ListManager(repXml.firstChild.data,self.__listDir) for repXml in 
repXmlList]
+        
+    def update(self, arg):
+        self.loadRepositoryList()
+        for list in self.__list:
+            rep = self.__repManager.getRepository(list.repository)
+            rep = rep(list.repository)
+            rep.synchronizeListWithRepository(list)
\ No newline at end of file

Added: trunk/misc/myserver-get/myserverGetLib/local.py
===================================================================
--- trunk/misc/myserver-get/myserverGetLib/local.py                             
(rev 0)
+++ trunk/misc/myserver-get/myserverGetLib/local.py     2009-02-20 23:23:22 UTC 
(rev 3006)
@@ -0,0 +1,144 @@
+import xml.dom.minidom
+import error
+import config
+
+class PluginInfoElement:
+    def __init__(self,name,element, document):
+        self.name = name
+        self.element = element
+        self.document = document
+    
+    def __getitem__(self, key):
+        if key == "value":
+            return self.__element.firstChild.data
+        att = self.element.attributes[key]
+        if att!=None:
+            return att.value
+    
+    def __setitem__(self, key, item):
+        if key == "value":
+            self.document.createTextNode(item)
+            oldChild = self.__element.firstChild
+            self.element.replaceChild(newChild,oldChild)
+        self.element.setAttribute(key,item)
+
+
+class PluginInfo:
+    def __init__(self,xmlElement, manager):
+        self.__xmlElement = xmlElement
+        self.__manager = manager
+    
+    def __getitem__(self, key):
+        elementList = self.__xmlElement.getElementsByTagName(key)
+        
+        return [PluginInfoElement(key,element.childNodes[0].data, element, 
self.__manager) for element in elementList]
+
+    def __setitem__(self, key, item):
+        elementList = self.__xmlElement.getElementsByTagName(key) 
+        for element in elementList:
+            self.__xmlElement.removeChild(element)
+        
+        for element in item:
+            self.__xmlElement.appendChild(element.element)
+            element.document = self.__manager.listDOM
+    
+    def getMyServerMinVersion(self):
+        return self.__mxlElement.getAttribute("min-version")
+    
+    def getMyServerMaxVersion(self):
+        return self.__mxlElement.getAttribute("max-version")
+    
+    def finalize(self):
+        self.__manager.synchronizeListWithFileSystem()
+
+class ListManager:   
+    def __init__ (self,repository, listFilePath, listFile = None):
+        self.repository = repository
+        
+        if listFile != None:
+            self.FileName = listFilePath + "/" + listFile;
+        else:
+            self.FileName = listFilePath + "/" + config.PLUGIN_LIST_PREFIX + 
"-".join(self.repository.split("/")) + config.PLUGIN_LIST_SUFFIX;
+            
+        try:
+            self.listDOM = xml.dom.minidom.parse(self.FileName)
+        except Exception:
+            self.resetToEmptyListFile("-1")
+            self.synchronizeListWithFileSystem()
+                
+            
+
+
+    def resetToEmptyListFile(self,revision):
+        self.listDOM = xml.dom.minidom.Document()
+        plugins = self.listDOM.createElement("PLUGINS")
+        plugins.setAttribute("repository",self.repository)
+        plugins.setAttribute("revision",revision)
+        self.listDOM.appendChild(plugins)
+    
+    
+    def synchronizeListWithFileSystem (self):
+        file_object = open(self.FileName, "w")
+        self.listDOM.writexml(file_object,"","", "\n")
+        file_object.close()
+
+    
+    def getPlugin(self,name):
+        plugins = self.listDOM.getElementsByTagName("plugin")
+        
+        plugin = [elem for elem in plugins if elem.attributes["name"].value == 
name]
+        
+        if len(plugin)==1:
+            pluginDOM = plugin[0]
+            plugin = PluginInfo(pluginDOM,self)
+            return plugin
+        
+        raise error.Error("Plugin "+ name + "doesn't exists! in " + 
self.repository)
+        
+    
+    def addPlugin(self,name, minVersion, maxVersion):
+        plugin = self.listDOM.createElement("PLUGIN")
+        
+        name = self.listDOM.createElement("NAME")
+        name.appendChild(self.listDOM.createTextNode(name))
+        
+        plugin.appendChild(name)
+        plugin.setAttribute("min-version",`minVersion`)
+        plugin.setAttribute("max-version",`maxVersion`)
+        
+        plugins = self.listDOM.getElementsByTagName("PLUGINS")
+        if plugins!=None:
+            plugins[0].appendChild(plugin)
+            pluginInfo = PluginInfo(plugin,self)
+            return pluginInfo
+        
+        raise error.FatalError(self.FileName + "corrupted!")
+        
+        
+    def addPluginWithXml(self,pluginXml):
+        plugins = self.listDOM.getElementsByTagName("PLUGINS")
+        if plugins!=None:
+            plugins[0].appendChild(pluginXml)
+            pluginInfo = PluginInfo(pluginXml,self)
+            return pluginInfo
+        
+        raise error.FatalError(self.FileName + "corrupted!")
+        
+        
+    def getPluginsList(self):
+        plugins = self.listDOM.getElementsByTagName("PLUGIN")
+        
+        return [PluginInfo(plugin,self) for plugin in plugins]
+    
+    
+    def getRevision(self):
+        pluginsList = self.listDOM.getElementsByTagName("PLUGINS")
+        plugins = pluginsList[0]
+        return plugins.getAttribute("revision")
+           
+
+if __name__ == "__main__":
+    manager = ListManager("localhost.it",".","localhost.it-plugins.list")
+    plugin = manager.getPlugin("prova")
+    print plugin["description"] 
+    plugin.finalize()
\ No newline at end of file

Added: trunk/misc/myserver-get/myserverGetLib/remote.py
===================================================================
--- trunk/misc/myserver-get/myserverGetLib/remote.py                            
(rev 0)
+++ trunk/misc/myserver-get/myserverGetLib/remote.py    2009-02-20 23:23:22 UTC 
(rev 3006)
@@ -0,0 +1,29 @@
+import string
+
+class Repository:
+    def __init__(self,url):
+        self.url = url
+        
+
+    def synchronizeListWithRepository(self, list):
+        pass
+    
+    
+    
+class RepositoryManager:
+    def __init__(self):
+        self.__reps = {}
+    
+    def addSupportedRepository(self, protocol, repository):
+        self.__reps[protocol] = repository
+    
+    def getRepository(self, url):
+        url = string.lower(url)
+        if string.find(url,"svn")!=-1:
+            return self.__reps["svn"]
+        return None
+            
+if __name__ == "__main__":
+    list = local.ListManager("localhost.it",".")
+    rep = Repository("svn://svn.savannah.gnu.org/myserver/trunk/plugins")
+    rep.synchronizeListWithRepository(list)
\ No newline at end of file

Added: trunk/misc/myserver-get/myserverGetLib/remoteSvn.py
===================================================================
--- trunk/misc/myserver-get/myserverGetLib/remoteSvn.py                         
(rev 0)
+++ trunk/misc/myserver-get/myserverGetLib/remoteSvn.py 2009-02-20 23:23:22 UTC 
(rev 3006)
@@ -0,0 +1,50 @@
+import pysvn
+import local
+import error
+import xml.dom.minidom
+from remote import Repository
+import sys
+
+class RepositorySvn(Repository):
+    def __init__ (self,url):
+        Repository.__init__(self,url)
+        self.client = pysvn.Client()
+    
+    def __getPluginsList(self):
+        plugins = self.client.list(self.url + "/src",recurse=False)
+        import string
+        plugins = [string.split(elem[0]["repos_path"],"/")[-1] for elem in 
plugins]
+        return plugins[1:]
+    
+    def synchronizeListWithRepository(self, list):
+        sys.stdout.write("update: "+ list.repository + '\n')
+        sys.stdout.write("loading ")
+        sys.stdout.flush()
+        localRevision = int(list.getRevision())
+        info = self.client.info2(self.url, recurse=False)
+        sys.stdout.write(". ")
+        sys.stdout.flush()
+        remoteRevision = int(info[0][1]["rev"].number)
+        if localRevision == remoteRevision:
+            sys.stdout.write("local list already updated.\n")
+            sys.stdout.flush()
+        if localRevision > remoteRevision:
+            raise error.FatalError("Local plugins list corrupted!!")
+        
+        if localRevision < remoteRevision:
+            list.resetToEmptyListFile(`remoteRevision`)
+            sys.stdout.write(". ")
+            sys.stdout.flush()
+            plugins = self.__getPluginsList()
+            sys.stdout.write(". ")
+            sys.stdout.flush()
+            for plugin in plugins:
+                url = self.url + "/src/" + plugin + "/plugin.xml"
+                pluginXml =  xml.dom.minidom.parseString(self.client.cat(url))
+                sys.stdout.write(". ")
+                sys.stdout.flush()
+                element = pluginXml.getElementsByTagName("PLUGIN")
+                pluginInfo = list.addPluginWithXml(element[0])
+            list.synchronizeListWithFileSystem()
+            sys.stdout.write("DONE.\n")
+            sys.stdout.flush()

Added: trunk/misc/myserver-get/repositories.xml
===================================================================
--- trunk/misc/myserver-get/repositories.xml                            (rev 0)
+++ trunk/misc/myserver-get/repositories.xml    2009-02-20 23:23:22 UTC (rev 
3006)
@@ -0,0 +1,3 @@
+<REPOSITORIES>
+   <REPOSITORY>svn://svn.savannah.gnu.org/myserver/trunk/plugins</REPOSITORY>
+</REPOSITORIES>
\ No newline at end of file






reply via email to

[Prev in Thread] Current Thread [Next in Thread]