Build: skip Blender repository pull in "make update" when not possible

This prints a more informative message, and is convenient when working with
local changes or in a branch where you only need to update submodules or tests.
This commit is contained in:
Brecht Van Lommel 2019-09-08 14:17:58 +02:00
parent a566b71333
commit b6114c3849
2 changed files with 90 additions and 37 deletions

@ -12,10 +12,14 @@ import shutil
import sys
import make_utils
from make_utils import call
from make_utils import call, check_output
def print_stage(text):
print("")
print(text)
print("")
# Parse arguments
def parse_arguments():
parser = argparse.ArgumentParser()
parser.add_argument("--no-libraries", action="store_true")
@ -26,25 +30,11 @@ def parse_arguments():
parser.add_argument("--git-command", default="git")
return parser.parse_args()
args = parse_arguments()
no_libraries = args.no_libraries
no_blender = args.no_blender
no_submodules = args.no_submodules
use_tests = args.use_tests
git_command = args.git_command
svn_command = args.svn_command
svn_non_interactive = [args.svn_command, '--non-interactive']
def print_stage(text):
print("")
print(text)
print("")
# Test if we are building a specific release version.
release_version = make_utils.git_branch_release_version(git_command)
# Setup for precompiled libraries and tests from svn.
if not no_libraries:
def svn_update(args, release_version):
svn_non_interactive = [args.svn_command, '--non-interactive']
lib_dirpath = os.path.join('..', 'lib')
svn_url = make_utils.svn_libraries_base_url(release_version)
@ -66,21 +56,21 @@ if not no_libraries:
if not os.path.exists(lib_platform_dirpath):
print_stage("Checking out Precompiled Libraries")
if shutil.which(svn_command) is None:
if shutil.which(args.svn_command) is None:
sys.stderr.write("svn not found, can't checkout libraries\n")
sys.exit(1)
svn_url_platform = svn_url + lib_platform
call(svn_non_interactive + ["checkout", svn_url_platform, lib_platform_dirpath])
if use_tests:
if args.use_tests:
lib_tests = "tests"
lib_tests_dirpath = os.path.join(lib_dirpath, lib_tests)
if not os.path.exists(lib_tests_dirpath):
print_stage("Checking out Tests")
if shutil.which(svn_command) is None:
if shutil.which(args.svn_command) is None:
sys.stderr.write("svn not found, can't checkout tests\n")
sys.exit(1)
@ -101,7 +91,7 @@ if not no_libraries:
if os.path.isdir(dirpath) and \
(os.path.exists(svn_dirpath) or os.path.exists(svn_root_dirpath)):
if shutil.which(svn_command) is None:
if shutil.which(args.svn_command) is None:
sys.stderr.write("svn not found, can't update libraries\n")
sys.exit(1)
@ -109,25 +99,71 @@ if not no_libraries:
call(svn_non_interactive + ["switch", svn_url + dirname, dirpath])
call(svn_non_interactive + ["update", dirpath])
# Update blender repository and submodules.
if not no_blender:
# Update blender repository.
def blender_update_skip(args):
if shutil.which(args.git_command) is None:
sys.stderr.write("git not found, can't update code\n")
sys.exit(1)
# Abort if a rebase is still progress.
rebase_merge = check_output([args.git_command, 'rev-parse', '--git-path', 'rebase-merge'])
rebase_apply = check_output([args.git_command, 'rev-parse', '--git-path', 'rebase-apply'])
merge_head = check_output([args.git_command, 'rev-parse', '--git-path', 'MERGE_HEAD'])
if os.path.exists(rebase_merge) or \
os.path.exists(rebase_apply) or \
os.path.exists(merge_head):
return "rebase or merge in progress, complete it first"
# Abort if uncommitted changes.
changes = check_output([args.git_command, 'status', '--porcelain', '--untracked-files=no'])
if len(changes) != 0:
return "you have unstaged changes"
# Test if there is an upstream branch configured
branch = check_output([args.git_command, "rev-parse", "--abbrev-ref", "HEAD"])
remote = check_output([args.git_command, "config", "branch." + branch + ".remote"], exit_on_error=False)
if len(remote) == 0:
return "no remote branch to pull from"
return None
def blender_update(args):
print_stage("Updating Blender Git Repository")
if shutil.which(git_command) is None:
sys.stderr.write("git not found, can't update code\n")
sys.exit(1)
call([args.git_command, "pull", "--rebase"])
call([git_command, "pull", "--rebase"])
if not no_submodules:
# Update submodules.
def submodules_update(args, release_version):
print_stage("Updating Submodules")
if shutil.which(git_command) is None:
if shutil.which(args.git_command) is None:
sys.stderr.write("git not found, can't update code\n")
sys.exit(1)
call([git_command, "submodule", "update", "--init", "--recursive"])
call([args.git_command, "submodule", "update", "--init", "--recursive"])
if not release_version:
# Update submodules to latest master if not building a specific release.
# In that case submodules are set to a specific revision, which is checked
# out by running "git submodule update".
call([git_command, "submodule", "foreach", "git", "checkout", "master"])
call([git_command, "submodule", "foreach", "git", "pull", "--rebase", "origin", "master"])
call([args.git_command, "submodule", "foreach", "git", "checkout", "master"])
call([args.git_command, "submodule", "foreach", "git", "pull", "--rebase", "origin", "master"])
if __name__ == "__main__":
args = parse_arguments()
blender_skipped = None
# Test if we are building a specific release version.
release_version = make_utils.git_branch_release_version(args.git_command)
if not args.no_libraries:
svn_update(args, release_version)
if not args.no_blender:
blender_skipped = blender_update_skip(args)
if not blender_skipped:
blender_update(args)
if not args.no_submodules:
submodules_update(args, release_version)
if blender_skipped:
print_stage("Blender repository skipped: " + blender_skipped)

@ -6,7 +6,7 @@ import re
import subprocess
import sys
def call(cmd):
def call(cmd, exit_on_error=True):
print(" ".join(cmd))
# Flush to ensure correct order output on Windows.
@ -14,8 +14,25 @@ def call(cmd):
sys.stderr.flush()
retcode = subprocess.call(cmd)
if retcode != 0:
sys.exit(retcode)
if exit_on_error and retcode != 0:
sys.exit(retcode)
return retcode
def check_output(cmd, exit_on_error=True):
# Flush to ensure correct order output on Windows.
sys.stdout.flush()
sys.stderr.flush()
try:
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, text=True)
except subprocess.CalledProcessError as e:
if exit_on_error:
sys.stderr.write(" ".join(cmd))
sys.stderr.write(e.output + "\n")
sys.exit(e.returncode)
output = ""
return output.strip()
def git_branch_release_version(git_command):
# Test if we are building a specific release version.