code: def rerun(client, revision, roots, siblings, inputs, paths):
      
      graph = Graph(client)
      outputs = graph.build(paths=paths, revision=revision)
  
      # Check or extend siblings of outputs.
      outputs = siblings(graph, outputs)
      output_paths = {node.path for node in outputs}
  
      # Normalize and check all starting paths.
      roots = {graph.normalize_path(root) for root in roots}
      assert not roots & output_paths, '--from colides with output paths'
  
      # Generate workflow and check inputs.
      # NOTE The workflow creation is done before opening a new file.
      workflow = inputs(
          client,
          graph.ascwl(
              input_paths=roots,
              output_paths=output_paths,
              outputs=outputs,
          )
      )
  
      # Make sure all inputs are pulled from a storage.
      client.pull_paths_from_storage(
          *(path for _, path in workflow.iter_input_files(client.workflow_path))
      )
  
      # Store the generated workflow used for updating paths.
      import yaml
  
      output_file = client.workflow_path / '{0}.cwl'.format(uuid.uuid4().hex)
      with output_file.open('w') as f:
          f.write(
              yaml.dump(
                  ascwl(
                      workflow,
                      filter=lambda _, x: x is not None,
                      basedir=client.workflow_path,
                  ),
                  default_flow_style=False
              )
          )
  
      # Execute the workflow and relocate all output files.
      from ._cwl import execute
      # FIXME get new output paths for edited tools
      # output_paths = {path for _, path in workflow.iter_output_files()}
      execute(
          client,
          output_file,
          output_paths=output_paths,
      )
docs: Recreate files generated by a sequence of ``run`` commands.