Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
bea32eafdb | ||
|
603d5bcb0d | ||
|
0a36cfbd1b | ||
|
b75ade43da | ||
|
581a67640d | ||
|
bbb75e646f | ||
|
f6e0b7bfc3 | ||
|
0626aac23a | ||
|
de154d4802 | ||
|
9b01046539 | ||
|
70c675d663 | ||
|
04a81668f1 | ||
|
c250b79137 | ||
|
6442d2b1c2 | ||
|
ac48241710 | ||
|
bca35bc20f | ||
|
92d5fbdb7d | ||
|
43f0bad6ce |
9
.gitignore
vendored
9
.gitignore
vendored
@ -1,4 +1,5 @@
|
||||
/*/
|
||||
/ruby-2.*.tar.bz2
|
||||
/ruby-2.*.tar.xz
|
||||
/*.rpm
|
||||
ruby-1.8.6-p388.tar.bz2
|
||||
ruby-refm-rdp-1.8.2-ja-html.tar.gz
|
||||
rubyfaq-990927.tar.gz
|
||||
rubyfaq-jp-990927.tar.gz
|
||||
ruby-1.8.6-p399.tar.bz2
|
||||
|
488
irb.1
Normal file
488
irb.1
Normal file
@ -0,0 +1,488 @@
|
||||
.\" DO NOT MODIFY THIS FILE! it was generated by rd2
|
||||
.TH irb-beta 1 "May 2001"
|
||||
.SH What is irb?
|
||||
.PP
|
||||
irb stands for `interactive ruby'. irb is a tool to execute interactively
|
||||
ruby expressions read from stdin.
|
||||
.SH Invoking
|
||||
.PP
|
||||
.nf
|
||||
\& % ruby \-r irb \-e0
|
||||
\& % irb
|
||||
.fi
|
||||
Either of the aboves. In the former style, options can be specified
|
||||
as follows:
|
||||
.nf
|
||||
\& % ruby \-r irb \-e0 \-\- \-v
|
||||
.fi
|
||||
.SH Usage
|
||||
.PP
|
||||
Use of irb is easy if you know ruby. Executing irb, prompts are
|
||||
displayed as follows. Then, enter expression of ruby. A input is
|
||||
executed when it is syntacticaly completed.
|
||||
.nf
|
||||
\& dim% irb
|
||||
\& irb(main):001:0> 1+2
|
||||
\& 3
|
||||
\& irb(main):002:0> class Foo
|
||||
\& irb(main):003:1> def foo
|
||||
\& irb(main):004:2> print 1
|
||||
\& irb(main):005:2> end
|
||||
\& irb(main):006:1> end
|
||||
\& nil
|
||||
\& irb(main):007:0>
|
||||
.fi
|
||||
And, Readline extesion module can be used with irb. Using Readline
|
||||
is the standard default action if Readline is installed.
|
||||
.SH Command line option
|
||||
.PP
|
||||
.nf
|
||||
\& irb.rb [options] file_name opts
|
||||
\& options:
|
||||
\& \-f suppress read ~/.irbrc
|
||||
\& \-m bc mode (fraction or matrix are available)
|
||||
\& \-d set $DEBUG to true (same as `ruby \-d')
|
||||
\& \-r load\-module same as `ruby \-r'
|
||||
\& \-\-inspect uses `inspect' for output (the default except bc mode)
|
||||
\& \-\-noinspect doesn't uses inspect for output
|
||||
\& \-\-readline uses Readline extension module
|
||||
\& \-\-noreadline doesn't use Readline extension module
|
||||
\& \-\-prompt prompt\-mode
|
||||
\& \-\-prompt\-mode prompt\-mode
|
||||
.fi
|
||||
.nf
|
||||
\& switches prompt mode. Pre\-defined prompt modes are
|
||||
\& `defalut', `simple', `xmp' and `inf\-ruby'
|
||||
.fi
|
||||
.nf
|
||||
\& \-\-inf\-ruby\-mode uses prompt appreciate for inf\-ruby\-mode on emacs.
|
||||
.fi
|
||||
.nf
|
||||
\& Suppresses \-\-readline.
|
||||
.fi
|
||||
.nf
|
||||
\& \-\-simple\-prompt simple prompt mode
|
||||
\& \-\-noprompt no prompt
|
||||
\& \-\-tracer display trace for each execution of commands.
|
||||
\& \-\-back\-trace\-limit n
|
||||
.fi
|
||||
.nf
|
||||
\& displayes backtrace top n and tail n. The default
|
||||
\& value is 16.
|
||||
.fi
|
||||
.nf
|
||||
\& \-\-irb_debug n sets internal debug level to n (It shouldn't be used)
|
||||
\& \-v, \-\-version prints the version of irb
|
||||
.fi
|
||||
.SH Configurations
|
||||
.PP
|
||||
irb reads `~/.irbrc' when it is invoked. If `~/.irbrb' doesn't exist
|
||||
irb try to read in the order `.irbrc', `irb.rc', `_irbrc' then `$irbrc'.
|
||||
The following is altanative to the command line option. To use them
|
||||
type as follows in an irb session.
|
||||
.nf
|
||||
\& IRB.conf[:IRB_NAME]="irb"
|
||||
\& IRB.conf[:MATH_MODE]=false
|
||||
\& IRB.conf[:USE_TRACER]=false
|
||||
\& IRB.conf[:USE_LOADER]=false
|
||||
\& IRB.conf[:IGNORE_SIGINT]=true
|
||||
\& IRB.conf[:IGNORE_EOF]=false
|
||||
\& IRB.conf[:INSPECT_MODE]=nil
|
||||
\& IRB.conf[:IRB_RC] = nil
|
||||
\& IRB.conf[:BACK_TRACE_LIMIT]=16
|
||||
\& IRB.conf[:USE_LOADER] = false
|
||||
\& IRB.conf[:USE_READLINE] = nil
|
||||
\& IRB.conf[:USE_TRACER] = false
|
||||
\& IRB.conf[:IGNORE_SIGINT] = true
|
||||
\& IRB.conf[:IGNORE_EOF] = false
|
||||
\& IRB.conf[:PROMPT_MODE] = :DEFALUT
|
||||
\& IRB.conf[:PROMPT] = {...}
|
||||
\& IRB.conf[:DEBUG_LEVEL]=0
|
||||
\& IRB.conf[:VERBOSE]=true
|
||||
.fi
|
||||
.SH Customizing prompt
|
||||
.PP
|
||||
To costomize the prompt you set a variable
|
||||
.nf
|
||||
\& IRB.conf[:PROMPT]
|
||||
.fi
|
||||
For example, describe as follows in `.irbrc'.
|
||||
.nf
|
||||
\& IRB.conf[:PROMPT][:MY_PROMPT] = { # name of prompt mode
|
||||
\& :PROMPT_I => nil, # normal prompt
|
||||
\& :PROMPT_S => nil, # prompt for continuated strings
|
||||
\& :PROMPT_C => nil, # prompt for continuated statement
|
||||
\& :RETURN => " ==>%s\\n" # format to return value
|
||||
\& }
|
||||
.fi
|
||||
Then, invoke irb with the above prompt mode by
|
||||
.nf
|
||||
\& % irb \-\-prompt my\-prompt
|
||||
.fi
|
||||
Or add the following in `.irbrc'.
|
||||
.nf
|
||||
\& IRB.conf[:PROMPT_MODE] = :MY_PROMPT
|
||||
.fi
|
||||
Constants PROMPT_I, PROMPT_S and PROMPT_C specifies the format.
|
||||
In the prompt specification, some special strings are available.
|
||||
.nf
|
||||
\& %N command name which is running
|
||||
\& %m to_s of main object (self)
|
||||
\& %M inspect of main object (self)
|
||||
\& %l type of string(", ', /, ]), `]' is inner %w[...]
|
||||
\& %NNi indent level. NN is degits and means as same as printf("%NNd").
|
||||
\& It can be ommited
|
||||
\& %NNn line number.
|
||||
\& %% %
|
||||
.fi
|
||||
For instance, the default prompt mode is defined as follows:
|
||||
IRB.conf[:PROMPT_MODE][:DEFAULT] = {
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
PROMPT_I => "%N(%m):%03n:%i> ",
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
PROMPT_S => "%N(%m):%03n:%i%l ",
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
PROMPT_C => "%N(%m):%03n:%i* ",
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
RETURN => "%s\\n"
|
||||
}
|
||||
RETURN is used to printf.
|
||||
.SH Configurating subirb
|
||||
.PP
|
||||
The command line option or IRB.conf specify the default behavior of
|
||||
(sub)irb. On the other hand, each conf of in the next sction `6. Command'
|
||||
is used to individually configurate (sub)irb.
|
||||
If proc is set to IRB.conf[:IRB_RC], its subirb will be invoked after
|
||||
execution of that proc under giving the context of irb as its
|
||||
aregument. By this mechanism each subirb can be configurated.
|
||||
.SH Command
|
||||
.PP
|
||||
For irb commands, both simple name and `irb_'\-prefixed name are prepared.
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
exit, quit, irb_exit
|
||||
Quits (sub)irb.
|
||||
if you've done cb (see below), exit from the binding mode.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf, irb_context
|
||||
Displays current configuration. Modifing the configuration is
|
||||
achieved by sending message to `conf'.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.back_trace_limit
|
||||
Sets display lines of backtrace as top n and tail n.
|
||||
The default value is 16.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.debug_level = N
|
||||
Sets debug level of irb.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.ignore_eof = true/false
|
||||
Whether ^D (control\-d) will be ignored or not.
|
||||
If false is set, ^D means quit.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.ignore_sigint= true/false
|
||||
Whether ^C (control\-c) will be ignored or not.
|
||||
If false is set, ^D means quit. If true,
|
||||
|
||||
.nf
|
||||
\& during input: cancel inputing then return to top level.
|
||||
\& during execute: abondon current execution.
|
||||
.fi
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.inf_ruby_mode = true/false
|
||||
Whether inf\-ruby\-mode or not. The default value is false.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.inspect_mode = true/false/nil
|
||||
Specifies inspect mode.
|
||||
true: display inspect
|
||||
false: display to_s
|
||||
nil: inspect mode in non math mode,
|
||||
|
||||
.nf
|
||||
\& non inspect mode in math mode.
|
||||
.fi
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.irb_level
|
||||
The level of cb.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.math_mode
|
||||
Whether bc mode or not.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.use_loader = true/false
|
||||
Whether irb's own file reader method is used when load/require or not.
|
||||
This mode is globaly affected (irb wide).
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.prompt_c
|
||||
prompt for a continuating statement (e.g, immediately after of `if')
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.prompt_i
|
||||
standard prompt
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.prompt_s
|
||||
prompt for a continuating string
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.rc
|
||||
Whether ~/.irbrc is read or not.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.use_prompt = true/false
|
||||
Prompting or not.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.use_readline = true/false/nil
|
||||
Whether readline is used or not.
|
||||
true: uses
|
||||
false: doen't use
|
||||
nil: intends to use readline except for inf\-reuby\-mode (default)
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
conf.verbose=T/F
|
||||
Whether verbose messages are display or not.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
cb, irb_change_binding [obj]
|
||||
Enter new binding which has a distinct scope of local variables.
|
||||
If obj is given, obj will be self.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
irb [obj]
|
||||
Invoke subirb. If obj is given, obj will be self.
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
jobs, irb_jobs
|
||||
List of subirb
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
fg n, irb_fg n
|
||||
Switch into specified subirb. The following is candidates of n:
|
||||
|
||||
.nf
|
||||
\& irb number
|
||||
\& thhread
|
||||
\& irb object
|
||||
\& self(obj which is specified of irb obj)
|
||||
.fi
|
||||
|
||||
|
||||
.TP
|
||||
.fi
|
||||
.B
|
||||
kill n, irb_kill n
|
||||
Kill subirb. The means of n is as same as the case of irb_fg.
|
||||
.SH System variable
|
||||
.PP
|
||||
.nf
|
||||
\& _ The latest value of evaluation (it is local)
|
||||
.fi
|
||||
.SH Session Example
|
||||
.PP
|
||||
.nf
|
||||
\& dim% ruby irb.rb
|
||||
\& irb(main):001:0> irb # invoke subirb
|
||||
\& irb#1(main):001:0> jobs # list of subirbs
|
||||
\& #0\->irb on main (#<Thread:0x400fb7e4> : stop)
|
||||
\& #1\->irb#1 on main (#<Thread:0x40125d64> : running)
|
||||
\& nil
|
||||
\& irb#1(main):002:0> fg 0 # switch job
|
||||
\& nil
|
||||
\& irb(main):002:0> class Foo;end
|
||||
\& nil
|
||||
\& irb(main):003:0> irb Foo # invoke subirb which has the
|
||||
.fi
|
||||
.nf
|
||||
\& # context of Foo
|
||||
.fi
|
||||
.nf
|
||||
\& irb#2(Foo):001:0> def foo # define Foo#foo
|
||||
\& irb#2(Foo):002:1> print 1
|
||||
\& irb#2(Foo):003:1> end
|
||||
\& nil
|
||||
\& irb#2(Foo):004:0> fg 0 # switch job
|
||||
\& nil
|
||||
\& irb(main):004:0> jobs # list of job
|
||||
\& #0\->irb on main (#<Thread:0x400fb7e4> : running)
|
||||
\& #1\->irb#1 on main (#<Thread:0x40125d64> : stop)
|
||||
\& #2\->irb#2 on Foo (#<Thread:0x4011d54c> : stop)
|
||||
\& nil
|
||||
\& irb(main):005:0> Foo.instance_methods # Foo#foo is defined asurely
|
||||
\& ["foo"]
|
||||
\& irb(main):006:0> fg 2 # switch job
|
||||
\& nil
|
||||
\& irb#2(Foo):005:0> def bar # define Foo#bar
|
||||
\& irb#2(Foo):006:1> print "bar"
|
||||
\& irb#2(Foo):007:1> end
|
||||
\& nil
|
||||
\& irb#2(Foo):010:0> Foo.instance_methods
|
||||
\& ["bar", "foo"]
|
||||
\& irb#2(Foo):011:0> fg 0
|
||||
\& nil
|
||||
\& irb(main):007:0> f = Foo.new
|
||||
\& #<Foo:0x4010af3c>
|
||||
\& irb(main):008:0> irb f # invoke subirb which has the
|
||||
.fi
|
||||
.nf
|
||||
\& # context of f (instance of Foo)
|
||||
.fi
|
||||
.nf
|
||||
\& irb#3(#<Foo:0x4010af3c>):001:0> jobs
|
||||
\& #0\->irb on main (#<Thread:0x400fb7e4> : stop)
|
||||
\& #1\->irb#1 on main (#<Thread:0x40125d64> : stop)
|
||||
\& #2\->irb#2 on Foo (#<Thread:0x4011d54c> : stop)
|
||||
\& #3\->irb#3 on #<Foo:0x4010af3c> (#<Thread:0x4010a1e0> : running)
|
||||
\& nil
|
||||
\& irb#3(#<Foo:0x4010af3c>):002:0> foo # evaluate f.foo
|
||||
\& 1nil
|
||||
\& irb#3(#<Foo:0x4010af3c>):003:0> bar # evaluate f.bar
|
||||
\& barnil
|
||||
\& irb#3(#<Foo:0x4010af3c>):004:0> kill 1, 2, 3# kill job
|
||||
\& nil
|
||||
\& irb(main):009:0> jobs
|
||||
\& #0\->irb on main (#<Thread:0x400fb7e4> : running)
|
||||
\& nil
|
||||
\& irb(main):010:0> exit # exit
|
||||
\& dim%
|
||||
.fi
|
||||
.SH Restrictions
|
||||
.PP
|
||||
Because irb evaluates the inputs immediately after the imput is
|
||||
syntactically completed, irb gives slight different result than
|
||||
directly use ruby. Known difference is pointed out here.
|
||||
.SH Declaration of the local variable
|
||||
.PP
|
||||
The following causes an error in ruby:
|
||||
.nf
|
||||
\& eval "foo = 0"
|
||||
\& foo
|
||||
\& \-\-
|
||||
\& \-:2: undefined local variable or method `foo' for #<Object:0x40283118> (NameError)
|
||||
\& \-\-\-
|
||||
\& NameError
|
||||
.fi
|
||||
Though, the above will successfully done by irb.
|
||||
.nf
|
||||
\& >> eval "foo = 0"
|
||||
.fi
|
||||
.nf
|
||||
\& => 0
|
||||
\& >> foo
|
||||
\& => 0
|
||||
.fi
|
||||
Ruby evaluates a code after reading entire of code and determination
|
||||
of the scope of local variables. On the other hand, irb do
|
||||
immediately. More precisely, irb evaluate at first
|
||||
.nf
|
||||
\& evel "foo = 0"
|
||||
.fi
|
||||
then foo is defined on this timing. It is because of this
|
||||
incompatibility.
|
||||
If you'd like to detect those differences, begin...end can be used:
|
||||
.nf
|
||||
\& >> begin
|
||||
\& ?> eval "foo = 0"
|
||||
\& >> foo
|
||||
\& >> end
|
||||
\& NameError: undefined local variable or method `foo' for #<Object:0x4013d0f0>
|
||||
\& (irb):3
|
||||
\& (irb_local_binding):1:in `eval'
|
||||
.fi
|
||||
.SH Here\-document
|
||||
.PP
|
||||
Implementation of Here\-document is incomplete.
|
||||
.SH Symbol
|
||||
.PP
|
||||
Irb can not always recognize a symbol as to be Symbol. Concretely, an
|
||||
expression have completed, however Irb regard it as continuation line.
|
||||
|
303
libruby.stp
303
libruby.stp
@ -1,303 +0,0 @@
|
||||
/* SystemTap tapset to make it easier to trace Ruby 2.0
|
||||
*
|
||||
* All probes provided by Ruby can be listed using following command
|
||||
* (the path to the library must be adjuste appropriately):
|
||||
*
|
||||
* stap -L 'process("@LIBRARY_PATH@").mark("*")'
|
||||
*/
|
||||
|
||||
/**
|
||||
* probe ruby.array.create - Allocation of new array.
|
||||
*
|
||||
* @size: Number of elements (an int)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.array.create =
|
||||
process("@LIBRARY_PATH@").mark("array__create")
|
||||
{
|
||||
size = $arg1
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.cmethod.entry - Fired just before a method implemented in C is entered.
|
||||
*
|
||||
* @classname: Name of the class (string)
|
||||
* @methodname: The method about bo be executed (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.cmethod.entry =
|
||||
process("@LIBRARY_PATH@").mark("cmethod__entry")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
methodname = user_string($arg2)
|
||||
file = user_string($arg3)
|
||||
line = $arg4
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.cmethod.return - Fired just after a method implemented in C has returned.
|
||||
*
|
||||
* @classname: Name of the class (string)
|
||||
* @methodname: The executed method (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.cmethod.return =
|
||||
process("@LIBRARY_PATH@").mark("cmethod__return")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
methodname = user_string($arg2)
|
||||
file = user_string($arg3)
|
||||
line = $arg4
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.find.require.entry - Fired when require starts to search load
|
||||
* path for suitable file to require.
|
||||
*
|
||||
* @requiredfile: The name of the file to be required (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.find.require.entry =
|
||||
process("@LIBRARY_PATH@").mark("find__require__entry")
|
||||
{
|
||||
requiredfile = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.find.require.return - Fired just after require has finished
|
||||
* search of load path for suitable file to require.
|
||||
*
|
||||
* @requiredfile: The name of the file to be required (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.find.require.return =
|
||||
process("@LIBRARY_PATH@").mark("find__require__return")
|
||||
{
|
||||
requiredfile = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.gc.mark.begin - Fired when a GC mark phase is about to start.
|
||||
*
|
||||
* It takes no arguments.
|
||||
*/
|
||||
probe ruby.gc.mark.begin =
|
||||
process("@LIBRARY_PATH@").mark("gc__mark__begin")
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.gc.mark.end - Fired when a GC mark phase has ended.
|
||||
*
|
||||
* It takes no arguments.
|
||||
*/
|
||||
probe ruby.gc.mark.end =
|
||||
process("@LIBRARY_PATH@").mark("gc__mark__end")
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.gc.sweep.begin - Fired when a GC sweep phase is about to start.
|
||||
*
|
||||
* It takes no arguments.
|
||||
*/
|
||||
probe ruby.gc.sweep.begin =
|
||||
process("@LIBRARY_PATH@").mark("gc__sweep__begin")
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.gc.sweep.end - Fired when a GC sweep phase has ended.
|
||||
*
|
||||
* It takes no arguments.
|
||||
*/
|
||||
probe ruby.gc.sweep.end =
|
||||
process("@LIBRARY_PATH@").mark("gc__sweep__end")
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.hash.create - Allocation of new hash.
|
||||
*
|
||||
* @size: Number of elements (int)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.hash.create =
|
||||
process("@LIBRARY_PATH@").mark("hash__create")
|
||||
{
|
||||
size = $arg1
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.load.entry - Fired when calls to "load" are made.
|
||||
*
|
||||
* @loadedfile: The name of the file to be loaded (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.load.entry =
|
||||
process("@LIBRARY_PATH@").mark("load__entry")
|
||||
{
|
||||
loadedfile = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.load.return - Fired just after require has finished
|
||||
* search of load path for suitable file to require.
|
||||
*
|
||||
* @loadedfile: The name of the file that was loaded (string)
|
||||
*/
|
||||
probe ruby.load.return =
|
||||
process("@LIBRARY_PATH@").mark("load__return")
|
||||
{
|
||||
loadedfile = user_string($arg1)
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.method.entry - Fired just before a method implemented in Ruby is entered.
|
||||
*
|
||||
* @classname: Name of the class (string)
|
||||
* @methodname: The method about bo be executed (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.method.entry =
|
||||
process("@LIBRARY_PATH@").mark("method__entry")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
methodname = user_string($arg2)
|
||||
file = user_string($arg3)
|
||||
line = $arg4
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.method.return - Fired just after a method implemented in Ruby has returned.
|
||||
*
|
||||
* @classname: Name of the class (string)
|
||||
* @methodname: The executed method (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.method.return =
|
||||
process("@LIBRARY_PATH@").mark("method__return")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
methodname = user_string($arg2)
|
||||
file = user_string($arg3)
|
||||
line = $arg4
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.object.create - Allocation of new object.
|
||||
*
|
||||
* @classname: Name of the class (string)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.object.create =
|
||||
process("@LIBRARY_PATH@").mark("object__create")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.parse.begin - Fired just before a Ruby source file is parsed.
|
||||
*
|
||||
* @parsedfile: The name of the file to be parsed (string)
|
||||
* @parsedline: The line number of beginning of parsing (int)
|
||||
*/
|
||||
probe ruby.parse.begin =
|
||||
process("@LIBRARY_PATH@").mark("parse__begin")
|
||||
{
|
||||
parsedfile = user_string($arg1)
|
||||
parsedline = $arg2
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.parse.end - Fired just after a Ruby source file was parsed.
|
||||
*
|
||||
* @parsedfile: The name of parsed the file (string)
|
||||
* @parsedline: The line number of beginning of parsing (int)
|
||||
*/
|
||||
probe ruby.parse.end =
|
||||
process("@LIBRARY_PATH@").mark("parse__end")
|
||||
{
|
||||
parsedfile = user_string($arg1)
|
||||
parsedline = $arg2
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.raise - Fired when an exception is raised.
|
||||
*
|
||||
* @classname: The class name of the raised exception (string)
|
||||
* @file: The name of the file where the exception was raised (string)
|
||||
* @line: The line number in the file where the exception was raised (int)
|
||||
*/
|
||||
probe ruby.raise =
|
||||
process("@LIBRARY_PATH@").mark("raise")
|
||||
{
|
||||
classname = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.require.entry - Fired on calls to rb_require_safe (when a file
|
||||
* is required).
|
||||
*
|
||||
* @requiredfile: The name of the file to be required (string)
|
||||
* @file: The file that called "require" (string)
|
||||
* @line: The line number where the call to require was made(int)
|
||||
*/
|
||||
probe ruby.require.entry =
|
||||
process("@LIBRARY_PATH@").mark("require__entry")
|
||||
{
|
||||
requiredfile = user_string($arg1)
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.require.return - Fired just after require has finished
|
||||
* search of load path for suitable file to require.
|
||||
*
|
||||
* @requiredfile: The file that was required (string)
|
||||
*/
|
||||
probe ruby.require.return =
|
||||
process("@LIBRARY_PATH@").mark("require__return")
|
||||
{
|
||||
requiredfile = user_string($arg1)
|
||||
}
|
||||
|
||||
/**
|
||||
* probe ruby.string.create - Allocation of new string.
|
||||
*
|
||||
* @size: Number of elements (an int)
|
||||
* @file: The file name where the method is being called (string)
|
||||
* @line: The line number where the method is being called (int)
|
||||
*/
|
||||
probe ruby.string.create =
|
||||
process("@LIBRARY_PATH@").mark("string__create")
|
||||
{
|
||||
size = $arg1
|
||||
file = user_string($arg2)
|
||||
line = $arg3
|
||||
}
|
22
macros.ruby
22
macros.ruby
@ -1,22 +0,0 @@
|
||||
%ruby_libdir %{_datadir}/%{name}
|
||||
%ruby_libarchdir %{_libdir}/%{name}
|
||||
|
||||
# This is the local lib/arch and should not be used for packaging.
|
||||
%ruby_sitedir site_ruby
|
||||
%ruby_sitelibdir %{_prefix}/local/share/%{name}/%{ruby_sitedir}
|
||||
%ruby_sitearchdir %{_prefix}/local/%{_lib}/%{name}/%{ruby_sitedir}
|
||||
|
||||
# This is the general location for libs/archs compatible with all
|
||||
# or most of the Ruby versions available in the Fedora repositories.
|
||||
%ruby_vendordir vendor_ruby
|
||||
%ruby_vendorlibdir %{ruby_libdir}/%{ruby_vendordir}
|
||||
%ruby_vendorarchdir %{ruby_libarchdir}/%{ruby_vendordir}
|
||||
|
||||
# For ruby packages we want to filter out any provides caused by private
|
||||
# libs in %%{ruby_vendorarchdir}/%%{ruby_sitearchdir}.
|
||||
#
|
||||
# Note that this must be invoked in the spec file, preferably as
|
||||
# "%{?ruby_default_filter}", before any %description block.
|
||||
%ruby_default_filter %{expand: \
|
||||
%global __provides_exclude_from %{?__provides_exclude_from:%{__provides_exclude_from}|}^(%{ruby_vendorarchdir}|%{ruby_sitearchdir})/.*\\\\.so$ \
|
||||
}
|
185
macros.rubygems
185
macros.rubygems
@ -1,185 +0,0 @@
|
||||
# The RubyGems root folder.
|
||||
%gem_dir %{_datadir}/gems
|
||||
%gem_archdir %{_libdir}/gems
|
||||
|
||||
# Common gem locations and files.
|
||||
%gem_instdir %{gem_dir}/gems/%{gem_name}-%{version}%{?prerelease}
|
||||
%gem_extdir_mri %{gem_archdir}/%{name}/%{gem_name}-%{version}%{?prerelease}
|
||||
%gem_libdir %{gem_instdir}/lib
|
||||
%gem_cache %{gem_dir}/cache/%{gem_name}-%{version}%{?prerelease}.gem
|
||||
%gem_spec %{gem_dir}/specifications/%{gem_name}-%{version}%{?prerelease}.gemspec
|
||||
%gem_docdir %{gem_dir}/doc/%{gem_name}-%{version}%{?prerelease}
|
||||
|
||||
|
||||
# %gem_install - Install gem into appropriate directory.
|
||||
#
|
||||
# Usage: %gem_install [options]
|
||||
#
|
||||
# -n <gem_file> Overrides gem file name for installation.
|
||||
# -d <install_dir> Set installation directory.
|
||||
#
|
||||
%gem_install(d:n:) \
|
||||
mkdir -p %{-d*}%{!?-d:.%{gem_dir}} \
|
||||
\
|
||||
CONFIGURE_ARGS="--with-cflags='%{optflags}' --with-cxxflags='%{optflags}' $CONFIGURE_ARGS" \\\
|
||||
gem install \\\
|
||||
-V \\\
|
||||
--local \\\
|
||||
--build-root %{-d*}%{!?-d:.} \\\
|
||||
--force \\\
|
||||
--document=ri,rdoc \\\
|
||||
%{-n*}%{!?-n:%{gem_name}-%{version}%{?prerelease}.gem} \
|
||||
%{nil}
|
||||
|
||||
|
||||
# The 'read' command in %%gemspec_* macros is not essential, but it is usefull
|
||||
# to make the sript appear in build log.
|
||||
|
||||
|
||||
# %gemspec_add_dep - Add dependency into .gemspec.
|
||||
#
|
||||
# Usage: %gemspec_add_dep -g <gem> [options] [requirements]
|
||||
#
|
||||
# Add dependency named <gem> to .gemspec file. The macro adds runtime
|
||||
# dependency by default. The [requirements] argument can be used to specify
|
||||
# the dependency constraints more precisely. It is expected to be valid Ruby
|
||||
# code.
|
||||
#
|
||||
# -s <gemspec_file> Overrides the default .gemspec location.
|
||||
# -d Add development dependecy.
|
||||
#
|
||||
%gemspec_add_dep(g:s:d) \
|
||||
read -d '' gemspec_add_dep_script << 'EOR' || : \
|
||||
gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}%{?prerelease}.gemspec}' \
|
||||
\
|
||||
name = '%{-g*}' \
|
||||
requirements = %{*}%{!?1:nil} \
|
||||
\
|
||||
type = :%{!?-d:runtime}%{?-d:development} \
|
||||
\
|
||||
spec = Gem::Specification.load(gemspec_file) \
|
||||
abort("#{gemspec_file} is not accessible.") unless spec \
|
||||
\
|
||||
dep = spec.dependencies.detect { |d| d.type == type && d.name == name } \
|
||||
if dep \
|
||||
dep.requirement.concat requirements \
|
||||
else \
|
||||
spec.public_send "add_#{type}_dependency", name, requirements \
|
||||
end \
|
||||
File.write gemspec_file, spec.to_ruby \
|
||||
EOR\
|
||||
echo "$gemspec_add_dep_script" | ruby \
|
||||
unset -v gemspec_add_dep_script \
|
||||
%{nil}
|
||||
|
||||
|
||||
# %gemspec_remove_dep - Remove dependency from .gemspec.
|
||||
#
|
||||
# Usage: %gemspec_remove_dep -g <gem> [options] [requirements]
|
||||
#
|
||||
# Remove dependency named <gem> from .gemspec file. The macro removes runtime
|
||||
# dependency by default. The [requirements] argument can be used to specify
|
||||
# the dependency constraints more precisely. It is expected to be valid Ruby
|
||||
# code. The macro fails if these specific requirements can't be removed.
|
||||
#
|
||||
# -s <gemspec_file> Overrides the default .gemspec location.
|
||||
# -d Remove development dependecy.
|
||||
#
|
||||
%gemspec_remove_dep(g:s:d) \
|
||||
read -d '' gemspec_remove_dep_script << 'EOR' || : \
|
||||
gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}%{?prerelease}.gemspec}' \
|
||||
\
|
||||
name = '%{-g*}' \
|
||||
requirements = %{*}%{!?1:nil} \
|
||||
\
|
||||
type = :%{!?-d:runtime}%{?-d:development} \
|
||||
\
|
||||
spec = Gem::Specification.load(gemspec_file) \
|
||||
abort("#{gemspec_file} is not accessible.") unless spec \
|
||||
\
|
||||
dep = spec.dependencies.detect { |d| d.type == type && d.name == name } \
|
||||
if dep \
|
||||
if requirements \
|
||||
requirements = Gem::Requirement.create(requirements).requirements \
|
||||
requirements.each do |r| \
|
||||
unless dep.requirement.requirements.reject! { |dependency_requirements| dependency_requirements == r } \
|
||||
abort("Requirement '#{r.first} #{r.last}' was not possible to remove for dependency '#{dep}'!") \
|
||||
end \
|
||||
end \
|
||||
spec.dependencies.delete dep if dep.requirement.requirements.empty? \
|
||||
else \
|
||||
spec.dependencies.delete dep \
|
||||
end \
|
||||
else \
|
||||
abort("Dependency '#{name}' was not found!") \
|
||||
end \
|
||||
File.write gemspec_file, spec.to_ruby \
|
||||
EOR\
|
||||
echo "$gemspec_remove_dep_script" | ruby \
|
||||
unset -v gemspec_remove_dep_script \
|
||||
%{nil}
|
||||
|
||||
|
||||
# %%gemspec_add_file - Add files to various files lists in .gemspec.
|
||||
#
|
||||
# Usage: %%gemspec_add_file [options] <file>
|
||||
#
|
||||
# Add files to .gemspec file. <file> is expected to be valid Ruby code.
|
||||
# Path to file is expected. Does not check real files in any way.
|
||||
# By default, `files` list is edited.
|
||||
#
|
||||
# -s <gemspec_file> Overrides the default .gemspec location.
|
||||
# -t Edit test_files only.
|
||||
# -r Edit extra_rdoc_files only.
|
||||
#
|
||||
%gemspec_add_file(s:tr) \
|
||||
read -d '' gemspec_add_file_script << 'EOR' || : \
|
||||
gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}%{?prerelease}.gemspec}' \
|
||||
\
|
||||
abort("gemspec_add_file: Use only one '-t' or '-r' at a time.") if "%{?-t}%{?-r}" == "-t-r" \
|
||||
\
|
||||
filenames = %{*}%{!?1:nil} \
|
||||
filenames = Array(filenames) \
|
||||
\
|
||||
spec = Gem::Specification.load(gemspec_file) \
|
||||
abort("#{gemspec_file} is not accessible.") unless spec \
|
||||
\
|
||||
spec.%{?-t:test_}%{?-r:extra_rdoc_}files += filenames \
|
||||
File.write gemspec_file, spec.to_ruby \
|
||||
EOR\
|
||||
echo "$gemspec_add_file_script" | ruby \
|
||||
unset -v gemspec_add_file_script \
|
||||
%{nil}
|
||||
|
||||
|
||||
# %%gemspec_remove_file - Remove files from various files lists in .gemspec.
|
||||
#
|
||||
# Usage: %%gemspec_remove_file [options] <file>
|
||||
#
|
||||
# Remove files from .gemspec file. <file> is expected to be valid Ruby code.
|
||||
# Path to file is expected. Does not check/remove real files in any way.
|
||||
# By default, `files` list is edited. File has to be removed from `test_files`
|
||||
# first in order to be removable from `files`.
|
||||
#
|
||||
# -s <gemspec_file> Overrides the default .gemspec location.
|
||||
# -t Edit test_files only.
|
||||
# -r Edit extra_rdoc_files only.
|
||||
#
|
||||
%gemspec_remove_file(s:tr) \
|
||||
read -d '' gemspec_remove_file_script << 'EOR' || : \
|
||||
gemspec_file = '%{-s*}%{!?-s:%{_builddir}/%{gem_name}-%{version}%{?prerelease}.gemspec}' \
|
||||
\
|
||||
abort("gemspec_remove_file: Use only one '-t' or '-r' at a time.") if "%{?-t}%{?-r}" == "-t-r" \
|
||||
\
|
||||
filenames = %{*}%{!?1:nil} \
|
||||
filenames = Array(filenames) \
|
||||
\
|
||||
spec = Gem::Specification.load(gemspec_file) \
|
||||
abort("#{gemspec_file} is not accessible.") unless spec \
|
||||
\
|
||||
spec.%{?-t:test_}%{?-r:extra_rdoc_}files -= filenames \
|
||||
File.write gemspec_file, spec.to_ruby \
|
||||
EOR\
|
||||
echo "$gemspec_remove_file_script" | ruby \
|
||||
unset -v gemspec_remove_file_script \
|
||||
%{nil}
|
@ -1,148 +0,0 @@
|
||||
module Gem
|
||||
class << self
|
||||
|
||||
##
|
||||
# Returns full path of previous but one directory of dir in path
|
||||
# E.g. for '/usr/share/ruby', 'ruby', it returns '/usr'
|
||||
|
||||
def previous_but_one_dir_to(path, dir)
|
||||
return unless path
|
||||
|
||||
split_path = path.split(File::SEPARATOR)
|
||||
File.join(split_path.take_while { |one_dir| one_dir !~ /^#{dir}$/ }[0..-2])
|
||||
end
|
||||
private :previous_but_one_dir_to
|
||||
|
||||
##
|
||||
# Detects --install-dir option specified on command line.
|
||||
|
||||
def opt_install_dir?
|
||||
@opt_install_dir ||= ARGV.include?('--install-dir') || ARGV.include?('-i')
|
||||
end
|
||||
private :opt_install_dir?
|
||||
|
||||
##
|
||||
# Detects --build-root option specified on command line.
|
||||
|
||||
def opt_build_root?
|
||||
@opt_build_root ||= ARGV.include?('--build-root')
|
||||
end
|
||||
private :opt_build_root?
|
||||
|
||||
##
|
||||
# Tries to detect, if arguments and environment variables suggest that
|
||||
# 'gem install' is executed from rpmbuild.
|
||||
|
||||
def rpmbuild?
|
||||
@rpmbuild ||= ENV['RPM_PACKAGE_NAME'] && (opt_install_dir? || opt_build_root?)
|
||||
end
|
||||
private :rpmbuild?
|
||||
|
||||
##
|
||||
# Default gems locations allowed on FHS system (/usr, /usr/share).
|
||||
# The locations are derived from directories specified during build
|
||||
# configuration.
|
||||
|
||||
def default_locations
|
||||
@default_locations ||= {
|
||||
:system => previous_but_one_dir_to(RbConfig::CONFIG['vendordir'], RbConfig::CONFIG['RUBY_INSTALL_NAME']),
|
||||
:local => previous_but_one_dir_to(RbConfig::CONFIG['sitedir'], RbConfig::CONFIG['RUBY_INSTALL_NAME'])
|
||||
}
|
||||
end
|
||||
|
||||
##
|
||||
# For each location provides set of directories for binaries (:bin_dir)
|
||||
# platform independent (:gem_dir) and dependent (:ext_dir) files.
|
||||
|
||||
def default_dirs
|
||||
@libdir ||= case RUBY_PLATFORM
|
||||
when 'java'
|
||||
RbConfig::CONFIG['datadir']
|
||||
else
|
||||
RbConfig::CONFIG['libdir']
|
||||
end
|
||||
|
||||
@default_dirs ||= default_locations.inject(Hash.new) do |hash, location|
|
||||
destination, path = location
|
||||
|
||||
hash[destination] = if path
|
||||
{
|
||||
:bin_dir => File.join(path, RbConfig::CONFIG['bindir'].split(File::SEPARATOR).last),
|
||||
:gem_dir => File.join(path, RbConfig::CONFIG['datadir'].split(File::SEPARATOR).last, 'gems'),
|
||||
:ext_dir => File.join(path, @libdir.split(File::SEPARATOR).last, 'gems')
|
||||
}
|
||||
else
|
||||
{
|
||||
:bin_dir => '',
|
||||
:gem_dir => '',
|
||||
:ext_dir => ''
|
||||
}
|
||||
end
|
||||
|
||||
hash
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Remove methods we are going to override. This avoids "method redefined;"
|
||||
# warnings otherwise issued by Ruby.
|
||||
|
||||
remove_method :operating_system_defaults if method_defined? :operating_system_defaults
|
||||
remove_method :default_dir if method_defined? :default_dir
|
||||
remove_method :default_path if method_defined? :default_path
|
||||
remove_method :default_ext_dir_for if method_defined? :default_ext_dir_for
|
||||
|
||||
##
|
||||
# Regular user installs into user directory, root manages /usr/local.
|
||||
|
||||
def operating_system_defaults
|
||||
unless opt_build_root?
|
||||
options = if Process.uid == 0
|
||||
"--install-dir=#{Gem.default_dirs[:local][:gem_dir]} --bindir #{Gem.default_dirs[:local][:bin_dir]}"
|
||||
else
|
||||
"--user-install --bindir #{File.join [Dir.home, 'bin']}"
|
||||
end
|
||||
|
||||
{"gem" => options}
|
||||
else
|
||||
{}
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# RubyGems default overrides.
|
||||
|
||||
def default_dir
|
||||
Gem.default_dirs[:system][:gem_dir]
|
||||
end
|
||||
|
||||
def default_path
|
||||
path = default_dirs.collect {|location, paths| paths[:gem_dir]}
|
||||
path.unshift Gem.user_dir if File.exist? Gem.user_home
|
||||
path
|
||||
end
|
||||
|
||||
def default_ext_dir_for base_dir
|
||||
dir = if rpmbuild?
|
||||
build_dir = base_dir.chomp Gem.default_dirs[:system][:gem_dir]
|
||||
if build_dir != base_dir
|
||||
File.join build_dir, Gem.default_dirs[:system][:ext_dir]
|
||||
end
|
||||
else
|
||||
dirs = Gem.default_dirs.detect {|location, paths| paths[:gem_dir] == base_dir}
|
||||
dirs && dirs.last[:ext_dir]
|
||||
end
|
||||
dir && File.join(dir, RbConfig::CONFIG['RUBY_INSTALL_NAME'])
|
||||
end
|
||||
|
||||
# This method should be available since RubyGems 2.2 until RubyGems 3.0.
|
||||
# https://github.com/rubygems/rubygems/issues/749
|
||||
if method_defined? :install_extension_in_lib
|
||||
remove_method :install_extension_in_lib
|
||||
|
||||
def install_extension_in_lib
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
14
ruby-1.8.6-p287-CVE-2008-5189.patch
Normal file
14
ruby-1.8.6-p287-CVE-2008-5189.patch
Normal file
@ -0,0 +1,14 @@
|
||||
--- lib/cgi.rb (revision 19665)
|
||||
+++ lib/cgi.rb (working copy)
|
||||
@@ -546,6 +546,11 @@
|
||||
when Hash
|
||||
options = options.dup
|
||||
end
|
||||
+ options.each_value do |value|
|
||||
+ if /\n(?![ \t])/ === value
|
||||
+ raise ArgumentError, "potential HTTP header injection detected"
|
||||
+ end
|
||||
+ end
|
||||
|
||||
unless options.has_key?("type")
|
||||
options["type"] = "text/html"
|
100
ruby-1.8.6-p287-remove-ssl-rand-range.patch
Normal file
100
ruby-1.8.6-p287-remove-ssl-rand-range.patch
Normal file
@ -0,0 +1,100 @@
|
||||
diff -ur ruby-1.8.6-p287.orig/ext/openssl/openssl_missing.c ruby-1.8.6-p287/ext/openssl/openssl_missing.c
|
||||
--- ruby-1.8.6-p287.orig/ext/openssl/openssl_missing.c 2007-02-13 00:01:19.000000000 +0100
|
||||
+++ ruby-1.8.6-p287/ext/openssl/openssl_missing.c 2009-03-15 05:32:31.000000000 +0100
|
||||
@@ -43,7 +43,7 @@
|
||||
{
|
||||
return CRYPTO_set_ex_data(&str->ex_data, idx, data);
|
||||
}
|
||||
-
|
||||
+
|
||||
void *X509_STORE_get_ex_data(X509_STORE *str, int idx)
|
||||
{
|
||||
return CRYPTO_get_ex_data(&str->ex_data, idx);
|
||||
@@ -113,7 +113,7 @@
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_EVP_CIPHER_CTX_COPY)
|
||||
-/*
|
||||
+/*
|
||||
* this function does not exist in OpenSSL yet... or ever?.
|
||||
* a future version may break this function.
|
||||
* tested on 0.9.7d.
|
||||
@@ -182,12 +182,12 @@
|
||||
(ASN1_STRING *)(*a)->serialNumber,
|
||||
(ASN1_STRING *)(*b)->serialNumber));
|
||||
}
|
||||
-
|
||||
+
|
||||
int
|
||||
X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev)
|
||||
{
|
||||
X509_CRL_INFO *inf;
|
||||
-
|
||||
+
|
||||
inf = crl->crl;
|
||||
if (!inf->revoked)
|
||||
inf->revoked = sk_X509_REVOKED_new(OSSL_X509_REVOKED_cmp);
|
||||
@@ -233,54 +233,6 @@
|
||||
}
|
||||
#endif
|
||||
|
||||
-#if !defined(HAVE_BN_RAND_RANGE) || !defined(HAVE_BN_PSEUDO_RAND_RANGE)
|
||||
-static int
|
||||
-bn_rand_range(int pseudo, BIGNUM *r, BIGNUM *range)
|
||||
-{
|
||||
- int (*bn_rand)(BIGNUM *, int, int, int) = pseudo ? BN_pseudo_rand : BN_rand;
|
||||
- int n;
|
||||
-
|
||||
- if (range->neg || BN_is_zero(range)) return 0;
|
||||
-
|
||||
- n = BN_num_bits(range);
|
||||
-
|
||||
- if (n == 1) {
|
||||
- if (!BN_zero(r)) return 0;
|
||||
- } else if (!BN_is_bit_set(range, n - 2) && !BN_is_bit_set(range, n - 3)) {
|
||||
- do {
|
||||
- if (!bn_rand(r, n + 1, -1, 0)) return 0;
|
||||
- if (BN_cmp(r ,range) >= 0) {
|
||||
- if (!BN_sub(r, r, range)) return 0;
|
||||
- if (BN_cmp(r, range) >= 0)
|
||||
- if (!BN_sub(r, r, range)) return 0;
|
||||
- }
|
||||
- } while (BN_cmp(r, range) >= 0);
|
||||
- } else {
|
||||
- do {
|
||||
- if (!bn_rand(r, n, -1, 0)) return 0;
|
||||
- } while (BN_cmp(r, range) >= 0);
|
||||
- }
|
||||
-
|
||||
- return 1;
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
-#if !defined(HAVE_BN_RAND_RANGE)
|
||||
-int
|
||||
-BN_rand_range(BIGNUM *r, BIGNUM *range)
|
||||
-{
|
||||
- return bn_rand_range(0, r, range);
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
-#if !defined(HAVE_BN_PSEUDO_RAND_RANGE)
|
||||
-int
|
||||
-BN_pseudo_rand_range(BIGNUM *r, BIGNUM *range)
|
||||
-{
|
||||
- return bn_rand_range(1, r, range);
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
#if !defined(HAVE_CONF_GET1_DEFAULT_CONFIG_FILE)
|
||||
#define OPENSSL_CONF "openssl.cnf"
|
||||
char *
|
||||
@@ -315,7 +267,7 @@
|
||||
{
|
||||
int i,j;
|
||||
const char *prompt;
|
||||
-
|
||||
+
|
||||
if (key) {
|
||||
i = strlen(key);
|
||||
i = (i > num) ? num : i;
|
35
ruby-1.8.6-p369-ri-gem_multipath.patch
Normal file
35
ruby-1.8.6-p369-ri-gem_multipath.patch
Normal file
@ -0,0 +1,35 @@
|
||||
--- ruby-1.8.6-p369/lib/rdoc/ri/ri_options.rb.gemmulti 2007-02-13 08:01:19.000000000 +0900
|
||||
+++ ruby-1.8.6-p369/lib/rdoc/ri/ri_options.rb 2009-10-14 23:51:09.000000000 +0900
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
[ "--gems", nil, nil,
|
||||
"Include documentation from Rubygems:\n " +
|
||||
- (RI::Paths::GEMDIRS ? "#{Gem.path}/doc/*/ri" :
|
||||
+ (RI::Paths::GEMDIRS ? Gem.path.map {|path| "#{path}/doc/*/ri" }.join(', ') :
|
||||
"No Rubygems ri found.") ],
|
||||
|
||||
[ "--format", "-f", "<name>",
|
||||
@@ -136,7 +136,11 @@
|
||||
RI::Paths::HOMEDIR
|
||||
]
|
||||
|
||||
- directories << "#{Gem.path}/doc/*/ri" if RI::Paths::GEMDIRS
|
||||
+ if RI::Paths::GEMDIRS
|
||||
+ Gem.path.each {|gempath|
|
||||
+ directories << "#{gempath}/doc/*/ri"
|
||||
+ }
|
||||
+ end
|
||||
|
||||
directories = directories.join("\n ")
|
||||
|
||||
--- ruby-1.8.6-p369/lib/rdoc/ri/ri_paths.rb.gemmulti 2007-02-13 08:01:19.000000000 +0900
|
||||
+++ ruby-1.8.6-p369/lib/rdoc/ri/ri_paths.rb 2009-10-15 00:02:05.000000000 +0900
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
begin
|
||||
require 'rubygems'
|
||||
- GEMDIRS = Dir["#{Gem.path}/doc/*/ri"]
|
||||
+ GEMDIRS = Gem.path.map {|path| Dir["#{path}/doc/*/ri"]}.flatten
|
||||
GEMDIRS.each { |path| RI::Paths::PATH << path }
|
||||
rescue LoadError
|
||||
GEMDIRS = nil
|
11
ruby-1.8.6-p383-mkmf-use-shared.patch
Normal file
11
ruby-1.8.6-p383-mkmf-use-shared.patch
Normal file
@ -0,0 +1,11 @@
|
||||
--- ruby-1.8.6-p383/lib/mkmf.rb.static 2009-03-31 18:19:39.000000000 +0900
|
||||
+++ ruby-1.8.6-p383/lib/mkmf.rb 2009-12-09 15:03:19.000000000 +0900
|
||||
@@ -275,7 +275,7 @@
|
||||
'LDFLAGS' => "#$LDFLAGS #{ldflags}",
|
||||
'LIBPATH' => libpathflag(libpath),
|
||||
'LOCAL_LIBS' => "#$LOCAL_LIBS #$libs",
|
||||
- 'LIBS' => "#$LIBRUBYARG_STATIC #{opt} #$LIBS")
|
||||
+ 'LIBS' => "#$LIBRUBYARG_SHARED #{opt} #$LIBS")
|
||||
Config::expand(TRY_LINK.dup, conf)
|
||||
end
|
||||
|
97
ruby-1.8.6-p383-rubyprefix.patch
Normal file
97
ruby-1.8.6-p383-rubyprefix.patch
Normal file
@ -0,0 +1,97 @@
|
||||
diff -ur ruby-1.8.6-p383.0-deadcode/configure.in ruby-1.8.6-p383/configure.in
|
||||
--- ruby-1.8.6-p383.0-deadcode/configure.in 2009-07-20 15:24:22.000000000 +0200
|
||||
+++ ruby-1.8.6-p383/configure.in 2009-10-22 16:37:13.729623476 +0200
|
||||
@@ -1613,6 +1613,13 @@
|
||||
rubyw_install_name="$RUBYW_INSTALL_NAME"
|
||||
;;
|
||||
esac
|
||||
+
|
||||
+AC_ARG_WITH(ruby-prefix,
|
||||
+ AC_HELP_STRING([--with-ruby-prefix], [build ruby with the special library prefix.])
|
||||
+ ,,
|
||||
+ with_ruby_prefix=no)
|
||||
+
|
||||
+if test "x$with_ruby_prefix" = "x"; then
|
||||
case "$target_os" in
|
||||
cygwin*|mingw*|*djgpp*|os2-emx*)
|
||||
RUBY_LIB_PREFIX="/lib/ruby"
|
||||
@@ -1621,20 +1628,30 @@
|
||||
RUBY_LIB_PREFIX="`eval "echo ${libdir}"`/ruby"
|
||||
;;
|
||||
esac
|
||||
+else
|
||||
+ RUBY_LIB_PREFIX="${with_ruby_prefix}/ruby"
|
||||
+fi
|
||||
RUBY_LIB_PATH="${RUBY_LIB_PREFIX}/${MAJOR}.${MINOR}"
|
||||
+RUBY_LIB_PATH2="${libdir}/ruby/${MAJOR}.${MINOR}"
|
||||
|
||||
AC_ARG_WITH(sitedir,
|
||||
[ --with-sitedir=DIR site libraries in DIR [PREFIX/lib/ruby/site_ruby]],
|
||||
[sitedir=$withval],
|
||||
[sitedir="`eval "echo ${libdir}"`/ruby/site_ruby"])
|
||||
-SITE_DIR=`eval echo \\"${sitedir}\\"`
|
||||
+SITE_DIR=`eval echo \\"${sitedir}\\" | sed -e "s/lib64/lib/"`
|
||||
+_fc_sitedir="\$(DESTDIR)${sitedir}"
|
||||
+SITE_DIR2=`eval echo \\"${_fc_sitedir}\\"`
|
||||
+sitedir=`eval echo \\"${sitedir}\\" | sed -e "s/lib64/lib/"`
|
||||
+
|
||||
case "$target_os" in
|
||||
cygwin*|mingw*|*djgpp*|os2-emx*)
|
||||
RUBY_SITE_LIB_PATH="`expr "$SITE_DIR" : "$prefix\(/.*\)"`" ||
|
||||
RUBY_SITE_LIB_PATH="$SITE_DIR";;
|
||||
*)
|
||||
- RUBY_SITE_LIB_PATH="$SITE_DIR";;
|
||||
+ RUBY_SITE_LIB_PATH="$SITE_DIR";
|
||||
+ RUBY_SITE_LIB_PATH2="$SITE_DIR2";;
|
||||
esac
|
||||
+RUBY_SITE_LIB_PATH3="${RUBY_SITE_LIB_PATH2}/${MAJOR}.${MINOR}"
|
||||
RUBY_SITE_LIB_PATH2="${RUBY_SITE_LIB_PATH}/${MAJOR}.${MINOR}"
|
||||
|
||||
AC_DEFINE_UNQUOTED(RUBY_LIB, "${RUBY_LIB_PATH}")
|
||||
@@ -1644,6 +1661,7 @@
|
||||
AC_SUBST(arch)dnl
|
||||
AC_SUBST(sitearch)dnl
|
||||
AC_SUBST(sitedir)dnl
|
||||
+AC_SUBST(_fc_sitedir)dnl
|
||||
|
||||
configure_args=$ac_configure_args
|
||||
AC_SUBST(configure_args)dnl
|
||||
@@ -1652,7 +1670,7 @@
|
||||
arch="fat-${target_os}"
|
||||
|
||||
AC_DEFINE_UNQUOTED(RUBY_THIN_ARCHLIB,
|
||||
- "${RUBY_LIB_PATH}/" __ARCHITECTURE__ "-${target_os}")
|
||||
+ "${RUBY_LIB_PATH2}/" __ARCHITECTURE__ "-${target_os}")
|
||||
|
||||
AC_DEFINE_UNQUOTED(RUBY_SITE_THIN_ARCHLIB,
|
||||
"${RUBY_SITE_LIB_PATH}/" __ARCHITECTURE__ "-${target_os}")
|
||||
@@ -1667,8 +1685,8 @@
|
||||
*) sitearch="${arch}" ;;
|
||||
esac
|
||||
|
||||
-AC_DEFINE_UNQUOTED(RUBY_ARCHLIB, "${RUBY_LIB_PATH}/${arch}")
|
||||
-AC_DEFINE_UNQUOTED(RUBY_SITE_ARCHLIB, "${RUBY_SITE_LIB_PATH2}/${sitearch}")
|
||||
+AC_DEFINE_UNQUOTED(RUBY_ARCHLIB, "${RUBY_LIB_PATH2}/${arch}")
|
||||
+AC_DEFINE_UNQUOTED(RUBY_SITE_ARCHLIB, "${RUBY_SITE_LIB_PATH3}/${sitearch}")
|
||||
|
||||
AC_ARG_WITH(search-path,
|
||||
[ --with-search-path=DIR specify the additional search path],
|
||||
Only in ruby-1.8.6-p383/: configure.in.orig
|
||||
Only in ruby-1.8.6-p383/: configure.in.rej
|
||||
diff -ur ruby-1.8.6-p383.0-deadcode/mkconfig.rb ruby-1.8.6-p383/mkconfig.rb
|
||||
--- ruby-1.8.6-p383.0-deadcode/mkconfig.rb 2008-06-07 18:37:10.000000000 +0200
|
||||
+++ ruby-1.8.6-p383/mkconfig.rb 2009-10-22 16:30:55.776872493 +0200
|
||||
@@ -139,10 +139,10 @@
|
||||
print(*v_others)
|
||||
print <<EOS
|
||||
CONFIG["ruby_version"] = "$(MAJOR).$(MINOR)"
|
||||
- CONFIG["rubylibdir"] = "$(libdir)/ruby/$(ruby_version)"
|
||||
- CONFIG["archdir"] = "$(rubylibdir)/$(arch)"
|
||||
+ CONFIG["rubylibdir"] = "$(prefix)/lib/ruby/$(ruby_version)"
|
||||
+ CONFIG["archdir"] = "$(libdir)/ruby/$(ruby_version)/$(arch)"
|
||||
CONFIG["sitelibdir"] = "$(sitedir)/$(ruby_version)"
|
||||
- CONFIG["sitearchdir"] = "$(sitelibdir)/$(sitearch)"
|
||||
+ CONFIG["sitearchdir"] = "$(_fc_sitedir)/$(ruby_version)/$(sitearch)"
|
||||
CONFIG["topdir"] = File.dirname(__FILE__)
|
||||
MAKEFILE_CONFIG = {}
|
||||
CONFIG.each{|k,v| MAKEFILE_CONFIG[k] = v.dup}
|
96
ruby-1.8.6-rexml-CVE-2008-3790.patch
Normal file
96
ruby-1.8.6-rexml-CVE-2008-3790.patch
Normal file
@ -0,0 +1,96 @@
|
||||
diff -pruN ruby-1.8.6-p287.orig/lib/rexml/document.rb ruby-1.8.6-p287/lib/rexml/document.rb
|
||||
--- ruby-1.8.6-p287.orig/lib/rexml/document.rb 2007-11-04 13:50:15.000000000 +0900
|
||||
+++ ruby-1.8.6-p287/lib/rexml/document.rb 2008-10-08 22:25:14.000000000 +0900
|
||||
@@ -32,6 +32,7 @@ module REXML
|
||||
# @param context if supplied, contains the context of the document;
|
||||
# this should be a Hash.
|
||||
def initialize( source = nil, context = {} )
|
||||
+ @entity_expansion_count = 0
|
||||
super()
|
||||
@context = context
|
||||
return if source.nil?
|
||||
@@ -200,6 +201,27 @@ module REXML
|
||||
Parsers::StreamParser.new( source, listener ).parse
|
||||
end
|
||||
|
||||
+ @@entity_expansion_limit = 10_000
|
||||
+
|
||||
+ # Set the entity expansion limit. By defualt the limit is set to 10000.
|
||||
+ def Document::entity_expansion_limit=( val )
|
||||
+ @@entity_expansion_limit = val
|
||||
+ end
|
||||
+
|
||||
+ # Get the entity expansion limit. By defualt the limit is set to 10000.
|
||||
+ def Document::entity_expansion_limit
|
||||
+ return @@entity_expansion_limit
|
||||
+ end
|
||||
+
|
||||
+ attr_reader :entity_expansion_count
|
||||
+
|
||||
+ def record_entity_expansion
|
||||
+ @entity_expansion_count += 1
|
||||
+ if @entity_expansion_count > @@entity_expansion_limit
|
||||
+ raise "number of entity expansions exceeded, processing aborted."
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
private
|
||||
def build( source )
|
||||
Parsers::TreeParser.new( source, self ).parse
|
||||
diff -pruN ruby-1.8.6-p287.orig/lib/rexml/entity.rb ruby-1.8.6-p287/lib/rexml/entity.rb
|
||||
--- ruby-1.8.6-p287.orig/lib/rexml/entity.rb 2007-07-28 11:46:08.000000000 +0900
|
||||
+++ ruby-1.8.6-p287/lib/rexml/entity.rb 2008-10-08 22:25:14.000000000 +0900
|
||||
@@ -73,6 +73,7 @@ module REXML
|
||||
# all entities -- both %ent; and &ent; entities. This differs from
|
||||
# +value()+ in that +value+ only replaces %ent; entities.
|
||||
def unnormalized
|
||||
+ document.record_entity_expansion unless document.nil?
|
||||
v = value()
|
||||
return nil if v.nil?
|
||||
@unnormalized = Text::unnormalize(v, parent)
|
||||
diff -pruN ruby-1.8.6-p287.orig/test/rexml/test_document.rb ruby-1.8.6-p287/test/rexml/test_document.rb
|
||||
--- ruby-1.8.6-p287.orig/test/rexml/test_document.rb 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ ruby-1.8.6-p287/test/rexml/test_document.rb 2008-10-08 22:25:14.000000000 +0900
|
||||
@@ -0,0 +1,42 @@
|
||||
+require "rexml/document"
|
||||
+require "test/unit"
|
||||
+
|
||||
+class REXML::TestDocument < Test::Unit::TestCase
|
||||
+ def test_new
|
||||
+ doc = REXML::Document.new(<<EOF)
|
||||
+<?xml version="1.0" encoding="UTF-8"?>
|
||||
+<message>Hello world!</message>
|
||||
+EOF
|
||||
+ assert_equal("Hello world!", doc.root.children.first.value)
|
||||
+ end
|
||||
+
|
||||
+ XML_WITH_NESTED_ENTITY = <<EOF
|
||||
+<?xml version="1.0" encoding="UTF-8"?>
|
||||
+<!DOCTYPE member [
|
||||
+ <!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
|
||||
+ <!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
|
||||
+ <!ENTITY c "&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;">
|
||||
+ <!ENTITY d "&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;">
|
||||
+ <!ENTITY e "&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;">
|
||||
+ <!ENTITY f "&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;">
|
||||
+ <!ENTITY g "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">
|
||||
+]>
|
||||
+<member>
|
||||
+&a;
|
||||
+</member>
|
||||
+EOF
|
||||
+
|
||||
+ def test_entity_expansion_limit
|
||||
+ doc = REXML::Document.new(XML_WITH_NESTED_ENTITY)
|
||||
+ assert_raise(RuntimeError) do
|
||||
+ doc.root.children.first.value
|
||||
+ end
|
||||
+ REXML::Document.entity_expansion_limit = 100
|
||||
+ assert_equal(100, REXML::Document.entity_expansion_limit)
|
||||
+ doc = REXML::Document.new(XML_WITH_NESTED_ENTITY)
|
||||
+ assert_raise(RuntimeError) do
|
||||
+ doc.root.children.first.value
|
||||
+ end
|
||||
+ assert_equal(101, doc.entity_expansion_count)
|
||||
+ end
|
||||
+end
|
239
ruby-1.8.6-simplify-openssl-digest.patch
Normal file
239
ruby-1.8.6-simplify-openssl-digest.patch
Normal file
@ -0,0 +1,239 @@
|
||||
diff --git a/ext/openssl/lib/openssl/digest.rb b/ext/openssl/lib/openssl/digest.rb
|
||||
index b3e4484..4810f01 100644
|
||||
--- a/ext/openssl/lib/openssl/digest.rb
|
||||
+++ b/ext/openssl/lib/openssl/digest.rb
|
||||
@@ -19,13 +19,17 @@
|
||||
#require 'openssl'
|
||||
|
||||
module OpenSSL
|
||||
- module Digest
|
||||
+ class Digest
|
||||
|
||||
alg = %w(DSS DSS1 MD2 MD4 MD5 MDC2 RIPEMD160 SHA SHA1)
|
||||
if OPENSSL_VERSION_NUMBER > 0x00908000
|
||||
alg += %w(SHA224 SHA256 SHA384 SHA512)
|
||||
end
|
||||
|
||||
+ def self.digest(name, data)
|
||||
+ super(data, name)
|
||||
+ end
|
||||
+
|
||||
alg.each{|name|
|
||||
klass = Class.new(Digest){
|
||||
define_method(:initialize){|*data|
|
||||
@@ -44,6 +48,14 @@ module OpenSSL
|
||||
const_set(name, klass)
|
||||
}
|
||||
|
||||
+ # This class is only provided for backwards compatibility. Use OpenSSL::Digest in the future.
|
||||
+ class Digest < Digest
|
||||
+ def initialize(*args)
|
||||
+ # add warning
|
||||
+ super(*args)
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
end # Digest
|
||||
end # OpenSSL
|
||||
|
||||
diff --git a/ext/openssl/ossl_digest.c b/ext/openssl/ossl_digest.c
|
||||
index 4096b09..b0308f0 100644
|
||||
--- a/ext/openssl/ossl_digest.c
|
||||
+++ b/ext/openssl/ossl_digest.c
|
||||
@@ -40,7 +40,7 @@ GetDigestPtr(VALUE obj)
|
||||
|
||||
SafeGetDigest(obj, ctx);
|
||||
|
||||
- return EVP_MD_CTX_md(ctx); /*== ctx->digest*/
|
||||
+ return EVP_MD_CTX_md(ctx);
|
||||
}
|
||||
|
||||
VALUE
|
||||
@@ -51,7 +51,6 @@ ossl_digest_new(const EVP_MD *md)
|
||||
|
||||
ret = ossl_digest_alloc(cDigest);
|
||||
GetDigest(ret, ctx);
|
||||
- EVP_MD_CTX_init(ctx);
|
||||
EVP_DigestInit_ex(ctx, md, NULL);
|
||||
|
||||
return ret;
|
||||
@@ -69,9 +68,8 @@ ossl_digest_alloc(VALUE klass)
|
||||
ctx = EVP_MD_CTX_create();
|
||||
if (ctx == NULL)
|
||||
ossl_raise(rb_eRuntimeError, "EVP_MD_CTX_create() failed");
|
||||
- EVP_MD_CTX_init(ctx);
|
||||
obj = Data_Wrap_Struct(klass, 0, EVP_MD_CTX_destroy, ctx);
|
||||
-
|
||||
+
|
||||
return obj;
|
||||
}
|
||||
|
||||
@@ -86,14 +84,9 @@ ossl_digest_initialize(int argc, VALUE *argv, VALUE self)
|
||||
VALUE type, data;
|
||||
|
||||
rb_scan_args(argc, argv, "11", &type, &data);
|
||||
- StringValue(type);
|
||||
+ md = GetDigestPtr(type);
|
||||
if (!NIL_P(data)) StringValue(data);
|
||||
- name = StringValuePtr(type);
|
||||
-
|
||||
- md = EVP_get_digestbyname(name);
|
||||
- if (!md) {
|
||||
- ossl_raise(rb_eRuntimeError, "Unsupported digest algorithm (%s).", name);
|
||||
- }
|
||||
+
|
||||
GetDigest(self, ctx);
|
||||
EVP_DigestInit_ex(ctx, md, NULL);
|
||||
|
||||
@@ -141,75 +134,25 @@ ossl_digest_update(VALUE self, VALUE data)
|
||||
return self;
|
||||
}
|
||||
|
||||
-static void
|
||||
-digest_final(EVP_MD_CTX *ctx, char **buf, int *buf_len)
|
||||
-{
|
||||
- EVP_MD_CTX final;
|
||||
-
|
||||
- if (!EVP_MD_CTX_copy(&final, ctx)) {
|
||||
- ossl_raise(eDigestError, NULL);
|
||||
- }
|
||||
- if (!(*buf = OPENSSL_malloc(EVP_MD_CTX_size(&final)))) {
|
||||
- EVP_MD_CTX_cleanup(&final);
|
||||
- ossl_raise(eDigestError, "Cannot allocate mem for digest");
|
||||
- }
|
||||
- EVP_DigestFinal_ex(&final, *buf, buf_len);
|
||||
- EVP_MD_CTX_cleanup(&final);
|
||||
-}
|
||||
-
|
||||
-static VALUE
|
||||
-ossl_digest_digest(VALUE self)
|
||||
-{
|
||||
- EVP_MD_CTX *ctx;
|
||||
- char *buf;
|
||||
- int buf_len;
|
||||
- VALUE digest;
|
||||
-
|
||||
- GetDigest(self, ctx);
|
||||
- digest_final(ctx, &buf, &buf_len);
|
||||
- digest = ossl_buf2str(buf, buf_len);
|
||||
-
|
||||
- return digest;
|
||||
-}
|
||||
-
|
||||
static VALUE
|
||||
-ossl_digest_hexdigest(VALUE self)
|
||||
+ossl_digest_finish(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
EVP_MD_CTX *ctx;
|
||||
- char *buf, *hexbuf;
|
||||
- int buf_len;
|
||||
- VALUE hexdigest;
|
||||
+ VALUE str;
|
||||
+ rb_scan_args(argc, argv, "01", &str);
|
||||
|
||||
GetDigest(self, ctx);
|
||||
- digest_final(ctx, &buf, &buf_len);
|
||||
- if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * buf_len) {
|
||||
- OPENSSL_free(buf);
|
||||
- ossl_raise(eDigestError, "Memory alloc error");
|
||||
+ if (NIL_P(str)) {
|
||||
+ str = rb_str_new(NULL, EVP_MD_CTX_size(ctx));
|
||||
+ } else {
|
||||
+ StringValue(str);
|
||||
+ rb_str_resize(str, EVP_MD_CTX_size(ctx));
|
||||
}
|
||||
- OPENSSL_free(buf);
|
||||
- hexdigest = ossl_buf2str(hexbuf, 2 * buf_len);
|
||||
|
||||
- return hexdigest;
|
||||
-}
|
||||
-
|
||||
-static VALUE
|
||||
-ossl_digest_s_digest(VALUE klass, VALUE str, VALUE data)
|
||||
-{
|
||||
- VALUE obj = rb_class_new_instance(1, &str, klass);
|
||||
+ EVP_DigestFinal_ex(ctx, RSTRING_PTR(str), NULL);
|
||||
|
||||
- ossl_digest_update(obj, data);
|
||||
+ return str;
|
||||
|
||||
- return ossl_digest_digest(obj);
|
||||
-}
|
||||
-
|
||||
-static VALUE
|
||||
-ossl_digest_s_hexdigest(VALUE klass, VALUE str, VALUE data)
|
||||
-{
|
||||
- VALUE obj = rb_class_new_instance(1, &str, klass);
|
||||
-
|
||||
- ossl_digest_update(obj, data);
|
||||
-
|
||||
- return ossl_digest_hexdigest(obj);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
@@ -258,41 +201,44 @@ ossl_digest_size(VALUE self)
|
||||
return INT2NUM(EVP_MD_CTX_size(ctx));
|
||||
}
|
||||
|
||||
+static VALUE
|
||||
+ossl_digest_block_length(VALUE self)
|
||||
+{
|
||||
+ EVP_MD_CTX *ctx;
|
||||
+
|
||||
+ GetDigest(self, ctx);
|
||||
+
|
||||
+ return INT2NUM(EVP_MD_CTX_block_size(ctx));
|
||||
+}
|
||||
+
|
||||
+
|
||||
/*
|
||||
* INIT
|
||||
*/
|
||||
void
|
||||
Init_ossl_digest()
|
||||
{
|
||||
+ rb_require("openssl");
|
||||
+ rb_require("digest");
|
||||
+
|
||||
#if 0 /* let rdoc know about mOSSL */
|
||||
mOSSL = rb_define_module("OpenSSL");
|
||||
#endif
|
||||
|
||||
- mDigest = rb_define_module_under(mOSSL, "Digest");
|
||||
-
|
||||
- eDigestError = rb_define_class_under(mDigest, "DigestError", eOSSLError);
|
||||
-
|
||||
- cDigest = rb_define_class_under(mDigest, "Digest", rb_cObject);
|
||||
-
|
||||
+ cDigest = rb_define_class_under(mOSSL, "Digest", rb_path2class("Digest::Class"));
|
||||
+ eDigestError = rb_define_class_under(cDigest, "DigestError", eOSSLError);
|
||||
+
|
||||
rb_define_alloc_func(cDigest, ossl_digest_alloc);
|
||||
- rb_define_singleton_method(cDigest, "digest", ossl_digest_s_digest, 2);
|
||||
- rb_define_singleton_method(cDigest, "hexdigest", ossl_digest_s_hexdigest, 2);
|
||||
-
|
||||
+
|
||||
rb_define_method(cDigest, "initialize", ossl_digest_initialize, -1);
|
||||
- rb_define_method(cDigest, "reset", ossl_digest_reset, 0);
|
||||
-
|
||||
rb_define_copy_func(cDigest, ossl_digest_copy);
|
||||
-
|
||||
- rb_define_method(cDigest, "digest", ossl_digest_digest, 0);
|
||||
- rb_define_method(cDigest, "hexdigest", ossl_digest_hexdigest, 0);
|
||||
- rb_define_alias(cDigest, "inspect", "hexdigest");
|
||||
- rb_define_alias(cDigest, "to_s", "hexdigest");
|
||||
-
|
||||
+ rb_define_method(cDigest, "reset", ossl_digest_reset, 0);
|
||||
rb_define_method(cDigest, "update", ossl_digest_update, 1);
|
||||
rb_define_alias(cDigest, "<<", "update");
|
||||
-
|
||||
- rb_define_method(cDigest, "==", ossl_digest_equal, 1);
|
||||
-
|
||||
+ rb_define_private_method(cDigest, "finish", ossl_digest_finish, -1);
|
||||
+ rb_define_method(cDigest, "digest_length", ossl_digest_size, 0);
|
||||
+ rb_define_method(cDigest, "block_length", ossl_digest_block_length, 0);
|
||||
+
|
||||
rb_define_method(cDigest, "name", ossl_digest_name, 0);
|
||||
- rb_define_method(cDigest, "size", ossl_digest_size, 0);
|
||||
}
|
||||
+
|
111
ruby-1.8head-irb-save-history.patch
Normal file
111
ruby-1.8head-irb-save-history.patch
Normal file
@ -0,0 +1,111 @@
|
||||
Thu Jul 23 15:04:20 2009 Keiju Ishitsuka <keiju@ruby-lang.org>
|
||||
|
||||
ruby* lib/irb.rb, lib/irb/init.rb, lib/irb/ext/save-history.rb: add
|
||||
ruby IRB::irb_at_exit. no use finalizer saving history. [ruby-dev-38563]
|
||||
|
||||
Index: lib/irb/ext/save-history.rb
|
||||
===================================================================
|
||||
--- lib/irb/ext/save-history.rb (revision 24225)
|
||||
+++ lib/irb/ext/save-history.rb (revision 24254)
|
||||
@@ -50,23 +50,24 @@
|
||||
module HistorySavingAbility
|
||||
include Readline
|
||||
|
||||
- def HistorySavingAbility.create_finalizer
|
||||
- proc do
|
||||
- if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) > 0
|
||||
- if hf = IRB.conf[:HISTORY_FILE]
|
||||
- file = File.expand_path(hf)
|
||||
- end
|
||||
- file = IRB.rc_file("_history") unless file
|
||||
- open(file, 'w' ) do |f|
|
||||
- hist = HISTORY.to_a
|
||||
- f.puts(hist[-num..-1] || hist)
|
||||
- end
|
||||
- end
|
||||
- end
|
||||
- end
|
||||
+# def HistorySavingAbility.create_finalizer
|
||||
+# proc do
|
||||
+# if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) > 0
|
||||
+# if hf = IRB.conf[:HISTORY_FILE]
|
||||
+# file = File.expand_path(hf)
|
||||
+# end
|
||||
+# file = IRB.rc_file("_history") unless file
|
||||
+# open(file, 'w' ) do |f|
|
||||
+# hist = HISTORY.to_a
|
||||
+# f.puts(hist[-num..-1] || hist)
|
||||
+# end
|
||||
+# end
|
||||
+# end
|
||||
+# end
|
||||
|
||||
def HistorySavingAbility.extended(obj)
|
||||
- ObjectSpace.define_finalizer(obj, HistorySavingAbility.create_finalizer)
|
||||
+# ObjectSpace.define_finalizer(obj, HistorySavingAbility.create_finalizer)
|
||||
+ IRB.conf[:AT_EXIT].push proc{obj.save_history}
|
||||
obj.load_history
|
||||
obj
|
||||
end
|
||||
@@ -80,6 +81,19 @@
|
||||
end
|
||||
end
|
||||
end
|
||||
+
|
||||
+ def save_history
|
||||
+ if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) > 0
|
||||
+ if history_file = IRB.conf[:HISTORY_FILE]
|
||||
+ history_file = File.expand_path(history_file)
|
||||
+ end
|
||||
+ history_file = IRB.rc_file("_history") unless history_file
|
||||
+ open(history_file, 'w' ) do |f|
|
||||
+ hist = HISTORY.to_a
|
||||
+ f.puts(hist[-num..-1] || hist)
|
||||
+ end
|
||||
+ end
|
||||
+ end
|
||||
end
|
||||
end
|
||||
|
||||
Index: lib/irb/init.rb
|
||||
===================================================================
|
||||
--- lib/irb/init.rb (revision 24225)
|
||||
+++ lib/irb/init.rb (revision 24254)
|
||||
@@ -114,6 +114,8 @@
|
||||
# @CONF[:LC_MESSAGES] = "en"
|
||||
@CONF[:LC_MESSAGES] = Locale.new
|
||||
|
||||
+ @CONF[:AT_EXIT] = []
|
||||
+
|
||||
@CONF[:DEBUG_LEVEL] = 1
|
||||
end
|
||||
|
||||
Index: lib/irb.rb
|
||||
===================================================================
|
||||
--- lib/irb.rb (revision 24225)
|
||||
+++ lib/irb.rb (revision 24254)
|
||||
@@ -65,13 +65,21 @@
|
||||
trap("SIGINT") do
|
||||
irb.signal_handle
|
||||
end
|
||||
-
|
||||
- catch(:IRB_EXIT) do
|
||||
- irb.eval_input
|
||||
+
|
||||
+ begin
|
||||
+ catch(:IRB_EXIT) do
|
||||
+ irb.eval_input
|
||||
+ end
|
||||
+ ensure
|
||||
+ irb_at_exit
|
||||
end
|
||||
# print "\n"
|
||||
end
|
||||
|
||||
+ def IRB.irb_at_exit
|
||||
+ @CONF[:AT_EXIT].each{|hook| hook.call}
|
||||
+ end
|
||||
+
|
||||
def IRB.irb_exit(irb, ret)
|
||||
throw :IRB_EXIT, ret
|
||||
end
|
@ -1,25 +0,0 @@
|
||||
From 28cc0749d6729aa2444661ee7b411e183fe220b0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 19 Nov 2012 15:14:51 +0100
|
||||
Subject: [PATCH] Verbose mkmf.
|
||||
|
||||
---
|
||||
lib/mkmf.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/mkmf.rb b/lib/mkmf.rb
|
||||
index 682eb46..e6b1445 100644
|
||||
--- a/lib/mkmf.rb
|
||||
+++ b/lib/mkmf.rb
|
||||
@@ -1930,7 +1930,7 @@ def configuration(srcdir)
|
||||
SHELL = /bin/sh
|
||||
|
||||
# V=0 quiet, V=1 verbose. other values don't work.
|
||||
-V = 0
|
||||
+V = 1
|
||||
Q1 = $(V:1=)
|
||||
Q = $(Q1:0=@)
|
||||
ECHO1 = $(V:1=@ #{CONFIG['NULLCMD']})
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,28 +0,0 @@
|
||||
From 07c666ba5c3360dd6f43605a8ac7c85c99c1721f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 1 Oct 2013 12:22:40 +0200
|
||||
Subject: [PATCH] Allow to configure libruby.so placement.
|
||||
|
||||
---
|
||||
configure.ac | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index d261ea57b5..3c13076b82 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3105,6 +3105,11 @@ AS_IF([test ${multiarch+set}], [
|
||||
])
|
||||
|
||||
archlibdir='${libdir}/${arch}'
|
||||
+AC_ARG_WITH(archlibdir,
|
||||
+ AS_HELP_STRING([--with-archlibdir=DIR],
|
||||
+ [prefix for libruby [[LIBDIR/ARCH]]]),
|
||||
+ [archlibdir="$withval"])
|
||||
+
|
||||
sitearchlibdir='${libdir}/${sitearch}'
|
||||
archincludedir='${includedir}/${arch}'
|
||||
sitearchincludedir='${includedir}/${sitearch}'
|
||||
--
|
||||
2.22.0
|
||||
|
@ -1,80 +0,0 @@
|
||||
From e24d97c938c481450ed80ec83e5399595946c1ae Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Fri, 8 Feb 2013 22:48:41 +0100
|
||||
Subject: [PATCH] Prevent duplicated paths when empty version string is
|
||||
configured.
|
||||
|
||||
---
|
||||
configure.ac | 3 ++-
|
||||
loadpath.c | 12 ++++++++++++
|
||||
tool/mkconfig.rb | 2 +-
|
||||
3 files changed, 15 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index c42436c23d..d261ea57b5 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3743,7 +3743,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
||||
ruby_version_dir=/'${ruby_version_dir_name}'
|
||||
|
||||
if test -z "${ruby_version_dir_name}"; then
|
||||
- AC_MSG_ERROR([No ruby version, No place for bundled libraries])
|
||||
+ unset ruby_version_dir
|
||||
+ AC_DEFINE(RUBY_LIB_VERSION_BLANK, 1)
|
||||
fi
|
||||
|
||||
rubylibdir='${rubylibprefix}'${ruby_version_dir}
|
||||
diff --git a/loadpath.c b/loadpath.c
|
||||
index 9160031..0d4d953 100644
|
||||
--- a/loadpath.c
|
||||
+++ b/loadpath.c
|
||||
@@ -65,21 +65,33 @@ const char ruby_initial_load_paths[] =
|
||||
RUBY_SEARCH_PATH "\0"
|
||||
#endif
|
||||
#ifndef NO_RUBY_SITE_LIB
|
||||
+#ifdef RUBY_LIB_VERSION_BLANK
|
||||
+ RUBY_SITE_LIB "\0"
|
||||
+#else
|
||||
RUBY_SITE_LIB2 "\0"
|
||||
+#endif
|
||||
#ifdef RUBY_THINARCH
|
||||
RUBY_SITE_ARCH_LIB_FOR(RUBY_THINARCH) "\0"
|
||||
#endif
|
||||
RUBY_SITE_ARCH_LIB_FOR(RUBY_SITEARCH) "\0"
|
||||
+#ifndef RUBY_LIB_VERSION_BLANK
|
||||
RUBY_SITE_LIB "\0"
|
||||
#endif
|
||||
+#endif
|
||||
|
||||
#ifndef NO_RUBY_VENDOR_LIB
|
||||
+#ifdef RUBY_LIB_VERSION_BLANK
|
||||
+ RUBY_VENDOR_LIB "\0"
|
||||
+#else
|
||||
RUBY_VENDOR_LIB2 "\0"
|
||||
+#endif
|
||||
#ifdef RUBY_THINARCH
|
||||
RUBY_VENDOR_ARCH_LIB_FOR(RUBY_THINARCH) "\0"
|
||||
#endif
|
||||
RUBY_VENDOR_ARCH_LIB_FOR(RUBY_SITEARCH) "\0"
|
||||
+#ifndef RUBY_LIB_VERSION_BLANK
|
||||
RUBY_VENDOR_LIB "\0"
|
||||
+#endif
|
||||
#endif
|
||||
|
||||
RUBY_LIB "\0"
|
||||
diff --git a/tool/mkconfig.rb b/tool/mkconfig.rb
|
||||
index 07076d4..35e6c3c 100755
|
||||
--- a/tool/mkconfig.rb
|
||||
+++ b/tool/mkconfig.rb
|
||||
@@ -114,7 +114,7 @@
|
||||
val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
|
||||
case name
|
||||
when /^prefix$/
|
||||
- val = "(TOPDIR || DESTDIR + #{val})"
|
||||
+ val = "(((TOPDIR && TOPDIR.empty?) ? nil : TOPDIR) || DESTDIR + #{val})"
|
||||
when /^ARCH_FLAG$/
|
||||
val = "arch_flag || #{val}" if universal
|
||||
when /^UNIVERSAL_ARCHNAMES$/
|
||||
--
|
||||
1.9.0
|
||||
|
@ -1,25 +0,0 @@
|
||||
From 2089cab72b38d6d5e7ba2b596e41014209acad30 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 19 Nov 2012 14:37:28 +0100
|
||||
Subject: [PATCH] Always use i386.
|
||||
|
||||
---
|
||||
configure.ac | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 3c13076b82..93af30321d 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3807,6 +3807,8 @@ AC_SUBST(vendorarchdir)dnl
|
||||
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
||||
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
||||
|
||||
+target_cpu=`echo $target_cpu | sed s/i.86/i386/`
|
||||
+
|
||||
AS_IF([test "${universal_binary-no}" = yes ], [
|
||||
arch="universal-${target_os}"
|
||||
AS_IF([test "${rb_cv_architecture_available}" = yes], [
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,97 +0,0 @@
|
||||
From 94da59aafacc6a9efe829529eb51385588d6f149 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Fri, 11 Nov 2011 13:14:45 +0100
|
||||
Subject: [PATCH] Allow to install RubyGems into custom location, outside of
|
||||
Ruby tree.
|
||||
|
||||
---
|
||||
configure.ac | 5 +++++
|
||||
loadpath.c | 4 ++++
|
||||
template/verconf.h.tmpl | 3 +++
|
||||
tool/rbinstall.rb | 10 ++++++++++
|
||||
4 files changed, 22 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 93af30321d..bc13397e0e 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3779,6 +3779,10 @@ AC_ARG_WITH(vendorarchdir,
|
||||
[vendorarchdir=$withval],
|
||||
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
||||
|
||||
+AC_ARG_WITH(rubygemsdir,
|
||||
+ AS_HELP_STRING([--with-rubygemsdir=DIR], [custom rubygems directory]),
|
||||
+ [rubygemsdir=$withval])
|
||||
+
|
||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||
RUBY_EXEC_PREFIX=''
|
||||
@@ -3803,6 +3807,7 @@ AC_SUBST(sitearchdir)dnl
|
||||
AC_SUBST(vendordir)dnl
|
||||
AC_SUBST(vendorlibdir)dnl
|
||||
AC_SUBST(vendorarchdir)dnl
|
||||
+AC_SUBST(rubygemsdir)dnl
|
||||
|
||||
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
||||
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
||||
diff --git a/loadpath.c b/loadpath.c
|
||||
index 623dc9d..74c5d9e 100644
|
||||
--- a/loadpath.c
|
||||
+++ b/loadpath.c
|
||||
@@ -94,6 +94,10 @@ const char ruby_initial_load_paths[] =
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+#ifdef RUBYGEMS_DIR
|
||||
+ RUBYGEMS_DIR "\0"
|
||||
+#endif
|
||||
+
|
||||
RUBY_LIB "\0"
|
||||
#ifdef RUBY_THINARCH
|
||||
RUBY_ARCH_LIB_FOR(RUBY_THINARCH) "\0"
|
||||
diff --git a/template/verconf.h.tmpl b/template/verconf.h.tmpl
|
||||
index 79c003e..34f2382 100644
|
||||
--- a/template/verconf.h.tmpl
|
||||
+++ b/template/verconf.h.tmpl
|
||||
@@ -36,6 +36,9 @@
|
||||
% if C["RUBY_SEARCH_PATH"]
|
||||
#define RUBY_SEARCH_PATH "${RUBY_SEARCH_PATH}"
|
||||
% end
|
||||
+% if C["rubygemsdir"]
|
||||
+#define RUBYGEMS_DIR "${rubygemsdir}"
|
||||
+% end
|
||||
%
|
||||
% R = {}
|
||||
% R["ruby_version"] = '"RUBY_LIB_VERSION"'
|
||||
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
||||
index b47b6e1..0b99408 100755
|
||||
--- a/tool/rbinstall.rb
|
||||
+++ b/tool/rbinstall.rb
|
||||
@@ -343,6 +343,7 @@ def CONFIG.[](name, mandatory = false)
|
||||
vendorlibdir = CONFIG["vendorlibdir"]
|
||||
vendorarchlibdir = CONFIG["vendorarchdir"]
|
||||
end
|
||||
+rubygemsdir = CONFIG["rubygemsdir"]
|
||||
mandir = CONFIG["mandir", true]
|
||||
docdir = CONFIG["docdir", true]
|
||||
enable_shared = CONFIG["ENABLE_SHARED"] == 'yes'
|
||||
@@ -570,7 +571,16 @@ def stub
|
||||
install?(:local, :comm, :lib) do
|
||||
prepare "library scripts", rubylibdir
|
||||
noinst = %w[*.txt *.rdoc *.gemspec]
|
||||
+ # Bundler carries "rubygems.rb" file, so it must be specialcased :/
|
||||
+ noinst += %w[rubygems.rb rubygems/ bundler.rb bundler/] if rubygemsdir
|
||||
install_recursive(File.join(srcdir, "lib"), rubylibdir, :no_install => noinst, :mode => $data_mode)
|
||||
+ if rubygemsdir
|
||||
+ noinst = %w[*.txt *.rdoc *.gemspec]
|
||||
+ install_recursive(File.join(srcdir, "lib", "rubygems"), File.join(rubygemsdir, "rubygems"), :no_install => noinst, :mode => $data_mode)
|
||||
+ install(File.join(srcdir, "lib", "rubygems.rb"), File.join(rubygemsdir, "rubygems.rb"), :mode => $data_mode)
|
||||
+ install_recursive(File.join(srcdir, "lib", "bundler"), File.join(rubylibdir, "bundler"), :no_install => noinst, :mode => $data_mode)
|
||||
+ install(File.join(srcdir, "lib", "bundler.rb"), rubylibdir, :mode => $data_mode)
|
||||
+ end
|
||||
end
|
||||
|
||||
install?(:local, :comm, :hdr, :'comm-hdr') do
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,288 +0,0 @@
|
||||
From 4fc1be3af3f58621bb751c9e63c208b15c0e8d16 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 31 Mar 2015 16:21:04 +0200
|
||||
Subject: [PATCH 1/4] Use ruby_version_dir_name for versioned directories.
|
||||
|
||||
This disallows changing the ruby_version constant by --with-ruby-version
|
||||
configuration options. The two places version numbers are disallowed as
|
||||
well, since there are a lot of places which cannot handle this format
|
||||
properly.
|
||||
|
||||
ruby_version_dir_name now specifies custom version string for versioned
|
||||
directories, e.g. instead of default X.Y.Z, you can specify whatever
|
||||
string.
|
||||
---
|
||||
configure.ac | 64 ++++++++++++++++++++++++---------------------
|
||||
template/ruby.pc.in | 1 +
|
||||
2 files changed, 35 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 80b137e380..63cd3b4f8b 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3694,9 +3694,6 @@ AS_CASE(["$target_os"],
|
||||
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
|
||||
])
|
||||
|
||||
-rubylibdir='${rubylibprefix}/${ruby_version}'
|
||||
-rubyarchdir=${multiarch+'${rubyarchprefix}/${ruby_version}'}${multiarch-'${rubylibdir}/${arch}'}
|
||||
-
|
||||
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
|
||||
AC_ARG_WITH(rubyarchprefix,
|
||||
AS_HELP_STRING([--with-rubyarchprefix=DIR],
|
||||
@@ -3719,56 +3716,62 @@ AC_ARG_WITH(ridir,
|
||||
AC_SUBST(ridir)
|
||||
AC_SUBST(RI_BASE_NAME)
|
||||
|
||||
-AC_ARG_WITH(ruby-version,
|
||||
- AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|minor|STR)]),
|
||||
- [ruby_version=$withval],
|
||||
- [ruby_version=full])
|
||||
unset RUBY_LIB_VERSION
|
||||
-unset RUBY_LIB_VERSION_STYLE
|
||||
-AS_CASE(["$ruby_version"],
|
||||
- [full], [RUBY_LIB_VERSION_STYLE='3 /* full */'],
|
||||
- [minor], [RUBY_LIB_VERSION_STYLE='2 /* minor */'])
|
||||
-AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [
|
||||
- {
|
||||
- echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
|
||||
- echo '#define STRINGIZE(x) x'
|
||||
- test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
|
||||
- echo '#include "version.h"'
|
||||
- echo 'ruby_version=RUBY_LIB_VERSION'
|
||||
- } > conftest.c
|
||||
- ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
|
||||
- eval $ruby_version
|
||||
-], [test -z "${ruby_version}"], [
|
||||
- AC_MSG_ERROR([No ruby version, No place for bundled libraries])
|
||||
-], [
|
||||
- RUBY_LIB_VERSION="${ruby_version}"
|
||||
-])
|
||||
+RUBY_LIB_VERSION_STYLE='3 /* full */'
|
||||
+{
|
||||
+echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
|
||||
+echo '#define STRINGIZE(x) x'
|
||||
+test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
|
||||
+echo '#include "version.h"'
|
||||
+echo 'ruby_version=RUBY_LIB_VERSION'
|
||||
+} > conftest.c
|
||||
+ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
|
||||
+eval $ruby_version
|
||||
+
|
||||
+RUBY_LIB_VERSION="${ruby_version}"
|
||||
+
|
||||
AC_SUBST(RUBY_LIB_VERSION_STYLE)
|
||||
AC_SUBST(RUBY_LIB_VERSION)
|
||||
|
||||
+AC_ARG_WITH(ruby-version,
|
||||
+ AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|STR)]),
|
||||
+ [ruby_version_dir_name=$withval],
|
||||
+ [ruby_version_dir_name=full])
|
||||
+AS_CASE(["$ruby_version_dir_name"],
|
||||
+ [full], [ruby_version_dir_name='${ruby_version}'])
|
||||
+
|
||||
+ruby_version_dir=/'${ruby_version_dir_name}'
|
||||
+
|
||||
+if test -z "${ruby_version_dir_name}"; then
|
||||
+ AC_MSG_ERROR([No ruby version, No place for bundled libraries])
|
||||
+fi
|
||||
+
|
||||
+rubylibdir='${rubylibprefix}'${ruby_version_dir}
|
||||
+rubyarchdir=${multiarch+'${rubyarchprefix}'${ruby_version_dir}}${multiarch-'${rubylibdir}/${arch}'}
|
||||
+
|
||||
AC_ARG_WITH(sitedir,
|
||||
AS_HELP_STRING([--with-sitedir=DIR], [site libraries in DIR [[RUBY_LIB_PREFIX/site_ruby]], "no" to disable site directory]),
|
||||
[sitedir=$withval],
|
||||
[sitedir='${rubylibprefix}/site_ruby'])
|
||||
-sitelibdir='${sitedir}/${ruby_version}'
|
||||
+sitelibdir='${sitedir}'${ruby_version_dir}
|
||||
|
||||
AC_ARG_WITH(sitearchdir,
|
||||
AS_HELP_STRING([--with-sitearchdir=DIR],
|
||||
[architecture dependent site libraries in DIR [[SITEDIR/SITEARCH]], "no" to disable site directory]),
|
||||
[sitearchdir=$withval],
|
||||
- [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby/${ruby_version}'}${multiarch-'${sitelibdir}/${sitearch}'}])
|
||||
+ [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby'${ruby_version_dir}}${multiarch-'${sitelibdir}/${sitearch}'}])
|
||||
|
||||
AC_ARG_WITH(vendordir,
|
||||
AS_HELP_STRING([--with-vendordir=DIR], [vendor libraries in DIR [[RUBY_LIB_PREFIX/vendor_ruby]], "no" to disable vendor directory]),
|
||||
[vendordir=$withval],
|
||||
[vendordir='${rubylibprefix}/vendor_ruby'])
|
||||
-vendorlibdir='${vendordir}/${ruby_version}'
|
||||
+vendorlibdir='${vendordir}'${ruby_version_dir}
|
||||
|
||||
AC_ARG_WITH(vendorarchdir,
|
||||
AS_HELP_STRING([--with-vendorarchdir=DIR],
|
||||
[architecture dependent vendor libraries in DIR [[VENDORDIR/SITEARCH]], "no" to disable vendor directory]),
|
||||
[vendorarchdir=$withval],
|
||||
- [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby/${ruby_version}'}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
||||
+ [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
||||
|
||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||
@@ -3785,6 +3788,7 @@ AC_SUBST(sitearchincludedir)dnl
|
||||
AC_SUBST(arch)dnl
|
||||
AC_SUBST(sitearch)dnl
|
||||
AC_SUBST(ruby_version)dnl
|
||||
+AC_SUBST(ruby_version_dir_name)dnl
|
||||
AC_SUBST(rubylibdir)dnl
|
||||
AC_SUBST(rubyarchdir)dnl
|
||||
AC_SUBST(sitedir)dnl
|
||||
diff --git a/template/ruby.pc.in b/template/ruby.pc.in
|
||||
index 8a2c066..c81b211 100644
|
||||
--- a/template/ruby.pc.in
|
||||
+++ b/template/ruby.pc.in
|
||||
@@ -9,6 +9,7 @@ MAJOR=@MAJOR@
|
||||
MINOR=@MINOR@
|
||||
TEENY=@TEENY@
|
||||
ruby_version=@ruby_version@
|
||||
+ruby_version_dir_name=@ruby_version_dir_name@
|
||||
RUBY_API_VERSION=@RUBY_API_VERSION@
|
||||
RUBY_PROGRAM_VERSION=@RUBY_PROGRAM_VERSION@
|
||||
RUBY_BASE_NAME=@RUBY_BASE_NAME@
|
||||
--
|
||||
2.1.0
|
||||
|
||||
|
||||
From 518850aba6eee76de7715aae8d37330e34b01983 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 31 Mar 2015 16:37:26 +0200
|
||||
Subject: [PATCH 2/4] Add ruby_version_dir_name support for RDoc.
|
||||
|
||||
---
|
||||
lib/rdoc/ri/paths.rb | 2 +-
|
||||
tool/rbinstall.rb | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/rdoc/ri/paths.rb b/lib/rdoc/ri/paths.rb
|
||||
index 970cb91..5bf8230 100644
|
||||
--- a/lib/rdoc/ri/paths.rb
|
||||
+++ b/lib/rdoc/ri/paths.rb
|
||||
@@ -10,7 +10,7 @@ module RDoc::RI::Paths
|
||||
#:stopdoc:
|
||||
require 'rbconfig'
|
||||
|
||||
- version = RbConfig::CONFIG['ruby_version']
|
||||
+ version = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
|
||||
BASE = if RbConfig::CONFIG.key? 'ridir' then
|
||||
File.join RbConfig::CONFIG['ridir'], version
|
||||
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
||||
index d4c110e..d39c9a6 100755
|
||||
--- a/tool/rbinstall.rb
|
||||
+++ b/tool/rbinstall.rb
|
||||
@@ -433,7 +433,7 @@ def CONFIG.[](name, mandatory = false)
|
||||
|
||||
install?(:doc, :rdoc) do
|
||||
if $rdocdir
|
||||
- ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version'], "system")
|
||||
+ ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version_dir_name'] || CONFIG['ruby_version'], "system")
|
||||
prepare "rdoc", ridatadir
|
||||
install_recursive($rdocdir, ridatadir, :no_install => rdoc_noinst, :mode => $data_mode)
|
||||
end
|
||||
--
|
||||
2.23.0
|
||||
|
||||
|
||||
From 9f0ec0233f618cbb862629816b22491c3df79578 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Tue, 31 Mar 2015 16:37:44 +0200
|
||||
Subject: [PATCH 3/4] Add ruby_version_dir_name support for RubyGems.
|
||||
|
||||
---
|
||||
lib/rubygems/defaults.rb | 9 +++++----
|
||||
test/rubygems/test_gem.rb | 5 +++--
|
||||
2 files changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb
|
||||
index d4ff4a262c..3f9a5bf590 100644
|
||||
--- a/lib/rubygems/defaults.rb
|
||||
+++ b/lib/rubygems/defaults.rb
|
||||
@@ -32,13 +32,13 @@ def self.default_dir
|
||||
[
|
||||
File.dirname(RbConfig::CONFIG['sitedir']),
|
||||
'Gems',
|
||||
- RbConfig::CONFIG['ruby_version']
|
||||
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
]
|
||||
else
|
||||
[
|
||||
RbConfig::CONFIG['rubylibprefix'],
|
||||
'gems',
|
||||
- RbConfig::CONFIG['ruby_version']
|
||||
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
]
|
||||
end
|
||||
|
||||
@@ -75,7 +75,8 @@ def self.default_specifications_dir
|
||||
|
||||
def self.user_dir
|
||||
parts = [Gem.user_home, '.gem', ruby_engine]
|
||||
- parts << RbConfig::CONFIG['ruby_version'] unless RbConfig::CONFIG['ruby_version'].empty?
|
||||
+ ruby_version_dir_name = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
+ parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
|
||||
File.join parts
|
||||
end
|
||||
|
||||
@@ -158,7 +159,7 @@ def self.vendor_dir # :nodoc:
|
||||
return nil unless RbConfig::CONFIG.key? 'vendordir'
|
||||
|
||||
File.join RbConfig::CONFIG['vendordir'], 'gems',
|
||||
- RbConfig::CONFIG['ruby_version']
|
||||
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
end
|
||||
|
||||
##
|
||||
diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb
|
||||
index b25068405d..e9fef4a311 100644
|
||||
--- a/test/rubygems/test_gem.rb
|
||||
+++ b/test/rubygems/test_gem.rb
|
||||
@@ -1378,7 +1378,8 @@ def test_self_use_paths
|
||||
|
||||
def test_self_user_dir
|
||||
parts = [@userhome, '.gem', Gem.ruby_engine]
|
||||
- parts << RbConfig::CONFIG['ruby_version'] unless RbConfig::CONFIG['ruby_version'].empty?
|
||||
+ ruby_version_dir_name = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
+ parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
|
||||
|
||||
assert_equal File.join(parts), Gem.user_dir
|
||||
end
|
||||
@@ -1454,7 +1455,7 @@ def test_self_vendor_dir
|
||||
vendordir(File.join(@tempdir, 'vendor')) do
|
||||
expected =
|
||||
File.join RbConfig::CONFIG['vendordir'], 'gems',
|
||||
- RbConfig::CONFIG['ruby_version']
|
||||
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||
|
||||
assert_equal expected, Gem.vendor_dir
|
||||
end
|
||||
--
|
||||
2.1.0
|
||||
|
||||
|
||||
From 88c38a030c22dbf9422ece847bdfbf87d6659313 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Wed, 1 Apr 2015 14:55:37 +0200
|
||||
Subject: [PATCH 4/4] Let headers directories follow the configured version
|
||||
name.
|
||||
|
||||
---
|
||||
configure.ac | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index a00f2b6776..999e2d6d5d 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -98,7 +98,7 @@ RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
|
||||
RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
|
||||
AC_SUBST(RUBY_BASE_NAME)
|
||||
AC_SUBST(RUBYW_BASE_NAME)
|
||||
-AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}')
|
||||
+AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version_dir_name}')
|
||||
|
||||
AC_CANONICAL_TARGET
|
||||
test x"$target_alias" = x &&
|
||||
--
|
||||
2.1.0
|
||||
|
@ -1,136 +0,0 @@
|
||||
From 346e147ba6480839b87046e9a9efab0bf6ed3660 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Wed, 10 Aug 2016 17:35:48 +0200
|
||||
Subject: [PATCH] Rely on ldd to detect glibc.
|
||||
|
||||
This is just workaround, since we know we are quite sure this will be successful
|
||||
on Red Hat platforms.
|
||||
|
||||
This workaround rhbz#1361037
|
||||
---
|
||||
test/fiddle/helper.rb | 111 ------------------------------------------
|
||||
1 file changed, 111 deletions(-)
|
||||
|
||||
diff --git a/test/fiddle/helper.rb b/test/fiddle/helper.rb
|
||||
index 1da3d93..65148a1 100644
|
||||
--- a/test/fiddle/helper.rb
|
||||
+++ b/test/fiddle/helper.rb
|
||||
@@ -6,115 +6,6 @@
|
||||
|
||||
libc_so = libm_so = nil
|
||||
|
||||
-case RUBY_PLATFORM
|
||||
-when /cygwin/
|
||||
- libc_so = "cygwin1.dll"
|
||||
- libm_so = "cygwin1.dll"
|
||||
-when /android/
|
||||
- libdir = '/system/lib'
|
||||
- if [0].pack('L!').size == 8
|
||||
- libdir = '/system/lib64'
|
||||
- end
|
||||
- libc_so = File.join(libdir, "libc.so")
|
||||
- libm_so = File.join(libdir, "libm.so")
|
||||
-when /linux/
|
||||
- libdir = '/lib'
|
||||
- case RbConfig::SIZEOF['void*']
|
||||
- when 4
|
||||
- # 32-bit ruby
|
||||
- case RUBY_PLATFORM
|
||||
- when /armv\w+-linux/
|
||||
- # In the ARM 32-bit libc package such as libc6:armhf libc6:armel,
|
||||
- # libc.so and libm.so are installed to /lib/arm-linux-gnu*.
|
||||
- # It's not installed to /lib32.
|
||||
- dirs = Dir.glob('/lib/arm-linux-gnu*')
|
||||
- libdir = dirs[0] if dirs && File.directory?(dirs[0])
|
||||
- else
|
||||
- libdir = '/lib32' if File.directory? '/lib32'
|
||||
- end
|
||||
- when 8
|
||||
- # 64-bit ruby
|
||||
- libdir = '/lib64' if File.directory? '/lib64'
|
||||
- end
|
||||
- libc_so = File.join(libdir, "libc.so.6")
|
||||
- libm_so = File.join(libdir, "libm.so.6")
|
||||
-when /mingw/, /mswin/
|
||||
- require "rbconfig"
|
||||
- crtname = RbConfig::CONFIG["RUBY_SO_NAME"][/msvc\w+/] || 'ucrtbase'
|
||||
- libc_so = libm_so = "#{crtname}.dll"
|
||||
-when /darwin/
|
||||
- libc_so = libm_so = "/usr/lib/libSystem.B.dylib"
|
||||
-when /kfreebsd/
|
||||
- libc_so = "/lib/libc.so.0.1"
|
||||
- libm_so = "/lib/libm.so.1"
|
||||
-when /gnu/ #GNU/Hurd
|
||||
- libc_so = "/lib/libc.so.0.3"
|
||||
- libm_so = "/lib/libm.so.6"
|
||||
-when /mirbsd/
|
||||
- libc_so = "/usr/lib/libc.so.41.10"
|
||||
- libm_so = "/usr/lib/libm.so.7.0"
|
||||
-when /freebsd/
|
||||
- libc_so = "/lib/libc.so.7"
|
||||
- libm_so = "/lib/libm.so.5"
|
||||
-when /bsd|dragonfly/
|
||||
- libc_so = "/usr/lib/libc.so"
|
||||
- libm_so = "/usr/lib/libm.so"
|
||||
-when /solaris/
|
||||
- libdir = '/lib'
|
||||
- case RbConfig::SIZEOF['void*']
|
||||
- when 4
|
||||
- # 32-bit ruby
|
||||
- libdir = '/lib' if File.directory? '/lib'
|
||||
- when 8
|
||||
- # 64-bit ruby
|
||||
- libdir = '/lib/64' if File.directory? '/lib/64'
|
||||
- end
|
||||
- libc_so = File.join(libdir, "libc.so")
|
||||
- libm_so = File.join(libdir, "libm.so")
|
||||
-when /aix/
|
||||
- pwd=Dir.pwd
|
||||
- libc_so = libm_so = "#{pwd}/libaixdltest.so"
|
||||
- unless File.exist? libc_so
|
||||
- cobjs=%w!strcpy.o!
|
||||
- mobjs=%w!floats.o sin.o!
|
||||
- funcs=%w!sin sinf strcpy strncpy!
|
||||
- expfile='dltest.exp'
|
||||
- require 'tmpdir'
|
||||
- Dir.mktmpdir do |dir|
|
||||
- begin
|
||||
- Dir.chdir dir
|
||||
- %x!/usr/bin/ar x /usr/lib/libc.a #{cobjs.join(' ')}!
|
||||
- %x!/usr/bin/ar x /usr/lib/libm.a #{mobjs.join(' ')}!
|
||||
- %x!echo "#{funcs.join("\n")}\n" > #{expfile}!
|
||||
- require 'rbconfig'
|
||||
- if RbConfig::CONFIG["GCC"] = 'yes'
|
||||
- lflag='-Wl,'
|
||||
- else
|
||||
- lflag=''
|
||||
- end
|
||||
- flags="#{lflag}-bE:#{expfile} #{lflag}-bnoentry -lm"
|
||||
- %x!#{RbConfig::CONFIG["LDSHARED"]} -o #{libc_so} #{(cobjs+mobjs).join(' ')} #{flags}!
|
||||
- ensure
|
||||
- Dir.chdir pwd
|
||||
- end
|
||||
- end
|
||||
- end
|
||||
-else
|
||||
- libc_so = ARGV[0] if ARGV[0] && ARGV[0][0] == ?/
|
||||
- libm_so = ARGV[1] if ARGV[1] && ARGV[1][0] == ?/
|
||||
- if( !(libc_so && libm_so) )
|
||||
- $stderr.puts("libc and libm not found: #{$0} <libc> <libm>")
|
||||
- end
|
||||
-end
|
||||
-
|
||||
-libc_so = nil if !libc_so || (libc_so[0] == ?/ && !File.file?(libc_so))
|
||||
-libm_so = nil if !libm_so || (libm_so[0] == ?/ && !File.file?(libm_so))
|
||||
-
|
||||
-# macOS 11.0+ removed libSystem.B.dylib from /usr/lib. But It works with dlopen.
|
||||
-if RUBY_PLATFORM =~ /darwin/
|
||||
- libc_so = libm_so = "/usr/lib/libSystem.B.dylib"
|
||||
-end
|
||||
-
|
||||
if !libc_so || !libm_so
|
||||
ruby = EnvUtil.rubybin
|
||||
# When the ruby binary is 32-bit and the host is 64-bit,
|
||||
--
|
||||
2.9.2
|
||||
|
@ -1,77 +0,0 @@
|
||||
From eca084e4079c77c061045df9c21b219175b05228 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 6 Jan 2020 13:56:04 +0100
|
||||
Subject: [PATCH] Initialize ABRT hook.
|
||||
|
||||
The ABRT hook used to be initialized by preludes via patches [[1], [2]].
|
||||
Unfortunately, due to [[3]] and especially since [[4]], this would
|
||||
require boostrapping [[5]].
|
||||
|
||||
To keep the things simple for now, load the ABRT hook via C.
|
||||
|
||||
[1]: https://bugs.ruby-lang.org/issues/8566
|
||||
[2]: https://bugs.ruby-lang.org/issues/15306
|
||||
[3]: https://bugs.ruby-lang.org/issues/16254
|
||||
[4]: https://github.com/ruby/ruby/pull/2735
|
||||
[5]: https://lists.fedoraproject.org/archives/list/ruby-sig@lists.fedoraproject.org/message/LH6L6YJOYQT4Y5ZNOO4SLIPTUWZ5V45Q/
|
||||
---
|
||||
abrt.c | 12 ++++++++++++++
|
||||
common.mk | 3 ++-
|
||||
ruby.c | 4 ++++
|
||||
3 files changed, 18 insertions(+), 1 deletion(-)
|
||||
create mode 100644 abrt.c
|
||||
|
||||
diff --git a/abrt.c b/abrt.c
|
||||
new file mode 100644
|
||||
index 0000000000..74b0bd5c0f
|
||||
--- /dev/null
|
||||
+++ b/abrt.c
|
||||
@@ -0,0 +1,12 @@
|
||||
+#include "internal.h"
|
||||
+
|
||||
+void
|
||||
+Init_abrt(void)
|
||||
+{
|
||||
+ rb_eval_string(
|
||||
+ " begin\n"
|
||||
+ " require 'abrt'\n"
|
||||
+ " rescue LoadError\n"
|
||||
+ " end\n"
|
||||
+ );
|
||||
+}
|
||||
diff --git a/common.mk b/common.mk
|
||||
index b2e5b2b6d0..f39f81da5c 100644
|
||||
--- a/common.mk
|
||||
+++ b/common.mk
|
||||
@@ -81,7 +81,8 @@ ENC_MK = enc.mk
|
||||
MAKE_ENC = -f $(ENC_MK) V="$(V)" UNICODE_HDR_DIR="$(UNICODE_HDR_DIR)" \
|
||||
RUBY="$(MINIRUBY)" MINIRUBY="$(MINIRUBY)" $(mflags)
|
||||
|
||||
-COMMONOBJS = array.$(OBJEXT) \
|
||||
+COMMONOBJS = abrt.$(OBJEXT) \
|
||||
+ array.$(OBJEXT) \
|
||||
ast.$(OBJEXT) \
|
||||
bignum.$(OBJEXT) \
|
||||
class.$(OBJEXT) \
|
||||
diff --git a/ruby.c b/ruby.c
|
||||
index 60c57d6259..1eec16f2c8 100644
|
||||
--- a/ruby.c
|
||||
+++ b/ruby.c
|
||||
@@ -1451,10 +1451,14 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt)
|
||||
|
||||
void Init_builtin_features(void);
|
||||
|
||||
+/* abrt.c */
|
||||
+void Init_abrt(void);
|
||||
+
|
||||
static void
|
||||
ruby_init_prelude(void)
|
||||
{
|
||||
Init_builtin_features();
|
||||
+ Init_abrt();
|
||||
rb_const_remove(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX"));
|
||||
}
|
||||
|
||||
--
|
||||
2.24.1
|
||||
|
@ -1,32 +0,0 @@
|
||||
From 6532dbecf36d1f24dab1f2143afd171e0b7699eb Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Wed, 4 Sep 2019 15:07:07 +0200
|
||||
Subject: [PATCH] Remove RubyGems dependency.
|
||||
|
||||
Since `Process::RLIMIT_NOFILE` is platform specific, better to use Ruby
|
||||
introspection than detecting platform.
|
||||
---
|
||||
.../vendor/net-http-persistent/lib/net/http/persistent.rb | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb b/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb
|
||||
index a54be2a..06739f1 100644
|
||||
--- a/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb
|
||||
+++ b/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb
|
||||
@@ -197,10 +197,10 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
||||
##
|
||||
# The default connection pool size is 1/4 the allowed open files.
|
||||
|
||||
- if Gem.win_platform? then
|
||||
- DEFAULT_POOL_SIZE = 256
|
||||
- else
|
||||
+ if Process.const_defined? :RLIMIT_NOFILE
|
||||
DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
|
||||
+ else
|
||||
+ DEFAULT_POOL_SIZE = 256
|
||||
end
|
||||
|
||||
##
|
||||
--
|
||||
2.23.0
|
||||
|
@ -1,34 +0,0 @@
|
||||
From 9b42fce32bff25e0569581f76f532b9d57865aef Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||
Date: Mon, 27 Jul 2020 14:56:05 +0200
|
||||
Subject: [PATCH] Timeout the test_bug_reporter_add witout raising error.
|
||||
|
||||
While timeouting the threads might be still good idea, it does not seems
|
||||
the timeout impacts the TestBugReporter#test_bug_reporter_add result,
|
||||
because the output of the child process has been already collected
|
||||
earlier.
|
||||
|
||||
It seems that when the system is under heavy load, the thread might not
|
||||
be sheduled to finish its processing. Even finishing the child process
|
||||
might take tens of seconds and therefore the test case finish might take
|
||||
a while.
|
||||
---
|
||||
test/-ext-/bug_reporter/test_bug_reporter.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/test/-ext-/bug_reporter/test_bug_reporter.rb b/test/-ext-/bug_reporter/test_bug_reporter.rb
|
||||
index 628fcd0340..2c677cc8a7 100644
|
||||
--- a/test/-ext-/bug_reporter/test_bug_reporter.rb
|
||||
+++ b/test/-ext-/bug_reporter/test_bug_reporter.rb
|
||||
@@ -19,7 +19,7 @@ def test_bug_reporter_add
|
||||
args = ["--disable-gems", "-r-test-/bug_reporter",
|
||||
"-C", tmpdir]
|
||||
stdin = "register_sample_bug_reporter(12345); Process.kill :SEGV, $$"
|
||||
- assert_in_out_err(args, stdin, [], expected_stderr, encoding: "ASCII-8BIT")
|
||||
+ assert_in_out_err(args, stdin, [], expected_stderr, encoding: "ASCII-8BIT", timeout_error: nil)
|
||||
ensure
|
||||
FileUtils.rm_rf(tmpdir) if tmpdir
|
||||
end
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,22 +0,0 @@
|
||||
From 0689147586c6cb56b91bf0f368890f19d630ece1 Mon Sep 17 00:00:00 2001
|
||||
From: nobletrout <nobletrout@gmail.com>
|
||||
Date: Tue, 5 Feb 2019 08:14:02 -0500
|
||||
Subject: [PATCH] remove unneeded gem require for ipaddr
|
||||
|
||||
ipaddr is a builtin class for ruby, that is occasionally merged. If the version isn't specified by the runtime dependency, then it will default to needing the latest gem rather than the version that ships with that version of ruby. That will lead to all kinds of potential dependency fails that are most likely unneeded since this gem already requires ruby > 2.3.0
|
||||
---
|
||||
ext/openssl/openssl.gemspec | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/ext/openssl/openssl.gemspec b/ext/openssl/openssl.gemspec
|
||||
index 7c17cd54..f721f247 100644
|
||||
--- a/ext/openssl/openssl.gemspec
|
||||
+++ b/ext/openssl/openssl.gemspec
|
||||
@@ -21,7 +21,6 @@ Gem::Specification.new do |spec|
|
||||
s.rubygems_version = "3.0.0.beta1"
|
||||
s.summary = "OpenSSL provides SSL, TLS and general purpose cryptography."
|
||||
|
||||
- s.add_runtime_dependency("ipaddr", [">= 0"])
|
||||
s.add_development_dependency("rake", [">= 0"])
|
||||
s.add_development_dependency("rake-compiler", [">= 0"])
|
||||
s.add_development_dependency("test-unit", ["~> 3.0"])
|
@ -1,178 +0,0 @@
|
||||
From c5806d668f84a86e9e6a522f84b8aa6cb4cdaae9 Mon Sep 17 00:00:00 2001
|
||||
From: Ali Saidi <alisaidi@amazon.com>
|
||||
Date: Wed, 5 Aug 2020 20:46:28 -0500
|
||||
Subject: [PATCH 1/3] Enable unaligned accesses on arm64
|
||||
|
||||
64-bit Arm platforms support unaligned accesses.
|
||||
|
||||
Running the string benchmarks this change improves performance
|
||||
by an average of 1.04x, min .96x, max 1.21x, median 1.01x
|
||||
---
|
||||
include/ruby/defines.h | 2 +-
|
||||
regint.h | 2 +-
|
||||
siphash.c | 2 +-
|
||||
st.c | 2 +-
|
||||
4 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/ruby/defines.h b/include/ruby/defines.h
|
||||
index 49f673ef936a..0193275e8b78 100644
|
||||
--- a/include/ruby/defines.h
|
||||
+++ b/include/ruby/defines.h
|
||||
@@ -485,7 +485,7 @@
|
||||
#ifndef UNALIGNED_WORD_ACCESS
|
||||
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
|
||||
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
|
||||
- defined(__powerpc64__) || \
|
||||
+ defined(__powerpc64__) || defined(__aarch64__) || \
|
||||
defined(__mc68020__)
|
||||
# define UNALIGNED_WORD_ACCESS 1
|
||||
# else
|
||||
diff --git a/regint.h b/regint.h
|
||||
index a2f5bbba1d1f..0740429688bc 100644
|
||||
--- a/regint.h
|
||||
+++ b/regint.h
|
||||
@@ -52,7 +52,7 @@
|
||||
#ifndef UNALIGNED_WORD_ACCESS
|
||||
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
|
||||
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
|
||||
- defined(__powerpc64__) || \
|
||||
+ defined(__powerpc64__) || defined(__aarch64__) || \
|
||||
defined(__mc68020__)
|
||||
# define UNALIGNED_WORD_ACCESS 1
|
||||
# else
|
||||
diff --git a/siphash.c b/siphash.c
|
||||
index 153d2c690ab9..ddf8ee245d81 100644
|
||||
--- a/siphash.c
|
||||
+++ b/siphash.c
|
||||
@@ -30,7 +30,7 @@
|
||||
#ifndef UNALIGNED_WORD_ACCESS
|
||||
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
|
||||
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
|
||||
- defined(__powerpc64__) || \
|
||||
+ defined(__powerpc64__) || defined(__aarch64__) || \
|
||||
defined(__mc68020__)
|
||||
# define UNALIGNED_WORD_ACCESS 1
|
||||
# endif
|
||||
diff --git a/st.c b/st.c
|
||||
index c11535ef9779..8be466bf733f 100644
|
||||
--- a/st.c
|
||||
+++ b/st.c
|
||||
@@ -1815,7 +1815,7 @@ st_values_check(st_table *tab, st_data_t *values, st_index_t size,
|
||||
#ifndef UNALIGNED_WORD_ACCESS
|
||||
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
|
||||
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
|
||||
- defined(__powerpc64__) || \
|
||||
+ defined(__powerpc64__) || defined(__aarch64__) || \
|
||||
defined(__mc68020__)
|
||||
# define UNALIGNED_WORD_ACCESS 1
|
||||
# endif
|
||||
|
||||
From 79b7b9143fda0f33fc9375980cecc61eb42c6f66 Mon Sep 17 00:00:00 2001
|
||||
From: Ali Saidi <alisaidi@amazon.com>
|
||||
Date: Wed, 5 Aug 2020 21:04:37 -0500
|
||||
Subject: [PATCH 2/3] arm64 enable gc optimizations
|
||||
|
||||
Similar to x86 and powerpc optimizations.
|
||||
|
||||
| |compare-ruby|built-ruby|
|
||||
|:------|-----------:|---------:|
|
||||
|hash1 | 0.225| 0.237|
|
||||
| | -| 1.05x|
|
||||
|hash2 | 0.110| 0.110|
|
||||
| | 1.00x| -|
|
||||
---
|
||||
gc.c | 13 +++++++++++++
|
||||
gc.h | 2 ++
|
||||
2 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/gc.c b/gc.c
|
||||
index 22972dfc806c..788f06f1586e 100644
|
||||
--- a/gc.c
|
||||
+++ b/gc.c
|
||||
@@ -1153,6 +1153,19 @@ tick(void)
|
||||
return val;
|
||||
}
|
||||
|
||||
+#elif defined(__aarch64__) && defined(__GNUC__)
|
||||
+typedef unsigned long tick_t;
|
||||
+#define PRItick "lu"
|
||||
+
|
||||
+static __inline__ tick_t
|
||||
+tick(void)
|
||||
+{
|
||||
+ unsigned long val;
|
||||
+ __asm__ __volatile__ ("mrs %0, cntvct_el0", : "=r" (val));
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
+
|
||||
#elif defined(_WIN32) && defined(_MSC_VER)
|
||||
#include <intrin.h>
|
||||
typedef unsigned __int64 tick_t;
|
||||
diff --git a/gc.h b/gc.h
|
||||
index 6568079c54e5..47a4ca19a0c5 100644
|
||||
--- a/gc.h
|
||||
+++ b/gc.h
|
||||
@@ -8,6 +8,8 @@
|
||||
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("movl\t%%esp, %0" : "=r" (*(p)))
|
||||
#elif defined(__powerpc64__) && defined(__GNUC__)
|
||||
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mr\t%0, %%r1" : "=r" (*(p)))
|
||||
+#elif defined(__aarch64__) && defined(__GNUC__)
|
||||
+#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mov\t%0, sp" : "=r" (*(p)))
|
||||
#else
|
||||
NOINLINE(void rb_gc_set_stack_end(VALUE **stack_end_p));
|
||||
#define SET_MACHINE_STACK_END(p) rb_gc_set_stack_end(p)
|
||||
|
||||
From c985b8c6868a380e44e285368af4a4f414ce3309 Mon Sep 17 00:00:00 2001
|
||||
From: Ali Saidi <alisaidi@amazon.com>
|
||||
Date: Wed, 5 Aug 2020 21:15:55 -0500
|
||||
Subject: [PATCH 3/3] vm_exec.c: improve performance for arm64
|
||||
|
||||
| |compare-ruby|built-ruby|
|
||||
|:------------------------------|-----------:|---------:|
|
||||
|vm_array | 26.501M| 27.959M|
|
||||
| | -| 1.06x|
|
||||
|vm_attr_ivar | 21.606M| 31.429M|
|
||||
| | -| 1.45x|
|
||||
|vm_attr_ivar_set | 21.178M| 26.113M|
|
||||
| | -| 1.23x|
|
||||
|vm_backtrace | 6.621| 6.668|
|
||||
| | -| 1.01x|
|
||||
|vm_bigarray | 26.205M| 29.958M|
|
||||
| | -| 1.14x|
|
||||
|vm_bighash | 504.155k| 479.306k|
|
||||
| | 1.05x| -|
|
||||
|vm_block | 16.692M| 21.315M|
|
||||
| | -| 1.28x|
|
||||
|block_handler_type_iseq | 5.083| 7.004|
|
||||
| | -| 1.38x|
|
||||
---
|
||||
vm_exec.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/vm_exec.c b/vm_exec.c
|
||||
index ce2e053ee745..7aa56f6ad620 100644
|
||||
--- a/vm_exec.c
|
||||
+++ b/vm_exec.c
|
||||
@@ -27,6 +27,9 @@ static void vm_insns_counter_count_insn(int insn) {}
|
||||
#elif defined(__GNUC__) && defined(__powerpc64__)
|
||||
#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("r" reg)
|
||||
|
||||
+#elif defined(__GNUC__) && defined(__aarch64__)
|
||||
+#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("x" reg)
|
||||
+
|
||||
#else
|
||||
#define DECL_SC_REG(type, r, reg) register type reg_##r
|
||||
#endif
|
||||
@@ -74,6 +77,11 @@ vm_exec_core(rb_execution_context_t *ec, VALUE initial)
|
||||
DECL_SC_REG(rb_control_frame_t *, cfp, "15");
|
||||
#define USE_MACHINE_REGS 1
|
||||
|
||||
+#elif defined(__GNUC__) && defined(__aarch64__)
|
||||
+ DECL_SC_REG(const VALUE *, pc, "19");
|
||||
+ DECL_SC_REG(rb_control_frame_t *, cfp, "20");
|
||||
+#define USE_MACHINE_REGS 1
|
||||
+
|
||||
#else
|
||||
register rb_control_frame_t *reg_cfp;
|
||||
const VALUE *reg_pc;
|
11
ruby-always-use-i386.patch
Normal file
11
ruby-always-use-i386.patch
Normal file
@ -0,0 +1,11 @@
|
||||
--- ruby-1.8.6-p287/configure.in.i386 2009-03-16 00:55:15.000000000 +0900
|
||||
+++ ruby-1.8.6-p287/configure.in 2009-03-16 01:42:41.000000000 +0900
|
||||
@@ -1662,6 +1662,8 @@
|
||||
configure_args=$ac_configure_args
|
||||
AC_SUBST(configure_args)dnl
|
||||
|
||||
+target_cpu=`echo $target_cpu | sed s/i.86/i386/`
|
||||
+
|
||||
if test "$fat_binary" != no ; then
|
||||
arch="fat-${target_os}"
|
||||
|
72
ruby-deadcode.patch
Normal file
72
ruby-deadcode.patch
Normal file
@ -0,0 +1,72 @@
|
||||
diff -pruN ruby-1.8.6.orig/ext/bigdecimal/bigdecimal.c ruby-1.8.6/ext/bigdecimal/bigdecimal.c
|
||||
--- ruby-1.8.6.orig/ext/bigdecimal/bigdecimal.c 2007-02-27 20:51:55.000000000 +0900
|
||||
+++ ruby-1.8.6/ext/bigdecimal/bigdecimal.c 2007-03-15 21:14:32.000000000 +0900
|
||||
@@ -2167,12 +2167,14 @@ VpGetDoubleNegZero(void) /* Returns the
|
||||
return nzero;
|
||||
}
|
||||
|
||||
+#if 0
|
||||
VP_EXPORT int
|
||||
VpIsNegDoubleZero(double v)
|
||||
{
|
||||
double z = VpGetDoubleNegZero();
|
||||
return MemCmp(&v,&z,sizeof(v))==0;
|
||||
}
|
||||
+#endif
|
||||
|
||||
VP_EXPORT int
|
||||
VpException(unsigned short f, const char *str,int always)
|
||||
diff -pruN ruby-1.8.6.orig/parse.y ruby-1.8.6/parse.y
|
||||
--- ruby-1.8.6.orig/parse.y 2007-03-03 16:30:46.000000000 +0900
|
||||
+++ ruby-1.8.6/parse.y 2007-03-15 21:15:58.000000000 +0900
|
||||
@@ -4511,6 +4511,7 @@ rb_node_newnode(type, a0, a1, a2)
|
||||
return n;
|
||||
}
|
||||
|
||||
+#if 0
|
||||
static enum node_type
|
||||
nodetype(node) /* for debug */
|
||||
NODE *node;
|
||||
@@ -4524,6 +4525,7 @@ nodeline(node)
|
||||
{
|
||||
return nd_line(node);
|
||||
}
|
||||
+#endif
|
||||
|
||||
static NODE*
|
||||
newline_node(node)
|
||||
diff -pruN ruby-1.8.6.orig/regex.c ruby-1.8.6/regex.c
|
||||
--- ruby-1.8.6.orig/regex.c 2007-02-27 20:51:55.000000000 +0900
|
||||
+++ ruby-1.8.6/regex.c 2007-03-15 21:16:52.000000000 +0900
|
||||
@@ -998,6 +998,7 @@ print_partial_compiled_pattern(start, en
|
||||
}
|
||||
|
||||
|
||||
+#if 0
|
||||
static void
|
||||
print_compiled_pattern(bufp)
|
||||
struct re_pattern_buffer *bufp;
|
||||
@@ -1006,6 +1007,7 @@ print_compiled_pattern(bufp)
|
||||
|
||||
print_partial_compiled_pattern(buffer, buffer + bufp->used);
|
||||
}
|
||||
+#endif
|
||||
|
||||
static char*
|
||||
calculate_must_string(start, end)
|
||||
@@ -2586,6 +2588,7 @@ insert_jump_n(op, from, to, current_end,
|
||||
|
||||
If you call this function, you must zero out pending_exact. */
|
||||
|
||||
+#if 0
|
||||
static void
|
||||
insert_op(op, there, current_end)
|
||||
int op;
|
||||
@@ -2599,6 +2602,7 @@ insert_op(op, there, current_end)
|
||||
|
||||
there[0] = (char)op;
|
||||
}
|
||||
+#endif
|
||||
|
||||
|
||||
/* Open up space at location THERE, and insert operation OP followed by
|
51
ruby-deprecated-search-path.patch
Normal file
51
ruby-deprecated-search-path.patch
Normal file
@ -0,0 +1,51 @@
|
||||
diff -ruN ruby-1.8.4.orig/configure.in ruby-1.8.4/configure.in
|
||||
--- ruby-1.8.4.orig/configure.in 2006-04-20 12:53:38.000000000 +0900
|
||||
+++ ruby-1.8.4/configure.in 2006-04-20 13:06:07.000000000 +0900
|
||||
@@ -1472,12 +1472,16 @@
|
||||
esac
|
||||
RUBY_SITE_LIB_PATH3="${RUBY_SITE_LIB_PATH2}/${MAJOR}.${MINOR}"
|
||||
RUBY_SITE_LIB_PATH2="${RUBY_SITE_LIB_PATH}/${MAJOR}.${MINOR}"
|
||||
+RUBY_DEPRECATED_SITE_LIB_PATH="${SITE_DIR2}/${MAJOR}.${MINOR}"
|
||||
|
||||
AC_DEFINE_UNQUOTED(RUBY_LIB, "${RUBY_LIB_PATH}")
|
||||
AC_DEFINE_UNQUOTED(RUBY_SITE_LIB, "${RUBY_SITE_LIB_PATH}")
|
||||
AC_DEFINE_UNQUOTED(RUBY_SITE_LIB2, "${RUBY_SITE_LIB_PATH2}")
|
||||
AC_DEFINE_UNQUOTED(RUBY_DEPRECATED_OLD_SITE_LIB, "${libdir}/site_ruby")
|
||||
AC_DEFINE_UNQUOTED(RUBY_DEPRECATED_OLD_SITE_LIB2, "${libdir}/site_ruby/${MAJOR}.${MINOR}")
|
||||
+AC_DEFINE_UNQUOTED(RUBY_DEPRECATED_LIB, "${RUBY_LIB_PATH2}")
|
||||
+AC_DEFINE_UNQUOTED(RUBY_DEPRECATED_SITE_LIB, "${SITE_DIR2}")
|
||||
+AC_DEFINE_UNQUOTED(RUBY_DEPRECATED_SITE_LIB2, "${RUBY_DEPRECATED_SITE_LIB_PATH}")
|
||||
|
||||
AC_SUBST(arch)dnl
|
||||
AC_SUBST(sitearch)dnl
|
||||
diff -ruN ruby-1.8.4.orig/ruby.c ruby-1.8.4/ruby.c
|
||||
--- ruby-1.8.4.orig/ruby.c 2005-12-12 09:36:52.000000000 +0900
|
||||
+++ ruby-1.8.4/ruby.c 2006-04-20 12:59:50.000000000 +0900
|
||||
@@ -292,11 +292,17 @@
|
||||
#endif
|
||||
|
||||
incpush(RUBY_RELATIVE(RUBY_SITE_LIB2));
|
||||
+#ifdef RUBY_DEPRECATED_SITE_LIB
|
||||
+ incpush(RUBY_RELATIVE(RUBY_DEPRECATED_SITE_LIB2));
|
||||
+#endif
|
||||
#ifdef RUBY_SITE_THIN_ARCHLIB
|
||||
incpush(RUBY_RELATIVE(RUBY_SITE_THIN_ARCHLIB));
|
||||
#endif
|
||||
incpush(RUBY_RELATIVE(RUBY_SITE_ARCHLIB));
|
||||
incpush(RUBY_RELATIVE(RUBY_SITE_LIB));
|
||||
+#ifdef RUBY_DEPRECATED_SITE_LIB
|
||||
+ incpush(RUBY_RELATIVE(RUBY_DEPRECATED_SITE_LIB));
|
||||
+#endif
|
||||
#ifdef RUBY_DEPRECATED_OLD_SITE_LIB2
|
||||
incpush(RUBY_RELATIVE(RUBY_DEPRECATED_OLD_SITE_LIB2));
|
||||
#endif
|
||||
@@ -308,6 +314,9 @@
|
||||
#endif
|
||||
|
||||
incpush(RUBY_RELATIVE(RUBY_LIB));
|
||||
+#ifdef RUBY_DEPRECATED_LIB
|
||||
+ incpush(RUBY_RELATIVE(RUBY_DEPRECATED_LIB));
|
||||
+#endif
|
||||
#ifdef RUBY_THIN_ARCHLIB
|
||||
incpush(RUBY_RELATIVE(RUBY_THIN_ARCHLIB));
|
||||
#endif
|
39
ruby-deprecated-sitelib-search-path.patch
Normal file
39
ruby-deprecated-sitelib-search-path.patch
Normal file
@ -0,0 +1,39 @@
|
||||
diff -ruN ruby-1.8.4.orig/configure.in ruby-1.8.4/configure.in
|
||||
--- ruby-1.8.4.orig/configure.in 2006-06-07 13:58:03.000000000 +0900
|
||||
+++ ruby-1.8.4/configure.in 2006-06-07 15:54:36.000000000 +0900
|
||||
@@ -1476,6 +1476,8 @@
|
||||
AC_DEFINE_UNQUOTED(RUBY_LIB, "${RUBY_LIB_PATH}")
|
||||
AC_DEFINE_UNQUOTED(RUBY_SITE_LIB, "${RUBY_SITE_LIB_PATH}")
|
||||
AC_DEFINE_UNQUOTED(RUBY_SITE_LIB2, "${RUBY_SITE_LIB_PATH2}")
|
||||
+AC_DEFINE_UNQUOTED(RUBY_DEPRECATED_OLD_SITE_LIB, "${libdir}/site_ruby")
|
||||
+AC_DEFINE_UNQUOTED(RUBY_DEPRECATED_OLD_SITE_LIB2, "${libdir}/site_ruby/${MAJOR}.${MINOR}")
|
||||
|
||||
AC_SUBST(arch)dnl
|
||||
AC_SUBST(sitearch)dnl
|
||||
@@ -1506,6 +1508,7 @@
|
||||
|
||||
AC_DEFINE_UNQUOTED(RUBY_ARCHLIB, "${RUBY_LIB_PATH2}/${arch}")
|
||||
AC_DEFINE_UNQUOTED(RUBY_SITE_ARCHLIB, "${RUBY_SITE_LIB_PATH3}/${sitearch}")
|
||||
+AC_DEFINE_UNQUOTED(RUBY_DEPRECATED_OLD_SITE_ARCHLIB, "${libdir}/site_ruby/${MAJOR}.${MINOR}/${sitearch}")
|
||||
|
||||
AC_ARG_WITH(search-path,
|
||||
[ --with-search-path=DIR specify the additional search path],
|
||||
diff -ruN ruby-1.8.4.orig/ruby.c ruby-1.8.4/ruby.c
|
||||
--- ruby-1.8.4.orig/ruby.c 2005-12-12 09:36:52.000000000 +0900
|
||||
+++ ruby-1.8.4/ruby.c 2006-06-07 15:56:14.000000000 +0900
|
||||
@@ -297,6 +297,15 @@
|
||||
#endif
|
||||
incpush(RUBY_RELATIVE(RUBY_SITE_ARCHLIB));
|
||||
incpush(RUBY_RELATIVE(RUBY_SITE_LIB));
|
||||
+#ifdef RUBY_DEPRECATED_OLD_SITE_LIB2
|
||||
+ incpush(RUBY_RELATIVE(RUBY_DEPRECATED_OLD_SITE_LIB2));
|
||||
+#endif
|
||||
+#ifdef RUBY_DEPRECATED_OLD_SITE_ARCHLIB
|
||||
+ incpush(RUBY_RELATIVE(RUBY_DEPRECATED_OLD_SITE_ARCHLIB));
|
||||
+#endif
|
||||
+#ifdef RUBY_DEPRECATED_OLD_SITE_LIB
|
||||
+ incpush(RUBY_RELATIVE(RUBY_DEPRECATED_OLD_SITE_LIB));
|
||||
+#endif
|
||||
|
||||
incpush(RUBY_RELATIVE(RUBY_LIB));
|
||||
#ifdef RUBY_THIN_ARCHLIB
|
@ -1,39 +0,0 @@
|
||||
/* Example tapset file.
|
||||
*
|
||||
* You can execute the tapset using following command (please adjust the path
|
||||
* prior running the command, if needed):
|
||||
*
|
||||
* stap /usr/share/doc/ruby-2.0.0.0/ruby-exercise.stp -c "ruby -e \"puts 'test'\""
|
||||
*/
|
||||
|
||||
probe ruby.cmethod.entry {
|
||||
printf("%d -> %s::%s %s:%d\n", tid(), classname, methodname, file, line);
|
||||
}
|
||||
|
||||
probe ruby.cmethod.return {
|
||||
printf("%d <- %s::%s %s:%d\n", tid(), classname, methodname, file, line);
|
||||
}
|
||||
|
||||
probe ruby.method.entry {
|
||||
printf("%d -> %s::%s %s:%d\n", tid(), classname, methodname, file, line);
|
||||
}
|
||||
|
||||
probe ruby.method.return {
|
||||
printf("%d <- %s::%s %s:%d\n", tid(), classname, methodname, file, line);
|
||||
}
|
||||
|
||||
probe ruby.gc.mark.begin { printf("%d gc.mark.begin\n", tid()); }
|
||||
|
||||
probe ruby.gc.mark.end { printf("%d gc.mark.end\n", tid()); }
|
||||
|
||||
probe ruby.gc.sweep.begin { printf("%d gc.sweep.begin\n", tid()); }
|
||||
|
||||
probe ruby.gc.sweep.end { printf("%d gc.sweep.end\n", tid()); }
|
||||
|
||||
probe ruby.object.create{
|
||||
printf("%d obj.create %s %s:%d\n", tid(), classname, file, line);
|
||||
}
|
||||
|
||||
probe ruby.raise {
|
||||
printf("%d raise %s %s:%d\n", tid(), classname, file, line);
|
||||
}
|
20
ruby-mode-init.el
Normal file
20
ruby-mode-init.el
Normal file
@ -0,0 +1,20 @@
|
||||
;; ruby-mode-init.el
|
||||
;; Created: 2002-02-01
|
||||
;;
|
||||
(if (featurep 'xemacs)
|
||||
(setq load-path (cons "/usr/lib/xemacs/xemacs-packages/lisp/ruby-mode" load-path))
|
||||
(setq load-path (cons "/usr/share/emacs/site-lisp/ruby-mode" load-path)))
|
||||
|
||||
|
||||
(autoload 'ruby-mode "ruby-mode" "Mode for editing ruby source files" t)
|
||||
(setq auto-mode-alist
|
||||
(cons '("\\.rb$" . ruby-mode) auto-mode-alist))
|
||||
(setq interpreter-mode-alist
|
||||
(cons '("ruby" . ruby-mode) interpreter-mode-alist))
|
||||
|
||||
(autoload 'run-ruby "inf-ruby" "Run an inferior Ruby process")
|
||||
(autoload 'inf-ruby-keys "inf-ruby" "Set local key defs for inf-ruby in ruby-mode")
|
||||
|
||||
(add-hook 'ruby-mode-hook
|
||||
'(lambda ()
|
||||
(inf-ruby-keys)))
|
12
ruby-multilib.patch
Normal file
12
ruby-multilib.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff -ruN ruby-1.8.3.orig/mkconfig.rb ruby-1.8.3/mkconfig.rb
|
||||
--- ruby-1.8.3.orig/mkconfig.rb 2005-09-21 15:10:57.000000000 +0900
|
||||
+++ ruby-1.8.3/mkconfig.rb 2005-09-21 15:17:32.000000000 +0900
|
||||
@@ -74,7 +74,7 @@
|
||||
|
||||
drive = File::PATH_SEPARATOR == ';'
|
||||
|
||||
-prefix = '/lib/ruby/' + RUBY_VERSION.sub(/\.\d+$/, '') + '/' + RUBY_PLATFORM
|
||||
+prefix = '/lib64/ruby/' + RUBY_VERSION.sub(/\.\d+$/, '') + '/' + RUBY_PLATFORM
|
||||
print " TOPDIR = File.dirname(__FILE__).chomp!(#{prefix.dump})\n"
|
||||
print " DESTDIR = ", (drive ? "TOPDIR && TOPDIR[/\\A[a-z]:/i] || " : ""), "'' unless defined? DESTDIR\n"
|
||||
print " CONFIG = {}\n"
|
176
ruby-openssl-1.0.patch
Normal file
176
ruby-openssl-1.0.patch
Normal file
@ -0,0 +1,176 @@
|
||||
diff -up ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl.c.ossl10 ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl.c
|
||||
--- ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl.c.ossl10 2007-02-13 00:01:19.000000000 +0100
|
||||
+++ ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl.c 2009-08-26 12:29:41.000000000 +0200
|
||||
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
|
||||
|
||||
#define OSSL_IMPL_SK2ARY(name, type) \
|
||||
VALUE \
|
||||
-ossl_##name##_sk2ary(STACK *sk) \
|
||||
+ossl_##name##_sk2ary(STACK_OF(type) *sk) \
|
||||
{ \
|
||||
type *t; \
|
||||
int i, num; \
|
||||
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk) \
|
||||
OSSL_Debug("empty sk!"); \
|
||||
return Qnil; \
|
||||
} \
|
||||
- num = sk_num(sk); \
|
||||
+ num = sk_##type##_num(sk); \
|
||||
if (num < 0) { \
|
||||
OSSL_Debug("items in sk < -1???"); \
|
||||
return rb_ary_new(); \
|
||||
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk) \
|
||||
ary = rb_ary_new2(num); \
|
||||
\
|
||||
for (i=0; i<num; i++) { \
|
||||
- t = (type *)sk_value(sk, i); \
|
||||
+ t = sk_##type##_value(sk, i); \
|
||||
rb_ary_push(ary, ossl_##name##_new(t)); \
|
||||
} \
|
||||
return ary; \
|
||||
diff -up ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl_pkcs7.c.ossl10 ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl_pkcs7.c
|
||||
--- ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl_pkcs7.c.ossl10 2007-02-13 00:01:19.000000000 +0100
|
||||
+++ ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl_pkcs7.c 2009-08-26 12:53:05.000000000 +0200
|
||||
@@ -543,12 +543,11 @@ ossl_pkcs7_add_certificate(VALUE self, V
|
||||
return self;
|
||||
}
|
||||
|
||||
-static STACK *
|
||||
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
|
||||
+static STACK_OF(X509) *
|
||||
+pkcs7_get_certs(VALUE self)
|
||||
{
|
||||
PKCS7 *pkcs7;
|
||||
STACK_OF(X509) *certs;
|
||||
- STACK_OF(X509_CRL) *crls;
|
||||
int i;
|
||||
|
||||
GetPKCS7(self, pkcs7);
|
||||
@@ -556,17 +555,38 @@ pkcs7_get_certs_or_crls(VALUE self, int
|
||||
switch(i){
|
||||
case NID_pkcs7_signed:
|
||||
certs = pkcs7->d.sign->cert;
|
||||
- crls = pkcs7->d.sign->crl;
|
||||
break;
|
||||
case NID_pkcs7_signedAndEnveloped:
|
||||
certs = pkcs7->d.signed_and_enveloped->cert;
|
||||
+ break;
|
||||
+ default:
|
||||
+ certs = NULL;
|
||||
+ }
|
||||
+
|
||||
+ return certs;
|
||||
+}
|
||||
+
|
||||
+static STACK_OF(X509_CRL) *
|
||||
+pkcs7_get_crls(VALUE self)
|
||||
+{
|
||||
+ PKCS7 *pkcs7;
|
||||
+ STACK_OF(X509_CRL) *crls;
|
||||
+ int i;
|
||||
+
|
||||
+ GetPKCS7(self, pkcs7);
|
||||
+ i = OBJ_obj2nid(pkcs7->type);
|
||||
+ switch(i){
|
||||
+ case NID_pkcs7_signed:
|
||||
+ crls = pkcs7->d.sign->crl;
|
||||
+ break;
|
||||
+ case NID_pkcs7_signedAndEnveloped:
|
||||
crls = pkcs7->d.signed_and_enveloped->crl;
|
||||
break;
|
||||
default:
|
||||
- certs = crls = NULL;
|
||||
+ crls = NULL;
|
||||
}
|
||||
|
||||
- return want_certs ? certs : crls;
|
||||
+ return crls;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
@@ -581,7 +601,7 @@ ossl_pkcs7_set_certificates(VALUE self,
|
||||
STACK_OF(X509) *certs;
|
||||
X509 *cert;
|
||||
|
||||
- certs = pkcs7_get_certs_or_crls(self, 1);
|
||||
+ certs = pkcs7_get_certs(self);
|
||||
while((cert = sk_X509_pop(certs))) X509_free(cert);
|
||||
rb_iterate(rb_each, ary, ossl_pkcs7_set_certs_i, self);
|
||||
|
||||
@@ -591,7 +611,7 @@ ossl_pkcs7_set_certificates(VALUE self,
|
||||
static VALUE
|
||||
ossl_pkcs7_get_certificates(VALUE self)
|
||||
{
|
||||
- return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
|
||||
+ return ossl_x509_sk2ary(pkcs7_get_certs(self));
|
||||
}
|
||||
|
||||
static VALUE
|
||||
@@ -621,7 +641,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ar
|
||||
STACK_OF(X509_CRL) *crls;
|
||||
X509_CRL *crl;
|
||||
|
||||
- crls = pkcs7_get_certs_or_crls(self, 0);
|
||||
+ crls = pkcs7_get_crls(self);
|
||||
while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
|
||||
rb_iterate(rb_each, ary, ossl_pkcs7_set_crls_i, self);
|
||||
|
||||
@@ -631,7 +651,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ar
|
||||
static VALUE
|
||||
ossl_pkcs7_get_crls(VALUE self)
|
||||
{
|
||||
- return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
|
||||
+ return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
|
||||
}
|
||||
|
||||
static VALUE
|
||||
diff -up ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl_ssl.c.ossl10 ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl_ssl.c
|
||||
--- ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl_ssl.c.ossl10 2007-03-12 05:12:32.000000000 +0100
|
||||
+++ ruby-1.8.6.369/ruby-1.8.6-p369/ext/openssl/ossl_ssl.c 2009-08-26 12:08:48.000000000 +0200
|
||||
@@ -89,12 +89,18 @@ static char *ossl_sslctx_attrs[] = {
|
||||
static char *ossl_ssl_attr_readers[] = { "io", "context", };
|
||||
static char *ossl_ssl_attrs[] = { "sync_close", };
|
||||
|
||||
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
|
||||
+#define OSSL_MORE_CONST const
|
||||
+#define STACK _STACK
|
||||
+#else
|
||||
+#define OSSL_MORE_CONST
|
||||
+#endif
|
||||
/*
|
||||
* SSLContext class
|
||||
*/
|
||||
struct {
|
||||
const char *name;
|
||||
- SSL_METHOD *(*func)(void);
|
||||
+ OSSL_MORE_CONST SSL_METHOD *(*func)(void);
|
||||
} ossl_ssl_method_tab[] = {
|
||||
#define OSSL_SSL_METHOD_ENTRY(name) { #name, name##_method }
|
||||
OSSL_SSL_METHOD_ENTRY(TLSv1),
|
||||
@@ -144,7 +150,7 @@ static VALUE
|
||||
ossl_sslctx_initialize(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
VALUE ssl_method;
|
||||
- SSL_METHOD *method = NULL;
|
||||
+ OSSL_MORE_CONST SSL_METHOD *method = NULL;
|
||||
SSL_CTX *ctx;
|
||||
int i;
|
||||
char *s;
|
||||
@@ -407,7 +413,7 @@ ossl_sslctx_setup(VALUE self)
|
||||
}
|
||||
|
||||
static VALUE
|
||||
-ossl_ssl_cipher_to_ary(SSL_CIPHER *cipher)
|
||||
+ossl_ssl_cipher_to_ary(OSSL_MORE_CONST SSL_CIPHER *cipher)
|
||||
{
|
||||
VALUE ary;
|
||||
int bits, alg_bits;
|
||||
@@ -805,7 +811,7 @@ static VALUE
|
||||
ossl_ssl_get_cipher(VALUE self)
|
||||
{
|
||||
SSL *ssl;
|
||||
- SSL_CIPHER *cipher;
|
||||
+ OSSL_MORE_CONST SSL_CIPHER *cipher;
|
||||
|
||||
Data_Get_Struct(self, SSL, ssl);
|
||||
if (!ssl) {
|
351
ruby_1_8_7-gc-open4_096segv.patch
Normal file
351
ruby_1_8_7-gc-open4_096segv.patch
Normal file
@ -0,0 +1,351 @@
|
||||
Index: ruby_1_8_7/marshal.c
|
||||
===================================================================
|
||||
--- ruby_1_8_7/marshal.c (revision 26075)
|
||||
+++ ruby_1_8_7/marshal.c (revision 26076)
|
||||
@@ -85,12 +85,10 @@
|
||||
static ID s_getc, s_read, s_write, s_binmode;
|
||||
|
||||
struct dump_arg {
|
||||
- VALUE obj;
|
||||
VALUE str, dest;
|
||||
st_table *symbols;
|
||||
st_table *data;
|
||||
int taint;
|
||||
- VALUE wrapper;
|
||||
};
|
||||
|
||||
struct dump_call_arg {
|
||||
@@ -104,22 +102,32 @@
|
||||
struct dump_arg *arg;
|
||||
ID sym;
|
||||
{
|
||||
- if (!DATA_PTR(arg->wrapper)) {
|
||||
+ if (!arg->symbols) {
|
||||
rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s",
|
||||
rb_id2name(sym));
|
||||
}
|
||||
}
|
||||
|
||||
+static void clear_dump_arg _((struct dump_arg *arg));
|
||||
+
|
||||
static void
|
||||
mark_dump_arg(ptr)
|
||||
void *ptr;
|
||||
{
|
||||
struct dump_arg *p = ptr;
|
||||
- if (!ptr)
|
||||
+ if (!p->symbols)
|
||||
return;
|
||||
rb_mark_set(p->data);
|
||||
}
|
||||
|
||||
+static void
|
||||
+free_dump_arg(ptr)
|
||||
+ void *ptr;
|
||||
+{
|
||||
+ clear_dump_arg(ptr);
|
||||
+ xfree(ptr);
|
||||
+}
|
||||
+
|
||||
static VALUE
|
||||
class2path(klass)
|
||||
VALUE klass;
|
||||
@@ -699,32 +707,17 @@
|
||||
}
|
||||
}
|
||||
|
||||
-static VALUE
|
||||
-dump(arg)
|
||||
- struct dump_call_arg *arg;
|
||||
-{
|
||||
- w_object(arg->obj, arg->arg, arg->limit);
|
||||
- if (arg->arg->dest) {
|
||||
- rb_io_write(arg->arg->dest, arg->arg->str);
|
||||
- rb_str_resize(arg->arg->str, 0);
|
||||
- }
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static VALUE
|
||||
-dump_ensure(arg)
|
||||
+static void
|
||||
+clear_dump_arg(arg)
|
||||
struct dump_arg *arg;
|
||||
{
|
||||
- if (!DATA_PTR(arg->wrapper)) return 0;
|
||||
+ if (!arg->symbols) return;
|
||||
st_free_table(arg->symbols);
|
||||
+ arg->symbols = 0;
|
||||
st_free_table(arg->data);
|
||||
- DATA_PTR(arg->wrapper) = 0;
|
||||
- arg->wrapper = 0;
|
||||
if (arg->taint) {
|
||||
OBJ_TAINT(arg->str);
|
||||
}
|
||||
-
|
||||
- return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -760,8 +753,8 @@
|
||||
{
|
||||
VALUE obj, port, a1, a2;
|
||||
int limit = -1;
|
||||
- struct dump_arg arg;
|
||||
- struct dump_call_arg c_arg;
|
||||
+ struct dump_arg *arg;
|
||||
+ VALUE wrapper;
|
||||
|
||||
port = Qnil;
|
||||
rb_scan_args(argc, argv, "12", &obj, &a1, &a2);
|
||||
@@ -775,37 +768,40 @@
|
||||
else if (NIL_P(a1)) goto type_error;
|
||||
else port = a1;
|
||||
}
|
||||
- arg.dest = 0;
|
||||
- arg.symbols = st_init_numtable();
|
||||
- arg.data = st_init_numtable();
|
||||
- arg.taint = Qfalse;
|
||||
- arg.str = rb_str_buf_new(0);
|
||||
- RBASIC(arg.str)->klass = 0;
|
||||
- arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg);
|
||||
+ wrapper = Data_Make_Struct(rb_cData, struct dump_arg, mark_dump_arg, free_dump_arg, arg);
|
||||
+ arg->dest = 0;
|
||||
+ arg->symbols = st_init_numtable();
|
||||
+ arg->data = st_init_numtable();
|
||||
+ arg->taint = Qfalse;
|
||||
+ arg->str = rb_str_buf_new(0);
|
||||
+ RBASIC(arg->str)->klass = 0;
|
||||
if (!NIL_P(port)) {
|
||||
if (!rb_respond_to(port, s_write)) {
|
||||
type_error:
|
||||
rb_raise(rb_eTypeError, "instance of IO needed");
|
||||
}
|
||||
- arg.dest = port;
|
||||
+ arg->dest = port;
|
||||
if (rb_respond_to(port, s_binmode)) {
|
||||
rb_funcall2(port, s_binmode, 0, 0);
|
||||
- check_dump_arg(&arg, s_binmode);
|
||||
+ check_dump_arg(arg, s_binmode);
|
||||
}
|
||||
}
|
||||
else {
|
||||
- port = arg.str;
|
||||
+ port = arg->str;
|
||||
}
|
||||
|
||||
- c_arg.obj = obj;
|
||||
- c_arg.arg = &arg;
|
||||
- c_arg.limit = limit;
|
||||
+ w_byte(MARSHAL_MAJOR, arg);
|
||||
+ w_byte(MARSHAL_MINOR, arg);
|
||||
|
||||
- w_byte(MARSHAL_MAJOR, &arg);
|
||||
- w_byte(MARSHAL_MINOR, &arg);
|
||||
+ w_object(obj, arg, limit);
|
||||
+ if (arg->dest) {
|
||||
+ rb_io_write(arg->dest, arg->str);
|
||||
+ rb_str_resize(arg->str, 0);
|
||||
+ }
|
||||
|
||||
- rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg);
|
||||
- RBASIC(arg.str)->klass = rb_cString;
|
||||
+ RBASIC(arg->str)->klass = rb_cString;
|
||||
+ clear_dump_arg(arg);
|
||||
+ RB_GC_GUARD(wrapper);
|
||||
|
||||
return port;
|
||||
}
|
||||
@@ -817,7 +813,6 @@
|
||||
st_table *data;
|
||||
VALUE proc;
|
||||
int taint;
|
||||
- VALUE wrapper;
|
||||
};
|
||||
|
||||
static void
|
||||
@@ -825,22 +820,31 @@
|
||||
struct load_arg *arg;
|
||||
ID sym;
|
||||
{
|
||||
- if (!DATA_PTR(arg->wrapper)) {
|
||||
+ if (!arg->symbols) {
|
||||
rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s",
|
||||
rb_id2name(sym));
|
||||
}
|
||||
}
|
||||
|
||||
+static void clear_load_arg _((struct load_arg *arg));
|
||||
+
|
||||
static void
|
||||
mark_load_arg(ptr)
|
||||
void *ptr;
|
||||
{
|
||||
struct load_arg *p = ptr;
|
||||
- if (!ptr)
|
||||
+ if (!p->symbols)
|
||||
return;
|
||||
rb_mark_tbl(p->data);
|
||||
}
|
||||
|
||||
+static void
|
||||
+free_load_arg(void *ptr)
|
||||
+{
|
||||
+ clear_load_arg(ptr);
|
||||
+ xfree(ptr);
|
||||
+}
|
||||
+
|
||||
static VALUE r_object _((struct load_arg *arg));
|
||||
|
||||
static int
|
||||
@@ -1415,23 +1419,14 @@
|
||||
return r_object0(arg, arg->proc, 0, Qnil);
|
||||
}
|
||||
|
||||
-static VALUE
|
||||
-load(arg)
|
||||
+static void
|
||||
+clear_load_arg(arg)
|
||||
struct load_arg *arg;
|
||||
{
|
||||
- return r_object(arg);
|
||||
-}
|
||||
-
|
||||
-static VALUE
|
||||
-load_ensure(arg)
|
||||
- struct load_arg *arg;
|
||||
-{
|
||||
- if (!DATA_PTR(arg->wrapper)) return 0;
|
||||
+ if (!arg->symbols) return;
|
||||
st_free_table(arg->symbols);
|
||||
+ arg->symbols = 0;
|
||||
st_free_table(arg->data);
|
||||
- DATA_PTR(arg->wrapper) = 0;
|
||||
- arg->wrapper = 0;
|
||||
- return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1451,35 +1446,37 @@
|
||||
VALUE *argv;
|
||||
{
|
||||
VALUE port, proc;
|
||||
- int major, minor;
|
||||
- VALUE v;
|
||||
- struct load_arg arg;
|
||||
+ int major, minor, taint = Qfalse;
|
||||
+ VALUE v, wrapper;
|
||||
+ struct load_arg *arg;
|
||||
|
||||
rb_scan_args(argc, argv, "11", &port, &proc);
|
||||
v = rb_check_string_type(port);
|
||||
if (!NIL_P(v)) {
|
||||
- arg.taint = OBJ_TAINTED(port); /* original taintedness */
|
||||
+ taint = OBJ_TAINTED(port); /* original taintedness */
|
||||
port = v;
|
||||
}
|
||||
else if (rb_respond_to(port, s_getc) && rb_respond_to(port, s_read)) {
|
||||
if (rb_respond_to(port, s_binmode)) {
|
||||
rb_funcall2(port, s_binmode, 0, 0);
|
||||
}
|
||||
- arg.taint = Qtrue;
|
||||
+ taint = Qtrue;
|
||||
}
|
||||
else {
|
||||
rb_raise(rb_eTypeError, "instance of IO needed");
|
||||
}
|
||||
- arg.src = port;
|
||||
- arg.offset = 0;
|
||||
- arg.symbols = st_init_numtable();
|
||||
- arg.data = st_init_numtable();
|
||||
- arg.proc = 0;
|
||||
- arg.wrapper = Data_Wrap_Struct(rb_cData, mark_load_arg, 0, &arg);
|
||||
+ wrapper = Data_Make_Struct(rb_cData, struct load_arg, mark_load_arg, free_load_arg, arg);
|
||||
+ arg->src = port;
|
||||
+ arg->offset = 0;
|
||||
+ arg->symbols = st_init_numtable();
|
||||
+ arg->data = st_init_numtable();
|
||||
+ arg->proc = 0;
|
||||
+ arg->taint = taint;
|
||||
|
||||
- major = r_byte(&arg);
|
||||
- minor = r_byte(&arg);
|
||||
+ major = r_byte(arg);
|
||||
+ minor = r_byte(arg);
|
||||
if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) {
|
||||
+ clear_load_arg(arg);
|
||||
rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\
|
||||
\tformat version %d.%d required; %d.%d given",
|
||||
MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
|
||||
@@ -1490,8 +1487,10 @@
|
||||
MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
|
||||
}
|
||||
|
||||
- if (!NIL_P(proc)) arg.proc = proc;
|
||||
- v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
|
||||
+ if (!NIL_P(proc)) arg->proc = proc;
|
||||
+ v = r_object(arg);
|
||||
+ clear_load_arg(arg);
|
||||
+ RB_GC_GUARD(wrapper);
|
||||
|
||||
return v;
|
||||
}
|
||||
Index: ruby_1_8_7/test/ruby/test_marshal.rb
|
||||
===================================================================
|
||||
--- ruby_1_8_7/test/ruby/test_marshal.rb (revision 26075)
|
||||
+++ ruby_1_8_7/test/ruby/test_marshal.rb (revision 26076)
|
||||
@@ -71,4 +71,41 @@
|
||||
}
|
||||
assert_equal("marshal data too short", e.message)
|
||||
end
|
||||
+
|
||||
+ class DumpTest
|
||||
+ def marshal_dump
|
||||
+ loop { Thread.pass }
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
+ class LoadTest
|
||||
+ def marshal_dump
|
||||
+ nil
|
||||
+ end
|
||||
+ def marshal_load(obj)
|
||||
+ loop { Thread.pass }
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
+ def test_context_switch
|
||||
+ o = DumpTest.new
|
||||
+ Thread.new { Marshal.dump(o) }
|
||||
+ GC.start
|
||||
+ assert(true, '[ruby-dev:39425]')
|
||||
+
|
||||
+ o = LoadTest.new
|
||||
+ m = Marshal.dump(o)
|
||||
+ Thread.new { Marshal.load(m) }
|
||||
+ GC.start
|
||||
+ assert(true, '[ruby-dev:39425]')
|
||||
+ end
|
||||
+
|
||||
+ def test_taint
|
||||
+ x = Object.new
|
||||
+ x.taint
|
||||
+ s = Marshal.dump(x)
|
||||
+ assert_equal(true, s.tainted?)
|
||||
+ y = Marshal.load(s)
|
||||
+ assert_equal(true, y.tainted?)
|
||||
+ end
|
||||
end
|
||||
Index: ruby_1_8_7/ruby.h
|
||||
===================================================================
|
||||
--- ruby_1_8_7/ruby.h (revision 16014)
|
||||
+++ ruby_1_8_7/ruby.h (revision 16015)
|
||||
@@ -224,6 +224,8 @@
|
||||
|
||||
#define TYPE(x) rb_type((VALUE)(x))
|
||||
|
||||
+#define RB_GC_GUARD(v) (*(volatile VALUE *)&(v))
|
||||
+
|
||||
void rb_check_type _((VALUE,int));
|
||||
#define Check_Type(v,t) rb_check_type((VALUE)(v),t)
|
||||
|
@ -1,167 +0,0 @@
|
||||
From 912d141a351053d0f6d915b5e7807f6a8f4c0631 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 4 Feb 2020 17:25:56 +0100
|
||||
Subject: [PATCH 1/2] Make non "test_" method private
|
||||
|
||||
---
|
||||
test/rubygems/test_require.rb | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
|
||||
index aa2675af5d..d618a93473 100644
|
||||
--- a/test/rubygems/test_require.rb
|
||||
+++ b/test/rubygems/test_require.rb
|
||||
@@ -532,6 +532,8 @@ def test_require_bundler_with_bundler_version
|
||||
end
|
||||
end
|
||||
|
||||
+ private
|
||||
+
|
||||
def silence_warnings
|
||||
old_verbose, $VERBOSE = $VERBOSE, false
|
||||
yield
|
||||
|
||||
From b3944384f44b869985051863d8b05b545d09a585 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 4 Feb 2020 17:26:28 +0100
|
||||
Subject: [PATCH 2/2] Fix require issue with file extension priority
|
||||
|
||||
If `require "a"` is run when two folders have been specified in the -I
|
||||
option including a "a.rb" file and a "a.so" file respectively, the ruby
|
||||
spec says that the ".rb" file should always be preferred. However, the
|
||||
logic we added in https://github.com/rubygems/rubygems/commit/6b81076d9
|
||||
to make the -I option always beat default gems does not respect this
|
||||
spec, creating a difference from the original ruby-core's require.
|
||||
|
||||
[the ruby spec says]: https://github.com/ruby/spec/blob/d80a6e2b221d4f17a8cadcac75ef950c59cba901/core/kernel/shared/require.rb#L234-L246
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 28 +++++------
|
||||
test/rubygems/test_require.rb | 62 +++++++++++++++++++++++++
|
||||
2 files changed, 74 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 60f4d18712..369f2c743e 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -43,18 +43,18 @@ def require(path)
|
||||
# https://github.com/rubygems/rubygems/pull/1868
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
- $LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp|
|
||||
- safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
- begin
|
||||
- if File.symlink? safe_lp # for backward compatibility
|
||||
- next
|
||||
+ Gem.suffixes.each do |s|
|
||||
+ $LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp|
|
||||
+ safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
+ begin
|
||||
+ if File.symlink? safe_lp # for backward compatibility
|
||||
+ next
|
||||
+ end
|
||||
+ rescue SecurityError
|
||||
+ RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
+ raise
|
||||
end
|
||||
- rescue SecurityError
|
||||
- RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
- raise
|
||||
- end
|
||||
|
||||
- Gem.suffixes.each do |s|
|
||||
full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}"))
|
||||
if File.file?(full_path)
|
||||
rp = full_path
|
||||
@@ -67,12 +67,8 @@ def require(path)
|
||||
end
|
||||
|
||||
if resolved_path
|
||||
- begin
|
||||
- RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
- return gem_original_require(resolved_path)
|
||||
- rescue LoadError
|
||||
- RUBYGEMS_ACTIVATION_MONITOR.enter
|
||||
- end
|
||||
+ RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
+ return gem_original_require(resolved_path)
|
||||
end
|
||||
|
||||
if spec = Gem.find_unresolved_default_spec(path)
|
||||
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
|
||||
index d618a93473..7cffbfa7fe 100644
|
||||
--- a/test/rubygems/test_require.rb
|
||||
+++ b/test/rubygems/test_require.rb
|
||||
@@ -120,6 +120,24 @@ def test_dash_i_beats_default_gems
|
||||
Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
|
||||
end
|
||||
|
||||
+ def test_dash_i_respects_default_library_extension_priority
|
||||
+ skip "extensions don't quite work on jruby" if Gem.java_platform?
|
||||
+
|
||||
+ dash_i_ext_arg = util_install_extension_file('a')
|
||||
+ dash_i_lib_arg = util_install_ruby_file('a')
|
||||
+
|
||||
+ lp = $LOAD_PATH.dup
|
||||
+
|
||||
+ begin
|
||||
+ $LOAD_PATH.unshift dash_i_lib_arg
|
||||
+ $LOAD_PATH.unshift dash_i_ext_arg
|
||||
+ assert_require 'a'
|
||||
+ assert_match(/a\.rb$/, $LOADED_FEATURES.last)
|
||||
+ ensure
|
||||
+ $LOAD_PATH.replace lp
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
def test_concurrent_require
|
||||
Object.const_set :FILE_ENTERED_LATCH, Latch.new(2)
|
||||
Object.const_set :FILE_EXIT_LATCH, Latch.new(1)
|
||||
@@ -541,4 +559,48 @@ def silence_warnings
|
||||
$VERBOSE = old_verbose
|
||||
end
|
||||
|
||||
+ def util_install_extension_file(name)
|
||||
+ spec = quick_gem name
|
||||
+ util_build_gem spec
|
||||
+
|
||||
+ spec.extensions << "extconf.rb"
|
||||
+ write_file File.join(@tempdir, "extconf.rb") do |io|
|
||||
+ io.write <<-RUBY
|
||||
+ require "mkmf"
|
||||
+ create_makefile("#{name}")
|
||||
+ RUBY
|
||||
+ end
|
||||
+
|
||||
+ write_file File.join(@tempdir, "#{name}.c") do |io|
|
||||
+ io.write <<-C
|
||||
+ #include <ruby.h>
|
||||
+ void Init_#{name}() { }
|
||||
+ C
|
||||
+ end
|
||||
+
|
||||
+ spec.files += ["extconf.rb", "#{name}.c"]
|
||||
+
|
||||
+ so = File.join(spec.gem_dir, "#{name}.#{RbConfig::CONFIG["DLEXT"]}")
|
||||
+ refute_path_exists so
|
||||
+
|
||||
+ path = Gem::Package.build spec
|
||||
+ installer = Gem::Installer.at path
|
||||
+ installer.install
|
||||
+ assert_path_exists so
|
||||
+
|
||||
+ spec.gem_dir
|
||||
+ end
|
||||
+
|
||||
+ def util_install_ruby_file(name)
|
||||
+ dir_lib = Dir.mktmpdir("test_require_lib", @tempdir)
|
||||
+ dash_i_lib_arg = File.join dir_lib
|
||||
+
|
||||
+ a_rb = File.join dash_i_lib_arg, "#{name}.rb"
|
||||
+
|
||||
+ FileUtils.mkdir_p File.dirname a_rb
|
||||
+ File.open(a_rb, 'w') { |f| f.write "# #{name}.rb" }
|
||||
+
|
||||
+ dash_i_lib_arg
|
||||
+ end
|
||||
+
|
||||
end
|
@ -1,324 +0,0 @@
|
||||
From 00d98eb8a3245fb93a475ecbbbc4c7ec7e6704cd Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 19 May 2020 14:00:00 +0200
|
||||
Subject: [PATCH 1/5] Fix performance regression in `require`
|
||||
|
||||
Our check for `-I` paths should not go through all activated gems.
|
||||
---
|
||||
lib/rubygems.rb | 10 ++++++++++
|
||||
lib/rubygems/core_ext/kernel_require.rb | 2 +-
|
||||
lib/rubygems/test_case.rb | 1 +
|
||||
test/rubygems/test_require.rb | 11 +++++++++++
|
||||
4 files changed, 23 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
|
||||
index 843cb49e4a..d1a9a1c7e1 100644
|
||||
--- a/lib/rubygems.rb
|
||||
+++ b/lib/rubygems.rb
|
||||
@@ -662,10 +662,20 @@ def self.load_path_insert_index
|
||||
index
|
||||
end
|
||||
|
||||
+ ##
|
||||
+ # The number of paths in the `$LOAD_PATH` from activated gems. Used to
|
||||
+ # prioritize `-I` and `ENV['RUBYLIB`]` entries during `require`.
|
||||
+
|
||||
+ def self.activated_gem_paths
|
||||
+ @activated_gem_paths ||= 0
|
||||
+ end
|
||||
+
|
||||
##
|
||||
# Add a list of paths to the $LOAD_PATH at the proper place.
|
||||
|
||||
def self.add_to_load_path(*paths)
|
||||
+ @activated_gem_paths = activated_gem_paths + paths.size
|
||||
+
|
||||
insert_index = load_path_insert_index
|
||||
|
||||
if insert_index
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index ed24111bd5..7625ce1bee 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -47,7 +47,7 @@ def require(path)
|
||||
load_path_insert_index = Gem.load_path_insert_index
|
||||
break unless load_path_insert_index
|
||||
|
||||
- $LOAD_PATH[0...load_path_insert_index].each do |lp|
|
||||
+ $LOAD_PATH[0...load_path_insert_index - Gem.activated_gem_paths].each do |lp|
|
||||
safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
begin
|
||||
if File.symlink? safe_lp # for backward compatibility
|
||||
diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb
|
||||
index a05a2898d1..53dd495aef 100644
|
||||
--- a/lib/rubygems/test_case.rb
|
||||
+++ b/lib/rubygems/test_case.rb
|
||||
@@ -385,6 +385,7 @@ def setup
|
||||
Gem::Security.reset
|
||||
|
||||
Gem.loaded_specs.clear
|
||||
+ Gem.instance_variable_set(:@activated_gem_paths, 0)
|
||||
Gem.clear_default_specs
|
||||
Bundler.reset!
|
||||
|
||||
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
|
||||
index f36892f8cc..9f2fe3439a 100644
|
||||
--- a/test/rubygems/test_require.rb
|
||||
+++ b/test/rubygems/test_require.rb
|
||||
@@ -382,6 +382,17 @@ def test_default_gem_require_activates_just_once
|
||||
assert_equal 0, times_called
|
||||
end
|
||||
|
||||
+ def test_second_gem_require_does_not_resolve_path_manually_before_going_through_standard_require
|
||||
+ a1 = util_spec "a", "1", nil, "lib/test_gem_require_a.rb"
|
||||
+ install_gem a1
|
||||
+
|
||||
+ assert_require "test_gem_require_a"
|
||||
+
|
||||
+ stub(:gem_original_require, ->(path) { assert_equal "test_gem_require_a", path }) do
|
||||
+ require "test_gem_require_a"
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
def test_realworld_default_gem
|
||||
testing_ruby_repo = !ENV["GEM_COMMAND"].nil?
|
||||
skip "this test can't work under ruby-core setup" if testing_ruby_repo || java_platform?
|
||||
|
||||
From ae95885dff6189c5ac59bbdf685cb4ec4751fdef Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 19 May 2020 14:08:19 +0200
|
||||
Subject: [PATCH 2/5] Refactor `Gem.load_path_insert_index`
|
||||
|
||||
---
|
||||
lib/rubygems.rb | 13 +++----------
|
||||
lib/rubygems/core_ext/kernel_require.rb | 5 +----
|
||||
2 files changed, 4 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
|
||||
index d1a9a1c7e1..ca80326459 100644
|
||||
--- a/lib/rubygems.rb
|
||||
+++ b/lib/rubygems.rb
|
||||
@@ -659,7 +659,7 @@ def self.load_path_insert_index
|
||||
|
||||
index = $LOAD_PATH.index RbConfig::CONFIG['sitelibdir']
|
||||
|
||||
- index
|
||||
+ index || 0
|
||||
end
|
||||
|
||||
##
|
||||
@@ -676,15 +676,8 @@ def self.activated_gem_paths
|
||||
def self.add_to_load_path(*paths)
|
||||
@activated_gem_paths = activated_gem_paths + paths.size
|
||||
|
||||
- insert_index = load_path_insert_index
|
||||
-
|
||||
- if insert_index
|
||||
- # gem directories must come after -I and ENV['RUBYLIB']
|
||||
- $LOAD_PATH.insert(insert_index, *paths)
|
||||
- else
|
||||
- # we are probably testing in core, -I and RUBYLIB don't apply
|
||||
- $LOAD_PATH.unshift(*paths)
|
||||
- end
|
||||
+ # gem directories must come after -I and ENV['RUBYLIB']
|
||||
+ $LOAD_PATH.insert(Gem.load_path_insert_index, *paths)
|
||||
end
|
||||
|
||||
@yaml_loaded = false
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 7625ce1bee..decf4829f1 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -44,10 +44,7 @@ def require(path)
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
Gem.suffixes.each do |s|
|
||||
- load_path_insert_index = Gem.load_path_insert_index
|
||||
- break unless load_path_insert_index
|
||||
-
|
||||
- $LOAD_PATH[0...load_path_insert_index - Gem.activated_gem_paths].each do |lp|
|
||||
+ $LOAD_PATH[0...Gem.load_path_insert_index - Gem.activated_gem_paths].each do |lp|
|
||||
safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
begin
|
||||
if File.symlink? safe_lp # for backward compatibility
|
||||
|
||||
From da1492e9d7b28d068fbfbb0ba1cafcc516681567 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 19 May 2020 14:32:12 +0200
|
||||
Subject: [PATCH 3/5] Extract a local outside the loop
|
||||
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index decf4829f1..6a7faaf2d1 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -43,8 +43,9 @@ def require(path)
|
||||
# https://github.com/rubygems/rubygems/pull/1868
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
+ load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
|
||||
Gem.suffixes.each do |s|
|
||||
- $LOAD_PATH[0...Gem.load_path_insert_index - Gem.activated_gem_paths].each do |lp|
|
||||
+ $LOAD_PATH[0...load_path_check_index].each do |lp|
|
||||
safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
begin
|
||||
if File.symlink? safe_lp # for backward compatibility
|
||||
|
||||
From 22ad5717c38feda2375b53628d15ae3db2195684 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Thu, 21 May 2020 15:20:57 +0200
|
||||
Subject: [PATCH 4/5] Fix `$LOADED_FEATURES` cache sometimes not respected
|
||||
|
||||
In the cases where the initial manually `-I` path resolution succeeded,
|
||||
we were passing a full path to the original require effectively skipping
|
||||
the `$LOADED_FEATURES` cache. With this change, we _only_ do the
|
||||
resolution when a matching requirable path is found in a default gem. In
|
||||
that case, we skip activation of the default gem if we detect that the
|
||||
required file will be picked up for a `-I` path.
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 53 +++++++++++--------------
|
||||
test/rubygems/test_require.rb | 29 ++++++++++++++
|
||||
2 files changed, 53 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 6a7faaf2d1..81e37b98bf 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -39,46 +39,41 @@ def require(path)
|
||||
|
||||
path = path.to_path if path.respond_to? :to_path
|
||||
|
||||
- # Ensure -I beats a default gem
|
||||
- # https://github.com/rubygems/rubygems/pull/1868
|
||||
- resolved_path = begin
|
||||
- rp = nil
|
||||
- load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
|
||||
- Gem.suffixes.each do |s|
|
||||
- $LOAD_PATH[0...load_path_check_index].each do |lp|
|
||||
- safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
- begin
|
||||
- if File.symlink? safe_lp # for backward compatibility
|
||||
- next
|
||||
+ if spec = Gem.find_unresolved_default_spec(path)
|
||||
+ # Ensure -I beats a default gem
|
||||
+ # https://github.com/rubygems/rubygems/pull/1868
|
||||
+ resolved_path = begin
|
||||
+ rp = nil
|
||||
+ load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
|
||||
+ Gem.suffixes.each do |s|
|
||||
+ $LOAD_PATH[0...load_path_check_index].each do |lp|
|
||||
+ safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
+ begin
|
||||
+ if File.symlink? safe_lp # for backward compatibility
|
||||
+ next
|
||||
+ end
|
||||
+ rescue SecurityError
|
||||
+ RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
+ raise
|
||||
end
|
||||
- rescue SecurityError
|
||||
- RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
- raise
|
||||
- end
|
||||
|
||||
- full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}"))
|
||||
- if File.file?(full_path)
|
||||
- rp = full_path
|
||||
- break
|
||||
+ full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}"))
|
||||
+ if File.file?(full_path)
|
||||
+ rp = full_path
|
||||
+ break
|
||||
+ end
|
||||
end
|
||||
+ break if rp
|
||||
end
|
||||
- break if rp
|
||||
+ rp
|
||||
end
|
||||
- rp
|
||||
- end
|
||||
|
||||
- if resolved_path
|
||||
- RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
- return gem_original_require(resolved_path)
|
||||
- end
|
||||
-
|
||||
- if spec = Gem.find_unresolved_default_spec(path)
|
||||
begin
|
||||
Kernel.send(:gem, spec.name, Gem::Requirement.default_prerelease)
|
||||
rescue Exception
|
||||
RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
raise
|
||||
- end
|
||||
+ end unless resolved_path
|
||||
end
|
||||
|
||||
# If there are no unresolved deps, then we can use just try
|
||||
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
|
||||
index 9f2fe3439a..2b11e26dfe 100644
|
||||
--- a/test/rubygems/test_require.rb
|
||||
+++ b/test/rubygems/test_require.rb
|
||||
@@ -45,6 +45,35 @@ def refute_require(path)
|
||||
refute require(path), "'#{path}' was not yet required"
|
||||
end
|
||||
|
||||
+ def test_respect_loaded_features_caching_like_standard_require
|
||||
+ dir = Dir.mktmpdir("test_require", @tempdir)
|
||||
+
|
||||
+ lp1 = File.join dir, 'foo1'
|
||||
+ foo1 = File.join lp1, 'foo.rb'
|
||||
+
|
||||
+ FileUtils.mkdir_p lp1
|
||||
+ File.open(foo1, 'w') { |f| f.write "class Object; HELLO = 'foo1' end" }
|
||||
+
|
||||
+ lp = $LOAD_PATH.dup
|
||||
+
|
||||
+ $LOAD_PATH.unshift lp1
|
||||
+ assert_require 'foo'
|
||||
+ assert_equal "foo1", ::Object::HELLO
|
||||
+
|
||||
+ lp2 = File.join dir, 'foo2'
|
||||
+ foo2 = File.join lp2, 'foo.rb'
|
||||
+
|
||||
+ FileUtils.mkdir_p lp2
|
||||
+ File.open(foo2, 'w') { |f| f.write "class Object; HELLO = 'foo2' end" }
|
||||
+
|
||||
+ $LOAD_PATH.unshift lp2
|
||||
+ refute_require 'foo'
|
||||
+ assert_equal "foo1", ::Object::HELLO
|
||||
+ ensure
|
||||
+ $LOAD_PATH.replace lp
|
||||
+ Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
|
||||
+ end
|
||||
+
|
||||
# Providing -I on the commandline should always beat gems
|
||||
def test_dash_i_beats_gems
|
||||
a1 = util_spec "a", "1", {"b" => "= 1"}, "lib/test_gem_require_a.rb"
|
||||
|
||||
From db872c7a18d616f4447bdcca3130be6db9e5cb03 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Sat, 23 May 2020 20:18:41 +0200
|
||||
Subject: [PATCH 5/5] Remove direct reference to PR
|
||||
|
||||
The code is quite different now, so I think the link might be even
|
||||
confusing. If you want to know more, use git history.
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 81e37b98bf..115ae0cb50 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -41,7 +41,6 @@ def require(path)
|
||||
|
||||
if spec = Gem.find_unresolved_default_spec(path)
|
||||
# Ensure -I beats a default gem
|
||||
- # https://github.com/rubygems/rubygems/pull/1868
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
|
@ -1,92 +0,0 @@
|
||||
From c5197b2ab35ba389f48918e0c773b43b6dca2fa5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Fri, 7 Feb 2020 17:16:05 +0100
|
||||
Subject: [PATCH 1/3] Tweaks to get test passing more reliably
|
||||
|
||||
---
|
||||
test/rubygems/test_require.rb | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
|
||||
index 7cffbfa7fe..67c55416d4 100644
|
||||
--- a/test/rubygems/test_require.rb
|
||||
+++ b/test/rubygems/test_require.rb
|
||||
@@ -567,18 +567,20 @@ def util_install_extension_file(name)
|
||||
write_file File.join(@tempdir, "extconf.rb") do |io|
|
||||
io.write <<-RUBY
|
||||
require "mkmf"
|
||||
+ CONFIG['LDSHARED'] = '$(TOUCH) $@ ||'
|
||||
create_makefile("#{name}")
|
||||
RUBY
|
||||
end
|
||||
|
||||
write_file File.join(@tempdir, "#{name}.c") do |io|
|
||||
io.write <<-C
|
||||
- #include <ruby.h>
|
||||
void Init_#{name}() { }
|
||||
C
|
||||
end
|
||||
|
||||
- spec.files += ["extconf.rb", "#{name}.c"]
|
||||
+ write_file File.join(@tempdir, "depend")
|
||||
+
|
||||
+ spec.files += ["extconf.rb", "depend", "#{name}.c"]
|
||||
|
||||
so = File.join(spec.gem_dir, "#{name}.#{RbConfig::CONFIG["DLEXT"]}")
|
||||
refute_path_exists so
|
||||
|
||||
From 7bfd7319cd751837c3ccaf1d97b02846eaaf39d5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 11 Feb 2020 11:56:06 +0100
|
||||
Subject: [PATCH 2/3] Fix bug bug calculating $LOAD_PATH's to check in
|
||||
`require`
|
||||
|
||||
In `Gem.load_path_insert_index` is not set, we end up having
|
||||
`$LOAD_PATH[0...-1]`, unintentionally skipping the last $LOAD_PATH entry
|
||||
from the check.
|
||||
|
||||
The correct thing to do in that case is to not even try since we have no
|
||||
way of distinguisng default LOAD_PATH entries from those added with -I.
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 369f2c743e..a8d170f13a 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -44,7 +44,10 @@ def require(path)
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
Gem.suffixes.each do |s|
|
||||
- $LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp|
|
||||
+ load_path_insert_index = Gem.load_path_insert_index
|
||||
+ break unless load_path_insert_index
|
||||
+
|
||||
+ $LOAD_PATH[0...load_path_insert_index].each do |lp|
|
||||
safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
begin
|
||||
if File.symlink? safe_lp # for backward compatibility
|
||||
|
||||
From 4fc0ab21c0f7713829abb522ce3b6d8e24c126b3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Fri, 14 Feb 2020 02:03:04 +0100
|
||||
Subject: [PATCH 3/3] Exclude empty suffix from `-I` require loop
|
||||
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index a8d170f13a..9712fb6ac0 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -43,7 +43,7 @@ def require(path)
|
||||
# https://github.com/rubygems/rubygems/pull/1868
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
- Gem.suffixes.each do |s|
|
||||
+ Gem.suffixes[1..-1].each do |s|
|
||||
load_path_insert_index = Gem.load_path_insert_index
|
||||
break unless load_path_insert_index
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 301e30bf97dd603ca81d52b90186908575c4ddf8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 25 Feb 2020 15:01:44 +0100
|
||||
Subject: [PATCH] Revert "Exclude empty suffix from `-I` require loop"
|
||||
|
||||
This reverts commit 4fc0ab21c0f7713829abb522ce3b6d8e24c126b3.
|
||||
|
||||
Technically, extensionless ruby files are valid ruby files that can be
|
||||
required. For example, `bin/bundle` is sometimes required from other
|
||||
binstubs even if it's also runnable directly.
|
||||
|
||||
So, we should technically consider this kind of files too.
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 9712fb6ac0..a8d170f13a 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -43,7 +43,7 @@ def require(path)
|
||||
# https://github.com/rubygems/rubygems/pull/1868
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
- Gem.suffixes[1..-1].each do |s|
|
||||
+ Gem.suffixes.each do |s|
|
||||
load_path_insert_index = Gem.load_path_insert_index
|
||||
break unless load_path_insert_index
|
||||
|
@ -1,6 +0,0 @@
|
||||
%__rubygems_requires %{_rpmconfigdir}/rubygems.req
|
||||
%__rubygems_provides %{_rpmconfigdir}/rubygems.prov
|
||||
%__rubygems_conflicts %{_rpmconfigdir}/rubygems.con
|
||||
# In non-gem packages, the %%{gem_name} macro is not available and the macro
|
||||
# stays unexpanded which leads to "invalid regex" error (rhbz#1154067).
|
||||
%__rubygems_path ^%{?gem_name:%{gem_spec}}%{!?gem_name:this_should_never_match_anything}$
|
52
rubygems.con
52
rubygems.con
@ -1,52 +0,0 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require 'rubygems/package'
|
||||
|
||||
module RubyGemsReq
|
||||
module Helpers
|
||||
# Keep only '!=' requirements.
|
||||
def self.conflicts(requirements)
|
||||
conflicts = requirements.select {|r| r.first == '!='}
|
||||
end
|
||||
|
||||
# Converts Gem::Requirement into array of requirements strings compatible
|
||||
# with RPM .spec file.
|
||||
def self.requirement_versions_to_rpm(requirement)
|
||||
self.conflicts(requirement.requirements).map do |op, version|
|
||||
version == Gem::Version.new(0) ? "" : "= #{version}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Report conflicting gem dependencies including their version.
|
||||
def self.gem_depenencies(specification)
|
||||
specification.runtime_dependencies.each do |dependency|
|
||||
conflict_strings = Helpers::requirement_versions_to_rpm(dependency.requirement).map do |requirement|
|
||||
requirement_string = "rubygem(#{dependency.name}) #{requirement}"
|
||||
end
|
||||
if conflict_strings.length > 0
|
||||
conflict_string = conflict_strings.join(' with ')
|
||||
conflict_string.prepend('(').concat(')') if conflict_strings.length > 1
|
||||
puts conflict_string
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Reports all conflicts specified by all provided .gemspec files.
|
||||
def self.conflicts
|
||||
while filename = gets
|
||||
filename.strip!
|
||||
begin
|
||||
specification = Gem::Specification.load filename
|
||||
|
||||
gem_depenencies(specification)
|
||||
rescue => e
|
||||
# Ignore all errors.
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
RubyGemsReq::conflicts
|
||||
end
|
@ -1,36 +0,0 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require 'rubygems/package'
|
||||
|
||||
module RubyGemsProv
|
||||
module Helpers
|
||||
# If there is some prelease version files, such as rc1 (i.e. non-numeric
|
||||
# field), prepend this field by tilde instead of dot.
|
||||
def self.normalize_prerelease(version)
|
||||
if version.prerelease?
|
||||
prerelease = version.version.sub /^#{version.release}\./, ''
|
||||
"#{version.release}~#{prerelease}"
|
||||
else
|
||||
version.release
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Reports all functionality gem provides.
|
||||
def self.provides
|
||||
while filename = gets
|
||||
filename.strip!
|
||||
begin
|
||||
specification = Gem::Specification.load filename
|
||||
|
||||
puts "rubygem(#{specification.name}) = #{Helpers::normalize_prerelease(specification.version)}"
|
||||
rescue => e
|
||||
# Ignore all errors.
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
RubyGemsProv::provides
|
||||
end
|
88
rubygems.req
88
rubygems.req
@ -1,88 +0,0 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require 'rubygems/package'
|
||||
|
||||
module RubyGemsReq
|
||||
module Helpers
|
||||
# Expands '~>' and '!=' gem requirements.
|
||||
def self.expand_requirement(requirements)
|
||||
requirements.inject([]) do |output, r|
|
||||
output.concat case r.first
|
||||
when '~>'
|
||||
expand_pessimistic_requirement(r)
|
||||
when '!='
|
||||
# If there is only the conflict requirement, we still need to depend
|
||||
# on the specified gem.
|
||||
if requirements.size == 1
|
||||
Gem::Requirement.default.requirements
|
||||
else
|
||||
[]
|
||||
end
|
||||
else
|
||||
[r]
|
||||
end
|
||||
end.reject {|r| r.empty? }
|
||||
end
|
||||
|
||||
# Expands the pessimistic version operator '~>' into equivalent '>=' and
|
||||
# '<' pair.
|
||||
def self.expand_pessimistic_requirement(requirement)
|
||||
next_version = Gem::Version.create(requirement.last).bump
|
||||
return ['>=', requirement.last], ['<', next_version]
|
||||
end
|
||||
|
||||
# Converts Gem::Requirement into array of requirements strings compatible
|
||||
# with RPM .spec file.
|
||||
def self.requirement_versions_to_rpm(requirement)
|
||||
self.expand_requirement(requirement.requirements).map do |op, version|
|
||||
version == Gem::Version.new(0) ? "" : " #{op} #{version}"
|
||||
end
|
||||
end
|
||||
|
||||
# Compose dependency together with its requirements in RPM rich dependency
|
||||
# string.
|
||||
def self.compose_dependency_string(name, requirements)
|
||||
dependency_strings = requirements.map { |requirement| name + requirement }
|
||||
dependency_string = dependency_strings.join(' with ')
|
||||
dependency_string.prepend('(').concat(')') if dependency_strings.length > 1
|
||||
dependency_string
|
||||
end
|
||||
end
|
||||
|
||||
# Report RubyGems dependency, versioned if required.
|
||||
def self.rubygems_dependency(specification)
|
||||
dependency_name = "ruby(rubygems)"
|
||||
requirements = Helpers::requirement_versions_to_rpm(specification.required_rubygems_version)
|
||||
|
||||
puts Helpers::compose_dependency_string(dependency_name, requirements)
|
||||
end
|
||||
|
||||
# Report all gem dependencies including their version.
|
||||
def self.gem_depenencies(specification)
|
||||
specification.runtime_dependencies.each do |dependency|
|
||||
dependency_name = "rubygem(#{dependency.name})"
|
||||
requirements = Helpers::requirement_versions_to_rpm(dependency.requirement)
|
||||
|
||||
puts Helpers::compose_dependency_string(dependency_name, requirements)
|
||||
end
|
||||
end
|
||||
|
||||
# Reports all requirements specified by all provided .gemspec files.
|
||||
def self.requires
|
||||
while filename = gets
|
||||
filename.strip!
|
||||
begin
|
||||
specification = Gem::Specification.load filename
|
||||
|
||||
rubygems_dependency(specification)
|
||||
gem_depenencies(specification)
|
||||
rescue => e
|
||||
# Ignore all errors.
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
RubyGemsReq::requires
|
||||
end
|
6
sources
6
sources
@ -1 +1,5 @@
|
||||
SHA512 (ruby-2.7.2.tar.xz) = 7972278b096aa768c7adf2befd26003e18781a29ca317640317d30d93d6e963ded197724c8e2f1dfe1e838c5647176d414a74732a62e931fb50d6f2e0f777349
|
||||
f26cefbc8ab6728650ab9ae773d22bcb ruby-1.8.6-p388.tar.bz2
|
||||
b6dd396f513efeb7864685c840f9643a ruby-refm-rdp-1.8.2-ja-html.tar.gz
|
||||
634c25b14e19925d10af3720d72e8741 rubyfaq-990927.tar.gz
|
||||
4fcec898f51d8371cc42d0a013940469 rubyfaq-jp-990927.tar.gz
|
||||
f77c307cb72fb8808b0e85af5d05cefc ruby-1.8.6-p399.tar.bz2
|
||||
|
@ -1,7 +0,0 @@
|
||||
if !!$LOADED_FEATURES.detect { |f| f =~ /abrt\.rb/ }
|
||||
exit true
|
||||
else
|
||||
puts 'ERROR: ABRT hook was not loaded.'
|
||||
|
||||
exit false
|
||||
end
|
@ -1,65 +0,0 @@
|
||||
require 'set'
|
||||
|
||||
LIBRUBY_SO = 'libruby.so'
|
||||
PROBES_D = 'probes.d'
|
||||
|
||||
# These probes are excluded by VM_COLLECT_USAGE_DETAILS ifdef.
|
||||
EXCLUDE_PROBES = Set.new %w(insn insn__operand)
|
||||
|
||||
## Detect SystemTap section headers presence
|
||||
|
||||
stap_headers = [
|
||||
'\.stapsdt\.base',
|
||||
'\.note\.stapsdt'
|
||||
]
|
||||
|
||||
header_regexp = %r{ (#{stap_headers.join('|')}) }
|
||||
|
||||
section_headers = `readelf -S "#{LIBRUBY_SO}"`
|
||||
detected_stap_headers = section_headers.scan(header_regexp).flatten
|
||||
|
||||
# Assume there are both headers until this is proven wrong ;)
|
||||
unless detected_stap_headers.size == 2
|
||||
puts 'ERROR: SystemTap (DTrace) headers were not detected in resulting library.'
|
||||
exit false
|
||||
end
|
||||
|
||||
## Find if every declared probe is propagated to resulting library
|
||||
|
||||
# Colect probes specified in probes.d file.
|
||||
probes_declared = []
|
||||
|
||||
File.open(PROBES_D) do |file|
|
||||
file.each_line do |line|
|
||||
if probe = line[/probe (\S+)\(.*\);/, 1]
|
||||
probes_declared << probe
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
probes_declared = Set.new probes_declared
|
||||
|
||||
unless EXCLUDE_PROBES.subset? probes_declared
|
||||
puts 'ERROR: Change in SystemTap (DTrace) probes definition file detected.'
|
||||
exit false
|
||||
end
|
||||
|
||||
probes_declared -= EXCLUDE_PROBES
|
||||
|
||||
# Detect probes in resulting library.
|
||||
get_probes_detected = %r{
|
||||
^\s*Provider:\s+ruby,\s+Name:\s+(\S+),\s+.*$
|
||||
}
|
||||
|
||||
probes_detected = `eu-readelf -n "#{LIBRUBY_SO}"`
|
||||
|
||||
probes_detected = Set.new probes_detected.scan(get_probes_detected).flatten
|
||||
|
||||
# Both sets must be equal, otherwise something is wrong.
|
||||
unless probes_declared == probes_detected
|
||||
puts 'ERROR: SystemTap (DTrace) probes were not correctly propagated into resulting library.'
|
||||
puts " Undetected probes: #{(probes_declared - probes_detected).sort.join(', ')}\n",
|
||||
" Additional detected probes: #{(probes_detected - probes_declared).sort.join(', ')}"
|
||||
|
||||
exit false
|
||||
end
|
Loading…
Reference in New Issue
Block a user