|
|
@ -1,76 +1,85 @@ |
|
|
|
from os import environ, path |
|
|
|
import sys |
|
|
|
import logging |
|
|
|
import os |
|
|
|
import re |
|
|
|
import sys |
|
|
|
from datetime import datetime |
|
|
|
from shutil import move |
|
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger('default') |
|
|
|
|
|
|
|
# When using py2exe or py2app, the variable frozen is added to the sys |
|
|
|
# namespace. This can be used to setup a different code path for |
|
|
|
# namespace. This can be used to setup a different code path for |
|
|
|
# binary distributions vs source distributions. |
|
|
|
frozen = getattr(sys,'frozen', None) |
|
|
|
frozen = getattr(sys, 'frozen', None) |
|
|
|
|
|
|
|
|
|
|
|
def lookupExeFolder(): |
|
|
|
"""Returns executable folder path""" |
|
|
|
if frozen: |
|
|
|
if frozen == "macosx_app": |
|
|
|
exeFolder = ( |
|
|
|
# targetdir/Bitmessage.app/Contents/MacOS/Bitmessage |
|
|
|
exeFolder = path.dirname(path.dirname(path.dirname(path.dirname(sys.executable)))) + path.sep |
|
|
|
else: |
|
|
|
exeFolder = path.dirname(sys.executable) + path.sep |
|
|
|
os.path.dirname(sys.executable).split(os.path.sep)[0] + os.path.sep |
|
|
|
if frozen == "macosx_app" else |
|
|
|
os.path.dirname(sys.executable) + os.path.sep) |
|
|
|
elif __file__: |
|
|
|
exeFolder = path.dirname(__file__) + path.sep |
|
|
|
exeFolder = os.path.dirname(__file__) + os.path.sep |
|
|
|
else: |
|
|
|
exeFolder = '' |
|
|
|
return exeFolder |
|
|
|
|
|
|
|
|
|
|
|
def lookupAppdataFolder(): |
|
|
|
"""Returns path of the folder where application data is stored""" |
|
|
|
APPNAME = "PyBitmessage" |
|
|
|
if "BITMESSAGE_HOME" in environ: |
|
|
|
dataFolder = environ["BITMESSAGE_HOME"] |
|
|
|
if dataFolder[-1] not in [path.sep, path.altsep]: |
|
|
|
dataFolder += path.sep |
|
|
|
dataFolder = os.environ.get('BITMESSAGE_HOME') |
|
|
|
if dataFolder: |
|
|
|
if dataFolder[-1] not in (os.path.sep, os.path.altsep): |
|
|
|
dataFolder += os.path.sep |
|
|
|
elif sys.platform == 'darwin': |
|
|
|
if "HOME" in environ: |
|
|
|
dataFolder = path.join(environ["HOME"], "Library/Application Support/", APPNAME) + '/' |
|
|
|
else: |
|
|
|
stringToLog = 'Could not find home folder, please report this message and your OS X version to the BitMessage Github.' |
|
|
|
if 'logger' in globals(): |
|
|
|
logger.critical(stringToLog) |
|
|
|
else: |
|
|
|
print stringToLog |
|
|
|
sys.exit() |
|
|
|
|
|
|
|
try: |
|
|
|
dataFolder = os.path.join( |
|
|
|
os.environ['HOME'], |
|
|
|
'Library/Application Support/', APPNAME |
|
|
|
) + '/' # FIXME: should also be os.path.sep |
|
|
|
except KeyError: |
|
|
|
sys.exit( |
|
|
|
'Could not find home folder, please report this message' |
|
|
|
' and your OS X version to the BitMessage Github.') |
|
|
|
elif 'win32' in sys.platform or 'win64' in sys.platform: |
|
|
|
dataFolder = path.join(environ['APPDATA'].decode(sys.getfilesystemencoding(), 'ignore'), APPNAME) + path.sep |
|
|
|
dataFolder = os.path.join( |
|
|
|
os.environ['APPDATA'].decode( |
|
|
|
sys.getfilesystemencoding(), 'ignore'), APPNAME |
|
|
|
) + os.path.sep |
|
|
|
else: |
|
|
|
from shutil import move |
|
|
|
try: |
|
|
|
dataFolder = path.join(environ["XDG_CONFIG_HOME"], APPNAME) |
|
|
|
dataFolder = os.path.join(os.environ['XDG_CONFIG_HOME'], APPNAME) |
|
|
|
except KeyError: |
|
|
|
dataFolder = path.join(environ["HOME"], ".config", APPNAME) |
|
|
|
dataFolder = os.path.join(os.environ['HOME'], '.config', APPNAME) |
|
|
|
|
|
|
|
# Migrate existing data to the proper location if this is an existing install |
|
|
|
# Migrate existing data to the proper location |
|
|
|
# if this is an existing install |
|
|
|
try: |
|
|
|
move(path.join(environ["HOME"], ".%s" % APPNAME), dataFolder) |
|
|
|
stringToLog = "Moving data folder to %s" % (dataFolder) |
|
|
|
if 'logger' in globals(): |
|
|
|
logger.info(stringToLog) |
|
|
|
else: |
|
|
|
print stringToLog |
|
|
|
move(os.path.join(os.environ['HOME'], '.%s' % APPNAME), dataFolder) |
|
|
|
logger.info('Moving data folder to %s', dataFolder) |
|
|
|
except IOError: |
|
|
|
# Old directory may not exist. |
|
|
|
pass |
|
|
|
dataFolder = dataFolder + '/' |
|
|
|
dataFolder = dataFolder + os.path.sep |
|
|
|
return dataFolder |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def codePath(): |
|
|
|
if frozen == "macosx_app": |
|
|
|
codePath = environ.get("RESOURCEPATH") |
|
|
|
elif frozen: # windows |
|
|
|
codePath = sys._MEIPASS |
|
|
|
else: |
|
|
|
codePath = path.dirname(__file__) |
|
|
|
return codePath |
|
|
|
"""Returns path to the program sources""" |
|
|
|
if not frozen: |
|
|
|
return os.path.dirname(__file__) |
|
|
|
return ( |
|
|
|
os.environ.get('RESOURCEPATH') |
|
|
|
if frozen == "macosx_app" else sys._MEIPASS) |
|
|
|
|
|
|
|
|
|
|
|
def tail(f, lines=20): |
|
|
|
"""Returns last lines in the f file object""" |
|
|
|
total_lines_wanted = lines |
|
|
|
|
|
|
|
BLOCK_SIZE = 1024 |
|
|
@ -78,16 +87,17 @@ def tail(f, lines=20): |
|
|
|
block_end_byte = f.tell() |
|
|
|
lines_to_go = total_lines_wanted |
|
|
|
block_number = -1 |
|
|
|
blocks = [] # blocks of size BLOCK_SIZE, in reverse order starting |
|
|
|
# from the end of the file |
|
|
|
# blocks of size BLOCK_SIZE, in reverse order starting |
|
|
|
# from the end of the file |
|
|
|
blocks = [] |
|
|
|
while lines_to_go > 0 and block_end_byte > 0: |
|
|
|
if (block_end_byte - BLOCK_SIZE > 0): |
|
|
|
# read the last block we haven't yet read |
|
|
|
f.seek(block_number*BLOCK_SIZE, 2) |
|
|
|
f.seek(block_number * BLOCK_SIZE, 2) |
|
|
|
blocks.append(f.read(BLOCK_SIZE)) |
|
|
|
else: |
|
|
|
# file too small, start from begining |
|
|
|
f.seek(0,0) |
|
|
|
f.seek(0, 0) |
|
|
|
# only read what was not read |
|
|
|
blocks.append(f.read(block_end_byte)) |
|
|
|
lines_found = blocks[-1].count('\n') |
|
|
@ -99,9 +109,12 @@ def tail(f, lines=20): |
|
|
|
|
|
|
|
|
|
|
|
def lastCommit(): |
|
|
|
githeadfile = path.join(codePath(), '..', '.git', 'logs', 'HEAD') |
|
|
|
""" |
|
|
|
Returns last commit information as dict with 'commit' and 'time' keys |
|
|
|
""" |
|
|
|
githeadfile = os.path.join(codePath(), '..', '.git', 'logs', 'HEAD') |
|
|
|
result = {} |
|
|
|
if path.isfile(githeadfile): |
|
|
|
if os.path.isfile(githeadfile): |
|
|
|
try: |
|
|
|
with open(githeadfile, 'rt') as githead: |
|
|
|
line = tail(githead, 1) |
|
|
|