From f467e9d0cc792211f80712cee11c7e0b48ad0355 Mon Sep 17 00:00:00 2001 From: Graham Nelson Date: Wed, 2 Aug 2023 15:08:37 +0100 Subject: [PATCH] Added uninstaller to inbuild --- README.md | 2 +- build.txt | 4 +- docs/inbuild/1-mn.html | 93 +++-- docs/inbuild/M-rc.html | 1 + docs/supervisor-module/1-ic.html | 2 +- docs/supervisor-module/2-cps.html | 4 +- docs/supervisor-module/2-edt.html | 2 +- docs/supervisor-module/2-nst.html | 4 +- docs/supervisor-module/2-wrk.html | 4 +- docs/supervisor-module/3-bm.html | 4 +- docs/supervisor-module/3-bs2.html | 2 +- docs/supervisor-module/4-ebm.html | 2 +- docs/supervisor-module/4-em.html | 18 +- docs/supervisor-module/4-pm.html | 16 +- docs/supervisor-module/5-ps2.html | 4 +- docs/supervisor-module/7-eip.html | 27 +- docs/supervisor-module/7-ti.html | 328 ++++++++++++++++-- docs/supervisor-module/7-tm.html | 4 +- docs/supervisor-module/index.html | 2 +- inbuild/Chapter 1/Main.w | 13 +- inbuild/Figures/help.txt | 1 + .../Chapter 7/Extensions Index Page.w | 29 +- .../Chapter 7/The Installer.w | 262 +++++++++++++- inform7/Figures/memory-diagnostics.txt | 6 +- inform7/Figures/timings-diagnostics.txt | 18 +- .../Inter/Architecture16Kit/kit_metadata.json | 2 +- .../Inter/Architecture32Kit/kit_metadata.json | 2 +- .../Inter/BasicInformKit/kit_metadata.json | 2 +- .../Inter/CommandParserKit/kit_metadata.json | 2 +- .../EnglishLanguageKit/kit_metadata.json | 2 +- .../Inter/WorldModelKit/kit_metadata.json | 2 +- 31 files changed, 725 insertions(+), 139 deletions(-) diff --git a/README.md b/README.md index 2b3bcf34f..edc4c737b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Inform 7 -[Version](notes/versioning.md): 10.2.0-beta+6W94 'Krypton' (31 July 2023) +[Version](notes/versioning.md): 10.2.0-beta+6W95 'Krypton' (2 August 2023) ## About Inform diff --git a/build.txt b/build.txt index 54a575ba4..133aca340 100644 --- a/build.txt +++ b/build.txt @@ -1,3 +1,3 @@ Prerelease: beta -Build Date: 31 July 2023 -Build Number: 6W94 +Build Date: 2 August 2023 +Build Number: 6W95 diff --git a/docs/inbuild/1-mn.html b/docs/inbuild/1-mn.html index 71dca886a..19f758f09 100644 --- a/docs/inbuild/1-mn.html +++ b/docs/inbuild/1-mn.html @@ -59,7 +59,7 @@ function togglePopup(material_id) {

A command-line interface for Inbuild functions which are not part of the normal operation of the Inform compiler.

-
+

§1. Settings variables. The following will be set at the command line.

