1 |
commit: eff4b96c03175e65a368756d5bfe6d4ed0bb4627 |
2 |
Author: André Erdmann <dywi <AT> mailerd <DOT> de> |
3 |
AuthorDate: Fri Aug 30 12:41:12 2013 +0000 |
4 |
Commit: André Erdmann <dywi <AT> mailerd <DOT> de> |
5 |
CommitDate: Fri Aug 30 12:41:41 2013 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=eff4b96c |
7 |
|
8 |
distroot: handle_file_collision() [stub] |
9 |
|
10 |
--- |
11 |
roverlay/overlay/pkgdir/distroot/distroot.py | 70 ++++++++++++++++++++++------ |
12 |
roverlay/overlay/pkgdir/packagedir_base.py | 10 +++- |
13 |
2 files changed, 65 insertions(+), 15 deletions(-) |
14 |
|
15 |
diff --git a/roverlay/overlay/pkgdir/distroot/distroot.py b/roverlay/overlay/pkgdir/distroot/distroot.py |
16 |
index e38fccd..6deb06f 100644 |
17 |
--- a/roverlay/overlay/pkgdir/distroot/distroot.py |
18 |
+++ b/roverlay/overlay/pkgdir/distroot/distroot.py |
19 |
@@ -54,7 +54,7 @@ class DistrootBase ( object ): |
20 |
# or use hasattr ( self, '_default_distdir' ) |
21 |
self._flat = flat |
22 |
|
23 |
- self.distmap = distmap |
24 |
+ self._set_distmap ( distmap ) |
25 |
|
26 |
if flat: |
27 |
self._default_distdir = ( |
28 |
@@ -72,6 +72,10 @@ class DistrootBase ( object ): |
29 |
atexit.register ( self._atexit_run ) |
30 |
# --- end of __init__ (...) --- |
31 |
|
32 |
+ def _set_distmap ( self, distmap ): |
33 |
+ self.distmap = distmap |
34 |
+ # --- end of _set_distmap (...) --- |
35 |
+ |
36 |
def _atexit_run ( self ): |
37 |
"""Performs at-exit actions unless already done.""" |
38 |
if self.finalize_at_exit: |
39 |
@@ -100,6 +104,7 @@ class DistrootBase ( object ): |
40 |
self.distmap.backup_and_write ( force=False ) |
41 |
else: |
42 |
self.distmap.write ( force=False ) |
43 |
+ self.logger.debug ( "finalize() done" ) |
44 |
# --- end of finalize (...) --- |
45 |
|
46 |
@roverlay.util.objects.abstractmethod |
47 |
@@ -308,6 +313,20 @@ class DistrootBase ( object ): |
48 |
return str ( self._root ) |
49 |
# --- end of get_root (...) --- |
50 |
|
51 |
+ def get_fspath ( self, relpath ): |
52 |
+ """Returns the filesystem path prefixed with the distroot's directory |
53 |
+ path. |
54 |
+ |
55 |
+ arguments: |
56 |
+ * relpath -- |
57 |
+ """ |
58 |
+ return str ( self._root ) + os.sep + relpath |
59 |
+ # --- end of get_fspath (...) --- |
60 |
+ |
61 |
+ def get_relpath ( self, abspath ): |
62 |
+ return os.path.relpath ( dest, str ( self._root ) ) |
63 |
+ # --- end of get_relpath (...) --- |
64 |
+ |
65 |
def distmap_register ( self, p_info ): |
66 |
"""Adds a new entry for the given PackageInfo instance to the distmap. |
67 |
|
68 |
@@ -354,7 +373,9 @@ class DistrootBase ( object ): |
69 |
self.logger.info ( |
70 |
"file not in distmap, creating dummy entry: {!r}".format ( relpath ) |
71 |
) |
72 |
- self.distmap.add_dummy_entry ( relpath, hashdict=hashdict ) |
73 |
+ self.distmap.add_dummy_entry ( |
74 |
+ relpath, hashdict=hashdict, log_level=False |
75 |
+ ) |
76 |
distfiles.add ( relpath ) |
77 |
elif status == 2: |
78 |
# file in distmap, but not valid - remove it from distmap |
79 |
@@ -391,6 +412,13 @@ class DistrootBase ( object ): |
80 |
pass |
81 |
# --- end of set_distfile_owner (...) --- |
82 |
|
83 |
+ @roverlay.util.objects.abstractmethod ( |
84 |
+ params=[ 'package_dir', 'package_info' ] |
85 |
+ ) |
86 |
+ def handle_file_collision ( self, package_dir, package_info ): |
87 |
+ pass |
88 |
+ # --- end of handle_file_collision (...) --- |
89 |
+ |
90 |
# --- end of DistrootBase --- |
91 |
|
92 |
|
93 |
@@ -404,10 +432,19 @@ class TemporaryDistroot ( DistrootBase ): |
94 |
flat = False, |
95 |
logger = logger, |
96 |
) |
97 |
+ self._file_index = set() |
98 |
# --- end of __init__ (...) --- |
99 |
|
100 |
+ def handle_file_collision ( self, package_dir, package_info ): |
101 |
+ distfile_rel = package_info.get ( 'package_src_destpath' ) |
102 |
+ return distfile_rel not in self._file_index |
103 |
+ # --- end of handle_file_collision (...) --- |
104 |
+ |
105 |
def _add ( self, src, dest ): |
106 |
- return self._add_symlink ( src, dest, filter_exceptions=False ) |
107 |
+ ret = self._add_symlink ( src, dest, filter_exceptions=False ) |
108 |
+ if ret: |
109 |
+ self._file_index.add ( self.get_relpath ( dest ) ) |
110 |
+ return ret |
111 |
# --- end of _add (...) --- |
112 |
|
113 |
def _cleanup ( self ): |
114 |
@@ -416,7 +453,8 @@ class TemporaryDistroot ( DistrootBase ): |
115 |
shutil.rmtree ( self._root ) |
116 |
# --- end of _cleanup (...) --- |
117 |
|
118 |
- def set_distfile_owner ( self, *args, **kwargs ): |
119 |
+ def set_distfile_owner ( self, backref, distfile ): |
120 |
+ self._file_index.add ( distfile ) |
121 |
return True |
122 |
# --- end of set_distfile_owner (...) --- |
123 |
|
124 |
@@ -481,24 +519,30 @@ class PersistentDistroot ( DistrootBase ): |
125 |
self.USE_COPY : self._add_file, |
126 |
} |
127 |
|
128 |
- if self.distmap is not None: |
129 |
+ if verify and self.distmap is not None: |
130 |
+ # expensive task, print a message |
131 |
+ print ( |
132 |
+ "Checking distroot file integrity, this may take some time ... " |
133 |
+ ) |
134 |
+ self.check_integrity() |
135 |
+ # --- end of __init__ (...) --- |
136 |
+ |
137 |
+ def _set_distmap ( self, distmap ): |
138 |
+ self.distmap = distmap |
139 |
+ if distmap is not None: |
140 |
self.set_distfile_owner = self._set_distfile_owner_distmap |
141 |
- if verify: |
142 |
- # expensive task, print a message |
143 |
- print ( |
144 |
- "Checking distroot file integrity, this may take some time ... " |
145 |
- ) |
146 |
- self.check_integrity() |
147 |
else: |
148 |
self.set_distfile_owner = self._set_distfile_owner_nop |
149 |
- # --- end of __init__ (...) --- |
150 |
+ # --- end of _set_distmap (...) --- |
151 |
|
152 |
def _set_distfile_owner_nop ( self, backref, distfile ): |
153 |
return True |
154 |
# --- end of _set_distfile_owner_nop (...) --- |
155 |
|
156 |
def _set_distfile_owner_distmap ( self, backref, distfile ): |
157 |
- print ( "_set_distfile_owner_distmap(): method stub" ) |
158 |
+ self.distmap.add_distfile_owner ( |
159 |
+ backref, distfile, self.get_fspath ( distfile ) |
160 |
+ ) |
161 |
# --- end of _set_distfile_owner_distmap (...) --- |
162 |
|
163 |
def _add ( self, src, dest ): |
164 |
|
165 |
diff --git a/roverlay/overlay/pkgdir/packagedir_base.py b/roverlay/overlay/pkgdir/packagedir_base.py |
166 |
index 5196815..67488b4 100644 |
167 |
--- a/roverlay/overlay/pkgdir/packagedir_base.py |
168 |
+++ b/roverlay/overlay/pkgdir/packagedir_base.py |
169 |
@@ -225,7 +225,12 @@ class PackageDirBase ( roverlay.overlay.base.OverlayObject ): |
170 |
elif allow_postpone: |
171 |
added = None |
172 |
|
173 |
- elif self.DISTMAP.check_revbump_necessary ( package_info ): |
174 |
+ elif not self.DISTMAP.handle_file_collision ( |
175 |
+ self, package_info |
176 |
+ ): |
177 |
+ added = False |
178 |
+ |
179 |
+ elif self.DISTROOT.check_revbump_necessary ( package_info ): |
180 |
# resolve by recursion |
181 |
added = self.add ( |
182 |
package_info.revbump(), add_if_physical=False, _lock=False |
183 |
@@ -245,6 +250,7 @@ class PackageDirBase ( roverlay.overlay.base.OverlayObject ): |
184 |
PN=self.name, PVR=shortver |
185 |
) |
186 |
) |
187 |
+ |
188 |
else: |
189 |
# package has been added to this packagedir before, |
190 |
# this most likely happens if it is available from |
191 |
@@ -254,7 +260,7 @@ class PackageDirBase ( roverlay.overlay.base.OverlayObject ): |
192 |
PN=self.name, PVR=shortver |
193 |
) |
194 |
) |
195 |
- else: |
196 |
+ elif self.DISTROOT.handle_file_collision ( self, package_info ): |
197 |
self._packages [shortver] = package_info |
198 |
added = True |