Browse Source

Normalize paths on OS X

Java normalizes paths to NFC, but other source may not, e.g Eclipse.

Bug: 413390
Change-Id: I08649ac58c9b3cb8bf12794703e4137b1b4e94d5
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-3.3
Robin Rosenberg 12 years ago committed by Matthias Sohn
parent
commit
5a51779e84
  1. 16
      org.eclipse.jgit.java7/src/org/eclipse/jgit/util/FS_POSIX_Java7.java
  2. 20
      org.eclipse.jgit.java7/src/org/eclipse/jgit/util/FileUtil.java
  3. 3
      org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java
  4. 12
      org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java
  5. 22
      org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java

16
org.eclipse.jgit.java7/src/org/eclipse/jgit/util/FS_POSIX_Java7.java

@ -156,4 +156,20 @@ public class FS_POSIX_Java7 extends FS_POSIX {
public Attributes getAttributes(File path) { public Attributes getAttributes(File path) {
return FileUtil.getFileAttributesPosix(this, path); return FileUtil.getFileAttributesPosix(this, path);
} }
/**
* @since 3.3
*/
@Override
public File normalize(File file) {
return FileUtil.normalize(file);
}
/**
* @since 3.3
*/
@Override
public String normalize(String name) {
return FileUtil.normalize(name);
}
} }

20
org.eclipse.jgit.java7/src/org/eclipse/jgit/util/FileUtil.java

@ -222,4 +222,24 @@ class FileUtil {
} }
} }
public static File normalize(File file) {
if (SystemReader.getInstance().isMacOS()) {
// TODO: Would it be faster to check with isNormalized first
// assuming normalized paths are much more common
String normalized = Normalizer.normalize(file.getPath(),
Normalizer.Form.NFC);
return new File(normalized);
}
return file;
}
public static String normalize(String name) {
if (SystemReader.getInstance().isMacOS()) {
if (name == null)
return null;
return Normalizer.normalize(name, Normalizer.Form.NFC);
}
return name;
}
} }

3
org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java

@ -163,8 +163,9 @@ public class FileTreeIterator extends WorkingTreeIterator {
* @param fs * @param fs
* file system * file system
*/ */
public FileEntry(final File f, FS fs) { public FileEntry(File f, FS fs) {
this.fs = fs; this.fs = fs;
f = fs.normalize(f);
attributes = fs.getAttributes(f); attributes = fs.getAttributes(f);
if (attributes.isSymbolicLink()) if (attributes.isSymbolicLink())
mode = FileMode.SYMLINK; mode = FileMode.SYMLINK;

12
org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java

@ -921,8 +921,8 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator {
return false; return false;
} else { } else {
if (mode == FileMode.SYMLINK.getBits()) if (mode == FileMode.SYMLINK.getBits())
return !new File(readContentAsString(current())) return !new File(readContentAsNormalizedString(current()))
.equals(new File(readContentAsString(entry))); .equals(new File((readContentAsNormalizedString(entry))));
// Content differs: that's a real change, perhaps // Content differs: that's a real change, perhaps
if (reader == null) // deprecated use, do no further checks if (reader == null) // deprecated use, do no further checks
return true; return true;
@ -971,19 +971,19 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator {
} }
} }
private String readContentAsString(DirCacheEntry entry) private String readContentAsNormalizedString(DirCacheEntry entry)
throws MissingObjectException, IOException { throws MissingObjectException, IOException {
ObjectLoader open = repository.open(entry.getObjectId()); ObjectLoader open = repository.open(entry.getObjectId());
byte[] cachedBytes = open.getCachedBytes(); byte[] cachedBytes = open.getCachedBytes();
return RawParseUtils.decode(cachedBytes); return FS.detect().normalize(RawParseUtils.decode(cachedBytes));
} }
private static String readContentAsString(Entry entry) throws IOException { private static String readContentAsNormalizedString(Entry entry) throws IOException {
long length = entry.getLength(); long length = entry.getLength();
byte[] content = new byte[(int) length]; byte[] content = new byte[(int) length];
InputStream is = entry.openInputStream(); InputStream is = entry.openInputStream();
IO.readFully(is, content, 0, (int) length); IO.readFully(is, content, 0, (int) length);
return RawParseUtils.decode(content); return FS.detect().normalize(RawParseUtils.decode(content));
} }
private long computeLength(InputStream in) throws IOException { private long computeLength(InputStream in) throws IOException {

22
org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java

@ -780,4 +780,26 @@ public abstract class FS {
return new Attributes(this, path, exists, isDirectory, canExecute, return new Attributes(this, path, exists, isDirectory, canExecute,
isSymlink, isFile, createTime, lastModified, -1); isSymlink, isFile, createTime, lastModified, -1);
} }
/**
* Normalize the unicode path to composed form.
*
* @param file
* @return NFC-format File
* @since 3.3
*/
public File normalize(File file) {
return file;
}
/**
* Normalize the unicode path to composed form.
*
* @param name
* @return NFC-format string
* @since 3.3
*/
public String normalize(String name) {
return name;
}
} }

Loading…
Cancel
Save