summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2022-02-06 01:38:34 +0700
committerShulhan <ms@kilabit.info>2022-02-06 01:38:34 +0700
commitf7f2230c7794c0cb110ff94d4c502661e171d85c (patch)
treefe13e048eb01c754b90fe0b2835b695526bfa43a
parent39a9ce9de55ca61402a0fae523e5ce409dd213ee (diff)
downloadpakakeh.go-f7f2230c7794c0cb110ff94d4c502661e171d85c.tar.xz
cmd/xtrk: command line interface to uncompress and/or unarchive file
xtrk accept single file to uncompress and/or archived into a directory output dir". If directory output "dir" is not defined, it will be set to current directoy. The compression and archive format is detected automatically based on the following file input extension: * .bz2: decompress using bzip2. * .gz: decompress using gzip. * .tar: unarchive using tar. * .zip: unarchive using zip. * .tar.bz2: decompress using bzip2 and unarchive using tar. * .tar.gz: decompresss using gzip and unarchive using tar. The input file will be removed on success.
-rw-r--r--CHANGELOG.adoc26
-rw-r--r--_doc/CHANGELOG.html173
-rw-r--r--cmd/xtrk/main.go90
3 files changed, 232 insertions, 57 deletions
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index 36e20c0d..1490194a 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -5,6 +5,32 @@ Shulhan <ms@kilabit.info>
This library is released every month, usually at the first week of month.
+== share v0.35.0 (2022-0x-xx)
+
+=== New features
+
+* cmd/xtrk: command line interface to uncompress and/or unarchive file
++
+--
+xtrk accept single file to uncompress and/or archived into a directory
+output dir".
+If directory output "dir" is not defined, it will be set to current
+directoy.
+
+The compression and archive format is detected automatically based on the
+following file input extension:
+
+* .bz2: decompress using bzip2.
+* .gz: decompress using gzip.
+* .tar: unarchive using tar.
+* .zip: unarchive using zip.
+* .tar.bz2: decompress using bzip2 and unarchive using tar.
+* .tar.gz: decompresss using gzip and unarchive using tar.
+
+The input file will be removed on success.
+--
+
+
== share v0.34.0 (2022-02-05)
=== Breaking changes
diff --git a/_doc/CHANGELOG.html b/_doc/CHANGELOG.html
index 8adb82df..b5bef4d8 100644
--- a/_doc/CHANGELOG.html
+++ b/_doc/CHANGELOG.html
@@ -236,17 +236,22 @@ dd {
<div id="toc" class="toc">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
+<li><a href="#_share_v0_35_0_2022_0x_xx">share v0.35.0 (2022-0x-xx)</a>
+<ul class="sectlevel2">
+<li><a href="#_new_features">New features</a></li>
+</ul>
+</li>
<li><a href="#_share_v0_34_0_2022_02_05">share v0.34.0 (2022-02-05)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes">Breaking changes</a></li>
-<li><a href="#_new_features">New features</a></li>
+<li><a href="#_new_features_1">New features</a></li>
<li><a href="#_enhancements">Enhancements</a></li>
<li><a href="#_chores">Chores</a></li>
</ul>
</li>
<li><a href="#_share_v0_33_0_2022_01_09">share v0.33.0 (2022-01-09)</a>
<ul class="sectlevel2">
-<li><a href="#_new_features_1">New features</a></li>
+<li><a href="#_new_features_2">New features</a></li>
<li><a href="#_breaking_changes_1">Breaking changes</a></li>
<li><a href="#_bug_fixes">Bug fixes</a></li>
<li><a href="#_enhancements_1">Enhancements</a></li>
@@ -256,7 +261,7 @@ dd {
<li><a href="#_share_v0_32_0_2021_12_03">share v0.32.0 (2021-12-03)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_2">Breaking changes</a></li>
-<li><a href="#_new_features_2">New features</a></li>
+<li><a href="#_new_features_3">New features</a></li>
<li><a href="#_bug_fixes_1">Bug fixes</a></li>
<li><a href="#_enhancements_2">Enhancements</a></li>
</ul>
@@ -264,7 +269,7 @@ dd {
<li><a href="#_share_v0_31_0_2021_11_04">share v0.31.0 (2021-11-04)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_3">Breaking changes</a></li>
-<li><a href="#_new_features_3">New features</a></li>
+<li><a href="#_new_features_4">New features</a></li>
<li><a href="#_bug_fixes_2">Bug fixes</a></li>
<li><a href="#_chores_2">Chores</a></li>
</ul>
@@ -272,7 +277,7 @@ dd {
<li><a href="#_share_v0_30_0_2021_10_04">share v0.30.0 (2021-10-04)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_4">Breaking changes</a></li>
-<li><a href="#_new_features_4">New features</a></li>
+<li><a href="#_new_features_5">New features</a></li>
<li><a href="#_bug_fixes_3">Bug fixes</a></li>
<li><a href="#_enhancements_3">Enhancements</a></li>
<li><a href="#_chores_3">Chores</a></li>
@@ -303,14 +308,14 @@ dd {
<li><a href="#_share_v0_27_0_2021_06_05">share v0.27.0 (2021-06-05)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_7">Breaking changes</a></li>
-<li><a href="#_new_features_5">New features</a></li>
+<li><a href="#_new_features_6">New features</a></li>
<li><a href="#_enhancements_7">Enhancements</a></li>
<li><a href="#_bug_fixes_5">Bug fixes</a></li>
</ul>
</li>
<li><a href="#_share_v0_26_0_2021_05_03">share v0.26.0 (2021-05-03)</a>
<ul class="sectlevel2">
-<li><a href="#_new_features_6">New features</a></li>
+<li><a href="#_new_features_7">New features</a></li>
<li><a href="#_enhancements_8">Enhancements</a></li>
<li><a href="#_chores_5">Chores</a></li>
</ul>
@@ -319,14 +324,14 @@ dd {
<li><a href="#_share_v0_25_0_2021_04_06">share v0.25.0 (2021-04-06)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_8">Breaking changes</a></li>
-<li><a href="#_new_features_7">New features</a></li>
+<li><a href="#_new_features_8">New features</a></li>
<li><a href="#_enhancements_9">Enhancements</a></li>
</ul>
</li>
<li><a href="#_share_v0_24_0_2021_03_06">share v0.24.0 (2021-03-06)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_9">Breaking changes</a></li>
-<li><a href="#_new_features_8">New features</a></li>
+<li><a href="#_new_features_9">New features</a></li>
<li><a href="#_enhancements_10">Enhancements</a></li>
<li><a href="#_bug_fixes_6">Bug fixes</a></li>
</ul>
@@ -334,7 +339,7 @@ dd {
<li><a href="#_share_v0_23_0_2021_02_05">share v0.23.0 (2021-02-05)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_10">Breaking changes</a></li>
-<li><a href="#_new_features_9">New features</a></li>
+<li><a href="#_new_features_10">New features</a></li>
<li><a href="#_enhancements_11">Enhancements</a></li>
<li><a href="#_bug_fixes_7">Bug fixes</a></li>
</ul>
@@ -342,14 +347,14 @@ dd {
<li><a href="#_share_v0_22_0_2021_01_06">share v0.22.0 (2021-01-06)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_11">Breaking changes</a></li>
-<li><a href="#_new_features_10">New features</a></li>
+<li><a href="#_new_features_11">New features</a></li>
<li><a href="#_enhancements_12">Enhancements</a></li>
</ul>
</li>
<li><a href="#_share_v0_21_0_2020_12_06">share v0.21.0 (2020-12-06)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_12">Breaking changes</a></li>
-<li><a href="#_new_features_11">New features</a></li>
+<li><a href="#_new_features_12">New features</a></li>
<li><a href="#_bug_fixes_8">Bug fixes</a></li>
<li><a href="#_enhancements_13">Enhancements</a></li>
<li><a href="#_chores_6">Chores</a></li>
@@ -364,14 +369,14 @@ dd {
</li>
<li><a href="#_share_v0_20_0_2020_10_05">share v0.20.0 (2020-10-05)</a>
<ul class="sectlevel2">
-<li><a href="#_new_features_12">New features</a></li>
+<li><a href="#_new_features_13">New features</a></li>
<li><a href="#_enhancements_15">Enhancements</a></li>
</ul>
</li>
<li><a href="#_share_v0_19_0_2020_09_08">share v0.19.0 (2020-09-08)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_13">Breaking changes</a></li>
-<li><a href="#_new_features_13">New features</a></li>
+<li><a href="#_new_features_14">New features</a></li>
<li><a href="#_bug_fixes_10">Bug fixes</a></li>
</ul>
</li>
@@ -393,14 +398,14 @@ dd {
<ul class="sectlevel2">
<li><a href="#_breaking_changes_16">Breaking changes</a></li>
<li><a href="#_bug_fixes_13">Bug fixes</a></li>
-<li><a href="#_new_features_14">New features</a></li>
+<li><a href="#_new_features_15">New features</a></li>
<li><a href="#_enhancements_18">Enhancements</a></li>
</ul>
</li>
<li><a href="#_share_v0_15_0_2020_05_04">share v0.15.0 (2020-05-04)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_17">Breaking changes</a></li>
-<li><a href="#_new_features_15">New features</a></li>
+<li><a href="#_new_features_16">New features</a></li>
<li><a href="#_enhancements_19">Enhancements</a></li>
<li><a href="#_bug_fixes_14">Bug fixes</a></li>
</ul>
@@ -408,7 +413,7 @@ dd {
<li><a href="#_share_v0_14_0_2020_04_03">share v0.14.0 (2020-04-03)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_18">Breaking changes</a></li>
-<li><a href="#_new_features_16">New features</a></li>
+<li><a href="#_new_features_17">New features</a></li>
<li><a href="#_enhancements_20">Enhancements</a></li>
<li><a href="#_bug_fixes_15">Bug fixes</a></li>
</ul>
@@ -416,7 +421,7 @@ dd {
<li><a href="#_share_v0_13_0_2020_03_11">share v0.13.0 (2020-03-11)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_19">Breaking changes</a></li>
-<li><a href="#_new_features_17">New features</a></li>
+<li><a href="#_new_features_18">New features</a></li>
<li><a href="#_enhancements_21">Enhancements</a></li>
<li><a href="#_bug_fixes_16">Bug Fixes</a></li>
</ul>
@@ -424,7 +429,7 @@ dd {
<li><a href="#_share_v0_12_0_2020_02_13">share v0.12.0 (2020-02-13)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_20">Breaking changes</a></li>
-<li><a href="#_new_features_18">New features</a></li>
+<li><a href="#_new_features_19">New features</a></li>
<li><a href="#_enhancements_22">Enhancements</a></li>
<li><a href="#_bug_fixes_17">Bug fixes</a></li>
</ul>
@@ -432,7 +437,7 @@ dd {
<li><a href="#_share_v0_11_0_2019_12_26">share v0.11.0 (2019-12-26)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_21">Breaking changes</a></li>
-<li><a href="#_new_features_19">New features</a></li>
+<li><a href="#_new_features_20">New features</a></li>
<li><a href="#_enhancements_23">Enhancements</a></li>
<li><a href="#_bug_fixes_18">Bug fixes</a></li>
</ul>
@@ -450,7 +455,7 @@ dd {
</li>
<li><a href="#_share_v0_10_0_2019_11_05">share v0.10.0 (2019-11-05)</a>
<ul class="sectlevel2">
-<li><a href="#_new_features_20">New Features</a></li>
+<li><a href="#_new_features_21">New Features</a></li>
<li><a href="#_breaking_changes_22">Breaking Changes</a></li>
<li><a href="#_enhancements_25">Enhancements</a></li>
<li><a href="#_bug_fixes_21">Bug Fixes</a></li>
@@ -458,7 +463,7 @@ dd {
</li>
<li><a href="#_share_v0_9_0_2019_10_08">share v0.9.0 (2019-10-08)</a>
<ul class="sectlevel2">
-<li><a href="#_new_features_21">New Features</a></li>
+<li><a href="#_new_features_22">New Features</a></li>
<li><a href="#_breaking_changes_23">Breaking Changes</a></li>
<li><a href="#_bug_fixes_22">Bug Fixes</a></li>
<li><a href="#_enhancements_26">Enhancements</a></li>
@@ -477,14 +482,14 @@ dd {
<li><a href="#_share_v0_8_0_2019_07_09">share v0.8.0 (2019-07-09)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_24">Breaking changes</a></li>
-<li><a href="#_new_features_22">New Features</a></li>
+<li><a href="#_new_features_23">New Features</a></li>
<li><a href="#_enhancements_29">Enhancements</a></li>
</ul>
</li>
<li><a href="#_share_v0_7_0_2019_06_14">share v0.7.0 (2019-06-14)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_25">Breaking Changes</a></li>
-<li><a href="#_new_features_23">New Features</a></li>
+<li><a href="#_new_features_24">New Features</a></li>
<li><a href="#_enhancements_30">Enhancements</a></li>
<li><a href="#_bug_fixes_23">Bug Fixes</a></li>
</ul>
@@ -493,20 +498,20 @@ dd {
<li><a href="#_share_v0_6_0_2019_05_07">share v0.6.0 (2019-05-07)</a>
<ul class="sectlevel2">
<li><a href="#_breaking_changes_26">Breaking Changes</a></li>
-<li><a href="#_new_features_24">New Features</a></li>
+<li><a href="#_new_features_25">New Features</a></li>
<li><a href="#_bug_fixes_24">Bug Fixes</a></li>
<li><a href="#_documentation">Documentation</a></li>
</ul>
</li>
<li><a href="#_share_v0_5_0_2019_04_02">share v0.5.0 (2019-04-02)</a>
<ul class="sectlevel2">
-<li><a href="#_new_features_25">New Features</a></li>
+<li><a href="#_new_features_26">New Features</a></li>
<li><a href="#_enhancements_31">Enhancements</a></li>
</ul>
</li>
<li><a href="#_share_v0_4_0_2019_03_01">share v0.4.0 (2019-03-01)</a>
<ul class="sectlevel2">
-<li><a href="#_new_features_26">New Features</a></li>
+<li><a href="#_new_features_27">New Features</a></li>
<li><a href="#_enhancements_32">Enhancements</a></li>
<li><a href="#_fixes">Fixes</a></li>
</ul>
@@ -520,7 +525,7 @@ dd {
</li>
<li><a href="#_share_v0_2_0_2019_01_02">share v0.2.0 (2019-01-02)</a>
<ul class="sectlevel2">
-<li><a href="#_new_features_27">New Features</a></li>
+<li><a href="#_new_features_28">New Features</a></li>
<li><a href="#_enhancements_34">Enhancements</a></li>
</ul>
</li>
@@ -538,6 +543,60 @@ dd {
</div>
</div>
<div class="sect1">
+<h2 id="_share_v0_35_0_2022_0x_xx">share v0.35.0 (2022-0x-xx)</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_new_features">New features</h3>
+<div class="ulist">
+<ul>
+<li>
+<p>cmd/xtrk: command line interface to uncompress and/or unarchive file</p>
+<div class="openblock">
+<div class="content">
+<div class="paragraph">
+<p>xtrk accept single file to uncompress and/or archived into a directory
+output dir".
+If directory output "dir" is not defined, it will be set to current
+directoy.</p>
+</div>
+<div class="paragraph">
+<p>The compression and archive format is detected automatically based on the
+following file input extension:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>.bz2: decompress using bzip2.</p>
+</li>
+<li>
+<p>.gz: decompress using gzip.</p>
+</li>
+<li>
+<p>.tar: unarchive using tar.</p>
+</li>
+<li>
+<p>.zip: unarchive using zip.</p>
+</li>
+<li>
+<p>.tar.bz2: decompress using bzip2 and unarchive using tar.</p>
+</li>
+<li>
+<p>.tar.gz: decompresss using gzip and unarchive using tar.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The input file will be removed on success.</p>
+</div>
+</div>
+</div>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
<h2 id="_share_v0_34_0_2022_02_05">share v0.34.0 (2022-02-05)</h2>
<div class="sectionbody">
<div class="sect2">
@@ -562,7 +621,7 @@ the name of table where the state of migration will be saved.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features">New features</h3>
+<h3 id="_new_features_1">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -681,7 +740,7 @@ intended "share", and sorry if its too many breaking changes.</p>
See you again next year.</p>
</div>
<div class="sect2">
-<h3 id="_new_features_1">New features</h3>
+<h3 id="_new_features_2">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -1159,7 +1218,7 @@ server.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_2">New features</h3>
+<h3 id="_new_features_3">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -1460,7 +1519,7 @@ re-adding the same file every time we run local tests.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_3">New features</h3>
+<h3 id="_new_features_4">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -1660,7 +1719,7 @@ file content.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_4">New features</h3>
+<h3 id="_new_features_5">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -2490,7 +2549,7 @@ ArrayValues</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_5">New features</h3>
+<h3 id="_new_features_6">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -2577,7 +2636,7 @@ JavaScript file is "application/javascript".</p>
<h2 id="_share_v0_26_0_2021_05_03">share v0.26.0 (2021-05-03)</h2>
<div class="sectionbody">
<div class="sect2">
-<h3 id="_new_features_6">New features</h3>
+<h3 id="_new_features_7">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -2765,7 +2824,7 @@ become redundant.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_7">New features</h3>
+<h3 id="_new_features_8">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -2920,7 +2979,7 @@ EndpointRequest.Error field.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_8">New features</h3>
+<h3 id="_new_features_9">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -3209,7 +3268,7 @@ predictable.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_9">New features</h3>
+<h3 id="_new_features_10">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -3357,7 +3416,7 @@ file.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_10">New features</h3>
+<h3 id="_new_features_11">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -3411,7 +3470,7 @@ which describe which field have unmatched value.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_11">New features</h3>
+<h3 id="_new_features_12">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -3565,7 +3624,7 @@ position, and then call Close to reset the internal state back to zero.</p>
<h2 id="_share_v0_20_0_2020_10_05">share v0.20.0 (2020-10-05)</h2>
<div class="sectionbody">
<div class="sect2">
-<h3 id="_new_features_12">New features</h3>
+<h3 id="_new_features_13">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -3651,7 +3710,7 @@ Messages.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_13">New features</h3>
+<h3 id="_new_features_14">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -3912,7 +3971,7 @@ become unneeded, so we remove them.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_14">New features</h3>
+<h3 id="_new_features_15">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -4039,7 +4098,7 @@ fis, err := root.Readdir(0)</pre>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_15">New features</h3>
+<h3 id="_new_features_16">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -4125,7 +4184,7 @@ will be handled automatically based on value on field Method.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_16">New features</h3>
+<h3 id="_new_features_17">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -4212,7 +4271,7 @@ word.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_17">New features</h3>
+<h3 id="_new_features_18">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -4284,7 +4343,7 @@ word.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_18">New features</h3>
+<h3 id="_new_features_19">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -4335,7 +4394,7 @@ word.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_19">New features</h3>
+<h3 id="_new_features_20">New features</h3>
<div class="ulist">
<ul>
<li>
@@ -4497,7 +4556,7 @@ word.</p>
<h2 id="_share_v0_10_0_2019_11_05">share v0.10.0 (2019-11-05)</h2>
<div class="sectionbody">
<div class="sect2">
-<h3 id="_new_features_20">New Features</h3>
+<h3 id="_new_features_21">New Features</h3>
<div class="ulist">
<ul>
<li>
@@ -4578,7 +4637,7 @@ word.</p>
<h2 id="_share_v0_9_0_2019_10_08">share v0.9.0 (2019-10-08)</h2>
<div class="sectionbody">
<div class="sect2">
-<h3 id="_new_features_21">New Features</h3>
+<h3 id="_new_features_22">New Features</h3>
<div class="ulist">
<ul>
<li>
@@ -4793,7 +4852,7 @@ package to <code>ascii</code> package.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_22">New Features</h3>
+<h3 id="_new_features_23">New Features</h3>
<div class="ulist">
<ul>
<li>
@@ -4841,7 +4900,7 @@ simple API.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_23">New Features</h3>
+<h3 id="_new_features_24">New Features</h3>
<div class="ulist">
<ul>
<li>
@@ -5040,7 +5099,7 @@ removing the server handler.</p>
</div>
</div>
<div class="sect2">
-<h3 id="_new_features_24">New Features</h3>
+<h3 id="_new_features_25">New Features</h3>
<div class="ulist">
<ul>
<li>
@@ -5176,7 +5235,7 @@ server and client API to make it easy and extensible. The websocket is now
100% pass the autobahn testsuite (minus compression feature).</p>
</div>
<div class="sect2">
-<h3 id="_new_features_25">New Features</h3>
+<h3 id="_new_features_26">New Features</h3>
<div class="ulist">
<ul>
<li>
@@ -5243,7 +5302,7 @@ testsuite</p>
<h2 id="_share_v0_4_0_2019_03_01">share v0.4.0 (2019-03-01)</h2>
<div class="sectionbody">
<div class="sect2">
-<h3 id="_new_features_26">New Features</h3>
+<h3 id="_new_features_27">New Features</h3>
<div class="ulist">
<ul>
<li>
@@ -5495,7 +5554,7 @@ testsuite</p>
<h2 id="_share_v0_2_0_2019_01_02">share v0.2.0 (2019-01-02)</h2>
<div class="sectionbody">
<div class="sect2">
-<h3 id="_new_features_27">New Features</h3>
+<h3 id="_new_features_28">New Features</h3>
<div class="ulist">
<ul>
<li>
@@ -5547,7 +5606,7 @@ and several libraries.</p>
</div>
<div id="footer">
<div id="footer-text">
-Last updated 2022-02-05 14:01:47 +0700
+Last updated 2022-02-06 01:37:08 +0700
</div>
</div>
</div>
diff --git a/cmd/xtrk/main.go b/cmd/xtrk/main.go
new file mode 100644
index 00000000..10e8ff3b
--- /dev/null
+++ b/cmd/xtrk/main.go
@@ -0,0 +1,90 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "os"
+
+ libos "github.com/shuLhan/share/lib/os"
+)
+
+func main() {
+ log.SetPrefix("xtrk: ")
+
+ log.SetFlags(0)
+
+ flag.Parse()
+
+ var (
+ args = flag.Args()
+ fileIn string
+ dirOut string
+ err error
+ )
+
+ switch len(args) {
+ case 0:
+ usage()
+ os.Exit(1)
+
+ case 1:
+ fileIn = args[0]
+
+ case 2:
+ fileIn = args[0]
+ dirOut = args[1]
+ }
+
+ if len(dirOut) == 0 {
+ dirOut, err = os.Getwd()
+ if err != nil {
+ log.Fatal(err)
+ }
+ }
+
+ err = libos.Extract(fileIn, dirOut)
+ if err != nil {
+ log.Fatal(err)
+ }
+}
+
+func usage() {
+ fmt.Printf(`
+= xtrk
+
+xtrk is command line interface to uncompress and/or unarchive a file.
+
+== Synopsis
+
+ xtrk <file> [dir]
+
+== Description
+
+xtrk accept single file to uncompress and/or archived into a directory output
+"dir".
+If directory output "dir" is not defined, it will be set to current directoy.
+
+The compression and archive format is detected automatically based on the
+following file input extension:
+
+* .bz2: decompress using bzip2.
+* .gz: decompress using gzip.
+* .tar: unarchive using tar.
+* .zip: unarchive using zip.
+* .tar.bz2: decompress using bzip2 and unarchive using tar.
+* .tar.gz: decompresss using gzip and unarchive using tar.
+
+The input file will be removed on success.
+
+== Examples
+
+ $ xtrk file.gz
+
+Extract file.gz into current directory.
+
+ $ xtrk file.tar.bz2 /tmp
+
+Extract file.tar.bz2 into directory /tmp.
+`)
+}