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

[dak/master] Replace by-hashed files with symlinks



---
 dak/generate_releases.py | 32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/dak/generate_releases.py b/dak/generate_releases.py
index d1fc89f..6b8ea75 100755
--- a/dak/generate_releases.py
+++ b/dak/generate_releases.py
@@ -199,7 +199,7 @@ class ReleaseWriter(object):
 
         # Update the hashfile table with new or updated files
         for filename in fileinfo:
-            if not os.path.exists(filename):
+            if not os.path.lexists(filename):
                 # probably an uncompressed index we didn't generate
                 continue
             byhashdir = os.path.join(os.path.dirname(filename), 'by-hash')
@@ -227,23 +227,13 @@ class ReleaseWriter(object):
     def _make_byhash_links(self, fileinfo, hashes):
         # Create hardlinks in by-hash directories
         for filename in fileinfo:
-            if not os.path.exists(filename):
+            if not os.path.lexists(filename):
                 # probably an uncompressed index we didn't generate
                 continue
 
             for h in hashes:
                 field = h.release_field
                 hashfile = os.path.join(os.path.dirname(filename), 'by-hash', field, fileinfo[filename][field])
-
-                # if the hash is known to exist, re-use the old file
-                if os.path.exists(hashfile):
-                    os.unlink(filename)
-                    os.link(hashfile, filename)
-                    break
-
-            for h in hashes:
-                field = h.release_field
-                hashfile = os.path.join(os.path.dirname(filename), 'by-hash', field, fileinfo[filename][field])
                 try:
                     os.makedirs(os.path.dirname(hashfile))
                 except OSError as exc:
@@ -255,6 +245,23 @@ class ReleaseWriter(object):
                     if exc.errno != errno.EEXIST:
                         raise
 
+    def _make_byhash_base_symlink(self, fileinfo, hashes):
+        # Create symlinks to files in by-hash directories
+        for filename in fileinfo:
+            if not os.path.lexists(filename):
+                # probably an uncompressed index we didn't generate
+                continue
+
+            besthash = hashes[-1]
+            field = besthash.release_field
+            hashfilebase = os.path.join('by-hash', field, fileinfo[filename][field])
+            hashfile = os.path.join(os.path.dirname(filename), hashfilebase)
+
+            assert os.path.exists(hashfile), 'by-hash file {} is missing'.format(hashfile)
+
+            os.unlink(filename)
+            os.symlink(hashfilebase, filename)
+
     def generate_release_files(self):
         """
         Generate Release files for the given suite
@@ -430,6 +437,7 @@ class ReleaseWriter(object):
 
         self._update_hashfile_table(session, fileinfo_byhash, hashes)
         self._make_byhash_links(fileinfo_byhash, hashes)
+        self._make_byhash_base_symlink(fileinfo_byhash, hashes)
 
         sign_release_dir(suite, os.path.dirname(outfile))
 
-- 
2.1.4


Reply to: