~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugins/launchpad/__init__.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-07-18 18:33:35 UTC
  • mfrom: (6024.3.7 2.5-up-to-date-609187)
  • Revision ID: pqm@pqm.ubuntu.com-20110718183335-rall83p4yxjdd900
(jameinel) Bug #609187: warn the user if a package-import branch doesn't
 have the most recent source package. (John A Meinel)

Show diffs side-by-side

added added

removed removed

Lines of Context:
40
40
 
41
41
# see http://wiki.bazaar.canonical.com/Specs/BranchRegistrationTool
42
42
 
 
43
import time
 
44
 
43
45
# Since we are a built-in plugin we share the bzrlib version
44
 
from bzrlib import version_info
45
46
 
46
47
from bzrlib.lazy_import import lazy_import
47
48
lazy_import(globals(), """
48
49
from bzrlib import (
49
 
    branch as _mod_branch,
50
50
    ui,
51
51
    trace,
52
52
    )
53
53
""")
54
54
 
55
 
from bzrlib import bzrdir
 
55
from bzrlib import (
 
56
    branch as _mod_branch,
 
57
    bzrdir,
 
58
    lazy_regex,
 
59
    version_info,
 
60
    )
56
61
from bzrlib.commands import (
57
62
    Command,
58
63
    register_command,
462
467
 
463
468
_register_directory()
464
469
 
 
470
# This is kept in __init__ so that we don't load lp_api_lite unless the branch
 
471
# actually matches. That way we can avoid importing extra dependencies like
 
472
# json.
 
473
_package_branch = lazy_regex.lazy_compile(
 
474
    r'bazaar.launchpad.net.*?/'
 
475
    r'(?P<user>~[^/]+/)?(?P<archive>ubuntu|debian)/(?P<series>[^/]+/)?'
 
476
    r'(?P<project>[^/]+)(?P<branch>/[^/]+)?'
 
477
    )
 
478
 
 
479
def _get_package_branch_info(url):
 
480
    """Determine the packaging information for this URL.
 
481
 
 
482
    :return: If this isn't a packaging branch, return None. If it is, return
 
483
        (archive, series, project)
 
484
    """
 
485
    m = _package_branch.search(url)
 
486
    if m is None:
 
487
        return
 
488
    archive, series, project, user = m.group('archive', 'series',
 
489
                                             'project', 'user')
 
490
    if series is not None:
 
491
        # series is optional, so the regex includes the extra '/', we don't
 
492
        # want to send that on (it causes Internal Server Errors.)
 
493
        series = series.strip('/')
 
494
    if user is not None:
 
495
        user = user.strip('~/')
 
496
        if user != 'ubuntu-branches':
 
497
            return None
 
498
    return archive, series, project
 
499
 
 
500
 
 
501
def _check_is_up_to_date(the_branch):
 
502
    info = _get_package_branch_info(the_branch.base)
 
503
    if info is None:
 
504
        return
 
505
    archive, series, project = info
 
506
    from bzrlib.plugins.launchpad import lp_api_lite
 
507
    t = time.time()
 
508
    latest_pub = lp_api_lite.LatestPublication(archive, series, project)
 
509
    latest_ver = latest_pub.get_latest_version()
 
510
    t_latest_ver = time.time() - t
 
511
    trace.mutter('LatestPublication.get_latest_version took %.3fs'
 
512
                 % (t_latest_ver,))
 
513
    if latest_ver is None:
 
514
        trace.note('Could not find a published version for packaging branch:\n'
 
515
                   '  %s' % (the_branch.base,))
 
516
        return
 
517
    t = time.time()
 
518
    tags = the_branch.tags.get_tag_dict()
 
519
    t_tag_dict = time.time() - t
 
520
    trace.mutter('LatestPublication get_tag_dict took: %.3fs' % (t_tag_dict,))
 
521
    if latest_ver in tags:
 
522
        trace.note('Found most recent published version: %s'
 
523
                   ' in packaging branch:\n  %s'
 
524
                   % (latest_ver, the_branch.base))
 
525
    else:
 
526
        place = archive.title()
 
527
        if series is not None:
 
528
            place = '%s/%s' % (place, series.title())
 
529
        best_tag = lp_api_lite.get_most_recent_tag(tags, the_branch)
 
530
        if best_tag is None:
 
531
            best_message = ''
 
532
        else:
 
533
            best_message = '\nThe most recent tag found is %s' % (best_tag,)
 
534
        trace.warning(
 
535
            'Packaging branch is not up-to-date. The most recent published\n'
 
536
            'version in %s is %s, but it is not in the branch tags for:\n  %s%s'
 
537
            % (place, latest_ver, the_branch.base, best_message))
 
538
 
 
539
def _register_hooks():
 
540
    _mod_branch.Branch.hooks.install_named_hook('open',
 
541
        _check_is_up_to_date, 'package-branch-up-to-date')
 
542
 
 
543
 
 
544
_register_hooks()
465
545
 
466
546
def load_tests(basic_tests, module, loader):
467
547
    testmod_names = [
468
548
        'test_account',
469
549
        'test_register',
470
550
        'test_lp_api',
 
551
        'test_lp_api_lite',
471
552
        'test_lp_directory',
472
553
        'test_lp_login',
473
554
        'test_lp_open',