I.d.R. hab ich einige 'git' repros unter foo_env/src/
Um alle git repros auf den neusten Stand zu bringen hatte ich erst ein shell Skript und nun das:
Code: Alles auswählen
#!/usr/bin/env python3
"""
Update all git repositories in a virtualenv.
copyleft by Jens Diemer
release under GPL v3+
"""
import subprocess
import os
import sys
import re
try:
import click
except ImportError as err:
print("Error: %s" % err)
print("Please install click!")
sys.exit(-1)
def verbose_check_output(*args, **kwargs):
""" 'verbose' version of subprocess.check_output() """
verbose=kwargs.pop("verbose", False)
if verbose:
click.echo(click.style("\tcall: %s" % " ".join(args), fg="blue"))
kwargs["universal_newlines"]=True
kwargs["stderr"]=subprocess.STDOUT
try:
output = subprocess.check_output(args, **kwargs)
except subprocess.CalledProcessError as err:
print("\n***ERROR:")
print(err.output)
raise
if verbose:
click.echo(click.style("output:\n%s" % output, fg="blue"))
return output
def verbose_call(*args, **kwargs):
click.echo(click.style("\tcall: %s" % " ".join(args), fg="blue"))
returncode = subprocess.call(args, **kwargs)
if returncode==0:
color="green"
else:
color="red"
click.echo(click.style("(return code: %s)" % returncode, fg=color))
return returncode
CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
REXP = re.compile(r"^\*\s*(.*)$", re.MULTILINE)
def get_git_branch(path, verbose=False):
output = verbose_check_output(
"git", "branch", "--no-color",
cwd=path,
verbose=verbose
)
branch = REXP.findall(output)
if len(branch)!=1:
print("Error finding git branch from output:")
print(output)
print("-"*79)
return None
return branch[0]
@click.command(context_settings=CONTEXT_SETTINGS)
@click.argument("path", type=click.Path(
exists=True,
file_okay=False, dir_okay=True,
writable=False, readable=True,
resolve_path=True
))
def update_env(path):
"""
Update a virtualenv by Jens Diemer - GPL v3
"""
click.echo("Update %r..." % path)
src_path = os.path.join(path, "src")
if not os.path.isdir(src_path):
click.echo("Error!")
for path in os.listdir(src_path):
abs_path = os.path.join(src_path, path)
if not os.path.isdir(abs_path):
continue
git_dir = os.path.join(abs_path, ".git")
if not os.path.isdir(git_dir):
click.echo("Skip %r (contains no '.git' dir)" % path)
continue
click.echo("_"*79)
click.echo(click.style("Update %r:" % path, bold=True))
verbose_call("git", "fetch", "--all", cwd=abs_path)
pull_args = ["git", "pull"]
branch = get_git_branch(
abs_path,
# verbose=True
)
if branch:
# FIXME: How to removed hardcoded 'origin'?
pull_args += ["origin", branch]
verbose_call(*pull_args, cwd=abs_path)
if __name__ == "__main__":
update_env()
click.echo("\nBye\n")
# print(
# get_git_branch(
# os.path.expanduser("~/PyLucid_env/src/pylucid"),
# verbose=True
# )
# )
Im Grunde wird das gemacht:
- git fetch --all
- git pull origin master
Nicht schön, aber hilfreich