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