@@ -2,6 +2,8 @@ | |||||
*.egg | *.egg | ||||
*.egg-info | *.egg-info | ||||
.DS_Store | .DS_Store | ||||
__pycache__ | |||||
build | |||||
dist | |||||
Pipfile.lock | |||||
__pycache__/ | |||||
.pytest_cache/ | |||||
build/ | |||||
dist/ |
@@ -1,6 +1,8 @@ | |||||
v0.6 (unreleased): | v0.6 (unreleased): | ||||
- ... | |||||
- Add an integrated pytest testing suite, runnable with `--selftest`. | |||||
- Refactor internals, remove deprecated options, and drop support for | |||||
end-of-life Python versions. | |||||
v0.5 (released August 28, 2018): | v0.5 (released August 28, 2018): | ||||
@@ -0,0 +1,23 @@ | |||||
[[source]] | |||||
url = "https://pypi.org/simple" | |||||
verify_ssl = true | |||||
name = "pypi" | |||||
[dev-packages] | |||||
pylint = "*" | |||||
pytest = "*" | |||||
twine = "*" | |||||
[packages] | |||||
"e1839a8" = {path = ".", editable = true} | |||||
GitPython = ">= 2.1.8" | |||||
colorama = ">= 0.3.9" | |||||
[requires] | |||||
python_version = "3.7" | |||||
[scripts] | |||||
test = "pytest gitup -v -rxw" | |||||
lint = "pylint --disable=missing-docstring --output-format=colorized gitup" | |||||
cloc = "cloc --vcs=git" | |||||
build = "python setup.py sdist bdist_wheel --universal" |
@@ -5,7 +5,7 @@ enough to handle several remotes, dirty working directories, diverged local | |||||
branches, detached HEADs, and more. It was originally created to manage a large | branches, detached HEADs, and more. It was originally created to manage a large | ||||
collection of projects and deal with sporadic internet access. | collection of projects and deal with sporadic internet access. | ||||
gitup should work on OS X, Linux, and Windows. You should have the latest | |||||
gitup should work on macOS, Linux, and Windows. You should have the latest | |||||
version of git and either Python 2.7 or Python 3 installed. | version of git and either Python 2.7 or Python 3 installed. | ||||
# Installation | # Installation | ||||
@@ -3,7 +3,7 @@ | |||||
# Copyright (C) 2011-2018 Ben Kurtovic <ben.kurtovic@gmail.com> | # Copyright (C) 2011-2018 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. | ||||
from .script import run | |||||
from gitup.cli import run | |||||
if __name__ == "__main__": | if __name__ == "__main__": | ||||
run() | run() |
@@ -10,12 +10,12 @@ import os | |||||
import platform | import platform | ||||
import sys | import sys | ||||
from colorama import init as color_init, Fore, Style | |||||
from colorama import init as color_init, Style | |||||
from . import __version__ | |||||
from .config import (get_default_config_path, get_bookmarks, add_bookmarks, | |||||
delete_bookmarks, list_bookmarks, clean_bookmarks) | |||||
from .update import update_bookmarks, update_directories, run_command | |||||
from gitup import __version__ | |||||
from gitup.config import (get_default_config_path, get_bookmarks, add_bookmarks, | |||||
delete_bookmarks, list_bookmarks, clean_bookmarks) | |||||
from gitup.update import update_bookmarks, update_directories, run_command | |||||
def _decode(path): | def _decode(path): | ||||
"""Decode the given string using the system's filesystem encoding.""" | """Decode the given string using the system's filesystem encoding.""" | ||||
@@ -23,8 +23,8 @@ def _decode(path): | |||||
return path | return path | ||||
return path.decode(sys.getfilesystemencoding()) | return path.decode(sys.getfilesystemencoding()) | ||||
def main(): | |||||
"""Parse arguments and then call the appropriate function(s).""" | |||||
def _build_parser(): | |||||
"""Build and return the argument parser.""" | |||||
parser = argparse.ArgumentParser( | parser = argparse.ArgumentParser( | ||||
description="Easily update multiple git repositories at once.", | description="Easily update multiple git repositories at once.", | ||||
epilog=""" | epilog=""" | ||||
@@ -87,25 +87,29 @@ def main(): | |||||
'-v', '--version', action="version", | '-v', '--version', action="version", | ||||
version="gitup {0} (Python {1})".format( | version="gitup {0} (Python {1})".format( | ||||
__version__, platform.python_version())) | __version__, platform.python_version())) | ||||
group_m.add_argument( | |||||
'--selftest', action="store_true", | |||||
help="run integrated test suite and exit (pytest must be available)") | |||||
# TODO: deprecated arguments, for removal in v1.0: | |||||
parser.add_argument( | |||||
'-m', '--merge', action="store_true", help=argparse.SUPPRESS) | |||||
parser.add_argument( | |||||
'-r', '--rebase', action="store_true", help=argparse.SUPPRESS) | |||||
return parser | |||||
def _selftest(): | |||||
"""Run the integrated test suite with pytest.""" | |||||
from .test import run_tests | |||||
run_tests() | |||||
def main(): | |||||
"""Parse arguments and then call the appropriate function(s).""" | |||||
parser = _build_parser() | |||||
color_init(autoreset=True) | color_init(autoreset=True) | ||||
args = parser.parse_args() | args = parser.parse_args() | ||||
print(Style.BRIGHT + "gitup" + Style.RESET_ALL + ": the git-repo-updater") | print(Style.BRIGHT + "gitup" + Style.RESET_ALL + ": the git-repo-updater") | ||||
print() | print() | ||||
# TODO: remove in v1.0 | |||||
if args.merge or args.rebase: | |||||
print(Style.BRIGHT + Fore.YELLOW + "Warning:", "--merge and --rebase " | |||||
"are deprecated. Branches are only updated if they\ntrack an " | |||||
"upstream branch and can be safely fast-forwarded. Use " | |||||
"--fetch-only to\navoid updating any branches.\n") | |||||
if args.selftest: | |||||
_selftest() | |||||
return | |||||
if args.bookmark_file: | if args.bookmark_file: | ||||
args.bookmark_file = os.path.expanduser(args.bookmark_file) | args.bookmark_file = os.path.expanduser(args.bookmark_file) |
@@ -1,6 +1,6 @@ | |||||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||||
# | # | ||||
# Copyright (C) 2011-2016 Ben Kurtovic <ben.kurtovic@gmail.com> | |||||
# Copyright (C) 2011-2018 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. | ||||
from __future__ import print_function | from __future__ import print_function | ||||
@@ -10,7 +10,7 @@ import os | |||||
from colorama import Fore, Style | from colorama import Fore, Style | ||||
from .migrate import run_migrations | |||||
from gitup.migrate import run_migrations | |||||
__all__ = ["get_default_config_path", "get_bookmarks", "add_bookmarks", | __all__ = ["get_default_config_path", "get_bookmarks", "add_bookmarks", | ||||
"delete_bookmarks", "list_bookmarks", "clean_bookmarks"] | "delete_bookmarks", "list_bookmarks", "clean_bookmarks"] | ||||
@@ -1,6 +1,6 @@ | |||||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||||
# | # | ||||
# Copyright (C) 2011-2016 Ben Kurtovic <ben.kurtovic@gmail.com> | |||||
# Copyright (C) 2011-2018 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. | ||||
import os | import os | ||||
@@ -0,0 +1,10 @@ | |||||
# -*- coding: utf-8 -*- | |||||
# | |||||
# Copyright (C) 2011-2018 Ben Kurtovic <ben.kurtovic@gmail.com> | |||||
# Released under the terms of the MIT License. See LICENSE for details. | |||||
def run_tests(args=None): | |||||
import pytest | |||||
if args is None: | |||||
args = ["-v", "-rxw"] | |||||
return pytest.main(args) |
@@ -0,0 +1,14 @@ | |||||
# -*- coding: utf-8 -*- | |||||
# | |||||
# Copyright (C) 2011-2018 Ben Kurtovic <ben.kurtovic@gmail.com> | |||||
# Released under the terms of the MIT License. See LICENSE for details. | |||||
from __future__ import print_function, unicode_literals | |||||
from gitup import config | |||||
def test_empty_list(tmpdir, capsys): | |||||
config_path = tmpdir / "config" | |||||
config.list_bookmarks(config_path) | |||||
captured = capsys.readouterr() | |||||
assert captured.out == "You have no bookmarks to display.\n" |
@@ -0,0 +1,24 @@ | |||||
# -*- coding: utf-8 -*- | |||||
# | |||||
# Copyright (C) 2011-2018 Ben Kurtovic <ben.kurtovic@gmail.com> | |||||
# Released under the terms of the MIT License. See LICENSE for details. | |||||
from __future__ import print_function, unicode_literals | |||||
import platform | |||||
import subprocess | |||||
import sys | |||||
from gitup import __version__ | |||||
def run_cli(*args): | |||||
cmd = [sys.executable, "-m", "gitup"] + list(args) | |||||
output = subprocess.check_output(cmd) | |||||
return output.strip().decode("utf8") | |||||
def test_cli_version(): | |||||
"""make sure we're using the right version of gitup""" | |||||
output = run_cli("-v") | |||||
expected = "gitup {} (Python {})".format( | |||||
__version__, platform.python_version()) | |||||
assert output == expected |
@@ -18,7 +18,7 @@ with open('README.md') as fp: | |||||
setup( | setup( | ||||
name = "gitup", | name = "gitup", | ||||
packages = find_packages(), | packages = find_packages(), | ||||
entry_points = {"console_scripts": ["gitup = gitup.script:run"]}, | |||||
entry_points = {"console_scripts": ["gitup = gitup.cli:run"]}, | |||||
install_requires = ["GitPython >= 2.1.8", "colorama >= 0.3.9"], | install_requires = ["GitPython >= 2.1.8", "colorama >= 0.3.9"], | ||||
version = __version__, | version = __version__, | ||||
author = "Ben Kurtovic", | author = "Ben Kurtovic", | ||||
@@ -41,8 +41,6 @@ setup( | |||||
"Programming Language :: Python", | "Programming Language :: Python", | ||||
"Programming Language :: Python :: 2.7", | "Programming Language :: Python :: 2.7", | ||||
"Programming Language :: Python :: 3", | "Programming Language :: Python :: 3", | ||||
"Programming Language :: Python :: 3.2", | |||||
"Programming Language :: Python :: 3.3", | |||||
"Programming Language :: Python :: 3.4", | "Programming Language :: Python :: 3.4", | ||||
"Programming Language :: Python :: 3.5", | "Programming Language :: Python :: 3.5", | ||||
"Programming Language :: Python :: 3.6", | "Programming Language :: Python :: 3.6", | ||||