From a496410df9d9d2ff72c662d229329cae302a0edc Mon Sep 17 00:00:00 2001 From: Robin Rosenberg Date: Sat, 8 May 2010 23:12:19 +0200 Subject: [PATCH] A stages field and getter for GitIndex entry introduced Currently, if the Index contains a file in more than one stage, only the last entry (containing the highest stage) will be registered in GitIndex. For applications it can be useful to not only know about the highest stage, but also which other stages are present, e.g. to detect the type of conflict the file is in. Change-Id: I2d4ff9f6023335d9ba6ea25d8e77c8e283ae53cb Signed-off-by: Robin Rosenberg --- .../src/org/eclipse/jgit/lib/GitIndex.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitIndex.java index 4ae24f5e2..bba18408c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitIndex.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitIndex.java @@ -244,7 +244,11 @@ public void read() throws IOException { entries.clear(); for (int i = 0; i < header.entries; ++i) { Entry entry = new Entry(buffer); + final GitIndex.Entry existing = entries.get(entry.name); entries.put(entry.name, entry); + if (existing != null) { + entry.stages |= existing.stages; + } } lastCacheTime = cacheFile.lastModified(); } finally { @@ -374,6 +378,8 @@ public class Entry { private byte[] name; + private int stages; + Entry(byte[] key, File f, int stage) throws IOException { ctime = f.lastModified() * 1000000L; @@ -391,6 +397,7 @@ public class Entry { sha1 = writer.writeBlob(f); name = key; flags = (short) ((stage << 12) | name.length); // TODO: fix flags + stages = (1 >> getStage()); } Entry(byte[] key, File f, int stage, byte[] newContent) @@ -410,6 +417,7 @@ public class Entry { sha1 = writer.writeBlob(newContent); name = key; flags = (short) ((stage << 12) | name.length); // TODO: fix flags + stages = (1 >> getStage()); } Entry(TreeEntry f, int stage) { @@ -429,6 +437,7 @@ public class Entry { sha1 = f.getId(); name = Constants.encode(f.getFullName()); flags = (short) ((stage << 12) | name.length); // TODO: fix flags + stages = (1 >> getStage()); } Entry(ByteBuffer b) { @@ -445,6 +454,7 @@ public class Entry { b.get(sha1bytes); sha1 = ObjectId.fromRaw(sha1bytes); flags = b.getShort(); + stages = (1 << getStage()); name = new byte[flags & 0xFFF]; b.get(name); b @@ -643,6 +653,19 @@ public boolean isModified(File wd, boolean forceContentCheck) { return false; } + /** + * Returns the stages in which the entry's file is recorded in the index. + * The stages are bit-encoded: bit N is set if the file is present + * in stage N. In particular, the N-th bit will be set if this entry + * itself is in stage N (see getStage()). + * + * @return flags denoting stages + * @see #getStage() + */ + public int getStages() { + return stages; + } + // for testing void forceRecheck() { mtime = -1;