Skip to content

Commit

Permalink
Showing 2 changed files with 52 additions and 0 deletions.
51 changes: 51 additions & 0 deletions core/src/main/java/org/jruby/util/RubyFiletypeDetector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.jruby.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.spi.FileTypeDetector;
import java.util.Locale;
import java.util.regex.Pattern;

public final class RubyFiletypeDetector extends FileTypeDetector {

private static final String[] KNOWN_RUBY_FILES = new String[]{ "Gemfile", "Rakefile", "Mavenfile" };
private static final String[] KNOWN_RUBY_SUFFIXES = new String[]{ ".rb", ".rake", ".gemspec" };
private static final String RUBY_MIME = "application/x-ruby";
private static final Pattern SHEBANG_REGEXP = Pattern.compile("^#! ?/usr/bin/(env +ruby|ruby).*");

@Override
public String probeContentType(Path path) throws IOException {
final Path fileNamePath = path.getFileName();
if (fileNamePath == null) {
return null;
}

final String fileName = fileNamePath.toString();
final String lowerCaseFileName = fileName.toLowerCase(Locale.ROOT);

for (String candidate : KNOWN_RUBY_SUFFIXES) {
if (lowerCaseFileName.endsWith(candidate)) {
return RUBY_MIME;
}
}

for (String candidate : KNOWN_RUBY_FILES) {
if (fileName.equals(candidate)) {
return RUBY_MIME;
}
}

try (BufferedReader fileContent = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
final String firstLine = fileContent.readLine();
if (firstLine != null && SHEBANG_REGEXP.matcher(firstLine).matches()) {
return RUBY_MIME;
}
}

return null;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.jruby.util.RubyFiletypeDetector

0 comments on commit 410350c

Please sign in to comment.