Example #1
1
        protected bool GetStreamsDiff(Database db1, Database db2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool difference = false;

            IList<string> streams1List = db1.ExecuteStringQuery("SELECT `Name` FROM `_Streams`");
            IList<string> streams2List = db2.ExecuteStringQuery("SELECT `Name` FROM `_Streams`");
            string[] streams1 = new string[streams1List.Count];
            string[] streams2 = new string[streams2List.Count];
            streams1List.CopyTo(streams1, 0);
            streams2List.CopyTo(streams2, 0);

            IComparer caseInsComp = CaseInsensitiveComparer.Default;
            Array.Sort(streams1, caseInsComp);
            Array.Sort(streams2, caseInsComp);

            for (int i1 = 0, i2 = 0; i1 < streams1.Length || i2 < streams2.Length; )
            {
                int comp;
                if (i1 == streams1.Length)
                {
                    comp = 1;
                }
                else if (i2 == streams2.Length)
                {
                    comp = -1;
                }
                else
                {
                    comp = caseInsComp.Compare(streams1[i1], streams2[i2]);
                }
                if(comp < 0)
                {
                    diffOutput.WriteLine("{0}< {1}", linePrefix, streams1[i1]);
                    i1++;
                    difference = true;
                }
                else if(comp > 0)
                {
                    diffOutput.WriteLine("{0}> {1}", linePrefix, streams2[i2]);
                    i2++;
                    difference = true;
                }
                else
                {
                    if(streams1[i1] != ("" + ((char)5) + "SummaryInformation"))
                    {
                        string tempFile1 = Path.GetTempFileName();
                        string tempFile2 = Path.GetTempFileName();

                        using (View view = db1.OpenView(String.Format("SELECT `Data` FROM `_Streams` WHERE `Name` = '{0}'", streams1[i1])))
                        {
                            view.Execute();

                            using (Record rec = view.Fetch())
                            {
                                rec.GetStream(1, tempFile1);
                            }
                        }

                        using (View view = db2.OpenView(String.Format("SELECT `Data` FROM `_Streams` WHERE `Name` = '{0}'", streams2[i2])))
                        {
                            view.Execute();

                            using (Record rec = view.Fetch())
                            {
                                rec.GetStream(1, tempFile2);
                            }
                        }

                        IDiffEngine diffEngine = diffFactory.GetDiffEngine(tempFile1, tempFile2, options);
                        StringWriter sw = new StringWriter();
                        if(diffEngine.GetDiff(tempFile1, tempFile2, options, sw, linePrefix + "    ", diffFactory))
                        {
                            diffOutput.WriteLine("{0}{1}", linePrefix, streams1[i1]);
                            diffOutput.Write(sw.ToString());
                            difference = true;
                        }

                        File.Delete(tempFile1);
                        File.Delete(tempFile2);
                    }
                    i1++;
                    i2++;
                }
            }

            return difference;
        }
Example #2
0
        public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            try
            {
                bool difference = false;
                ProcessStartInfo psi = new ProcessStartInfo("diff.exe");
                psi.Arguments = String.Format("\"{0}\" \"{1}\"", diffInput1, diffInput2);
                psi.WorkingDirectory = null;
                psi.UseShellExecute = false;
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                psi.RedirectStandardOutput = true;
                Process proc = Process.Start(psi);

                string line;
                while((line = proc.StandardOutput.ReadLine()) != null)
                {
                    diffOutput.WriteLine("{0}{1}", linePrefix, line);
                    difference = true;
                }

                proc.WaitForExit();
                return difference;
            }
            catch(System.ComponentModel.Win32Exception)  // If diff.exe is not found, just compare the bytes
            {
                return new FileDiffEngine().GetDiff(diffInput1, diffInput2, options, diffOutput, linePrefix, diffFactory);
            }
        }
Example #3
0
        protected bool GetSummaryInfoDiff(Database db1, Database db2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool difference = false;

            SummaryInfo summInfo1 = db1.SummaryInfo;
            SummaryInfo summInfo2 = db2.SummaryInfo;
            if(summInfo1.Title          != summInfo2.Title         ) { diffOutput.WriteLine("{0}SummaryInformation.Title {{{1}}}->{{{2}}}", linePrefix, summInfo1.Title, summInfo2.Title); difference = true; }
            if(summInfo1.Subject        != summInfo2.Subject       ) { diffOutput.WriteLine("{0}SummaryInformation.Subject {{{1}}}->{{{2}}}", linePrefix, summInfo1.Subject, summInfo2.Subject); difference = true; }
            if(summInfo1.Author         != summInfo2.Author        ) { diffOutput.WriteLine("{0}SummaryInformation.Author {{{1}}}->{{{2}}}", linePrefix, summInfo1.Author, summInfo2.Author); difference = true; }
            if(summInfo1.Keywords       != summInfo2.Keywords      ) { diffOutput.WriteLine("{0}SummaryInformation.Keywords {{{1}}}->{{{2}}}", linePrefix, summInfo1.Keywords, summInfo2.Keywords); difference = true; }
            if(summInfo1.Comments       != summInfo2.Comments      ) { diffOutput.WriteLine("{0}SummaryInformation.Comments {{{1}}}->{{{2}}}", linePrefix, summInfo1.Comments, summInfo2.Comments); difference = true; }
            if(summInfo1.Template       != summInfo2.Template      ) { diffOutput.WriteLine("{0}SummaryInformation.Template {{{1}}}->{{{2}}}", linePrefix, summInfo1.Template, summInfo2.Template); difference = true; }
            if(summInfo1.LastSavedBy    != summInfo2.LastSavedBy   ) { diffOutput.WriteLine("{0}SummaryInformation.LastSavedBy {{{1}}}->{{{2}}}", linePrefix, summInfo1.LastSavedBy, summInfo2.LastSavedBy); difference = true; }
            if(summInfo1.RevisionNumber != summInfo2.RevisionNumber) { diffOutput.WriteLine("{0}SummaryInformation.RevisionNumber {{{1}}}->{{{2}}}", linePrefix, summInfo1.RevisionNumber, summInfo2.RevisionNumber); difference = true; }
            if(summInfo1.CreatingApp    != summInfo2.CreatingApp   ) { diffOutput.WriteLine("{0}SummaryInformation.CreatingApp {{{1}}}->{{{2}}}", linePrefix, summInfo1.CreatingApp, summInfo2.CreatingApp); difference = true; }
            if(summInfo1.LastPrintTime  != summInfo2.LastPrintTime ) { diffOutput.WriteLine("{0}SummaryInformation.LastPrintTime {{{1}}}->{{{2}}}", linePrefix, summInfo1.LastPrintTime, summInfo2.LastPrintTime); difference = true; }
            if(summInfo1.CreateTime     != summInfo2.CreateTime    ) { diffOutput.WriteLine("{0}SummaryInformation.CreateTime {{{1}}}->{{{2}}}", linePrefix, summInfo1.CreateTime, summInfo2.CreateTime); difference = true; }
            if(summInfo1.LastSaveTime   != summInfo2.LastSaveTime  ) { diffOutput.WriteLine("{0}SummaryInformation.LastSaveTime {{{1}}}->{{{2}}}", linePrefix, summInfo1.LastSaveTime, summInfo2.LastSaveTime); difference = true; }
            if(summInfo1.CodePage       != summInfo2.CodePage      ) { diffOutput.WriteLine("{0}SummaryInformation.Codepage {{{1}}}->{{{2}}}", linePrefix, summInfo1.CodePage, summInfo2.CodePage); difference = true; }
            if(summInfo1.PageCount      != summInfo2.PageCount     ) { diffOutput.WriteLine("{0}SummaryInformation.PageCount {{{1}}}->{{{2}}}", linePrefix, summInfo1.PageCount, summInfo2.PageCount); difference = true; }
            if(summInfo1.WordCount      != summInfo2.WordCount     ) { diffOutput.WriteLine("{0}SummaryInformation.WordCount {{{1}}}->{{{2}}}", linePrefix, summInfo1.WordCount, summInfo2.WordCount); difference = true; }
            if(summInfo1.CharacterCount != summInfo2.CharacterCount) { diffOutput.WriteLine("{0}SummaryInformation.CharacterCount {{{1}}}->{{{2}}}", linePrefix, summInfo1.CharacterCount, summInfo2.CharacterCount); difference = true; }
            if(summInfo1.Security       != summInfo2.Security      ) { diffOutput.WriteLine("{0}SummaryInformation.Security {{{1}}}->{{{2}}}", linePrefix, summInfo1.Security, summInfo2.Security); difference = true; }
            summInfo1.Close();
            summInfo2.Close();

            return difference;
        }
