Fix case-insensitive absolute listing.

This goes to show that we shouldn't avoid using path functions in the
name of efficiency. We were using a raw substring to get a relative
path, and it failed for absolute roots because they didn't have an extra
"/" added to the end.

Closes #4

R=rnystrom@google.com

Review URL: https://codereview.chromium.org//1773293002 .
diff --git a/CHANGELOG.md b/CHANGELOG.md
index eec6f31..7563251 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.1.1
+
+* Fix a bug where listing an absolute glob with `caseInsensitive: false` failed.
+
 ## 1.1.0
 
 * Add a `caseSensitive` named parameter to `new Glob()` that controls whether
diff --git a/lib/src/list_tree.dart b/lib/src/list_tree.dart
index eff8c7b..57ed067 100644
--- a/lib/src/list_tree.dart
+++ b/lib/src/list_tree.dart
@@ -314,7 +314,7 @@
   Stream<FileSystemEntity> list(String dir, {bool followLinks: true}) {
     if (isRecursive) {
       return new Directory(dir).list(recursive: true, followLinks: followLinks)
-          .where((entity) => _matches(entity.path.substring(dir.length + 1)));
+          .where((entity) => _matches(p.relative(entity.path, from: dir)));
     }
 
     var resultPool = new StreamPool();
@@ -333,7 +333,7 @@
     var resultController = new StreamController(sync: true);
     resultPool.add(resultController.stream);
     new Directory(dir).list(followLinks: followLinks).listen((entity) {
-      var basename = entity.path.substring(dir.length + 1);
+      var basename = p.relative(entity.path, from: dir);
       if (_matches(basename)) resultController.add(entity);
 
       children.forEach((sequence, child) {
@@ -368,7 +368,7 @@
     if (isRecursive) {
       return new Directory(dir)
           .listSync(recursive: true, followLinks: followLinks)
-          .where((entity) => _matches(entity.path.substring(dir.length + 1)));
+          .where((entity) => _matches(p.relative(entity.path, from: dir)));
     }
 
     // Don't spawn extra [Directory.listSync] calls when we already know exactly
@@ -383,7 +383,7 @@
     return new Directory(dir).listSync(followLinks: followLinks)
         .expand((entity) {
       var entities = [];
-      var basename = entity.path.substring(dir.length + 1);
+      var basename = p.relative(entity.path, from: dir);
       if (_matches(basename)) entities.add(entity);
       if (entity is! Directory) return entities;
 
diff --git a/test/glob_test.dart b/test/glob_test.dart
index f82106a..4cbb453 100644
--- a/test/glob_test.dart
+++ b/test/glob_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:glob/glob.dart';
+import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 
 void main() {
diff --git a/test/list_test.dart b/test/list_test.dart
index 948af08..d59e273 100644
--- a/test/list_test.dart
+++ b/test/list_test.dart
@@ -275,6 +275,19 @@
       ])));
     });
 
+    // Regression test for #4.
+    test("lists an absolute case-insensitive glob", () {
+      expect(schedule(() {
+        var pattern = separatorToForwardSlash(
+            p.absolute(p.join(sandbox, 'foo/Baz/**')));
+
+        return list(pattern, caseSensitive: false);
+      }), completion(unorderedEquals([
+        p.join("foo", "baz", "bang"),
+        p.join("foo", "baz", "qux")
+      ])));
+    });
+
     test("lists a subdirectory that sometimes exists", () {
       d.dir("top", [
         d.dir("dir1", [