def _PrepareWorkingSpace(self, max_threads, setup_git): """Prepare the working directory for use. Set up the git repo for each thread. Args: max_threads: Maximum number of threads we expect to need. setup_git: True to set up a git repo clone """ builderthread.Mkdir(self._working_dir) for thread in range(max_threads): self._PrepareThread(thread, setup_git)
def BuildBoards(self, commits, board_selected, keep_outputs, verbose): """Build all commits for a list of boards Args: commits: List of commits to be build, each a Commit object boards_selected: Dict of selected boards, key is target name, value is Board object keep_outputs: True to save build output files verbose: Display build results as they are completed Returns: Tuple containing: - number of boards that failed to build - number of boards that issued warnings """ self.commit_count = len(commits) if commits else 1 self.commits = commits self._verbose = verbose self.ResetResultSummary(board_selected) builderthread.Mkdir(self.base_dir, parents=True) self._PrepareWorkingSpace(min(self.num_threads, len(board_selected)), commits is not None) self._PrepareOutputSpace() self.SetupBuild(board_selected, commits) self.ProcessResult(None) # Create jobs to build all commits for each board for brd in board_selected.itervalues(): job = builderthread.BuilderJob() job.board = brd job.commits = commits job.keep_outputs = keep_outputs job.step = self._step self.queue.put(job) # Wait until all jobs are started self.queue.join() # Wait until we have processed all output self.out_queue.join() Print() self.ClearLine(0) return (self.fail, self.warned)
def _PrepareThread(self, thread_num, setup_git): """Prepare the working directory for a thread. This clones or fetches the repo into the thread's work directory. Args: thread_num: Thread number (0, 1, ...) setup_git: True to set up a git repo clone """ thread_dir = self.GetThreadDir(thread_num) builderthread.Mkdir(thread_dir) git_dir = os.path.join(thread_dir, '.git') # Clone the repo if it doesn't already exist # TODO(sjg@chromium): Perhaps some git hackery to symlink instead, so # we have a private index but uses the origin repo's contents? if setup_git and self.git_dir: src_dir = os.path.abspath(self.git_dir) if os.path.exists(git_dir): gitutil.Fetch(git_dir, thread_dir) else: Print('Cloning repo for thread %d' % thread_num) gitutil.Clone(src_dir, thread_dir)