@@ -78,7 +78,7 @@ function togglePopup(material_id) { text_stream *filter_text = NULL; pathname *preprocess_HTML_destination = NULL; text_stream *preprocess_HTML_app = NULL; -inbuild_copy *to_install = NULL; +inbuild_copy *to_install = NULL, *to_uninstall = NULL; filename *documentation_source = NULL; pathname *documentation_dest = NULL; @@ -96,13 +96,14 @@ on; then to carry out that work, and then shut down again.
 int main(int argc, char **argv) {
     Start up the modules2.1;
-    Read the command line2.10;
+    Read the command line2.11;
     CommandLine::play_back_log();
     Complete the list of targets2.2;
     if (to_install) Perform an extension installation2.3
-    else if (documentation_source) Document from a file2.4
-    else Act on the targets2.5;
-    Shut down the modules2.6;
+    else if (to_uninstall) Perform an extension uninstallation2.4
+    else if (documentation_source) Document from a file2.5
+    else Act on the targets2.6;
+    Shut down the modules2.7;
     if (Errors::have_occurred()) return 1;
     return 0;
 }
@@ -147,7 +148,7 @@ error in this case.
 

-    linked_list *L = Main::list_of_targets();
+    linked_list *L = Main::list_of_targets();
     inbuild_copy *D = NULL, *C; int others_exist = FALSE;
     LOOP_OVER_LINKED_LIST(C, inbuild_copy, L)
         if ((C->edition->work->genre == project_bundle_genre) ||
@@ -167,10 +168,10 @@ error in this case.
         Supervisor::add_nest(
             Supervisor::default_internal_path(), INTERNAL_NEST_TAG);
     }
-    Supervisor::optioneering_complete(D, FALSE, &Main::load_preform);
+    Supervisor::optioneering_complete(D, FALSE, &Main::load_preform);
     inform_project *proj;
     LOOP_OVER(proj, inform_project)
-        Main::add_target(proj->as_copy);
+        Main::add_target(proj->as_copy);
     int count = 0;
     LOOP_OVER_LINKED_LIST(C, inbuild_copy, L)
         if ((C->edition->work->genre == project_bundle_genre) ||
@@ -178,7 +179,7 @@ error in this case.
             count++;
     if ((count > 1) && (inbuild_task != INSPECT_TTASK))
         Errors::with_text("can only work on one project bundle at a time", NULL);
-    if (Str::len(filter_text) > 0) Main::add_search_results_as_targets(filter_text);
+    if (Str::len(filter_text) > 0) Main::add_search_results_as_targets(filter_text);
 

§2.3. Perform an extension installation2.3 = @@ -186,10 +187,22 @@ error in this case.

     Supervisor::go_operational();
-    ExtensionInstaller::install(to_install, confirmed, path_to_inbuild);
+    int use = SHELL_METHODOLOGY;
+    if (dry_run_mode) use = DRY_RUN_METHODOLOGY;
+    ExtensionInstaller::install(to_install, confirmed, path_to_inbuild, use);
 
-

§2.4. Document from a file2.4 = +

§2.4. Perform an extension uninstallation2.4 = +

+ +
+    Supervisor::go_operational();
+    int use = SHELL_METHODOLOGY;
+    if (dry_run_mode) use = DRY_RUN_METHODOLOGY;
+    ExtensionInstaller::uninstall(to_uninstall, confirmed, path_to_inbuild, use);
+
+ +

§2.5. Document from a file2.5 =

@@ -200,11 +213,11 @@ error in this case.
     if (cd) DocumentationRenderer::as_HTML(documentation_dest, cd, NULL);
 
-

§2.5. We make the function call Supervisor::go_operational to signal to inbuild +

§2.6. We make the function call Supervisor::go_operational to signal to inbuild that we want to start work now.

-

Act on the targets2.5 = +

Act on the targets2.6 =

@@ -217,10 +230,10 @@ that we want to start work now.
     if (build_trace_mode) IncrementalBuild::enable_trace();
     JSON_value *obj = NULL;
     if (JSON_file_format) obj = JSON::new_object();
-    linked_list *L = Main::list_of_targets();
+    linked_list *L = Main::list_of_targets();
     inbuild_copy *C;
     LOOP_OVER_LINKED_LIST(C, inbuild_copy, L)
-        Carry out the required task on the copy C2.5.2;
+        Carry out the required task on the copy C2.6.2;
     if (obj) {
         Main::validate_JSON(obj);
         if (JSON_file_to_output) {
@@ -236,7 +249,7 @@ that we want to start work now.
     }
 
-

§2.5.1. The list of possible tasks is as follows; they basically all correspond to +

§2.6.1. The list of possible tasks is as follows; they basically all correspond to utility functions in the supervisor module, which we call.

@@ -257,7 +270,7 @@ utility functions in the enum DOCUMENT_TTASK enum MODERNISE_TTASK
-

§2.5.2. Carry out the required task on the copy C2.5.2 = +

§2.6.2. Carry out the required task on the copy C2.6.2 =

@@ -298,8 +311,8 @@ utility functions in the         case MODERNISE_TTASK: Copies::modernise(OUT, C); break;
     }
 
- -

§2.6. Shut down the modules2.6 = +

+

§2.7. Shut down the modules2.7 =

@@ -311,7 +324,7 @@ utility functions in the     Foundation::end();  must be ended last
 
-

§2.7. Preform is the crowning jewel of the words module, and parses excerpts of +

§2.8. Preform is the crowning jewel of the words module, and parses excerpts of natural-language text against a "grammar". The inform7 executable makes very heavy-duty use of Preform, and we can use that too provided we have access to the English Preform syntax file stored inside the core Inform distribution, @@ -338,7 +351,7 @@ following is run, Preform is ready for use. } } -

