~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to bzrtools.py

  • Committer: Aaron Bentley
  • Date: 2006-02-28 22:40:01 UTC
  • Revision ID: abentley@panoramicfeedback.com-20060228224001-6df8720681c78694
Update to new run_argv_aliases API

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.bzrdir import BzrDir
32
29
 
33
30
def temp_tree():
34
31
    dirname = tempfile.mkdtemp("temp-branch")
52
49
    ([u'foo'], {})
53
50
    >>> is_clean(tree)
54
51
    (False, [])
55
 
    >>> tree.commit("added file", rev_id='commit-id')
56
 
    'commit-id'
 
52
    >>> tree.commit("added file")
57
53
    >>> is_clean(tree)
58
54
    (True, [])
59
55
    >>> rm_tree(tree)
60
56
    """
 
57
    from bzrlib.diff import compare_trees
61
58
    old_tree = cur_tree.basis_tree()
62
59
    new_tree = cur_tree
63
60
    non_source = []
64
61
    for path, file_class, kind, file_id, entry in new_tree.list_files():
65
62
        if file_class in ('?', 'I'):
66
63
            non_source.append(path)
67
 
    delta = new_tree.changes_from(old_tree, want_unchanged=False)
 
64
    delta = compare_trees(old_tree, new_tree, want_unchanged=False)
68
65
    return not delta.has_changed(), non_source
69
66
 
70
67
def set_push_data(tree, location):
71
 
    tree.branch.control_files.put_utf8("x-push-data", "%s\n" % location)
 
68
    push_file = file (tree._control_files.controlfilename("x-push-data"), "wb")
 
69
    push_file.write("%s\n" % location)
72
70
 
73
71
def get_push_data(tree):
74
72
    """
77
75
    True
78
76
    >>> set_push_data(tree, 'http://somewhere')
79
77
    >>> get_push_data(tree)
80
 
    u'http://somewhere'
 
78
    'http://somewhere'
81
79
    >>> rm_tree(tree)
82
80
    """
83
 
    try:
84
 
        location = tree.branch.control_files.get_utf8('x-push-data').read()
85
 
    except NoSuchFile:
 
81
    filename = tree._control_files.controlfilename("x-push-data")
 
82
    if not os.path.exists(filename):
86
83
        return None
87
 
    return location.rstrip('\n')
 
84
    push_file = file (filename, "rb")
 
85
    (location,) = [f.rstrip('\n') for f in push_file]
 
86
    return location
88
87
 
89
88
"""
90
89
>>> shell_escape('hello')
120
119
    >>> os.chdir(new_dir)
121
120
    >>> rsync("a", "b", silent=True)
122
121
    Traceback (most recent call last):
123
 
    RsyncNoFile: No such file...
124
 
    >>> rsync(new_dir + "/a", new_dir + "/b", excludes=("*.py",), silent=True)
 
122
    RsyncNoFile: No such file a
 
123
    >>> rsync("a", "b", excludes=("*.py",), silent=True)
125
124
    Traceback (most recent call last):
126
 
    RsyncNoFile: No such file...
127
 
    >>> rsync(new_dir + "/a", new_dir + "/b", excludes=("*.py",), silent=True, rsync_name="rsyncc")
 
125
    RsyncNoFile: No such file a
 
126
    >>> rsync("a", "b", excludes=("*.py",), silent=True, rsync_name="rsyncc")
128
127
    Traceback (most recent call last):
129
128
    NoRsync: rsyncc not found.
130
129
    >>> os.chdir(old_dir)
189
188
        raise RsyncUnknownStatus(proc.returncode)
190
189
    return [l.split(' ')[-1].rstrip('\n') for l in result.splitlines(True)]
191
190
 
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')
 
191
exclusions = ('.bzr/x-push-data', '.bzr/parent', '.bzr/x-pull-data', 
 
192
              '.bzr/x-pull', '.bzr/pull', '.bzr/stat-cache',
 
193
              '.bzr/x-rsync-data')
196
194
 
197
195
 
198
196
def read_revision_history(fname):
211
209
    tempdir = tempfile.mkdtemp('push')
212
210
    try:
213
211
        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)
 
212
        cmd = rsync(location+'.bzr/revision-history', history_fname,
 
213
                    silent=True)
220
214
        history = read_revision_history(history_fname)
221
215
    finally:
222
216
        shutil.rmtree(tempdir)
239
233
    except RsyncNoFile:
240
234
        return True
241
235
 
242
 
def rspush(tree, location=None, overwrite=False, working_tree=True):
 
236
def push(tree, location=None, overwrite=False, working_tree=True):
243
237
    push_location = get_push_data(tree)
244
238
    if location is not None:
245
239
        if not location.endswith('/'):
247
241
        push_location = location
248
242
    
249
243
    if push_location is None:
250
 
        raise BzrCommandError("No rspush location known or specified.")
251
 
 
252
 
    if (push_location.find('::') != -1):