Example #4
0
		public virtual float GetDiffQuality(string diffInput1, string diffInput2, string[] options, IDiffEngineFactory diffFactory)
		{
			if(diffInput1 != null && File.Exists(diffInput1) &&
			   diffInput2 != null && File.Exists(diffInput2))
			{
				return .10f;
			}
			else
			{
				return 0;
			}
		}
		public float GetDiffQuality(string diffInput1, string diffInput2, string[] options, IDiffEngineFactory diffFactory)
		{
			if(diffInput1 != null && File.Exists(diffInput1) &&
			   diffInput2 != null && File.Exists(diffInput2) &&
			   (IsVersionedFile(diffInput1) || IsVersionedFile(diffInput2)))
			{
				return .20f;
			}
			else
			{
				return 0;
			}
		}
		public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
		{
			bool difference = false;

			string ver1 = Installer.GetFileVersion(diffInput1);
			string ver2 = Installer.GetFileVersion(diffInput2);

			if(ver1 != ver2)
			{
				diffOutput.WriteLine("{0}File version: {1} -> {2}", linePrefix, ver1, ver2);
				difference = true;
			}
			else
			{
				FileStream stream1 = new FileStream(diffInput1, FileMode.Open, FileAccess.Read, FileShare.Read);
				FileStream stream2 = new FileStream(diffInput2, FileMode.Open, FileAccess.Read, FileShare.Read);

				byte[] buf1 = new byte[512];
				byte[] buf2 = new byte[512];

				while(!difference)
				{
					int count1 = stream1.Read(buf1, 0, buf1.Length);
					int count2 = stream2.Read(buf2, 0, buf2.Length);

					for(int i = 0; i < count1; i++)
					{
						if(i == count2 || buf1[i] != buf2[i])
						{
							difference = true;
							break;
						}
					}
					if(count1 < buf1.Length) // EOF
					{
						break;
					}
				}

				stream1.Close();
				stream2.Close();

				if(difference)
				{
					diffOutput.WriteLine("{0}File versions match but bits differ.", linePrefix);
				}
			}

			return difference;
		}
Example #7
0
        public virtual bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool difference = false;
            Database db1 = new Database(diffInput1, DatabaseOpenMode.ReadOnly);
            Database db2 = new Database(diffInput2, DatabaseOpenMode.ReadOnly);

            if(GetSummaryInfoDiff(db1, db2, options, diffOutput, linePrefix, diffFactory)) difference = true;
            if(GetDatabaseDiff(db1, db2, options, diffOutput, linePrefix, diffFactory)) difference = true;
            if(GetStreamsDiff(db1, db2, options, diffOutput, linePrefix, diffFactory)) difference = true;

            db1.Close();
            db2.Close();
            return difference;
        }
Example #8
0
		public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
		{
			bool difference = false;

			FileInfo file1 = new FileInfo(diffInput1);
			FileInfo file2 = new FileInfo(diffInput2);

			if(file1.Length != file2.Length)
			{
				diffOutput.WriteLine("{0}File size: {1} -> {2}", linePrefix, file1.Length, file2.Length);
				difference = true;
			}
			else
			{
				FileStream stream1 = file1.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
				FileStream stream2 = file2.Open(FileMode.Open, FileAccess.Read, FileShare.Read);

				byte[] buf1 = new byte[512];
				byte[] buf2 = new byte[512];

				while(!difference)
				{
					int count1 = stream1.Read(buf1, 0, buf1.Length);
					int count2 = stream2.Read(buf2, 0, buf2.Length);

					for(int i = 0; i < count1; i++)
					{
						if(i == count2 || buf1[i] != buf2[i])
						{
							difference = true;
							break;
						}
					}
					if(count1 < buf1.Length) // EOF
					{
						break;
					}
				}

				stream1.Close();
				stream2.Close();

				if(difference)
				{
					diffOutput.WriteLine("{0}Files differ.", linePrefix);
				}
			}

			return difference;
		}
