|
|
@@ -6,10 +6,9 @@ |
|
|
|
from __future__ import print_function |
|
|
|
|
|
|
|
import os |
|
|
|
import shlex |
|
|
|
import subprocess |
|
|
|
|
|
|
|
from colorama import Fore, Style |
|
|
|
from git import Repo, exc |
|
|
|
|
|
|
|
__all__ = ["update_bookmarks", "update_directories"] |
|
|
|
|
|
|
@@ -22,29 +21,10 @@ RESET = Style.RESET_ALL |
|
|
|
INDENT1 = " " * 3 |
|
|
|
INDENT2 = " " * 7 |
|
|
|
|
|
|
|
def _directory_is_git_repo(directory_path): |
|
|
|
"""Check if a directory is a git repository.""" |
|
|
|
if os.path.isdir(directory_path): |
|
|
|
git_subfolder = os.path.join(directory_path, ".git") |
|
|
|
if os.path.isdir(git_subfolder): # Check for path/to/repository/.git |
|
|
|
return True |
|
|
|
return False |
|
|
|
|
|
|
|
def _update_repository(repo_path, repo_name): |
|
|
|
def _update_repository(repo, repo_name): |
|
|
|
"""Update a single git repository by pulling from the remote.""" |
|
|
|
def _exec_shell(command): |
|
|
|
"""Execute a shell command and get the output.""" |
|
|
|
command = shlex.split(command) |
|
|
|
result = subprocess.check_output(command, stderr=subprocess.STDOUT) |
|
|
|
if result: |
|
|
|
result = result[:-1] # Strip newline if command returned anything |
|
|
|
return result |
|
|
|
|
|
|
|
print(INDENT1, BOLD + repo_name + ":") |
|
|
|
|
|
|
|
# cd into our folder so git commands target the correct repo: |
|
|
|
os.chdir(repo_path) # TODO: remove this when using gitpython |
|
|
|
|
|
|
|
try: |
|
|
|
# Check if there is anything to pull, but don't do it yet: |
|
|
|
dry_fetch = _exec_shell("git fetch --dry-run") |
|
|
@@ -81,58 +61,48 @@ def _update_repository(repo_path, repo_name): |
|
|
|
"you have uncommitted changes in this repository!") |
|
|
|
print(INDENT2, "Ignoring.") |
|
|
|
|
|
|
|
def _update_subdirectories(dir_path, dir_name, dir_long_name): |
|
|
|
"""Update all subdirectories that are git repos in a given directory.""" |
|
|
|
repos = [] |
|
|
|
for item in os.listdir(dir_path): |
|
|
|
try: |
|
|
|
repo = Repo(os.path.join(dir_path, item)) |
|
|
|
except (exc.InvalidGitRepositoryError, exc.NoSuchPathError): |
|
|
|
continue |
|
|
|
repos.append((repo, os.path.join(dir_name, item))) |
|
|
|
|
|
|
|
if len(repos) == 1: |
|
|
|
print(dir_long_name.capitalize(), "contains 1 git repository:") |
|
|
|
else: |
|
|
|
print(dir_long_name.capitalize(), |
|
|
|
"contains {0} git repositories:".format(len(repos))) |
|
|
|
|
|
|
|
for repo_path, repo_name in sorted(repos): |
|
|
|
_update_repository(repo_path, repo_name) |
|
|
|
|
|
|
|
def _update_directory(dir_path, dir_name, is_bookmark=False): |
|
|
|
"""Update a particular directory. |
|
|
|
|
|
|
|
First, make sure the specified object is actually a directory, then |
|
|
|
determine whether the directory is a git repo on its own or a directory |
|
|
|
of git repositories. If the former, update the single repository; if the |
|
|
|
latter, update all repositories contained within. |
|
|
|
Determine whether the directory is a git repo on its own, a directory of |
|
|
|
git repositories, or something invalid. If the first, update the single |
|
|
|
repository; if the second, update all repositories contained within; if the |
|
|
|
third, print an error. |
|
|
|
""" |
|
|
|
if is_bookmark: |
|
|
|
dir_type = "bookmark" # Where did we get this directory from? |
|
|
|
else: |
|
|
|
dir_type = "directory" |
|
|
|
dir_type = "bookmark" if is_bookmark else "directory" |
|
|
|
dir_long_name = dir_type + ' "' + BOLD + dir_path + RESET + '"' |
|
|
|
|
|
|
|
try: |
|
|
|
os.listdir(dir_path) # Test if we can access this directory |
|
|
|
except OSError: |
|
|
|
print(RED + "Error:" + RESET, |
|
|
|
"cannot enter {0}; does it exist?".format(dir_long_name)) |
|
|
|
return |
|
|
|
|
|
|
|
if not os.path.isdir(dir_path): |
|
|
|
if os.path.exists(dir_path): |
|
|
|
print(RED + "Error:" + RESET, dir_long_name, "is not a directory!") |
|
|
|
repo = Repo(dir_path) |
|
|
|
except exc.NoSuchPathError: |
|
|
|
print(RED + "Error:" + RESET, dir_long_name, "doesn't exist!") |
|
|
|
except exc.InvalidGitRepositoryError: |
|
|
|
if os.path.isdir(dir_path): |
|
|
|
_update_subdirectories(dir_path, dir_name, dir_long_name) |
|
|
|
else: |
|
|
|
print(RED + "Error:" + RESET, dir_long_name, "does not exist!") |
|
|
|
return |
|
|
|
|
|
|
|
if _directory_is_git_repo(dir_path): |
|
|
|
print(dir_long_name.capitalize(), "is a git repository:") |
|
|
|
_update_repository(dir_path, dir_name) |
|
|
|
|
|
|
|
print(RED + "Error:" + RESET, dir_long_name, "isn't a repository!") |
|
|
|
else: |
|
|
|
repositories = [] |
|
|
|
|
|
|
|
dir_contents = os.listdir(dir_path) # Get potential repos in directory |
|
|
|
for item in dir_contents: |
|
|
|
repo_path = os.path.join(dir_path, item) |
|
|
|
repo_name = os.path.join(dir_name, item) |
|
|
|
if _directory_is_git_repo(repo_path): # Filter out non-repos |
|
|
|
repositories.append((repo_path, repo_name)) |
|
|
|
|
|
|
|
num_of_repos = len(repositories) |
|
|
|
if num_of_repos == 1: |
|
|
|
print(dir_long_name.capitalize(), "contains 1 git repository:") |
|
|
|
else: |
|
|
|
print(dir_long_name.capitalize(), |
|
|
|
"contains {0} git repositories:".format(num_of_repos)) |
|
|
|
|
|
|
|
repositories.sort() # Go alphabetically instead of randomly |
|
|
|
for repo_path, repo_name in repositories: |
|
|
|
_update_repository(repo_path, repo_name) |
|
|
|
print(dir_long_name.capitalize(), "is a git repository:") |
|
|
|
_update_repository(repo, dir_name) |
|
|
|
|
|
|
|
def update_bookmarks(bookmarks): |
|
|
|
"""Loop through and update all bookmarks.""" |
|
|
|