/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

Commit messages never contain config options

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
 
import bzrlib.errors as errors
22
 
 
23
 
from errors import (DirectoryAlreadyExists, MissingArgumentError,
24
 
                    MultipleMoveError, NoFilesSpecified, NoMatchingFiles,
25
 
                    NonExistingSource, NotBranchError, NotSameBranchError,
26
 
                    NotVersionedError)
27
 
 
28
 
def add(file_list, recursive=False):
29
 
    """ Add listed files to the branch. 
30
 
    
31
 
    :param file_list - list of files to be added (using full paths)
32
 
    
33
 
    :param recursive - if True, all unknown files will be added
34
 
    
35
 
    :return: count of ignored files
36
 
    """
37
 
    import bzrlib.add
38
 
    
39
 
    try:
40
 
        added, ignored = bzrlib.add.smart_add(file_list, recursive)
41
 
    except errors.NotBranchError:
42
 
        raise NotBranchError
43
 
    except:
44
 
        raise
45
 
    
46
 
    match_len = 0
47
 
    for glob, paths in ignored.items():
48
 
        match_len += len(paths)
49
 
    
50
 
    return match_len
51
 
 
52
 
def mkdir(directory):
53
 
    """ Create new versioned directory.
54
 
    
55
 
    :param directory: the full path to the directory to be created
56
 
    """
57
 
    from bzrlib.workingtree import WorkingTree
58
 
    
59
 
    try:
60
 
        os.mkdir(directory)
61
 
    except OSError, e:
62
 
        if e.errno == 17:
63
 
            raise DirectoryAlreadyExists(directory)
64
 
    else:
65
 
        try:
66
 
            wt, dd = WorkingTree.open_containing(directory)
67
 
        except errors.NotBranchError:
68
 
            raise NotBranchError
69
 
        else:
70
 
            wt.add([dd])
71
 
 
72
 
def move(names_list):
73
 
    """ Move or rename given files.
74
 
    
75
 
    :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
76
 
    """
77
 
    from bzrlib.builtins import tree_files
78
 
    
79
 
    if len(names_list) < 2:
80
 
        raise MissingArgumentError
81
 
    
82
 
    try:
83
 
        tree, rel_names = tree_files(names_list)
84
 
    except errors.NotBranchError:
85
 
        raise NotBranchError
86
 
    except errors.BzrCommandError:
87
 
        # not the same branch presumably
88
 
        raise NotSameBranchError
89
 
        
90
 
    if os.path.isdir(names_list[-1]):
91
 
        # move into existing directory
92
 
        for pair in tree.move(rel_names[:-1], rel_names[-1]):
93
 
            pass
94
 
    else:
95
 
        if len(names_list) != 2:
96
 
            raise MultipleMoveError
97
 
        tree.rename_one(rel_names[0], rel_names[1])
98
 
 
99
 
def remove(file_list, new=False):
100
 
    """ Make selected files unversioned.
101
 
    
102
 
    :param file_list: list of files/directories to be removed
103
 
    
104
 
    :param new: if True, the 'added' files will be removed
105
 
    """
106
 
    import bzrlib
107
 
    from bzrlib.builtins import tree_files
108
 
    
109
 
    try:
110
 
        tree, file_list = tree_files(file_list)
111
 
    except errors.NotBranchError:
112
 
        raise NotBranchError
113
 
    except:
114
 
        raise
115
 
    
116
 
    if new is False:
117
 
        if file_list is None:
118
 
            raise NoFilesSpecified
119
 
    else:
120
 
        from bzrlib.delta import compare_trees
121
 
        if (bzrlib.version_info[0] == 0) and (bzrlib.version_info[1] < 9):
122
 
            added = [compare_trees(tree.basis_tree(), tree,
123
 
                                   specific_files=file_list).added]
124
 
        else:
125
 
            added = [tree.changes_from(tree.basis_tree(),
126
 
                                       specific_files=file_list).added]
