From b2472ccfd4a8f0bc27267beeb9d7a5b29ab9cbe4 Mon Sep 17 00:00:00 2001 From: Dave Vasilevsky Date: Mon, 4 May 2015 17:03:06 -0400 Subject: [PATCH] Path normalization demo If we want artifacts to be plain files (without requiring a server), we'll probably want human-readable paths. This is a demo of mangling config paths into human-readable ones. --- xxx.rb | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 xxx.rb diff --git a/xxx.rb b/xxx.rb new file mode 100644 index 0000000..8879ab9 --- /dev/null +++ b/xxx.rb @@ -0,0 +1,56 @@ +class Munger + Part = Struct.new(:type, :name) + + def initialize + @munged = {} + @parts = {} + end + + def add(path) + if m = @munged[path] + return m + end + + esc = path.gsub(/,/, ',,') # Escape commas + segments = esc.split(File::SEPARATOR) + @munged[path] = _add('', segments) + end + + def _add(pref, segments) + return pref if segments.empty? + + seg = segments.shift + seg += "/#{segments.shift}" while %r{^/*$}.match(seg) && !segments.empty? + type = segments.empty? ? :file : :dir + + suf = 0 + loop do + name = seg.gsub(%r{^/*}, '') + name += ",#{suf}" if !suf.zero? || seg.empty? + part = Part.new(type, seg) + path = pref.empty? ? name : File.join(pref, name) + canon = path.downcase + + @parts[canon] ||= part + return _add(path, segments) if @parts[canon] == part + + suf += 1 + end + end +end + +files = < %s" % [file, munged] +end