示例#1
0
文件: folder.py 项目: makkus/bring
    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
示例#2
0
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!')
示例#3
0
文件: git_repo.py 项目: makkus/bring
    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
示例#4
0
文件: views.py 项目: PqES/forkuptool
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',
            })