diff --git a/src/main/java/br/com/jadson/snooper/github/data/commit/GitHubCommitInfo.java b/src/main/java/br/com/jadson/snooper/github/data/commit/GitHubCommitInfo.java index b41bc87..198734e 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/commit/GitHubCommitInfo.java +++ b/src/main/java/br/com/jadson/snooper/github/data/commit/GitHubCommitInfo.java @@ -50,5 +50,7 @@ public class GitHubCommitInfo { public Author author; public Committer committer; public List parents; + public List files; + public GitHubCommitInfo() {} } diff --git a/src/main/java/br/com/jadson/snooper/github/data/commit/GitHubFileChanged.java b/src/main/java/br/com/jadson/snooper/github/data/commit/GitHubFileChanged.java new file mode 100644 index 0000000..74c6ade --- /dev/null +++ b/src/main/java/br/com/jadson/snooper/github/data/commit/GitHubFileChanged.java @@ -0,0 +1,16 @@ +package br.com.jadson.snooper.github.data.commit; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * Information about a file changed in a GitHub commit. + * + * Luisa Ferreira - luisaferreirass08@gmail.com + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class GitHubFileChanged { + public String filename; + public int additions; + public int deletions; + public int changes; +} diff --git a/src/main/java/br/com/jadson/snooper/github/data/repo/GitHubTreeInfo.java b/src/main/java/br/com/jadson/snooper/github/data/repo/GitHubTreeInfo.java new file mode 100644 index 0000000..bfecd1a --- /dev/null +++ b/src/main/java/br/com/jadson/snooper/github/data/repo/GitHubTreeInfo.java @@ -0,0 +1,25 @@ +package br.com.jadson.snooper.github.data.repo; + +import java.util.List; + +/** + * Information about the file tree of a GitHub repository. + * + * Luisa Ferreira - luisaferreirass08@gmail.com + */ +public class GitHubTreeInfo { + public String sha; + public List tree; + + /** + * Information about an item in the GitHub repository tree. + * It can represent either a file or a directory. + * + * Luisa Ferreira - luisaferreirass08@gmail.com + */ + public static class GitHubTreeItem { + public String path; + public String type; // "blob" = arquivo, "tree" = diretório + public long size; + } +} diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/CommitStats.java b/src/main/java/br/com/jadson/snooper/github/data/stats/GitHubCommitStats.java similarity index 62% rename from src/main/java/br/com/jadson/snooper/github/data/stats/CommitStats.java rename to src/main/java/br/com/jadson/snooper/github/data/stats/GitHubCommitStats.java index 84c623a..ea2a671 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/CommitStats.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/GitHubCommitStats.java @@ -2,8 +2,13 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +/** + * Statistics of changes made in a GitHub commit. + * + * Luisa Ferreira - luisaferreirass08@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) -public class CommitStats { +public class GitHubCommitStats { public int additions; public int deletions; public int total; diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/GitHubCommitStatsInfo.java b/src/main/java/br/com/jadson/snooper/github/data/stats/GitHubCommitStatsInfo.java index 9808801..e594798 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/GitHubCommitStatsInfo.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/GitHubCommitStatsInfo.java @@ -2,6 +2,11 @@ import java.util.Date; +/** + * Detailed information and statistics of a commit in GitHub API. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ public class GitHubCommitStatsInfo { public String sha; public String nodeId; @@ -16,6 +21,6 @@ public class GitHubCommitStatsInfo { public String committerLogin; public Date committerDate; public String message; - public CommitStats commitStats; + public GitHubCommitStats gitHubCommitStats; public int changedFiles; } \ No newline at end of file diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/GitHubFileStats.java b/src/main/java/br/com/jadson/snooper/github/data/stats/GitHubFileStats.java new file mode 100644 index 0000000..149f48e --- /dev/null +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/GitHubFileStats.java @@ -0,0 +1,14 @@ +package br.com.jadson.snooper.github.data.stats; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * Churn (number of commits) information of a file in a GitHub repository. + * + * Luisa Ferreira - luisaferreirass08@gmail.com + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class GitHubFileStats { + public String path; + public int churn; +} diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Comments.java b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Comments.java index 8329225..cdabd21 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Comments.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Comments.java @@ -2,6 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +/** + * Comments information of a GitHub commit returned by the GraphQL API. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) public class Comments { public int totalCount; diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/CommitStatsNode.java b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/CommitStatsNode.java index d81be2d..ab16e8f 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/CommitStatsNode.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/CommitStatsNode.java @@ -2,7 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; - +/** + * Information about a commit node returned by the GitHub GraphQL API. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) public class CommitStatsNode { public String oid; diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Data.java b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Data.java index 9224e90..cbe0d2f 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Data.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Data.java @@ -2,7 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - +/** + * Data object returned by the GitHub GraphQL API response. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) public class Data { public Repository repository; diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/DefaultBranchRef.java b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/DefaultBranchRef.java index 0d0bbff..1ad3eb1 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/DefaultBranchRef.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/DefaultBranchRef.java @@ -2,6 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +/** + * Default branch reference returned by the GitHub GraphQL API response. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) public class DefaultBranchRef { public Target target; diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/GitActor.java b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/GitActor.java index 4f04153..0d261aa 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/GitActor.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/GitActor.java @@ -3,6 +3,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import java.util.Date; +/** + * Information about the author or committer of a GitHub commit. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) public class GitActor { public User user; diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/GraphQLCommitResponse.java b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/GraphQLCommitResponse.java index fb49811..98a48be 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/GraphQLCommitResponse.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/GraphQLCommitResponse.java @@ -2,6 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +/** + * Root response returned by the GitHub GraphQL API. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) public class GraphQLCommitResponse { public Data data; diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/History.java b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/History.java index 8f28ba3..d031494 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/History.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/History.java @@ -4,8 +4,15 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import java.util.List; + +/** + * Commit history returned by the GitHub GraphQL API. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) public class History { public PageInfo pageInfo; public List nodes; + public int totalCount; } \ No newline at end of file diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Repository.java b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Repository.java index 9ab81a6..477b3de 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Repository.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Repository.java @@ -2,6 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +/** + * Repository information returned by the GitHub GraphQL API. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) public class Repository { public DefaultBranchRef defaultBranchRef; diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Target.java b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Target.java index 4699b74..7a0f351 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Target.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/Target.java @@ -2,6 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +/** + * Target object returned by the GitHub GraphQL API. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) public class Target { public History history; diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/User.java b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/User.java index 7c934c8..2cf91ab 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/User.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/graphql/User.java @@ -3,6 +3,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +/** + * GitHub user information returned by the GitHub GraphQL API. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ @JsonIgnoreProperties(ignoreUnknown = true) public class User { public String url; diff --git a/src/main/java/br/com/jadson/snooper/github/data/stats/mapper/GitHubCommitStatsMapper.java b/src/main/java/br/com/jadson/snooper/github/data/stats/mapper/GitHubCommitStatsMapper.java index f6c90c7..0d2acd5 100644 --- a/src/main/java/br/com/jadson/snooper/github/data/stats/mapper/GitHubCommitStatsMapper.java +++ b/src/main/java/br/com/jadson/snooper/github/data/stats/mapper/GitHubCommitStatsMapper.java @@ -1,15 +1,21 @@ package br.com.jadson.snooper.github.data.stats.mapper; -import br.com.jadson.snooper.github.data.stats.CommitStats; +import br.com.jadson.snooper.github.data.stats.GitHubCommitStats; import br.com.jadson.snooper.github.data.stats.GitHubCommitStatsInfo; import br.com.jadson.snooper.github.data.stats.graphql.CommitStatsNode; +/** + * Mapper responsible for converting GitHub GraphQL commit statistics + * into internal commit statistics information. + * + * Yuri Filgueira - yurimedeiros141@gmail.com + */ public class GitHubCommitStatsMapper { public static GitHubCommitStatsInfo mapToCommitStatsInfo(CommitStatsNode node) { GitHubCommitStatsInfo commitStatsInfo = new GitHubCommitStatsInfo(); - CommitStats commitStats = new CommitStats(); + GitHubCommitStats gitHubCommitStats = new GitHubCommitStats(); commitStatsInfo.sha = node.oid; commitStatsInfo.nodeId = node.id; @@ -17,11 +23,11 @@ public static GitHubCommitStatsInfo mapToCommitStatsInfo(CommitStatsNode node) { commitStatsInfo.commentCount = node.comments.totalCount; commitStatsInfo.message = node.message; - commitStats.additions = node.additions; - commitStats.deletions = node.deletions; - commitStats.total = (node.additions + node.deletions); + gitHubCommitStats.additions = node.additions; + gitHubCommitStats.deletions = node.deletions; + gitHubCommitStats.total = (node.additions + node.deletions); - commitStatsInfo.commitStats = commitStats; + commitStatsInfo.gitHubCommitStats = gitHubCommitStats; commitStatsInfo.changedFiles = node.changedFiles; if (node.author != null) { diff --git a/src/main/java/br/com/jadson/snooper/github/operations/CommitQueryExecutor.java b/src/main/java/br/com/jadson/snooper/github/operations/CommitQueryExecutor.java index 8aa067b..23cb09e 100644 --- a/src/main/java/br/com/jadson/snooper/github/operations/CommitQueryExecutor.java +++ b/src/main/java/br/com/jadson/snooper/github/operations/CommitQueryExecutor.java @@ -34,8 +34,9 @@ import br.com.jadson.snooper.github.data.association.graphql.AssociatedPullRequestsEdge; import br.com.jadson.snooper.github.data.association.graphql.CommitNode; import br.com.jadson.snooper.github.data.association.graphql.ResultGraphQLRepository; +import br.com.jadson.snooper.github.data.commit.GitHubFileChanged; import br.com.jadson.snooper.github.data.commit.GitHubCommitInfo; -import br.com.jadson.snooper.github.data.stats.CommitStats; +import br.com.jadson.snooper.github.data.stats.GitHubFileStats; import br.com.jadson.snooper.github.data.stats.GitHubCommitStatsInfo; import br.com.jadson.snooper.github.data.stats.graphql.CommitStatsNode; import br.com.jadson.snooper.github.data.stats.graphql.GraphQLCommitResponse; @@ -48,7 +49,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; -import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; @@ -132,7 +132,7 @@ public GitHubCommitInfo getCommitsOfReference(String repoFullName, String ref) { String parameters = ""; - GitHubCommitInfo commitInfo = null; + GitHubCommitInfo gitHubCommitInfo = null; ResponseEntity result; @@ -153,14 +153,14 @@ public GitHubCommitInfo getCommitsOfReference(String repoFullName, String ref) { result = restTemplate.exchange( query, HttpMethod.GET, entity, GitHubCommitInfo.class); - commitInfo = result.getBody(); + gitHubCommitInfo = result.getBody(); page++; // }while ( result != null && result.getBody() != null && !testEnvironment); - return commitInfo; + return gitHubCommitInfo; } @@ -318,6 +318,16 @@ public List getHistoryOfCommitsWithPullRequest return results; } + /** + * Return the history of commits of a GitHub project with their change statistics. + * + * This method uses the API V4 of GitHub with GraphQL. + * + * @param projectFullName + * @param sinceDate + * @param untilDate + * @return + */ public List getCommitsWithStats(String projectFullName, LocalDateTime sinceDate, LocalDateTime untilDate) { validateRepoName(projectFullName); @@ -389,8 +399,95 @@ public List getCommitsWithStats(String projectFullName, L return allCommits; } + /** + * Return the list of files changed in a specific GitHub commit. + * + * This method uses the REST API of GitHub. + * + * @param repoFullName + * @param commit + * @return + */ + public List getCommitFiles(String repoFullName, GitHubCommitInfo commit){ + validateRepoName(repoFullName); + // IMPORTANTE state=all for bring all PR + String parameters = ""; + ResponseEntity result; + + String query = GIT_HUB_API_URL +"/repos/"+repoFullName+"/commits/"+commit.sha; + + System.out.println("Getting files for commit"); + + RestTemplate restTemplate = new RestTemplate(); + + HttpEntity entity = new HttpEntity(getDefaultHeaders()); + result = restTemplate.exchange( query, HttpMethod.GET, entity, GitHubCommitInfo.class); + if (result.getBody() != null && result.getBody().files != null) { + return result.getBody().files; + } + + return new ArrayList<>(); + } + + /** + * Return the change statistics of a specific file in a GitHub repository. + * + * This method uses the API V4 of GitHub with GraphQL. + * + * @param projectFullName + * @param filePath + * @param sinceDate + * @param untilDate + * @return + */ + public GitHubFileStats getFileStats(String projectFullName, String filePath, LocalDateTime sinceDate, LocalDateTime untilDate){ + validateRepoName(projectFullName); + + String[] repoParts = projectFullName.split("/"); + String owner = repoParts[0]; + String repo = repoParts[1]; + + String since = sinceDate.toLocalDate().atStartOfDay().atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT); + String until = untilDate.plusDays(1).toLocalDate().atStartOfDay().atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT); + + System.out.println("Executing getFileStats for " + filePath + " from " + since + " to " + until); + + String query = String.format( + "repository(owner: \\\"%s\\\", name: \\\"%s\\\") { " + + " defaultBranchRef { " + + " target { " + + " ... on Commit { " + + " history(path: \\\"%s\\\", since: \\\"%s\\\", until: \\\"%s\\\") { " + + " totalCount " + + " } " + + " } " + + " } " + + " } " + + "} ", + owner, repo, filePath, since, until + ); + + GraphQLCommitResponse queryResult = executeCommitStatsQuery(query); + + GitHubFileStats gitHubFileStats = new GitHubFileStats(); + gitHubFileStats.churn = queryResult.data.repository.defaultBranchRef.target.history.totalCount; + gitHubFileStats.path = filePath; + + return gitHubFileStats; + + } + + + /** + * Execute a GraphQL query to retrieve commit statistics from GitHub. + * + * This method uses the API V4 of GitHub with GraphQL. + * + * @param query + * @return + */ private ResultGraphQLRepository executeQueryAssociatedPR(String query) { RestTemplate restTemplate = new RestTemplate(); diff --git a/src/main/java/br/com/jadson/snooper/github/operations/PullRequestQueryExecutor.java b/src/main/java/br/com/jadson/snooper/github/operations/PullRequestQueryExecutor.java index 8abea3e..5b8022e 100644 --- a/src/main/java/br/com/jadson/snooper/github/operations/PullRequestQueryExecutor.java +++ b/src/main/java/br/com/jadson/snooper/github/operations/PullRequestQueryExecutor.java @@ -25,7 +25,6 @@ */ package br.com.jadson.snooper.github.operations; -import br.com.jadson.snooper.github.data.commit.GitHubCommitInfo; import br.com.jadson.snooper.github.data.pull.GitHubPullRequestInfo; import br.com.jadson.snooper.github.data.pull.GitHubQTDPullRequestInfo; import br.com.jadson.snooper.utils.DateUtils; diff --git a/src/main/java/br/com/jadson/snooper/github/operations/RepoQueryExecutor.java b/src/main/java/br/com/jadson/snooper/github/operations/RepoQueryExecutor.java index c3ce81d..d974f4a 100644 --- a/src/main/java/br/com/jadson/snooper/github/operations/RepoQueryExecutor.java +++ b/src/main/java/br/com/jadson/snooper/github/operations/RepoQueryExecutor.java @@ -30,11 +30,14 @@ package br.com.jadson.snooper.github.operations; import br.com.jadson.snooper.github.data.repo.GitHubRepoInfo; +import br.com.jadson.snooper.github.data.repo.GitHubTreeInfo; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; +import java.util.List; + /** * Return information about repository of github * @@ -82,4 +85,25 @@ public GitHubRepoInfo getRepoInfo(String repoFullName) { return result.getBody(); } + /** + * Return all files and directories from a GitHub repository tree. + * + * This method uses the REST API of GitHub. + * + * @param repoFullName + * @param branch + * @return + */ + public GitHubTreeInfo getAllFiles(String repoFullName, String branch){ + ResponseEntity result; + String url = GIT_HUB_API_URL + + "/repos/" + repoFullName + "/git/trees/" + branch + "?recursive=1"; + RestTemplate restTemplate = new RestTemplate(); + + HttpEntity entity = new HttpEntity(getDefaultHeaders()); + + result = restTemplate.exchange(url, HttpMethod.GET, entity, GitHubTreeInfo.class); + return result.getBody(); + } + } diff --git a/src/main/java/br/com/jadson/snooper/gitlab/data/commit/CommitStats.java b/src/main/java/br/com/jadson/snooper/gitlab/data/commit/CommitStats.java deleted file mode 100644 index 69d5be8..0000000 --- a/src/main/java/br/com/jadson/snooper/gitlab/data/commit/CommitStats.java +++ /dev/null @@ -1,7 +0,0 @@ -package br.com.jadson.snooper.gitlab.data.commit; - -public class CommitStats { - public int additions; - public int deletions; - public int total; -} diff --git a/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabCommitDiff.java b/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabCommitDiff.java new file mode 100644 index 0000000..654ca49 --- /dev/null +++ b/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabCommitDiff.java @@ -0,0 +1,41 @@ +package br.com.jadson.snooper.gitlab.data.commit; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Information about the diff of a file changed in a GitLab commit. + * + * Luisa Ferreira - luisaferreirass08@gmail.com + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class GitLabCommitDiff { + @JsonProperty("old_path") + public String oldPath; + + @JsonProperty("new_path") + public String newPath; + + @JsonProperty("new_file") + public Boolean newFile; + + @JsonProperty("renamed_file") + public Boolean renamedFile; + + @JsonProperty("deleted_file") + public Boolean deletedFile; + + @JsonProperty("diff") + public String diff; + + @JsonProperty("collapsed") + public Boolean collapsed; + + @JsonProperty("too_large") + public Boolean tooLarge; + + @JsonProperty("generated_file") + public Boolean generatedFile; +} + + diff --git a/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabCommitInfo.java b/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabCommitInfo.java index 96ae85b..ea002b5 100644 --- a/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabCommitInfo.java +++ b/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabCommitInfo.java @@ -20,7 +20,7 @@ public class GitLabCommitInfo { public String message; public List parent_ids; public String web_url; - public CommitStats stats; + public GitLabCommitStats stats; public GitLabCommitInfo() { } diff --git a/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabCommitStats.java b/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabCommitStats.java new file mode 100644 index 0000000..0dd84cf --- /dev/null +++ b/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabCommitStats.java @@ -0,0 +1,12 @@ +package br.com.jadson.snooper.gitlab.data.commit; + +/** + * Statistics of changes made in a GitLab commit. + * + * Luisa Ferreira - luisaferreirass08@gmail.com + */ +public class GitLabCommitStats { + public int additions; + public int deletions; + public int total; +} diff --git a/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabFileChanged.java b/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabFileChanged.java new file mode 100644 index 0000000..ad1d7bc --- /dev/null +++ b/src/main/java/br/com/jadson/snooper/gitlab/data/commit/GitLabFileChanged.java @@ -0,0 +1,15 @@ +package br.com.jadson.snooper.gitlab.data.commit; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * Information about a file changed in a GitLab commit. + * + * Luisa Ferreira - luisaferreirass08@gmail.com + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class GitLabFileChanged { + public String filename; + public int additions; + public int deletions; +} diff --git a/src/main/java/br/com/jadson/snooper/gitlab/data/repo/GitLabTreeItem.java b/src/main/java/br/com/jadson/snooper/gitlab/data/repo/GitLabTreeItem.java new file mode 100644 index 0000000..3460494 --- /dev/null +++ b/src/main/java/br/com/jadson/snooper/gitlab/data/repo/GitLabTreeItem.java @@ -0,0 +1,16 @@ +package br.com.jadson.snooper.gitlab.data.repo; + + +/** + * Information about an item in the GitLab repository tree. + * It can represent either a file or a directory. + * + * Luisa Ferreira - luisaferreirass08@gmail.com + */ +public class GitLabTreeItem { + public String name; + public String path; + public String type; // "blob" = arquivo, "tree" = diretório + public long size; + +} diff --git a/src/main/java/br/com/jadson/snooper/gitlab/operations/GitLabCommitQueryExecutor.java b/src/main/java/br/com/jadson/snooper/gitlab/operations/GitLabCommitQueryExecutor.java index 4f079f1..b074832 100644 --- a/src/main/java/br/com/jadson/snooper/gitlab/operations/GitLabCommitQueryExecutor.java +++ b/src/main/java/br/com/jadson/snooper/gitlab/operations/GitLabCommitQueryExecutor.java @@ -1,7 +1,8 @@ package br.com.jadson.snooper.gitlab.operations; -import br.com.jadson.snooper.github.data.commit.GitHubCommitInfo; +import br.com.jadson.snooper.gitlab.data.commit.GitLabCommitDiff; import br.com.jadson.snooper.gitlab.data.commit.GitLabCommitInfo; +import br.com.jadson.snooper.gitlab.data.commit.GitLabFileChanged; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; @@ -80,4 +81,106 @@ public List getCommits(String repoFullName) { return allPull; } -} + /** + * Return the files changed in a specific GitLab commit. + * + * This method uses the REST API of GitLab. + * + * @param repoFullName + * @param commit + * @return + */ + public List getCommitsFiles(String repoFullName, GitLabCommitInfo commit){ + validateRepoName(repoFullName); + + ResponseEntity result; + + String query = getGitLabAPIURL() + + encodeProjectName(repoFullName) + + "/repository/commits/" + + commit.id + + "/diff"; + + System.out.println(query); + + System.out.println("Getting files for GitLab commit"); + + URI uri = null; + try { + uri = new URI(query); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + checkDisableSslVerification(); + + + RestTemplate restTemplate = new RestTemplate(); + HttpEntity entity = new HttpEntity(this.getDefaultHeaders()); + result = restTemplate.exchange(uri, HttpMethod.GET, entity, GitLabCommitDiff[].class); + + + + if (result.getBody() == null) { + return new ArrayList<>(); + } + + List files = new ArrayList<>(); + + for (GitLabCommitDiff diff : result.getBody()) { + GitLabFileChanged file = new GitLabFileChanged(); + + file.filename = diff.newPath != null ? diff.newPath : diff.oldPath; + file.additions = countAdditions(diff.diff); + file.deletions = countDeletions(diff.diff); + + files.add(file); + } + + return files; + } + + /** + * Count the number of added lines in a diff. + * + * @param diff + * @return + */ + private int countAdditions(String diff){ + if (diff == null || diff.isEmpty()) { + return 0; + } + + int additions = 0; + + for (String line : diff.split("\n")) { + if (line.startsWith("+") && !line.startsWith("+++")) { + additions++; + } + } + + return additions; + } + + /** + * Count the number of deleted lines in a diff. + * + * @param diff + * @return + */ + private int countDeletions(String diff) { + if (diff == null || diff.isEmpty()) { + return 0; + } + + int deletions = 0; + + for (String line : diff.split("\n")) { + if (line.startsWith("-") && !line.startsWith("---")) { + deletions++; + } + } + + return deletions; + } + } \ No newline at end of file diff --git a/src/main/java/br/com/jadson/snooper/gitlab/operations/GitLabRepoQueryExecutor.java b/src/main/java/br/com/jadson/snooper/gitlab/operations/GitLabRepoQueryExecutor.java new file mode 100644 index 0000000..a238908 --- /dev/null +++ b/src/main/java/br/com/jadson/snooper/gitlab/operations/GitLabRepoQueryExecutor.java @@ -0,0 +1,102 @@ +package br.com.jadson.snooper.gitlab.operations; + +import br.com.jadson.snooper.gitlab.data.commit.GitLabCommitInfo; +import br.com.jadson.snooper.gitlab.data.repo.GitLabTreeItem; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Performs queries in GitLab repositories. + * + * This class retrieves repository data from GitLab, such as files and directories + * from the repository tree. + */ +public class GitLabRepoQueryExecutor extends AbstractGitLabQueryExecutor { + + public GitLabRepoQueryExecutor() { + + } + + /** + * Creates a GitLab repository query executor. + * + * @param gitlabURL + * @param gitlabToken + */ + public GitLabRepoQueryExecutor(String gitlabURL, String gitlabToken) { + this(gitlabURL, gitlabToken, false); + } + + /** + * Creates a GitLab repository query executor with SSL verification configuration. + * + * @param gitlabURL + * @param gitlabToken + * @param disableSslVerification + */ + + public GitLabRepoQueryExecutor(String gitlabURL, String gitlabToken, boolean disableSslVerification) { + if (gitlabToken == null || gitlabToken.trim().equals("") ) { + throw new RuntimeException("Invalid GitLab Token: " + gitlabToken); + } + if (gitlabURL == null || gitlabURL.trim().equals("") ) { + throw new RuntimeException("Invalid GitLab URL: " + gitlabURL); + } + + this.gitlabURL = gitlabURL; + this.gitlabToken = gitlabToken; + this.disableSslVerification = disableSslVerification; + } + + /** + * Return all files and directories from a GitLab repository tree. + * + * This method uses the REST API of GitLab. + * + * @param repoFullName + * @return + */ + public List getAllFiles(String repoFullName) { + int page = 1; + String parameters = ""; + ArrayList allPull = new ArrayList(); + + + ResponseEntity result; + do { + parameters = "?recursive=true&page=" + page + "&per_page=" + this.pageSize; + + String query = getGitLabAPIURL() + encodeProjectName(repoFullName) + "/repository/tree" + parameters; + + // encode "/" in "%2F" supported + URI uri = null; + try { + uri = new URI(query); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + System.out.println("Getting Next File: " + query); + RestTemplate restTemplate = new RestTemplate(); + + checkDisableSslVerification(); + + + HttpEntity entity = new HttpEntity(this.getDefaultHeaders()); + result = restTemplate.exchange(uri, HttpMethod.GET, entity, GitLabTreeItem[].class); + allPull.addAll(Arrays.asList((GitLabTreeItem[])result.getBody())); + ++page; + } while(result != null && ((GitLabTreeItem[])result.getBody()).length > 0 && !this.testEnvironment); + + return allPull; + } + +} diff --git a/src/test/java/br/com/jadson/snooper/github/operations/CommitQueryExecutorTest.java b/src/test/java/br/com/jadson/snooper/github/operations/CommitQueryExecutorTest.java index 2754b75..ae4b6aa 100644 --- a/src/test/java/br/com/jadson/snooper/github/operations/CommitQueryExecutorTest.java +++ b/src/test/java/br/com/jadson/snooper/github/operations/CommitQueryExecutorTest.java @@ -105,8 +105,8 @@ void testGetCommitsWithStats() { Assertions.assertEquals(3, commitStatsInfos.size()); Assertions.assertEquals("7fd1a60b01f91b314f59955a4e4d4e80d8edf11d", commitStatsInfos.get(0).sha); - Assertions.assertEquals(1, commitStatsInfos.get(0).commitStats.additions); - Assertions.assertEquals(1, commitStatsInfos.get(1).commitStats.additions); - Assertions.assertEquals(1, commitStatsInfos.get(1).commitStats.deletions); + Assertions.assertEquals(1, commitStatsInfos.get(0).gitHubCommitStats.additions); + Assertions.assertEquals(1, commitStatsInfos.get(1).gitHubCommitStats.additions); + Assertions.assertEquals(1, commitStatsInfos.get(1).gitHubCommitStats.deletions); } } \ No newline at end of file