Merge "Merge branch 'stable-2.12'"
This commit is contained in:
		@@ -120,7 +120,7 @@ link:cmd-gc.html[gerrit gc]::
 | 
				
			|||||||
link:cmd-gsql.html[gerrit gsql]::
 | 
					link:cmd-gsql.html[gerrit gsql]::
 | 
				
			||||||
	Administrative interface to active database.
 | 
						Administrative interface to active database.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
link:cmd-index-index.html[gerrit index activate]::
 | 
					link:cmd-index-activate.html[gerrit index activate]::
 | 
				
			||||||
	Activate the latest index version available.
 | 
						Activate the latest index version available.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
link:cmd-index-start.html[gerrit index start]::
 | 
					link:cmd-index-start.html[gerrit index start]::
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1394,21 +1394,37 @@ Type of database server to connect to.  If set this value will be
 | 
				
			|||||||
used to automatically create correct database.driver and database.url
 | 
					used to automatically create correct database.driver and database.url
 | 
				
			||||||
values to open the connection.
 | 
					values to open the connection.
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
* `POSTGRESQL`
 | 
					* `DB2`
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
Connect to a PostgreSQL database server.
 | 
					Connect to a DB2 database server.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					* `DERBY`
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Connect to an Apache Derby database server.
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
* `H2`
 | 
					* `H2`
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
Connect to a local embedded H2 database.
 | 
					Connect to a local embedded H2 database.
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
 | 
					* `JDBC`
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Connect using a JDBC driver class name and URL.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					* `MAXDB`
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Connect to an SAP MaxDb database server.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
* `MYSQL`
 | 
					* `MYSQL`
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
Connect to a MySQL database server.
 | 
					Connect to a MySQL database server.
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
* `JDBC`
 | 
					* `ORACLE`
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
Connect using a JDBC driver class name and URL.
 | 
					Connect to an Oracle database server.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					* `POSTGRESQL`
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Connect to a PostgreSQL database server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
If not specified, database.driver and database.url are used as-is,
 | 
					If not specified, database.driver and database.url are used as-is,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										189
									
								
								ReleaseNotes/ReleaseNotes-2.12.1.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								ReleaseNotes/ReleaseNotes-2.12.1.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,189 @@
 | 
				
			|||||||
 | 
					Release notes for Gerrit 2.12.1
 | 
				
			||||||
 | 
					===============================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Gerrit 2.12.1 is now available:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					link:https://gerrit-releases.storage.googleapis.com/gerrit-2.12.1.war[
 | 
				
			||||||
 | 
					https://gerrit-releases.storage.googleapis.com/gerrit-2.12.1.war]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Gerrit 2.12.1 includes the bug fixes done with
 | 
				
			||||||
 | 
					link:ReleaseNotes-2.11.6.html[Gerrit 2.11.6] and
 | 
				
			||||||
 | 
					link:ReleaseNotes-2.11.7.html[Gerrit 2.11.7]. These bug fixes are *not*
 | 
				
			||||||
 | 
					listed in these release notes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*WARNING:* This version includes a manual schema upgrade when upgrading
 | 
				
			||||||
 | 
					from 2.12.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					If you have already upgraded to 2.12, you need to issue this SQL statement
 | 
				
			||||||
 | 
					manually (e.g. using the `gerrit gsql` SSH command or the `gqsl` site
 | 
				
			||||||
 | 
					program):
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					  alter table patch_sets modify push_certficate clob;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Or with this command if the site is configured to use PostgreSQL:
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					  alter table patch_sets alter column push_certficate type text;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Note that the misspelled `push_certficate` is the actual name of the
 | 
				
			||||||
 | 
					column.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					If you are upgrading from a version earlier than 2.12, this manual step is
 | 
				
			||||||
 | 
					not necessary and should be omitted.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bug Fixes
 | 
				
			||||||
 | 
					---------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					General
 | 
				
			||||||
 | 
					^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Fix column type for signed push certificates.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					The column type `VARCHAR(255)` was too small, preventing some PGP push
 | 
				
			||||||
 | 
					certificates from being stored.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Add the `DRAFT_COMMENTS` option to the list changes REST API endpoint
 | 
				
			||||||
 | 
					and mark it as deprecated.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					It was removed in version 2.12 because it's not needed any more by the UI,
 | 
				
			||||||
 | 
					but this caused failures for clients that still use it.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Now it is added back, although it does not do anything and is marked as
 | 
				
			||||||
 | 
					deprecated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3669[Issue 3669]:
 | 
				
			||||||
 | 
					Fix schema migration when migrating to 2.12.x directly from a version
 | 
				
			||||||
 | 
					earlier than 2.11.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3733[Issue 3733]:
 | 
				
			||||||
 | 
					Correctly detect symlinked log directory on startup.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					If `$site_path/logs` was a symlink, the server would not start.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3871[Issue 3871]:
 | 
				
			||||||
 | 
					Throw an explicit exception when failing to load a change from the database.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					If a change could not be loaded from the database, for example if it was
 | 
				
			||||||
 | 
					manually removed from the changes table but references to it were remaining
 | 
				
			||||||
 | 
					in other tables, a null change was returned which would then lead to an
 | 
				
			||||||
 | 
					'Internal Server Error' that was difficult to track down. Now an error is
 | 
				
			||||||
 | 
					raised earlier which will help administrators to find the root cause.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* https://code.google.com/p/gerrit/issues/detail?id=3743[Issue 3743]:
 | 
				
			||||||
 | 
					Use submitter identity as committer when using 'Rebase if Necessary' merge
 | 
				
			||||||
 | 
					strategy.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					When submitting a change that required rebase, the committer was being
 | 
				
			||||||
 | 
					set to 'Gerrit Code Review' instead of the name of the submitter.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3758[Issue 3758]:
 | 
				
			||||||
 | 
					Fix serving of static resources when deployed in application container.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					When deployed in a container, for example Tomcat, it was not possible to
 | 
				
			||||||
 | 
					load the UI because static content could not be loaded from the WAR file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3790[Issue 3790]:
 | 
				
			||||||
 | 
					When deployed in a container, for example Tomcat, the 'Documentation' menu
 | 
				
			||||||
 | 
					was missing.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3786[Issue 3786]:
 | 
				
			||||||
 | 
					Fix SQL statement syntax in schema migration.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					An extra semicolon was preventing migration from 2.11.x to 2.12 when using
 | 
				
			||||||
 | 
					an Oracle database.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Send email using email queue instead of the default queue.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Some emails sent asynchronously were already being sent using that queue
 | 
				
			||||||
 | 
					but some were not. This was confusing for a gerrit administrator because
 | 
				
			||||||
 | 
					if there is a build up of `send-email` tasks in the queue, he would
 | 
				
			||||||
 | 
					think that increasing `sendemail.threadPoolSize` would help but it did not
 | 
				
			||||||
 | 
					because some of the email were sent using the default queue which is
 | 
				
			||||||
 | 
					configurable using `execution.defaultThreadPoolSize`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Fix XSRF token cookie to honor `auth.cookieSecure` setting.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3767[Issue 3767]:
 | 
				
			||||||
 | 
					Fix replication of first patch set for new changes.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					When new changes were pushed from the command line, the first patch
 | 
				
			||||||
 | 
					set did not get replicated to destinations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3771[Issue 3771]:
 | 
				
			||||||
 | 
					Remove `index.defaultMaxClauseCount` configuration option.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					When `index.maxTerms` was either not set (thus no limit) or set to a value
 | 
				
			||||||
 | 
					higher than `index.defaultMaxClauseCount` it was possible that viewing the
 | 
				
			||||||
 | 
					related changes tab could cause a 'Too many clauses' error for changes that
 | 
				
			||||||
 | 
					have a lot of related changes.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					The `index.defaultMaxClauseCount` configuration option is removed, and the
 | 
				
			||||||
 | 
					existing `index.maxTerms` is reused. The default value of `index.maxTerms`
 | 
				
			||||||
 | 
					is reduced from 'no limit' to 1024.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3919[Issue 3919]:
 | 
				
			||||||
 | 
					Explicitly set parent project to 'All-Projects' when a project is created
 | 
				
			||||||
 | 
					without giving the parent.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UI
 | 
				
			||||||
 | 
					^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3071[Issue 3071]:
 | 
				
			||||||
 | 
					Fix display of submodule differences in side-by-side view.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3718[Issue 3718]:
 | 
				
			||||||
 | 
					Hide avatar images when no avatars are available.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					The UI was showing a transparent empty image with a border.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3731[Issue 3731]:
 | 
				
			||||||
 | 
					Fix syntax higlighting of tcl files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3863[Issue 3863]:
 | 
				
			||||||
 | 
					Fix display of active row marker in tag list.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Clicking on one of the rows would cause the tag name to disappear.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=1207[Issue 1207]:
 | 
				
			||||||
 | 
					Fix keyboard shortcuts for non-US keyboards on side-by-side diff screen.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					The forward/backward navigation keys `[` and `]` only worked on keyboards where
 | 
				
			||||||
 | 
					these characters could be typed without using any modifier key (like CTRL, ALT,
 | 
				
			||||||
 | 
					etc..).
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Note that the problem still exists on the unified diff screen.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Plugins
 | 
				
			||||||
 | 
					^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Allow plugins to get the caller in merge validation requests.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Plugins that implement the `MergeValidationListener` interface now get the
 | 
				
			||||||
 | 
					caller (the user who initiated the merge) in the `onPreMerge` method.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					Existing plugins that implement this interface must be adapted to the new
 | 
				
			||||||
 | 
					method signature.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3741[Issue 3741]:
 | 
				
			||||||
 | 
					Fix handling of merge validation exceptions emitted by plugins.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					If a plugin raised an exception, it was reported to the user as 'Change is
 | 
				
			||||||
 | 
					new', rather than 'Missing dependency'.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* link:https://code.google.com/p/gerrit/issues/detail?id=3821[Issue 3821]:
 | 
				
			||||||
 | 
					Fix repeated reloading of plugins when running on OpenJDK 8.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					OpenJDK 8 uses nanotime precision for file modification time on systems that
 | 
				
			||||||
 | 
					are POSIX 2008 compatible. This leads to precision incompatibility when
 | 
				
			||||||
 | 
					comparing the plugin's JAR file timestamp, resulting in the plugin being
 | 
				
			||||||
 | 
					reloaded every minute.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Documentation
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Update documentation of `commentlink` to reflect changed search URL.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Upgrades
 | 
				
			||||||
 | 
					--------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Upgrade JGit to 4.1.2.201602141800-r.
 | 
				
			||||||
