Merge branch 'stable-2.13'

* stable-2.13:
  Supply parent before validating project creation
  Log: Print stack trace on exception
  ReplayMessagesStep: Fix potential NullPointerException

Change-Id: Ia636b6339d4e270b5126a895a1d64f278b9d6245
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java
index 38e0f8b..8c6f27e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.importer;
 
+import com.google.common.base.Throwables;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
 import com.google.gerrit.audit.AuditEvent;
@@ -96,7 +97,7 @@
     event.setProperty(TARGET_PROJECT_NAME, targetProject.get());
 
     if (ex != null) {
-      event.setProperty(ERROR, ex.toString());
+      event.setProperty(ERROR, Throwables.getStackTraceAsString(ex));
     }
 
     log.callAppenders(event);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
index 5c946c4..83c9cb9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
@@ -232,7 +232,8 @@
       checkProjectInSource(pm);
       setParentProjectName(input, pm);
       checkPreconditions(pm);
-      try (Repository repo = openRepoStep.open(targetProject, resume, pm)) {
+      try (Repository repo = openRepoStep.open(targetProject, resume, pm,
+          parent)) {
         ImportJson.persist(lockFile, importJson.format(input, info), pm);
         configRepoStep.configure(repo, srcProject, input.from, pm);
         gitFetchStep.fetch(input.user, input.pass, repo, pm);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java
index 8b347a1..cacc18e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java
@@ -19,13 +19,16 @@
 
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.project.CreateProjectArgs;
 import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectsCollection;
 import com.google.gerrit.server.validators.ProjectCreationValidationListener;
 import com.google.gerrit.server.validators.ValidationException;
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 import com.google.inject.Singleton;
 
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
@@ -40,18 +43,22 @@
   private final ProjectCache projectCache;
   private final DynamicSet<ProjectCreationValidationListener>
       projectCreationValidationListeners;
+  private final Provider<ProjectsCollection> projectsCollection;
 
   @Inject
   OpenRepositoryStep(GitRepositoryManager git,
       ProjectCache projectCache,
-      DynamicSet<ProjectCreationValidationListener> projectCreationValidationListeners) {
+      DynamicSet<ProjectCreationValidationListener> projectCreationValidationListeners,
+      Provider<ProjectsCollection> projectsCollection) {
     this.git = git;
     this.projectCache = projectCache;
     this.projectCreationValidationListeners = projectCreationValidationListeners;
+    this.projectsCollection = projectsCollection;
   }
 
-  Repository open(Project.NameKey name, boolean resume, ProgressMonitor pm)
-      throws ResourceConflictException, IOException {
+  Repository open(Project.NameKey name, boolean resume, ProgressMonitor pm,
+      Project.NameKey parent)
+      throws ResourceConflictException, IOException, UnprocessableEntityException {
     pm.beginTask("Open repository", 1);
     try {
       Repository repo = git.openRepository(name);
@@ -69,17 +76,18 @@
       }
     }
 
-    beforeCreateProject(name);
+    beforeCreateProject(name, parent);
     Repository repo = git.createRepository(name);
     onProjectCreated(name);
     updateAndEnd(pm);
     return repo;
   }
 
-  private void beforeCreateProject(Project.NameKey name)
-      throws ResourceConflictException {
+  private void beforeCreateProject(Project.NameKey name, Project.NameKey parent)
+      throws ResourceConflictException, UnprocessableEntityException, IOException {
     CreateProjectArgs args = new CreateProjectArgs();
     args.setProjectName(name);
+    args.newParent = projectsCollection.get().parse(parent.get()).getControl();
     for (ProjectCreationValidationListener l : projectCreationValidationListeners) {
       try {
         l.validateNewProject(args);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
index 3fb9932..dde14ee 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
@@ -87,12 +87,12 @@
       }
 
       Timestamp ts = msg.date;
+      PatchSet.Id psId = msg._revisionNumber != null
+          ? new PatchSet.Id(change.getId(),  msg._revisionNumber)
+          : null;
       if (msg.author != null) {
         Account.Id userId = accountUtil.resolveUser(api, msg.author);
         ChangeUpdate update = updateFactory.create(control(change, userId), ts);
-        PatchSet.Id psId = msg._revisionNumber != null
-            ? new PatchSet.Id(change.getId(),  msg._revisionNumber)
-            : null;
         ChangeMessage cmsg = new ChangeMessage(msgKey, userId, ts, psId);
         cmsg.setMessage(msg.message);
         cmUtil.addChangeMessage(db, update, cmsg);
@@ -101,7 +101,7 @@
         // Message create by the GerritPersonIdent user
         ChangeMessage cmsg =
             new ChangeMessage(new ChangeMessage.Key(change.getId(), msg.id),
-                null, ts, new PatchSet.Id(change.getId(), msg._revisionNumber));
+                null, ts, psId);
         cmsg.setMessage(msg.message);
         db.changeMessages().insert(Collections.singleton(cmsg));
       }