From 54045c2e44fb014082e1d770afd0be9e8faadc32 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 7 Apr 2008 19:40:52 +0000 Subject: [PATCH] * Explicitly support source paths with a leaf name "." or "..". In this case the contents of the directory shall be copied into the target directory, not the source directory itself. This is actually a feature the build system uses for installing in a directory, but I've only ever tested it under Linux and there a bug in libbe_build made it work automatically. Fixes #2036. * Removed copy and paste left-over for the "-x" and "-X" options. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24859 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/bin/copyattr.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/bin/copyattr.cpp b/src/bin/copyattr.cpp index 690696c2aa..e01af577d0 100644 --- a/src/bin/copyattr.cpp +++ b/src/bin/copyattr.cpp @@ -559,7 +559,32 @@ copy_files(const char **sourcePaths, int sourceCount, // iterate through the source files for (int i = 0; i < sourceCount; i++) { const char *sourcePath = sourcePaths[i]; + // If the destination is a directory, we usually want to copy the + // sources into it. The user might have specified a source path ending + // in "/." or "/.." however, in which case we copy the contents of the + // given directory. + bool copySourceContentsOnly = false; if (destIsDir) { + // skip trailing '/'s + int sourceLen = strlen(sourcePath); + while (sourceLen > 1 && sourcePath[sourceLen - 1] == '/') + sourceLen--; + + // find the start of the leaf name + int leafStart = sourceLen; + while (leafStart > 0 && sourcePath[leafStart - 1] != '/') + leafStart--; + + // If the path is the root directory or the leaf is "." or "..", + // we copy the contents only. + int leafLen = sourceLen - leafStart; + if (leafLen == 0 || leafLen <= 2 + && strncmp(sourcePath + leafStart, "..", leafLen) == 0) { + copySourceContentsOnly = true; + } + } + + if (destIsDir && !copySourceContentsOnly) { // construct a usable destination entry path // normalize source path BPath normalizedSourcePath; @@ -640,10 +665,10 @@ main(int argc, const char *const *argv) || strcmp(arg, "--verbose") == 0) { parameters.verbose = true; - } else if (strcmp(arg, "-x") == 0 || strcmp(arg, "--type") == 0) { + } else if (strcmp(arg, "-x") == 0) { parameters.entry_filter.AddExcludeFilter(next_arg(argi), true); - } else if (strcmp(arg, "-X") == 0 || strcmp(arg, "--type") == 0) { + } else if (strcmp(arg, "-X") == 0) { parameters.entry_filter.AddExcludeFilter(next_arg(argi), false); } else if (strcmp(arg, "-") == 0 || strcmp(arg, "--") == 0) {