[tor-commits] [thandy/master] Adds basic installation

nickm at torproject.org nickm at torproject.org
Thu Nov 3 19:14:20 UTC 2011


commit 7fb9bb97c1f76e04b32b9b943abb725d7aa9adaa
Author: Tomas Touceda <chiiph at gentoo.org>
Date:   Sat Jun 25 21:12:29 2011 -0300

    Adds basic installation
    
    Right now it's a bit more than just copying files, nothing else.
---
 lib/thandy/ClientCLI.py              |    4 +-
 lib/thandy/packagesys/ThpPackages.py |   71 ++++++++++++++++++++++++----------
 lib/thandy/repository.py             |   11 ++---
 3 files changed, 57 insertions(+), 29 deletions(-)

diff --git a/lib/thandy/ClientCLI.py b/lib/thandy/ClientCLI.py
index 6a78bf6..92f038a 100644
--- a/lib/thandy/ClientCLI.py
+++ b/lib/thandy/ClientCLI.py
@@ -15,6 +15,7 @@ import thandy.repository
 import thandy.download
 import thandy.master_keys
 import thandy.packagesys.PackageSystem
+import thandy.packagesys.ThpPackages
 import thandy.socksurls
 import thandy.encodeToXML
 
@@ -157,7 +158,8 @@ def update(args):
             print "Bundles with all THP packages:"
             for bundle in thpTransactions:
               # TODO: ThpTransaction goes here!
-              print thpTransactions[bundle]
+              thandy.packagesys.ThpPackages.ThpTransaction(thpTransactions[bundle], 
+                                                          repoRoot).install()
 
             return
 
diff --git a/lib/thandy/packagesys/ThpPackages.py b/lib/thandy/packagesys/ThpPackages.py
index c976d50..7edb42b 100644
--- a/lib/thandy/packagesys/ThpPackages.py
+++ b/lib/thandy/packagesys/ThpPackages.py
@@ -5,8 +5,9 @@ import os
 import zipfile
 import tempfile
 import time
+import shutil
 
-from lockfile import LockFile
+from lockfile import LockFile, AlreadyLocked, LockFailed
 
 import thandy.util
 import thandy.formats
@@ -21,7 +22,7 @@ class ThpDB(object):
         if self._thp_db_root is None:
           raise Exception("There is no THP_DB_ROOT variable set")
 
-    def dbPath(self):
+    def getPath(self):
         return self._thp_db_root
 
     def insert(self, pkg):
@@ -83,43 +84,50 @@ class ThpChecker(PS.Checker):
         return self._version in self.getInstalledVersions()
 
 class ThpTransaction(object):
-    def __init__(self, packages):
+    def __init__(self, packages, repoRoot):
         self._raw_packages = packages
+        self._repo_root = repoRoot
         self._installers = []
         self._db = ThpDB()
 
         self._process()
 
     def _process(self):
-        for package in self._raw_packages:
-            self._installers.append(ThpInstaller(package['path']))
+        for package in self._raw_packages.keys():
+            self._installers.append(ThpInstaller(self._raw_packages[package]['files'][0][0],
+                                    self._db,
+                                    self._repo_root))
 
     def _orderByDep(self):
         """ Orders packages with a topological order by its dependencies """
-        pass
+        return self._installers
 
     def install(self):
-        lockfile = os.path.join(self._db.getPath(), ".lock")
+        lockfile = os.path.join(self._db.getPath(), "db")
         lock = LockFile(lockfile)
         try:
+            print "Acquiring lock..."
             lock.acquire()
-            order = self._orderByDep(self)
+            print "Lock acquired"
+            order = self._orderByDep()
             for pkg in order:
+                print "Starting installation using", pkg
                 pkg.install()
         except AlreadyLocked:
             print "You can't run more than one instance of Thandy"
         except LockFailed:
             print "Can't acquire lock on %s" % lockfile
-
-        lock.release()
+        finally:
+            lock.release()
 
     def remote(self):
         raise NotImplemented()
 
 class ThpInstaller(PS.Installer):
-    def __init__(self, relPath, db = None):
+    def __init__(self, relPath, db = None, repoRoot = None):
         PS.Installer.__init__(self, relPath)
         self._db = db
