yank 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4707b4b285e8f4572037682fcb3229695b8e18b3
4
+ data.tar.gz: 6caf86b471ae378c6d5afe1d325a892f2f4f404c
5
+ SHA512:
6
+ metadata.gz: 26bd47ec04a27dd5a6c8e68dc2fa1849365000108bcb8fa1385c7d7c54b916dadfd263e5db02724238b4446413e0e2bd155ce80fc9a809e92d10b77b007efbd2
7
+ data.tar.gz: 89126f9d8d831e76bbeac0512da259f27f0e59ca122b7141cbf30f7d0d066df0743d1d33caf348b0130acb526d7f99d85c6ac95afd5ab3d2a180015b636164d3
data/bin/yank ADDED
@@ -0,0 +1,53 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'logger'
4
+ require 'optparse'
5
+ require 'fileutils'
6
+ require_relative '../lib/yank'
7
+ require_relative '../lib/logging'
8
+
9
+ include Yank::Logging
10
+
11
+ yank_file = '.yank'
12
+ yank_target = './target'
13
+ $yank_debug = nil
14
+
15
+ OptionParser.new do |opts|
16
+ opts.banner = "Usage: #{__FILE__} [options]\n\nOptions:\n"
17
+
18
+ opts.on('-h', '--help', 'Prints usage.'){
19
+ puts opts
20
+ exit 0
21
+ }
22
+
23
+ opts.on('-f', '--file FILE', "Yank file to use, defaults to '.yank'"){|v| yank_file = v}
24
+ opts.on('-t', '--target TARGET', 'Directory to install yanks to'){|v| yank_target = v}
25
+ opts.on('-d', '--debug', 'Turn on debug logging'){|v| $yank_debug = Logger::DEBUG}
26
+ end.parse!
27
+
28
+ begin
29
+ # Load the yank file
30
+ unless File.exists?(yank_file)
31
+ raise Yank::YankException.new("missing '#{yank_file}' file.")
32
+ end
33
+
34
+ files_to_remove = Dir[File.join(yank_target, '*')]
35
+ logger.debug("removing previous yanks: #{files_to_remove}")
36
+ FileUtils.rm_rf(files_to_remove)
37
+
38
+ # For now just default to using the .yank file for parameters
39
+ yanks = Yank.parse_yanks(yank_file)
40
+
41
+ # Check the yank target directory exists
42
+ unless File.exists?(yank_target)
43
+ raise Yank::YankException.new("target directory is missing #{yank_target}.")
44
+ end
45
+
46
+ Yank::Yank.new.install(yanks, yank_target)
47
+ rescue Yank::YankException => e
48
+ puts "ERROR: #{e.message}"
49
+ exit e.exit_code
50
+ end
51
+
52
+ puts "Yank successful."
53
+ exit 0
data/lib/logging.rb ADDED
@@ -0,0 +1,25 @@
1
+ require 'logger'
2
+
3
+ module Yank
4
+ module Logging
5
+ def logger
6
+ @logger ||= Logging.logger_for(self.class.name)
7
+ end
8
+
9
+ # Use a hash class-ivar to cache a unique Logger per class:
10
+ @loggers = {}
11
+
12
+ class << self
13
+ def logger_for(classname)
14
+ @loggers[classname] ||= configure_logger_for(classname)
15
+ end
16
+
17
+ def configure_logger_for(classname)
18
+ logger = Logger.new(STDOUT)
19
+ logger.progname = classname
20
+ logger.level = $yank_debug || Logger::INFO
21
+ logger
22
+ end
23
+ end
24
+ end
25
+ end
data/lib/vcs/git.rb ADDED
@@ -0,0 +1,36 @@
1
+ require 'open3'
2
+ require_relative '../logging'
3
+
4
+ module Yank
5
+ class Git
6
+ attr_reader :repo_name
7
+
8
+ include ::Yank::Logging
9
+
10
+ def initialize(repo_name, repo, version)
11
+ git = `which git`
12
+ if git.nil? or git.empty?
13
+ raise ::Yank::YankException.new("git must be installed and on the PATH.")
14
+ end
15
+
16
+ @repo = repo
17
+ @repo_name = repo_name || @repo.split(".git")[0].split("/").last
18
+ @version = version
19
+
20
+ logger.debug("git repo: #{@repo}")
21
+ logger.debug("git repo name: #{@repo_name}")
22
+ logger.debug("git repo version: #{@version}")
23
+ end
24
+
25
+ def install(dir)
26
+ logger.debug("Cloning into #{@repo}...")
27
+ logger.debug(Open3.capture3("git clone --recursive #{@repo} #{dir}/#{@repo_name}"))
28
+
29
+ case @version["type"]
30
+ when "branch", "tag", "commit"
31
+ logger.debug("Checking out #{@version["value"]}...")
32
+ logger.debug(Open3.capture3("cd #{dir}/#{@repo_name} && git checkout #{@version["value"]}"))
33
+ end
34
+ end
35
+ end
36
+ end
data/lib/yank.kwalify ADDED
@@ -0,0 +1,40 @@
1
+ type: map
2
+ mapping:
3
+ "path":
4
+ type: str
5
+ required: false
6
+ "yanks":
7
+ required: true
8
+ type: seq
9
+ sequence:
10
+ - type: map
11
+ mapping:
12
+ "recurse":
13
+ type: bool
14
+ required: false
15
+ default: true
16
+ "alias":
17
+ type: str
18
+ required: false
19
+ "vcs":
20
+ type: str
21
+ enum:
22
+ - git
23
+ required: true
24
+ "repo":
25
+ type: str
26
+ required: true
27
+ "version":
28
+ required: true
29
+ type: map
30
+ mapping:
31
+ "type":
32
+ required: true
33
+ type: str
34
+ enum:
35
+ - tag
36
+ - branch
37
+ - commit
38
+ "value":
39
+ type: str
40
+ required: true
data/lib/yank.rb ADDED
@@ -0,0 +1,77 @@
1
+ require 'kwalify'
2
+ require_relative 'vcs/git'
3
+ require_relative 'yank_exception'
4
+ require_relative 'logging'
5
+
6
+ module Yank
7
+ class Yank
8
+ include ::Yank::Logging
9
+
10
+ def install(options, target)
11
+ for yank in options["yanks"]
12
+ logger.debug("verifying yank: #{yank}")
13
+ vcs = get_vcs(yank)
14
+
15
+ if ::Yank.yank_exists?(yank["alias"].nil?? vcs.repo_name: yank["alias"], target)
16
+ logger.debug("yank already installed, skipping")
17
+ next
18
+ end
19
+
20
+ logger.debug("installing yank with vcs: #{vcs}")
21
+ vcs.install(target)
22
+
23
+ if yank["recurse"]
24
+ yank_file = ::Yank.get_yanks_file(target, yank["alias"].nil?? vcs.repo_name: yank["alias"])
25
+
26
+ return if yank_file.nil?
27
+
28
+ logger.debug("recursing into #{yank_file}")
29
+ return install(::Yank::parse_yanks(yank_file), target)
30
+ end
31
+ end
32
+ end
33
+
34
+ private
35
+ def get_vcs(yank)
36
+ vcs = nil
37
+
38
+ case yank["vcs"]
39
+ when 'git'
40
+ vcs = ::Yank::Git.new(yank["alias"], yank["repo"], yank["version"])
41
+ end
42
+
43
+ if vcs.nil?
44
+ raise ::Yank::YankException.new("illegal vcs.")
45
+ end
46
+
47
+ return vcs
48
+ end
49
+ end
50
+
51
+ def self.yank_exists?(name, target)
52
+ return File.exists?(File.join(target, name))
53
+ end
54
+
55
+ def self.get_yanks_file(target, name)
56
+ yanks_file = File.join(target, name, ".yanks")
57
+
58
+ if yanks_file.nil? || !File.exists?(yanks_file)
59
+ return nil
60
+ else
61
+ return yanks_file
62
+ end
63
+ end
64
+
65
+ def self.parse_yanks(yank_file)
66
+ schema = Kwalify::Yaml.load_file("#{File.join(File.dirname(__FILE__), 'yank.kwalify')}")
67
+ validator = Kwalify::Validator.new(schema)
68
+ document = Kwalify::Yaml.load_file(yank_file)
69
+ errors = validator.validate(document)
70
+
71
+ if !errors.nil? && !errors.empty?
72
+ raise ::Yank::YankException.new("unable to validate '#{yank_file}' file: #{errors.join('\n')}.")
73
+ end
74
+
75
+ return document
76
+ end
77
+ end
@@ -0,0 +1,12 @@
1
+
2
+ module Yank
3
+ class YankException < Exception
4
+ attr_reader :exit_code
5
+
6
+ def initialize(message)
7
+ super(message)
8
+
9
+ @exit_code = 1
10
+ end
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yank
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Justin Lathrop
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: kwalify
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.2
27
+ description: Dependency manager
28
+ email: jelathrop@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - bin/yank
34
+ - lib/logging.rb
35
+ - lib/vcs/git.rb
36
+ - lib/yank.kwalify
37
+ - lib/yank.rb
38
+ - lib/yank_exception.rb
39
+ homepage: https://github.com/jelathro/yank
40
+ licenses: []
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 2.0.14.1
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: Generic dependency management for popular version control systems
62
+ test_files: []