Example #9
0
        protected bool GetDatabaseDiff(Database db1, Database db2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool difference = false;

            string tempFile = Path.GetTempFileName();
            if(db2.GenerateTransform(db1, tempFile))
            {
                difference = true;

                Database db = db1;
                db.ViewTransform(tempFile);

                string row, column, change;
                using (View view = db.OpenView("SELECT `Table`, `Column`, `Row`, `Data`, `Current` " +
                    "FROM `_TransformView` ORDER BY `Table`, `Row`"))
                {
                    view.Execute();

                    foreach (Record rec in view) using (rec)
                    {
                        column = String.Format("{0} {1}", rec[1], rec[2]);
                        change = "";
                        if (rec.IsNull(3))
                        {
                            row = "<DDL>";
                            if (!rec.IsNull(4))
                            {
                                change = "[" + rec[5] + "]: " + DecodeColDef(rec.GetInteger(4));
                            }
                        }
                        else
                        {
                            row = "[" + String.Join(",", rec.GetString(3).Split('\t')) + "]";
                            if (rec.GetString(2) != "INSERT" && rec.GetString(2) != "DELETE")
                            {
                                column = String.Format("{0}.{1}", rec[1], rec[2]);
                                change = "{" + rec[5] + "}->{" + rec[4] + "}";
                            }
                        }

                        diffOutput.WriteLine("{0}{1,-25} {2} {3}", linePrefix, column, row, change);
                    }
                }
            }
            File.Delete(tempFile);

            return difference;
        }
Example #10
0
 public virtual float GetDiffQuality(string diffInput1, string diffInput2, string[] options, IDiffEngineFactory diffFactory)
 {
     if(diffInput1 != null && File.Exists(diffInput1) &&
        diffInput2 != null && File.Exists(diffInput2) &&
        (IsMsiDatabase(diffInput1) || IsMsiDatabase(diffInput2)))
     {
         return .70f;
     }
     else if(diffInput1 != null && File.Exists(diffInput1) &&
             diffInput2 != null && File.Exists(diffInput2) &&
             (IsMspPatch(diffInput1) || IsMspPatch(diffInput2)))
     {
         return .60f;
     }
     else
     {
         return 0;
     }
 }
Example #11
0
		public override float GetDiffQuality(string diffInput1, string diffInput2, string[] options, IDiffEngineFactory diffFactory)
		{
			if(diffInput1 != null && File.Exists(diffInput1) &&
				diffInput2 != null && File.Exists(diffInput2) &&
				GetPatchTargetOption(options) != null &&
				(IsMspPatch(diffInput1) && IsMspPatch(diffInput2)))
			{
				return .80f;
			}
			else if(diffInput1 != null && File.Exists(diffInput1) &&
				diffInput2 != null && File.Exists(diffInput2) &&
				GetPatchTargetOption(options) == null &&
				(IsMspPatch(diffInput1) && IsMsiDatabase(diffInput2)) ||
				(IsMsiDatabase(diffInput1) && IsMspPatch(diffInput2)))
			{
				return .75f;
			}
			else
			{
				return 0;
			}
		}
Example #12
0
        public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            try
            {
                bool             difference = false;
                ProcessStartInfo psi        = new ProcessStartInfo("diff.exe");
                psi.Arguments              = String.Format("\"{0}\" \"{1}\"", diffInput1, diffInput2);
                psi.WorkingDirectory       = null;
                psi.UseShellExecute        = false;
                psi.WindowStyle            = ProcessWindowStyle.Hidden;
                psi.RedirectStandardOutput = true;
                Process proc = Process.Start(psi);

                string line;
                while ((line = proc.StandardOutput.ReadLine()) != null)
                {
                    diffOutput.WriteLine("{0}{1}", linePrefix, line);
                    difference = true;
                }

                proc.WaitForExit();
                return(difference);
            }
            catch (System.ComponentModel.Win32Exception)             // If diff.exe is not found, just compare the bytes
            {
                return(new FileDiffEngine().GetDiff(diffInput1, diffInput2, options, diffOutput, linePrefix, diffFactory));
            }
        }
Example #13
0
 public float GetDiffQuality(string diffInput1, string diffInput2, string[] options, IDiffEngineFactory diffFactory)
 {
     if (diffInput1 != null && File.Exists(diffInput1) &&
         diffInput2 != null && File.Exists(diffInput2) &&
         (IsTextFile(diffInput1) && IsTextFile(diffInput2)))
     {
         return(.70f);
     }
     else
     {
         return(0);
     }
 }
Example #14
0
		public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
		{
			bool difference = false;
			IComparer caseInsComp = CaseInsensitiveComparer.Default;

			string[] files1 = Directory.GetFiles(diffInput1);
			string[] files2 = Directory.GetFiles(diffInput2);
			for(int i1 = 0; i1 < files1.Length; i1++)
			{
				files1[i1] = Path.GetFileName(files1[i1]);
			}
			for(int i2 = 0; i2 < files2.Length; i2++)
			{
				files2[i2] = Path.GetFileName(files2[i2]);
			}
			Array.Sort(files1, caseInsComp);
			Array.Sort(files2, caseInsComp);

			for(int i1 = 0, i2 = 0; i1 < files1.Length || i2 < files2.Length; )
			{
				int comp;
				if(i1 == files1.Length)
				{
					comp = 1;
				}
				else if(i2 == files2.Length)
				{
					comp = -1;
				}
				else
				{
					comp = caseInsComp.Compare(files1[i1], files2[i2]);
				}
				if(comp < 0)
				{
					diffOutput.WriteLine("{0}< {1}", linePrefix, files1[i1]);
					i1++;
					difference = true;
				}
				else if(comp > 0)
				{
					diffOutput.WriteLine("{0}> {1}", linePrefix, files2[i2]);
					i2++;
					difference = true;
				}
				else
				{
					string file1 = Path.Combine(diffInput1, files1[i1]);
					string file2 = Path.Combine(diffInput2, files2[i2]);
					IDiffEngine diffEngine = diffFactory.GetDiffEngine(file1, file2, options);
					StringWriter sw = new StringWriter();
					if(diffEngine.GetDiff(file1, file2, options, sw, linePrefix + "    ", diffFactory))
					{
						diffOutput.WriteLine("{0}{1}", linePrefix, files1[i1]);
						diffOutput.Write(sw.ToString());
						difference = true;
					}
					i1++;
					i2++;
				}
			}

			string[] dirs1 = Directory.GetDirectories(diffInput1);
			string[] dirs2 = Directory.GetDirectories(diffInput2);
			for(int i1 = 0; i1 < dirs1.Length; i1++)
			{
				dirs1[i1] = Path.GetFileName(dirs1[i1]);
			}
			for(int i2 = 0; i2 < dirs2.Length; i2++)
			{
				dirs2[i2] = Path.GetFileName(dirs2[i2]);
			}
			Array.Sort(dirs1, caseInsComp);
			Array.Sort(dirs2, caseInsComp);

			for(int i1 = 0, i2 = 0; i1 < dirs1.Length || i2 < dirs2.Length; )
			{
				int comp;
				if(i1 == dirs1.Length)
				{
					comp = 1;
				}
				else if(i2 == dirs2.Length)
				{
					comp = -1;
				}
				else
				{
					comp = caseInsComp.Compare(dirs1[i1], dirs2[i2]);
				}
				if(comp < 0)
				{
					diffOutput.WriteLine("{0}< {1}", linePrefix, dirs1[i1]);
					i1++;
					difference = true;
				}
				else if(comp > 0)
				{
					diffOutput.WriteLine("{0}> {1}", linePrefix, dirs2[i2]);
					i2++;
					difference = true;
				}
				else
				{
					string dir1 = Path.Combine(diffInput1, dirs1[i1]);
					string dir2 = Path.Combine(diffInput2, dirs2[i2]);
					IDiffEngine diffEngine = diffFactory.GetDiffEngine(dir1, dir2, options);
					StringWriter sw = new StringWriter();
					if(diffEngine.GetDiff(dir1, dir2, options, sw, linePrefix + "    ", diffFactory))
					{
						diffOutput.WriteLine("{0}{1}\\", linePrefix, dirs1[i1]);
						diffOutput.Write(sw.ToString());
						difference = true;
					}
					i1++;
					i2++;
				}
			}
			return difference;
		}
        public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool difference = false;

            FileInfo file1 = new FileInfo(diffInput1);
            FileInfo file2 = new FileInfo(diffInput2);

            if (file1.Length != file2.Length)
            {
                diffOutput.WriteLine("{0}File size: {1} -> {2}", linePrefix, file1.Length, file2.Length);
                difference = true;
            }
            else
            {
                FileStream stream1 = file1.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
                FileStream stream2 = file2.Open(FileMode.Open, FileAccess.Read, FileShare.Read);

                byte[] buf1 = new byte[512];
                byte[] buf2 = new byte[512];

                while (!difference)
                {
                    int count1 = stream1.Read(buf1, 0, buf1.Length);
                    int count2 = stream2.Read(buf2, 0, buf2.Length);

                    for (int i = 0; i < count1; i++)
                    {
                        if (i == count2 || buf1[i] != buf2[i])
                        {
                            difference = true;
                            break;
                        }
                    }
                    if (count1 < buf1.Length)                    // EOF
                    {
                        break;
                    }
                }

                stream1.Close();
                stream2.Close();

                if (difference)
                {
                    diffOutput.WriteLine("{0}Files differ.", linePrefix);
                }
            }

            return(difference);
        }
