JUCE icon indicating copy to clipboard operation
JUCE copied to clipboard

New feature: add-file functionality to Projucer

Open tesseiko opened this issue 1 year ago • 1 comments

Added new subcommands to Projucer command line.

Projucer --clear-maingroup jucerfile.jucer Projucer --add-file jucerfile.jucer path/to/file/or/directory/to/add/project

Feature request https://forum.juce.com/t/projucer-add-folder-file-via-command-line/50732

tesseiko avatar Feb 11 '24 14:02 tesseiko

Here is the patch, in case anybody wants to patch this feature to a previous version. Tested in 6.1.6.

=================================================================================

diff --git a/extras/Projucer/Source/Application/jucer_CommandLine.cpp b/extras/Projucer/Source/Application/jucer_CommandLine.cpp
index 3f861e891..555a80289 100644
--- a/extras/Projucer/Source/Application/jucer_CommandLine.cpp
+++ b/extras/Projucer/Source/Application/jucer_CommandLine.cpp
@@ -152,6 +152,22 @@ namespace
                 modules.tryToFixMissingDependencies (m);
         }
 
+        void clearMainGroup()
+        {
+            auto mainGroup = project->getMainGroup();
+            auto mainGrouID = mainGroup.getID();
+
+            mainGroup.removeItemFromProject();
+            Project::Item cleanMainGroup (*project, ValueTree ("MAINGROUP"), false);
+            cleanMainGroup.setID(mainGrouID);
+            project->getProjectRoot().addChild (cleanMainGroup.state, 0, nullptr);
+        }
+
+        void addFile (const File& file)
+        {
+            project->getMainGroup().addFileRetainingSortOrder (file, true);
+        }
+
         std::unique_ptr<Project> project;
     };
 
@@ -171,6 +187,39 @@ namespace
         proj.save (justSaveResources, args.containsOption ("--fix-missing-dependencies"));
     }
 
+    static void clearMainGroup (const ArgumentList& args)
+    {
+        args.checkMinNumArguments (2);
+        LoadedProject proj (args[1]);
+
+        std::cout << "Clearing MAINGROUP: "
+                  << std::endl;
+
+        proj.clearMainGroup ();
+
+        std::cout << "Re-saving file: "
+                  << proj.project->getFile().getFullPathName() << std::endl;
+
+        proj.save (true, args.containsOption ("--fix-missing-dependencies"));
+    }
+
+    static void addFile (const ArgumentList& args)
+    {
+        args.checkMinNumArguments (3);
+        LoadedProject proj (args[1]);
+        auto fileToAdd = args[2].resolveAsExistingFile();
+
+        std::cout << "Adding File: "
+                  << fileToAdd.getFileName() << std::endl;
+
+        proj.addFile (fileToAdd.getFullPathName());
+
+        std::cout << "Re-saving file: "
+                  << proj.project->getFile().getFullPathName() << std::endl;
+
+        proj.save (true, args.containsOption ("--fix-missing-dependencies"));
+    }
+
     //==============================================================================
     static void getVersion (const ArgumentList& args)
     {
@@ -830,6 +879,12 @@ namespace
                   << " " << appName << " --resave-resources project_file" << std::endl
                   << "    Resaves just the binary resources for a project." << std::endl
                   << std::endl
+                  << " " << appName << " --clear-maingroup project_file" << std::endl
+                  << "    Removes all resource file references from a project." << std::endl
+                  << std::endl
+                  << " " << appName << " --add-file project_file path_to_file_to_add" << std::endl
+                  << "    Adds an existing file or directory to a project." << std::endl
+                  << std::endl
                   << " " << appName << " --get-version project_file" << std::endl
                   << "    Returns the version number of a project." << std::endl
                   << std::endl
@@ -906,6 +961,8 @@ int performCommandLine (const ArgumentList& args)
         if (matchCommand ("help"))                     { showHelp();                            return 0; }
         if (matchCommand ("h"))                        { showHelp();                            return 0; }
         if (matchCommand ("resave"))                   { resaveProject (args, false);           return 0; }
+        if (matchCommand ("clear-maingroup"))          { clearMainGroup (args);                 return 0; }
+        if (matchCommand ("add-file"))                 { addFile (args);                        return 0; }
         if (matchCommand ("resave-resources"))         { resaveProject (args, true);            return 0; }
         if (matchCommand ("get-version"))              { getVersion (args);                     return 0; }
         if (matchCommand ("set-version"))              { setVersion (args);                     return 0; }

copy the patch and save it to a file, e.g., cli_add_file.patch Then navigate to your cheked-out version of juce framework and run git apply /path/to/cli_add_file.patch and rebuild Projucer

tesseiko avatar Feb 11 '24 14:02 tesseiko