/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
0.8.5 by Szilveszter Farkas (Phanatic)
* backend/info.py: nick() and revno() implemented
2
# Some parts of the code are:
3
# Copyright (C) 2005, 2006 by Canonical Ltd
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
4
#
0.8.5 by Szilveszter Farkas (Phanatic)
* backend/info.py: nick() and revno() implemented
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.
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
9
#
0.8.5 by Szilveszter Farkas (Phanatic)
* backend/info.py: nick() and revno() implemented
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.
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
14
#
0.8.5 by Szilveszter Farkas (Phanatic)
* backend/info.py: nick() and revno() implemented
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
0.8.6 by Szilveszter Farkas (Phanatic)
* backend/info.py: implemented version(), whoami() and info()
19
import bzrlib
0.8.5 by Szilveszter Farkas (Phanatic)
* backend/info.py: nick() and revno() implemented
20
import bzrlib.errors as errors
21
22
from bzrlib.branch import Branch
0.8.23 by Szilveszter Farkas (Phanatic)
Visual feedback when Olive is busy; follow bzr API changes; commit dialog update
23
from bzrlib.workingtree import WorkingTree
0.8.5 by Szilveszter Farkas (Phanatic)
* backend/info.py: nick() and revno() implemented
24
0.11.1 by Jelmer Vernooij
Eliminate olive.backend.errors.
25
from bzrlib.errors import (NotBranchError, PermissionDenied, BzrError)
26
27
class DifferentBranchesError(BzrError):
28
    """ Occurs if the specified files are in different branches
29
    
30
    May occur in:
31
        info.diff()
32
    """
33
34
35
class PrefixFormatError(BzrError):
36
    """ Occurs if the prefix is badly formatted
37
    
38
    May occur in:
39
        info.diff()
40
    """
41
42
43
class RevisionValueError(BzrError):
44
    """ Invalid revision value provided
45
    
46
    May occur in:
47
        info.log()
48
    """
49
0.8.5 by Szilveszter Farkas (Phanatic)
* backend/info.py: nick() and revno() implemented
50
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
51
def diff(revision=None, file_list=None, diff_options=None, prefix=None):
52
    """ Save the diff into a temporary file.
53
    
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
54
    :param revision: a list of revision numbers (one or two elements)
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
55
    
56
    :param file_list: list of files you want to diff
57
    
58
    :param diff_options: external diff options
59
    
60
    :param prefix: 0 - p0, 1 - p1, or specify prefixes in the form of old/:new/
61
    
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
62
    :return: path to the temporary file which contains the diff output (the frontend has to remove it!)
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
63
    """
64
    from tempfile import mkstemp
65
    
66
    from bzrlib.builtins import internal_tree_files
67
    from bzrlib.diff import show_diff_trees
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
68
    from bzrlib.revisionspec import RevisionSpec_int
0.8.6 by Szilveszter Farkas (Phanatic)
* backend/info.py: implemented version(), whoami() and info()
69
    from bzrlib.workingtree import WorkingTree
70
    
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
71
    from info_helper import diff_helper
72
73
    if (prefix is None) or (prefix == '0'):
74
        # diff -p0 format
75
        old_label = ''
76
        new_label = ''
77
    elif prefix == '1':
78
        old_label = 'old/'
79
        new_label = 'new/'
80
    else:
81
        if not ':' in prefix:
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
82
            raise PrefixFormatError
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
83
        old_label, new_label = prefix.split(":")
84
    
85
    try:
86
        tree1, file_list = internal_tree_files(file_list)
87
        tree2 = None
88
        b = None
89
        b2 = None
90
    except errors.FileInWrongBranch:
91
        if len(file_list) != 2:
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
92
            raise DifferentBranchesError
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
93
94
        tree1, file1 = WorkingTree.open_containing(file_list[0])
95
        tree2, file2 = WorkingTree.open_containing(file_list[1])
96
    
97
        if file1 != "" or file2 != "":
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
98
            raise DifferentBranchesError
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
99
    
100
        file_list = None
101
    
102
    tmpfile = mkstemp(prefix='olive_')
103
    tmpfp = open(tmpfile[1], 'w')
104
    
105
    if revision is not None:
106
        if tree2 is not None:
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
107
            raise RevisionValueError
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
108
    
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
109
        if len(revision) >= 1:
110
            revision[0] = RevisionSpec_int(revision[0])
111
        if len(revision) == 2:
112
            revision[1] = RevisionSpec_int(revision[1])
113
        
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
114
        if (len(revision) == 1) or (revision[1].spec is None):
115
            ret = diff_helper(tree1, file_list, diff_options,
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
116
                              revision[0], 
117
                              old_label=old_label, new_label=new_label,
118
                              output=tmpfp)
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
119
        elif len(revision) == 2:
120
            ret = diff_helper(tree1, file_list, diff_options,
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
121
                              revision[0], revision[1],
122
                              old_label=old_label, new_label=new_label,
123
                              output=tmpfp)
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
124
        else:
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
125
            raise RevisionValueError
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
126
    else:
127
        if tree2 is not None:
128
            ret = show_diff_trees(tree1, tree2, tmpfp, 
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
129
                                  specific_files=file_list,
130
                                  external_diff_options=diff_options,
131
                                  old_label=old_label, new_label=new_label)
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
132
        else:
133
            ret = diff_helper(tree1, file_list, diff_options,
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
134
                              old_label=old_label, new_label=new_label,
135
                              output=tmpfp)
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
136
    
137
    tmpfp.close()
138
    
139
    if ret == 0:
140
        return False
141
    else:
142
        return tmpfile[1]
0.8.6 by Szilveszter Farkas (Phanatic)
* backend/info.py: implemented version(), whoami() and info()
143
0.8.27 by Szilveszter Farkas (Phanatic)
Push dialog now displays stored location
144
def get_push_location(location):
145
    """ Get the stored push location of a branch.
146
    
147
    :param location: the path to the branch
148
    
149
    :return: the stored location
150
    """
151
    from bzrlib.branch import Branch
152
    
0.11.3 by Jelmer Vernooij
Remove more unused functions, imports
153
    branch = Branch.open_containing(location)[0]
0.8.27 by Szilveszter Farkas (Phanatic)
Push dialog now displays stored location
154
    
155
    return branch.get_push_location()
156
0.8.6 by Szilveszter Farkas (Phanatic)
* backend/info.py: implemented version(), whoami() and info()
157
def info(location):
158
    """ Get info about branch, working tree, and repository
159
    
160
    :param location: the location of the branch/working tree/repository
161
    
162
    :return: the information in dictionary format
163
    
164
    The following informations are delivered (if available):
165
    ret['location']['lightcoroot']: Light checkout root
166
    ret['location']['sharedrepo']: Shared repository
167
    ret['location']['repobranch']: Repository branch
168
    ret['location']['cobranch']: Checkout of branch
169
    ret['location']['repoco']: Repository checkout
170
    ret['location']['coroot']: Checkout root
171
    ret['location']['branchroot']: Branch root
172
    ret['related']['parentbranch']: Parent branch
173
    ret['related']['publishbranch']: Publish to branch
174
    ret['format']['control']: Control format
175
    ret['format']['workingtree']: Working tree format
176
    ret['format']['branch']: Branch format
177
    ret['format']['repository']: Repository format
178
    ret['locking']['workingtree']: Working tree lock status
179
    ret['locking']['branch']: Branch lock status
180
    ret['locking']['repository']: Repository lock status
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
181
    ret['missing']['branch']: Missing revisions in branch
182
    ret['missing']['workingtree']: Missing revisions in working tree
0.8.6 by Szilveszter Farkas (Phanatic)
* backend/info.py: implemented version(), whoami() and info()
183
    ret['wtstats']['unchanged']: Unchanged files
184
    ret['wtstats']['modified']: Modified files
185
    ret['wtstats']['added']: Added files
186
    ret['wtstats']['removed']: Removed files
187
    ret['wtstats']['renamed']: Renamed files
188
    ret['wtstats']['unknown']: Unknown files
189
    ret['wtstats']['ignored']: Ingnored files
190
    ret['wtstats']['subdirs']: Versioned subdirectories
191
    ret['brstats']['revno']: Revisions in branch
192
    ret['brstats']['commiters']: Number of commiters
193
    ret['brstats']['age']: Age of branch in days
194
    ret['brstats']['firstrev']: Time of first revision
195
    ret['brstats']['lastrev']: Time of last revision
196
    ret['repstats']['revisions']: Revisions in repository
197
    ret['repstats']['size']: Size of repository in bytes
198
    """
199
    import bzrlib.bzrdir as bzrdir
200
    
201
    import info_helper
202
    
203
    ret = {}
0.11.3 by Jelmer Vernooij
Remove more unused functions, imports
204
    a_bzrdir = bzrdir.BzrDir.open_containing(location)[0]
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
205
0.8.6 by Szilveszter Farkas (Phanatic)
* backend/info.py: implemented version(), whoami() and info()
206
    try:
207
        working = a_bzrdir.open_workingtree()
208
        working.lock_read()
209
        try:
210
            branch = working.branch
211
            repository = branch.repository
212
            control = working.bzrdir
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
213
            
0.8.6 by Szilveszter Farkas (Phanatic)
* backend/info.py: implemented version(), whoami() and info()
214
            ret['location'] = info_helper.get_location_info(repository, branch, working)
