# [PATCH JGIT 2/5] FileMode: Store bit masks in int constants

3 messages from 2009-08-12 to 2009-08-12. Participants: Jonas Fonseca, Shawn O. Pearce.
Thread: https://gitlist.dev/t/20551

## Jonas Fonseca, 2009-08-12 14:33

Subject: [PATCH JGIT 2/5] FileMode: Store bit masks in int constants
Message-ID: <2c6b72b30908120733h4ecb3fccm3a1e80c111c1185c@mail.gmail.com>
URL: https://gitlist.dev/e/2c6b72b30908120733h4ecb3fccm3a1e80c111c1185c%40mail.gmail.com

```
Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
---
 .../src/org/spearce/jgit/lib/FileMode.java         |   38 ++++++++++++--------
 .../spearce/jgit/treewalk/WorkingTreeIterator.java |    8 ++--
 2 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/FileMode.java
b/org.spearce.jgit/src/org/spearce/jgit/lib/FileMode.java
index cf42f37..a1f82f8 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/FileMode.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/FileMode.java
@@ -50,21 +50,29 @@
  * </p>
  */
 public abstract class FileMode {
+
+	public static final int TYPE_MASK = 0170000;
+	public static final int TREE_MASK = 0040000;
+	public static final int SYMLINK_MASK = 0120000;
+	public static final int FILE_MASK = 0100000;
+	public static final int GITLINK_MASK = 0160000;
+	public static final int MISSING_MASK = 0000000;
+
 	/** Mode indicating an entry is a {@link Tree}. */
 	@SuppressWarnings("synthetic-access")
-	public static final FileMode TREE = new FileMode(0040000,
+	public static final FileMode TREE = new FileMode(TREE_MASK,
 			Constants.OBJ_TREE) {
 		public boolean equals(final int modeBits) {
-			return (modeBits & 0170000) == 0040000;
+			return (modeBits & TYPE_MASK) == TREE_MASK;
 		}
 	};

 	/** Mode indicating an entry is a {@link SymlinkTreeEntry}. */
 	@SuppressWarnings("synthetic-access")
-	public static final FileMode SYMLINK = new FileMode(0120000,
+	public static final FileMode SYMLINK = new FileMode(SYMLINK_MASK,
 			Constants.OBJ_BLOB) {
 		public boolean equals(final int modeBits) {
-			return (modeBits & 0170000) == 0120000;
+			return (modeBits & TYPE_MASK) == SYMLINK_MASK;
 		}
 	};

@@ -73,7 +81,7 @@ public boolean equals(final int modeBits) {
 	public static final FileMode REGULAR_FILE = new FileMode(0100644,
 			Constants.OBJ_BLOB) {
 		public boolean equals(final int modeBits) {
-			return (modeBits & 0170000) == 0100000 && (modeBits & 0111) == 0;
+			return (modeBits & TYPE_MASK) == FILE_MASK && (modeBits & 0111) == 0;
 		}
 	};

@@ -82,22 +90,22 @@ public boolean equals(final int modeBits) {
 	public static final FileMode EXECUTABLE_FILE = new FileMode(0100755,
 			Constants.OBJ_BLOB) {
 		public boolean equals(final int modeBits) {
-			return (modeBits & 0170000) == 0100000 && (modeBits & 0111) != 0;
+			return (modeBits & TYPE_MASK) == FILE_MASK && (modeBits & 0111) != 0;
 		}
 	};

 	/** Mode indicating an entry is a submodule commit in another repository. */
 	@SuppressWarnings("synthetic-access")
-	public static final FileMode GITLINK = new FileMode(0160000,
+	public static final FileMode GITLINK = new FileMode(GITLINK_MASK,
 			Constants.OBJ_COMMIT) {
 		public boolean equals(final int modeBits) {
-			return (modeBits & 0170000) == 0160000;
+			return (modeBits & TYPE_MASK) == GITLINK_MASK;
 		}
 	};

 	/** Mode indicating an entry is missing during parallel walks. */
 	@SuppressWarnings("synthetic-access")
-	public static final FileMode MISSING = new FileMode(0000000,
+	public static final FileMode MISSING = new FileMode(MISSING_MASK,
 			Constants.OBJ_BAD) {
 		public boolean equals(final int modeBits) {
 			return modeBits == 0;
@@ -112,20 +120,20 @@ public boolean equals(final int modeBits) {
 	 * @return the FileMode instance that represents the given bits.
 	 */
 	public static final FileMode fromBits(final int bits) {
-		switch (bits & 0170000) {
-		case 0000000:
+		switch (bits & TYPE_MASK) {
+		case MISSING_MASK:
 			if (bits == 0)
 				return MISSING;
 			break;
-		case 0040000:
+		case TREE_MASK:
 			return TREE;
-		case 0100000:
+		case FILE_MASK:
 			if ((bits & 0111) != 0)
 				return EXECUTABLE_FILE;
 			return REGULAR_FILE;
-		case 0120000:
+		case SYMLINK_MASK:
 			return SYMLINK;
-		case 0160000:
+		case GITLINK_MASK:
 			return GITLINK;
 		}

diff --git a/org.spearce.jgit/src/org/spearce/jgit/treewalk/WorkingTreeIterator.java
b/org.spearce.jgit/src/org/spearce/jgit/treewalk/WorkingTreeIterator.java
index d4291ea..6003736 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/treewalk/WorkingTreeIterator.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/treewalk/WorkingTreeIterator.java
@@ -134,16 +134,16 @@ protected WorkingTreeIterator(final
WorkingTreeIterator p) {
 	public byte[] idBuffer() {
 		if (contentIdFromPtr == ptr)
 			return contentId;
-		switch (mode & 0170000) {
-		case 0100000: /* normal files */
+		switch (mode & FileMode.TYPE_MASK) {
+		case FileMode.FILE_MASK:
 			contentIdFromPtr = ptr;
 			return contentId = idBufferBlob(entries[ptr]);
-		case 0120000: /* symbolic links */
+		case FileMode.SYMLINK_MASK:
 			// Java does not support symbolic links, so we should not
 			// have reached this particular part of the walk code.
 			//
 			return zeroid;
-		case 0160000: /* gitlink */
+		case FileMode.GITLINK_MASK:
 			// TODO: Support obtaining current HEAD SHA-1 from nested repository
 			//
 			return zeroid;
-- 
1.6.4.rc3.195.g2b05f

```

