AddFile() публичный Метод

Adds a file to the project
public AddFile ( string filename ) : ProjectFile
filename string /// Absolute path to the file. ///
Результат ProjectFile
Пример #1
0
        public async Task GetParentFileTest(string inputFile, string expectedParentFile)
        {
            string   solFile = Util.GetSampleProject("console-project", "ConsoleProject.sln");
            Solution sol     = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile);

            Project p   = (Project)sol.Items [0];
            var     dir = p.BaseDirectory;

            string inputFileDestination  = Path.Combine(dir, "FileNesting", inputFile);
            string parentFileDestination = Path.Combine(dir, "FileNesting", expectedParentFile);

            p.AddDirectory("FileNesting");
            p.AddFile(inputFileDestination);
            p.AddFile(parentFileDestination);

            string parentFile = FileNestingService.GetParentFile(p, inputFileDestination);

            Assert.That(parentFile, Is.EqualTo(parentFileDestination), $"Was expecting parent file {parentFileDestination} for {inputFileDestination} but got {parentFile}");

            // Now check we get nothing when parent file doesn't exist
            p.Files.Remove(parentFileDestination);
            parentFile = FileNestingService.GetParentFile(p, inputFileDestination);
            Assert.Null(parentFile, $"Was expecting no parent file for {inputFileDestination} but got {parentFile}");

            sol.Dispose();
        }
		public override bool AddToProject (SolutionItem parent, Project project, string language, string directory, string name)
		{
			// Replace template variables
			
			string cname = Path.GetFileNameWithoutExtension (name);
			string[,] tags = { 
				{"Name", cname},
			};
			
			string content = addinTemplate.OuterXml;
			content = StringParserService.Parse (content, tags);
			
			// Create the manifest
			
			XmlDocument doc = new XmlDocument ();
			doc.LoadXml (content);

			string file = Path.Combine (directory, "manifest.addin.xml");
			doc.Save (file);
			
			project.AddFile (file, BuildAction.EmbeddedResource);
			
			AddinData.EnableAddinAuthoringSupport ((DotNetProject)project);
			return true;
		}
Пример #3
0
		public override bool AddToProject (SolutionItem policyParent, Project project, string language, string directory, string name)
		{
			var path = FilePath.Build (directory, project.Name + "-res.zip");
			var file = new ProjectFile (path, "EmbeddedResource");
			file.ResourceId = "XobotOS.Resources";
			file.Visible = false;
			project.AddFile (file);
			return true;
		}
		public void MigrateFiles (Project source, Project target)
		{
			foreach (ProjectFile file in GetFilesToMigrate (source).ToArray ()) {

				FilePath destination = GetFileDestinationPath (file, source, target);

				Directory.CreateDirectory (destination.ParentDirectory);
				FileService.MoveFile (file.FilePath, destination);

				var movedProjectFile = new ProjectFile (destination, file.BuildAction);
				target.AddFile (movedProjectFile);

				source.Files.Remove (file);
			}
		}
		public ProjectFile AddFileToProject (SolutionItem policyParent, Project project, string language, string directory, string name)
		{
			generatedFile = SaveFile (policyParent, project, language, directory, name);
			if (generatedFile != null) {		
				string buildAction = this.buildAction ?? project.GetDefaultBuildAction (generatedFile);
				ProjectFile projectFile = project.AddFile (generatedFile, buildAction);
				
				if (!string.IsNullOrEmpty (dependsOn)) {
					Dictionary<string,string> tags = new Dictionary<string,string> ();
					ModifyTags (policyParent, project, language, name, generatedFile, ref tags);
					string parsedDepName = StringParserService.Parse (dependsOn, tags);
					if (projectFile.DependsOn != parsedDepName)
						projectFile.DependsOn = parsedDepName;
				}
				
				if (!string.IsNullOrEmpty (customTool))
					projectFile.Generator = customTool;
				
				DotNetProject netProject = project as DotNetProject;
				if (netProject != null) {
					// Add required references
					foreach (string aref in references) {
						string res = netProject.AssemblyContext.GetAssemblyFullName (aref, netProject.TargetFramework);
						res = netProject.AssemblyContext.GetAssemblyNameForVersion (res, netProject.TargetFramework);
						if (!ContainsReference (netProject, res))
							netProject.References.Add (new ProjectReference (ReferenceType.Package, aref));
					}
				}
				
				return projectFile;
			} else
				return null;
		}