@@ -9,6 +9,7 @@ Version 2.13.x
 | 
				
			|||||||
[[2_12]]
 | 
					[[2_12]]
 | 
				
			||||||
Version 2.12.x
 | 
					Version 2.12.x
 | 
				
			||||||
--------------
 | 
					--------------
 | 
				
			||||||
 | 
					* link:ReleaseNotes-2.12.1.html[2.12.1]
 | 
				
			||||||
* link:ReleaseNotes-2.12.html[2.12]
 | 
					* link:ReleaseNotes-2.12.html[2.12]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[2_11]]
 | 
					[[2_11]]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,6 +43,8 @@ import org.eclipse.jgit.transport.PushResult;
 | 
				
			|||||||
import org.eclipse.jgit.transport.RemoteRefUpdate;
 | 
					import org.eclipse.jgit.transport.RemoteRefUpdate;
 | 
				
			||||||
import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
 | 
					import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class PushOneCommit {
 | 
					public class PushOneCommit {
 | 
				
			||||||
  public static final String SUBJECT = "test commit";
 | 
					  public static final String SUBJECT = "test commit";
 | 
				
			||||||
  public static final String FILE_NAME = "a.txt";
 | 
					  public static final String FILE_NAME = "a.txt";
 | 
				
			||||||
@@ -179,6 +181,13 @@ public class PushOneCommit {
 | 
				
			|||||||
      .committer(new PersonIdent(i, testRepo.getDate()));
 | 
					      .committer(new PersonIdent(i, testRepo.getDate()));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public void setParents(List<RevCommit> parents) throws Exception {
 | 
				
			||||||
 | 
					    commitBuilder.noParents();
 | 
				
			||||||
 | 
					    for (RevCommit p : parents) {
 | 
				
			||||||
 | 
					      commitBuilder.parent(p);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public Result to(String ref) throws Exception {
 | 
					  public Result to(String ref) throws Exception {
 | 
				
			||||||
    commitBuilder.add(fileName, content);
 | 
					    commitBuilder.add(fileName, content);
 | 
				
			||||||
    return execute(ref);
 | 
					    return execute(ref);
 | 
				
			||||||
@@ -189,7 +198,7 @@ public class PushOneCommit {
 | 
				
			|||||||
    return execute(ref);
 | 
					    return execute(ref);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private Result execute(String ref) throws Exception {
 | 
					  public Result execute(String ref) throws Exception {
 | 
				
			||||||
    RevCommit c = commitBuilder.create();
 | 
					    RevCommit c = commitBuilder.create();
 | 
				
			||||||
    if (changeId == null) {
 | 
					    if (changeId == null) {
 | 
				
			||||||
      changeId = GitUtil.getChangeId(testRepo, c).get();
 | 
					      changeId = GitUtil.getChangeId(testRepo, c).get();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -103,7 +103,7 @@ public class ActionsIT extends AbstractDaemonTest {
 | 
				
			|||||||
      assertThat(info.label).isEqualTo("Submit whole topic");
 | 
					      assertThat(info.label).isEqualTo("Submit whole topic");
 | 
				
			||||||
      assertThat(info.method).isEqualTo("POST");
 | 
					      assertThat(info.method).isEqualTo("POST");
 | 
				
			||||||
      assertThat(info.title).isEqualTo(
 | 
					      assertThat(info.title).isEqualTo(
 | 
				
			||||||
          "Clicking the button would fail for other changes");
 | 
					          "See the \"Submitted Together\" tab for problems");
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      noSubmitWholeTopicAssertions(actions, 1);
 | 
					      noSubmitWholeTopicAssertions(actions, 1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat;
 | 
				
			|||||||
import com.google.gerrit.acceptance.AbstractDaemonTest;
 | 
					import com.google.gerrit.acceptance.AbstractDaemonTest;
 | 
				
			||||||
import com.google.gerrit.acceptance.RestResponse;
 | 
					import com.google.gerrit.acceptance.RestResponse;
 | 
				
			||||||
import com.google.gerrit.reviewdb.client.Project;
 | 
					import com.google.gerrit.reviewdb.client.Project;
 | 
				
			||||||
 | 
					import com.google.gerrit.server.config.AllProjectsNameProvider;
 | 
				
			||||||
import com.google.gerrit.server.project.SetParent;
 | 
					import com.google.gerrit.server.project.SetParent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.junit.Test;
 | 
					import org.junit.Test;
 | 
				
			||||||
@@ -49,6 +50,19 @@ public class SetParentIT extends AbstractDaemonTest {
 | 
				
			|||||||
        newGson().fromJson(r.getReader(), String.class);
 | 
					        newGson().fromJson(r.getReader(), String.class);
 | 
				
			||||||
    assertThat(newParent).isEqualTo(parent);
 | 
					    assertThat(newParent).isEqualTo(parent);
 | 
				
			||||||
    r.consume();
 | 
					    r.consume();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // When the parent name is not explicitly set, it should be
 | 
				
			||||||
 | 
					    // set to "All-Projects".
 | 
				
			||||||
 | 
					    r = adminSession.put("/projects/" + project.get() + "/parent",
 | 
				
			||||||
 | 
					          newParentInput(null));
 | 
				
			||||||
 | 
					    r.assertOK();
 | 
				
			||||||
 | 
					    r.consume();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    r = adminSession.get("/projects/" + project.get() + "/parent");
 | 
				
			||||||
 | 
					    r.assertOK();
 | 
				
			||||||
 | 
					    newParent = newGson().fromJson(r.getReader(), String.class);
 | 
				
			||||||
 | 
					    assertThat(newParent).isEqualTo(AllProjectsNameProvider.DEFAULT);
 | 
				
			||||||
 | 
					    r.consume();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Test
 | 
					  @Test
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -136,15 +136,6 @@ public class KeyCommandSet implements KeyPressHandler {
 | 
				
			|||||||
    if (mask == 0) {
 | 
					    if (mask == 0) {
 | 
				
			||||||
      mask = event.getNativeEvent().getKeyCode();
 | 
					      mask = event.getNativeEvent().getKeyCode();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (event.isAltKeyDown()) {
 | 
					 | 
				
			||||||
      mask |= KeyCommand.M_ALT;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (event.isControlKeyDown()) {
 | 
					 | 
				
			||||||
      mask |= KeyCommand.M_CTRL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (event.isMetaKeyDown()) {
 | 
					 | 
				
			||||||
      mask |= KeyCommand.M_META;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return mask;
 | 
					    return mask;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -368,8 +368,8 @@ public class SideBySide extends Screen {
 | 
				
			|||||||
    KeyMap keyMap = KeyMap.create()
 | 
					    KeyMap keyMap = KeyMap.create()
 | 
				
			||||||
        .on("A", upToChange(true))
 | 
					        .on("A", upToChange(true))
 | 
				
			||||||
        .on("U", upToChange(false))
 | 
					        .on("U", upToChange(false))
 | 
				
			||||||
        .on("[", header.navigate(Direction.PREV))
 | 
					        .on("'['", header.navigate(Direction.PREV))
 | 
				
			||||||
        .on("]", header.navigate(Direction.NEXT))
 | 
					        .on("']'", header.navigate(Direction.NEXT))
 | 
				
			||||||
        .on("R", header.toggleReviewed())
 | 
					        .on("R", header.toggleReviewed())
 | 
				
			||||||
        .on("O", commentManager.toggleOpenBox(cm))
 | 
					        .on("O", commentManager.toggleOpenBox(cm))
 | 
				
			||||||
        .on("Enter", commentManager.toggleOpenBox(cm))
 | 
					        .on("Enter", commentManager.toggleOpenBox(cm))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -85,8 +85,8 @@ public class Submit implements RestModifyView<RevisionResource, SubmitInput>,
 | 
				
			|||||||
      "This change depends on other hidden changes which are not ready";
 | 
					      "This change depends on other hidden changes which are not ready";
 | 
				
			||||||
  private static final String CLICK_FAILURE_TOOLTIP =
 | 
					  private static final String CLICK_FAILURE_TOOLTIP =
 | 
				
			||||||
      "Clicking the button would fail";
 | 
					      "Clicking the button would fail";
 | 
				
			||||||
  private static final String CLICK_FAILURE_OTHER_TOOLTIP =
 | 
					  private static final String CHANGES_NOT_MERGEABLE =
 | 
				
			||||||
      "Clicking the button would fail for other changes";
 | 
					      "See the \"Submitted Together\" tab for problems";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public static class Output {
 | 
					  public static class Output {
 | 
				
			||||||
    transient Change change;
 | 
					    transient Change change;
 | 
				
			||||||
@@ -258,7 +258,7 @@ public class Submit implements RestModifyView<RevisionResource, SubmitInput>,
 | 
				
			|||||||
          return CLICK_FAILURE_TOOLTIP;
 | 
					          return CLICK_FAILURE_TOOLTIP;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!mergeable) {
 | 
					        if (!mergeable) {
 | 
				
			||||||
          return CLICK_FAILURE_OTHER_TOOLTIP;
 | 
					          return CHANGES_NOT_MERGEABLE;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        MergeOp.checkSubmitRule(c);
 | 
					        MergeOp.checkSubmitRule(c);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,11 +20,8 @@ import com.google.gerrit.extensions.registration.DynamicMap.Entry;
 | 
				
			|||||||
import com.google.gerrit.extensions.registration.DynamicSet;
 | 
					import com.google.gerrit.extensions.registration.DynamicSet;
 | 
				
			||||||
import com.google.gerrit.reviewdb.client.Branch;
 | 
					import com.google.gerrit.reviewdb.client.Branch;
 | 
				
			||||||
import com.google.gerrit.reviewdb.client.PatchSet;
 | 
					import com.google.gerrit.reviewdb.client.PatchSet;
 | 
				
			||||||
import com.google.gerrit.reviewdb.client.PatchSetApproval;
 | 
					 | 
				
			||||||
import com.google.gerrit.reviewdb.client.Project;
 | 
					import com.google.gerrit.reviewdb.client.Project;
 | 
				
			||||||
import com.google.gerrit.reviewdb.client.RefNames;
 | 
					import com.google.gerrit.reviewdb.client.RefNames;
 | 
				
			||||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
					 | 
				
			||||||
import com.google.gerrit.server.ApprovalsUtil;
 | 
					 | 
				
			||||||
import com.google.gerrit.server.IdentifiedUser;
 | 
					import com.google.gerrit.server.IdentifiedUser;
 | 
				
			||||||
import com.google.gerrit.server.config.AllProjectsName;
 | 
					import com.google.gerrit.server.config.AllProjectsName;
 | 
				
			||||||
import com.google.gerrit.server.config.PluginConfig;
 | 
					import com.google.gerrit.server.config.PluginConfig;
 | 
				
			||||||
@@ -97,9 +94,7 @@ public class MergeValidators {
 | 
				
			|||||||
        + "The change must be submitted by a Gerrit administrator.";
 | 
					        + "The change must be submitted by a Gerrit administrator.";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final AllProjectsName allProjectsName;
 | 
					    private final AllProjectsName allProjectsName;
 | 
				
			||||||
    private final ReviewDb db;
 | 
					 | 
				
			||||||
    private final ProjectCache projectCache;
 | 
					    private final ProjectCache projectCache;
 | 
				
			||||||
    private final ApprovalsUtil approvalsUtil;
 | 
					 | 
				
			||||||
    private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
 | 
					    private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public interface Factory {
 | 
					    public interface Factory {
 | 
				
			||||||
@@ -108,13 +103,10 @@ public class MergeValidators {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Inject
 | 
					    @Inject
 | 
				
			||||||
    public ProjectConfigValidator(AllProjectsName allProjectsName,
 | 
					    public ProjectConfigValidator(AllProjectsName allProjectsName,
 | 
				
			||||||
        ReviewDb db, ProjectCache projectCache,
 | 
					        ProjectCache projectCache,
 | 
				
			||||||
        ApprovalsUtil approvalsUtil,
 | 
					 | 
				
			||||||
        DynamicMap<ProjectConfigEntry> pluginConfigEntries) {
 | 
					        DynamicMap<ProjectConfigEntry> pluginConfigEntries) {
 | 
				
			||||||
      this.allProjectsName = allProjectsName;
 | 
					      this.allProjectsName = allProjectsName;
 | 
				
			||||||
      this.db = db;
 | 
					 | 
				
			||||||
      this.projectCache = projectCache;
 | 
					      this.projectCache = projectCache;
 | 
				
			||||||
      this.approvalsUtil = approvalsUtil;
 | 
					 | 
				
			||||||
      this.pluginConfigEntries = pluginConfigEntries;
 | 
					      this.pluginConfigEntries = pluginConfigEntries;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -142,11 +134,6 @@ public class MergeValidators {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            if (!oldParent.equals(newParent)) {
 | 
					            if (!oldParent.equals(newParent)) {
 | 
				
			||||||
              PatchSetApproval psa =
 | 
					 | 
				
			||||||
                  approvalsUtil.getSubmitter(db, commit.notes(), patchSetId);
 | 
					 | 
				
			||||||
              if (psa == null) {
 | 
					 | 
				
			||||||
                throw new MergeValidationException(SET_BY_ADMIN);
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
              if (!caller.getCapabilities().canAdministrateServer()) {
 | 
					              if (!caller.getCapabilities().canAdministrateServer()) {
 | 
				
			||||||
                throw new MergeValidationException(SET_BY_ADMIN);
 | 
					                throw new MergeValidationException(SET_BY_ADMIN);
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -150,9 +150,13 @@ public class PatchFile {
 | 
				
			|||||||
    if (tw == null) {
 | 
					    if (tw == null) {
 | 
				
			||||||
      return Text.EMPTY;
 | 
					      return Text.EMPTY;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (tw.getFileMode(0).getObjectType() != Constants.OBJ_BLOB) {
 | 
					    if (tw.getFileMode(0).getObjectType() == Constants.OBJ_BLOB) {
 | 
				
			||||||
 | 
					      return new Text(repo.open(tw.getObjectId(0), Constants.OBJ_BLOB));
 | 
				
			||||||
 | 
					    } else if (tw.getFileMode(0).getObjectType() == Constants.OBJ_COMMIT) {
 | 
				
			||||||
 | 
					      String str = "Subproject commit " + ObjectId.toString(tw.getObjectId(0));
 | 
				
			||||||
 | 
					      return new Text(str.getBytes());
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
      return Text.EMPTY;
 | 
					      return Text.EMPTY;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return new Text(repo.open(tw.getObjectId(0), Constants.OBJ_BLOB));
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,6 @@ import com.google.gerrit.reviewdb.client.PatchSet;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import org.eclipse.jgit.diff.Edit;
 | 
					import org.eclipse.jgit.diff.Edit;
 | 
				
			||||||
import org.eclipse.jgit.lib.Constants;
 | 
					import org.eclipse.jgit.lib.Constants;
 | 
				
			||||||
import org.eclipse.jgit.lib.FileMode;
 | 
					 | 
				
			||||||
import org.eclipse.jgit.patch.CombinedFileHeader;
 | 
					import org.eclipse.jgit.patch.CombinedFileHeader;
 | 
				
			||||||
import org.eclipse.jgit.patch.FileHeader;
 | 
					import org.eclipse.jgit.patch.FileHeader;
 | 
				
			||||||
import org.eclipse.jgit.util.IntList;
 | 
					import org.eclipse.jgit.util.IntList;
 | 
				
			||||||
@@ -97,10 +96,7 @@ public class PatchListEntry {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    header = compact(hdr);
 | 
					    header = compact(hdr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (hdr instanceof CombinedFileHeader
 | 
					    if (hdr instanceof CombinedFileHeader || hdr.getHunks().isEmpty()) {
 | 
				
			||||||
        || hdr.getHunks().isEmpty() //
 | 
					 | 
				
			||||||
        || hdr.getOldMode() == FileMode.GITLINK
 | 
					 | 
				
			||||||
        || hdr.getNewMode() == FileMode.GITLINK) {
 | 
					 | 
				
			||||||
      edits = Collections.emptyList();
 | 
					      edits = Collections.emptyList();
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      edits = Collections.unmodifiableList(editList);
 | 
					      edits = Collections.unmodifiableList(editList);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -312,14 +312,6 @@ public class PatchListLoader implements Callable<PatchList> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  private PatchListEntry newEntry(RevTree aTree, FileHeader fileHeader,
 | 
					  private PatchListEntry newEntry(RevTree aTree, FileHeader fileHeader,
 | 
				
			||||||
      long size, long sizeDelta) {
 | 
					      long size, long sizeDelta) {
 | 
				
			||||||
    final FileMode oldMode = fileHeader.getOldMode();
 | 
					 | 
				
			||||||
    final FileMode newMode = fileHeader.getNewMode();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (oldMode == FileMode.GITLINK || newMode == FileMode.GITLINK) {
 | 
					 | 
				
			||||||
      return new PatchListEntry(fileHeader, Collections.<Edit> emptyList(),
 | 
					 | 
				
			||||||
          size, sizeDelta);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (aTree == null // want combined diff
 | 
					    if (aTree == null // want combined diff
 | 
				
			||||||
        || fileHeader.getPatchType() != PatchType.UNIFIED
 | 
					        || fileHeader.getPatchType() != PatchType.UNIFIED
 | 
				
			||||||
        || fileHeader.getHunks().isEmpty()) {
 | 
					        || fileHeader.getHunks().isEmpty()) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -179,9 +179,7 @@ class PatchScriptBuilder {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    boolean hugeFile = false;
 | 
					    boolean hugeFile = false;
 | 
				
			||||||
    if (a.mode == FileMode.GITLINK || b.mode == FileMode.GITLINK) {
 | 
					    if (a.src == b.src && a.size() <= context
 | 
				
			||||||
      // Do nothing
 | 
					 | 
				
			||||||
    } else if (a.src == b.src && a.size() <= context
 | 
					 | 
				
			||||||
        && content.getEdits().isEmpty()) {
 | 
					        && content.getEdits().isEmpty()) {
 | 
				
			||||||
      // Odd special case; the files are identical (100% rename or copy)
 | 
					      // Odd special case; the files are identical (100% rename or copy)
 | 
				
			||||||
      // and the user has asked for context that is larger than the file.
 | 
					      // and the user has asked for context that is larger than the file.
 | 
				
			||||||
@@ -471,6 +469,10 @@ class PatchScriptBuilder {
 | 
				
			|||||||
          } else if (mode.getObjectType() == Constants.OBJ_BLOB) {
 | 
					          } else if (mode.getObjectType() == Constants.OBJ_BLOB) {
 | 
				
			||||||
            srcContent = Text.asByteArray(db.open(id, Constants.OBJ_BLOB));
 | 
					            srcContent = Text.asByteArray(db.open(id, Constants.OBJ_BLOB));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          } else if (mode.getObjectType() == Constants.OBJ_COMMIT) {
 | 
				
			||||||
 | 
					            String strContent = "Subproject commit " + ObjectId.toString(id);
 | 
				
			||||||
 | 
					            srcContent = strContent.getBytes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            srcContent = Text.NO_BYTES;
 | 
					            srcContent = Text.NO_BYTES;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,6 +44,7 @@ import com.google.gerrit.reviewdb.client.RefNames;
 | 
				
			|||||||
import com.google.gerrit.server.CurrentUser;
 | 
					import com.google.gerrit.server.CurrentUser;
 | 
				
			||||||
import com.google.gerrit.server.GerritPersonIdent;
 | 
					import com.google.gerrit.server.GerritPersonIdent;
 | 
				
			||||||
import com.google.gerrit.server.account.GroupBackend;
 | 
					import com.google.gerrit.server.account.GroupBackend;
 | 
				
			||||||
 | 
					import com.google.gerrit.server.config.AllProjectsName;
 | 
				
			||||||
import com.google.gerrit.server.config.ProjectOwnerGroupsProvider;
 | 
					import com.google.gerrit.server.config.ProjectOwnerGroupsProvider;
 | 
				
			||||||
import com.google.gerrit.server.config.RepositoryConfig;
 | 
					import com.google.gerrit.server.config.RepositoryConfig;
 | 
				
			||||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 | 
					import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 | 
				
			||||||
@@ -102,6 +103,7 @@ public class CreateProject implements RestModifyView<TopLevelResource, ProjectIn
 | 
				
			|||||||
  private final PersonIdent serverIdent;
 | 
					  private final PersonIdent serverIdent;
 | 
				
			||||||
  private final Provider<CurrentUser> currentUser;
 | 
					  private final Provider<CurrentUser> currentUser;
 | 
				
			||||||
  private final Provider<PutConfig> putConfig;
 | 
					  private final Provider<PutConfig> putConfig;
 | 
				
			||||||
 | 
					  private final AllProjectsName allProjects;
 | 
				
			||||||
  private final String name;
 | 
					  private final String name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Inject
 | 
					  @Inject
 | 
				
			||||||
@@ -120,6 +122,7 @@ public class CreateProject implements RestModifyView<TopLevelResource, ProjectIn
 | 
				
			|||||||
      @GerritPersonIdent PersonIdent serverIdent,
 | 
					      @GerritPersonIdent PersonIdent serverIdent,
 | 
				
			||||||
      Provider<CurrentUser> currentUser,
 | 
					      Provider<CurrentUser> currentUser,
 | 
				
			||||||
      Provider<PutConfig> putConfig,
 | 
					      Provider<PutConfig> putConfig,
 | 
				
			||||||
 | 
					      AllProjectsName allProjects,
 | 
				
			||||||
      @Assisted String name) {
 | 
					      @Assisted String name) {
 | 
				
			||||||
    this.projectsCollection = projectsCollection;
 | 
					    this.projectsCollection = projectsCollection;
 | 
				
			||||||
    this.groupsCollection = groupsCollection;
 | 
					    this.groupsCollection = groupsCollection;
 | 
				
			||||||
@@ -137,6 +140,7 @@ public class CreateProject implements RestModifyView<TopLevelResource, ProjectIn
 | 
				
			|||||||
    this.serverIdent = serverIdent;
 | 
					    this.serverIdent = serverIdent;
 | 
				
			||||||
    this.currentUser = currentUser;
 | 
					    this.currentUser = currentUser;
 | 
				
			||||||
    this.putConfig = putConfig;
 | 
					    this.putConfig = putConfig;
 | 
				
			||||||
 | 
					    this.allProjects = allProjects;
 | 
				
			||||||
    this.name = name;
 | 
					    this.name = name;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -155,9 +159,9 @@ public class CreateProject implements RestModifyView<TopLevelResource, ProjectIn
 | 
				
			|||||||
    CreateProjectArgs args = new CreateProjectArgs();
 | 
					    CreateProjectArgs args = new CreateProjectArgs();
 | 
				
			||||||
    args.setProjectName(ProjectUtil.stripGitSuffix(name));
 | 
					    args.setProjectName(ProjectUtil.stripGitSuffix(name));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!Strings.isNullOrEmpty(input.parent)) {
 | 
					    String parentName = MoreObjects.firstNonNull(
 | 
				
			||||||
      args.newParent = projectsCollection.get().parse(input.parent).getControl();
 | 
					        Strings.emptyToNull(input.parent), allProjects.get());
 | 
				
			||||||
    }
 | 
					    args.newParent = projectsCollection.get().parse(parentName).getControl();
 | 
				
			||||||
    args.createEmptyCommit = input.createEmptyCommit;
 | 
					    args.createEmptyCommit = input.createEmptyCommit;
 | 
				
			||||||
    args.permissionsOnly = input.permissionsOnly;
 | 
					    args.permissionsOnly = input.permissionsOnly;
 | 
				
			||||||
    args.projectDescription = Strings.emptyToNull(input.description);
 | 
					    args.projectDescription = Strings.emptyToNull(input.description);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package com.google.gerrit.server.project;
 | 
					package com.google.gerrit.server.project;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static com.google.common.base.Preconditions.checkNotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.google.common.base.MoreObjects;
 | 
					import com.google.common.base.MoreObjects;
 | 
				
			||||||
import com.google.common.base.Predicate;
 | 
					import com.google.common.base.Predicate;
 | 
				
			||||||
import com.google.common.base.Strings;
 | 
					import com.google.common.base.Strings;
 | 
				
			||||||
@@ -70,18 +72,18 @@ public class SetParent implements RestModifyView<ProjectResource, Input> {
 | 
				
			|||||||
      throws AuthException, ResourceConflictException,
 | 
					      throws AuthException, ResourceConflictException,
 | 
				
			||||||
      ResourceNotFoundException, UnprocessableEntityException, IOException {
 | 
					      ResourceNotFoundException, UnprocessableEntityException, IOException {
 | 
				
			||||||
    ProjectControl ctl = rsrc.getControl();
 | 
					    ProjectControl ctl = rsrc.getControl();
 | 
				
			||||||
    validateParentUpdate(ctl, input.parent, checkIfAdmin);
 | 
					    String parentName = MoreObjects.firstNonNull(
 | 
				
			||||||
 | 
					        Strings.emptyToNull(input.parent), allProjects.get());
 | 
				
			||||||
 | 
					    validateParentUpdate(ctl, parentName, checkIfAdmin);
 | 
				
			||||||
    try (MetaDataUpdate md = updateFactory.create(rsrc.getNameKey())) {
 | 
					    try (MetaDataUpdate md = updateFactory.create(rsrc.getNameKey())) {
 | 
				
			||||||
      ProjectConfig config = ProjectConfig.read(md);
 | 
					      ProjectConfig config = ProjectConfig.read(md);
 | 
				
			||||||
      Project project = config.getProject();
 | 
					      Project project = config.getProject();
 | 
				
			||||||
      project.setParentName(Strings.emptyToNull(input.parent));
 | 
					      project.setParentName(parentName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      String msg = Strings.emptyToNull(input.commitMessage);
 | 
					      String msg = Strings.emptyToNull(input.commitMessage);
 | 
				
			||||||
      if (msg == null) {
 | 
					      if (msg == null) {
 | 
				
			||||||
        msg = String.format(
 | 
					        msg = String.format(
 | 
				
			||||||
            "Changed parent to %s.\n",
 | 
					              "Changed parent to %s.\n", parentName);
 | 
				
			||||||
            MoreObjects.firstNonNull(project.getParentName(),
 | 
					 | 
				
			||||||
                allProjects.get()));
 | 
					 | 
				
			||||||
      } else if (!msg.endsWith("\n")) {
 | 
					      } else if (!msg.endsWith("\n")) {
 | 
				
			||||||
        msg += "\n";
 | 
					        msg += "\n";
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -90,8 +92,9 @@ public class SetParent implements RestModifyView<ProjectResource, Input> {
 | 
				
			|||||||
      config.commit(md);
 | 
					      config.commit(md);
 | 
				
			||||||
      cache.evict(ctl.getProject());
 | 
					      cache.evict(ctl.getProject());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      Project.NameKey parentName = project.getParent(allProjects);
 | 
					      Project.NameKey parent = project.getParent(allProjects);
 | 
				
			||||||
      return parentName != null ? parentName.get() : "";
 | 
					      checkNotNull(parent);
 | 
				
			||||||
 | 
					      return parent.get();
 | 
				
			||||||
    } catch (RepositoryNotFoundException notFound) {
 | 
					    } catch (RepositoryNotFoundException notFound) {
 | 
				
			||||||
      throw new ResourceNotFoundException(rsrc.getName());
 | 
					      throw new ResourceNotFoundException(rsrc.getName());
 | 
				
			||||||
    } catch (ConfigInvalidException e) {
 | 
					    } catch (ConfigInvalidException e) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user