Merge branch 'stable-2.9'
* stable-2.9: Add support for JCE (Java Cryptography Extension) ciphers Buck: Respect gerrit-gwtui-common dependency for GWT plugins More improvements in the change info block UI Add a section about the submit type to the project owner guide Fix: Wrong exception mapping in ReceiveCommmits Fix REST example for removing included groups from a group rest-api-groups.txt: Correct input examples to use [] for lists Document project options Allow service users to access REST API if auth.gitBasicAuth = true Improve documentation about project creation Make singleusergroup a core plugin Rename 'Change Submit Action' in documentation to 'Submit Type' ProjectInfoScreen: Display submit type and content merge next to each other Add guide for project owners Improve description of the auth.gitBasicAuth parameter Conflicts: Documentation/config-gerrit.txt Documentation/rest-api-groups.txt gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java Change-Id: I269f8f1395c352d8d90ba4f770a19296a50967de
This commit is contained in:
		@@ -6,6 +6,7 @@ to those groups.  Access rights cannot be granted to individual
 | 
			
		||||
users.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[[system_groups]]
 | 
			
		||||
== System Groups
 | 
			
		||||
 | 
			
		||||
Gerrit comes with following system groups:
 | 
			
		||||
@@ -375,6 +376,7 @@ review is made.  This functionality is provided by the review-notes plugin.
 | 
			
		||||
These are references with added functionality to them compared to a regular
 | 
			
		||||
git push operation.
 | 
			
		||||
 | 
			
		||||
[[refs_for]]
 | 
			
		||||
==== refs/for/<branch ref>
 | 
			
		||||
 | 
			
		||||
Most prominent is the `refs/for/<branch ref>` reference which is the reference
 | 
			
		||||
@@ -818,6 +820,7 @@ by the 'Force Edit' flag. If this flag is not set the topic can only be
 | 
			
		||||
edited on open changes.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[[example_roles]]
 | 
			
		||||
== Examples of typical roles in a project
 | 
			
		||||
 | 
			
		||||
Below follows a set of typical roles on a server and which access
 | 
			
		||||
 
 | 
			
		||||
@@ -113,7 +113,7 @@ Defaults to MERGE_IF_NECESSARY unless
 | 
			
		||||
link:config-gerrit.html#repository.name.defaultSubmitType[
 | 
			
		||||
repository.<name>.defaultSubmitType] is set to a different value.
 | 
			
		||||
For more details see link:project-setup.html#submit_type[
 | 
			
		||||
Change Submit Actions].
 | 
			
		||||
Submit Types].
 | 
			
		||||
 | 
			
		||||
--use-content-merge::
 | 
			
		||||
	If enabled, Gerrit will try to perform a 3-way merge of text
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ Description values containing spaces should be quoted in single quotes
 | 
			
		||||
 | 
			
		||||
+
 | 
			
		||||
For more details see
 | 
			
		||||
link:project-setup.html#submit_type[Change Submit Actions].
 | 
			
		||||
link:project-setup.html#submit_type[Submit Types].
 | 
			
		||||
 | 
			
		||||
--content-merge::
 | 
			
		||||
    If enabled, Gerrit will try to perform a 3-way merge of text
 | 
			
		||||
 
 | 
			
		||||
@@ -422,13 +422,16 @@ By default this is set to false.
 | 
			
		||||
[[auth.gitBasicAuth]]auth.gitBasicAuth::
 | 
			
		||||
+
 | 
			
		||||
If true then Git over HTTP and HTTP/S traffic is authenticated using
 | 
			
		||||
standard BasicAuth and credentials validated against the randomly
 | 
			
		||||
generated HTTP password or against LDAP when it is configured as
 | 
			
		||||
Gerrit Web UI authentication method.
 | 
			
		||||
standard BasicAuth and the credentials are validated using the same
 | 
			
		||||
auth method as configured for the Gerrit Web UI.
 | 
			
		||||
+
 | 
			
		||||
This parameter only affects git over http traffic. If set to false
 | 
			
		||||
then Gerrit will authenticate through DIGEST authentication and
 | 
			
		||||
the randomly generated HTTP password in Gerrit DB.
 | 
			
		||||
This parameter affects git over HTTP traffic and access to the REST
 | 
			
		||||
API. If set to false then Gerrit will authenticate through DIGEST
 | 
			
		||||
authentication and the randomly generated HTTP password in the Gerrit
 | 
			
		||||
database.
 | 
			
		||||
+
 | 
			
		||||
When `auth.type` is `LDAP`, service users that only exist in the Gerrit
 | 
			
		||||
database are still authenticated by their HTTP passwords.
 | 
			
		||||
+
 | 
			
		||||
By default this is set to false.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
. Getting started
 | 
			
		||||
.. link:intro-quick.html[A Quick Introduction to Gerrit]
 | 
			
		||||
.. link:intro-change-screen.html[A Quick Introduction to the New Change Screen]
 | 
			
		||||
.. link:intro-project-owner.html[Project Owner Guide]
 | 
			
		||||
.. link:http://source.android.com/submit-patches/workflow[Default Android Workflow] (external)
 | 
			
		||||
. Web
 | 
			
		||||
.. Registering a new Gerrit account
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										287
									
								
								Documentation/intro-project-owner.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								Documentation/intro-project-owner.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,287 @@
 | 
			
		||||
= Project Owner Guide
 | 
			
		||||
 | 
			
		||||
This is a Gerrit guide that is dedicated to project owners. It
 | 
			
		||||
explains the many possibilities that Gerrit provides to customize the
 | 
			
		||||
workflows for a project.
 | 
			
		||||
 | 
			
		||||
[[project-owner]]
 | 
			
		||||
== What is a project owner?
 | 
			
		||||
 | 
			
		||||
Being project owner means that you own a project in Gerrit.
 | 
			
		||||
Technically this is expressed by having the
 | 
			
		||||
link:access-control.html#category_owner[Owner] access right on
 | 
			
		||||
`refs/*` on that project. As project owner you have the permission to
 | 
			
		||||
edit the access control list and the project settings of the project.
 | 
			
		||||
