From db82b8d7eb646a2d31f1b4e52ab4a623743192e9 Mon Sep 17 00:00:00 2001 From: Jens Baumgart Date: Mon, 26 Jul 2010 10:18:47 +0200 Subject: Fix concurrent read / write issue in LockFile on Windows LockFile.commit fails if another thread concurrently reads the base file. The problem is fixed by retrying the rename operation if it fails. Change-Id: I6bb76ea7f2e6e90e3ddc45f9dd4d69bd1b6fa1eb Bug: 308506 Signed-off-by: Jens Baumgart --- .../src/org/eclipse/jgit/iplog/IpLogMeta.java | 12 ++++++--- .../jgit/junit/LocalDiskRepositoryTestCase.java | 3 ++- .../org/eclipse/jgit/junit/MockSystemReader.java | 2 +- .../src/org/eclipse/jgit/junit/TestRepository.java | 2 +- .../eclipse/jgit/pgm/debug/RebuildCommitGraph.java | 4 +-- .../src/org/eclipse/jgit/pgm/eclipse/Iplog.java | 2 +- .../src/org/eclipse/jgit/pgm/eclipse/Ipzilla.java | 2 +- .../jgit/pgm/opt/AbstractTreeIteratorHandler.java | 2 +- .../eclipse/jgit/dircache/DirCacheBasicTest.java | 4 +-- .../dircache/DirCacheCGitCompatabilityTest.java | 16 +++++++----- .../eclipse/jgit/storage/file/RefUpdateTest.java | 9 ++++--- .../storage/file/RepositorySetupWorkDirTest.java | 4 ++- .../org/eclipse/jgit/storage/file/T0003_Basic.java | 2 +- .../src/org/eclipse/jgit/dircache/DirCache.java | 30 ++++++++++++++++------ .../eclipse/jgit/lib/BaseRepositoryBuilder.java | 2 +- .../src/org/eclipse/jgit/lib/Repository.java | 4 +-- .../eclipse/jgit/storage/file/FileBasedConfig.java | 17 +++++++++--- .../eclipse/jgit/storage/file/FileRepository.java | 4 ++- .../org/eclipse/jgit/storage/file/LockFile.java | 30 ++++++++++++++++++++-- .../org/eclipse/jgit/storage/file/PackLock.java | 9 +++++-- .../eclipse/jgit/storage/file/RefDirectory.java | 3 ++- .../jgit/storage/file/RefDirectoryUpdate.java | 2 +- .../org/eclipse/jgit/transport/FetchProcess.java | 3 ++- .../src/org/eclipse/jgit/transport/IndexPack.java | 2 +- .../src/org/eclipse/jgit/util/SystemReader.java | 2 +- 25 files changed, 122 insertions(+), 50 deletions(-) diff --git a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java index 2799a4a30b..372469da04 100644 --- a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java +++ b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java @@ -61,6 +61,7 @@ import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.storage.file.LockFile; +import org.eclipse.jgit.util.FS; /** * Manages the {@code .eclipse_iplog} file in a project. @@ -167,6 +168,9 @@ public class IpLogMeta { * * @param file * local file to update with current CQ records. + * @param fs + * the file system abstraction which will be necessary to perform + * certain file system operations. * @param base * base https:// URL of the IPzilla server. * @param username @@ -181,16 +185,16 @@ public class IpLogMeta { * the local file cannot be read, as it is not a valid * configuration file format. */ - public void syncCQs(File file, URL base, String username, String password) - throws IOException, ConfigInvalidException { + public void syncCQs(File file, FS fs, URL base, String username, + String password) throws IOException, ConfigInvalidException { if (!file.getParentFile().exists()) file.getParentFile().mkdirs(); - LockFile lf = new LockFile(file); + LockFile lf = new LockFile(file, fs); if (!lf.lock()) throw new IOException(MessageFormat.format(IpLogText.get().cannotLock, file)); try { - FileBasedConfig cfg = new FileBasedConfig(file); + FileBasedConfig cfg = new FileBasedConfig(file, fs); cfg.load(); loadFrom(cfg); diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java index 2b82d82d74..47956e5127 100644 --- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java +++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java @@ -69,6 +69,7 @@ import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.storage.file.FileRepository; import org.eclipse.jgit.storage.file.WindowCache; import org.eclipse.jgit.storage.file.WindowCacheConfig; +import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.IO; import org.eclipse.jgit.util.SystemReader; @@ -128,7 +129,7 @@ public abstract class LocalDiskRepositoryTestCase extends TestCase { mockSystemReader = new MockSystemReader(); mockSystemReader.userGitConfig = new FileBasedConfig(new File(trash, - "usergitconfig")); + "usergitconfig"), FS.DETECTED); ceilTestDirectories(getCeilings()); SystemReader.setInstance(mockSystemReader); diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/MockSystemReader.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/MockSystemReader.java index eb08417bc8..5c2e77f673 100644 --- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/MockSystemReader.java +++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/MockSystemReader.java @@ -67,7 +67,7 @@ public class MockSystemReader extends SystemReader { init(Constants.GIT_AUTHOR_EMAIL_KEY); init(Constants.GIT_COMMITTER_NAME_KEY); init(Constants.GIT_COMMITTER_EMAIL_KEY); - userGitConfig = new FileBasedConfig(null) { + userGitConfig = new FileBasedConfig(null, null) { @Override public void load() throws IOException, ConfigInvalidException { // Do nothing diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java index 3c58271257..afe1c0bc63 100644 --- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java +++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java @@ -654,7 +654,7 @@ public class TestRepository { private void writeFile(final File p, final byte[] bin) throws IOException, ObjectWritingException { - final LockFile lck = new LockFile(p); + final LockFile lck = new LockFile(p, db.getFS()); if (!lck.lock()) throw new ObjectWritingException("Can't write " + p); try { diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java index 5b75c1b5c5..b8e2a8f6fa 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/RebuildCommitGraph.java @@ -227,7 +227,7 @@ class RebuildCommitGraph extends TextBuiltin { final ObjectId id = db.resolve(Constants.HEAD); if (!ObjectId.isId(head) && id != null) { final LockFile lf; - lf = new LockFile(new File(db.getDirectory(), Constants.HEAD)); + lf = new LockFile(new File(db.getDirectory(), Constants.HEAD), db.getFS()); if (!lf.lock()) throw new IOException(MessageFormat.format(CLIText.get().cannotLock, Constants.HEAD)); lf.write(id); @@ -254,7 +254,7 @@ class RebuildCommitGraph extends TextBuiltin { protected void writeFile(final String name, final byte[] content) throws IOException { final File file = new File(db.getDirectory(), name); - final LockFile lck = new LockFile(file); + final LockFile lck = new LockFile(file, db.getFS()); if (!lck.lock()) throw new ObjectWritingException(MessageFormat.format(CLIText.get().cantWrite, file)); try { diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/eclipse/Iplog.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/eclipse/Iplog.java index a99e0abca2..84859a805c 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/eclipse/Iplog.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/eclipse/Iplog.java @@ -98,7 +98,7 @@ class Iplog extends TextBuiltin { if (output != null) { if (!output.getParentFile().exists()) output.getParentFile().mkdirs(); - LockFile lf = new LockFile(output); + LockFile lf = new LockFile(output, db.getFS()); if (!lf.lock()) throw die(MessageFormat.format(CLIText.get().cannotLock, output)); try { diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/eclipse/Ipzilla.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/eclipse/Ipzilla.java index b563f07910..6653209a65 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/eclipse/Ipzilla.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/eclipse/Ipzilla.java @@ -94,6 +94,6 @@ class Ipzilla extends TextBuiltin { output = new File(db.getWorkTree(), IpLogMeta.IPLOG_CONFIG_FILE); IpLogMeta meta = new IpLogMeta(); - meta.syncCQs(output, ipzilla, username, password); + meta.syncCQs(output, db.getFS(), ipzilla, username, password); } } diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java index 01981600dd..712698200e 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/AbstractTreeIteratorHandler.java @@ -103,7 +103,7 @@ public class AbstractTreeIteratorHandler extends if (new File(name).isFile()) { final DirCache dirc; try { - dirc = DirCache.read(new File(name)); + dirc = DirCache.read(new File(name), FS.DETECTED); } catch (IOException e) { throw new CmdLineException(MessageFormat.format(CLIText.get().notAnIndexFile, name), e); } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBasicTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBasicTest.java index c3ac952a11..b6e4e42c7e 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBasicTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBasicTest.java @@ -63,7 +63,7 @@ public class DirCacheBasicTest extends RepositoryTestCase { final File idx = new File(db.getDirectory(), "tmp_index"); assertFalse(idx.exists()); - final DirCache dc = DirCache.read(idx); + final DirCache dc = DirCache.read(idx, db.getFS()); assertNotNull(dc); assertEquals(0, dc.getEntryCount()); } @@ -91,7 +91,7 @@ public class DirCacheBasicTest extends RepositoryTestCase { assertFalse(idx.exists()); assertFalse(lck.exists()); - final DirCache dc = DirCache.lock(idx); + final DirCache dc = DirCache.lock(idx, db.getFS()); assertNotNull(dc); assertFalse(idx.exists()); assertTrue(lck.exists()); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheCGitCompatabilityTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheCGitCompatabilityTest.java index fa5fea8633..f37d040049 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheCGitCompatabilityTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheCGitCompatabilityTest.java @@ -58,6 +58,7 @@ import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.treewalk.TreeWalk; +import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.JGitTestUtil; public class DirCacheCGitCompatabilityTest extends LocalDiskRepositoryTestCase { @@ -65,7 +66,7 @@ public class DirCacheCGitCompatabilityTest extends LocalDiskRepositoryTestCase { public void testReadIndex_LsFiles() throws Exception { final Map ls = readLsFiles(); - final DirCache dc = new DirCache(index); + final DirCache dc = new DirCache(index, FS.DETECTED); assertEquals(0, dc.getEntryCount()); dc.read(); assertEquals(ls.size(), dc.getEntryCount()); @@ -79,7 +80,7 @@ public class DirCacheCGitCompatabilityTest extends LocalDiskRepositoryTestCase { public void testTreeWalk_LsFiles() throws Exception { final Repository db = createBareRepository(); final Map ls = readLsFiles(); - final DirCache dc = new DirCache(index); + final DirCache dc = new DirCache(index, db.getFS()); assertEquals(0, dc.getEntryCount()); dc.read(); assertEquals(ls.size(), dc.getEntryCount()); @@ -102,14 +103,16 @@ public class DirCacheCGitCompatabilityTest extends LocalDiskRepositoryTestCase { } public void testUnsupportedOptionalExtension() throws Exception { - final DirCache dc = new DirCache(pathOf("gitgit.index.ZZZZ")); + final DirCache dc = new DirCache(pathOf("gitgit.index.ZZZZ"), + FS.DETECTED); dc.read(); assertEquals(1, dc.getEntryCount()); assertEquals("A", dc.getEntry(0).getPathString()); } public void testUnsupportedRequiredExtension() throws Exception { - final DirCache dc = new DirCache(pathOf("gitgit.index.aaaa")); + final DirCache dc = new DirCache(pathOf("gitgit.index.aaaa"), + FS.DETECTED); try { dc.read(); fail("Cache loaded an unsupported extension"); @@ -120,7 +123,8 @@ public class DirCacheCGitCompatabilityTest extends LocalDiskRepositoryTestCase { } public void testCorruptChecksumAtFooter() throws Exception { - final DirCache dc = new DirCache(pathOf("gitgit.index.badchecksum")); + final DirCache dc = new DirCache(pathOf("gitgit.index.badchecksum"), + FS.DETECTED); try { dc.read(); fail("Cache loaded despite corrupt checksum"); @@ -143,7 +147,7 @@ public class DirCacheCGitCompatabilityTest extends LocalDiskRepositoryTestCase { public void testReadIndex_DirCacheTree() throws Exception { final Map cList = readLsFiles(); final Map cTree = readLsTree(); - final DirCache dc = new DirCache(index); + final DirCache dc = new DirCache(index, FS.DETECTED); assertEquals(0, dc.getEntryCount()); dc.read(); assertEquals(cList.size(), dc.getEntryCount()); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefUpdateTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefUpdateTest.java index 875c2e96f5..871700898f 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefUpdateTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefUpdateTest.java @@ -555,13 +555,15 @@ public class RefUpdateTest extends SampleDataRepositoryTestCase { ObjectId pid = db.resolve("refs/heads/master^"); RefUpdate updateRef = db.updateRef("refs/heads/master"); updateRef.setNewObjectId(pid); - LockFile lockFile1 = new LockFile(new File(db.getDirectory(),"refs/heads/master")); + LockFile lockFile1 = new LockFile(new File(db.getDirectory(), + "refs/heads/master"), db.getFS()); try { assertTrue(lockFile1.lock()); // precondition to test Result update = updateRef.update(); assertEquals(Result.LOCK_FAILURE, update); assertEquals(opid, db.resolve("refs/heads/master")); - LockFile lockFile2 = new LockFile(new File(db.getDirectory(),"refs/heads/master")); + LockFile lockFile2 = new LockFile(new File(db.getDirectory(),"refs/heads/master"), + db.getFS()); assertFalse(lockFile2.lock()); // was locked, still is } finally { lockFile1.unlock(); @@ -699,7 +701,8 @@ public class RefUpdateTest extends SampleDataRepositoryTestCase { "logs/" + fromName).exists()); // "someone" has branch X locked - LockFile lockFile = new LockFile(new File(db.getDirectory(), toLock)); + LockFile lockFile = new LockFile(new File(db.getDirectory(), toLock), + db.getFS()); try { assertTrue(lockFile.lock()); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RepositorySetupWorkDirTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RepositorySetupWorkDirTest.java index 4f6d5b3bd6..d28dd399b0 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RepositorySetupWorkDirTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RepositorySetupWorkDirTest.java @@ -53,6 +53,7 @@ import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.util.FS; /** * Tests for setting up the working directory when creating a Repository @@ -191,7 +192,8 @@ public class RepositorySetupWorkDirTest extends LocalDiskRepositoryTestCase { private FileBasedConfig configFor(File gitDir) throws IOException, ConfigInvalidException { - FileBasedConfig cfg = new FileBasedConfig(new File(gitDir, "config")); + File configPath = new File(gitDir, "config"); + FileBasedConfig cfg = new FileBasedConfig(configPath, FS.DETECTED); cfg.load(); return cfg; } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/T0003_Basic.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/T0003_Basic.java index 477b0dfb50..ecabedd965 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/T0003_Basic.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/T0003_Basic.java @@ -315,7 +315,7 @@ public class T0003_Basic extends SampleDataRepositoryTestCase { public void test006_ReadUglyConfig() throws IOException, ConfigInvalidException { final File cfg = new File(db.getDirectory(), "config"); - final FileBasedConfig c = new FileBasedConfig(cfg); + final FileBasedConfig c = new FileBasedConfig(cfg, db.getFS()); final FileWriter pw = new FileWriter(cfg); final String configStr = " [core];comment\n\tfilemode = yes\n" + "[user]\n" diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java index cc10fad2b4..60238c3d8b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java @@ -67,6 +67,7 @@ import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.storage.file.LockFile; +import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.IO; import org.eclipse.jgit.util.MutableInteger; import org.eclipse.jgit.util.NB; @@ -129,7 +130,7 @@ public class DirCache { * memory). */ public static DirCache newInCore() { - return new DirCache(null); + return new DirCache(null, null); } /** @@ -141,6 +142,9 @@ public class DirCache { * * @param indexLocation * location of the index file on disk. + * @param fs + * the file system abstraction which will be necessary to perform + * certain file system operations. * @return a cache representing the contents of the specified index file (if * it exists) or an empty cache if the file does not exist. * @throws IOException @@ -149,9 +153,9 @@ public class DirCache { * the index file is using a format or extension that this * library does not support. */ - public static DirCache read(final File indexLocation) + public static DirCache read(final File indexLocation, final FS fs) throws CorruptObjectException, IOException { - final DirCache c = new DirCache(indexLocation); + final DirCache c = new DirCache(indexLocation, fs); c.read(); return c; } @@ -161,11 +165,14 @@ public class DirCache { *

* The new index will be locked and then read before it is returned to the * caller. Read failures are reported as exceptions and therefore prevent - * the method from returning a partially populated index. On read failure, + * the method from returning a partially populated index. On read failure, * the lock is released. * * @param indexLocation * location of the index file on disk. + * @param fs + * the file system abstraction which will be necessary to perform + * certain file system operations. * @return a cache representing the contents of the specified index file (if * it exists) or an empty cache if the file does not exist. * @throws IOException @@ -175,9 +182,9 @@ public class DirCache { * the index file is using a format or extension that this * library does not support. */ - public static DirCache lock(final File indexLocation) + public static DirCache lock(final File indexLocation, final FS fs) throws CorruptObjectException, IOException { - final DirCache c = new DirCache(indexLocation); + final DirCache c = new DirCache(indexLocation, fs); if (!c.lock()) throw new IOException(MessageFormat.format(JGitText.get().cannotLock, indexLocation)); @@ -215,6 +222,9 @@ public class DirCache { /** Our active lock (if we hold it); null if we don't have it locked. */ private LockFile myLock; + /** file system abstraction **/ + private final FS fs; + /** * Create a new in-core index representation. *

@@ -223,9 +233,13 @@ public class DirCache { * * @param indexLocation * location of the index file on disk. + * @param fs + * the file system abstraction which will be necessary to perform + * certain file system operations. */ - public DirCache(final File indexLocation) { + public DirCache(final File indexLocation, final FS fs) { liveFile = indexLocation; + this.fs = fs; clear(); } @@ -429,7 +443,7 @@ public class DirCache { public boolean lock() throws IOException { if (liveFile == null) throw new IOException(JGitText.get().dirCacheDoesNotHaveABackingFile); - final LockFile tmp = new LockFile(liveFile); + final LockFile tmp = new LockFile(liveFile, fs); if (tmp.lock()) { tmp.setNeedStatInformation(true); myLock = tmp; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java index 92edb0325c..410c85fd8b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java @@ -555,7 +555,7 @@ public class BaseRepositoryBuilder.keep file. */ public class PackLock { private final File keepFile; + private final FS fs; /** * Create a new lock for a pack file. * * @param packFile * location of the pack-*.pack file. + * @param fs + * the filesystem abstraction used by the repository. */ - public PackLock(final File packFile) { + public PackLock(final File packFile, final FS fs) { final File p = packFile.getParentFile(); final String n = packFile.getName(); keepFile = new File(p, n.substring(0, n.length() - 5) + ".keep"); + this.fs = fs; } /** @@ -78,7 +83,7 @@ public class PackLock { return false; if (!msg.endsWith("\n")) msg += "\n"; - final LockFile lf = new LockFile(keepFile); + final LockFile lf = new LockFile(keepFile, fs); if (!lf.lock()) return false; lf.write(Constants.encode(msg)); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java index 68b0270df9..b22b14a910 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java @@ -512,7 +512,8 @@ public class RefDirectory extends RefDatabase { // we don't miss an edit made externally. final PackedRefList packed = getPackedRefs(); if (packed.contains(name)) { - LockFile lck = new LockFile(packedRefsFile); + LockFile lck = new LockFile(packedRefsFile, + update.getRepository().getFS()); if (!lck.lock()) throw new IOException(MessageFormat.format( JGitText.get().cannotLockFile, packedRefsFile)); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectoryUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectoryUpdate.java index 8d35ec34f6..a9f054837b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectoryUpdate.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectoryUpdate.java @@ -79,7 +79,7 @@ class RefDirectoryUpdate extends RefUpdate { if (deref) dst = dst.getLeaf(); String name = dst.getName(); - lock = new LockFile(database.fileFor(name)); + lock = new LockFile(database.fileFor(name), getRepository().getFS()); if (lock.lock()) { dst = database.getRef(name); setOldObjectId(dst != null ? dst.getObjectId() : null); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java index ca68858059..f747616749 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java @@ -279,7 +279,8 @@ class FetchProcess { File meta = transport.local.getDirectory(); if (meta == null) return; - final LockFile lock = new LockFile(new File(meta, "FETCH_HEAD")); + final LockFile lock = new LockFile(new File(meta, "FETCH_HEAD"), + transport.local.getFS()); try { if (lock.lock()) { final Writer w = new OutputStreamWriter(lock.getOutputStream()); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/IndexPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/IndexPack.java index 25b499b32e..2daa105c53 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/IndexPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/IndexPack.java @@ -1101,7 +1101,7 @@ public class IndexPack { final File packDir = new File(repo.getObjectsDirectory(), "pack"); final File finalPack = new File(packDir, "pack-" + name + ".pack"); final File finalIdx = new File(packDir, "pack-" + name + ".idx"); - final PackLock keep = new PackLock(finalPack); + final PackLock keep = new PackLock(finalPack, repo.getFS()); if (!packDir.exists() && !packDir.mkdir() && !packDir.exists()) { // The objects/pack directory isn't present, and we are unable diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java index f4382eb186..475c871c3c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java @@ -74,7 +74,7 @@ public abstract class SystemReader { public FileBasedConfig openUserConfig(FS fs) { final File home = fs.userHome(); - return new FileBasedConfig(new File(home, ".gitconfig")); + return new FileBasedConfig(new File(home, ".gitconfig"), fs); } public String getHostname() { -- cgit v1.2.3