2424
2525REQUIRED_METADATA_FIELDS = ("name" , "desc" , "version" , "author" )
2626DEFAULT_CLONE_TIMEOUT = 120
27+ CONFLICT_MARKERS = ("<<<<<<<" , "=======" , ">>>>>>>" )
28+
29+
30+ class MetadataLoadError (ValueError ):
31+ pass
2732
2833
2934def build_result (
@@ -104,8 +109,17 @@ def _parse_simple_yaml(path: Path) -> dict:
104109
105110
106111def load_metadata (path : Path ) -> dict :
112+ text = path .read_text (encoding = "utf-8" )
113+ if any (marker in text for marker in CONFLICT_MARKERS ):
114+ raise MetadataLoadError (
115+ "could not find expected ':' (merge conflict markers found in metadata.yaml)"
116+ )
117+
107118 if yaml is not None :
108- loaded = yaml .safe_load (path .read_text (encoding = "utf-8" ))
119+ try :
120+ loaded = yaml .safe_load (text )
121+ except yaml .YAMLError as exc :
122+ raise MetadataLoadError (str (exc )) from exc
109123 if isinstance (loaded , dict ):
110124 return loaded
111125 return {}
@@ -121,7 +135,16 @@ def precheck_plugin_directory(plugin_dir: Path) -> dict:
121135 "message" : "missing metadata.yaml" ,
122136 }
123137
124- metadata = load_metadata (metadata_path )
138+ try :
139+ metadata = load_metadata (metadata_path )
140+ except MetadataLoadError as exc :
141+ return {
142+ "ok" : False ,
143+ "stage" : "metadata" ,
144+ "message" : "invalid metadata.yaml" ,
145+ "details" : str (exc ),
146+ }
147+
125148 missing = [
126149 field
127150 for field in REQUIRED_METADATA_FIELDS
@@ -367,6 +390,7 @@ def validate_plugin(
367390 ok = False ,
368391 stage = precheck ["stage" ],
369392 message = precheck ["message" ],
393+ details = precheck .get ("details" ),
370394 )
371395
372396 plugin_dir_name = precheck ["plugin_dir_name" ]
0 commit comments