Example #16
0
        public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool      difference  = false;
            IComparer caseInsComp = CaseInsensitiveComparer.Default;

            string[] files1 = Directory.GetFiles(diffInput1);
            string[] files2 = Directory.GetFiles(diffInput2);
            for (int i1 = 0; i1 < files1.Length; i1++)
            {
                files1[i1] = Path.GetFileName(files1[i1]);
            }
            for (int i2 = 0; i2 < files2.Length; i2++)
            {
                files2[i2] = Path.GetFileName(files2[i2]);
            }
            Array.Sort(files1, caseInsComp);
            Array.Sort(files2, caseInsComp);

            for (int i1 = 0, i2 = 0; i1 < files1.Length || i2 < files2.Length;)
            {
                int comp;
                if (i1 == files1.Length)
                {
                    comp = 1;
                }
                else if (i2 == files2.Length)
                {
                    comp = -1;
                }
                else
                {
                    comp = caseInsComp.Compare(files1[i1], files2[i2]);
                }
                if (comp < 0)
                {
                    diffOutput.WriteLine("{0}< {1}", linePrefix, files1[i1]);
                    i1++;
                    difference = true;
                }
                else if (comp > 0)
                {
                    diffOutput.WriteLine("{0}> {1}", linePrefix, files2[i2]);
                    i2++;
                    difference = true;
                }
                else
                {
                    string       file1      = Path.Combine(diffInput1, files1[i1]);
                    string       file2      = Path.Combine(diffInput2, files2[i2]);
                    IDiffEngine  diffEngine = diffFactory.GetDiffEngine(file1, file2, options);
                    StringWriter sw         = new StringWriter();
                    if (diffEngine.GetDiff(file1, file2, options, sw, linePrefix + "    ", diffFactory))
                    {
                        diffOutput.WriteLine("{0}{1}", linePrefix, files1[i1]);
                        diffOutput.Write(sw.ToString());
                        difference = true;
                    }
                    i1++;
                    i2++;
                }
            }

            string[] dirs1 = Directory.GetDirectories(diffInput1);
            string[] dirs2 = Directory.GetDirectories(diffInput2);
            for (int i1 = 0; i1 < dirs1.Length; i1++)
            {
                dirs1[i1] = Path.GetFileName(dirs1[i1]);
            }
            for (int i2 = 0; i2 < dirs2.Length; i2++)
            {
                dirs2[i2] = Path.GetFileName(dirs2[i2]);
            }
            Array.Sort(dirs1, caseInsComp);
            Array.Sort(dirs2, caseInsComp);

            for (int i1 = 0, i2 = 0; i1 < dirs1.Length || i2 < dirs2.Length;)
            {
                int comp;
                if (i1 == dirs1.Length)
                {
                    comp = 1;
                }
                else if (i2 == dirs2.Length)
                {
                    comp = -1;
                }
                else
                {
                    comp = caseInsComp.Compare(dirs1[i1], dirs2[i2]);
                }
                if (comp < 0)
                {
                    diffOutput.WriteLine("{0}< {1}", linePrefix, dirs1[i1]);
                    i1++;
                    difference = true;
                }
                else if (comp > 0)
                {
                    diffOutput.WriteLine("{0}> {1}", linePrefix, dirs2[i2]);
                    i2++;
                    difference = true;
                }
                else
                {
                    string       dir1       = Path.Combine(diffInput1, dirs1[i1]);
                    string       dir2       = Path.Combine(diffInput2, dirs2[i2]);
                    IDiffEngine  diffEngine = diffFactory.GetDiffEngine(dir1, dir2, options);
                    StringWriter sw         = new StringWriter();
                    if (diffEngine.GetDiff(dir1, dir2, options, sw, linePrefix + "    ", diffFactory))
                    {
                        diffOutput.WriteLine("{0}{1}\\", linePrefix, dirs1[i1]);
                        diffOutput.Write(sw.ToString());
                        difference = true;
                    }
                    i1++;
                    i2++;
                }
            }
            return(difference);
        }
