private async Task MoveAndRewriteLinks()

in src/authoring/Elastic.Documentation.Refactor/Move.cs [104:163]


	private async Task<int> MoveAndRewriteLinks(bool isDryRun, Cancel ctx)
	{
		foreach (var (changeSet, linkModifications) in _linkModifications)
		{
			foreach (var (oldLink, newLink, sourceFile, lineNumber, columnNumber) in linkModifications)
			{
				_logger.LogInformation(
					"Change \e[31m{OldLink}\e[0m to \e[32m{NewLink}\e[0m at \e[34m{SourceFile}:{LineNumber}:{Column}\e[0m",
					oldLink,
					newLink,
					sourceFile == changeSet.From.FullName && !isDryRun ? changeSet.To.FullName : sourceFile,
					lineNumber,
					columnNumber
				);
			}
		}

		if (isDryRun)
			return 0;

		try
		{
			foreach (var (changeSet, changes) in _changes)
			{
				foreach (var (filePath, _, newContent) in changes)
				{
					if (!filePath.Directory!.Exists)
						_ = writeFileSystem.Directory.CreateDirectory(filePath.Directory.FullName);
					await writeFileSystem.File.WriteAllTextAsync(filePath.FullName, newContent, ctx);

				}

				var targetDirectory = Path.GetDirectoryName(changeSet.To.FullName);
				_ = readFileSystem.Directory.CreateDirectory(targetDirectory!);
				readFileSystem.File.Move(changeSet.From.FullName, changeSet.To.FullName);
			}
		}
		catch (Exception)
		{
			if (_changes.Count > 1)
			{
				_logger.LogError("An error occurred while moving files. Can only revert a single file move at this time");
				throw;
			}

			foreach (var (changeSet, changes) in _changes)
			{
				foreach (var (filePath, originalContent, _) in changes)
					await writeFileSystem.File.WriteAllTextAsync(filePath.FullName, originalContent, ctx);
				if (!changeSet.To.Exists)
					writeFileSystem.File.Move(changeSet.To.FullName, changeSet.From.FullName);
				else
					writeFileSystem.File.Copy(changeSet.To.FullName, changeSet.From.FullName, overwrite: true);
				_logger.LogError("An error occurred while moving files. Reverting changes");
			}
			throw;
		}

		return 0;
	}