It also means that you should get familiar with these settings so that
 | 
			
		||||
you can adapt them to the needs of your project.
 | 
			
		||||
 | 
			
		||||
Being project owner means being responsible for the administration of
 | 
			
		||||
a project. This requires having a deeper knowledge of Gerrit than the
 | 
			
		||||
average user. Normally per team there should be 2 to 3 persons, who
 | 
			
		||||
have a certain level of Git/Gerrit knowledge, assigned as project
 | 
			
		||||
owners. It normally doesn't make sense that everyone in a team is
 | 
			
		||||
project owner. For normal team members it is sufficient to be committer
 | 
			
		||||
or contributor.
 | 
			
		||||
 | 
			
		||||
[[access-rights]]
 | 
			
		||||
== Access Rights
 | 
			
		||||
 | 
			
		||||
As a project owner you can edit the access control list of your
 | 
			
		||||
project. This allows you to grant permissions on the project to
 | 
			
		||||
different groups.
 | 
			
		||||
 | 
			
		||||
Gerrit comes with a rich set of permissions which allow a very
 | 
			
		||||
fine-grained control over who can do what on a project. Access
 | 
			
		||||
control is one of the most powerful Gerrit features but it is also a
 | 
			
		||||
rather complex topic. This guide will only highlight the most
 | 
			
		||||
important aspects of access control, but the link:access-control.html[
 | 
			
		||||
Access Control] chapter explains all the details.
 | 
			
		||||
 | 
			
		||||
[[edit-access-rights]]
 | 
			
		||||
=== Editing Access Rights
 | 
			
		||||
 | 
			
		||||
To see the access rights of your project
 | 
			
		||||
 | 
			
		||||
- go to the Gerrit WebUI
 | 
			
		||||
- click on the `Projects` > `List` menu entry
 | 
			
		||||
- find your project in the project list and click on it
 | 
			
		||||
- click on the `Access` menu entry
 | 
			
		||||
 | 
			
		||||
By clicking on the `Edit` button the access rights become editable and
 | 
			
		||||
you may save any changes by clicking on the `Save Changes` button.
 | 
			
		||||
Optionally you can provide a `Commit Message` to explain the reasons
 | 
			
		||||
for changing the access rights.
 | 
			
		||||
 | 
			
		||||
The access rights are stored in the project's Git repository in a
 | 
			
		||||
special branch called `refs/meta/config`. On this branch there is a
 | 
			
		||||
`project.config` file which contains the access rights. More
 | 
			
		||||
information about this storage format can be found in the
 | 
			
		||||
link:config-project-config.html[Project Configuration File Format]
 | 
			
		||||
chapter. What is important to know is that by looking at the history
 | 
			
		||||
of the `project.config` file on the `refs/meta/config` branch you can
 | 
			
		||||
always see how the access rights were changed and by whom. If a good
 | 
			
		||||
commit message is provided you can also see from the history why the
 | 
			
		||||
access rights were modified.
 | 
			
		||||
 | 
			
		||||
If a Git browser such as GitWeb is configured for the Gerrit server you
 | 
			
		||||
can find a link to the history of the `project.config` file in the
 | 
			
		||||
WebUI. Otherwise you may inspect the history locally. If you have
 | 
			
		||||
cloned the repository you can do this by executing the following
 | 
			
		||||
commands:
 | 
			
		||||
 | 
			
		||||
====
 | 
			
		||||
  $ git fetch origin refs/meta/config:config
 | 
			
		||||
  $ git checkout config
 | 
			
		||||
  $ git log project.config
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
Non project owners may still edit the access rights and propose the
 | 
			
		||||
modifications to the project owners by clicking on the `Save for
 | 
			
		||||
Review` button. This creates a new change with the access rights
 | 
			
		||||
modifications that can be approved by a project owner. The project
 | 
			
		||||
owners are automatically added as reviewer on this change so that they
 | 
			
		||||
get informed about it by email.
 | 
			
		||||
 | 
			
		||||
[[inheritance]]
 | 
			
		||||
=== Inheritance
 | 
			
		||||
 | 
			
		||||
Normally when a new project is created in Gerrit it already has some
 | 
			
		||||
access rights which are inherited from the parent projects.
 | 
			
		||||
Projects in Gerrit are organized hierarchically as a tree with the
 | 
			
		||||