Пример #6
0
        public void FileDependencies()
        {
            string   solFile = Util.GetSampleProject("file-dependencies", "ConsoleProject.sln");
            Solution sol     = (Solution)Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile);

            Project p   = (Project)sol.Items [0];
            var     dir = p.BaseDirectory;

            var file1 = p.Files.GetFile(dir.Combine("file1.xml"));
            var file2 = p.Files.GetFile(dir.Combine("file2.xml"));
            var file3 = p.Files.GetFile(dir.Combine("file3.xml"));
            var file4 = p.Files.GetFile(dir.Combine("file4.xml"));
            var file5 = p.Files.GetFile(dir.Combine("file5.xml"));

            Assert.AreEqual(file3, file1.DependsOnFile);
            Assert.AreEqual(file3, file2.DependsOnFile);

            Assert.AreEqual(2, file3.DependentChildren.Count);
            Assert.IsTrue(file3.DependentChildren.Contains(file1));
            Assert.IsTrue(file3.DependentChildren.Contains(file2));

            Assert.AreEqual(file5, file4.DependsOnFile);
            Assert.AreEqual(1, file5.DependentChildren.Count);
            Assert.IsTrue(file5.DependentChildren.Contains(file4));

            // Change a dependency

            file1.DependsOn = "";
            Assert.IsNull(file1.DependsOnFile);
            Assert.AreEqual(file3, file2.DependsOnFile);

            Assert.AreEqual(1, file3.DependentChildren.Count);
            Assert.IsTrue(file3.DependentChildren.Contains(file2));

            // Unresolved dependency

            file1.DependsOn = "foo.xml";
            Assert.IsNull(file1.DependsOnFile);

            var foo = p.AddFile(dir.Combine("foo.xml"));

            Assert.AreEqual(foo, file1.DependsOnFile);

            // Resolved dependency

            file2.DependsOn = "foo.xml";
            Assert.AreEqual(foo, file2.DependsOnFile);
            Assert.AreEqual(0, file3.DependentChildren.Count);

            // Remove a file

            p.Files.Remove(file5);
            Assert.IsNull(file4.DependsOnFile);

            // Add a file

            file5 = p.AddFile(dir.Combine("file5.xml"));
            Assert.AreEqual(file5, file4.DependsOnFile);
            Assert.AreEqual(1, file5.DependentChildren.Count);
            Assert.IsTrue(file5.DependentChildren.Contains(file4));
        }
		static IType CreateClass (Project project, Stetic.ActionGroupComponent group, string name, string namspace, string folder)
		{
			string fullName = namspace.Length > 0 ? namspace + "." + name : name;
			
			CodeRefactorer gen = new CodeRefactorer (project.ParentSolution);
			
			CodeTypeDeclaration type = new CodeTypeDeclaration ();
			type.Name = name;
			type.IsClass = true;
			type.BaseTypes.Add (new CodeTypeReference ("Gtk.ActionGroup"));
			
			// Generate the constructor. It contains the call that builds the widget.
			
			CodeConstructor ctor = new CodeConstructor ();
			ctor.Attributes = MemberAttributes.Public | MemberAttributes.Final;
			ctor.BaseConstructorArgs.Add (new CodePrimitiveExpression (fullName));
			
			CodeMethodInvokeExpression call = new CodeMethodInvokeExpression (
				new CodeMethodReferenceExpression (
					new CodeTypeReferenceExpression ("Stetic.Gui"),
					"Build"
				),
				new CodeThisReferenceExpression (),
				new CodeTypeOfExpression (fullName)
			);
			ctor.Statements.Add (call);
			type.Members.Add (ctor);
			
			// Add signal handlers
			
			foreach (Stetic.ActionComponent action in group.GetActions ()) {
				foreach (Stetic.Signal signal in action.GetSignals ()) {
					CodeMemberMethod met = new CodeMemberMethod ();
					met.Name = signal.Handler;
					met.Attributes = MemberAttributes.Family;
					met.ReturnType = new CodeTypeReference (signal.SignalDescriptor.HandlerReturnTypeName);
					
					foreach (Stetic.ParameterDescriptor pinfo in signal.SignalDescriptor.HandlerParameters)
						met.Parameters.Add (new CodeParameterDeclarationExpression (pinfo.TypeName, pinfo.Name));
						
					type.Members.Add (met);
				}
			}
			
			// Create the class
			
			IType cls = null;
			cls = gen.CreateClass (project, ((DotNetProject)project).LanguageName, folder, namspace, type);
			if (cls == null)
				throw new UserException ("Could not create class " + fullName);
			
			project.AddFile (cls.CompilationUnit.FileName, BuildAction.Compile);
			IdeApp.ProjectOperations.Save (project);
			
			// Make sure the database is up-to-date
			ProjectDomService.Parse (project, cls.CompilationUnit.FileName);
			return cls;
		}
