Author: remi
Date: 2009-03-19 17:00:46 +0100 (Thu, 19 Mar 2009)
New Revision: 4154
Added:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/build.py
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/GadgetPackager.py
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/__init__.py
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/__init__.py
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/DirectoriesAndFilesTools.py
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/__init__.py
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/test_DirectoriesAndFilesTools.py
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/version.py
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/version.py
Log:
* added the builder
$python build.py
Added:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/build.py
===================================================================
---
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/build.py
(rev 0)
+++
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/build.py
2009-03-19 16:00:46 UTC (rev 4154)
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+
+# Copyleft (C) 2009 C2ME Sa
+# Remi Jocaille <[email protected]>
+# Distributed under the terms of the GNU General Public License
+# http://www.gnu.org/copyleft/gpl.html
+
+from builder.GadgetPackager import GadgetPackager
+
+if __name__ == "__main__":
+ GadgetPackager().createTgf("tuxdroid-python-gadget-HelloWorld.tgf")
Property changes on:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/build.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/GadgetPackager.py
===================================================================
---
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/GadgetPackager.py
(rev 0)
+++
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/GadgetPackager.py
2009-03-19 16:00:46 UTC (rev 4154)
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+
+import version
+__author__ = version.author
+__date__ = version.date
+__version__ = version.version
+__licence__ = version.licence
+del version
+
+# Copyleft (C) 2009 C2ME Sa
+# Remi Jocaille <[email protected]>
+# Distributed under the terms of the GNU General Public License
+# http://www.gnu.org/copyleft/gpl.html
+
+import os
+from zipfile import *
+
+from util.misc.DirectoriesAndFilesTools import *
+
+#
------------------------------------------------------------------------------
+# Class to create a TGF file from the main directory of a python gadget
project.
+#
------------------------------------------------------------------------------
+class GadgetPackager(object):
+ """Class to create a TGF file from the main directory of a python gadget
+ project.
+ """
+
+ #
--------------------------------------------------------------------------
+ # Create a tgf file.
+ #
--------------------------------------------------------------------------
+ def createTgf(self, tgfFileName):
+ """Create a tgf file.
+ @param tgfFileName: Tux Gadget Format file name.
+ @return: The success of the file creation.
+ """
+ self.__sourcePath = os.path.realpath("")
+ if not os.path.isdir(self.__sourcePath):
+ return False
+ if not os.path.isdir(os.path.join(self.__sourcePath, "executables")):
+ return False
+ if not os.path.isdir(os.path.join(self.__sourcePath, "resources")):
+ return False
+ # Get some paths
+ SRC_EXECUTABLES_PATH = os.path.join(self.__sourcePath, "executables")
+ SRC_RESOURCES_PATH = os.path.join(self.__sourcePath, "resources")
+ TMP_BUILD_PATH = os.path.join(self.__sourcePath, "tmp")
+ DEST_EXECUTABLES_PATH = os.path.join(TMP_BUILD_PATH, "executables")
+ DEST_RESOURCES_PATH = os.path.join(TMP_BUILD_PATH, "resources")
+ DEST_TGF_FILENAME = os.path.join(self.__sourcePath, tgfFileName)
+ # Create the temporary build path
+ MKDirsF(TMP_BUILD_PATH)
+ # Copy "executables" directory
+ CPDir(SRC_EXECUTABLES_PATH, DEST_EXECUTABLES_PATH)
+ # Copy "resources" directory
+ CPDir(SRC_RESOURCES_PATH, DEST_RESOURCES_PATH)
+ # Filtering the content of temporary path
+ RMWithFilters(TMP_BUILD_PATH, filters = ['.svn', '.pyc'])
+ # Create a zip file
+ directory = TMP_BUILD_PATH
+ last_cwd = os.getcwd()
+ os.chdir(TMP_BUILD_PATH)
+ zf = ZipFile(DEST_TGF_FILENAME, 'w', compression = ZIP_DEFLATED)
+ def walker(zip, directory, files, root = directory):
+ for file in files:
+ file = os.path.join(directory, file)
+ name = file[len(TMP_BUILD_PATH) + 1:]
+ if os.path.isfile(file):
+ zip.write(file, name, ZIP_DEFLATED)
+ elif os.path.isdir(file):
+ file = os.path.join(file, "")
+ name = os.path.join(name, "")
+ zip.writestr(name, name)
+ os.path.walk(TMP_BUILD_PATH, walker, zf)
+ zf.close()
+ os.chdir(os.path.abspath(last_cwd))
+ # Remove the temporary directory
+ RMDirs(TMP_BUILD_PATH)
+ return True
Property changes on:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/GadgetPackager.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/__init__.py
===================================================================
Property changes on:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/__init__.py
===================================================================
Property changes on:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/DirectoriesAndFilesTools.py
===================================================================
---
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/DirectoriesAndFilesTools.py
(rev 0)
+++
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/DirectoriesAndFilesTools.py
2009-03-19 16:00:46 UTC (rev 4154)
@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+
+import version
+__author__ = version.author
+__date__ = version.date
+__version__ = version.version
+__licence__ = version.licence
+del version
+
+# Copyleft (C) 2008 Acness World
+# Remi Jocaille <[email protected]>
+# Distributed under the terms of the GNU General Public License
+# http://www.gnu.org/copyleft/gpl.html
+
+import os
+import shutil
+
+if os.name == 'nt':
+ import win32con
+ import win32file
+
+#
==============================================================================
+# Public functions
+#
==============================================================================
+
+#
------------------------------------------------------------------------------
+# Force to create a directories tree if not exists.
+#
------------------------------------------------------------------------------
+def MKDirs(path):
+ """Force to create a directories tree if not exists.
+ @param path: Directory path.
+ """
+ if not os.path.isdir(path):
+ try:
+ os.makedirs(path)
+ except:
+ pass
+
+#
------------------------------------------------------------------------------
+# Force to create a directories tree after having deleted the old one.
+#
------------------------------------------------------------------------------
+def MKDirsF(path):
+ """Force to create a directories tree after having deleted the old one.
+ @param path: Directory path.
+ """
+ if os.path.isdir(path):
+ RMDirs(path)
+ os.makedirs(path)
+
+#
------------------------------------------------------------------------------
+# Remove directories and files recursively.
+#
------------------------------------------------------------------------------
+def RMDirs(path):
+ """Remove directories and files recursively.
+ @param path: Path of the base directory.
+ """
+ if not os.path.isdir(path):
+ return
+ for root, dirs, files in os.walk(path, topdown = False):
+ for d in dirs:
+ try:
+ os.removedirs(os.path.join(root, d))
+ except:
+ pass
+ for f in files:
+ try:
+ if os.name == 'nt':
+ win32file.SetFileAttributesW(os.path.join(root, f),
+ win32con.FILE_ATTRIBUTE_NORMAL)
+ os.remove(os.path.join(root, f))
+ except:
+ pass
+ if os.path.isdir(path):
+ try:
+ os.removedirs(path)
+ except:
+ pass
+
+#
------------------------------------------------------------------------------
+# Remove directories and files recursively with filters.
+#
------------------------------------------------------------------------------
+def RMWithFilters(path, filters = ['.pyc', '.pyo']):
+ """Remove directories and files recursively with filters.
+ @param path: Path of the base directory.
+ @param filters: Filters as list.
+ """
+ def checkFilter(name):
+ for filter in filters:
+ if name.lower().find(filter.lower()) == (len(name) - len(filter)):
+ return True
+ return False
+
+ if not os.path.isdir(path):
+ return
+
+ for root, dirs, files in os.walk(path, topdown = False):
+ for d in dirs:
+ if checkFilter(os.path.join(root, d)):
+ try:
+ RMDirs(os.path.join(root, d))
+ except:
+ pass
+ for f in files:
+ if checkFilter(os.path.join(root, f)):
+ try:
+ if os.name == 'nt':
+ win32file.SetFileAttributesW(os.path.join(root, f),
+ win32con.FILE_ATTRIBUTE_NORMAL)
+ os.remove(os.path.join(root, f))
+ except:
+ pass
+
+#
------------------------------------------------------------------------------
+# Remove a file.
+#
------------------------------------------------------------------------------
+def RMFile(path):
+ """Remove a file.
+ @param path: File path.
+ """
+ if os.path.isfile(path):
+ try:
+ if os.name == 'nt':
+ win32file.SetFileAttributesW(path,
+ win32con.FILE_ATTRIBUTE_NORMAL)
+ os.remove(path)
+ except:
+ pass
+
+#
------------------------------------------------------------------------------
+# Copy a directories tree to another directory.
+#
------------------------------------------------------------------------------
+def CPDir(src, dest):
+ """Copy a directories tree to another directory.
+ @param src: Source path.
+ @param dest: Destination path.
+ """
+ if not os.path.isdir(src):
+ return
+ if os.path.isdir(dest):
+ RMDirs(dest)
+ shutil.copytree(src, dest)
+
+#
------------------------------------------------------------------------------
+# Retrieve the OS temporary directory.
+#
------------------------------------------------------------------------------
+def GetOSTMPDir():
+ """Retrieve the OS temporary directory.
+ @return: The OS temporary directory.
+ """
+ result = None
+ # On Windows
+ if os.name == 'nt':
+ result = os.environ.get('tmp')
+ if result == None:
+ result = os.environ.get('temp')
+ if result == None:
+ result = "c:\\windows\\temp"
+ # On linux
+ else:
+ result = "/tmp"
+ return result
Property changes on:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/DirectoriesAndFilesTools.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/__init__.py
===================================================================
Property changes on:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/test_DirectoriesAndFilesTools.py
===================================================================
---
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/test_DirectoriesAndFilesTools.py
(rev 0)
+++
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/test_DirectoriesAndFilesTools.py
2009-03-19 16:00:46 UTC (rev 4154)
@@ -0,0 +1,173 @@
+# -*- coding: utf-8 -*-
+
+import version
+__author__ = version.author
+__date__ = version.date
+__version__ = version.version
+__licence__ = version.licence
+del version
+
+# Copyleft (C) 2008 C2ME Sa
+# Remi Jocaille <[email protected]>
+# Distributed under the terms of the GNU General Public License
+# http://www.gnu.org/copyleft/gpl.html
+
+import unittest
+import os
+
+import DirectoriesAndFilesTools
+
+#
==============================================================================
+# Public class
+#
==============================================================================
+
+#
------------------------------------------------------------------------------
+# A test class for DirectoriesAndFilesTools module.
+#
------------------------------------------------------------------------------
+class testDirectoriesAndFilesTools(unittest.TestCase):
+ """A test class for DirectoriesAndFilesTools module.
+ """
+
+ #
--------------------------------------------------------------------------
+ # Initialization.
+ #
--------------------------------------------------------------------------
+ def setUp(self):
+ """Initialization.
+ """
+ self.tmpDirectory = ""
+
+ #
--------------------------------------------------------------------------
+ # Test the retrieving of the temporary directory.
+ #
--------------------------------------------------------------------------
+ def test00GetOSTMPDir(self):
+ """Test the retrieving of the temporary directory.
+ """
+ # Retrieve the temporary directory of the OS.
+ self.tmpDirectory = DirectoriesAndFilesTools.GetOSTMPDir()
+ self.assertNotEqual(self.tmpDirectory, "")
+ # Check the creation of a file in the retrieved directory
+ work = True
+ try:
+ f = open(os.path.join(self.tmpDirectory, "test.tmp"), 'wb')
+ f.write("\n")
+ f.close()
+ os.remove(os.path.join(self.tmpDirectory, "test.tmp"))
+ except:
+ work = False
+ self.assertEqual(work, True)
+
+ #
--------------------------------------------------------------------------
+ # Test the creation of a new directories tree.
+ #
--------------------------------------------------------------------------
+ def test01CreateDirectoriesTree(self):
+ """Test the creation of a new directories tree.
+ """
+ # Create a directories tree
+ self.tmpDirectory = DirectoriesAndFilesTools.GetOSTMPDir()
+ extTree = os.path.join(self.tmpDirectory, 'test', 'test2', 'test3')
+ DirectoriesAndFilesTools.MKDirs(extTree)
+ # Check if the last directory exists
+ self.assertTrue(os.path.isdir(extTree))
+ # Create a file
+ try:
+ f = open(os.path.join(extTree, 'myfile.tmp'), 'wb')
+ f.close()
+ except:
+ pass
+ self.assertTrue(os.path.isfile(os.path.join(extTree, 'myfile.tmp')))
+
+ #
--------------------------------------------------------------------------
+ # Test the creation of a clean directories tree (Erase the old one).
+ #
--------------------------------------------------------------------------
+ def test02CreateDirectoriesTreeFFS(self):
+ """Test the creation of a clean directories tree (Erase the old one).
+ """
+ # Create a directories tree
+ self.tmpDirectory = DirectoriesAndFilesTools.GetOSTMPDir()
+ extTree = os.path.join(self.tmpDirectory, 'test', 'test2', 'test3')
+ DirectoriesAndFilesTools.MKDirsF(extTree)
+ # Check if the last directory exists
+ self.assertTrue(os.path.isdir(extTree))
+ # Check if the previously created file still exists
+ self.assertFalse(os.path.isfile(os.path.join(extTree, 'myfile.tmp')))
+
+ #
--------------------------------------------------------------------------
+ # Test the removing of directories and files with a name filter.
+ #
--------------------------------------------------------------------------
+ def test03RemoveDAFRecWF(self):
+ """Test the removing of directories and files with a name filter.
+ """
+ self.tmpDirectory = DirectoriesAndFilesTools.GetOSTMPDir()
+ extTree = os.path.join(self.tmpDirectory, 'test', 'test2', 'test3')
+ # Create some files
+ try:
+ f = open(os.path.join(extTree, 'myfile.tmp'), 'wb')
+ f.close()
+ f = open(os.path.join(extTree, 'myfile2.tmp'), 'wb')
+ f.close()
+ f = open(os.path.join(extTree, 'myfile.ttt'), 'wb')
+ f.close()
+ f = open(os.path.join(extTree, 'myfile.h'), 'wb')
+ f.close()
+ except:
+ pass
+ self.assertTrue(os.path.isfile(os.path.join(extTree, 'myfile.tmp')))
+ # Create a directory called '.tmp'
+ DirectoriesAndFilesTools.MKDirs(os.path.join(extTree, 'truc.tmp'))
+ self.assertTrue(os.path.isdir(os.path.join(extTree, 'truc.tmp')))
+ # Remove files and directories with 'tmp' extention
+ DirectoriesAndFilesTools.RMWithFilters(extTree, filters = ['.tmp', ])
+ self.assertFalse(os.path.isfile(os.path.join(extTree, 'myfile.tmp')))
+ self.assertFalse(os.path.isfile(os.path.join(extTree, 'myfile2.tmp')))
+ self.assertFalse(os.path.isdir(os.path.join(extTree, 'truc.tmp')))
+ self.assertTrue(os.path.isdir(extTree))
+
+ #
--------------------------------------------------------------------------
+ # Test the copying of directories tree.
+ #
--------------------------------------------------------------------------
+ def test04CopyTree(self):
+ """Test the copying of directories tree.
+ """
+ self.tmpDirectory = DirectoriesAndFilesTools.GetOSTMPDir()
+ extTree = os.path.join(self.tmpDirectory, 'test2', 'test2', 'test3')
+ DirectoriesAndFilesTools.CPDir(os.path.join(self.tmpDirectory, 'test'),
+ os.path.join(self.tmpDirectory, 'test2'))
+ self.assertTrue(os.path.isfile(os.path.join(extTree, 'myfile.ttt')))
+
+ #
--------------------------------------------------------------------------
+ # Test the removing of directories tree with files.
+ #
--------------------------------------------------------------------------
+ def test05RemoveDAFRec(self):
+ """Test the removing of directories tree with files.
+ """
+ self.tmpDirectory = DirectoriesAndFilesTools.GetOSTMPDir()
+ baseTree = os.path.join(self.tmpDirectory, 'test')
+ DirectoriesAndFilesTools.RMDirs(baseTree)
+ self.assertFalse(os.path.isdir(baseTree))
+ baseTree = os.path.join(self.tmpDirectory, 'test2')
+ DirectoriesAndFilesTools.RMDirs(baseTree)
+ self.assertFalse(os.path.isdir(baseTree))
+
+#
==============================================================================
+# Public functions
+#
==============================================================================
+
+#
------------------------------------------------------------------------------
+# Unitest suite for the module 'DirectoriesAndFilesTools'
+#
------------------------------------------------------------------------------
+def suite():
+ """Unitest suite for the module 'DirectoriesAndFilesTools'
+ """
+ print "\n" + "".join("=" * 70)
+ print "Test the 'DirectoriesAndFilesTools' Module"
+ print "".join("=" * 70) + "\n"
+
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(testDirectoriesAndFilesTools))
+ return suite
+
+#
------------------------------------------------------------------------------
+# Main
+#
------------------------------------------------------------------------------
+if __name__ == '__main__':
+ unittest.TextTestRunner(verbosity=2).run(suite())
Property changes on:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/test_DirectoriesAndFilesTools.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/version.py
===================================================================
---
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/version.py
(rev 0)
+++
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/version.py
2009-03-19 16:00:46 UTC (rev 4154)
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+
+"""Version data for tuxisalive.lib.Util"""
+
+__author__ = "Remi Jocaille ([email protected])"
+
+# Copyleft (C) 2008 C2ME Sa
+# Remi Jocaille <[email protected]>
+# Distributed under the terms of the GNU General Public License
+# http://www.gnu.org/copyleft/gpl.html
+
+name = 'util.misc'
+version = '0.0.1'
+author = "Remi Jocaille ([email protected])"
+
+description = "Utilities libraries."
+
+licence = "GPL"
+date = "December 2008"
Property changes on:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/util/misc/version.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/version.py
===================================================================
---
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/version.py
(rev 0)
+++
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/version.py
2009-03-19 16:00:46 UTC (rev 4154)
@@ -0,0 +1,9 @@
+# Copyleft (C) 2009 C2ME Sa
+# Remi Jocaille <[email protected]>
+# Distributed under the terms of the GNU General Public License
+# http://www.gnu.org/copyleft/gpl.html
+
+version = '0.0.1'
+author = "Remi Jocaille ([email protected])"
+licence = "GPL"
+date = "2009"
Property changes on:
software_suite_v2/software/gadgets/DemosGadgets/tuxdroid-python-gadget-HelloWorld/trunk/builder/version.py
___________________________________________________________________
Name: svn:keywords
+ Id
------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
Tux-droid-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tux-droid-svn