##// END OF EJS Templates
store: refactor hashed encoding into its own function
Bryan O'Sullivan -
r17610:d0afa149 default
parent child Browse files
Show More
@@ -184,6 +184,38 b' def _auxencode(path, dotencode):'
184 _maxstorepathlen = 120
184 _maxstorepathlen = 120
185 _dirprefixlen = 8
185 _dirprefixlen = 8
186 _maxshortdirslen = 8 * (_dirprefixlen + 1) - 4
186 _maxshortdirslen = 8 * (_dirprefixlen + 1) - 4
187
188 def _hashencode(path, dotencode):
189 digest = _sha(path).hexdigest()
190 le = lowerencode(path).split('/')[1:]
191 parts = _auxencode(le, dotencode)
192 basename = parts[-1]
193 _root, ext = os.path.splitext(basename)
194 sdirs = []
195 sdirslen = 0
196 for p in parts[:-1]:
197 d = p[:_dirprefixlen]
198 if d[-1] in '. ':
199 # Windows can't access dirs ending in period or space
200 d = d[:-1] + '_'
201 if sdirslen == 0:
202 t = len(d)
203 else:
204 t = sdirslen + 1 + len(d)
205 if t > _maxshortdirslen:
206 break
207 sdirs.append(d)
208 sdirslen = t
209 dirs = '/'.join(sdirs)
210 if len(dirs) > 0:
211 dirs += '/'
212 res = 'dh/' + dirs + digest + ext
213 spaceleft = _maxstorepathlen - len(res)
214 if spaceleft > 0:
215 filler = basename[:spaceleft]
216 res = 'dh/' + dirs + filler + digest + ext
217 return res
218
187 def _hybridencode(path, dotencode):
219 def _hybridencode(path, dotencode):
188 '''encodes path with a length limit
220 '''encodes path with a length limit
189
221
@@ -219,34 +251,7 b' def _hybridencode(path, dotencode):'
219 ef = _encodefname(path).split('/')
251 ef = _encodefname(path).split('/')
220 res = '/'.join(_auxencode(ef, dotencode))
252 res = '/'.join(_auxencode(ef, dotencode))
221 if len(res) > _maxstorepathlen:
253 if len(res) > _maxstorepathlen:
222 digest = _sha(path).hexdigest()
254 res = _hashencode(path, dotencode)
223 le = lowerencode(path).split('/')[1:]
224 parts = _auxencode(le, dotencode)
225 basename = parts[-1]
226 _root, ext = os.path.splitext(basename)
227 sdirs = []
228 sdirslen = 0
229 for p in parts[:-1]:
230 d = p[:_dirprefixlen]
231 if d[-1] in '. ':
232 # Windows can't access dirs ending in period or space
233 d = d[:-1] + '_'
234 if sdirslen == 0:
235 t = len(d)
236 else:
237 t = sdirslen + 1 + len(d)
238 if t > _maxshortdirslen:
239 break
240 sdirs.append(d)
241 sdirslen = t
242 dirs = '/'.join(sdirs)
243 if len(dirs) > 0:
244 dirs += '/'
245 res = 'dh/' + dirs + digest + ext
246 spaceleft = _maxstorepathlen - len(res)
247 if spaceleft > 0:
248 filler = basename[:spaceleft]
249 res = 'dh/' + dirs + filler + digest + ext
250 return res
255 return res
251
256
252 def _calcmode(path):
257 def _calcmode(path):
General Comments 0
You need to be logged in to leave comments. Login now