git_mirror 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/README.md +11 -0
  2. data/lib/git_mirror.rb +11 -6
  3. data/test/mirror_test.rb +96 -0
  4. data/test/root/zendesk/git_mirror.git/FETCH_HEAD +4 -0
  5. data/test/root/zendesk/git_mirror.git/HEAD +1 -0
  6. data/test/root/zendesk/git_mirror.git/config +9 -0
  7. data/test/root/zendesk/git_mirror.git/description +1 -0
  8. data/test/root/zendesk/git_mirror.git/hooks/applypatch-msg.sample +15 -0
  9. data/test/root/zendesk/git_mirror.git/hooks/commit-msg.sample +24 -0
  10. data/test/root/zendesk/git_mirror.git/hooks/post-update.sample +8 -0
  11. data/test/root/zendesk/git_mirror.git/hooks/pre-applypatch.sample +14 -0
  12. data/test/root/zendesk/git_mirror.git/hooks/pre-commit.sample +50 -0
  13. data/test/root/zendesk/git_mirror.git/hooks/pre-push.sample +53 -0
  14. data/test/root/zendesk/git_mirror.git/hooks/pre-rebase.sample +169 -0
  15. data/test/root/zendesk/git_mirror.git/hooks/prepare-commit-msg.sample +36 -0
  16. data/test/root/zendesk/git_mirror.git/hooks/update.sample +128 -0
  17. data/test/root/zendesk/git_mirror.git/info/exclude +6 -0
  18. data/test/root/zendesk/git_mirror.git/objects/01/7527bf3750122f5acc45b0f38988968137e1fa +2 -0
  19. data/test/root/zendesk/git_mirror.git/objects/11/09afa9847ad1701edcad6cba390c0c20b1c3f6 +0 -0
  20. data/test/root/zendesk/git_mirror.git/objects/15/de3ec0676218ca0be78ee74d5d105a4b6d8c9b +0 -0
  21. data/test/root/zendesk/git_mirror.git/objects/20/2d86e72729bf6aaafa52d7b91357b71afb9470 +0 -0
  22. data/test/root/zendesk/git_mirror.git/objects/23/3d99c8b3d9126199819e8243ed31369a893588 +0 -0
  23. data/test/root/zendesk/git_mirror.git/objects/27/a17ab4d6cb39732ad545a142b30009edca5ba9 +0 -0
  24. data/test/root/zendesk/git_mirror.git/objects/29/955274e0d42e164337c411ad9144e8ffd7e46e +0 -0
  25. data/test/root/zendesk/git_mirror.git/objects/2b/b9ad240fa04c8cf706a4901c4807878e90c2dc +0 -0
  26. data/test/root/zendesk/git_mirror.git/objects/2d/dadc86f5b0186a57440e67d071b39c652f5226 +0 -0
  27. data/test/root/zendesk/git_mirror.git/objects/33/ff1877787cfa3903187e8df98257ec40e783e2 +0 -0
  28. data/test/root/zendesk/git_mirror.git/objects/39/35a839d80eaf252751e5a72dd2459b72958f80 +0 -0
  29. data/test/root/zendesk/git_mirror.git/objects/3d/6f469d3f9ef31232e32117e80785d03ec7c6f6 +2 -0
  30. data/test/root/zendesk/git_mirror.git/objects/42/4ac25cc75d3a2d683426d9cb051bde2a35ef4c +5 -0
  31. data/test/root/zendesk/git_mirror.git/objects/42/ee0cc55e72d99410c0541822e1b042dabaf039 +0 -0
  32. data/test/root/zendesk/git_mirror.git/objects/4e/19de47129776d1952981675566e346f6aa8aca +0 -0
  33. data/test/root/zendesk/git_mirror.git/objects/63/5d9269a27c2870abbda52219f794f490441a15 +0 -0
  34. data/test/root/zendesk/git_mirror.git/objects/65/d74eba2312f7ba29b616bd94ca147c48976002 +0 -0
  35. data/test/root/zendesk/git_mirror.git/objects/69/8702808838b1e77bbd61f63f74b4d20839dd23 +0 -0
  36. data/test/root/zendesk/git_mirror.git/objects/72/ba465296f504e5fe914a8ccf54eadf568c97bc +0 -0
  37. data/test/root/zendesk/git_mirror.git/objects/75/66e87e8c0185795f5767517401541c8daa34fc +2 -0
  38. data/test/root/zendesk/git_mirror.git/objects/78/c5e1fa7399fbd40fc229af79bf99b0d8b4a0dc +1 -0
  39. data/test/root/zendesk/git_mirror.git/objects/80/84949e56fcc8ba7f01bb1e7175d5d9de2b8f59 +0 -0
  40. data/test/root/zendesk/git_mirror.git/objects/8b/2d62f65cc9fc77103a2828a068bb61b8ea6f19 +0 -0
  41. data/test/root/zendesk/git_mirror.git/objects/8c/28b99bd38b004087558e6b8fceda9b6d8806af +0 -0
  42. data/test/root/zendesk/git_mirror.git/objects/8f/3963d2d7fa0f4a595d9b830bb55acf72c1f07b +0 -0
  43. data/test/root/zendesk/git_mirror.git/objects/93/9a953315c16d62aaaecfe54964fa4618523cc3 +0 -0
  44. data/test/root/zendesk/git_mirror.git/objects/96/7ce951984df448241676bc61f8ab3bc8fe1986 +0 -0
  45. data/test/root/zendesk/git_mirror.git/objects/97/18c43430889aaf0bdac5e0b86fbef74e3b3249 +0 -0
  46. data/test/root/zendesk/git_mirror.git/objects/a1/fae2fe94e5f309e94866da7f2b79a647b96d59 +0 -0
  47. data/test/root/zendesk/git_mirror.git/objects/a2/062a6c3b664b7367363d939022644f0f9fb9f4 +0 -0
  48. data/test/root/zendesk/git_mirror.git/objects/a9/95a6bc0d001a3a42ae9788802930d03989aef5 +0 -0
  49. data/test/root/zendesk/git_mirror.git/objects/ab/fc3ff77b75509d6f1a5a261ff88883580981f8 +0 -0
  50. data/test/root/zendesk/git_mirror.git/objects/ad/96c28262c4fc6025c53655a77d4d73a20c464d +0 -0
  51. data/test/root/zendesk/git_mirror.git/objects/ae/1911584efbb2ebb0cbe63a1f739387b0e05aa0 +0 -0
  52. data/test/root/zendesk/git_mirror.git/objects/b0/126c6e738fcd0fca9f264c5f17d6f07dd35b01 +0 -0
  53. data/test/root/zendesk/git_mirror.git/objects/c2/d86e90c9fcd32b656dbdc79fd93787c892ee9c +0 -0
  54. data/test/root/zendesk/git_mirror.git/objects/c5/79d5cc74144022b53f255fabfda3d9a0da01a9 +0 -0
  55. data/test/root/zendesk/git_mirror.git/objects/ce/24ff3f37f078e623edd2c22e7ac76772f96a2d +0 -0
  56. data/test/root/zendesk/git_mirror.git/objects/d2/ff48a97a5a317e78c10096e8cc7c1b5b496f55 +0 -0
  57. data/test/root/zendesk/git_mirror.git/objects/e5/8bfa089b98b321c7bbb245d721ba22f7dfcf31 +2 -0
  58. data/test/root/zendesk/git_mirror.git/objects/e8/c224f3d7dad7c680ea06ba9dbc8a8faf86e5fb +0 -0
  59. data/test/root/zendesk/git_mirror.git/objects/e9/d5cb70264a4800652e03d7ae505f80a03396f2 +0 -0
  60. data/test/root/zendesk/git_mirror.git/objects/e9/d6ebfa262268f67100ab0aa070ff068b641ce0 +0 -0
  61. data/test/root/zendesk/git_mirror.git/objects/f6/db64d91bc7587b4491cfd181723213e281d577 +0 -0
  62. data/test/root/zendesk/git_mirror.git/refs/heads/master +1 -0
  63. data/test/root/zendesk/git_mirror.git/refs/tags/v0.1 +1 -0
  64. data/test/root/zendesk/git_mirror.git/refs/tags/v0.2 +1 -0
  65. data/test/root/zendesk/git_mirror.git/refs/tags/v0.3 +1 -0
  66. data/test/test_helper.rb +5 -0
  67. metadata +167 -6
