API question: slashes and backslashes
Greg Ward
greg at gerg.ca
Fri Jun 11 15:32:39 CDT 2010
I'm hard at work trying to get bfiles working on Windows. I think my
biggest problem is that I just plain ignored the whole os.path.sep
issue -- I take filenames from dirstate or manifest and pass them to
the OS, and I naively expected filenames from the command line to make
sense in dirstate tests. The latter caused actual bugs, which I have
crudely fixed with
filename.replace(os.path.sep, '/')
in a few places, but that feels wrong.
The other thing that feels wrong is passing paths like
c:\src\myproject/.hgbfiles/bigfile
to the OS. Lucky for me Windows handles those paths, but I feel like
I'm skating on thin ice. I generally get those sort of paths from
repo.wjoin().
What's the right way? I've stumbled across util.pathto(), but it
doesn't feel like a general solution -- e.g. it's fine for taking a
path from the dirstate and generating an OS path, in certain
circumstances. Consider this code, a simplified excerpt from the
'bfremove' command (remove a big file as long as it's not modified):
modified1 = [...status of big files...]
modified2 = repo.status(...)
for standin in dirstate.walk(matcher): # e.g. ".hgbfiles/foo/bar"
filename = _split_standin(filename) # return "foo/bar"
if not (filename in modified1 or standin in modified2):
os.unlink(repo.wjoin(filename))
modified1, modified2, standin, and filename all use Unix slash,
because they are all based on dirstate. But then I need an actual
concrete filename that I can pass to os.unlink(), hence the
repo.wjoin() call. But that will return something like
c:\src\myproject\foo/bar
which is where I feel like I'm skating on thin ice. So what *should*
I pass to repo.wjoin(), if not a filename from dirstate?
Thanks --
Greg
More information about the Mercurial-devel
mailing list