diff --git a/product/ERP5Subversion/SubversionClient.py b/product/ERP5Subversion/SubversionClient.py index 5f3aed68294c40d5baaff98f1e70aa4b4155c046..ee209c897b2c8868c37b6e4ff2bc0fc8d21afb68 100755 --- a/product/ERP5Subversion/SubversionClient.py +++ b/product/ERP5Subversion/SubversionClient.py @@ -28,7 +28,7 @@ from Acquisition import Implicit -import time +import time, os from Products.ERP5Type.Utils import convertToUpperCase from MethodObject import Method from Globals import InitializeClass @@ -181,38 +181,45 @@ try: self.client.set_auth_cache(0) self.client.callback_cancel = CancelCallback(self) self.client.callback_get_log_message = GetLogMessageCallback(self) - #self.client.callback_get_login = GetLoginCallback(self) - self.client.callback_get_login = self.callback_get_Login + self.client.callback_get_login = GetLoginCallback(self) + #self.client.callback_get_login = self.callback_get_Login self.client.callback_notify = NotifyCallback(self) - #self.client.callback_ssl_server_trust_prompt = SSLServerTrustPromptCallback(self) - self.client.callback_ssl_server_trust_prompt = self.callback_ssl_server_trust_prompt + self.client.callback_ssl_server_trust_prompt = SSLServerTrustPromptCallback(self) + #self.client.callback_ssl_server_trust_prompt = self.callback_ssl_server_trust_prompt self.creation_time = time.time() self.__dict__.update(kw) def getLogMessage(self): return self.log_message + + def _getPreferences(self): + self.working_path = self.getPortalObject().portal_preferences.getPreference('subversion_working_copy') + if not self.working_path : + raise "Error: Please set Subversion working path in preferences" + self.svn_username = self.getPortalObject().portal_preferences.getPreference('preferred_subversion_user_name') + os.chdir(self.working_path); def getTimeout(self): return self.timeout - def callback_get_Login( self, realm, username, may_save ): - #Retrieving saved username/password - #raise 'realm is '+realm+' && username is '+username - username, password = self.login - if not username : - raise "Error: Couldn't retrieve saved username !" - if not password : - raise "Error: Couldn't retrieve saved password !" - return 1, username, password, True +# def callback_get_Login( self, realm, username, may_save ): +# #Retrieving saved username/password +# username, password = self.login +# if not username : +# raise "Error: Couldn't retrieve saved username !" +# if not password : +# raise "Error: Couldn't retrieve saved password !" +# return 1, username, password, True def trustSSLServer(self, trust_dict): return self.aq_parent._trustSSLServer(trust_dict) - def callback_ssl_server_trust_prompt( self, trust_data ): - # Always trusting - return True, trust_data['failures'], True +# def callback_ssl_server_trust_prompt( self, trust_data ): +# # Always trusting +# return True, trust_data['failures'], True def checkin(self, path, log_message, recurse): + self._getPreferences() return self.client.checkin(path, log_message=log_message, recurse=recurse) def status(self, path, **kw): diff --git a/product/ERP5Subversion/Tool/SubversionTool.py b/product/ERP5Subversion/Tool/SubversionTool.py index be7cdcc475b60f916ad64503bfddaa79e2dfbd76..838662c958b31596ab0fd492ecc76cf9bc95be74 100755 --- a/product/ERP5Subversion/Tool/SubversionTool.py +++ b/product/ERP5Subversion/Tool/SubversionTool.py @@ -65,12 +65,12 @@ class Dir : # return a list of sub directories' names def getSubDirs(self) : - return [d.full_path for d in self.sub_dirs] + return [d.name for d in self.sub_dirs] # return directory in subdirs given its name - def getDir(self, full_path): + def getDir(self, name): for d in self.sub_dirs: - if d.full_path == full_path: + if d.name == name: return d ## End of Dir Class @@ -85,7 +85,7 @@ class SubversionTool(UniqueObject, Folder): login_cookie_name = 'erp5_subversion_login' ssl_trust_cookie_name = 'erp5_subversion_ssl_trust' top_working_path = os.path.join(getConfiguration().instancehome, 'svn') - os.chdir(top_working_path) + # Declarative Security security = ClassSecurityInfo() @@ -105,6 +105,8 @@ class SubversionTool(UniqueObject, Folder): # Filter content (ZMI)) def __init__(self): +# working_path = self.getPortalObject().portal_preferences.getPreference('subversion_working_copy') +# svn_username = self.getPortalObject().portal_preferences.getPreference('preferred_subversion_user_name') return Folder.__init__(self, SubversionTool.id) # Filter content (ZMI)) @@ -148,26 +150,26 @@ class SubversionTool(UniqueObject, Folder): # Decode login information. return loads(b64decode(login)) -# def setLogin(self, realm, user, password): -# """Set login information. -# """ -# # Get existing login information. Filter out old information. -# login_list = [] -# request = self.REQUEST -# cookie = request.get(self.login_cookie_name) -# if cookie: -# for login in cookie.split(','): -# if self._decodeLogin(login)[0] != realm: -# login_list.append(login) -# # Set the cookie. -# response = request.RESPONSE -# login_list.append(self._encodeLogin(realm, user, password)) -# value = ','.join(login_list) -# expires = (DateTime() + 1).toZone('GMT').rfc822() -# response.setCookie(self.login_cookie_name, value, path = '/', expires = expires) + def setLogin(self, realm, user, password): + """Set login information. + """ + # Get existing login information. Filter out old information. + login_list = [] + request = self.REQUEST + cookie = request.get(self.login_cookie_name) + if cookie: + for login in cookie.split(','): + if self._decodeLogin(login)[0] != realm: + login_list.append(login) + # Set the cookie. + response = request.RESPONSE + login_list.append(self._encodeLogin(realm, user, password)) + value = ','.join(login_list) + expires = (DateTime() + 1).toZone('GMT').rfc822() + response.setCookie(self.login_cookie_name, value, path = '/', expires = expires) - def setLogin(self, username, passwd): - self.login = (username, passwd) +# def setLogin(self, username, passwd): +# self.login = (username, passwd) def _getLogin(self, target_realm): request = self.REQUEST @@ -289,6 +291,7 @@ class SubversionTool(UniqueObject, Folder): root = Dir(path, "normal") somethingModified = False + for statusObj in self.status(path) : # can be (normal, added, modified, deleted) msg_status = statusObj.getTextStatus() @@ -309,36 +312,30 @@ class SubversionTool(UniqueObject, Folder): i += 1 if d : full_pathOfd = '/'+'/'.join(full_path_list[:i]).strip() - if full_pathOfd not in parent.sub_dirs : + if d not in parent.getSubDirs() : parent.sub_dirs.append(Dir(full_pathOfd, "normal")) - parent = parent.getDir(full_pathOfd) + parent = parent.getDir(d) if os.path.isdir(full_path) : if full_path == parent.full_path : parent.msg_status = str(msg_status) - elif full_path not in parent.sub_dirs : - parent.sub_dirs.append(Dir(full_path, str(msg_status))) + elif filename not in parent.getSubDirs() : + parent.sub_dirs.append(Dir(filename, str(msg_status))) else : - tmp = parent.getDir(full_path) + tmp = parent.getDir(filename) tmp.msg_status = str(msg_status) else : - parent.sub_dirs.append(File(full_path, str(msg_status))) + parent.sub_dirs.append(File(filename, str(msg_status))) return somethingModified and root def treeToXML(self, item) : - output = StringIO() - output.write("<?xml version='1.0' encoding='iso-8859-1'?>"+ os.linesep) - output.write("<tree id='0'>" + os.linesep) + output = "<?xml version='1.0' encoding='iso-8859-1'?>"+ os.linesep + output += "<tree id='0'>" + os.linesep output = self._treeToXML(item, output, 1, True) - output.write("</tree>" + os.linesep) - try : - self.getPortalObject()["portal_skins"]["erp5_svn"].manage_addFile(id="tree.xml", file=output) - except : - self.getPortalObject()["portal_skins"]["erp5_svn"]["tree.xml"].manage_upload(file=output) - output.close() - - #return output + output += "</tree>" + os.linesep + return output def _treeToXML(self, item, output, ident, first) : + # Choosing a color coresponding to the status itemStatus = item.msg_status if itemStatus == 'added' : itemColor='green' @@ -348,34 +345,33 @@ class SubversionTool(UniqueObject, Folder): itemColor='red' else : itemColor='black' + if isinstance(item, Dir) : for i in range(ident) : - output.write('\t') + output += '\t' if first : - output.write('<item open="1" text="%s" id="%s" aCol="%s" '\ + output += '<item open="1" text="%s" id="%s" aCol="%s" '\ 'im0="folder.png" im1="folder_open.png" '\ 'im2="folder.png">'%(item.name, -item.full_path, itemColor,) + os.linesep) +item.full_path, itemColor,) + os.linesep first=False else : - output.write('<item text="%s" id="%s" aCol="%s" im0="folder.png" ' \ + output += '<item text="%s" id="%s" aCol="%s" im0="folder.png" ' \ 'im1="folder_open.png" im2="folder.png">'%(item.name, -item.full_path, itemColor,) + os.linesep) +item.full_path, itemColor,) + os.linesep for it in item.sub_dirs: ident += 1 - output = self._treeToXML(item.getDir(it.full_path), output, ident, + output = self._treeToXML(item.getDir(it.name), output, ident, first) ident -= 1 for i in range(ident) : - output.write('\t') - output.write('</item>' + os.linesep) + output += '\t' + output += '</item>' + os.linesep else : for i in range(ident) : - output.write('\t') - output.write('<item text="%s" id="%s" aCol="%s" im0="document.png" ' \ - 'im1="document.png" im2="document.png"/>'%(item.name, -item.full_path, itemColor,) + os.linesep) - + output += '\t' + output += '<item text="%s" id="%s" aCol="%s" im0="document.png"/>'\ + %(item.name, item.full_path, itemColor,) + os.linesep return output InitializeClass(SubversionTool)