Merge branch 'stable-2.11'
* stable-2.11:
Create local user if user does not exist anymore in LDAP
Fix Eclise warnings
Change-Id: I41ef115d484b45f715fbcb737dfb713c3a5c79d4
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
index fe76caf..e87ec1d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
@@ -17,27 +17,40 @@
import com.google.gerrit.common.errors.NoSuchAccountException;
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupMember;
+import com.google.gerrit.reviewdb.client.AccountGroupName;
import com.google.gerrit.reviewdb.client.AccountSshKey;
import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.account.AccountException;
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.CreateAccount;
import com.google.gerrit.server.account.GetSshKeys.SshKeyInfo;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.GroupUUID;
import com.google.gerrit.server.config.AuthConfig;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
+import org.eclipse.jgit.lib.PersonIdent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@@ -46,26 +59,42 @@
class AccountUtil {
private static Logger log = LoggerFactory.getLogger(AccountUtil.class);
+ private static final String IMPORTED_USERS = "Imported Users";
+ private static final AccountGroup.NameKey IMPORTED_USERS_NAME =
+ new AccountGroup.NameKey(IMPORTED_USERS);
+
private final AccountCache accountCache;
private final AccountManager accountManager;
private final AuthType authType;
+ private final IdentifiedUser currentUser;
+ private final GroupCache groupCache;
+ private final PersonIdent serverIdent;
private final Provider<ReviewDb> db;
@Inject
+ private CreateAccount.Factory createAccountFactory;
+
+ @Inject
public AccountUtil(
AccountCache accountCache,
AccountManager accountManager,
AuthConfig authConfig,
+ GroupCache groupCache,
+ IdentifiedUser currentUser,
+ @GerritPersonIdent PersonIdent serverIdent,
Provider<ReviewDb> db) {
this.accountCache = accountCache;
this.accountManager = accountManager;
this.authType = authConfig.getAuthType();
+ this.currentUser = currentUser;
this.db = db;
+ this.groupCache = groupCache;
+ this.serverIdent = serverIdent;
}
Account.Id resolveUser(GerritApi api, AccountInfo acc)
throws NoSuchAccountException, BadRequestException, IOException,
- OrmException {
+ OrmException, ResourceConflictException, UnprocessableEntityException {
if (acc.username == null) {
throw new NoSuchAccountException(String.format(
"User %s <%s> (%s) doesn't have a username and cannot be looked up.",
@@ -80,8 +109,7 @@
case LDAP:
return createAccountByLdapAndAddSshKeys(api, acc);
default:
- throw new NoSuchAccountException(String.format("User %s not found",
- acc.username));
+ return createLocalUser(acc);
}
}
if (!Objects.equals(a.getAccount().getPreferredEmail(), acc.email)) {
@@ -89,14 +117,13 @@
"Email mismatch for user %s: expected %s but found %s",
acc.username, acc.email, a.getAccount().getPreferredEmail()));
}
-
return a.getAccount().getId();
}
private Account.Id createAccountByLdapAndAddSshKeys(GerritApi api,
- AccountInfo acc)
- throws NoSuchAccountException, BadRequestException, IOException,
- OrmException {
+ AccountInfo acc) throws NoSuchAccountException, BadRequestException,
+ IOException, OrmException, ResourceConflictException,
+ UnprocessableEntityException {
if (!acc.username.matches(Account.USER_NAME_PATTERN)) {
throw new NoSuchAccountException(String.format("User %s not found",
acc.username));
@@ -109,13 +136,12 @@
addSshKeys(api, acc);
return id;
} catch (AccountException e) {
- throw new NoSuchAccountException(
- String.format("User %s not found", acc.username));
+ return createLocalUser(acc);
}
}
- private void addSshKeys(GerritApi api, AccountInfo acc) throws
- BadRequestException, IOException, OrmException {
+ private void addSshKeys(GerritApi api, AccountInfo acc)
+ throws BadRequestException, IOException, OrmException {
List<SshKeyInfo> sshKeys = api.getSshKeys(acc.username);
AccountState a = accountCache.getByUsername(acc.username);
db.get().accountSshKeys().upsert(toAccountSshKey(a, sshKeys));
@@ -132,4 +158,60 @@
}
return result;
}
+
+ private Account.Id createLocalUser(AccountInfo acc)
+ throws BadRequestException, ResourceConflictException,
+ UnprocessableEntityException, OrmException {
+ CreateAccount.Input input = new CreateAccount.Input();
+ log.info(String.format("User '%s' not found", acc.username));
+ String username = acc.username;
+ input.username = username;
+ input.email = acc.email;
+ input.name = acc.name;
+
+ AccountInfo accInfo =
+ createAccountFactory.create(username)
+ .apply(TopLevelResource.INSTANCE, input).value();
+ log.info(String.format("Local user '%s' created", username));
+
+ Account.Id userId = new Account.Id(accInfo._accountId);
+ Account account = accountCache.get(userId).getAccount();
+ account.setActive(false);
+ addToImportedUsersGroup(userId);
+ accountCache.evict(userId);
+ return userId;
+ }
+
+ private void addToImportedUsersGroup(Account.Id id) throws OrmException {
+ AccountGroup group = getImportedUsersGroup();
+ AccountGroupMember member =
+ new AccountGroupMember(new AccountGroupMember.Key(id, group.getId()));
+ db.get().accountGroupMembers().insert(Collections.singleton(member));
+ }
+
+ private AccountGroup getImportedUsersGroup() throws OrmException {
+ AccountGroup accGroup = groupCache.get(IMPORTED_USERS_NAME);
+ if (accGroup == null) {
+ accGroup = createImportedUsersGroup();
+ }
+ return accGroup;
+ }
+
+ private AccountGroup createImportedUsersGroup() throws OrmException {
+ AccountGroup.Id groupId = new AccountGroup.Id(db.get().nextAccountGroupId());
+ AccountGroup.UUID uuid =
+ GroupUUID.make(
+ IMPORTED_USERS,
+ currentUser.newCommitterIdent(
+ serverIdent.getWhen(),
+ serverIdent.getTimeZone()));
+ AccountGroup group = new AccountGroup(IMPORTED_USERS_NAME, groupId, uuid);
+ group.setDescription(IMPORTED_USERS);
+
+ db.get().accountGroupNames()
+ .insert(Collections.singleton(new AccountGroupName(group)));
+ db.get().accountGroups().insert(Collections.singleton(group));
+ groupCache.onCreateGroup(IMPORTED_USERS_NAME);
+ return group;
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
index b5deef0..a9eb69b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
@@ -23,6 +23,8 @@
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.LabelInfo;
import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
@@ -81,7 +83,8 @@
}
void add(GerritApi api) throws OrmException, NoSuchChangeException, IOException,
- NoSuchAccountException, BadRequestException {
+ NoSuchAccountException, BadRequestException, ResourceConflictException,
+ UnprocessableEntityException{
if (resume) {
db.patchSetApprovals().delete(
db.patchSetApprovals().byChange(change.getId()));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
index f04c435..cf91b66 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
@@ -65,7 +65,7 @@
this.resume = resume;
}
- void add() throws IllegalArgumentException, AuthException, IOException,
+ void add() throws IllegalArgumentException, IOException,
ValidationException, OrmException, NoSuchChangeException {
ChangeControl ctrl = changeControlFactory.controlFor(change, currentUser);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java
index cf49557..9fb8e27 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java
@@ -90,14 +90,17 @@
}
private static class DummyX509TrustManager implements X509TrustManager {
+ @Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
+ @Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
// no check
}
+ @Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
// no check
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
index 7675235..c4c5f16 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
@@ -27,6 +27,7 @@
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.AccountGroupById;
@@ -115,7 +116,7 @@
public Response<String> apply(ConfigResource rsrc, Input input)
throws ResourceConflictException, PreconditionFailedException,
BadRequestException, NoSuchAccountException, OrmException, IOException,
- MethodNotAllowedException {
+ MethodNotAllowedException, UnprocessableEntityException {
GroupInfo groupInfo;
this.api = apiFactory.create(input.from, input.user, input.pass);
groupInfo = api.getGroup(group.get());
@@ -125,9 +126,10 @@
return Response.<String> ok("OK");
}
- private void validate(Input input, GroupInfo groupInfo) throws ResourceConflictException,
- PreconditionFailedException, BadRequestException, IOException,
- OrmException, NoSuchAccountException, MethodNotAllowedException {
+ private void validate(Input input, GroupInfo groupInfo)
+ throws ResourceConflictException, PreconditionFailedException,
+ BadRequestException, IOException, OrmException, NoSuchAccountException,
+ MethodNotAllowedException, UnprocessableEntityException {
if (!isInternalGroup(new AccountGroup.UUID(groupInfo.id))) {
throw new MethodNotAllowedException(String.format(
"Group with name %s is not an internal group and cannot be imported",
@@ -183,7 +185,8 @@
private CreateGroupArgs toCreateGroupArgs(GroupInfo groupInfo)
throws IOException, OrmException, BadRequestException,
- NoSuchAccountException {
+ NoSuchAccountException, ResourceConflictException,
+ UnprocessableEntityException {
CreateGroupArgs args = new CreateGroupArgs();
args.setGroupName(groupInfo.name);
args.groupDescription = groupInfo.description;
@@ -201,7 +204,8 @@
private AccountGroup createGroup(Input input, GroupInfo info) throws OrmException,
ResourceConflictException, NoSuchAccountException, BadRequestException,
- IOException, PreconditionFailedException, MethodNotAllowedException {
+ IOException, PreconditionFailedException, MethodNotAllowedException,
+ UnprocessableEntityException {
String uniqueName = getUniqueGroupName(info.name);
if (!info.name.equals(uniqueName)) {
log.warn(String.format("Group %s with UUID %s is imported with name %s",
@@ -280,7 +284,7 @@
private void addMembers(AccountGroup.Id groupId, List<AccountInfo> members)
throws OrmException, NoSuchAccountException, BadRequestException,
- IOException {
+ IOException, ResourceConflictException, UnprocessableEntityException {
List<AccountGroupMember> memberships = new ArrayList<>();
for (AccountInfo member : members) {
Account.Id userId = accountUtil.resolveUser(api, member);
@@ -299,7 +303,7 @@
String groupName, List<GroupInfo> includedGroups)
throws BadRequestException, ResourceConflictException,
PreconditionFailedException, NoSuchAccountException, OrmException,
- IOException, MethodNotAllowedException {
+ IOException, MethodNotAllowedException, UnprocessableEntityException {
List<AccountGroupById> includeList = new ArrayList<>();
for (GroupInfo includedGroup : includedGroups) {
if (isInternalGroup(new AccountGroup.UUID(includedGroup.id))) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
index bcccf39..c55971c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
@@ -21,6 +21,7 @@
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.PreconditionFailedException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.account.GroupCache;
@@ -77,7 +78,8 @@
}
void importGroups() throws PreconditionFailedException, BadRequestException,
- NoSuchAccountException, OrmException, IOException {
+ NoSuchAccountException, OrmException, IOException,
+ UnprocessableEntityException {
ProjectConfig projectConfig = projectCache.get(project).getConfig();
Set<AccountGroup.UUID> groupUUIDs = projectConfig.getAllGroupUUIDs();
pm.beginTask("Import Groups", groupUUIDs.size());
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 e2c63d1..4e90374 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
@@ -227,7 +227,7 @@
try {
srcProject = !Strings.isNullOrEmpty(input.name)
? new Project.NameKey(input.name) : targetProject;
- checkProjectInSource(input, pm);
+ checkProjectInSource(pm);
setParentProjectName(input, pm);
checkPreconditions(pm);
try (Repository repo = openRepoStep.open(targetProject, resume, pm)) {
@@ -262,7 +262,7 @@
return statistic;
}
- private void checkProjectInSource(Input input, ProgressMonitor pm)
+ private void checkProjectInSource(ProgressMonitor pm)
throws IOException, BadRequestException {
pm.beginTask("Check source project", 1);
api.getProject(srcProject.get());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
index 5cc44f3..2630429 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
@@ -21,7 +21,9 @@
import com.google.gerrit.extensions.client.ChangeStatus;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
@@ -220,7 +222,8 @@
}
private Change createChange(ChangeInfo c) throws OrmException,
- NoSuchAccountException, BadRequestException, IOException {
+ NoSuchAccountException, BadRequestException, IOException,
+ ResourceConflictException, UnprocessableEntityException {
Change.Id changeId = new Change.Id(db.nextChangeId());
Change change =
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 306d819..ad29c03 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
@@ -18,6 +18,8 @@
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.ChangeMessageInfo;
import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
@@ -75,7 +77,8 @@
}
void replay(GerritApi api) throws NoSuchAccountException, NoSuchChangeException,
- OrmException, IOException, BadRequestException {
+ OrmException, IOException, BadRequestException, ResourceConflictException,
+ UnprocessableEntityException {
for (ChangeMessageInfo msg : changeInfo.messages) {
ChangeMessage.Key msgKey = new ChangeMessage.Key(change.getId(), msg.id);
if (resume && db.changeMessages().get(msgKey) != null) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
index a4b4601..9bce9e1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
@@ -18,6 +18,8 @@
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.RevisionInfo;
import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetInfo;
@@ -80,7 +82,7 @@
}
void replay(GerritApi api) throws IOException, OrmException, NoSuchAccountException,
- BadRequestException {
+ BadRequestException, ResourceConflictException, UnprocessableEntityException {
List<RevisionInfo> revisions = new ArrayList<>(changeInfo.revisions.values());
sortRevisionInfoByNumber(revisions);
List<PatchSet> patchSets = new ArrayList<>();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java
index cf3e578..df68a6e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java
@@ -66,6 +66,7 @@
+ (copy ? "copy" : "import") + " was completed."));
Button okButton = new Button("OK");
okButton.addClickHandler(new ClickHandler() {
+ @Override
public void onClick(ClickEvent event) {
successDialog.hide();
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java
index d1e4df1..6bafec2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java
@@ -106,6 +106,7 @@
p.add(new Label("The group was imported."));
Button okButton = new Button("OK");
okButton.addClickHandler(new ClickHandler() {
+ @Override
public void onClick(ClickEvent event) {
successDialog.hide();
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java
index 23dd4f7..7601de4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java
@@ -108,6 +108,7 @@
p.add(new Label("Created Changes: " + result.numChangesCreated()));
Button okButton = new Button("OK");
okButton.addClickHandler(new ClickHandler() {
+ @Override
public void onClick(ClickEvent event) {
successDialog.hide();
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java
index e2fc1ea..81e9fbb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java
@@ -46,7 +46,7 @@
MouseUpHandler, ChangeHandler, ValueChangeHandler<Object> {
private final FocusWidget widget;
- private Map<TextBoxBase, String> strings = new HashMap<TextBoxBase, String>();
+ private Map<TextBoxBase, String> strings = new HashMap<>();
private String originalValue;
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index 64069c1..7a7526b 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -95,9 +95,16 @@
Account] or the link:access-control.html#capability_administrateServer[
Administrate Server] capability assigned on the source system.
-Gerrit internal users (e.g. service users) are never automatically
-created but must be created in the target Gerrit server before the
-import.
+If for any reason an user is no longer existent in the LDAP instance but it
+is listed as a change owner, reviewer or as part of a group, a local user
+account is created with the same username. Giving that such user is not longer
+active in the system, their account status is set to inactive.
+
+Gerrit internal users (e.g. service users) should be created in the target
+Gerrit server before the import. Otherwise, an inactive local user is created
+with the same username.
+
+All locally created users are added to an internal group called "Imported Users".
<a id="project-import-commands">
#### Commands
@@ -277,9 +284,16 @@
member are automatically retrieved from the source Gerrit server and
added to the new account in the target Gerrit server.
-Gerrit internal users (e.g. service users) are never automatically
-created but must be created in the target Gerrit server before the
-import.
+If for any reason an user is no longer existent in the LDAP instance but it
+is listed as a group member, a local user account is created with the same
+username. Giving that such user is not longer active in the system, their account
+status is set to inactive.
+
+Gerrit internal users (e.g. service users) should be created in the target
+Gerrit server before the import. Otherwise, an inactive local user is created
+with the same username.
+
+All locally created users are added to an internal group called "Imported Users".
If the group name is occupied in the target system (a group with the
same name, but a different UUID exists already), the group is