[Lldb-commits] [lldb] r266832 - llvm::sys::path::home_directory() relies on having "HOME" set in the environment and that might not always be set. Our FileSpec class uses this function to resolve any paths that start with "~/" on systems that support home directories as '~'. I have modified FileSpec::ResolveUsername (llvm::SmallVectorImpl<char> &path) to deal with the cases where llvm::sys::path::home_directory() returns false by digging a little further on unix systems and setting "HOME" in the environment so that sub...

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Tue Apr 19 16:37:02 PDT 2016


This is going to break the windows build, as getpwuid doesnt exist. Can you
wrap this?

As an aside, why not submit a patch to the llvm function instead, it makes
more sense there
On Tue, Apr 19, 2016 at 4:10 PM Greg Clayton via lldb-commits <
lldb-commits at lists.llvm.org> wrote:

> Author: gclayton
> Date: Tue Apr 19 18:04:35 2016
> New Revision: 266832
>
> URL: http://llvm.org/viewvc/llvm-project?rev=266832&view=rev
> Log:
> llvm::sys::path::home_directory() relies on having "HOME" set in the
> environment and that might not always be set. Our FileSpec class uses this
> function to resolve any paths that start with "~/" on systems that support
> home directories as '~'. I have modified FileSpec::ResolveUsername
> (llvm::SmallVectorImpl<char> &path) to deal with the cases where
> llvm::sys::path::home_directory() returns false by digging a little further
> on unix systems and setting "HOME" in the environment so that subsequent
> calls to llvm::sys::path::home_directory() will succeed.
>
> I also added a test to ensure we don't regress.
>
> <rdar://problem/25342377>
>
>
> Added:
>     lldb/trunk/packages/Python/lldbsuite/test/functionalities/llvm/
>
> lldb/trunk/packages/Python/lldbsuite/test/functionalities/llvm/TestLLVM.py
> Modified:
>     lldb/trunk/source/Host/common/FileSpec.cpp
>
> Added:
> lldb/trunk/packages/Python/lldbsuite/test/functionalities/llvm/TestLLVM.py
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/llvm/TestLLVM.py?rev=266832&view=auto
>
> ==============================================================================
> ---
> lldb/trunk/packages/Python/lldbsuite/test/functionalities/llvm/TestLLVM.py
> (added)
> +++
> lldb/trunk/packages/Python/lldbsuite/test/functionalities/llvm/TestLLVM.py
> Tue Apr 19 18:04:35 2016
> @@ -0,0 +1,60 @@
> +"""
> +Test lldb 'commands regex' command which allows the user to create a
> regular expression command.
> +"""
> +
> +from __future__ import print_function
> +
> +
> +
> +import os
> +import lldb
> +from lldbsuite.test.decorators import *
> +from lldbsuite.test.lldbtest import *
> +from lldbsuite.test import lldbutil
> +
> +class TestHomeDirectory(TestBase):
> +
> +    mydir = TestBase.compute_mydir(__file__)
> +
> +    @expectedFailureAll(oslist=["windows"])
> +    @no_debug_info_test
> +    def test_tilde_home_directory(self):
> +        """Test that we can resolve "~/" in paths correctly.
> +        When a path starts with "~/", we use
> llvm::sys::path::home_directory() to
> +        resolve the home directory. This currently relies on "HOME" being
> set in the
> +        environment. While this is usually set, we can't rely upon that.
> We might
> +        eventually get a fix into llvm::sys::path::home_directory() so it
> doesn't rely
> +        on having to have an environment variable set, but until then we
> have work around
> +        code in FileSpec::ResolveUsername (llvm::SmallVectorImpl<char>
> &path) to ensure
> +        this always works. This test tests that we get the correct answer
> for with and
> +        without "HOME" being set in the environment."""
> +        import pexpect
> +        prompt = "(lldb) "
> +
> +        child = pexpect.spawn('%s --no-use-colors %s' %
> (lldbtest_config.lldbExec, self.lldbOption))
> +        # Turn on logging for what the child sends back.
> +        if self.TraceOn():
> +            child.logfile_read = sys.stdout
> +        # So that the spawned lldb session gets shutdown durng teardown.
> +        self.child = child
> +
> +        # Resolve "~/." to the full path of our home directory + "/."
> +        if 'HOME' in os.environ:
> +            home_dir = os.environ['HOME']
> +            if self.TraceOn():
> +                print("home directory is: '%s'" % (home_dir))
> +            if os.path.exists(home_dir):
> +                home_dir_slash_dot = home_dir + '/.'
> +                child.expect_exact(prompt)
> +                child.sendline('''script str(lldb.SBFileSpec("~/.",
> True))''')
> +                child.expect_exact(home_dir)
> +                child.expect_exact(prompt)
> +                child.sendline('''script import os; os.unsetenv('HOME');
> str(lldb.SBFileSpec("~/", True))''');
> +                child.expect_exact(home_dir)
> +                child.expect_exact(prompt)
> +            elif self.TraceOn():
> +                print('''home directory "%s" doesn't exist, skipping home
> directory test''' % (home_dir))
> +        elif self.TraceOn():
> +            print('"HOME" not in environment, skipping home directory
> test')
> +
> +        child.sendline('quit')
>
> Modified: lldb/trunk/source/Host/common/FileSpec.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/FileSpec.cpp?rev=266832&r1=266831&r2=266832&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Host/common/FileSpec.cpp (original)
> +++ lldb/trunk/source/Host/common/FileSpec.cpp Tue Apr 19 18:04:35 2016
> @@ -185,8 +185,22 @@ FileSpec::ResolveUsername (llvm::SmallVe
>      {
>          // A path of ~/ resolves to the current user's home dir
>          llvm::SmallString<64> home_dir;
> +        // llvm::sys::path::home_directory() only checks if "HOME" is set
> in the
> +        // environment and does nothing else to locate the user home
> directory
>          if (!llvm::sys::path::home_directory(home_dir))
> -            return;
> +        {
> +            struct passwd *pw = getpwuid(getuid());
> +            if (pw && pw->pw_dir && pw->pw_dir[0])
> +            {
> +                // Update our environemnt so
> llvm::sys::path::home_directory() works next time
> +                setenv("HOME", pw->pw_dir, 0);
> +                home_dir.assign(llvm::StringRef(pw->pw_dir));
> +            }
> +            else
> +            {
> +                return;
> +            }
> +        }
>
>          // Overwrite the ~ with the first character of the homedir, and
> insert
>          // the rest.  This way we only trigger one move, whereas an insert
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160419/e76be7bf/attachment.html>


More information about the lldb-commits mailing list