Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Sohn2014-11-30 00:18:31 +0000
committerGerrit Code Review @ Eclipse.org2014-11-30 00:18:31 +0000
commitc9a5fdb3cd92d5774aa7041b9fc9fc579dc26edc (patch)
treef85e4fd12cd002d96e784b574beebb8eb0a555c0
parentb6b843e51996141d3329353bc9799f1e761199e1 (diff)
parentd1b627ed834097ec468491905879b7fca3e2f5fb (diff)
downloadjgit-c9a5fdb3cd92d5774aa7041b9fc9fc579dc26edc.tar.gz
jgit-c9a5fdb3cd92d5774aa7041b9fc9fc579dc26edc.tar.xz
jgit-c9a5fdb3cd92d5774aa7041b9fc9fc579dc26edc.zip
Merge "Honor git-core meaning of receive.denyDeletes allowing tag deletion"
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java46
1 files changed, 36 insertions, 10 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java
index 83d063e4a6..0475d2792a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java
@@ -168,7 +168,8 @@ public abstract class BaseReceivePack {
private boolean allowCreates;
/** Should an incoming transfer permit delete requests? */
- private boolean allowDeletes;
+ private boolean allowAnyDeletes;
+ private boolean allowBranchDeletes;
/** Should an incoming transfer permit non-fast-forward requests? */
private boolean allowNonFastForwards;
@@ -258,7 +259,8 @@ public abstract class BaseReceivePack {
final ReceiveConfig cfg = db.getConfig().get(ReceiveConfig.KEY);
objectChecker = cfg.newObjectChecker();
allowCreates = cfg.allowCreates;
- allowDeletes = cfg.allowDeletes;
+ allowAnyDeletes = true;
+ allowBranchDeletes = cfg.allowDeletes;
allowNonFastForwards = cfg.allowNonFastForwards;
allowOfsDelta = cfg.allowOfsDelta;
advertiseRefsHook = AdvertiseRefsHook.DEFAULT;
@@ -541,7 +543,7 @@ public abstract class BaseReceivePack {
/** @return true if the client can request refs to be deleted. */
public boolean isAllowDeletes() {
- return allowDeletes;
+ return allowAnyDeletes;
}
/**
@@ -549,7 +551,25 @@ public abstract class BaseReceivePack {
* true to permit delete ref commands to be processed.
*/
public void setAllowDeletes(final boolean canDelete) {
- allowDeletes = canDelete;
+ allowAnyDeletes = canDelete;
+ }
+
+ /**
+ * @return true if the client can delete from {@code refs/heads/}.
+ * @since 3.6
+ */
+ public boolean isAllowBranchDeletes() {
+ return allowBranchDeletes;
+ }
+
+ /**
+ * @param canDelete
+ * true to permit deletion of branches from the
+ * {@code refs/heads/} namespace.
+ * @since 3.6
+ */
+ public void setAllowBranchDeletes(boolean canDelete) {
+ allowBranchDeletes = canDelete;
}
/**
@@ -1143,12 +1163,18 @@ public abstract class BaseReceivePack {
if (cmd.getResult() != Result.NOT_ATTEMPTED)
continue;
- if (cmd.getType() == ReceiveCommand.Type.DELETE
- && !isAllowDeletes()) {
- // Deletes are not supported on this repository.
- //
- cmd.setResult(Result.REJECTED_NODELETE);
- continue;
+ if (cmd.getType() == ReceiveCommand.Type.DELETE) {
+ if (!isAllowDeletes()) {
+ // Deletes are not supported on this repository.
+ cmd.setResult(Result.REJECTED_NODELETE);
+ continue;
+ }
+ if (!isAllowBranchDeletes()
+ && ref.getName().startsWith(Constants.R_HEADS)) {
+ // Branches cannot be deleted, but other refs can.
+ cmd.setResult(Result.REJECTED_NODELETE);
+ continue;
+ }
}
if (cmd.getType() == ReceiveCommand.Type.CREATE) {

Back to the top