11class SyncExtensionContentsAtVersionsWorker < ApplicationWorker
2+ include MarkdownHelper
23
34 def logger
45 if Rails . env . production?
@@ -13,7 +14,7 @@ def perform(extension_id, tags, compatible_platforms = [], release_infos_by_tag
1314 @extension = Extension . find_by ( id : extension_id )
1415 raise RuntimeError . new ( "#{ I18n . t ( 'nouns.extension' ) } ID: #{ extension_id . inspect } not found." ) unless @extension
1516
16- puts "PERFORMING #{ @extension . name } : #{ tags . join ( ', ' ) } "
17+ # puts "PERFORMING #{@extension.name}: #{tags.join(', ')}"
1718 logger . info ( "PERFORMING: #{ @extension . inspect } , #{ tags . inspect } , #{ compatible_platforms . inspect } " )
1819
1920 @errored_tags = [ ]
@@ -49,6 +50,7 @@ def sync_extension_version(release_info)
4950 set_commit_count ( version )
5051 scan_files ( version )
5152 sync_release_info ( version , release_info )
53+ check_for_overrides ( version )
5254 PersistAssets . call ( version : version )
5355 update_annotations ( version )
5456 version . save
@@ -65,14 +67,14 @@ def semver?
6567
6668 begin
6769 tag = SemverNormalizer . call ( @tag )
68- puts "Normalized Tag: #{ tag } "
70+ # puts "Normalized Tag: #{tag}"
6971 Semverse ::Version . new ( tag )
7072 return true
7173 rescue Semverse ::InvalidVersionFormat => error
7274 unless @errored_tags . include? ( @tag )
7375 @errored_tags << @tag
7476 compilation_error = [ @extension . compilation_error , error . message ]
75- @extension . update_column ( :compilation_error , compilation_error . reject ( & :empty? ) . join ( '; ' ) )
77+ @extension . update_column ( :compilation_error , compilation_error . compact . join ( '; ' ) )
7678 message = "#{ @extension . lowercase_name } release is invalid: #{ error . message } "
7779 logger . info message
7880 end
@@ -100,6 +102,72 @@ def fetch_readme
100102 end
101103 end
102104
105+ def check_for_overrides ( version )
106+ return if version . blank? || version . config [ "overrides" ] . nil?
107+ overrides = version . config [ "overrides" ] [ 0 ]
108+ if overrides [ "readme_url" ] . present?
109+ override_readme ( version , overrides [ "readme_url" ] )
110+ end
111+ end
112+
113+ def override_readme ( version , readme_url )
114+
115+ message = [ ]
116+
117+ begin
118+ url = URI . parse ( readme_url )
119+ rescue URI ::Error => error
120+ logger . info "URI error: #{ readme_url } - #{ error . message } "
121+ return
122+ end
123+
124+ readme_ext = File . extname ( url . path ) . gsub ( "." , "" )
125+ unless ExtensionVersion ::MARKDOWN_EXTENSIONS . include? ( readme_ext )
126+ message << "#{ version . version } override readme_url is not a valid markdown file."
127+ end
128+
129+ # get file contents
130+ begin
131+ file = url . open
132+ rescue OpenURI ::HTTPError => error
133+ status = error . io . status
134+ message << "#{ version . version } #{ url . path } file read error: #{ status [ 0 ] } - #{ status [ 1 ] } "
135+ logger . info message . compact . join ( '; ' )
136+ compilation_error = [ version . compilation_error ] + message
137+ version . update_column ( :compilation_error , compilation_error . compact . join ( '; ' ) )
138+ return
139+ end
140+
141+ readme = file . read
142+
143+ if readme . include? ( '!DOCTYPE html' )
144+ message << "#{ version . version } override readme is not valid markdown."
145+ end
146+
147+ begin
148+ filter = HTML ::Pipeline . new [
149+ HTML ::Pipeline ::MarkdownFilter ,
150+ ] , { gfm : true }
151+ filter . call ( readme )
152+ rescue
153+ message << "#{ version . version } override readme is not valid markdown."
154+ end
155+
156+ if message . present?
157+ compilation_error = [ version . compilation_error ] + message
158+ version . update_column ( :compilation_error , compilation_error . compact . join ( '; ' ) )
159+ else
160+
161+ readme = readme . encode ( Encoding . find ( 'UTF-8' ) , { invalid : :replace , undef : :replace , replace : '' } )
162+
163+ version . update (
164+ readme : readme ,
165+ readme_extension : readme_ext
166+ )
167+ logger . info "OVERRIDE README: #{ url . path } "
168+ end
169+ end
170+
103171 def extract_readme_file_extension ( filename )
104172 if match = filename . match ( /\. [a-zA-Z0-9]+$/ )
105173 match [ 0 ] . gsub ( "." , "" )
0 commit comments