tools/builder/ABuilder.cs
author David Anderson <dvander@alliedmods.net>
Sun Aug 19 15:11:49 2007 +0000 (2007-08-19)
changeset 1356 4688fae59bcf
parent 1329 8a8789881ec3
child 1548 e759eedf6c9b
permissions -rw-r--r--
- fixed a series of corruption bugs in the admin cache (oh man, i suck sometimes)
- fixed per-group immunity being implemented completely wrong
- fixed GetAdminGroup being implemented wrong
- fixed a crash bug in the native GetAdminGroup
dvander@388
     1
using System;
dvander@388
     2
using System.IO;
dvander@388
     3
using System.Diagnostics;
dvander@388
     4
dvander@388
     5
namespace builder
dvander@388
     6
{
dvander@388
     7
	public abstract class ABuilder
dvander@388
     8
	{
dvander@388
     9
		public Config cfg;
dvander@388
    10
dvander@388
    11
		public ABuilder()
dvander@388
    12
		{
dvander@388
    13
		}
dvander@388
    14
dvander@403
    15
		public abstract string CompressPackage(Package pkg);
dvander@403
    16
dvander@388
    17
		public abstract bool BuildLibrary(Package pkg, Library lib, ref string _binName, ref string _binPath);
dvander@388
    18
dvander@852
    19
		public abstract string GetPawnCompilerName();
dvander@852
    20
dvander@852
    21
		public bool CompilePlugin(Package pkg, Plugin pl)
dvander@852
    22
		{
dvander@984
    23
			string local_dir = Config.PathFormat("{0}/{1}/addons/sourcemod/scripting", cfg.OutputBase, pkg.GetBaseFolder());
dvander@852
    24
dvander@852
    25
			string filepath = null;
dvander@852
    26
			if (pl.Folder != null)
dvander@852
    27
			{
dvander@852
    28
				filepath = Config.PathFormat("{0}/{1}", pl.Folder, pl.Source);
dvander@852
    29
			} 
dvander@852
    30
			else 
dvander@852
    31
			{
dvander@852
    32
				filepath = pl.Source;
dvander@852
    33
			}
dvander@852
    34
dvander@852
    35
			ProcessStartInfo info = new ProcessStartInfo();
dvander@852
    36
			info.WorkingDirectory = local_dir;
dvander@852
    37
			info.FileName = Config.PathFormat("{0}/{1}", local_dir, GetPawnCompilerName());
dvander@852
    38
			info.Arguments = filepath + ".sp";
dvander@852
    39
			info.UseShellExecute = false;
dvander@852
    40
			info.RedirectStandardOutput = true;
dvander@852
    41
			info.RedirectStandardError = true;
dvander@852
    42
dvander@852
    43
			Process p = Process.Start(info);
dvander@852
    44
			string output = p.StandardOutput.ReadToEnd() + "\n";
dvander@852
    45
			output += p.StandardError.ReadToEnd();
dvander@852
    46
			p.WaitForExit();
dvander@852
    47
			p.Close();
dvander@852
    48
dvander@852
    49
			Console.WriteLine(output);
dvander@852
    50
dvander@984
    51
			string binary = Config.PathFormat("{0}/{1}/addons/sourcemod/scripting/{2}.smx", cfg.OutputBase, pkg.GetBaseFolder(), pl.Source);
dvander@852
    52
			if (!File.Exists(binary))
dvander@852
    53
			{
dvander@852
    54
				return false;
dvander@852
    55
			}
dvander@1329
    56
dvander@1329
    57
			string new_loc;
dvander@1329
    58
			if (pl.disabled)
dvander@1329
    59
			{
dvander@1329
    60
				new_loc = Config.PathFormat("{0}/{1}/addons/sourcemod/plugins/disabled/{2}.smx", cfg.OutputBase, pkg.GetBaseFolder(), pl.Source);
dvander@1329
    61
			} 
dvander@1329
    62
			else 
dvander@1329
    63
			{
dvander@1329
    64
				new_loc = Config.PathFormat("{0}/{1}/addons/sourcemod/plugins/{2}.smx", cfg.OutputBase, pkg.GetBaseFolder(), pl.Source);
dvander@1329
    65
			}
dvander@852
    66
dvander@852
    67
			try
dvander@852
    68
			{
dvander@852
    69
				if (File.Exists(new_loc))
dvander@852
    70
				{
dvander@852
    71
					File.Delete(new_loc);
dvander@852
    72
				}
dvander@852
    73
				File.Move(binary, new_loc);
dvander@852
    74
			}
dvander@852
    75
			catch (System.Exception e)
dvander@852
    76
			{
dvander@852
    77
				Console.WriteLine(e.Message);
dvander@852
    78
				return false;
dvander@852
    79
			}
dvander@852
    80
dvander@852
    81
			return true;
dvander@852
    82
		}
dvander@852
    83
dvander@403
    84
		public string GetRevsionOfPath(string path)
dvander@403
    85
		{
dvander@403
    86
			ProcessStartInfo info = new ProcessStartInfo();
dvander@403
    87
dvander@403
    88
			info.WorkingDirectory = path;
dvander@403
    89
			info.FileName = cfg.SVNVersion;
ds@424
    90
			info.Arguments = "--committed \"" + path + "\"";
dvander@403
    91
			info.UseShellExecute = false;
dvander@403
    92
			info.RedirectStandardOutput = true;
dvander@403
    93
dvander@403
    94
			Process p = Process.Start(info);
dvander@403
    95
			string output = p.StandardOutput.ReadToEnd();
dvander@403
    96
			p.WaitForExit();
dvander@403
    97
			p.Close();
dvander@403
    98
dvander@403
    99
			string [] revs = output.Split(":".ToCharArray(), 2);
dvander@403
   100
			if (revs.Length < 1)
dvander@403
   101
			{
dvander@403
   102
				return null;
dvander@403
   103
			}
dvander@403
   104
dvander@403
   105
			string rev = null;
dvander@403
   106
			if (revs.Length == 1)
dvander@403
   107
			{
dvander@403
   108
				rev = revs[0];
dvander@403
   109
			} 
dvander@403
   110
			else 
dvander@403
   111
			{
dvander@403
   112
				rev = revs[1];
dvander@403
   113
			}
dvander@403
   114
dvander@403
   115
			rev = rev.Trim();
dvander@403
   116
			rev = rev.Replace("M", "");
dvander@403
   117
			rev = rev.Replace("S", "");
dvander@403
   118
dvander@403
   119
			return rev;
dvander@403
   120
		}
dvander@403
   121
dvander@403
   122
		public bool CopyFile(Package pkg, string source, string dest)
dvander@403
   123
		{
dvander@403
   124
			string from = Config.PathFormat("{0}/{1}", 
dvander@403
   125
				cfg.SourceBase,
dvander@403
   126
				source);
dvander@403
   127
			string to = Config.PathFormat("{0}/{1}/{2}",
dvander@403
   128
				cfg.OutputBase,
dvander@403
   129
				pkg.GetBaseFolder(),
dvander@403
   130
				dest);
dvander@403
   131
dvander@403
   132
			File.Copy(from, to, true);
dvander@403
   133
dvander@403
   134
			return true;
dvander@403
   135
		}
dvander@403
   136
dvander@403
   137
		/** dest can be null to mean root base folder */
dvander@388
   138
		public void CopyFolder(Package pkg, string source, string dest, string [] omits)
dvander@388
   139
		{
dvander@388
   140
			string from_base = Config.PathFormat("{0}/{1}", cfg.SourceBase, source);
dvander@403
   141
			string to_base = null;
dvander@403
   142
			
dvander@403
   143
			if (dest == null)
dvander@403
   144
			{
dvander@403
   145
				to_base = Config.PathFormat("{0}/{1}", 
dvander@403
   146
					cfg.OutputBase, 
dvander@403
   147
					pkg.GetBaseFolder());
dvander@403
   148
			} 
dvander@403
   149
			else 
dvander@403
   150
			{
dvander@403
   151
				to_base = Config.PathFormat("{0}/{1}/{2}", 
dvander@403
   152
					cfg.OutputBase, 
dvander@403
   153
					pkg.GetBaseFolder(), 
dvander@403
   154
					dest);
dvander@403
   155
			}
dvander@388
   156
dvander@388
   157
			string [] files = Directory.GetFiles(from_base);
dvander@388
   158
			string file;
dvander@388
   159
dvander@388
   160
			for (int i=0; i<files.Length; i++)
dvander@388
   161
			{
dvander@388
   162
				file = Path.GetFileName(files[i]);
dvander@388
   163
dvander@388
   164
				if (omits != null)
dvander@388
   165
				{
dvander@388
   166
					bool skip = false;
dvander@388
   167
					for (int j=0; j<omits.Length; j++)
dvander@388
   168
					{
dvander@388
   169
						if (file.CompareTo(omits[j]) == 0)
dvander@388
   170
						{
dvander@388
   171
							skip = true;
dvander@388
   172
							break;
dvander@388
   173
						}
dvander@388
   174
					}
dvander@388
   175
					if (skip)
dvander@388
   176
					{
dvander@388
   177
						continue;
dvander@388
   178
					}
dvander@388
   179
				}
dvander@388
   180
				dest = Config.PathFormat("{0}/{1}", to_base, file);
dvander@388
   181
				File.Copy(files[i], dest, true);
dvander@388
   182
			}
dvander@388
   183
		}
dvander@388
   184
dvander@403
   185
		public string PackageBuildName(Package pkg)
dvander@388
   186
		{
dvander@403
   187
			return pkg.GetPackageName() 
dvander@538
   188
				+ "-r"
dvander@538
   189
				+ GetRevsionOfPath(cfg.SourceBase)
dvander@403
   190
				+ "-"
dvander@538
   191
				+ DateTime.Now.Year
dvander@403
   192
				+ DateTime.Now.Month.ToString("00")
dvander@538
   193
				+ DateTime.Now.Day.ToString("00");
dvander@388
   194
		}
dvander@388
   195
dvander@388
   196
		public void BuildPackage(Package pkg)
dvander@388
   197
		{
dvander@388
   198
			string path = Config.PathFormat("{0}/{1}", cfg.OutputBase, pkg.GetBaseFolder());
dvander@388
   199
dvander@388
   200
			if (!Directory.Exists(path))
dvander@388
   201
			{
dvander@388
   202
				Directory.CreateDirectory(path);
dvander@388
   203
			}
dvander@388
   204
dvander@388
   205
			/* Create all dirs */
dvander@388
   206
			string [] paths = pkg.GetFolders();
dvander@388
   207
			for (int i=0; i<paths.GetLength(0); i++)
dvander@388
   208
			{
dvander@388
   209
				path = Config.PathFormat("{0}/{1}/{2}", cfg.OutputBase, pkg.GetBaseFolder(), paths[i]);
dvander@388
   210
				if (!Directory.Exists(path))
dvander@388
   211
				{
dvander@388
   212
					Directory.CreateDirectory(path);
dvander@388
   213
				}
dvander@388
   214
			}
dvander@388
   215
dvander@388
   216
			/* Do primitive copies */
dvander@388
   217
			pkg.OnCopyFolders(this);
dvander@403
   218
			pkg.OnCopyFiles(this);
dvander@388
   219
dvander@388
   220
			/* Do libraries */
dvander@388
   221
			Library [] libs = pkg.GetLibraries();
dvander@388
   222
			string bin = null, binpath = null;
dvander@388
   223
			for (int i=0; i<libs.Length; i++)
dvander@388
   224
			{
dvander@388
   225
				if (BuildLibrary(pkg, libs[i], ref bin, ref binpath))
dvander@388
   226
				{
dvander@388
   227
					path = Config.PathFormat("{0}/{1}/{2}/{3}",
dvander@388
   228
						cfg.OutputBase,
dvander@388
   229
						pkg.GetBaseFolder(),
dvander@388
   230
						libs[i].Destination,
dvander@388
   231
						bin);
dvander@388
   232
					File.Copy(binpath, path, true);
dvander@388
   233
				}
dvander@388
   234
				else 
dvander@388
   235
				{
dvander@388
   236
					throw new System.Exception("Failed to compile library: " + libs[i].Name);
dvander@388
   237
				}
dvander@388
   238
			}
dvander@403
   239
dvander@852
   240
			/* Do plugins */
dvander@852
   241
			Plugin [] plugins = pkg.GetPlugins();
dvander@852
   242
			if (plugins != null)
dvander@852
   243
			{
dvander@852
   244
				for (int i=0; i<plugins.Length; i++)
dvander@852
   245
				{
dvander@852
   246
					if (!CompilePlugin(pkg, plugins[i]))
dvander@852
   247
					{
dvander@852
   248
						throw new System.Exception("Failed to compile plugin: " + plugins[i].Source);
dvander@852
   249
					}
dvander@852
   250
				}
dvander@852
   251
			}
dvander@852
   252
dvander@403
   253
			string pkg_file = null;
dvander@806
   254
			if (cfg.Compressor != null)
dvander@403
   255
			{
dvander@806
   256
				if ((pkg_file=CompressPackage(pkg)) == null)
dvander@806
   257
				{
dvander@806
   258
					throw new System.Exception("Failed to compress package: " + pkg.GetPackageName());
dvander@806
   259
				}
dvander@806
   260
	
dvander@806
   261
				string lpath = null, ltarget = null;
dvander@806
   262
				pkg.GetCompressBases(ref lpath, ref ltarget);
dvander@806
   263
				lpath = Config.PathFormat("{0}/{1}/{2}",
dvander@806
   264
					cfg.OutputBase,
dvander@806
   265
					lpath,
dvander@806
   266
					pkg_file);
dvander@806
   267
				ltarget = Config.PathFormat("{0}/{1}", cfg.OutputBase, pkg_file);
dvander@806
   268
	
dvander@806
   269
				if (File.Exists(ltarget))
dvander@806
   270
				{
dvander@806
   271
					File.Delete(ltarget);
dvander@806
   272
				}
dvander@403
   273
dvander@806
   274
				File.Move(lpath, ltarget);
dvander@403
   275
			}
dvander@388
   276
		}
dvander@388
   277
	}
dvander@388
   278
}