예제 #1
0
        /// <summary>
        /// Try to get the meta comment text of a script
        /// </summary>
        /// <param name="engine"></param>
        /// <param name="text">text of the entire package</param>
        /// <param name="commentStartRegexPattern">a regex pattern for comment start</param>
        /// <param name="commentEndRegexPattern">a regex pattern for comment end</param>
        /// <param name="metaText">output meta text if valid</param>
        /// <param name="requiredVersion">output version requirement if valid</param>
        /// <param name="packref">optional pack reference for logging to know which pack we're talking about.</param>
        /// <returns>True if the meta comment was found successfully</returns>
        public static bool TryGetScriptMultilineMetaComment(
            this IScriptEngine engine,
            string text,
            string commentStartRegexPattern,
            string commentEndRegexPattern,
            out string metaText,
            out VersionRequirement requiredVersion,
            CompletePackageReference packref = null)
        {
            metaText        = "";
            requiredVersion = new VersionRequirement();

            var matches = text.MatchGroup(
                $@"{commentStartRegexPattern}\s+uppm\s+(?<uppmversion>[\d\.]+)\s+(?<packmeta>\{{.*\}})\s+{commentEndRegexPattern}",
                RegexOptions.CultureInvariant |
                RegexOptions.IgnoreCase |
                RegexOptions.Singleline);

            if (matches == null ||
                matches.Count == 0 ||
                matches["uppmversion"]?.Length <= 0 ||
                matches["packmeta"]?.Length <= 0
                )
            {
                engine.Log.Error("{PackRef} doesn't contain valid metadata.", packref?.ToString() ?? "Script");
                return(false);
            }

            if (UppmVersion.TryParse(matches["uppmversion"].Value, out var minuppmversion, UppmVersion.Inference.Zero))
            {
                requiredVersion.MinimalVersion = minuppmversion;
                requiredVersion.Valid          = minuppmversion <= Uppm.CoreVersion;
                metaText = matches["packmeta"].Value;
                if (!requiredVersion.Valid)
                {
                    Log.Error(
                        "{PackRef} requires at least uppm {$RequiredMinVersion}. " +
                        "It's incompatible with Current version of uppm ({$UppmVersion})",
                        packref?.ToString() ?? "Script",
                        requiredVersion.MinimalVersion,
                        Uppm.CoreVersion);
                    return(false);
                }
                return(true);
            }
            Log.Error("{PackRef} doesn't contain valid metadata.", packref?.ToString() ?? "Script");
            return(false);
        }