Show More
@@ -148,6 +148,131 b' def archivelist(ui, nodeid, url):' | |||
|
148 | 148 | |
|
149 | 149 | return archives |
|
150 | 150 | |
|
151 | def rawindexentries(ui, repos, wsgireq, req, subdir='', **map): | |
|
152 | descend = ui.configbool('web', 'descend') | |
|
153 | collapse = ui.configbool('web', 'collapse') | |
|
154 | seenrepos = set() | |
|
155 | seendirs = set() | |
|
156 | for name, path in repos: | |
|
157 | ||
|
158 | if not name.startswith(subdir): | |
|
159 | continue | |
|
160 | name = name[len(subdir):] | |
|
161 | directory = False | |
|
162 | ||
|
163 | if '/' in name: | |
|
164 | if not descend: | |
|
165 | continue | |
|
166 | ||
|
167 | nameparts = name.split('/') | |
|
168 | rootname = nameparts[0] | |
|
169 | ||
|
170 | if not collapse: | |
|
171 | pass | |
|
172 | elif rootname in seendirs: | |
|
173 | continue | |
|
174 | elif rootname in seenrepos: | |
|
175 | pass | |
|
176 | else: | |
|
177 | directory = True | |
|
178 | name = rootname | |
|
179 | ||
|
180 | # redefine the path to refer to the directory | |
|
181 | discarded = '/'.join(nameparts[1:]) | |
|
182 | ||
|
183 | # remove name parts plus accompanying slash | |
|
184 | path = path[:-len(discarded) - 1] | |
|
185 | ||
|
186 | try: | |
|
187 | r = hg.repository(ui, path) | |
|
188 | directory = False | |
|
189 | except (IOError, error.RepoError): | |
|
190 | pass | |
|
191 | ||
|
192 | parts = [name] | |
|
193 | parts.insert(0, '/' + subdir.rstrip('/')) | |
|
194 | if wsgireq.env['SCRIPT_NAME']: | |
|
195 | parts.insert(0, wsgireq.env['SCRIPT_NAME']) | |
|
196 | url = re.sub(r'/+', '/', '/'.join(parts) + '/') | |
|
197 | ||
|
198 | # show either a directory entry or a repository | |
|
199 | if directory: | |
|
200 | # get the directory's time information | |
|
201 | try: | |
|
202 | d = (get_mtime(path), dateutil.makedate()[1]) | |
|
203 | except OSError: | |
|
204 | continue | |
|
205 | ||
|
206 | # add '/' to the name to make it obvious that | |
|
207 | # the entry is a directory, not a regular repository | |
|
208 | row = {'contact': "", | |
|
209 | 'contact_sort': "", | |
|
210 | 'name': name + '/', | |
|
211 | 'name_sort': name, | |
|
212 | 'url': url, | |
|
213 | 'description': "", | |
|
214 | 'description_sort': "", | |
|
215 | 'lastchange': d, | |
|
216 | 'lastchange_sort': d[1] - d[0], | |
|
217 | 'archives': [], | |
|
218 | 'isdirectory': True, | |
|
219 | 'labels': [], | |
|
220 | } | |
|
221 | ||
|
222 | seendirs.add(name) | |
|
223 | yield row | |
|
224 | continue | |
|
225 | ||
|
226 | u = ui.copy() | |
|
227 | try: | |
|
228 | u.readconfig(os.path.join(path, '.hg', 'hgrc')) | |
|
229 | except Exception as e: | |
|
230 | u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e)) | |
|
231 | continue | |
|
232 | ||
|
233 | def get(section, name, default=uimod._unset): | |
|
234 | return u.config(section, name, default, untrusted=True) | |
|
235 | ||
|
236 | if u.configbool("web", "hidden", untrusted=True): | |
|
237 | continue | |
|
238 | ||
|
239 | if not readallowed(u, req): | |
|
240 | continue | |
|
241 | ||
|
242 | # update time with local timezone | |
|
243 | try: | |
|
244 | r = hg.repository(ui, path) | |
|
245 | except IOError: | |
|
246 | u.warn(_('error accessing repository at %s\n') % path) | |
|
247 | continue | |
|
248 | except error.RepoError: | |
|
249 | u.warn(_('error accessing repository at %s\n') % path) | |
|
250 | continue | |
|
251 | try: | |
|
252 | d = (get_mtime(r.spath), dateutil.makedate()[1]) | |
|
253 | except OSError: | |
|
254 | continue | |
|
255 | ||
|
256 | contact = get_contact(get) | |
|
257 | description = get("web", "description") | |
|
258 | seenrepos.add(name) | |
|
259 | name = get("web", "name", name) | |
|
260 | row = {'contact': contact or "unknown", | |
|
261 | 'contact_sort': contact.upper() or "unknown", | |
|
262 | 'name': name, | |
|
263 | 'name_sort': name, | |
|
264 | 'url': url, | |
|
265 | 'description': description or "unknown", | |
|
266 | 'description_sort': description.upper() or "unknown", | |
|
267 | 'lastchange': d, | |
|
268 | 'lastchange_sort': d[1] - d[0], | |
|
269 | 'archives': archivelist(u, "tip", url), | |
|
270 | 'isdirectory': None, | |
|
271 | 'labels': u.configlist('web', 'labels', untrusted=True), | |
|
272 | } | |
|
273 | ||
|
274 | yield row | |
|
275 | ||
|
151 | 276 | class hgwebdir(object): |
|
152 | 277 | """HTTP server for multiple repositories. |
|
153 | 278 | |
@@ -347,134 +472,10 b' class hgwebdir(object):' | |||
|
347 | 472 | def makeindex(self, wsgireq, tmpl, subdir=""): |
|
348 | 473 | req = wsgireq.req |
|
349 | 474 | |
|
350 | def rawentries(subdir="", **map): | |
|
351 | ||
|
352 | descend = self.ui.configbool('web', 'descend') | |
|
353 | collapse = self.ui.configbool('web', 'collapse') | |
|
354 | seenrepos = set() | |
|
355 | seendirs = set() | |
|
356 | for name, path in self.repos: | |
|
357 | ||
|
358 | if not name.startswith(subdir): | |
|
359 | continue | |
|
360 | name = name[len(subdir):] | |
|
361 | directory = False | |
|
362 | ||
|
363 | if '/' in name: | |
|
364 | if not descend: | |
|
365 | continue | |
|
366 | ||
|
367 | nameparts = name.split('/') | |
|
368 | rootname = nameparts[0] | |
|
369 | ||
|
370 | if not collapse: | |
|
371 | pass | |
|
372 | elif rootname in seendirs: | |
|
373 | continue | |
|
374 | elif rootname in seenrepos: | |
|
375 | pass | |
|
376 | else: | |
|
377 | directory = True | |
|
378 | name = rootname | |
|
379 | ||
|
380 | # redefine the path to refer to the directory | |
|
381 | discarded = '/'.join(nameparts[1:]) | |
|
382 | ||
|
383 | # remove name parts plus accompanying slash | |
|
384 | path = path[:-len(discarded) - 1] | |
|
385 | ||
|
386 | try: | |
|
387 | r = hg.repository(self.ui, path) | |
|
388 | directory = False | |
|
389 | except (IOError, error.RepoError): | |
|
390 | pass | |
|
391 | ||
|
392 | parts = [name] | |
|
393 | parts.insert(0, '/' + subdir.rstrip('/')) | |
|
394 | if wsgireq.env['SCRIPT_NAME']: | |
|
395 | parts.insert(0, wsgireq.env['SCRIPT_NAME']) | |
|
396 | url = re.sub(r'/+', '/', '/'.join(parts) + '/') | |
|
397 | ||
|
398 | # show either a directory entry or a repository | |
|
399 | if directory: | |
|
400 | # get the directory's time information | |
|
401 | try: | |
|
402 | d = (get_mtime(path), dateutil.makedate()[1]) | |
|
403 | except OSError: | |
|
404 | continue | |
|
405 | ||
|
406 | # add '/' to the name to make it obvious that | |
|
407 | # the entry is a directory, not a regular repository | |
|
408 | row = {'contact': "", | |
|
409 | 'contact_sort': "", | |
|
410 | 'name': name + '/', | |
|
411 | 'name_sort': name, | |
|
412 | 'url': url, | |
|
413 | 'description': "", | |
|
414 | 'description_sort': "", | |
|
415 | 'lastchange': d, | |
|
416 | 'lastchange_sort': d[1]-d[0], | |
|
417 | 'archives': [], | |
|
418 | 'isdirectory': True, | |
|
419 | 'labels': [], | |
|
420 | } | |
|
421 | ||
|
422 | seendirs.add(name) | |
|
423 | yield row | |
|
424 | continue | |
|
425 | ||
|
426 | u = self.ui.copy() | |
|
427 | try: | |
|
428 | u.readconfig(os.path.join(path, '.hg', 'hgrc')) | |
|
429 | except Exception as e: | |
|
430 | u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e)) | |
|
431 | continue | |
|
432 | def get(section, name, default=uimod._unset): | |
|
433 | return u.config(section, name, default, untrusted=True) | |
|
434 | ||
|
435 | if u.configbool("web", "hidden", untrusted=True): | |
|
436 | continue | |
|
437 | ||
|
438 | if not readallowed(u, req): | |
|
439 | continue | |
|
440 | ||
|
441 | # update time with local timezone | |
|
442 | try: | |
|
443 | r = hg.repository(self.ui, path) | |
|
444 | except IOError: | |
|
445 | u.warn(_('error accessing repository at %s\n') % path) | |
|
446 | continue | |
|
447 | except error.RepoError: | |
|
448 | u.warn(_('error accessing repository at %s\n') % path) | |
|
449 | continue | |
|
450 | try: | |
|
451 | d = (get_mtime(r.spath), dateutil.makedate()[1]) | |
|
452 | except OSError: | |
|
453 | continue | |
|
454 | ||
|
455 | contact = get_contact(get) | |
|
456 | description = get("web", "description") | |
|
457 | seenrepos.add(name) | |
|
458 | name = get("web", "name", name) | |
|
459 | row = {'contact': contact or "unknown", | |
|
460 | 'contact_sort': contact.upper() or "unknown", | |
|
461 | 'name': name, | |
|
462 | 'name_sort': name, | |
|
463 | 'url': url, | |
|
464 | 'description': description or "unknown", | |
|
465 | 'description_sort': description.upper() or "unknown", | |
|
466 | 'lastchange': d, | |
|
467 | 'lastchange_sort': d[1]-d[0], | |
|
468 | 'archives': archivelist(u, "tip", url), | |
|
469 | 'isdirectory': None, | |
|
470 | 'labels': u.configlist('web', 'labels', untrusted=True), | |
|
471 | } | |
|
472 | ||
|
473 | yield row | |
|
474 | ||
|
475 | 475 | sortdefault = None, False |
|
476 | 476 | def entries(sortcolumn="", descending=False, subdir="", **map): |
|
477 |
rows = rawentries(s |
|
|
477 | rows = rawindexentries(self.ui, self.repos, wsgireq, req, | |
|
478 | subdir=subdir, **map) | |
|
478 | 479 | |
|
479 | 480 | if sortcolumn and sortdefault != (sortcolumn, descending): |
|
480 | 481 | sortkey = '%s_sort' % sortcolumn |
General Comments 0
You need to be logged in to leave comments.
Login now