ui: look before you leap on sys.stderr.closed (and look nicer)
f83291e5643e introduced a fix if sys.stdout.closed does not exist.
This change uses a getattr with default instead of hasattr (which just calls
getattr) and accessing the attribute.
Additionally it applies the same fix for sys.stderr.closed as this is not
available in the bpython shell (reported by Roger Gammans).
@ 5: F
|
| o 4: E
|/|
o | 3: D
| |
| o 2: C
|/
| o 1: B
|/
o 0: A
% Rebasing
% B onto F - simple rebase
saving bundle to
adding branch
adding changesets
adding manifests
adding file changes
added 5 changesets with 4 changes to 4 files (+1 heads)
rebase completed
@ 5: B
|
o 4: F
|
| o 3: E
|/|
o | 2: D
| |
| o 1: C
|/
o 0: A
% B onto D - intermediate point
saving bundle to
adding branch
adding changesets
adding manifests
adding file changes
added 5 changesets with 4 changes to 4 files (+2 heads)
rebase completed
@ 5: B
|
| o 4: F
|/
| o 3: E
|/|
o | 2: D
| |
| o 1: C
|/
o 0: A
% C onto F - skip of E
saving bundle to
adding branch
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 3 files (+1 heads)
rebase completed
@ 4: C
|
o 3: F
|
o 2: D
|
| o 1: B
|/
o 0: A
% D onto C - rebase of a branching point (skip E)
saving bundle to
adding branch
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 2 files
rebase completed
@ 4: F
|
o 3: D
|
o 2: C
|
| o 1: B
|/
o 0: A
% E onto F - merged revision having a parent in ancestors of target
saving bundle to
adding branch
adding changesets
adding manifests
adding file changes
added 2 changesets with 1 changes to 1 files (-1 heads)
rebase completed
@ 5: E
|\
| o 4: F
| |
| o 3: D
| |
o | 2: C
|/
| o 1: B
|/
o 0: A
% D onto B - E maintains C as parent
saving bundle to
adding branch
adding changesets
adding manifests
adding file changes
added 3 changesets with 2 changes to 2 files
rebase completed
@ 5: F
|
| o 4: E
|/|
o | 3: D
| |
| o 2: C
| |
o | 1: B
|/
o 0: A
% These will fail (using --source)
% E onto D - rebase onto an ancestor
abort: source is descendant of destination
% D onto E - rebase onto a descendant
abort: source is ancestor of destination
% E onto B - merge revision with both parents not in ancestors of target
abort: cannot use revision 4 as base, result would have 3 parents
% These will abort gracefully (using --base)
% E onto E - rebase onto same changeset
nothing to rebase
% E onto D - rebase onto an ancestor
nothing to rebase
% D onto E - rebase onto a descendant
nothing to rebase