RebaseChange: simplify calling conventions
Clean up some methods by dropping static and using the instance members to access the database. Pass a single RevisionResource rather than a whole list of values derived from the resource by the caller. Change-Id: Ie3f59d7f83b599ed578357c7e0ddfa76fe3dec86
This commit is contained in:
@@ -90,8 +90,7 @@ public class Rebase implements RestModifyView<RevisionResource, RebaseInput>,
|
||||
throw new ResourceConflictException(
|
||||
"cannot rebase merge commits or commit with no ancestor");
|
||||
}
|
||||
rebaseChange.get().rebase(repo, rw, control, rsrc.getPatchSet().getId(),
|
||||
rsrc.getUser(), findBaseRev(rw, rsrc, input));
|
||||
rebaseChange.get().rebase(repo, rw, rsrc, findBaseRev(rw, rsrc, input));
|
||||
} catch (InvalidChangeOperationException e) {
|
||||
throw new ResourceConflictException(e.getMessage());
|
||||
} catch (NoSuchChangeException e) {
|
||||
@@ -129,6 +128,7 @@ public class Rebase implements RestModifyView<RevisionResource, RebaseInput>,
|
||||
if (baseChange == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!baseChange.getProject().equals(change.getProject())) {
|
||||
throw new ResourceConflictException(
|
||||
"base change is in wrong project: " + baseChange.getProject());
|
||||
|
||||
@@ -22,7 +22,6 @@ import com.google.gerrit.reviewdb.client.Change;
|
||||
import com.google.gerrit.reviewdb.client.Change.Status;
|
||||
import com.google.gerrit.reviewdb.client.ChangeMessage;
|
||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||
import com.google.gerrit.reviewdb.client.Project;
|
||||
import com.google.gerrit.reviewdb.client.RevId;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.ChangeUtil;
|
||||
@@ -97,9 +96,7 @@ public class RebaseChange {
|
||||
*
|
||||
* @param git the repository.
|
||||
* @param rw the RevWalk.
|
||||
* @param changeControl the control of the change to rebase.
|
||||
* @param patchSetId the patch set ID to rebase.
|
||||
* @param uploader the user that creates the rebased patch set.
|
||||
* @param rsrc revision to rebase.
|
||||
* @param newBaseRev the commit that should be the new base.
|
||||
* @throws NoSuchChangeException if the change to which the patch set belongs
|
||||
* does not exist or is not visible to the user.
|
||||
@@ -110,30 +107,33 @@ public class RebaseChange {
|
||||
* @throws InvalidChangeOperationException if rebase is not possible or not
|
||||
* allowed.
|
||||
*/
|
||||
public void rebase(Repository git, RevWalk rw, ChangeControl changeControl,
|
||||
PatchSet.Id patchSetId, IdentifiedUser uploader, String newBaseRev)
|
||||
throws NoSuchChangeException, EmailException, OrmException, IOException,
|
||||
ResourceConflictException, InvalidChangeOperationException {
|
||||
Change change = changeControl.getChange();
|
||||
public void rebase(Repository git, RevWalk rw, RevisionResource rsrc,
|
||||
String newBaseRev) throws NoSuchChangeException, EmailException,
|
||||
OrmException, IOException, ResourceConflictException,
|
||||
InvalidChangeOperationException {
|
||||
Change change = rsrc.getChange();
|
||||
PatchSet patchSet = rsrc.getPatchSet();
|
||||
IdentifiedUser uploader = (IdentifiedUser) rsrc.getControl().getCurrentUser();
|
||||
|
||||
try (ObjectInserter inserter = git.newObjectInserter()) {
|
||||
String baseRev = newBaseRev;
|
||||
if (baseRev == null) {
|
||||
baseRev = findBaseRevision(
|
||||
patchSetId, db.get(), change.getDest(), git, rw);
|
||||
baseRev = findBaseRevision(patchSet, change.getDest(), git, rw);
|
||||
}
|
||||
|
||||
ObjectId baseObjectId = git.resolve(baseRev);
|
||||
if (baseObjectId == null) {
|
||||
throw new InvalidChangeOperationException(
|
||||
"Cannot rebase: Failed to resolve baseRev: " + baseRev);
|
||||
}
|
||||
RevCommit baseCommit = rw.parseCommit(baseObjectId);
|
||||
|
||||
RevCommit baseCommit = rw.parseCommit(baseObjectId);
|
||||
PersonIdent committerIdent =
|
||||
uploader.newCommitterIdent(TimeUtil.nowTs(), serverTimeZone);
|
||||
|
||||
rebase(git, rw, inserter, change, patchSetId,
|
||||
rebase(git, rw, inserter, change, patchSet.getId(),
|
||||
uploader, baseCommit, mergeUtilFactory.create(
|
||||
changeControl.getProjectControl().getProjectState(), true),
|
||||
rsrc.getControl().getProjectControl().getProjectState(), true),
|
||||
committerIdent, true, ValidatePolicy.GERRIT);
|
||||
} catch (MergeConflictException e) {
|
||||
throw new ResourceConflictException(e.getMessage());
|
||||
@@ -147,9 +147,7 @@ public class RebaseChange {
|
||||
* this commit's parent, or the destination branch tip in the case where the
|
||||
* parent's change is merged.
|
||||
*
|
||||
* @param patchSetId patch set ID for which the new base commit should be
|
||||
* found.
|
||||
* @param db the ReviewDb.
|
||||
* @param patchSet patch set for which the new base commit should be found.
|
||||
* @param destBranch the destination branch.
|
||||
* @param git the repository.
|
||||
* @param rw the RevWalk.
|
||||
@@ -159,16 +157,10 @@ public class RebaseChange {
|
||||
* @throws IOException if accessing the repository fails.
|
||||
* @throws OrmException if accessing the database fails.
|
||||
*/
|
||||
private static String findBaseRevision(PatchSet.Id patchSetId,
|
||||
ReviewDb db, Branch.NameKey destBranch, Repository git, RevWalk rw)
|
||||
private String findBaseRevision(PatchSet patchSet,
|
||||
Branch.NameKey destBranch, Repository git, RevWalk rw)
|
||||
throws InvalidChangeOperationException, IOException, OrmException {
|
||||
String baseRev = null;
|
||||
|
||||
PatchSet patchSet = db.patchSets().get(patchSetId);
|
||||
if (patchSet == null) {
|
||||
throw new InvalidChangeOperationException(
|
||||
"Patch set " + patchSetId + " not found");
|
||||
}
|
||||
RevCommit commit = rw.parseCommit(
|
||||
ObjectId.fromString(patchSet.getRevision().get()));
|
||||
|
||||
@@ -183,9 +175,9 @@ public class RebaseChange {
|
||||
|
||||
RevId parentRev = new RevId(commit.getParent(0).name());
|
||||
|
||||
for (PatchSet depPatchSet : db.patchSets().byRevision(parentRev)) {
|
||||
for (PatchSet depPatchSet : db.get().patchSets().byRevision(parentRev)) {
|
||||
Change.Id depChangeId = depPatchSet.getId().getParentKey();
|
||||
Change depChange = db.changes().get(depChangeId);
|
||||
Change depChange = db.get().changes().get(depChangeId);
|
||||
if (!depChange.getDest().equals(destBranch)) {
|
||||
continue;
|
||||
}
|
||||
@@ -203,7 +195,7 @@ public class RebaseChange {
|
||||
+ " dependent change.");
|
||||
}
|
||||
PatchSet latestDepPatchSet =
|
||||
db.patchSets().get(depChange.currentPatchSetId());
|
||||
db.get().patchSets().get(depChange.currentPatchSetId());
|
||||
baseRev = latestDepPatchSet.getRevision().get();
|
||||
}
|
||||
break;
|
||||
@@ -343,30 +335,21 @@ public class RebaseChange {
|
||||
return objectId;
|
||||
}
|
||||
|
||||
public boolean canRebase(ChangeResource r) {
|
||||
Change c = r.getChange();
|
||||
return canRebase(c.getProject(), c.currentPatchSetId(), c.getDest());
|
||||
}
|
||||
|
||||
public boolean canRebase(RevisionResource r) {
|
||||
return canRebase(r.getChange().getProject(),
|
||||
r.getPatchSet().getId(), r.getChange().getDest());
|
||||
return canRebase(r.getPatchSet(), r.getChange().getDest());
|
||||
}
|
||||
|
||||
public boolean canRebase(Project.NameKey project, PatchSet.Id patchSetId,
|
||||
Branch.NameKey branch) {
|
||||
try (Repository git = gitManager.openRepository(project)) {
|
||||
try (RevWalk rw = new RevWalk(git)) {
|
||||
findBaseRevision(patchSetId, db.get(), branch, git, rw);
|
||||
return true;
|
||||
} catch (InvalidChangeOperationException e) {
|
||||
return false;
|
||||
} catch (OrmException | IOException e) {
|
||||
log.warn("Error checking if patch set " + patchSetId + " on " + branch
|
||||
+ " can be rebased", e);
|
||||
return false;
|
||||
}
|
||||
} catch (IOException err) {
|
||||
private boolean canRebase(PatchSet patchSet, Branch.NameKey dest) {
|
||||
try (Repository git = gitManager.openRepository(dest.getParentKey());
|
||||
RevWalk rw = new RevWalk(git)) {
|
||||
findBaseRevision(patchSet, dest, git, rw);
|
||||
return true;
|
||||
} catch (InvalidChangeOperationException e) {
|
||||
return false;
|
||||
} catch (OrmException | IOException e) {
|
||||
log.warn(String.format(
|
||||
"Error checking if patch set %s on %s can be rebased",
|
||||
patchSet.getId(), dest), e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user