Temporary tag for this failure. Updated CI spec coming.
[rbx.git] / kernel / platform / file.rb
blobe8fc3f24ba332f3d8b3ffd8513b03906450d82a4
1 # depends on: ffi.rb
3 module Platform::File
4   SEPARATOR = '/'
5   ALT_SEPARATOR = nil
6   PATH_SEPARATOR = ':'
8   def self.dirname(path)
9     if(!path.match(/#{SEPARATOR}/) || path.match(/^\.+#{SEPARATOR}+$/))
10       return "."
11     else
12       # strip the basename off the end and clean up the ending separators
13       path = path.sub(/#{SEPARATOR}*[^#{SEPARATOR}]*#{SEPARATOR}*$/,'')
14       if(path == '')
15         return SEPARATOR
16       else
17         return path
18       end
19     end
20   end
22   def self.basename(path,ext)      
23     path.gsub!(/([^#{SEPARATOR}])#{SEPARATOR}\z/, "\\1")
24     basename = if(m = path.match(/#{SEPARATOR}+([^#{SEPARATOR}]*)#{SEPARATOR}*$/))
25                  m[1] == '' ? SEPARATOR : m[1]
26                else
27                  path
28                end
29     ext = Regexp.quote(ext) # convert everything to literal characters
30     ext.sub!(/\\\*/,'[^\.]+?') # convert .*'s back into a general match expression
31     return basename.sub(/#{ext}$/,'')
32   end
34   # FIXME: this is awful
35   def self.expand_path(path, dir_string = nil)
36     path = StringValue(path)
37     if(dir_string.nil?)
38       dir_string = Dir.pwd
39     else
40       dir_string = StringValue(dir_string)
41     end
43     path.gsub!(/~(#{ENV['USER']})/, "~/")
45     raise ArgumentError, "user #{path}" if path.match(/~([^\/])/)
47     if(dir_string.empty?)
48       dir_string = Dir.pwd
49     elsif(dir_string[0].chr == '~')
50       dir_string = ENV['HOME'] + dir_string[1..-1]
51     elsif(dir_string[0].chr != '/')
52       dir_string = Dir.pwd + "/" + dir_string
53     end
55     dirs = path.split('/')
56     if path == '' || (dirs.empty? && path[0].chr != '/')
57       return dir_string
58     else
59       first = case dirs.first
60               when '..'; dir_string.split('/')[0...-1].join('/')
61               when '~'; ENV['HOME']
62               when '.'; dir_string
63               when ''; '/'
64               when nil;
65                 match = /(\/+)/.match(path)
66                 prefix = match[0] if match
67                 ''
68               else
69                 dir_string + '/' + dirs.first
70               end
72       dirs.shift
73       paths = first.split('/')
74       dirs.each do |dir|
75         next if dir == '.' || dir == ''
76         dir == '..' ? paths.pop : paths.push(dir)
77       end
78       string = paths.empty? ? '' : paths.join("/")
79       return !string.empty? && string[0].chr == '/' ? string : prefix || '/' +string
80     end
81   end
82 end