Example #17
0
 public virtual float GetDiffQuality(string diffInput1, string diffInput2, string[] options, IDiffEngineFactory diffFactory)
 {
     if (diffInput1 != null && Directory.Exists(diffInput1) &&
         diffInput2 != null && Directory.Exists(diffInput2))
     {
         return(.70f);
     }
     else
     {
         return(0);
     }
 }
Example #18
0
        public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool difference = false;

            string ver1 = Installer.GetFileVersion(diffInput1);
            string ver2 = Installer.GetFileVersion(diffInput2);

            if (ver1 != ver2)
            {
                diffOutput.WriteLine("{0}File version: {1} -> {2}", linePrefix, ver1, ver2);
                difference = true;
            }
            else
            {
                FileStream stream1 = new FileStream(diffInput1, FileMode.Open, FileAccess.Read, FileShare.Read);
                FileStream stream2 = new FileStream(diffInput2, FileMode.Open, FileAccess.Read, FileShare.Read);

                byte[] buf1 = new byte[512];
                byte[] buf2 = new byte[512];

                while (!difference)
                {
                    int count1 = stream1.Read(buf1, 0, buf1.Length);
                    int count2 = stream2.Read(buf2, 0, buf2.Length);

                    for (int i = 0; i < count1; i++)
                    {
                        if (i == count2 || buf1[i] != buf2[i])
                        {
                            difference = true;
                            break;
                        }
                    }
                    if (count1 < buf1.Length)                    // EOF
                    {
                        break;
                    }
                }

                stream1.Close();
                stream2.Close();

                if (difference)
                {
                    diffOutput.WriteLine("{0}File versions match but bits differ.", linePrefix);
                }
            }

            return(difference);
        }
        protected bool GetStreamsDiff(Database db1, Database db2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool difference = false;

            IList <string> streams1List = db1.ExecuteStringQuery("SELECT `Name` FROM `_Streams`");
            IList <string> streams2List = db2.ExecuteStringQuery("SELECT `Name` FROM `_Streams`");

            string[] streams1 = new string[streams1List.Count];
            string[] streams2 = new string[streams2List.Count];
            streams1List.CopyTo(streams1, 0);
            streams2List.CopyTo(streams2, 0);

            IComparer caseInsComp = CaseInsensitiveComparer.Default;

            Array.Sort(streams1, caseInsComp);
            Array.Sort(streams2, caseInsComp);

            for (int i1 = 0, i2 = 0; i1 < streams1.Length || i2 < streams2.Length;)
            {
                int comp;
                if (i1 == streams1.Length)
                {
                    comp = 1;
                }
                else if (i2 == streams2.Length)
                {
                    comp = -1;
                }
                else
                {
                    comp = caseInsComp.Compare(streams1[i1], streams2[i2]);
                }
                if (comp < 0)
                {
                    diffOutput.WriteLine("{0}< {1}", linePrefix, streams1[i1]);
                    i1++;
                    difference = true;
                }
                else if (comp > 0)
                {
                    diffOutput.WriteLine("{0}> {1}", linePrefix, streams2[i2]);
                    i2++;
                    difference = true;
                }
                else
                {
                    if (streams1[i1] != ("" + ((char)5) + "SummaryInformation"))
                    {
                        string tempFile1 = Path.GetTempFileName();
                        string tempFile2 = Path.GetTempFileName();

                        using (View view = db1.OpenView(String.Format("SELECT `Data` FROM `_Streams` WHERE `Name` = '{0}'", streams1[i1])))
                        {
                            view.Execute();

                            using (Record rec = view.Fetch())
                            {
                                rec.GetStream(1, tempFile1);
                            }
                        }

                        using (View view = db2.OpenView(String.Format("SELECT `Data` FROM `_Streams` WHERE `Name` = '{0}'", streams2[i2])))
                        {
                            view.Execute();

                            using (Record rec = view.Fetch())
                            {
                                rec.GetStream(1, tempFile2);
                            }
                        }

                        IDiffEngine  diffEngine = diffFactory.GetDiffEngine(tempFile1, tempFile2, options);
                        StringWriter sw         = new StringWriter();
                        if (diffEngine.GetDiff(tempFile1, tempFile2, options, sw, linePrefix + "    ", diffFactory))
                        {
                            diffOutput.WriteLine("{0}{1}", linePrefix, streams1[i1]);
                            diffOutput.Write(sw.ToString());
                            difference = true;
                        }

                        File.Delete(tempFile1);
                        File.Delete(tempFile2);
                    }
                    i1++;
                    i2++;
                }
            }

            return(difference);
        }
        protected bool GetDatabaseDiff(Database db1, Database db2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool difference = false;

            string tempFile = Path.GetTempFileName();

            if (db2.GenerateTransform(db1, tempFile))
            {
                difference = true;

                Database db = db1;
                db.ViewTransform(tempFile);

                string row, column, change;
                using (View view = db.OpenView("SELECT `Table`, `Column`, `Row`, `Data`, `Current` " +
                                               "FROM `_TransformView` ORDER BY `Table`, `Row`"))
                {
                    view.Execute();

                    foreach (Record rec in view)
                    {
                        using (rec)
                        {
                            column = String.Format("{0} {1}", rec[1], rec[2]);
                            change = "";
                            if (rec.IsNull(3))
                            {
                                row = "<DDL>";
                                if (!rec.IsNull(4))
                                {
                                    change = "[" + rec[5] + "]: " + DecodeColDef(rec.GetInteger(4));
                                }
                            }
                            else
                            {
                                row = "[" + String.Join(",", rec.GetString(3).Split('\t')) + "]";
                                if (rec.GetString(2) != "INSERT" && rec.GetString(2) != "DELETE")
                                {
                                    column = String.Format("{0}.{1}", rec[1], rec[2]);
                                    change = "{" + rec[5] + "}->{" + rec[4] + "}";
                                }
                            }

                            diffOutput.WriteLine("{0}{1,-25} {2} {3}", linePrefix, column, row, change);
                        }
                    }
                }
            }
            File.Delete(tempFile);

            return(difference);
        }
