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)]
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)])
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)
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]]