def list_commits(codecov_token, maximum=None, unique=None, skip_commits=[]): """ List all the commits ingested on codecov """ assert unique in (None, "week", "day") params = {"access_token": codecov_token, "page": 1} nb = 0 dates = set() while True: resp = requests.get(CODECOV_URL, params=params) resp.raise_for_status() data = resp.json() if not data["commits"]: return for commit in data["commits"]: # Skip commit if that day or week has already been processed earlier day = datetime.strptime(commit["timestamp"], "%Y-%m-%d %H:%M:%S").date() week = day.isocalendar()[:2] if unique == "day" and day in dates: continue if unique == "week" and week in dates: continue dates.add(day) dates.add(week) # Convert git to mercurial revision commit["mercurial"] = git_to_mercurial(commit["commitid"]) if commit["mercurial"] in skip_commits: print( "Skipping already processed commit {}".format(commit["mercurial"]) ) continue yield commit nb += 1 if maximum is not None and nb >= maximum: return params["page"] += 1
def find_bic(bug_fixing_commit): logger.info("Analyzing {}...".format(bug_fixing_commit["git_rev"])) commit = GIT_REPO.get_commit(bug_fixing_commit["git_rev"]) # Skip huge changes, we'll likely be wrong with them. if len(commit.modifications) > MAX_MODIFICATION_NUMBER: return [None] bug_introducing_modifications = GIT_REPO.get_commits_last_modified_lines( commit, hashes_to_ignore_path=os.path.realpath("git_hashes_to_ignore") ) logger.info(bug_introducing_modifications) bug_introducing_commits = [] for bug_introducing_hashes in bug_introducing_modifications.values(): for bug_introducing_hash in bug_introducing_hashes: bug_introducing_commits.append( { "bug_fixing_mercurial_rev": bug_fixing_commit["mercurial_rev"], "bug_fixing_git_rev": bug_fixing_commit["git_rev"], "bug_introducing_mercurial_rev": vcs_map.git_to_mercurial( bug_introducing_hash ), "bug_introducing_git_rev": bug_introducing_hash, } ) # Add an empty result, just so that we don't reanalyze this again. if len(bug_introducing_commits) == 0: bug_introducing_commits.append( { "bug_fixing_mercurial_rev": bug_fixing_commit["mercurial_rev"], "bug_fixing_git_rev": bug_fixing_commit["git_rev"], "bug_introducing_mercurial_rev": "", "bug_introducing_git_rev": "", } ) return bug_introducing_commits
def git_to_mercurial(rev): if tokenized: return self.tokenized_git_to_mercurial[rev] else: return vcs_map.git_to_mercurial(rev)
def git_to_mercurial(revs): if tokenized: return (self.tokenized_git_to_mercurial[rev] for rev in revs) else: yield from vcs_map.git_to_mercurial(repo_dir, revs)