+        self.setCacheRoot(repoRoot)
         if db is None:
             self._db = ThpDB()
         self._pkg = ThpPackage(os.path.join(self._cacheRoot, self._relPath[1:]))
@@ -133,12 +141,28 @@ class ThpInstaller(PS.Installer):
         if self._thp_root is None:
             raise Exception("There is no THP_INSTALL_ROOT variable set")
 
-#        shutil.copytree()
+        destPath = os.path.join(self._thp_root, self._pkg.get("package_name"))
+        print "Destination directory:", destPath
+
+        pkg_metadata = self._pkg.getAll()
+        self._db.insert(pkg_metadata)
+        self._db.statusInProgress(pkg_metadata)
+
+        dir = os.path.join(self._thp_root, self._pkg.get("package_name"))
+        try:
+            os.mkdir(dir)
+        except:
+            print "%s: Already exists, using it." % dir
 
-#        self._db.insert(pkg.getAll())
-#        self._db.statusInstalled(pkg.getAll())
-#        self._db.delete(pkg.getAll())
+        for file in self._pkg.get('manifest'):
+            if file['is_config']:
+                print "Ignoring file:", file
+            else:
+                print "Processing file:", file
+                shutil.copyfile(os.path.join(self._pkg.getTmpPath(), "content", file['name']),
+                                os.path.join(destPath, file['name']));
 
+        self._db.statusInstalled(pkg_metadata)
 
     def remove(self):
         print "Running thp remover"
@@ -151,23 +175,25 @@ class ThpPackage(object):
         self._thp_path = thp_path
         self._metadata = None
         self._valid = False
+        self._tmp_path = ""
 
         self._process()
 
+    def __del__(self):
+        thandy.util.deltree(self._tmp_path)
+
     def __repr__(self):
         print "ThpPackage(%s)" % self._thp_path
 
     def _process(self):
-        tmpPath = tempfile.mkdtemp(suffix=str(time.time()),
+        self._tmp_path = tempfile.mkdtemp(suffix=str(time.time()),
                                    prefix="thp")
 
         thpFile = zipfile.ZipFile(self._thp_path)
-        thpFile.extractall(tmpPath)
-        contents = open(os.path.join(tmpPath, "meta", "package.json")).read()
+        thpFile.extractall(self._tmp_path)
+        contents = open(os.path.join(self._tmp_path, "meta", "package.json")).read()
         self._metadata = json.loads(contents)
-        print self._validateFiles(tmpPath)
-
-        thandy.util.deltree(tmpPath)
+        print self._validateFiles(self._tmp_path)
 
     def get(self, key):
         if self._metadata:
@@ -183,6 +209,9 @@ class ThpPackage(object):
     def isValid(self):
         return self._valid
 
+    def getTmpPath(self):
+        return self._tmp_path
+
     def _validateFiles(self, tmpPath):
         for manifest in self._metadata['manifest']:
             name = manifest['name']
diff --git a/lib/thandy/repository.py b/lib/thandy/repository.py
index d082afb..f0b51b8 100644
--- a/lib/thandy/repository.py
+++ b/lib/thandy/repository.py
@@ -456,7 +456,6 @@ class LocalRepository:
 
         # Okay.  So we have some bundles.  See if we have their packages.
         packages = {}
-        thpBundle = False
         for bfile in bundles.values():
             bundle = bfile.get()
             for pkginfo in bundle['packages']:
@@ -489,16 +488,14 @@ class LocalRepository:
                 # We assume that if there is one thp package then all the rest
                 # are thp too. But we continue with the loop to check every
                 # package digest and signature
-                if thpBundle or pfile.get()["format"] == "thp":
-                    thpBundle = True
+                pfile_data = pfile.get()
+                if pfile_data["format"] == "thp":
+                    thpTransactionDict[bundle['name']] = {}
+                    thpTransactionDict[bundle['name']][pfile_data['name']] = pfile_data
                     continue
 
                 packages[rp] = pfile
 
-            if thpBundle:
-                thpTransactionDict[bundle['name']] = bundle['packages']
-            thpBundle = False
-
         # We have the packages. If we're downloading via bittorrent, we need
         # the .torrent metafiles, as well.
         if thandy.bt_compat.BtCompat.shouldUseBt():





More information about the tor-commits mailing list