mirror of
https://github.com/libgit2/libgit2.git
synced 2026-01-25 02:56:17 +00:00
416 lines
36 KiB
HTML
416 lines
36 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="content-type" content="text/html;charset=utf-8">
|
|
<title>init.c</title>
|
|
<link rel="stylesheet" href="../css.css">
|
|
<style type="text/css">
|
|
a.fnlink {text-decoration: none}
|
|
a.fnlink:hover {text-decoration: underline}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id='container'>
|
|
<div id="background"></div>
|
|
<div id="jump_to">
|
|
Jump To …
|
|
<div id="jump_wrapper">
|
|
<div id="jump_page">
|
|
<a class="source" href="../../#v1.6.3">API Docs</a>
|
|
<a class="source" href="add.html">add.c</a>
|
|
<a class="source" href="args.html">args.c</a>
|
|
<a class="source" href="blame.html">blame.c</a>
|
|
<a class="source" href="cat-file.html">cat-file.c</a>
|
|
<a class="source" href="checkout.html">checkout.c</a>
|
|
<a class="source" href="clone.html">clone.c</a>
|
|
<a class="source" href="commit.html">commit.c</a>
|
|
<a class="source" href="common.html">common.c</a>
|
|
<a class="source" href="config.html">config.c</a>
|
|
<a class="source" href="describe.html">describe.c</a>
|
|
<a class="source" href="diff.html">diff.c</a>
|
|
<a class="source" href="fetch.html">fetch.c</a>
|
|
<a class="source" href="for-each-ref.html">for-each-ref.c</a>
|
|
<a class="source" href="general.html">general.c</a>
|
|
<a class="source" href="index-pack.html">index-pack.c</a>
|
|
<a class="source" href="init.html">init.c</a>
|
|
<a class="source" href="lg2.html">lg2.c</a>
|
|
<a class="source" href="log.html">log.c</a>
|
|
<a class="source" href="ls-files.html">ls-files.c</a>
|
|
<a class="source" href="ls-remote.html">ls-remote.c</a>
|
|
<a class="source" href="merge.html">merge.c</a>
|
|
<a class="source" href="push.html">push.c</a>
|
|
<a class="source" href="remote.html">remote.c</a>
|
|
<a class="source" href="rev-list.html">rev-list.c</a>
|
|
<a class="source" href="rev-parse.html">rev-parse.c</a>
|
|
<a class="source" href="show-index.html">show-index.c</a>
|
|
<a class="source" href="stash.html">stash.c</a>
|
|
<a class="source" href="status.html">status.c</a>
|
|
<a class="source" href="tag.html">tag.c</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<table cellspacing=0 cellpadding=0>
|
|
<thead>
|
|
<tr>
|
|
<th class=docs><h1>init.c</h1></th>
|
|
<th class=code></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr id='section-1'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-1">¶</a>
|
|
</div>
|
|
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre><span></span><span class="cm">/*</span>
|
|
<span class="cm"> * libgit2 "init" example - shows how to initialize a new repo</span>
|
|
<span class="cm"> *</span>
|
|
<span class="cm"> * Written by the libgit2 contributors</span>
|
|
<span class="cm"> *</span>
|
|
<span class="cm"> * To the extent possible under law, the author(s) have dedicated all copyright</span>
|
|
<span class="cm"> * and related and neighboring rights to this software to the public domain</span>
|
|
<span class="cm"> * worldwide. This software is distributed without any warranty.</span>
|
|
<span class="cm"> *</span>
|
|
<span class="cm"> * You should have received a copy of the CC0 Public Domain Dedication along</span>
|
|
<span class="cm"> * with this software. If not, see</span>
|
|
<span class="cm"> * <http://creativecommons.org/publicdomain/zero/1.0/>.</span>
|
|
<span class="cm"> */</span>
|
|
|
|
<span class="cp">#include</span> <span class="cpf">"common.h"</span><span class="cp"></span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-2'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-2">¶</a>
|
|
</div>
|
|
<p>This is a sample program that is similar to "git init". See the
|
|
documentation for that (try "git help init") to understand what this
|
|
program is emulating.</p>
|
|
|
|
<p>This demonstrates using the libgit2 APIs to initialize a new repository.</p>
|
|
|
|
<p>This also contains a special additional option that regular "git init"
|
|
does not support which is "--initial-commit" to make a first empty commit.
|
|
That is demonstrated in the "create<em>initial</em>commit" helper function.</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-3'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-3">¶</a>
|
|
</div>
|
|
<p>Forward declarations of helpers</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre><span class="k">struct</span> <span class="n">init_opts</span> <span class="p">{</span>
|
|
<span class="kt">int</span> <span class="n">no_options</span><span class="p">;</span>
|
|
<span class="kt">int</span> <span class="n">quiet</span><span class="p">;</span>
|
|
<span class="kt">int</span> <span class="n">bare</span><span class="p">;</span>
|
|
<span class="kt">int</span> <span class="n">initial_commit</span><span class="p">;</span>
|
|
<span class="kt">uint32_t</span> <span class="n">shared</span><span class="p">;</span>
|
|
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">template</span><span class="p">;</span>
|
|
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">gitdir</span><span class="p">;</span>
|
|
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">dir</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
<span class="k">static</span> <span class="kt">void</span> <span class="nf">create_initial_commit</span><span class="p">(</span><span class="n">git_repository</span> <span class="o">*</span><span class="n">repo</span><span class="p">);</span>
|
|
<span class="k">static</span> <span class="kt">void</span> <span class="nf">parse_opts</span><span class="p">(</span><span class="k">struct</span> <span class="n">init_opts</span> <span class="o">*</span><span class="n">o</span><span class="p">,</span> <span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[]);</span>
|
|
|
|
<span class="kt">int</span> <span class="nf">lg2_init</span><span class="p">(</span><span class="n">git_repository</span> <span class="o">*</span><span class="n">repo</span><span class="p">,</span> <span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
|
|
<span class="p">{</span>
|
|
<span class="k">struct</span> <span class="n">init_opts</span> <span class="n">o</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">GIT_REPOSITORY_INIT_SHARED_UMASK</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">};</span>
|
|
|
|
<span class="n">parse_opts</span><span class="p">(</span><span class="o">&</span><span class="n">o</span><span class="p">,</span> <span class="n">argc</span><span class="p">,</span> <span class="n">argv</span><span class="p">);</span>
|
|
|
|
<span class="cm">/* Initialize repository. */</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">no_options</span><span class="p">)</span> <span class="p">{</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-4'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-4">¶</a>
|
|
</div>
|
|
<p>No options were specified, so let's demonstrate the default
|
|
simple case of git<em>repository</em>init() API usage...</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre> <span class="n">check_lg2</span><span class="p">(</span><span class="n"><a name="git_repository_init-5" class="fnlink" href="../../#v1.6.3/group/repository/git_repository_init">git_repository_init</a></span><span class="p">(</span><span class="o">&</span><span class="n">repo</span><span class="p">,</span> <span class="n">o</span><span class="p">.</span><span class="n">dir</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
|
|
<span class="s">"Could not initialize repository"</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="k">else</span> <span class="p">{</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-5'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-5">¶</a>
|
|
</div>
|
|
<p>Some command line options were specified, so we'll use the
|
|
extended init API to handle them</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre> <span class="n">git_repository_init_options</span> <span class="n">initopts</span> <span class="o">=</span> <span class="n">GIT_REPOSITORY_INIT_OPTIONS_INIT</span><span class="p">;</span>
|
|
<span class="n">initopts</span><span class="p">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">GIT_REPOSITORY_INIT_MKPATH</span><span class="p">;</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">bare</span><span class="p">)</span>
|
|
<span class="n">initopts</span><span class="p">.</span><span class="n">flags</span> <span class="o">|=</span> <span class="n">GIT_REPOSITORY_INIT_BARE</span><span class="p">;</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">template</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="n">initopts</span><span class="p">.</span><span class="n">flags</span> <span class="o">|=</span> <span class="n">GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE</span><span class="p">;</span>
|
|
<span class="n">initopts</span><span class="p">.</span><span class="n">template_path</span> <span class="o">=</span> <span class="n">o</span><span class="p">.</span><span class="n">template</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">gitdir</span><span class="p">)</span> <span class="p">{</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-6'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-6">¶</a>
|
|
</div>
|
|
<p>If you specified a separate git directory, then initialize
|
|
the repository at that path and use the second path as the
|
|
working directory of the repository (with a git-link file)</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre> <span class="n">initopts</span><span class="p">.</span><span class="n">workdir_path</span> <span class="o">=</span> <span class="n">o</span><span class="p">.</span><span class="n">dir</span><span class="p">;</span>
|
|
<span class="n">o</span><span class="p">.</span><span class="n">dir</span> <span class="o">=</span> <span class="n">o</span><span class="p">.</span><span class="n">gitdir</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">shared</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">initopts</span><span class="p">.</span><span class="n">mode</span> <span class="o">=</span> <span class="n">o</span><span class="p">.</span><span class="n">shared</span><span class="p">;</span>
|
|
|
|
<span class="n">check_lg2</span><span class="p">(</span><span class="n"><a name="git_repository_init_ext-6" class="fnlink" href="../../#v1.6.3/group/repository/git_repository_init_ext">git_repository_init_ext</a></span><span class="p">(</span><span class="o">&</span><span class="n">repo</span><span class="p">,</span> <span class="n">o</span><span class="p">.</span><span class="n">dir</span><span class="p">,</span> <span class="o">&</span><span class="n">initopts</span><span class="p">),</span>
|
|
<span class="s">"Could not initialize repository"</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
|
|
<span class="p">}</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-7'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-7">¶</a>
|
|
</div>
|
|
<p>Print a message to stdout like "git init" does.</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">o</span><span class="p">.</span><span class="n">quiet</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">bare</span> <span class="o">||</span> <span class="n">o</span><span class="p">.</span><span class="n">gitdir</span><span class="p">)</span>
|
|
<span class="n">o</span><span class="p">.</span><span class="n">dir</span> <span class="o">=</span> <span class="n"><a name="git_repository_path-7" class="fnlink" href="../../#v1.6.3/group/repository/git_repository_path">git_repository_path</a></span><span class="p">(</span><span class="n">repo</span><span class="p">);</span>
|
|
<span class="k">else</span>
|
|
<span class="n">o</span><span class="p">.</span><span class="n">dir</span> <span class="o">=</span> <span class="n"><a name="git_repository_workdir-8" class="fnlink" href="../../#v1.6.3/group/repository/git_repository_workdir">git_repository_workdir</a></span><span class="p">(</span><span class="n">repo</span><span class="p">);</span>
|
|
|
|
<span class="n">printf</span><span class="p">(</span><span class="s">"Initialized empty Git repository in %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">o</span><span class="p">.</span><span class="n">dir</span><span class="p">);</span>
|
|
<span class="p">}</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-8'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-8">¶</a>
|
|
</div>
|
|
<p>As an extension to the basic "git init" command, this example
|
|
gives the option to create an empty initial commit. This is
|
|
mostly to demonstrate what it takes to do that, but also some
|
|
people like to have that empty base commit in their repo.</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre> <span class="k">if</span> <span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">initial_commit</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="n">create_initial_commit</span><span class="p">(</span><span class="n">repo</span><span class="p">);</span>
|
|
<span class="n">printf</span><span class="p">(</span><span class="s">"Created empty initial commit</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="n"><a name="git_repository_free-4" class="fnlink" href="../../#v1.6.3/group/repository/git_repository_free">git_repository_free</a></span><span class="p">(</span><span class="n">repo</span><span class="p">);</span>
|
|
|
|
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
|
|
<span class="p">}</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-9'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-9">¶</a>
|
|
</div>
|
|
<p>Unlike regular "git init", this example shows how to create an initial
|
|
empty commit in the repository. This is the helper function that does
|
|
that.</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre><span class="k">static</span> <span class="kt">void</span> <span class="nf">create_initial_commit</span><span class="p">(</span><span class="n">git_repository</span> <span class="o">*</span><span class="n">repo</span><span class="p">)</span>
|
|
<span class="p">{</span>
|
|
<span class="n">git_signature</span> <span class="o">*</span><span class="n">sig</span><span class="p">;</span>
|
|
<span class="n">git_index</span> <span class="o">*</span><span class="n">index</span><span class="p">;</span>
|
|
<span class="n">git_oid</span> <span class="n">tree_id</span><span class="p">,</span> <span class="n">commit_id</span><span class="p">;</span>
|
|
<span class="n">git_tree</span> <span class="o">*</span><span class="n">tree</span><span class="p">;</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-10'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-10">¶</a>
|
|
</div>
|
|
<p>First use the config to initialize a commit signature for the user.</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre> <span class="k">if</span> <span class="p">(</span><span class="n"><a name="git_signature_default-10" class="fnlink" href="../../#v1.6.3/group/signature/git_signature_default">git_signature_default</a></span><span class="p">(</span><span class="o">&</span><span class="n">sig</span><span class="p">,</span> <span class="n">repo</span><span class="p">)</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">fatal</span><span class="p">(</span><span class="s">"Unable to create a commit signature."</span><span class="p">,</span>
|
|
<span class="s">"Perhaps 'user.name' and 'user.email' are not set"</span><span class="p">);</span>
|
|
|
|
<span class="cm">/* Now let's create an empty tree for this commit */</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="n"><a name="git_repository_index-9" class="fnlink" href="../../#v1.6.3/group/repository/git_repository_index">git_repository_index</a></span><span class="p">(</span><span class="o">&</span><span class="n">index</span><span class="p">,</span> <span class="n">repo</span><span class="p">)</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">fatal</span><span class="p">(</span><span class="s">"Could not open repository index"</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-11'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-11">¶</a>
|
|
</div>
|
|
<p>Outside of this example, you could call git<em>index</em>add_bypath()
|
|
here to put actual files into the index. For our purposes, we'll
|
|
leave it empty for now.</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre> <span class="k">if</span> <span class="p">(</span><span class="n"><a name="git_index_write_tree-3" class="fnlink" href="../../#v1.6.3/group/index/git_index_write_tree">git_index_write_tree</a></span><span class="p">(</span><span class="o">&</span><span class="n">tree_id</span><span class="p">,</span> <span class="n">index</span><span class="p">)</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">fatal</span><span class="p">(</span><span class="s">"Unable to write initial tree from index"</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
|
|
|
|
<span class="n"><a name="git_index_free-2" class="fnlink" href="../../#v1.6.3/group/index/git_index_free">git_index_free</a></span><span class="p">(</span><span class="n">index</span><span class="p">);</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="n"><a name="git_tree_lookup-12" class="fnlink" href="../../#v1.6.3/group/tree/git_tree_lookup">git_tree_lookup</a></span><span class="p">(</span><span class="o">&</span><span class="n">tree</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="o">&</span><span class="n">tree_id</span><span class="p">)</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">fatal</span><span class="p">(</span><span class="s">"Could not look up initial tree"</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-12'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-12">¶</a>
|
|
</div>
|
|
<p>Ready to create the initial commit.</p>
|
|
|
|
<p>Normally creating a commit would involve looking up the current
|
|
HEAD commit and making that be the parent of the initial commit,
|
|
but here this is the first commit so there will be no parent.</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre> <span class="k">if</span> <span class="p">(</span><span class="n"><a name="git_commit_create_v-1" class="fnlink" href="../../#v1.6.3/group/commit/git_commit_create_v">git_commit_create_v</a></span><span class="p">(</span>
|
|
<span class="o">&</span><span class="n">commit_id</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="s">"HEAD"</span><span class="p">,</span> <span class="n">sig</span><span class="p">,</span> <span class="n">sig</span><span class="p">,</span>
|
|
<span class="nb">NULL</span><span class="p">,</span> <span class="s">"Initial commit"</span><span class="p">,</span> <span class="n">tree</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">fatal</span><span class="p">(</span><span class="s">"Could not create the initial commit"</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-13'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-13">¶</a>
|
|
</div>
|
|
<p>Clean up so we don't leak memory.</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre> <span class="n"><a name="git_tree_free-13" class="fnlink" href="../../#v1.6.3/group/tree/git_tree_free">git_tree_free</a></span><span class="p">(</span><span class="n">tree</span><span class="p">);</span>
|
|
<span class="n"><a name="git_signature_free-11" class="fnlink" href="../../#v1.6.3/group/signature/git_signature_free">git_signature_free</a></span><span class="p">(</span><span class="n">sig</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">static</span> <span class="kt">void</span> <span class="nf">usage</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">error</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="p">{</span>
|
|
<span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"error: %s '%s'</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">error</span><span class="p">,</span> <span class="n">arg</span><span class="p">);</span>
|
|
<span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span>
|
|
<span class="s">"usage: init [-q | --quiet] [--bare] [--template=<dir>]</span><span class="se">\n</span><span class="s">"</span>
|
|
<span class="s">" [--shared[=perms]] [--initial-commit]</span><span class="se">\n</span><span class="s">"</span>
|
|
<span class="s">" [--separate-git-dir] <directory></span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
|
|
<span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
|
|
<span class="p">}</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-14'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-14">¶</a>
|
|
</div>
|
|
<p>Parse the tail of the --shared= argument.</p>
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre><span class="k">static</span> <span class="kt">uint32_t</span> <span class="nf">parse_shared</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">shared</span><span class="p">)</span>
|
|
<span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">shared</span><span class="p">,</span> <span class="s">"false"</span><span class="p">)</span> <span class="o">||</span> <span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">shared</span><span class="p">,</span> <span class="s">"umask"</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">GIT_REPOSITORY_INIT_SHARED_UMASK</span><span class="p">;</span>
|
|
|
|
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">shared</span><span class="p">,</span> <span class="s">"true"</span><span class="p">)</span> <span class="o">||</span> <span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">shared</span><span class="p">,</span> <span class="s">"group"</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">GIT_REPOSITORY_INIT_SHARED_GROUP</span><span class="p">;</span>
|
|
|
|
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">shared</span><span class="p">,</span> <span class="s">"all"</span><span class="p">)</span> <span class="o">||</span> <span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">shared</span><span class="p">,</span> <span class="s">"world"</span><span class="p">)</span> <span class="o">||</span>
|
|
<span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">shared</span><span class="p">,</span> <span class="s">"everybody"</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">GIT_REPOSITORY_INIT_SHARED_ALL</span><span class="p">;</span>
|
|
|
|
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">shared</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="sc">'0'</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kt">long</span> <span class="n">val</span><span class="p">;</span>
|
|
<span class="kt">char</span> <span class="o">*</span><span class="n">end</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
|
|
<span class="n">val</span> <span class="o">=</span> <span class="n">strtol</span><span class="p">(</span><span class="n">shared</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="o">&</span><span class="n">end</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">end</span> <span class="o">==</span> <span class="n">shared</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">||</span> <span class="o">*</span><span class="n">end</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">usage</span><span class="p">(</span><span class="s">"invalid octal value for --shared"</span><span class="p">,</span> <span class="n">shared</span><span class="p">);</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">val</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">else</span>
|
|
<span class="n">usage</span><span class="p">(</span><span class="s">"unknown value for --shared"</span><span class="p">,</span> <span class="n">shared</span><span class="p">);</span>
|
|
|
|
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">static</span> <span class="kt">void</span> <span class="nf">parse_opts</span><span class="p">(</span><span class="k">struct</span> <span class="n">init_opts</span> <span class="o">*</span><span class="n">o</span><span class="p">,</span> <span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
|
|
<span class="p">{</span>
|
|
<span class="k">struct</span> <span class="n">args_info</span> <span class="n">args</span> <span class="o">=</span> <span class="n">ARGS_INFO_INIT</span><span class="p">;</span>
|
|
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">sharedarg</span><span class="p">;</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
<tr id='section-15'>
|
|
<td class=docs>
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-15">¶</a>
|
|
</div>
|
|
<p>Process arguments.</p>
|
|
|
|
</td>
|
|
<td class=code>
|
|
<div class='highlight'><pre> <span class="k">for</span> <span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">pos</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">args</span><span class="p">.</span><span class="n">pos</span> <span class="o"><</span> <span class="n">argc</span><span class="p">;</span> <span class="o">++</span><span class="n">args</span><span class="p">.</span><span class="n">pos</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kt">char</span> <span class="o">*</span><span class="n">a</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="n">args</span><span class="p">.</span><span class="n">pos</span><span class="p">];</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="sc">'-'</span><span class="p">)</span>
|
|
<span class="n">o</span><span class="o">-></span><span class="n">no_options</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'-'</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">o</span><span class="o">-></span><span class="n">dir</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
|
|
<span class="n">usage</span><span class="p">(</span><span class="s">"extra argument"</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
|
|
<span class="n">o</span><span class="o">-></span><span class="n">dir</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s">"-q"</span><span class="p">)</span> <span class="o">||</span> <span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s">"--quiet"</span><span class="p">))</span>
|
|
<span class="n">o</span><span class="o">-></span><span class="n">quiet</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
|
|
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s">"--bare"</span><span class="p">))</span>
|
|
<span class="n">o</span><span class="o">-></span><span class="n">bare</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
|
|
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s">"--shared"</span><span class="p">))</span>
|
|
<span class="n">o</span><span class="o">-></span><span class="n">shared</span> <span class="o">=</span> <span class="n">GIT_REPOSITORY_INIT_SHARED_GROUP</span><span class="p">;</span>
|
|
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s">"--initial-commit"</span><span class="p">))</span>
|
|
<span class="n">o</span><span class="o">-></span><span class="n">initial_commit</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
|
|
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">match_str_arg</span><span class="p">(</span><span class="o">&</span><span class="n">sharedarg</span><span class="p">,</span> <span class="o">&</span><span class="n">args</span><span class="p">,</span> <span class="s">"--shared"</span><span class="p">))</span>
|
|
<span class="n">o</span><span class="o">-></span><span class="n">shared</span> <span class="o">=</span> <span class="n">parse_shared</span><span class="p">(</span><span class="n">sharedarg</span><span class="p">);</span>
|
|
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">match_str_arg</span><span class="p">(</span><span class="o">&</span><span class="n">o</span><span class="o">-></span><span class="n">template</span><span class="p">,</span> <span class="o">&</span><span class="n">args</span><span class="p">,</span> <span class="s">"--template"</span><span class="p">)</span> <span class="o">||</span>
|
|
<span class="o">!</span><span class="n">match_str_arg</span><span class="p">(</span><span class="o">&</span><span class="n">o</span><span class="o">-></span><span class="n">gitdir</span><span class="p">,</span> <span class="o">&</span><span class="n">args</span><span class="p">,</span> <span class="s">"--separate-git-dir"</span><span class="p">))</span>
|
|
<span class="n">usage</span><span class="p">(</span><span class="s">"unknown option"</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">o</span><span class="o">-></span><span class="n">dir</span><span class="p">)</span>
|
|
<span class="n">usage</span><span class="p">(</span><span class="s">"must specify directory to init"</span><span class="p">,</span> <span class="s">""</span><span class="p">);</span>
|
|
<span class="p">}</span></pre></div>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</body>
|