data/README.md CHANGED
@@ -27,3 +27,14 @@ TODO: Write usage instructions here
27
27
  3. Commit your changes (`git commit -am 'Add some feature'`)
28
28
  4. Push to the branch (`git push origin my-new-feature`)
29
29
  5. Create new Pull Request
30
+
31
+ ## Copyright and license
32
+
33
+ Copyright 2013 Zendesk
34
+
35
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
36
+ You may obtain a copy of the License at
37
+
38
+ http://www.apache.org/licenses/LICENSE-2.0
39
+
40
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
data/lib/git_mirror.rb CHANGED
@@ -1,12 +1,15 @@
1
1
  require 'pathname'
2
+ require 'fileutils'
2
3
 
3
4
  class GitMirror
4
- def initialize
5
- @root = Pathname.new(ENV['GIT_MIRROR_ROOT'] || '/var/git_mirror')
5
+ attr_accessor :root
6
+
7
+ def initialize(root = ENV['GIT_MIRROR_ROOT'] || '/var/git_mirror')
8
+ @root = Pathname.new(root)
6
9
  end
7
10
 
8
11
  def prepare_root
9
- @root.mkpath
12
+ root.mkpath
10
13
  end
11
14
 
12
15
  def update(repo_url)
@@ -24,17 +27,19 @@ class GitMirror
24
27
  end
25
28
 
26
29
  def local_path_for(repo_url)
27
- @root + repo_url.split(/github.com./, 2).last
30
+ root + repo_url.split(/github.com./, 2).last
28
31
  end
29
32
 
30
33
  def update_all
31
- Pathname.glob(@root + '**/HEAD').each do |head|
34
+ Pathname.glob(root + '**/HEAD').each do |head|
32
35
  update_local(head.parent)
33
36
  end
34
37
  end
35
38
 
36
39
  def update_local(path)
37
- execute "git fetch --prune --quiet #{path}"
40
+ FileUtils.cd(path) do
41
+ execute "git fetch --prune --quiet"
42
+ end
38
43
  end
39
44
 
40
45
  def execute(command)
