Ejemplo n.º 1
0
    def get_NCOMM_NADEV_NNDEV_NSCTR(self, index: int, commits: List[MetricBean], beans: MyMetricBeans, my_commits: MyCommits) -> [int, int, int, int]:
        devs = []
        packages = set()
        # commit_count = set()
        # for i in range(0, index):
        #     git_hash = commits[i].git_hash
        #     if git_hash in my_commits.hashes:
        #         for path in my_commits.hashes[git_hash]:
        #             for mb in beans.get(path):
        #                 commit_count.add(mb.git_hash)
        #                 devs.append(mb.committer_email)
        #                 packages.add(mb.package)

        gr = GitRepository(self.repo_path)
        commit = gr.get_commit(commits[index].git_hash)
        commit_count = 1
        for mod in commit.modifications:
            if mod.new_path is not None and mod.new_path == commits[index].new_path:  # This must be changed
                commits_modified_file = gr.get_commits_modified_file(mod.new_path)
                for cmf in commits_modified_file:
                    commit_count += 1
                    c = gr.get_commit(cmf)
                    devs.append(c.author.email)
                    for m in c.modifications:
                        path = m.new_path if m.new_path is not None else m.old_path
                        if path.endswith(m.filename):
                            package = path[:-(len(m.filename) + 1)]
                            packages.add(package)
        return [commit_count, len(devs), len(set(devs)), len(packages)]
Ejemplo n.º 2
0
def ublame_cli(filename, patterns):
    filename = os.path.abspath(filename)
    repo_path = repo_path_for(filename)
    relative_filename = filename.split(repo_path)[-1].strip("/")
    repo = GitRepository(repo_path)

    for commit_hash in repo.get_commits_modified_file(relative_filename):
        commit = repo.get_commit(commit_hash)
        diff_commit(commit, patterns)
def transform(root_dir: str, source_dir: str, target_dir: str) -> None:
    print(f"Root: {root_dir}, Source: {source_dir}, Target: {target_dir}")
    gr = GitRepository(root_dir)

    commits = gr.get_commits_modified_file(f"{source_dir}/{POMUCKY_FILE_NAME}")

    stats = defaultdict(lambda: defaultdict(lambda: defaultdict(int))
                        )  # type: Dict[date, Dict[str, Dict[str, int]]]
    dates = set()
    pomucky = set()
    kraje = set()

    def extract_kraj(rec: Dict[str, Any]) -> str:
        if 'kraj' in rec:
            return rec['kraj']
        elif 'kraj_nuts_kod' in rec:
            # 2020-05-16
            return rec['kraj_nuts_kod']
        assert False, f"Unknown kraj in {rec}"

    def extract_pocet(rec: Dict[str, Any]) -> int:
        for k in ['pocet', 'mnozstvi']:
            if k in rec:
                return int(rec[k]) if rec[k] else 0
        assert False, f"Unknown pocet in {rec}"

    for commit in RepositoryMining(root_dir,
                                   only_commits=commits).traverse_commits():
        print(f"{commit.msg}: {commit}")
        for m in commit.modifications:
            if m.filename == POMUCKY_FILE_NAME:
                payload = json.loads(m.source_code)
                d = datetime.fromisoformat(payload['modified'])
                dates.add(d.date())
                for rec in payload['data']:
                    pomucky.add(rec['pomucka'])
                    kraj = extract_kraj(rec)
                    pocet = extract_pocet(rec)
                    kraje.add(kraj)
                    if pocet:
                        stats[d.date()][kraj][rec['pomucka']] = pocet

    last_date = sorted(dates)[-1]

    previous = defaultdict(
        lambda: defaultdict(int))  # type: Dict[str, Dict[str, int]]
    with open(f"{target_dir}/pomucky-simple.csv", mode="w") as fh:
        writer = csv.writer(fh)
        writer.writerow(["datum", "kraj", "pomucka", "pocet", "zmena"])
        for d in sorted(dates):
            for kraj in sorted(kraje):
                for pomucka in sorted(pomucky):
                    writer.writerow([
                        d,
                        kraj,
                        pomucka,
                        stats[d][kraj][pomucka],
                        stats[d][kraj][pomucka] - previous[kraj][pomucka],
                    ])
                    previous[kraj][pomucka] = stats[d][kraj][pomucka]

    with open(f"{target_dir}/pomucky-dates.csv", mode="w") as fh:
        writer = csv.writer(fh)
        writer.writerow(["pomucka", "kraj", "celkem"] +
                        [str(d) for d in sorted(dates)])
        for kraj in sorted(kraje):
            for pomucka in sorted(pomucky):
                writer.writerow(
                    [pomucka, kraj, stats[last_date][kraj][pomucka]] +
                    [stats[d][kraj][pomucka] for d in sorted(dates)])

    with open(f"{target_dir}/pomucky-kraje.csv", mode="w") as fh:
        writer = csv.writer(fh)
        writer.writerow(["datum", "pomucka"] + list(sorted(kraje)))
        for d in sorted(dates):
            for pomucka in sorted(pomucky):
                writer.writerow(
                    [d, pomucka] +
                    [stats[d][kraj][pomucka] for kraj in sorted(kraje)])
Ejemplo 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)
Ejemplo n.º 5
0
    parser.add_argument('translation', action='store', nargs=1, help='the column name for translation')
    parser.add_argument('repo', action='store', default='../', nargs='?', help='the path of repository')
    args = parser.parse_args()

    df = Translation(args.json_name[0]).get_dataframe()
    start_dropping = False
    for col in df.columns:
        if start_dropping:
            if col == args.translation[0]:
                old_translation = df[args.translation[0]]
            df.drop(columns=[col], inplace=True)
        elif col == args.original[0]:
            start_dropping = True

    gr = GitRepository('./')
    commits = gr.get_commits_modified_file(args.json_name[0])
    for commit in RepositoryMining('../', only_commits=commits).traverse_commits():
        for modification in commit.modifications:
            if (modification.filename == args.json_name[0]):
                date = commit.committer_date.strftime('%m-%d')
                author = commit.author.name
                print(date, author)

                source = modification.source_code
                try:
                    _df = pd.read_json(source)
                except BaseException:
                    print("WARNING: can't load")
                    continue

                new_translation = _df[args.translation[0]]