summaryrefslogtreecommitdiff
path: root/lib/rubygems/package
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/package')
-rw-r--r--lib/rubygems/package/old.rb4
-rw-r--r--lib/rubygems/package/tar_reader/entry.rb8
-rw-r--r--lib/rubygems/package/tar_test_case.rb15
-rw-r--r--lib/rubygems/package/tar_writer.rb20
4 files changed, 40 insertions, 7 deletions
diff --git a/lib/rubygems/package/old.rb b/lib/rubygems/package/old.rb
index d7b228d893..bcf60a00c9 100644
--- a/lib/rubygems/package/old.rb
+++ b/lib/rubygems/package/old.rb
@@ -18,14 +18,14 @@ class Gem::Package::Old < Gem::Package
# Creates a new old-format package reader for +gem+. Old-format packages
# cannot be written.
- def initialize gem
+ def initialize gem, security_policy
require 'fileutils'
require 'zlib'
Gem.load_yaml
@contents = nil
@gem = gem
- @security_policy = nil
+ @security_policy = security_policy
@spec = nil
end
diff --git a/lib/rubygems/package/tar_reader/entry.rb b/lib/rubygems/package/tar_reader/entry.rb
index 737c7639c6..1d917a81ac 100644
--- a/lib/rubygems/package/tar_reader/entry.rb
+++ b/lib/rubygems/package/tar_reader/entry.rb
@@ -103,6 +103,13 @@ class Gem::Package::TarReader::Entry
end
##
+ # Is this tar entry a symlink?
+
+ def symlink?
+ @header.typeflag == "2"
+ end
+
+ ##
# The position in the tar entry
def pos
@@ -144,4 +151,3 @@ class Gem::Package::TarReader::Entry
end
end
-
diff --git a/lib/rubygems/package/tar_test_case.rb b/lib/rubygems/package/tar_test_case.rb
index 5253e32f36..b2d6f4ea77 100644
--- a/lib/rubygems/package/tar_test_case.rb
+++ b/lib/rubygems/package/tar_test_case.rb
@@ -71,7 +71,7 @@ class Gem::Package::TarTestCase < Gem::TestCase
SP(Z(to_oct(sum, 6)))
end
- def header(type, fname, dname, length, mode, mtime, checksum = nil)
+ def header(type, fname, dname, length, mode, mtime, checksum = nil, linkname = "")
checksum ||= " " * 8
arr = [ # struct tarfile_entry_posix
@@ -83,7 +83,7 @@ class Gem::Package::TarTestCase < Gem::TestCase
Z(to_oct(mtime, 11)), # char mtime[12]; 0 padded, octal, null
checksum, # char checksum[8]; 0 padded, octal, null, space
type, # char typeflag[1]; file: "0" dir: "5"
- "\0" * 100, # char linkname[100]; ASCII + (Z unless filled)
+ ASCIIZ(linkname, 100), # char linkname[100]; ASCII + (Z unless filled)
"ustar\0", # char magic[6]; "ustar\0"
"00", # char version[2]; "00"
ASCIIZ("wheel", 32), # char uname[32]; ASCIIZ
@@ -117,6 +117,12 @@ class Gem::Package::TarTestCase < Gem::TestCase
header("0", fname, dname, length, mode, mtime, checksum)
end
+ def tar_symlink_header(fname, prefix, mode, mtime, linkname)
+ h = header("2", fname, prefix, 0, mode, mtime, nil, linkname)
+ checksum = calc_checksum(h)
+ header("2", fname, prefix, 0, mode, mtime, checksum, linkname)
+ end
+
def to_oct(n, pad_size)
"%0#{pad_size}o" % n
end
@@ -133,5 +139,8 @@ class Gem::Package::TarTestCase < Gem::TestCase
util_entry tar_dir_header("foo", "bar", 0, Time.now)
end
-end
+ def util_symlink_entry
+ util_entry tar_symlink_header("foo", "bar", 0, Time.now, "link")
+ end
+end
diff --git a/lib/rubygems/package/tar_writer.rb b/lib/rubygems/package/tar_writer.rb
index dfd635724b..fff02e9235 100644
--- a/lib/rubygems/package/tar_writer.rb
+++ b/lib/rubygems/package/tar_writer.rb
@@ -234,6 +234,25 @@ class Gem::Package::TarWriter
end
##
+ # Adds symlink +name+ with permissions +mode+, linking to +target+.
+
+ def add_symlink(name, target, mode)
+ check_closed
+
+ name, prefix = split_name name
+
+ header = Gem::Package::TarHeader.new(:name => name, :mode => mode,
+ :size => 0, :typeflag => "2",
+ :linkname => target,
+ :prefix => prefix,
+ :mtime => Time.now).to_s
+
+ @io.write header
+
+ self
+ end
+
+ ##
# Raises IOError if the TarWriter is closed
def check_closed
@@ -323,4 +342,3 @@ class Gem::Package::TarWriter
end
end
-