@@ -0,0 +1,96 @@
1
+ require 'test_helper'
2
+ require 'pathname'
3
+ require 'fileutils'
4
+
5
+ describe GitMirror do
6
+
7
+ let(:root) { (Pathname.new(__FILE__) + '../root').to_s }
8
+
9
+ before do
10
+ FileUtils.rm_f(root)
11
+ ENV['GIT_MIRROR_ROOT'] = nil
12
+ end
13
+
14
+ describe 'root' do
15
+ it 'uses the root specified' do
16
+ mirror = GitMirror.new(root)
17
+ mirror.root.to_s.must_equal root
18
+ end
19
+
20
+ it 'uses GIT_MIRROR_ROOT' do
21
+ ENV['GIT_MIRROR_ROOT'] = root
22
+
23
+ mirror = GitMirror.new
24
+ mirror.root.to_s.must_equal root
25
+ end
26
+
27
+ it 'defaults to /var/git_mirror' do
28
+ mirror = GitMirror.new
29
+ mirror.root.to_s.must_equal '/var/git_mirror'
30
+ end
31
+ end
32
+
33
+ describe 'update' do
34
+ let(:mirror) { GitMirror.new(root) }
35
+ let(:repo_url) { 'git@github.com:zendesk/git_mirror.git' }
36
+ let(:path) { Pathname.new(root) + 'zendesk/git_mirror.git' }
37
+
38
+ before { FileUtils.rm_rf(path) }
39
+
40
+ describe 'when the repo is not mirrored' do
41
+ before { mirror.update(repo_url) }
42
+
43
+ it 'mirrors the repo' do
44
+ assert path.directory?
45
+ FileUtils.cd(path) do
46
+ remotes = `git remote -v`.strip
47
+ remotes.must_equal "origin\t#{repo_url} (fetch)\norigin\t#{repo_url} (push)"
48
+ `git log -1`.strip.wont_be :empty?
49
+ end
50
+ end
51
+ end
52
+
53
+ describe 'when the repo is mirrored' do
54
+ before do
55
+ FileUtils.mkdir_p(path)
56
+ FileUtils.cd(path) do
57
+ `git init --bare && git remote add --mirror=fetch origin #{repo_url}`
58
+ end
59
+ mirror.update(repo_url)
60
+ end
61
+
62
+ it 'updates the mirror' do
63
+ FileUtils.cd(path) do
64
+ `git log -1`.strip.wont_be :empty?
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ describe 'update_all' do
71
+ let(:mirror) { GitMirror.new(root) }
72
+ let(:repo_url) { 'git@github.com:zendesk/git_mirror.git' }
73
+ let(:paths) { [Pathname.new(root) + 'zendesk/git_mirror.git', Pathname.new(root) + 'zendesk/git_mirror2.git'] }
74
+
75
+ before do
76
+ paths do |path|
77
+ FileUtils.rm_rf(path)
78
+ FileUtils.mkdir_p(path)
79
+ FileUtils.cd(path) do
80
+ `git init --bare && git remote add --mirror=fetch origin #{repo_url}`
81
+ end
82
+ end
83
+ end
84
+
85
+ it 'updates all the mirrors' do
86
+ paths do |path|
87
+ FileUtils.cd(path) do
88
+ `git log -1`.strip.wont_be :empty?
89
+ end
90
+ end
91
+
92
+ end
93
+
94
+ end
95
+
96
+ end
@@ -0,0 +1,4 @@
1
+ e8c224f3d7dad7c680ea06ba9dbc8a8faf86e5fb not-for-merge branch 'master' of github.com:zendesk/git_mirror
2
+ 78c5e1fa7399fbd40fc229af79bf99b0d8b4a0dc not-for-merge tag 'v0.1' of github.com:zendesk/git_mirror
3
+ 42ee0cc55e72d99410c0541822e1b042dabaf039 not-for-merge tag 'v0.2' of github.com:zendesk/git_mirror
4
+ e9d5cb70264a4800652e03d7ae505f80a03396f2 not-for-merge tag 'v0.3' of github.com:zendesk/git_mirror
@@ -0,0 +1 @@
1
+ ref: refs/heads/master
@@ -0,0 +1,9 @@
1
+ [core]
2
+ repositoryformatversion = 0
3
+ filemode = true
4
+ bare = true
5
+ ignorecase = true
6
+ precomposeunicode = false
7
+ [remote "origin"]
8
+ url = git@github.com:zendesk/git_mirror.git
9
+ fetch = +refs/*:refs/*
@@ -0,0 +1 @@
1
+ Unnamed repository; edit this file 'description' to name the repository.
@@ -0,0 +1,15 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to check the commit log message taken by
4
+ # applypatch from an e-mail message.
5
+ #
6
+ # The hook should exit with non-zero status after issuing an
7
+ # appropriate message if it wants to stop the commit. The hook is
8
+ # allowed to edit the commit message file.
9
+ #
10
+ # To enable this hook, rename this file to "applypatch-msg".
11
+
12
+ . git-sh-setup
13
+ test -x "$GIT_DIR/hooks/commit-msg" &&
14
+ exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"}
15
+ :
@@ -0,0 +1,24 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to check the commit log message.
4
+ # Called by "git commit" with one argument, the name of the file
5
+ # that has the commit message. The hook should exit with non-zero
6
+ # status after issuing an appropriate message if it wants to stop the
7
+ # commit. The hook is allowed to edit the commit message file.
8
+ #
9
+ # To enable this hook, rename this file to "commit-msg".
10
+
11
+ # Uncomment the below to add a Signed-off-by line to the message.
12
+ # Doing this in a hook is a bad idea in general, but the prepare-commit-msg
13
+ # hook is more suited to it.
14
+ #
15
+ # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
16
+ # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
17
+
18
+ # This example catches duplicate Signed-off-by lines.
19
+
20
+ test "" = "$(grep '^Signed-off-by: ' "$1" |
21
+ sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
22
+ echo >&2 Duplicate Signed-off-by lines.
23
+ exit 1
24
+ }
@@ -0,0 +1,8 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to prepare a packed repository for use over
4
+ # dumb transports.
5
+ #
6
+ # To enable this hook, rename this file to "post-update".
7
+
8
+ exec git update-server-info
@@ -0,0 +1,14 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to verify what is about to be committed
4
+ # by applypatch from an e-mail message.
5
+ #
6
+ # The hook should exit with non-zero status after issuing an
7
+ # appropriate message if it wants to stop the commit.
8
+ #
9
+ # To enable this hook, rename this file to "pre-applypatch".
10
+
11
+ . git-sh-setup
12
+ test -x "$GIT_DIR/hooks/pre-commit" &&
13
+ exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"}
14
+ :
@@ -0,0 +1,50 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to verify what is about to be committed.
4
+ # Called by "git commit" with no arguments. The hook should
5
+ # exit with non-zero status after issuing an appropriate message if
6
+ # it wants to stop the commit.
7
+ #
8
+ # To enable this hook, rename this file to "pre-commit".
9
+
10
+ if git rev-parse --verify HEAD >/dev/null 2>&1
11
+ then
12
+ against=HEAD
13
+ else
14
+ # Initial commit: diff against an empty tree object
15
+ against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
16
+ fi
17
+
18
+ # If you want to allow non-ascii filenames set this variable to true.
19
+ allownonascii=$(git config hooks.allownonascii)
20
+
21
+ # Redirect output to stderr.
22
+ exec 1>&2
23
+
24
+ # Cross platform projects tend to avoid non-ascii filenames; prevent
25
+ # them from being added to the repository. We exploit the fact that the
26
+ # printable range starts at the space character and ends with tilde.
27
+ if [ "$allownonascii" != "true" ] &&
28
+ # Note that the use of brackets around a tr range is ok here, (it's
29
+ # even required, for portability to Solaris 10's /usr/bin/tr), since
30
+ # the square bracket bytes happen to fall in the designated range.
31
+ test $(git diff --cached --name-only --diff-filter=A -z $against |
32
+ LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
33
+ then
34
+ echo "Error: Attempt to add a non-ascii file name."
35
+ echo
36
+ echo "This can cause problems if you want to work"
37
+ echo "with people on other platforms."
38
+ echo
39
+ echo "To be portable it is advisable to rename the file ..."
40
+ echo
41
+ echo "If you know what you are doing you can disable this"
42
+ echo "check using:"
43
+ echo
44
+ echo " git config hooks.allownonascii true"
45
+ echo
46
+ exit 1
47
+ fi
48
+
49
+ # If there are whitespace errors, print the offending file names and fail.
50
+ exec git diff-index --check --cached $against --
@@ -0,0 +1,53 @@
1
+ #!/bin/sh
2
+
3
+ # An example hook script to verify what is about to be pushed. Called by "git
4
+ # push" after it has checked the remote status, but before anything has been
5
+ # pushed. If this script exits with a non-zero status nothing will be pushed.
6
+ #
7
+ # This hook is called with the following parameters:
8
+ #
9
+ # $1 -- Name of the remote to which the push is being done
10
+ # $2 -- URL to which the push is being done
11
+ #
12
+ # If pushing without using a named remote those arguments will be equal.
13
+ #
14
+ # Information about the commits which are being pushed is supplied as lines to
15
+ # the standard input in the form:
16
+ #
17
+ # <local ref> <local sha1> <remote ref> <remote sha1>
18
+ #
19
+ # This sample shows how to prevent push of commits where the log message starts
20
+ # with "WIP" (work in progress).
21
+
22
+ remote="$1"
23
+ url="$2"
24
+
25
+ z40=0000000000000000000000000000000000000000
26
+
27
+ IFS=' '
28
+ while read local_ref local_sha remote_ref remote_sha
29
+ do
30
+ if [ "$local_sha" = $z40 ]
31
+ then
32
+ # Handle delete
33
+ else
34
+ if [ "$remote_sha" = $z40 ]
35
+ then
36
+ # New branch, examine all commits
37
+ range="$local_sha"
38
+ else
39
+ # Update to existing branch, examine new commits
40
+ range="$remote_sha..$local_sha"
41
+ fi
42
+
43
+ # Check for WIP commit
44
+ commit=`git rev-list -n 1 --grep '^WIP' "$range"`
45
+ if [ -n "$commit" ]
46
+ then
47
+ echo "Found WIP commit in $local_ref, not pushing"
48
+ exit 1
49
+ fi
50
+ fi
51
+ done
52
+
53
+ exit 0
@@ -0,0 +1,169 @@
1
+ #!/bin/sh
2
+ #
3
+ # Copyright (c) 2006, 2008 Junio C Hamano
4
+ #
5
+ # The "pre-rebase" hook is run just before "git rebase" starts doing
6
+ # its job, and can prevent the command from running by exiting with
7
+ # non-zero status.
8
+ #
9
+ # The hook is called with the following parameters:
10
+ #
11
+ # $1 -- the upstream the series was forked from.
12
+ # $2 -- the branch being rebased (or empty when rebasing the current branch).
13
+ #
14
+ # This sample shows how to prevent topic branches that are already
15
+ # merged to 'next' branch from getting rebased, because allowing it
16
+ # would result in rebasing already published history.
17
+
18
+ publish=next
19
+ basebranch="$1"
20
+ if test "$#" = 2
21
+ then
22
+ topic="refs/heads/$2"
23
+ else
24
+ topic=`git symbolic-ref HEAD` ||
25
+ exit 0 ;# we do not interrupt rebasing detached HEAD
26
+ fi
27
+
28
+ case "$topic" in
29
+ refs/heads/??/*)
30
+ ;;
31
+ *)
32
+ exit 0 ;# we do not interrupt others.
33
+ ;;
34
+ esac
35
+
36
+ # Now we are dealing with a topic branch being rebased
37
+ # on top of master. Is it OK to rebase it?
38
+
39
+ # Does the topic really exist?
40
+ git show-ref -q "$topic" || {
41
+ echo >&2 "No such branch $topic"
42
+ exit 1
43
+ }
44
+
45
+ # Is topic fully merged to master?
46
+ not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
47
+ if test -z "$not_in_master"
48
+ then
49
+ echo >&2 "$topic is fully merged to master; better remove it."
50
+ exit 1 ;# we could allow it, but there is no point.
51
+ fi
52
+
53
+ # Is topic ever merged to next? If so you should not be rebasing it.
54
+ only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
55
+ only_next_2=`git rev-list ^master ${publish} | sort`
56
+ if test "$only_next_1" = "$only_next_2"
57
+ then
58
+ not_in_topic=`git rev-list "^$topic" master`
59
+ if test -z "$not_in_topic"
60
+ then
61
+ echo >&2 "$topic is already up-to-date with master"
62
+ exit 1 ;# we could allow it, but there is no point.
63
+ else
64
+ exit 0
65
+ fi
66
+ else
67
+ not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
68
+ /usr/bin/perl -e '
69
+ my $topic = $ARGV[0];
70
+ my $msg = "* $topic has commits already merged to public branch:\n";
71
+ my (%not_in_next) = map {
72
+ /^([0-9a-f]+) /;
73
+ ($1 => 1);
74
+ } split(/\n/, $ARGV[1]);
75
+ for my $elem (map {
76
+ /^([0-9a-f]+) (.*)$/;
77
+ [$1 => $2];
78
+ } split(/\n/, $ARGV[2])) {
79
+ if (!exists $not_in_next{$elem->[0]}) {
80
+ if ($msg) {
81
+ print STDERR $msg;
82
+ undef $msg;
83
+ }
84
+ print STDERR " $elem->[1]\n";
85
+ }
86
+ }
87
+ ' "$topic" "$not_in_next" "$not_in_master"
88
+ exit 1
89
+ fi
90
+
91
+ exit 0
92
+
93
+ ################################################################
94
+
95
+ This sample hook safeguards topic branches that have been
96
+ published from being rewound.
97
+
98
+ The workflow assumed here is:
99
+
100
+ * Once a topic branch forks from "master", "master" is never
101
+ merged into it again (either directly or indirectly).
102
+
103
+ * Once a topic branch is fully cooked and merged into "master",
104
+ it is deleted. If you need to build on top of it to correct
105
+ earlier mistakes, a new topic branch is created by forking at
106
+ the tip of the "master". This is not strictly necessary, but
107
+ it makes it easier to keep your history simple.
108
+
109
+ * Whenever you need to test or publish your changes to topic
110
+ branches, merge them into "next" branch.
111
+
112
+ The script, being an example, hardcodes the publish branch name
113
+ to be "next", but it is trivial to make it configurable via
114
+ $GIT_DIR/config mechanism.
115
+
116
+ With this workflow, you would want to know:
117
+
118
+ (1) ... if a topic branch has ever been merged to "next". Young
119
+ topic branches can have stupid mistakes you would rather
120
+ clean up before publishing, and things that have not been
121
+ merged into other branches can be easily rebased without
122
+ affecting other people. But once it is published, you would
123
+ not want to rewind it.
124
+
125
+ (2) ... if a topic branch has been fully merged to "master".
126
+ Then you can delete it. More importantly, you should not
127
+ build on top of it -- other people may already want to
128
+ change things related to the topic as patches against your
129
+ "master", so if you need further changes, it is better to
130
+ fork the topic (perhaps with the same name) afresh from the
131
+ tip of "master".
132
+
133
+ Let's look at this example:
134
+
135
+ o---o---o---o---o---o---o---o---o---o "next"
136
+ / / / /
137
+ / a---a---b A / /
138
+ / / / /
139
+ / / c---c---c---c B /
140
+ / / / \ /
141
+ / / / b---b C \ /
142
+ / / / / \ /
143
+ ---o---o---o---o---o---o---o---o---o---o---o "master"
144
+
145
+
146
+ A, B and C are topic branches.
147
+
148
+ * A has one fix since it was merged up to "next".
149
+
150
+ * B has finished. It has been fully merged up to "master" and "next",
151
+ and is ready to be deleted.
152
+
153
+ * C has not merged to "next" at all.
154
+
155
+ We would want to allow C to be rebased, refuse A, and encourage
156
+ B to be deleted.
157
+
158
+ To compute (1):
159
+
160
+ git rev-list ^master ^topic next
161
+ git rev-list ^master next
162
+
163
+ if these match, topic has not merged in next at all.
164
+
165
+ To compute (2):
166
+
167
+ git rev-list master..topic
168
+
169
+ if this is empty, it is fully merged to "master".
@@ -0,0 +1,36 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to prepare the commit log message.
4
+ # Called by "git commit" with the name of the file that has the
5
+ # commit message, followed by the description of the commit
6
+ # message's source. The hook's purpose is to edit the commit
7
+ # message file. If the hook fails with a non-zero status,
8
+ # the commit is aborted.
9
+ #
10
+ # To enable this hook, rename this file to "prepare-commit-msg".
11
+
12
+ # This hook includes three examples. The first comments out the
13
+ # "Conflicts:" part of a merge commit.
14
+ #
15
+ # The second includes the output of "git diff --name-status -r"
16
+ # into the message, just before the "git status" output. It is
17
+ # commented because it doesn't cope with --amend or with squashed
18
+ # commits.
19
+ #
20
+ # The third example adds a Signed-off-by line to the message, that can
21
+ # still be edited. This is rarely a good idea.
22
+
23
+ case "$2,$3" in
24
+ merge,)
25
+ /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
26
+
27
+ # ,|template,)
28
+ # /usr/bin/perl -i.bak -pe '
29
+ # print "\n" . `git diff --cached --name-status -r`
30
+ # if /^#/ && $first++ == 0' "$1" ;;
31
+
32
+ *) ;;
33
+ esac
34
+
35
+ # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
36
+ # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$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,6 @@
1
+ # git ls-files --others --exclude-from=.git/info/exclude
2
+ # Lines that start with '#' are comments.
3
+ # For a project mostly in C, the following would be a good set of
4
+ # exclude patterns (uncomment them if you want to use them):
5
+ # *.[oa]
6
+ # *~
@@ -0,0 +1,2 @@
1
+ x��A
2
+ �0E]�s%ɤMDW��<�$�H������p�y������EZ�I�g�9�ܧ���r�\��وZk����L�œ<?"f�b c{C I�%���8v!(^�}��<�\*/7�)ö4��?ޤ����G�\���k�Z�NV�SW�,�]���.p8�0NJ�
@@ -0,0 +1,2 @@
1
+ x��_o�0�yΧ�HnK�2���T�R;@�4�x��ȉo���v�m�����֦BH�ő��?��q�9y��9�N�������$k���R��ZeuުX���������2χً���"�2��I&jZ�[��l�!��L�l����z�}D3�^�XҊJ�Yi�������@�J� B��@TsC�;/v���.���ǽ�R��{��5\F�*���}h5�� �>�@�1�e�L���S�1��˥H
2
+ �غ@�y��G�d��=��G��`��ms�Bd�~�xr� w� ��a�O�8b����h4�!��+�u9_�/��<^���}��w'�>�0�S�q;3�a��*�Xf\�o��'�����^��]�wQZ�o�q�A���Fb�
@@ -0,0 +1,5 @@
1
+ xeS�n�0�_1p$l9�>���:�
2
+ M��v�����2�TI����KYNR�'�;�ݙ��Iqr���=\+�]Yk�����wVy�DArr�U�WF ���D;/�Rn�<�_+�Ri�7ؘ�B�u��r�pM�J�t.�8
3
+ �W]�!b8H��(k�����yIB�,Զ+��:8*W�����Hw��n�[' �x-� G�m���aM�A,ob��*m�҅'��}��4�Ēd_:�+��XBj���8|��֔=��c��ڌ4���p$Θ�TU���R�v7���ds���T���_~�G���a����u(�
4
+ ��v��<6O�e�9�i��^n��k�[॑vl���O�O���4��Q��- o�l7J\K���2�O��-�it��0�/
5
+ �>�+.�oWS�V*cE�h�(�_����&[)��$pP���ʉ�?�l�
@@ -0,0 +1,2 @@
1
+ x��K
2
+ 1]�}%��A� ���|t�L�L��; =��6���b�u �8��3ɭ 6*�V�Sv�J��Ki�.�`!,�-��y��^��ll��Sp� "��p&��)K�� �x��)��>���'8ם��O�� ��G�8g��G������3����ש��@IB
@@ -0,0 +1 @@
1
+ e8c224f3d7dad7c680ea06ba9dbc8a8faf86e5fb
@@ -0,0 +1 @@
1
+ 78c5e1fa7399fbd40fc229af79bf99b0d8b4a0dc
@@ -0,0 +1 @@
1
+ 42ee0cc55e72d99410c0541822e1b042dabaf039
@@ -0,0 +1 @@
1
+ e9d5cb70264a4800652e03d7ae505f80a03396f2
@@ -0,0 +1,5 @@
1
+ require "bundler"
2
+ Bundler.require
3
+
4
+ require 'debugger'
5
+ require "minitest/autorun"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git_mirror
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.3'
4
+ version: '0.4'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-11 00:00:00.000000000 Z
12
+ date: 2013-07-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -43,6 +43,38 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: minitest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: debugger
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
46
78
  - !ruby/object:Gem::Dependency
