~bzr-pqm/bzr/bzr.dev

362 by Martin Pool
- Import stat-cache code
1
# (C) 2005 Canonical Ltd
1185.13.2 by Robert Collins
Merge Aarons conflict plugin for 0.1rc1
2
#
362 by Martin Pool
- Import stat-cache code
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1185.13.2 by Robert Collins
Merge Aarons conflict plugin for 0.1rc1
7
#
362 by Martin Pool
- Import stat-cache code
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1185.13.2 by Robert Collins
Merge Aarons conflict plugin for 0.1rc1
12
#
362 by Martin Pool
- Import stat-cache code
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1185.13.2 by Robert Collins
Merge Aarons conflict plugin for 0.1rc1
17
import sys
18
from bzrlib.osutils import is_inside_any
19
from bzrlib.delta import compare_trees
362 by Martin Pool
- Import stat-cache code
20
465 by Martin Pool
- Move show_status() out of Branch into a new function in
21
22
def show_status(branch, show_unchanged=False,
483 by Martin Pool
- change 'file_list' to more explanatory 'specific_files'
23
                specific_files=None,
915 by Martin Pool
- add simple test case for bzr status
24
                show_ids=False,
974.1.48 by Aaron Bentley
Status command shows pending merges
25
                to_file=None,
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
26
                show_pending=True,
27
                revision=None):
1185.3.1 by Martin Pool
- docstring fix from Magnus Therning
28
    """Display status for non-ignored working files.
465 by Martin Pool
- Move show_status() out of Branch into a new function in
29
1185.3.1 by Martin Pool
- docstring fix from Magnus Therning
30
    show_unchanged
31
        If set, includes unchanged files.
465 by Martin Pool
- Move show_status() out of Branch into a new function in
32
483 by Martin Pool
- change 'file_list' to more explanatory 'specific_files'
33
    specific_files
465 by Martin Pool
- Move show_status() out of Branch into a new function in
34
        If set, only show the status of files in this list.
915 by Martin Pool
- add simple test case for bzr status
35
1185.3.1 by Martin Pool
- docstring fix from Magnus Therning
36
    show_ids
37
        If set, includes each file's id.
38
915 by Martin Pool
- add simple test case for bzr status
39
    to_file
40
        If set, write to this file (default stdout.)
1185.3.1 by Martin Pool
- docstring fix from Magnus Therning
41
42
    show_pending
43
        If set, write pending merges.
1092.3.4 by Robert Collins
update symlink branch to integration
44
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
45
    revision
46
        If None the compare latest revision with working tree
47
        If one revision show compared it with working tree.
48
        If two revisions show status between first and second.
465 by Martin Pool
- Move show_status() out of Branch into a new function in
49
    """
915 by Martin Pool
- add simple test case for bzr status
50
    if to_file == None:
51
        to_file = sys.stdout
580 by Martin Pool
- Use explicit lock methods on a branch, rather than doing it
52
    
610 by Martin Pool
- replace Branch.lock(mode) with separate lock_read and lock_write
53
    branch.lock_read()
580 by Martin Pool
- Use explicit lock methods on a branch, rather than doing it
54
    try:
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
55
        new_is_working_tree = True
56
        if revision is None:
57
            old = branch.basis_tree()
58
            new = branch.working_tree()
59
        elif len(revision) > 0:
60
            try:
61
                rev_id = revision[0].in_history(branch).rev_id
62
                old = branch.revision_tree(rev_id)
63
            except NoSuchRevision, e:
64
                raise BzrCommandError(str(e))
65
            if len(revision) > 1:
66
                try:
67
                    rev_id = revision[1].in_history(branch).rev_id
68
                    new = branch.revision_tree(rev_id)
69
                    new_is_working_tree = False
70
                except NoSuchRevision, e:
71
                    raise BzrCommandError(str(e))
72
            else:
73
                new = branch.working_tree()
74
                
580 by Martin Pool
- Use explicit lock methods on a branch, rather than doing it
75
76
        delta = compare_trees(old, new, want_unchanged=show_unchanged,
77
                              specific_files=specific_files)
78
915 by Martin Pool
- add simple test case for bzr status
79
        delta.show(to_file,
80
                   show_ids=show_ids,
580 by Martin Pool
- Use explicit lock methods on a branch, rather than doing it
81
                   show_unchanged=show_unchanged)
82
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
83
        if new_is_working_tree:
1185.14.11 by Aaron Bentley
moved conflict listing into status and stopped monkey-patching
84
            conflicts = new.iter_conflicts()
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
85
            unknowns = new.unknowns()
1185.14.11 by Aaron Bentley
moved conflict listing into status and stopped monkey-patching
86
            list_paths('unknown', unknowns, specific_files, to_file)
87
            list_paths('conflicts', conflicts, specific_files, to_file)
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
88
            if show_pending and len(branch.pending_merges()) > 0:
89
                print >>to_file, 'pending merges:'
90
                for merge in branch.pending_merges():
91
                    print >> to_file, ' ', merge
580 by Martin Pool
- Use explicit lock methods on a branch, rather than doing it
92
    finally:
93
        branch.unlock()
94
        
1185.14.11 by Aaron Bentley
moved conflict listing into status and stopped monkey-patching
95
def list_paths(header, paths, specific_files, to_file):
96
    done_header = False
97
    for path in paths:
98
        if specific_files and not is_inside_any(specific_files, path):
99
            continue
100
        if not done_header:
101
            print >>to_file, '%s:' % header
102
            done_header = True
103
        print >>to_file, ' ', path