Hello community,
here is the log from the commit of package rubygem-activestorage-6.0 for
openSUSE:Factory checked in at 2019-11-13 13:25:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-activestorage-6.0 (Old)
and /work/SRC/openSUSE:Factory/.rubygem-activestorage-6.0.new.2990 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-activestorage-6.0"
Wed Nov 13 13:25:16 2019 rev:2 rq:747687 version:6.0.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/rubygem-activestorage-6.0/rubygem-activestorage-6.0.changes
2019-08-19 21:40:50.328296938 +0200
+++
/work/SRC/openSUSE:Factory/.rubygem-activestorage-6.0.new.2990/rubygem-activestorage-6.0.changes
2019-11-13 13:25:19.843510405 +0100
@@ -1,0 +2,15 @@
+Tue Nov 12 13:34:30 UTC 2019 - Manuel Schnitzer <[email protected]>
+
+- updated to version 6.0.1
+
+ * `ActiveStorage::AnalyzeJob`s are discarded on
`ActiveRecord::RecordNotFound` errors.
+
+ *George Claghorn*
+
+ * Blobs are recorded in the database before being uploaded to the service.
+ This fixes that generated blob keys could silently collide, leading to
+ data loss.
+
+ *Julik Tarkhanov*
+
+-------------------------------------------------------------------
Old:
----
activestorage-6.0.0.gem
New:
----
activestorage-6.0.1.gem
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ rubygem-activestorage-6.0.spec ++++++
--- /var/tmp/diff_new_pack.D16n6P/_old 2019-11-13 13:25:20.435511022 +0100
+++ /var/tmp/diff_new_pack.D16n6P/_new 2019-11-13 13:25:20.439511025 +0100
@@ -12,7 +12,7 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
@@ -24,7 +24,7 @@
#
Name: rubygem-activestorage-6.0
-Version: 6.0.0
+Version: 6.0.1
Release: 0
%define mod_name activestorage
%define mod_full_name %{mod_name}-%{version}
@@ -36,9 +36,9 @@
%endif
# /MANUAL
BuildRoot: %{_tmppath}/%{name}-%{version}-build
-BuildRequires: ruby-macros >= 5
BuildRequires: %{ruby >= 2.5.0}
BuildRequires: %{rubygem gem2rpm}
+BuildRequires: ruby-macros >= 5
Url: https://rubyonrails.org
Source: https://rubygems.org/gems/%{mod_full_name}.gem
Source1: gem2rpm.yml
++++++ activestorage-6.0.0.gem -> activestorage-6.0.1.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/CHANGELOG.md new/CHANGELOG.md
--- old/CHANGELOG.md 2019-08-16 19:59:07.000000000 +0200
+++ new/CHANGELOG.md 2019-11-05 15:37:50.000000000 +0100
@@ -1,3 +1,16 @@
+## Rails 6.0.1 (November 5, 2019) ##
+
+* `ActiveStorage::AnalyzeJob`s are discarded on
`ActiveRecord::RecordNotFound` errors.
+
+ *George Claghorn*
+
+* Blobs are recorded in the database before being uploaded to the service.
+ This fixes that generated blob keys could silently collide, leading to
+ data loss.
+
+ *Julik Tarkhanov*
+
+
## Rails 6.0.0 (August 16, 2019) ##
* No changes.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/app/jobs/active_storage/analyze_job.rb
new/app/jobs/active_storage/analyze_job.rb
--- old/app/jobs/active_storage/analyze_job.rb 2019-08-16 19:59:07.000000000
+0200
+++ new/app/jobs/active_storage/analyze_job.rb 2019-11-05 15:37:50.000000000
+0100
@@ -4,6 +4,7 @@
class ActiveStorage::AnalyzeJob < ActiveStorage::BaseJob
queue_as { ActiveStorage.queues[:analysis] }
+ discard_on ActiveRecord::RecordNotFound
retry_on ActiveStorage::IntegrityError, attempts: 10, wait:
:exponentially_longer
def perform(blob)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/app/models/active_storage/blob.rb
new/app/models/active_storage/blob.rb
--- old/app/models/active_storage/blob.rb 2019-08-16 19:59:07.000000000
+0200
+++ new/app/models/active_storage/blob.rb 2019-11-05 15:37:50.000000000
+0100
@@ -5,8 +5,9 @@
# A blob is a record that contains the metadata about a file and a key for
where that file resides on the service.
# Blobs can be created in two ways:
#
-# 1. Subsequent to the file being uploaded server-side to the service via
<tt>create_after_upload!</tt>.
-# 2. Ahead of the file being directly uploaded client-side to the service via
<tt>create_before_direct_upload!</tt>.
+# 1. Ahead of the file being uploaded server-side to the service, via
<tt>create_and_upload!</tt>. A rewindable
+# <tt>io</tt> with the file contents must be available at the server for
this operation.
+# 2. Ahead of the file being directly uploaded client-side to the service, via
<tt>create_before_direct_upload!</tt>.
#
# The first option doesn't require any client-side JavaScript integration, and
can be used by any other back-end
# service that deals with files. The second option is faster, since you're not
using your own server as a staging
@@ -63,14 +64,23 @@
end
end
- # Returns a saved blob instance after the +io+ has been uploaded to the
service. Note, the blob is first built,
- # then the +io+ is uploaded, then the blob is saved. This is done this way
to avoid uploading (which may take
- # time), while having an open database transaction.
+ def create_after_unfurling!(io:, filename:, content_type: nil, metadata:
nil, identify: true, record: nil) #:nodoc:
+ build_after_unfurling(io: io, filename: filename, content_type:
content_type, metadata: metadata, identify: identify).tap(&:save!)
+ end
+
+ # Creates a new blob instance and then uploads the contents of the given
<tt>io</tt> to the
+ # service. The blob instance is saved before the upload begins to avoid
clobbering another due
+ # to key collisions.
+ #
# When providing a content type, pass <tt>identify: false</tt> to bypass
automatic content type inference.
- def create_after_upload!(io:, filename:, content_type: nil, metadata: nil,
identify: true)
- build_after_upload(io: io, filename: filename, content_type:
content_type, metadata: metadata, identify: identify).tap(&:save!)
+ def create_and_upload!(io:, filename:, content_type: nil, metadata: nil,
identify: true, record: nil)
+ create_after_unfurling!(io: io, filename: filename, content_type:
content_type, metadata: metadata, identify: identify).tap do |blob|
+ blob.upload_without_unfurling(io)
+ end
end
+ alias_method :create_after_upload!, :create_and_upload!
+
# Returns a saved blob _without_ uploading a file to the service. This
blob will point to a key where there is
# no file yet. It's intended to be used together with a client-side
upload, which will first create the blob
# in order to produce the signed URL for uploading. This signed URL points
to the key generated by the blob.
@@ -165,8 +175,9 @@
# and store that in +byte_size+ on the blob record. The content type is
automatically extracted from the +io+ unless
# you specify a +content_type+ and pass +identify+ as false.
#
- # Normally, you do not have to call this method directly at all. Use the
factory class methods of +build_after_upload+
- # and +create_after_upload!+.
+ # Normally, you do not have to call this method directly at all. Use the
+create_and_upload!+ class method instead.
+ # If you do use this method directly, make sure you are using it on a
persisted Blob as otherwise another blob's
+ # data might get overwritten on the service.
def upload(io, identify: true)
unfurl io, identify: identify
upload_without_unfurling io
Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/active_storage/attached/model.rb
new/lib/active_storage/attached/model.rb
--- old/lib/active_storage/attached/model.rb 2019-08-16 19:59:07.000000000
+0200
+++ new/lib/active_storage/attached/model.rb 2019-11-05 15:37:50.000000000
+0100
@@ -95,13 +95,13 @@
def #{name}=(attachables)
if ActiveStorage.replace_on_assign_to_many
attachment_changes["#{name}"] =
- if attachables.nil? || Array(attachables).none?
+ if Array(attachables).none?
ActiveStorage::Attached::Changes::DeleteMany.new("#{name}",
self)
else
ActiveStorage::Attached::Changes::CreateMany.new("#{name}",
self, attachables)
end
else
- if !attachables.nil? || Array(attachables).any?
+ if Array(attachables).any?
attachment_changes["#{name}"] =
ActiveStorage::Attached::Changes::CreateMany.new("#{name}",
self, #{name}.blobs + attachables)
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/active_storage/gem_version.rb
new/lib/active_storage/gem_version.rb
--- old/lib/active_storage/gem_version.rb 2019-08-16 19:59:07.000000000
+0200
+++ new/lib/active_storage/gem_version.rb 2019-11-05 15:37:50.000000000
+0100
@@ -9,7 +9,7 @@
module VERSION
MAJOR = 6
MINOR = 0
- TINY = 0
+ TINY = 1
PRE = nil
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata 2019-08-16 19:59:07.000000000 +0200
+++ new/metadata 2019-11-05 15:37:50.000000000 +0100
@@ -1,14 +1,14 @@
--- !ruby/object:Gem::Specification
name: activestorage
version: !ruby/object:Gem::Version
- version: 6.0.0
+ version: 6.0.1
platform: ruby
authors:
- David Heinemeier Hansson
autorequire:
bindir: bin
cert_chain: []
-date: 2019-08-16 00:00:00.000000000 Z
+date: 2019-11-05 00:00:00.000000000 Z
dependencies:
- !ruby/object:Gem::Dependency
name: actionpack
@@ -16,42 +16,42 @@
requirements:
- - '='
- !ruby/object:Gem::Version
- version: 6.0.0
+ version: 6.0.1
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
- version: 6.0.0
+ version: 6.0.1
- !ruby/object:Gem::Dependency
name: activejob
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
- version: 6.0.0
+ version: 6.0.1
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
- version: 6.0.0
+ version: 6.0.1
- !ruby/object:Gem::Dependency
name: activerecord
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
- version: 6.0.0
+ version: 6.0.1
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
- version: 6.0.0
+ version: 6.0.1
- !ruby/object:Gem::Dependency
name: marcel
requirement: !ruby/object:Gem::Requirement
@@ -150,8 +150,11 @@
licenses:
- MIT
metadata:
- source_code_uri: https://github.com/rails/rails/tree/v6.0.0/activestorage
- changelog_uri:
https://github.com/rails/rails/blob/v6.0.0/activestorage/CHANGELOG.md
+ bug_tracker_uri: https://github.com/rails/rails/issues
+ changelog_uri:
https://github.com/rails/rails/blob/v6.0.1/activestorage/CHANGELOG.md
+ documentation_uri: https://api.rubyonrails.org/v6.0.1/
+ mailing_list_uri: https://groups.google.com/forum/#!forum/rubyonrails-talk
+ source_code_uri: https://github.com/rails/rails/tree/v6.0.1/activestorage
post_install_message:
rdoc_options: []
require_paths:
@@ -167,7 +170,7 @@
- !ruby/object:Gem::Version
version: '0'
requirements: []
-rubygems_version: 3.0.1
+rubygems_version: 3.0.3
signing_key:
specification_version: 4
summary: Local and cloud file storage framework.