/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.16.1 by Aaron Bentley
Begin implementing UI
1
# Copyright (C) 2008 Aaron Bentley <aaron@aaronbentley.com>
2
#
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.
7
#
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.
12
#
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
17
18
import copy
19
from cStringIO import StringIO
0.16.5 by Aaron Bentley
Get text shelving working
20
import os.path
21
import shutil
0.16.1 by Aaron Bentley
Begin implementing UI
22
import sys
0.16.5 by Aaron Bentley
Get text shelving working
23
import tempfile
0.16.1 by Aaron Bentley
Begin implementing UI
24
0.16.25 by Aaron Bentley
Show selected changes before shelving
25
from bzrlib import (
26
    builtins,
27
    delta,
28
    diff,
29
    errors,
30
    osutils,
31
    patches,
0.16.54 by Aaron Bentley
Inform user about shelf ids.
32
    trace,
0.16.25 by Aaron Bentley
Show selected changes before shelving
33
    workingtree)
0.16.7 by Aaron Bentley
Implement colourdiff support
34
from bzrlib.plugins.bzrtools import colordiff, hunk_selector
0.16.6 by Aaron Bentley
Refactor generating patched file
35
from bzrlib.plugins.bzrtools.patch import run_patch
0.16.20 by Aaron Bentley
Use new getchar from bzrtools
36
from bzrlib.plugins.bzrtools.userinteractor import getchar
0.16.31 by Aaron Bentley
Update prepare_shelf => shelf
37
from bzrlib.plugins.shelf2 import shelf
0.16.1 by Aaron Bentley
Begin implementing UI
38
39
40
class Shelver(object):
41
0.16.23 by Aaron Bentley
Improve prompting
42
    def __init__(self, work_tree, target_tree, path, auto=False,
0.16.47 by Aaron Bentley
Support selecting files to shelve
43
                 auto_apply=False, file_list=None):
0.16.1 by Aaron Bentley
Begin implementing UI
44
        self.work_tree = work_tree
45
        self.target_tree = target_tree
46
        self.path = path
47
        self.diff_file = StringIO()
0.16.5 by Aaron Bentley
Get text shelving working
48
        self.text_differ = diff.DiffText(self.target_tree, self.work_tree,
0.16.1 by Aaron Bentley
Begin implementing UI
49
                                         self.diff_file)
0.16.7 by Aaron Bentley
Implement colourdiff support
50
        self.diff_writer = colordiff.DiffWriter(sys.stdout, False)
0.16.40 by Aaron Bentley
Update for ShelfManager API changes
51
        self.manager = work_tree.get_shelf_manager()
0.16.15 by Aaron Bentley
Implement auto mode
52
        self.auto = auto
0.16.23 by Aaron Bentley
Improve prompting
53
        self.auto_apply = auto_apply
0.16.47 by Aaron Bentley
Support selecting files to shelve
54
        self.file_list = file_list
0.16.1 by Aaron Bentley
Begin implementing UI
55
56
    @classmethod
0.16.47 by Aaron Bentley
Support selecting files to shelve
57
    def from_args(klass, revision=None, all=False, file_list=None):
0.16.1 by Aaron Bentley
Begin implementing UI
58
        tree, path = workingtree.WorkingTree.open_containing('.')
0.16.8 by Aaron Bentley
Implement unshelve2, tidy shelve2
59
        target_tree = builtins._get_one_revision_tree('shelf2', revision,
60
            tree.branch, tree)
0.16.47 by Aaron Bentley
Support selecting files to shelve
61
        return klass(tree, target_tree, path, all, all, file_list)
0.16.1 by Aaron Bentley
Begin implementing UI
62
63
    def run(self):
0.16.47 by Aaron Bentley
Support selecting files to shelve
64
        creator = shelf.ShelfCreator(self.work_tree, self.target_tree,
65
                                     self.file_list)
0.16.5 by Aaron Bentley
Get text shelving working
66
        self.tempdir = tempfile.mkdtemp()
0.16.22 by Aaron Bentley
Only prompt when there are changes to shelve.
67
        changes_shelved = 0
0.16.1 by Aaron Bentley
Begin implementing UI
68
        try:
0.16.5 by Aaron Bentley
Get text shelving working
69
            for change in creator:
70
                if change[0] == 'modify text':
0.16.22 by Aaron Bentley
Only prompt when there are changes to shelve.
71
                    changes_shelved += self.handle_modify_text(creator,
72
                                                               change[1])
