summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/windows.yml1
-rw-r--r--NEWS.md5
-rw-r--r--doc/file/filename_globbing.md18
-rw-r--r--doc/file/filename_matching.md41
-rw-r--r--ext/json/generator/generator.c4
-rw-r--r--ext/json/parser/parser.c17
-rw-r--r--file.c34
-rw-r--r--gems/bundled_gems2
-rw-r--r--spec/bundler/install/cooldown_spec.rb76
-rw-r--r--vcpkg.json2
10 files changed, 145 insertions, 55 deletions
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index b2c84abc6d..80a935b30f 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -96,6 +96,7 @@ jobs:
- name: Install libraries with vcpkg
run: |
+ git -C "%VCPKG_INSTALLATION_ROOT%" pull --quiet
vcpkg install
working-directory: src
if: ${{ ! steps.restore-vcpkg.outputs.cache-hit }}
diff --git a/NEWS.md b/NEWS.md
index 501b894c67..9ff290ad75 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -105,8 +105,8 @@ releases.
* minitest 6.0.6
* rake 13.4.2
* 13.3.1 to [v13.4.0][rake-v13.4.0], [v13.4.1][rake-v13.4.1], [v13.4.2][rake-v13.4.2]
-* test-unit 3.7.7
- * 3.7.5 to [3.7.6][test-unit-3.7.6], [3.7.7][test-unit-3.7.7]
+* test-unit 3.7.8
+ * 3.7.5 to [3.7.6][test-unit-3.7.6], [3.7.7][test-unit-3.7.7], [3.7.8][test-unit-3.7.8]
* net-imap 0.6.4
* 0.6.2 to [v0.6.3][net-imap-v0.6.3], [v0.6.4][net-imap-v0.6.4]
* rbs 4.0.2
@@ -242,6 +242,7 @@ A lot of work has gone into making Ractors more stable, performant, and usable.
[rake-v13.4.2]: https://github.com/ruby/rake/releases/tag/v13.4.2
[test-unit-3.7.6]: https://github.com/test-unit/test-unit/releases/tag/3.7.6
[test-unit-3.7.7]: https://github.com/test-unit/test-unit/releases/tag/3.7.7
+[test-unit-3.7.8]: https://github.com/test-unit/test-unit/releases/tag/3.7.8
[net-imap-v0.6.3]: https://github.com/ruby/net-imap/releases/tag/v0.6.3
[net-imap-v0.6.4]: https://github.com/ruby/net-imap/releases/tag/v0.6.4
[rbs-v3.10.1]: https://github.com/ruby/rbs/releases/tag/v3.10.1
diff --git a/doc/file/filename_globbing.md b/doc/file/filename_globbing.md
index 7981964c5c..ce4549bffe 100644
--- a/doc/file/filename_globbing.md
+++ b/doc/file/filename_globbing.md
@@ -1,22 +1,20 @@
# Filename Globbing
-Filename globbing is a pattern-matching feature implemented in certain Ruby methods.
-
-Filename-globbing methods find filesystem entries (files and directories)
-that match certain patterns;
-these methods are:
+Filename globbing is a pattern-matching feature implemented in certain Ruby methods:
- Dir.glob.
- [`Dir[]`](https://docs.ruby-lang.org/en/master/Dir.html#method-c-5B-5D).
- Pathname.glob.
- Pathname#glob.
-These methods are quite different from filename-matching methods (not discussed here),
-which match patterns against string paths, and do not access the filesystem;
-those methods are:
+Each `glob` method finds filesystem entries (files and directories)
+that match certain patterns.
+
+These methods are quite different
+from [filename-matching](rdoc-ref:filename_matching.md) methods,
+which match patterns against string paths, and do not access the filesystem.
-- File.fnmatch.
-- Pathname#fnmatch.
+## Patterns
These are the basic elements of filename-globbing patterns;
see the sections below for details:
diff --git a/doc/file/filename_matching.md b/doc/file/filename_matching.md
index 9f13da9012..cf5b60bac2 100644
--- a/doc/file/filename_matching.md
+++ b/doc/file/filename_matching.md
@@ -1,4 +1,4 @@
-## Filename Matching
+# Filename Matching
Filename matching is a pattern-matching feature implemented in certain Ruby methods:
@@ -8,14 +8,11 @@ Filename matching is a pattern-matching feature implemented in certain Ruby meth
Each `fnmatch` method matches a pattern against a string _path_;
these methods operate only on strings, and do not access the file system.
-These are quite different from filename globbing methods (not discussed here),
-which match patterns against string paths found in the actual file system:
+These methods are quite different
+from [filename-globbing](rdoc-ref:filename_globbing.md) methods,
+which match patterns against string paths found in the actual file system.
-- Dir.glob.
-- Pathname.glob.
-- Pathname#glob.
-
-### Patterns
+## Patterns
These are the basic elements of filename matching patterns;
see the sections below for details:
@@ -36,7 +33,7 @@ There are two other patterns that are disabled by default:
- Alternatives (`'{ , }'`);
see [`File::FNM_EXTGLOB`](#constant-filefnmextglob) below.
-#### Simple \String
+### Simple \String
A "simple string" is one that does not contain special filename-matching patterns;
see the table above.
@@ -78,7 +75,7 @@ File.fnmatch('PROGRAM~1', 'Program Files') # => false
It may be enabled by flag [`File::FNM_SHORTNAME`](#constant-filefnmshortname).
-#### Any Sequence of Characters (`'*'`)
+### Any Sequence of Characters (`'*'`)
The asterisk pattern (`'*'`) matches any sequence of characters:
@@ -105,7 +102,7 @@ File.fnmatch('*.rb', 'lib/test.rb') # => true
That matching may be disabled by flag [`File::FNM_PATHNAME`](#constant-filefnmpathname).
-#### Single Character (`'?'`)
+### Single Character (`'?'`)
The question-mark pattern (`'?'`) matches any single character:
@@ -125,7 +122,7 @@ File.fnmatch('foo?boo', 'foo/boo') # => true
That matching may be disabled by flag [`File::FNM_PATHNAME`](#constant-filefnmpathname).
-#### Single Character from a Set (`'[abc]'`, `'[^abc]'`)
+### Single Character from a Set (`'[abc]'`, `'[^abc]'`)
Characters enclosed in square brackets define a set of characters,
any of which matches a single character:
@@ -145,7 +142,7 @@ File.fnmatch('[^ruby]', 'r') # => false
File.fnmatch('[^ruby]', 'u') # => false
```
-#### Single Character from a \Range (`'[a-c]'`, `'[^a-c]'`)
+### Single Character from a \Range (`'[a-c]'`, `'[^a-c]'`)
A range of characters enclosed in square brackets defines a set of characters,
any of which matches a single character:
@@ -165,7 +162,7 @@ File.fnmatch('[^a-c]', 'b') # => false
File.fnmatch('[^a-c]', 'd') # => true
```
-#### Escape (`'\'`)
+### Escape (`'\'`)
The backslash character (`'\'`) may be used to escape any of the characters
that filename matching treats as special:
@@ -191,7 +188,7 @@ File.fnmatch('\\\\', '\\') # => true
By default escape pattern `'\'` is enabled;
it may be disabled by flag [`File::FNM_NOESCAPE`](#constant-filefnmnoescape).
-### Flags
+## Flags
Optional argument `flags` (defaults to `0`) may be the bitwise OR
of the constants `File::FNM*`.
@@ -210,7 +207,7 @@ see the sections below for details:
| [`File::FNM_SYSCASE`](#constant-filefnmsyscase) | Make the pattern use OS's case sensitivity. |
-#### Constant File::FNM_CASEFOLD
+### Constant File::FNM_CASEFOLD
By default, filename matching is case-sensitive;
use constant [`File::FNM_CASEFOLD`](#constant-filefnmcasefold)
@@ -221,7 +218,7 @@ File.fnmatch('abc', 'ABC') # => false
File.fnmatch('abc', 'ABC', File::FNM_CASEFOLD) # => true
```
-#### Constant File::FNM_DOTMATCH
+### Constant File::FNM_DOTMATCH
By default, filename matching does not allow pattern `'*'` to match a dotfile name
(i.e, a filename beginning with a dot);
@@ -232,7 +229,7 @@ to enable the match:
File.fnmatch('*', '.document') # => false
File.fnmatch('*', '.document', File::FNM_DOTMATCH) # => true
```
-#### Constant File::FNM_EXTGLOB
+### Constant File::FNM_EXTGLOB
By default, filename matching has the alternative notation disabled;
use constant [`File::FNM_EXTGLOB`](#constant-filefnmextglob)
@@ -261,7 +258,7 @@ File.fnmatch('{*ELLO,?????}', 'hello', File::FNM_EXTGLOB) # => true
File.fnmatch('R{ub,foo,bar}y', 'Ruby') # => false
```
-#### Constant File::FNM_NOESCAPE
+### Constant File::FNM_NOESCAPE
By default filename matching has escaping enabled;
use constant [`File::FNM_NOESCAPE`](#constant-filefnmnoescape)
@@ -272,7 +269,7 @@ File.fnmatch('\*\?\*\*', '*?**') # => true
File.fnmatch('\*\?\*\*', '*?**', File::FNM_NOESCAPE) # => false
```
-#### Constant File::FNM_PATHNAME
+### Constant File::FNM_PATHNAME
Flag [`File::FNM_PATHNAME`](#constant-filefnmpathname) affects
patterns `'**'`, `'*'`, and `'?'`.
@@ -316,7 +313,7 @@ File.fnmatch('foo?boo', 'foo/boo') # => true
File.fnmatch('foo?boo', 'foo/boo', File::FNM_PATHNAME) # => false
```
-#### Constant File::FNM_SHORTNAME
+### Constant File::FNM_SHORTNAME
By default, Windows shortname matching is disabled;
use constant [`File::FNM_SHORTNAME`](#constant-filefnmshortname)
@@ -339,7 +336,7 @@ File.fnmatch('PROGRAM~1', 'Program Files') # => false
File.fnmatch('PROGRAM~1', 'Program Files', File::FNM_SHORTNAME) # => true
```
-#### Constant File::FNM_SYSCASE
+### Constant File::FNM_SYSCASE
By default, filename matching uses Ruby's own case-sensitivity rules;
use constant [`File::FNM_SYSCASE`](#constant-filefnmsyscase)
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c
index 110b5f6b32..82853633ba 100644
--- a/ext/json/generator/generator.c
+++ b/ext/json/generator/generator.c
@@ -724,7 +724,11 @@ static void State_compact(void *ptr)
static size_t State_memsize(const void *ptr)
{
+#ifdef HAVE_RUBY_TYPED_EMBEDDABLE
+ return 0;
+#else
return sizeof(JSON_Generator_State);
+#endif
}
static const rb_data_type_t JSON_Generator_State_type = {
diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c
index eb7dc9aa82..2d47f31c02 100644
--- a/ext/json/parser/parser.c
+++ b/ext/json/parser/parser.c
@@ -268,7 +268,11 @@ static void rvalue_stack_free(void *ptr)
static size_t rvalue_stack_memsize(const void *ptr)
{
const rvalue_stack *stack = (const rvalue_stack *)ptr;
- return sizeof(rvalue_stack) + sizeof(VALUE) * stack->capa;
+ size_t memsize = sizeof(VALUE) * stack->capa;
+#ifndef HAVE_RUBY_TYPED_EMBEDDABLE
+ memsize += sizeof(rvalue_stack);
+#endif
+ return memsize;
}
static const rb_data_type_t JSON_Parser_rvalue_stack_type = {
@@ -452,7 +456,12 @@ static void json_frame_stack_free(void *ptr)
static size_t json_frame_stack_memsize(const void *ptr)
{
const json_frame_stack *stack = (const json_frame_stack *)ptr;
- return sizeof(json_frame_stack) + sizeof(json_frame) * stack->capa;
+
+ size_t memsize = sizeof(json_frame) * stack->capa;
+#ifndef HAVE_RUBY_TYPED_EMBEDDABLE
+ memsize += sizeof(json_frame_stack);
+#endif
+ return memsize;
}
static const rb_data_type_t JSON_Parser_frame_stack_type = {
@@ -1961,7 +1970,11 @@ static void JSON_ParserConfig_mark(void *ptr)
static size_t JSON_ParserConfig_memsize(const void *ptr)
{
+#ifdef HAVE_RUBY_TYPED_EMBEDDABLE
+ return 0;
+#else
return sizeof(JSON_ParserConfig);
+#endif
}
static const rb_data_type_t JSON_ParserConfig_type = {
diff --git a/file.c b/file.c
index c4a531d783..fffd09c22e 100644
--- a/file.c
+++ b/file.c
@@ -3653,11 +3653,12 @@ has_drive_letter(const char *buf)
}
#ifndef _WIN32
-static char*
+static VALUE
getcwdofdrv(int drv)
{
char drive[4];
- char *drvcwd, *oldcwd;
+ char *oldcwd;
+ VALUE drvcwd;
drive[0] = drv;
drive[1] = ':';
@@ -3669,13 +3670,13 @@ getcwdofdrv(int drv)
*/
oldcwd = ruby_getcwd();
if (chdir(drive) == 0) {
- drvcwd = ruby_getcwd();
+ drvcwd = rb_dir_getwd_ospath();
chdir(oldcwd);
xfree(oldcwd);
}
else {
/* perhaps the drive is not exist. we return only drive letter */
- drvcwd = strdup(drive);
+ drvcwd = rb_enc_str_new_cstr(drive, rb_filesystem_encoding());
}
return drvcwd;
}
@@ -4045,16 +4046,19 @@ ospath_new(const char *ptr, long len, rb_encoding *fsenc)
}
static char *
-append_fspath(VALUE result, VALUE fname, char *dir, rb_encoding **enc, rb_encoding *fsenc)
+append_fspath(VALUE result, VALUE fname, VALUE dirname, rb_encoding **enc, rb_encoding *fsenc)
{
- char *buf, *cwdp = dir;
- VALUE dirname = Qnil;
- size_t dirlen = strlen(dir), buflen = rb_str_capacity(result);
+ if (RB_UNLIKELY(!rb_enc_asciicompat(fsenc) || rb_enc_str_coderange(dirname) != ENC_CODERANGE_7BIT)) {
+ dirname = rb_str_new_shared(dirname);
+ rb_enc_associate(dirname, fsenc);
+ }
+
+ char *buf, *cwdp;
+ size_t dirlen = RSTRING_LEN(dirname);
+ size_t buflen = rb_str_capacity(result);
if (NORMALIZE_UTF8PATH || *enc != fsenc) {
- dirname = ospath_new(dir, dirlen, fsenc);
if (!rb_enc_compatible(fname, dirname)) {
- xfree(dir);
/* rb_enc_check must raise because the two encodings are not
* compatible. */
rb_enc_check(fname, dirname);
@@ -4063,19 +4067,15 @@ append_fspath(VALUE result, VALUE fname, char *dir, rb_encoding **enc, rb_encodi
rb_encoding *direnc = fs_enc_check(fname, dirname);
if (direnc != fsenc) {
dirname = rb_str_conv_enc(dirname, fsenc, direnc);
- RSTRING_GETMEM(dirname, cwdp, dirlen);
- }
- else if (NORMALIZE_UTF8PATH) {
- RSTRING_GETMEM(dirname, cwdp, dirlen);
}
*enc = direnc;
}
+
+ RSTRING_GETMEM(dirname, cwdp, dirlen);
do {buflen *= 2;} while (dirlen > buflen);
rb_str_resize(result, buflen);
buf = RSTRING_PTR(result);
memcpy(buf, cwdp, dirlen);
- xfree(dir);
- if (!NIL_P(dirname)) rb_str_resize(dirname, 0);
rb_enc_associate(result, *enc);
return buf + dirlen;
}
@@ -4177,7 +4177,7 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
p = pend;
}
else {
- char *e = append_fspath(result, fname, ruby_getcwd(), &enc, fsenc);
+ char *e = append_fspath(result, fname, rb_dir_getwd_ospath(), &enc, fsenc);
BUFINIT();
p = e;
}
diff --git a/gems/bundled_gems b/gems/bundled_gems
index 8e244af598..14f79ce9ae 100644
--- a/gems/bundled_gems
+++ b/gems/bundled_gems
@@ -9,7 +9,7 @@
minitest 6.0.6 https://github.com/minitest/minitest
power_assert 3.0.1 https://github.com/ruby/power_assert
rake 13.4.2 https://github.com/ruby/rake
-test-unit 3.7.7 https://github.com/test-unit/test-unit
+test-unit 3.7.8 https://github.com/test-unit/test-unit
rexml 3.4.4 https://github.com/ruby/rexml
rss 0.3.2 https://github.com/ruby/rss
net-imap 0.6.4 https://github.com/ruby/net-imap
diff --git a/spec/bundler/install/cooldown_spec.rb b/spec/bundler/install/cooldown_spec.rb
index c4bba0fa1d..bad7b7cf34 100644
--- a/spec/bundler/install/cooldown_spec.rb
+++ b/spec/bundler/install/cooldown_spec.rb
@@ -87,6 +87,26 @@ RSpec.describe "bundle install with the cooldown setting" do
build_gem "ripe_gem", "2.0.0" do |s|
s.date = now - (1 * 86_400)
end
+
+ # parent only resolves with the in-cooldown child 2.0.0
+ build_gem "child", "1.0.0" do |s|
+ s.date = now - (30 * 86_400)
+ end
+ build_gem "child", "2.0.0" do |s|
+ s.date = now - (1 * 86_400)
+ end
+ build_gem "parent", "1.0.0" do |s|
+ s.add_dependency "child", ">= 2.0.0"
+ s.date = now - (30 * 86_400)
+ end
+
+ # a cooldown-eligible version exists above the in-cooldown locked one
+ build_gem "upgradable", "2.0.0" do |s|
+ s.date = now - (1 * 86_400)
+ end
+ build_gem "upgradable", "3.0.0" do |s|
+ s.date = now - (30 * 86_400)
+ end
end
end
@@ -353,5 +373,61 @@ RSpec.describe "bundle install with the cooldown setting" do
expect(the_bundle).to include_gems("ripe_gem 1.0.0")
end
+
+ it "keeps an in-cooldown transitive dependency on bundle update --all" do
+ gemfile <<-G
+ source "https://gem.repo3"
+ gem "parent"
+ G
+
+ lockfile <<-L
+ GEM
+ remote: https://gem.repo3/
+ specs:
+ child (2.0.0)
+ parent (1.0.0)
+ child (>= 2.0.0)
+
+ PLATFORMS
+ #{lockfile_platforms}
+
+ DEPENDENCIES
+ parent
+
+ BUNDLED WITH
+ #{Bundler::VERSION}
+ L
+
+ bundle "update --all --cooldown 7", artifice: "compact_index_cooldown"
+
+ expect(the_bundle).to include_gems("parent 1.0.0", "child 2.0.0")
+ end
+
+ it "still upgrades to a cooldown-eligible version above the locked one" do
+ gemfile <<-G
+ source "https://gem.repo3"
+ gem "upgradable"
+ G
+
+ lockfile <<-L
+ GEM
+ remote: https://gem.repo3/
+ specs:
+ upgradable (2.0.0)
+
+ PLATFORMS
+ #{lockfile_platforms}
+
+ DEPENDENCIES
+ upgradable
+
+ BUNDLED WITH
+ #{Bundler::VERSION}
+ L
+
+ bundle "update --all --cooldown 7", artifice: "compact_index_cooldown"
+
+ expect(the_bundle).to include_gems("upgradable 3.0.0")
+ end
end
end
diff --git a/vcpkg.json b/vcpkg.json
index 64d73c4048..c2caad14cd 100644
--- a/vcpkg.json
+++ b/vcpkg.json
@@ -7,5 +7,5 @@
"openssl",
"zlib"
],
- "builtin-baseline": "56bb2411609227288b70117ead2c47585ba07713"
+ "builtin-baseline": "f3e10653cc27d62a37a3763cd84b38bca07c6075"
} \ No newline at end of file