@@ -6,6 +6,7 @@ v0.3.1 (unreleased): | |||||
- Cleaned up the bookmark file format, fixing a related Windows bug. The script | - Cleaned up the bookmark file format, fixing a related Windows bug. The script | ||||
will automatically migrate to the new one. | will automatically migrate to the new one. | ||||
- Fixed a bug related to Python 3 compatibility. | - Fixed a bug related to Python 3 compatibility. | ||||
- Fixed unicode support. | |||||
v0.3 (released June 7, 2015): | v0.3 (released June 7, 2015): | ||||
@@ -31,19 +31,21 @@ def _load_config_file(config_path=None): | |||||
cfg_path = config_path or get_default_config_path() | cfg_path = config_path or get_default_config_path() | ||||
try: | try: | ||||
with open(cfg_path, "r") as config_file: | |||||
return config_file.read().split("\n") | |||||
with open(cfg_path, "rb") as config_file: | |||||
paths = config_file.read().split(b"\n") | |||||
return [path.decode("utf8") for path in paths] | |||||
except IOError: | except IOError: | ||||
return [] | return [] | ||||
def _save_config_file(config, config_path=None): | |||||
"""Save config changes to the given config file.""" | |||||
def _save_config_file(bookmarks, config_path=None): | |||||
"""Save the bookmarks list to the given config file.""" | |||||
run_migrations() | run_migrations() | ||||
cfg_path = config_path or get_default_config_path() | cfg_path = config_path or get_default_config_path() | ||||
_ensure_dirs(cfg_path) | _ensure_dirs(cfg_path) | ||||
with open(cfg_path, "w") as config_file: | |||||
config_file.write("\n".join(config)) | |||||
dump = b"\n".join(path.encode("utf8") for path in bookmarks) | |||||
with open(cfg_path, "wb") as config_file: | |||||
config_file.write(dump) | |||||
def get_default_config_path(): | def get_default_config_path(): | ||||
"""Return the default path to the configuration file.""" | """Return the default path to the configuration file.""" | ||||
@@ -3,8 +3,6 @@ | |||||
# Copyright (C) 2011-2016 Ben Kurtovic <ben.kurtovic@gmail.com> | # Copyright (C) 2011-2016 Ben Kurtovic <ben.kurtovic@gmail.com> | ||||
# Released under the terms of the MIT License. See LICENSE for details. | # Released under the terms of the MIT License. See LICENSE for details. | ||||
__all__ = ["run_migrations"] | |||||
import os | import os | ||||
try: | try: | ||||
@@ -14,6 +12,8 @@ except ImportError: # Python 2 | |||||
from ConfigParser import SafeConfigParser as ConfigParser, NoSectionError | from ConfigParser import SafeConfigParser as ConfigParser, NoSectionError | ||||
PY3K = False | PY3K = False | ||||
__all__ = ["run_migrations"] | |||||
def _get_old_path(): | def _get_old_path(): | ||||
"""Return the old default path to the configuration file.""" | """Return the old default path to the configuration file.""" | ||||
xdg_cfg = os.environ.get("XDG_CONFIG_HOME") or os.path.join("~", ".config") | xdg_cfg = os.environ.get("XDG_CONFIG_HOME") or os.path.join("~", ".config") | ||||
@@ -45,12 +45,14 @@ def _migrate_old_format(): | |||||
bookmarks = [path for path, _ in config.items("bookmarks")] | bookmarks = [path for path, _ in config.items("bookmarks")] | ||||
except NoSectionError: | except NoSectionError: | ||||
bookmarks = [] | bookmarks = [] | ||||
if PY3K: | |||||
bookmarks = [path.encode("utf8") for path in bookmarks] | |||||
new_path = os.path.join(os.path.split(old_path)[0], "bookmarks") | new_path = os.path.join(os.path.split(old_path)[0], "bookmarks") | ||||
os.rename(old_path, new_path) | os.rename(old_path, new_path) | ||||
with open(new_path, "wb") as handle: | with open(new_path, "wb") as handle: | ||||
handle.write("\n".join(bookmarks)) | |||||
handle.write(b"\n".join(bookmarks)) | |||||
def run_migrations(): | def run_migrations(): | ||||
"""Run any necessary migrations to ensure the config file is up-to-date.""" | """Run any necessary migrations to ensure the config file is up-to-date.""" | ||||
@@ -7,6 +7,7 @@ from __future__ import print_function | |||||
import argparse | import argparse | ||||
import os | import os | ||||
import sys | |||||
from colorama import init as color_init, Fore, Style | from colorama import init as color_init, Fore, Style | ||||
@@ -15,6 +16,12 @@ from .config import (get_default_config_path, get_bookmarks, add_bookmarks, | |||||
delete_bookmarks, list_bookmarks) | delete_bookmarks, list_bookmarks) | ||||
from .update import update_bookmarks, update_directories | from .update import update_bookmarks, update_directories | ||||
def _decode(path): | |||||
"""Decode the given string using the system's filesystem encoding.""" | |||||
if sys.version_info.major > 2: | |||||
return path | |||||
return path.decode(sys.getfilesystemencoding()) | |||||
def main(): | def main(): | ||||
"""Parse arguments and then call the appropriate function(s).""" | """Parse arguments and then call the appropriate function(s).""" | ||||
parser = argparse.ArgumentParser( | parser = argparse.ArgumentParser( | ||||
@@ -30,7 +37,7 @@ def main(): | |||||
group_m = parser.add_argument_group("miscellaneous") | group_m = parser.add_argument_group("miscellaneous") | ||||
group_u.add_argument( | group_u.add_argument( | ||||
'directories_to_update', nargs="*", metavar="path", | |||||
'directories_to_update', nargs="*", metavar="path", type=_decode, | |||||
help="""update all repositories in this directory (or the directory | help="""update all repositories in this directory (or the directory | ||||
itself, if it is a repo)""") | itself, if it is a repo)""") | ||||
group_u.add_argument( | group_u.add_argument( | ||||
@@ -48,15 +55,16 @@ def main(): | |||||
group_b.add_argument( | group_b.add_argument( | ||||
'-a', '--add', dest="bookmarks_to_add", nargs="+", metavar="path", | '-a', '--add', dest="bookmarks_to_add", nargs="+", metavar="path", | ||||
help="add directory(s) as bookmarks") | |||||
type=_decode, help="add directory(s) as bookmarks") | |||||
group_b.add_argument( | group_b.add_argument( | ||||
'-d', '--delete', dest="bookmarks_to_del", nargs="+", metavar="path", | '-d', '--delete', dest="bookmarks_to_del", nargs="+", metavar="path", | ||||
type=_decode, | |||||
help="delete bookmark(s) (leaves actual directories alone)") | help="delete bookmark(s) (leaves actual directories alone)") | ||||
group_b.add_argument( | group_b.add_argument( | ||||
'-l', '--list', dest="list_bookmarks", action="store_true", | '-l', '--list', dest="list_bookmarks", action="store_true", | ||||
help="list current bookmarks") | help="list current bookmarks") | ||||
group_b.add_argument( | group_b.add_argument( | ||||
'-b', '--bookmark-file', nargs="?", metavar="path", | |||||
'-b', '--bookmark-file', nargs="?", metavar="path", type=_decode, | |||||
help="use a specific bookmark config file (default: {0})".format( | help="use a specific bookmark config file (default: {0})".format( | ||||
get_default_config_path())) | get_default_config_path())) | ||||