jank 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/jank +13 -0
- data/bin/jgo +14 -0
- data/bin/jgocode +13 -0
- data/bin/jgodoc +13 -0
- data/bin/jgofmt +13 -0
- data/bin/jgoimports +13 -0
- data/bin/jgolint +13 -0
- data/lib/base.rb +6 -0
- data/lib/command.rb +19 -0
- data/lib/config.rb +135 -0
- data/lib/debug.rb +9 -0
- data/lib/executor.rb +40 -0
- data/lib/go.rb +9 -0
- data/lib/go_command.rb +76 -0
- data/lib/gocode_command.rb +20 -0
- data/lib/godoc_command.rb +20 -0
- data/lib/gofmt_command.rb +20 -0
- data/lib/goimports_command.rb +20 -0
- data/lib/golint_command.rb +21 -0
- data/lib/jank_command.rb +174 -0
- data/lib/janker.rb +126 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5c7b5f0d00fc555316cdbd2b1b036eb5b2cd56d7
|
4
|
+
data.tar.gz: 58b6eccf657e1f623a5eb6e7e2d4d4c955d30dca
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 95aaed1454cd31109c374c9a758cd0f36c69e632f45208399f341d72741bd652af145b185a365fffc78514176a851bb53a85918027dd5381e8c48ebadfa66f8d
|
7
|
+
data.tar.gz: 336bfb20761a261a73484d01b0f6fe180ee6d61796cb4c64e0c197b7affe4b91a90ddab7f4fb206d818afe9fa1f80708c867e213bb76ee31b5b88f9e822e4e28
|
data/bin/jank
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/base'
|
4
|
+
require_relative '../lib/jank_command'
|
5
|
+
|
6
|
+
module Jank
|
7
|
+
def self.main
|
8
|
+
config = Config.new
|
9
|
+
JankCommand.new(ARGV, config, Janker.new(config), Executor.new(config)).dispatch
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Jank.main
|
data/bin/jgo
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/base'
|
4
|
+
require_relative '../lib/go'
|
5
|
+
require_relative '../lib/go_command'
|
6
|
+
|
7
|
+
module Jank
|
8
|
+
def self.main
|
9
|
+
config = Config.new
|
10
|
+
GoCommand.new(ARGV, config, Janker.new(config), Go.new(config)).dispatch
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Jank.main
|
data/bin/jgocode
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/base'
|
4
|
+
require_relative '../lib/gocode_command'
|
5
|
+
|
6
|
+
module Jank
|
7
|
+
def self.main
|
8
|
+
config = Config.new
|
9
|
+
GocodeCommand.new(ARGV, config, Janker.new(config), Executor.new(config)).dispatch
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Jank.main
|
data/bin/jgodoc
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/base'
|
4
|
+
require_relative '../lib/godoc_command'
|
5
|
+
|
6
|
+
module Jank
|
7
|
+
def self.main
|
8
|
+
config = Config.new
|
9
|
+
GodocCommand.new(ARGV, config, Janker.new(config), Executor.new(config)).dispatch
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Jank.main
|
data/bin/jgofmt
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/base'
|
4
|
+
require_relative '../lib/gofmt_command'
|
5
|
+
|
6
|
+
module Jank
|
7
|
+
def self.main
|
8
|
+
config = Config.new
|
9
|
+
GofmtCommand.new(ARGV, config, Janker.new(config), Executor.new(config)).dispatch
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Jank.main
|
data/bin/jgoimports
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/base'
|
4
|
+
require_relative '../lib/goimports_command'
|
5
|
+
|
6
|
+
module Jank
|
7
|
+
def self.main
|
8
|
+
config = Config.new
|
9
|
+
GoimportsCommand.new(ARGV, config, Janker.new(config), Executor.new(config)).dispatch
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Jank.main
|
data/bin/jgolint
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/base'
|
4
|
+
require_relative '../lib/golint_command'
|
5
|
+
|
6
|
+
module Jank
|
7
|
+
def self.main
|
8
|
+
config = Config.new
|
9
|
+
GolintCommand.new(ARGV, config, Janker.new(config), Executor.new(config)).dispatch
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Jank.main
|
data/lib/base.rb
ADDED
data/lib/command.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Jank
|
2
|
+
class Command
|
3
|
+
def initialize(args, config, janker, executor)
|
4
|
+
@config = config
|
5
|
+
@janker = janker
|
6
|
+
@exec = executor
|
7
|
+
@args = args
|
8
|
+
end
|
9
|
+
|
10
|
+
def dispatch
|
11
|
+
command = "#{@args[0]}_command"
|
12
|
+
if !self.respond_to? command
|
13
|
+
command = 'help'
|
14
|
+
end
|
15
|
+
|
16
|
+
self.send(command)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/config.rb
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Jank
|
4
|
+
class Config
|
5
|
+
attr_reader :go, :gopaths, :janked_gopaths, :pwd, :home, :package, :janked_packge, :janked, :rsync, :janked_local_path, :janked_gopath, :janked, :local_gopath, :env
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
# Ignore or include ENV gopath
|
9
|
+
@include_env_gopath = nil
|
10
|
+
|
11
|
+
# Path to go
|
12
|
+
@go = ENV['JANK_GO'] || `which go`.chomp
|
13
|
+
|
14
|
+
# Path to rsync
|
15
|
+
@rsync = ENV['JANK_RSYNC'] || `which rsync`.chomp
|
16
|
+
|
17
|
+
if @go.empty?
|
18
|
+
STDERR.write "go not found"
|
19
|
+
exit(1)
|
20
|
+
end
|
21
|
+
|
22
|
+
if @rsync.empty?
|
23
|
+
STDERR.write "rsync not found"
|
24
|
+
exit(1)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Working directory
|
28
|
+
if ENV.has_key? 'TM_DIRECTORY'
|
29
|
+
@pwd = ENV['TM_DIRECTORY']
|
30
|
+
else
|
31
|
+
@pwd = Dir.pwd
|
32
|
+
end
|
33
|
+
|
34
|
+
# Home directory
|
35
|
+
@home = Dir.home
|
36
|
+
|
37
|
+
# Current Go package
|
38
|
+
@package = nil
|
39
|
+
|
40
|
+
# Janked Go package (might be higher in the filesystem than the current package)
|
41
|
+
@janked_package = nil
|
42
|
+
|
43
|
+
# Path to root of go package in gopath
|
44
|
+
@janked_gopath = nil
|
45
|
+
|
46
|
+
# Path to root of go package in local project
|
47
|
+
@janked_local_path = nil
|
48
|
+
|
49
|
+
# true if this package is to be janked into a gopath
|
50
|
+
@janked = false
|
51
|
+
|
52
|
+
# ENV supplied gopaths
|
53
|
+
@gopaths = ENV['GOPATH'] || ENV['JANK_GOPATH'] || ENV['TM_GOPATH']
|
54
|
+
if @gopaths == nil
|
55
|
+
@gopaths = Array.new
|
56
|
+
else
|
57
|
+
@gopaths = @gopaths.split(/:/).select {|p| p != ''}
|
58
|
+
end
|
59
|
+
|
60
|
+
# Array of janked_gopaths
|
61
|
+
@janked_gopaths = Array.new
|
62
|
+
|
63
|
+
# The gopath that contains the working directory, null if janked
|
64
|
+
@local_gopath = nil
|
65
|
+
|
66
|
+
read_config_files
|
67
|
+
|
68
|
+
@env = ENV
|
69
|
+
|
70
|
+
if @include_env_gopath == false
|
71
|
+
@env['GOPATH'] = @gopaths.uniq.join(':')
|
72
|
+
else
|
73
|
+
@env['GOPATH'] = (@janked_gopaths + @gopaths).uniq.join(':')
|
74
|
+
end
|
75
|
+
|
76
|
+
Jank.debug_log("GOPATH = #{@env['GOPATH']}")
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
def read_config_files
|
81
|
+
curdir = @pwd
|
82
|
+
parse_config(curdir)
|
83
|
+
|
84
|
+
until curdir == @home do
|
85
|
+
curdir = File.expand_path('..', curdir)
|
86
|
+
parse_config(curdir)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def parse_config(dir)
|
91
|
+
return if !File.exist?("#{dir}/.jank")
|
92
|
+
yaml = YAML.load_file("#{dir}/.jank")
|
93
|
+
|
94
|
+
if @include_env_gopath == nil && yaml.has_key?('env_gopath') && !yaml['env_gopath'].empty?
|
95
|
+
if yaml['env_gopath'] == 0 || yaml['env_gopath'] =~/false/i
|
96
|
+
@include_env_gopath = false
|
97
|
+
else
|
98
|
+
@include_env_gopath = true
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
if @local_gopath == nil && @janked_package == nil && yaml.has_key?('package') && !yaml['package'].empty?
|
103
|
+
@janked_package = yaml['package']
|
104
|
+
@janked = true
|
105
|
+
|
106
|
+
if @gopaths.length > 0
|
107
|
+
@janked_local_path = dir
|
108
|
+
@janked_gopath = "#{@gopaths.first}/src/#{@janked_package}"
|
109
|
+
@package = @pwd.gsub(/^#{@janked_local_path}/, @janked_package)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
if yaml.has_key?('gopath')
|
114
|
+
if !yaml['gopath'].kind_of?(Array)
|
115
|
+
yaml['gopath'] = Array.new( yaml['gopath'] )
|
116
|
+
end
|
117
|
+
|
118
|
+
yaml['gopath'].each do |gp|
|
119
|
+
gp = abs_gopath(dir, gp)
|
120
|
+
@janked_gopaths << gp
|
121
|
+
|
122
|
+
if @local_gopath == nil && !@janked && @pwd.start_with?(gp)
|
123
|
+
@local_gopath = gp
|
124
|
+
@package = @pwd.slice((@local_gopath.length + 5)..(@pwd.length))
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def abs_gopath(dir, gp)
|
131
|
+
return gp if gp =~ /^\//
|
132
|
+
File.realpath("#{dir}/#{gp}")
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
data/lib/debug.rb
ADDED
data/lib/executor.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require_relative 'debug'
|
2
|
+
|
3
|
+
module Jank
|
4
|
+
class Executor
|
5
|
+
def initialize(c)
|
6
|
+
@config = c
|
7
|
+
end
|
8
|
+
|
9
|
+
def apply_package(args)
|
10
|
+
return args if @config.package == nil
|
11
|
+
|
12
|
+
new_args = Array.new
|
13
|
+
package_applied = false
|
14
|
+
|
15
|
+
args.each do |a|
|
16
|
+
case a
|
17
|
+
when /^\./
|
18
|
+
package_applied = true
|
19
|
+
new_args << a.gsub(/^\./, @config.package)
|
20
|
+
when /\//
|
21
|
+
package_applied = true
|
22
|
+
new_args << a
|
23
|
+
when /\.go$/
|
24
|
+
package_applied = true
|
25
|
+
new_args << a
|
26
|
+
else
|
27
|
+
new_args << a
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
new_args << @config.package if !package_applied
|
32
|
+
new_args
|
33
|
+
end
|
34
|
+
|
35
|
+
def execute(cmd, args)
|
36
|
+
Jank.debug_log("🚀 #{cmd} #{args.inspect}")
|
37
|
+
Kernel.exec(@config.env, cmd, *args)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/go.rb
ADDED
data/lib/go_command.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require_relative 'command'
|
2
|
+
|
3
|
+
module Jank
|
4
|
+
class GoCommand < Command
|
5
|
+
def run_go
|
6
|
+
@janker.link
|
7
|
+
@exec.go(@args)
|
8
|
+
end
|
9
|
+
|
10
|
+
def run_go_with_janked_package
|
11
|
+
@janker.link
|
12
|
+
@exec.go( @exec.apply_package(@args) )
|
13
|
+
end
|
14
|
+
|
15
|
+
def build_command
|
16
|
+
run_go_with_janked_package
|
17
|
+
end
|
18
|
+
|
19
|
+
def clean_command
|
20
|
+
run_go_with_janked_package
|
21
|
+
end
|
22
|
+
|
23
|
+
def env_command
|
24
|
+
run_go
|
25
|
+
end
|
26
|
+
|
27
|
+
def fix_command
|
28
|
+
run_go_with_janked_package
|
29
|
+
end
|
30
|
+
|
31
|
+
def fmt_command
|
32
|
+
run_go_with_janked_package
|
33
|
+
end
|
34
|
+
|
35
|
+
def help
|
36
|
+
run_go
|
37
|
+
end
|
38
|
+
|
39
|
+
def generate_command
|
40
|
+
run_go_with_janked_package
|
41
|
+
end
|
42
|
+
|
43
|
+
def get_command
|
44
|
+
run_go
|
45
|
+
end
|
46
|
+
|
47
|
+
def install_command
|
48
|
+
run_go_with_janked_package
|
49
|
+
end
|
50
|
+
|
51
|
+
def list_command
|
52
|
+
@janker.link
|
53
|
+
run_go_with_janked_package
|
54
|
+
end
|
55
|
+
|
56
|
+
def run_command
|
57
|
+
run_go
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_command
|
61
|
+
run_go_with_janked_package
|
62
|
+
end
|
63
|
+
|
64
|
+
def tool_command
|
65
|
+
run_go
|
66
|
+
end
|
67
|
+
|
68
|
+
def version_command
|
69
|
+
run_go
|
70
|
+
end
|
71
|
+
|
72
|
+
def vet_command
|
73
|
+
run_go_with_janked_package
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'command'
|
2
|
+
|
3
|
+
module Jank
|
4
|
+
class GocodeCommand < Command
|
5
|
+
def initialize(args, config, janker, executor)
|
6
|
+
super(args, config, janker, executor)
|
7
|
+
|
8
|
+
@gocode = ENV['JANK_GOCODE'] || `which gocode`.chomp
|
9
|
+
if @gocode.empty?
|
10
|
+
puts "gocode is not installed. See https://github.com/nsf/gocode"
|
11
|
+
exit(1)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def dispatch
|
16
|
+
@janker.link
|
17
|
+
@exec.execute(@gocode, @args)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'command'
|
2
|
+
|
3
|
+
module Jank
|
4
|
+
class GodocCommand < Command
|
5
|
+
def initialize(args, config, janker, executor)
|
6
|
+
super(args, config, janker, executor)
|
7
|
+
|
8
|
+
@godoc = ENV['JANK_GODOC'] || `which godoc`.chomp
|
9
|
+
if @godoc.empty?
|
10
|
+
puts "gocode is not installed. Run:\n go get code.google.com/p/go.tools/cmd/godoc"
|
11
|
+
exit(1)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def dispatch
|
16
|
+
@janker.link
|
17
|
+
@exec.execute(@godoc, @args)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'command'
|
2
|
+
|
3
|
+
module Jank
|
4
|
+
class GofmtCommand < Command
|
5
|
+
def initialize(args, config, janker, executor)
|
6
|
+
super(args, config, janker, executor)
|
7
|
+
|
8
|
+
@gofmt = ENV['JANK_GOFMT'] || `which gofmt`.chomp
|
9
|
+
if @gofmt.empty?
|
10
|
+
puts "gofmt is not installed. See: https://golang.org/cmd/gofmt/"
|
11
|
+
exit(1)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def dispatch
|
16
|
+
@janker.link
|
17
|
+
@exec.execute(@gofmt, @args)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'command'
|
2
|
+
|
3
|
+
module Jank
|
4
|
+
class GoimportsCommand < Command
|
5
|
+
def initialize(args, config, janker, executor)
|
6
|
+
super(args, config, janker, executor)
|
7
|
+
|
8
|
+
@goimports = ENV['JANK_GOIMPORTS'] || `which goimports`.chomp
|
9
|
+
if @goimports.empty?
|
10
|
+
puts "goimports is not installed. See http://godoc.org/golang.org/x/tools/cmd/goimports"
|
11
|
+
exit(1)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def dispatch
|
16
|
+
@janker.link
|
17
|
+
@exec.execute(@goimports, @args)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'command'
|
2
|
+
|
3
|
+
module Jank
|
4
|
+
class GolintCommand < Command
|
5
|
+
def initialize(args, config, janker, executor)
|
6
|
+
super(args, config, janker, executor)
|
7
|
+
|
8
|
+
@golint = ENV['JANK_GOLINT'] || `which golint`.chomp
|
9
|
+
if @golint.empty?
|
10
|
+
puts "golint is not installed. See https://github.com/golang/lint"
|
11
|
+
exit(1)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def dispatch
|
16
|
+
@args = @exec.apply_package(@args)
|
17
|
+
@janker.link
|
18
|
+
@exec.execute(@golint, @args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/jank_command.rb
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
require_relative 'command'
|
2
|
+
|
3
|
+
module Jank
|
4
|
+
class JankCommand < Command
|
5
|
+
def config_command
|
6
|
+
puts @config.to_yaml
|
7
|
+
end
|
8
|
+
|
9
|
+
def help
|
10
|
+
topic_help = "#{@args[1]}_help_text"
|
11
|
+
if self.respond_to? topic_help
|
12
|
+
puts self.send(topic_help)
|
13
|
+
else
|
14
|
+
puts jank_help_text
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def gopath_command
|
19
|
+
puts @config.env['GOPATH']
|
20
|
+
end
|
21
|
+
|
22
|
+
def link_command
|
23
|
+
puts "Package #{@config.package || '[UNKNOWN]'} is not jankable" if !@janker.link
|
24
|
+
end
|
25
|
+
|
26
|
+
def package_command
|
27
|
+
@janker.sync_packages
|
28
|
+
|
29
|
+
if ARGV[1] == '-r' || ARGV[1] == '--reverse'
|
30
|
+
package = ARGV[2]
|
31
|
+
if package == nil
|
32
|
+
puts package_help_text
|
33
|
+
exit(1)
|
34
|
+
end
|
35
|
+
|
36
|
+
puts @janker.location_of_package(package)
|
37
|
+
exit
|
38
|
+
end
|
39
|
+
|
40
|
+
path = ARGV[1]
|
41
|
+
if path == nil
|
42
|
+
puts @config.package
|
43
|
+
exit
|
44
|
+
end
|
45
|
+
|
46
|
+
puts @janker.package_for_location path
|
47
|
+
end
|
48
|
+
|
49
|
+
def stat_command
|
50
|
+
@janker.sync_packages
|
51
|
+
@janker.walk_janked_packages do |package, local_path, go_path|
|
52
|
+
puts "#{package} --> #{local_path}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def sync_command
|
57
|
+
@janker.sync_packages
|
58
|
+
end
|
59
|
+
|
60
|
+
def unlink_command
|
61
|
+
all = @args[1] == '-a' || @args[1] == '--all'
|
62
|
+
|
63
|
+
if all
|
64
|
+
@janker.unlink_all
|
65
|
+
else
|
66
|
+
puts "Package #{@config.package || '[UNKNOWN]'} is not jankable" if !@janker.unlink
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def jank_help_text
|
71
|
+
<<-HELPTEXT
|
72
|
+
Jank - the janky Go build tool.
|
73
|
+
|
74
|
+
Usage:
|
75
|
+
|
76
|
+
jank command [arguments]
|
77
|
+
|
78
|
+
The commands are:
|
79
|
+
|
80
|
+
config show the jank configuration for the directory
|
81
|
+
gopath displays gopath for the directory
|
82
|
+
help show this!
|
83
|
+
link link a go-gettable source tree into the gopath
|
84
|
+
package displays the package for the current directory
|
85
|
+
stat lists packages linked into gopath
|
86
|
+
sync syncs packages linked into gopath
|
87
|
+
unlink unlink a go-gettable source tree from the gopath
|
88
|
+
|
89
|
+
Use "jank help [command]" for more information about a command.
|
90
|
+
HELPTEXT
|
91
|
+
end
|
92
|
+
|
93
|
+
def config_help_text
|
94
|
+
<<-HELPTEXT
|
95
|
+
usage: jank config
|
96
|
+
|
97
|
+
Displays the jank configuration for the current directory.
|
98
|
+
HELPTEXT
|
99
|
+
end
|
100
|
+
|
101
|
+
def gopath_help_text
|
102
|
+
<<-HELPTEXT
|
103
|
+
usage: jank path
|
104
|
+
|
105
|
+
Displays additional gopaths for this directory. Paths can
|
106
|
+
be added by placing .jank files in directories with the
|
107
|
+
key 'gopath'. The gopath key can map to a string or an array
|
108
|
+
of additional gopaths. Gopaths are scanned for in this manner
|
109
|
+
up the filesystem until the user's home directory.
|
110
|
+
|
111
|
+
Gopaths specified in the .jank file can be either absolute
|
112
|
+
paths or paths relative to the directory.
|
113
|
+
HELPTEXT
|
114
|
+
end
|
115
|
+
|
116
|
+
def link_help_text
|
117
|
+
<<-HELPTEXT
|
118
|
+
usage: jank link
|
119
|
+
|
120
|
+
For packages developed in a go-gettable stlye outside the
|
121
|
+
gopath, invoking link will link the package into the gopath.
|
122
|
+
This requires that the directory or some parent contains a
|
123
|
+
.jank file with the 'package' key set to go package name.
|
124
|
+
HELPTEXT
|
125
|
+
end
|
126
|
+
|
127
|
+
def package_help_text
|
128
|
+
<<-HELPTEXT
|
129
|
+
usage: jank package [flags] [path]
|
130
|
+
|
131
|
+
Flags:
|
132
|
+
-r, --reverse
|
133
|
+
Return directory for go package
|
134
|
+
|
135
|
+
Displays the package for the current directory or the path
|
136
|
+
if specified. Specifiying the reverse flag returns the
|
137
|
+
filesystem path of a go package.
|
138
|
+
HELPTEXT
|
139
|
+
end
|
140
|
+
|
141
|
+
def stat_help_text
|
142
|
+
<<-HELPTEXT
|
143
|
+
usage: jank stat
|
144
|
+
|
145
|
+
Displays a mapping of packages in the gopath that are linked
|
146
|
+
to go-gettable source trees that reside outside of the gopath.
|
147
|
+
HELPTEXT
|
148
|
+
end
|
149
|
+
|
150
|
+
def sync_help_text
|
151
|
+
<<-HELPTEXT
|
152
|
+
usage: jank sync
|
153
|
+
|
154
|
+
Syncs all packages linked into the gopath.
|
155
|
+
HELPTEXT
|
156
|
+
end
|
157
|
+
|
158
|
+
def unlink_help_text
|
159
|
+
<<-HELPTEXT
|
160
|
+
usage: jank unlink [flags]
|
161
|
+
|
162
|
+
Flags:
|
163
|
+
-a, --all
|
164
|
+
Unlink all linked packages
|
165
|
+
|
166
|
+
For packages developed in a go-gettable stlye outside the
|
167
|
+
gopath, invoking unlink will remove the package from the
|
168
|
+
gopath. This requires that the directory or some parent
|
169
|
+
contains a .jank file with the 'package' key set to go
|
170
|
+
package name.
|
171
|
+
HELPTEXT
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
data/lib/janker.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'find'
|
3
|
+
|
4
|
+
module Jank
|
5
|
+
class Janker
|
6
|
+
def initialize(config)
|
7
|
+
@config = config
|
8
|
+
end
|
9
|
+
|
10
|
+
def link
|
11
|
+
return false if !@config.janked
|
12
|
+
mark_janked_package
|
13
|
+
sync_packages
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def unlink
|
18
|
+
return false if !@config.janked
|
19
|
+
unmark_janked_package
|
20
|
+
sync_packages
|
21
|
+
true
|
22
|
+
end
|
23
|
+
|
24
|
+
def package_for_location(path)
|
25
|
+
Dir.chdir(File.realpath(path)) do
|
26
|
+
conf = Config.new
|
27
|
+
return conf.package
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def location_of_package(pkg)
|
32
|
+
local_gp = nil
|
33
|
+
path = nil
|
34
|
+
|
35
|
+
# Find location in gopath
|
36
|
+
(@config.janked_gopaths + @config.gopaths).each do |gp|
|
37
|
+
path = "#{gp}/src/#{pkg}"
|
38
|
+
next if !File.exist?(path) || !File.directory?(path)
|
39
|
+
local_gp = gp
|
40
|
+
break
|
41
|
+
end
|
42
|
+
|
43
|
+
return "" if local_gp == nil
|
44
|
+
|
45
|
+
# Translate path if janked
|
46
|
+
root = "#{local_gp}/src"
|
47
|
+
dir = path
|
48
|
+
janked_path = nil
|
49
|
+
janked_location = nil
|
50
|
+
|
51
|
+
while dir != root
|
52
|
+
jankfile = "#{dir}/JANKED"
|
53
|
+
if File.exist?(jankfile)
|
54
|
+
janked_path = dir
|
55
|
+
janked_location = File.read(jankfile)
|
56
|
+
break
|
57
|
+
end
|
58
|
+
|
59
|
+
dir = File.realpath("#{dir}/..")
|
60
|
+
end
|
61
|
+
|
62
|
+
if janked_path != nil
|
63
|
+
return path.gsub(/^#{janked_path}/, janked_location)
|
64
|
+
end
|
65
|
+
|
66
|
+
return path
|
67
|
+
end
|
68
|
+
|
69
|
+
def walk_janked_packages
|
70
|
+
@config.gopaths.each do |gp|
|
71
|
+
Find.find("#{gp}/src") do |path|
|
72
|
+
next if !FileTest.directory?(path)
|
73
|
+
Find.prune if File.basename(path).start_with? '.'
|
74
|
+
|
75
|
+
janked_file = "#{path}/JANKED"
|
76
|
+
if File.exist?(janked_file)
|
77
|
+
package = path.slice(gp.length+5..path.length)
|
78
|
+
yield package, File.read(janked_file), path
|
79
|
+
Find.prune
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def mark_janked_package
|
86
|
+
if @config.janked_local_path.start_with? @config.janked_gopath
|
87
|
+
raise "Trying to link a package already inside the gopath!"
|
88
|
+
end
|
89
|
+
|
90
|
+
FileUtils.mkdir_p(@config.janked_gopath)
|
91
|
+
File.open("#{@config.janked_gopath}/JANKED", 'w') {|f| f.write(@config.janked_local_path) }
|
92
|
+
end
|
93
|
+
|
94
|
+
def unmark_janked_package
|
95
|
+
if File.exist?(@config.janked_gopath)
|
96
|
+
FileUtils.rm_rf(@config.janked_gopath)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def sync_packages
|
101
|
+
walk_janked_packages do |package, local_path, go_path|
|
102
|
+
if File.exist?(local_path) && File.directory?(local_path) && ! File.symlink?(local_path)
|
103
|
+
rsync(local_path, go_path)
|
104
|
+
else
|
105
|
+
FileUtils.rm_rf(go_path)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def unlink_all
|
111
|
+
walk_janked_packages do |package, local_path, go_path|
|
112
|
+
FileUtils.rm_rf(go_path)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def rsync(src, dest)
|
117
|
+
return if src == dest
|
118
|
+
|
119
|
+
exclude = %w{JANKED .bzr .bzringore .hg .hgignore .git .gitignore .nfs}
|
120
|
+
opts = "--delete"
|
121
|
+
exclude.each {|e| opts += " --exclude #{e}"}
|
122
|
+
|
123
|
+
`rsync -az #{opts} "#{src}/" "#{dest}"`
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jank
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fred McCann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-05-17 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Jank is a suite of scripts that wrap the go command and a collection
|
14
|
+
of utility commands for go programming. Jank will rewrite the gopath dynamically
|
15
|
+
to support development of go-gettable and arbitrarily laid out projects outside
|
16
|
+
of a global gopath. These tools can be subsituted for the real versions to transparently
|
17
|
+
augment their behavior.
|
18
|
+
email:
|
19
|
+
- fred@sharpnoodles.com
|
20
|
+
executables:
|
21
|
+
- jank
|
22
|
+
- jgo
|
23
|
+
- jgocode
|
24
|
+
- jgodoc
|
25
|
+
- jgofmt
|
26
|
+
- jgoimports
|
27
|
+
- jgolint
|
28
|
+
extensions: []
|
29
|
+
extra_rdoc_files: []
|
30
|
+
files:
|
31
|
+
- bin/jank
|
32
|
+
- bin/jgo
|
33
|
+
- bin/jgocode
|
34
|
+
- bin/jgodoc
|
35
|
+
- bin/jgofmt
|
36
|
+
- bin/jgoimports
|
37
|
+
- bin/jgolint
|
38
|
+
- lib/base.rb
|
39
|
+
- lib/command.rb
|
40
|
+
- lib/config.rb
|
41
|
+
- lib/debug.rb
|
42
|
+
- lib/executor.rb
|
43
|
+
- lib/go.rb
|
44
|
+
- lib/go_command.rb
|
45
|
+
- lib/gocode_command.rb
|
46
|
+
- lib/godoc_command.rb
|
47
|
+
- lib/gofmt_command.rb
|
48
|
+
- lib/goimports_command.rb
|
49
|
+
- lib/golint_command.rb
|
50
|
+
- lib/jank_command.rb
|
51
|
+
- lib/janker.rb
|
52
|
+
homepage: http://gojank.com
|
53
|
+
licenses:
|
54
|
+
- BSD
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 2.4.7
|
73
|
+
signing_key:
|
74
|
+
specification_version: 4
|
75
|
+
summary: jank - the janky Go build tool
|
76
|
+
test_files: []
|