~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to bzrtools.py

  • Committer: Aaron Bentley
  • Date: 2006-11-23 00:05:45 UTC
  • mfrom: (0.8.7 show_paths)
  • Revision ID: aaron.bentley@utoronto.ca-20061123000545-vk3id8fxuzzclvsh
Add show-paths command from Alexander Belchenko

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
import bzrlib
27
27
import bzrlib.errors
28
 
from bzrlib.errors import BzrCommandError
29
 
from bzrlib.bzrdir import BzrDir
 
28
from bzrlib.errors import (BzrCommandError, NotBranchError, NoSuchFile,
 
29
                           UnsupportedFormatError, TransportError, 
 
30
                           NoWorkingTree, PermissionDenied)
 
31
from bzrlib.bzrdir import BzrDir, BzrDirFormat
30
32
 
31
33
def temp_tree():
32
34
    dirname = tempfile.mkdtemp("temp-branch")
50
52
    ([u'foo'], {})
51
53
    >>> is_clean(tree)
52
54
    (False, [])
53
 
    >>> tree.commit("added file")
 
55
    >>> tree.commit("added file", rev_id='commit-id')
 
56
    'commit-id'
54
57
    >>> is_clean(tree)
55
58
    (True, [])
56
59
    >>> rm_tree(tree)
57
60
    """
58
 
    from bzrlib.diff import compare_trees
59
61
    old_tree = cur_tree.basis_tree()
60
62
    new_tree = cur_tree
61
63
    non_source = []
62
64
    for path, file_class, kind, file_id, entry in new_tree.list_files():
63
65
        if file_class in ('?', 'I'):
64
66
            non_source.append(path)
65
 
    delta = compare_trees(old_tree, new_tree, want_unchanged=False)
 
67
    delta = new_tree.changes_from(old_tree, want_unchanged=False)
66
68
    return not delta.has_changed(), non_source
67
69
 
68
70
def set_push_data(tree, location):
69
 
    push_file = file (tree.branch.control_files.controlfilename("x-push-data"), "wb")
70
 
    push_file.write("%s\n" % location)
 
71
    tree.branch.control_files.put_utf8("x-push-data", "%s\n" % location)
71
72
 
72
73
def get_push_data(tree):
73
74
    """
76
77
    True
77
78
    >>> set_push_data(tree, 'http://somewhere')
78
79
    >>> get_push_data(tree)
79
 
    'http://somewhere'
 
80
    u'http://somewhere'
80
81
    >>> rm_tree(tree)
81
82
    """
82
 
    filename = tree.branch.control_files.controlfilename("x-push-data")
83
 
    if not os.path.exists(filename):
 
83
    try:
 
84
        location = tree.branch.control_files.get_utf8('x-push-data').read()
 
85
    except NoSuchFile:
84
86
        return None
85
 
    push_file = file (filename, "rb")
86
 
    (location,) = [f.rstrip('\n') for f in push_file]
87
 
    return location
 
87
    return location.rstrip('\n')
88
88
 
89
89
"""
90
90
>>> shell_escape('hello')
239
239
    except RsyncNoFile:
240
240
        return True
241
241
 
242
 
def push(tree, location=None, overwrite=False, working_tree=True):
 
242
def rspush(tree, location=None, overwrite=False, working_tree=True):
243
243
    push_location = get_push_data(tree)
244
244
    if location is not None:
245
245
        if not location.endswith('/'):
247
247
        push_location = location
248
248
    
249
249
    if push_location is None:
250
 
        if tree.branch.get_push_location() is None:
251
 
            raise BzrCommandError("No push location known or specified.")
252
 
        else:
253
 
            raise bzrlib.errors.MustUseDecorated
254
 
 
255
 
    if push_location.find('://') != -1:
256
 
        raise bzrlib.errors.MustUseDecorated
257
 
 
258
 
    if push_location.find(':') == -1:
259
 
        raise bzrlib.errors.MustUseDecorated
 
250
        raise BzrCommandError("No rspush location known or specified.")
 
251
 
 
252
    if (push_location.find('://') != -1 or
 
253
        push_location.find(':') == -1):
 
254
        raise BzrCommandError("Invalid rsync path %r." % push_location)
260
255
 
261
256
    if working_tree:
262
257
        clean, non_source = is_clean(tree)
301
296
    return new_committer
302
297
 
303
298
 
 
299
def apache_ls(t):
 
300
    """Screen-scrape Apache listings"""
 
301
    apache_dir = '<img border="0" src="/icons/folder.gif" alt="[dir]">'\
 
302
        ' <a href="'
 
303
    lines = t.get('.')
 
304
    expr = re.compile('<a[^>]*href="([^>]*)"[^>]*>', flags=re.I)
 
305
    for line in lines:
 
306
        match = expr.search(line)
 
307
        if match is None:
 
308
            continue
 
309
        url = match.group(1)
 
310
        if url.startswith('http://') or url.startswith('/') or '../' in url:
 
311
            continue
 
312
        if '?' in url:
 
313
            continue
 
314
        yield url.rstrip('/')
 
315
 
 
316
 
 
317
def iter_branches(t, lister=None):
 
318
    """Iterate through all the branches under a transport"""
 
319
    for bzrdir in iter_bzrdirs(t, lister):
 
320
        try:
 
321
            branch = bzrdir.open_branch()
 
322
            if branch.bzrdir is bzrdir:
 
323
                yield branch
 
324
        except (NotBranchError, UnsupportedFormatError):
 
325
            pass
 
326
 
 
327
 
 
328
def iter_branch_tree(t, lister=None):
 
329
    for bzrdir in iter_bzrdirs(t, lister):
 
330
        try:
 
331
            wt = bzrdir.open_workingtree()
 
332
            yield wt.branch, wt
 
333
        except NoWorkingTree, UnsupportedFormatError:
 
334
            try:
 
335
                branch = bzrdir.open_branch()
 
336
                if branch.bzrdir is bzrdir:
 
337
                    yield branch, None
 
338
            except (NotBranchError, UnsupportedFormatError):
 
339
                continue
 
340
 
 
341
 
 
342
def iter_bzrdirs(t, lister=None):
 
343
    if lister is None:
 
344
        def lister(t):
 
345
            return t.list_dir('.')
 
346
    try:
 
347
        bzrdir = bzrdir_from_transport(t)
 
348
        yield bzrdir
 
349
    except (NotBranchError, UnsupportedFormatError, TransportError,
 
350
            PermissionDenied):
 
351
        pass
 
352
    try:
 
353
        for directory in lister(t):
 
354
            if directory == ".bzr":
 
355
                continue
 
356
            try:
 
357
                subt = t.clone(directory)
 
358
            except UnicodeDecodeError:
 
359
                continue
 
360
            for bzrdir in iter_bzrdirs(subt, lister):
 
361
                yield bzrdir
 
362
    except (NoSuchFile, PermissionDenied, TransportError):
 
363
        pass
 
364
 
 
365
    
 
366
def bzrdir_from_transport(t):
 
367
    """Open a bzrdir from a transport (not a location)"""
 
368
    format = BzrDirFormat.find_format(t)
 
369
    BzrDir._check_supported(format, False)
 
370
    return format.open(t)
 
371
 
 
372
 
304
373
def run_tests():
305
374
    import doctest
306
375
    result = doctest.testmod()