mirror of
https://codeberg.org/scip/tablizer.git
synced 2025-12-18 13:01:11 +01:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8fc831537e | |||
| 61f6e05515 | |||
| f4e8e92a6e | |||
| 54babec276 | |||
| f32ac18cdd | |||
| 4fc3beec31 | |||
| 2d8127dd67 | |||
| b8059eb676 | |||
|
|
febb0b13d7 | ||
|
|
cfc02f01a8 |
42
Makefile
42
Makefile
@@ -1,18 +1,46 @@
|
|||||||
|
|
||||||
|
# Copyright © 2022 Thomas von Dein
|
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# no need to modify anything below
|
# no need to modify anything below
|
||||||
tool = tablizer
|
tool = tablizer
|
||||||
version = $(shell egrep "^var version = " cmd/root.go | cut -d'=' -f2 | cut -d'"' -f 2)
|
version = $(shell egrep "^var version = " cmd/root.go | cut -d'=' -f2 | cut -d'"' -f 2)
|
||||||
archs = android darwin freebsd linux netbsd openbsd windows
|
archs = android darwin freebsd linux netbsd openbsd windows
|
||||||
|
PREFIX = /usr/local
|
||||||
|
UID = root
|
||||||
|
GID = 0
|
||||||
|
|
||||||
all:
|
all: buildlocal man
|
||||||
@echo "Type 'make install' to install $(tool)"
|
|
||||||
|
|
||||||
install:
|
man:
|
||||||
install -m 755 -d $(bindir)
|
pod2man -c "User Commands" -r 1 -s 1 $(tool).pod > $(tool).1
|
||||||
install -m 755 -d $(linkdir)
|
|
||||||
install -m 755 $(tool) $(bindir)/$(tool)-$(version)
|
buildlocal:
|
||||||
ln -sf $(bindir)/$(tool)-$(version) $(linkdir)/$(tool)
|
go build
|
||||||
|
|
||||||
release:
|
release:
|
||||||
mkdir -p releases
|
mkdir -p releases
|
||||||
$(foreach arch,$(archs), GOOS=$(arch) GOARCH=amd64 go build -x -o releases/$(tool)-$(arch)-amd64-$(version); sha256sum releases/$(tool)-$(arch)-amd64-$(version) | cut -d' ' -f1 > releases/$(tool)-$(arch)-amd64-$(version).sha256sum;)
|
$(foreach arch,$(archs), GOOS=$(arch) GOARCH=amd64 go build -x -o releases/$(tool)-$(arch)-amd64-$(version); sha256sum releases/$(tool)-$(arch)-amd64-$(version) | cut -d' ' -f1 > releases/$(tool)-$(arch)-amd64-$(version).sha256sum;)
|
||||||
|
|
||||||
|
install: buildlocal
|
||||||
|
install -d -o $(UID) -g $(GID) $(PREFIX)/bin
|
||||||
|
install -d -o $(UID) -g $(GID) $(PREFIX)/man/man1
|
||||||
|
install -o $(UID) -g $(GID) -m 555 $(tool) $(PREFIX)/sbin/
|
||||||
|
install -o $(UID) -g $(GID) -m 444 $(tool).1 $(PREFIX)/man/man1/
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(tool) $(tool).1
|
||||||
|
|||||||
39
README.md
39
README.md
@@ -68,12 +68,45 @@ repldepl-7bcd8d5b64-q2bf4 1/1 Running 1 (69m ago) 5h26m
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Download the latest release file for your architecture and put it into
|
There are multiple ways to install **tablizer**:
|
||||||
a directory within your `$PATH`.
|
|
||||||
|
- Go to the [latest release page](https://github.com/muesli/mango/releases/latest),
|
||||||
|
locate the binary for your operating system and platform.
|
||||||
|
|
||||||
|
Download it and put it into some directory within your `$PATH` variable.
|
||||||
|
|
||||||
|
- The release page also contains a tarball for every supported platform. Unpack it
|
||||||
|
to some temporary directory, extract it and execute the following command inside:
|
||||||
|
```
|
||||||
|
sudo make install
|
||||||
|
```
|
||||||
|
|
||||||
|
- You can also install from source. Issue the following commands in your shell:
|
||||||
|
```
|
||||||
|
git clone https://github.com/TLINDEN/tablizer.git
|
||||||
|
cd tablizer
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
```
|
||||||
|
|
||||||
|
If you do not find a binary release for your platform, please don't
|
||||||
|
hesitate to ask me about it, I'll add it.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
The documentation is provided as a unix man-page. It will be
|
||||||
|
automatically installed if you install from source. However, you can
|
||||||
|
read the man-page online:
|
||||||
|
|
||||||
|
https://github.com/TLINDEN/tablizer/blob/main/tablizer.pod
|
||||||
|
|
||||||
|
Or if you cloned the repository you can read it this way (perl needs
|
||||||
|
to be installed though): `perldoc tablizer.pod`.
|
||||||
|
|
||||||
|
|
||||||
## Getting help
|
## Getting help
|
||||||
|
|
||||||
Although I'm happy to hear from udpxd users in private email,
|
Although I'm happy to hear from tablizer users in private email,
|
||||||
that's the best way for me to forget to do something.
|
that's the best way for me to forget to do something.
|
||||||
|
|
||||||
In order to report a bug, unexpected behavior, feature requests
|
In order to report a bug, unexpected behavior, feature requests
|
||||||
|
|||||||
2
TODO
2
TODO
@@ -2,3 +2,5 @@ Add a mode like FreeBSD stat(1):
|
|||||||
|
|
||||||
stat -s dead.letter
|
stat -s dead.letter
|
||||||
st_dev=170671546954750497 st_ino=159667 st_mode=0100644 st_nlink=1 st_uid=1001 st_gid=1001 st_rdev=18446744073709551615 st_size=573 st_atime=1661994007 st_mtime=1661961878 st_ctime=1661961878 st_birthtime=1658394900 st_blksize=4096 st_blocks=3 st_flags=2048
|
st_dev=170671546954750497 st_ino=159667 st_mode=0100644 st_nlink=1 st_uid=1001 st_gid=1001 st_rdev=18446744073709551615 st_size=573 st_atime=1661994007 st_mtime=1661961878 st_ctime=1661961878 st_birthtime=1658394900 st_blksize=4096 st_blocks=3 st_flags=2048
|
||||||
|
|
||||||
|
Add reasoning about non-csv output of kubectl
|
||||||
|
|||||||
@@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
Copyright © 2022 Thomas von Dein
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
Copyright © 2022 Thomas von Dein
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
79
cmd/processinput.go
Normal file
79
cmd/processinput.go
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
Copyright © 2022 Thomas von Dein
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"github.com/alecthomas/repr"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func process(args []string) error {
|
||||||
|
var pattern string
|
||||||
|
havefiles := false
|
||||||
|
|
||||||
|
if len(Columns) > 0 {
|
||||||
|
for _, use := range strings.Split(Columns, ",") {
|
||||||
|
usenum, err := strconv.Atoi(use)
|
||||||
|
if err != nil {
|
||||||
|
die(err)
|
||||||
|
}
|
||||||
|
UseColumns = append(UseColumns, usenum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(args) > 0 {
|
||||||
|
if _, err := os.Stat(args[0]); err != nil {
|
||||||
|
pattern = args[0]
|
||||||
|
args = args[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(args) > 0 {
|
||||||
|
for _, file := range args {
|
||||||
|
fd, err := os.OpenFile(file, os.O_RDONLY, 0755)
|
||||||
|
if err != nil {
|
||||||
|
die(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
data := parseFile(fd, pattern)
|
||||||
|
if Debug {
|
||||||
|
repr.Print(data)
|
||||||
|
}
|
||||||
|
printTable(data)
|
||||||
|
}
|
||||||
|
havefiles = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !havefiles {
|
||||||
|
stat, _ := os.Stdin.Stat()
|
||||||
|
if (stat.Mode() & os.ModeCharDevice) == 0 {
|
||||||
|
data := parseFile(os.Stdin, pattern)
|
||||||
|
if Debug {
|
||||||
|
repr.Print(data)
|
||||||
|
}
|
||||||
|
printTable(data)
|
||||||
|
} else {
|
||||||
|
return errors.New("No file specified and nothing to read on stdin!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
53
cmd/root.go
53
cmd/root.go
@@ -18,68 +18,23 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/alecthomas/repr"
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var version = "v1.0.0"
|
var version = "v1.0.1"
|
||||||
|
|
||||||
var rootCmd = &cobra.Command{
|
var rootCmd = &cobra.Command{
|
||||||
Use: "tablizer [regex] [file, ...]",
|
Use: "tablizer [regex] [file, ...]",
|
||||||
Short: "[Re-]tabularize tabular data",
|
Short: "[Re-]tabularize tabular data",
|
||||||
Long: `Manipulate tabular output of other programs`,
|
Long: `Manipulate tabular output of other programs`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
if Version {
|
if Version {
|
||||||
fmt.Printf("This is tablizer version %s\n", version)
|
fmt.Printf("This is tablizer version %s\n", version)
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var pattern string
|
return process(args)
|
||||||
havefiles := false
|
|
||||||
|
|
||||||
if len(Columns) > 0 {
|
|
||||||
for _, use := range strings.Split(Columns, ",") {
|
|
||||||
usenum, err := strconv.Atoi(use)
|
|
||||||
if err != nil {
|
|
||||||
die(err)
|
|
||||||
}
|
|
||||||
UseColumns = append(UseColumns, usenum)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(args) > 0 {
|
|
||||||
if _, err := os.Stat(args[0]); err != nil {
|
|
||||||
pattern = args[0]
|
|
||||||
args = args[1:]
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(args) > 0 {
|
|
||||||
for _, file := range args {
|
|
||||||
fd, err := os.OpenFile(file, os.O_RDONLY, 0755)
|
|
||||||
if err != nil {
|
|
||||||
die(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
data := parseFile(fd, pattern)
|
|
||||||
if Debug {
|
|
||||||
repr.Print(data)
|
|
||||||
}
|
|
||||||
printTable(data)
|
|
||||||
}
|
|
||||||
havefiles = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !havefiles {
|
|
||||||
data := parseFile(os.Stdin, pattern)
|
|
||||||
if Debug {
|
|
||||||
repr.Print(data)
|
|
||||||
}
|
|
||||||
printTable(data)
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
17
main.go
17
main.go
@@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
Copyright © 2022 Thomas von Dein
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
60
mkrel.sh
Executable file
60
mkrel.sh
Executable file
@@ -0,0 +1,60 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright © 2022 Thomas von Dein
|
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
# get list with: go tool dist list
|
||||||
|
DIST="darwin/amd64
|
||||||
|
freebsd/amd64
|
||||||
|
linux/amd64
|
||||||
|
netbsd/amd64
|
||||||
|
openbsd/amd64
|
||||||
|
windows/amd64"
|
||||||
|
|
||||||
|
tool="$1"
|
||||||
|
version="$2"
|
||||||
|
|
||||||
|
rm -rf releases
|
||||||
|
mkdir -p releases
|
||||||
|
|
||||||
|
|
||||||
|
for D in $DIST; do
|
||||||
|
os=${D/\/*/}
|
||||||
|
arch=${D/*\//}
|
||||||
|
binfile="releases/${tool}-${os}-${arch}-${version}"
|
||||||
|
tardir="${tool}-${os}-${arch}-${version}"
|
||||||
|
tarfile="releases/${tool}-${os}-${arch}-${version}.tar.gz"
|
||||||
|
set -x
|
||||||
|
GOOS=${os} GOARCH=${arch} go build -o ${binfile}
|
||||||
|
mkdir -p ${tardir}
|
||||||
|
cp ${binfile} README.md LICENSE ${tardir}/
|
||||||
|
echo 'tool = tablizer
|
||||||
|
PREFIX = /usr/local
|
||||||
|
UID = root
|
||||||
|
GID = 0
|
||||||
|
|
||||||
|
install:
|
||||||
|
install -d -o $(UID) -g $(GID) $(PREFIX)/bin
|
||||||
|
install -d -o $(UID) -g $(GID) $(PREFIX)/man/man1
|
||||||
|
install -o $(UID) -g $(GID) -m 555 $(tool) $(PREFIX)/sbin/
|
||||||
|
install -o $(UID) -g $(GID) -m 444 $(tool).1 $(PREFIX)/man/man1/' > ${tardir}/Makefile
|
||||||
|
tar cpzf ${tarfile} ${tardir}
|
||||||
|
sha256sum ${binfile} | cut -d' ' -f1 > ${binfile}.sha256
|
||||||
|
sha256sum ${tarfile} | cut -d' ' -f1 > ${tarfile}.sha256
|
||||||
|
rm -rf ${tardir}
|
||||||
|
set +x
|
||||||
|
done
|
||||||
|
|
||||||
122
tablizer.pod
Normal file
122
tablizer.pod
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
tablizer - Manipulate tabular output of other programs
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
tablizer [regex] [file, ...] [flags]
|
||||||
|
|
||||||
|
Flags:
|
||||||
|
-c, --columns string Only show the speficied columns (separated by ,)
|
||||||
|
-d, --debug Enable debugging
|
||||||
|
-x, --extended Enable extended output
|
||||||
|
-h, --help help for tablizer
|
||||||
|
-n, --no-numbering Disable header numbering
|
||||||
|
-s, --separator string Custom field separator
|
||||||
|
-v, --version Print program version
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Many programs generate tabular output. But sometimes you need to
|
||||||
|
post-process these tables, you may need to remove one or more columns
|
||||||
|
or you may want to filter for some pattern or you may need the output
|
||||||
|
in another program and need to parse it somehow. Standard unix tools
|
||||||
|
such as awk(1), grep(1) or column(1) may help, but sometimes it's a
|
||||||
|
tedious business.
|
||||||
|
|
||||||
|
Let's take the output of the tool kubectl. It contains cells with
|
||||||
|
withespace and they do not separate columns by TAB characters. This is
|
||||||
|
not easy to process.
|
||||||
|
|
||||||
|
You can use B<tablizer> to do these and more things.
|
||||||
|
|
||||||
|
B<tablizer> analyses the header fiels of a table, registers the column
|
||||||
|
positions of each header field and separates columns by those
|
||||||
|
positions.
|
||||||
|
|
||||||
|
Without any options it reads its input from C<STDIN>, but you can also
|
||||||
|
specify a file as a parameter. If you want to reduce the output by
|
||||||
|
some regular expression, just specify it as its first
|
||||||
|
parameters. Hence:
|
||||||
|
|
||||||
|
# read from STDIN
|
||||||
|
kubectl get pods | tablizer
|
||||||
|
|
||||||
|
# read a file
|
||||||
|
tablizer filename
|
||||||
|
|
||||||
|
# search for pattern in a file (works like grep)
|
||||||
|
tablizer regex filename
|
||||||
|
|
||||||
|
# search for pattern in STDIN
|
||||||
|
kubectl get pods | tablizer regex
|
||||||
|
|
||||||
|
The output looks like the original one but every header field will
|
||||||
|
have a numer associated with it, e.g.:
|
||||||
|
|
||||||
|
NAME(1) READY(2) STATUS(3) RESTARTS(4) AGE(5)
|
||||||
|
|
||||||
|
These numbers denote the column and you can use them to specify which
|
||||||
|
columns you want to have in your output:
|
||||||
|
|
||||||
|
kubectl get pods | tablizer -c1,3
|
||||||
|
|
||||||
|
You can specify the numbers in any order but output will always follow
|
||||||
|
the original order.
|
||||||
|
|
||||||
|
The numbering can be suppressed by using the B<-n> option.
|
||||||
|
|
||||||
|
There might be cases when the tabular output of a program is way too
|
||||||
|
large for your current terminal but you still need to see every
|
||||||
|
column. In such cases the B<-x> option can be usefull which enables
|
||||||
|
I<extended mode>. In this mode, each row will be printed vertically,
|
||||||
|
header left, value right, aligned by the field widths. Here's an
|
||||||
|
example:
|
||||||
|
|
||||||
|
kubectl get pods | ./tablizer -x
|
||||||
|
NAME: repldepl-7bcd8d5b64-7zq4l
|
||||||
|
READY: 1/1
|
||||||
|
STATUS: Running
|
||||||
|
RESTARTS: 1 (71m ago)
|
||||||
|
AGE: 5h28m
|
||||||
|
|
||||||
|
You can of course still use a regex to reduce the number of rows
|
||||||
|
displayed.
|
||||||
|
|
||||||
|
Finally the B<-d> option enables debugging output which is mostly
|
||||||
|
usefull for the developer.
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
In order to report a bug, unexpected behavior, feature requests
|
||||||
|
or to submit a patch, please open an issue on github:
|
||||||
|
L<https://github.com/TLINDEN/tablizer/issues>.
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
This software is licensed under the GNU GENERAL PUBLIC LICENSE version 3.
|
||||||
|
|
||||||
|
Copyright (c) 2022 by Thomas von Dein
|
||||||
|
|
||||||
|
This software uses the following GO libraries:
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item repr (https://github.com/alecthomas/repr)
|
||||||
|
|
||||||
|
Released under the MIT License, Copyright (c) 2016 Alec Thomas
|
||||||
|
|
||||||
|
=item cobra (https://github.com/spf13/cobra)
|
||||||
|
|
||||||
|
Released under the Apache 2.0 license, Copyright 2013-2022 The Cobra Authors
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
Thomas von Dein B<tom AT vondein DOT org>
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
Reference in New Issue
Block a user