Example #21
0
 public override float GetDiffQuality(string diffInput1, string diffInput2, string[] options, IDiffEngineFactory diffFactory)
 {
     if (diffInput1 != null && File.Exists(diffInput1) &&
         diffInput2 != null && File.Exists(diffInput2) &&
         GetPatchTargetOption(options) != null &&
         (IsMspPatch(diffInput1) && IsMspPatch(diffInput2)))
     {
         return(.80f);
     }
     else if (diffInput1 != null && File.Exists(diffInput1) &&
              diffInput2 != null && File.Exists(diffInput2) &&
              GetPatchTargetOption(options) == null &&
              (IsMspPatch(diffInput1) && IsMsiDatabase(diffInput2)) ||
              (IsMsiDatabase(diffInput1) && IsMspPatch(diffInput2)))
     {
         return(.75f);
     }
     else
     {
         return(0);
     }
 }
        public virtual bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool     difference = false;
            Database db1        = new Database(diffInput1, DatabaseOpenMode.ReadOnly);
            Database db2        = new Database(diffInput2, DatabaseOpenMode.ReadOnly);

            if (GetSummaryInfoDiff(db1, db2, options, diffOutput, linePrefix, diffFactory))
            {
                difference = true;
            }
            if (GetDatabaseDiff(db1, db2, options, diffOutput, linePrefix, diffFactory))
            {
                difference = true;
            }
            if (GetStreamsDiff(db1, db2, options, diffOutput, linePrefix, diffFactory))
            {
                difference = true;
            }

            db1.Close();
            db2.Close();
            return(difference);
        }
 public virtual float GetDiffQuality(string diffInput1, string diffInput2, string[] options, IDiffEngineFactory diffFactory)
 {
     if (diffInput1 != null && File.Exists(diffInput1) &&
         diffInput2 != null && File.Exists(diffInput2) &&
         (IsMsiDatabase(diffInput1) || IsMsiDatabase(diffInput2)))
     {
         return(.70f);
     }
     else if (diffInput1 != null && File.Exists(diffInput1) &&
              diffInput2 != null && File.Exists(diffInput2) &&
              (IsMspPatch(diffInput1) || IsMspPatch(diffInput2)))
     {
         return(.60f);
     }
     else
     {
         return(0);
     }
 }
        public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool      difference  = false;
            IComparer caseInsComp = CaseInsensitiveComparer.Default;

            // TODO: Make this faster by extracting the whole cab at once.
            // TODO: Optimize for the match case by first comparing the whole cab files.

            CabInfo             cab1          = new CabInfo(diffInput1);
            CabInfo             cab2          = new CabInfo(diffInput2);
            IList <CabFileInfo> cabFilesList1 = cab1.GetFiles();
            IList <CabFileInfo> cabFilesList2 = cab2.GetFiles();

            CabFileInfo[] cabFiles1 = new CabFileInfo[cabFilesList1.Count];
            CabFileInfo[] cabFiles2 = new CabFileInfo[cabFilesList2.Count];
            cabFilesList1.CopyTo(cabFiles1, 0);
            cabFilesList2.CopyTo(cabFiles2, 0);
            string[] files1 = new string[cabFiles1.Length];
            string[] files2 = new string[cabFiles2.Length];
            for (int i1 = 0; i1 < cabFiles1.Length; i1++)
            {
                files1[i1] = cabFiles1[i1].Name;
            }
            for (int i2 = 0; i2 < cabFiles2.Length; i2++)
            {
                files2[i2] = cabFiles2[i2].Name;
            }
            Array.Sort(files1, cabFiles1, caseInsComp);
            Array.Sort(files2, cabFiles2, caseInsComp);


            for (int i1 = 0, i2 = 0; i1 < files1.Length || i2 < files2.Length;)
            {
                int comp;
                if (i1 == files1.Length)
                {
                    comp = 1;
                }
                else if (i2 == files2.Length)
                {
                    comp = -1;
                }
                else
                {
                    comp = caseInsComp.Compare(files1[i1], files2[i2]);
                }
                if (comp < 0)
                {
                    diffOutput.WriteLine("{0}< {1}", linePrefix, files1[i1]);
                    i1++;
                    difference = true;
                }
                else if (comp > 0)
                {
                    diffOutput.WriteLine("{0}> {1}", linePrefix, files2[i2]);
                    i2++;
                    difference = true;
                }
                else
                {
                    string tempFile1 = Path.GetTempFileName();
                    string tempFile2 = Path.GetTempFileName();
                    cabFiles1[i1].CopyTo(tempFile1, true);
                    cabFiles2[i2].CopyTo(tempFile2, true);
                    IDiffEngine  diffEngine = diffFactory.GetDiffEngine(tempFile1, tempFile2, options);
                    StringWriter sw         = new StringWriter();
                    if (diffEngine.GetDiff(tempFile1, tempFile2, options, sw, linePrefix + "    ", diffFactory))
                    {
                        diffOutput.WriteLine("{0}{1}", linePrefix, files1[i1]);
                        diffOutput.Write(sw.ToString());
                        difference = true;
                    }

                    File.SetAttributes(tempFile1, File.GetAttributes(tempFile1) & ~FileAttributes.ReadOnly);
                    File.SetAttributes(tempFile2, File.GetAttributes(tempFile2) & ~FileAttributes.ReadOnly);
                    try
                    {
                        File.Delete(tempFile1);
                        File.Delete(tempFile2);
                    }
                    catch (IOException)
                    {
#if DEBUG
                        Console.WriteLine("Could not delete temporary files {0} and {1}", tempFile1, tempFile2);
#endif
                    }
                    i1++;
                    i2++;
                }
            }

            return(difference);
        }
