git-svn-mirror 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,4 @@
1
+ © Eloy Duran <eloy.de.enige@gmail.com>
2
+ You may use these works, ‘as is’, for anything.
3
+ If you include this plus copyright notice.
4
+ But without warranty.
@@ -0,0 +1,98 @@
1
+ git-svn-mirror
2
+ --------------
3
+
4
+ A command-line tool that automates the task of creating a GIT mirror for a SVN
5
+ repo, and keeping it up-to-date.
6
+
7
+ Install
8
+ -------
9
+
10
+ This tool is packaged as a Ruby Gem, install it by running the following:
11
+
12
+ $ gem install git-svn-mirror
13
+
14
+ Configure the ‘workbench’
15
+ -------------------------
16
+
17
+ To mirror a SVN repo, first the local ‘workbench’ repo has to be configured.
18
+ This ‘workbench’ is the GIT repo where the SVN revisions will be stored and
19
+ from where these revisions will be pushed to the remote mirror GIT repo.
20
+
21
+ Start by creating the directory:
22
+
23
+ $ mkdir -p /path/to/workbench
24
+
25
+ Then initialize the ‘workbench’:
26
+
27
+ $ cd /path/to/workbench
28
+ $ git-svn-mirror init --from=http://svn-host/repo_root --to=git@git-host:user/mirror.git
29
+
30
+ This will create a ‘bare’ GIT repo, configure the SVN and GIT remotes, fetch
31
+ the revisions from the SVN remote, and compact the ‘workbench’ by running the
32
+ GIT garbage collector.
33
+
34
+ It can often be handy to supply an authors file, with the <tt>--authors-file</tt>
35
+ option, which is used to migrate user names to GIT names and email addresses.
36
+ The entries in this file should look like:
37
+
38
+ svn-user-name = User Name <user@example.com>
39
+
40
+ Update mirror
41
+ -------------
42
+
43
+ To push the latest changes from the SVN repo to the GIT repo, run the following
44
+ command from the ‘workbench’ repo:
45
+
46
+ $ git-svn-mirror update
47
+
48
+ Or by specifying the path(s) to one or more ‘workbench’ repos:
49
+
50
+ $ git-svn-mirror update /path/to/workbench1 /path/to/workbench2
51
+
52
+ You will probably normally not want to perform this step by hand. You can solve
53
+ this by adding this command as a cron job, in which case you can silence the
54
+ tool with the <tt>--silent</tt> option.
55
+
56
+ ‘init’ help banner
57
+ ----------------
58
+
59
+ Usage: git-svn-mirror init [mandatory options] [options]
60
+
61
+ Mandatory options are --from and --to.
62
+
63
+ --from URI The location of the SVN repository that is to be mirrored.
64
+ --to URI The location of the GIT repository that is the mirror.
65
+ --workbench PATH The location of the workbench repository. Defaults to the current work dir.
66
+ --authors-file PATH An optional authors file used to migrate SVN usernames to GIT's format.
67
+ -s, --silent Silent mode.
68
+
69
+ ‘update’ help banner
70
+ --------------------
71
+
72
+ Usage: git-svn-mirror update [options] [workbench1] [workbench2] ...
73
+
74
+ Defaults to the current work dir if none is given.
75
+
76
+ -s, --silent Silent mode.
77
+
78
+ Contributing
79
+ ------------
80
+
81
+ Once you've made your great commits:
82
+
83
+ 1. [Fork][fk] git-svn-mirror
84
+ 2. Create a topic branch - `git checkout -b my_branch`
85
+ 3. Push to your branch - `git push origin my_branch`
86
+ 4. Create an [Issue][is] with a link to your branch
87
+ 5. That’s it!
88
+
89
+ License In Three Lines (LITL)
90
+ -----------------------------
91
+
92
+ © Eloy Duran <eloy.de.enige@gmail.com>
93
+ You may use these works, ‘as is’, for anything.
94
+ If you include this plus copyright notice.
95
+ But without warranty.
96
+
97
+ [fk]: http://help.github.com/forking/
98
+ [is]: http://github.com/alloy/git-svn-mirror/issues
data/TODO ADDED
@@ -0,0 +1,2 @@
1
+ * error checking and reporting
2
+ * optimize by not trying to push if there were no updates
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require 'git-svn-mirror'
3
+
4
+ _, success = GitSVNMirror.run(ARGV)
5
+ exit(1) unless success
@@ -0,0 +1,46 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{git-svn-mirror}
8
+ s.version = "0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Eloy Duran"]
12
+ s.date = %q{2010-10-11}
13
+ s.default_executable = %q{git-svn-mirror}
14
+ s.description = %q{A command-line tool that automates the task of creating a GIT mirror for a SVN repo, and keeping it up-to-date.}
15
+ s.email = %q{eloy.de.enige@gmail.com}
16
+ s.executables = ["git-svn-mirror"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "README.md",
20
+ "TODO"
21
+ ]
22
+ s.files = [
23
+ "LICENSE",
24
+ "README.md",
25
+ "TODO",
26
+ "bin/git-svn-mirror",
27
+ "git-svn-mirror.gemspec",
28
+ "lib/git-svn-mirror.rb"
29
+ ]
30
+ s.homepage = %q{http://github.com/alloy/git-svn-mirror}
31
+ s.rdoc_options = ["--charset=UTF-8"]
32
+ s.require_paths = ["lib"]
33
+ s.rubygems_version = %q{1.3.7}
34
+ s.summary = %q{A command-line tool that automates the task of creating a GIT mirror for a SVN repo, and keeping it up-to-date.}
35
+
36
+ if s.respond_to? :specification_version then
37
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
38
+ s.specification_version = 3
39
+
40
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
41
+ else
42
+ end
43
+ else
44
+ end
45
+ end
46
+
@@ -0,0 +1,147 @@
1
+ require 'optparse'
2
+
3
+ class GitSVNMirror
4
+ VERSION = "0.1"
5
+
6
+ attr_accessor :from, :to, :workbench, :authors_file, :silent
7
+
8
+ def self.run(argv)
9
+ mirror = new
10
+ status = case argv.shift
11
+ when 'init' then init(mirror, argv)
12
+ when 'update' then update(mirror, argv)
13
+ else
14
+ puts "Usage: git-svn-mirror [init|update]"
15
+ false
16
+ end
17
+ [mirror, status]
18
+ end
19
+
20
+ def self.option_parser(mirror, argv)
21
+ opts = OptionParser.new do |o|
22
+ yield(o)
23
+ o.on('-s', '--silent', 'Silent mode.') { mirror.silent = true }
24
+ o.on('-v', '--version', 'Print the version.') { puts VERSION; exit }
25
+ end
26
+ opts.parse!(argv)
27
+ opts
28
+ end
29
+
30
+ def self.init(mirror, argv)
31
+ opts = option_parser(mirror, argv) do |o|
32
+ o.banner = "Usage: git-svn-mirror init [mandatory options] [options]"
33
+ o.separator "\n Mandatory options are --from and --to.\n\n"
34
+ o.on('--from URI', 'The location of the SVN repository that is to be mirrored.') { |uri| mirror.from = uri }
35
+ o.on('--to URI', 'The location of the GIT repository that is the mirror.') { |uri| mirror.to = uri }
36
+ o.on('--workbench PATH', 'The location of the workbench repository. Defaults to the current work dir.') { |wb| mirror.workbench = wb }
37
+ o.on('--authors-file PATH', 'An optional authors file used to migrate SVN usernames to GIT\'s format.') { |af| mirror.authors_file = af }
38
+ end
39
+
40
+ if mirror.from && mirror.to
41
+ if !File.exist?(mirror.workbench)
42
+ puts "[!] Given workbench path does not exist."
43
+ false
44
+ else
45
+ if mirror.authors_file && !File.exist?(mirror.authors_file)
46
+ puts "[!] Given authors file does not exist."
47
+ false
48
+ else
49
+ mirror.init
50
+ true
51
+ end
52
+ end
53
+ else
54
+ puts opts
55
+ false
56
+ end
57
+ end
58
+
59
+ def self.update(mirror, argv)
60
+ opts = option_parser(mirror, argv) do |o|
61
+ o.banner = "Usage: git-svn-mirror update [options] [workbench1] [workbench2] ..."
62
+ o.separator "\n Defaults to the current work dir if none is given.\n\n"
63
+ end
64
+
65
+ if argv.empty?
66
+ mirror.update
67
+ else
68
+ argv.each do |workbench|
69
+ mirror.workbench = workbench
70
+ mirror.update
71
+ end
72
+ end
73
+ true
74
+ end
75
+
76
+ def init
77
+ log "* Configuring mirror workbench at `#{workbench}'"
78
+ sh "git init --bare"
79
+
80
+ sh "git svn init --stdlayout --prefix=svn/ #{from}"
81
+ sh "git config --add svn.authorsfile '#{authors_file}'" if authors_file
82
+
83
+ sh "git remote add origin #{to}"
84
+ sh "git config --add remote.origin.push 'refs/remotes/svn/*:refs/heads/*'"
85
+
86
+ fetch
87
+ log "* Running garbage collection"
88
+ sh "git gc"
89
+
90
+ log "The mirror workbench has been configured. To push to the remote GIT repo,",
91
+ "and possibly as a cron job, run the following command:",
92
+ "",
93
+ " $ git-svn-mirror update '#{workbench}'"
94
+ end
95
+
96
+ def update
97
+ fetch
98
+ push
99
+ end
100
+
101
+ def fetch
102
+ log "* Fetching from SVN repo at `#{from}'"
103
+ sh "git svn fetch"
104
+ end
105
+
106
+ def push
107
+ log "* Pushing to GIT repo at `#{to}'"
108
+ sh "git push origin"
109
+ end
110
+
111
+ def from
112
+ @from ||= config("svn-remote.svn.url")
113
+ end
114
+
115
+ def to
116
+ @to ||= config("remote.origin.url")
117
+ end
118
+
119
+ def workbench=(path)
120
+ @workbench = File.expand_path(path)
121
+ end
122
+
123
+ def workbench
124
+ @workbench ||= Dir.pwd
125
+ end
126
+
127
+ def authors_file=(path)
128
+ @authors_file = File.expand_path(path)
129
+ end
130
+
131
+ def log(*str)
132
+ puts("\n#{str.join("\n")}\n\n") unless @silent
133
+ end
134
+
135
+ def config(key)
136
+ value = sh("git config --get #{key}", true)
137
+ value unless value.empty?
138
+ end
139
+
140
+ def sh(command, capture = false)
141
+ Dir.chdir(workbench) do
142
+ command = "env GIT_DIR='#{workbench}' #{command}"
143
+ command += (@silent ? " > /dev/null 2>&1" : " 1>&2") unless capture
144
+ `#{command}`.strip
145
+ end
146
+ end
147
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git-svn-mirror
3
+ version: !ruby/object:Gem::Version
4
+ hash: 9
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ version: "0.1"
10
+ platform: ruby
11
+ authors:
12
+ - Eloy Duran
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-10-11 00:00:00 +02:00
18
+ default_executable: git-svn-mirror
19
+ dependencies: []
20
+
21
+ description: A command-line tool that automates the task of creating a GIT mirror for a SVN repo, and keeping it up-to-date.
22
+ email: eloy.de.enige@gmail.com
23
+ executables:
24
+ - git-svn-mirror
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - LICENSE
29
+ - README.md
30
+ - TODO
31
+ files:
32
+ - LICENSE
33
+ - README.md
34
+ - TODO
35
+ - bin/git-svn-mirror
36
+ - git-svn-mirror.gemspec
37
+ - lib/git-svn-mirror.rb
38
+ has_rdoc: true
39
+ homepage: http://github.com/alloy/git-svn-mirror
40
+ licenses: []
41
+
42
+ post_install_message:
43
+ rdoc_options:
44
+ - --charset=UTF-8
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ hash: 3
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ requirements: []
66
+
67
+ rubyforge_project:
68
+ rubygems_version: 1.3.7
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: A command-line tool that automates the task of creating a GIT mirror for a SVN repo, and keeping it up-to-date.
72
+ test_files: []
73
+