§2.8. Target list. This where we keep the list of targets, in which no copy occurs more than +

§2.9. Target list. This where we keep the list of targets, in which no copy occurs more than once. The following code runs quadratically in the number of targets, but for Inbuild this number is never likely to be more than about 100 at a time.

@@ -346,7 +359,7 @@ Inbuild this number is never likely to be more than about 100 at a time.
 linked_list *targets = NULL;  of inbuild_copy
 
-void Main::add_target(inbuild_copy *to_add) {
+void Main::add_target(inbuild_copy *to_add) {
     if (targets == NULL) targets = NEW_LINKED_LIST(inbuild_copy);
     int found = FALSE;
     inbuild_copy *C;
@@ -356,7 +369,7 @@ Inbuild this number is never likely to be more than about 100 at a time.
     if (found == FALSE) ADD_TO_LINKED_LIST(to_add, inbuild_copy, targets);
 }
 
-

§2.9. The following sorts the list of targets before returning it. This is partly +

§2.10. The following sorts the list of targets before returning it. This is partly to improve the quality of the output of -inspect, but also to make the behaviour of inbuild more predictable across platforms — the raw target list tends to be in order of discovery of the copies, which in turn depends on @@ -364,7 +377,7 @@ the order in which filenames are read from a directory listing.

-linked_list *Main::list_of_targets(void) {
+linked_list *Main::list_of_targets(void) {
     if (targets == NULL) targets = NEW_LINKED_LIST(inbuild_copy);
     int no_entries = LinkedLists::len(targets);
     if (no_entries == 0) return targets;
@@ -392,7 +405,7 @@ the order in which filenames are read from a directory listing.
         Nests::search_for(req, Supervisor::shared_nest_list(), L);
         inbuild_search_result *R;
         LOOP_OVER_LINKED_LIST(R, inbuild_search_result, L)
-            Main::add_target(R->copy);
+            Main::add_target(R->copy);
     }
     DISCARD_TEXT(errors)
 }
@@ -403,7 +416,7 @@ the order in which filenames are read from a directory listing.
     LOOP_OVER_LINKED_LIST(entry, text_stream, L) {
         TEMPORARY_TEXT(FILENAME)
         WRITE_TO(FILENAME, "%p%c%S", P, FOLDER_SEPARATOR, entry);
-        Main::add_file_or_path_as_target(FILENAME, FALSE);
+        Main::add_file_or_path_as_target(FILENAME, FALSE);
         DISCARD_TEXT(FILENAME)
     }
 }
@@ -439,9 +452,9 @@ the order in which filenames are read from a directory listing.
 
 void Main::add_file_or_path_as_target(text_stream *arg, int throwing_error) {
     int is_folder = Platform::is_folder_separator(Str::get_last_char(arg));
-    inbuild_copy *C = Main::file_or_path_to_copy(arg, throwing_error);
+    inbuild_copy *C = Main::file_or_path_to_copy(arg, throwing_error);
     if (C) {
-        Main::add_target(C);
+        Main::add_target(C);
     } else if ((recursive) && (is_folder)) {
         pathname *P = Pathnames::from_text(arg);
         linked_list *L = Directories::listing(P);
@@ -449,13 +462,13 @@ the order in which filenames are read from a directory listing.
         LOOP_OVER_LINKED_LIST(entry, text_stream, L) {
             TEMPORARY_TEXT(FILENAME)
             WRITE_TO(FILENAME, "%p%c%S", P, FOLDER_SEPARATOR, entry);
-            Main::add_file_or_path_as_target(FILENAME, throwing_error);
+            Main::add_file_or_path_as_target(FILENAME, throwing_error);
             DISCARD_TEXT(FILENAME)
         }
     }
 }
 
-

§2.10. Command line. Note the call below to Supervisor::declare_options, which adds a whole lot of +

§2.11. Command line. Note the call below to Supervisor::declare_options, which adds a whole lot of other options to the selection defined here.

@@ -489,6 +502,7 @@ other options to the selection defined here. enum REPAIR_CLSW enum RESULTS_CLSW enum INSTALL_CLSW +enum UNINSTALL_CLSW enum CONFIRMED_CLSW enum VERBOSE_CLSW enum VERBOSITY_CLSW @@ -498,7 +512,7 @@ other options to the selection defined here. enum DOCUMENT_TO_CLSW enum MODERNISE_CLSW -

Read the command line2.10 = +

Read the command line2.11 =

