vendorificator 0.5.2 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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) }
|