Show More
@@ -148,6 +148,131 b' def archivelist(ui, nodeid, url):' | |||||
148 |
|
148 | |||
149 | return archives |
|
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 | class hgwebdir(object): |
|
276 | class hgwebdir(object): | |
152 | """HTTP server for multiple repositories. |
|
277 | """HTTP server for multiple repositories. | |
153 |
|
278 | |||
@@ -347,134 +472,10 b' class hgwebdir(object):' | |||||
347 | def makeindex(self, wsgireq, tmpl, subdir=""): |
|
472 | def makeindex(self, wsgireq, tmpl, subdir=""): | |
348 | req = wsgireq.req |
|
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 | sortdefault = None, False |
|
475 | sortdefault = None, False | |
476 | def entries(sortcolumn="", descending=False, subdir="", **map): |
|
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 | if sortcolumn and sortdefault != (sortcolumn, descending): |
|
480 | if sortcolumn and sortdefault != (sortcolumn, descending): | |
480 | sortkey = '%s_sort' % sortcolumn |
|
481 | sortkey = '%s_sort' % sortcolumn |
General Comments 0
You need to be logged in to leave comments.
Login now