aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems/package/tar_writer.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/package/tar_writer.rb')
-rw-r--r--lib/rubygems/package/tar_writer.rb26
1 files changed, 10 insertions, 16 deletions
diff --git a/lib/rubygems/package/tar_writer.rb b/lib/rubygems/package/tar_writer.rb
index ab0313c9f8..f68b8d4c5e 100644
--- a/lib/rubygems/package/tar_writer.rb
+++ b/lib/rubygems/package/tar_writer.rb
@@ -310,27 +310,21 @@ class Gem::Package::TarWriter
# Splits +name+ into a name and prefix that can fit in the TarHeader
def split_name(name) # :nodoc:
- if name.bytesize > 256
+ if name.bytesize > 256 then
raise Gem::Package::TooLongFileName.new("File \"#{name}\" has a too long path (should be 256 or less)")
end
- if name.bytesize <= 100 then
- prefix = ""
- else
- parts = name.split(/\//)
- newname = parts.pop
- nxt = ""
-
- loop do
- nxt = parts.pop
- break if newname.bytesize + 1 + nxt.bytesize > 100
- newname = nxt + "/" + newname
+ prefix = ''
+ if name.bytesize > 100 then
+ parts = name.split('/', -1) # parts are never empty here
+ name = parts.pop # initially empty for names with a trailing slash ("foo/.../bar/")
+ prefix = parts.join('/') # if empty, then it's impossible to split (parts is empty too)
+ while !parts.empty? && (prefix.bytesize > 155 || name.empty?)
+ name = parts.pop + '/' + name
+ prefix = parts.join('/')
end
- prefix = (parts + [nxt]).join "/"
- name = newname
-
- if name.bytesize > 100
+ if name.bytesize > 100 or prefix.empty? then
raise Gem::Package::TooLongFileName.new("File \"#{prefix}/#{name}\" has a too long name (should be 100 or less)")
end