/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to olive/backend/fileops.py

  • Committer: Jelmer Vernooij
  • Date: 2006-09-04 23:36:58 UTC
  • mto: (0.8.83 merge)
  • mto: This revision was merged to the branch mainline in revision 83.
  • Revision ID: jelmer@samba.org-20060904233658-9c7861991474581b
Move ui.py to frontend as it is gtk-specific

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
 
2
# Some parts of the code are:
 
3
# Copyright (C) 2005, 2006 by Canonical Ltd
 
4
#
 
5
# This program is free software; you can redistribute it and/or modify
 
6
# it under the terms of the GNU General Public License as published by
 
7
# the Free Software Foundation; either version 2 of the License, or
 
8
# (at your option) any later version.
 
9
#
 
10
# This program is distributed in the hope that it will be useful,
 
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
# GNU General Public License for more details.
 
14
#
 
15
# You should have received a copy of the GNU General Public License
 
16
# along with this program; if not, write to the Free Software
 
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
18
 
 
19
import os
 
20
 
 
21
from bzrlib.errors import (BzrError, NotBranchError, NotVersionedError, 
 
22
                           PermissionDenied)
 
23
 
 
24
 
 
25
class DirectoryAlreadyExists(BzrError):
 
26
    """ The specified directory already exists
 
27
    
 
28
    May occur in:
 
29
        fileops.mkdir()
 
30
    """
 
31
 
 
32
 
 
33
class MultipleMoveError(BzrError):
 
34
    """ Occurs when moving/renaming more than 2 files, but the last argument is not a directory
 
35
    
 
36
    May occur in:
 
37
        fileops.move()
 
38
    """
 
39
 
 
40
 
 
41
class NoMatchingFiles(BzrError):
 
42
    """ No files found which could match the criteria
 
43
    
 
44
    May occur in:
 
45
        fileops.remove()
 
46
    """
 
47
 
 
48
 
 
49
def add(file_list, recursive=False):
 
50
    """ Add listed files to the branch. 
 
51
    
 
52
    :param file_list - list of files to be added (using full paths)
 
53
    
 
54
    :param recursive - if True, all unknown files will be added
 
55
    
 
56
    :return: count of ignored files
 
57
    """
 
58
    import bzrlib.add
 
59
    
 
60
    added, ignored = bzrlib.add.smart_add(file_list, recursive)
 
61
    
 
62
    match_len = 0
 
63
    for glob, paths in ignored.items():
 
64
        match_len += len(paths)
 
65
    
 
66
    return match_len
 
67
 
 
68
def mkdir(directory):
 
69
    """ Create new versioned directory.
 
70
    
 
71
    :param directory: the full path to the directory to be created
 
72
    """
 
73
    from bzrlib.workingtree import WorkingTree
 
74
    
 
75
    try:
 
76
        os.mkdir(directory)
 
77
    except OSError, e:
 
78
        if e.errno == 17:
 
79
            raise DirectoryAlreadyExists(directory)
 
80
    else:
 
81
        wt, dd = WorkingTree.open_containing(directory)
 
82
        wt.add([dd])
 
83
 
 
84
def move(names_list):
 
85
    """ Move or rename given files.
 
86
    
 
87
    :param file_list: if two elements, then rename the first to the second, if more elements then move all of them to the directory specified in the last element
 
88
    """
 
89
    from bzrlib.builtins import tree_files
 
90
    
 
91
    tree, rel_names = tree_files(names_list)
 
92
        
 
93
    if os.path.isdir(names_list[-1]):
 
94
        # move into existing directory
 
95
        for pair in tree.move(rel_names[:-1], rel_names[-1]):
 
96
            pass
 
97
    else:
 
98
        if len(names_list) != 2:
 
99
            raise MultipleMoveError
 
100
        tree.rename_one(rel_names[0], rel_names[1])
 
101
 
 
102
 
 
103
def remove(file_list, new=False):
 
104
    """ Make selected files unversioned.
 
105
    
 
106
    :param file_list: list of files/directories to be removed
 
107
    
 
108
    :param new: if True, the 'added' files will be removed
 
109
    """
 
110
    import bzrlib
 
111
    from bzrlib.builtins import tree_files
 
