---
# System prepended metadata

title: Recuperação de métricas - API GitHub

---

![Palavra "NuFuturo" com borda preta e fundo roxo](https://i.imgur.com/5QUYbd2.png)

# Recuperação de métricas - API GitHub

Esse documento tem como objetivo especificar métricas que podem ser utilizadas para medir o desempenho e trabalho dos alunos do projeto **NuFuturo** a partir de dados retirados das suas interações com os repositórios do GitHub do projeto.

## Métricas

As possíveis métricas definidas como alvo para as apresentações serão medidas de forma diária, semanal ou quinzenal (*sprint*) e estas são:

- *Commits* realizados;
- Arquivos alterados, criados ou apagados;
- Criação de *Pull Requests*;
- Review de *Pull Requests*.

## Soluções encontradas


- [Commits por contribuidor](#1-Commits-por-contribuidor)
- [Listagem de commits](#2-Listagem-de-commits)
- [Recuperação de *Pull requests*](#3-Recuperação-de-Pull-requests)
- [Recuperação de reviewers de *Pull requests*](#4-Recuperação-revisores-de-uma-Pull-request)

### **1. Commits por contribuidor**
[**Link documentação**](https://docs.github.com/en/rest/metrics/statistics?apiVersion=2022-11-28#get-all-contributor-commit-activity)

Rota que retorna o número de adições, exclusões e *commits* dividos em semanas para cada contribuidor do repositório desde a sua criação.

**Métricas recuperáveis:** 
- `Quantidade de commits por semana`;
- `Quantidade de commits por sprint`.

**Rota:** 
```javascript
GET /repos/{owner}/{repo}/stats/contributors
```

**Modelo de requisição:**

```bash
curl -L \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer <YOUR-GITHUB-TOKEN>"\
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/OWNER/REPO/stats/contributors
```

**Formato da resposta:** 
:warning: Destacando informações mais relevantes :warning:

```json
[
  {
    "total": <num-commits-geral>
    "weeks": [
      {
        "w": <Semana-no-formato-"Unix timestamp">,
        "a": <Número-de-adições-ao-repositório>,
        "d": <Número-de-deletes-ao-repositório>,
        "c": <Número-de-commits-naquela-semana>,
      }
    ]
    "author": {
      "login": <user-do-autor>,
      "id": id,
      "avatar_url": <url-do-avatar-do-autor>,
      ...
    }
  }
]
```

**Exemplo de resposta:**


:::info
**GET** */repos/nufuturo-ufcg/rodrigo.cavalcanti/stats/contributors*

```json
[
  {
    "total": 5,
    "weeks": [
      {
        "w": 1679788800,
        "a": 81,
        "d": 0,
        "c": 2
      },
      {
        "w": 1680393600,
        "a": 0,
        "d": 0,
        "c": 0
      },
      {
        "w": 1680998400,
        "a": 328,
        "d": 0,
        "c": 3
      },
      {
        "w": 1681603200,
        "a": 0,
        "d": 0,
        "c": 0
      }
    ],
    "author": {
      "login": "daltonserey",
      "id": 801394,
      "node_id": "MDQ6VXNlcjgwMTM5NA==",
      "avatar_url": "https://avatars.githubusercontent.com/u/801394?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/daltonserey",
      "html_url": "https://github.com/daltonserey",
      "followers_url": "https://api.github.com/users/daltonserey/followers",
      "following_url": "https://api.github.com/users/daltonserey/following{/other_user}",
      "gists_url": "https://api.github.com/users/daltonserey/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/daltonserey/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/daltonserey/subscriptions",
      "organizations_url": "https://api.github.com/users/daltonserey/orgs",
      "repos_url": "https://api.github.com/users/daltonserey/repos",
      "events_url": "https://api.github.com/users/daltonserey/events{/privacy}",
      "received_events_url": "https://api.github.com/users/daltonserey/received_events",
      "type": "User",
      "site_admin": false
    }
  },
  {
    "total": 20,
    "weeks": [
      {
        "w": 1679788800,
        "a": 0,
        "d": 0,
        "c": 0
      },
      {
        "w": 1680393600,
        "a": 24,
        "d": 4,
        "c": 4
      },
      {
        "w": 1680998400,
        "a": 182,
        "d": 30,
        "c": 16
      },
      {
        "w": 1681603200,
        "a": 0,
        "d": 0,
        "c": 0
      }
    ],
    "author": {
      "login": "RodrigoEC",
      "id": 42751604,
      "node_id": "MDQ6VXNlcjQyNzUxNjA0",
      "avatar_url": "https://avatars.githubusercontent.com/u/42751604?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/RodrigoEC",
      "html_url": "https://github.com/RodrigoEC",
      "followers_url": "https://api.github.com/users/RodrigoEC/followers",
      "following_url": "https://api.github.com/users/RodrigoEC/following{/other_user}",
      "gists_url": "https://api.github.com/users/RodrigoEC/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/RodrigoEC/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/RodrigoEC/subscriptions",
      "organizations_url": "https://api.github.com/users/RodrigoEC/orgs",
      "repos_url": "https://api.github.com/users/RodrigoEC/repos",
      "events_url": "https://api.github.com/users/RodrigoEC/events{/privacy}",
      "received_events_url": "https://api.github.com/users/RodrigoEC/received_events",
      "type": "User",
      "site_admin": false
    }
  }
]

```
:::

**Vantagens:**

- **Formato dos dados**. Retorna a quantidade de commits por semana, as adições e remoções exatamente da forma que queremos para a métrica de commits por semana ou sprint (duas semanas).
- **Informações divididas por contribuidor.** Tal formatação facilitará futuramente o recolhimento dessas informações para repositórios que tem mais de um contribuidor fixo.

**Desvantagens:**

- **Dados muito simples**. Não é possível, por exemplo, fazer a identificação de cada *commit*. Dessa forma, não temos como acessar mais informações sobre cada commit, como: dia que este foi feito ou quais arquivos foram modificados em cada arquivo.

### **2. Listagem de *commits*.**

[**Link documentação**](https://docs.github.com/en/rest/commits/commits?apiVersion=2022-11-28#list-commits)

Rota que lista informações referentes a cada commit feito no repositório, particionado-o em páginas de até cem *commits*.

**Métricas recuperáveis:** 
- `Quantidade de commits por dia`;
- `Quantidade de commits por semana`;
- `Quantidade de commits por sprint`;
- `Arquivos modificados, criados ou apagados`.

:warning: **OBS:** As métricas acima são recuperáveis quando utilizadas as rotas dos itens [2](#2-Listagem-de-commits) e [2.1](#21---Rota-de-recuperação-de-mais-informações-de-commit-específico) juntas.


**Rota**:
```javascript
GET /repos/{owner}/{repo}/commits?per_page=100&page=<page_num>
```

**Modelo de requisição:**

```bash
curl -L \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer <YOUR-GITHUB-TOKEN>"\
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/OWNER/REPO/commits
```

**Formato da resposta:** 

:warning: Destacando informações mais relevantes :warning:

```json
[
  {
    "sha": <identificador-do-commit>,
    "commit": {
      "committer": {
        "name": <nome-do-autor>,
        "date": <data-no-formato:-YYYY-MM-DDTHH:MM:SSZ>,
      },
    },
    "author": {
      "login": <user-do-autor>
    }
  }
]
```

**Exemplo de resposta:**

:::info
**GET** *https://api.github.com/repos/OpenDevUFCG/Tamburetei/commits*

```json
[
  {
    "sha": "7b154d4ca383b3de8d5a73de5af9d18d55a32a8a",
    "node_id": "C_kwDOCUR18toAKDdiMTU0ZDRjYTM4M2IzZGU4ZDVhNzNkZTVhZjlkMThkNTVhMzJhOGE",
    "commit": {
      "author": {
        "name": "Tarso Jabbes",
        "email": "60106453+tarsojabbes@users.noreply.github.com",
        "date": "2023-04-15T00:50:59Z"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2023-04-15T00:50:59Z"
      },
      "message": "Merge pull request #527 from RobertaFlx/conteudo\n\nadicionando resumo de SO sobre gerencia de memória",
      "tree": {
        "sha": "6fdee5515878dfc23fb944988e67e6bedbe668fa",
        "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/git/trees/6fdee5515878dfc23fb944988e67e6bedbe668fa"
      },
      "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/git/commits/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a",
      "comment_count": 0,
      "verification": {
        "verified": true,
        "reason": "valid",
        "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJkOfTzCRBK7hj4Ov3rIwAAIOYIACAgJutY9tmyu415YjyP1qNb\nWhfUYwAeWolf4zRt1Gi2yjE8NCe9Vt27igm+VmSjQCwCzlv8be4HgC3UaAuD37sW\nss01GggkZbtP1BjFdCzHbmnet73XYeTKmYWfTJuR1BKbgyGU+ocueQun6cnkrHj3\nSm94ifEywaIoL5QeSU2QipajsnS3+DBKeTC8PFiu1EiI2jhalIjpJ1xCnXQj+uJY\nkAL/StKeWeCy9E5XoMuCQM7KUdLH4uFlu0Bn9baa8PuRSrFl4ClTbGTCVF0R3J8l\ndFodE7LIR1UhOgptieqHW4lPdm0e1DEcLqQT9lmDsf/xwlXfBM62cquI5B1JIYM=\n=DHgg\n-----END PGP SIGNATURE-----\n",
        "payload": "tree 6fdee5515878dfc23fb944988e67e6bedbe668fa\nparent a2bd35f9172108430e89e3829a806518a7550f28\nparent e70ddd5bc03ee85fd16731c06fd0f2ec8e3861f0\nauthor Tarso Jabbes <60106453+tarsojabbes@users.noreply.github.com> 1681519859 -0300\ncommitter GitHub <noreply@github.com> 1681519859 -0300\n\nMerge pull request #527 from RobertaFlx/conteudo\n\nadicionando resumo de SO sobre gerencia de memória"
      }
    },
    "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/commits/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a",
    "html_url": "https://github.com/OpenDevUFCG/Tamburetei/commit/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a",
    "comments_url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/commits/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a/comments",
    "author": {
      "login": "tarsojabbes",
      "id": 60106453,
      "node_id": "MDQ6VXNlcjYwMTA2NDUz",
      "avatar_url": "https://avatars.githubusercontent.com/u/60106453?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/tarsojabbes",
      "html_url": "https://github.com/tarsojabbes",
      "followers_url": "https://api.github.com/users/tarsojabbes/followers",
      "following_url": "https://api.github.com/users/tarsojabbes/following{/other_user}",
      "gists_url": "https://api.github.com/users/tarsojabbes/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/tarsojabbes/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/tarsojabbes/subscriptions",
      "organizations_url": "https://api.github.com/users/tarsojabbes/orgs",
      "repos_url": "https://api.github.com/users/tarsojabbes/repos",
      "events_url": "https://api.github.com/users/tarsojabbes/events{/privacy}",
      "received_events_url": "https://api.github.com/users/tarsojabbes/received_events",
      "type": "User",
      "site_admin": false
    },
    "committer": {
      "login": "web-flow",
      "id": 19864447,
      "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
      "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/web-flow",
      "html_url": "https://github.com/web-flow",
      "followers_url": "https://api.github.com/users/web-flow/followers",
      "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
      "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
      "organizations_url": "https://api.github.com/users/web-flow/orgs",
      "repos_url": "https://api.github.com/users/web-flow/repos",
      "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
      "received_events_url": "https://api.github.com/users/web-flow/received_events",
      "type": "User",
      "site_admin": false
    },
    "parents": [
      {
        "sha": "a2bd35f9172108430e89e3829a806518a7550f28",
        "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/commits/a2bd35f9172108430e89e3829a806518a7550f28",
        "html_url": "https://github.com/OpenDevUFCG/Tamburetei/commit/a2bd35f9172108430e89e3829a806518a7550f28"
      },
      {
        "sha": "e70ddd5bc03ee85fd16731c06fd0f2ec8e3861f0",
        "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/commits/e70ddd5bc03ee85fd16731c06fd0f2ec8e3861f0",
        "html_url": "https://github.com/OpenDevUFCG/Tamburetei/commit/e70ddd5bc03ee85fd16731c06fd0f2ec8e3861f0"
      }
    ]
  },
...
```
:::

#### **2.1 - Rota de recuperação de mais informações de commit específico**

[**Link da documentação**](https://docs.github.com/en/rest/commits/commits?apiVersion=2022-11-28#get-a-commit)

```javascript
GET /repos/{owner}/{repo}/commits/commitId
```

**Corpo da resposta:**
```json
{
  "stats": {
    "total:" <num-total-modificacoes>,
    "additions:" <num-adicoes>,
    "deletions:" <num-deletes>
  },
  "files": [
      {
        "filename": <nome-do-arquivo>,
        "status": "added" | "deleted" | "modified",
        "additions": <adicoes-no-arquivo>,
        "deletions": <deletes-no-arquivo>,
        "changes": <total-modificacoes>,
      }
  ]
}
```

**Exemplo de resposta:**

:::info
**GET** *https://api.github.com/repos/OpenDevUFCG/Tamburetei/commits/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a*

```json
{
  "sha": "7b154d4ca383b3de8d5a73de5af9d18d55a32a8a",
  "node_id": "C_kwDOCUR18toAKDdiMTU0ZDRjYTM4M2IzZGU4ZDVhNzNkZTVhZjlkMThkNTVhMzJhOGE",
  "commit": {
    "author": {
      "name": "Tarso Jabbes",
      "email": "60106453+tarsojabbes@users.noreply.github.com",
      "date": "2023-04-15T00:50:59Z"
    },
    "committer": {
      "name": "GitHub",
      "email": "noreply@github.com",
      "date": "2023-04-15T00:50:59Z"
    },
    "message": "Merge pull request #527 from RobertaFlx/conteudo\n\nadicionando resumo de SO sobre gerencia de memória",
    "tree": {
      "sha": "6fdee5515878dfc23fb944988e67e6bedbe668fa",
      "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/git/trees/6fdee5515878dfc23fb944988e67e6bedbe668fa"
    },
    "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/git/commits/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a",
    "comment_count": 0,
    "verification": {
      "verified": true,
      "reason": "valid",
      "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJkOfTzCRBK7hj4Ov3rIwAAIOYIACAgJutY9tmyu415YjyP1qNb\nWhfUYwAeWolf4zRt1Gi2yjE8NCe9Vt27igm+VmSjQCwCzlv8be4HgC3UaAuD37sW\nss01GggkZbtP1BjFdCzHbmnet73XYeTKmYWfTJuR1BKbgyGU+ocueQun6cnkrHj3\nSm94ifEywaIoL5QeSU2QipajsnS3+DBKeTC8PFiu1EiI2jhalIjpJ1xCnXQj+uJY\nkAL/StKeWeCy9E5XoMuCQM7KUdLH4uFlu0Bn9baa8PuRSrFl4ClTbGTCVF0R3J8l\ndFodE7LIR1UhOgptieqHW4lPdm0e1DEcLqQT9lmDsf/xwlXfBM62cquI5B1JIYM=\n=DHgg\n-----END PGP SIGNATURE-----\n",
      "payload": "tree 6fdee5515878dfc23fb944988e67e6bedbe668fa\nparent a2bd35f9172108430e89e3829a806518a7550f28\nparent e70ddd5bc03ee85fd16731c06fd0f2ec8e3861f0\nauthor Tarso Jabbes <60106453+tarsojabbes@users.noreply.github.com> 1681519859 -0300\ncommitter GitHub <noreply@github.com> 1681519859 -0300\n\nMerge pull request #527 from RobertaFlx/conteudo\n\nadicionando resumo de SO sobre gerencia de memória"
    }
  },
  "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/commits/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a",
  "html_url": "https://github.com/OpenDevUFCG/Tamburetei/commit/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a",
  "comments_url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/commits/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a/comments",
  "author": {
    "login": "tarsojabbes",
    "id": 60106453,
    "node_id": "MDQ6VXNlcjYwMTA2NDUz",
    "avatar_url": "https://avatars.githubusercontent.com/u/60106453?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/tarsojabbes",
    "html_url": "https://github.com/tarsojabbes",
    "followers_url": "https://api.github.com/users/tarsojabbes/followers",
    "following_url": "https://api.github.com/users/tarsojabbes/following{/other_user}",
    "gists_url": "https://api.github.com/users/tarsojabbes/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/tarsojabbes/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/tarsojabbes/subscriptions",
    "organizations_url": "https://api.github.com/users/tarsojabbes/orgs",
    "repos_url": "https://api.github.com/users/tarsojabbes/repos",
    "events_url": "https://api.github.com/users/tarsojabbes/events{/privacy}",
    "received_events_url": "https://api.github.com/users/tarsojabbes/received_events",
    "type": "User",
    "site_admin": false
  },
  "committer": {
    "login": "web-flow",
    "id": 19864447,
    "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
    "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/web-flow",
    "html_url": "https://github.com/web-flow",
    "followers_url": "https://api.github.com/users/web-flow/followers",
    "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
    "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
    "organizations_url": "https://api.github.com/users/web-flow/orgs",
    "repos_url": "https://api.github.com/users/web-flow/repos",
    "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
    "received_events_url": "https://api.github.com/users/web-flow/received_events",
    "type": "User",
    "site_admin": false
  },
  "parents": [
    {
      "sha": "a2bd35f9172108430e89e3829a806518a7550f28",
      "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/commits/a2bd35f9172108430e89e3829a806518a7550f28",
      "html_url": "https://github.com/OpenDevUFCG/Tamburetei/commit/a2bd35f9172108430e89e3829a806518a7550f28"
    },
    {
      "sha": "e70ddd5bc03ee85fd16731c06fd0f2ec8e3861f0",
      "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/commits/e70ddd5bc03ee85fd16731c06fd0f2ec8e3861f0",
      "html_url": "https://github.com/OpenDevUFCG/Tamburetei/commit/e70ddd5bc03ee85fd16731c06fd0f2ec8e3861f0"
    }
  ],
  "stats": {
    "total": 77,
    "additions": 77,
    "deletions": 0
  },
  "files": [
    {
      "sha": "e142410608de9e4dea6456ce15437151057d5b50",
      "filename": "so/resumos/README.md",
      "status": "modified",
      "additions": 1,
      "deletions": 0,
      "changes": 1,
      "blob_url": "https://github.com/OpenDevUFCG/Tamburetei/blob/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a/so%2Fresumos%2FREADME.md",
      "raw_url": "https://github.com/OpenDevUFCG/Tamburetei/raw/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a/so%2Fresumos%2FREADME.md",
      "contents_url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/contents/so%2Fresumos%2FREADME.md?ref=7b154d4ca383b3de8d5a73de5af9d18d55a32a8a",
      "patch": "@@ -5,6 +5,7 @@ title: Resumos\n - [Aula Introdutória](aula1_revisao.md)\n - [1° Estágio](primeiro_estagio.md)\n - [Condição de Corrida](condicaoDeCorrida.md)\n+- [Gerência de Memoria](gerenciaDeMemoria.md) \n - [2º Estágio](segundo_estagio.md)\n - [3º Estágio](terceiro_estagio.md)\n - [Resumo Parcial Livro](resumoLivroSistemasOperacionaisModernos.md)"
    },
    {
      "sha": "1b053a53510bd3108c939b88e58f5b82c836d4db",
      "filename": "so/resumos/gerenciaDeMemoria.md",
      "status": "added",
      "additions": 76,
      "deletions": 0,
      "changes": 76,
      "blob_url": "https://github.com/OpenDevUFCG/Tamburetei/blob/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a/so%2Fresumos%2FgerenciaDeMemoria.md",
      "raw_url": "https://github.com/OpenDevUFCG/Tamburetei/raw/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a/so%2Fresumos%2FgerenciaDeMemoria.md",
      "contents_url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/contents/so%2Fresumos%2FgerenciaDeMemoria.md?ref=7b154d4ca383b3de8d5a73de5af9d18d55a32a8a",
      "patch": "@@ -0,0 +1,76 @@\n+---\n+title: Resumo de Gerência de Memória\n+---\n+\n+## Introdução\n+\n+Funções do gerente de memória:\n+  a. Alocação de memória: definir quais pedaços da memória vai ser ocupado pelo SO e por cada um dos processos que precisam ser executados.\n+  b. Programar a CPU para relocação de endereços.\n+  c. Programar a CPU para proteger a memória.\n+\n+O processo é criado a partir do arquivo executável. Esse arquivo executável na realidade só preciso armazenar o código e os dados iniciados, todo o restante(dados não iniciados, monte e pilha) só precisam existir na hora que o processo começa a executar, portanto, eu só preciso saber o tamanho dessas áreas de memória e essa informação é guardada no cabeçalho. Dessa forma, quando o executável é executado a imagem do processo pode ser recriada a partir do executável.\n+   \n+mais especificamente, como o compilador gera endereços nesse código que vão acessar as variáveis que estão armazenadas em dados, monte e pilha?\n+  a. Em relação à pilha, é muito simples porque o endereço é sempre uma referência a partir do apontador do stack pointer que aponta para o topo da pilha.\n+  b. Por outro lado, o monte e os dados iniciados precisam ser acessados com seus endereços, esses endereços são calculados de acordo como as áreas de memória são alocadas para armazenar essas variáveis.\n+\n+O compilador gera endereços a partir de um espaço de endereçamento lógico, ou seja, o compilador cria uma abstração, que é esse espaço de endereçamento lógico, assumindo que o programa vai ser carregado no endereço zero e vai até o tamanho T.\n+\n+As instruções armazenadas na memória contêm endereços lógicos, para acessar a localização correta, os endereços lógicos precisam ser relocados nos endereços físicos correspondentes, para que isso aconteça, o SO precisa configurar ou programar a CPU de forma adequada.\n+\n+Além disso, o SO também precisa configurar ou programar a CPU de forma adequada para proteger a memória, de modo que de nenhuma maneira seja referenciada uma área que está fora do processo em questão, podendo pertencer a outro processo ou até mesmo ao SO.\n+\n+## Gerência de memória sem virtualização\n+\n+Os primeiros modelos de gerência de memória não tinham virtualização e seguiam as seguintes premissas: todo o processo é carregado na memória e o processo é carregado de forma contígua na memória. Nesse caso a alocação de memória era feita em partições fixas, onde a RAM era dividida em partes iguais e cada processo poderia usar uma partição.\n+\n+Um dos problemas desse tipo de estratégia de alocação, é a ocorrência de fragmentação interna, ou seja, pedaços da memória que estão livres mas não podem ser alocados a um outro processo. Quanto mais processos eu tiver na memória, menos chance da CPU ficar ociosa.\n+\n+As partições dinâmicas oferecem uma maneira mais eficiente de usar a memória mas não estão imunes a fragmentação da memória, nesse caso, ocorrem as fragmentações externas, que por sua vez, são tamanhos muito pequenos de memória que não podem ser aproveitados por outros processos.\n+\n+Uma alternativa seria alocar o processo sempre na maior área de memória disponível, isso vai fazer com que os fragmentos sejam os maiores possível, minimizando as chances de fragmentação externa.\n+\n+Em relação aos endereços lógicos e sua relocação, os endereços lógicos são somados ao registrador base, essa soma será seu endereço físico.\n+\n+Em relação à proteção da memória:\n+  a. Existirá sempre um registrador base e um registrador limite para delimitar onde começa e onde termina cada processo.\n+  b. Endereços físicos são verificados antes de acessar a memória.\n+  c. Endereços físicos devem ser maiores que o valor do registrador base e menores que o valor do registrador limite.\n+  d. Se o endereço físico cai fora dessa faixa, uma exceção é lançada.\n+\n+## Swapping e Memória Virtual\n+\n+Se o espaço arbitrado não for suficientemente grande o processo não vai conseguir executar, idealmente o SO deve tomar atitude para crescer o processo.\n+\n+Como o sistema operacional descobre que o processo precisa crescer?\n+  a. O monte cresce(ou diminui) em resposta a uma chamada ao sistema.\n+  b. A pilha cresce quando uma nova função é chamada, se o topo da pilha ultrapassa o valor do registrador limite, será lançada uma exceção.  \n+  \n+![Swapping](imagens/swap.png)\n+\n+No caso do processo A, basta mudar na tabela de processo o tamanho do processo, mas no caso do processo C é necessário swap out, seguido de swap in.\n+\n+O swap é usar uma área do disco para armazenar um processo e depois trazer esse processo para a memória, quando um processo precisa crescer e não existe espaço livre suficiente na memória, ele é movido para o disco e lá é alterado seu tamanho, o mesmo processo só será movido de volta à memória quando um espaço igual ou maior ao seu novo tamanho estive livre. Um processo que está momentaneamente armazenado no disco não pode executar.\n+\n+O swap out é o alocamento temporário de um ou mais processos no disco, por sua vez, o swap in é o alocamento de um ou mais processos que estavam no disco para a memória.\n+\n+O swapper, primeiro tenta fazer swap in de processos.\n+  a. Processos prontos para rodar.\n+  b. Mais prioritários.\n+  c. Processos menores.\n+\n+Se existe um processo pronto para rodar no disco e não há espaço na memória, tenta fazer swap out.\n+  a. Processos bloqueados.\n+  b. Processos maiores.\n+\n+A ideia de memória virtual estende a ideia de swap no sentido de que também permite o aumento do grau de multiprogramação à medida que mais processos podem ser carregados na memória. Só as partes dos processos que são efetivamente necessárias para que eles sejam executados vão ser carregados na memória física, todo resto do processo fica residente no disco(memória virtual).\n+\n+Benefícios:\n+  a. Mais processos podem ser carregados na memória ao mesmo tempo.\n+  b. Processos podem ser maiores que a memória física.\n+\n+Desafios para implementação de memória virtual:\n+  a. Alocação de memória(Que pedaços do processo devem estar na memória e onde esses pedaços são alocados na memória?)\n+  b. Um processo poderá ter vários “fragmentos” do seu espaço de endereçamento lógico carregados na memória(Como fazer relocação de endereços lógicos e como proteger a memória?)\n+"
    },
    {
      "sha": "6e48f81565664a3877ddd410a38578b7a72be52c",
      "filename": "so/resumos/imagens/swap.png",
      "status": "added",
      "additions": 0,
      "deletions": 0,
      "changes": 0,
      "blob_url": "https://github.com/OpenDevUFCG/Tamburetei/blob/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a/so%2Fresumos%2Fimagens%2Fswap.png",
      "raw_url": "https://github.com/OpenDevUFCG/Tamburetei/raw/7b154d4ca383b3de8d5a73de5af9d18d55a32a8a/so%2Fresumos%2Fimagens%2Fswap.png",
      "contents_url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/contents/so%2Fresumos%2Fimagens%2Fswap.png?ref=7b154d4ca383b3de8d5a73de5af9d18d55a32a8a"
    }
  ]
}
```
:::


**Vantagens:**

- **Quantidade de dados**. Essa rota retorna uma número bem maior de dados relacionados a cada *commit*, sendo possível fazer uma análise individual para cada um.
- **Commit por dia**. Com essa rota e a [rota de recuperação de informações do commit](#2.1---Rota-de-recuperação-de-mais-informações-de-commit-específico) é possível fazer a análise de commits de forma diária. Por extensão, tambem é possível fazer o agrupamento de *commits* por semana e consequentemente por mês.
- **Recuperação de arquivos modificados.** Com o auxílio da rota citada acima é possível fazer a recuperação de informações relacionados aos arquivos que foram modificados, criados ou apagados.
    
**Desvantagens:**

- **Dados desconcentrados.** Para conseguir fazer a análise dos dados é necessário para cada commit listado fazer uma requisição para a [rota de recuperação de informações do commit](#2.1---Rota-de-recuperação-de-mais-informações-de-commit-específico) a fim de recuperar mais informações. Todavia, acredito que não exista outra opção.
- **Complexidade.** Será necessária uma maior manipulação dos dados para agrupa-los e recupera-los.

### 3. Recuperação de *Pull requests*

[**Link da documentação**](https://docs.github.com/en/rest/pulls/pulls?apiVersion=2022-11-28#list-pull-requests)

Rota que lista os *Pull Requests* feitos em determinado repositório, sendo possível determinar a autoria e a data que este foram abertos.

**Métricas recuperáveis:**
- `Pull requests criados`.

**Rota**:
```javascript
GET /repos/{owner}/{repo}/pulls
```

**Modelo de requisição:**

```bash
curl -L \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer <YOUR-GITHUB-TOKEN>"\
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/OWNER/REPO/pulls
```

**Formato da resposta:** 

:warning: Destacando informações mais relevantes :warning:

```json
[
  {
    "id": <identificador-da-PR>,
    "number": <numero-da-PR>,
    "user": {
      "login": <user-do-criador-da-PR>
    }
    "created_at": <data-de-criacao>,
  }
]
```

**Exemplo de resposta:**

:::info
**GET** *https://api.github.com/repos/OpenDevUFCG/Tamburetei/pulls?state=all*

```json
[
  {
    "url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/pulls/573",
    "id": 1260849871,
    "node_id": "PR_kwDOCUR18s5LJwrP",
    "html_url": "https://github.com/OpenDevUFCG/Tamburetei/pull/573",
    "diff_url": "https://github.com/OpenDevUFCG/Tamburetei/pull/573.diff",
    "patch_url": "https://github.com/OpenDevUFCG/Tamburetei/pull/573.patch",
    "issue_url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/issues/573",
    "number": 573,
    "state": "open",
    "locked": false,
    "title": "Adicionando provas 2022.1 de concorrente",
    "user": {
      "login": "raissonsouto",
      "id": 51547472,
      "node_id": "MDQ6VXNlcjUxNTQ3NDcy",
      "avatar_url": "https://avatars.githubusercontent.com/u/51547472?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/raissonsouto",
      "html_url": "https://github.com/raissonsouto",
      "followers_url": "https://api.github.com/users/raissonsouto/followers",
      "following_url": "https://api.github.com/users/raissonsouto/following{/other_user}",
      "gists_url": "https://api.github.com/users/raissonsouto/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/raissonsouto/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/raissonsouto/subscriptions",
      "organizations_url": "https://api.github.com/users/raissonsouto/orgs",
      "repos_url": "https://api.github.com/users/raissonsouto/repos",
      "events_url": "https://api.github.com/users/raissonsouto/events{/privacy}",
      "received_events_url": "https://api.github.com/users/raissonsouto/received_events",
      "type": "User",
      "site_admin": false
    },
    "body": null,
    "created_at": "2023-03-02T17:56:43Z",
    "updated_at": "2023-03-02T17:56:43Z",
    "closed_at": null,
    "merged_at": null,
    "merge_commit_sha": "a3b8474bf6bf8cb61a12ae79abcf15dde64a039a",
    "assignee": null,
    "assignees": [

    ],
...
```
:::

**Vantagens:**

- **Recuperação dos PRs feitas**: Única rota na API que permite a recuperação da quantidade de *Pull Requests* feitos.

**Desvatagens:**

- Não acho que ela tenha nenhuma desvantagem.

### 4. Recuperação revisores de uma *Pull request*

Rota que lista os revisares de uma *Pull Request*. Essa métrica é interessante para evidenciar que não é apenas com código que um desenvolvedor pode contribuir com um projeto, pelo contrário, muito do trabalho está no tempo de revisão de código.

[**Link da documentação**](https://docs.github.com/en/rest/pulls/reviews?apiVersion=2022-11-28#list-reviews-for-a-pull-request)

**Métricas recuperáveis:** `Pull requests criados`.

:warning: OBS: As métricas acima são recuperáveis quando utilizadas as rotas dos itens [2](#2-Listagem-de-commits) e [2.1](#21---Rota-de-recuperação-de-mais-informações-de-commit-específico) juntas.


**Rota**:
```javascript
GET /repos/{owner}/{repo}/pulls/{numero-pull-request}/reviews
```

**Modelo de requisição:**

```bash
curl -L \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer <YOUR-GITHUB-TOKEN>"\
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/OWNER/REPO/pulls/PULL_NUMBER/reviews
```

**Formato da resposta:** 

:warning: Destacando informações mais relevantes :warning:

```json
[
  {
    "user": {
      "login": <user-do-revisor>
    }
    "submitted_at": <data-de-submissao-da-revisao>,
  }
]
```

**Exemplo de resposta:**

:::info
**GET** *https://api.github.com/repos/OpenDevUFCG/Tamburetei/pulls/572/reviews*

```json
[
  {
    "id": 1346897594,
    "node_id": "PRR_kwDOCUR18s5QSAa6",
    "user": {
      "login": "RaylaMedeiros",
      "id": 14130609,
      "node_id": "MDQ6VXNlcjE0MTMwNjA5",
      "avatar_url": "https://avatars.githubusercontent.com/u/14130609?u=9b7784d0bd6b65627a36585f99bd34d914a59567&v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/RaylaMedeiros",
      "html_url": "https://github.com/RaylaMedeiros",
      "followers_url": "https://api.github.com/users/RaylaMedeiros/followers",
      "following_url": "https://api.github.com/users/RaylaMedeiros/following{/other_user}",
      "gists_url": "https://api.github.com/users/RaylaMedeiros/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/RaylaMedeiros/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/RaylaMedeiros/subscriptions",
      "organizations_url": "https://api.github.com/users/RaylaMedeiros/orgs",
      "repos_url": "https://api.github.com/users/RaylaMedeiros/repos",
      "events_url": "https://api.github.com/users/RaylaMedeiros/events{/privacy}",
      "received_events_url": "https://api.github.com/users/RaylaMedeiros/received_events",
      "type": "User",
      "site_admin": false
    },
    "body": "",
    "state": "APPROVED",
    "html_url": "https://github.com/OpenDevUFCG/Tamburetei/pull/572#pullrequestreview-1346897594",
    "pull_request_url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/pulls/572",
    "author_association": "NONE",
    "_links": {
      "html": {
        "href": "https://github.com/OpenDevUFCG/Tamburetei/pull/572#pullrequestreview-1346897594"
      },
      "pull_request": {
        "href": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/pulls/572"
      }
    },
    "submitted_at": "2023-03-18T03:08:33Z",
    "commit_id": "0abdd1d7232189ea88853cb9d38eb91f19195527"
  },
  {
    "id": 1379352058,
    "node_id": "PRR_kwDOCUR18s5SNz36",
    "user": {
      "login": "tarsojabbes",
      "id": 60106453,
      "node_id": "MDQ6VXNlcjYwMTA2NDUz",
      "avatar_url": "https://avatars.githubusercontent.com/u/60106453?u=a25b20c4e8a17e6457a3ada344379877c52afe3a&v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/tarsojabbes",
      "html_url": "https://github.com/tarsojabbes",
      "followers_url": "https://api.github.com/users/tarsojabbes/followers",
      "following_url": "https://api.github.com/users/tarsojabbes/following{/other_user}",
      "gists_url": "https://api.github.com/users/tarsojabbes/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/tarsojabbes/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/tarsojabbes/subscriptions",
      "organizations_url": "https://api.github.com/users/tarsojabbes/orgs",
      "repos_url": "https://api.github.com/users/tarsojabbes/repos",
      "events_url": "https://api.github.com/users/tarsojabbes/events{/privacy}",
      "received_events_url": "https://api.github.com/users/tarsojabbes/received_events",
      "type": "User",
      "site_admin": false
    },
    "body": "",
    "state": "APPROVED",
    "html_url": "https://github.com/OpenDevUFCG/Tamburetei/pull/572#pullrequestreview-1379352058",
    "pull_request_url": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/pulls/572",
    "author_association": "MEMBER",
    "_links": {
      "html": {
        "href": "https://github.com/OpenDevUFCG/Tamburetei/pull/572#pullrequestreview-1379352058"
      },
      "pull_request": {
        "href": "https://api.github.com/repos/OpenDevUFCG/Tamburetei/pulls/572"
      }
    },
    "submitted_at": "2023-04-11T14:08:11Z",
    "commit_id": "0abdd1d7232189ea88853cb9d38eb91f19195527"
  }
]
```
:::

**Vantagens:**

- Possibilidade de atribuir valor de trabalho às revisões de código.

**Desvatagens:**

- Não acho que ela tenha nenhuma desvantagem.
