From 7228e514d9bf3a228191fa2a2f09687338666e9e Mon Sep 17 00:00:00 2001 From: Doron Behar Date: Wed, 27 Oct 2021 20:32:02 +0300 Subject: [PATCH] Add pistol-static compilation Use my fork of magicmime and add a buildtag EMBED_MAGIC_DB that makes the compilation embed the database using golang's "embed" package. Copy the embedded magic database to ~/.local/share/pistol if needed. --- .gitignore | 1 + Makefile | 10 +++++ cmd/pistol/main.go | 8 +++- cmd/pistol/previewer_nostatic.go | 8 ++++ cmd/pistol/previewer_static.go | 50 +++++++++++++++++++++++ flake.lock | 11 ++--- flake.nix | 50 ++++++++++++++++++++++- go.mod | 10 ++--- go.sum | 17 ++++---- gomod2nix.toml | 70 ++++++++++++++++++-------------- internal_writers/archives.go | 2 +- internal_writers/chroma.go | 2 +- internal_writers/fallback.go | 7 ++-- internal_writers/map.go | 8 ++-- previewer.go | 13 +++--- 15 files changed, 199 insertions(+), 68 deletions(-) create mode 100644 cmd/pistol/previewer_nostatic.go create mode 100644 cmd/pistol/previewer_static.go diff --git a/.gitignore b/.gitignore index 962c3ec..ccead38 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ /pistol result pistol.1 +cmd/pistol/magic.mgc diff --git a/Makefile b/Makefile index 61be9d9..4cf54ea 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,19 @@ NAME := pistol VERSION := v$(shell cat VERSION)-git +ifdef MAGIC_DB + MAGIC_DB := $(MAGIC_DB) +else + MAGIC_DB := /usr/share/misc/magic.mgc +endif build: go build -ldflags "-X 'main.Version=$(VERSION)'" ./cmd/pistol +build-static: + @echo copying magic db for compilation from: + @echo " $(MAGIC_DB)" + @cp --no-preserve=mode,ownership -f $(MAGIC_DB) ./cmd/pistol/magic.mgc + go build -tags EMBED_MAGIC_DB -ldflags "-X 'main.Version=$(VERSION)'" ./cmd/pistol # Manpage pistol.1: README.adoc diff --git a/cmd/pistol/main.go b/cmd/pistol/main.go index b22e3d7..d61eb48 100644 --- a/cmd/pistol/main.go +++ b/cmd/pistol/main.go @@ -5,6 +5,7 @@ import ( "log" "github.com/doronbehar/pistol" + "github.com/doronbehar/magicmime" "github.com/alexflint/go-arg" "github.com/adrg/xdg" ) @@ -45,7 +46,12 @@ func main() { log.Fatalf("no arguments!") os.Exit(1) } - previewer, err := pistol.NewPreviewer(args.FilePath, args.Config, args.Extras) + magic_db_path, err := GetDbPath(magicmime.Version()) + if err != nil { + log.Fatal(err) + os.Exit(2) + } + previewer, err := pistol.NewPreviewer(magic_db_path, args.FilePath, args.Config, args.Extras) if err != nil { log.Fatal(err) os.Exit(2) diff --git a/cmd/pistol/previewer_nostatic.go b/cmd/pistol/previewer_nostatic.go new file mode 100644 index 0000000..34199f2 --- /dev/null +++ b/cmd/pistol/previewer_nostatic.go @@ -0,0 +1,8 @@ +//+build !EMBED_MAGIC_DB + +package main + +func GetDbPath(magicmime_version int) (string, error) { + // And by that use the default location for the magic.mgc database + return "", nil +} diff --git a/cmd/pistol/previewer_static.go b/cmd/pistol/previewer_static.go new file mode 100644 index 0000000..231a505 --- /dev/null +++ b/cmd/pistol/previewer_static.go @@ -0,0 +1,50 @@ +//+build EMBED_MAGIC_DB + +package main + +import ( + _ "embed" + "os" + "fmt" + "errors" + "path/filepath" + + "github.com/adrg/xdg" +) + +//go:embed magic.mgc +var magic_db_data []byte + +func GetDbPath(magicmime_version int) (string, error) { + // Create a copy of the magic database file with magic_db_data + magic_db_dir := fmt.Sprintf("%s/pistol", xdg.DataHome) + err := os.MkdirAll(magic_db_dir, 0755) + if err != nil { + return "", errors.New(fmt.Sprintf( + "We've had issues creating a directory for the libmagic database at %s, error is: %s", + magic_db_dir, err, + )) + } + magic_db_path := fmt.Sprintf("%s/%d.mgc", magic_db_dir, magicmime_version) + // Don't write the database if there's already a file there. + if _, err := os.Stat(magic_db_path); errors.Is(err, os.ErrNotExist) { + old_dbs, err := filepath.Glob(filepath.Join(magic_db_dir, "*.mgc")) + if err != nil { + return "", err + } + for _, old_db := range old_dbs { + err = os.Remove(old_db) + if err != nil { + return "", err + } + } + err = os.WriteFile(magic_db_path, magic_db_data, 0644) + if err != nil { + return "", errors.New(fmt.Sprintf( + "Could not create a copy of libmagic database at %s, error is: %s", + magic_db_path, err, + )) + } + } + return magic_db_path, nil +} diff --git a/flake.lock b/flake.lock index ce279c4..2c13907 100644 --- a/flake.lock +++ b/flake.lock @@ -61,15 +61,16 @@ ] }, "locked": { - "lastModified": 1627572165, - "narHash": "sha256-MFpwnkvQpauj799b4QTBJQFEddbD02+Ln5k92QyHOSk=", - "owner": "tweag", + "lastModified": 1638001840, + "narHash": "sha256-Qknxy+YjVA39v/LwiUNsAcMAg9Df8aYAuqkH+EiAHRA=", + "owner": "doronbehar", "repo": "gomod2nix", - "rev": "67f22dd738d092c6ba88e420350ada0ed4992ae8", + "rev": "242884158539d4cc0bdc74ab718c499bad785a14", "type": "github" }, "original": { - "owner": "tweag", + "owner": "doronbehar", + "ref": "go-stdenv", "repo": "gomod2nix", "type": "github" } diff --git a/flake.nix b/flake.nix index f830c14..40fcd64 100644 --- a/flake.nix +++ b/flake.nix @@ -11,7 +11,8 @@ flake = false; }; inputs.gomod2nix = { - url = "github:tweag/gomod2nix"; + # For static compilation I need: https://github.com/tweag/gomod2nix/pull/24 + url = "github:doronbehar/gomod2nix/go-stdenv"; inputs.nixpkgs.follows = "nixpkgs"; inputs.utils.follows = "flake-utils"; }; @@ -39,6 +40,9 @@ # https://discourse.nixos.org/t/passing-git-commit-hash-and-tag-to-build-with-flakes/11355/2 version_rev = if (self ? rev) then (builtins.substring 0 8 self.rev) else "dirty"; version = "${pkgs.lib.fileContents ./VERSION}-${version_rev}-flake"; + buildGoApplicationStatic = pkgs.buildGoApplication.override { + stdenv = pkgs.pkgsStatic.stdenv; + }; pistol = pkgs.buildGoApplication { pname = "pistol"; inherit version; @@ -79,6 +83,42 @@ ; CGO_ENABLED = 1; }; + MAGIC_DB = "${pkgs.pkgsStatic.file}/share/misc/magic.mgc"; + pistol-static = buildGoApplicationStatic { + inherit (pistol) + pname + version + src + subPackages + postBuild + CGO_ENABLED + modules + meta + ; + nativeBuildInputs = pistol.nativeBuildInputs ++ [ + pkgs.removeReferencesTo + ]; + buildInputs = [ + pkgs.pkgsStatic.file + pkgs.pkgsStatic.zlib + ]; + # From some reason even though zlib is static we need this, but it + # doesn't create a real reference to zlib. + NIX_LDFLAGS = "-lz"; + preBuild = '' + cp ${MAGIC_DB} ./cmd/pistol/magic.mgc + ''; + postFixup = '' + # Remove unnecessary references to zlib. + rm -r $out/nix-support + # Remove more unnecessary references which I don't know the source of + # which. I guess they are due to features of some go modules I don't + # use. + remove-references-to -t ${pkgs.mailcap} $out/bin/pistol + remove-references-to -t ${pkgs.iana-etc} $out/bin/pistol + remove-references-to -t ${pkgs.tzdata} $out/bin/pistol + ''; + }; in rec { devShell = pkgs.mkShell { inherit (pistol) buildInputs; @@ -87,8 +127,14 @@ pkgs.elinks pkgs.gomod2nix ]; + inherit MAGIC_DB; + }; + packages = { + inherit + pistol + pistol-static + ; }; - packages.pistol = pistol; defaultPackage = pistol; apps.pistol = { type = "app"; diff --git a/go.mod b/go.mod index f1babde..87be526 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/doronbehar/pistol -go 1.12 +go 1.16 require ( github.com/adrg/xdg v0.4.0 @@ -8,15 +8,15 @@ require ( github.com/alessio/shellescape v1.4.1 github.com/alexflint/go-arg v1.4.2 github.com/alexflint/go-scalar v1.1.0 // indirect - github.com/andybalholm/brotli v1.0.3 // indirect + github.com/andybalholm/brotli v1.0.4 // indirect + github.com/doronbehar/magicmime v0.1.1-0.20211127135329-3de4ff29dc49 github.com/dustin/go-humanize v1.0.0 github.com/golang/snappy v0.0.4 // indirect github.com/klauspost/compress v1.13.6 // indirect github.com/mholt/archiver/v3 v3.5.1 github.com/nwaples/rardecode v1.1.2 - github.com/pierrec/lz4/v4 v4.1.10 // indirect - github.com/rakyll/magicmime v0.1.0 + github.com/pierrec/lz4/v4 v4.1.11 // indirect github.com/sirupsen/logrus v1.8.1 github.com/ulikunitz/xz v0.5.10 // indirect - golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c // indirect + golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 // indirect ) diff --git a/go.sum b/go.sum index b0f2583..45c15b0 100644 --- a/go.sum +++ b/go.sum @@ -10,13 +10,15 @@ github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxj github.com/alexflint/go-scalar v1.1.0 h1:aaAouLLzI9TChcPXotr6gUhq+Scr8rl0P9P4PnltbhM= github.com/alexflint/go-scalar v1.1.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3 h1:fpcw+r1N1h0Poc1F/pHbW40cUm/lMEQslZtCkBQ0UnM= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/doronbehar/magicmime v0.1.1-0.20211127135329-3de4ff29dc49 h1:3f9QFV/yQR4UD8Gv3UE2O6bDAABbBk5+3Rrh5k3qSAo= +github.com/doronbehar/magicmime v0.1.1-0.20211127135329-3de4ff29dc49/go.mod h1:elWi9xask6j0RTycB89gmgcb2k/jaOfyFctNqVLK68M= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= @@ -39,12 +41,10 @@ github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk github.com/nwaples/rardecode v1.1.2 h1:Cj0yZY6T1Zx1R7AhTbyGSALm44/Mmq+BAPc4B/p/d3M= github.com/nwaples/rardecode v1.1.2/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.10 h1:H0LgOg/8kTVhiN8ESXFa+gvt9udNp1hQ+mYNDdcMPTM= -github.com/pierrec/lz4/v4 v4.1.10/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.11 h1:LVs17FAZJFOjgmJXl9Tf13WfLUvZq7/RjfEJrnwZ9OE= +github.com/pierrec/lz4/v4 v4.1.11/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rakyll/magicmime v0.1.0 h1:aFIp1DqgzjcB3FI7rQk6uZl73i1VPpWswab1YKU4CL4= -github.com/rakyll/magicmime v0.1.0/go.mod h1:OKs4S+1GpIAB1PCebhwp3rxhyipe7TiImiIeVyFlQt8= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -59,10 +59,9 @@ github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofm github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c h1:+8miTPjMCTXwih7BQmvWwd0PjdBZq2MKp/qQaahSzEM= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 h1:TyHqChC80pFkXWraUUf6RuB5IqFdQieMLwwCJokV2pc= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/gomod2nix.toml b/gomod2nix.toml index 3433f2c..059aef3 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -6,14 +6,6 @@ rev = "4ec40e24f0cf1039f93c773f2984decdea9719b5" sha256 = "1xbkb8wmr6phj2ppr75akc58jdzrv20gc3mkxa1mmb968isy8s6c" -["github.com/akamensky/argparse"] - sumVersion = "v1.3.1" - ["github.com/akamensky/argparse".fetch] - type = "git" - url = "https://github.com/akamensky/argparse" - rev = "6bd6f07ff2a3fe7ef2d1f5c627566ba386fd54a7" - sha256 = "0h3wyskisr2m0ygnl7dsq7r43s88iqdd2j8gcilf3g8p530gwgy2" - ["github.com/alecthomas/chroma"] sumVersion = "v0.9.4" ["github.com/alecthomas/chroma".fetch] @@ -47,12 +39,12 @@ sha256 = "1996wynw6xl99q1glciqckddncclp9hzp2jdvl6d1vw41svc4z2z" ["github.com/andybalholm/brotli"] - sumVersion = "v1.0.3" + sumVersion = "v1.0.4" ["github.com/andybalholm/brotli".fetch] type = "git" url = "https://github.com/andybalholm/brotli" - rev = "5376c15dde3fd4247febd5a3b4ac9708d2d6faff" - sha256 = "16y3z6rpi0a699vh9sxmdj4w2hvb5dvmci8wc9y6dsi8j6sxpmw3" + rev = "1d750214c25205863625bb3eb8190a51b2cef26d" + sha256 = "1zvmj7gbnkq9xwv1bvcxk9acxl06y902148qwbd2kqwgs52wy2c0" ["github.com/davecgh/go-spew"] sumVersion = "v1.1.1" @@ -70,13 +62,21 @@ rev = "955551b554999d8e80dba0184eab21e642786508" sha256 = "1irfv89b7lfkn7k3zgx610ssil6k61qs1wjj31kvqpxb3pdx4kry" +["github.com/doronbehar/magicmime"] + sumVersion = "v0.1.1-0.20211127135329-3de4ff29dc49" + ["github.com/doronbehar/magicmime".fetch] + type = "git" + url = "https://github.com/doronbehar/magicmime" + rev = "3de4ff29dc49ea8f07b0c361193d3137b9c2c6db" + sha256 = "1llga0pspaghlywvcniw97m2nh1742i7a7gayw92518bmjx0zk56" + ["github.com/dsnet/compress"] - sumVersion = "v0.0.1" + sumVersion = "v0.0.2-0.20210315054119-f66993602bf5" ["github.com/dsnet/compress".fetch] type = "git" url = "https://github.com/dsnet/compress" - rev = "da652975a8eea9fa0735aba8056747a751db0bd3" - sha256 = "1wwjaymzb1xxq3ybch3nwn72xhi2s40cvz0cl986yad3w1xwzj91" + rev = "f66993602bf5da07ef49d35b08e7264ae9fe2b6e" + sha256 = "15acshlr2h2gl7q114f600h4d3mld5x4zj1hiygaxlv1pfvmz8sz" ["github.com/dsnet/golib"] sumVersion = "v0.0.0-20171103203638-1ea166775780" @@ -94,14 +94,6 @@ rev = "9f541cc9db5d55bce703bd99987c9d5cb8eea45e" sha256 = "1kqf1kavdyvjk7f8kx62pnm7fbypn9z1vbf8v2qdh3y7z7a0cbl3" -["github.com/galdor/go-cmdline"] - sumVersion = "v1.1.1" - ["github.com/galdor/go-cmdline".fetch] - type = "git" - url = "https://github.com/galdor/go-cmdline" - rev = "17577d202b866492c6c289c5d078a33baf840f85" - sha256 = "0vkmqbz8zhqifcdwwlwi1ba7v5kb71k1pxqpkcf9p99v002q84m1" - ["github.com/golang/snappy"] sumVersion = "v0.0.4" ["github.com/golang/snappy".fetch] @@ -110,6 +102,14 @@ rev = "544b4180ac705b7605231d4a4550a1acb22a19fe" sha256 = "004cw699yz3pdpawhjhpa0y94c4w479nw1rf39zj6h6027kpwv2j" +["github.com/google/go-cmp"] + sumVersion = "v0.5.5" + ["github.com/google/go-cmp".fetch] + type = "git" + url = "https://github.com/google/go-cmp" + rev = "8fa37b4dd109f12e42b131e485268768f18bcbf8" + sha256 = "12fmkdhyv5d4is8s57k78j097zb0phlgnrkqc03agiszxlid69x7" + ["github.com/klauspost/compress"] sumVersion = "v1.13.6" ["github.com/klauspost/compress".fetch] @@ -135,12 +135,12 @@ sha256 = "0m66jcsz27076qvi5qzagzlbyd1sdzh6kbf1njj0sswx86026rx3" ["github.com/mholt/archiver/v3"] - sumVersion = "v3.5.0" + sumVersion = "v3.5.1" ["github.com/mholt/archiver/v3".fetch] type = "git" url = "https://github.com/mholt/archiver" - rev = "25e050dbb4e3c591402916201098241bb661a2f7" - sha256 = "0fdkqfs87svpijccz8m11gvby8pvmznq6fs9k94vbzak0kxhw1wg" + rev = "cc194d2e4af2dc09a812aa0ff61adc4813ea6c69" + sha256 = "1py186hfy4p69wghqmbsyi1r3xvw1nyl55pz8f97a5qhmwxb3mwp" ["github.com/nwaples/rardecode"] sumVersion = "v1.1.2" @@ -151,12 +151,12 @@ sha256 = "1v89hkai3qr5kizqhdsn4kg5vskpxbxz7fpbldfvn8g7756q0v6z" ["github.com/pierrec/lz4/v4"] - sumVersion = "v4.1.8" + sumVersion = "v4.1.11" ["github.com/pierrec/lz4/v4".fetch] type = "git" url = "https://github.com/pierrec/lz4" - rev = "2c1550e56c43e875151468b8f6380ac8d706e88e" - sha256 = "1ffsm2ny2v6nasc3zww5f2bl0jqi2jmiyqm8x2cvyzrd0clay1wl" + rev = "007008ea0e9a5c20f0b924d7f4a39e0c9e124bc8" + sha256 = "021lzlkhkv53sfpcppmlhclkhx23ddy9mgjki0cpjj4gv4anmrcb" ["github.com/pmezard/go-difflib"] sumVersion = "v1.0.0" @@ -215,12 +215,20 @@ sha256 = "178r0fa2dpzxf0sabs7dn0c8fa7vs87zlxk6spkn374ls9pir7nq" ["golang.org/x/sys"] - sumVersion = "v0.0.0-20211025201205-69cdffdb9359" + sumVersion = "v0.0.0-20211124211545-fe61309f8881" ["golang.org/x/sys".fetch] type = "git" url = "https://go.googlesource.com/sys" - rev = "69cdffdb9359ff97d91e4f4fbb6b2714c3898eae" - sha256 = "12jw69gy1pdvfq4xsnwyyl1djs0ffg274lg7rlzym2q5ky34sfsw" + rev = "fe61309f888157de161a48facf03d9412635cffe" + sha256 = "0m1qhxwks9dvkf41k7hhac1a1k53saxnsjy6jmf7akk4dnc7fk1v" + +["golang.org/x/xerrors"] + sumVersion = "v0.0.0-20191204190536-9bdfabe68543" + ["golang.org/x/xerrors".fetch] + type = "git" + url = "https://go.googlesource.com/xerrors" + rev = "9bdfabe68543c54f90421aeb9a60ef8061b5b544" + sha256 = "1yjfi1bk9xb81lqn85nnm13zz725wazvrx3b50hx19qmwg7a4b0c" ["gopkg.in/check.v1"] sumVersion = "v0.0.0-20161208181325-20d25e280405" diff --git a/internal_writers/archives.go b/internal_writers/archives.go index 1a686f3..fa0d49e 100644 --- a/internal_writers/archives.go +++ b/internal_writers/archives.go @@ -21,7 +21,7 @@ type archiveFileInfo struct { FileName string } -func NewArchiveLister(mimeType, filePath string) (func(w io.Writer) error, error) { +func NewArchiveLister(magic_db, mimeType, filePath string) (func(w io.Writer) error, error) { log.Infof("listing files in archive %s\n", filePath) return func (w io.Writer) error { var wIface interface{} diff --git a/internal_writers/chroma.go b/internal_writers/chroma.go index 8195336..d8c75b6 100644 --- a/internal_writers/chroma.go +++ b/internal_writers/chroma.go @@ -12,7 +12,7 @@ import ( cstyles "github.com/alecthomas/chroma/styles" ) -func NewChromaWriter(mimeType, filePath string) (func(w io.Writer) error, error) { +func NewChromaWriter(magic_db, mimeType, filePath string) (func(w io.Writer) error, error) { log.Infof("using chroma to print %s with syntax highlighting\n", filePath) lexer := clexers.Match(filePath) if lexer == nil { diff --git a/internal_writers/fallback.go b/internal_writers/fallback.go index c467faf..4addbf8 100644 --- a/internal_writers/fallback.go +++ b/internal_writers/fallback.go @@ -4,11 +4,10 @@ import ( "io" "fmt" - "github.com/rakyll/magicmime" + "github.com/doronbehar/magicmime" ) - -func NewFallbackWriter(mimeType, filePath string) (func(w io.Writer) error, error) { - if err := magicmime.Open(magicmime.MAGIC_SYMLINK); err != nil { +func NewFallbackWriter(magic_db, mimeType, filePath string) (func(w io.Writer) error, error) { + if err := magicmime.OpenWithPath(magic_db, magicmime.MAGIC_SYMLINK); err != nil { return emptyWriter, err } complete_filetype_description, err := magicmime.TypeByFile(filePath) diff --git a/internal_writers/map.go b/internal_writers/map.go index fa9c43e..8575f70 100644 --- a/internal_writers/map.go +++ b/internal_writers/map.go @@ -5,7 +5,7 @@ import ( "regexp" ) -var internalWritersRegexMap = map[string] func(string, string) (func(w io.Writer) error, error) { +var internalWritersRegexMap = map[string] func(string, string, string) (func(w io.Writer) error, error) { "text/*": NewChromaWriter, // https://github.com/doronbehar/pistol/issues/34 "application/json": NewChromaWriter, @@ -25,21 +25,21 @@ var emptyWriter = func(w io.Writer) error { return nil } -func MatchInternalWriter(mimeType, filePath string) (func(w io.Writer) error, error) { +func MatchInternalWriter(magic_db, mimeType, filePath string) (func(w io.Writer) error, error) { for regex, writerCreator := range internalWritersRegexMap { match, err := regexp.MatchString(regex, mimeType) if err != nil { return emptyWriter, err } if match { - writer, err := writerCreator(mimeType, filePath) + writer, err := writerCreator(magic_db, mimeType, filePath) if err != nil { return emptyWriter, err } return writer, nil } } - writer, err := NewFallbackWriter(mimeType, filePath) + writer, err := NewFallbackWriter(magic_db, mimeType, filePath) if err != nil { return emptyWriter, err } diff --git a/previewer.go b/previewer.go index fc7dddc..d54e487 100644 --- a/previewer.go +++ b/previewer.go @@ -15,11 +15,13 @@ import ( she "github.com/alessio/shellescape" log "github.com/sirupsen/logrus" "github.com/doronbehar/pistol/internal_writers" - "github.com/rakyll/magicmime" + "github.com/doronbehar/magicmime" ) // A type NewPreviewer returns type Previewer struct { + // The path to the magic.mgc database, usually empty + MagicDb string // The file to be previewed FilePath string // Extra arguments passed to pistol @@ -49,11 +51,11 @@ type Previewer struct { // `pistol`, the command line tool, searches for a default configuration file // in ~/.config/pistol/pistol.conf. The API doesn't include this functionality. // -// Mime type detection is provided by libmagic (through github.com/rakyll/magicmime) +// Mime type detection is provided by libmagic (through github.com/doronbehar/magicmime) // // Many mime types are handled internally by Pistol, see table here: // https://github.com/doronbehar/pistol#introduction -func NewPreviewer(filePath, configPath string, extras []string) (Previewer, error) { +func NewPreviewer(magic_db_path, filePath, configPath string, extras []string) (Previewer, error) { verbose := os.Getenv("PISTOL_DEBUG") if verbose != "" { log.SetLevel(log.InfoLevel) @@ -63,9 +65,10 @@ func NewPreviewer(filePath, configPath string, extras []string) (Previewer, erro // create an empty Previewer p := Previewer{} // opens the magic library - if err := magicmime.Open(magicmime.MAGIC_MIME_TYPE | magicmime.MAGIC_SYMLINK); err != nil { + if err := magicmime.OpenWithPath(magic_db_path, magicmime.MAGIC_MIME_TYPE | magicmime.MAGIC_SYMLINK); err != nil { return p, err } + p.MagicDb = magic_db_path // get mimetype of given file, we don't care about the extension mimetype, err := magicmime.TypeByFile(filePath) defer magicmime.Close() @@ -206,7 +209,7 @@ func (p *Previewer) Write(w io.Writer) (error) { return cmd.Wait() } else { // try to match with internal writers - internal_writer, err := pistol.MatchInternalWriter(p.MimeType, p.FilePath) + internal_writer, err := pistol.MatchInternalWriter(p.MagicDb, p.MimeType, p.FilePath) if err != nil { return err }