@@ -519,6 +533,8 @@ other options to the selection defined here.
         L"show target(s) but take no action");
     CommandLine::declare_switch(INSTALL_CLSW, L"install", 1,
         L"install extension within the Inform GUI apps");
+    CommandLine::declare_switch(UNINSTALL_CLSW, L"uninstall", 1,
+        L"remove extension within the Inform GUI apps");
     CommandLine::declare_switch(GRAPH_CLSW, L"graph", 1,
         L"show dependency graph of target(s) but take no action");
     CommandLine::declare_switch(USE_NEEDS_CLSW, L"use-needs", 1,
@@ -590,7 +606,7 @@ other options to the selection defined here.
 

-void Main::option(int id, int val, text_stream *arg, void *state) {
+void Main::option(int id, int val, text_stream *arg, void *state) {
     switch (id) {
         case BUILD_CLSW: inbuild_task = BUILD_TTASK; break;
         case REBUILD_CLSW: inbuild_task = REBUILD_TTASK; break;
@@ -614,7 +630,7 @@ other options to the selection defined here.
             Supervisor::set_tools_location(path_to_tools); break;
         case MATCHING_CLSW: filter_text = Str::duplicate(arg); break;
         case CONTENTS_OF_CLSW: contents_of_used = TRUE;
-            Main::add_directory_contents_targets(Pathnames::from_text(arg)); break;
+            Main::add_directory_contents_targets(Pathnames::from_text(arg)); break;
         case RECURSIVE_CLSW: recursive = val;
             if (contents_of_used) Errors::fatal("-recursive must be used before -contents-of");
             break;
@@ -649,7 +665,8 @@ other options to the selection defined here.
             Registries::preprocess_HTML(T, F, preprocess_HTML_app);
             break;
         case REPAIR_CLSW: repair_mode = val; break;
-        case INSTALL_CLSW: to_install = Main::file_or_path_to_copy(arg, TRUE); break;
+        case INSTALL_CLSW: to_install = Main::file_or_path_to_copy(arg, TRUE); break;
+        case UNINSTALL_CLSW: to_uninstall = Main::file_or_path_to_copy(arg, TRUE); break;
         case RESULTS_CLSW: ExtensionInstaller::set_filename(Filenames::from_text(arg)); break;
         case CONFIRMED_CLSW: confirmed = val; break;
         case VERBOSE_CLSW: Supervisor::set_verbosity(1); break;
@@ -670,8 +687,8 @@ subordinate to any switch; we take it as the name of a copy.
 

-void Main::bareword(int id, text_stream *arg, void *state) {
-    Main::add_file_or_path_as_target(arg, TRUE);
+void Main::bareword(int id, text_stream *arg, void *state) {
+    Main::add_file_or_path_as_target(arg, TRUE);
 }
 

§5. JSON validation. For options which output JSON, we perform a check that what we've made @@ -679,7 +696,7 @@ conforms to what we say we make.

-void Main::validate_JSON(JSON_value *obj) {
+void Main::validate_JSON(JSON_value *obj) {
     filename *F = InstalledFiles::filename(INBUILD_JSON_REQS_IRES);
     dictionary *D = JSON::read_requirements_file(NULL, F);
     JSON_requirement *req = JSON::look_up_requirements(D, I"inbuild-output");
diff --git a/docs/inbuild/M-rc.html b/docs/inbuild/M-rc.html
index ab29e10b3..4d8d6ae32 100644
--- a/docs/inbuild/M-rc.html
+++ b/docs/inbuild/M-rc.html
@@ -91,6 +91,7 @@ and those not documented in this manual are covered in that one.
 -results X                     write HTML report file to X (for use within Inform GUI apps)
 -sync-to X                     forcibly copy target(s) to nest X, even if prior version already there
 -tools X                       make X the directory of intools executables
+-uninstall                     remove extension within the Inform GUI apps
 -use-locate                    show file paths of all the extensions, kits and so on needed to use
 -use-missing                   show the extensions, kits and so on which are needed to use but missing
 -use-needs                     show all the extensions, kits and so on needed to use
diff --git a/docs/supervisor-module/1-ic.html b/docs/supervisor-module/1-ic.html
index c07ac54c3..b57782ce8 100644
--- a/docs/supervisor-module/1-ic.html
+++ b/docs/supervisor-module/1-ic.html
@@ -773,7 +773,7 @@ location. If it hasn't, we create a project using     }
 }
 
-inform_project *Supervisor::project_set_at_command_line(void) {
+inform_project *Supervisor::project_set_at_command_line(void) {
     return chosen_project;
 }
 
diff --git a/docs/supervisor-module/2-cps.html b/docs/supervisor-module/2-cps.html index a45e6731b..1bae914b6 100644 --- a/docs/supervisor-module/2-cps.html +++ b/docs/supervisor-module/2-cps.html @@ -198,7 +198,7 @@ for later reporting. These are stored in a list.

§6. Writing.

-void Copies::write_copy(OUTPUT_STREAM, inbuild_copy *C) {
+void Copies::write_copy(OUTPUT_STREAM, inbuild_copy *C) {
     Editions::write(OUT, C->edition);
 }
 
@@ -396,7 +396,7 @@ its main task: building an Inform project.

-void Copies::copy_to(inbuild_copy *C, inbuild_nest *destination_nest, int syncing,
+void Copies::copy_to(inbuild_copy *C, inbuild_nest *destination_nest, int syncing,
     build_methodology *meth) {
     if (destination_nest)
         VOID_METHOD_CALL(C->edition->work->genre, GENRE_COPY_TO_NEST_MTID,
diff --git a/docs/supervisor-module/2-edt.html b/docs/supervisor-module/2-edt.html
index 8e40d8a72..459b34d12 100644
--- a/docs/supervisor-module/2-edt.html
+++ b/docs/supervisor-module/2-edt.html
@@ -141,7 +141,7 @@ contributes only the un-filename-extended leafname 
 
 
-int Editions::cmp(inbuild_edition *E1, inbuild_edition *E2) {
+int Editions::cmp(inbuild_edition *E1, inbuild_edition *E2) {
     int r = Works::cmp(E1->work, E2->work);
     if (r == 0) r = VersionNumbers::cmp(E1->version, E2->version);
     return r;
diff --git a/docs/supervisor-module/2-nst.html b/docs/supervisor-module/2-nst.html
index 051c281fe..ea9e0867f 100644
--- a/docs/supervisor-module/2-nst.html
+++ b/docs/supervisor-module/2-nst.html
@@ -100,7 +100,7 @@ see below for why. Lower-tag-numbered origins are better than later ones.
 enum EXTENSION_NEST_TAG
 
-int Nests::get_tag(inbuild_nest *N) {
+int Nests::get_tag(inbuild_nest *N) {
     if (N == NULL) return -1;
     return N->tag_value;
 }
@@ -151,7 +151,7 @@ can't install to a read-only nest.
 

§5.

-pathname *Nests::get_location(inbuild_nest *N) {
+pathname *Nests::get_location(inbuild_nest *N) {
     if (N == NULL) return NULL;
     return N->location;
 }
diff --git a/docs/supervisor-module/2-wrk.html b/docs/supervisor-module/2-wrk.html
index 67f201c20..b048d8d21 100644
--- a/docs/supervisor-module/2-wrk.html
+++ b/docs/supervisor-module/2-wrk.html
@@ -191,7 +191,7 @@ would both pass, whereas Works::normal
 

-void Works::write(OUTPUT_STREAM, inbuild_work *work) {
+void Works::write(OUTPUT_STREAM, inbuild_work *work) {
     VOID_METHOD_CALL(work->genre, GENRE_WRITE_WORK_MTID, OUT, work);
 }
 
@@ -269,7 +269,7 @@ order-preserving. To emphasise this we return true or false rather than a
 

-int Works::cmp(inbuild_work *w1, inbuild_work *w2) {
+int Works::cmp(inbuild_work *w1, inbuild_work *w2) {
     if ((w1 == NULL) || (w2 == NULL)) internal_error("bad work match");
     int d = Genres::cmp(w1->genre, w2->genre);
     if (d == 0) d = Str::cmp(w1->author_name, w2->author_name);
diff --git a/docs/supervisor-module/3-bm.html b/docs/supervisor-module/3-bm.html
index 47163d231..53b390e38 100644
--- a/docs/supervisor-module/3-bm.html
+++ b/docs/supervisor-module/3-bm.html
@@ -81,7 +81,7 @@ for the tools inter    CLASS_DEFINITION
 } build_methodology;
 
-
  • The structure build_methodology is accessed in 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/ebm, 4/km, 4/lm, 4/pm, 4/tm and here.
+
  • The structure build_methodology is accessed in 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/ebm, 4/km, 4/lm, 4/pm, 4/tm, 7/ti and here.

§2. If the tangled flag is set, we expect inform7, for example, to be at tools_path/inform7/Tangled/inform7; if it is clear, we expect it only to be tools_path/inform7. This is relevant only for the command-line Inbuild, @@ -90,7 +90,7 @@ specified an explicit path at the command line.

-build_methodology *BuildMethodology::new(pathname *tools_path, int tangled, int meth) {
+build_methodology *BuildMethodology::new(pathname *tools_path, int tangled, int meth) {
     build_methodology *BM = CREATE(build_methodology);
     BM->methodology = meth;
     pathname *inter_path = tools_path;
diff --git a/docs/supervisor-module/3-bs2.html b/docs/supervisor-module/3-bs2.html
index b5096aceb..c43512bb0 100644
--- a/docs/supervisor-module/3-bs2.html
+++ b/docs/supervisor-module/3-bs2.html
@@ -179,7 +179,7 @@ that shell commands return 0 to indicate happiness.
 

-int BuildSteps::shell(text_stream *command, build_methodology *BM) {
+int BuildSteps::shell(text_stream *command, build_methodology *BM) {
     int rv = TRUE;
     #ifndef CORE_MODULE
     WRITE_TO(STDOUT, "%S\n", command);
diff --git a/docs/supervisor-module/4-ebm.html b/docs/supervisor-module/4-ebm.html
index c160b176c..461418518 100644
--- a/docs/supervisor-module/4-ebm.html
+++ b/docs/supervisor-module/4-ebm.html
@@ -496,7 +496,7 @@ directory, we need to rsync
 
 
-pathname *ExtensionBundleManager::pathname_in_nest(inbuild_nest *N, inbuild_edition *E) {
+pathname *ExtensionBundleManager::pathname_in_nest(inbuild_nest *N, inbuild_edition *E) {
     pathname *EX = ExtensionManager::path_within_nest(N);
     TEMPORARY_TEXT(leaf)
     Editions::write_canonical_leaf(leaf, E);
diff --git a/docs/supervisor-module/4-em.html b/docs/supervisor-module/4-em.html
index a2c5761d0..a03a39381 100644
--- a/docs/supervisor-module/4-em.html
+++ b/docs/supervisor-module/4-em.html
@@ -246,7 +246,7 @@ since an extension is a single file; to sync, we just overwrite.
 

-filename *ExtensionManager::filename_in_nest(inbuild_nest *N, inbuild_edition *E) {
+filename *ExtensionManager::filename_in_nest(inbuild_nest *N, inbuild_edition *E) {
     pathname *EX = ExtensionManager::path_within_nest(N);
     TEMPORARY_TEXT(leaf)
     Editions::write_canonical_leaf(leaf, E);
@@ -277,12 +277,16 @@ since an extension is a single file; to sync, we just overwrite.
         }
     }
 
-    TEMPORARY_TEXT(command)
-    WRITE_TO(command, "cp -f ");
-    Shell::quote_file(command, C->location_if_file);
-    Shell::quote_file(command, F);
-    BuildSteps::shell(command, meth);
-    DISCARD_TEXT(command)
+    if (meth->methodology == DRY_RUN_METHODOLOGY) {
+        TEMPORARY_TEXT(command)
+        WRITE_TO(command, "cp -f ");
+        Shell::quote_file(command, C->location_if_file);
+        Shell::quote_file(command, F);
+        WRITE_TO(STDOUT, "%S\n", command);
+        DISCARD_TEXT(command)
+    } else {
+        Filenames::copy_file(C->location_if_file, F);
+    }
 }
 

§8. Build graph. As far as building goes, the build graph for an extension is just a single vertex: diff --git a/docs/supervisor-module/4-pm.html b/docs/supervisor-module/4-pm.html index 4758ea20f..f8c0f6758 100644 --- a/docs/supervisor-module/4-pm.html +++ b/docs/supervisor-module/4-pm.html @@ -195,12 +195,16 @@ since a pipeline is a single file; to sync, we just overwrite. } } - TEMPORARY_TEXT(command) - WRITE_TO(command, "cp -f "); - Shell::quote_file(command, C->location_if_file); - Shell::quote_file(command, F); - BuildSteps::shell(command, meth); - DISCARD_TEXT(command) + if (meth->methodology == DRY_RUN_METHODOLOGY) { + TEMPORARY_TEXT(command) + WRITE_TO(command, "cp -f "); + Shell::quote_file(command, C->location_if_file); + Shell::quote_file(command, F); + WRITE_TO(STDOUT, "%S\n", command); + DISCARD_TEXT(command) + } else { + Filenames::copy_file(C->location_if_file, F); + } }