*/ class Contents extends AbstractApi { /** * Get content of README file in a repository * @link http://developer.github.com/v3/repos/contents/ * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param null|string $reference reference to a branch or commit * * @return array information for README file */ public function readme($username, $repository, $reference = null) { return $this->get('repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/readme', array( 'ref' => $reference )); } /** * Get contents of any file or directory in a repository * @link http://developer.github.com/v3/repos/contents/ * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param null|string $path path to file or directory * @param null|string $reference reference to a branch or commit * * @return array information for file | information for each item in directory */ public function show($username, $repository, $path = null, $reference = null) { $url = 'repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/contents'; if (null !== $path) { $url .= '/'.rawurlencode($path); } return $this->get($url, array( 'ref' => $reference )); } /** * Creates a new file in a repository * @link http://developer.github.com/v3/repos/contents/#create-a-file * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param string $path path to file * @param string $content contents of the new file * @param string $message the commit message * @param null|string $branch name of a branch * @param null|array $committer information about the committer * * @throws MissingArgumentException * * @return array information about the new file */ public function create($username, $repository, $path, $content, $message, $branch = null, array $committer = null) { $url = 'repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/contents/'.rawurlencode($path); $parameters = array( 'content' => base64_encode($content), 'message' => $message, ); if (null !== $branch) { $parameters['branch'] = $branch; } if (null !== $committer) { if (!isset($committer['name'], $committer['email'])) { throw new MissingArgumentException(array('name', 'email')); } $parameters['committer'] = $committer; } return $this->put($url, $parameters); } /** * Checks that a given path exists in a repository. * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param string $path path of file to check * @param null|string $reference reference to a branch or commit * @return boolean */ public function exists($username, $repository, $path, $reference = null) { $url = 'repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/contents'; if (null !== $path) { $url .= '/'.rawurlencode($path); } try { $response = $this->head($url, array( 'ref' => $reference )); if ($response->getStatusCode() != 200) { return false; } } catch (TwoFactorAuthenticationRequiredException $ex) { throw $ex; } catch (\Exception $ex) { return false; } return true; } /** * Updates the contents of a file in a repository * @link http://developer.github.com/v3/repos/contents/#update-a-file * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param string $path path to file * @param string $content contents of the new file * @param string $message the commit message * @param string $sha blob SHA of the file being replaced * @param null|string $branch name of a branch * @param null|array $committer information about the committer * * @throws MissingArgumentException * * @return array information about the updated file */ public function update($username, $repository, $path, $content, $message, $sha, $branch = null, array $committer = null) { $url = 'repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/contents/'.rawurlencode($path); $parameters = array( 'content' => base64_encode($content), 'message' => $message, 'sha' => $sha, ); if (null !== $branch) { $parameters['branch'] = $branch; } if (null !== $committer) { if (!isset($committer['name'], $committer['email'])) { throw new MissingArgumentException(array('name', 'email')); } $parameters['committer'] = $committer; } return $this->put($url, $parameters); } /** * Deletes a file from a repository * @link http://developer.github.com/v3/repos/contents/#delete-a-file * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param string $path path to file * @param string $message the commit message * @param string $sha blob SHA of the file being deleted * @param null|string $branch name of a branch * @param null|array $committer information about the committer * * @throws MissingArgumentException * * @return array information about the updated file */ public function rm($username, $repository, $path, $message, $sha, $branch = null, array $committer = null) { $url = 'repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/contents/'.rawurlencode($path); $parameters = array( 'message' => $message, 'sha' => $sha, ); if (null !== $branch) { $parameters['branch'] = $branch; } if (null !== $committer) { if (!isset($committer['name'], $committer['email'])) { throw new MissingArgumentException(array('name', 'email')); } $parameters['committer'] = $committer; } return $this->delete($url, $parameters); } /** * Get content of archives in a repository * @link http://developer.github.com/v3/repos/contents/ * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param string $format format of archive: tarball or zipball * @param null|string $reference reference to a branch or commit * * @return array information for archives */ public function archive($username, $repository, $format, $reference = null) { if (!in_array($format, array('tarball', 'zipball'))) { $format = 'tarball'; } return $this->get('repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/'.rawurlencode($format), array( 'ref' => $reference )); } /** * Get the contents of a file in a repository * * @param string $username the user who owns the repository * @param string $repository the name of the repository * @param string $path path to file * @param null|string $reference reference to a branch or commit * * @return null|string content of file, or null in case of base64_decode failure * * @throws InvalidArgumentException If $path is not a file or if its encoding is different from base64 * @throws ErrorException If $path doesn't include a 'content' index */ public function download($username, $repository, $path, $reference = null) { $file = $this->show($username, $repository, $path, $reference); if (!isset($file['type']) || 'file' !== $file['type']) { throw new InvalidArgumentException(sprintf('Path "%s" is not a file.', $path)); } if (!isset($file['content'])) { throw new ErrorException(sprintf('Unable to access "content" for file "%s" (possible keys: "%s").', $path, implode(', ', array_keys($file)))); } if (!isset($file['encoding'])) { throw new InvalidArgumentException(sprintf('Can\'t decode content of file "%s", as no encoding is defined.', $path)); } if ('base64' !== $file['encoding']) { throw new InvalidArgumentException(sprintf('Encoding "%s" of file "%s" is not supported.', $file['encoding'], $path)); } return base64_decode($file['content']) ?: null; } }