1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-16 22:14:23 +03:00
inform7/docs/inbuild-module/4-km.html

298 lines
37 KiB
HTML
Raw Normal View History

2020-02-27 13:18:25 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-03-31 02:17:21 +03:00
<title>4/em</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2020-02-27 13:18:25 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-02-27 13:18:25 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
2020-02-27 13:18:25 +02:00
<!--Weave of '4/km' generated by 7-->
2020-03-31 02:17:21 +03:00
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#4">Chapter 4: Genre Management</a></li><li><b>Kit Manager</b></li></ul><p class="purpose">Claiming and creating copies of the kit genre: used for kits of precompiled Inter code.</p>
2020-02-27 13:18:25 +02:00
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP4">&#167;4. Claiming</a></li><li><a href="#SP5">&#167;5. Searching</a></li><li><a href="#SP6">&#167;6. Copying</a></li><li><a href="#SP7">&#167;7. Build graph</a></li></ul><hr class="tocbar">
2020-03-30 15:25:23 +03:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Genre definition. </b>The <code class="display"><span class="extract">kit_genre</span></code> can be summarised as follows. Kits consist of directories,
containing metadata in <code class="display"><span class="extract">D/kit_metadata.txt</span></code>, but which are also valid Inweb
webs of Inform 6 source text. They are recognised by having directory names
ending in <code class="display"><span class="extract">Kit</span></code>, and by having a metadata file in place. They are stored in
nests, in <code class="display"><span class="extract">N/Inter/Title-vVersion</span></code>. Their build graphs are quite extensive,
with build edges to Inter binaries for each architecture with which they
are compatible, and use edges to extensions or other kits as laid out in
the metadata file.
</p>
2020-02-27 13:18:25 +02:00
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">kit_genre</span><span class="plain"> = </span><span class="functiontext">Genres::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"kit"</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_WRITE_WORK_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::write_work</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_CLAIM_AS_COPY_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::claim_as_copy</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_SEARCH_NEST_FOR_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::search_nest_for</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_COPY_TO_NEST_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::copy_to_nest</span><span class="plain">);</span>
2020-03-31 02:17:21 +03:00
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_CONSTRUCT_GRAPH_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::construct_graph</span><span class="plain">);</span>
2020-03-29 16:48:19 +03:00
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="constant">GENRE_BUILDING_SOON_MTID</span><span class="plain">, </span><span class="functiontext">KitManager::building_soon</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::write_work</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">title</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-28 15:00:08 +02:00
<p class="endnote">The function KitManager::start is used in 1/ic (<a href="1-ic.html#SP3">&#167;3</a>).</p>
2020-02-27 13:18:25 +02:00
<p class="endnote">The function KitManager::write_work appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Kits live in the <code class="display"><span class="extract">Inter</span></code> subdirectory of a nest:
</p>
<pre class="display">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">KitManager::path_within_nest</span><span class="plain">(</span><span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no nest"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">-&gt;</span><span class="element">location</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Inter"</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-04-01 22:43:13 +03:00
<p class="endnote">The function KitManager::path_within_nest is used in <a href="#SP5">&#167;5</a>, <a href="#SP6">&#167;6</a>, 5/kts (<a href="5-kts.html#SP12">&#167;12</a>).</p>
2020-02-27 13:18:25 +02:00
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Kit copies are annotated with a structure called an <code class="display"><span class="extract">inform_kit</span></code>,
which stores data about extensions used by the Inform compiler.
</p>
<pre class="display">
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="functiontext">KitManager::from_copy</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">C</span><span class="plain">) &amp;&amp; (</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain"> == </span><span class="identifier">kit_genre</span><span class="plain">)) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">RETRIEVE_POINTER_inform_kit</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">content</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">dictionary</span><span class="plain"> *</span><span class="identifier">kit_copy_cache</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="functiontext">KitManager::new_copy</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kit_copy_cache</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">kit_copy_cache</span><span class="plain"> = </span><span class="identifier">Dictionaries::new</span><span class="plain">(16, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="string">"%p"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Dictionaries::find</span><span class="plain">(</span><span class="identifier">kit_copy_cache</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">))</span>
<span class="identifier">C</span><span class="plain"> = </span><span class="identifier">Dictionaries::read_value</span><span class="plain">(</span><span class="identifier">kit_copy_cache</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">work</span><span class="plain"> = </span><span class="functiontext">Works::new_raw</span><span class="plain">(</span><span class="identifier">kit_genre</span><span class="plain">, </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">), </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">inbuild_edition</span><span class="plain"> *</span><span class="identifier">edition</span><span class="plain"> = </span><span class="functiontext">Editions::new</span><span class="plain">(</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">VersionNumbers::null</span><span class="plain">());</span>
2020-03-29 19:39:17 +03:00
<span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">Copies::new_in_path</span><span class="plain">(</span><span class="identifier">edition</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
2020-03-29 16:48:19 +03:00
<span class="functiontext">Kits::scan</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">Dictionaries::create</span><span class="plain">(</span><span class="identifier">kit_copy_cache</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
<span class="identifier">Dictionaries::write_value</span><span class="plain">(</span><span class="identifier">kit_copy_cache</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">key</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-04-01 22:43:13 +03:00
<p class="endnote">The function KitManager::from_copy is used in <a href="#SP7">&#167;7</a>, 5/kts (<a href="5-kts.html#SP5">&#167;5</a>, <a href="5-kts.html#SP8">&#167;8</a>).</p>
2020-02-27 13:18:25 +02:00
2020-03-11 02:21:09 +02:00
<p class="endnote">The function KitManager::new_copy is used in <a href="#SP4">&#167;4</a>.</p>
2020-02-27 13:18:25 +02:00
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Claiming. </b>Here <code class="display"><span class="extract">arg</span></code> is a textual form of a filename or pathname, such as may have been
supplied at the command line; <code class="display"><span class="extract">ext</span></code> is a substring of it, and is its extension
(e.g., <code class="display"><span class="extract">jpg</span></code> if <code class="display"><span class="extract">arg</span></code> is <code class="display"><span class="extract">Geraniums.jpg</span></code>), or is empty if there isn't one;
<code class="display"><span class="extract">directory_status</span></code> is true if we know for some reason that this is a directory
not a file, false if we know the reverse, and otherwise not applicable.
</p>
<p class="inwebparagraph">A kit needs to be a directory whose name ends in <code class="display"><span class="extract">Kit</span></code>, and which contains
a valid metadata file.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::claim_as_copy</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> **</span><span class="identifier">C</span><span class="plain">,</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">ext</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">directory_status</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">directory_status</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kitpos</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">) - </span><span class="constant">3</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">kitpos</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">kitpos</span><span class="plain">) == </span><span class="character">'K'</span><span class="plain">) &amp;&amp;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">kitpos</span><span class="plain">+1) == </span><span class="character">'i'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">kitpos</span><span class="plain">+2) == </span><span class="character">'t'</span><span class="plain">)) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">KitManager::claim_folder_as_copy</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="functiontext">KitManager::claim_folder_as_copy</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">canary</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kit_metadata.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">canary</span><span class="plain">)) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">KitManager::new_copy</span><span class="plain">(</span><span class="identifier">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function KitManager::claim_as_copy is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function KitManager::claim_folder_as_copy is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Searching. </b>Here we look through a nest to find all kits matching the supplied
requirements.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::search_nest_for</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">,</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">search_results</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain">) &amp;&amp; (</span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">work</span><span class="plain">-&gt;</span><span class="element">genre</span><span class="plain"> != </span><span class="identifier">kit_genre</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">KitManager::path_within_nest</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">);</span>
<span class="identifier">scan_directory</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">Directories::open</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">LEAFNAME</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Directories::next</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">LEAFNAME</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_last_char</span><span class="plain">(</span><span class="identifier">LEAFNAME</span><span class="plain">) == </span><span class="identifier">FOLDER_SEPARATOR</span><span class="plain">) {</span>
<span class="identifier">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">LEAFNAME</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">Q</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">LEAFNAME</span><span class="plain">);</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">KitManager::claim_folder_as_copy</span><span class="plain">(</span><span class="identifier">Q</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">C</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Requirements::meets</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">))) {</span>
2020-02-27 13:18:25 +02:00
<span class="functiontext">Nests::add_search_result</span><span class="plain">(</span><span class="identifier">search_results</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">LEAFNAME</span><span class="plain">);</span>
<span class="identifier">Directories::close</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function KitManager::search_nest_for is used in <a href="#SP1">&#167;1</a>.</p>
2020-03-30 15:25:23 +03:00
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Copying. </b>Now the task is to copy a kit into place in a nest. Since a kit is a directory,
2020-02-27 13:18:25 +02:00
we need to <code class="display"><span class="extract">rsync</span></code> it.
</p>
<pre class="display">
2020-03-11 02:21:09 +02:00
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">KitManager::pathname_in_nest</span><span class="plain">(</span><span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">inbuild_edition</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="functiontext">Editions::write_canonical_leaf</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">KitManager::path_within_nest</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">), </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::copy_to_nest</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">syncing</span><span class="plain">, </span><span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">meth</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">dest_kit</span><span class="plain"> = </span><span class="functiontext">KitManager::pathname_in_nest</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">edition</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">dest_kit_metadata</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">dest_kit</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kit_metadata.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">dest_kit_metadata</span><span class="plain">)) {</span>
2020-03-29 19:39:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">syncing</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) { </span><span class="functiontext">Copies::overwrite_error</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
2020-02-27 13:18:25 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">meth</span><span class="plain">-&gt;</span><span class="identifier">methodology</span><span class="plain"> == </span><span class="constant">DRY_RUN_METHODOLOGY</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="string">"mkdir -p "</span><span class="plain">);</span>
<span class="identifier">Shell::quote_path</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">dest_kit</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDOUT</span><span class="plain">, </span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">-&gt;</span><span class="element">location</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="functiontext">KitManager::path_within_nest</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">));</span>
<span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">dest_kit</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">meth</span><span class="plain">-&gt;</span><span class="identifier">methodology</span><span class="plain"> == </span><span class="constant">DRY_RUN_METHODOLOGY</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="string">"rsync -a --delete "</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Shell::quote_path</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">location_if_path</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">Shell::quote_path</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">dest_kit</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDOUT</span><span class="plain">, </span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Pathnames::rsync</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">location_if_path</span><span class="plain">, </span><span class="identifier">dest_kit</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function KitManager::pathname_in_nest appears nowhere else.</p>
<p class="endnote">The function KitManager::copy_to_nest is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Build graph. </b></p>
<pre class="display">
2020-03-29 16:48:19 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::building_soon</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain"> **</span><span class="identifier">V</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="plain">*</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">vertex</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="plain">}</span>
2020-03-31 02:17:21 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::construct_graph</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="functiontext">Kits::construct_graph</span><span class="plain">(</span><span class="functiontext">KitManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-29 16:48:19 +03:00
<p class="endnote">The function KitManager::building_soon is used in <a href="#SP1">&#167;1</a>.</p>
2020-02-27 13:18:25 +02:00
2020-03-31 02:17:21 +03:00
<p class="endnote">The function KitManager::construct_graph is used in <a href="#SP1">&#167;1</a>.</p>
2020-02-27 13:18:25 +02:00
<hr class="tocbar">
2020-03-31 02:17:21 +03:00
<ul class="toc"><li><a href="4-em.html">Back to 'Extension Manager'</a></li><li><a href="4-lm.html">Continue with 'Language Manager'</a></li></ul><hr class="tocbar">
2020-02-27 13:18:25 +02:00
<!--End of weave-->
2020-03-19 02:11:25 +02:00
</main>
2020-02-27 13:18:25 +02:00
</body>
</html>