import java.io.File;
import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.RepositoryTestCase;
public class DirCacheBasicTest extends RepositoryTestCase {
final String[] paths = { "a.", "a.b", "a/b", "a0b" };
final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
- for (int i = 0; i < paths.length; i++)
+ for (int i = 0; i < paths.length; i++) {
ents[i] = new DirCacheEntry(paths[i]);
+ ents[i].setFileMode(FileMode.REGULAR_FILE);
+ }
final DirCacheBuilder b = dc.builder();
for (int i = 0; i < ents.length; i++)
/*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
}
}
+ public void testBuildRejectsUnsetFileMode() throws Exception {
+ final DirCache dc = DirCache.newInCore();
+ final DirCacheBuilder b = dc.builder();
+ assertNotNull(b);
+
+ final DirCacheEntry e = new DirCacheEntry("a");
+ assertEquals(0, e.getRawMode());
+ try {
+ b.add(e);
+ } catch (IllegalArgumentException err) {
+ assertEquals("FileMode not set for path a", err.getMessage());
+ }
+ }
+
public void testBuildOneFile_FinishWriteCommit() throws Exception {
final String path = "a-file-path";
final FileMode mode = FileMode.REGULAR_FILE;
assertNotNull(b);
final DirCacheEntry entOrig = new DirCacheEntry(path);
+ entOrig.setFileMode(FileMode.REGULAR_FILE);
assertNotSame(path, entOrig.getPathString());
assertEquals(path, entOrig.getPathString());
b.add(entOrig);
final String[] paths = { "a.", "a.b", "a/b", "a0b" };
final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
- for (int i = 0; i < paths.length; i++)
+ for (int i = 0; i < paths.length; i++) {
ents[i] = new DirCacheEntry(paths[i]);
+ ents[i].setFileMode(FileMode.REGULAR_FILE);
+ }
final DirCacheBuilder b = dc.builder();
for (int i = 0; i < ents.length; i++)
final String[] paths = { "a.", "a.b", "a/b", "a0b" };
final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
- for (int i = 0; i < paths.length; i++)
+ for (int i = 0; i < paths.length; i++) {
ents[i] = new DirCacheEntry(paths[i]);
+ ents[i].setFileMode(FileMode.REGULAR_FILE);
+ }
final DirCacheBuilder b = dc.builder();
for (int i = ents.length - 1; i >= 0; i--)
final String[] paths = { "a.", "a.b", "a/b", "a0b" };
final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
- for (int i = 0; i < paths.length; i++)
+ for (int i = 0; i < paths.length; i++) {
ents[i] = new DirCacheEntry(paths[i]);
+ ents[i].setFileMode(FileMode.REGULAR_FILE);
+ }
{
final DirCacheBuilder b = dc.builder();
for (int i = 0; i < ents.length; i++)
--- /dev/null
+/*
+ * Copyright (C) 2009, Google Inc.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ * names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.dircache;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
+
+public class DirCacheEntryTest extends TestCase {
+ public void testIsValidPath() {
+ assertTrue(isValidPath("a"));
+ assertTrue(isValidPath("a/b"));
+ assertTrue(isValidPath("ab/cd/ef"));
+
+ assertFalse(isValidPath(""));
+ assertFalse(isValidPath("/a"));
+ assertFalse(isValidPath("a//b"));
+ assertFalse(isValidPath("ab/cd//ef"));
+ assertFalse(isValidPath("a/"));
+ assertFalse(isValidPath("ab/cd/ef/"));
+ assertFalse(isValidPath("a\u0000b"));
+ }
+
+ private static boolean isValidPath(final String path) {
+ return DirCacheEntry.isValidPath(Constants.encode(path));
+ }
+
+ public void testCreate_ByStringPath() {
+ assertEquals("a", new DirCacheEntry("a").getPathString());
+ assertEquals("a/b", new DirCacheEntry("a/b").getPathString());
+
+ try {
+ new DirCacheEntry("/a");
+ fail("Incorrectly created DirCacheEntry");
+ } catch (IllegalArgumentException err) {
+ assertEquals("Invalid path: /a", err.getMessage());
+ }
+ }
+
+ public void testCreate_ByStringPathAndStage() {
+ DirCacheEntry e;
+
+ e = new DirCacheEntry("a", 0);
+ assertEquals("a", e.getPathString());
+ assertEquals(0, e.getStage());
+
+ e = new DirCacheEntry("a/b", 1);
+ assertEquals("a/b", e.getPathString());
+ assertEquals(1, e.getStage());
+
+ e = new DirCacheEntry("a/c", 2);
+ assertEquals("a/c", e.getPathString());
+ assertEquals(2, e.getStage());
+
+ e = new DirCacheEntry("a/d", 3);
+ assertEquals("a/d", e.getPathString());
+ assertEquals(3, e.getStage());
+
+ try {
+ new DirCacheEntry("/a", 1);
+ fail("Incorrectly created DirCacheEntry");
+ } catch (IllegalArgumentException err) {
+ assertEquals("Invalid path: /a", err.getMessage());
+ }
+
+ try {
+ new DirCacheEntry("a", -11);
+ fail("Incorrectly created DirCacheEntry");
+ } catch (IllegalArgumentException err) {
+ assertEquals("Invalid stage -11 for path a", err.getMessage());
+ }
+
+ try {
+ new DirCacheEntry("a", 4);
+ fail("Incorrectly created DirCacheEntry");
+ } catch (IllegalArgumentException err) {
+ assertEquals("Invalid stage 4 for path a", err.getMessage());
+ }
+ }
+
+ public void testSetFileMode() {
+ final DirCacheEntry e = new DirCacheEntry("a");
+
+ assertEquals(0, e.getRawMode());
+
+ e.setFileMode(FileMode.REGULAR_FILE);
+ assertSame(FileMode.REGULAR_FILE, e.getFileMode());
+ assertEquals(FileMode.REGULAR_FILE.getBits(), e.getRawMode());
+
+ e.setFileMode(FileMode.EXECUTABLE_FILE);
+ assertSame(FileMode.EXECUTABLE_FILE, e.getFileMode());
+ assertEquals(FileMode.EXECUTABLE_FILE.getBits(), e.getRawMode());
+
+ e.setFileMode(FileMode.SYMLINK);
+ assertSame(FileMode.SYMLINK, e.getFileMode());
+ assertEquals(FileMode.SYMLINK.getBits(), e.getRawMode());
+
+ e.setFileMode(FileMode.GITLINK);
+ assertSame(FileMode.GITLINK, e.getFileMode());
+ assertEquals(FileMode.GITLINK.getBits(), e.getRawMode());
+
+ try {
+ e.setFileMode(FileMode.MISSING);
+ fail("incorrectly accepted FileMode.MISSING");
+ } catch (IllegalArgumentException err) {
+ assertEquals("Invalid mode 0 for path a", err.getMessage());
+ }
+
+ try {
+ e.setFileMode(FileMode.TREE);
+ fail("incorrectly accepted FileMode.TREE");
+ } catch (IllegalArgumentException err) {
+ assertEquals("Invalid mode 40000 for path a", err.getMessage());
+ }
+ }
+}
/*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
package org.eclipse.jgit.dircache;
+import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.RepositoryTestCase;
public class DirCacheFindTest extends RepositoryTestCase {
final String[] paths = { "a.", "a/b", "a/c", "a/d", "a0b" };
final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
- for (int i = 0; i < paths.length; i++)
+ for (int i = 0; i < paths.length; i++) {
ents[i] = new DirCacheEntry(paths[i]);
+ ents[i].setFileMode(FileMode.REGULAR_FILE);
+ }
final int aFirst = 1;
final int aLast = 3;
/*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
final String[] paths = { "a.", "a0b" };
final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
- for (int i = 0; i < paths.length; i++)
+ for (int i = 0; i < paths.length; i++) {
ents[i] = new DirCacheEntry(paths[i]);
+ ents[i].setFileMode(FileMode.REGULAR_FILE);
+ }
final DirCacheBuilder b = dc.builder();
for (int i = 0; i < ents.length; i++)
/*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
import java.io.IOException;
import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.RepositoryTestCase;
public class DirCacheLargePathTest extends RepositoryTestCase {
final DirCacheEntry longEnt = new DirCacheEntry(longPath);
final DirCacheEntry shortEnt = new DirCacheEntry(shortPath);
+
+ longEnt.setFileMode(FileMode.REGULAR_FILE);
+ shortEnt.setFileMode(FileMode.REGULAR_FILE);
+
assertEquals(longPath, longEnt.getPathString());
assertEquals(shortPath, shortEnt.getPathString());
/*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
import java.io.IOException;
import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.RepositoryTestCase;
public class DirCacheTreeTest extends RepositoryTestCase {
final String[] paths = { "a.", "a/b", "a/c", "a/d", "a0b" };
final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
- for (int i = 0; i < paths.length; i++)
+ for (int i = 0; i < paths.length; i++) {
ents[i] = new DirCacheEntry(paths[i]);
+ ents[i].setFileMode(FileMode.REGULAR_FILE);
+ }
final int aFirst = 1;
final int aLast = 3;
final String[] paths = { "a.", "a/b", "a/c/e", "a/c/f", "a/d", "a0b" };
final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
- for (int i = 0; i < paths.length; i++)
+ for (int i = 0; i < paths.length; i++) {
ents[i] = new DirCacheEntry(paths[i]);
+ ents[i].setFileMode(FileMode.REGULAR_FILE);
+ }
final int aFirst = 1;
final int aLast = 4;
final int acFirst = 2;
final String B = String.format("b%2000s", "b");
final String[] paths = { A + ".", A + "." + B, A + "/" + B, A + "0" + B };
final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
- for (int i = 0; i < paths.length; i++)
+ for (int i = 0; i < paths.length; i++) {
ents[i] = new DirCacheEntry(paths[i]);
+ ents[i].setFileMode(FileMode.REGULAR_FILE);
+ }
final DirCacheBuilder b = dc.builder();
for (int i = 0; i < ents.length; i++)
import java.util.Arrays;
import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.WindowCursor;
import org.eclipse.jgit.treewalk.AbstractTreeIterator;
*
* @param newEntry
* the new entry to add.
+ * @throws IllegalArgumentException
+ * If the FileMode of the entry was not set by the caller.
*/
public void add(final DirCacheEntry newEntry) {
+ if (newEntry.getRawMode() == 0)
+ throw new IllegalArgumentException("FileMode not set for path "
+ + newEntry.getPathString());
beforeAdd(newEntry);
fastAdd(newEntry);
}
}
private void beforeAdd(final DirCacheEntry newEntry) {
- if (FileMode.TREE.equals(newEntry.getRawMode()))
- throw bad(newEntry, "Adding subtree not allowed");
if (sorted && entryCnt > 0) {
final DirCacheEntry lastEntry = entries[entryCnt - 1];
final int cr = DirCache.cmp(lastEntry, newEntry);
/*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
* and other copyright owners as documented in the project's IP log.
*
}
final DirCacheEntry ent;
- if (missing)
+ if (missing) {
ent = new DirCacheEntry(e.path);
- else
+ e.apply(ent);
+ if (ent.getRawMode() == 0)
+ throw new IllegalArgumentException("FileMode not set"
+ + " for path " + ent.getPathString());
+ } else {
ent = cache.getEntry(eIdx);
- e.apply(ent);
+ e.apply(ent);
+ }
fastAdd(ent);
}
*
* @param mode
* the new mode constant.
+ * @throws IllegalArgumentException
+ * If {@code mode} is {@link FileMode#MISSING},
+ * {@link FileMode#TREE}, or any other type code not permitted
+ * in a tree object.
*/
public void setFileMode(final FileMode mode) {
+ switch (mode.getBits() & FileMode.TYPE_MASK) {
+ case FileMode.TYPE_MISSING:
+ case FileMode.TYPE_TREE:
+ throw new IllegalArgumentException("Invalid mode " + mode
+ + " for path " + getPathString());
+ }
NB.encodeInt32(info, infoOffset + P_MODE, mode.getBits());
}
}
final FileMode mode = e.getFileMode();
- if (mode.getObjectType() == Constants.OBJ_BAD)
- throw new IllegalStateException("Entry \"" + e.getPathString()
- + "\" has incorrect mode set up.");
-
size += mode.copyToLength();
size += ep.length - pathOffset;
size += OBJECT_ID_LENGTH + 2;
+++ /dev/null
-/*
- * Copyright (C) 2009, Google Inc.
- * and other copyright owners as documented in the project's IP log.
- *
- * This program and the accompanying materials are made available
- * under the terms of the Eclipse Distribution License v1.0 which
- * accompanies this distribution, is reproduced below, and is
- * available at http://www.eclipse.org/org/documents/edl-v10.php
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- *
- * - Neither the name of the Eclipse Foundation, Inc. nor the
- * names of its contributors may be used to endorse or promote
- * products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.spearce.jgit.dircache;
-
-import junit.framework.TestCase;
-
-import org.spearce.jgit.lib.Constants;
-
-public class DirCacheEntryTest extends TestCase {
- public void testIsValidPath() {
- assertTrue(isValidPath("a"));
- assertTrue(isValidPath("a/b"));
- assertTrue(isValidPath("ab/cd/ef"));
-
- assertFalse(isValidPath(""));
- assertFalse(isValidPath("/a"));
- assertFalse(isValidPath("a//b"));
- assertFalse(isValidPath("ab/cd//ef"));
- assertFalse(isValidPath("a/"));
- assertFalse(isValidPath("ab/cd/ef/"));
- assertFalse(isValidPath("a\u0000b"));
- }
-
- private static boolean isValidPath(final String path) {
- return DirCacheEntry.isValidPath(Constants.encode(path));
- }
-
- public void testCreate_ByStringPath() {
- assertEquals("a", new DirCacheEntry("a").getPathString());
- assertEquals("a/b", new DirCacheEntry("a/b").getPathString());
-
- try {
- new DirCacheEntry("/a");
- fail("Incorrectly created DirCacheEntry");
- } catch (IllegalArgumentException err) {
- assertEquals("Invalid path: /a", err.getMessage());
- }
- }
-
- public void testCreate_ByStringPathAndStage() {
- DirCacheEntry e;
-
- e = new DirCacheEntry("a", 0);
- assertEquals("a", e.getPathString());
- assertEquals(0, e.getStage());
-
- e = new DirCacheEntry("a/b", 1);
- assertEquals("a/b", e.getPathString());
- assertEquals(1, e.getStage());
-
- e = new DirCacheEntry("a/c", 2);
- assertEquals("a/c", e.getPathString());
- assertEquals(2, e.getStage());
-
- e = new DirCacheEntry("a/d", 3);
- assertEquals("a/d", e.getPathString());
- assertEquals(3, e.getStage());
-
- try {
- new DirCacheEntry("/a", 1);
- fail("Incorrectly created DirCacheEntry");
- } catch (IllegalArgumentException err) {
- assertEquals("Invalid path: /a", err.getMessage());
- }
-
- try {
- new DirCacheEntry("a", -11);
- fail("Incorrectly created DirCacheEntry");
- } catch (IllegalArgumentException err) {
- assertEquals("Invalid stage -11 for path a", err.getMessage());
- }
-
- try {
- new DirCacheEntry("a", 4);
- fail("Incorrectly created DirCacheEntry");
- } catch (IllegalArgumentException err) {
- assertEquals("Invalid stage 4 for path a", err.getMessage());
- }
- }
-}