127
 
        file_list = sorted([f[0] for f in added[0]], reverse=True)
128
 
        if len(file_list) == 0:
129
 
            raise NoMatchingFiles
130
 
    
131
 
    try:
132
 
        tree.remove(file_list)
133
 
    except errors.NotVersionedError:
134
 
        raise NotVersionedError
135
 
 
136
 
def rename(source, target):
137
 
    """ Rename a versioned file
138
 
    
139
 
    :param source: full path to the original file
140
 
    
141
 
    :param target: full path to the new file
142
 
    """
143
 
    if os.access(source, os.F_OK) is not True:
144
 
        raise NonExistingSource(source)
145
 
    
146
 
    move([source, target])
147
 
 
148
 
def status(filename):
149
 
    """ Get the status of a file.
150
 
    
151
 
    :param filename: the full path to the file
152
 
    
153
 
    :return: renamed | added | removed | modified | unchanged | unknown
154
 
    """
155
 
    import bzrlib
156
 
    from bzrlib.delta import compare_trees
157
 
    from bzrlib.workingtree import WorkingTree
158
 
    
159
 
    try:
160
 
        tree1 = WorkingTree.open_containing(filename)[0]
161
 
    except errors.NotBranchError:
162
 
        return 'unknown'
163
 
    
164
 
    branch = tree1.branch
165
 
    tree2 = tree1.branch.repository.revision_tree(branch.last_revision())
166
 
    
167
 
    # find the relative path to the given file (needed for proper delta)
168
 
    wtpath = tree1.basedir
169
 
    #print "DEBUG: wtpath =", wtpath
170
 
    fullpath = filename
171
 
    #print "DEBUG: fullpath =", fullpath
172
 
    i = 0
173
 
    wtsplit = wtpath.split('/')
174
 
    fpsplit = fullpath.split('/')
175
 
    fpcopy = fullpath.split('/')
176
 
    for item in fpsplit:
177
 
        if i is not len(wtsplit):
178
 
            if item == wtsplit[i]:
179
 
                del fpcopy[0]
180
 
            i = i + 1
181
 
    rel = '/'.join(fpcopy)
182
 
    #print "DEBUG: rel =", rel
183
 
    
184
 
    if bzrlib.version_info[1] < 9:
185
 
        delta = compare_trees(old_tree=tree2,
186
 
                              new_tree=tree1,
187
 
                              want_unchanged=True,
188
 
                              specific_files=[rel])
189
 
    else:
190
 
        delta = tree1.changes_from(tree2,
191
 
                                   want_unchanged=True,
192
 
                                   specific_files=[rel])
193
 
    
194
 
    """ Debug information (could be usable in the future, so didn't cut out)
195
 
    print "DEBUG: delta.renamed:"
196
 
    for path, id, kind, text_modified, meta_modified in delta.renamed:
197
 
        print path
198
 
    print
199
 
    print "DEBUG: delta.added:"
200
 
    for path, id, kind in delta.added:
201
 
        print path
202
 
    print
203
 
    print "DEBUG: delta.removed:"
204
 
    for path, id, kind, text_modified, meta_modified in delta.removed:
205
 
        print path
206
 
    print
207
 
    print "DEBUG: delta.modified:"
208
 
    for path, id, kind, text_modified, meta_modified in delta.modified:
209
 
        print path
210
 
    print
211
 
    print "DEBUG: delta.unchanged:"
212
 
    for path, id, kind in delta.unchanged:
213
 
        print path
214
 
    """
215
 
    
216
 
    if len(delta.renamed):
217
 
        return 'renamed'
218
 
    elif len(delta.added):
219
 
        return 'added'
220
 
    elif len(delta.removed):
221
 
        return 'removed'
222
 
    elif len(delta.modified):
223
 
        return 'modified'
224
 
    elif len(delta.unchanged):
225
 
        return 'unchanged'
226
 
    else:
227
 
        return 'unknown'