215
            ret['related'] = info_helper.get_related_info(branch)
216
            ret['format'] = info_helper.get_format_info(control, repository, branch, working)
217
            ret['locking'] = info_helper.get_locking_info(repository, branch, working)
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
218
            ret['missing'] = {}
219
            ret['missing']['branch'] = info_helper.get_missing_revisions_branch(branch)
220
            ret['missing']['workingtree'] = info_helper.get_missing_revisions_working(working)
0.8.6 by Szilveszter Farkas (Phanatic)
* backend/info.py: implemented version(), whoami() and info()
221
            ret['wtstats'] = info_helper.get_working_stats(working)
222
            ret['brstats'] = info_helper.get_branch_stats(branch)
223
            ret['repstats'] = info_helper.get_repository_stats(repository)
224
        finally:
225
            working.unlock()
226
            return ret
227
        return
228
    except (errors.NoWorkingTree, errors.NotLocalUrl):
229
        pass
230
231
    try:
232
        branch = a_bzrdir.open_branch()
233
        branch.lock_read()
234
        try:
235
            ret['location'] = info_helper.get_location_info(repository, branch)
236
            ret['related'] = info_helper.get_related_info(branch)
237
            ret['format'] = info_helper.get_format_info(control, repository, branch)
238
            ret['locking'] = info_helper.get_locking_info(repository, branch)
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
239
            ret['missing']['branch'] = info_helper.get_missing_revisions_branch(branch)
0.8.6 by Szilveszter Farkas (Phanatic)
* backend/info.py: implemented version(), whoami() and info()
240
            ret['brstats'] = info_helper.get_branch_stats(branch)
241
            ret['repstats'] = info_helper.get_repository_stats(repository)
242
        finally:
243
            branch.unlock()
244
            return ret
245
        return
246
    except errors.NotBranchError:
247
        pass
248
249
    try:
250
        repository = a_bzrdir.open_repository()
251
        repository.lock_read()
252
        try:
253
            ret['location'] = info_helper.get_location_info(repository)
254
            ret['format'] = info_helper.get_format_info(control, repository)
255
            ret['locking'] = info_helper.get_locking_info(repository)
256
            ret['repstats'] = info_helper.get_repository_stats(repository)
257
        finally:
258
            repository.unlock()
259
            return ret
260
        return
261
    except errors.NoRepositoryPresent:
262
        pass
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
263
0.8.53 by Szilveszter Farkas (Phanatic)
Set sensitivity of menus and toolbuttons.
264
def is_branch(location):
265
    """ Check if the location is a branch.
266
    
267
    :param location: the location you want to check
268
    
269
    :return: True or False respectively
270
    """
271
    try:
272
        branch = Branch.open_containing(location)[0]
273
    except errors.NotBranchError:
274
        return False
275
    else:
276
        return True
277
        
278
0.8.23 by Szilveszter Farkas (Phanatic)
Visual feedback when Olive is busy; follow bzr API changes; commit dialog update
279
def is_checkout(location):
280
    """ Check if the location is a checkout.
281
    
282
    :param location: the location you want to check
283
    
284
    :return: True or False respectively
285
    """
0.11.3 by Jelmer Vernooij
Remove more unused functions, imports
286
    branch = Branch.open_containing(location)[0]
0.8.23 by Szilveszter Farkas (Phanatic)
Visual feedback when Olive is busy; follow bzr API changes; commit dialog update
287
    
288
    try:
289
        working = WorkingTree.open_containing(location)[0]
290
    except:
291
        raise
292
    
293
    working_path = working.bzrdir.root_transport.base
294
    branch_path = branch.bzrdir.root_transport.base
295
    
296
    if working_path != branch_path:
297
        # lightweight checkout
298
        return True
299
    elif branch.get_bound_location():
300
        # checkout
301
        return True
302
    else:
303
        return False
304
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
305
def log(location, timezone='original', verbose=False, show_ids=False,
306
        forward=False, revision=None, log_format=None, message=None,
307
        long=False, short=False, line=False):
308
    """ Print log into a temporary file.
309
    
310
    :param location: location of local/remote branch or file
311
    
312
    :param timzone: requested timezone
313
    
314
    :param verbose: verbose output
315
    
316
    :param show_ids:
317
    
318
    :param forward: if True, start from the earliest entry
319
    
320
    :param revision: revision range as a list ([from, to])
321
    
322
    :param log_format: line, short, long
323
    
324
    :param message: show revisions whose message matches this regexp
325
    
326
    :param long: long log format
327
    
328
    :param short: short log format
329
    
330
    :param line: line log format
331
    
332
    :return: full path to the temporary file containing the log (the frontend has to remove it!)
333
    """
