def main(): repo_path = sys.argv[1] repo_branch = 'master' base_dir_not_bug = "data2/not_bug/{}".format( os.path.basename(os.path.normpath(repo_path))) base_dir_bug = "data2/bug/{}".format( os.path.basename(os.path.normpath(repo_path))) if not os.path.exists(base_dir_bug): os.makedirs(base_dir_bug) if not os.path.exists(base_dir_not_bug): os.makedirs(base_dir_not_bug) gitRepo = GitRepository(repo_path) # commits = RepositoryMining(repo_path, only_in_branch=repo_branch).traverse_commits() all_files = gitRepo.files() counter = 0 total_files = len(all_files) for file in all_files: counter += 1 relative_path = os.path.relpath(file, repo_path) # print("[*] {}/{} {}".format(counter, total_files, relative_path)) print(relative_path) if not valid_source_file(file): continue gprepo = gitRepo.repo modifying_commits = gprepo.iter_commits('--all', paths=relative_path) buggy = False for commit in modifying_commits: print(commit.hexsha) if is_buggy_commit(commit.message): print(commit.message) buggy = True break file_name_to_write = "{}_{}".format(counter, os.path.basename(file)) if buggy: file_path_to_write = os.path.join(base_dir_bug, file_name_to_write) shutil.copyfile(file, file_path_to_write) else: file_path_to_write = os.path.join(base_dir_not_bug, file_name_to_write) shutil.copyfile(file, file_path_to_write) print("All Done!")
def main(): repo_path = sys.argv[1] repo_branch = 'master' commits = RepositoryMining(repo_path, only_in_branch=repo_branch).traverse_commits() commits = [commit for commit in commits] gitRepo = GitRepository(repo_path) start_date = commits[0].committer_date + relativedelta(years=3) last_date = commits[-1].committer_date - relativedelta(years=3) bug_tracker = defaultdict(list) bug_tracker_pickle = "data3/{}.pickle".format( os.path.basename(os.path.normpath(repo_path))) # First index the buggy files if os.path.exists(bug_tracker_pickle): with open(bug_tracker_pickle, 'rb') as handle: bug_tracker = pickle.load(handle) else: for commit_index, commit in enumerate(commits): if not is_bugfix_commit(commit.msg): continue try: for m in commit.modifications: if not valid_source_file(m.filename): continue bug_commit = gitRepo.get_commits_last_modified_lines( commit, m) ### uses SZZ # if bug_commit == {}: continue bug_start_index = 99999999999999999999 for _file in bug_commit: for i, _commit in enumerate(commits[:commit_index]): if _commit.hash in bug_commit[_file] \ and i<bug_start_index: bug_start_index = i for _commit in commits[bug_start_index:commit_index]: bug_tracker[_commit.hash].append(m.filename) except Exception as e: print("[***]", e) print(traceback.format_exc()) print("Continuing for next commits") print(len(bug_tracker.keys())) with open(bug_tracker_pickle, 'wb') as handle: pickle.dump(bug_tracker, handle, protocol=pickle.HIGHEST_PROTOCOL) # Copy the files with open('maj_versions/{}.hash'.format( os.path.basename(os.path.normpath(repo_path)))) as f: major_releases = [] for line in f.read().splitlines(): tag, hash = line.split(',') major_releases.append((tag, hash)) for version, commit in enumerate(commits): if not commit.hash in [item[1] for item in major_releases]: continue if commit.committer_date < start_date or commit.committer_date > last_date: continue for tag, hash in major_releases: if hash == commit.hash: break print("[*] Doing {}".format(tag)) gitRepo.checkout(commit.hash) base_dir_not_bug = "data3/{}/{}/not_bug".format( os.path.basename(os.path.normpath(repo_path)), tag) base_dir_bug = "data3/{}/{}/bug".format( os.path.basename(os.path.normpath(repo_path)), tag) if not os.path.exists(base_dir_bug): os.makedirs(base_dir_bug) if not os.path.exists(base_dir_not_bug): os.makedirs(base_dir_not_bug) all_files = gitRepo.files() for _file in all_files: if not valid_source_file(_file): continue filename = os.path.basename(os.path.normpath(_file)) if commit.hash in bug_tracker and filename in bug_tracker[ commit.hash]: file_path_to_write = os.path.join(base_dir_bug, filename) else: file_path_to_write = os.path.join(base_dir_not_bug, filename) shutil.copyfile(_file, file_path_to_write) print("All Done!")
from pydriller import RepositoryMining from pydriller import GitRepository import os DicionarioDeNomedeFunc = {} #for commit in RepositoryMining('C:/Users/William/Downloads/j').traverse_commits(): # print('hash {} authored by {}'.format(commit.hash, commit.author.name)) # print(commit.files) teste = GitRepository('C:/Users/William/Downloads/j') contador = 0 contador2 = 0 for contar in teste.files(): print("entrei") contador2 += 1 #print(teste.total_commits()) #for lista in teste.get_list_commits() : for lista in RepositoryMining( 'C:/Users/William/Downloads/j').traverse_commits(): #print(contador) #contador+=1 for arquivos in lista.modifications: #print(arquivos.complexity) #print(arquivos.new_path) if arquivos.filename not in DicionarioDeNomedeFunc: contador += 1 DicionarioDeNomedeFunc.update({arquivos.filename: 1}) else: DicionarioDeNomedeFunc.update({ arquivos.filename:
def comparar_repositorios_task(task_id, configuracaogeral_escolhida): print("Received task", task_id) # busca a configuração para o id informado configuracaogeral = ConfiguracaoGeral.objects.get( pk=configuracaogeral_escolhida) # cria registro de Comparacao para esta execução comparacao = Comparacao() comparacao.descricao_vendor = configuracaogeral.descricao_vendor comparacao.descricao_client = configuracaogeral.descricao_client comparacao.path_repositorio_vendor = configuracaogeral.path_repositorio_vendor comparacao.path_repositorio_client = configuracaogeral.path_repositorio_client comparacao.save() """ Inicia a análise/comparação entre os respositórios, percorrendo o repositório vendor - obtém um objeto para iteração sobre o repositório vendor - itera sobre o objeto vendor - para cada item de vendor: """ git_vendor = GitRepository(configuracaogeral.path_repositorio_vendor) git_client = GitRepository(configuracaogeral.path_repositorio_client) files_in_vendor = git_vendor.files() # para debug #contador_interrupcao = 0 numero_arquivos_ignorados = 0 for file_vendor in files_in_vendor: #contador_interrupcao += 1 #if contador_interrupcao > 300: # break """ - cria um objeto ArquivoVendor - cria um objeto ArquivoClient - busca informações do arquivo vendor e atualiza atributos correspondentes arquivo_vendor.nome arquivo_vendor.caminho_completo arquivo_vendor.extensao_tipo ==> em 14/05/19: virou atributo calculado (property) """ arquivo_vendor = ArquivoVendor() arquivo_client = ArquivoClient() """ Em 20/05/2019: verifica se o arquivo deve ou não ser ignorado na análise """ if ArquivoVendor.deve_ser_ignorado(file_vendor): numero_arquivos_ignorados += 1 continue # file_vendor correspondente ao nome completo do arquivo (caminho completo + nome) # é necessário guardar o caminho completo do arquivo SOMENTE do projeto, desconsiderando o caminho da máquina local arquivo_vendor.nome = ArquivoVendor.obter_apenas_nome(file_vendor) arquivo_vendor.caminho_completo = file_vendor.replace( configuracaogeral.path_repositorio_vendor, '') #arquivo_vendor.extensao_tipo = ArquivoVendor.obter_extensao_tipo(arquivo_vendor.nome) """ - verifica se existe correspondente em client """ if not os.path.isfile(configuracaogeral.path_repositorio_client + arquivo_vendor.caminho_completo): """ - se não existir: arquivo_vendor.tem_no_client = False arquivo_vendor.igual_ao_client = False arquivo_client = None """ arquivo_vendor.tem_no_client = False arquivo_vendor.igual_ao_client = False arquivo_client = None else: """ - se existir: - busca informações do arquivo client e atualiza atributos correspondentes arquivo_client.nome arquivo_client.caminho_completo arquivo_client.extensao_tipo ==> em 14/05/19: virou atributo calculado (property) arquivo_client.tem_no_vendor = True """ file_client = configuracaogeral.path_repositorio_client + arquivo_vendor.caminho_completo arquivo_client.nome = ArquivoVendor.obter_apenas_nome(file_client) arquivo_client.caminho_completo = file_client.replace( configuracaogeral.path_repositorio_client, '') #arquivo_client.extensao_tipo = ArquivoVendor.obter_extensao_tipo(arquivo_client.nome) arquivo_client.tem_no_vendor = True """ - verifica se são iguais """ if filecmp.cmp(configuracaogeral.path_repositorio_vendor+arquivo_vendor.caminho_completo, \ configuracaogeral.path_repositorio_client+arquivo_client.caminho_completo): """ - se forem iguais: arquivo_vendor.igual_ao_client = True arquivo_client.igual_ao_vendor = True """ arquivo_vendor.igual_ao_client = True arquivo_client.igual_ao_vendor = True else: """ - se não forem iguais arquivo_vendor.igual_ao_client = False arquivo_client.igual_ao_vendor = False """ arquivo_vendor.igual_ao_client = False arquivo_client.igual_ao_vendor = False """ - salva o arquivo_client arquivo_client.save() """ arquivo_client.save() """ - salva o arquivo_vendor arquivo_vendor.save() """ arquivo_vendor.save() # Em 14/05/19: só persiste objetos do tipo Commit se houver diferenças entre os arquivos vendor e client # if arquivo_client and not arquivo_vendor.igual_ao_client: lista_commits_client = git_client.get_commits_modified_file( arquivo_client.caminho_completo) for c in lista_commits_client: obj, created = Commit.objects.get_or_create(string_hash=c) arquivo_client.commits.add(obj) lista_commits_vendor = git_vendor.get_commits_modified_file( arquivo_vendor.caminho_completo) for c in lista_commits_vendor: obj, created = Commit.objects.get_or_create(string_hash=c) arquivo_vendor.commits.add(obj) """ - cria um objeto ArquivosComparados arquivos_comparados.comparacao = comparacao arquivos_comparados.arquivo_vendor = arquivo_vendor arquivos_comparados.arquivo_client = arquivo_client - salva o objeto ArquivosComparados arquivos_comparados.save() """ arquivos_comparados = ArquivosComparados() arquivos_comparados.comparacao = comparacao arquivos_comparados.arquivo_vendor = arquivo_vendor arquivos_comparados.arquivo_client = arquivo_client # Em 17/05/19: busca nº de linhas incluídas e excluídas via comando do git para arquivos diferentes# if arquivo_vendor.tem_no_client and not arquivo_vendor.igual_ao_client and not arquivos_comparados.eh_binario( ): detalhes_diff = buscar_detalhes_diff_entre_arquivos(configuracaogeral.path_repositorio_vendor+\ arquivo_vendor.caminho_completo, configuracaogeral.path_repositorio_client+arquivo_client.caminho_completo) if len(detalhes_diff) >= 3: arquivos_comparados.numero_linhas_inseridas = detalhes_diff[0] arquivos_comparados.numero_linhas_excluidas = detalhes_diff[1] arquivos_comparados.save() print('#', end="") comparacao.numero_arquivos_ignorados = numero_arquivos_ignorados comparacao.save() print('#') task = ThreadTask.objects.get(pk=task_id) task.is_done = True task.save() print("Finishing task", task_id)
if ((mod.change_type.name == "ADD") and (mod.added > 0)): path, ext = os.path.splitext(mod.new_path) # print(ext) # print(mod.new_path) if ((ext == ".lua") and (len(mod.methods) > 0)): print(mod.new_path) print(mod.filename) print(mod.added) print(path) print(mod.source_code) for method in mod.methods: print('\nmethod:') print('name: ', method.name) print('long: ', method.long_name) print('params: ', method.parameters) print('top_nesting_level', method.top_nesting_level) #print(method.filename) #print(mod.source_code) return repo_path = 'repo/terrame' #show_modification(repo_path) repo = GitRepository(repo_path) files = repo.files() for f in files: if f.endswith('.lua'): print(f, type(f))