private async Task SetupChanges()

in src/authoring/Elastic.Documentation.Refactor/Move.cs [46:102]


	private async Task SetupChanges(ChangeSet changeSet, Cancel ctx)
	{
		var sourcePath = changeSet.From.FullName;
		var targetPath = changeSet.To.FullName;

		var sourceContent = await readFileSystem.File.ReadAllTextAsync(sourcePath, ctx);

		var markdownLinkRegex = MarkdownLinkRegex();

		var change = Regex.Replace(sourceContent, markdownLinkRegex.ToString(), match =>
		{
			var originalPath = match.Value.Substring(match.Value.IndexOf('(') + 1, match.Value.LastIndexOf(')') - match.Value.IndexOf('(') - 1);

			var newPath = originalPath;
			var isAbsoluteStylePath = originalPath.StartsWith('/');
			if (!isAbsoluteStylePath)
			{
				var targetDirectory = Path.GetDirectoryName(targetPath)!;
				var sourceDirectory = Path.GetDirectoryName(sourcePath)!;
				var fullPath = Path.GetFullPath(Path.Combine(sourceDirectory, originalPath));
				var relativePath = Path.GetRelativePath(targetDirectory, fullPath);

				if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
					relativePath = relativePath.Replace('\\', '/');

				newPath = originalPath.StartsWith("./", OrdinalIgnoreCase) && !relativePath.StartsWith("./", OrdinalIgnoreCase)
					? "./" + relativePath
					: relativePath;
			}
			var newLink = $"[{match.Groups[1].Value}]({newPath})";
			var lineNumber = sourceContent[..match.Index].Count(c => c == '\n') + 1;
			var columnNumber = match.Index - sourceContent.LastIndexOf('\n', match.Index);
			if (!_linkModifications.ContainsKey(changeSet))
				_linkModifications[changeSet] = [];

			_linkModifications[changeSet].Add(new LinkModification(
				match.Value,
				newLink,
				sourcePath,
				lineNumber,
				columnNumber
			));
			return newLink;
		});

		_changes[changeSet] = [new Change(changeSet.From, sourceContent, change)];

		foreach (var (_, markdownFile) in documentationSet.MarkdownFiles)
		{
			await ProcessMarkdownFile(
				changeSet,
				markdownFile,
				ctx
			);
		}

	}