Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 13 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,26 @@ A modern Java library for navigating GitHub repository commits programmatically

```xml
<dependency>
<groupId>edu.stanford.protege.commitnavigator</groupId>
<groupId>edu.stanford.protege</groupId>
<artifactId>github-commit-navigator</artifactId>
<version>2.0.0</version>
<version>2.0.2</version>
</dependency>
```

### Basic Usage

```java
import edu.stanford.protege.commitnavigator.GitHubRepository;
import edu.stanford.protege.commitnavigator.GitHubRepositoryBuilderFactory;
import edu.stanford.protege.commitnavigator.model.RepositoryCoordinates;
import edu.stanford.protege.commitnavigator.model.BranchCoordinates;
import edu.stanford.protege.commitnavigator.CommitNavigatorBuilder;
import edu.stanford.protege.commitnavigator.utils.CommitNavigator;
import edu.stanford.protege.commitnavigator.model.CommitMetadata;

// Create repository coordinate from URL
var coordinate = RepositoryCoordinates.createFromUrl("https://github.com/example/repo");
var coordinate = BranchCoordinates.createFromUrl("https://github.com/example/repo");

// Create repository using factory pattern
var repository = GitHubRepositoryBuilderFactory.create(coordinate)
.withPersonalAccessToken("your-token-here")
.build();
.withPersonalAccessToken("your-token-here")
.build();

// Initialize the repository
repository.initialize();
Expand Down Expand Up @@ -73,7 +70,7 @@ repository.close();

```java
// Create repository coordinate for the repository and branch
var coordinate = RepositoryCoordinates.createFromUrl("https://github.com/example/repo", "develop");
var coordinate = BranchCoordinates.createFromUrl("https://github.com/example/repo", "develop");

// Configure repository with advanced options
var repository = GitHubRepositoryBuilderFactory.create(coordinate)
Expand Down Expand Up @@ -108,7 +105,7 @@ For public repositories, authentication is optional:

```java
// Create coordinate for public repository
var coordinates = RepositoryCoordinates.createFromUrl("https://github.com/public/repo");
var coordinates = BranchCoordinates.createFromUrl("https://github.com/public/repo");

// Create repository without authentication
var repository = GitHubRepositoryBuilderFactory.create(coordinates)
Expand All @@ -121,17 +118,17 @@ Filter commits to only include those that modified specific files using CommitNa

```java
// Configure file filters using List
var commitNavigator = CommitNavigatorBuilder.forWorkingDirectory("/path/to/local/directory")
var commitNavigator = CommitNavigatorBuilder.forWorkingDirectory(workingDirectory)
.fileFilters(List.of("src/main/java/Main.java", "README.md")) // Exact file paths
.build();

// Or using convenient varargs syntax
var commitNavigator = CommitNavigatorBuilder.forWorkingDirectory("/path/to/local/directory")
var commitNavigator = CommitNavigatorBuilder.forWorkingDirectory(workingDirectory)
.fileFilters("*.java", "**/*.md", "src/**/*.xml") // Glob patterns
.build();

// Or mixed patterns with varargs
var commitNavigator = CommitNavigatorBuilder.forWorkingDirectory("/path/to/local/directory")
var commitNavigator = CommitNavigatorBuilder.forWorkingDirectory(workingDirectory)
.fileFilters("pom.xml", "*.java", "docs/**/*.md") // Mixed patterns
.build();
```
Expand All @@ -155,10 +152,10 @@ The library includes a CLI for quick repository analysis:

```bash
# Basic usage
java -jar github-commit-navigator-2.0.0.jar https://github.com/user/repo
java -jar github-commit-navigator-2.0.2.jar https://github.com/user/repo

# With authentication and filters
java -jar github-commit-navigator-2.0.0.jar \
java -jar github-commit-navigator-2.0.2.jar \
--token your-token \
--file-filter "*.java,*.md" \
--branch develop \
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>edu.stanford.protege</groupId>
<artifactId>github-commit-navigator</artifactId>
<version>2.0.3</version>
<version>2.1.0</version>
<packaging>jar</packaging>

