~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to bzrtools.py

  • Committer: Aaron Bentley
  • Date: 2006-03-07 15:23:15 UTC
  • mfrom: (321.1.2 bzrtools)
  • mto: (147.4.31 trunk)
  • mto: This revision was merged to the branch mainline in revision 324.
  • Revision ID: abentley@panoramicfeedback.com-20060307152315-42337454a0ad956b
MergeĀ fromĀ mainline

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._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._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')
121
121
    >>> rsync("a", "b", silent=True)
122
122
    Traceback (most recent call last):
123
123
    RsyncNoFile: No such file...
124
 
    >>> rsync(new_dir + "/a", new_dir + "/b", excludes=("*.py",), silent=True)
 
124
    >>> rsync(tempdir + "/a", tempdir + "/b", excludes=("*.py",), silent=True) #doctest: +ELLIPSIS
125
125
    Traceback (most recent call last):
126
126
    RsyncNoFile: No such file...
127
 
    >>> rsync(new_dir + "/a", new_dir + "/b", excludes=("*.py",), silent=True, rsync_name="rsyncc")
 
127
    >>> rsync(tempdir + "/a", tempdir + "/b", excludes=("*.py",), silent=True, rsync_name="rsyncc")
128
128
    Traceback (most recent call last):
129
129
    NoRsync: rsyncc not found.
130
130
    >>> os.chdir(old_dir)
189
189
        raise RsyncUnknownStatus(proc.returncode)
190
190
    return [l.split(' ')[-1].rstrip('\n') for l in result.splitlines(True)]
191
191
 
192
 
exclusions = ('.bzr/x-push-data', '.bzr/branch/x-push/data', '.bzr/parent', 
193
 
              '.bzr/branch/parent', '.bzr/x-pull-data', '.bzr/x-pull',
194
 
              '.bzr/pull', '.bzr/stat-cache', '.bzr/x-rsync-data',
195
 
              '.bzr/basis-inventory', '.bzr/inventory.backup.weave')
 
192
exclusions = ('.bzr/x-push-data', '.bzr/parent', '.bzr/x-pull-data', 
 
193
              '.bzr/x-pull', '.bzr/pull', '.bzr/stat-cache',
 
194
              '.bzr/x-rsync-data')
196
195
 
197
196
 
198
197
def read_revision_history(fname):
211
210
    tempdir = tempfile.mkdtemp('push')
212
211
    try:
213
212
        history_fname = os.path.join(tempdir, 'revision-history')
214
 
        try:
215
 
            cmd = rsync(location+'.bzr/revision-history', history_fname,
216
 
                        silent=True)
217
 
        except RsyncNoFile:
218
 
            cmd = rsync(location+'.bzr/branch/revision-history', history_fname,
219
 
                        silent=True)
 
213
        cmd = rsync(location+'.bzr/revision-history', history_fname,
 
214
                    silent=True)
220
215
        history = read_revision_history(history_fname)
221
216
    finally:
222
217
        shutil.rmtree(tempdir)
239
234
    except RsyncNoFile:
240
235
        return True
241
236
 
242
 
def rspush(tree, location=None, overwrite=False, working_tree=True):
 
237
def push(tree, location=None, overwrite=False, working_tree=True):
243
238
    push_location = get_push_data(tree)
244
239
    if location is not None:
245
240
        if not location.endswith('/'):
247
242
        push_location = location
248
243
    
249
244
    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)
255
 
 
 
245
        if tree.branch.get_push_location() is None:
 
246
            raise BzrCommandError("No push location known or specified.")
 
247
        else:
 
248
            raise bzrlib.errors.MustUseDecorated
 
249
 
 
250
    if push_location.find('://') != -1:
 
251
        raise bzrlib.errors.MustUseDecorated
 
252
 
 
253
    if push_location.find(':') == -1:
 
254
        raise bzrlib.errors.MustUseDecorated
 
255
 
 
256
    clean, non_source = is_clean(tree)
 
257
    if not clean:
 
258
        print """Error: This tree has uncommitted changes or unknown (?) files.
 
259
Use "bzr status" to list them."""
 
260
        sys.exit(1)
256
261
    if working_tree:
257
 
        clean, non_source = is_clean(tree)
258
 
        if not clean:
259
 
            print """Error: This tree has uncommitted changes or unknown (?) files.
260
 
    Use "bzr status" to list them."""
261
 
            sys.exit(1)
262
262
        final_exclusions = non_source[:]
263
263
    else:
264
264
        wt = tree
296
296
    return new_committer
297
297
 
298
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
 
 
373
299
def run_tests():
374
300
    import doctest
375
301
    result = doctest.testmod()