You do realise that those files under sage/build/pkgs and sage/pkgs are actually symlinks to a single instance?
> On 15/04/2022, at 12:25, John H Palmieri <jhpalmier...@gmail.com> wrote: > > 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 combined) > > # 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. -- 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/24D0A04C-6AD9-42BC-A303-681D952247E1%40gmail.com.