47
79
  name: thor
48
80
  requirement: !ruby/object:Gem::Requirement
@@ -67,10 +99,75 @@ extensions: []
67
99
  extra_rdoc_files: []
68
100
  files:
69
101
  - lib/git_mirror.rb
102
+ - test/mirror_test.rb
103
+ - test/root/zendesk/git_mirror.git/config
104
+ - test/root/zendesk/git_mirror.git/description
105
+ - test/root/zendesk/git_mirror.git/FETCH_HEAD
106
+ - test/root/zendesk/git_mirror.git/HEAD
107
+ - test/root/zendesk/git_mirror.git/hooks/applypatch-msg.sample
108
+ - test/root/zendesk/git_mirror.git/hooks/commit-msg.sample
109
+ - test/root/zendesk/git_mirror.git/hooks/post-update.sample
110
+ - test/root/zendesk/git_mirror.git/hooks/pre-applypatch.sample
111
+ - test/root/zendesk/git_mirror.git/hooks/pre-commit.sample
112
+ - test/root/zendesk/git_mirror.git/hooks/pre-push.sample
113
+ - test/root/zendesk/git_mirror.git/hooks/pre-rebase.sample
114
+ - test/root/zendesk/git_mirror.git/hooks/prepare-commit-msg.sample
115
+ - test/root/zendesk/git_mirror.git/hooks/update.sample
116
+ - test/root/zendesk/git_mirror.git/info/exclude
117
+ - test/root/zendesk/git_mirror.git/objects/01/7527bf3750122f5acc45b0f38988968137e1fa
118
+ - test/root/zendesk/git_mirror.git/objects/11/09afa9847ad1701edcad6cba390c0c20b1c3f6
119
+ - test/root/zendesk/git_mirror.git/objects/15/de3ec0676218ca0be78ee74d5d105a4b6d8c9b
120
+ - test/root/zendesk/git_mirror.git/objects/20/2d86e72729bf6aaafa52d7b91357b71afb9470
121
+ - test/root/zendesk/git_mirror.git/objects/23/3d99c8b3d9126199819e8243ed31369a893588
122
+ - test/root/zendesk/git_mirror.git/objects/27/a17ab4d6cb39732ad545a142b30009edca5ba9
123
+ - test/root/zendesk/git_mirror.git/objects/29/955274e0d42e164337c411ad9144e8ffd7e46e
124
+ - test/root/zendesk/git_mirror.git/objects/2b/b9ad240fa04c8cf706a4901c4807878e90c2dc
125
+ - test/root/zendesk/git_mirror.git/objects/2d/dadc86f5b0186a57440e67d071b39c652f5226
126
+ - test/root/zendesk/git_mirror.git/objects/33/ff1877787cfa3903187e8df98257ec40e783e2
127
+ - test/root/zendesk/git_mirror.git/objects/39/35a839d80eaf252751e5a72dd2459b72958f80
128
+ - test/root/zendesk/git_mirror.git/objects/3d/6f469d3f9ef31232e32117e80785d03ec7c6f6
129
+ - test/root/zendesk/git_mirror.git/objects/42/4ac25cc75d3a2d683426d9cb051bde2a35ef4c
130
+ - test/root/zendesk/git_mirror.git/objects/42/ee0cc55e72d99410c0541822e1b042dabaf039
131
+ - test/root/zendesk/git_mirror.git/objects/4e/19de47129776d1952981675566e346f6aa8aca
132
+ - test/root/zendesk/git_mirror.git/objects/63/5d9269a27c2870abbda52219f794f490441a15
133
+ - test/root/zendesk/git_mirror.git/objects/65/d74eba2312f7ba29b616bd94ca147c48976002
134
+ - test/root/zendesk/git_mirror.git/objects/69/8702808838b1e77bbd61f63f74b4d20839dd23
135
+ - test/root/zendesk/git_mirror.git/objects/72/ba465296f504e5fe914a8ccf54eadf568c97bc
136
+ - test/root/zendesk/git_mirror.git/objects/75/66e87e8c0185795f5767517401541c8daa34fc
137
+ - test/root/zendesk/git_mirror.git/objects/78/c5e1fa7399fbd40fc229af79bf99b0d8b4a0dc
138
+ - test/root/zendesk/git_mirror.git/objects/80/84949e56fcc8ba7f01bb1e7175d5d9de2b8f59
139
+ - test/root/zendesk/git_mirror.git/objects/8b/2d62f65cc9fc77103a2828a068bb61b8ea6f19
140
+ - test/root/zendesk/git_mirror.git/objects/8c/28b99bd38b004087558e6b8fceda9b6d8806af
141
+ - test/root/zendesk/git_mirror.git/objects/8f/3963d2d7fa0f4a595d9b830bb55acf72c1f07b
142
+ - test/root/zendesk/git_mirror.git/objects/93/9a953315c16d62aaaecfe54964fa4618523cc3
143
+ - test/root/zendesk/git_mirror.git/objects/96/7ce951984df448241676bc61f8ab3bc8fe1986
144
+ - test/root/zendesk/git_mirror.git/objects/97/18c43430889aaf0bdac5e0b86fbef74e3b3249
145
+ - test/root/zendesk/git_mirror.git/objects/a1/fae2fe94e5f309e94866da7f2b79a647b96d59
146
+ - test/root/zendesk/git_mirror.git/objects/a2/062a6c3b664b7367363d939022644f0f9fb9f4
147
+ - test/root/zendesk/git_mirror.git/objects/a9/95a6bc0d001a3a42ae9788802930d03989aef5
148
+ - test/root/zendesk/git_mirror.git/objects/ab/fc3ff77b75509d6f1a5a261ff88883580981f8
149
+ - test/root/zendesk/git_mirror.git/objects/ad/96c28262c4fc6025c53655a77d4d73a20c464d
150
+ - test/root/zendesk/git_mirror.git/objects/ae/1911584efbb2ebb0cbe63a1f739387b0e05aa0
151
+ - test/root/zendesk/git_mirror.git/objects/b0/126c6e738fcd0fca9f264c5f17d6f07dd35b01
152
+ - test/root/zendesk/git_mirror.git/objects/c2/d86e90c9fcd32b656dbdc79fd93787c892ee9c
153
+ - test/root/zendesk/git_mirror.git/objects/c5/79d5cc74144022b53f255fabfda3d9a0da01a9
154
+ - test/root/zendesk/git_mirror.git/objects/ce/24ff3f37f078e623edd2c22e7ac76772f96a2d
155
+ - test/root/zendesk/git_mirror.git/objects/d2/ff48a97a5a317e78c10096e8cc7c1b5b496f55
156
+ - test/root/zendesk/git_mirror.git/objects/e5/8bfa089b98b321c7bbb245d721ba22f7dfcf31
157
+ - test/root/zendesk/git_mirror.git/objects/e8/c224f3d7dad7c680ea06ba9dbc8a8faf86e5fb
158
+ - test/root/zendesk/git_mirror.git/objects/e9/d5cb70264a4800652e03d7ae505f80a03396f2
159
+ - test/root/zendesk/git_mirror.git/objects/e9/d6ebfa262268f67100ab0aa070ff068b641ce0
160
+ - test/root/zendesk/git_mirror.git/objects/f6/db64d91bc7587b4491cfd181723213e281d577
161
+ - test/root/zendesk/git_mirror.git/refs/heads/master
162
+ - test/root/zendesk/git_mirror.git/refs/tags/v0.1
163
+ - test/root/zendesk/git_mirror.git/refs/tags/v0.2
164
+ - test/root/zendesk/git_mirror.git/refs/tags/v0.3
165
+ - test/test_helper.rb
70
166
  - bin/git-mirror
