~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/urlutils.py

Merge cleanup into first-try

Show diffs side-by-side

added added

removed removed

Lines of Context:
469
469
    return url_base + head, tail
470
470
 
471
471
 
 
472
def split_segment_parameters_raw(url):
 
473
    """Split the subsegment of the last segment of a URL.
 
474
 
 
475
    :param url: A relative or absolute URL
 
476
    :return: (url, subsegments)
 
477
    """
 
478
    (parent_url, child_dir) = split(url)
 
479
    subsegments = child_dir.split(",")
 
480
    if len(subsegments) == 1:
 
481
        return (url, [])
 
482
    return (join(parent_url, subsegments[0]), subsegments[1:])
 
483
 
 
484
 
 
485
def split_segment_parameters(url):
 
486
    """Split the segment parameters of the last segment of a URL.
 
487
 
 
488
    :param url: A relative or absolute URL
 
489
    :return: (url, segment_parameters)
 
490
    """
 
491
    (base_url, subsegments) = split_segment_parameters_raw(url)
 
492
    parameters = {}
 
493
    for subsegment in subsegments:
 
494
        (key, value) = subsegment.split("=", 1)
 
495
        parameters[key] = value
 
496
    return (base_url, parameters)
 
497
 
 
498
 
 
499
def join_segment_parameters_raw(base, *subsegments):
 
500
    """Create a new URL by adding subsegments to an existing one. 
 
501
 
 
502
    This adds the specified subsegments to the last path in the specified
 
503
    base URL. The subsegments should be bytestrings.
 
504
 
 
505
    :note: You probably want to use join_segment_parameters instead.
 
506
    """
 
507
    if not subsegments:
 
508
        return base
 
509
    for subsegment in subsegments:
 
510
        if type(subsegment) is not str:
 
511
            raise TypeError("Subsegment %r is not a bytestring" % subsegment)
 
512
        if "," in subsegment:
 
513
            raise errors.InvalidURLJoin(", exists in subsegments",
 
514
                                        base, subsegments)
 
515
    return ",".join((base,) + subsegments)
 
516
 
 
517
 
 
518
def join_segment_parameters(url, parameters):
 
519
    """Create a new URL by adding segment parameters to an existing one.
 
520
 
 
521
    The parameters of the last segment in the URL will be updated; if a
 
522
    parameter with the same key already exists it will be overwritten.
 
523
 
 
524
    :param url: A URL, as string
 
525
    :param parameters: Dictionary of parameters, keys and values as bytestrings
 
526
    """
 
527
    (base, existing_parameters) = split_segment_parameters(url)
 
528
    new_parameters = {}
 
529
    new_parameters.update(existing_parameters)
 
530
    for key, value in parameters.iteritems():
 
531
        if type(key) is not str:
 
532
            raise TypeError("parameter key %r is not a bytestring" % key)
 
533
        if type(value) is not str:
 
534
            raise TypeError("parameter value %r for %s is not a bytestring" %
 
535
                (key, value))
 
536
        if "=" in key:
 
537
            raise errors.InvalidURLJoin("= exists in parameter key", url,
 
538
                parameters)
 
539
        new_parameters[key] = value
 
540
    return join_segment_parameters_raw(base, 
 
541
        *["%s=%s" % item for item in sorted(new_parameters.items())])
 
542
 
 
543
 
472
544
def _win32_strip_local_trailing_slash(url):
473
545
    """Strip slashes after the drive letter"""
474
546
    if len(url) > WIN32_MIN_ABS_FILEURL_LENGTH: