{"id":41244770,"url":"https://github.com/protegeproject/github-commit-navigator-library","last_synced_at":"2026-01-23T01:25:13.870Z","repository":{"id":311806012,"uuid":"1023802502","full_name":"protegeproject/github-commit-navigator-library","owner":"protegeproject","description":"A Java library for navigating GitHub repository commits programmatically","archived":false,"fork":false,"pushed_at":"2025-10-21T23:45:35.000Z","size":223,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-22T01:23:11.159Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/protegeproject.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-21T18:04:19.000Z","updated_at":"2025-10-21T23:45:38.000Z","dependencies_parsed_at":"2025-08-27T00:52:08.564Z","dependency_job_id":"9ffd568f-9150-4110-ace8-0411c2fd4e95","html_url":"https://github.com/protegeproject/github-commit-navigator-library","commit_stats":null,"previous_names":["protegeproject/github-commit-navigator-library"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/protegeproject/github-commit-navigator-library","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protegeproject%2Fgithub-commit-navigator-library","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protegeproject%2Fgithub-commit-navigator-library/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protegeproject%2Fgithub-commit-navigator-library/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protegeproject%2Fgithub-commit-navigator-library/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/protegeproject","download_url":"https://codeload.github.com/protegeproject/github-commit-navigator-library/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protegeproject%2Fgithub-commit-navigator-library/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28677330,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T01:00:35.747Z","status":"ssl_error","status_checked_at":"2026-01-23T01:00:19.529Z","response_time":144,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-23T01:25:13.772Z","updated_at":"2026-01-23T01:25:13.852Z","avatar_url":"https://github.com/protegeproject.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GitHub Commit Navigator Library\n\nA modern Java library for navigating GitHub repository commits programmatically with support for file filtering, authentication, and automatic synchronization.\n\n## Features\n\n- **Commit Navigation**: Navigate forward and backward through commit history with metadata\n- **Auto-Sync**: Automatically pull latest changes when opening existing repositories\n- **File Filtering**: Filter commits based on file changes (exact paths or glob patterns)\n- **Multiple Authentication**: Support for Personal Access Token, OAuth, Username/Password, and SSH keys\n\n## Quick Start\n\n### Maven Dependency\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eedu.stanford.protege\u003c/groupId\u003e\n    \u003cartifactId\u003egithub-commit-navigator\u003c/artifactId\u003e\n    \u003cversion\u003e2.0.2\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### Basic Usage\n\n```java\nimport edu.stanford.protege.commitnavigator.GitHubRepositoryBuilderFactory;\nimport edu.stanford.protege.commitnavigator.model.BranchCoordinates;\nimport edu.stanford.protege.commitnavigator.CommitNavigatorBuilder;\n\n// Create repository coordinate from URL\nvar coordinate = BranchCoordinates.createFromUrl(\"https://github.com/example/repo\");\n\n// Create repository using factory pattern\nvar repository = GitHubRepositoryBuilderFactory.create(coordinate)\n        .withPersonalAccessToken(\"your-token-here\")\n        .build();\n\n// Initialize the repository\nrepository.initialize();\n\n// Get the local working directory\nvar workingDirectory = repository.getWorkingDirectory();\n\n// Create commit navigator using builder\nvar commitNavigator = CommitNavigatorBuilder.forWorkingDirectory(workingDirectory).build();\n\n// Navigate through commits\nwhile (commitNavigator.hasParent()) {\n    var commit = commitNavigator.checkoutParent();\n    System.out.println(\"Commit: \" + commit.getCommitHash());\n    System.out.println(\"Author: \" + commit.getCommitterUsername() + \" (\" + commit.getCommitterEmail() + \")\");\n    System.out.println(\"Date: \" + commit.getCommitDate());\n    System.out.println(\"Message: \" + commit.getCommitMessage());\n    System.out.println(\"---\");\n}\n\n// Reset navigator and navigate again\ncommitNavigator.reset();\nwhile (commitNavigator.hasParent()) {\n    var commit = commitNavigator.checkoutParent();\n    System.out.println(\"Checked out commit: \" + commit.getCommitHash());\n}\n\n// Clean up\nrepository.close();\n```\n\n## Configuration Options\n\n```java\n// Create repository coordinate for the repository and branch\nvar coordinate = BranchCoordinates.createFromUrl(\"https://github.com/example/repo\", \"develop\");\n\n// Configure repository with advanced options\nvar repository = GitHubRepositoryBuilderFactory.create(coordinate)\n    .withPersonalAccessToken(\"your-token-here\")\n    .localWorkingDirectory(\"/path/to/local/directory\")\n    .shallowClone(true)\n    .build();\n\n// Initialize repository\nrepository.initialize();\n\n// Get the working directory path\nvar workingDirectory = repository.getWorkingDirectory();\n\n// Configure navigator with file filtering and starting position\nvar commitNavigator = CommitNavigatorBuilder.forWorkingDirectory(workingDirectory)\n    .fileFilters(\"*.java\", \"*.md\", \"pom.xml\") // Using convenient varargs syntax\n    .startingCommit(\"abc123def\")\n    .build();\n```\n\n### Authentication\n\nThe library supports multiple authentication methods for accessing private repositories:\n\n- `withPersonalAccessToken(\"your-pat-token\")` - Using Personal Access Token (Recommended)\n- `withOAuthToken(\"your-oauth-token\")` - Using OAuth token\n- `withUsernamePassword(\"username\", \"password\")` - Using username and password\n- `withSshKey(\"/path/to/ssh/key\")` - Using SSH key\n\nFor public repositories, authentication is optional:\n\n```java\n// Create coordinate for public repository\nvar coordinates = BranchCoordinates.createFromUrl(\"https://github.com/public/repo\");\n\n// Create repository without authentication\nvar repository = GitHubRepositoryBuilderFactory.create(coordinates)\n    .build(); // No authentication needed\n```\n\n### File Filtering\n\nFilter commits to only include those that modified specific files using CommitNavigatorBuilder:\n\n```java\n// Configure file filters using List\nvar commitNavigator = CommitNavigatorBuilder.forWorkingDirectory(workingDirectory)\n    .fileFilters(List.of(\"src/main/java/Main.java\", \"README.md\")) // Exact file paths\n    .build();\n\n// Or using convenient varargs syntax\nvar commitNavigator = CommitNavigatorBuilder.forWorkingDirectory(workingDirectory)\n    .fileFilters(\"*.java\", \"**/*.md\", \"src/**/*.xml\") // Glob patterns\n    .build();\n\n// Or mixed patterns with varargs\nvar commitNavigator = CommitNavigatorBuilder.forWorkingDirectory(workingDirectory)\n    .fileFilters(\"pom.xml\", \"*.java\", \"docs/**/*.md\") // Mixed patterns\n    .build();\n```\n\n\n## Navigation Methods\n\n- `checkoutChild()` - Move to child commit (newer) and checkout working directory (returns `CommitMetadata`)\n- `checkoutParent()` - Move to parent commit (older) and checkout working directory (returns `CommitMetadata`)\n- `hasChild()` - Check if child commit exists\n- `hasParent()` - Check if parent commit exists\n- `getCurrentCommit()` - Get current commit metadata\n- `getCommitCount()` - Get total number of commits in navigation sequence\n- `resolveFilePath(String relativePath)` - Get absolute path for a repository-relative file path\n- `reset()` - Reset navigator to initial state\n\n\n## Command Line Interface\n\nThe library includes a CLI for quick repository analysis:\n\n```bash\n# Basic usage\njava -jar github-commit-navigator-2.0.2.jar https://github.com/user/repo\n\n# With authentication and filters\njava -jar github-commit-navigator-2.0.2.jar \\\n    --token your-token \\\n    --file-filter \"*.java,*.md\" \\\n    --branch develop \\\n    --working-directory /tmp/repo \\\n    https://github.com/user/repo.git\n```\n\n### CLI Options\n\n- `-t, --token`: GitHub personal access token\n- `-b, --branch`: Branch to analyze (default: main)\n- `-d, --working-directory`: Local working directory\n- `-f, --file-filter`: Comma-separated file filters\n\n## Building from Source\n\n```bash\n# Clone the repository\ngit clone https://github.com/your-org/github-commit-navigator-library.git\n\n# Build with Maven\nmvn clean compile\n\n# Run tests\nmvn test\n\n# Create JAR\nmvn package\n```\n\n### Code Quality and Formatting\n```bash\n# Auto-format code with Google Java Style\nmvn spotless:apply\n\n# Check code formatting\nmvn spotless:check\n\n# Run static analysis with SpotBugs\nmvn spotbugs:check\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprotegeproject%2Fgithub-commit-navigator-library","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprotegeproject%2Fgithub-commit-navigator-library","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprotegeproject%2Fgithub-commit-navigator-library/lists"}