## GitHub Component

*Available as of Camel version 2.15*

The GitHub component interacts with the GitHub API by
encapsulating http://org.eclipse.egit.github.core[egit-github]. It
currently provides polling for new pull requests, pull request comments,
tags, and commits.  It is also able to produce comments on pull
requests, as well as close the pull request entirely.

Rather than webhooks, this endpoint relies on simple polling. Reasons
include:

* Concern for reliability/stability
* The types of payloads we're polling aren't typically large (plus,
paging is available in the API)
* The need to support apps running somewhere not publicly accessible
where a webhook would fail

Note that the GitHub API is fairly expansive.  Therefore, this component
could be easily expanded to provide additional interactions.

Maven users will need to add the following dependency to their pom.xml
for this component:

[source,xml]
-----------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-github</artifactId>
    <version>${camel-version}</version>
</dependency>
-----------------------------------------

### URI format

[source,text]
---------------------------
github://endpoint[?options]
---------------------------

### Mandatory Options:

Note that these can be configured directly through the endpoint.


// component options: START
The GitHub component has no options.
// component options: END



// endpoint options: START
The GitHub endpoint is configured using URI syntax:

    github:type/branchName

with the following path and query parameters:

#### Path Parameters (2 parameters):

[width="100%",cols="2,5,^1,2",options="header"]
|=======================================================================
| Name | Description | Default | Type
| **type** | *Required* What git operation to execute |  | GitHubType
| **branchName** | Name of branch |  | String
|=======================================================================

#### Query Parameters (12 parameters):

[width="100%",cols="2,5,^1,2",options="header"]
|=======================================================================
| Name | Description | Default | Type
| **oauthToken** (common) | GitHub OAuth token required unless username & password are provided |  | String
| **password** (common) | GitHub password required unless oauthToken is provided |  | String
| **repoName** (common) | *Required* GitHub repository name |  | String
| **repoOwner** (common) | *Required* GitHub repository owner (organization) |  | String
| **username** (common) | GitHub username required unless oauthToken is provided |  | String
| **bridgeErrorHandler** (consumer) | Allows for bridging the consumer to the Camel routing Error Handler which mean any exceptions occurred while the consumer is trying to pickup incoming messages or the likes will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions that will be logged at WARN or ERROR level and ignored. | false | boolean
| **exceptionHandler** (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this options is not in use. By default the consumer will deal with exceptions that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| **exchangePattern** (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
| **encoding** (producer) | To use the given encoding when getting a git commit file |  | String
| **state** (producer) | To set git commit status state |  | String
| **targetUrl** (producer) | To set git commit status target url |  | String
| **synchronous** (advanced) | Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported). | false | boolean
|=======================================================================
// endpoint options: END



### Consumer Endpoints:

[width="100%",cols="20%,20%,60%",options="header",]
|=======================================================================
|Endpoint |Context |Body Type

|pullRequest |polling |org.eclipse.egit.github.core.PullRequest

|pullRequestComment |polling |org.eclipse.egit.github.core.Comment (comment on the general pull
request discussion) or org.eclipse.egit.github.core.CommitComment
(inline comment on a pull request diff)

|tag |polling |org.eclipse.egit.github.core.RepositoryTag

|commit |polling |org.eclipse.egit.github.core.RepositoryCommit
|=======================================================================

### Producer Endpoints:

[width="100%",cols="20%,20%,60%",options="header",]
|=======================================================================
|Endpoint |Body |Message Headers

|pullRequestComment |String (comment text) | - GitHubPullRequest (integer) (REQUIRED): Pull request number.

- GitHubInResponseTo (integer): Required if responding to another inline
comment on the pull request diff. If left off, a general comment on the
pull request discussion is assumed.

|closePullRequest |none | - GitHubPullRequest (integer) (REQUIRED): Pull request number.

|createIssue (From Camel 2.18) |String (issue body text) | - GitHubIssueTitle (String) (REQUIRED): Issue Title.
|=======================================================================
