diff options
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java index 60ebeabd99..da19f4c04c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java @@ -43,8 +43,13 @@ package org.eclipse.jgit.transport; +import java.io.IOException; +import java.text.MessageFormat; + +import org.eclipse.jgit.JGitText; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.RefUpdate; /** * A command being processed by {@link ReceivePack}. @@ -213,6 +218,47 @@ public class ReceiveCommand { message = m; } + /** + * Execute this command during a receive-pack session. + * <p> + * Sets the status of the command as a side effect. + * + * @param rp + * receive-pack session. + */ + public void execute(final ReceivePack rp) { + try { + final RefUpdate ru = rp.getRepository().updateRef(getRefName()); + ru.setRefLogIdent(rp.getRefLogIdent()); + switch (getType()) { + case DELETE: + if (!ObjectId.zeroId().equals(getOldId())) { + // We can only do a CAS style delete if the client + // didn't bork its delete request by sending the + // wrong zero id rather than the advertised one. + // + ru.setExpectedOldObjectId(getOldId()); + } + ru.setForceUpdate(true); + setResult(ru.delete(rp.getRevWalk())); + break; + + case CREATE: + case UPDATE: + case UPDATE_NONFASTFORWARD: + ru.setForceUpdate(rp.isAllowNonFastForwards()); + ru.setExpectedOldObjectId(getOldId()); + ru.setNewObjectId(getNewId()); + ru.setRefLogMessage("push", true); + setResult(ru.update(rp.getRevWalk())); + break; + } + } catch (IOException err) { + setResult(Result.REJECTED_OTHER_REASON, MessageFormat.format( + JGitText.get().lockError, err.getMessage())); + } + } + void setRef(final Ref r) { ref = r; } @@ -221,6 +267,38 @@ public class ReceiveCommand { type = t; } + private void setResult(final RefUpdate.Result r) { + switch (r) { + case NOT_ATTEMPTED: + setResult(Result.NOT_ATTEMPTED); + break; + + case LOCK_FAILURE: + case IO_FAILURE: + setResult(Result.LOCK_FAILURE); + break; + + case NO_CHANGE: + case NEW: + case FORCED: + case FAST_FORWARD: + setResult(Result.OK); + break; + + case REJECTED: + setResult(Result.REJECTED_NONFASTFORWARD); + break; + + case REJECTED_CURRENT_BRANCH: + setResult(Result.REJECTED_CURRENT_BRANCH); + break; + + default: + setResult(Result.REJECTED_OTHER_REASON, r.name()); + break; + } + } + @Override public String toString() { return getType().name() + ": " + getOldId().name() + " " |