diff --git a/.gitignore b/.gitignore index 96d8f73..528a834 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out +.idea/* + out/ # End of https://www.gitignore.io/api/go diff --git a/goreleaser.yml b/.goreleaser.yml similarity index 71% rename from goreleaser.yml rename to .goreleaser.yml index 9bc9fa1..9d148bb 100644 --- a/goreleaser.yml +++ b/.goreleaser.yml @@ -1,3 +1,10 @@ +project_name: csvdiff + +release: + github: + owner: aswinkarthik + name: csvdiff + builds: - main: ./main.go binary: csvdiff @@ -14,8 +21,8 @@ nfpm: 386: 32-bit darwin: macOS linux: linux - homepage: https://github.com/aswinkarthik93/csvdiff - maintainer: aswinkarthik93 + homepage: https://github.com/aswinkarthik/csvdiff + maintainer: aswinkarthik description: A Blazingly fast diff tool for comparing csv files. license: MIT formats: diff --git a/LICENSE b/LICENSE index 38c7c74..09c853d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright © 2018 aswinkarthik93 +Copyright © 2018 aswinkarthik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 7a2ace6..f7b3077 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # csvdiff -[![Build Status](https://travis-ci.org/aswinkarthik93/csvdiff.svg?branch=master)](https://travis-ci.org/aswinkarthik93/csvdiff) -[![Go Doc](https://godoc.org/github.com/aswinkarthik93/csvdiff?status.svg)](https://godoc.org/github.com/aswinkarthik93/csvdiff) -[![Go Report Card](https://goreportcard.com/badge/github.com/aswinkarthik93/csvdiff)](https://goreportcard.com/report/github.com/aswinkarthik93/csvdiff) -[![codecov](https://codecov.io/gh/aswinkarthik93/csvdiff/branch/master/graph/badge.svg)](https://codecov.io/gh/aswinkarthik93/csvdiff) -[![Downloads](https://img.shields.io/github/downloads/aswinkarthik93/csvdiff/latest/total.svg)](https://github.com/aswinkarthik93/csvdiff/releases) -[![Latest release](https://img.shields.io/github/release/aswinkarthik93/csvdiff.svg)](https://github.com/aswinkarthik93/csvdiff/releases) +[![Build Status](https://travis-ci.org/aswinkarthik/csvdiff.svg?branch=master)](https://travis-ci.org/aswinkarthik/csvdiff) +[![Go Doc](https://godoc.org/github.com/aswinkarthik/csvdiff?status.svg)](https://godoc.org/github.com/aswinkarthik/csvdiff) +[![Go Report Card](https://goreportcard.com/badge/github.com/aswinkarthik/csvdiff)](https://goreportcard.com/report/github.com/aswinkarthik/csvdiff) +[![codecov](https://codecov.io/gh/aswinkarthik/csvdiff/branch/master/graph/badge.svg)](https://codecov.io/gh/aswinkarthik/csvdiff) +[![Downloads](https://img.shields.io/github/downloads/aswinkarthik/csvdiff/latest/total.svg)](https://github.com/aswinkarthik/csvdiff/releases) +[![Latest release](https://img.shields.io/github/release/aswinkarthik/csvdiff.svg)](https://github.com/aswinkarthik/csvdiff/releases) A Blazingly fast diff tool for comparing csv files. @@ -34,40 +34,26 @@ $ csvdiff base.csv delta.csv ## Installation -- For MacOS +### Using binaries ```bash -curl -sL https://github.com/aswinkarthik93/csvdiff/releases/download/v1.0.0/csvdiff_1.0.0_darwin_amd64.tar.gz | tar xfz - -``` - -- For centos - -```bash -yum install https://github.com/aswinkarthik93/csvdiff/releases/download/v1.0.0/csvdiff_1.0.0_linux_64-bit.rpm -``` +# binary will be $GOPATH/bin/csvdiff +curl -sfL https://raw.githubusercontent.com/aswinkarthik/csvdiff/master/install.sh | sh -s -- -b $GOPATH/bin -- For debian +# or install it into ./bin/ +curl -sfL https://raw.githubusercontent.com/aswinkarthik/csvdiff/master/install.sh | sh -s -```bash -curl -sL https://github.com/aswinkarthik93/csvdiff/releases/download/v1.0.0/csvdiff_1.0.0_linux_64-bit.deb -O -dpkg --install csvdiff_*_linux_64-bit.deb +# In alpine linux (as it does not come with curl by default) +wget -O - -q https://raw.githubusercontent.com/aswinkarthik/csvdiff/master/install.sh | sh -s ``` -- For Linux - -```bash -curl -sL https://github.com/aswinkarthik93/csvdiff/releases/download/v1.0.0/csvdiff_1.0.0_linux_amd64.tar.gz | tar xfz - -``` - -- For [Windows](https://github.com/aswinkarthik93/csvdiff/releases/download/v1.0.0/csvdiff_1.0.0_windows_amd64.tar.gz) - -- Build using Go +### Using source code ```bash -go get -u github.com/aswinkarthik93/csvdiff +go get -u github.com/aswinkarthik/csvdiff ``` -## Usecase +## Use case - Cases where you have a base database dump as csv. If you receive the changes as another database dump as csv, this tool can be used to figure out what are the additions and modifications to the original database dump. The `additions.csv` can be used to create an `insert.sql` and with the `modifications.csv` an `update.sql` data migration. - The delta file can either contain just the changes or the entire table dump along with the changes. @@ -125,7 +111,7 @@ Rows: ## Build locally ```bash -$ git clone https://github.com/aswinkarthik93/csvdiff +$ git clone https://github.com/aswinkarthik/csvdiff $ go get ./... $ go build diff --git a/benchmark/README.md b/benchmark/README.md index e38aa9e..ab386e9 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -67,7 +67,7 @@ sys 0m0.147s ## Go Benchmark Results -Benchmark test can be found [here](https://github.com/aswinkarthik93/csvdiff/blob/master/pkg/digest/digest_benchmark_test.go). +Benchmark test can be found [here](https://github.com/aswinkarthik/csvdiff/blob/master/pkg/digest/digest_benchmark_test.go). ```bash $ cd ./pkg/digest diff --git a/cmd/config.go b/cmd/config.go index d5cf9da..1e2c5bb 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -4,7 +4,7 @@ import ( "errors" "strings" - "github.com/aswinkarthik93/csvdiff/pkg/digest" + "github.com/aswinkarthik/csvdiff/pkg/digest" ) var config Config diff --git a/cmd/config_test.go b/cmd/config_test.go index 705a1c0..64b6e7e 100644 --- a/cmd/config_test.go +++ b/cmd/config_test.go @@ -3,8 +3,8 @@ package cmd_test import ( "testing" - "github.com/aswinkarthik93/csvdiff/cmd" - "github.com/aswinkarthik93/csvdiff/pkg/digest" + "github.com/aswinkarthik/csvdiff/cmd" + "github.com/aswinkarthik/csvdiff/pkg/digest" "github.com/stretchr/testify/assert" ) diff --git a/cmd/formatter.go b/cmd/formatter.go index b83cc30..c5899bd 100644 --- a/cmd/formatter.go +++ b/cmd/formatter.go @@ -5,7 +5,7 @@ import ( "fmt" "io" - "github.com/aswinkarthik93/csvdiff/pkg/digest" + "github.com/aswinkarthik/csvdiff/pkg/digest" ) // Formatter defines the interface through which differences diff --git a/cmd/formatter_test.go b/cmd/formatter_test.go index da00383..2ee2989 100644 --- a/cmd/formatter_test.go +++ b/cmd/formatter_test.go @@ -4,8 +4,8 @@ import ( "bytes" "testing" - "github.com/aswinkarthik93/csvdiff/cmd" - "github.com/aswinkarthik93/csvdiff/pkg/digest" + "github.com/aswinkarthik/csvdiff/cmd" + "github.com/aswinkarthik/csvdiff/pkg/digest" "github.com/stretchr/testify/assert" ) diff --git a/cmd/root.go b/cmd/root.go index 089398f..82845fc 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,4 +1,4 @@ -// Copyright © 2018 aswinkarthik93 +// Copyright © 2018 aswinkarthik // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -27,7 +27,7 @@ import ( "os" "time" - "github.com/aswinkarthik93/csvdiff/pkg/digest" + "github.com/aswinkarthik/csvdiff/pkg/digest" homedir "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" "github.com/spf13/viper" diff --git a/go.mod b/go.mod index 2b0acc2..36dde0d 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/aswinkarthik93/csvdiff +module github.com/aswinkarthik/csvdiff require ( github.com/BurntSushi/toml v0.3.0 // indirect diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..1ab840e --- /dev/null +++ b/install.sh @@ -0,0 +1,381 @@ +#!/bin/sh +set -e +# Code generated by godownloader on 2018-10-26T05:33:59Z. DO NOT EDIT. +# + +usage() { + this=$1 + cat </dev/null +} +echoerr() { + echo "$@" 1>&2 +} +log_prefix() { + echo "$0" +} +_logp=6 +log_set_priority() { + _logp="$1" +} +log_priority() { + if test -z "$1"; then + echo "$_logp" + return + fi + [ "$1" -le "$_logp" ] +} +log_tag() { + case $1 in + 0) echo "emerg" ;; + 1) echo "alert" ;; + 2) echo "crit" ;; + 3) echo "err" ;; + 4) echo "warning" ;; + 5) echo "notice" ;; + 6) echo "info" ;; + 7) echo "debug" ;; + *) echo "$1" ;; + esac +} +log_debug() { + log_priority 7 || return 0 + echoerr "$(log_prefix)" "$(log_tag 7)" "$@" +} +log_info() { + log_priority 6 || return 0 + echoerr "$(log_prefix)" "$(log_tag 6)" "$@" +} +log_err() { + log_priority 3 || return 0 + echoerr "$(log_prefix)" "$(log_tag 3)" "$@" +} +log_crit() { + log_priority 2 || return 0 + echoerr "$(log_prefix)" "$(log_tag 2)" "$@" +} +uname_os() { + os=$(uname -s | tr '[:upper:]' '[:lower:]') + case "$os" in + msys_nt) os="windows" ;; + esac + echo "$os" +} +uname_arch() { + arch=$(uname -m) + case $arch in + x86_64) arch="amd64" ;; + x86) arch="386" ;; + i686) arch="386" ;; + i386) arch="386" ;; + aarch64) arch="arm64" ;; + armv5*) arch="armv5" ;; + armv6*) arch="armv6" ;; + armv7*) arch="armv7" ;; + esac + echo ${arch} +} +uname_os_check() { + os=$(uname_os) + case "$os" in + darwin) return 0 ;; + dragonfly) return 0 ;; + freebsd) return 0 ;; + linux) return 0 ;; + android) return 0 ;; + nacl) return 0 ;; + netbsd) return 0 ;; + openbsd) return 0 ;; + plan9) return 0 ;; + solaris) return 0 ;; + windows) return 0 ;; + esac + log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" + return 1 +} +uname_arch_check() { + arch=$(uname_arch) + case "$arch" in + 386) return 0 ;; + amd64) return 0 ;; + arm64) return 0 ;; + armv5) return 0 ;; + armv6) return 0 ;; + armv7) return 0 ;; + ppc64) return 0 ;; + ppc64le) return 0 ;; + mips) return 0 ;; + mipsle) return 0 ;; + mips64) return 0 ;; + mips64le) return 0 ;; + s390x) return 0 ;; + amd64p32) return 0 ;; + esac + log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" + return 1 +} +untar() { + tarball=$1 + case "${tarball}" in + *.tar.gz | *.tgz) tar -xzf "${tarball}" ;; + *.tar) tar -xf "${tarball}" ;; + *.zip) unzip "${tarball}" ;; + *) + log_err "untar unknown archive format for ${tarball}" + return 1 + ;; + esac +} +mktmpdir() { + test -z "$TMPDIR" && TMPDIR="$(mktemp -d)" + mkdir -p "${TMPDIR}" + echo "${TMPDIR}" +} +http_download_curl() { + local_file=$1 + source_url=$2 + header=$3 + if [ -z "$header" ]; then + code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url") + else + code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url") + fi + if [ "$code" != "200" ]; then + log_debug "http_download_curl received HTTP status $code" + return 1 + fi + return 0 +} +http_download_wget() { + local_file=$1 + source_url=$2 + header=$3 + if [ -z "$header" ]; then + wget -q -O "$local_file" "$source_url" + else + wget -q --header "$header" -O "$local_file" "$source_url" + fi +} +http_download() { + log_debug "http_download $2" + if is_command curl; then + http_download_curl "$@" + return + elif is_command wget; then + http_download_wget "$@" + return + fi + log_crit "http_download unable to find wget or curl" + return 1 +} +http_copy() { + tmp=$(mktemp) + http_download "${tmp}" "$1" "$2" || return 1 + body=$(cat "$tmp") + rm -f "${tmp}" + echo "$body" +} +github_release() { + owner_repo=$1 + version=$2 + test -z "$version" && version="latest" + giturl="https://github.com/${owner_repo}/releases/${version}" + json=$(http_copy "$giturl" "Accept:application/json") + test -z "$json" && return 1 + version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//') + test -z "$version" && return 1 + echo "$version" +} +hash_sha256() { + TARGET=${1:-/dev/stdin} + if is_command gsha256sum; then + hash=$(gsha256sum "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command sha256sum; then + hash=$(sha256sum "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command shasum; then + hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command openssl; then + hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f a + else + log_crit "hash_sha256 unable to find command to compute sha-256 hash" + return 1 + fi +} +hash_sha256_verify() { + TARGET=$1 + checksums=$2 + if [ -z "$checksums" ]; then + log_err "hash_sha256_verify checksum file not specified in arg2" + return 1 + fi + BASENAME=${TARGET##*/} + want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) + if [ -z "$want" ]; then + log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" + return 1 + fi + got=$(hash_sha256 "$TARGET") + if [ "$want" != "$got" ]; then + log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got" + return 1 + fi +} +cat /dev/null <