## Jonas Fonseca, 2009-08-12 15:09

Subject: [PATCH JGIT 2/5] FileMode: Store bit masks in int constants
Message-ID: <1250089776-22895-1-git-send-email-fonseca@diku.dk>
URL: https://gitlist.dev/e/1250089776-22895-1-git-send-email-fonseca%40diku.dk
In-Reply-To: <2c6b72b30908120733h4ecb3fccm3a1e80c111c1185c@mail.gmail.com>

```

Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
---
 .../src/org/spearce/jgit/lib/FileMode.java         |   38 ++++++++++++--------
 .../spearce/jgit/treewalk/WorkingTreeIterator.java |    8 ++--
 2 files changed, 27 insertions(+), 19 deletions(-)

 Resend without mailer errors ...

diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/FileMode.java b/org.spearce.jgit/src/org/spearce/jgit/lib/FileMode.java
index cf42f37..a1f82f8 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/FileMode.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/FileMode.java
@@ -50,21 +50,29 @@
  * </p>
  */
 public abstract class FileMode {
+
+	public static final int TYPE_MASK = 0170000;
+	public static final int TREE_MASK = 0040000;
+	public static final int SYMLINK_MASK = 0120000;
+	public static final int FILE_MASK = 0100000;
+	public static final int GITLINK_MASK = 0160000;
+	public static final int MISSING_MASK = 0000000;
+
 	/** Mode indicating an entry is a {@link Tree}. */
 	@SuppressWarnings("synthetic-access")
-	public static final FileMode TREE = new FileMode(0040000,
+	public static final FileMode TREE = new FileMode(TREE_MASK,
 			Constants.OBJ_TREE) {
 		public boolean equals(final int modeBits) {
-			return (modeBits & 0170000) == 0040000;
+			return (modeBits & TYPE_MASK) == TREE_MASK;
 		}
 	};
 
 	/** Mode indicating an entry is a {@link SymlinkTreeEntry}. */
 	@SuppressWarnings("synthetic-access")
-	public static final FileMode SYMLINK = new FileMode(0120000,
+	public static final FileMode SYMLINK = new FileMode(SYMLINK_MASK,
 			Constants.OBJ_BLOB) {
 		public boolean equals(final int modeBits) {
-			return (modeBits & 0170000) == 0120000;
+			return (modeBits & TYPE_MASK) == SYMLINK_MASK;
 		}
 	};
 
@@ -73,7 +81,7 @@ public boolean equals(final int modeBits) {
 	public static final FileMode REGULAR_FILE = new FileMode(0100644,
 			Constants.OBJ_BLOB) {
 		public boolean equals(final int modeBits) {
-			return (modeBits & 0170000) == 0100000 && (modeBits & 0111) == 0;
+			return (modeBits & TYPE_MASK) == FILE_MASK && (modeBits & 0111) == 0;
 		}
 	};
 
@@ -82,22 +90,22 @@ public boolean equals(final int modeBits) {
 	public static final FileMode EXECUTABLE_FILE = new FileMode(0100755,
 			Constants.OBJ_BLOB) {
 		public boolean equals(final int modeBits) {
-			return (modeBits & 0170000) == 0100000 && (modeBits & 0111) != 0;
+			return (modeBits & TYPE_MASK) == FILE_MASK && (modeBits & 0111) != 0;
 		}
 	};
 
 	/** Mode indicating an entry is a submodule commit in another repository. */
 	@SuppressWarnings("synthetic-access")
-	public static final FileMode GITLINK = new FileMode(0160000,
+	public static final FileMode GITLINK = new FileMode(GITLINK_MASK,
 			Constants.OBJ_COMMIT) {
 		public boolean equals(final int modeBits) {
-			return (modeBits & 0170000) == 0160000;
+			return (modeBits & TYPE_MASK) == GITLINK_MASK;
 		}
 	};
 
 	/** Mode indicating an entry is missing during parallel walks. */
 	@SuppressWarnings("synthetic-access")
-	public static final FileMode MISSING = new FileMode(0000000,
+	public static final FileMode MISSING = new FileMode(MISSING_MASK,
 			Constants.OBJ_BAD) {
 		public boolean equals(final int modeBits) {
 			return modeBits == 0;
@@ -112,20 +120,20 @@ public boolean equals(final int modeBits) {
 	 * @return the FileMode instance that represents the given bits.
 	 */
 	public static final FileMode fromBits(final int bits) {
-		switch (bits & 0170000) {
-		case 0000000:
+		switch (bits & TYPE_MASK) {
+		case MISSING_MASK:
 			if (bits == 0)
 				return MISSING;
 			break;
-		case 0040000:
+		case TREE_MASK:
 			return TREE;
-		case 0100000:
+		case FILE_MASK:
 			if ((bits & 0111) != 0)
 				return EXECUTABLE_FILE;
 			return REGULAR_FILE;
-		case 0120000:
+		case SYMLINK_MASK:
 			return SYMLINK;
-		case 0160000:
+		case GITLINK_MASK:
 			return GITLINK;
 		}
 
diff --git a/org.spearce.jgit/src/org/spearce/jgit/treewalk/WorkingTreeIterator.java b/org.spearce.jgit/src/org/spearce/jgit/treewalk/WorkingTreeIterator.java
index d4291ea..6003736 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/treewalk/WorkingTreeIterator.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/treewalk/WorkingTreeIterator.java
@@ -134,16 +134,16 @@ protected WorkingTreeIterator(final WorkingTreeIterator p) {
 	public byte[] idBuffer() {
 		if (contentIdFromPtr == ptr)
 			return contentId;
-		switch (mode & 0170000) {
-		case 0100000: /* normal files */
+		switch (mode & FileMode.TYPE_MASK) {
+		case FileMode.FILE_MASK:
 			contentIdFromPtr = ptr;
 			return contentId = idBufferBlob(entries[ptr]);
-		case 0120000: /* symbolic links */
+		case FileMode.SYMLINK_MASK:
 			// Java does not support symbolic links, so we should not
 			// have reached this particular part of the walk code.
 			//
 			return zeroid;
-		case 0160000: /* gitlink */
+		case FileMode.GITLINK_MASK:
 			// TODO: Support obtaining current HEAD SHA-1 from nested repository
 			//
 			return zeroid;
-- 
1.6.4.rc3.195.g2b05f

```

## Shawn O. Pearce, 2009-08-12 15:22

Subject: Re: [PATCH JGIT 2/5] FileMode: Store bit masks in int constants
Message-ID: <20090812152252.GE1033@spearce.org>
URL: https://gitlist.dev/e/20090812152252.GE1033%40spearce.org
In-Reply-To: <1250089776-22895-1-git-send-email-fonseca@diku.dk>

```
Jonas Fonseca <fonseca@diku.dk> wrote:
> +	public static final int TYPE_MASK = 0170000;
> +	public static final int TREE_MASK = 0040000;
> +	public static final int SYMLINK_MASK = 0120000;
> +	public static final int FILE_MASK = 0100000;
> +	public static final int GITLINK_MASK = 0160000;
> +	public static final int MISSING_MASK = 0000000;

These last 5 entries aren't masks, they are type codes.  I'd rather
they be called FOO_TYPE than FOO_MASK.  In particular what is really
troubling is MISSING_MASK, being all 0 it always destroys the input
and then matches everything.  :-)

I'm going to amend this name change in here, s/_MASK/_TYPE/ on the
last 5 fields.

-- 
Shawn.

```
