~abentley/bzrtools/bzrtools.dev

787 by Aaron Bentley
Fix zap command for 2.6/7
1
# Copyright (C) 2005-2009, 2011-2013 Aaron Bentley <aaron@aaronbentley.com>
513 by Aaron Bentley
Fix change dectection for dirstate
2
# Copyright (C) 2007 John Arbash Meinel
89 by Aaron Bentley
Added copyright/GPL notices
3
#
4
#    This program is free software; you can redistribute it and/or modify
5
#    it under the terms of the GNU General Public License as published by
6
#    the Free Software Foundation; either version 2 of the License, or
7
#    (at your option) any later version.
8
#
9
#    This program is distributed in the hope that it will be useful,
10
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
11
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
#    GNU General Public License for more details.
13
#
14
#    You should have received a copy of the GNU General Public License
15
#    along with this program; if not, write to the Free Software
16
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
787 by Aaron Bentley
Fix zap command for 2.6/7
17
from contextlib import contextmanager
147.1.59 by Aaron Bentley
Reverted bzrtools.py to mainline version.
18
import re
19
783 by Aaron Bentley
Remove rspush
20
from bzrlib import urlutils
583 by Aaron Bentley
rspush requires standalone trees
21
from bzrlib.errors import (
22
    BzrCommandError,
23
    NotBranchError,
24
    NoSuchFile,
25
    )
776.2.1 by Jelmer Vernooij
Remove unused imports and fix two imports.
26
from bzrlib.bzrdir import BzrDir
563 by Aaron Bentley
Allow importing directly from a URL
27
from bzrlib.transport import get_transport
147.1.59 by Aaron Bentley
Reverted bzrtools.py to mainline version.
28
321.1.2 by Aaron Bentley
Applied Robert's random fixes as non-merges
29
787 by Aaron Bentley
Fix zap command for 2.6/7
30
@contextmanager
31
def read_locked(lockable):
32
    """Read-lock a tree, branch or repository in this context."""
33
    lockable.lock_read()
34
    try:
35
        yield lockable
36
    finally:
37
        lockable.unlock()
38
39
292 by Aaron Bentley
Introduced branch-history command
40
def short_committer(committer):
41
    new_committer = re.sub('<.*>', '', committer).strip(' ')
42
    if len(new_committer) < 2:
43
        return committer
44
    return new_committer
45
46
354 by Aaron Bentley
Added apache index scraping to the branches command
47
def apache_ls(t):
48
    """Screen-scrape Apache listings"""
355 by Aaron Bentley
Handled more hrefs
49
    apache_dir = '<img border="0" src="/icons/folder.gif" alt="[dir]">'\
50
        ' <a href="'
571 by Aaron Bentley
Branches works with Apache again
51
    t = t.clone()
52
    t._remote_path = lambda x: t.base
602 by Aaron Bentley
Update branches to new find_branches API
53
    try:
54
        lines = t.get('')
776.2.1 by Jelmer Vernooij
Remove unused imports and fix two imports.
55
    except NoSuchFile:
602 by Aaron Bentley
Update branches to new find_branches API
56
        return
57
    expr = re.compile('<a[^>]*href="([^>]*)\/"[^>]*>', flags=re.I)
354 by Aaron Bentley
Added apache index scraping to the branches command
58
    for line in lines:
355 by Aaron Bentley
Handled more hrefs
59
        match = expr.search(line)
60
        if match is None:
61
            continue
62
        url = match.group(1)
63
        if url.startswith('http://') or url.startswith('/') or '../' in url:
64
            continue
357 by Aaron Bentley
Tweakage of the apache scraper
65
        if '?' in url:
66
            continue
355 by Aaron Bentley
Handled more hrefs
67
        yield url.rstrip('/')
354 by Aaron Bentley
Added apache index scraping to the branches command
68
69
603 by Aaron Bentley
Update branches, multi-pull to new APIs, create trees
70
def list_branches(t):
71
    def is_inside(branch):
72
        return bool(branch.base.startswith(t.base))
73
74
    if t.base.startswith('http://'):
75
        def evaluate(bzrdir):
76
            try:
77
                branch = bzrdir.open_branch()
78
                if is_inside(branch):
79
                    return True, branch
80
                else:
81
                    return True, None
604 by Aaron Bentley
Fix error handling
82
            except NotBranchError:
603 by Aaron Bentley
Update branches, multi-pull to new APIs, create trees
83
                return True, None
84
        return [b for b in BzrDir.find_bzrdirs(t, list_current=apache_ls,
85
                evaluate=evaluate) if b is not None]
86
    elif not t.listable():
87
        raise BzrCommandError("Can't list this type of location.")
88
    return [b for b in BzrDir.find_branches(t) if is_inside(b)]
89
90
91
def evaluate_branch_tree(bzrdir):
92
    try:
93
        tree, branch = bzrdir._get_tree_branch()
94
    except NotBranchError:
95
        return True, None
96
    else:
97
        return True, (branch, tree)
353 by Aaron Bentley
Added multi-pull, working on branches and checkouts
98
354 by Aaron Bentley
Added apache index scraping to the branches command
99
100
def iter_branch_tree(t, lister=None):
603 by Aaron Bentley
Update branches, multi-pull to new APIs, create trees
101
    return (x for x in BzrDir.find_bzrdirs(t, evaluate=evaluate_branch_tree,
102
            list_current=lister) if x is not None)
352 by Aaron Bentley
Added branches subcommand
103
104
563 by Aaron Bentley
Allow importing directly from a URL
105
def open_from_url(location):
106
    location = urlutils.normalize_url(location)
107
    dirname, basename = urlutils.split(location)
695 by Aaron Bentley
bzr patch handles URLs with trailing slashes
108
    if location.endswith('/') and not basename.endswith('/'):
109
        basename += '/'
563 by Aaron Bentley
Allow importing directly from a URL
110
    return get_transport(dirname).get(basename)
111
112
19 by abentley
librified most of the pull script
113
def run_tests():
16 by abentley
Got is_clean under test, added setters/getters for pull data
114
    import doctest
18 by abentley
Finished implementing bzr-pull
115
    result = doctest.testmod()
19 by abentley
librified most of the pull script
116
    if result[1] > 0:
117
        if result[0] == 0:
118
            print "All tests passed"
119
    else:
120
        print "No tests to run"
121
if __name__ == "__main__":
122
    run_tests()