* @author Thibault Duplessis */ class Repo extends AbstractApi { use AcceptHeaderTrait; /** * List all public repositories. * * @link https://developer.github.com/v3/repos/#list-all-public-repositories * * @param int|null $id The integer ID of the last Repository that you’ve seen. * * @return array list of users found */ public function all($id = null) { if (!is_int($id)) { return $this->get('/repositories'); } return $this->get('/repositories', ['since' => $id]); } /** * Get the last year of commit activity for a repository grouped by week. * * @link http://developer.github.com/v3/repos/statistics/#commit-activity * * @param string $username the user who owns the repository * @param string $repository the name of the repository * * @return array commit activity grouped by week */ public function activity($username, $repository) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/stats/commit_activity'); } /** * Get contributor commit statistics for a repository. * * @link http://developer.github.com/v3/repos/statistics/#contributors * * @param string $username the user who owns the repository * @param string $repository the name of the repository * * @return array list of contributors and their commit statistics */ public function statistics($username, $repository) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/stats/contributors'); } /** * Get a weekly aggregate of the number of additions and deletions pushed to a repository. * * @link http://developer.github.com/v3/repos/statistics/#code-frequency * * @param string $username the user who owns the repository * @param string $repository the name of the repository * * @return array list of weeks and their commit statistics */ public function frequency($username, $repository) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/stats/code_frequency'); } /** * Get the weekly commit count for the repository owner and everyone else. * * @link http://developer.github.com/v3/repos/statistics/#participation * * @param string $username the user who owns the repository * @param string $repository the name of the repository * * @return array list of weekly commit count grouped by 'all' and 'owner' */ public function participation($username, $repository) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/stats/participation'); } /** * List all repositories for an organization. * * @link http://developer.github.com/v3/repos/#list-organization-repositories * * @param string $organization the name of the organization * @param array $params * * @return array list of organization repositories */ public function org($organization, array $params = []) { return $this->get('/orgs/'.$organization.'/repos', array_merge(['start_page' => 1], $params)); } /** * Get extended information about a repository by its username and repository name. * * @link http://developer.github.com/v3/repos/ * * @param string $username the user who owns the repository * @param string $repository the name of the repository * * @return array information about the repository */ public function show($username, $repository) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository)); } /** * Get extended information about a repository by its id. * Note: at time of writing this is an undocumented feature but GitHub support have advised that it can be relied on. * * @link http://developer.github.com/v3/repos/ * @link https://github.com/piotrmurach/github/issues/283 * @link https://github.com/piotrmurach/github/issues/282 * * @param int $id the id of the repository * * @return array information about the repository */ public function showById($id) { return $this->get('/repositories/'.$id); } /** * Create repository. * * @link http://developer.github.com/v3/repos/ * * @param string $name name of the repository * @param string $description repository description * @param string $homepage homepage url * @param bool $public `true` for public, `false` for private * @param string|null $organization username of organization if applicable * @param bool $hasIssues `true` to enable issues for this repository, `false` to disable them * @param bool $hasWiki `true` to enable the wiki for this repository, `false` to disable it * @param bool $hasDownloads `true` to enable downloads for this repository, `false` to disable them * @param int $teamId The id of the team that will be granted access to this repository. This is only valid when creating a repo in an organization. * @param bool $autoInit `true` to create an initial commit with empty README, `false` for no initial commit * @param bool $hasProjects `true` to enable projects for this repository or false to disable them. * @param string|null $visibility * * @return array returns repository data */ public function create( $name, $description = '', $homepage = '', $public = true, $organization = null, $hasIssues = false, $hasWiki = false, $hasDownloads = false, $teamId = null, $autoInit = false, $hasProjects = true, $visibility = null ) { $path = null !== $organization ? '/orgs/'.$organization.'/repos' : '/user/repos'; $parameters = [ 'name' => $name, 'description' => $description, 'homepage' => $homepage, 'visibility' => $visibility ?? ($public ? 'public' : 'private'), 'has_issues' => $hasIssues, 'has_wiki' => $hasWiki, 'has_downloads' => $hasDownloads, 'auto_init' => $autoInit, 'has_projects' => $hasProjects, ]; if ($organization && $teamId) { $parameters['team_id'] = $teamId; } return $this->post($path, $parameters); } /** * Set information of a repository. * * @link http://developer.github.com/v3/repos/ * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param array $values the key => value pairs to post * * @return array information about the repository */ public function update($username, $repository, array $values) { return $this->patch('/repos/'.rawurlencode($username).'/'.rawurlencode($repository), $values); } /** * Delete a repository. * * @link http://developer.github.com/v3/repos/ * * @param string $username the user who owns the repository * @param string $repository the name of the repository * * @return mixed null on success, array on error with 'message' */ public function remove($username, $repository) { return $this->delete('/repos/'.rawurlencode($username).'/'.rawurlencode($repository)); } /** * Get the readme content for a repository by its username and repository name. * * @link http://developer.github.com/v3/repos/contents/#get-the-readme * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param string $format one of formats: "raw", "html", or "v3+json" * @param string $dir The alternate path to look for a README file * @param array $params additional query params like "ref" to fetch readme for branch/tag * * @return string|array the readme content */ public function readme($username, $repository, $format = 'raw', $dir = null, $params = []) { $path = '/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/readme'; if (null !== $dir) { $path .= '/'.rawurlencode($dir); } return $this->get($path, $params, [ 'Accept' => "application/vnd.github.$format", ]); } /** * Create a repository dispatch event. * * @link https://developer.github.com/v3/repos/#create-a-repository-dispatch-event * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param string $eventType A custom webhook event name * * @return mixed null on success, array on error with 'message' */ public function dispatch($username, $repository, $eventType, array $clientPayload) { return $this->post(\sprintf('/repos/%s/%s/dispatches', rawurlencode($username), rawurlencode($repository)), [ 'event_type' => $eventType, 'client_payload' => $clientPayload, ]); } /** * Manage the collaborators of a repository. * * @link http://developer.github.com/v3/repos/collaborators/ * * @return Collaborators */ public function collaborators() { return new Collaborators($this->getClient()); } /** * Manage the comments of a repository. * * @link http://developer.github.com/v3/repos/comments/ * * @return Comments */ public function comments() { return new Comments($this->getClient()); } /** * Manage the commits of a repository. * * @link http://developer.github.com/v3/repos/commits/ * * @return Commits */ public function commits() { return new Commits($this->getClient()); } /** * @link https://docs.github.com/en/rest/reference/checks#check-runs */ public function checkRuns(): CheckRuns { return new CheckRuns($this->getClient()); } /** * @link https://docs.github.com/en/rest/reference/checks#check-suites */ public function checkSuites(): CheckSuites { return new CheckSuites($this->getClient()); } /** * @link https://developer.github.com/v3/actions/artifacts/#artifacts */ public function artifacts(): Artifacts { return new Artifacts($this->getClient()); } /** * @link https://docs.github.com/en/rest/reference/actions#workflows */ public function workflows(): Workflows { return new Workflows($this->getClient()); } /** * @link https://docs.github.com/en/rest/reference/actions#workflow-runs */ public function workflowRuns(): WorkflowRuns { return new WorkflowRuns($this->getClient()); } /** * @link https://docs.github.com/en/rest/reference/actions#workflow-jobs */ public function workflowJobs(): WorkflowJobs { return new WorkflowJobs($this->getClient()); } /** * @link https://docs.github.com/en/rest/reference/actions#self-hosted-runners */ public function selfHostedRunners(): SelfHostedRunners { return new SelfHostedRunners($this->getClient()); } /** * @link https://docs.github.com/en/rest/reference/actions#secrets */ public function secrets(): Secrets { return new Secrets($this->getClient()); } /** * Manage the content of a repository. * * @link http://developer.github.com/v3/repos/contents/ * * @return Contents */ public function contents() { return new Contents($this->getClient()); } /** * Manage the content of a repository. * * @link http://developer.github.com/v3/repos/downloads/ * * @return Downloads */ public function downloads() { return new Downloads($this->getClient()); } /** * Manage the releases of a repository (Currently Undocumented). * * @link http://developer.github.com/v3/repos/ * * @return Releases */ public function releases() { return new Releases($this->getClient()); } /** * Manage the deploy keys of a repository. * * @link http://developer.github.com/v3/repos/keys/ * * @return DeployKeys */ public function keys() { return new DeployKeys($this->getClient()); } /** * Manage the forks of a repository. * * @link http://developer.github.com/v3/repos/forks/ * * @return Forks */ public function forks() { return new Forks($this->getClient()); } /** * Manage the stargazers of a repository. * * @link https://developer.github.com/v3/activity/starring/#list-stargazers * * @return Stargazers */ public function stargazers() { return new Stargazers($this->getClient()); } /** * Manage the hooks of a repository. * * @link http://developer.github.com/v3/issues/jooks/ * * @return Hooks */ public function hooks() { return new Hooks($this->getClient()); } /** * Manage the labels of a repository. * * @link http://developer.github.com/v3/issues/labels/ * * @return Labels */ public function labels() { return new Labels($this->getClient()); } /** * Manage the statuses of a repository. * * @link http://developer.github.com/v3/repos/statuses/ * * @return Statuses */ public function statuses() { return new Statuses($this->getClient()); } /** * Get the branch(es) of a repository. * * @link http://developer.github.com/v3/repos/ * * @param string $username the username * @param string $repository the name of the repository * @param string $branch the name of the branch * @param array $parameters parameters for the query string * * @return array list of the repository branches */ public function branches($username, $repository, $branch = null, array $parameters = []) { $url = '/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/branches'; if (null !== $branch) { $url .= '/'.rawurlencode($branch); } return $this->get($url, $parameters); } /** * Manage the protection of a repository branch. * * @link https://developer.github.com/v3/repos/branches/#get-branch-protection * * @return Protection */ public function protection() { return new Protection($this->getClient()); } /** * Get the contributors of a repository. * * @link http://developer.github.com/v3/repos/ * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param bool $includingAnonymous by default, the list only shows GitHub users. * You can include non-users too by setting this to true * * @return array list of the repo contributors */ public function contributors($username, $repository, $includingAnonymous = false) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/contributors', [ 'anon' => $includingAnonymous ?: null, ]); } /** * Get the language breakdown of a repository. * * @link http://developer.github.com/v3/repos/ * * @param string $username the user who owns the repository * @param string $repository the name of the repository * * @return array list of the languages */ public function languages($username, $repository) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/languages'); } /** * Get the tags of a repository. * * @link http://developer.github.com/v3/repos/ * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param array $params the additional parameters like milestone, assignees, labels, sort, direction * * @return array list of the repository tags */ public function tags($username, $repository, array $params = []) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/tags', $params); } /** * Get the teams of a repository. * * @link http://developer.github.com/v3/repos/ * * @param string $username the user who owns the repo * @param string $repository the name of the repo * * @return array list of the languages */ public function teams($username, $repository) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/teams'); } /** * @param string $username * @param string $repository * @param int $page * * @return array */ public function subscribers($username, $repository, $page = 1) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/subscribers', [ 'page' => $page, ]); } /** * Perform a merge. * * @link http://developer.github.com/v3/repos/merging/ * * @param string $username * @param string $repository * @param string $base The name of the base branch that the head will be merged into. * @param string $head The head to merge. This can be a branch name or a commit SHA1. * @param string $message Commit message to use for the merge commit. If omitted, a default message will be used. * * @return array|string */ public function merge($username, $repository, $base, $head, $message = null) { $parameters = [ 'base' => $base, 'head' => $head, ]; if (is_string($message)) { $parameters['commit_message'] = $message; } return $this->post('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/merges', $parameters); } /** * @param string $username * @param string $repository * @param array $parameters * * @return array */ public function milestones($username, $repository, array $parameters = []) { return $this->get('/repos/'.rawurldecode($username).'/'.rawurldecode($repository).'/milestones', $parameters); } /** * @link https://docs.github.com/en/rest/reference/repos#enable-automated-security-fixes * * @param string $username * @param string $repository * * @return array|string */ public function enableAutomatedSecurityFixes(string $username, string $repository) { $this->acceptHeaderValue = 'application/vnd.github.london-preview+json'; return $this->put('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/automated-security-fixes'); } /** * @link https://docs.github.com/en/rest/reference/repos#disable-automated-security-fixes * * @param string $username * @param string $repository * * @return array|string */ public function disableAutomatedSecurityFixes(string $username, string $repository) { $this->acceptHeaderValue = 'application/vnd.github.london-preview+json'; return $this->delete('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/automated-security-fixes'); } public function projects() { return new Projects($this->getClient()); } public function traffic() { return new Traffic($this->getClient()); } public function pages() { return new Pages($this->getClient()); } /** * @param string $username * @param string $repository * @param int $page * * @return array|string * * @see https://developer.github.com/v3/activity/events/#list-repository-events */ public function events($username, $repository, $page = 1) { return $this->get('/repos/'.rawurldecode($username).'/'.rawurldecode($repository).'/events', ['page' => $page]); } /** * Get the community profile metrics for a repository. * * @link https://developer.github.com/v3/repos/community/#retrieve-community-profile-metrics * * @param string $username * @param string $repository * * @return array */ public function communityProfile($username, $repository) { //This api is in preview mode, so set the correct accept-header $this->acceptHeaderValue = 'application/vnd.github.black-panther-preview+json'; return $this->get('/repos/'.rawurldecode($username).'/'.rawurldecode($repository).'/community/profile'); } /** * Get the contents of a repository's code of conduct. * * @link https://developer.github.com/v3/codes_of_conduct/#get-the-contents-of-a-repositorys-code-of-conduct * * @param string $username * @param string $repository * * @return array */ public function codeOfConduct($username, $repository) { //This api is in preview mode, so set the correct accept-header $this->acceptHeaderValue = 'application/vnd.github.scarlet-witch-preview+json'; return $this->get('/repos/'.rawurldecode($username).'/'.rawurldecode($repository).'/community/code_of_conduct'); } /** * List all topics for a repository. * * @link https://developer.github.com/v3/repos/#list-all-topics-for-a-repository * * @param string $username * @param string $repository * * @return array */ public function topics($username, $repository) { //This api is in preview mode, so set the correct accept-header $this->acceptHeaderValue = 'application/vnd.github.mercy-preview+json'; return $this->get('/repos/'.rawurldecode($username).'/'.rawurldecode($repository).'/topics'); } /** * Replace all topics for a repository. * * @link https://developer.github.com/v3/repos/#replace-all-topics-for-a-repository * * @param string $username * @param string $repository * @param array $topics * * @return array */ public function replaceTopics($username, $repository, array $topics) { //This api is in preview mode, so set the correct accept-header $this->acceptHeaderValue = 'application/vnd.github.mercy-preview+json'; return $this->put('/repos/'.rawurldecode($username).'/'.rawurldecode($repository).'/topics', ['names' => $topics]); } /** * Transfer a repository. * * @link https://developer.github.com/v3/repos/#transfer-a-repository * * @param string $username * @param string $repository * @param string $newOwner * @param array $teamId * * @return array */ public function transfer($username, $repository, $newOwner, $teamId = []) { return $this->post('/repos/'.rawurldecode($username).'/'.rawurldecode($repository).'/transfer', ['new_owner' => $newOwner, 'team_id' => $teamId]); } /** * Create a repository using a template. * * @link https://developer.github.com/v3/repos/#create-a-repository-using-a-template * * @return array */ public function createFromTemplate(string $templateOwner, string $templateRepo, array $parameters = []) { //This api is in preview mode, so set the correct accept-header $this->acceptHeaderValue = 'application/vnd.github.baptiste-preview+json'; return $this->post('/repos/'.rawurldecode($templateOwner).'/'.rawurldecode($templateRepo).'/generate', $parameters); } }