/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: 2008-06-29 16:20:15 UTC
  • mto: This revision was merged to the branch mainline in revision 519.
  • Revision ID: jelmer@samba.org-20080629162015-amhe7xj4cdmup4id
Rename GtkProgressBarStack to GtkWindowProgressBarStack

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'