You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
5.8 KiB
160 lines
5.8 KiB
8 years ago
|
//-----------------------------------------------------------------------
|
||
|
// <summary>
|
||
|
// Unity Editor tool that formats line endings to be consistent.
|
||
|
// </summary>
|
||
|
// <copyright file="LineEndingsEditMenu.cs" company="Tiaan.com">
|
||
|
// Copyright (c) 2014 Tiaan Geldenhuys
|
||
|
//
|
||
|
// Permission is hereby granted, free of charge, to any person
|
||
|
// obtaining a copy of this software and associated documentation
|
||
|
// files (the "Software"), to deal in the Software without
|
||
|
// restriction, including without limitation the rights to use,
|
||
|
// copy, modify, merge, publish, distribute, sublicense, and/or
|
||
|
// sell copies of the Software, and to permit persons to whom the
|
||
|
// Software is furnished to do so, subject to the following
|
||
|
// conditions:
|
||
|
//
|
||
|
// The above copyright notice and this permission notice shall be
|
||
|
// included in all copies or substantial portions of the Software.
|
||
|
//
|
||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||
|
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||
|
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||
|
// OTHER DEALINGS IN THE SOFTWARE.
|
||
|
// </copyright>
|
||
|
//-----------------------------------------------------------------------
|
||
|
namespace TiaanDotCom.Unity3D.EditorTools
|
||
|
{
|
||
|
using System.Collections.Generic;
|
||
|
using System.IO;
|
||
|
using System.Text.RegularExpressions;
|
||
|
using UnityEditor;
|
||
|
using UnityEngine;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Implements menu items for the Unity Editor to perform
|
||
|
/// end-of-line conversion and fix issues such as for the
|
||
|
/// following: "There are inconsistent line endings in the
|
||
|
/// 'Assets/.../*.cs' script. Some are Mac OS X (UNIX) and
|
||
|
/// some are Windows. This might lead to incorrect line
|
||
|
/// numbers in stacktraces and compiler errors."
|
||
|
/// </summary>
|
||
|
public static class LineEndingsEditMenu
|
||
|
{
|
||
|
// [MenuItem("Tools/Fungus/Utilities/EOL Conversion (Windows)")]
|
||
|
// public static void ConvertLineEndingsToWindowsFormat()
|
||
|
// {
|
||
|
// ConvertLineEndings(false);
|
||
|
// }
|
||
|
|
||
|
[MenuItem("Tools/Fungus/Utilities/Convert to Mac Line Endings")]
|
||
|
public static void ConvertLineEndingsToMacFormat()
|
||
|
{
|
||
|
ConvertLineEndings(true);
|
||
|
}
|
||
|
|
||
|
private static void ConvertLineEndings(bool isUnixFormat)
|
||
|
{
|
||
|
string title = string.Format(
|
||
|
"EOL Conversion to {0} Format",
|
||
|
(isUnixFormat ? "UNIX" : "Windows"));
|
||
|
if (!EditorUtility.DisplayDialog(
|
||
|
title,
|
||
|
"This operation may potentially modify " +
|
||
|
"many files in the current project! " +
|
||
|
"Hopefully you have backups of everything. " +
|
||
|
"Are you sure you want to proceed?",
|
||
|
"Yes",
|
||
|
"No"))
|
||
|
{
|
||
|
Debug.Log("EOL Conversion was not attempted.");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var fileTypes = new string[]
|
||
|
{
|
||
|
"*.txt",
|
||
|
"*.cs",
|
||
|
"*.js",
|
||
|
"*.boo",
|
||
|
"*.compute",
|
||
|
"*.shader",
|
||
|
"*.cginc",
|
||
|
"*.glsl",
|
||
|
"*.xml",
|
||
|
"*.xaml",
|
||
|
"*.json",
|
||
|
"*.inc",
|
||
|
"*.css",
|
||
|
"*.htm",
|
||
|
"*.html",
|
||
|
};
|
||
|
|
||
|
string projectAssetsPath = Application.dataPath;
|
||
|
int totalFileCount = 0;
|
||
|
var changedFiles = new List<string>();
|
||
|
var regex = new Regex(@"(?<!\r)\n");
|
||
|
const string LineEnd = "\r\n";
|
||
|
var comparisonType = System.StringComparison.Ordinal;
|
||
|
foreach (string fileType in fileTypes)
|
||
|
{
|
||
|
string[] filenames = Directory.GetFiles(
|
||
|
projectAssetsPath,
|
||
|
fileType,
|
||
|
SearchOption.AllDirectories);
|
||
|
totalFileCount += filenames.Length;
|
||
|
foreach (string filename in filenames)
|
||
|
{
|
||
|
string originalText = File.ReadAllText(filename);
|
||
|
string changedText;
|
||
|
changedText = regex.Replace(originalText, LineEnd);
|
||
|
if (isUnixFormat)
|
||
|
{
|
||
|
changedText =
|
||
|
changedText.Replace(LineEnd, "\n");
|
||
|
}
|
||
|
|
||
|
bool isTextIdentical = string.Equals(
|
||
|
changedText, originalText, comparisonType);
|
||
|
if (!isTextIdentical)
|
||
|
{
|
||
|
changedFiles.Add(filename);
|
||
|
File.WriteAllText(
|
||
|
filename,
|
||
|
changedText,
|
||
|
System.Text.Encoding.UTF8);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int changedFileCount = changedFiles.Count;
|
||
|
int skippedFileCount = (totalFileCount - changedFileCount);
|
||
|
string message = string.Format(
|
||
|
"EOL Conversion skipped {0} " +
|
||
|
"files and changed {1} files",
|
||
|
skippedFileCount,
|
||
|
changedFileCount);
|
||
|
if (changedFileCount <= 0)
|
||
|
{
|
||
|
message += ".";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
message += (":" + LineEnd);
|
||
|
message += string.Join(LineEnd, changedFiles.ToArray());
|
||
|
}
|
||
|
|
||
|
Debug.Log(message);
|
||
|
if (changedFileCount > 0)
|
||
|
{
|
||
|
// Recompile modified scripts.
|
||
|
AssetDatabase.Refresh();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|