From 12d1a512ea7f23b6358931a66f23d835c2f3dfe9 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sat, 28 Jun 2014 15:39:48 -0700 Subject: [PATCH] Account for trailing / in URLs when determining on-disk location. Fixes #84. No tests because there's no preexisting network tests. --- src/cargo/sources/git/source.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/cargo/sources/git/source.rs b/src/cargo/sources/git/source.rs index c126fe2b4..2ecd0bcf1 100644 --- a/src/cargo/sources/git/source.rs +++ b/src/cargo/sources/git/source.rs @@ -67,7 +67,13 @@ fn ident(location: &Location) -> String { let last = path.components().last().unwrap(); str::from_utf8(last).unwrap().to_str() } - Remote(ref url) => url.path.as_slice().split('/').last().unwrap().to_str() + Remote(ref url) => { + // Remove the trailing '/' so that 'split' doesn't give us + // an empty string, making '../foo/' and '../foo' both + // result in the name 'foo' (#84) + let path = strip_trailing_slash(url.path.as_slice()); + path.split('/').last().unwrap().to_str() + } }; let ident = if ident.as_slice() == "" { @@ -79,6 +85,14 @@ fn ident(location: &Location) -> String { format!("{}-{}", ident, to_hex(hasher.hash(&location.to_str()))) } +fn strip_trailing_slash<'a>(path: &'a str) -> &'a str { + if path.as_bytes().last() != Some(&('/' as u8)) { + path.clone() + } else { + path.slice(0, path.len() - 1) + } +} + impl<'a, 'b> Show for GitSource<'a, 'b> { fn fmt(&self, f: &mut Formatter) -> fmt::Result { try!(write!(f, "git repo at {}", self.remote.get_location()));