~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Aaron Bentley
  • Date: 2006-04-07 22:46:52 UTC
  • mfrom: (1645 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1727.
  • Revision ID: aaron.bentley@utoronto.ca-20060407224652-4925bc3735b926f8
Merged latest bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# (C) 2005 Canonical
 
1
# Copyright (C) 2005, 2006 Canonical
2
2
 
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
34
34
... except:
35
35
...   print sys.exc_type
36
36
...   print sys.exc_value
37
 
...   print sys.exc_value.path
 
37
...   path = getattr(sys.exc_value, 'path')
 
38
...   if path is not None:
 
39
...     print path
38
40
bzrlib.errors.NotBranchError
39
41
Not a branch: /foo/bar
40
42
/foo/bar
103
105
 
104
106
class BzrCheckError(BzrNewError):
105
107
    """Internal check failed: %(message)s"""
 
108
 
106
109
    def __init__(self, message):
107
110
        BzrNewError.__init__(self)
108
111
        self.message = message
138
141
        self.base = base
139
142
 
140
143
 
 
144
class NotLocalUrl(BzrNewError):
 
145
    """%s(url) is not a local path."""
 
146
    
 
147
    def __init__(self, url):
 
148
        BzrNewError.__init__(self)
 
149
        self.url = url
 
150
 
 
151
 
141
152
class BzrCommandError(BzrError):
142
153
    # Error from malformed user command
143
154
    # This is being misused as a generic exception
144
155
    # pleae subclass. RBC 20051030
 
156
    #
 
157
    # I think it's a waste of effort to differentiate between errors that
 
158
    # are not intended to be caught anyway.  UI code need not subclass
 
159
    # BzrCommandError, and non-UI code should not throw a subclass of
 
160
    # BzrCommandError.  ADHB 20051211
145
161
    def __str__(self):
146
162
        return self.args[0]
147
163
 
173
189
    """File exists: %(path)r%(extra)s"""
174
190
 
175
191
 
 
192
class DirectoryNotEmpty(PathError):
 
193
    """Directory not empty: %(path)r%(extra)s"""
 
194
 
 
195
 
 
196
class ResourceBusy(PathError):
 
197
    """Device or resource busy: %(path)r%(extra)s"""
 
198
 
 
199
 
176
200
class PermissionDenied(PathError):
177
201
    """Permission denied: %(path)r%(extra)s"""
178
202
 
196
220
        self.path = path
197
221
 
198
222
 
 
223
class NoRepositoryPresent(BzrNewError):
 
224
    """Not repository present: %(path)r"""
 
225
    def __init__(self, bzrdir):
 
226
        BzrNewError.__init__(self)
 
227
        self.path = bzrdir.transport.clone('..').base
 
228
 
 
229
 
199
230
class FileInWrongBranch(BzrNewError):
200
231
    """File %(path)s in not in branch %(branch_base)s."""
 
232
 
201
233
    def __init__(self, branch, path):
202
234
        BzrNewError.__init__(self)
203
235
        self.branch = branch
206
238
 
207
239
 
208
240
class UnsupportedFormatError(BzrError):
209
 
    """Specified path is a bzr branch that we cannot read."""
 
241
    """Specified path is a bzr branch that we recognize but cannot read."""
210
242
    def __str__(self):
211
243
        return 'unsupported branch format: %s' % self.args[0]
212
244
 
213
245
 
 
246
class UnknownFormatError(BzrError):
 
247
    """Specified path is a bzr branch whose format we do not recognize."""
 
248
    def __str__(self):
 
249
        return 'unknown branch format: %s' % self.args[0]
 
250
 
 
251
 
 
252
class IncompatibleFormat(BzrNewError):
 
253
    """Format %(format)s is not compatible with .bzr version %(bzrdir)s."""
 
254
 
 
255
    def __init__(self, format, bzrdir_format):
 
256
        BzrNewError.__init__(self)
 
257
        self.format = format
 
258
        self.bzrdir = bzrdir_format
 
259
 
 
260
 
214
261
class NotVersionedError(BzrNewError):
215
262
    """%(path)s is not versioned"""
216
263
    def __init__(self, path):
228
275
    """Cannot operate on a file because it is a control file."""
229
276
 
230
277
 
231
 
class LockError(Exception):
232
 
    """Lock error"""
 
278
class LockError(BzrNewError):
 
279
    """Lock error: %(message)s"""
233
280
    # All exceptions from the lock/unlock functions should be from
234
281
    # this exception class.  They will be translated as necessary. The
235
282
    # original exception is available as e.original_error
 
283
    #
 
284
    # New code should prefer to raise specific subclasses
 
285
    def __init__(self, message):
 
286
        self.message = message
236
287
 
237
288
 
238
289
class CommitNotPossible(LockError):
239
290
    """A commit was attempted but we do not have a write lock open."""
 
291
    def __init__(self):
 
292
        pass
240
293
 
241
294
 
242
295
class AlreadyCommitted(LockError):
243
296
    """A rollback was requested, but is not able to be accomplished."""
 
297
    def __init__(self):
 
298
        pass
244
299
 
245
300
 
246
301
class ReadOnlyError(LockError):
247
 
    """A write attempt was made in a read only transaction."""
 
302
    """A write attempt was made in a read only transaction on %(obj)s"""
 
303
    def __init__(self, obj):
 
304
        self.obj = obj
 
305
 
 
306
 
 
307
class OutSideTransaction(BzrNewError):
 
308
    """A transaction related operation was attempted after the transaction finished."""
 
309
 
 
310
 
 
311
class ObjectNotLocked(LockError):
 
312
    """%(obj)r is not locked"""
 
313
    # this can indicate that any particular object is not locked; see also
 
314
    # LockNotHeld which means that a particular *lock* object is not held by
 
315
    # the caller -- perhaps they should be unified.
 
316
    def __init__(self, obj):
 
317
        self.obj = obj
 
318
 
 
319
 
 
320
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
321
    """Cannot change object %(obj)r in read only transaction"""
 
322
    def __init__(self, obj):
 
323
        self.obj = obj
 
324
 
 
325
 
 
326
class UnlockableTransport(LockError):
 
327
    """Cannot lock: transport is read only: %(transport)s"""
 
328
    def __init__(self, transport):
 
329
        self.transport = transport
 
330
 
 
331
 
 
332
class LockContention(LockError):
 
333
    """Could not acquire lock %(lock)s"""
 
334
    # TODO: show full url for lock, combining the transport and relative bits?
 
335
    def __init__(self, lock):
 
336
        self.lock = lock
 
337
 
 
338
 
 
339
class LockBroken(LockError):
 
340
    """Lock was broken while still open: %(lock)s - check storage consistency!"""
 
341
    def __init__(self, lock):
 
342
        self.lock = lock
 
343
 
 
344
 
 
345
class LockBreakMismatch(LockError):
 
346
    """Lock was released and re-acquired before being broken: %(lock)s: held by %(holder)r, wanted to break %(target)r"""
 
347
    def __init__(self, lock, holder, target):
 
348
        self.lock = lock
 
349
        self.holder = holder
 
350
        self.target = target
 
351
 
 
352
 
 
353
class LockNotHeld(LockError):
 
354
    """Lock not held: %(lock)s"""
 
355
    def __init__(self, lock):
 
356
        self.lock = lock
248
357
 
249
358
 
250
359
class PointlessCommit(BzrNewError):
251
360
    """No changes to commit"""
252
361
 
 
362
 
 
363
class UpgradeReadonly(BzrNewError):
 
364
    """Upgrade URL cannot work with readonly URL's."""
 
365
 
 
366
 
 
367
class UpToDateFormat(BzrNewError):
 
368
    """The branch format %(format)s is already at the most recent format."""
 
369
 
 
370
    def __init__(self, format):
 
371
        BzrNewError.__init__(self)
 
372
        self.format = format
 
373
 
 
374
 
 
375
 
253
376
class StrictCommitFailed(Exception):
254
377
    """Commit refused because there are unknowns in the tree."""
255
378
 
 
379
 
256
380
class NoSuchRevision(BzrError):
257
381
    def __init__(self, branch, revision):
258
382
        self.branch = branch
271
395
 
272
396
class DivergedBranches(BzrError):
273
397
    def __init__(self, branch1, branch2):
274
 
        BzrError.__init__(self, "These branches have diverged.")
 
398
        BzrError.__init__(self, "These branches have diverged.  Try merge.")
275
399
        self.branch1 = branch1
276
400
        self.branch2 = branch2
277
401
 
282
406
            " specified."
283
407
        BzrCommandError.__init__(self, msg)
284
408
 
 
409
 
285
410
class NoCommonAncestor(BzrError):
286
411
    def __init__(self, revision_a, revision_b):
287
412
        msg = "Revisions have no common ancestor: %s %s." \
288
413
            % (revision_a, revision_b) 
289
414
        BzrError.__init__(self, msg)
290
415
 
 
416
 
291
417
class NoCommonRoot(BzrError):
292
418
    def __init__(self, revision_a, revision_b):
293
419
        msg = "Revisions are not derived from the same root: %s %s." \
294
420
            % (revision_a, revision_b) 
295
421
        BzrError.__init__(self, msg)
296
422
 
 
423
 
 
424
 
297
425
class NotAncestor(BzrError):
298
426
    def __init__(self, rev_id, not_ancestor_id):
299
427
        msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id, 
317
445
        BzrError.__init__(self, msg)
318
446
        self.bases = bases
319
447
 
 
448
 
320
449
class NoCommits(BzrError):
321
450
    def __init__(self, branch):
322
451
        msg = "Branch %s has no commits." % branch
323
452
        BzrError.__init__(self, msg)
324
453
 
 
454
 
325
455
class UnlistableStore(BzrError):
326
456
    def __init__(self, store):
327
457
        BzrError.__init__(self, "Store %s is not listable" % store)
328
458
 
 
459
 
 
460
 
329
461
class UnlistableBranch(BzrError):
330
462
    def __init__(self, br):
331
463
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
332
464
 
333
465
 
 
466
class BoundBranchOutOfDate(BzrNewError):
 
467
    """Bound branch %(branch)s is out of date with master branch %(master)s."""
 
468
    def __init__(self, branch, master):
 
469
        BzrNewError.__init__(self)
 
470
        self.branch = branch
 
471
        self.master = master
 
472
 
 
473
        
 
474
class CommitToDoubleBoundBranch(BzrNewError):
 
475
    """Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."""
 
476
    def __init__(self, branch, master, remote):
 
477
        BzrNewError.__init__(self)
 
478
        self.branch = branch
 
479
        self.master = master
 
480
        self.remote = remote
 
481
 
 
482
 
 
483
class OverwriteBoundBranch(BzrNewError):
 
484
    """Cannot pull --overwrite to a branch which is bound %(branch)s"""
 
485
    def __init__(self, branch):
 
486
        BzrNewError.__init__(self)
 
487
        self.branch = branch
 
488
 
 
489
 
 
490
class BoundBranchConnectionFailure(BzrNewError):
 
491
    """Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"""
 
492
    def __init__(self, branch, target, error):
 
493
        BzrNewError.__init__(self)
 
494
        self.branch = branch
 
495
        self.target = target
 
496
        self.error = error
 
497
 
 
498
 
334
499
class WeaveError(BzrNewError):
335
500
    """Error in processing weave: %(message)s"""
 
501
 
336
502
    def __init__(self, message=None):
337
503
        BzrNewError.__init__(self)
338
504
        self.message = message
341
507
class WeaveRevisionAlreadyPresent(WeaveError):
342
508
    """Revision {%(revision_id)s} already present in %(weave)s"""
343
509
    def __init__(self, revision_id, weave):
 
510
 
344
511
        WeaveError.__init__(self)
345
512
        self.revision_id = revision_id
346
513
        self.weave = weave
348
515
 
349
516
class WeaveRevisionNotPresent(WeaveError):
350
517
    """Revision {%(revision_id)s} not present in %(weave)s"""
 
518
 
351
519
    def __init__(self, revision_id, weave):
352
520
        WeaveError.__init__(self)
353
521
        self.revision_id = revision_id
356
524
 
357
525
class WeaveFormatError(WeaveError):
358
526
    """Weave invariant violated: %(what)s"""
 
527
 
359
528
    def __init__(self, what):
360
529
        WeaveError.__init__(self)
361
530
        self.what = what
365
534
    """Parents are mismatched between two revisions."""
366
535
    
367
536
 
 
537
class WeaveInvalidChecksum(WeaveError):
 
538
    """Text did not match it's checksum: %(message)s"""
 
539
 
 
540
 
 
541
class WeaveTextDiffers(WeaveError):
 
542
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
543
 
 
544
    def __init__(self, revision_id, weave_a, weave_b):
 
545
        WeaveError.__init__(self)
 
546
        self.revision_id = revision_id
 
547
        self.weave_a = weave_a
 
548
        self.weave_b = weave_b
 
549
 
 
550
 
 
551
class WeaveTextDiffers(WeaveError):
 
552
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
553
 
 
554
    def __init__(self, revision_id, weave_a, weave_b):
 
555
        WeaveError.__init__(self)
 
556
        self.revision_id = revision_id
 
557
        self.weave_a = weave_a
 
558
        self.weave_b = weave_b
 
559
 
 
560
 
 
561
class VersionedFileError(BzrNewError):
 
562
    """Versioned file error."""
 
563
 
 
564
 
 
565
class RevisionNotPresent(VersionedFileError):
 
566
    """Revision {%(revision_id)s} not present in %(file_id)s."""
 
567
 
 
568
    def __init__(self, revision_id, file_id):
 
569
        VersionedFileError.__init__(self)
 
570
        self.revision_id = revision_id
 
571
        self.file_id = file_id
 
572
 
 
573
 
 
574
class RevisionAlreadyPresent(VersionedFileError):
 
575
    """Revision {%(revision_id)s} already present in %(file_id)s."""
 
576
 
 
577
    def __init__(self, revision_id, file_id):
 
578
        VersionedFileError.__init__(self)
 
579
        self.revision_id = revision_id
 
580
        self.file_id = file_id
 
581
 
 
582
 
 
583
class KnitError(BzrNewError):
 
584
    """Knit error"""
 
585
 
 
586
 
 
587
class KnitHeaderError(KnitError):
 
588
    """Knit header error: %(badline)r unexpected"""
 
589
 
 
590
    def __init__(self, badline):
 
591
        KnitError.__init__(self)
 
592
        self.badline = badline
 
593
 
 
594
 
 
595
class KnitCorrupt(KnitError):
 
596
    """Knit %(filename)s corrupt: %(how)s"""
 
597
 
 
598
    def __init__(self, filename, how):
 
599
        KnitError.__init__(self)
 
600
        self.filename = filename
 
601
        self.how = how
 
602
 
 
603
 
368
604
class NoSuchExportFormat(BzrNewError):
369
605
    """Export format %(format)r not supported"""
370
606
    def __init__(self, format):
383
619
        self.msg = msg
384
620
        self.orig_error = orig_error
385
621
 
 
622
 
386
623
# A set of semi-meaningful errors which can be thrown
387
624
class TransportNotPossible(TransportError):
388
625
    """This is for transports where a specific function is explicitly not
404
641
    """The connection has been closed."""
405
642
    pass
406
643
 
 
644
 
407
645
class ConflictsInTree(BzrError):
408
646
    def __init__(self):
409
647
        BzrError.__init__(self, "Working tree has conflicts.")
410
648
 
 
649
 
411
650
class ParseConfigError(BzrError):
412
651
    def __init__(self, errors, filename):
413
652
        if filename is None:
416
655
            (filename, ('\n'.join(e.message for e in errors)))
417
656
        BzrError.__init__(self, message)
418
657
 
 
658
 
419
659
class SigningFailed(BzrError):
420
660
    def __init__(self, command_line):
421
661
        BzrError.__init__(self, "Failed to gpg sign data with command '%s'"
422
662
                               % command_line)
423
663
 
 
664
 
424
665
class WorkingTreeNotRevision(BzrError):
425
666
    def __init__(self, tree):
426
667
        BzrError.__init__(self, "The working tree for %s has changed since"
427
668
                          " last commit, but weave merge requires that it be"
428
669
                          " unchanged." % tree.basedir)
429
670
 
 
671
 
430
672
class CantReprocessAndShowBase(BzrNewError):
431
673
    """Can't reprocess and show base.
432
674
Reprocessing obscures relationship of conflicting lines to base."""
433
675
 
 
676
 
434
677
class GraphCycleError(BzrNewError):
435
678
    """Cycle in graph %(graph)r"""
436
679
    def __init__(self, graph):
437
680
        BzrNewError.__init__(self)
438
681
        self.graph = graph
439
682
 
 
683
 
440
684
class NotConflicted(BzrNewError):
441
685
    """File %(filename)s is not conflicted."""
 
686
 
442
687
    def __init__(self, filename):
443
688
        BzrNewError.__init__(self)
444
689
        self.filename = filename
445
690
 
 
691
 
446
692
class MustUseDecorated(Exception):
447
693
    """A decorating function has requested its original command be used.
448
694
    
449
695
    This should never escape bzr, so does not need to be printable.
450
696
    """
451
697
 
 
698
 
452
699
class MissingText(BzrNewError):
453
700
    """Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"""
 
701
 
454
702
    def __init__(self, branch, text_revision, file_id):
 
703
        BzrNewError.__init__(self)
455
704
        self.branch = branch
456
705
        self.base = branch.base
457
706
        self.text_revision = text_revision
458
707
        self.file_id = file_id
 
708
 
 
709
 
 
710
class DuplicateKey(BzrNewError):
 
711
    """Key %(key)s is already present in map"""
 
712
 
 
713
 
 
714
class MalformedTransform(BzrNewError):
 
715
    """Tree transform is malformed %(conflicts)r"""
 
716
 
 
717
 
 
718
class BzrBadParameter(BzrNewError):
 
719
    """A bad parameter : %(param)s is not usable.
 
720
    
 
721
    This exception should never be thrown, but it is a base class for all
 
722
    parameter-to-function errors.
 
723
    """
 
724
    def __init__(self, param):
 
725
        BzrNewError.__init__(self)
 
726
        self.param = param
 
727
 
 
728
 
 
729
class BzrBadParameterNotUnicode(BzrBadParameter):
 
730
    """Parameter %(param)s is neither unicode nor utf8."""
 
731
 
 
732
 
 
733
class ReusingTransform(BzrNewError):
 
734
    """Attempt to reuse a transform that has already been applied."""
 
735
 
 
736
 
 
737
class CantMoveRoot(BzrNewError):
 
738
    """Moving the root directory is not supported at this time"""
 
739
 
 
740
 
 
741
class BzrBadParameterNotString(BzrBadParameter):
 
742
    """Parameter %(param)s is not a string or unicode string."""
 
743
 
 
744
 
 
745
class BzrBadParameterMissing(BzrBadParameter):
 
746
    """Parameter $(param)s is required but not present."""
 
747
 
 
748
 
 
749
class DependencyNotPresent(BzrNewError):
 
750
    """Unable to import library "%(library)s": %(error)s"""
 
751
 
 
752
    def __init__(self, library, error):
 
753
        BzrNewError.__init__(self, library=library, error=error)
 
754
 
 
755
 
 
756
class ParamikoNotPresent(DependencyNotPresent):
 
757
    """Unable to import paramiko (required for sftp support): %(error)s"""
 
758
 
 
759
    def __init__(self, error):
 
760
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
761
 
 
762
 
 
763
class UninitializableFormat(BzrNewError):
 
764
    """Format %(format)s cannot be initialised by this version of bzr."""
 
765
 
 
766
    def __init__(self, format):
 
767
        BzrNewError.__init__(self)
 
768
        self.format = format
 
769
 
 
770
 
 
771
class NoDiff3(BzrNewError):
 
772
    """Diff3 is not installed on this machine."""
 
773
 
 
774
 
 
775
class ExistingLimbo(BzrNewError):
 
776
    """This tree contains left-over files from a failed operation.
 
777
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
778
    keep, and delete it when you are done.
 
779
    """
 
780
    def __init__(self, limbo_dir):
 
781
       BzrNewError.__init__(self)
 
782
       self.limbo_dir = limbo_dir
 
783
 
 
784
 
 
785
class ImmortalLimbo(BzrNewError):
 
786
    """Unable to delete transform temporary directory $(limbo_dir)s.
 
787
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
788
    keep, and delete it when you are done.
 
789
    """
 
790
    def __init__(self, limbo_dir):
 
791
       BzrNewError.__init__(self)
 
792
       self.limbo_dir = limbo_dir
 
793
 
 
794
 
 
795
class OutOfDateTree(BzrNewError):
 
796
    """Working tree is out of date, please run 'bzr update'."""
 
797
 
 
798
    def __init__(self, tree):
 
799
        BzrNewError.__init__(self)
 
800
        self.tree = tree
 
801
 
 
802
 
 
803
class MergeModifiedFormatError(BzrNewError):
 
804
    """Error in merge modified format"""
 
805
 
 
806
 
 
807
class CorruptRepository(BzrNewError):
 
808
    """An error has been detected in the repository %(repo_path)s.
 
809
Please run bzr reconcile on this repository."""
 
810
 
 
811
    def __init__(self, repo):
 
812
        BzrNewError.__init__(self)
 
813
        self.repo_path = repo.bzrdir.root_transport.base
 
814
 
 
815
 
 
816
class UpgradeRequired(BzrNewError):
 
817
    """To use this feature you must upgrade your branch at %(path)s."""
 
818
 
 
819
    def __init__(self, path):
 
820
        BzrNewError.__init__(self)
 
821
        self.path = path
 
822
 
 
823
 
 
824
class LocalRequiresBoundBranch(BzrNewError):
 
825
    """Cannot perform local-only commits on unbound branches."""
 
826
 
 
827
 
 
828
class MissingProgressBarFinish(BzrNewError):
 
829
    """A nested progress bar was not 'finished' correctly."""