/** * @file * @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc. * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}. * Github.js is freely distributable. */import Requestable from './Requestable';import Utf8 from 'utf8';import { Base64,} from 'js-base64';import debug from 'debug';const log = debug('github:repository');/** * Respository encapsulates the functionality to create, query, and modify files. */class Repository extends Requestable { /** * Create a Repository. * @param {string} fullname - the full name of the repository * @param {Requestable.auth} [auth] - information required to authenticate to Github * @param {string} [apiBase=https://api.github.com] - the base Github API URL */ constructor(fullname, auth, apiBase) { super(auth, apiBase); this.__fullname = fullname; this.__currentTree = { branch: null, sha: null, }; } /** * Get a reference * @see https://developer.github.com/v3/git/refs/#get-a-reference * @param {string} ref - the reference to get * @param {Requestable.callback} [cb] - will receive the reference's refSpec or a list of refSpecs that match `ref` * @return {Promise} - the promise for the http request */ getRef(ref, cb) { return this._request('GET', `/repos/${this.__fullname}/git/refs/${ref}`, null, cb); } /** * Create a reference * @see https://developer.github.com/v3/git/refs/#create-a-reference * @param {Object} options - the object describing the ref * @param {Requestable.callback} [cb] - will receive the ref * @return {Promise} - the promise for the http request */ createRef(options, cb) { return this._request('POST', `/repos/${this.__fullname}/git/refs`, options, cb); } /** * Delete a reference * @see https://developer.github.com/v3/git/refs/#delete-a-reference * @param {string} ref - the name of the ref to delte * @param {Requestable.callback} [cb] - will receive true if the request is successful * @return {Promise} - the promise for the http request */ deleteRef(ref, cb) { return this._request('DELETE', `/repos/${this.__fullname}/git/refs/${ref}`, null, cb); } /** * Delete a repository * @see https://developer.github.com/v3/repos/#delete-a-repository * @param {Requestable.callback} [cb] - will receive true if the request is successful * @return {Promise} - the promise for the http request */ deleteRepo(cb) { return this._request('DELETE', `/repos/${this.__fullname}`, null, cb); } /** * List the tags on a repository * @see https://developer.github.com/v3/repos/#list-tags * @param {Requestable.callback} [cb] - will receive the tag data * @return {Promise} - the promise for the http request */ listTags(cb) { return this._request('GET', `/repos/${this.__fullname}/tags`, null, cb); } /** * List the open pull requests on the repository * @see https://developer.github.com/v3/pulls/#list-pull-requests * @param {Object} options - options to filter the search * @param {Requestable.callback} [cb] - will receive the list of PRs * @return {Promise} - the promise for the http request */ listPullRequests(options, cb) { options = options || {}; return this._request('GET', `/repos/${this.__fullname}/pulls`, options, cb); } /** * Get information about a specific pull request * @see https://developer.github.com/v3/pulls/#get-a-single-pull-request * @param {number} number - the PR you wish to fetch * @param {Requestable.callback} [cb] - will receive the PR from the API * @return {Promise} - the promise for the http request */ getPullRequest(number, cb) { return this._request('GET', `/repos/${this.__fullname}/pulls/${number}`, null, cb); } /** * List the files of a specific pull request * @see https://developer.github.com/v3/pulls/#list-pull-requests-files * @param {number|string} number - the PR you wish to fetch * @param {Requestable.callback} [cb] - will receive the list of files from the API * @return {Promise} - the promise for the http request */ listPullRequestFiles(number, cb) { return this._request('GET', `/repos/${this.__fullname}/pulls/${number}/files`, null, cb); } /** * Compare two branches/commits/repositories * @see https://developer.github.com/v3/repos/commits/#compare-two-commits * @param {string} base - the base commit * @param {string} head - the head commit * @param {Requestable.callback} cb - will receive the comparison * @return {Promise} - the promise for the http request */ compareBranches(base, head, cb) { return this._request('GET', `/repos/${this.__fullname}/compare/${base}...${head}`, null, cb); } /** * List all the branches for the repository * @see https://developer.github.com/v3/repos/#list-branches * @param {Requestable.callback} cb - will receive the list of branches * @return {Promise} - the promise for the http request */ listBranches(cb) { return this._request('GET', `/repos/${this.__fullname}/branches`, null, cb); } /** * Get a raw blob from the repository * @see https://developer.github.com/v3/git/blobs/#get-a-blob * @param {string} sha - the sha of the blob to fetch * @param {Requestable.callback} cb - will receive the blob from the API * @return {Promise} - the promise for the http request */ getBlob(sha, cb) { return this._request('GET', `/repos/${this.__fullname}/git/blobs/${sha}`, null, cb, 'raw'); } /** * Get a single branch * @see https://developer.github.com/v3/repos/branches/#get-branch * @param {string} branch - the name of the branch to fetch * @param {Requestable.callback} cb - will receive the branch from the API * @returns {Promise} - the promise for the http request */ getBranch(branch, cb) { return this._request('GET', `/repos/${this.__fullname}/branches/${branch}`, null, cb); } /** * Get a commit from the repository * @see https://developer.github.com/v3/repos/commits/#get-a-single-commit * @param {string} sha - the sha for the commit to fetch * @param {Requestable.callback} cb - will receive the commit data * @return {Promise} - the promise for the http request */ getCommit(sha, cb) { return this._request('GET', `/repos/${this.__fullname}/git/commits/${sha}`, null, cb); } /** * List the commits on a repository, optionally filtering by path, author or time range * @see https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository * @param {Object} [options] - the filtering options for commits * @param {string} [options.sha] - the SHA or branch to start from * @param {string} [options.path] - the path to search on * @param {string} [options.author] - the commit author * @param {(Date|string)} [options.since] - only commits after this date will be returned * @param {(Date|string)} [options.until] - only commits before this date will be returned * @param {Requestable.callback} cb - will receive the list of commits found matching the criteria * @return {Promise} - the promise for the http request */ listCommits(options, cb) { options = options || {}; options.since = this._dateToISO(options.since); options.until = this._dateToISO(options.until); return this._request('GET', `/repos/${this.__fullname}/commits`, options, cb); } /** * Gets a single commit information for a repository * @see https://developer.github.com/v3/repos/commits/#get-a-single-commit * @param {string} ref - the reference for the commit-ish * @param {Requestable.callback} cb - will receive the commit information * @return {Promise} - the promise for the http request */ getSingleCommit(ref, cb) { ref = ref || ''; return this._request('GET', `/repos/${this.__fullname}/commits/${ref}`, null, cb); } /** * Get tha sha for a particular object in the repository. This is a convenience function * @see https://developer.github.com/v3/repos/contents/#get-contents * @param {string} [branch] - the branch to look in, or the repository's default branch if omitted * @param {string} path - the path of the file or directory * @param {Requestable.callback} cb - will receive a description of the requested object, including a `SHA` property * @return {Promise} - the promise for the http request */ getSha(branch, path, cb) { branch = branch ? `?ref=${branch}` : ''; return this._request('GET', `/repos/${this.__fullname}/contents/${path}${branch}`, null, cb); } /** * List the commit statuses for a particular sha, branch, or tag * @see https://developer.github.com/v3/repos/statuses/#list-statuses-for-a-specific-ref * @param {string} sha - the sha, branch, or tag to get statuses for * @param {Requestable.callback} cb - will receive the list of statuses * @return {Promise} - the promise for the http request */ listStatuses(sha, cb) { return this._request('GET', `/repos/${this.__fullname}/commits/${sha}/statuses`, null, cb); } /** * Get a description of a git tree * @see https://developer.github.com/v3/git/trees/#get-a-tree * @param {string} treeSHA - the SHA of the tree to fetch * @param {Requestable.callback} cb - will receive the callback data * @return {Promise} - the promise for the http request */ getTree(treeSHA, cb) { return this._request('GET', `/repos/${this.__fullname}/git/trees/${treeSHA}`, null, cb); } /** * Create a blob * @see https://developer.github.com/v3/git/blobs/#create-a-blob * @param {(string|Buffer|Blob)} content - the content to add to the repository * @param {Requestable.callback} cb - will receive the details of the created blob * @return {Promise} - the promise for the http request */ createBlob(content, cb) { let postBody = this._getContentObject(content); log('sending content', postBody); return this._request('POST', `/repos/${this.__fullname}/git/blobs`, postBody, cb); } /** * Get the object that represents the provided content * @param {string|Buffer|Blob} content - the content to send to the server * @return {Object} the representation of `content` for the GitHub API */ _getContentObject(content) { if (typeof content === 'string') { log('contet is a string'); return { content: Utf8.encode(content), encoding: 'utf-8', }; } else if (typeof Buffer !== 'undefined' && content instanceof Buffer) { log('We appear to be in Node'); return { content: content.toString('base64'), encoding: 'base64', }; } else if (typeof Blob !== 'undefined' && content instanceof Blob) { log('We appear to be in the browser'); return { content: Base64.encode(content), encoding: 'base64', }; } else { // eslint-disable-line log(`Not sure what this content is: ${typeof content}, ${JSON.stringify(content)}`); throw new Error('Unknown content passed to postBlob. Must be string or Buffer (node) or Blob (web)'); } } /** * Update a tree in Git * @see https://developer.github.com/v3/git/trees/#create-a-tree * @param {string} baseTreeSHA - the SHA of the tree to update * @param {string} path - the path for the new file * @param {string} blobSHA - the SHA for the blob to put at `path` * @param {Requestable.callback} cb - will receive the new tree that is created * @return {Promise} - the promise for the http request * @deprecated use {@link Repository#createTree} instead */ updateTree(baseTreeSHA, path, blobSHA, cb) { let newTree = { base_tree: baseTreeSHA, // eslint-disable-line tree: [{ path: path, sha: blobSHA, mode: '100644', type: 'blob', }], }; return this._request('POST', `/repos/${this.__fullname}/git/trees`, newTree, cb); } /** * Create a new tree in git * @see https://developer.github.com/v3/git/trees/#create-a-tree * @param {Object} tree - the tree to create * @param {string} baseSHA - the root sha of the tree * @param {Requestable.callback} cb - will receive the new tree that is created * @return {Promise} - the promise for the http request */ createTree(tree, baseSHA, cb) { return this._request('POST', `/repos/${this.__fullname}/git/trees`, { tree, base_tree: baseSHA, // eslint-disable-line camelcase }, cb); } /** * Add a commit to the repository * @see https://developer.github.com/v3/git/commits/#create-a-commit * @param {string} parent - the SHA of the parent commit * @param {string} tree - the SHA of the tree for this commit * @param {string} message - the commit message * @param {Requestable.callback} cb - will receive the commit that is created * @return {Promise} - the promise for the http request */ commit(parent, tree, message, cb) { let data = { message, tree, parents: [parent], }; return this._request('POST', `/repos/${this.__fullname}/git/commits`, data, cb) .then((response) => { this.__currentTree.sha = response.data.sha; // Update latest commit return response; }); } /** * Update a ref * @see https://developer.github.com/v3/git/refs/#update-a-reference * @param {string} ref - the ref to update * @param {string} commitSHA - the SHA to point the reference to * @param {boolean} force - indicates whether to force or ensure a fast-forward update * @param {Requestable.callback} cb - will receive the updated ref back * @return {Promise} - the promise for the http request */ updateHead(ref, commitSHA, force, cb) { return this._request('PATCH', `/repos/${this.__fullname}/git/refs/${ref}`, { sha: commitSHA, force: force, }, cb); } /** * Update commit status * @see https://developer.github.com/v3/repos/statuses/ * @param {string} commitSHA - the SHA of the commit that should be updated * @param {object} options - Commit status parameters * @param {string} options.state - The state of the status. Can be one of: pending, success, error, or failure. * @param {string} [options.target_url] - The target URL to associate with this status. * @param {string} [options.description] - A short description of the status. * @param {string} [options.context] - A string label to differentiate this status among CI systems. * @param {Requestable.callback} cb - will receive the updated commit back * @return {Promise} - the promise for the http request */ updateStatus(commitSHA, options, cb) { return this._request('POST', `/repos/${this.__fullname}/statuses/${commitSHA}`, options, cb); } /** * Update repository information * @see https://developer.github.com/v3/repos/#edit * @param {object} options - New parameters that will be set to the repository * @param {string} options.name - Name of the repository * @param {string} [options.description] - A short description of the repository * @param {string} [options.homepage] - A URL with more information about the repository * @param {boolean} [options.private] - Either true to make the repository private, or false to make it public. * @param {boolean} [options.has_issues] - Either true to enable issues for this repository, false to disable them. * @param {boolean} [options.has_wiki] - Either true to enable the wiki for this repository, false to disable it. * @param {boolean} [options.has_downloads] - Either true to enable downloads, false to disable them. * @param {string} [options.default_branch] - Updates the default branch for this repository. * @param {Requestable.callback} cb - will receive the updated repository back * @return {Promise} - the promise for the http request */ updateRepository(options, cb) { return this._request('PATCH', `/repos/${this.__fullname}`, options, cb); } /** * Get information about the repository * @see https://developer.github.com/v3/repos/#get * @param {Requestable.callback} cb - will receive the information about the repository * @return {Promise} - the promise for the http request */ getDetails(cb) { return this._request('GET', `/repos/${this.__fullname}`, null, cb); } /** * List the contributors to the repository * @see https://developer.github.com/v3/repos/#list-contributors * @param {Requestable.callback} cb - will receive the list of contributors * @return {Promise} - the promise for the http request */ getContributors(cb) { return this._request('GET', `/repos/${this.__fullname}/contributors`, null, cb); } /** * List the contributor stats to the repository * @see https://developer.github.com/v3/repos/#list-contributors * @param {Requestable.callback} cb - will receive the list of contributors * @return {Promise} - the promise for the http request */ getContributorStats(cb) { return this._request('GET', `/repos/${this.__fullname}/stats/contributors`, null, cb); } /** * List the users who are collaborators on the repository. The currently authenticated user must have * push access to use this method * @see https://developer.github.com/v3/repos/collaborators/#list-collaborators * @param {Requestable.callback} cb - will receive the list of collaborators * @return {Promise} - the promise for the http request */ getCollaborators(cb) { return this._request('GET', `/repos/${this.__fullname}/collaborators`, null, cb); } /** * Check if a user is a collaborator on the repository * @see https://developer.github.com/v3/repos/collaborators/#check-if-a-user-is-a-collaborator * @param {string} username - the user to check * @param {Requestable.callback} cb - will receive true if the user is a collaborator and false if they are not * @return {Promise} - the promise for the http request {Boolean} [description] */ isCollaborator(username, cb) { return this._request('GET', `/repos/${this.__fullname}/collaborators/${username}`, null, cb); } /** * Get the contents of a repository * @see https://developer.github.com/v3/repos/contents/#get-contents * @param {string} ref - the ref to check * @param {string} path - the path containing the content to fetch * @param {boolean} raw - `true` if the results should be returned raw instead of GitHub's normalized format * @param {Requestable.callback} cb - will receive the fetched data * @return {Promise} - the promise for the http request */ getContents(ref, path, raw, cb) { path = path ? `${encodeURI(path)}` : ''; return this._request('GET', `/repos/${this.__fullname}/contents/${path}`, { ref, }, cb, raw); } /** * Get the README of a repository * @see https://developer.github.com/v3/repos/contents/#get-the-readme * @param {string} ref - the ref to check * @param {boolean} raw - `true` if the results should be returned raw instead of GitHub's normalized format * @param {Requestable.callback} cb - will receive the fetched data * @return {Promise} - the promise for the http request */ getReadme(ref, raw, cb) { return this._request('GET', `/repos/${this.__fullname}/readme`, { ref, }, cb, raw); } /** * Fork a repository * @see https://developer.github.com/v3/repos/forks/#create-a-fork * @param {Requestable.callback} cb - will receive the information about the newly created fork * @return {Promise} - the promise for the http request */ fork(cb) { return this._request('POST', `/repos/${this.__fullname}/forks`, null, cb); } /** * List a repository's forks * @see https://developer.github.com/v3/repos/forks/#list-forks * @param {Requestable.callback} cb - will receive the list of repositories forked from this one * @return {Promise} - the promise for the http request */ listForks(cb) { return this._request('GET', `/repos/${this.__fullname}/forks`, null, cb); } /** * Create a new branch from an existing branch. * @param {string} [oldBranch=master] - the name of the existing branch * @param {string} newBranch - the name of the new branch * @param {Requestable.callback} cb - will receive the commit data for the head of the new branch * @return {Promise} - the promise for the http request */ createBranch(oldBranch, newBranch, cb) { if (typeof newBranch === 'function') { cb = newBranch; newBranch = oldBranch; oldBranch = 'master'; } return this.getRef(`heads/${oldBranch}`) .then((response) => { let sha = response.data.object.sha; return this.createRef({ sha, ref: `refs/heads/${newBranch}`, }, cb); }); } /** * Create a new pull request * @see https://developer.github.com/v3/pulls/#create-a-pull-request * @param {Object} options - the pull request description * @param {Requestable.callback} cb - will receive the new pull request * @return {Promise} - the promise for the http request */ createPullRequest(options, cb) { return this._request('POST', `/repos/${this.__fullname}/pulls`, options, cb); } /** * Update a pull request * @see https://developer.github.com/v3/pulls/#update-a-pull-request * @param {number|string} number - the number of the pull request to update * @param {Object} options - the pull request description * @param {Requestable.callback} [cb] - will receive the pull request information * @return {Promise} - the promise for the http request */ updatePullRequest(number, options, cb) { return this._request('PATCH', `/repos/${this.__fullname}/pulls/${number}`, options, cb); } /** * List the hooks for the repository * @see https://developer.github.com/v3/repos/hooks/#list-hooks * @param {Requestable.callback} cb - will receive the list of hooks * @return {Promise} - the promise for the http request */ listHooks(cb) { return this._request('GET', `/repos/${this.__fullname}/hooks`, null, cb); } /** * Get a hook for the repository * @see https://developer.github.com/v3/repos/hooks/#get-single-hook * @param {number} id - the id of the webook * @param {Requestable.callback} cb - will receive the details of the webook * @return {Promise} - the promise for the http request */ getHook(id, cb) { return this._request('GET', `/repos/${this.__fullname}/hooks/${id}`, null, cb); } /** * Add a new hook to the repository * @see https://developer.github.com/v3/repos/hooks/#create-a-hook * @param {Object} options - the configuration describing the new hook * @param {Requestable.callback} cb - will receive the new webhook * @return {Promise} - the promise for the http request */ createHook(options, cb) { return this._request('POST', `/repos/${this.__fullname}/hooks`, options, cb); } /** * Edit an existing webhook * @see https://developer.github.com/v3/repos/hooks/#edit-a-hook * @param {number} id - the id of the webhook * @param {Object} options - the new description of the webhook * @param {Requestable.callback} cb - will receive the updated webhook * @return {Promise} - the promise for the http request */ updateHook(id, options, cb) { return this._request('PATCH', `/repos/${this.__fullname}/hooks/${id}`, options, cb); } /** * Delete a webhook * @see https://developer.github.com/v3/repos/hooks/#delete-a-hook * @param {number} id - the id of the webhook to be deleted * @param {Requestable.callback} cb - will receive true if the call is successful * @return {Promise} - the promise for the http request */ deleteHook(id, cb) { return this._request('DELETE', `${this.__fullname}/hooks/${id}`, null, cb); } /** * List the deploy keys for the repository * @see https://developer.github.com/v3/repos/keys/#list-deploy-keys * @param {Requestable.callback} cb - will receive the list of deploy keys * @return {Promise} - the promise for the http request */ listKeys(cb) { return this._request('GET', `/repos/${this.__fullname}/keys`, null, cb); } /** * Get a deploy key for the repository * @see https://developer.github.com/v3/repos/keys/#get-a-deploy-key * @param {number} id - the id of the deploy key * @param {Requestable.callback} cb - will receive the details of the deploy key * @return {Promise} - the promise for the http request */ getKey(id, cb) { return this._request('GET', `/repos/${this.__fullname}/keys/${id}`, null, cb); } /** * Add a new deploy key to the repository * @see https://developer.github.com/v3/repos/keys/#add-a-new-deploy-key * @param {Object} options - the configuration describing the new deploy key * @param {Requestable.callback} cb - will receive the new deploy key * @return {Promise} - the promise for the http request */ createKey(options, cb) { return this._request('POST', `/repos/${this.__fullname}/keys`, options, cb); } /** * Delete a deploy key * @see https://developer.github.com/v3/repos/keys/#remove-a-deploy-key * @param {number} id - the id of the deploy key to be deleted * @param {Requestable.callback} cb - will receive true if the call is successful * @return {Promise} - the promise for the http request */ deleteKey(id, cb) { return this._request('DELETE', `/repos/${this.__fullname}/keys/${id}`, null, cb); } /** * Delete a file from a branch * @see https://developer.github.com/v3/repos/contents/#delete-a-file * @param {string} branch - the branch to delete from, or the default branch if not specified * @param {string} path - the path of the file to remove * @param {Requestable.callback} cb - will receive the commit in which the delete occurred * @return {Promise} - the promise for the http request */ deleteFile(branch, path, cb) { return this.getSha(branch, path) .then((response) => { const deleteCommit = { message: `Delete the file at '${path}'`, sha: response.data.sha, branch, }; return this._request('DELETE', `/repos/${this.__fullname}/contents/${path}`, deleteCommit, cb); }); } /** * Change all references in a repo from oldPath to new_path * @param {string} branch - the branch to carry out the reference change, or the default branch if not specified * @param {string} oldPath - original path * @param {string} newPath - new reference path * @param {Requestable.callback} cb - will receive the commit in which the move occurred * @return {Promise} - the promise for the http request */ move(branch, oldPath, newPath, cb) { let oldSha; return this.getRef(`heads/${branch}`) .then(({data: {object}}) => this.getTree(`${object.sha}?recursive=true`)) .then(({data: {tree, sha}}) => { oldSha = sha; let newTree = tree.map((ref) => { if (ref.path === oldPath) { ref.path = newPath; } if (ref.type === 'tree') { delete ref.sha; } return ref; }); return this.createTree(newTree); }) .then(({data: tree}) => this.commit(oldSha, tree.sha, `Renamed '${oldPath}' to '${newPath}'`)) .then(({data: commit}) => this.updateHead(`heads/${branch}`, commit.sha, true, cb)); } /** * Write a file to the repository * @see https://developer.github.com/v3/repos/contents/#update-a-file * @param {string} branch - the name of the branch * @param {string} path - the path for the file * @param {string} content - the contents of the file * @param {string} message - the commit message * @param {Object} [options] - commit options * @param {Object} [options.author] - the author of the commit * @param {Object} [options.commiter] - the committer * @param {boolean} [options.encode] - true if the content should be base64 encoded * @param {Requestable.callback} cb - will receive the new commit * @return {Promise} - the promise for the http request */ writeFile(branch, path, content, message, options, cb) { if (typeof options === 'function') { cb = options; options = {}; } let filePath = path ? encodeURI(path) : ''; let shouldEncode = options.encode !== false; let commit = { branch, message, author: options.author, committer: options.committer, content: shouldEncode ? Base64.encode(content) : content, }; return this.getSha(branch, filePath) .then((response) => { commit.sha = response.data.sha; return this._request('PUT', `/repos/${this.__fullname}/contents/${filePath}`, commit, cb); }, () => { return this._request('PUT', `/repos/${this.__fullname}/contents/${filePath}`, commit, cb); }); } /** * Check if a repository is starred by you * @see https://developer.github.com/v3/activity/starring/#check-if-you-are-starring-a-repository * @param {Requestable.callback} cb - will receive true if the repository is starred and false if the repository * is not starred * @return {Promise} - the promise for the http request {Boolean} [description] */ isStarred(cb) { return this._request204or404(`/user/starred/${this.__fullname}`, null, cb); } /** * Star a repository * @see https://developer.github.com/v3/activity/starring/#star-a-repository * @param {Requestable.callback} cb - will receive true if the repository is starred * @return {Promise} - the promise for the http request */ star(cb) { return this._request('PUT', `/user/starred/${this.__fullname}`, null, cb); } /** * Unstar a repository * @see https://developer.github.com/v3/activity/starring/#unstar-a-repository * @param {Requestable.callback} cb - will receive true if the repository is unstarred * @return {Promise} - the promise for the http request */ unstar(cb) { return this._request('DELETE', `/user/starred/${this.__fullname}`, null, cb); } /** * Create a new release * @see https://developer.github.com/v3/repos/releases/#create-a-release * @param {Object} options - the description of the release * @param {Requestable.callback} cb - will receive the newly created release * @return {Promise} - the promise for the http request */ createRelease(options, cb) { return this._request('POST', `/repos/${this.__fullname}/releases`, options, cb); } /** * Edit a release * @see https://developer.github.com/v3/repos/releases/#edit-a-release * @param {string} id - the id of the release * @param {Object} options - the description of the release * @param {Requestable.callback} cb - will receive the modified release * @return {Promise} - the promise for the http request */ updateRelease(id, options, cb) { return this._request('PATCH', `/repos/${this.__fullname}/releases/${id}`, options, cb); } /** * Get information about all releases * @see https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository * @param {Requestable.callback} cb - will receive the release information * @return {Promise} - the promise for the http request */ listReleases(cb) { return this._request('GET', `/repos/${this.__fullname}/releases`, null, cb); } /** * Get information about a release * @see https://developer.github.com/v3/repos/releases/#get-a-single-release * @param {string} id - the id of the release * @param {Requestable.callback} cb - will receive the release information * @return {Promise} - the promise for the http request */ getRelease(id, cb) { return this._request('GET', `/repos/${this.__fullname}/releases/${id}`, null, cb); } /** * Delete a release * @see https://developer.github.com/v3/repos/releases/#delete-a-release * @param {string} id - the release to be deleted * @param {Requestable.callback} cb - will receive true if the operation is successful * @return {Promise} - the promise for the http request */ deleteRelease(id, cb) { return this._request('DELETE', `/repos/${this.__fullname}/releases/${id}`, null, cb); } /** * Merge a pull request * @see https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button * @param {number|string} number - the number of the pull request to merge * @param {Object} options - the merge options for the pull request * @param {Requestable.callback} [cb] - will receive the merge information if the operation is successful * @return {Promise} - the promise for the http request */ mergePullRequest(number, options, cb) { return this._request('PUT', `/repos/${this.__fullname}/pulls/${number}/merge`, options, cb); } /** * Get information about all projects * @see https://developer.github.com/v3/projects/#list-repository-projects * @param {Requestable.callback} [cb] - will receive the list of projects * @return {Promise} - the promise for the http request */ listProjects(cb) { return this._requestAllPages(`/repos/${this.__fullname}/projects`, {AcceptHeader: 'inertia-preview'}, cb); } /** * Create a new project * @see https://developer.github.com/v3/projects/#create-a-repository-project * @param {Object} options - the description of the project * @param {Requestable.callback} cb - will receive the newly created project * @return {Promise} - the promise for the http request */ createProject(options, cb) { options = options || {}; options.AcceptHeader = 'inertia-preview'; return this._request('POST', `/repos/${this.__fullname}/projects`, options, cb); }}module.exports = Repository;