`All-Projects' project as root from which all projects inherit. Each
 | 
			
		||||
project can have only a single parent project, multi-inheritance is
 | 
			
		||||
not supported.
 | 
			
		||||
 | 
			
		||||
Looking at the access rights of your project in the Gerrit WebUI, you
 | 
			
		||||
only see the access rights which are defined on that project. To see
 | 
			
		||||
the inherited access rights you must follow the link to the parent
 | 
			
		||||
project under `Rights Inherit From`.
 | 
			
		||||
 | 
			
		||||
Inherited access rights can be overwritten unless they are defined as
 | 
			
		||||
link:access-control.html#block[BLOCK rule]. BLOCK rules are used to
 | 
			
		||||
limit the possibilities of the project owners on the inheriting
 | 
			
		||||
projects. With this, global policies can be enforced on all projects.
 | 
			
		||||
Please note that Gerrit doesn't prevent you from assigning access
 | 
			
		||||
rights that contradict an inherited BLOCK rule, but these access rights
 | 
			
		||||
will simply have no effect.
 | 
			
		||||
 | 
			
		||||
If you are responsible for several projects which require the same
 | 
			
		||||
permissions, it makes sense to have a common parent for them and to
 | 
			
		||||
maintain the access rights on that common parent. Changing the parent
 | 
			
		||||
of a project is only allowed for Gerrit administrators. This means you
 | 
			
		||||
need to contact the administrator of your Gerrit server if you want to
 | 
			
		||||
reparent your project. One way to do this is to change the parent
 | 
			
		||||
project in the WebUI, save the modifications for review and get the
 | 
			
		||||
change approved and merged by a Gerrit administrator.
 | 
			
		||||
 | 
			
		||||
[[refs]]
 | 
			
		||||
=== References
 | 
			
		||||
 | 
			
		||||
Access rights in Gerrit are assigned on references (aka refs). Refs in
 | 
			
		||||
Git exist in different namespaces, e.g. all branches normally exist
 | 
			
		||||
under `refs/heads/` and all tags under `refs/tags/`. In addition there
 | 
			
		||||
are a number of link:access-control.html#references_special[special refs]
 | 
			
		||||
and link:access-control.html#references_magic[magic refs].
 | 
			
		||||
 | 
			
		||||
Access rights can be assigned on a concrete ref, e.g.
 | 
			
		||||
`refs/heads/master` but also on ref patterns and regular expressions
 | 
			
		||||
for ref names.
 | 
			
		||||
 | 
			
		||||
A ref pattern ends with `/*` and describes a complete ref name
 | 
			
		||||
namespace, e.g. access rights assigned on `refs/heads/*` apply to all
 | 
			
		||||
branches.
 | 
			
		||||
 | 
			
		||||
Regular expressions must start with `^`, e.g. access rights assigned
 | 
			
		||||
on `^refs/heads/rel-.*` would apply to all `rel-*` branches.
 | 
			
		||||
 | 
			
		||||
[[groups]]
 | 
			
		||||
=== Groups
 | 
			
		||||
 | 
			
		||||
Access rights are granted to groups. It is useful to know that Gerrit
 | 
			
		||||
maintains its own groups internally but also supports different external
 | 
			
		||||
group backends.
 | 
			
		||||
 | 
			
		||||
The Gerrit internal groups can be seen in the Gerrit WebUI by clicking
 | 
			
		||||
on the `Groups` > `List` menu entry. By clicking on a group you can
 | 
			
		||||
edit the group members (`Members` tab) and the group options
 | 
			
		||||
(`General` tab).
 | 
			
		||||
 | 
			
		||||
Gerrit internal groups contain users as members, but can also include
 | 
			
		||||
other groups, even external groups.
 | 
			
		||||
 | 
			
		||||
Every group is owned by an owner group. Only members of the owner
 | 
			
		||||
group can administrate the owned group (assign members, edit the group
 | 
			
		||||
options). A group can own itself; in this case members of the group
 | 
			
		||||
can, for example, add further members to the group. When you create new
 | 
			
		||||
groups for your project to assign access rights to committer or other
 | 
			
		||||
roles, make sure that they are owned by the project owner group.
 | 
			
		||||
 | 
			
		||||
An important setting on a group is the option
 | 
			
		||||
`Make group visible to all registered users.`, which defines whether
 | 
			
		||||
non-members can see who is member of the group.
 | 
			
		||||
 | 
			
		||||
New internal Gerrit groups can be created under `Groups` >
 | 
			
		||||
`Create New Group`. This menu is only available if you have the global
 | 
			
		||||
capability link:access-control.html#capability_createGroup[Create Group]
 | 
			
		||||
assigned.
 | 
			
		||||
 | 
			
		||||
Gerrit also has a set of special
 | 
			
		||||
link:access-control.html#system_groups[system groups] that you might
 | 
			
		||||
find useful.
 | 
			
		||||
 | 
			
		||||
External groups need to be prefixed when assigning access rights to
 | 
			
		||||
them, e.g. link:access-control.html#ldap_groups[LDAP group names] need
 | 
			
		||||
to be prefixed with `ldap/`.
 | 
			
		||||
 | 
			
		||||
If the link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/singleusergroup[
 | 
			
		||||
singleusergroup] plugin is installed you can also directly assign
 | 
			
		||||
access rights to users, by prefixing the username with `user/` or the
 | 
			
		||||
user's account ID by `userid/`.
 | 
			
		||||
 | 
			
		||||
[[common-access-rights]]
 | 
			
		||||
=== Common Access Rights
 | 
			
		||||
 | 
			
		||||
Different roles in a project, such as developer (committer) or
 | 
			
		||||
contributor, need different access rights. Examples for which access
 | 
			
		||||
rights are typically assigned for which role are described in the
 | 
			
		||||
link:access-control.html#example_roles[Access Control] chapter.
 | 
			
		||||
 | 
			
		||||
[[code-review]]
 | 
			
		||||
=== Code Review
 | 
			
		||||
 | 
			
		||||
Gerrit's main functionality is code review, however using code review
 | 
			
		||||
is optional and you may decide to only use Gerrit as a Git server with
 | 
			
		||||
access control. Whether you allow only pushes for review or also
 | 
			
		||||
direct pushes depends on the project's access rights.
 | 
			
		||||
 | 
			
		||||
To push a commit for review it must be pushed to
 | 
			
		||||
link:access-control.html#refs_for[refs/for/<branch-name>]. This means
 | 
			
		||||
the link:access-control.html#category_push_review[Push] access right
 | 
			
		||||
must be assigned on `refs/for/<branch-name>`.
 | 
			
		||||
 | 
			
		||||
To allow direct pushes and bypass code review, the
 | 
			
		||||
link:access-control.html#category_push_direct[Push] access right is
 | 
			
		||||
required on `refs/heads/<branch-name>`.
 | 
			
		||||
 | 
			
		||||
By pushing for review you are not only enabling the review workflow,
 | 
			
		||||
but you can also get automatic verifications from a build server
 | 
			
		||||
before changes are merged. In addition you can benefit from Gerrit's
 | 
			
		||||
merge strategies that can automatically merge/rebase commits on server
 | 
			
		||||
side if necessary. You can control the merge strategy by configuring
 | 
			
		||||
the link:project-setup.html#submit_type[submit type] on the project.
 | 
			
		||||
If you bypass code review you always need to merge/rebase manually if
 | 
			
		||||
the tip of the destination branch has moved. Please keep this in mind
 | 
			
		||||
if you choose to not work with code review because you think it's
 | 
			
		||||
easier to avoid the additional complexity of the review workflow; it
 | 
			
		||||
might actually not be easier.
 | 
			
		||||
 | 
			
		||||
You may also enable link:user-upload.html#auto_merge[auto-merge on
 | 
			
		||||
push] to benefit from the automatic merge/rebase on server side while
 | 
			
		||||
pushing directly into the repository.
 | 
			
		||||
 | 
			
		||||
[[project-options]]
 | 
			
		||||
== Project Options
 | 
			
		||||
 | 
			
		||||
As project owner you can control several options on your project.
 | 
			
		||||
The different options are described in the
 | 
			
		||||
link:project-setup.html#project_options[Project Options] section.
 | 
			
		||||
 | 
			
		||||
To see the options of your project
 | 
			
		||||
 | 
			
		||||
- go to the Gerrit WebUI
 | 
			
		||||
- click on the `Projects` > `List` menu entry
 | 
			
		||||
- find your project in the project list and click on it
 | 
			
		||||
- click on the `General` menu entry
 | 
			
		||||
 | 
			
		||||
[[submit-type]]
 | 
			
		||||
=== Submit Type
 | 
			
		||||
 | 
			
		||||
An important decision for a project is the choice of the submit type
 | 
			
		||||
and the content merge setting (aka `Automatically resolve conflicts`).
 | 
			
		||||
The link:project-setup.html#submit_type[submit type] is the method
 | 
			
		||||
Gerrit uses to submit a change to the project. The submit type defines
 | 
			
		||||
what Gerrit should do on submit of a change if the destination branch
 | 
			
		||||
has moved while the change was in review. The
 | 
			
		||||
link:project-setup.html#content_merge[content merge] setting applies
 | 
			
		||||
if the same files have been modified concurrently and tells Gerrit
 | 
			
		||||
whether it should attempt a content merge for these files.
 | 
			
		||||
 | 
			
		||||
When choosing the submit type and the content merge setting one must
 | 
			
		||||
weigh development comfort against the safety of not breaking the
 | 
			
		||||
destination branch.
 | 
			
		||||
 | 
			
		||||
The most restrictive submit type is
 | 
			
		||||
link:project-setup.html#fast_forward_only[Fast Forward Only]. Using
 | 
			
		||||
this submit type means that after submitting one change all other open
 | 
			
		||||
changes for the same destination branch must be rebased manually. This
 | 
			
		||||
is quite burdensome and in practice only feasible for branches with
 | 
			
		||||
very few changes. On the other hand, if changes are verified before
 | 
			
		||||
submit, e.g. automatically by a CI integration, with this submit type,
 | 
			
		||||
you can be sure that the destination branch never gets broken.
 | 
			
		||||
 | 
			
		||||
Choosing link:project-setup.html#merge_if_necessary[Merge If Necessary]
 | 
			
		||||
as submit type makes the life for developers more comfortable,
 | 
			
		||||
especially if content merge is enabled. If this submit strategy is used
 | 
			
		||||
developers only need to rebase manually if the same files have been
 | 
			
		||||
modified concurrently or if the content merge on such a file fails. The
 | 
			
		||||
drawback with this submit type is that there is a risk of breaking
 | 
			
		||||
the destination branch, e.g. if one change moves a class into another
 | 
			
		||||
package and another change imports this class from the old location.
 | 
			
		||||
Experience shows that in practice `Merge If Necessary` with content
 | 
			
		||||
merge enabled works pretty well and breaking the destination branch
 | 
			
		||||
happens rarely. This is why this setting is recommended at least for
 | 
			
		||||
development branches. You likely want to start with
 | 
			
		||||
`Merge If Necessary` with content merge enabled and only switch to a
 | 
			
		||||
more restrictive policy if you are facing issues with the build and
 | 
			
		||||
test stability of the destination branches.
 | 
			
		||||
 | 
			
		||||
Please note that there are other submit types available; they are
 | 
			
		||||
described in the link:project-setup.html#submit_type[Submit Type]
 | 
			
		||||
section.
 | 
			
		||||
 | 
			
		||||
GERRIT
 | 
			
		||||
------
 | 
			
		||||
Part of link:index.html[Gerrit Code Review]
 | 
			
		||||
 | 
			
		||||
SEARCHBOX
 | 
			
		||||
---------
 | 
			
		||||
@@ -1,56 +1,60 @@
 | 
			
		||||
= Gerrit Code Review - Project Configuration
 | 
			
		||||
 | 
			
		||||
== Create Through SSH
 | 
			
		||||
== Project Creation
 | 
			
		||||
 | 
			
		||||
Creating a new repository over SSH is perhaps the easiest way to
 | 
			
		||||
configure a new project:
 | 
			
		||||
There are several ways to create a new project in Gerrit:
 | 
			
		||||
 | 
			
		||||
====
 | 
			
		||||
  ssh -p 29418 review.example.com gerrit create-project --name new/project
 | 
			
		||||
====
 | 
			
		||||
- in the Web UI under 'Projects' > 'Create Project'
 | 
			
		||||
- via the link:rest-api-projects.html#create-project[Create Project]
 | 
			
		||||
  REST endpoint
 | 
			
		||||
- via the link:cmd-create-project.html[create-project] SSH command
 | 
			
		||||
 | 
			
		||||
See link:cmd-create-project.html[gerrit create-project] for more
 | 
			
		||||
details.
 | 
			
		||||
To be able to create new projects the global capability
 | 
			
		||||
link:access-control.html#capability_createProject[Create Project] must
 | 
			
		||||
be granted.
 | 
			
		||||
 | 
			
		||||
In addition, projects can be created link:#manual_project_creation[
 | 
			
		||||
manually].
 | 
			
		||||
 | 
			
		||||
== Manual Creation
 | 
			
		||||
 | 
			
		||||
Projects may also be manually created.
 | 
			
		||||
 | 
			
		||||
=== Create Git Repository
 | 
			
		||||
 | 
			
		||||
Create a Git repository under gerrit.basePath:
 | 
			
		||||
[[manual_project_creation]]
 | 
			
		||||
=== Manual Project Creation
 | 
			
		||||
 | 
			
		||||
. Create a Git repository under `gerrit.basePath`:
 | 
			
		||||
+
 | 
			
		||||
====
 | 
			
		||||
  git --git-dir=$base_path/new/project.git init
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
+
 | 
			
		||||
[TIP]
 | 
			
		||||
By tradition the repository directory name should have a `.git`
 | 
			
		||||
suffix.
 | 
			
		||||
 | 
			
		||||
+
 | 
			
		||||
To also make this repository available over the anonymous git://
 | 
			
		||||
protocol, don't forget to create a `git-daemon-export-ok` file:
 | 
			
		||||
 | 
			
		||||
+
 | 
			
		||||
====
 | 
			
		||||
  touch $base_path/new/project.git/git-daemon-export-ok
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
=== Register Project
 | 
			
		||||
 | 
			
		||||
. Register Project
 | 
			
		||||
+
 | 
			
		||||
Either restart the server, or flush the `project_list` cache:
 | 
			
		||||
 | 
			
		||||
+
 | 
			
		||||
====
 | 
			
		||||
  ssh -p 29418 localhost gerrit flush-caches --cache project_list
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
[[project_options]]
 | 
			
		||||
== Project Options
 | 
			
		||||
 | 
			
		||||
[[submit_type]]
 | 
			
		||||
== Change Submit Action
 | 
			
		||||
=== Submit Type
 | 
			
		||||
 | 
			
		||||
The method Gerrit uses to submit a change to a project can be
 | 
			
		||||
modified by any project owner through the project console, `Projects` >
 | 
			
		||||
`List` > my/project.  The following methods are supported:
 | 
			
		||||
 | 
			
		||||
[[fast_forward_only]]
 | 
			
		||||
* Fast Forward Only
 | 
			
		||||
+
 | 
			
		||||
This method produces a strictly linear history.  All merges must
 | 
			
		||||
@@ -60,6 +64,7 @@ To submit a change, the change must be a strict superset of the
 | 
			
		||||
destination branch.  That is, the change must already contain the
 | 
			
		||||
tip of the destination branch at submit time.
 | 
			
		||||
 | 
			
		||||
[[merge_if_necessary]]
 | 
			
		||||
* Merge If Necessary
 | 
			
		||||
+
 | 
			
		||||
This is the default for a new project.
 | 
			
		||||
@@ -69,6 +74,7 @@ branch, then the branch is fast-forwarded to the change.  If not,
 | 
			
		||||
then a merge commit is automatically created.  This is identical
 | 
			
		||||
to the classical `git merge` behavior, or `git merge --ff`.
 | 
			
		||||
 | 
			
		||||
[[always_merge]]
 | 
			
		||||
* Always Merge
 | 
			
		||||
+
 | 
			
		||||
Always produce a merge commit, even if the change is a strict
 | 
			
		||||
@@ -76,6 +82,7 @@ superset of the destination branch.  This is identical to the
 | 
			
		||||
behavior of `git merge --no-ff`, and may be useful if the
 | 
			
		||||
project needs to follow submits with `git log --first-parent`.
 | 
			
		||||
 | 
			
		||||
[[cherry_pick]]
 | 
			
		||||
* Cherry Pick
 | 
			
		||||
+
 | 
			
		||||
Always cherry pick the patch set, ignoring the parent lineage
 | 
			
		||||
@@ -105,9 +112,88 @@ When Gerrit tries to do a merge, by default the merge will only
 | 
			
		||||
succeed if there is no path conflict.  A path conflict occurs when
 | 
			
		||||
the same file has also been changed on the other side of the merge.
 | 
			
		||||
 | 
			
		||||
[[content_merge]]
 | 
			
		||||
If `Automatically resolve conflicts` is enabled, Gerrit will try
 | 
			
		||||
to do a content merge when a path conflict occurs.
 | 
			
		||||
 | 
			
		||||
=== State
 | 
			
		||||
 | 
			
		||||
This setting defines the state of the project. A project can have the
 | 
			
		||||
following states:
 | 
			
		||||
 | 
			
		||||
- `Active`:
 | 
			
		||||
+
 | 
			
		||||
The project is active and users can see and modify the project according
 | 
			
		||||
to their access rights on the project.
 | 
			
		||||
 | 
			
		||||
- `Read Only`:
 | 
			
		||||
+
 | 
			
		||||
The project is read only and all modifying operations on it are
 | 
			
		||||
disabled. E.g. this means that pushing to this project fails for all
 | 
			
		||||
users even if they have push permissions assigned on it.
 | 
			
		||||
+
 | 
			
		||||
Setting a project to this state is an easy way to temporary close a
 | 
			
		||||
project, as you can keep all write access rights in place and they will
 | 
			
		||||
become active again as soon as the project state is set back to
 | 
			
		||||
`Active`.
 | 
			
		||||
+
 | 
			
		||||
This state also makes sense if a project was moved to another location.
 | 
			
		||||
In this case all new development should happen in the new project and
 | 
			
		||||
you want to prevent that somebody accidentally works on the old
 | 
			
		||||
project, while keeping the old project around for old references.
 | 
			
		||||
 | 
			
		||||
- `Hidden`:
 | 
			
		||||
+
 | 
			
		||||
The project is hidden and only visible to project owners. Other users
 | 
			
		||||
are not able to see the project even if they have read permissions
 | 
			
		||||
granted on the project.
 | 
			
		||||
 | 
			
		||||
=== Require Change-Id
 | 
			
		||||
 | 
			
		||||
The `Require Change-Id in commit message` option defines whether a
 | 
			
		||||
link:user-changeid.html[Change-Id] in the commit message is required
 | 
			
		||||
for pushing a commit for review. If this option is set, trying to push
 | 
			
		||||
a commit for review that doesn't contain a Change-Id in the commit
 | 
			
		||||
message fails with link:error-missing-changeid.html[missing Change-Id
 | 
			
		||||
in commit message footer].
 | 
			
		||||
 | 
			
		||||
It is recommended to set this option and use a
 | 
			
		||||
link:user-changeid.html#create[commit-msg hook] (or other client side
 | 
			
		||||
tooling like EGit) to automatically generate Change-Id's for new
 | 
			
		||||
commits. This way the Change-Id is automatically in place when changes
 | 
			
		||||
are reworked or rebased and uploading new patch sets gets easy.
 | 
			
		||||
 | 
			
		||||
If this option is not set, commits can be uploaded without a Change-Id,
 | 
			
		||||
but then users have to remember to copy the assigned Change-Id from the
 | 
			
		||||
change screen and insert it manually into the commit message when they
 | 
			
		||||
want to upload a second patch set.
 | 
			
		||||
 | 
			
		||||
=== Maximum Git Object Size Limit
 | 
			
		||||
 | 
			
		||||
This option defines the maximum allowed Git object size that
 | 
			
		||||
receive-pack will accept. If an object is larger than the given size
 | 
			
		||||
the pack-parsing will abort and the push operation will fail.
 | 
			
		||||
 | 
			
		||||
With this option users can be prevented from uploading commits that
 | 
			
		||||
contain files which are too large.
 | 
			
		||||
 | 
			
		||||
Normally the link:config-gerrit.html#receive.maxObjectSizeLimit[maximum
 | 
			
		||||
Git object size limit] is configured globally for a Gerrit server. At
 | 
			
		||||
the project level, the maximum Git object size limit can be further
 | 
			
		||||
reduced, but not extended. The displayed effective limit shows the
 | 
			
		||||
maximum Git object size limit that is actually used on the project.
 | 
			
		||||
 | 
			
		||||
The defined maximum Git object size limit is inherited by any child
 | 
			
		||||
project.
 | 
			
		||||
 | 
			
		||||
=== Require Signed-off-by
 | 
			
		||||
 | 
			
		||||
The `Require Signed-off-by in commit message` option defines whether a
 | 
			
		||||
link:user-signedoffby.html[Signed-off-by] line in the commit message is
 | 
			
		||||
required for pushing a commit. If this option is set, trying to push a
 | 
			
		||||
commit that doesn't contain a Signed-off-by line in the commit message
 | 
			
		||||
fails with link:error-not-signed-off-by.html[not Signed-off-by
 | 
			
		||||
author/committer/uploader in commit message footer].
 | 
			
		||||
 | 
			
		||||
== Registering Additional Branches
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1086,7 +1086,7 @@ body as a link:#groups-input[GroupsInput] entity.
 | 
			
		||||
  Content-Type: application/json;charset=UTF-8
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "members": [
 | 
			
		||||
    "groups": [
 | 
			
		||||
      "MyGroup",
 | 
			
		||||
      "MyOtherGroup"
 | 
			
		||||
    ]
 | 
			
		||||
 
 | 
			
		||||
@@ -78,4 +78,7 @@ public interface GerritResources extends ClientBundle {
 | 
			
		||||
 | 
			
		||||
  @Source("listAdd.png")
 | 
			
		||||
  public ImageResource listAdd();
 | 
			
		||||
 | 
			
		||||
  @Source("dashboard.png")
 | 
			
		||||
  public ImageResource dashboard();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -185,6 +185,13 @@ public class ProjectInfoScreen extends ProjectScreen {
 | 
			
		||||
  private void initProjectOptions() {
 | 
			
		||||
    grid.addHeader(new SmallHeading(Util.C.headingProjectOptions()));
 | 
			
		||||
 | 
			
		||||
    state = new ListBox();
 | 
			
		||||
    for (ProjectState stateValue : ProjectState.values()) {
 | 
			
		||||
      state.addItem(Util.toLongString(stateValue), stateValue.name());
 | 
			
		||||
    }
 | 
			
		||||
    saveEnabler.listenTo(state);
 | 
			
		||||
    grid.add(Util.C.headingProjectState(), state);
 | 
			
		||||
 | 
			
		||||
    submitType = new ListBox();
 | 
			
		||||
    for (final SubmitType type : SubmitType.values()) {
 | 
			
		||||
      submitType.addItem(Util.toLongString(type), type.name());
 | 
			
		||||
@@ -198,13 +205,6 @@ public class ProjectInfoScreen extends ProjectScreen {
 | 
			
		||||
    saveEnabler.listenTo(submitType);
 | 
			
		||||
    grid.add(Util.C.headingProjectSubmitType(), submitType);
 | 
			
		||||
 | 
			
		||||
    state = new ListBox();
 | 
			
		||||
    for (final ProjectState stateValue : ProjectState.values()) {
 | 
			
		||||
      state.addItem(Util.toLongString(stateValue), stateValue.name());
 | 
			
		||||
    }
 | 
			
		||||
    saveEnabler.listenTo(state);
 | 
			
		||||
    grid.add(Util.C.headingProjectState(), state);
 | 
			
		||||
 | 
			
		||||
    contentMerge = newInheritedBooleanBox();
 | 
			
		||||
    saveEnabler.listenTo(contentMerge);
 | 
			
		||||
    grid.add(Util.C.useContentMerge(), contentMerge);
 | 
			
		||||
 
 | 
			
		||||
@@ -139,6 +139,7 @@ public class ChangeScreen2 extends Screen {
 | 
			
		||||
  @UiField InlineHyperlink ownerLink;
 | 
			
		||||
  @UiField Element statusText;
 | 
			
		||||
  @UiField Image projectSettings;
 | 
			
		||||
  @UiField Image projectDashboard;
 | 
			
		||||
  @UiField InlineHyperlink projectLink;
 | 
			
		||||
  @UiField InlineHyperlink branchLink;
 | 
			
		||||
  @UiField Element strategy;
 | 
			
		||||
@@ -356,6 +357,13 @@ public class ChangeScreen2 extends Screen {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private void initProjectLinks(final ChangeInfo info) {
 | 
			
		||||
    projectDashboard.addDomHandler(new ClickHandler() {
 | 
			
		||||
      @Override
 | 
			
		||||
      public void onClick(ClickEvent event) {
 | 
			
		||||
        Gerrit.display(
 | 
			
		||||
            PageLinks.toProjectDefaultDashboard(info.project_name_key()));
 | 
			
		||||
      }
 | 
			
		||||
    }, ClickEvent.getType());
 | 
			
		||||
    projectSettings.addDomHandler(new ClickHandler() {
 | 
			
		||||
      @Override
 | 
			
		||||
      public void onClick(ClickEvent event) {
 | 
			
		||||
@@ -365,7 +373,10 @@ public class ChangeScreen2 extends Screen {
 | 
			
		||||
    }, ClickEvent.getType());
 | 
			
		||||
    projectLink.setText(info.project());
 | 
			
		||||
    projectLink.setTargetHistoryToken(
 | 
			
		||||
        PageLinks.toProjectDefaultDashboard(info.project_name_key()));
 | 
			
		||||
        PageLinks.toChangeQuery(
 | 
			
		||||
            PageLinks.projectQuery(
 | 
			
		||||
                info.project_name_key(),
 | 
			
		||||
                info.status())));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private void initBranchLink(ChangeInfo info) {
 | 
			
		||||
 
 | 
			
		||||
@@ -166,6 +166,11 @@ limitations under the License.
 | 
			
		||||
      cursor: pointer;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .projectDashboard {
 | 
			
		||||
      float: right;
 | 
			
		||||
      cursor: pointer;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .infoColumn {
 | 
			
		||||
      width: 440px;
 | 
			
		||||
      padding-left: 17px;
 | 
			
		||||
@@ -390,7 +395,14 @@ limitations under the License.
 | 
			
		||||
                     ui:field='projectSettings'
 | 
			
		||||
                     resource='{ico.gear}'
 | 
			
		||||
                     styleName='{style.projectSettings}'
 | 
			
		||||
                     title='Go to project'>
 | 
			
		||||
                     title='Go to project settings'>
 | 
			
		||||
                    <ui:attribute name='title'/>
 | 
			
		||||
                  </g:Image>
 | 
			
		||||
                  <g:Image
 | 
			
		||||
                     ui:field='projectDashboard'
 | 
			
		||||
                     resource='{ico.dashboard}'
 | 
			
		||||
                     styleName='{style.projectDashboard}'
 | 
			
		||||
                     title='Go to project dashboard'>
 | 
			
		||||
                    <ui:attribute name='title'/>
 | 
			
		||||
                  </g:Image>
 | 
			
		||||
              </td>
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.2 KiB  | 
@@ -25,6 +25,7 @@ import com.google.gerrit.server.account.AccountManager;
 | 
			
		||||
import com.google.gerrit.server.account.AccountState;
 | 
			
		||||
import com.google.gerrit.server.account.AuthRequest;
 | 
			
		||||
import com.google.gerrit.server.account.AuthResult;
 | 
			
		||||
import com.google.gerrit.server.auth.NoSuchUserException;
 | 
			
		||||
import com.google.gerrit.server.config.AuthConfig;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import com.google.inject.Provider;
 | 
			
		||||
@@ -155,6 +156,18 @@ class ProjectBasicAuthFilter implements Filter {
 | 
			
		||||
      ws.setAccessPathOk(AccessPath.GIT, true);
 | 
			
		||||
      ws.setAccessPathOk(AccessPath.REST_API, true);
 | 
			
		||||
      return true;
 | 
			
		||||
    } catch (NoSuchUserException e) {
 | 
			
		||||
      if (password.equals(who.getPassword(who.getUserName()))) {
 | 
			
		||||
        WebSession ws = session.get();
 | 
			
		||||
        ws.setUserAccountId(who.getAccount().getId());
 | 
			
		||||
        ws.setAccessPathOk(AccessPath.GIT, true);
 | 
			
		||||
        ws.setAccessPathOk(AccessPath.REST_API, true);
 | 
			
		||||
        return true;
 | 
			
		||||
      } else {
 | 
			
		||||
        log.warn("Authentication failed for " + username, e);
 | 
			
		||||
        rsp.sendError(SC_UNAUTHORIZED);
 | 
			
		||||
        return false;
 | 
			
		||||
      }
 | 
			
		||||
    } catch (AccountException e) {
 | 
			
		||||
      log.warn("Authentication failed for " + username, e);
 | 
			
		||||
      rsp.sendError(SC_UNAUTHORIZED);
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,26 @@
 | 
			
		||||
// Copyright (C) 2014 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.auth;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.server.account.AccountException;
 | 
			
		||||
 | 
			
		||||
/** The user does not exist on the authentication server */
 | 
			
		||||
