<?xml version="1.0" encoding="UTF-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us"><id>https://blog.pgxn.org/tags/release/</id><title>Release</title><updated>2024-01-31T16:52:19Z</updated><link rel="self" type="application/atom+xml" href="https://blog.pgxn.org/tags/release/feed.xml"/><link rel="alternate" type="text/html" href="https://blog.pgxn.org/tags/release/"/><author><name>The PGXN Maintainers</name></author><generator uri="https://gohugo.io/" version="0.167.0">Hugo</generator><entry><id>https://blog.pgxn.org/post/741049567045468160</id><title type="html">PGXN Tools Docker Image Updated</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2024/pgxn-tools-v4/"/><updated>2026-10-07T16:13:48Z</updated><published>2024-01-31T16:52:19Z</published><author><name>David E. Wheeler</name></author><category scheme="https://blog.pgxn.org/tags" term="pgxn" label="PGXN"/><category scheme="https://blog.pgxn.org/tags" term="docker" label="Docker"/><category scheme="https://blog.pgxn.org/tags" term="github-actions" label="GitHub Actions"/><category scheme="https://blog.pgxn.org/tags" term="github-workflows" label="GitHub Workflows"/><category scheme="https://blog.pgxn.org/tags" term="release" label="Release"/><category scheme="https://blog.pgxn.org/tags" term="bundle" label="Bundle"/><summary type="html"><![CDATA[<p>Just a quick note to highlight some bug fixes and improvements in the
<a href="https://github.com/pgxn/docker-pgxn-tools/">pgxn/pgxn-tools Docker image</a> in the last few weeks.</p>
<p>v1.4.0 adds the <code>GIT_BUNDLE_OPTS</code> and <code>ZIP_BUNDLE_OPTS</code> environment variables.
The former is passed to <code>git archive</code> and the latter to zip, and let
additional options be passed to those commands. For example, the <a href="https://pgxn.org/dist/vectorize/">vectorize
extension</a>&rsquo;s <a href="https://github.com/tembo-io/pg_vectorize/blob/v0.9.0/.github/workflows/pgxn-release.yml">release workflow</a> sets <code>GIT_BUNDLE_OPTS: --add-file META.json</code>
because git archive archives only checked-in files, and <code>META.json</code> is not
checked in but <a href="https://github.com/tembo-io/pg_vectorize/blob/v0.9.0/Makefile#L17-L18">generated from</a> <code>META.json.in</code>.</p>]]></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve"><![CDATA[<p>Just a quick note to highlight some bug fixes and improvements in the
<a href="https://github.com/pgxn/docker-pgxn-tools/">pgxn/pgxn-tools Docker image</a> in the last few weeks.</p>
<p>v1.4.0 adds the <code>GIT_BUNDLE_OPTS</code> and <code>ZIP_BUNDLE_OPTS</code> environment variables.
The former is passed to <code>git archive</code> and the latter to zip, and let
additional options be passed to those commands. For example, the <a href="https://pgxn.org/dist/vectorize/">vectorize
extension</a>&rsquo;s <a href="https://github.com/tembo-io/pg_vectorize/blob/v0.9.0/.github/workflows/pgxn-release.yml">release workflow</a> sets <code>GIT_BUNDLE_OPTS: --add-file META.json</code>
because git archive archives only checked-in files, and <code>META.json</code> is not
checked in but <a href="https://github.com/tembo-io/pg_vectorize/blob/v0.9.0/Makefile#L17-L18">generated from</a> <code>META.json.in</code>.</p>
<p>v1.4.1 <a href="https://github.com/pgxn/docker-pgxn-tools/commit/1114aed">fixes an issue</a> where <code>git archive</code> was never actually used to build a
release zip archive. This changed at some point without noticing due to the
introduction of the <code>safe.directory</code> configuration in recent versions of Git.
Inside the container the directory was never trusted, and the <code>pgxn-bundle</code>
command caught the error, decided it wasn&rsquo;t working with a Git repository, and
used the <code>zip</code> command, instead.</p>
<p>As a result, a number of recent releases have included files they shouldn&rsquo;t,
such as the contents of the <code>.git</code> directory. <a href="https://github.com/pgxn/docker-pgxn-tools/commit/1114aed">The fix</a>
<a href="https://stackoverflow.com/a/73100228/79202">disables</a> <code>safe.directory</code> so that the repository directory is always trusted
inside the container, as needed in GitHub actions.</p>
<p>If you use <code>pgxn-bundle</code> in a GitHub workflow, be aware that recent releases
(since November 2021 at least) include stuff that it should not, including the
<code>.git</code> directory (here&rsquo;s <a href="https://gist.github.com/theory/93c93571200aad02e93170c6d2c93cbe">a list</a>) and patterns excluded in <code>.gitattributes</code>.
Your next release should be cleaner.</p>
<p>v1.4.1 also allows the setting of the <code>PROFILE</code> environment variable, so that
the default <code>PROFILE=--Werror</code> can be overridden.</p>
<p>v1.4.2 adds (and v1.4.3 improves, see below) <code>git-archive-all</code> to the image,
and the <code>GIT_ARCHIVE_CMD</code> environment variable to tell <code>pgxn-bundle</code> which archive
command to use, either <code>archive</code> or <code>archive-all</code>. The latter is useful for
repositories that use Git submodules and need to include their contents in the
release, as demonstrated in <a href="https://github.com/plv8/plv8/pull/570/files#diff-4e4745c3f39dff4c307faf79bfa1242cc5ba2eb5947bebdcddc8d97eeb40685fR15">this plv8 pull request</a>.</p>
<p>v1.4.2 also adds <a href="https://cmake.org/"><code>cmake</code></a> and the <code>libarchive-tools</code> package to the image.
The latter bundles in <a href="https://libarchive.org/">libarchive</a> tools like <code>bsdtar</code> and <code>bsdcpio</code>, which
might be useful for editing Zip files in place.</p>
<p>v1.4.3 passes the <code>--force-submodules</code> option to <code>git-archive-all</code>, because
otherwise submodules weren&rsquo;t included in the bundle.</p>
<p>All of this should just start showing up in your GitHub workflows as long as
they use <code>container: pgxn/pgxn-tools</code> or <code>container: pgxn/pgxn-tools@v1</code>.</p>
<p>Questions? Post em in the <a href="https://postgresteam.slack.com/archives/C056ZA93H1A">#extensions</a> channel on the <a href="https://pgtreats.info/slack-invite">Postgres Slack</a> or to
the attention of the <a href="https://mastodon.social/@pgxn">PGXN Mastodon bot</a>.</p>
]]></content></entry><entry><id>https://blog.pgxn.org/post/128057409023</id><title type="html">PGXN Manager Upgraded</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2015/pgxn-manager-upgraded/"/><updated>2026-10-07T16:13:48Z</updated><published>2015-08-31T21:48:54Z</published><author><name>David E. Wheeler</name></author><category scheme="https://blog.pgxn.org/tags" term="release" label="Release"/><category scheme="https://blog.pgxn.org/tags" term="upgrade" label="Upgrade"/><category scheme="https://blog.pgxn.org/tags" term="versions" label="Versions"/><summary type="html"><![CDATA[I took a little time this summer to finally address some nagging issues in
<a href="https://manager.pgxn.org/">PGXN Manager</a>, the site to which extensions are uploaded and added to the
<a href="https://master.pgxn.org/">master repository</a>. Most of the changes were internal, improving the
interface through which I sometimes have to re-index a release. There are also
a couple of minor changes to the sample <code>Makefile</code> in the <a href="https://manager.pgxn.org/howto">How To</a>. But the
most important change for new releases going forward is that version ordering
is now enforced. That means two things:]]></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve"><![CDATA[<p>I took a little time this summer to finally address some nagging issues in
<a href="https://manager.pgxn.org/">PGXN Manager</a>, the site to which extensions are uploaded and added to the
<a href="https://master.pgxn.org/">master repository</a>. Most of the changes were internal, improving the
interface through which I sometimes have to re-index a release. There are also
a couple of minor changes to the sample <code>Makefile</code> in the <a href="https://manager.pgxn.org/howto">How To</a>. But the
most important change for new releases going forward is that version ordering
is now enforced. That means two things:</p>
<ul>
<li>Distribution versions <strong>must</strong> be greater than the version of the previous
release. You can no longer release <code>v1.2.0</code> today and <code>v1.1.0</code> tomorrow.</li>
<li>Extension versions <strong>must</strong> be greater than or equal to versions in previous
releases. It&rsquo;s pretty common to have a new release version but have embedded
extensions be the same version as before. But they can&rsquo;t be any less than
before.</li>
</ul>
<p>The changes have been applied to the reindexing code, as well, which also
prevents versions from being greater than in subsequent releases. That won&rsquo;t
come up very often&mdash;most of the time, I end up reindexing something that has
just been released. But in the future I expect to add an interface for release
managers to <a href="https://github.com/pgxn/pgxn-manager/issues/49">reindex their own distributions</a>, so it may be that someone
reindexes a release that&rsquo;s a few versions old. Or not. But just in case, it&rsquo;ll
be handled.</p>
<p>So what are you going to release on PGXN today? <a href="https://manager.pgxn.org/howto">Get to it!</a>.</p>
]]></content></entry><entry><id>https://blog.pgxn.org/post/21171605888</id><title type="html">pgxn-utils 0.1.4 is out!</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2012/pgxn-utils-014-is-out/"/><updated>2026-10-07T16:13:48Z</updated><published>2012-04-15T21:44:12Z</published><author><name>David E. Wheeler</name></author><category scheme="https://blog.pgxn.org/tags" term="pgxn" label="PGXN"/><category scheme="https://blog.pgxn.org/tags" term="utils" label="Utils"/><category scheme="https://blog.pgxn.org/tags" term="automation" label="Automation"/><category scheme="https://blog.pgxn.org/tags" term="release" label="Release"/><summary type="html"><![CDATA[<p><em>by Dickson S. Guedes</em></p>
<p>Hi everybody!</p>
<p>I&rsquo;m proud to tell you that a new version of <a href="https://github.com/guedes/pgxn-utils">PGXN Utils</a> was released with
this new features:</p>
<ul>
<li>Git support</li>
<li>Templates and custom templates</li>
<li><a href="https://pgxnclient.projects.postgresql.org/">PGXN Client</a> integration</li>
</ul>
<h2 id="git-support">Git support</h2>
<p>You can start a new extension with or without version control. By default
<code>pgxn-utils</code> supports <a href="https://git-scm.org">git</a> but it will not create a repository unless you use
<code>--git</code> option in the skeleton task.</p>
<p>You can try:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> pgxn-utils skeleton my_cool_versioned_extension --git
</span></span></code></pre></div><p>When you create a new extension with git support in addition to creating the
skeleton, <code>pgxn-utils</code> will initialize a git repository and create the initial
commit.</p>]]></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve"><![CDATA[<p><em>by Dickson S. Guedes</em></p>
<p>Hi everybody!</p>
<p>I&rsquo;m proud to tell you that a new version of <a href="https://github.com/guedes/pgxn-utils">PGXN Utils</a> was released with
this new features:</p>
<ul>
<li>Git support</li>
<li>Templates and custom templates</li>
<li><a href="https://pgxnclient.projects.postgresql.org/">PGXN Client</a> integration</li>
</ul>
<h2 id="git-support">Git support</h2>
<p>You can start a new extension with or without version control. By default
<code>pgxn-utils</code> supports <a href="https://git-scm.org">git</a> but it will not create a repository unless you use
<code>--git</code> option in the skeleton task.</p>
<p>You can try:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> pgxn-utils skeleton my_cool_versioned_extension --git
</span></span></code></pre></div><p>When you create a new extension with git support in addition to creating the
skeleton, <code>pgxn-utils</code> will initialize a git repository and create the initial
commit.</p>
<p>Once you have your extension in a git repository your <code>bundle</code> will use only
the committed files to create the archive, but if your repository is dirty
then <code>pgxn-utils</code> will suggest that you to commit or stash your changes before
bundling.</p>
<p>You must be careful with new files not added to repository, because they will
<strong>not</strong> be archived.</p>
<h2 id="default-templates">Default templates</h2>
<p>There are three default templates: <code>sql</code>, <code>c</code> and <code>fdw</code>. If you call
<code>skeleton</code> without specifying a template, <code>sql</code> is the default. But if your
extension will supply some C modules or you will create a FDW, you can create
the extension calling <code>skeleton</code> with a <code>--template</code> option.</p>
<p>Try:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> pgxn-utils skeleton my_cool_c_extension --template<span class="o">=</span>c
</span></span><span class="line"><span class="cl"><span class="gp">$</span> pgxn-utils skeleton my_cool_fdw_extension --template<span class="o">=</span>fdw
</span></span></code></pre></div><p>The templates contain example code and some links to PostgreSQL documentation
that will try to help you to start coding. SQL and C templates contains some
test examples, and the example code will compile and pass <code>make installcheck</code>.
However, this code is intended to be an example, and you must write your own
tests and code.</p>
<h2 id="custom-templates">Custom templates</h2>
<p>If you don&rsquo;t like the templates provided by <code>pgxn-utils</code> you can create you
own. Just create a directory with at least a <code>META.json</code> or <code>META.json.tt</code>
file and then use your directory as argument to the <code>--template</code> option.</p>
<p>To know how create your own template, see the examples in the <a href="https://github.com/guedes/pgxn-utils/tree/master/lib/pgxn_utils/templates">templates
directory</a>.</p>
<h2 id="pgxn-client-integration">PGXN Client integration</h2>
<p>If you have <a href="https://pgxnclient.projects.postgresql.org/">PGXN client</a> installed you can change the command line from
<code>pgxn-utils some_task</code> to <code>pgxn some_task</code> and this will save you some typing.</p>
<p>See:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> <span class="nb">cd</span> /tmp
</span></span><span class="line"><span class="cl"><span class="gp">$</span> pgxn skeleton --help
</span></span><span class="line"><span class="cl"><span class="go">PGXN Utils version: 0.1.4
</span></span></span><span class="line"><span class="cl"><span class="go">Usage:
</span></span></span><span class="line"><span class="cl"><span class="go">  pgxn skeleton extension_name
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Options:
</span></span></span><span class="line"><span class="cl"><span class="go">      [--git]                            # Initialize a git repository after create the extension
</span></span></span><span class="line"><span class="cl"><span class="go">  -a, [--abstract=ABSTRACT]              # Defines a short description to abstract
</span></span></span><span class="line"><span class="cl"><span class="go">  -p, [--target=TARGET]                  # Define the target directory
</span></span></span><span class="line"><span class="cl"><span class="go">                                          # Default: .
</span></span></span><span class="line"><span class="cl"><span class="go">      [--template=TEMPLATE]              # The template that will be used to create the extension. Expected values are: sql, c, fdw
</span></span></span><span class="line"><span class="cl"><span class="go">                                          # Default: sql
</span></span></span><span class="line"><span class="cl"><span class="go">  -r, [--release-status=RELEASE_STATUS]  # Initial extension&#39;s release status
</span></span></span><span class="line"><span class="cl"><span class="go">  -d, [--description=DESCRIPTION]        # A long text that contains more information about extension
</span></span></span><span class="line"><span class="cl"><span class="go">  -b, [--generated-by=GENERATED_BY]      # Name of extension&#39;s generator
</span></span></span><span class="line"><span class="cl"><span class="go">  -l, [--license=LICENSE]                # The extension license
</span></span></span><span class="line"><span class="cl"><span class="go">  -t, [--tags=one two three]             # Defines extension&#39;s tags
</span></span></span><span class="line"><span class="cl"><span class="go">  -v, [--version=VERSION]                # Initial version
</span></span></span><span class="line"><span class="cl"><span class="go">  -m, [--maintainer=MAINTAINER]          # Maintainer&#39;s name &lt;maintainer@email&gt;
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Creates an extension skeleton in current directory
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="gp">$</span> pgxn skeleton <span class="nb">test</span>
</span></span><span class="line"><span class="cl"><span class="go">      create  test
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/test.control
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/.gitignore
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/.template
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/META.json
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/Makefile
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/README.md
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/doc/test.md
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/sql/test.sql
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/sql/uninstall_test.sql
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/test/expected/base.out
</span></span></span><span class="line"><span class="cl"><span class="go">      create  test/test/sql/base.sql
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="gp">$</span> <span class="nb">cd</span> test/
</span></span><span class="line"><span class="cl"><span class="gp">$</span> pgxn bundle
</span></span><span class="line"><span class="cl"><span class="go">          run  make distclean from &#34;.&#34;
</span></span></span><span class="line"><span class="cl"><span class="go">      create  /tmp/test-0.0.1.zip
</span></span></span></code></pre></div><p>I hope you enjoy this version. &ldquo;:)</p>
]]></content></entry><entry><id>https://blog.pgxn.org/post/20596200256</id><title type="html">Only Stable Releases are Indexed</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2012/stable-only-indexed/"/><updated>2026-10-07T16:13:48Z</updated><published>2012-04-06T17:02:19Z</published><author><name>David E. Wheeler</name></author><category scheme="https://blog.pgxn.org/tags" term="release" label="Release"/><category scheme="https://blog.pgxn.org/tags" term="status" label="Status"/><category scheme="https://blog.pgxn.org/tags" term="release-status" label="Release Status"/><category scheme="https://blog.pgxn.org/tags" term="stable" label="Stable"/><category scheme="https://blog.pgxn.org/tags" term="testing" label="Testing"/><category scheme="https://blog.pgxn.org/tags" term="unstable" label="Unstable"/><category scheme="https://blog.pgxn.org/tags" term="full-text-index" label="Full Text Index"/><category scheme="https://blog.pgxn.org/tags" term="fti" label="FTI"/><category scheme="https://blog.pgxn.org/tags" term="search-results" label="Search Results"/><category scheme="https://blog.pgxn.org/tags" term="adaptive-estimator" label="Adaptive Estimator"/><summary type="html"><![CDATA[I&rsquo;ve had a few reports over the last few months that folks uploaded new
extensions to <a href="https://pgxn.org/">PGXN</a> but they failed to show up in search results. For
example, as of right now, if you <a href="https://pgxn.org/search?q=distinct&amp;in=docs">search for &ldquo;distinct&rdquo;</a>, you get two results,
<a href="https://pgxn.org/dist/omnipitr/doc/internals.html">OmniPITR</a> and <a href="https://pgxn.org/dist/pgtap/doc/pgtap.html">pgTAP</a>. This despite the fact that the recently-released
<a href="https://pgxn.org/dist/adaptive_estimator/">adaptive_estimator</a> extension is <a href="https://pgxn.org/tag/distinct/">tagged &ldquo;distinct&rdquo;</a>. Author <a href="https://pgxn.org/user/tomasv">Tomas Vondra</a>
reported this issue, and it took me a couple of days to realize why it wasn&rsquo;t
showing up.]]></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve"><![CDATA[<p>I&rsquo;ve had a few reports over the last few months that folks uploaded new
extensions to <a href="https://pgxn.org/">PGXN</a> but they failed to show up in search results. For
example, as of right now, if you <a href="https://pgxn.org/search?q=distinct&amp;in=docs">search for &ldquo;distinct&rdquo;</a>, you get two results,
<a href="https://pgxn.org/dist/omnipitr/doc/internals.html">OmniPITR</a> and <a href="https://pgxn.org/dist/pgtap/doc/pgtap.html">pgTAP</a>. This despite the fact that the recently-released
<a href="https://pgxn.org/dist/adaptive_estimator/">adaptive_estimator</a> extension is <a href="https://pgxn.org/tag/distinct/">tagged &ldquo;distinct&rdquo;</a>. Author <a href="https://pgxn.org/user/tomasv">Tomas Vondra</a>
reported this issue, and it took me a couple of days to realize why it wasn&rsquo;t
showing up.</p>
<p>Here&rsquo;s the reason: Only &ldquo;stable&rdquo; releases are indexed. The <a href="https://pgxn.org/dist/adaptive_estimator/1.0.0/">first</a> and
<a href="https://pgxn.org/dist/adaptive_estimator/1.1.0/">second</a> adaptive_estimator releases both have their release status set to
&ldquo;testing&rdquo;. The PGXN API only indexes stable releases. The idea behind that is
that you want most folks to continue using stable releases while you work on
testing new versions. So when users search the site, only the latest stable
release will appear in search results. Similarly, installing an extension via
the <a href="https://pgxnclient.projects.postgresql.org/">PGXN client</a>, prefers the latest stable release by default. If you want
the most recent, you have to <a href="https://pgxnclient.projects.postgresql.org/usage.html#pgxn-install">specify the <code>--unstable</code> or <code>--testing</code> option</a>.</p>
<p>So, the upshot is, if you want your extension to appear in the full text
search results on the PGXN, site, release a stable version.</p>
<p>That said, I first noticed this issue a while ago, and filed <a href="https://github.com/pgxn/pgxn-api/issues/2">an issue</a> with
the idea that, if an extension is uploaded that is not stable, but there are
no stable versions, then the extension should be indexed, anyway. The idea
here is that, when you first upload it, you don&rsquo;t have any existing users to
keep on a stable release anyway, because there <em>is no stable release.</em> So
perhaps we should go ahead and index it. A non-stable release would only be
omitted from the index if there was an existing stable release.</p>
<p>Thoughts?</p>
]]></content></entry><entry><id>https://blog.pgxn.org/post/13427961249</id><title type="html">PGXN Client 1.0 Released!</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2011/pgxn-client-10-released/"/><updated>2026-10-07T16:13:48Z</updated><published>2011-11-28T00:34:34Z</published><author><name>Daniele Varrazzo</name></author><category scheme="https://blog.pgxn.org/tags" term="pgxn-client" label="PGXN Client"/><category scheme="https://blog.pgxn.org/tags" term="release" label="Release"/><summary type="html"><![CDATA[<p>Finally, here it is. Well tested, documented, and pampered. With the <a href="https://pgxnclient.projects.postgresql.org/">PGXN
Client</a> installing extensions from the <a href="https://pgxn.org/">PGXN Network</a> is a breeze:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> pgxn install semver
</span></span><span class="line"><span class="cl"><span class="gp">$</span> pgxn load semver
</span></span><span class="line"><span class="cl"><span class="gp">$</span> psql
</span></span><span class="line"><span class="cl"><span class="go">=# select &#39;foo&#39;::semver;
</span></span></span><span class="line"><span class="cl"><span class="go">ERROR:  bad semver value &#39;foo&#39;: expected number at foo
</span></span></span><span class="line"><span class="cl"><span class="go">LINE 1: select &#39;foo&#39;::semver;
</span></span></span></code></pre></div><p>Error! Meaning: success!</p>
<p>The number of extensions on PGXN is steadily increasing, so we hope the client
will make their adoption even easier.</p>
<p>The client is now extensible: either writing in Python to reuse some of the
other commands implementation or writing new self-contained scripts in any
language to be invoked by the pgxn commands dispatcher. The first client
extensions are already available: <a href="https://github.com/guedes/pgxn-utils">PGXN Utils</a> and <a href="https://github.com/pgxn/pgxn-meta-validator/">PGXN:Meta:Validator</a> are
targeted for easier development of new extensions.</p>]]></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve"><![CDATA[<p>Finally, here it is. Well tested, documented, and pampered. With the <a href="https://pgxnclient.projects.postgresql.org/">PGXN
Client</a> installing extensions from the <a href="https://pgxn.org/">PGXN Network</a> is a breeze:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> pgxn install semver
</span></span><span class="line"><span class="cl"><span class="gp">$</span> pgxn load semver
</span></span><span class="line"><span class="cl"><span class="gp">$</span> psql
</span></span><span class="line"><span class="cl"><span class="go">=# select &#39;foo&#39;::semver;
</span></span></span><span class="line"><span class="cl"><span class="go">ERROR:  bad semver value &#39;foo&#39;: expected number at foo
</span></span></span><span class="line"><span class="cl"><span class="go">LINE 1: select &#39;foo&#39;::semver;
</span></span></span></code></pre></div><p>Error! Meaning: success!</p>
<p>The number of extensions on PGXN is steadily increasing, so we hope the client
will make their adoption even easier.</p>
<p>The client is now extensible: either writing in Python to reuse some of the
other commands implementation or writing new self-contained scripts in any
language to be invoked by the pgxn commands dispatcher. The first client
extensions are already available: <a href="https://github.com/guedes/pgxn-utils">PGXN Utils</a> and <a href="https://github.com/pgxn/pgxn-meta-validator/">PGXN:Meta:Validator</a> are
targeted for easier development of new extensions.</p>
<p>The client is <a href="https://pypi.python.org/pypi/pgxnclient">released on PyPI</a>, so installing is just:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> sudo easy_install pgxnclient
</span></span></code></pre></div><p>Complete documentation and further links are available from the <a href="https://pgxnclient.projects.postgresql.org/">project
homepage</a>.</p>
<p>Any feedback is welcome; you can contact me and all the other people behind
PGXN on the <a href="https://groups.google.com/group/pgxn-users/">PGXN User Group</a>. See you there!</p>
]]></content></entry><entry><id>https://blog.pgxn.org/post/6883009649</id><title type="html">PGXN Utils 0.1.2 Released!</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2011/pgxn-utils-012-released/"/><updated>2026-10-07T16:13:48Z</updated><published>2011-06-24T23:53:00Z</published><author><name>Dickson S. Guedes</name></author><category scheme="https://blog.pgxn.org/tags" term="build" label="Build"/><category scheme="https://blog.pgxn.org/tags" term="create-extension" label="Create Extension"/><category scheme="https://blog.pgxn.org/tags" term="utils" label="Utils"/><category scheme="https://blog.pgxn.org/tags" term="meta" label="Meta"/><category scheme="https://blog.pgxn.org/tags" term="release" label="Release"/><category scheme="https://blog.pgxn.org/tags" term="bundle" label="Bundle"/><summary type="html"><![CDATA[<p>Hello everyone!</p>
<p>I&rsquo;m proud to tell you that a new version of <a href="https://github.com/guedes/pgxn-utils">pgxn_utils</a> was released!</p>
<p>Now you can release a distribution to <a href="https://pgxn.org">PGXN</a> in <strong>five steps</strong>!</p>
<p><strong>First</strong>, install it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gem install pgxn_utils
</span></span></code></pre></div><p><strong>Second</strong>, create your extension, optionally overwrite some defaults:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">mkdir <span class="nv">$HOME</span>/extensions
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> <span class="nv">$HOME</span>/extensions
</span></span><span class="line"><span class="cl">pgxn_utils skeleton my_extension --maintainer <span class="s2">&#34;Dickson S. Guedes&#34;</span>
</span></span></code></pre></div><p><strong>Third</strong>, code!</p>
<p><strong>Fourth</strong>, bundle it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">pgxn_utils bundle my_extension
</span></span></span><span class="line"><span class="cl"><span class="go">Extension generated at: /home/guedes/extensions/my_extension-0.0.1.zip
</span></span></span></code></pre></div><p><strong>Fifth</strong>, release it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">pgxn_utils release my_extension-0.0.1.zip
</span></span></span><span class="line"><span class="cl"><span class="go">Enter your PGXN username: guedes
</span></span></span><span class="line"><span class="cl"><span class="go">Enter your PGXN password: ******
</span></span></span><span class="line"><span class="cl"><span class="go">Trying to release my_cool_extension-0.0.1.zip ... released successfully!
</span></span></span><span class="line"><span class="cl"><span class="go">Visit: https://manager.pgxn.org/distributions/my_cool_extension/0.0.1
</span></span></span></code></pre></div><p>Ah, you can export <code>PGXN_USER</code> and <code>PGXN_PASSWORD</code> if you are tired to type
your username and password every time.</p>]]></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve"><![CDATA[<p>Hello everyone!</p>
<p>I&rsquo;m proud to tell you that a new version of <a href="https://github.com/guedes/pgxn-utils">pgxn_utils</a> was released!</p>
<p>Now you can release a distribution to <a href="https://pgxn.org">PGXN</a> in <strong>five steps</strong>!</p>
<p><strong>First</strong>, install it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gem install pgxn_utils
</span></span></code></pre></div><p><strong>Second</strong>, create your extension, optionally overwrite some defaults:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">mkdir <span class="nv">$HOME</span>/extensions
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> <span class="nv">$HOME</span>/extensions
</span></span><span class="line"><span class="cl">pgxn_utils skeleton my_extension --maintainer <span class="s2">&#34;Dickson S. Guedes&#34;</span>
</span></span></code></pre></div><p><strong>Third</strong>, code!</p>
<p><strong>Fourth</strong>, bundle it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">pgxn_utils bundle my_extension
</span></span></span><span class="line"><span class="cl"><span class="go">Extension generated at: /home/guedes/extensions/my_extension-0.0.1.zip
</span></span></span></code></pre></div><p><strong>Fifth</strong>, release it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">pgxn_utils release my_extension-0.0.1.zip
</span></span></span><span class="line"><span class="cl"><span class="go">Enter your PGXN username: guedes
</span></span></span><span class="line"><span class="cl"><span class="go">Enter your PGXN password: ******
</span></span></span><span class="line"><span class="cl"><span class="go">Trying to release my_cool_extension-0.0.1.zip ... released successfully!
</span></span></span><span class="line"><span class="cl"><span class="go">Visit: https://manager.pgxn.org/distributions/my_cool_extension/0.0.1
</span></span></span></code></pre></div><p>Ah, you can export <code>PGXN_USER</code> and <code>PGXN_PASSWORD</code> if you are tired to type
your username and password every time.</p>
<p><a href="https://github.com/guedes/pgxn-utils">Check this out!</a>.</p>
]]></content></entry><entry><id>https://blog.pgxn.org/post/5118152273</id><title type="html">New release for the PGXN client</title><link rel="alternate" type="text/html" href="https://blog.pgxn.org/2011/new-release-for-the-pgxn-client/"/><updated>2026-10-07T16:13:48Z</updated><published>2011-05-02T00:59:37Z</published><author><name>Daniele Varrazzo</name></author><category scheme="https://blog.pgxn.org/tags" term="pgxn" label="PGXN"/><category scheme="https://blog.pgxn.org/tags" term="client" label="Client"/><category scheme="https://blog.pgxn.org/tags" term="release" label="Release"/><category scheme="https://blog.pgxn.org/tags" term="uninstall" label="Uninstall"/><category scheme="https://blog.pgxn.org/tags" term="drop" label="Drop"/><category scheme="https://blog.pgxn.org/tags" term="sudo" label="sudo"/><summary type="html"><![CDATA[<p>During the last days I&rsquo;ve done some lightweight hacking on the PGXN client,
and I&rsquo;ve just released the last package on PyPI, with the still very shy
version number of 0.1a4.</p>
<p>First change: the package name. The package is now called <code>pgxnclient</code>,
without the point. As <a href="https://blog.pgxn.org/post/5026314153/writing-a-client-for-pgxn#dsq-comments">Marti has commented</a>, the point in the name could
create problems to some distributions which may have needed to munge it into a
shape fitting their naming constraints. So, in order to install the last
release you will need the command:</p>]]></summary><content type="html" xml:base="https://blog.pgxn.org/" xml:space="preserve"><![CDATA[<p>During the last days I&rsquo;ve done some lightweight hacking on the PGXN client,
and I&rsquo;ve just released the last package on PyPI, with the still very shy
version number of 0.1a4.</p>
<p>First change: the package name. The package is now called <code>pgxnclient</code>,
without the point. As <a href="https://blog.pgxn.org/post/5026314153/writing-a-client-for-pgxn#dsq-comments">Marti has commented</a>, the point in the name could
create problems to some distributions which may have needed to munge it into a
shape fitting their naming constraints. So, in order to install the last
release you will need the command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> easy_install pgxnclient
</span></span></code></pre></div><p>The name of the entry point script is still <code>pgxn</code> and it shouldn&rsquo;t change.</p>
<p>One of the new features in this release is the addition of commands <code>drop</code>, to
remove the the extensions of a distribution from a database (opposite of the
<code>load</code> command) and <code>uninstall</code>, to remove installed files from the system
(opposite of <code>install</code>).</p>
<p>Another change is the ability to work on a local zip or directory instead of
using the API to get metadata and package from PGXN. The main goal of this
feature is to help the packagers to test their packages with the client before
submission, verifying that the data uploaded can be used in an automatized
way.</p>
<p>A third change is in the <code>install</code> command: it previously required to be run
as root if, as likely, the PostgreSQL directories are system ones. I was
feeling this need slightly scary as download and build phases would have been
run as root too, so now <code>sudo</code> is invoked by the script only when installing,
with command line options allowing its customization.</p>
<p>What I feel mostly missing now is documentation: I know that adding it will
force a big review of the code, adding missing comments, add tests to enforce
what documented&hellip; so it&rsquo;s something I will start tomorrow. Once documentation
and code have converged there will also be a more sound basis to discuss about
the client features. And dare version 0.2, maybe :)</p>
<p>Thanks everybody for the feedback. If you want to have a chat about the client
or PGXN in general, the best place is <a href="https://groups.google.com/group/pgxn-users">the PGXN group</a>. See you there!</p>
]]></content></entry></feed>