235
236
# source and target may be aliases of each other (e.g. on a
236
237
# case-insensitive filesystem), so we may have accidentally renamed
237
238
# source by when we tried to rename target
238
if not (file_existed and e.errno in (None, errno.ENOENT)):
239
failure_exc = sys.exc_info()
240
if (file_existed and e.errno in (None, errno.ENOENT)
241
and old.lower() == new.lower()):
242
# source and target are the same file on a case-insensitive
243
# filesystem, so we don't generate an exception
242
247
# If the file used to exist, rename it back into place
245
250
unlink_func(tmp_name)
247
252
rename_func(tmp_name, new)
253
if failure_exc is not None:
254
raise failure_exc[0], failure_exc[1], failure_exc[2]
250
257
# In Python 2.4.2 and older, os.path.abspath and os.path.realpath
688
695
return offset.days * 86400 + offset.seconds
690
697
weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
698
_default_format_by_weekday_num = [wd + " %Y-%m-%d %H:%M:%S" for wd in weekdays]
692
701
def format_date(t, offset=0, timezone='original', date_fmt=None,
693
702
show_offset=True):
707
716
date_str = time.strftime(date_fmt, tt)
708
717
return date_str + offset_str
720
# Cache of formatted offset strings
724
def format_date_with_offset_in_original_timezone(t, offset=0,
725
_cache=_offset_cache):
726
"""Return a formatted date string in the original timezone.
728
This routine may be faster then format_date.
730
:param t: Seconds since the epoch.
731
:param offset: Timezone offset in seconds east of utc.
735
tt = time.gmtime(t + offset)
736
date_fmt = _default_format_by_weekday_num[tt[6]]
737
date_str = time.strftime(date_fmt, tt)
738
offset_str = _cache.get(offset, None)
739
if offset_str is None:
740
offset_str = ' %+03d%02d' % (offset / 3600, (offset / 60) % 60)
741
_cache[offset] = offset_str
742
return date_str + offset_str
710
745
def format_local_date(t, offset=0, timezone='original', date_fmt=None,
711
746
show_offset=True):
712
747
"""Return an unicode date string formatted according to the current locale.
726
761
date_str = date_str.decode(get_user_encoding(), 'replace')
727
762
return date_str + offset_str
729
765
def _format_date(t, offset, timezone, date_fmt, show_offset):
730
766
if timezone == 'utc':
731
767
tt = time.gmtime(t)
1294
1330
normalized_filename = _inaccessible_normalized_filename
1333
default_terminal_width = 80
1334
"""The default terminal width for ttys.
1336
This is defined so that higher levels can share a common fallback value when
1337
terminal_width() returns None.
1297
1341
def terminal_width():
1298
"""Return estimated terminal width."""
1342
"""Return terminal width.
1344
None is returned if the width can't established precisely.
1347
# If BZR_COLUMNS is set, take it, user is always right
1349
return int(os.environ['BZR_COLUMNS'])
1350
except (KeyError, ValueError):
1353
isatty = getattr(sys.stdout, 'isatty', None)
1354
if isatty is None or not isatty():
1355
# Don't guess, setting BZR_COLUMNS is the recommended way to override.
1299
1358
if sys.platform == 'win32':
1300
return win32utils.get_console_size()[0]
1359
return win32utils.get_console_size(defaultx=None)[0]
1303
1362
import struct, fcntl, termios
1304
1363
s = struct.pack('HHHH', 0, 0, 0, 0)
1305
1364
x = fcntl.ioctl(1, termios.TIOCGWINSZ, s)
1306
1365
width = struct.unpack('HHHH', x)[1]
1366
except (IOError, AttributeError):
1367
# If COLUMNS is set, take it
1311
width = int(os.environ['COLUMNS'])
1369
return int(os.environ['COLUMNS'])
1370
except (KeyError, ValueError):
1374
# Consider invalid values as meaning no width
1945
2005
anything goes wrong.
1947
2007
global _cached_local_concurrency
1948
2009
if _cached_local_concurrency is not None and use_cache:
1949
2010
return _cached_local_concurrency
1952
concurrency = _local_concurrency()
1953
except (OSError, IOError):
2012
concurrency = os.environ.get('BZR_CONCURRENCY', None)
2013
if concurrency is None:
2015
concurrency = _local_concurrency()
2016
except (OSError, IOError):
1956
2019
concurrency = int(concurrency)
1957
2020
except (TypeError, ValueError):