Exemplo n.º 1
0
    static public void ComputeDependencies(IEnumerable <string> assemblies, MonoTouchResolver resolver)
    {
        // note: Parallel.ForEach (with lock to add on 'digests') turns out (much) slower
        // (linksdk.app with 20 assemblies)
        // likely because it's faster (using commoncrypto) than it seems
        foreach (string a in assemblies)
        {
            string key = Path.GetFileNameWithoutExtension(a);
            using (Stream fs = File.OpenRead(a)) {
                string digest = ComputeDigest(fs, 140);
                digests.Add(key, digest);
            }
        }

        Dictionary <string, HashSet <string> > dependencies = new Dictionary <string, HashSet <string> > ();

        foreach (string a in assemblies)
        {
            HashSet <string>   references;
            AssemblyDefinition ad = resolver.Load(a);
            foreach (AssemblyNameReference ar in ad.MainModule.AssemblyReferences)
            {
                if (!dependencies.TryGetValue(ar.Name, out references))
                {
                    references = new HashSet <string> ();
                    dependencies.Add(ar.Name, references);
                }
                references.Add(ad.Name.Name);
            }
        }
#if DEBUG
        foreach (var kvp in dependencies)
        {
            Console.WriteLine("The following assemblies depends on {0}", kvp.Key);
            foreach (var s in kvp.Value)
            {
                Console.WriteLine("\t{0}", s);
            }
        }
#endif
        // if a dependency has changed everything that depends on it must be cleaned
        foreach (var kvp in dependencies)
        {
            string cname = kvp.Key + ".*.cache." + GetDigestForAssembly(kvp.Key) + ".o";
            var    files = Directory.GetFiles(Location, cname);
            if (files.Length != 0)
            {
                continue;
            }

            Clean(kvp.Key + "*");
            foreach (var deps in kvp.Value)
            {
                Clean(deps + "*");
            }
        }
    }
Exemplo n.º 2
0
	static public void ComputeDependencies (IEnumerable<string> assemblies, MonoTouchResolver resolver)
	{
		// note: Parallel.ForEach (with lock to add on 'digests') turns out (much) slower
		// (linksdk.app with 20 assemblies)
		// likely because it's faster (using commoncrypto) than it seems
		foreach (string a in assemblies) {
			string key = Path.GetFileNameWithoutExtension (a);
			using (Stream fs = File.OpenRead (a)) {
				string digest = ComputeDigest (fs, 140);
				digests.Add (key, digest);
			}
		}
		
		Dictionary<string, HashSet<string>> dependencies = new Dictionary<string, HashSet<string>> ();
		foreach (string a in assemblies) {
			HashSet<string> references;
			AssemblyDefinition ad = resolver.Load (a);
			foreach (AssemblyNameReference ar in ad.MainModule.AssemblyReferences) {
				if (!dependencies.TryGetValue (ar.Name, out references)) {
					references = new HashSet<string> ();
					dependencies.Add (ar.Name, references);
				}
				references.Add (ad.Name.Name);
			}
		}
#if DEBUG
		foreach (var kvp in dependencies) {
			Console.WriteLine ("The following assemblies depends on {0}", kvp.Key);
			foreach (var s in kvp.Value)
				Console.WriteLine ("\t{0}", s);
		}
#endif
		// if a dependency has changed everything that depends on it must be cleaned
		foreach (var kvp in dependencies) {
			string cname = kvp.Key + ".*.cache." + GetDigestForAssembly (kvp.Key) + ".o";
			var files = Directory.GetFiles (Location, cname);
			if (files.Length != 0)
				continue;

			Clean (kvp.Key + "*");
			foreach (var deps in kvp.Value)
				Clean (deps + "*");
		}
	}