summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorDave Borowitz <dborowitz@google.com>2017-08-01 08:53:33 -0400
committerDavid Pursehouse <david.pursehouse@gmail.com>2017-09-30 11:55:31 +0100
commit77a28e0d5805da2880ff79a5b54250e7e0b7c9c6 (patch)
tree2fe32162ec296c4124ba697f4439d6d185bd5fe2 /org.eclipse.jgit
parentb1ae96bf84e7c0e48ef5d972b4f96c9627af0508 (diff)
downloadjgit-77a28e0d5805da2880ff79a5b54250e7e0b7c9c6.tar.gz
jgit-77a28e0d5805da2880ff79a5b54250e7e0b7c9c6.zip
Support force writing reflog on a per-update basis
Even if a repository has core.logAllRefUpdates=true, ReflogWriter does not create reflog files unless the refs are under a hard-coded list of prefixes, or unless the forceWrite bit is set. Expose the forceWrite bit on a per-update basis in RefUpdate/BatchRefUpdate/ReceiveCommand, creating RefLogWriters as necessary. Change-Id: Ifc851fba00f76bf56d4134f821d0576b37810f80
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java4
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java13
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryUpdate.java4
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java50
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java32
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java32
6 files changed, 121 insertions, 14 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java
index 0bb502dfbf..b328eb83e0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java
@@ -406,7 +406,6 @@ class PackedBatchRefUpdate extends BatchRefUpdate {
if (ident == null) {
ident = new PersonIdent(refdb.getRepository());
}
- ReflogWriter w = refdb.getLogWriter();
for (ReceiveCommand cmd : commands) {
// Assume any pending commands have already been executed atomically.
if (cmd.getResult() != ReceiveCommand.Result.OK) {
@@ -436,7 +435,8 @@ class PackedBatchRefUpdate extends BatchRefUpdate {
}
}
try {
- w.log(name, cmd.getOldId(), cmd.getNewId(), ident, msg);
+ new ReflogWriter(refdb, isForceRefLog(cmd))
+ .log(name, cmd.getOldId(), cmd.getNewId(), ident, msg);
} catch (IOException e) {
// Ignore failures, but continue attempting to write more reflogs.
//
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java
index 105efe7289..bb1dc91cdb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java
@@ -151,8 +151,6 @@ public class RefDirectory extends RefDatabase {
final File refsDir;
- private final ReflogWriter logWriter;
-
final File packedRefsFile;
final File logsDir;
@@ -210,7 +208,6 @@ public class RefDirectory extends RefDatabase {
final FS fs = db.getFS();
parent = db;
gitDir = db.getDirectory();
- logWriter = new ReflogWriter(this);
refsDir = fs.resolve(gitDir, R_REFS);
logsDir = fs.resolve(gitDir, LOGS);
logsRefsDir = fs.resolve(gitDir, LOGS + '/' + R_REFS);
@@ -224,8 +221,8 @@ public class RefDirectory extends RefDatabase {
return parent;
}
- ReflogWriter getLogWriter() {
- return logWriter;
+ ReflogWriter newLogWriter(boolean force) {
+ return new ReflogWriter(this, force);
}
/**
@@ -249,7 +246,7 @@ public class RefDirectory extends RefDatabase {
FileUtils.mkdir(refsDir);
FileUtils.mkdir(new File(refsDir, R_HEADS.substring(R_REFS.length())));
FileUtils.mkdir(new File(refsDir, R_TAGS.substring(R_REFS.length())));
- logWriter.create();
+ newLogWriter(false).create();
}
@Override
@@ -866,9 +863,9 @@ public class RefDirectory extends RefDatabase {
}
}
- void log(final RefUpdate update, final String msg, final boolean deref)
+ void log(boolean force, RefUpdate update, String msg, boolean deref)
throws IOException {
- logWriter.log(update, msg, deref);
+ newLogWriter(force).log(update, msg, deref);
}
private Ref resolve(final Ref ref, int depth, String prefix,
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryUpdate.java
index 1105352524..7ab30faf10 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectoryUpdate.java
@@ -120,7 +120,7 @@ class RefDirectoryUpdate extends RefUpdate {
msg = strResult;
}
}
- database.log(this, msg, shouldDeref);
+ database.log(isForceRefLog(), this, msg, shouldDeref);
}
if (!lock.commit())
return Result.LOCK_FAILURE;
@@ -159,7 +159,7 @@ class RefDirectoryUpdate extends RefUpdate {
String msg = getRefLogMessage();
if (msg != null)
- database.log(this, msg, false);
+ database.log(isForceRefLog(), this, msg, false);
if (!lock.commit())
return Result.LOCK_FAILURE;
database.storedSymbolicRef(this, lock.getCommitSnapshot(), target);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java
index 956607c9a8..bcf9065dd2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BatchRefUpdate.java
@@ -104,6 +104,12 @@ public class BatchRefUpdate {
/** Should the result value be appended to {@link #refLogMessage}. */
private boolean refLogIncludeResult;
+ /**
+ * Should reflogs be written even if the configured default for this ref is
+ * not to write it.
+ */
+ private boolean forceRefLog;
+
/** Push certificate associated with this update. */
private PushCertificate pushCert;
@@ -198,6 +204,12 @@ public class BatchRefUpdate {
/**
* Set the message to include in the reflog.
* <p>
+ * Repository implementations may limit which reflogs are written by default,
+ * based on the project configuration. If a repo is not configured to write
+ * logs for this ref by default, setting the message alone may have no effect.
+ * To indicate that the repo should write logs for this update in spite of
+ * configured defaults, use {@link #setForceRefLog(boolean)}.
+ * <p>
* Describes the default for commands in this batch that do not override it
* with {@link ReceiveCommand#setRefLogMessage(String, boolean)}.
*
@@ -236,6 +248,18 @@ public class BatchRefUpdate {
}
/**
+ * Force writing a reflog for the updated ref.
+ *
+ * @param force whether to force.
+ * @return {@code this}
+ * @since 4.9
+ */
+ public BatchRefUpdate setForceRefLog(boolean force) {
+ forceRefLog = force;
+ return this;
+ }
+
+ /**
* Check whether log has been disabled by {@link #disableRefLog()}.
*
* @return true if disabled.
@@ -245,6 +269,16 @@ public class BatchRefUpdate {
}
/**
+ * Check whether the reflog should be written regardless of repo defaults.
+ *
+ * @return whether force writing is enabled.
+ * @since 4.9
+ */
+ protected boolean isForceRefLog() {
+ return forceRefLog;
+ }
+
+ /**
* Request that all updates in this batch be performed atomically.
* <p>
* When atomic updates are used, either all commands apply successfully, or
@@ -635,6 +669,7 @@ public class BatchRefUpdate {
} else {
ru.setRefLogIdent(refLogIdent);
ru.setRefLogMessage(getRefLogMessage(cmd), isRefLogIncludingResult(cmd));
+ ru.setForceRefLog(isForceRefLog(cmd));
}
ru.setPushCertificate(pushCert);
switch (cmd.getType()) {
@@ -696,6 +731,21 @@ public class BatchRefUpdate {
? cmd.isRefLogIncludingResult() : isRefLogIncludingResult();
}
+ /**
+ * Check whether the reflog for a command should be written regardless of repo
+ * defaults.
+ *
+ * @param cmd
+ * specific command.
+ * @return whether force writing is enabled.
+ * @since 4.9
+ */
+ protected boolean isForceRefLog(ReceiveCommand cmd) {
+ Boolean isForceRefLog = cmd.isForceRefLog();
+ return isForceRefLog != null ? isForceRefLog.booleanValue()
+ : isForceRefLog();
+ }
+
@Override
public String toString() {
StringBuilder r = new StringBuilder();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java
index 07786450a2..766b21da0e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java
@@ -185,6 +185,12 @@ public abstract class RefUpdate {
/** Should the Result value be appended to {@link #refLogMessage}. */
private boolean refLogIncludeResult;
+ /**
+ * Should reflogs be written even if the configured default for this ref is
+ * not to write it.
+ */
+ private boolean forceRefLog;
+
/** Old value of the ref, obtained after we lock it. */
private ObjectId oldValue;
@@ -403,6 +409,12 @@ public abstract class RefUpdate {
/**
* Set the message to include in the reflog.
+ * <p>
+ * Repository implementations may limit which reflogs are written by default,
+ * based on the project configuration. If a repo is not configured to write
+ * logs for this ref by default, setting the message alone may have no effect.
+ * To indicate that the repo should write logs for this update in spite of
+ * configured defaults, use {@link #setForceRefLog(boolean)}.
*
* @param msg
* the message to describe this change. It may be null if
@@ -431,6 +443,26 @@ public abstract class RefUpdate {
}
/**
+ * Force writing a reflog for the updated ref.
+ *
+ * @param force whether to force.
+ * @since 4.9
+ */
+ public void setForceRefLog(boolean force) {
+ forceRefLog = force;
+ }
+
+ /**
+ * Check whether the reflog should be written regardless of repo defaults.
+ *
+ * @return whether force writing is enabled.
+ * @since 4.9
+ */
+ protected boolean isForceRefLog() {
+ return forceRefLog;
+ }
+
+ /**
* The old value of the ref, prior to the update being attempted.
* <p>
* This value may differ before and after the update method. Initially it is
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 14b35c9bfa..e9681b34c7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java
@@ -225,6 +225,8 @@ public class ReceiveCommand {
private boolean refLogIncludeResult;
+ private Boolean forceRefLog;
+
private boolean typeIsCorrect;
/**
@@ -390,8 +392,22 @@ public class ReceiveCommand {
}
/**
- * Check whether this command has a custom reflog setting that should override
- * defaults in any containing {@link org.eclipse.jgit.lib.BatchRefUpdate}.
+ * Force writing a reflog for the updated ref.
+ *
+ * @param force whether to force.
+ * @since 4.9
+ */
+ public void setForceRefLog(boolean force) {
+ forceRefLog = Boolean.valueOf(force);
+ }
+
+ /**
+ * Check whether this command has a custom reflog message setting that should
+ * override defaults in any containing
+ * {@link org.eclipse.jgit.lib.BatchRefUpdate}.
+ * <p>
+ * Does not take into account whether {@code #setForceRefLog(boolean)} has
+ * been called.
*
* @return whether a custom reflog is set.
* @since 4.9
@@ -434,6 +450,18 @@ public class ReceiveCommand {
}
/**
+ * Check whether the reflog should be written regardless of repo defaults.
+ *
+ * @return whether force writing is enabled; null if {@code
+ * #setForceRefLog(boolean)} was never called.
+ * @since 4.9
+ */
+ @Nullable
+ public Boolean isForceRefLog() {
+ return forceRefLog;
+ }
+
+ /**
* Set the status of this command.
*
* @param s