0.16.16 by Aaron Bentley
Allow shelving renames and creation
73
                if change[0] == 'add file':
0.16.36 by Aaron Bentley
Better prompts on add/delete
74
                    if self.prompt_bool('Shelve adding file "%s"?'
75
                                        % change[3]):
0.16.16 by Aaron Bentley
Allow shelving renames and creation
76
                        creator.shelve_creation(change[1])
0.16.22 by Aaron Bentley
Only prompt when there are changes to shelve.
77
                        changes_shelved += 1
0.16.19 by Aaron Bentley
Implement shelving deletion
78
                if change[0] == 'delete file':
0.16.36 by Aaron Bentley
Better prompts on add/delete
79
                    if self.prompt_bool('Shelve removing file "%s"? '
80
                                        % change[3]):
0.16.19 by Aaron Bentley
Implement shelving deletion
81
                        creator.shelve_deletion(change[1])
0.16.22 by Aaron Bentley
Only prompt when there are changes to shelve.
82
                        changes_shelved += 1
0.16.16 by Aaron Bentley
Allow shelving renames and creation
83
                if change[0] == 'rename':
0.16.23 by Aaron Bentley
Improve prompting
84
                    if self.prompt_bool('Shelve renaming %s => %s?' %
85
                                   change[2:]):
0.16.16 by Aaron Bentley
Allow shelving renames and creation
86
                        creator.shelve_rename(change[1])
0.16.22 by Aaron Bentley
Only prompt when there are changes to shelve.
87
                        changes_shelved += 1
88
            if changes_shelved > 0:
0.16.25 by Aaron Bentley
Show selected changes before shelving
89
                print "Selected changes:"
90
                changes = creator.work_transform.iter_changes()
91
                reporter = delta._ChangeReporter(output_file=sys.stdout)
92
                delta.report_changes(changes, reporter)
0.16.24 by Aaron Bentley
Regularize prompts
93
                if (self.prompt_bool('Shelve %d change(s)?' %
0.16.23 by Aaron Bentley
Improve prompting
94
                    changes_shelved, auto=self.auto_apply)):
0.16.54 by Aaron Bentley
Inform user about shelf ids.
95
                    shelf_id = self.manager.shelve_changes(creator)
96
                    trace.note('Changes shelved with id "%d".' % shelf_id)
0.16.22 by Aaron Bentley
Only prompt when there are changes to shelve.
97
            else:
98
                print 'No changes to shelve.'
0.16.1 by Aaron Bentley
Begin implementing UI
99
        finally:
0.16.5 by Aaron Bentley
Get text shelving working
100
            shutil.rmtree(self.tempdir)
0.16.1 by Aaron Bentley
Begin implementing UI
101
            creator.finalize()
102
103
    def get_parsed_patch(self, file_id):
104
        old_path = self.work_tree.id2path(file_id)
105
        new_path = self.target_tree.id2path(file_id)
106
        try:
107
            patch = self.text_differ.diff(file_id, old_path, new_path, 'file',
108
                                          'file')
109
            self.diff_file.seek(0)
110
            return patches.parse_patch(self.diff_file)
111
        finally:
112
            self.diff_file.truncate(0)
113
0.16.23 by Aaron Bentley
Improve prompting
114
    def prompt_bool(self, question, auto=None):
0.16.44 by Aaron Bentley
Fix bogosity
115
        if auto is None:
0.16.23 by Aaron Bentley
Improve prompting
116
            auto = self.auto
117
        if auto:
118
            return True
0.16.26 by Aaron Bentley
Restore fancy prompting
119
        message = question + ' [yNfq]'
120
        print message,
0.16.20 by Aaron Bentley
Use new getchar from bzrtools
121
        char = getchar()
0.16.26 by Aaron Bentley
Restore fancy prompting
122
        print "\r" + ' ' * len(message) + '\r',
0.16.23 by Aaron Bentley
Improve prompting
123
        if char == 'y':
124
            return True
125
        elif char == 'f':
126
            self.auto = True
127
            return True
0.16.24 by Aaron Bentley
Regularize prompts
128
        if char == 'q':
129
            sys.exit(0)
0.16.23 by Aaron Bentley
Improve prompting
130
        else:
131
            return False
0.16.1 by Aaron Bentley
Begin implementing UI
132
0.16.5 by Aaron Bentley
Get text shelving working
133
    def handle_modify_text(self, creator, file_id):
