labath added inline comments.

================
Comment at: source/Utility/FileSpec.cpp:406
+      m_directory.Clear();
+  }
 }
----------------
clayborg wrote:
> labath wrote:
> > clayborg wrote:
> > > > they resolve to the same file in a virtual filesystem, where all 
> > > > referenced path components exist and are directories
> > > 
> > > Normalizing happens after resolving and if we don't resolve a path, we 
> > > have no way to know what is a directory and what isn't. We will be 
> > > setting breakpoints for remote targets quite a bit in LLDB and ww can't 
> > > assume or stat anything in a path. So I would say FileSpec's are 
> > > equivalent if the relative paths match all components.
> > > 
> > > > Now the (c) part would imply that foo/.. should normalize to ./. and 
> > > > not ., which is a bit odd, but it is consistent with our stated 
> > > > intention of preserving directory information. If we do not want to 
> > > > have ./. here, then we need to come up with a different definition of 
> > > > what it means to be "normalized".
> > > 
> > > I guess we could make the  m_directory contain "." and m_filename contain 
> > > nothing for the "./." case. It doesn 't make  sense to have "." in both 
> > > places.
> > >> they resolve to the same file in a virtual filesystem, where all 
> > >> referenced path components exist and are directories
> > 
> > > Normalizing happens after resolving and if we don't resolve a path, we 
> > > have no way to know what is a directory and what isn't. We will be 
> > > setting breakpoints for remote targets quite a bit in LLDB and ww can't 
> > > assume or stat anything in a path.
> > 
> > Yes, I am aware of that. I am not saying this is how we should actually 
> > implement the normalization algorithm. I am trying define what a 
> > "normalization" is in the first place, so that we can then judge whether a 
> > particular normalization algorithm is good or not. I think defining 
> > normalization in terms of an actual filesystem makes sense, since at the 
> > end of the day, our algorithm should somehow approximate what happens in 
> > real file systems. I am not saying the algorithm should be doing any stats, 
> > but for the verification (either in our heads or in the tests) we can use 
> > certainly use stats or actual file systems.
> > 
> > > So I would say FileSpec's are equivalent if the relative paths match all 
> > > components.
> > 
> > This is too vague to be useful. I have no idea how I would apply this 
> > definition to determine if e.g. "/foo/../bar.txt" and "./bar.txt" are 
> > equivalent. And you didn't say anything about how to derive the normal form 
> > for a `FileSpec`.
> > 
> > >> Now the (c) part would imply that foo/.. should normalize to ./. and not 
> > >> ., which is a bit odd, but it is consistent with our stated intention of 
> > >> preserving directory information. If we do not want to have ./. here, 
> > >> then we need to come up with a different definition of what it means to 
> > >> be "normalized".
> > 
> > > I guess we could make the m_directory contain "." and m_filename contain 
> > > nothing for the "./." case. It doesn 't make sense to have "." in both 
> > > places.
> > 
> > I don't think that is very useful, as then this would be the only special 
> > case where normalization would produce a FileSpec without a filename 
> > component.
> >> So I would say FileSpec's are equivalent if the relative paths match all 
> >> components.
> 
> > This is too vague to be useful. I have no idea how I would apply this 
> > definition to determine if e.g. "/foo/../bar.txt" and "./bar.txt" are 
> > equivalent. And you didn't say anything about how to derive the normal form 
> > for a FileSpec.
> 
> "/foo/../bar.txt" would be normalized to "/bar.txt" and "./bar.txt" will, 
> after switching to llvm's remove_dots, be normalized to "bar.txt". So those 
> could be though of as equivalent since one is only a basename and would only 
> need to match the filename. If you have "/foo/bar/baz.txt", it could be 
> equivalent to "bar/baz.txt" by making sure the filename's match, and if 
> either or both path is relative, then matching as many directories as are 
> specified.
> 
> 
> >> I guess we could make the m_directory contain "." and m_filename contain 
> >> nothing for the "./." case. It doesn 't make sense to have "." in both 
> >> places.
> 
> > I don't think that is very useful, as then this would be the only special 
> > case where normalization would produce a FileSpec without a filename 
> > component.
> 
> Ok, then leave it as is with "." in filename, not directory. We don't need it 
> in both places IMHO
Ok, if we start using llvm's `remove_dots` as our normalization algorithm, then 
both of these issues will become moot (and I believe I have a fairly good 
understanding of how `remove_dots` works).


================
Comment at: source/Utility/FileSpec.cpp:857
+        !IsPathSeparator(components[i].back(), syntax) &&
+        (result.empty() || !IsPathSeparator(result.back(), syntax)))
       result += GetPreferredPathSeparator(syntax);
----------------
clayborg wrote:
> labath wrote:
> > clayborg wrote:
> > > labath wrote:
> > > > Why is this necessary? `result` can't be empty because we have just 
> > > > appended something to it (and we've checked that `components[i]` is 
> > > > non-empty).
> > > Because if you don't check this joining {"/', "foo.txt"} will result in 
> > > "//foo.txt" which is wrong,.
> > Yes, but didn't the original condition guard against that already?
> > 
> > We know that `components[i]` is non-empty, and we have just appended it to 
> > `result` two lines above. So, unless I am missing something, 
> > `result.back()` should be the same as `components[i].back()` and this 
> > additional check does not buy us anything.
> I did not. During testing I found this case and "/" + "main.c" was producing 
> "//main.c"
I've just tried calling `join_path_components(ePathSyntaxPosix, {"/", 
"main.c"})`, and it produced `/main.c` even without your modifications.


https://reviews.llvm.org/D45977



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to