| ## Using Tickets |
| |
| *SINCE 1.4.0* |
| |
| ### Creating Standard Tickets |
| |
| Standard tickets can be created using the web ui. These ticket types include *Bug*, *Enhancement*, *task*, and *Question*. |
| |
| ### Creating a Proposal Ticket |
| |
| Proposal tickets are created by pushing a **single commit** to the magic ref. They can not be created from the web ui. |
| |
| *Why is there a single commit limitation for creating a Proposal Ticket?* |
| |
| Because the ticket which will be created for your commit will use your commit's message to define the Ticket's *title* and *description*. After the ticket is created, you can add as many commits as you want to the ticket's branch. |
| |
| *Why would I create a proposal ticket?* |
| |
| Because you are too lazy to create a ticket in the web ui first. The proposal ticket is a convenience mechanism. It allows you to propose a change using Git, not your browser. |
| |
| *Who can create a proposal ticket?* |
| |
| Any authenticated user who can clone your repository. |
| |
| git clone https://server/r/repo.git |
| cd repo |
| git checkout -b mytopic |
| ...add a single commit... |
| git push origin HEAD:refs/for/new |
| # read ticket id from server output |
| git branch -u origin/ticket/{id} |
| |
| ### Creating the first Patchset for an Existing Ticket |
| |
| If you have an existing ticket that does **not** yet have a proposed patchset you can push using the ticket branch ref. |
| |
| *Who can create the first patchset for an existing ticket?* |
| |
| Any authenticated user who can clone your repository. |
| |
| git clone https://server/r/repo.git |
| cd repo |
| git checkout -b ticket/{id} |
| ...add one or more commits... |
| git push -u origin ticket/{id} |
| |
| ### Safely adding commits to a Patchset for an Existing Ticket |
| |
| *Who can add commits to an existing patchset?* |
| |
| 1. The ticket author |
| 2. The initial patchset author |
| 3. The person set as *responsible* |
| 4. Any user with write (RW) permissions to the repository |
| |
| |
| git fetch && git checkout ticket/{id} |
| git pull --ff-only |
| ...add one or more commits... |
| git push |
| |
| ### Checking-Out a Named Branch for an Existing Ticket with a Patchset |
| |
| If you prefer to name your local ticket branches rather than using the default integer ids, you can do this with a little more syntax. |
| |
| git checkout -b my_fix --track origin/ticket/{id} |
| |
| This will create a local branch named *my_fix* which tracks the upstream ticket branch. |
| |
| ### Rewriting a Patchset (amend, rebase, squash) |
| |
| *Who can rewrite a patchset?* |
| |
| See the above rules for who can add commits to a patchset. You do **not** need rewind (RW+) to the repository to push a non-fast-forward patchset. Gitblit will detect the non-fast-forward update and create a new patchset ref. This preserves the previous patchset. |
| |
| git fetch && git checkout ticket/{id} |
| git pull --ff-only |
| ...amend, rebase, squash... |
| git push origin HEAD:refs/for/{id} |
| |
| OR if you have RW+ permissions, then you can push using *-f* flag. |
| |
| git push -f |
| |
| ### Updating your copy of a rewritten Patchset |
| |
| If a patchset has been rewritten you can no longer simply *pull* to update. Let's assume your checkout **does not** have any unshared commits - i.e. it represents the previous patchset. The simplest way to update your branch to the current patchset is to reset it using the `-B` checkout flag. |
| |
| git fetch && git checkout -B ticket/{id} |
| |
| If you **do** have unshared commits then you'll could make a new temporary branch and then cherry-pick your changes onto the rewritten patchset. |
| |
| git branch oldticket ticket/{id} |
| git fetch && git checkout -B ticket/{id} |
| git cherry-pick <commitid1> <commitid2> |
| git branch -D oldticket |
| |
| Git is a very flexible tool, there are no doubt several other strategies you could use to resolve this situation. The above solution is just one way. |
| |
| ### Ticket RefSpecs |
| |
| Gitblit supports two primary push ref specs: the magic ref and the patchset ref. |
| |
| #### to create a new proposal ticket |
| |
| | ref | description | |
| | :------------------- | :------------------------------------------- | |
| | refs/for/new | new proposal for the default branch | |
| | refs/for/default | new proposal for the default branch | |
| | refs/for/{branch} | new proposal for the specified branch | |
| |
| #### to add a proposal patchset (first patchset) to an existing ticket |
| |
| | ref | description | |
| | :------------------- | :------------------------------------------- | |
| | refs/for/{id} | add new patchset to an existing ticket | |
| |
| #### to add commits to an existing patchset |
| |
| | ref | description | |
| | :--------------------------- | :----------------------------------- | |
| | refs/heads/ticket/{id} | fast-forward an existing patchset | |
| |
| |
| #### to rewrite a patchset (amend, rebase, squash) |
| |
| | magic ref | description | |
| | :------------------- | :------------------------------------------- | |
| | refs/for/{id} | to rewrite a patchset | |
| |
| ### Ticket RefSpec Tricks |
| |
| Gitblit supports setting some ticket fields from the push refspec. |
| |
| refs/for/master%topic=bug/42,r=james,m=1.4.1,cc=dave,cc=mark |
| |
| | parameter | description | |
| | :-------- | :-------------------------------------------------------------- | |
| | t | assign a *topic* to the ticket (matched against bugtraq config) | |
| | r | set the *responsible* user | |
| | m | set the *milestone* for patchset integration | |
| | cc | add this account to the *watch* list (multiple ccs allowed) | |
| |
| #### examples |
| |
| Create a new patchset for ticket *12*, add *james* and *mark* to the watch list, and set the topic to *JIRA-123* which will be regex-matched against the repository bugtraq configuration. |
| |
| git push origin HEAD:refs/for/12%cc=james,cc=mark,t=JIRA-123 |
| |
| Add some commits (fast-forward) to ticket *12*. Set the milestone to *1.4.1*. |
| |
| git push origin HEAD:refs/heads/ticket/12%m=1.4.1 |
| |
| ### Merging Patchsets |
| |
| The Gitblit web ui offers a merge button which will work for clean merges of a patchset to the integration branch. |
| |
| There are complicated merge scenarios for which it may be best to merge using your Git client. There are several ways to do this, here is a safe merge strategy which pulls into a new branch and then fast-forwards your integration branch, assuming you were happy with the pull (merge). |
| |
| git pull origin master |
| git checkout -b ticket-{id} master |
| git pull origin ticket/{id} |
| git checkout master |
| git merge ticket-{id} |
| git push origin master |
| git branch -d ticket-{id} |
| |
| ### Closing Tickets on Push with a Completely New Patchset |
| |
| Gitblit will look for patchset references on pushes to normal branches. If it finds a reference (like would be found in the previous merge instructions), the ticket is resolved as merged and everyone is notified. |
| |
| If you do not need to create a patchset for review, you can just push a commit to the integration branch that contains `fixes #1` or `closes #1` in the commit message. Gitblit will identify the ticket, create a new patchset with that commit as the tip, and resolve the ticket as merged. (And if the integration branch is not specified in the ticket - this is the case for a ticket without any existing patchsets - Gitblit will resolve the ticket as merged to the pushed branch). |
| |
| ### Reopening Tickets with Patchsets |
| |
| Gitblit allows you to reopen a Ticket with a merged patchset. Since Gitblit allows patchset rewrites and versions patchsets, this seems like a logical capability. There is no need to create another ticket for a feature request or bug report if the merged commits did not actually resolve the ticket. |
| |
| This allows you to continue the discussion and create a new patchset that hopefully resolves the need. |
| |
| **NOTE:** There is one caveat to this feature. You can not push patchsets to a closed ticket; Gitblit will reject the push. You must first reopen the ticket through the web ui before you may push your patchset update or new patchset. |
| |
| ### Reviews |
| |
| Gitblit includes a very simple patchset scoring mechanism. Gitblit is not code-review system, but for those who have simple needs, this may suffice. |
| |
| - +2, approved: patchset can be merged |
| - +1, looks good: someone else must approve for merge |
| - -1, needs improvement: please do not merge |
| - -2, vetoed: patchset may not be merged |
| |
| Only users with write (RW) permissions to the repository can give a +2 and -2 score. All other users are allowed to score +/-1. If the repository is configured to *require approval* then then +2 score has an important meaning. The merge button will only be shown if there is at least one +2 score and no -2 scores. If there is a -2 score, the merge is blocked by the web ui. Users with RW permissions, however, can still manually merge and push the patchset to the integration branch; Gitblit does not enforce vetoed patchsets on push. |
| |
| #### Reviews and Updated or Rewritten Patchsets |
| |
| If the patchset is updated or rewritten, all former review scores are ignored; review scores apply to specific revisions of patchsets - they are not blanket approvals/disapprovals. |