<name>GitHub Commit Navigator Library</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import edu.stanford.protege.commitnavigator.config.AuthenticationConfig;
import edu.stanford.protege.commitnavigator.config.RepositoryConfig;
import edu.stanford.protege.commitnavigator.impl.GitHubRepositoryImpl;
import edu.stanford.protege.commitnavigator.model.RepositoryCoordinates;
import edu.stanford.protege.commitnavigator.model.BranchCoordinates;
import edu.stanford.protege.commitnavigator.utils.AuthenticationManager;
import java.nio.file.Path;
import java.nio.file.Paths;
Expand Down Expand Up @@ -37,8 +37,8 @@ public class GitHubRepositoryBuilder {
private final AuthenticationManager authManager;

public GitHubRepositoryBuilder(
RepositoryCoordinates repositoryCoordinates, AuthenticationManager authManager) {
this.configBuilder = RepositoryConfig.builder(repositoryCoordinates);
BranchCoordinates branchCoordinates, AuthenticationManager authManager) {
this.configBuilder = RepositoryConfig.builder(branchCoordinates);
this.authManager = Objects.requireNonNull(authManager, "Authentication manager cannot be null");
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package edu.stanford.protege.commitnavigator;

import edu.stanford.protege.commitnavigator.model.RepositoryCoordinates;
import edu.stanford.protege.commitnavigator.model.BranchCoordinates;
import edu.stanford.protege.commitnavigator.utils.AuthenticationManager;
import edu.stanford.protege.commitnavigator.utils.impl.AuthenticationManagerImpl;
import java.util.Objects;
Expand Down Expand Up @@ -33,15 +33,15 @@ public class GitHubRepositoryBuilderFactory {
* <p>The returned builder includes default implementations of {@link AuthenticationManager} and
* the supplied repository coordinates.
*
* @param repositoryCoordinates the repository coordinate containing owner, repo, and branch
* @param branchCoordinates the repository coordinate containing owner, repo, and branch
* @return a pre-configured {@link GitHubRepositoryBuilder} for public repository access
* @throws NullPointerException if repositoryCoordinates is null
*/
public static GitHubRepositoryBuilder create(RepositoryCoordinates repositoryCoordinates) {
Objects.requireNonNull(repositoryCoordinates, "Repository coordinate cannot be null");
public static GitHubRepositoryBuilder create(BranchCoordinates branchCoordinates) {
Objects.requireNonNull(branchCoordinates, "Repository coordinate cannot be null");

var authManager = new AuthenticationManagerImpl();

return new GitHubRepositoryBuilder(repositoryCoordinates, authManager);
return new GitHubRepositoryBuilder(branchCoordinates, authManager);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import edu.stanford.protege.commitnavigator.CommitNavigatorBuilder;
import edu.stanford.protege.commitnavigator.GitHubRepositoryBuilderFactory;
import edu.stanford.protege.commitnavigator.model.RepositoryCoordinates;
import edu.stanford.protege.commitnavigator.model.BranchCoordinates;
import java.util.concurrent.Callable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -90,7 +90,7 @@ public static void main(String[] args) {
public Integer call() throws Exception {
try {
// Extract repository coordinate from URL
var coordinate = RepositoryCoordinates.createFromUrl(repositoryUrl, branch);
var coordinate = BranchCoordinates.createFromUrl(repositoryUrl, branch);

// Create repositoryBuilder using factory pattern
var repositoryBuilder = GitHubRepositoryBuilderFactory.create(coordinate);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package edu.stanford.protege.commitnavigator.config;

import edu.stanford.protege.commitnavigator.model.RepositoryCoordinates;
import edu.stanford.protege.commitnavigator.model.BranchCoordinates;
import java.nio.file.Path;
import java.util.Objects;
import java.util.Optional;
Expand Down Expand Up @@ -108,15 +108,15 @@ public Optional<AuthenticationConfig> getAuthConfig() {
/**
* Creates a new builder instance for the specified repository URL.
*
* @param repositoryCoordinates the repository coordinate containing owner, repo, and branch
* @param branchCoordinates the repository coordinate containing owner, repo, and branch
* @return a new {@link Builder} instance
* @throws NullPointerException if repositoryUrl is null
*/
public static Builder builder(RepositoryCoordinates repositoryCoordinates) {
public static Builder builder(BranchCoordinates branchCoordinates) {
return new Builder(
repositoryCoordinates.repositoryUrl(),
repositoryCoordinates.repositoryName(),
repositoryCoordinates.branchName());
branchCoordinates.repositoryUrl(),
branchCoordinates.repositoryName(),
branchCoordinates.branchName());
}

/** Builder class for constructing {@link RepositoryConfig} instances. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
* var coordinates = RepositoryCoordinates.create("owner", "repository");
* var repository = GitHubRepositoryBuilderFactory.create(coordinates)
* .withPersonalAccessToken("ghp_xxxxxxxxxxxx")
* .localCloneDirectory(Paths.get("/tmp/my-repo"))
* .localWorkingDirectory("/tmp/my-repo")
* .build();
*
* repository.initialize();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package edu.stanford.protege.commitnavigator.model;

public record RepositoryCoordinates(String ownerName, String repositoryName, String branchName) {
public record BranchCoordinates(String ownerName, String repositoryName, String branchName) {

public static final String DEFAULT_BRANCH = "main";

public static RepositoryCoordinates create(
public static BranchCoordinates create(
String ownerName, String repositoryName, String branchName) {
return new RepositoryCoordinates(ownerName, repositoryName, branchName);
return new BranchCoordinates(ownerName, repositoryName, branchName);
}

public static RepositoryCoordinates create(String ownerName, String repositoryName) {
public static BranchCoordinates create(String ownerName, String repositoryName) {
return create(ownerName, repositoryName, DEFAULT_BRANCH);
}

public static RepositoryCoordinates createFromUrl(String repositoryUrl, String branchName) {
public static BranchCoordinates createFromUrl(String repositoryUrl, String branchName) {
// Remove protocol if present
var url = repositoryUrl.replaceFirst("^https?://github\\.com/", "");
// Remove .git suffix if present
Expand All @@ -32,7 +32,7 @@ public static RepositoryCoordinates createFromUrl(String repositoryUrl, String b
return create(ownerName, repositoryName, branchName);
}

public static RepositoryCoordinates createFromUrl(String repositoryUrl) {
public static BranchCoordinates createFromUrl(String repositoryUrl) {
return createFromUrl(repositoryUrl, DEFAULT_BRANCH);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
import static org.junit.jupiter.api.Assertions.*;

import edu.stanford.protege.commitnavigator.config.AuthenticationConfig;
import edu.stanford.protege.commitnavigator.model.RepositoryCoordinates;
import edu.stanford.protege.commitnavigator.model.BranchCoordinates;
import java.nio.file.Paths;
import org.junit.jupiter.api.Test;

class GitHubRepositoryBuilderTest {

private static final RepositoryCoordinates TEST_COORDINATE =
RepositoryCoordinates.create("example", "repo");
private static final BranchCoordinates TEST_COORDINATE =
BranchCoordinates.create("example", "repo");

@Test
void testBuilderWithPersonalAccessToken() {
Expand Down Expand Up @@ -72,7 +72,7 @@ void testBuilderWithAllOptions() {
var token = "test-token";
var localPath = "/tmp/test-repo";
var branch = "develop";
var coordinate = RepositoryCoordinates.create("example", "repo", branch);
var coordinate = BranchCoordinates.create("example", "repo", branch);

var navigator =
GitHubRepositoryBuilderFactory.create(coordinate)
Expand All @@ -92,7 +92,7 @@ void testBuilderWithAllOptions() {

@Test
void testBuilderWithoutAuthentication() {
var publicRepoCoordinate = RepositoryCoordinates.create("example", "public-repo");
var publicRepoCoordinate = BranchCoordinates.create("example", "public-repo");

var navigator = GitHubRepositoryBuilderFactory.create(publicRepoCoordinate).build();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

import static org.junit.jupiter.api.Assertions.*;

import edu.stanford.protege.commitnavigator.model.RepositoryCoordinates;
import edu.stanford.protege.commitnavigator.model.BranchCoordinates;
import java.nio.file.Paths;
import org.junit.jupiter.api.Test;

class RepositoryConfigTest {

@Test
void testBuilderPattern() {
var coordinate = RepositoryCoordinates.create("example", "repo", "develop");
var coordinate = BranchCoordinates.create("example", "repo", "develop");

var config =
RepositoryConfig.builder(coordinate)
Expand All @@ -27,7 +27,7 @@ void testBuilderPattern() {

@Test
void testDefaultValues() {
var coordinate = RepositoryCoordinates.create("example", "repo");
var coordinate = BranchCoordinates.create("example", "repo");

var config = RepositoryConfig.builder(coordinate).build();

Expand All @@ -41,7 +41,7 @@ void testDefaultValues() {

@Test
void testAuthenticationConfig() {
var coordinate = RepositoryCoordinates.create("example", "repo");
var coordinate = BranchCoordinates.create("example", "repo");
var authConfig = AuthenticationConfig.personalAccessToken("token").build();

var config = RepositoryConfig.builder(coordinate).authConfig(authConfig).build();
Expand Down