Delete user branch when account is deleted
Change-Id: I4fde3560c5d5f138a19f69b695d881fc4b3ce337 Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
@@ -41,6 +41,7 @@ import com.google.gerrit.reviewdb.client.RefNames;
|
||||
import com.google.gerrit.server.ChangeUtil;
|
||||
import com.google.gerrit.server.IdentifiedUser;
|
||||
import com.google.gerrit.server.Sequences;
|
||||
import com.google.gerrit.server.account.AccountsUpdate;
|
||||
import com.google.gerrit.server.change.ChangeInserter;
|
||||
import com.google.gerrit.server.change.ConsistencyChecker;
|
||||
import com.google.gerrit.server.change.PatchSetInserter;
|
||||
@@ -90,6 +91,8 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest {
|
||||
|
||||
@Inject private Sequences sequences;
|
||||
|
||||
@Inject private AccountsUpdate.Server accountsUpdate;
|
||||
|
||||
private RevCommit tip;
|
||||
private Account.Id adminId;
|
||||
private ConsistencyChecker checker;
|
||||
@@ -119,7 +122,7 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest {
|
||||
public void missingOwner() throws Exception {
|
||||
TestAccount owner = accounts.create("missing");
|
||||
ChangeControl ctl = insertChange(owner);
|
||||
db.accounts().deleteKeys(singleton(owner.getId()));
|
||||
accountsUpdate.create().deleteByKey(db, owner.getId());
|
||||
|
||||
assertProblems(ctl, null, problem("Missing change owner: " + owner.getId()));
|
||||
}
|
||||
|
@@ -232,12 +232,13 @@ public class AccountManager {
|
||||
awaitsFirstAccountCheck.getAndSet(false) && db.accounts().anyAccounts().toList().isEmpty();
|
||||
|
||||
try {
|
||||
accountsUpdateFactory.create().upsert(db, account);
|
||||
AccountsUpdate accountsUpdate = accountsUpdateFactory.create();
|
||||
accountsUpdate.upsert(db, account);
|
||||
|
||||
ExternalId existingExtId = externalIds.get(db, extId.key());
|
||||
if (existingExtId != null && !existingExtId.accountId().equals(extId.accountId())) {
|
||||
// external ID is assigned to another account, do not overwrite
|
||||
db.accounts().delete(Collections.singleton(account));
|
||||
accountsUpdate.delete(db, account);
|
||||
throw new AccountException(
|
||||
"Cannot assign external ID \""
|
||||
+ extId.key().get()
|
||||
@@ -345,7 +346,7 @@ public class AccountManager {
|
||||
// such an account cannot be used for uploading changes,
|
||||
// this is why the best we can do here is to fail early and cleanup
|
||||
// the database
|
||||
db.accounts().delete(Collections.singleton(account));
|
||||
accountsUpdateFactory.create().delete(db, account);
|
||||
externalIdsUpdateFactory.create().delete(db, extId);
|
||||
throw new AccountUserNameException(errorMessage, e);
|
||||
}
|
||||
|
@@ -36,6 +36,7 @@ import org.eclipse.jgit.lib.Constants;
|
||||
import org.eclipse.jgit.lib.ObjectId;
|
||||
import org.eclipse.jgit.lib.ObjectInserter;
|
||||
import org.eclipse.jgit.lib.PersonIdent;
|
||||
import org.eclipse.jgit.lib.Ref;
|
||||
import org.eclipse.jgit.lib.RefUpdate;
|
||||
import org.eclipse.jgit.lib.RefUpdate.Result;
|
||||
import org.eclipse.jgit.lib.Repository;
|
||||
@@ -144,6 +145,18 @@ public class AccountsUpdate {
|
||||
createUserBranchIfNeeded(account);
|
||||
}
|
||||
|
||||
/** Deletes the account. */
|
||||
public void delete(ReviewDb db, Account account) throws OrmException, IOException {
|
||||
db.accounts().delete(ImmutableSet.of(account));
|
||||
deleteUserBranch(account.getId());
|
||||
}
|
||||
|
||||
/** Deletes the account. */
|
||||
public void deleteByKey(ReviewDb db, Account.Id accountId) throws OrmException, IOException {
|
||||
db.accounts().deleteKeys(ImmutableSet.of(accountId));
|
||||
deleteUserBranch(accountId);
|
||||
}
|
||||
|
||||
private void createUserBranch(Account account) throws IOException {
|
||||
try (Repository repo = repoManager.openRepository(allUsersName);
|
||||
ObjectInserter oi = repo.newObjectInserter()) {
|
||||
@@ -209,4 +222,25 @@ public class AccountsUpdate {
|
||||
private static ObjectId emptyTree(ObjectInserter oi) throws IOException {
|
||||
return oi.insert(Constants.OBJ_TREE, new byte[] {});
|
||||
}
|
||||
|
||||
private void deleteUserBranch(Account.Id accountId) throws IOException {
|
||||
try (Repository repo = repoManager.openRepository(allUsersName)) {
|
||||
String refName = RefNames.refsUsers(accountId);
|
||||
Ref ref = repo.exactRef(refName);
|
||||
if (ref == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
RefUpdate ru = repo.updateRef(refName);
|
||||
ru.setExpectedOldObjectId(ref.getObjectId());
|
||||
ru.setNewObjectId(ObjectId.zeroId());
|
||||
ru.setForceUpdate(true);
|
||||
ru.setRefLogIdent(committerIdent);
|
||||
ru.setRefLogMessage("Delete Account", true);
|
||||
Result result = ru.delete();
|
||||
if (result != Result.FORCED) {
|
||||
throw new IOException(String.format("Failed to delete ref %s: %s", refName, result.name()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user