1 /*
2 * Copyright (C) 2008, Google Inc. and others
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Distribution License v. 1.0 which is available at
6 * https://www.eclipse.org/org/documents/edl-v10.php.
7 *
8 * SPDX-License-Identifier: BSD-3-Clause
9 */
10
11 package org.eclipse.jgit.transport;
12
13 import java.util.Collection;
14
15 /**
16 * Hook invoked by {@link org.eclipse.jgit.transport.ReceivePack} before any
17 * updates are executed.
18 * <p>
19 * The hook is called with any commands that are deemed valid after parsing them
20 * from the client and applying the standard receive configuration options to
21 * them:
22 * <ul>
23 * <li><code>receive.denyDenyDeletes</code></li>
24 * <li><code>receive.denyNonFastForwards</code></li>
25 * </ul>
26 * This means the hook will not receive a non-fast-forward update command if
27 * denyNonFastForwards is set to true in the configuration file. To get all
28 * commands within the hook, see
29 * {@link org.eclipse.jgit.transport.ReceivePack#getAllCommands()}.
30 * <p>
31 * As the hook is invoked prior to the commands being executed, the hook may
32 * choose to block any command by setting its result status with
33 * {@link org.eclipse.jgit.transport.ReceiveCommand#setResult(ReceiveCommand.Result)}.
34 * <p>
35 * The hook may also choose to perform the command itself (or merely pretend
36 * that it has performed the command), by setting the result status to
37 * {@link org.eclipse.jgit.transport.ReceiveCommand.Result#OK}.
38 * <p>
39 * Hooks should run quickly, as they block the caller thread and the client
40 * process from completing.
41 * <p>
42 * Hooks may send optional messages back to the client via methods on
43 * {@link org.eclipse.jgit.transport.ReceivePack}. Implementors should be aware
44 * that not all network transports support this output, so some (or all)
45 * messages may simply be discarded. These messages should be advisory only.
46 */
47 public interface PreReceiveHook {
48 /** A simple no-op hook. */
49 PreReceiveHook NULL = (final ReceivePack rp,
50 final Collection<ReceiveCommand> commands) -> {
51 // Do nothing.
52 };
53
54 /**
55 * Invoked just before commands are executed.
56 * <p>
57 * See the class description for how this method can impact execution.
58 *
59 * @param rp
60 * the process handling the current receive. Hooks may obtain
61 * details about the destination repository through this handle.
62 * @param commands
63 * unmodifiable set of valid commands still pending execution.
64 * May be the empty set.
65 */
66 void onPreReceive(ReceivePack rp, Collection<ReceiveCommand> commands);
67 }