0.16.1 by Aaron Bentley
Begin implementing UI
134
        parsed = self.get_parsed_patch(file_id)
0.16.43 by Aaron Bentley
Reduce API friction.
135
        final_hunks = []
0.16.15 by Aaron Bentley
Implement auto mode
136
        if not self.auto:
0.16.41 by Aaron Bentley
Implement shelving with internal patch
137
            offset = 0
0.16.15 by Aaron Bentley
Implement auto mode
138
            for hunk in parsed.hunks:
139
                self.diff_writer.write(str(hunk))
0.16.24 by Aaron Bentley
Regularize prompts
140
                if not self.prompt_bool('Shelve?'):
0.16.41 by Aaron Bentley
Implement shelving with internal patch
141
                    hunk.mod_pos += offset
0.16.43 by Aaron Bentley
Reduce API friction.
142
                    final_hunks.append(hunk)
0.16.41 by Aaron Bentley
Implement shelving with internal patch
143
                else:
144
                    offset -= (hunk.mod_range - hunk.orig_range)
0.16.43 by Aaron Bentley
Reduce API friction.
145
        target_lines = self.target_tree.get_file_lines(file_id)
146
        patched = patches.iter_patched_from_hunks(target_lines, final_hunks)
0.16.45 by Aaron Bentley
switch to shelve_lines
147
        creator.shelve_lines(file_id, list(patched))
0.16.43 by Aaron Bentley
Reduce API friction.
148
        return len(parsed.hunks) - len(final_hunks)
0.16.8 by Aaron Bentley
Implement unshelve2, tidy shelve2
149
150
151
class Unshelver(object):
152
153
    @classmethod
0.16.52 by Aaron Bentley
Allow user-specified shelves
154
    def from_args(klass, shelf_id):
0.16.8 by Aaron Bentley
Implement unshelve2, tidy shelve2
155
        tree, path = workingtree.WorkingTree.open_containing('.')
0.16.40 by Aaron Bentley
Update for ShelfManager API changes
156
        manager = tree.get_shelf_manager()
0.16.52 by Aaron Bentley
Allow user-specified shelves
157
        if shelf_id is not None:
158
            shelf_id = int(shelf_id)
159
        else:
160
            shelf_id = manager.last_shelf()
161
            if shelf_id is None:
162
                raise errors.BzrCommandError('No changes are shelved.')
0.16.54 by Aaron Bentley
Inform user about shelf ids.
163
            trace.note('Unshelving changes with id "%d".' % shelf_id)
0.16.13 by Aaron Bentley
Appy shelve-management updates to shelver
164
        return klass(tree, manager, shelf_id)
0.16.8 by Aaron Bentley
Implement unshelve2, tidy shelve2
165
0.16.13 by Aaron Bentley
Appy shelve-management updates to shelver
166
    def __init__(self, tree, manager, shelf_id):
0.16.8 by Aaron Bentley
Implement unshelve2, tidy shelve2
167
        self.tree = tree
0.16.13 by Aaron Bentley
Appy shelve-management updates to shelver
168
        self.manager = manager
169
        self.shelf_id = shelf_id
0.16.8 by Aaron Bentley
Implement unshelve2, tidy shelve2
170
171
    def run(self):
172
        self.tree.lock_write()
0.16.37 by Aaron Bentley
Use cleanups list to reduce nested try blocks
173
        cleanups = [self.tree.unlock]
0.16.8 by Aaron Bentley
Implement unshelve2, tidy shelve2
174
        try:
0.16.40 by Aaron Bentley
Update for ShelfManager API changes
175
            unshelver = self.manager.get_unshelver(self.shelf_id)
0.16.37 by Aaron Bentley
Use cleanups list to reduce nested try blocks
176
            cleanups.append(unshelver.finalize)
0.16.50 by Aaron Bentley
Display changes being unshelved
177
            unshelver.unshelve(delta._ChangeReporter())
0.16.37 by Aaron Bentley
Use cleanups list to reduce nested try blocks
178
            self.manager.delete_shelf(self.shelf_id)
0.16.8 by Aaron Bentley
Implement unshelve2, tidy shelve2
179
        finally:
0.16.37 by Aaron Bentley
Use cleanups list to reduce nested try blocks
180
            for cleanup in reversed(cleanups):
181
                cleanup()