Exemplo n.º 1
0
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!")
Exemplo n.º 2
0
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!")
Exemplo n.º 3
0
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:
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
                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))