112
    
 
113
    tree, file_list = tree_files(file_list)
 
114
    
 
115
    if new:
 
116
        from bzrlib.delta import compare_trees
 
117
        if (bzrlib.version_info[0] == 0) and (bzrlib.version_info[1] < 9):
 
118
            added = [compare_trees(tree.basis_tree(), tree,
 
119
                                   specific_files=file_list).added]
 
120
        else:
 
121
            added = [tree.changes_from(tree.basis_tree(),
 
122
                                       specific_files=file_list).added]
 
123
        file_list = sorted([f[0] for f in added[0]], reverse=True)
 
124
        if len(file_list) == 0:
 
125
            raise NoMatchingFiles
 
126
    
 
127
    tree.remove(file_list)
 
128
 
 
129
 
 
130
def rename(source, target):
 
131
    """ Rename a versioned file
 
132
    
 
133
    :param source: full path to the original file
 
134
    
 
135
    :param target: full path to the new file
 
136
    """
 
137
    move([source, target])
 
138
 
 
139
def status(filename):
 
140
    """ Get the status of a file.
 
141
    
 
142
    :param filename: the full path to the file
 
143
    
 
144
    :return: renamed | added | removed | modified | unchanged | unknown
 
145
    """
 
146
    import bzrlib
 
147
    from bzrlib.delta import compare_trees
 
148
    from bzrlib.workingtree import WorkingTree
 
149
    
 
150
    try:
 
151
        tree1 = WorkingTree.open_containing(filename)[0]
 
152
    except NotBranchError:
 
153
        return 'unknown'
 
154
    
 
155
    branch = tree1.branch
 
156
    tree2 = tree1.branch.repository.revision_tree(branch.last_revision())
 
157
    
 
158
    # find the relative path to the given file (needed for proper delta)
 
159
    wtpath = tree1.basedir
 
160
    #print "DEBUG: wtpath =", wtpath
 
161
    fullpath = filename
 
162
    #print "DEBUG: fullpath =", fullpath
 
163
    i = 0
 
164
    wtsplit = wtpath.split('/')
 
165
    fpsplit = fullpath.split('/')
 
166
    fpcopy = fullpath.split('/')
 
167
    for item in fpsplit:
 
168
        if i is not len(wtsplit):
 
169
            if item == wtsplit[i]:
 
170
                del fpcopy[0]
 
171
            i = i + 1
 
172
    rel = '/'.join(fpcopy)
 
173
    #print "DEBUG: rel =", rel
 
174
    
 
175
    if bzrlib.version_info[1] < 9:
 
176
        delta = compare_trees(old_tree=tree2,
 
177
                              new_tree=tree1,
 
178
                              want_unchanged=True,
 
179
                              specific_files=[rel])
 
180
    else:
 
181
        delta = tree1.changes_from(tree2,
 
182
                                   want_unchanged=True,
 
183
                                   specific_files=[rel])
 
184
    
 
185
    """ Debug information (could be usable in the future, so didn't cut out)
 
186
    print "DEBUG: delta.renamed:"
 
187
    for path, id, kind, text_modified, meta_modified in delta.renamed:
 
188
        print path
 
189
    print
 
190
    print "DEBUG: delta.added:"
 
191
    for path, id, kind in delta.added:
 
192
        print path
 
193
    print
 
194
    print "DEBUG: delta.removed:"
 
195
    for path, id, kind, text_modified, meta_modified in delta.removed:
 
196
        print path
 
197
    print
 
198
    print "DEBUG: delta.modified:"
 
199
    for path, id, kind, text_modified, meta_modified in delta.modified:
 
200
        print path
 
201
    print
 
202
    print "DEBUG: delta.unchanged:"
 
203
    for path, id, kind in delta.unchanged:
 
204
        print path
 
205
    """
 
206
    
 
207
    if len(delta.renamed):
 
208
        return 'renamed'
 
209
    elif len(delta.added):
 
210
        return 'added'
 
211
    elif len(delta.removed):
 
212
        return 'removed'
 
213
    elif len(delta.modified):
 
214
        return 'modified'
 
215
    elif len(delta.unchanged):
 
216
        return 'unchanged'
 
217
    else:
 
218
        return 'unknown'