Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Unified Diff: utils/pub/path.dart

Issue 11512011: Handle relative paths where the trailing directory has an extension. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix merge bug. Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | utils/tests/pub/path/path_posix_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: utils/pub/path.dart
diff --git a/utils/pub/path.dart b/utils/pub/path.dart
index 3f36b862baa4b35d4451567c259761ecafe22eaf..d803fd17075726750cd3c559d4731ff6478af52b 100644
--- a/utils/pub/path.dart
+++ b/utils/pub/path.dart
@@ -334,7 +334,12 @@ class Builder {
/// builder.withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
String withoutExtension(String path) {
var parsed = _parse(path);
- parsed.extension = null;
+ if (parsed.hasTrailingSeparator) return parsed.toString();
+
+ if (!parsed.parts.isEmpty) {
+ parsed.parts[parsed.parts.length - 1] = parsed.basenameWithoutExtension;
+ }
+
return parsed.toString();
}
@@ -361,22 +366,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);
}
}
@@ -438,16 +428,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 {
@@ -458,21 +447,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 basename {
if (parts.length == 0) return extension;
if (hasTrailingSeparator) return '';
- return '${parts.last}$extension';
- }
-
- String get basenameWithoutExtension {
- if (parts.length == 0) return '';
- if (hasTrailingSeparator) return '';
return parts.last;
}
+ String get basenameWithoutExtension => _splitExtension()[0];
+
void removeTrailingSeparator() {
if (separators.length > 0) {
separators[separators.length - 1] = '';
@@ -524,10 +508,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 no dot, or it's the first character, like '.bashrc', it
+ // doesn't count.
+ if (lastDot <= 0) return [file, ''];
+
+ return [file.substring(0, lastDot), file.substring(lastDot)];
+ }
}
« no previous file with comments | « no previous file | utils/tests/pub/path/path_posix_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698