public class NoSuchUserException extends AccountException {
 | 
			
		||||
  private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
  public NoSuchUserException(String username) {
 | 
			
		||||
    super(String.format("No such user: %s", username));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -20,6 +20,7 @@ import com.google.common.collect.ImmutableSet;
 | 
			
		||||
import com.google.gerrit.common.data.ParameterizedString;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.AccountGroup;
 | 
			
		||||
import com.google.gerrit.server.account.AccountException;
 | 
			
		||||
import com.google.gerrit.server.auth.NoSuchUserException;
 | 
			
		||||
import com.google.gerrit.server.config.ConfigUtil;
 | 
			
		||||
import com.google.gerrit.server.config.GerritServerConfig;
 | 
			
		||||
import com.google.gerrit.util.ssl.BlindSSLSocketFactory;
 | 
			
		||||
@@ -178,7 +179,7 @@ import javax.security.auth.login.LoginException;
 | 
			
		||||
 | 
			
		||||
    switch (res.size()) {
 | 
			
		||||
      case 0:
 | 
			
		||||
        throw new AccountException("No such user:" + username);
 | 
			
		||||
        throw new NoSuchUserException(username);
 | 
			
		||||
 | 
			
		||||
      case 1:
 | 
			
		||||
        return res.get(0);
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,30 @@
 | 
			
		||||
//Copyright (C) 2014 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
//Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
//you may not use this file except in compliance with the License.
 | 
			
		||||
//You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
//Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
//distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
//See the License for the specific language governing permissions and
 | 
			
		||||
//limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.git;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Thrown in inserting change or patchset, e.g. OrmException or IOException.
 | 
			
		||||
 */
 | 
			
		||||
public class InsertException extends Exception {
 | 
			
		||||
  private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
  InsertException(final String msg) {
 | 
			
		||||
    super(msg, null);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  InsertException(final String msg, final Throwable why) {
 | 
			
		||||
    super(msg, why);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -245,14 +245,17 @@ public class ReceiveCommits {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static final Function<Exception, OrmException> ORM_EXCEPTION =
 | 
			
		||||
      new Function<Exception, OrmException>() {
 | 
			
		||||
  private static final Function<Exception, InsertException> INSERT_EXCEPTION =
 | 
			
		||||
      new Function<Exception, InsertException>() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public OrmException apply(Exception input) {
 | 
			
		||||
        public InsertException apply(Exception input) {
 | 
			
		||||
          if (input instanceof OrmException) {
 | 
			
		||||
            return (OrmException) input;
 | 
			
		||||
            return new InsertException("ORM error", input);
 | 
			
		||||
          }
 | 
			
		||||
          return new OrmException("Error updating database", input);
 | 
			
		||||
          if (input instanceof IOException) {
 | 
			
		||||
            return new InsertException("IO error", input);
 | 
			
		||||
          }
 | 
			
		||||
          return new InsertException("Error inserting change/patchset", input);
 | 
			
		||||
        }
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
@@ -691,7 +694,7 @@ public class ReceiveCommits {
 | 
			
		||||
          log.error(String.format(
 | 
			
		||||
              "Cannot add patch set to %d of %s",
 | 
			
		||||
              e.getKey().get(), project.getName()), err);
 | 
			
		||||
        } catch (OrmException err) {
 | 
			
		||||
        } catch (InsertException err) {
 | 
			
		||||
          reject(replace.inputCommand, "internal server error");
 | 
			
		||||
          log.error(String.format(
 | 
			
		||||
              "Cannot add patch set to %d of %s",
 | 
			
		||||
@@ -725,7 +728,7 @@ public class ReceiveCommits {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      List<CheckedFuture<?, OrmException>> futures = Lists.newArrayList();
 | 
			
		||||
      List<CheckedFuture<?, InsertException>> futures = Lists.newArrayList();
 | 
			
		||||
      for (ReplaceRequest replace : replaceByChange.values()) {
 | 
			
		||||
        if (magicBranch != null && replace.inputCommand == magicBranch.cmd) {
 | 
			
		||||
          futures.add(replace.insertPatchSet());
 | 
			
		||||
@@ -736,12 +739,12 @@ public class ReceiveCommits {
 | 
			
		||||
        futures.add(create.insertChange());
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      for (CheckedFuture<?, OrmException> f : futures) {
 | 
			
		||||
      for (CheckedFuture<?, InsertException> f : futures) {
 | 
			
		||||
        f.checkedGet();
 | 
			
		||||
      }
 | 
			
		||||
      magicBranch.cmd.setResult(OK);
 | 
			
		||||
    } catch (OrmException err) {
 | 
			
		||||
      log.error("Can't insert changes for " + project.getName(), err);
 | 
			
		||||
    } catch (InsertException err) {
 | 
			
		||||
      log.error("Can't insert change/patchset for " + project.getName(), err);
 | 
			
		||||
      reject(magicBranch.cmd, "internal server error");
 | 
			
		||||
    } catch (IOException err) {
 | 
			
		||||
      log.error("Can't read commits for " + project.getName(), err);
 | 
			
		||||
@@ -1545,7 +1548,7 @@ public class ReceiveCommits {
 | 
			
		||||
          ins.getPatchSet().getRefName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    CheckedFuture<Void, OrmException> insertChange() throws IOException {
 | 
			
		||||
    CheckedFuture<Void, InsertException> insertChange() throws IOException {
 | 
			
		||||
      rp.getRevWalk().parseBody(commit);
 | 
			
		||||
 | 
			
		||||
      final Thread caller = Thread.currentThread();
 | 
			
		||||
@@ -1569,7 +1572,7 @@ public class ReceiveCommits {
 | 
			
		||||
          return null;
 | 
			
		||||
        }
 | 
			
		||||
      }));
 | 
			
		||||
      return Futures.makeChecked(future, ORM_EXCEPTION);
 | 
			
		||||
      return Futures.makeChecked(future, INSERT_EXCEPTION);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void insertChange(ReviewDb db) throws OrmException, IOException {
 | 
			
		||||
@@ -1873,7 +1876,7 @@ public class ReceiveCommits {
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    CheckedFuture<PatchSet.Id, OrmException> insertPatchSet()
 | 
			
		||||
    CheckedFuture<PatchSet.Id, InsertException> insertPatchSet()
 | 
			
		||||
        throws IOException {
 | 
			
		||||
      rp.getRevWalk().parseBody(newCommit);
 | 
			
		||||
 | 
			
		||||
@@ -1900,7 +1903,7 @@ public class ReceiveCommits {
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }));
 | 
			
		||||
      return Futures.makeChecked(future, ORM_EXCEPTION);
 | 
			
		||||
      return Futures.makeChecked(future, INSERT_EXCEPTION);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    PatchSet.Id insertPatchSet(ReviewDb db) throws OrmException, IOException {
 | 
			
		||||
@@ -2266,6 +2269,8 @@ public class ReceiveCommits {
 | 
			
		||||
              codeReviewCommit, rw, repo, project, new ArrayList<Change>(),
 | 
			
		||||
              new HashMap<Change.Id, CodeReviewCommit>());
 | 
			
		||||
      subOp.update();
 | 
			
		||||
    } catch (InsertException e) {
 | 
			
		||||
      log.error("Can't insert patchset", e);
 | 
			
		||||
    } catch (IOException e) {
 | 
			
		||||
      log.error("Can't scan for changes to close", e);
 | 
			
		||||
    } catch (OrmException e) {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ CORE = [
 | 
			
		||||
  'download-commands',
 | 
			
		||||
  'replication',
 | 
			
		||||
  'reviewnotes',
 | 
			
		||||
  'singleusergroup'
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
# buck audit parses and resolves all deps even if not reachable
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ GWT_COMPILER_OPTS = [
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
GWT_PLUGIN_DEPS = [
 | 
			
		||||
  '//gerrit-gwtui-common:client',
 | 
			
		||||
  '//gerrit-plugin-gwtui:gwtui-api-lib',
 | 
			
		||||
  '//lib/gwt:user',
 | 
			
		||||
]
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user