docman 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/bump-version.sh +64 -0
- data/bin/dm_repo_clean.sh +29 -0
- data/bin/docman.rb +8 -0
- data/config/config.yaml +46 -23
- data/docman.gemspec +0 -1
- data/features/local.feature +1 -1
- data/features/local_deploy.feature +37 -0
- data/features/support/env.rb +1 -0
- data/features/support/step_definitions/dm_steps.rb +14 -14
- data/lib/application.rb +56 -0
- data/lib/docman/builders/builder.rb +79 -0
- data/lib/docman/builders/common_builder.rb +16 -0
- data/lib/docman/builders/git_builder.rb +34 -0
- data/lib/docman/cli.rb +36 -11
- data/lib/docman/deployers/deployer.rb +25 -0
- data/lib/docman/deployers/git_deployer.rb +10 -0
- data/lib/docman/deployers/local_deployer.rb +8 -0
- data/lib/docman/docroot_config.rb +91 -0
- data/lib/docman/docroot_controller.rb +65 -0
- data/lib/docman/exec.rb +12 -0
- data/lib/docman/git_util.rb +47 -0
- data/lib/docman/info.rb +35 -0
- data/lib/docman/version.rb +1 -1
- metadata +22 -18
- data/lib/docman.rb +0 -117
- data/lib/docman/git.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03c6d600c4554cc1eb0570c4c1248f6662db3af0
|
4
|
+
data.tar.gz: 8511855ac1a09d583c0ce3cef70c7d4a5c96a228
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fec63186230d02c13e1df24e52c812a175fb63b590319bafa6d2c9175e088ea543cd4976f823e90ed9c4ea15c8137b4b013000bb663a353712ac11493194b19
|
7
|
+
data.tar.gz: 485796775944d65fa287c66e76140f42c3fb500dc3de54d445a54bc122b19701f73cb0a01ea11a1e8663ee1e0dcde511b4fc0073af1b0c391b9935fee15b6867
|
data/bin/bump-version.sh
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# works with a file called VERSION in the current directory,
|
4
|
+
# the contents of which should be a semantic version number
|
5
|
+
# such as "1.2.3"
|
6
|
+
|
7
|
+
# this script will display the current version, automatically
|
8
|
+
# suggest a "minor" version update, and ask for input to use
|
9
|
+
# the suggestion, or a newly entered value.
|
10
|
+
|
11
|
+
# once the new version number is determined, the script will
|
12
|
+
# pull a list of changes from git history, prepend this to
|
13
|
+
# a file called CHANGES (under the title of the new version
|
14
|
+
# number) and create a GIT tag.
|
15
|
+
|
16
|
+
if [ -f VERSION ]; then
|
17
|
+
BASE_STRING=`cat VERSION`
|
18
|
+
BASE_LIST=(`echo $BASE_STRING | tr '.' ' '`)
|
19
|
+
V_MAJOR=${BASE_LIST[0]}
|
20
|
+
V_MINOR=${BASE_LIST[1]}
|
21
|
+
V_PATCH=${BASE_LIST[2]}
|
22
|
+
echo "Current version : $BASE_STRING"
|
23
|
+
V_MINOR=$((V_MINOR + 1))
|
24
|
+
V_PATCH=0
|
25
|
+
SUGGESTED_VERSION="$V_MAJOR.$V_MINOR.$V_PATCH"
|
26
|
+
read -p "Enter a version number [$SUGGESTED_VERSION]: " INPUT_STRING
|
27
|
+
if [ "$INPUT_STRING" = "" ]; then
|
28
|
+
INPUT_STRING=$SUGGESTED_VERSION
|
29
|
+
fi
|
30
|
+
echo "Will set new version to be $INPUT_STRING"
|
31
|
+
echo $INPUT_STRING > VERSION
|
32
|
+
echo "Version $INPUT_STRING:" > tmpfile
|
33
|
+
git log --pretty=format:" - %s" "$BASE_STRING"...HEAD >> tmpfile
|
34
|
+
echo "" >> tmpfile
|
35
|
+
echo "" >> tmpfile
|
36
|
+
cat CHANGES >> tmpfile
|
37
|
+
mv tmpfile CHANGES
|
38
|
+
git add CHANGES VERSION
|
39
|
+
git commit -m "Version bump to $INPUT_STRING"
|
40
|
+
git tag -a -m "Tagging version $INPUT_STRING" "$INPUT_STRING"
|
41
|
+
git push origin --tags
|
42
|
+
git push
|
43
|
+
else
|
44
|
+
echo "Could not find a VERSION file"
|
45
|
+
read -p "Do you want to create a version file and start from scratch? [y]" RESPONSE
|
46
|
+
if [ "$RESPONSE" = "" ]; then RESPONSE="y"; fi
|
47
|
+
if [ "$RESPONSE" = "Y" ]; then RESPONSE="y"; fi
|
48
|
+
if [ "$RESPONSE" = "Yes" ]; then RESPONSE="y"; fi
|
49
|
+
if [ "$RESPONSE" = "yes" ]; then RESPONSE="y"; fi
|
50
|
+
if [ "$RESPONSE" = "YES" ]; then RESPONSE="y"; fi
|
51
|
+
if [ "$RESPONSE" = "y" ]; then
|
52
|
+
echo "0.1.0" > VERSION
|
53
|
+
echo "Version 0.1.0" > CHANGES
|
54
|
+
git log --pretty=format:" - %s" >> CHANGES
|
55
|
+
echo "" >> CHANGES
|
56
|
+
echo "" >> CHANGES
|
57
|
+
git add VERSION CHANGES
|
58
|
+
git commit -m "Added VERSION and CHANGES files, Version bump to 0.1.0"
|
59
|
+
git tag -a -m "Tagging version 0.1.0" "0.1.0"
|
60
|
+
git push origin --tags
|
61
|
+
git push
|
62
|
+
fi
|
63
|
+
|
64
|
+
fi
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
#
|
4
|
+
# Check if git directory has no changes.
|
5
|
+
#
|
6
|
+
cd $1
|
7
|
+
|
8
|
+
git rev-parse --verify HEAD >/dev/null || echo 1
|
9
|
+
git update-index -q --ignore-submodules --refresh
|
10
|
+
|
11
|
+
err=0
|
12
|
+
|
13
|
+
if ! git diff-files --quiet --ignore-submodules
|
14
|
+
then
|
15
|
+
err=1
|
16
|
+
fi
|
17
|
+
|
18
|
+
if ! git diff-index --cached --quiet --ignore-submodules HEAD --
|
19
|
+
then
|
20
|
+
err=1
|
21
|
+
fi
|
22
|
+
|
23
|
+
test -z "$(git status --porcelain)" || err=1
|
24
|
+
|
25
|
+
if [ ${err} = "1" ]
|
26
|
+
then
|
27
|
+
echo ${err}
|
28
|
+
exit 1
|
29
|
+
fi
|
data/bin/docman.rb
ADDED
data/config/config.yaml
CHANGED
@@ -1,32 +1,55 @@
|
|
1
|
+
---
|
1
2
|
deploy_targets:
|
2
3
|
local:
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
handler: LocalDeployer
|
5
|
+
builders:
|
6
|
+
root:
|
7
|
+
handler: :common
|
8
|
+
type: dir
|
9
|
+
drupal:
|
10
|
+
handler: :drupal
|
11
|
+
type: drupal
|
12
|
+
repo:
|
13
|
+
handler: :git
|
14
|
+
type: direct
|
15
|
+
dir:
|
16
|
+
handler: :common
|
17
|
+
type: dir
|
8
18
|
acquia:
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
19
|
+
handler: GitDeployer
|
20
|
+
deploy_action: git_push
|
21
|
+
builders:
|
22
|
+
root:
|
23
|
+
handler: :git
|
24
|
+
type: direct
|
25
|
+
after_build_actions:
|
26
|
+
- git_commit
|
27
|
+
drupal:
|
28
|
+
handler: :drupal
|
29
|
+
type: drupal
|
30
|
+
after_build_actions:
|
31
|
+
- git_commit
|
32
|
+
repo:
|
33
|
+
handler: :git
|
34
|
+
type: strip
|
35
|
+
after_build_actions:
|
36
|
+
- git_commit
|
37
|
+
dir:
|
38
|
+
handler: :common
|
39
|
+
type: dir
|
40
|
+
after_build_actions:
|
41
|
+
- git_commit
|
14
42
|
|
15
43
|
environments:
|
16
44
|
local:
|
17
|
-
deploy_target:
|
18
|
-
|
45
|
+
deploy_target: local
|
46
|
+
state: development
|
19
47
|
dev:
|
20
|
-
deploy_target:
|
21
|
-
|
48
|
+
deploy_target: acquia
|
49
|
+
state: development
|
22
50
|
test:
|
23
|
-
deploy_target:
|
24
|
-
|
51
|
+
deploy_target: acquia
|
52
|
+
state: staging
|
25
53
|
prod:
|
26
|
-
deploy_target:
|
27
|
-
|
28
|
-
|
29
|
-
states:
|
30
|
-
- development
|
31
|
-
- staging
|
32
|
-
- stable
|
54
|
+
deploy_target: acquia
|
55
|
+
state: stable
|
data/docman.gemspec
CHANGED
data/features/local.feature
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
Feature: Local deploy
|
2
|
+
|
3
|
+
In order to manage docroot
|
4
|
+
As a developer using Cucumber
|
5
|
+
I want to use the deploy steps to deploy to local
|
6
|
+
|
7
|
+
@announce
|
8
|
+
@no-clobber
|
9
|
+
Scenario: Local deploy sample project 1 develop
|
10
|
+
Given I cd to "sample-docroot"
|
11
|
+
Then I run `docman deploy local sample_project1 branch develop`
|
12
|
+
Then the exit status should be 0
|
13
|
+
Then the following directories should exist:
|
14
|
+
| master |
|
15
|
+
| master/docroot |
|
16
|
+
| master/docroot/sites |
|
17
|
+
| master/hooks |
|
18
|
+
| master/profiles |
|
19
|
+
| master/profiles/sample_profile |
|
20
|
+
| master/projects/sample_project1 |
|
21
|
+
| master/projects/sample_project2 |
|
22
|
+
|
23
|
+
@announce
|
24
|
+
@no-clobber
|
25
|
+
Scenario: Local deploy sample project 2 master
|
26
|
+
Given I cd to "sample-docroot"
|
27
|
+
Then I run `docman deploy local sample_project2 branch master`
|
28
|
+
Then the exit status should be 0
|
29
|
+
Then the following directories should exist:
|
30
|
+
| master |
|
31
|
+
| master/docroot |
|
32
|
+
| master/docroot/sites |
|
33
|
+
| master/hooks |
|
34
|
+
| master/profiles |
|
35
|
+
| master/profiles/sample_profile |
|
36
|
+
| master/projects/sample_project1 |
|
37
|
+
| master/projects/sample_project2 |
|
data/features/support/env.rb
CHANGED
@@ -5,17 +5,17 @@
|
|
5
5
|
# end
|
6
6
|
# end
|
7
7
|
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
8
|
+
When(/^I store bump version from file "(.*?)"$/) do |file|
|
9
|
+
ENV['DM_BUMPED_VERSION'] = IO.read(file)
|
10
|
+
end
|
11
|
+
|
12
|
+
When(/^I change repo state to last bumped tag for "(.*?)" version$/) do |state|
|
13
|
+
version = ENV["DM_BUMPED_VERSION"]
|
14
|
+
run "state.sh tag #{version} #{state}"
|
15
|
+
end
|
16
|
+
|
17
|
+
Then(/^the file "(.*?)" should contain last bumped tag$/) do |file|
|
18
|
+
version = ENV["DM_BUMPED_VERSION"]
|
19
|
+
puts "Last bumped tag: #{version}"
|
20
|
+
prep_for_fs_check { expect(IO.read(file)).to eq version }
|
21
|
+
end
|
data/lib/application.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'docman/version'
|
2
|
+
require 'yaml'
|
3
|
+
require 'pathname'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'docman/git_util'
|
6
|
+
require 'docman/docroot_config'
|
7
|
+
require 'docman/docroot_controller'
|
8
|
+
require 'docman/exec'
|
9
|
+
require 'singleton'
|
10
|
+
|
11
|
+
module Docman
|
12
|
+
class Application
|
13
|
+
|
14
|
+
attr_reader :config, :options
|
15
|
+
attr_accessor :deploy_target
|
16
|
+
|
17
|
+
include Singleton
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
# TODO: Define workspace properly
|
21
|
+
@workspace_dir = Dir.pwd
|
22
|
+
@config = YAML::load_file(File.join(Pathname(__FILE__).dirname.parent, 'config', 'config.yaml'))
|
23
|
+
end
|
24
|
+
|
25
|
+
def init(name, repo)
|
26
|
+
`mkdir #{name} && cd #{name} && git clone #{repo} config`
|
27
|
+
end
|
28
|
+
|
29
|
+
def build(deploy_target, state, options = false)
|
30
|
+
@options = options
|
31
|
+
DocrootController.new(@workspace_dir, deploy_target, options).build(state)
|
32
|
+
end
|
33
|
+
|
34
|
+
def deploy(deploy_target, name, type, version)
|
35
|
+
DocrootController.new(@workspace_dir, deploy_target).deploy(name, type, version)
|
36
|
+
end
|
37
|
+
|
38
|
+
def state(name, type, version)
|
39
|
+
DocrootController.new(@workspace_dir, deploy_target).state(name, type, version)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.root
|
43
|
+
Pathname(__FILE__).dirname.parent
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.bin
|
47
|
+
File.join root, 'bin'
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.lib
|
51
|
+
File.join root, 'lib'
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Docman
|
4
|
+
module Builders
|
5
|
+
class Builder
|
6
|
+
@@subclasses = {}
|
7
|
+
|
8
|
+
def self.create(type, root, build_type, state, info)
|
9
|
+
c = @@subclasses[type]
|
10
|
+
if c
|
11
|
+
c.new(root, build_type, state, info)
|
12
|
+
else
|
13
|
+
raise "Bad builder type: #{type}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.register_builder(name)
|
18
|
+
@@subclasses[name] = self
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(root, build_type, state, info)
|
22
|
+
@root = root
|
23
|
+
@build_type = build_type
|
24
|
+
@state = state
|
25
|
+
@info = info
|
26
|
+
@before_build_actions = @build_type['before_build_actions'].nil? ? [] : @build_type['before_build_actions']
|
27
|
+
@after_build_actions = @build_type['after_build_actions'].nil? ? [] : @build_type['after_build_actions']
|
28
|
+
@before_build_actions << 'clean_if_changed'
|
29
|
+
end
|
30
|
+
|
31
|
+
def before_build_action_clean_if_changed
|
32
|
+
if File.directory? @info['full_build_path']
|
33
|
+
FileUtils.rm_r @info['full_build_path'] if @info.need_rebuild?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def do
|
38
|
+
perform(@before_build_actions, 'before_build_action')
|
39
|
+
# Dispatch to corresponding method.
|
40
|
+
write_info self.send("#{@build_type['type']}")
|
41
|
+
perform(@after_build_actions, 'after_build_action')
|
42
|
+
end
|
43
|
+
|
44
|
+
def write_info(result)
|
45
|
+
to_save = {}
|
46
|
+
# to_save = @info.clone
|
47
|
+
to_save['state'] = @state
|
48
|
+
to_save['version_type'] = @info.version_type(@state) unless @info.version_type(@state).nil?
|
49
|
+
to_save['version'] = @info.version(@state) unless @info.version(@state).nil?
|
50
|
+
to_save['ref'] = result
|
51
|
+
to_save['build_type'] = @build_type['type']
|
52
|
+
# to_save.delete('full_build_path')
|
53
|
+
# to_save.delete('full_path')
|
54
|
+
# to_save.delete('temp_path')
|
55
|
+
# to_save.delete('repo')
|
56
|
+
# to_save.delete('states')
|
57
|
+
File.open("#{@info['full_build_path']}/info.yaml", 'w') {|f| f.write to_save.to_yaml}
|
58
|
+
end
|
59
|
+
|
60
|
+
def perform(actions, method_prefix)
|
61
|
+
unless actions.nil?
|
62
|
+
actions.each do |action|
|
63
|
+
method = "#{method_prefix}_#{action}"
|
64
|
+
self.send(method)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def repo?(path)
|
70
|
+
File.directory? File.join(path, '.git')
|
71
|
+
end
|
72
|
+
|
73
|
+
def after_build_action_git_commit
|
74
|
+
message = "name: #{@info['name']} updated, state: #{@state}"
|
75
|
+
GitUtil.commit(@root['full_build_path'], @info['full_build_path'], message)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Docman
|
2
|
+
module Builders
|
3
|
+
class CommonBuilder < Builder
|
4
|
+
|
5
|
+
register_builder :common
|
6
|
+
|
7
|
+
def dir
|
8
|
+
if File.directory? @info['full_build_path']
|
9
|
+
FileUtils.rm_r(@info['full_build_path']) if self.repo? @info['full_build_path']
|
10
|
+
end
|
11
|
+
FileUtils::mkdir_p @info['full_build_path']
|
12
|
+
@info['build_path']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Docman
|
4
|
+
module Builders
|
5
|
+
class GitBuilder < Builder
|
6
|
+
|
7
|
+
register_builder :git
|
8
|
+
|
9
|
+
def direct
|
10
|
+
puts 'Do direct'
|
11
|
+
GitUtil.get(@info['repo'], @info['full_build_path'], version_type, version)
|
12
|
+
end
|
13
|
+
|
14
|
+
def strip
|
15
|
+
puts 'Do strip'
|
16
|
+
FileUtils.rm_r(@info['full_build_path']) if File.directory? @info['full_build_path']
|
17
|
+
result = GitUtil.get(@info['repo'], @info['temp_path'], version_type, version)
|
18
|
+
FileUtils.mkdir_p(@info['full_build_path'])
|
19
|
+
FileUtils.cp_r(Dir["#{@info['temp_path']}/."], @info['full_build_path'])
|
20
|
+
FileUtils.rm_r(File.join(@info['full_build_path'], '.git'))
|
21
|
+
result
|
22
|
+
end
|
23
|
+
|
24
|
+
# TODO: need to refactor into into @info class.
|
25
|
+
def version
|
26
|
+
@info['states'][@state]['version']
|
27
|
+
end
|
28
|
+
|
29
|
+
def version_type
|
30
|
+
@info['states'][@state]['type']
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/docman/cli.rb
CHANGED
@@ -1,26 +1,51 @@
|
|
1
1
|
require 'thor'
|
2
|
-
require '
|
2
|
+
require 'application'
|
3
3
|
|
4
4
|
module Docman
|
5
5
|
class CLI < Thor
|
6
|
+
|
7
|
+
# TODO: add proper descriptions.
|
8
|
+
|
6
9
|
desc 'init NAME', 'init to NAME'
|
7
10
|
def init(name, repo)
|
8
|
-
puts "Init docroot directory #{name} and retrieve config from provided repo."
|
9
11
|
if File.directory? "#{name}"
|
10
|
-
|
12
|
+
say("Complete!", :green)
|
13
|
+
$stderr.puts "Directory #{name} already exists"
|
14
|
+
choice = ask('Are you sure you want do delete existing docroot?')
|
15
|
+
FileUtils.rm_r(name) if choice == 'yes'
|
11
16
|
end
|
12
|
-
|
17
|
+
|
18
|
+
puts "Init docroot directory #{name} and retrieve config from provided repo."
|
19
|
+
Application.instance.init(name, repo)
|
13
20
|
end
|
14
21
|
|
15
22
|
desc 'build NAME', 'init to NAME'
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
exit 1
|
20
|
-
end
|
23
|
+
method_option :force, :aliases => '-f', :desc => 'Force full rebuild'
|
24
|
+
def build(deploy_target, state)
|
25
|
+
config_dir?
|
21
26
|
|
22
|
-
|
23
|
-
Docman.new.build(target, state)
|
27
|
+
Application.instance.build(deploy_target, state, options)
|
24
28
|
end
|
29
|
+
|
30
|
+
desc 'deploy NAME', 'init to NAME'
|
31
|
+
def deploy(deploy_target, name, type, version)
|
32
|
+
config_dir?
|
33
|
+
Application.instance.deploy(deploy_target, name, type, version)
|
34
|
+
end
|
35
|
+
|
36
|
+
desc 'state NAME', 'init to NAME'
|
37
|
+
def state(name, type, version)
|
38
|
+
config_dir?
|
39
|
+
Application.instance.state(name, type, version)
|
40
|
+
end
|
41
|
+
|
42
|
+
no_commands {
|
43
|
+
def config_dir?
|
44
|
+
unless File.directory?('config')
|
45
|
+
$stderr.puts 'ERROR: No config directory in docroot'
|
46
|
+
exit 1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
}
|
25
50
|
end
|
26
51
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Docman
|
2
|
+
module Deployers
|
3
|
+
class Deployer
|
4
|
+
|
5
|
+
attr_reader :deploy_target
|
6
|
+
|
7
|
+
def build(root, state, info)
|
8
|
+
return if @deployed.include? info['name']
|
9
|
+
build_type = build_type(info['type'])
|
10
|
+
Docman::Builders::Builder.create(build_type['handler'], root, build_type, state, info).do()
|
11
|
+
@deployed << info['name']
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(deploy_target)
|
15
|
+
@deployed = []
|
16
|
+
@deploy_target = deploy_target
|
17
|
+
end
|
18
|
+
|
19
|
+
def build_type(type)
|
20
|
+
@deploy_target['builders'][type]
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'docman/info'
|
3
|
+
|
4
|
+
module Docman
|
5
|
+
|
6
|
+
class DocrootConfig
|
7
|
+
|
8
|
+
attr_reader :structure
|
9
|
+
|
10
|
+
def initialize(docroot_dir, deploy_target)
|
11
|
+
@docroot_dir = docroot_dir
|
12
|
+
@deploy_target = deploy_target
|
13
|
+
@docroot_config_dir = File.join(docroot_dir, 'config')
|
14
|
+
update
|
15
|
+
@names = {}
|
16
|
+
@structure = structure_build File.join(@docroot_config_dir, 'master')
|
17
|
+
end
|
18
|
+
|
19
|
+
def update
|
20
|
+
GitUtil.update @docroot_config_dir
|
21
|
+
end
|
22
|
+
|
23
|
+
def structure_build(path, prefix = '', parent = nil)
|
24
|
+
return unless File.file? File.join(path, 'info.yaml')
|
25
|
+
|
26
|
+
info = YAML::load_file(File.join(path, 'info.yaml'))
|
27
|
+
name = File.basename path
|
28
|
+
prefix = prefix.size > 0 ? File.join(prefix, name) : name
|
29
|
+
info['full_path'] = path
|
30
|
+
info['build_path'] = prefix
|
31
|
+
info['full_build_path'] = File.join(@docroot_dir, prefix)
|
32
|
+
info['temp_path'] = File.join(@docroot_dir, 'tmp', info['build_path'])
|
33
|
+
info['name'] = name
|
34
|
+
info['parent'] = parent
|
35
|
+
|
36
|
+
i = Docman::Info.new(info)
|
37
|
+
|
38
|
+
@names[name.to_s] = i
|
39
|
+
|
40
|
+
data = {:data => info, :info => i}
|
41
|
+
data[:children] = children = []
|
42
|
+
Dir.foreach(path) do |entry|
|
43
|
+
next if (entry == '..' || entry == '.')
|
44
|
+
full_path = File.join(path, entry)
|
45
|
+
if File.directory?(full_path)
|
46
|
+
dir_hash = structure_build(full_path, prefix, i)
|
47
|
+
unless dir_hash == nil
|
48
|
+
children << dir_hash
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
data
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def chain(info)
|
57
|
+
chain = {}
|
58
|
+
chain[info['name']] = info
|
59
|
+
while info['parent'] do
|
60
|
+
chain[info['parent']['name']] = info['parent']
|
61
|
+
info = info['parent']
|
62
|
+
end
|
63
|
+
Hash[chain.to_a.reverse!]
|
64
|
+
end
|
65
|
+
|
66
|
+
def root(info)
|
67
|
+
chain(info).each do |name, item|
|
68
|
+
if item['type'] == 'root'
|
69
|
+
return item
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def root_dir
|
75
|
+
@structure[:data]
|
76
|
+
end
|
77
|
+
|
78
|
+
def info_by(name)
|
79
|
+
@names[name]
|
80
|
+
end
|
81
|
+
|
82
|
+
def states_dependin_on(name, version)
|
83
|
+
states = {}
|
84
|
+
@names[name]['states'].each do |state, info|
|
85
|
+
states[state] = info if info['version'] == version
|
86
|
+
end
|
87
|
+
states
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'docman/builders/builder'
|
2
|
+
require 'docman/builders/common_builder'
|
3
|
+
require 'docman/builders/git_builder'
|
4
|
+
require 'docman/deployers/deployer'
|
5
|
+
require 'docman/deployers/git_deployer'
|
6
|
+
require 'docman/deployers/local_deployer'
|
7
|
+
|
8
|
+
# TODO: refactor info into class.
|
9
|
+
# TODO: make universal logging class.
|
10
|
+
|
11
|
+
module Docman
|
12
|
+
class DocrootController
|
13
|
+
|
14
|
+
attr_reader :docroot_dir, :temp_dir
|
15
|
+
|
16
|
+
def initialize(docroot_dir, deploy_target_name, options = {})
|
17
|
+
@deploy_target = Docman::Application.instance.config['deploy_targets'][deploy_target_name]
|
18
|
+
Docman::Application.instance.deploy_target = @deploy_target
|
19
|
+
docroot_config = DocrootConfig.new(docroot_dir, @deploy_target)
|
20
|
+
@deployer = Object.const_get("Docman::Deployers::#{@deploy_target['handler']}").new(@deploy_target)
|
21
|
+
@docroot_dir = docroot_dir
|
22
|
+
@temp_dir = File.join(docroot_dir, 'tmp')
|
23
|
+
@docroot_config = docroot_config
|
24
|
+
end
|
25
|
+
|
26
|
+
def deploy(name, type, version)
|
27
|
+
puts "Deploy #{name}, type: #{type}"
|
28
|
+
@docroot_config.states_dependin_on(name, version).each do |state_name, state|
|
29
|
+
deploy_dir_chain(state_name, @docroot_config.info_by(name))
|
30
|
+
@deployer.push(@docroot_config.root_dir, state_name)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def build(state)
|
35
|
+
build_recursive(state)
|
36
|
+
@deployer.push(@docroot_config.root_dir, state)
|
37
|
+
end
|
38
|
+
|
39
|
+
def build_recursive(state, dir = nil)
|
40
|
+
dir = dir ? dir : @docroot_config.structure
|
41
|
+
build_dir(state, dir[:info])
|
42
|
+
|
43
|
+
dir[:children].each do |child|
|
44
|
+
build_recursive(state, child)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def deploy_dir_chain(state, info)
|
49
|
+
@docroot_config.chain(info).each do |name, item|
|
50
|
+
if item.need_rebuild?
|
51
|
+
build_recursive(state, item)
|
52
|
+
return
|
53
|
+
elsif
|
54
|
+
build_dir(state, item)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def build_dir(state, info)
|
60
|
+
@deployer.build(@docroot_config.root(info), state, info)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
data/lib/docman/exec.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
module Docman
|
2
|
+
|
3
|
+
class GitUtil
|
4
|
+
|
5
|
+
def self.get(repo, path, type, version)
|
6
|
+
if File.directory? path
|
7
|
+
Dir.chdir path
|
8
|
+
`git checkout #{version} && git pull origin #{version}` if type == 'branch'
|
9
|
+
if type == 'tag'
|
10
|
+
`git fetch --tags`
|
11
|
+
`git checkout "tags/#{version}"`
|
12
|
+
end
|
13
|
+
else
|
14
|
+
`git clone #{repo} #{path}`
|
15
|
+
Dir.chdir path
|
16
|
+
`git checkout #{version}`
|
17
|
+
end
|
18
|
+
result = `git rev-parse --short HEAD`
|
19
|
+
result.delete!("\n")
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.update(path)
|
23
|
+
`cd #{path} && git pull`
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.commit(root_path, path, message)
|
27
|
+
if self.repo_changed? path
|
28
|
+
puts message
|
29
|
+
Dir.chdir root_path
|
30
|
+
path.slice! "#{root_path}/"
|
31
|
+
`git pull`
|
32
|
+
`git add --all #{path}`
|
33
|
+
`git commit -m "#{message}"`
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.repo_changed?(path)
|
38
|
+
not Exec.do "#{Application::bin}/dm_repo_clean.sh #{path}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.push(root_path, version)
|
42
|
+
Dir.chdir root_path
|
43
|
+
`git push origin #{version}`
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/lib/docman/info.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Docman
|
2
|
+
class Info < Hash
|
3
|
+
def initialize(hash = {})
|
4
|
+
super
|
5
|
+
hash.each_pair do |k, v|
|
6
|
+
self[k] = v
|
7
|
+
end
|
8
|
+
set_build_type
|
9
|
+
# self['rebuild'] = need_rebuild?
|
10
|
+
end
|
11
|
+
|
12
|
+
def version(state)
|
13
|
+
self['states'][state].nil? ? nil : self['states'][state]['version']
|
14
|
+
end
|
15
|
+
|
16
|
+
def version_type(state)
|
17
|
+
self['states'][state].nil? ? nil : self['states'][state]['type']
|
18
|
+
end
|
19
|
+
|
20
|
+
def need_rebuild?
|
21
|
+
return TRUE if Docman::Application.instance.options[:force]
|
22
|
+
return TRUE unless File.directory? self['full_build_path']
|
23
|
+
info_filename = File.join(self['full_build_path'], 'info.yaml')
|
24
|
+
return TRUE unless File.file?(info_filename)
|
25
|
+
version = YAML::load_file(info_filename)
|
26
|
+
return TRUE if version['type'] != self['type']
|
27
|
+
return TRUE if version['build_type'] != self['build_type']
|
28
|
+
false
|
29
|
+
end
|
30
|
+
|
31
|
+
def set_build_type
|
32
|
+
Docman::Application.instance.deploy_target['builders'][self['type']]['type']
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/docman/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Tolstikov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,25 +80,14 @@ dependencies:
|
|
80
80
|
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: configliere
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - '>='
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - '>='
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
83
|
description:
|
98
84
|
email:
|
99
85
|
- atolstikov@adyax.com
|
100
86
|
executables:
|
87
|
+
- bump-version.sh
|
88
|
+
- dm_repo_clean.sh
|
101
89
|
- docman
|
90
|
+
- docman.rb
|
102
91
|
extensions: []
|
103
92
|
extra_rdoc_files: []
|
104
93
|
files:
|
@@ -107,15 +96,29 @@ files:
|
|
107
96
|
- LICENSE.txt
|
108
97
|
- README.md
|
109
98
|
- Rakefile
|
99
|
+
- bin/bump-version.sh
|
100
|
+
- bin/dm_repo_clean.sh
|
110
101
|
- bin/docman
|
102
|
+
- bin/docman.rb
|
111
103
|
- config/config.yaml
|
112
104
|
- docman.gemspec
|
113
105
|
- features/local.feature
|
106
|
+
- features/local_deploy.feature
|
114
107
|
- features/support/env.rb
|
115
108
|
- features/support/step_definitions/dm_steps.rb
|
116
|
-
- lib/
|
109
|
+
- lib/application.rb
|
110
|
+
- lib/docman/builders/builder.rb
|
111
|
+
- lib/docman/builders/common_builder.rb
|
112
|
+
- lib/docman/builders/git_builder.rb
|
117
113
|
- lib/docman/cli.rb
|
118
|
-
- lib/docman/
|
114
|
+
- lib/docman/deployers/deployer.rb
|
115
|
+
- lib/docman/deployers/git_deployer.rb
|
116
|
+
- lib/docman/deployers/local_deployer.rb
|
117
|
+
- lib/docman/docroot_config.rb
|
118
|
+
- lib/docman/docroot_controller.rb
|
119
|
+
- lib/docman/exec.rb
|
120
|
+
- lib/docman/git_util.rb
|
121
|
+
- lib/docman/info.rb
|
119
122
|
- lib/docman/version.rb
|
120
123
|
homepage: ''
|
121
124
|
licenses:
|
@@ -143,5 +146,6 @@ specification_version: 4
|
|
143
146
|
summary: Docman made for DOCroot MANagement for Drupal projects
|
144
147
|
test_files:
|
145
148
|
- features/local.feature
|
149
|
+
- features/local_deploy.feature
|
146
150
|
- features/support/env.rb
|
147
151
|
- features/support/step_definitions/dm_steps.rb
|
data/lib/docman.rb
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
require 'docman/version'
|
2
|
-
require 'yaml'
|
3
|
-
require 'configliere'
|
4
|
-
require 'pathname'
|
5
|
-
require 'fileutils'
|
6
|
-
require 'docman/git'
|
7
|
-
|
8
|
-
module Docman
|
9
|
-
class Docman
|
10
|
-
|
11
|
-
def initialize()
|
12
|
-
@app_root_dir = Pathname(__FILE__).dirname.parent
|
13
|
-
@current_dir = Dir.pwd
|
14
|
-
# TODO: Define workspace properly
|
15
|
-
@workspace_dir = @current_dir
|
16
|
-
@docroot_dir = @workspace_dir
|
17
|
-
@docroot_config_dir = File.join(@docroot_dir, 'config')
|
18
|
-
@docroot_structure = directory_hash File.join(@docroot_config_dir, 'master')
|
19
|
-
|
20
|
-
Settings.read File.join(@app_root_dir, 'config', 'config.yaml')
|
21
|
-
Settings.resolve!
|
22
|
-
@app_settings = Settings
|
23
|
-
@environments = Settings['environments']
|
24
|
-
@deploy_targets = Settings['deploy_targets']
|
25
|
-
end
|
26
|
-
|
27
|
-
def directory_hash(path, prefix = '')
|
28
|
-
return unless File.file? File.join(path, 'info.yaml')
|
29
|
-
|
30
|
-
name = File.basename path
|
31
|
-
prefix = prefix.size > 0 ? File.join(prefix, name) : name
|
32
|
-
info = YAML::load_file(File.join(path, 'info.yaml'))
|
33
|
-
info['full_path'] = path
|
34
|
-
info['build_path'] = prefix
|
35
|
-
info['name'] = name
|
36
|
-
|
37
|
-
data = {:data => info}
|
38
|
-
data[:children] = children = []
|
39
|
-
Dir.foreach(path) do |entry|
|
40
|
-
next if (entry == '..' || entry == '.' || entry == '_states')
|
41
|
-
full_path = File.join(path, entry)
|
42
|
-
if File.directory?(full_path)
|
43
|
-
dir_hash = directory_hash(full_path, prefix)
|
44
|
-
unless dir_hash == nil
|
45
|
-
children << dir_hash
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
data
|
51
|
-
end
|
52
|
-
|
53
|
-
def build(target, state)
|
54
|
-
@target = target
|
55
|
-
@state = state
|
56
|
-
traverse_docroot_structure
|
57
|
-
end
|
58
|
-
|
59
|
-
def deploy
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
def traverse_docroot_structure(dir = nil)
|
64
|
-
dir = dir ? dir : @docroot_structure
|
65
|
-
|
66
|
-
build_dir dir[:data]
|
67
|
-
|
68
|
-
dir[:children].each do |child|
|
69
|
-
traverse_docroot_structure child
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def build_dir(info)
|
74
|
-
case get_build_type info
|
75
|
-
when 'dir'
|
76
|
-
build_dir_dir info
|
77
|
-
when 'repo'
|
78
|
-
build_dir_repo info
|
79
|
-
when 'subrepo'
|
80
|
-
build_dir_subrepo info
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def get_version(info)
|
85
|
-
info['states'][@state]
|
86
|
-
end
|
87
|
-
|
88
|
-
def get_deploy_target
|
89
|
-
@deploy_targets[@environments[@target]['deploy_target']]
|
90
|
-
end
|
91
|
-
|
92
|
-
def get_build_type(info)
|
93
|
-
get_deploy_target['build_types'][info['type']]
|
94
|
-
end
|
95
|
-
|
96
|
-
def build_dir_dir(info)
|
97
|
-
FileUtils::mkdir_p get_path_in_docroot info['build_path']
|
98
|
-
end
|
99
|
-
|
100
|
-
def build_dir_repo(info)
|
101
|
-
repo = info['repo']
|
102
|
-
build_path = get_path_in_docroot info['build_path']
|
103
|
-
version_type = get_version(info)['type']
|
104
|
-
version = get_version(info)['version']
|
105
|
-
Git.new.get_repo(repo, build_path, version_type, version)
|
106
|
-
end
|
107
|
-
|
108
|
-
def build_dir_subrepo(info)
|
109
|
-
|
110
|
-
end
|
111
|
-
|
112
|
-
def get_path_in_docroot(path)
|
113
|
-
File.join(@docroot_dir, path)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
data/lib/docman/git.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Docman
|
2
|
-
|
3
|
-
class Git
|
4
|
-
def get_repo(repo, path, type, version)
|
5
|
-
if File.directory? path
|
6
|
-
Dir.chdir path
|
7
|
-
`git checkout #{version} && git pull origin #{version}` if type == 'branch'
|
8
|
-
`git checkout #{version}` if type == 'tag'
|
9
|
-
else
|
10
|
-
`git clone #{repo} #{path}`
|
11
|
-
Dir.chdir path
|
12
|
-
`git checkout #{version}`
|
13
|
-
end
|
14
|
-
|
15
|
-
# if result.nil?
|
16
|
-
# puts "Error: #{$?}"
|
17
|
-
# end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|