Index: utils/pub/path.dart |
diff --git a/utils/pub/path.dart b/utils/pub/path.dart |
index 3b889d380654bd50e2d75c97e3e8f3e5964bfc15..19a5a62ee09252695732b845aa2717ef1550c201 100644 |
--- a/utils/pub/path.dart |
+++ b/utils/pub/path.dart |
@@ -312,14 +312,15 @@ class Builder { |
/// |
/// builder.withoutExtension('path/to/foo.dart'); // -> 'path/to/foo' |
String withoutExtension(String path) { |
- var lastSeparator = path.lastIndexOf(separator); |
- var lastDot = path.lastIndexOf('.'); |
+ var parsed = _parse(path); |
+ if (parsed.hasTrailingSeparator) return parsed.toString(); |
nweiz
2012/12/11 02:09:42
I really don't like changing behavior based on whe
Bob Nystrom
2012/12/11 02:24:59
This is how Python works. I think it would be conf
nweiz
2012/12/11 02:34:46
But not Ruby :).
Bob Nystrom
2012/12/11 02:47:01
I'm more interested here in what dirname("foo/bar/
|
- // Ignore '.' in anything but the last component. |
- if (lastSeparator != -1 && lastDot <= lastSeparator + 1) lastDot = -1; |
+ if (!parsed.parts.isEmpty) { |
+ var split = parsed._splitExtension(); |
+ parsed.parts[parsed.parts.length - 1] = split[0]; |
nweiz
2012/12/11 02:09:42
Calling a private method here seems like a code sm
Bob Nystrom
2012/12/11 02:24:59
Done, though I don't think there's anything wrong
|
+ } |
- if (lastDot <= 0) return path; |
- return path.substring(0, lastDot); |
+ return parsed.toString(); |
} |
_ParsedPath _parse(String path) { |
@@ -345,22 +346,7 @@ class Builder { |
separators.add(''); |
} |
- // Separate out the file extension. |
- var extension = ''; |
- if (parts.length > 0) { |
- var file = parts.last; |
- if (file != '..') { |
- var lastDot = file.lastIndexOf('.'); |
- |
- // If there is a dot (and it's not the first character, like '.bashrc'). |
- if (lastDot > 0) { |
- parts[parts.length - 1] = file.substring(0, lastDot); |
- extension = file.substring(lastDot); |
- } |
- } |
- } |
- |
- return new _ParsedPath(style, root, parts, separators, extension); |
+ return new _ParsedPath(style, root, parts, separators); |
} |
} |
@@ -419,16 +405,15 @@ class _ParsedPath { |
String root; |
/// The path-separated parts of the path. All but the last will be |
- /// directories. The last could be a directory, or could be the file name |
- /// without its extension. |
+ /// directories. |
List<String> parts; |
/// The path separators following each part. The last one will be an empty |
/// string unless the path ends with a trailing separator. |
List<String> separators; |
- /// The file's extension, or "" if it doesn't have one. |
- String extension; |
+ /// The file extension of the last part, or "" if it doesn't have one. |
+ String get extension => _splitExtension()[1]; |
/// `true` if the path ends with a trailing separator. |
bool get hasTrailingSeparator { |
@@ -439,21 +424,16 @@ class _ParsedPath { |
/// `true` if this is an absolute path. |
bool get isAbsolute => root != null; |
- _ParsedPath(this.style, this.root, this.parts, this.separators, |
- this.extension); |
+ _ParsedPath(this.style, this.root, this.parts, this.separators); |
String get filename { |
- if (parts.length == 0) return extension; |
- if (hasTrailingSeparator) return ''; |
- return '${parts.last}$extension'; |
- } |
- |
- String get filenameWithoutExtension { |
- if (parts.length == 0) return ''; |
+ if (parts.isEmpty) return ''; |
if (hasTrailingSeparator) return ''; |
return parts.last; |
} |
+ String get filenameWithoutExtension => _splitExtension()[0]; |
+ |
void removeTrailingSeparator() { |
if (separators.length > 0) { |
separators[separators.length - 1] = ''; |
@@ -505,10 +485,28 @@ class _ParsedPath { |
if (root != null) builder.add(root); |
for (var i = 0; i < parts.length; i++) { |
builder.add(parts[i]); |
- if (extension != null && i == parts.length - 1) builder.add(extension); |
builder.add(separators[i]); |
} |
return builder.toString(); |
} |
+ |
+ /// Splits the last part of the path into a two-element list. The first is |
+ /// the name of the file without any extension. The second is the extension |
+ /// or "" if it has none. |
+ List<String> _splitExtension() { |
+ if (parts.isEmpty) return ['', '']; |
+ if (hasTrailingSeparator) return ['', '']; |
+ |
+ var file = parts.last; |
+ if (file == '..') return ['..', '']; |
+ |
+ var lastDot = file.lastIndexOf('.'); |
+ |
+ // If there is a dot (and it's not the first character, like '.bashrc'). |
nweiz
2012/12/11 02:09:42
This looks like it's supposed to go a couple lines
Bob Nystrom
2012/12/11 02:24:59
Reworded the comment.
|
+ if (lastDot <= 0) return [file, '']; |
+ |
+ parts[parts.length - 1] = file.substring(0, lastDot); |
nweiz
2012/12/11 02:09:42
Why is this useful? Doesn't this mean that calling
Bob Nystrom
2012/12/11 02:24:59
Eek! Copy/paste bug. Removed.
|
+ return [file.substring(0, lastDot), file.substring(lastDot)]; |
+ } |
} |