71
167
  - README.md
72
168
  homepage: ''
73
- licenses: []
169
+ licenses:
170
+ - Apache License Version 2.0
74
171
  post_install_message:
75
172
  rdoc_options: []
76
173
  require_paths:
@@ -83,7 +180,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
83
180
  version: '0'
84
181
  segments:
85
182
  - 0
86
- hash: -1920123311567560358
183
+ hash: 1935349183386110762
87
184
  required_rubygems_version: !ruby/object:Gem::Requirement
88
185
  none: false
89
186
  requirements:
@@ -92,11 +189,75 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
189
  version: '0'
93
190
  segments:
94
191
  - 0
95
- hash: -1920123311567560358
192
+ hash: 1935349183386110762
96
193
  requirements: []
97
194
  rubyforge_project:
98
195
  rubygems_version: 1.8.25
99
196
  signing_key:
100
197
  specification_version: 3
101
198
  summary: utility for mirroring github repositories
102
- test_files: []
199
+ test_files:
200
+ - test/mirror_test.rb
201
+ - test/root/zendesk/git_mirror.git/config
202
+ - test/root/zendesk/git_mirror.git/description
203
+ - test/root/zendesk/git_mirror.git/FETCH_HEAD
204
+ - test/root/zendesk/git_mirror.git/HEAD
205
+ - test/root/zendesk/git_mirror.git/hooks/applypatch-msg.sample
206
+ - test/root/zendesk/git_mirror.git/hooks/commit-msg.sample
207
+ - test/root/zendesk/git_mirror.git/hooks/post-update.sample
208
+ - test/root/zendesk/git_mirror.git/hooks/pre-applypatch.sample
209
+ - test/root/zendesk/git_mirror.git/hooks/pre-commit.sample
210
+ - test/root/zendesk/git_mirror.git/hooks/pre-push.sample
211
+ - test/root/zendesk/git_mirror.git/hooks/pre-rebase.sample
212
+ - test/root/zendesk/git_mirror.git/hooks/prepare-commit-msg.sample
213
+ - test/root/zendesk/git_mirror.git/hooks/update.sample
214
+ - test/root/zendesk/git_mirror.git/info/exclude
215
+ - test/root/zendesk/git_mirror.git/objects/01/7527bf3750122f5acc45b0f38988968137e1fa
216
+ - test/root/zendesk/git_mirror.git/objects/11/09afa9847ad1701edcad6cba390c0c20b1c3f6
217
+ - test/root/zendesk/git_mirror.git/objects/15/de3ec0676218ca0be78ee74d5d105a4b6d8c9b
218
+ - test/root/zendesk/git_mirror.git/objects/20/2d86e72729bf6aaafa52d7b91357b71afb9470
219
+ - test/root/zendesk/git_mirror.git/objects/23/3d99c8b3d9126199819e8243ed31369a893588
220
+ - test/root/zendesk/git_mirror.git/objects/27/a17ab4d6cb39732ad545a142b30009edca5ba9
221
+ - test/root/zendesk/git_mirror.git/objects/29/955274e0d42e164337c411ad9144e8ffd7e46e
222
+ - test/root/zendesk/git_mirror.git/objects/2b/b9ad240fa04c8cf706a4901c4807878e90c2dc
223
+ - test/root/zendesk/git_mirror.git/objects/2d/dadc86f5b0186a57440e67d071b39c652f5226
224
+ - test/root/zendesk/git_mirror.git/objects/33/ff1877787cfa3903187e8df98257ec40e783e2
225
+ - test/root/zendesk/git_mirror.git/objects/39/35a839d80eaf252751e5a72dd2459b72958f80
226
+ - test/root/zendesk/git_mirror.git/objects/3d/6f469d3f9ef31232e32117e80785d03ec7c6f6
227
+ - test/root/zendesk/git_mirror.git/objects/42/4ac25cc75d3a2d683426d9cb051bde2a35ef4c
228
+ - test/root/zendesk/git_mirror.git/objects/42/ee0cc55e72d99410c0541822e1b042dabaf039
229
+ - test/root/zendesk/git_mirror.git/objects/4e/19de47129776d1952981675566e346f6aa8aca
230
+ - test/root/zendesk/git_mirror.git/objects/63/5d9269a27c2870abbda52219f794f490441a15
231
+ - test/root/zendesk/git_mirror.git/objects/65/d74eba2312f7ba29b616bd94ca147c48976002
232
+ - test/root/zendesk/git_mirror.git/objects/69/8702808838b1e77bbd61f63f74b4d20839dd23
233
+ - test/root/zendesk/git_mirror.git/objects/72/ba465296f504e5fe914a8ccf54eadf568c97bc
234
+ - test/root/zendesk/git_mirror.git/objects/75/66e87e8c0185795f5767517401541c8daa34fc
235
+ - test/root/zendesk/git_mirror.git/objects/78/c5e1fa7399fbd40fc229af79bf99b0d8b4a0dc
236
+ - test/root/zendesk/git_mirror.git/objects/80/84949e56fcc8ba7f01bb1e7175d5d9de2b8f59
237
+ - test/root/zendesk/git_mirror.git/objects/8b/2d62f65cc9fc77103a2828a068bb61b8ea6f19
238
+ - test/root/zendesk/git_mirror.git/objects/8c/28b99bd38b004087558e6b8fceda9b6d8806af
239
+ - test/root/zendesk/git_mirror.git/objects/8f/3963d2d7fa0f4a595d9b830bb55acf72c1f07b
240
+ - test/root/zendesk/git_mirror.git/objects/93/9a953315c16d62aaaecfe54964fa4618523cc3
241
+ - test/root/zendesk/git_mirror.git/objects/96/7ce951984df448241676bc61f8ab3bc8fe1986
242
+ - test/root/zendesk/git_mirror.git/objects/97/18c43430889aaf0bdac5e0b86fbef74e3b3249
243
+ - test/root/zendesk/git_mirror.git/objects/a1/fae2fe94e5f309e94866da7f2b79a647b96d59
244
+ - test/root/zendesk/git_mirror.git/objects/a2/062a6c3b664b7367363d939022644f0f9fb9f4
245
+ - test/root/zendesk/git_mirror.git/objects/a9/95a6bc0d001a3a42ae9788802930d03989aef5
246
+ - test/root/zendesk/git_mirror.git/objects/ab/fc3ff77b75509d6f1a5a261ff88883580981f8
247
+ - test/root/zendesk/git_mirror.git/objects/ad/96c28262c4fc6025c53655a77d4d73a20c464d
248
+ - test/root/zendesk/git_mirror.git/objects/ae/1911584efbb2ebb0cbe63a1f739387b0e05aa0
249
+ - test/root/zendesk/git_mirror.git/objects/b0/126c6e738fcd0fca9f264c5f17d6f07dd35b01
250
+ - test/root/zendesk/git_mirror.git/objects/c2/d86e90c9fcd32b656dbdc79fd93787c892ee9c
251
+ - test/root/zendesk/git_mirror.git/objects/c5/79d5cc74144022b53f255fabfda3d9a0da01a9
252
+ - test/root/zendesk/git_mirror.git/objects/ce/24ff3f37f078e623edd2c22e7ac76772f96a2d
253
+ - test/root/zendesk/git_mirror.git/objects/d2/ff48a97a5a317e78c10096e8cc7c1b5b496f55
254
+ - test/root/zendesk/git_mirror.git/objects/e5/8bfa089b98b321c7bbb245d721ba22f7dfcf31
255
+ - test/root/zendesk/git_mirror.git/objects/e8/c224f3d7dad7c680ea06ba9dbc8a8faf86e5fb
256
+ - test/root/zendesk/git_mirror.git/objects/e9/d5cb70264a4800652e03d7ae505f80a03396f2
257
+ - test/root/zendesk/git_mirror.git/objects/e9/d6ebfa262268f67100ab0aa070ff068b641ce0
258
+ - test/root/zendesk/git_mirror.git/objects/f6/db64d91bc7587b4491cfd181723213e281d577
259
+ - test/root/zendesk/git_mirror.git/refs/heads/master
260
+ - test/root/zendesk/git_mirror.git/refs/tags/v0.1
261
+ - test/root/zendesk/git_mirror.git/refs/tags/v0.2
262
+ - test/root/zendesk/git_mirror.git/refs/tags/v0.3
263
+ - test/test_helper.rb