[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...

Greg Clayton via lldb-commits lldb-commits at lists.llvm.org
Tue Apr 19 16:04:35 PDT 2016


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




More information about the lldb-commits mailing list