async def _update_commits( self, git_repo: GitRepository, current_commits: MutableMapping, checkout_point: str, ) -> None: for c in git_repo.get_list_commits(branch=checkout_point): if c.hash not in current_commits.keys(): current_commits[c.hash] = c
def main(): print('Running...') # Report_data: a list uses to store the result data report_data = [] # Get the repo path from command line arguments path = sys.argv[1] # Analyse the commit in the repo git_repo = GitRepository(path) commits = git_repo.get_list_commits() for i,commit in enumerate(commits): for j,mod in enumerate(commit.modifications): diffs = git_repo.parse_diff(mod.diff) # Get Method Info From Modification Detail add_func_name,add_func_sig,add_func_modifier,add_func_mod_row,add_func_params = get_func_info(diffs, 'added') del_func_name,del_func_sig,del_func_modifier,del_func_mod_row,del_func_params = get_func_info(diffs, 'deleted') # Find method that have removed a parameter # Consider the Overloading in Java method # 1 - added method number <= deleted method number for add_idx,add_func in enumerate(add_func_name): if add_func in del_func_name: add_override_count = add_func_name.count(add_func) del_override_count = del_func_name.count(add_func) if (add_override_count <= del_override_count): # Find the deleted method that near the added method line_num = add_func_mod_row[add_idx] del_idx = find_mod_func_pair(line_num, add_func, del_func_name, del_func_mod_row) if ( del_func_modifier[del_idx] == add_func_modifier[add_idx]): if ( len(del_func_params[del_idx]) == len(add_func_params[add_idx])+1): if (all(elem in del_func_params[del_idx] for elem in add_func_params[add_idx])): new_sig = add_func + add_func_sig[add_idx] old_sig = add_func + del_func_sig[del_idx] report_data.append([commit.hash,mod.filename,old_sig,new_sig]) # 2 - added method number > deleted method number for del_idx,del_func in enumerate(del_func_name): if del_func in add_func_name: add_override_count = add_func_name.count(del_func) del_override_count = del_func_name.count(del_func) if (add_override_count > del_override_count): line_num = del_func_mod_row[del_idx] add_idx = find_mod_func_pair(line_num, del_func, add_func_name, add_func_mod_row) if ( del_func_modifier[del_idx] == add_func_modifier[add_idx]): if ( len(del_func_params[del_idx]) == len(add_func_params[add_idx])+1): if (all(elem in del_func_params[del_idx] for elem in add_func_params[add_idx])): new_sig = del_func + add_func_sig[add_idx] old_sig = del_func + del_func_sig[del_idx] report_data.append([commit.hash,mod.filename,old_sig,new_sig]) # Save the report data to a CSV report_data = list(set(tuple(element) for element in report_data)) header = ['Commit SHA', 'Java File', 'Old function signature', 'New function signature'] report_data.insert(0,header) with open('report.csv', 'w', newline='') as resultFile: wr = csv.writer(resultFile, dialect='excel') wr.writerows(report_data) print('Finish!')
async def _process_pkg_versions( self, source_details: Mapping, bring_index: BringIndexTing) -> Mapping[str, Any]: cache_path = await ensure_repo_cloned(url=source_details["url"], update=True) gr = GitRepository(cache_path) commits: MutableMapping[str, Commit] = OrderedDict() tags: MutableMapping[str, git.objects.commit.Commit] = OrderedDict() branches: MutableMapping[str, git.objects.commit.Commit] = OrderedDict() for c in gr.get_list_commits(): commits[c.hash] = c for t in reversed( sorted(gr.repo.tags, key=lambda t: t.commit.committed_datetime)): tags[t.name] = t.commit for b in gr.repo.branches: branches[b.name] = b.commit versions = [] latest: Optional[str] = None for k in tags.keys(): if latest is None: latest = k if tags[k].hexsha not in commits.keys(): await self._update_commits(gr, commits, k) c = commits[tags[k].hexsha] timestamp = str(c.author_date) versions.append({ "version": k, "_meta": { "release_date": timestamp }, "_mogrify": [{ "type": "git_clone", "url": source_details["url"], "version": k, }], }) if "master" in branches.keys(): if latest is None: latest = "master" c = commits[branches["master"].hexsha] timestamp = str(c.author_date) versions.append({ "version": "master", "_meta": { "release_date": timestamp }, "_mogrify": [{ "type": "git_clone", "url": source_details["url"], "version": "master", }], }) for b in branches.keys(): if b == "master": continue if branches[b].hexsha not in commits.keys(): await self._update_commits(gr, commits, b) c = commits[branches[b].hexsha] timestamp = str(c.author_date) versions.append({ "version": b, "_meta": { "release_date": timestamp }, "_mogrify": [{ "type": "git_clone", "url": source_details["url"], "version": b, }], }) if source_details.get("use_commits_as_versions", False): for c_hash, c in commits.items(): timestamp = str(c.author_date) versions.append({ "version": c_hash, "_meta": { "release_date": timestamp }, "_mogrify": [{ "type": "git_clone", "url": source_details["url"], "version": c_hash, }], }) result: Dict[str, Any] = {"versions": versions} if latest is not None: aliases: Dict[str, Any] = {"version": {}} aliases["version"]["latest"] = latest result["aliases"] = aliases return result
def info_criacao_client(request): # busca as opções de configuração de execução da ferramenta registradas no banco de dados configuracaoferramenta_choices = ConfiguracaoFerramenta.objects.all( ).order_by('-id') configuracaoferramenta_choices_to_choicefield = list() for configuracao in configuracaoferramenta_choices: configuracaoferramenta_choices_to_choicefield.append( [configuracao.pk, configuracao]) # se GET cria o formulário em branco if request.method == 'GET': form = ExecutarFerramentaForm( configuracaoferramenta_choices_to_choicefield) title = 'Forkuptool - Módulo de análise de repositórios' subtitle = 'Selecione uma configuração para continuar' return render(request, 'info_criacao_client.html', locals()) # se POST será necessário processar os dados do formulário elif request.method == 'POST': configuracaoferramenta_escolhida = None if 'configuracaoferramenta_escolhida' in request.POST: configuracaoferramenta_escolhida = request.POST[ 'configuracaoferramenta_escolhida'] if configuracaoferramenta_escolhida: # busca a configuração para o id informado config = ConfiguracaoFerramenta.objects.get( pk=configuracaoferramenta_escolhida) repo_vendor = GitRepository(config.path_vendor) repo_client = GitRepository(config.path_auxiliary_files) commits_vendor = repo_vendor.get_list_commits() list_hash_vendor = [] for c in commits_vendor: list_hash_vendor.append(c.hash) commits_client = repo_client.get_list_commits() list_hash_client = [] for c in commits_client: list_hash_client.append(c.hash) hash_n_primeiros_commits_somente_client = [] n_primeiros_commits_somente_client = [] for c in list_hash_client: if c not in list_hash_vendor: hash_n_primeiros_commits_somente_client.append(c) if len(hash_n_primeiros_commits_somente_client ) == LENGTH_INFO_CLIENT: break for h in hash_n_primeiros_commits_somente_client: commit_da_vez = repo_client.get_commit(h) candidato_merge_vendor = False if commit_da_vez.merge: tem_pai_vendor = False tmp_parents = commit_da_vez.parents for p in tmp_parents: if p in list_hash_vendor: tem_pai_vendor = True if tem_pai_vendor: candidato_merge_vendor = True info = {'author_date': commit_da_vez.author_date,\ 'hash': commit_da_vez.hash,\ 'parents': commit_da_vez.parents,\ 'author_name': commit_da_vez.author.name,\ 'merge': commit_da_vez.merge,\ 'candidato_merge_vendor': candidato_merge_vendor,\ 'msg': commit_da_vez.msg} n_primeiros_commits_somente_client.append(info) commit_da_vez = None info = None for c in n_primeiros_commits_somente_client: print(('{} ({}) - {} - {} - {}').format( c['author_date'], c['hash'][0:7], c['author_name'], c['merge'], c['msg'][0:80])) title = 'Forkuptool - Módulo de análise de repositórios' subtitle = 'Commits exclusivos do fork (repositório "client")' return render(request, 'info_criacao_client_show.html', locals()) else: messages.error(request, 'Necessário informar uma configuração') return render(request, 'index.html', { 'title': 'Forkuptool', 'subtitle': 'Bem-vindo', })