253
 
        usessh=False
254
 
    else:
255
 
        usessh=True
256
 
 
257
 
    if (push_location.find('://') != -1 or
258
 
        push_location.find(':') == -1):
259
 
        raise BzrCommandError("Invalid rsync path %r." % push_location)
260
 
 
 
244
        raise bzrlib.errors.MustUseDecorated
 
245
 
 
246
    if push_location.find('://') != -1:
 
247
        raise bzrlib.errors.MustUseDecorated
 
248
 
 
249
    if push_location.find(':') == -1:
 
250
        raise bzrlib.errors.MustUseDecorated
 
251
 
 
252
    clean, non_source = is_clean(tree)
 
253
    if not clean:
 
254
        print """Error: This tree has uncommitted changes or unknown (?) files.
 
255
Use "bzr status" to list them."""
 
256
        sys.exit(1)
261
257
    if working_tree:
262
 
        clean, non_source = is_clean(tree)
263
 
        if not clean:
264
 
            print """Error: This tree has uncommitted changes or unknown (?) files.
265
 
    Use "bzr status" to list them."""
266
 
            sys.exit(1)
267
258
        final_exclusions = non_source[:]
268
259
    else:
269
260
        wt = tree
288
279
                " specified location.  Please ensure that"
289
280
                ' "%s" is of the form "machine:/path".' % push_location)
290
281
    print "Pushing to %s" % push_location
291
 
    rsync(tree.basedir+'/', push_location, ssh=usessh, 
 
282
    rsync(tree.basedir+'/', push_location, ssh=True, 
292
283
          excludes=final_exclusions)
293
284
 
294
285
    set_push_data(tree, push_location)
295
286
 
296
 
 
297
287
def short_committer(committer):
298
288
    new_committer = re.sub('<.*>', '', committer).strip(' ')
299
289
    if len(new_committer) < 2:
301
291
    return new_committer
302
292
 
303
293
 
304
 
def apache_ls(t):
305
 
    """Screen-scrape Apache listings"""
306
 
    apache_dir = '<img border="0" src="/icons/folder.gif" alt="[dir]">'\
307
 
        ' <a href="'
308
 
    lines = t.get('.')
309
 
    expr = re.compile('<a[^>]*href="([^>]*)"[^>]*>', flags=re.I)
310
 
    for line in lines:
311
 
        match = expr.search(line)
312
 
        if match is None:
313
 
            continue
314
 
        url = match.group(1)
315
 
        if url.startswith('http://') or url.startswith('/') or '../' in url:
316
 
            continue
317
 
        if '?' in url:
318
 
            continue
319
 
        yield url.rstrip('/')
320
 
 
321
 
 
322
 
def iter_branches(t, lister=None):
323
 
    """Iterate through all the branches under a transport"""
324
 
    for bzrdir in iter_bzrdirs(t, lister):
325
 
        try:
326
 
            branch = bzrdir.open_branch()
327
 
            if branch.bzrdir is bzrdir:
328
 
                yield branch
329
 
        except (NotBranchError, UnsupportedFormatError):
330
 
            pass
331
 
 
332
 
 
333
 
def iter_branch_tree(t, lister=None):
334
 
    for bzrdir in iter_bzrdirs(t, lister):
335
 
        try:
336
 
            wt = bzrdir.open_workingtree()
337
 
            yield wt.branch, wt
338
 
        except NoWorkingTree, UnsupportedFormatError:
339
 
            try:
340
 
                branch = bzrdir.open_branch()
341
 
                if branch.bzrdir is bzrdir:
342
 
                    yield branch, None
343
 
            except (NotBranchError, UnsupportedFormatError):
344
 
                continue
345
 
 
346
 
 
347
 
def iter_bzrdirs(t, lister=None):
348
 
    if lister is None:
349
 
        def lister(t):
350
 
            return t.list_dir('.')
351
 
    try:
352
 
        bzrdir = bzrdir_from_transport(t)
353
 
        yield bzrdir
354
 
    except (NotBranchError, UnsupportedFormatError, TransportError,
355
 
            PermissionDenied):
356
 
        pass
357
 
    try:
358
 
        for directory in lister(t):
359
 
            if directory == ".bzr":
360
 
                continue
361
 
            try:
362
 
                subt = t.clone(directory)
363
 
            except UnicodeDecodeError:
364
 
                continue
365
 
            for bzrdir in iter_bzrdirs(subt, lister):
366
 
                yield bzrdir
367
 
    except (NoSuchFile, PermissionDenied, TransportError):
368
 
        pass
369
 
 
370
 
    
371
 
def bzrdir_from_transport(t):
372
 
    """Open a bzrdir from a transport (not a location)"""
373
 
    format = BzrDirFormat.find_format(t)
374
 
    BzrDir._check_supported(format, False)
375
 
    return format.open(t)
376
 
 
377
 
 
378
294
def run_tests():
379
295
    import doctest
380
296
    result = doctest.testmod()