Example #25
0
		public override bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
		{
			bool difference = false;

			InstallPackage db1, db2;
			if(IsMspPatch(diffInput1))
			{
				string patchTargetDbFile = GetPatchTargetOption(options);
				if(patchTargetDbFile == null) patchTargetDbFile = diffInput2;
				string tempPatchedDbFile = Path.GetTempFileName();
				File.Copy(patchTargetDbFile, tempPatchedDbFile, true);
				File.SetAttributes(tempPatchedDbFile, File.GetAttributes(tempPatchedDbFile) & ~System.IO.FileAttributes.ReadOnly);
				db1 = new InstallPackage(tempPatchedDbFile, DatabaseOpenMode.Direct);
				db1.ApplyPatch(new PatchPackage(diffInput1), null);
				db1.Commit();
			}
			else
			{
				db1 = new InstallPackage(diffInput1, DatabaseOpenMode.ReadOnly);
			}
			if(IsMspPatch(diffInput2))
			{
				string patchTargetDbFile = GetPatchTargetOption(options);
				if(patchTargetDbFile == null) patchTargetDbFile = diffInput1;
				string tempPatchedDbFile = Path.GetTempFileName();
				File.Copy(patchTargetDbFile, tempPatchedDbFile, true);
				File.SetAttributes(tempPatchedDbFile, File.GetAttributes(tempPatchedDbFile) & ~System.IO.FileAttributes.ReadOnly);
				db2 = new InstallPackage(tempPatchedDbFile, DatabaseOpenMode.Direct);
				db2.ApplyPatch(new PatchPackage(diffInput2), null);
				db2.Commit();
			}
			else
			{
				db2 = new InstallPackage(diffInput2, DatabaseOpenMode.ReadOnly);
			}

			if(GetSummaryInfoDiff(db1, db2, options, diffOutput, linePrefix, diffFactory)) difference = true;
			if(GetDatabaseDiff(db1, db2, options, diffOutput, linePrefix, diffFactory)) difference = true;
			if(GetStreamsDiff(db1, db2, options, diffOutput, linePrefix, diffFactory)) difference = true;

			db1.Close();
			db2.Close();

			try
			{
				if(IsMspPatch(diffInput1)) File.Delete(db1.FilePath);
				if(IsMspPatch(diffInput1)) File.Delete(db2.FilePath);
			}
			catch(IOException)
			{
				#if DEBUG
				Console.WriteLine("Could not delete temporary files {0} and {1}", db1.FilePath, db2.FilePath);
				#endif
			}

			if(IsMspPatch(diffInput1) && IsMspPatch(diffInput2))
			{
				Database dbp1 = new Database(diffInput1, DatabaseOpenMode.ReadOnly);
				Database dbp2 = new Database(diffInput2, DatabaseOpenMode.ReadOnly);

				if(GetStreamsDiff(dbp1, dbp2, options, diffOutput, linePrefix, diffFactory)) difference = true;
				dbp1.Close();
				dbp2.Close();
			}

			return difference;
		}
Example #26
0
        public override bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool difference = false;

            InstallPackage db1, db2;

            if (IsMspPatch(diffInput1))
            {
                string patchTargetDbFile = GetPatchTargetOption(options);
                if (patchTargetDbFile == null)
                {
                    patchTargetDbFile = diffInput2;
                }
                string tempPatchedDbFile = Path.GetTempFileName();
                File.Copy(patchTargetDbFile, tempPatchedDbFile, true);
                File.SetAttributes(tempPatchedDbFile, File.GetAttributes(tempPatchedDbFile) & ~System.IO.FileAttributes.ReadOnly);
                db1 = new InstallPackage(tempPatchedDbFile, DatabaseOpenMode.Direct);
                db1.ApplyPatch(new PatchPackage(diffInput1), null);
                db1.Commit();
            }
            else
            {
                db1 = new InstallPackage(diffInput1, DatabaseOpenMode.ReadOnly);
            }
            if (IsMspPatch(diffInput2))
            {
                string patchTargetDbFile = GetPatchTargetOption(options);
                if (patchTargetDbFile == null)
                {
                    patchTargetDbFile = diffInput1;
                }
                string tempPatchedDbFile = Path.GetTempFileName();
                File.Copy(patchTargetDbFile, tempPatchedDbFile, true);
                File.SetAttributes(tempPatchedDbFile, File.GetAttributes(tempPatchedDbFile) & ~System.IO.FileAttributes.ReadOnly);
                db2 = new InstallPackage(tempPatchedDbFile, DatabaseOpenMode.Direct);
                db2.ApplyPatch(new PatchPackage(diffInput2), null);
                db2.Commit();
            }
            else
            {
                db2 = new InstallPackage(diffInput2, DatabaseOpenMode.ReadOnly);
            }

            if (GetSummaryInfoDiff(db1, db2, options, diffOutput, linePrefix, diffFactory))
            {
                difference = true;
            }
            if (GetDatabaseDiff(db1, db2, options, diffOutput, linePrefix, diffFactory))
            {
                difference = true;
            }
            if (GetStreamsDiff(db1, db2, options, diffOutput, linePrefix, diffFactory))
            {
                difference = true;
            }

            db1.Close();
            db2.Close();

            try
            {
                if (IsMspPatch(diffInput1))
                {
                    File.Delete(db1.FilePath);
                }
                if (IsMspPatch(diffInput1))
                {
                    File.Delete(db2.FilePath);
                }
            }
            catch (IOException)
            {
                                #if DEBUG
                Console.WriteLine("Could not delete temporary files {0} and {1}", db1.FilePath, db2.FilePath);
                                #endif
            }

            if (IsMspPatch(diffInput1) && IsMspPatch(diffInput2))
            {
                Database dbp1 = new Database(diffInput1, DatabaseOpenMode.ReadOnly);
                Database dbp2 = new Database(diffInput2, DatabaseOpenMode.ReadOnly);

                if (GetStreamsDiff(dbp1, dbp2, options, diffOutput, linePrefix, diffFactory))
                {
                    difference = true;
                }
                dbp1.Close();
                dbp2.Close();
            }

            return(difference);
        }
