vendorificator 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +1 -1
- data/CHANGELOG.md +8 -0
- data/Gemfile +0 -1
- data/LICENSE +2 -2
- data/Rakefile +1 -1
- data/cucumber.yml +1 -1
- data/features/download.feature +1 -0
- data/features/edgecases.feature +25 -0
- data/features/fixtures/git/Makefile +35 -0
- data/features/fixtures/git/remote.1/HEAD +1 -0
- data/features/fixtures/git/remote.1/config +10 -0
- data/features/fixtures/git/remote.1/description +1 -0
- data/features/fixtures/git/remote.1/hooks/applypatch-msg.sample +15 -0
- data/features/fixtures/git/remote.1/hooks/commit-msg.sample +24 -0
- data/features/fixtures/git/remote.1/hooks/post-update.sample +8 -0
- data/features/fixtures/git/remote.1/hooks/pre-applypatch.sample +14 -0
- data/features/fixtures/git/remote.1/hooks/pre-commit.sample +49 -0
- data/features/fixtures/git/remote.1/hooks/pre-push.sample +54 -0
- data/features/fixtures/git/remote.1/hooks/pre-rebase.sample +169 -0
- data/features/fixtures/git/remote.1/hooks/prepare-commit-msg.sample +36 -0
- data/features/fixtures/git/remote.1/hooks/update.sample +128 -0
- data/features/fixtures/git/remote.1/info/exclude +6 -0
- data/features/fixtures/git/remote.1/info/refs +8 -0
- data/features/fixtures/git/remote.1/objects/info/packs +2 -0
- data/features/fixtures/git/remote.1/objects/pack/pack-bb534073bd2c3b64a83cf0373085658268d94be9.idx +0 -0
- data/features/fixtures/git/remote.1/objects/pack/pack-bb534073bd2c3b64a83cf0373085658268d94be9.pack +0 -0
- data/features/fixtures/git/remote.1/packed-refs +9 -0
- data/features/fixtures/git/remote.1/refs/heads/.sentinel +0 -0
- data/features/fixtures/git/remote.1/refs/tags/.sentinel +0 -0
- data/features/fixtures/git/remote.1.vendor.rb +5 -0
- data/features/fixtures/git/remote.2/HEAD +1 -0
- data/features/fixtures/git/remote.2/config +10 -0
- data/features/fixtures/git/remote.2/description +1 -0
- data/features/fixtures/git/remote.2/hooks/applypatch-msg.sample +15 -0
- data/features/fixtures/git/remote.2/hooks/commit-msg.sample +24 -0
- data/features/fixtures/git/remote.2/hooks/post-update.sample +8 -0
- data/features/fixtures/git/remote.2/hooks/pre-applypatch.sample +14 -0
- data/features/fixtures/git/remote.2/hooks/pre-commit.sample +49 -0
- data/features/fixtures/git/remote.2/hooks/pre-push.sample +54 -0
- data/features/fixtures/git/remote.2/hooks/pre-rebase.sample +169 -0
- data/features/fixtures/git/remote.2/hooks/prepare-commit-msg.sample +36 -0
- data/features/fixtures/git/remote.2/hooks/update.sample +128 -0
- data/features/fixtures/git/remote.2/info/exclude +6 -0
- data/features/fixtures/git/remote.2/info/refs +14 -0
- data/features/fixtures/git/remote.2/objects/info/packs +2 -0
- data/features/fixtures/git/remote.2/objects/pack/pack-f9df9e80fe02b2e846c4ba5444b359121a8bcce6.idx +0 -0
- data/features/fixtures/git/remote.2/objects/pack/pack-f9df9e80fe02b2e846c4ba5444b359121a8bcce6.pack +0 -0
- data/features/fixtures/git/remote.2/packed-refs +15 -0
- data/features/fixtures/git/remote.2/refs/heads/.sentinel +0 -0
- data/features/fixtures/git/remote.2/refs/tags/.sentinel +0 -0
- data/features/fixtures/git/remote.2.vendor.rb +5 -0
- data/features/fixtures/git/testrepo/info/refs +2 -0
- data/features/fixtures/git/testrepo/objects/info/packs +1 -1
- data/features/fixtures/git/testrepo/objects/pack/pack-3a82989e3c58110681fd5713baa113ffc1176225.idx +0 -0
- data/features/fixtures/git/testrepo/objects/pack/{pack-46f7621b6a6b9b1c22dd15c08d457dfedf76e55f.pack → pack-3a82989e3c58110681fd5713baa113ffc1176225.pack} +0 -0
- data/features/fixtures/git/testrepo/packed-refs +3 -1
- data/features/remote.feature +43 -0
- data/features/step_definitions/basic.rb +23 -4
- data/lib/vendorificator/environment.rb +7 -6
- data/lib/vendorificator/segment/vendor.rb +2 -0
- data/lib/vendorificator/segment.rb +15 -16
- data/lib/vendorificator/vendor/download.rb +9 -3
- data/lib/vendorificator/vendor.rb +1 -0
- data/lib/vendorificator/version.rb +1 -1
- data/spec/vendorificator/environment_spec.rb +10 -9
- data/vendorificator.gemspec +1 -0
- metadata +96 -11
- data/features/fixtures/git/testrepo/objects/53/ac1a96882e666cee31504179abc21eac522f8d +0 -2
- data/features/fixtures/git/testrepo/objects/pack/pack-46f7621b6a6b9b1c22dd15c08d457dfedf76e55f.idx +0 -0
- data/features/fixtures/git/testrepo/refs/tags/email-v0 +0 -1
@@ -0,0 +1,128 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
#
|
3
|
+
# An example hook script to blocks unannotated tags from entering.
|
4
|
+
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
|
5
|
+
#
|
6
|
+
# To enable this hook, rename this file to "update".
|
7
|
+
#
|
8
|
+
# Config
|
9
|
+
# ------
|
10
|
+
# hooks.allowunannotated
|
11
|
+
# This boolean sets whether unannotated tags will be allowed into the
|
12
|
+
# repository. By default they won't be.
|
13
|
+
# hooks.allowdeletetag
|
14
|
+
# This boolean sets whether deleting tags will be allowed in the
|
15
|
+
# repository. By default they won't be.
|
16
|
+
# hooks.allowmodifytag
|
17
|
+
# This boolean sets whether a tag may be modified after creation. By default
|
18
|
+
# it won't be.
|
19
|
+
# hooks.allowdeletebranch
|
20
|
+
# This boolean sets whether deleting branches will be allowed in the
|
21
|
+
# repository. By default they won't be.
|
22
|
+
# hooks.denycreatebranch
|
23
|
+
# This boolean sets whether remotely creating branches will be denied
|
24
|
+
# in the repository. By default this is allowed.
|
25
|
+
#
|
26
|
+
|
27
|
+
# --- Command line
|
28
|
+
refname="$1"
|
29
|
+
oldrev="$2"
|
30
|
+
newrev="$3"
|
31
|
+
|
32
|
+
# --- Safety check
|
33
|
+
if [ -z "$GIT_DIR" ]; then
|
34
|
+
echo "Don't run this script from the command line." >&2
|
35
|
+
echo " (if you want, you could supply GIT_DIR then run" >&2
|
36
|
+
echo " $0 <ref> <oldrev> <newrev>)" >&2
|
37
|
+
exit 1
|
38
|
+
fi
|
39
|
+
|
40
|
+
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
|
41
|
+
echo "usage: $0 <ref> <oldrev> <newrev>" >&2
|
42
|
+
exit 1
|
43
|
+
fi
|
44
|
+
|
45
|
+
# --- Config
|
46
|
+
allowunannotated=$(git config --bool hooks.allowunannotated)
|
47
|
+
allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
|
48
|
+
denycreatebranch=$(git config --bool hooks.denycreatebranch)
|
49
|
+
allowdeletetag=$(git config --bool hooks.allowdeletetag)
|
50
|
+
allowmodifytag=$(git config --bool hooks.allowmodifytag)
|
51
|
+
|
52
|
+
# check for no description
|
53
|
+
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
|
54
|
+
case "$projectdesc" in
|
55
|
+
"Unnamed repository"* | "")
|
56
|
+
echo "*** Project description file hasn't been set" >&2
|
57
|
+
exit 1
|
58
|
+
;;
|
59
|
+
esac
|
60
|
+
|
61
|
+
# --- Check types
|
62
|
+
# if $newrev is 0000...0000, it's a commit to delete a ref.
|
63
|
+
zero="0000000000000000000000000000000000000000"
|
64
|
+
if [ "$newrev" = "$zero" ]; then
|
65
|
+
newrev_type=delete
|
66
|
+
else
|
67
|
+
newrev_type=$(git cat-file -t $newrev)
|
68
|
+
fi
|
69
|
+
|
70
|
+
case "$refname","$newrev_type" in
|
71
|
+
refs/tags/*,commit)
|
72
|
+
# un-annotated tag
|
73
|
+
short_refname=${refname##refs/tags/}
|
74
|
+
if [ "$allowunannotated" != "true" ]; then
|
75
|
+
echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
|
76
|
+
echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
|
77
|
+
exit 1
|
78
|
+
fi
|
79
|
+
;;
|
80
|
+
refs/tags/*,delete)
|
81
|
+
# delete tag
|
82
|
+
if [ "$allowdeletetag" != "true" ]; then
|
83
|
+
echo "*** Deleting a tag is not allowed in this repository" >&2
|
84
|
+
exit 1
|
85
|
+
fi
|
86
|
+
;;
|
87
|
+
refs/tags/*,tag)
|
88
|
+
# annotated tag
|
89
|
+
if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
|
90
|
+
then
|
91
|
+
echo "*** Tag '$refname' already exists." >&2
|
92
|
+
echo "*** Modifying a tag is not allowed in this repository." >&2
|
93
|
+
exit 1
|
94
|
+
fi
|
95
|
+
;;
|
96
|
+
refs/heads/*,commit)
|
97
|
+
# branch
|
98
|
+
if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
|
99
|
+
echo "*** Creating a branch is not allowed in this repository" >&2
|
100
|
+
exit 1
|
101
|
+
fi
|
102
|
+
;;
|
103
|
+
refs/heads/*,delete)
|
104
|
+
# delete branch
|
105
|
+
if [ "$allowdeletebranch" != "true" ]; then
|
106
|
+
echo "*** Deleting a branch is not allowed in this repository" >&2
|
107
|
+
exit 1
|
108
|
+
fi
|
109
|
+
;;
|
110
|
+
refs/remotes/*,commit)
|
111
|
+
# tracking branch
|
112
|
+
;;
|
113
|
+
refs/remotes/*,delete)
|
114
|
+
# delete tracking branch
|
115
|
+
if [ "$allowdeletebranch" != "true" ]; then
|
116
|
+
echo "*** Deleting a tracking branch is not allowed in this repository" >&2
|
117
|
+
exit 1
|
118
|
+
fi
|
119
|
+
;;
|
120
|
+
*)
|
121
|
+
# Anything else (is there anything else?)
|
122
|
+
echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
|
123
|
+
exit 1
|
124
|
+
;;
|
125
|
+
esac
|
126
|
+
|
127
|
+
# --- Finished
|
128
|
+
exit 0
|
@@ -0,0 +1,14 @@
|
|
1
|
+
978854b42893964cd861fa3a606b9bd1effcc5ed refs/heads/master
|
2
|
+
cef71af0c9e5a71f6c4a2db360147b00ec0faef4 refs/heads/vendor/example.html
|
3
|
+
d6dfe467247ecb8fc1efdff47270c1ca9aebc0d2 refs/heads/vendor/stub
|
4
|
+
9caaa083a2a3de2fddc0cc5dc841041ff90ee626 refs/notes/vendor
|
5
|
+
8fa42dfde3bf120afbedb65758115c40077823f8 refs/remotes/origin/HEAD
|
6
|
+
8fa42dfde3bf120afbedb65758115c40077823f8 refs/remotes/origin/master
|
7
|
+
cef71af0c9e5a71f6c4a2db360147b00ec0faef4 refs/remotes/origin/vendor/example.html
|
8
|
+
cfd7a7f8c5d25a3113bb4e2dc13cad1bf59f1fe5 refs/remotes/origin/vendor/stub
|
9
|
+
b63fd7b7034f54c83f98f0eb607166883840b15b refs/tags/vendor/example.html/0
|
10
|
+
cef71af0c9e5a71f6c4a2db360147b00ec0faef4 refs/tags/vendor/example.html/0^{}
|
11
|
+
e8e7b1b95249fbf213de8a300957322480c400d5 refs/tags/vendor/stub/1
|
12
|
+
cfd7a7f8c5d25a3113bb4e2dc13cad1bf59f1fe5 refs/tags/vendor/stub/1^{}
|
13
|
+
ca5ae665ed9b67e731dc5c281dac5c28c46f3fff refs/tags/vendor/stub/2
|
14
|
+
d6dfe467247ecb8fc1efdff47270c1ca9aebc0d2 refs/tags/vendor/stub/2^{}
|
data/features/fixtures/git/remote.2/objects/pack/pack-f9df9e80fe02b2e846c4ba5444b359121a8bcce6.idx
ADDED
Binary file
|
data/features/fixtures/git/remote.2/objects/pack/pack-f9df9e80fe02b2e846c4ba5444b359121a8bcce6.pack
ADDED
Binary file
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# pack-refs with: peeled fully-peeled
|
2
|
+
978854b42893964cd861fa3a606b9bd1effcc5ed refs/heads/master
|
3
|
+
cef71af0c9e5a71f6c4a2db360147b00ec0faef4 refs/heads/vendor/example.html
|
4
|
+
d6dfe467247ecb8fc1efdff47270c1ca9aebc0d2 refs/heads/vendor/stub
|
5
|
+
9caaa083a2a3de2fddc0cc5dc841041ff90ee626 refs/notes/vendor
|
6
|
+
8fa42dfde3bf120afbedb65758115c40077823f8 refs/remotes/origin/HEAD
|
7
|
+
8fa42dfde3bf120afbedb65758115c40077823f8 refs/remotes/origin/master
|
8
|
+
cef71af0c9e5a71f6c4a2db360147b00ec0faef4 refs/remotes/origin/vendor/example.html
|
9
|
+
cfd7a7f8c5d25a3113bb4e2dc13cad1bf59f1fe5 refs/remotes/origin/vendor/stub
|
10
|
+
b63fd7b7034f54c83f98f0eb607166883840b15b refs/tags/vendor/example.html/0
|
11
|
+
^cef71af0c9e5a71f6c4a2db360147b00ec0faef4
|
12
|
+
e8e7b1b95249fbf213de8a300957322480c400d5 refs/tags/vendor/stub/1
|
13
|
+
^cfd7a7f8c5d25a3113bb4e2dc13cad1bf59f1fe5
|
14
|
+
ca5ae665ed9b67e731dc5c281dac5c28c46f3fff refs/tags/vendor/stub/2
|
15
|
+
^d6dfe467247ecb8fc1efdff47270c1ca9aebc0d2
|
File without changes
|
File without changes
|
@@ -3,3 +3,5 @@
|
|
3
3
|
10e9ac58c77bc229d8c59a5b4eb7422916453148 refs/heads/master
|
4
4
|
ecbfa229ba5f11c05b18bcc4f7c32b8f25d63f8c refs/heads/topic/green
|
5
5
|
ecbfa229ba5f11c05b18bcc4f7c32b8f25d63f8c refs/heads/topic/pink
|
6
|
+
53ac1a96882e666cee31504179abc21eac522f8d refs/tags/email-v0
|
7
|
+
f81247bde4ef7a1c7d280140cc0bcf0b8221a51f refs/tags/email-v0^{}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
P pack-
|
1
|
+
P pack-3a82989e3c58110681fd5713baa113ffc1176225.pack
|
2
2
|
|
data/features/fixtures/git/testrepo/objects/pack/pack-3a82989e3c58110681fd5713baa113ffc1176225.idx
ADDED
Binary file
|
Binary file
|
@@ -1,6 +1,8 @@
|
|
1
|
-
# pack-refs with: peeled
|
1
|
+
# pack-refs with: peeled fully-peeled
|
2
2
|
69389e336277bd81f9af75a565cc511eb6fb497f refs/heads/blue
|
3
3
|
0989414c2aa7b529d3c9ede7ca4ccd940c77efe4 refs/heads/email
|
4
4
|
10e9ac58c77bc229d8c59a5b4eb7422916453148 refs/heads/master
|
5
5
|
ecbfa229ba5f11c05b18bcc4f7c32b8f25d63f8c refs/heads/topic/green
|
6
6
|
ecbfa229ba5f11c05b18bcc4f7c32b8f25d63f8c refs/heads/topic/pink
|
7
|
+
53ac1a96882e666cee31504179abc21eac522f8d refs/tags/email-v0
|
8
|
+
^f81247bde4ef7a1c7d280140cc0bcf0b8221a51f
|
@@ -0,0 +1,43 @@
|
|
1
|
+
Feature: collaboration over a remote repository
|
2
|
+
|
3
|
+
Scenario: pulling from a remote repo that somebody has updated
|
4
|
+
Given a repository cloned from "remote.1"
|
5
|
+
Then a file named "vendor/example.html" should exist
|
6
|
+
And the file "vendor/stub/VERSION" should contain "1"
|
7
|
+
And tag "vendor/example.html/0" exists
|
8
|
+
And tag "vendor/stub/1" exists
|
9
|
+
And tag "vendor/stub/2" does not exist
|
10
|
+
And branch "vendor/example.html" does not exist
|
11
|
+
And branch "vendor/stub" does not exist
|
12
|
+
|
13
|
+
When I run `git pull --tags`
|
14
|
+
Then tag "vendor/example.html/0" exists
|
15
|
+
And tag "vendor/stub/1" exists
|
16
|
+
And tag "vendor/stub/2" does not exist
|
17
|
+
And branch "vendor/example.html" does not exist
|
18
|
+
And branch "vendor/stub" does not exist
|
19
|
+
|
20
|
+
When I run vendor command "pull"
|
21
|
+
Then tag "vendor/example.html/0" exists
|
22
|
+
And tag "vendor/stub/1" exists
|
23
|
+
And tag "vendor/stub/2" does not exist
|
24
|
+
And branch "vendor/example.html" exists
|
25
|
+
And branch "vendor/stub" exists
|
26
|
+
And the following has been conjured:
|
27
|
+
| Name | example.html | stub |
|
28
|
+
| Version | 0 | 1 |
|
29
|
+
| With file | | VERSION |
|
30
|
+
|
31
|
+
When remote repository is updated from "remote.2"
|
32
|
+
And I run vendor command "pull"
|
33
|
+
Then tag "vendor/stub/2" exists
|
34
|
+
And the file "vendor/stub/VERSION" should contain "1"
|
35
|
+
And the following has been conjured:
|
36
|
+
| Name | example.html | stub |
|
37
|
+
| Version | 0 | 1 |
|
38
|
+
| With file | | VERSION |
|
39
|
+
And the last vendor output should match /updated\s+stub/
|
40
|
+
And the last vendor output should match /unchanged\s+example\.html/
|
41
|
+
|
42
|
+
When I run `git pull origin master`
|
43
|
+
Then the file "vendor/stub/VERSION" should contain "2"
|
@@ -6,13 +6,17 @@ When /^nothing happens$/ do
|
|
6
6
|
nil # NOP
|
7
7
|
end
|
8
8
|
|
9
|
+
# Configure Git username & email to unclutter console output
|
10
|
+
def configure_git
|
11
|
+
run_simple 'git config user.name Cucumber'
|
12
|
+
run_simple 'git config user.email cucumber@`hostname --fqdn`'
|
13
|
+
end
|
14
|
+
|
9
15
|
Given /^a repository with following Vendorfile:$/ do |vendorfile_contents|
|
10
16
|
create_dir 'working-repository'
|
11
17
|
cd 'working-repository'
|
12
18
|
run_simple 'git init'
|
13
|
-
|
14
|
-
run_simple 'git config user.name Cucumber'
|
15
|
-
run_simple 'git config user.email cucumber@`hostname --fqdn`'
|
19
|
+
configure_git
|
16
20
|
write_file('README', 'Lorem ipsum dolor sit amet')
|
17
21
|
write_file('Vendorfile', vendorfile_contents)
|
18
22
|
run_simple 'git add .'
|
@@ -23,13 +27,28 @@ Given /^a remote repository$/ do
|
|
23
27
|
create_dir '../remote-repository'
|
24
28
|
cd '../remote-repository'
|
25
29
|
run_simple 'git init --bare'
|
26
|
-
|
30
|
+
configure_git
|
27
31
|
run_simple 'git config user.name Cucumber'
|
28
32
|
run_simple 'git config user.email cucumber@`hostname --fqdn`'
|
29
33
|
cd '../working-repository'
|
30
34
|
run_simple 'git remote add origin ../remote-repository'
|
31
35
|
end
|
32
36
|
|
37
|
+
Given(/^a repository cloned from "(.*)"$/) do |fixture|
|
38
|
+
repo_path = File.join(ENV['FIXTURES_DIR'], 'git', fixture)
|
39
|
+
run_simple "git clone --mirror \"#{repo_path}\" remote-repository"
|
40
|
+
run_simple "git clone remote-repository working-repository"
|
41
|
+
cd 'working-repository'
|
42
|
+
configure_git
|
43
|
+
end
|
44
|
+
|
45
|
+
When(/^remote repository is updated from "(.*)"$/) do |fixture|
|
46
|
+
cd '../remote-repository'
|
47
|
+
repo_path = File.join(ENV['FIXTURES_DIR'], 'git', fixture)
|
48
|
+
run_simple "git fetch \"#{repo_path}\" 'refs/*:refs/*'"
|
49
|
+
cd '../working-repository'
|
50
|
+
end
|
51
|
+
|
33
52
|
When /^I set the fake mode variable$/ do
|
34
53
|
Dir.chdir(current_dir) do
|
35
54
|
MiniGit::Capturing.git :config, 'vendorificator.stub', 'true'
|
@@ -72,10 +72,11 @@ module Vendorificator
|
|
72
72
|
def pull(remote, options={})
|
73
73
|
raise RuntimeError, "Unknown remote #{remote}" unless remotes.include?(remote)
|
74
74
|
|
75
|
-
git.fetch(remote)
|
76
|
-
git.fetch({:tags => true}, remote)
|
77
75
|
begin
|
78
|
-
git.fetch(remote,
|
76
|
+
git.fetch({:quiet => true}, remote,
|
77
|
+
"refs/heads/#{config[:branch_prefix]}/*:refs/remotes/origin/#{config[:branch_prefix]}/*",
|
78
|
+
'refs/tags/*:refs/tags/*',
|
79
|
+
'refs/notes/vendor:refs/notes/vendor')
|
79
80
|
rescue MiniGit::GitError # ignore
|
80
81
|
end
|
81
82
|
|
@@ -91,10 +92,10 @@ module Vendorificator
|
|
91
92
|
theirs = remote_branches[mod.branch_name]
|
92
93
|
if theirs
|
93
94
|
if not ours
|
94
|
-
say_status :default, 'new', mod.
|
95
|
-
git.branch({:track => true}, mod.branch_name,
|
95
|
+
say_status :default, 'new', mod.name, :yellow
|
96
|
+
git.branch({:track => true, :quiet => true}, mod.branch_name, "#{remote}/#{mod.branch_name}") unless options[:dry_run]
|
96
97
|
elsif ours == theirs
|
97
|
-
say_status :default, 'unchanged', mod.
|
98
|
+
say_status :default, 'unchanged', mod.name
|
98
99
|
elsif fast_forwardable?(theirs, ours)
|
99
100
|
say_status :default, 'updated', mod.name, :yellow
|
100
101
|
mod.fast_forward theirs unless options[:dry_run]
|
@@ -6,7 +6,10 @@ module Vendorificator
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def fast_forward(branch)
|
9
|
-
in_branch
|
9
|
+
in_branch do |tmpgit|
|
10
|
+
tmpgit.checkout(:quiet => true)
|
11
|
+
tmpgit.merge({:ff_only => true, :quiet => true}, branch)
|
12
|
+
end
|
10
13
|
end
|
11
14
|
|
12
15
|
def status
|
@@ -117,7 +120,7 @@ module Vendorificator
|
|
117
120
|
return if config.fake_mode?
|
118
121
|
|
119
122
|
git.capturing.add work_dir, *@vendor.git_add_extra_paths
|
120
|
-
git.capturing.commit :m => @vendor.conjure_commit_message
|
123
|
+
git.capturing.commit :m => @vendor.conjure_commit_message, :allow_empty => true
|
121
124
|
git.capturing.notes({:ref => 'vendor'}, 'add', {:m => conjure_note(environment_metadata)}, 'HEAD')
|
122
125
|
git.capturing.tag( { :a => true, :m => tag_message }, tag_name )
|
123
126
|
say_status :default, :tag, tag_name
|
@@ -140,7 +143,6 @@ module Vendorificator
|
|
140
143
|
Dir.mktmpdir do |tmpdir|
|
141
144
|
tmpgit = create_temp_git_repo(branch, options, tmpdir)
|
142
145
|
fetch_repo_data tmpgit
|
143
|
-
repo_cleanup tmpgit if options[:clean] || !branch_exists?(branch)
|
144
146
|
|
145
147
|
Dir.chdir(tmpdir){ yield tmpgit }
|
146
148
|
|
@@ -149,24 +151,21 @@ module Vendorificator
|
|
149
151
|
end
|
150
152
|
|
151
153
|
def create_temp_git_repo(branch, options, dir)
|
152
|
-
clone_opts = {shared: true, no_checkout: true}
|
154
|
+
clone_opts = {shared: true, no_checkout: true, quiet: true}
|
153
155
|
clone_opts[:branch] = branch if branch_exists? branch
|
154
|
-
|
156
|
+
MiniGit.git(:clone, clone_opts, git.git_dir, dir)
|
155
157
|
|
156
158
|
tmpgit = MiniGit.new(dir)
|
157
159
|
unless branch_exists? branch
|
158
|
-
|
160
|
+
tmpgit.capturing.checkout({quiet: true}, {orphan: true}, branch)
|
161
|
+
tmpgit.capturing.rm({ :r => true, :f => true, :q => true, :ignore_unmatch => true }, '.')
|
159
162
|
end
|
160
163
|
|
161
164
|
tmpgit
|
162
165
|
end
|
163
166
|
|
164
|
-
def repo_cleanup(tmpgit)
|
165
|
-
tmpgit.rm({ :r => true, :f => true, :q => true, :ignore_unmatch => true }, '.')
|
166
|
-
end
|
167
|
-
|
168
167
|
def fetch_repo_data(tmpgit)
|
169
|
-
tmpgit.fetch git.git_dir, "refs/notes/vendor:refs/notes/vendor" if notes_exist?
|
168
|
+
tmpgit.fetch({quiet: true}, git.git_dir, "refs/notes/vendor:refs/notes/vendor") if notes_exist?
|
170
169
|
end
|
171
170
|
|
172
171
|
def propagate_repo_data_to_original(branch, clone_dir)
|
@@ -186,11 +185,10 @@ module Vendorificator
|
|
186
185
|
#
|
187
186
|
# Returns nothing.
|
188
187
|
def fetch_back_from_temporary_clone(branch, clone_dir)
|
189
|
-
git.fetch clone_dir
|
190
|
-
git.fetch({tags: true}, clone_dir)
|
191
|
-
git.fetch clone_dir,
|
188
|
+
git.fetch({quiet: true}, clone_dir,
|
192
189
|
"refs/heads/#{branch}:refs/heads/#{branch}",
|
193
|
-
"refs/
|
190
|
+
"refs/tags/*:refs/tags/*",
|
191
|
+
"refs/notes/vendor:refs/notes/vendor")
|
194
192
|
end
|
195
193
|
|
196
194
|
# Private: Copies the conjured vendor files back to main repo, instead of
|
@@ -317,6 +315,7 @@ module Vendorificator
|
|
317
315
|
end
|
318
316
|
|
319
317
|
def merged_base
|
318
|
+
return nil if !head
|
320
319
|
return @merged_base if defined? @merged_base
|
321
320
|
base = git.capturing.merge_base(head, 'HEAD').strip
|
322
321
|
@merged_base = base.empty? ? nil : base
|
@@ -347,7 +346,7 @@ module Vendorificator
|
|
347
346
|
#
|
348
347
|
# Returns true/false.
|
349
348
|
def branch_exists?(branch = branch_name)
|
350
|
-
git.capturing.rev_parse({:verify => true}, "refs/heads/#{branch}")
|
349
|
+
git.capturing.rev_parse({:verify => true, :quiet => true}, "refs/heads/#{branch}")
|
351
350
|
true
|
352
351
|
rescue MiniGit::GitError
|
353
352
|
false
|
@@ -16,14 +16,20 @@ module Vendorificator
|
|
16
16
|
|
17
17
|
def conjure!
|
18
18
|
say_status :default, :download, url
|
19
|
-
File.open
|
19
|
+
File.open 'content', 'w' do |outf|
|
20
20
|
outf.write( open(url).read )
|
21
21
|
end
|
22
|
-
@conjured_checksum = Digest::SHA256.file(
|
23
|
-
@conjured_filesize = File.size(
|
22
|
+
@conjured_checksum = Digest::SHA256.file('content').hexdigest
|
23
|
+
@conjured_filesize = File.size('content')
|
24
24
|
add_download_metadata
|
25
25
|
end
|
26
26
|
|
27
|
+
def after_conjure!
|
28
|
+
FileUtils.mv File.join(work_dir, 'content'), work_dir+'.content'
|
29
|
+
Dir.rmdir work_dir
|
30
|
+
FileUtils.mv work_dir+'.content', work_dir
|
31
|
+
end
|
32
|
+
|
27
33
|
def upstream_version
|
28
34
|
conjured_checksum || Digest::SHA256.hexdigest( open(url).read )
|
29
35
|
end
|
@@ -43,19 +43,21 @@ module Vendorificator
|
|
43
43
|
|
44
44
|
describe '#pull' do
|
45
45
|
before do
|
46
|
-
environment.git.expects(:fetch).with('origin'
|
47
|
-
|
48
|
-
|
46
|
+
@fetch = environment.git.expects(:fetch).with({:quiet => true}, 'origin',
|
47
|
+
'refs/heads/vendor/*:refs/remotes/origin/vendor/*',
|
48
|
+
'refs/tags/*:refs/tags/*',
|
49
|
+
'refs/notes/vendor:refs/notes/vendor')
|
49
50
|
environment.git.capturing.stubs(:show_ref).returns("602315 refs/remotes/origin/vendor/test\n")
|
50
51
|
end
|
51
52
|
|
52
53
|
it "creates a branch if it doesn't exist" do
|
53
54
|
environment.segments << stub(
|
54
|
-
:
|
55
|
-
:
|
56
|
-
|
55
|
+
:name => 'test',
|
56
|
+
:branch_name => 'vendor/test',
|
57
|
+
:head => nil,
|
58
|
+
:compute_dependencies! => nil)
|
57
59
|
|
58
|
-
environment.git.expects(:branch).with({:track => true}, 'vendor/test', '
|
60
|
+
environment.git.expects(:branch).with({:track => true, :quiet => true}, 'vendor/test', 'origin/vendor/test')
|
59
61
|
|
60
62
|
environment.pull('origin')
|
61
63
|
end
|
@@ -71,8 +73,7 @@ module Vendorificator
|
|
71
73
|
end
|
72
74
|
|
73
75
|
it "handles git error on fetching empty notes" do
|
74
|
-
@
|
75
|
-
|
76
|
+
@fetch.raises(MiniGit::GitError)
|
76
77
|
environment.pull('origin')
|
77
78
|
end
|
78
79
|
end
|
data/vendorificator.gemspec
CHANGED
@@ -10,6 +10,7 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.description = "Vendor everything. Stay sane."
|
11
11
|
gem.summary = "Integrate third-party vendor modules into your git repository"
|
12
12
|
gem.homepage = "https://github.com/3ofcoins/vendorificator/"
|
13
|
+
gem.license = "MIT"
|
13
14
|
|
14
15
|
gem.files = `git ls-files`.split($\)
|
15
16
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|