util.go 4.14 KB
Newer Older
Juan Batiz-Benet's avatar
key  
Juan Batiz-Benet committed
1
package util
Juan Batiz-Benet's avatar
util  
Juan Batiz-Benet committed
2 3

import (
Jeromy's avatar
Jeromy committed
4
	"errors"
5
	"fmt"
Juan Batiz-Benet's avatar
util  
Juan Batiz-Benet committed
6
	"os"
7
	"os/user"
8
	"path/filepath"
9
	"strings"
10

11
	ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go"
12 13
	b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58"
	mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash"
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
14
	logging "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging"
Juan Batiz-Benet's avatar
util  
Juan Batiz-Benet committed
15 16
)

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
17 18
// LogFormat is the format used for our logger.
var LogFormat = "%{color}%{time:01-02 15:04:05.9999} %{shortfile} %{level}: %{color:reset}%{message}"
19

Juan Batiz-Benet's avatar
go lint  
Juan Batiz-Benet committed
20
// Debug is a global flag for debugging.
Juan Batiz-Benet's avatar
util  
Juan Batiz-Benet committed
21 22
var Debug bool

Juan Batiz-Benet's avatar
go lint  
Juan Batiz-Benet committed
23
// ErrNotImplemented signifies a function has not been implemented yet.
Jeromy's avatar
Jeromy committed
24
var ErrNotImplemented = errors.New("Error: not implemented yet.")
Juan Batiz-Benet's avatar
go lint  
Juan Batiz-Benet committed
25

26
// ErrTimeout implies that a timeout has been triggered
Jeromy's avatar
Jeromy committed
27 28 29 30 31
var ErrTimeout = errors.New("Error: Call timed out.")

// ErrSeErrSearchIncomplete implies that a search type operation didnt
// find the expected node, but did find 'a' node.
var ErrSearchIncomplete = errors.New("Error: Search Incomplete.")
32

33
// ErrNotFound is returned when a search fails to find anything
34
var ErrNotFound = ds.ErrNotFound
35

Juan Batiz-Benet's avatar
go lint  
Juan Batiz-Benet committed
36
// Key is a string representation of multihash for use with maps.
Juan Batiz-Benet's avatar
key  
Juan Batiz-Benet committed
37 38
type Key string

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
39
// Pretty returns Key in a b58 encoded string
40
func (k Key) Pretty() string {
41
	return b58.Encode([]byte(k))
42 43
}

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
44 45 46 47 48 49 50 51 52 53 54 55
// DsKey returns a Datastore key
func (k Key) DsKey() ds.Key {
	return ds.NewKey(k.Pretty())
}

// KeyFromDsKey returns a Datastore key
func KeyFromDsKey(dsk ds.Key) Key {
	l := dsk.List()
	enc := l[len(l)-1]
	return Key(b58.Decode(enc))
}

Juan Batiz-Benet's avatar
go lint  
Juan Batiz-Benet committed
56
// Hash is the global IPFS hash function. uses multihash SHA2_256, 256 bits
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
57 58 59 60 61 62 63 64 65
func Hash(data []byte) mh.Multihash {
	h, err := mh.Sum(data, mh.SHA2_256, -1)
	if err != nil {
		// this error can be safely ignored (panic) because multihash only fails
		// from the selection of hash function. If the fn + length are valid, it
		// won't error.
		panic("multihash failed to hash using SHA2_256.")
	}
	return h
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
66 67
}

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
68
// IsValidHash checks whether a given hash is valid (b58 decodable, len > 0)
69 70 71 72 73 74 75 76
func IsValidHash(s string) bool {
	out := b58.Decode(s)
	if out == nil || len(out) == 0 {
		return false
	}
	return true
}

Juan Batiz-Benet's avatar
go lint  
Juan Batiz-Benet committed
77
// TildeExpansion expands a filename, which may begin with a tilde.
78 79 80 81 82 83 84 85 86 87 88 89 90
func TildeExpansion(filename string) (string, error) {
	if strings.HasPrefix(filename, "~/") {
		usr, err := user.Current()
		if err != nil {
			return "", err
		}

		dir := usr.HomeDir + "/"
		filename = strings.Replace(filename, "~/", dir, 1)
	}
	return filename, nil
}

Juan Batiz-Benet's avatar
go lint  
Juan Batiz-Benet committed
91
// PErr is a shorthand printing function to output to Stderr.
Juan Batiz-Benet's avatar
util  
Juan Batiz-Benet committed
92
func PErr(format string, a ...interface{}) {
93
	fmt.Fprintf(os.Stderr, format, a...)
Juan Batiz-Benet's avatar
util  
Juan Batiz-Benet committed
94 95
}

Juan Batiz-Benet's avatar
go lint  
Juan Batiz-Benet committed
96
// POut is a shorthand printing function to output to Stdout.
Juan Batiz-Benet's avatar
util  
Juan Batiz-Benet committed
97
func POut(format string, a ...interface{}) {
98
	fmt.Fprintf(os.Stdout, format, a...)
Juan Batiz-Benet's avatar
util  
Juan Batiz-Benet committed
99 100
}

Juan Batiz-Benet's avatar
go lint  
Juan Batiz-Benet committed
101 102
// DErr is a shorthand debug printing function to output to Stderr.
// Will only print if Debug is true.
Juan Batiz-Benet's avatar
util  
Juan Batiz-Benet committed
103 104 105 106 107 108
func DErr(format string, a ...interface{}) {
	if Debug {
		PErr(format, a...)
	}
}

Juan Batiz-Benet's avatar
go lint  
Juan Batiz-Benet committed
109 110
// DOut is a shorthand debug printing function to output to Stdout.
// Will only print if Debug is true.
Juan Batiz-Benet's avatar
util  
Juan Batiz-Benet committed
111 112 113 114 115
func DOut(format string, a ...interface{}) {
	if Debug {
		POut(format, a...)
	}
}
116

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
117 118
var loggers = []string{}

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
119 120 121 122
// SetupLogging will initialize the logger backend and set the flags.
func SetupLogging() {
	backend := logging.NewLogBackend(os.Stderr, "", 0)
	logging.SetBackend(backend)
Jeromy's avatar
Jeromy committed
123 124 125 126 127 128 129
	/*
		if Debug {
			logging.SetLevel(logging.DEBUG, "")
		} else {
			logging.SetLevel(logging.ERROR, "")
		}
	*/
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
130
	logging.SetFormatter(logging.MustStringFormatter(LogFormat))
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
131

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
132 133 134
	for _, n := range loggers {
		logging.SetLevel(logging.ERROR, n)
	}
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
135 136
}

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
137
// Logger retrieves a particular logger + initializes it at a particular level
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
138
func Logger(name string) *logging.Logger {
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
139
	log := logging.MustGetLogger(name)
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
140 141
	// logging.SetLevel(lvl, name) // can't set level here.
	loggers = append(loggers, name)
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
142 143 144
	return log
}

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
145
// ExpandPathnames takes a set of paths and turns them into absolute paths
146 147 148 149 150 151 152 153 154 155 156
func ExpandPathnames(paths []string) ([]string, error) {
	var out []string
	for _, p := range paths {
		abspath, err := filepath.Abs(p)
		if err != nil {
			return nil, err
		}
		out = append(out, abspath)
	}
	return out, nil
}