On Sat, Dec 05, 2009 at 06:00:53PM +0100, ??t??p??n N??mec wrote: > I'm not sure about the exact purpose of this function, but it doesn't > seem correct to me: Yes, my code requires some explanations. $what is the file we got from "git tree-index" or "git ls-files --full-name -- $(git rev-parse --show-cdup)", we can assume it's a full path from the root of repository. $to is the path we got from "git rev-parse --show-prefix". what=( ${(s:/:)"${${${${1//\/\///}//\/.\///}%%/.}%%/}"} ) to=( ${(s:/:)"${${${${2//\/\///}//\/.\///}%%/.}%%/}"} ) Some paranoid code that strips "/./", converts multiple slashes to one and strips "/." and "/" from right. Then path is split to components for easier processing. BTW, if prefix is empty string, $to will be equal to ( "" ) which will add unneeded "../" later (my bug). while (( $#what > 0 )) && (( $#to > 0 )) && [[ $what[1] == $to[1] ]]; do what[1]=() to[1]=() done This loop strips common prefix from $what and $to, we wont need it in relative path. while (( $#to > 0 )); do res+=.. to[1]=() done For each path component left in $to ascend one level up. res=( "$res[@]" "$what[@]" ) Add path components left in $what. > It is not unlikely to have more same-named directories in different > parts of directory tree. IIUC, the code above won't always work > correctly in such situation (i.e. it will remove the directory from the > path, wrongly assuming it is the same directory for both paths). No, first loop will only remove prefix common for both paths. > I believe the only correct way to solve the path relativization problem > for arbitrary input is to use the *absolute* paths. These paths _are_ absolute since it is impossible to ascend outside of git repository. Hope we can assume so ;-) > In any case, it would be more useful/comprehensible (to me at least) if > you included the solution with the former patch to solve the actual > problem. A bit later. -- Regards, Sir Raorn.
Attachment:
signature.asc
Description: Digital signature