Browse Source

Merge branch 'stable-4.9'

* stable-4.9:
  Prepare 4.9.3-SNAPSHOT builds
  JGit v4.9.2.201712150930-r
  Write packed-refs directly when cloning

Change-Id: I3b0fad9c45cdf3a918ddb8ea4a37b8d3403aae90
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-4.10
David Pursehouse 7 years ago committed by Matthias Sohn
parent
commit
ed38840eba
  1. 16
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java
  2. 26
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java

16
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java

@ -186,11 +186,19 @@ class PackedBatchRefUpdate extends BatchRefUpdate {
Map<String, LockFile> locks = null; Map<String, LockFile> locks = null;
refdb.inProcessPackedRefsLock.lock(); refdb.inProcessPackedRefsLock.lock();
try { try {
locks = lockLooseRefs(pending); PackedRefList oldPackedList;
if (locks == null) { if (!refdb.isInClone()) {
return; locks = lockLooseRefs(pending);
if (locks == null) {
return;
}
oldPackedList = refdb.pack(locks);
} else {
// During clone locking isn't needed since no refs exist yet.
// This also helps to avoid problems with refs only differing in
// case on a case insensitive filesystem (bug 528497)
oldPackedList = refdb.getPackedRefs();
} }
PackedRefList oldPackedList = refdb.pack(locks);
RefList<Ref> newRefs = applyUpdates(walk, oldPackedList, pending); RefList<Ref> newRefs = applyUpdates(walk, oldPackedList, pending);
if (newRefs == null) { if (newRefs == null) {
return; return;

26
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java

@ -65,6 +65,7 @@ import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.InterruptedIOException; import java.io.InterruptedIOException;
import java.nio.file.Files;
import java.security.DigestInputStream; import java.security.DigestInputStream;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.text.MessageFormat; import java.text.MessageFormat;
@ -901,7 +902,7 @@ public class RefDirectory extends RefDatabase {
return ref; return ref;
} }
private PackedRefList getPackedRefs() throws IOException { PackedRefList getPackedRefs() throws IOException {
boolean trustFolderStat = getRepository().getConfig().getBoolean( boolean trustFolderStat = getRepository().getConfig().getBoolean(
ConfigConstants.CONFIG_CORE_SECTION, ConfigConstants.CONFIG_CORE_SECTION,
ConfigConstants.CONFIG_KEY_TRUSTFOLDERSTAT, true); ConfigConstants.CONFIG_KEY_TRUSTFOLDERSTAT, true);
@ -1188,6 +1189,29 @@ public class RefDirectory extends RefDatabase {
&& buf[4] == ' '; && buf[4] == ' ';
} }
/**
* Detect if we are in a clone command execution
*
* @return {@code true} if we are currently cloning a repository
* @throws IOException
*/
boolean isInClone() throws IOException {
return hasDanglingHead() && !packedRefsFile.exists() && !hasLooseRef();
}
private boolean hasDanglingHead() throws IOException {
Ref head = exactRef(Constants.HEAD);
if (head != null) {
ObjectId id = head.getObjectId();
return id == null || id.equals(ObjectId.zeroId());
}
return false;
}
private boolean hasLooseRef() throws IOException {
return Files.walk(refsDir.toPath()).anyMatch(Files::isRegularFile);
}
/** If the parent should fire listeners, fires them. */ /** If the parent should fire listeners, fires them. */
void fireRefsChanged() { void fireRefsChanged() {
final int last = lastNotifiedModCnt.get(); final int last = lastNotifiedModCnt.get();

Loading…
Cancel
Save