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