diff --git a/CHANGELOG b/CHANGELOG index 10cfe52..c8b8186 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ v0.3.1 (unreleased): - Added a `--prune` flag to delete remote-tracking branches that no longer exist on their remote after fetching. +- Added a '--bookmark-file' option to support multiple bookmark config files. - Fixed a bug related to Python 3 compatibility. v0.3 (released June 7, 2015): diff --git a/gitup/config.py b/gitup/config.py index 007a42d..053c9ff 100644 --- a/gitup/config.py +++ b/gitup/config.py @@ -14,8 +14,8 @@ except ImportError: # Python 2 from colorama import Fore, Style -__all__ = ["get_bookmarks", "add_bookmarks", "delete_bookmarks", - "list_bookmarks"] +__all__ = ["get_default_config_path", "get_bookmarks", "add_bookmarks", + "delete_bookmarks", "list_bookmarks"] YELLOW = Fore.YELLOW + Style.BRIGHT RED = Fore.RED + Style.BRIGHT @@ -25,50 +25,50 @@ INDENT1 = " " * 3 def _ensure_dirs(path): """Ensure the directories within the given pathname exist.""" dirname = os.path.dirname(path) - if not os.path.exists(dirname): # Race condition, meh... + if dirname and not os.path.exists(dirname): # Race condition, meh... os.makedirs(dirname) -def _get_config_path(): - """Return the path to the configuration file.""" - xdg_cfg = os.environ.get("XDG_CONFIG_HOME") or os.path.join("~", ".config") - return os.path.join(os.path.expanduser(xdg_cfg), "gitup", "config.ini") - def _migrate_old_config_path(): """Migrate the old config location (~/.gitup) to the new one.""" old_path = os.path.expanduser(os.path.join("~", ".gitup")) if os.path.exists(old_path): - new_path = _get_config_path() + new_path = get_default_config_path() _ensure_dirs(new_path) os.rename(old_path, new_path) -def _load_config_file(): +def _load_config_file(config_path=None): """Read the config file and return a SafeConfigParser() object.""" _migrate_old_config_path() config = configparser.SafeConfigParser() # Don't lowercase option names, because we are storing paths there: config.optionxform = lambda opt: opt - config.read(_get_config_path()) + config.read(config_path or get_default_config_path()) return config -def _save_config_file(config): - """Save config changes to the config file returned by _get_config_path.""" +def _save_config_file(config, config_path=None): + """Save config changes to the given config file.""" _migrate_old_config_path() - cfg_path = _get_config_path() + cfg_path = config_path or get_default_config_path() _ensure_dirs(cfg_path) with open(cfg_path, "w") as config_file: config.write(config_file) -def get_bookmarks(): +def get_default_config_path(): + """Return the default path to the configuration file.""" + xdg_cfg = os.environ.get("XDG_CONFIG_HOME") or os.path.join("~", ".config") + return os.path.join(os.path.expanduser(xdg_cfg), "gitup", "config.ini") + +def get_bookmarks(config_path=None): """Get a list of all bookmarks, or an empty list if there are none.""" - config = _load_config_file() + config = _load_config_file(config_path) try: return [path for path, _ in config.items("bookmarks")] except configparser.NoSectionError: return [] -def add_bookmarks(paths): +def add_bookmarks(paths, config_path=None): """Add a list of paths as bookmarks to the config file.""" - config = _load_config_file() + config = _load_config_file(config_path) if not config.has_section("bookmarks"): config.add_section("bookmarks") @@ -81,7 +81,7 @@ def add_bookmarks(paths): path_name = os.path.split(path)[1] config.set("bookmarks", path, path_name) added.append(path) - _save_config_file(config) + _save_config_file(config, config_path) if added: print(YELLOW + "Added bookmarks:") @@ -92,9 +92,9 @@ def add_bookmarks(paths): for path in exists: print(INDENT1, path) -def delete_bookmarks(paths): +def delete_bookmarks(paths, config_path=None): """Remove a list of paths from the bookmark config file.""" - config = _load_config_file() + config = _load_config_file(config_path) deleted, notmarked = [], [] if config.has_section("bookmarks"): @@ -105,7 +105,7 @@ def delete_bookmarks(paths): deleted.append(path) else: notmarked.append(path) - _save_config_file(config) + _save_config_file(config, config_path) else: notmarked = [os.path.abspath(path) for path in paths] @@ -118,9 +118,9 @@ def delete_bookmarks(paths): for path in notmarked: print(INDENT1, path) -def list_bookmarks(): +def list_bookmarks(config_path=None): """Print all of our current bookmarks.""" - bookmarks = get_bookmarks() + bookmarks = get_bookmarks(config_path=config_path) if bookmarks: print(YELLOW + "Current bookmarks:") for bookmark_path in bookmarks: diff --git a/gitup/script.py b/gitup/script.py index d4bb3b9..1bd7dc7 100644 --- a/gitup/script.py +++ b/gitup/script.py @@ -6,12 +6,13 @@ from __future__ import print_function import argparse +import os from colorama import init as color_init, Fore, Style from . import __version__ -from .config import (get_bookmarks, add_bookmarks, delete_bookmarks, - list_bookmarks) +from .config import (get_default_config_path, get_bookmarks, add_bookmarks, + delete_bookmarks, list_bookmarks) from .update import update_bookmarks, update_directories def main(): @@ -54,6 +55,10 @@ def main(): 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", + help="use a specific bookmark config file (default: {0})".format( + get_default_config_path())) group_m.add_argument( '-h', '--help', action="help", help="show this help message and exit") @@ -81,21 +86,24 @@ def main(): "upstream branch and can be safely fast-forwarded. Use " "--fetch-only to\navoid updating any branches.\n") + if args.bookmark_file: + args.bookmark_file = os.path.expanduser(args.bookmark_file) + acted = False if args.bookmarks_to_add: - add_bookmarks(args.bookmarks_to_add) + add_bookmarks(args.bookmarks_to_add, args.bookmark_file) acted = True if args.bookmarks_to_del: - delete_bookmarks(args.bookmarks_to_del) + delete_bookmarks(args.bookmarks_to_del, args.bookmark_file) acted = True if args.list_bookmarks: - list_bookmarks() + list_bookmarks(args.bookmark_file) acted = True if args.directories_to_update: update_directories(args.directories_to_update, update_args) acted = True if args.update or not acted: - update_bookmarks(get_bookmarks(), update_args) + update_bookmarks(get_bookmarks(args.bookmark_file), update_args) def run(): """Thin wrapper for main() that catches KeyboardInterrupts."""