~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to bzrtools.py

  • Committer: Aaron Bentley
  • Date: 2006-03-22 22:18:19 UTC
  • Revision ID: abentley@panoramicfeedback.com-20060322221819-0e627e73d1232926
Added zap command

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, NotBranchError, NoSuchFile,
29
 
                           UnsupportedFormatError, TransportError, 
30
 
                           NoWorkingTree, PermissionDenied)
31
 
from bzrlib.bzrdir import BzrDir, BzrDirFormat
 
28
from bzrlib.errors import BzrCommandError
 
29
from bzrlib.bzrdir import BzrDir
32
30
 
33
31
def temp_tree():
34
32
    dirname = tempfile.mkdtemp("temp-branch")
52
50
    ([u'foo'], {})
53
51
    >>> is_clean(tree)
54
52
    (False, [])
55
 
    >>> tree.commit("added file", rev_id='commit-id')
56
 
    'commit-id'
 
53
    >>> tree.commit("added file")
57
54
    >>> is_clean(tree)
58
55
    (True, [])
59
56
    >>> rm_tree(tree)
60
57
    """
 
58
    from bzrlib.diff import compare_trees
61
59
    old_tree = cur_tree.basis_tree()
62
60
    new_tree = cur_tree
63
61
    non_source = []
64
62
    for path, file_class, kind, file_id, entry in new_tree.list_files():
65
63
        if file_class in ('?', 'I'):
66
64
            non_source.append(path)
67
 
    delta = new_tree.changes_from(old_tree, want_unchanged=False)
 
65
    delta = compare_trees(old_tree, new_tree, want_unchanged=False)
68
66
    return not delta.has_changed(), non_source
69
67
 
70
68
def set_push_data(tree, location):
71
 
    tree.branch.control_files.put_utf8("x-push-data", "%s\n" % location)
 
69
    push_file = file (tree.branch.control_files.controlfilename("x-push-data"), "wb")
 
70
    push_file.write("%s\n" % location)
72
71
 
73
72
def get_push_data(tree):
74
73
    """
77
76
    True
78
77
    >>> set_push_data(tree, 'http://somewhere')
79
78
    >>> get_push_data(tree)
80
 
    u'http://somewhere'
 
79
    'http://somewhere'
81
80
    >>> rm_tree(tree)
82
81
    """
83
 
    try:
84
 
        location = tree.branch.control_files.get_utf8('x-push-data').read()
85
 
    except NoSuchFile:
 
82
    filename = tree.branch.control_files.controlfilename("x-push-data")
 
83
    if not os.path.exists(filename):
86
84
        return None
87
 
    return location.rstrip('\n')
 
85
    push_file = file (filename, "rb")
 
86
    (location,) = [f.rstrip('\n') for f in push_file]
 
87
    return location
88
88
 
89
89
"""
90
90
>>> shell_escape('hello')
239
239
    except RsyncNoFile:
240
240
        return True
241
241
 
242
 
def rspush(tree, location=None, overwrite=False, working_tree=True):
 
242
def push(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
 
        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)
 
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
255
260
 
256
261
    if working_tree:
257
262
        clean, non_source = is_clean(tree)
296
301
    return new_committer
297
302
 
298
303
 
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
 
 
373
304
def run_tests():
374
305
    import doctest
375
306
    result = doctest.testmod()