diff --git a/CHANGELOG b/CHANGELOG index 83b63ea..1f3d49b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,6 +6,7 @@ v0.3.1 (unreleased): - Cleaned up the bookmark file format, fixing a related Windows bug. The script will automatically migrate to the new one. - Fixed a bug related to Python 3 compatibility. +- Fixed unicode support. v0.3 (released June 7, 2015): diff --git a/gitup/config.py b/gitup/config.py index 6b5fbab..68b6c81 100644 --- a/gitup/config.py +++ b/gitup/config.py @@ -31,19 +31,21 @@ def _load_config_file(config_path=None): cfg_path = config_path or get_default_config_path() 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: 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() cfg_path = config_path or get_default_config_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(): """Return the default path to the configuration file.""" diff --git a/gitup/migrate.py b/gitup/migrate.py index 388cac5..2de21f8 100644 --- a/gitup/migrate.py +++ b/gitup/migrate.py @@ -3,8 +3,6 @@ # Copyright (C) 2011-2016 Ben Kurtovic # Released under the terms of the MIT License. See LICENSE for details. -__all__ = ["run_migrations"] - import os try: @@ -14,6 +12,8 @@ except ImportError: # Python 2 from ConfigParser import SafeConfigParser as ConfigParser, NoSectionError PY3K = False +__all__ = ["run_migrations"] + def _get_old_path(): """Return the old default path to the configuration file.""" 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")] except NoSectionError: bookmarks = [] + if PY3K: + bookmarks = [path.encode("utf8") for path in bookmarks] new_path = os.path.join(os.path.split(old_path)[0], "bookmarks") os.rename(old_path, new_path) with open(new_path, "wb") as handle: - handle.write("\n".join(bookmarks)) + handle.write(b"\n".join(bookmarks)) def run_migrations(): """Run any necessary migrations to ensure the config file is up-to-date.""" diff --git a/gitup/script.py b/gitup/script.py index df3e12e..77740ea 100644 --- a/gitup/script.py +++ b/gitup/script.py @@ -7,6 +7,7 @@ from __future__ import print_function import argparse import os +import sys 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) 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(): """Parse arguments and then call the appropriate function(s).""" parser = argparse.ArgumentParser( @@ -30,7 +37,7 @@ def main(): group_m = parser.add_argument_group("miscellaneous") 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 itself, if it is a repo)""") group_u.add_argument( @@ -48,15 +55,16 @@ def main(): group_b.add_argument( '-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( '-d', '--delete', dest="bookmarks_to_del", nargs="+", metavar="path", + type=_decode, help="delete bookmark(s) (leaves actual directories alone)") group_b.add_argument( '-l', '--list', dest="list_bookmarks", action="store_true", help="list current bookmarks") 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( get_default_config_path()))