Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Miscellaneous QoL changes #70

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion xbstrap/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -991,7 +991,9 @@ def main():
elif args.command == "lsp":
do_lsp(args)
else:
assert not "Unexpected command"
# invalid command are already handled by argparse;
# this only gets tripped with no command provided
main_parser.print_help()
except (
xbstrap.base.ExecutionFailureError,
xbstrap.base.PlanFailureError,
Expand Down
27 changes: 16 additions & 11 deletions xbstrap/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -2086,10 +2086,15 @@ def checkout_src(cfg, src, settings):
if fixed_commit is not None:
commit = fixed_commit
if init or settings.reset != ResetMode.NONE:
subprocess.check_call(
["git", "checkout", "--no-track", "-B", source["branch"], commit],
cwd=src.source_dir,
)
try:
subprocess.check_call(
["git", "checkout", "--no-track", "-B", source["branch"], commit],
cwd=src.source_dir,
)
except subprocess.CalledProcessError:
raise GenericError(
"git checkout of '{}' failed for source '{}'".format(commit, src.name)
)
subprocess.call(
["git", "branch", "-u", "refs/remotes/origin/" + source["branch"]],
cwd=src.source_dir,
Expand Down Expand Up @@ -2836,7 +2841,7 @@ def add_source_dependencies(s):
item.require_edges.add((action.PATCH_SRC, dep_source))

def add_tool_dependencies(s):
for (tool_name, stage_name) in s.tool_stage_dependencies:
for tool_name, stage_name in s.tool_stage_dependencies:
dep_tool = self._cfg.get_tool_pkg(tool_name)
if self.build_scope is not None and dep_tool not in self.build_scope:
item.require_edges.add((action.WANT_TOOL, dep_tool))
Expand Down Expand Up @@ -3073,14 +3078,14 @@ def activate(root_action, root_subject):
visit(item.require_edges)

# Activate wanted items.
for (action, subject) in self.wanted:
for action, subject in self.wanted:
item = self._items[(action, subject)]
item.build_span = True
if not self.check or item.is_missing:
activate(action, subject)

# Discover all items reachable by build edges.
for (action, subject) in reversed(self._order):
for action, subject in reversed(self._order):
item = self._items[(action, subject)]
if not item.build_span:
continue
Expand All @@ -3098,7 +3103,7 @@ def is_outdated(item, dep_item):
return False
return dep_ts > ts

for (action, subject) in self._order:
for action, subject in self._order:
item = self._items[(action, subject)]
# Unless we're doing a recursive update, we only follow check items
# that are reachable by build edges.
Expand Down Expand Up @@ -3160,7 +3165,7 @@ def run_plan(self):
_util.log_info("Running the following plan:")
else:
_util.log_info("Nothing to do")
for (action, subject) in scheduled:
for action, subject in scheduled:
if isinstance(subject, HostStage):
if subject.stage_name:
eprint(
Expand Down Expand Up @@ -3199,7 +3204,7 @@ def run_plan(self):
return

any_failed_items = False
for (n, (action, subject)) in enumerate(scheduled):
for n, (action, subject) in enumerate(scheduled):
item = self._items[(action, subject)]

# Check if any prerequisites failed; this can generally only happen with --keep-going.
Expand Down Expand Up @@ -3329,7 +3334,7 @@ def emit_progress(status):

if any_failed_items:
_util.log_info("The following steps failed:")
for (action, subject) in scheduled:
for action, subject in scheduled:
item = self._items[(action, subject)]
assert item.exec_status != ExecutionStatus.NULL
if item.exec_status == ExecutionStatus.SUCCESS:
Expand Down
4 changes: 2 additions & 2 deletions xbstrap/pipeline/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ def do_compute_graph(args):
"architecture": af.architecture,
}
)
for (action, subject) in plan.materialized_steps():
for action, subject in plan.materialized_steps():
if action == xbstrap.base.Action.WANT_TOOL:
if subject in job.tools:
continue
Expand Down Expand Up @@ -237,7 +237,7 @@ def do_compute_graph(args):
plan.wanted.update([(xbstrap.base.Action.RUN, task)])
plan.compute_plan(no_ordering=True)

for (action, subject) in plan.materialized_steps():
for action, subject in plan.materialized_steps():
if action == xbstrap.base.Action.WANT_TOOL:
if subject in item.job.tools:
continue
Expand Down
88 changes: 88 additions & 0 deletions xbstrap/schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,50 @@ definitions:
'sources_required': { $ref: '#/definitions/source_deps' }
'tools_required': { $ref: '#/definitions/tool_deps' }

# keep this in sync with the `sources` definition, as this apparently can't be $ref'ed
dependencies:
# when `git` is used, disallow `svn`, `hg` and `url`
git:
not:
anyOf:
- required:
- hg
- required:
- svn
- required:
- url

# when `tag` is used, disallow `branch` and `commit`
tag:
not:
anyOf:
- required:
- branch
- required:
- commit

branch:
# require any of `commit` or `rolling_version` to be present
anyOf:
- required:
- commit
- required:
- rolling_version
# when branch is used, disallow `tag`
not:
required:
- tag

# when commit is used, branch is required
commit:
required:
- branch

# when rolling_version is used, branch is required
rolling_version:
required:
- branch

'nested_task':
type: object
additionalProperties: false
Expand Down Expand Up @@ -253,6 +297,50 @@ properties:
'regenerate': { $ref: '#/definitions/build_steps' }
'sources_required': { $ref: '#/definitions/source_deps' }
'tools_required': { $ref: '#/definitions/tool_deps' }

# keep this in sync with the `nested_sources` definition, as this apparently can't be $ref'ed
dependencies:
# when `git` is used, disallow `svn`, `hg` and `url`
git:
not:
anyOf:
- required:
- hg
- required:
- svn
- required:
- url

# when `tag` is used, disallow `branch` and `commit`
tag:
not:
anyOf:
- required:
- branch
- required:
- commit

branch:
# require any of `commit` or `rolling_version` to be present
anyOf:
- required:
- commit
- required:
- rolling_version
# when branch is used, disallow `tag`
not:
required:
- tag

# when commit is used, branch is required
commit:
required:
- branch

# when rolling_version is used, branch is required
rolling_version:
required:
- branch
'tools':
type: array
items:
Expand Down
1 change: 0 additions & 1 deletion xbstrap/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ def build_environ_paths(environ, varname, prepend):


def interactive_download(url, path):

istty = os.isatty(1) # This is stdout.
if istty:
eprint("...", end="") # This will become the status line.
Expand Down
Loading