Example #27
0
		public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
		{
			bool difference = false;
			IComparer caseInsComp = CaseInsensitiveComparer.Default;

			// TODO: Make this faster by extracting the whole cab at once.
			// TODO: Optimize for the match case by first comparing the whole cab files.

            CabInfo cab1 = new CabInfo(diffInput1);
            CabInfo cab2 = new CabInfo(diffInput2);
			IList<CabFileInfo> cabFilesList1 = cab1.GetFiles();
            IList<CabFileInfo> cabFilesList2 = cab2.GetFiles();
            CabFileInfo[] cabFiles1 = new CabFileInfo[cabFilesList1.Count];
            CabFileInfo[] cabFiles2 = new CabFileInfo[cabFilesList2.Count];
            cabFilesList1.CopyTo(cabFiles1, 0);
            cabFilesList2.CopyTo(cabFiles2, 0);
			string[] files1 = new string[cabFiles1.Length];
			string[] files2 = new string[cabFiles2.Length];
			for(int i1 = 0; i1 < cabFiles1.Length; i1++) files1[i1] = cabFiles1[i1].Name;
			for(int i2 = 0; i2 < cabFiles2.Length; i2++) files2[i2] = cabFiles2[i2].Name;
			Array.Sort(files1, cabFiles1, caseInsComp);
			Array.Sort(files2, cabFiles2, caseInsComp);


			for(int i1 = 0, i2 = 0; i1 < files1.Length || i2 < files2.Length; )
			{
				int comp;
				if(i1 == files1.Length)
				{
					comp = 1;
				}
				else if(i2 == files2.Length)
				{
					comp = -1;
				}
				else
				{
					comp = caseInsComp.Compare(files1[i1], files2[i2]);
				}
				if(comp < 0)
				{
					diffOutput.WriteLine("{0}< {1}", linePrefix, files1[i1]);
					i1++;
					difference = true;
				}
				else if(comp > 0)
				{
					diffOutput.WriteLine("{0}> {1}", linePrefix, files2[i2]);
					i2++;
					difference = true;
				}
				else
				{
					string tempFile1 = Path.GetTempFileName();
					string tempFile2 = Path.GetTempFileName();
					cabFiles1[i1].CopyTo(tempFile1, true);
					cabFiles2[i2].CopyTo(tempFile2, true);
					IDiffEngine diffEngine = diffFactory.GetDiffEngine(tempFile1, tempFile2, options);
					StringWriter sw = new StringWriter();
					if(diffEngine.GetDiff(tempFile1, tempFile2, options, sw, linePrefix + "    ", diffFactory))
					{
						diffOutput.WriteLine("{0}{1}", linePrefix, files1[i1]);
						diffOutput.Write(sw.ToString());
						difference = true;
					}

					File.SetAttributes(tempFile1, File.GetAttributes(tempFile1) & ~FileAttributes.ReadOnly);
					File.SetAttributes(tempFile2, File.GetAttributes(tempFile2) & ~FileAttributes.ReadOnly);
					try
					{
						File.Delete(tempFile1);
						File.Delete(tempFile2);
					}
					catch(IOException)
					{
#if DEBUG
						Console.WriteLine("Could not delete temporary files {0} and {1}", tempFile1, tempFile2);
#endif
					}
					i1++;
					i2++;
				}
			}

			return difference;
		}
        protected bool GetSummaryInfoDiff(Database db1, Database db2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
        {
            bool difference = false;

            SummaryInfo summInfo1 = db1.SummaryInfo;
            SummaryInfo summInfo2 = db2.SummaryInfo;

            if (summInfo1.Title != summInfo2.Title)
            {
                diffOutput.WriteLine("{0}SummaryInformation.Title {{{1}}}->{{{2}}}", linePrefix, summInfo1.Title, summInfo2.Title); difference = true;
            }
            if (summInfo1.Subject != summInfo2.Subject)
            {
                diffOutput.WriteLine("{0}SummaryInformation.Subject {{{1}}}->{{{2}}}", linePrefix, summInfo1.Subject, summInfo2.Subject); difference = true;
            }
            if (summInfo1.Author != summInfo2.Author)
            {
                diffOutput.WriteLine("{0}SummaryInformation.Author {{{1}}}->{{{2}}}", linePrefix, summInfo1.Author, summInfo2.Author); difference = true;
            }
            if (summInfo1.Keywords != summInfo2.Keywords)
            {
                diffOutput.WriteLine("{0}SummaryInformation.Keywords {{{1}}}->{{{2}}}", linePrefix, summInfo1.Keywords, summInfo2.Keywords); difference = true;
            }
            if (summInfo1.Comments != summInfo2.Comments)
            {
                diffOutput.WriteLine("{0}SummaryInformation.Comments {{{1}}}->{{{2}}}", linePrefix, summInfo1.Comments, summInfo2.Comments); difference = true;
            }
            if (summInfo1.Template != summInfo2.Template)
            {
                diffOutput.WriteLine("{0}SummaryInformation.Template {{{1}}}->{{{2}}}", linePrefix, summInfo1.Template, summInfo2.Template); difference = true;
            }
            if (summInfo1.LastSavedBy != summInfo2.LastSavedBy)
            {
                diffOutput.WriteLine("{0}SummaryInformation.LastSavedBy {{{1}}}->{{{2}}}", linePrefix, summInfo1.LastSavedBy, summInfo2.LastSavedBy); difference = true;
            }
            if (summInfo1.RevisionNumber != summInfo2.RevisionNumber)
            {
                diffOutput.WriteLine("{0}SummaryInformation.RevisionNumber {{{1}}}->{{{2}}}", linePrefix, summInfo1.RevisionNumber, summInfo2.RevisionNumber); difference = true;
            }
            if (summInfo1.CreatingApp != summInfo2.CreatingApp)
            {
                diffOutput.WriteLine("{0}SummaryInformation.CreatingApp {{{1}}}->{{{2}}}", linePrefix, summInfo1.CreatingApp, summInfo2.CreatingApp); difference = true;
            }
            if (summInfo1.LastPrintTime != summInfo2.LastPrintTime)
            {
                diffOutput.WriteLine("{0}SummaryInformation.LastPrintTime {{{1}}}->{{{2}}}", linePrefix, summInfo1.LastPrintTime, summInfo2.LastPrintTime); difference = true;
            }
            if (summInfo1.CreateTime != summInfo2.CreateTime)
            {
                diffOutput.WriteLine("{0}SummaryInformation.CreateTime {{{1}}}->{{{2}}}", linePrefix, summInfo1.CreateTime, summInfo2.CreateTime); difference = true;
            }
            if (summInfo1.LastSaveTime != summInfo2.LastSaveTime)
            {
                diffOutput.WriteLine("{0}SummaryInformation.LastSaveTime {{{1}}}->{{{2}}}", linePrefix, summInfo1.LastSaveTime, summInfo2.LastSaveTime); difference = true;
            }
            if (summInfo1.CodePage != summInfo2.CodePage)
            {
                diffOutput.WriteLine("{0}SummaryInformation.Codepage {{{1}}}->{{{2}}}", linePrefix, summInfo1.CodePage, summInfo2.CodePage); difference = true;
            }
            if (summInfo1.PageCount != summInfo2.PageCount)
            {
                diffOutput.WriteLine("{0}SummaryInformation.PageCount {{{1}}}->{{{2}}}", linePrefix, summInfo1.PageCount, summInfo2.PageCount); difference = true;
            }
            if (summInfo1.WordCount != summInfo2.WordCount)
            {
                diffOutput.WriteLine("{0}SummaryInformation.WordCount {{{1}}}->{{{2}}}", linePrefix, summInfo1.WordCount, summInfo2.WordCount); difference = true;
            }
            if (summInfo1.CharacterCount != summInfo2.CharacterCount)
            {
                diffOutput.WriteLine("{0}SummaryInformation.CharacterCount {{{1}}}->{{{2}}}", linePrefix, summInfo1.CharacterCount, summInfo2.CharacterCount); difference = true;
            }
            if (summInfo1.Security != summInfo2.Security)
            {
                diffOutput.WriteLine("{0}SummaryInformation.Security {{{1}}}->{{{2}}}", linePrefix, summInfo1.Security, summInfo2.Security); difference = true;
            }
            summInfo1.Close();
            summInfo2.Close();

            return(difference);
        }