| 348 | | localpath, rev, url = elements[0], '', elements[-1] |
| 349 | | if localpath.startswith('#'): |
| 350 | | externals.append((external, None, None, None, None)) |
| 351 | | continue |
| 352 | | if len(elements) == 3: |
| 353 | | rev = elements[1] |
| 354 | | rev = rev.replace('-r', '') |
| | 351 | if elements[-1].find(u'://') != -1: |
| | 352 | # old-style externals syntax |
| | 353 | localpath, rev, url = elements[0], '', elements[-1] |
| | 354 | if localpath.startswith('#'): |
| | 355 | externals_data.append((external, None, None)) |
| | 356 | continue |
| | 357 | if len(elements) > 2: |
| | 358 | rev = elements[len(elements)==4 and 3 or 2] |
| | 359 | rev = rev.replace('-r', '') |
| | 360 | elif len(elements) > 1: |
| | 361 | # new-style externals syntax |
| | 362 | resource = context.resource |
| | 363 | localpath = resource.id |
| | 364 | url, localpath = elements[-2], elements[-1] |
| | 365 | if len(elements) > 2: |
| | 366 | rev = elements[len(elements)==4 and 1 or 0] |
| | 367 | rev = rev.replace('-r', '') |
| | 368 | else: |
| | 369 | rev = '' |
| | 370 | if '@' in url: |
| | 371 | (url, rev) = url.split('@') |
| | 372 | if url.startswith(u'^/'): |
| | 373 | # relative to repository root |
| | 374 | href = context.req.href.browser(url[1:], rev=rev) |
| | 375 | add_externals_url(localpath, url[1:], rev, href) |
| | 376 | continue |
| | 377 | elif url.startswith(u'../'): |
| | 378 | # relative to the directory |
| | 379 | remotepath = localpath |
| | 380 | while url.startswith(u'../'): |
| | 381 | url = url[3:] |
| | 382 | (remotepath, child) = posixpath.split(remotepath) |
| | 383 | remotepath = posixpath.join('/'+remotepath, url) |
| | 384 | href = context.req.href.browser(url, rev=rev) |
| | 385 | add_externals_url(localpath, remotepath, rev, href) |
| | 386 | continue |
| | 387 | elif url.startswith(u'/'): |
| | 388 | # relative to server root or to scheme |
| | 389 | while url.startswith(u'//'): |
| | 390 | # relative to scheme, handle as server root |
| | 391 | url = url[1:] |
| | 392 | # relative to server root |
| 375 | | externals.append((localpath, revstr, url, None, None)) |
| 376 | | externals_data = [] |
| 377 | | for localpath, rev, url, remotepath, href in externals: |
| 378 | | label = localpath |
| 379 | | if url is None: |
| 380 | | title = '' |
| 381 | | elif href: |
| 382 | | if url: |
| 383 | | url = ' in ' + url |
| 384 | | label += rev + url |
| 385 | | title = ''.join((remotepath, rev, url)) |
| | 416 | add_externals_url(localpath, url, rev, None) |
| | 417 | trs = [] |
| | 418 | for label, href in externals_data: |
| | 419 | if not href: |
| | 420 | tr = tag.tr(tag.td(label[0]), |
| | 421 | tag.td(tag.a(label[1], title=\ |
| | 422 | _('No svn:externals configured in trac.ini')), |
| | 423 | tag.td(label[2]))) |
| 387 | | title = _('No svn:externals configured in trac.ini') |
| 388 | | externals_data.append((label, href, title)) |
| 389 | | return tag.ul([tag.li(tag.a(label, href=href, title=title)) |
| 390 | | for label, href, title in externals_data]) |
| | 425 | tr = tag.tr(tag.td(label[0]), |
| | 426 | tag.td(tag.a(label[1], href=href), title=\ |
| | 427 | _('Jump to external')), |
| | 428 | tag.td(tag.a(label[2], href=href))) |
| | 429 | trs.append(tr) |
| | 430 | return tag.table(tag.tbody(trs)) |