Пример #8
0
		/// <summary>
		/// Adds files to a project, potentially asking the user whether to move, copy or link the files.
		/// </summary>
		public IList<ProjectFile> AddFilesToProject (Project project, FilePath[] files, FilePath targetDirectory,
			string buildAction)
		{
			int action = -1;
			IProgressMonitor monitor = null;
			
			if (files.Length > 10) {
				monitor = new MessageDialogProgressMonitor (true);
				monitor.BeginTask (GettextCatalog.GetString("Adding files..."), files.Length);
			}
			
			var newFileList = new List<ProjectFile> ();
			
			using (monitor) {
				foreach (FilePath file in files) {
					if (monitor != null) {
						monitor.Log.WriteLine (file);
						monitor.Step (1);
					}
					
					if (FileService.IsDirectory (file)) {
						//FIXME: warning about skipping?
						newFileList.Add (null);
						continue;
					}
					
					//files in the project directory get added directly in their current location without moving/copying
					if (file.IsChildPathOf (project.BaseDirectory)) {
						newFileList.Add (project.AddFile (file, buildAction));
						continue;
					}
					
					//for files outside the project directory, we ask the user whether to move, copy or link
					var md = new Gtk.MessageDialog (
						 IdeApp.Workbench.RootWindow,
						 Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent,
						 Gtk.MessageType.Question, Gtk.ButtonsType.None,
						 GettextCatalog.GetString ("The file {0} is outside the project directory. What would you like to do?", file));

					try {
						Gtk.CheckButton remember = null;
						if (files.Length > 1) {
							remember = new Gtk.CheckButton (GettextCatalog.GetString ("Use the same action for all selected files."));
							md.VBox.PackStart (remember, false, false, 0);
						}
						
						const int ACTION_LINK = 3;
						const int ACTION_COPY = 1;
						const int ACTION_MOVE = 2;
						
						md.AddButton (GettextCatalog.GetString ("_Link"), ACTION_LINK);
						md.AddButton (Gtk.Stock.Copy, ACTION_COPY);
						md.AddButton (GettextCatalog.GetString ("_Move"), ACTION_MOVE);
						md.AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.Cancel);
						md.VBox.ShowAll ();
						
						int ret = -1;
						if (action < 0) {
							ret = MessageService.RunCustomDialog (md);
							if (ret < 0)
								return newFileList;
							if (remember != null && remember.Active) action = ret;
						} else {
							ret = action;
						}
						
						var targetName = targetDirectory.Combine (file.FileName);
						
						if (ret == ACTION_LINK) {
							var pf = project.AddFile (file, buildAction);
							pf.Link = project.GetRelativeChildPath (targetName);
							newFileList.Add (pf);
							continue;
						}
						
						try {
							if (MoveCopyFile (file, targetName, ret == ACTION_MOVE))
								newFileList.Add (project.AddFile (targetName, buildAction));
							else
								newFileList.Add (null);
						}
						catch (Exception ex) {
							MessageService.ShowException (ex, GettextCatalog.GetString (
								"An error occurred while attempt to move/copy that file. Please check your permissions."));
							newFileList.Add (null);
						}
					} finally {
						md.Destroy ();
					}
				}
			}
			return newFileList;
		}
		/// <summary>
		/// Adds files to a project, potentially asking the user whether to move, copy or link the files.
		/// </summary>
		public IList<ProjectFile> AddFilesToProject (Project project, FilePath[] files, FilePath[] targetPaths,
			string buildAction)
		{
			Debug.Assert (project != null);
			Debug.Assert (files != null);
			Debug.Assert (targetPaths != null);
			Debug.Assert (files.Length == targetPaths.Length);
			
			int action = -1;
			IProgressMonitor monitor = null;
			
			if (files.Length > 10) {
				monitor = new MessageDialogProgressMonitor (true);
				monitor.BeginTask (GettextCatalog.GetString("Adding files..."), files.Length);
			}
			
			var newFileList = new List<ProjectFile> ();
			
			//project.AddFile (string) does linear search for duplicate file, so instead we use this HashSet and 
			//and add the ProjectFiles directly. With large project and many files, this should really help perf.
			//Also, this is a better check because we handle vpaths and links.
			//FIXME: it would be really nice if project.Files maintained these hashmaps
			var vpathsInProject = new HashSet<FilePath> (project.Files.Select (pf => pf.ProjectVirtualPath));
			var filesInProject = new HashSet<FilePath> (project.Files.Select (pf => pf.FilePath));
			
			using (monitor) {
				for (int i = 0; i < files.Length; i++) {
					FilePath file = files[i];
					
					if (monitor != null) {
						monitor.Log.WriteLine (file);
						monitor.Step (1);
					}
					
					if (FileService.IsDirectory (file)) {
						//FIXME: warning about skipping?
						newFileList.Add (null);
						continue;
					}
					
					FilePath targetPath = targetPaths[i].CanonicalPath;
					Debug.Assert (targetPath.IsChildPathOf (project.BaseDirectory));
					
					var vpath = targetPath.ToRelative (project.BaseDirectory);
					if (vpathsInProject.Contains (vpath)) {
						MessageService.ShowWarning (GettextCatalog.GetString (
							"There is a already a file or link in the project with the name '{0}'", vpath));
						continue;
					}
					
					string fileBuildAction = buildAction;
					if (string.IsNullOrEmpty (buildAction))
						fileBuildAction = project.GetDefaultBuildAction (file);
					
					//files in the target directory get added directly in their current location without moving/copying
					if (file.CanonicalPath == targetPath) {
						//FIXME: MD project system doesn't cope with duplicate includes - project save/load will remove the file
						if (filesInProject.Contains (targetPath)) {
							var link = project.Files.GetFile (targetPath).Link;
							MessageService.ShowWarning (GettextCatalog.GetString (
								"The link '{0}' in the project already includes the file '{1}'", link, file));
							continue;
						}
						var pf = new ProjectFile (file, fileBuildAction);
						project.AddFile (pf);
						vpathsInProject.Add (pf.ProjectVirtualPath);
						filesInProject.Add (pf.FilePath);
						newFileList.Add (pf);
						continue;
					}
					
					//for files outside the project directory, we ask the user whether to move, copy or link
					var md = new Gtk.MessageDialog (
						 IdeApp.Workbench.RootWindow,
						 Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent,
						 Gtk.MessageType.Question, Gtk.ButtonsType.None,
						 GettextCatalog.GetString ("The file {0} is outside the target directory. What would you like to do?", file));

					try {
						Gtk.CheckButton remember = null;
						if (files.Length > 1) {
							remember = new Gtk.CheckButton (GettextCatalog.GetString ("Use the same action for all selected files."));
							md.VBox.PackStart (remember, false, false, 0);
						}
						
						const int ACTION_LINK = 3;
						const int ACTION_COPY = 1;
						const int ACTION_MOVE = 2;
						
						md.AddButton (GettextCatalog.GetString ("_Link"), ACTION_LINK);
						md.AddButton (Gtk.Stock.Copy, ACTION_COPY);
						md.AddButton (GettextCatalog.GetString ("_Move"), ACTION_MOVE);
						md.AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.Cancel);
						md.VBox.ShowAll ();
						
						int ret = -1;
						if (action < 0) {
							ret = MessageService.RunCustomDialog (md);
							if (ret < 0)
								return newFileList;
							if (remember != null && remember.Active) action = ret;
						} else {
							ret = action;
						}
						
						if (ret == ACTION_LINK) {
							//FIXME: MD project system doesn't cope with duplicate includes - project save/load will remove the file
							if (filesInProject.Contains (file)) {
								var link = project.Files.GetFile (file).Link;
								MessageService.ShowWarning (GettextCatalog.GetString (
									"The link '{0}' in the project already includes the file '{1}'", link, file));
								continue;
							}
							
							var pf = new ProjectFile (file, fileBuildAction) {
								Link = vpath
							};
							project.AddFile (pf);
							vpathsInProject.Add (pf.ProjectVirtualPath);
							filesInProject.Add (pf.FilePath);
							newFileList.Add (pf);
							continue;
						}
						
						try {
							if (!Directory.Exists (targetPath.ParentDirectory))
								FileService.CreateDirectory (targetPath.ParentDirectory);
							
							if (MoveCopyFile (file, targetPath, ret == ACTION_MOVE)) {
								var pf = new ProjectFile (targetPath, fileBuildAction);
								project.AddFile (pf);
								vpathsInProject.Add (pf.ProjectVirtualPath);
								filesInProject.Add (pf.FilePath);
								newFileList.Add (pf);
							}
							else {
								newFileList.Add (null);
							}
						}
						catch (Exception ex) {
							MessageService.ShowException (ex, GettextCatalog.GetString (
								"An error occurred while attempt to move/copy that file. Please check your permissions."));
							newFileList.Add (null);
						}
					} finally {
						md.Destroy ();
					}
				}
			}
			return newFileList;
		}