dependency_wiring 0.0.28
Sign up to get free protection for your applications and to get access to all the features.
- data/.flow +8 -0
- data/.hgignore +20 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +33 -0
- data/Rakefile +59 -0
- data/bin/dw +11 -0
- data/dependency_wiring.gemspec +21 -0
- data/lib/dependency_wiring/configuration.rb +35 -0
- data/lib/dependency_wiring/dsl.rb +29 -0
- data/lib/dependency_wiring/git.rb +77 -0
- data/lib/dependency_wiring/mercurial.rb +76 -0
- data/lib/dependency_wiring/mount_point.rb +31 -0
- data/lib/dependency_wiring/scm.rb +44 -0
- data/lib/dependency_wiring/shell_command.rb +21 -0
- data/lib/dependency_wiring/thor_app.rb +30 -0
- data/lib/dependency_wiring/version.rb +3 -0
- data/lib/dependency_wiring/wiring.rb +23 -0
- data/lib/dependency_wiring.rb +5 -0
- data/spec/git_spec.rb +149 -0
- data/spec/mercurial_spec.rb +150 -0
- data/spec/mount_point_spec.rb +49 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/version_spec.rb +9 -0
- metadata +108 -0
data/.flow
ADDED
data/.hgignore
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
syntax:regexp
|
2
|
+
^\.bundle
|
3
|
+
^\.config
|
4
|
+
^\.yardoc
|
5
|
+
^Gemfile\.lock
|
6
|
+
^InstalledFiles
|
7
|
+
^_yardoc
|
8
|
+
^coverage
|
9
|
+
^doc/
|
10
|
+
^lib/bundler/man
|
11
|
+
^pkg
|
12
|
+
^rdoc
|
13
|
+
^spec/reports
|
14
|
+
^test/tmp
|
15
|
+
^test/version_tmp
|
16
|
+
^tmp
|
17
|
+
^\.rvmrc
|
18
|
+
syntax:glob
|
19
|
+
*.gem
|
20
|
+
*.rbc
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Alessio Caiazza
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# DependencyWiring
|
2
|
+
|
3
|
+
**Pay attention! Very alpha development stage**
|
4
|
+
|
5
|
+
Many times I had to manage dependencies versioning for build chains that didn't implement a proper dependencies management process.
|
6
|
+
|
7
|
+
Sometimes I wrote a ruby script to automatically fetch them, sometimes I used mercurial suberepositories and sometimes I also added them under my own revision control system :(
|
8
|
+
|
9
|
+
Now DependecyWiring is here. It know nothing about your build chain, it only needs to know sources and destinations!
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Install it yourself as:
|
14
|
+
|
15
|
+
$ gem install dependency_wiring
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
|
19
|
+
Create a file named `deps.rb` in the root of your project, it's plain ruby but you can use a simple DSL to define your dependencies.
|
20
|
+
|
21
|
+
mount "/home/nolith/projects/libs/js/jquery-1.78", "deps/jquery"
|
22
|
+
hg 'https://bitbucket.org/yujiewu/hgflow', 'deps/lib1', tag: 'v0.9.5'
|
23
|
+
git 'git://github.com/rails/rails.git', 'deps/rails', branch: '3-2-stable'
|
24
|
+
|
25
|
+
Now simply execute `dw wire` and you are done ;)
|
26
|
+
|
27
|
+
## Contributing
|
28
|
+
|
29
|
+
1. Fork it
|
30
|
+
2. Make your development on develop branch (`hg update develop`) (using HgFlow[1] is greatly appreciated)
|
31
|
+
3. Create new Pull Request
|
32
|
+
|
33
|
+
[1]: https://bitbucket.org/yujiewu/hgflow
|
data/Rakefile
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'rspec/core/rake_task'
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
|
4
|
+
#monkeypatching - use hg instead of git
|
5
|
+
module Bundler
|
6
|
+
class GemHelper
|
7
|
+
protected
|
8
|
+
def hg_clean?
|
9
|
+
!(sh("hg su | grep commit:") =~ /^commit: \(clean\)/).nil?
|
10
|
+
end
|
11
|
+
alias_method :clean?, :hg_clean?
|
12
|
+
|
13
|
+
def hg_guard_already_tagged
|
14
|
+
if sh('hg tags').split(/\n/).include?(version_tag)
|
15
|
+
raise("This tag has already been committed to the repo.")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
alias_method :guard_already_tagged, :hg_guard_already_tagged
|
19
|
+
|
20
|
+
def hg_tag_version
|
21
|
+
#sh "hg tag -m \"Version #{version}\" #{version_tag}"
|
22
|
+
#Bundler.ui.confirm "Tagged #{version_tag}"
|
23
|
+
yield if block_given?
|
24
|
+
#rescue
|
25
|
+
#Bundler.ui.error "Untagged #{version_tag} due to error"
|
26
|
+
#sh_with_code "hg tag --remove #{version_tag}"
|
27
|
+
#raise
|
28
|
+
end
|
29
|
+
alias_method :tag_version, :hg_tag_version
|
30
|
+
|
31
|
+
def hg_push
|
32
|
+
#cmd = "hg push"
|
33
|
+
#out, code = sh_with_code(cmd)
|
34
|
+
#raise "Couldn't hg push. `#{cmd}' failed with the following output:\n\n#{out}\n" unless code == 0
|
35
|
+
#Bundler.ui.confirm "Pushed hg commits and tags"
|
36
|
+
end
|
37
|
+
alias_method :git_push, :hg_push
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
RSpec::Core::RakeTask.new('spec')
|
42
|
+
|
43
|
+
def load_dw(args)
|
44
|
+
lib = File.expand_path('../lib', __FILE__)
|
45
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
46
|
+
puts "executing with #{lib} in $LOAD_PATH"
|
47
|
+
require 'dependency_wiring/thor_app'
|
48
|
+
DependencyWiring::ThorApp.start(args, {})
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
desc "Run dw from the development environment"
|
53
|
+
task :run, :dw_params do |t, args|
|
54
|
+
params = args[:dw_params]
|
55
|
+
params = '' if params.nil?
|
56
|
+
load_dw params.split(' ')
|
57
|
+
end
|
58
|
+
|
59
|
+
task :run
|
data/bin/dw
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'dependency_wiring/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "dependency_wiring"
|
8
|
+
gem.version = DependencyWiring::VERSION
|
9
|
+
gem.authors = ["Alessio Caiazza"]
|
10
|
+
gem.email = ["nolith@abisso.org"]
|
11
|
+
gem.description = %q{Dependency Wiring Tool}
|
12
|
+
gem.summary = %q{An agnostic dependency wiring system for project management.}
|
13
|
+
gem.homepage = "https://bitbucket.org/nolith/dependency-wiring"
|
14
|
+
|
15
|
+
gem.files = `hg manifest`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
gem.add_development_dependency "rspec", ">= 2.0.0"
|
20
|
+
gem.add_dependency "thor"
|
21
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'dependency_wiring/dsl'
|
2
|
+
|
3
|
+
module DependencyWiring
|
4
|
+
class Configuration
|
5
|
+
include DSL
|
6
|
+
|
7
|
+
def initialize(src_file, config={})
|
8
|
+
@src_file = src_file
|
9
|
+
@config = config
|
10
|
+
end
|
11
|
+
|
12
|
+
def load_dependencies
|
13
|
+
init()
|
14
|
+
instance_eval(read(), @src_file)
|
15
|
+
end
|
16
|
+
|
17
|
+
def show
|
18
|
+
puts "Dependencies list"
|
19
|
+
deps().each { |d| puts d }
|
20
|
+
end
|
21
|
+
|
22
|
+
def wire_all
|
23
|
+
deps().each do |dep|
|
24
|
+
puts "wiring #{dep}"
|
25
|
+
dep.prepare_dest
|
26
|
+
dep.wire
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
def read()
|
32
|
+
File.open(@src_file, 'r') { |f| f.read }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'dependency_wiring/mount_point'
|
2
|
+
require 'dependency_wiring/mercurial'
|
3
|
+
require 'dependency_wiring/git'
|
4
|
+
|
5
|
+
|
6
|
+
module DependencyWiring
|
7
|
+
module DSL
|
8
|
+
@deps = []
|
9
|
+
def init
|
10
|
+
@deps = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def deps
|
14
|
+
@deps
|
15
|
+
end
|
16
|
+
|
17
|
+
def mount(src, dest)
|
18
|
+
@deps << MountPoint.new(src, dest)
|
19
|
+
end
|
20
|
+
|
21
|
+
def hg(src,dest, opts={})
|
22
|
+
@deps << Mercurial.new(src, dest, opts)
|
23
|
+
end
|
24
|
+
|
25
|
+
def git(src,dest, opts={})
|
26
|
+
@deps << Git.new(src, dest, opts)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'dependency_wiring/scm'
|
2
|
+
|
3
|
+
module DependencyWiring
|
4
|
+
class Git < SCM
|
5
|
+
|
6
|
+
def clone
|
7
|
+
ret = sh_with_code("git clone #{git_opts} #{@src} .")
|
8
|
+
raise("GIT: Cannot clone #{@src} into #{@dest}! Output: #{ret[0]}") if ret[1] != 0
|
9
|
+
rev = git_revision
|
10
|
+
update if (rev != @opts[:branc] && rev != default_opts[:rev])
|
11
|
+
end
|
12
|
+
|
13
|
+
def pull
|
14
|
+
ret = sh_with_code("git fetch #{@src}")
|
15
|
+
raise("GIT: Cannot fetch #{@dest}! Output: #{ret[0]}") if ret[1] != 0
|
16
|
+
end
|
17
|
+
|
18
|
+
def update
|
19
|
+
ret = sh_with_code("git checkout #{git_revision}")
|
20
|
+
if ret[1] != 0
|
21
|
+
raise("GIT: Cannot update #{@dest} to #{git_revision}! Output: #{ret[0]}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def wire
|
26
|
+
super
|
27
|
+
pull
|
28
|
+
update
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_s
|
32
|
+
"git(#{@src}, #{@opts}) -> #{@dest}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def default_opts
|
36
|
+
{ rev: 'HEAD' }
|
37
|
+
end
|
38
|
+
|
39
|
+
def valid_destination?
|
40
|
+
if File.directory? @dest
|
41
|
+
Dir.chdir(@dest) {
|
42
|
+
File.exists? '.git'
|
43
|
+
}
|
44
|
+
else
|
45
|
+
false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
def git_opts
|
51
|
+
branch = @opts[:branch]
|
52
|
+
return "-b #{branch} " unless branch.nil?
|
53
|
+
""
|
54
|
+
end
|
55
|
+
|
56
|
+
def git_revision
|
57
|
+
branch = @opts[:branch]
|
58
|
+
rev = @opts[:rev]
|
59
|
+
tag = @opts[:tag]
|
60
|
+
if rev == default_opts[:rev]
|
61
|
+
if(!branch.nil? && !tag.nil?)
|
62
|
+
raise("Cannot specify tag and branch")
|
63
|
+
elsif branch.nil? && !tag.nil?
|
64
|
+
tag
|
65
|
+
elsif tag.nil? && !branch.nil?
|
66
|
+
branch
|
67
|
+
else
|
68
|
+
rev
|
69
|
+
end
|
70
|
+
elsif(branch.nil? && tag.nil?)
|
71
|
+
rev
|
72
|
+
else
|
73
|
+
raise("Cannot specify tag, rev and branch")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'dependency_wiring/scm'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
module DependencyWiring
|
5
|
+
class Mercurial < SCM
|
6
|
+
|
7
|
+
def clone
|
8
|
+
ret = sh_with_code("hg clone #{hg_opts} #{@src} .")
|
9
|
+
raise("HG: Cannot clone #{@src} into #{@dest}! Output: #{ret[0]}") if ret[1] != 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def pull
|
13
|
+
ret = sh_with_code("hg pull #{hg_opts} #{@src}")
|
14
|
+
raise("HG: Cannot pull #{@dest}! Output: #{ret[0]}") if ret[1] != 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def update
|
18
|
+
ret = sh_with_code("hg update -C #{hg_revision}")
|
19
|
+
if ret[1] != 0
|
20
|
+
raise("HG: Cannot update #{@dest} to #{hg_revision}! Output: #{ret[0]}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def wire
|
25
|
+
super
|
26
|
+
pull
|
27
|
+
update
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
"hg(#{@src}, #{@opts}) -> #{@dest}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def default_opts
|
35
|
+
{ branch: 'default' }
|
36
|
+
end
|
37
|
+
|
38
|
+
def valid_destination?
|
39
|
+
ret = sh_with_code('hg su')
|
40
|
+
ret[1] == 0
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
def hg_opts
|
45
|
+
opts = StringIO.new
|
46
|
+
branch = @opts[:branch]
|
47
|
+
opts << "-b #{branch} " unless branch.nil?
|
48
|
+
rev = @opts[:rev]
|
49
|
+
opts << "-r #{rev} " unless rev.nil?
|
50
|
+
tag = @opts[:tag]
|
51
|
+
opts << "-r #{tag} " unless tag.nil?
|
52
|
+
opts.string
|
53
|
+
end
|
54
|
+
|
55
|
+
def hg_revision
|
56
|
+
branch = @opts[:branch]
|
57
|
+
rev = @opts[:rev]
|
58
|
+
tag = @opts[:tag]
|
59
|
+
if branch == default_opts[:branch]
|
60
|
+
if(!rev.nil? && !tag.nil?)
|
61
|
+
raise("Cannot specify tag, rev")
|
62
|
+
elsif rev.nil? && !tag.nil?
|
63
|
+
tag
|
64
|
+
elsif tag.nil? && !rev.nil?
|
65
|
+
rev
|
66
|
+
else
|
67
|
+
branch
|
68
|
+
end
|
69
|
+
elsif(rev.nil? && tag.nil?)
|
70
|
+
branch
|
71
|
+
else
|
72
|
+
raise("Cannot specify tag, rev and branch")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'dependency_wiring/wiring'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module DependencyWiring
|
5
|
+
class MountPoint
|
6
|
+
include DependencyWiring::Wiring
|
7
|
+
|
8
|
+
def prepare_dest
|
9
|
+
parent = File.split(@dest)[0]
|
10
|
+
FileUtils.mkdir_p(parent)
|
11
|
+
end
|
12
|
+
|
13
|
+
def wire
|
14
|
+
prepare_dest
|
15
|
+
relink
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def relink
|
21
|
+
if(File.exists? @dest)
|
22
|
+
if(File.symlink? @dest)
|
23
|
+
File.delete(@dest)
|
24
|
+
else
|
25
|
+
raise("#{@dest} already exists!")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
FileUtils.ln_s(@src, @dest)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'dependency_wiring/wiring'
|
2
|
+
require 'dependency_wiring/shell_command'
|
3
|
+
|
4
|
+
module DependencyWiring
|
5
|
+
class SCM
|
6
|
+
include DependencyWiring::Wiring
|
7
|
+
include DependencyWiring::ShellCommand
|
8
|
+
|
9
|
+
attr_accessor :opts
|
10
|
+
def initialize(src, dest, opts = {})
|
11
|
+
super(src, dest)
|
12
|
+
@opts = default_opts().merge(opts)
|
13
|
+
end
|
14
|
+
|
15
|
+
# def clone
|
16
|
+
# end
|
17
|
+
|
18
|
+
# def pull
|
19
|
+
# end
|
20
|
+
|
21
|
+
# def update
|
22
|
+
# end
|
23
|
+
|
24
|
+
def default_opts
|
25
|
+
{}
|
26
|
+
end
|
27
|
+
|
28
|
+
def prepare_dest
|
29
|
+
if File.exists?(@dest) && File.directory?(@dest)
|
30
|
+
unless valid_destination?
|
31
|
+
raise("#{@dest} doesn't seems to be a working copy.")
|
32
|
+
end
|
33
|
+
else
|
34
|
+
super()
|
35
|
+
begin
|
36
|
+
clone
|
37
|
+
rescue Exception => e
|
38
|
+
Dir.delete(@dest) if File.exists?(@dest) && File.directory?(@dest)
|
39
|
+
raise e
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module DependencyWiring
|
2
|
+
module ShellCommand
|
3
|
+
protected
|
4
|
+
def sh(cmd, &block)
|
5
|
+
out, code = sh_with_code(cmd, &block)
|
6
|
+
code == 0 ? out : raise(out.empty? ? "Running `#{cmd}' failed. Run this command directly for more detailed output." : out)
|
7
|
+
end
|
8
|
+
|
9
|
+
def sh_with_code(cmd, &block)
|
10
|
+
cmd << " 2>&1"
|
11
|
+
outbuf = ''
|
12
|
+
Dir.chdir(@dest) {
|
13
|
+
outbuf = `#{cmd}`
|
14
|
+
if $? == 0
|
15
|
+
block.call(outbuf) if block
|
16
|
+
end
|
17
|
+
}
|
18
|
+
[outbuf, $?]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'dependency_wiring/configuration'
|
2
|
+
require 'thor'
|
3
|
+
|
4
|
+
module DependencyWiring
|
5
|
+
class ThorApp < Thor
|
6
|
+
DEFAULT_CONF = "deps.rb"
|
7
|
+
|
8
|
+
desc "version", "print version number"
|
9
|
+
def version
|
10
|
+
puts "dw tool ver. #{DependencyWiring::VERSION}"
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "show", "prints dependencies mount points"
|
14
|
+
def show(file=DEFAULT_CONF)
|
15
|
+
load_config(file).show
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "wire", "update all the dependencies"
|
19
|
+
def wire(file=DEFAULT_CONF)
|
20
|
+
load_config(file).wire_all
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
def load_config(file)
|
25
|
+
c = Configuration.new(file)
|
26
|
+
c.load_dependencies
|
27
|
+
c
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module DependencyWiring
|
4
|
+
module Wiring
|
5
|
+
attr_accessor :src, :dest
|
6
|
+
def initialize(src, dest)
|
7
|
+
@src = src
|
8
|
+
@dest = dest
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
"#{src} -> #{dest}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def prepare_dest
|
16
|
+
FileUtils.mkdir_p(@dest)
|
17
|
+
end
|
18
|
+
|
19
|
+
def wire
|
20
|
+
prepare_dest
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/git_spec.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require 'dependency_wiring/git'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tmpdir'
|
5
|
+
|
6
|
+
describe DependencyWiring do
|
7
|
+
describe 'Git' do
|
8
|
+
include FileUtils
|
9
|
+
|
10
|
+
BRANCH = 'develop'
|
11
|
+
TAG = 'v0.0.1'
|
12
|
+
|
13
|
+
def check_head
|
14
|
+
cd(@dest) do
|
15
|
+
File.open('test', 'r') do |f|
|
16
|
+
f.readline.strip.should == "master-head"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def check_branch
|
22
|
+
cd(@dest) do
|
23
|
+
File.open('test', 'r') do |f|
|
24
|
+
f.readline.strip.should == "test"
|
25
|
+
f.readline.strip.should == "dev branch"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def check_tag
|
31
|
+
cd(@dest) do
|
32
|
+
File.open('test', 'r') do |f|
|
33
|
+
f.readline.strip.should == "test"
|
34
|
+
f.eof?.should be true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
before(:all) do
|
40
|
+
@src = Dir.mktmpdir
|
41
|
+
cd(@src) do
|
42
|
+
`git init .`
|
43
|
+
`echo test > test`
|
44
|
+
`git add test`
|
45
|
+
`git commit -m "test"`
|
46
|
+
`git checkout -b develop`
|
47
|
+
`echo "dev branch" >> test`
|
48
|
+
`git commit -am "dev b"`
|
49
|
+
`git checkout master; git tag v0.0.1`
|
50
|
+
`echo master-head > test; git commit -am "final"`
|
51
|
+
end
|
52
|
+
@dest = File.join('test', 'tmp', 'git', 'working_copy')
|
53
|
+
end
|
54
|
+
|
55
|
+
after(:all) do
|
56
|
+
rm_rf @src
|
57
|
+
rm_rf @dest
|
58
|
+
end
|
59
|
+
|
60
|
+
context "missing git working copy and static repo" do
|
61
|
+
before(:each) do
|
62
|
+
rm_rf @dest
|
63
|
+
@git = DependencyWiring::Git.new(@src, @dest)
|
64
|
+
end
|
65
|
+
it 'should clone the repo' do
|
66
|
+
File.exists?(@dest).should be false
|
67
|
+
@git.wire
|
68
|
+
File.exists?(@dest).should be true
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should clone the HEAD' do
|
72
|
+
File.exists?(@dest).should be false
|
73
|
+
@git.wire
|
74
|
+
File.exists?(@dest).should be true
|
75
|
+
check_head
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should clone the devlop branch' do
|
79
|
+
File.exists?(@dest).should be false
|
80
|
+
@git.opts[:branch] = BRANCH
|
81
|
+
@git.wire
|
82
|
+
File.exists?(@dest).should be true
|
83
|
+
check_branch
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should clone the v0.0.1 tag' do
|
87
|
+
File.exists?(@dest).should be false
|
88
|
+
@git.opts[:tag] = TAG
|
89
|
+
@git.wire
|
90
|
+
File.exists?(@dest).should be true
|
91
|
+
check_tag
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should detect an existing destination that isn\'t a working copy (file)' do
|
95
|
+
File.open(@dest, 'w') { |f| f << 'occupied' }
|
96
|
+
expect { @git.wire }.to raise_error
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should detect an existing destination that isn\'t a working copy (folder)' do
|
100
|
+
mkdir_p(@dest)
|
101
|
+
expect { @git.wire }.to raise_error
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context "cloned at HEAD" do
|
106
|
+
before(:each) do
|
107
|
+
rm_rf @dest
|
108
|
+
@git = DependencyWiring::Git.new(@src, @dest)
|
109
|
+
@git.wire
|
110
|
+
check_head
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should switch to branch on wire' do
|
114
|
+
@git.opts[:branch] = 'develop'
|
115
|
+
@git.wire
|
116
|
+
check_branch
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should switch to tag on wire' do
|
120
|
+
@git.opts[:tag] = 'v0.0.1'
|
121
|
+
@git.wire
|
122
|
+
check_tag
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context "cloned at branch" do
|
127
|
+
before(:each) do
|
128
|
+
rm_rf @dest
|
129
|
+
@git = DependencyWiring::Git.new(@src, @dest, branch: 'develop')
|
130
|
+
@git.wire
|
131
|
+
check_branch
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'should switch to HEAD on wire' do
|
135
|
+
@git.opts[:branch] = 'master'
|
136
|
+
@git.opts[:rev] = 'HEAD'
|
137
|
+
@git.wire
|
138
|
+
check_head
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'should switch to tag on wire' do
|
142
|
+
@git.opts[:branch] = nil
|
143
|
+
@git.opts[:tag] = 'v0.0.1'
|
144
|
+
@git.wire
|
145
|
+
check_tag
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require 'dependency_wiring/mercurial'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tmpdir'
|
5
|
+
|
6
|
+
describe DependencyWiring do
|
7
|
+
describe 'Mercurial' do
|
8
|
+
include FileUtils
|
9
|
+
|
10
|
+
BRANCH = 'develop'
|
11
|
+
TAG = 'v0.0.1'
|
12
|
+
|
13
|
+
def check_head
|
14
|
+
cd(@dest) do
|
15
|
+
File.open('test', 'r') do |f|
|
16
|
+
f.readline.strip.should == "master-head"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def check_branch
|
22
|
+
cd(@dest) do
|
23
|
+
File.open('test', 'r') do |f|
|
24
|
+
f.readline.strip.should == "test"
|
25
|
+
f.readline.strip.should == "dev branch"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def check_tag
|
31
|
+
cd(@dest) do
|
32
|
+
File.open('test', 'r') do |f|
|
33
|
+
f.readline.strip.should == "test"
|
34
|
+
f.eof?.should be true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
before(:all) do
|
40
|
+
@src = Dir.mktmpdir
|
41
|
+
cd(@src) do
|
42
|
+
`hg init .`
|
43
|
+
`echo test > test`
|
44
|
+
`hg add test`
|
45
|
+
`hg commit -m "test"`
|
46
|
+
`hg branch develop`
|
47
|
+
`echo "dev branch" >> test`
|
48
|
+
`hg commit -m "dev b"`
|
49
|
+
`hg update default; hg tag v0.0.1`
|
50
|
+
`echo master-head > test; hg commit -m "final"`
|
51
|
+
end
|
52
|
+
@dest = File.join('test', 'tmp', 'hg', 'working_copy')
|
53
|
+
end
|
54
|
+
|
55
|
+
after(:all) do
|
56
|
+
rm_rf @src
|
57
|
+
rm_rf @dest
|
58
|
+
end
|
59
|
+
|
60
|
+
context "missing Mercurial working copy and static repo" do
|
61
|
+
before(:each) do
|
62
|
+
rm_rf @dest
|
63
|
+
@hg = DependencyWiring::Mercurial.new(@src, @dest)
|
64
|
+
end
|
65
|
+
it 'should clone the repo' do
|
66
|
+
File.exists?(@dest).should be false
|
67
|
+
@hg.wire
|
68
|
+
File.exists?(@dest).should be true
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should clone the tip' do
|
72
|
+
File.exists?(@dest).should be false
|
73
|
+
@hg.wire
|
74
|
+
File.exists?(@dest).should be true
|
75
|
+
check_head
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should clone the devlop branch' do
|
79
|
+
File.exists?(@dest).should be false
|
80
|
+
@hg.opts[:branch] = BRANCH
|
81
|
+
@hg.wire
|
82
|
+
File.exists?(@dest).should be true
|
83
|
+
check_branch
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should clone the v0.0.1 tag' do
|
87
|
+
File.exists?(@dest).should be false
|
88
|
+
@hg.opts[:tag] = TAG
|
89
|
+
@hg.wire
|
90
|
+
File.exists?(@dest).should be true
|
91
|
+
check_tag
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should detect an existing destination that isn\'t a working copy (file)' do
|
95
|
+
File.open(@dest, 'w') { |f| f << 'occupied' }
|
96
|
+
expect { @hg.wire }.to raise_error
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should detect an existing destination that isn\'t a working copy (folder)' do
|
100
|
+
mkdir_p(@dest)
|
101
|
+
expect { @hg.wire }.to raise_error
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context "cloned at tip" do
|
106
|
+
before(:each) do
|
107
|
+
rm_rf @dest
|
108
|
+
@hg = DependencyWiring::Mercurial.new(@src, @dest)
|
109
|
+
@hg.wire
|
110
|
+
check_head
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should switch to branch on wire' do
|
114
|
+
@hg.opts[:branch] = BRANCH
|
115
|
+
@hg.wire
|
116
|
+
check_branch
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should switch to tag on wire' do
|
120
|
+
@hg.opts[:tag] = 'v0.0.1'
|
121
|
+
@hg.wire
|
122
|
+
check_tag
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context "cloned at branch" do
|
127
|
+
before(:each) do
|
128
|
+
rm_rf @dest
|
129
|
+
@hg = DependencyWiring::Mercurial.new(@src, @dest, branch: BRANCH)
|
130
|
+
@hg.wire
|
131
|
+
check_branch
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'should switch to tip on wire' do
|
135
|
+
@hg.opts[:branch] = 'default'
|
136
|
+
#@hg.opts[:rev] = 'tip'
|
137
|
+
#puts @hg
|
138
|
+
@hg.wire
|
139
|
+
check_head
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'should switch to tag on wire' do
|
143
|
+
@hg.opts[:branch] = 'default'
|
144
|
+
@hg.opts[:tag] = 'v0.0.1'
|
145
|
+
@hg.wire
|
146
|
+
check_tag
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require 'dependency_wiring/mount_point'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tmpdir'
|
5
|
+
|
6
|
+
describe DependencyWiring do
|
7
|
+
describe 'MountPoint' do
|
8
|
+
include FileUtils
|
9
|
+
|
10
|
+
before(:all) do
|
11
|
+
@src = Dir.mktmpdir
|
12
|
+
cd(@src) do
|
13
|
+
`echo test > test`
|
14
|
+
`echo "dev branch" > branch`
|
15
|
+
end
|
16
|
+
@dest = File.join('test', 'tmp', 'mount', 'working_copy')
|
17
|
+
end
|
18
|
+
|
19
|
+
after(:all) do
|
20
|
+
rm_rf @src
|
21
|
+
rm_rf @dest
|
22
|
+
end
|
23
|
+
|
24
|
+
context "first wiring request" do
|
25
|
+
before(:each) do
|
26
|
+
rm_rf @dest
|
27
|
+
@m = DependencyWiring::MountPoint.new(@src, @dest)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should link the folder' do
|
31
|
+
File.exists?(@dest).should be false
|
32
|
+
@m.wire
|
33
|
+
File.exists?(@dest).should be true
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should not fail on second wiring request' do
|
37
|
+
File.exists?(@dest).should be false
|
38
|
+
@m.wire
|
39
|
+
File.exists?(@dest).should be true
|
40
|
+
@m.wire
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should fail if the destination folder exists and isn\'t a symlink' do
|
44
|
+
File.open(@dest,'w') { |f| f << "prova" }
|
45
|
+
expect { @m.wire }.to raise_error
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
|
8
|
+
lib = File.expand_path('../../lib', __FILE__)
|
9
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
10
|
+
require 'dependency_wiring'
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
14
|
+
config.run_all_when_everything_filtered = true
|
15
|
+
config.filter_run :focus
|
16
|
+
|
17
|
+
# Run specs in random order to surface order dependencies. If you find an
|
18
|
+
# order dependency and want to debug it, you can fix the order by providing
|
19
|
+
# the seed, which is printed after each run.
|
20
|
+
# --seed 1234
|
21
|
+
config.order = 'random'
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dependency_wiring
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.28
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Alessio Caiazza
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.0.0
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.0.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: thor
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: Dependency Wiring Tool
|
47
|
+
email:
|
48
|
+
- nolith@abisso.org
|
49
|
+
executables:
|
50
|
+
- dw
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- .flow
|
55
|
+
- .hgignore
|
56
|
+
- .rspec
|
57
|
+
- Gemfile
|
58
|
+
- LICENSE.txt
|
59
|
+
- README.md
|
60
|
+
- Rakefile
|
61
|
+
- bin/dw
|
62
|
+
- dependency_wiring.gemspec
|
63
|
+
- lib/dependency_wiring.rb
|
64
|
+
- lib/dependency_wiring/configuration.rb
|
65
|
+
- lib/dependency_wiring/dsl.rb
|
66
|
+
- lib/dependency_wiring/git.rb
|
67
|
+
- lib/dependency_wiring/mercurial.rb
|
68
|
+
- lib/dependency_wiring/mount_point.rb
|
69
|
+
- lib/dependency_wiring/scm.rb
|
70
|
+
- lib/dependency_wiring/shell_command.rb
|
71
|
+
- lib/dependency_wiring/thor_app.rb
|
72
|
+
- lib/dependency_wiring/version.rb
|
73
|
+
- lib/dependency_wiring/wiring.rb
|
74
|
+
- spec/git_spec.rb
|
75
|
+
- spec/mercurial_spec.rb
|
76
|
+
- spec/mount_point_spec.rb
|
77
|
+
- spec/spec_helper.rb
|
78
|
+
- spec/version_spec.rb
|
79
|
+
homepage: https://bitbucket.org/nolith/dependency-wiring
|
80
|
+
licenses: []
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
requirements: []
|
98
|
+
rubyforge_project:
|
99
|
+
rubygems_version: 1.8.25
|
100
|
+
signing_key:
|
101
|
+
specification_version: 3
|
102
|
+
summary: An agnostic dependency wiring system for project management.
|
103
|
+
test_files:
|
104
|
+
- spec/git_spec.rb
|
105
|
+
- spec/mercurial_spec.rb
|
106
|
+
- spec/mount_point_spec.rb
|
107
|
+
- spec/spec_helper.rb
|
108
|
+
- spec/version_spec.rb
|