334
    from tempfile import mkstemp
335
    
336
    from bzrlib import bzrdir    
337
    from bzrlib.builtins import get_log_format
338
    from bzrlib.log import log_formatter, show_log
339
    from bzrlib.revisionspec import RevisionSpec_int
340
    
341
    assert message is None or isinstance(message, basestring), \
342
        "invalid message argument %r" % message
343
    direction = (forward and 'forward') or 'reverse'
344
        
345
    # log everything
346
    file_id = None
347
    
348
    # find the file id to log:
349
    dir, fp = bzrdir.BzrDir.open_containing(location)
350
    b = dir.open_branch()
351
    if fp != '':
352
        try:
353
            # might be a tree:
354
            inv = dir.open_workingtree().inventory
355
        except (errors.NotBranchError, errors.NotLocalUrl):
356
            # either no tree, or is remote.
357
            inv = b.basis_tree().inventory
358
        file_id = inv.path2id(fp)
359
360
    if revision is not None:
361
        if len(revision) >= 1:
362
            revision[0] = RevisionSpec_int(revision[0])
363
        if len(revision) == 2:
364
            revision[1] = RevisionSpec_int(revision[1])
365
    
366
    if revision is None:
367
        rev1 = None
368
        rev2 = None
369
    elif len(revision) == 1:
370
        rev1 = rev2 = revision[0].in_history(b).revno
371
    elif len(revision) == 2:
372
        if revision[0].spec is None:
373
            # missing begin-range means first revision
374
            rev1 = 1
375
        else:
376
            rev1 = revision[0].in_history(b).revno
377
378
        if revision[1].spec is None:
379
            # missing end-range means last known revision
380
            rev2 = b.revno()
381
        else:
382
            rev2 = revision[1].in_history(b).revno
383
    else:
384
        raise RevisionValueError
385
386
    # By this point, the revision numbers are converted to the +ve
387
    # form if they were supplied in the -ve form, so we can do
388
    # this comparison in relative safety
389
    if rev1 > rev2:
390
        (rev2, rev1) = (rev1, rev2)
391
392
    if (log_format == None):
393
        default = b.get_config().log_format()
394
        log_format = get_log_format(long=long, short=short, line=line, 
395
                                    default=default)
396
    
397
    tmpfile = mkstemp(prefix='olive_')
398
    tmpfp = open(tmpfile[1], 'w')
399
    
400
    lf = log_formatter(log_format,
401
                       show_ids=show_ids,
402
                       to_file=tmpfp,
403
                       show_timezone=timezone)
404
405
    show_log(b,
406
             lf,
407
             file_id,
408
             verbose=verbose,
409
             direction=direction,
410
             start_revision=rev1,
411
             end_revision=rev2,
412
             search=message)
413
    
414
    tmpfp.close()
415
    return tmpfile[1]
416
0.8.8 by Szilveszter Farkas (Phanatic)
2006-07-06 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
417
def nick(branch, nickname=None):
418
    """ Get or set nickname.
419
    
420
    :param branch: path to the branch
421
    
422
    :param nickname: if specified, the nickname will be set
423
    
424
    :return: nickname
425
    """
426
    try:
427
        branch = Branch.open_containing(branch)[0]
428
    except errors.NotBranchError:
429
        raise NotBranchError
430
    
431
    if nickname is not None:
432
        branch.nick = nickname
433
434
    return branch.nick    
435
436
def revno(branch):
437
    """ Get current revision number for specified branch
438
    
439
    :param branch: path to the branch
440
    
441
    :return: revision number
442
    """
443
    try:
444
        revno = Branch.open_containing(branch)[0].revno()
445
    except errors.NotBranchError:
446
        raise NotBranchError
447
    else:
448
        return revno
449
450
def version():
451
    """ Get version information from bzr
452
    
453
    :return: bzrlib version
454
    """
455
    return bzrlib.__version__
456
457
def whoami(branch=None, email=False):
458
    """ Get user's data (name and email address)
459
    
460
    :param branch: if specified, the user's data will be looked up in the branch's config
461
    
462
    :param email: if True, only the email address will be returned
463
    
464
    :return: user info (only email address if email is True)
465
    """
466
    from bzrlib.workingtree import WorkingTree
467
    
468
    if branch is not None:
469
        try:
470
            b = WorkingTree.open_containing(u'.')[0].branch
471
            config = bzrlib.config.BranchConfig(b)
472
        except NotBranchError:
473
            config = bzrlib.config.GlobalConfig()
474
    else:
475
        config = bzrlib.config.GlobalConfig()
476
        
477
    if email:
478
        return config.user_email()
479
    else:
480
        return config.username()