Jonathan Maw pushed to branch jonathan/workspace-fragment-create at BuildStream / buildstream
Commits:
3 changed files:
Changes:
... | ... | @@ -293,7 +293,7 @@ class Context(): |
293 | 293 |
#
|
294 | 294 |
def add_project(self, project):
|
295 | 295 |
if not self._projects:
|
296 |
- self._workspaces = Workspaces(project)
|
|
296 |
+ self._workspaces = Workspaces(project, self._workspace_project_cache)
|
|
297 | 297 |
self._projects.append(project)
|
298 | 298 |
|
299 | 299 |
# get_projects():
|
... | ... | @@ -563,8 +563,6 @@ class Stream(): |
563 | 563 |
# So far this function has tried to catch as many issues as possible with out making any changes
|
564 | 564 |
# Now it dose the bits that can not be made atomic.
|
565 | 565 |
targetGenerator = zip(elements, expanded_directories)
|
566 |
- workspace_project_cache = self._context.get_workspace_project_cache()
|
|
567 |
- project = self._context.get_toplevel_project()
|
|
568 | 566 |
for target, directory in targetGenerator:
|
569 | 567 |
self._message(MessageType.INFO, "Creating workspace for element {}"
|
570 | 568 |
.format(target.name))
|
... | ... | @@ -583,19 +581,7 @@ class Stream(): |
583 | 581 |
todo_elements = "\nDid not try to create workspaces for " + todo_elements
|
584 | 582 |
raise StreamError("Failed to create workspace directory: {}".format(e) + todo_elements) from e
|
585 | 583 |
|
586 |
- workspaces.create_workspace(target._get_full_name(), directory)
|
|
587 |
- |
|
588 |
- if not no_checkout:
|
|
589 |
- with target.timed_activity("Staging sources to {}".format(directory)):
|
|
590 |
- target._open_workspace()
|
|
591 |
- |
|
592 |
- workspace_project = workspace_project_cache.add(directory, project.directory,
|
|
593 |
- target._get_full_name())
|
|
594 |
- workspace_project.write()
|
|
595 |
- |
|
596 |
- # Saving the workspace once it is set up means that if the next workspace fails to be created before
|
|
597 |
- # the configuration gets saved. The successfully created workspace still gets saved.
|
|
598 |
- workspaces.save_config()
|
|
584 |
+ workspaces.create_workspace(target, directory, not no_checkout)
|
|
599 | 585 |
self._message(MessageType.INFO, "Created a workspace for element: {}"
|
600 | 586 |
.format(target._get_full_name()))
|
601 | 587 |
|
... | ... | @@ -620,16 +606,6 @@ class Stream(): |
620 | 606 |
except OSError as e:
|
621 | 607 |
raise StreamError("Could not remove '{}': {}"
|
622 | 608 |
.format(workspace.get_absolute_path(), e)) from e
|
623 |
- else:
|
|
624 |
- workspace_project_cache = self._context.get_workspace_project_cache()
|
|
625 |
- try:
|
|
626 |
- workspace_project_cache.remove(workspace.get_absolute_path())
|
|
627 |
- except LoadError as e:
|
|
628 |
- # We might be closing a workspace with a deleted directory
|
|
629 |
- if e.reason == LoadErrorReason.MISSING_FILE:
|
|
630 |
- pass
|
|
631 |
- else:
|
|
632 |
- raise
|
|
633 | 609 |
|
634 | 610 |
# Delete the workspace and save the configuration
|
635 | 611 |
workspaces.delete_workspace(element_name)
|
... | ... | @@ -673,8 +649,6 @@ class Stream(): |
673 | 649 |
for element in elements:
|
674 | 650 |
workspace = workspaces.get_workspace(element._get_full_name())
|
675 | 651 |
workspace_path = workspace.get_absolute_path()
|
676 |
- workspace_project_cache = self._context.get_workspace_project_cache()
|
|
677 |
- workspace_project = workspace_project_cache.get(workspace_path)
|
|
678 | 652 |
if soft:
|
679 | 653 |
workspace.prepared = False
|
680 | 654 |
self._message(MessageType.INFO, "Reset workspace state for {} at: {}"
|
... | ... | @@ -690,12 +664,7 @@ class Stream(): |
690 | 664 |
.format(workspace_path, e)) from e
|
691 | 665 |
|
692 | 666 |
workspaces.delete_workspace(element._get_full_name())
|
693 |
- workspaces.create_workspace(element._get_full_name(), workspace_path)
|
|
694 |
- |
|
695 |
- with element.timed_activity("Staging sources to {}".format(workspace_path)):
|
|
696 |
- element._open_workspace()
|
|
697 |
- |
|
698 |
- workspace_project.write()
|
|
667 |
+ workspaces.create_workspace(element, workspace_path, True)
|
|
699 | 668 |
|
700 | 669 |
self._message(MessageType.INFO,
|
701 | 670 |
"Reset workspace for {} at: {}".format(element.name,
|
... | ... | @@ -417,12 +417,14 @@ class Workspace(): |
417 | 417 |
#
|
418 | 418 |
# Args:
|
419 | 419 |
# toplevel_project (Project): Top project used to resolve paths.
|
420 |
+# workspace_project_cache (WorkspaceProjectCache): The cache of WorkspaceProjects
|
|
420 | 421 |
#
|
421 | 422 |
class Workspaces():
|
422 |
- def __init__(self, toplevel_project):
|
|
423 |
+ def __init__(self, toplevel_project, workspace_project_cache):
|
|
423 | 424 |
self._toplevel_project = toplevel_project
|
424 | 425 |
self._bst_directory = os.path.join(toplevel_project.directory, ".bst")
|
425 | 426 |
self._workspaces = self._load_config()
|
427 |
+ self._workspace_project_cache = workspace_project_cache
|
|
426 | 428 |
|
427 | 429 |
# list()
|
428 | 430 |
#
|
... | ... | @@ -437,19 +439,36 @@ class Workspaces(): |
437 | 439 |
|
438 | 440 |
# create_workspace()
|
439 | 441 |
#
|
440 |
- # Create a workspace in the given path for the given element.
|
|
442 |
+ # Create a workspace in the given path for the given element, and potentially
|
|
443 |
+ # checks-out the target into it.
|
|
441 | 444 |
#
|
442 | 445 |
# Args:
|
443 |
- # element_name (str) - The element name to create a workspace for
|
|
446 |
+ # target (Element) - The element to create a workspace for
|
|
444 | 447 |
# path (str) - The path in which the workspace should be kept
|
448 |
+ # checkout (bool): Whether to check-out the element's sources into the directory
|
|
445 | 449 |
#
|
446 |
- def create_workspace(self, element_name, path):
|
|
447 |
- if path.startswith(self._toplevel_project.directory):
|
|
448 |
- path = os.path.relpath(path, self._toplevel_project.directory)
|
|
450 |
+ def create_workspace(self, target, path, checkout):
|
|
451 |
+ element_name = target._get_full_name()
|
|
452 |
+ project_dir = self._toplevel_project.directory
|
|
453 |
+ if path.startswith(project_dir):
|
|
454 |
+ workspace_path = os.path.relpath(path, project_dir)
|
|
455 |
+ else:
|
|
456 |
+ workspace_path = path
|
|
449 | 457 |
|
450 |
- self._workspaces[element_name] = Workspace(self._toplevel_project, path=path)
|
|
458 |
+ self._workspaces[element_name] = Workspace(self._toplevel_project, path=workspace_path)
|
|
451 | 459 |
|
452 |
- return self._workspaces[element_name]
|
|
460 |
+ if checkout:
|
|
461 |
+ with target.timed_activity("Staging sources to {}".format(path)):
|
|
462 |
+ target._open_workspace()
|
|
463 |
+ |
|
464 |
+ workspace_project = self._workspace_project_cache.add(path, project_dir, element_name)
|
|
465 |
+ project_file_path = workspace_project.get_filename()
|
|
466 |
+ |
|
467 |
+ if os.path.exists(project_file_path):
|
|
468 |
+ target.warn("{} was staged from this element's sources".format(WORKSPACE_PROJECT_FILE))
|
|
469 |
+ workspace_project.write()
|
|
470 |
+ |
|
471 |
+ self.save_config()
|
|
453 | 472 |
|
454 | 473 |
# get_workspace()
|
455 | 474 |
#
|
... | ... | @@ -498,8 +517,19 @@ class Workspaces(): |
498 | 517 |
# element_name (str) - The element name whose workspace to delete
|
499 | 518 |
#
|
500 | 519 |
def delete_workspace(self, element_name):
|
520 |
+ workspace = self.get_workspace(element_name)
|
|
501 | 521 |
del self._workspaces[element_name]
|
502 | 522 |
|
523 |
+ # Remove from the cache if it exists
|
|
524 |
+ try:
|
|
525 |
+ self._workspace_project_cache.remove(workspace.get_absolute_path())
|
|
526 |
+ except LoadError as e:
|
|
527 |
+ # We might be closing a workspace with a deleted directory
|
|
528 |
+ if e.reason == LoadErrorReason.MISSING_FILE:
|
|
529 |
+ pass
|
|
530 |
+ else:
|
|
531 |
+ raise
|
|
532 |
+ |
|
503 | 533 |
# save_config()
|
504 | 534 |
#
|
505 | 535 |
# Dump the current workspace element to the project configuration
|