Index: subversion/clients/cmdline/util.c
===================================================================
--- subversion/clients/cmdline/SVN/text-base/util.c	Mon Sep 10 23:07:52 2001
+++ subversion/clients/cmdline/util.c	Wed Sep 19 21:05:13 2001
@@ -158,7 +158,6 @@
       svn_stringbuf_t *target = svn_stringbuf_create (os-argv[os-ind], pool);
       svn_stringbuf_t *basename;
 
-      svn_path_canonicalize (target, svn_path_local_style);
       basename = svn_path_last_component (target, svn_path_local_style, pool);
 
       /* If this target is not a Subversion administrative directory,
Index: subversion/include/svn_path.h
===================================================================
--- subversion/include/SVN/text-base/svn_path.h	Mon Sep 10 23:10:58 2001
+++ subversion/include/svn_path.h	Wed Sep 19 21:25:48 2001
@@ -111,9 +111,8 @@
 int svn_path_is_empty (const svn_stringbuf_t *path, enum svn_path_style style);
 
 
-/* Remove trailing separators that don't affect the meaning of the path.
-   (At some future point, this may make other semantically inoperative
-   transformations.) */
+/* Remove trailing separators and redundant portions of the path that don't 
+   affect its meaning. */
 void svn_path_canonicalize (svn_stringbuf_t *path,
                             enum svn_path_style style);
 
Index: subversion/libsvn_subr/path.c
===================================================================
--- subversion/libsvn_subr/SVN/text-base/path.c	Tue Sep 18 17:38:56 2001
+++ subversion/libsvn_subr/path.c	Wed Sep 19 20:55:17 2001
@@ -74,11 +74,28 @@
 {
   char dirsep = get_separator_from_style (style);
 
-  /* At some point this could eliminiate redundant components.
-     For now, it just makes sure there is no trailing slash. */
+  char sep_sep[3] = { dirsep, dirsep, '\0' };
+  char sep_dot_sep[0] = { dirsep, '.', dirsep, '\0' };
 
-  /* kff todo: maybe should be implemented with a new routine in
-     libsvn_string. */
+  char *str = NULL, *tmp = NULL;
+
+  if (style == svn_path_url_style || style == svn_path_repos_style) {
+    str = strstr (path-data, //);
+    if (str == NULL)
+      str = path-data;
+    else
+      str += 2;
+  } else {
+    str = path-data;
+  }
+
+  while ((tmp = strstr (str, sep_sep)) != NULL)
+    strcpy (tmp, tmp + 1);
+
+  while ((tmp = strstr (str, sep_dot_sep)) != NULL)
+    strcpy (tmp, tmp + 2);
+
+  path-len = strlen (path-data);
 
   while ((path-len  0)
           (path-data[(path-len - 1)] == dirsep))


