I think your search is following some symbolic links: only three of these instances are under version control (git):
% git grep 'resolvelinks()' sage:resolvelinks() { src/bin/sage:resolvelinks() { src/bin/sage-env:resolvelinks() { The last one should probably have a comment in line with the first two. On Thursday, April 14, 2022 at 4:55:08 PM UTC-7 hohoa...@gmail.com wrote: > Hi, > > <quote> > Personally, I would rather see the time spent investigating whether or > not we truly need the symlink-free path in the instances where > resolvelinks() is currently used. I would guess not -- that there is a > better solution to whatever other problem prompted the resolvelinks() > function. But I don't know what that problem was. And to remove the > function and "see what happens" would be committing yourself to > answering bug reports from weird sage installs for the next twelve > months. > </quote> > > Now your concern is truly appreciated. > > "Find in File" in "Visual Studio Code" reveals duplications in* 24 files > in 13 directories* (please find the results appended below) > > It is amazing that SageMath is still maintainable up to now, release 9.6 > Maybe 'resolvelinks' is just the tip of an iceberg (something more > important is missing?) > > Best wishes, > > phiho > > *# Query: resolvelinks()* > # ContextLines: 1 > > 24 results - 24 files > > sage/sage: > 32 # meantime however the two should be kept synchronized. > 33: resolvelinks() { > 34 # $in is what still needs to be converted (normally has no > starting slash) > > sage/build/pkgs/sagelib/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > sage/build/pkgs/sagelib/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > sage/build/pkgs/sagemath_categories/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > sage/build/pkgs/sagemath_categories/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > sage/build/pkgs/sagemath_objects/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > sage/build/pkgs/sagemath_objects/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/build/scripts-3.10/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/build/scripts-3.10/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_categories/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_categories/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_objects/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_objects/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > sage/pkgs/sage-conf_pypi/sage_root/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > sage/pkgs/sagemath-categories/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > sage/pkgs/sagemath-categories/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > sage/pkgs/sagemath-objects/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > sage/pkgs/sagemath-objects/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > sage/pkgs/sagemath-standard/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > sage/pkgs/sagemath-standard/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > sage/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > sage/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > *# Query: resolvelinks* > # ContextLines: 1 > > 36 results - 24 files > > sage/sage: > 110 # resolved > 111: SAGE_ROOT=`resolvelinks "$0"` || \ > 112 SAGE_ROOT="$0" > > sage/build/pkgs/sagelib/src/bin/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/build/pkgs/sagelib/src/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/build/pkgs/sagemath_categories/src/bin/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/build/pkgs/sagemath_categories/src/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/build/pkgs/sagemath_objects/src/bin/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/build/pkgs/sagemath_objects/src/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/bin/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/build/scripts-3.10/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/build/scripts-3.10/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_categories/src/bin/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_categories/src/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_objects/src/bin/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_objects/src/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/pkgs/sage-conf_pypi/sage_root/src/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/pkgs/sagemath-categories/bin/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/pkgs/sagemath-categories/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/pkgs/sagemath-objects/bin/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/pkgs/sagemath-objects/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/pkgs/sagemath-standard/bin/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/pkgs/sagemath-standard/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/src/bin/sage: > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/src/bin/sage-env: > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > (*resolvelinks() * and *resolvelinks c*ombined) > > *# Query: resolvelinks* > # ContextLines: 1 > > 60 results - 24 files > > sage/sage: > 32 # meantime however the two should be kept synchronized. > 33: resolvelinks() { > 34 # $in is what still needs to be converted (normally has no > starting slash) > > 110 # resolved > 111: SAGE_ROOT=`resolvelinks "$0"` || \ > 112 SAGE_ROOT="$0" > > sage/build/pkgs/sagelib/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/build/pkgs/sagelib/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/build/pkgs/sagemath_categories/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/build/pkgs/sagemath_categories/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/build/pkgs/sagemath_objects/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/build/pkgs/sagemath_objects/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/build/scripts-3.10/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagelib/src/build/scripts-3.10/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_categories/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_categories/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_objects/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > > sage/pkgs/sage-conf_pypi/sage_root/build/pkgs/sagemath_objects/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/pkgs/sage-conf_pypi/sage_root/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/pkgs/sagemath-categories/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/pkgs/sagemath-categories/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/pkgs/sagemath-objects/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/pkgs/sagemath-objects/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/pkgs/sagemath-standard/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/pkgs/sagemath-standard/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > sage/src/bin/sage: > 4 # the top-level "sage" script. Please keep them synchronized. > 5: resolvelinks() { > 6 # $in is what still needs to be converted (normally has no > starting slash) > > 80 # a symlink (Trac #30888). > 81: SELF=$(resolvelinks "${0}") > 82 > > sage/src/bin/sage-env: > 35 # > 36: resolvelinks() { > 37 # $in is what still needs to be converted (normally has no > starting slash) > > 338 # non-existing directory. > 339: DOT_SAGE=`resolvelinks "$HOME/.sage"` > 340 > > 630 # The activate script needs to be sourced using its actual > path. > 631: nodeenv_activate=`resolvelinks "$nodeenv_activate"` > 632 > > > On Wed, Apr 13, 2022 at 11:21 PM Michael Orlitzky <mic...@orlitzky.com> > wrote: > >> On Wed, 2022-04-13 at 19:36 -0700, ph h wrote: >> > Dear All, >> > >> > At the top of 'sage/src/bin/sage' script: >> > >> > <quote> >> > # WARNING: this function is copy/pasted from both src/bin/sage-env and >> > # the top-level "sage" script. Please keep them synchronized. >> > resolvelinks() { >> > </quote> >> > >> > Is there any other way to keep them in sync without using Copy&Paste? >> > >> >> I think I'm at least partly responsible for that. There are a few ways >> we could de-duplicate those scripts, but it's not clear that any of >> them are less complex or easier to maintain than copy/paste for now. >> >> Personally, I would rather see the time spent investigating whether or >> not we truly need the symlink-free path in the instances where >> resolvelinks() is currently used. I would guess not -- that there is a >> better solution to whatever other problem prompted the resolvelinks() >> function. But I don't know what that problem was. And to remove the >> function and "see what happens" would be committing yourself to >> answering bug reports from weird sage installs for the next twelve >> months. >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sage-devel" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to sage-devel+...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/sage-devel/2deae4f7c986bad7542756d2ff32189f99d2a7db.camel%40orlitzky.com >> . >> > -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-devel/2f6814e0-701b-4c55-a119-e49d94ecf5can%40googlegroups.com.