nirvdrum-svn2git 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,22 @@
1
+ # 1.2.0 - 2009-04-17
2
+
3
+ * Reworked command-line options so they work similarly to every other app in the world.
4
+ * Better error messaging when no URL provided.
5
+ * Improved docs.
6
+
7
+ # 1.1.1 - 2009-04-15
8
+
9
+ * Started using Jeweler for gem management.
10
+ * Fixed issue with not loading up RubyGems appropriately.
11
+
12
+ # 1.1.0 - 2009-01-02
13
+
14
+ * First release since nirvdrum fork.
15
+
16
+ * Fixed issues with handling of tags and branches.
17
+ * Added better logging of output from git-svn.
18
+ * Wrap external command processing to capture failures.
19
+
20
+ # 1.0.0 - 2008-07-19
21
+
22
+ * Forked version from jcoglan.
@@ -1,13 +1,15 @@
1
- == svn2git
1
+ svn2git
2
+ =======
2
3
 
3
- +svn2git+ is a tiny utility for migrating projects from Subversion to Git
4
+ _svn2git_ is a tiny utility for migrating projects from Subversion to Git
4
5
  while keeping the trunk, branches and tags where they should be. It uses
5
6
  git-svn to clone an svn repository and does some clean-up to make sure
6
7
  branches and tags are imported in a meaningful way, and that the code checked
7
8
  into master ends up being what's currently in your svn trunk rather than
8
9
  whichever svn branch your last commit was in.
9
10
 
10
- === Examples
11
+ Examples
12
+ --------
11
13
 
12
14
  Say I have this code in svn:
13
15
 
@@ -59,14 +61,16 @@ After svn2git is done with your project, you'll get this instead:
59
61
  Finally, it makes sure the HEAD of master is the same as the current trunk of
60
62
  the svn repo.
61
63
 
62
- === Installation
64
+ Installation
65
+ ------------
63
66
 
64
67
  Make sure you have git installed, then install the gem:
65
68
 
66
- $ sudo apt-get install git-core git-svn
67
- $ sudo gem install svn2git
69
+ $ sudo apt-get install git-core git-svn
70
+ $ sudo gem install nirvdrum-svn2git
68
71
 
69
- === Usage
72
+ Usage
73
+ -----
70
74
 
71
75
  There are a number of ways in which you can create a git repo from an existing
72
76
  svn repo. The differentiating factor is the svn repo layout. Below is an
@@ -76,28 +80,28 @@ create a git repo from a svn repo in the specified layout.
76
80
  1. The svn repo is in the standard layout of (trunk, branches, tags) at the
77
81
  root level of the repo.
78
82
 
79
- $ svn2git http://svn.yoursite.com/path/to/repo trunk=trunk branches=branches tags=tags
83
+ $ svn2git http://svn.yoursite.com/path/to/repo --trunk trunk --branches branches --tags tags
80
84
 
81
85
  2. The svn repo is NOT in standard layout and has only a trunk and tags at the
82
86
  root level of the repo.
83
87
 
84
- $ svn2git http://svn.yoursite.com/path/to/repo trunk=trunk tags=tags
88
+ $ svn2git http://svn.yoursite.com/path/to/repo --trunk trunk --tags tags
85
89
 
86
90
  3. The svn repo is NOT in standard layout and has only a trunk and branches at
87
91
  the root level of the repo.
88
92
 
89
- $ svn2git http://svn.yoursite.com/path/to/repo trunk=trunk branches=branches
93
+ $ svn2git http://svn.yoursite.com/path/to/repo --trunk trunk --branches branches
90
94
 
91
95
  4. The svn repo is NOT in standard layout and has only a trunk at the root
92
96
  level of the repo.
93
97
 
94
- $ svn2git http://svn.yoursite.com/path/to/repo trunk=trunk
98
+ $ svn2git http://svn.yoursite.com/path/to/repo --trunk trunk
95
99
 
96
100
  5. The svn repo is NOT in standard layout and has no trunk, branches, or tags
97
101
  at the root level of the repo. Instead the root level of the repo is
98
102
  equivalent to the trunk and there are no tags or branches.
99
103
 
100
- $ svn2git http://svn.yoursite.com/path/to/repo rootistrunk=true
104
+ $ svn2git http://svn.yoursite.com/path/to/repo --rootistrunk
101
105
 
102
106
  The above will create a git repository in the current directory with the git
103
107
  version of the svn repository. Hence, you need to make a directory that you
@@ -108,7 +112,8 @@ specified trunk=foo branches=bar and tags=foobar it would be referencing
108
112
  http://svn.yoursite.com/path/to/repo/foo as your trunk, and so on. However, in
109
113
  case 5 it references the root of the repo as trunk.
110
114
 
111
- === Authors
115
+ Authors
116
+ -------
112
117
 
113
118
  To convert all your svn authors to git format, create a file somewhere on your
114
119
  system with the list of conversions to make, one per line, for example:
@@ -118,9 +123,20 @@ system with the list of conversions to make, one per line, for example:
118
123
 
119
124
  Then pass an +authors+ option to +svn2git+ pointing to your file:
120
125
 
121
- svn2git http://repos.com/myproject authors=~/authors.txt
126
+ svn2git http://repos.com/myproject --authors ~/authors.txt
122
127
 
123
128
  Alternatively, you can place the authors file into ~/.svn2git/authors and
124
129
  svn2git will load it out of there. This allows you to build up one authors
125
130
  file for all your projects and have it loaded for each repository that you
126
- migrate.
131
+ migrate.
132
+
133
+ Debugging
134
+ ---------
135
+
136
+ If you're having problems with converting your repository and you're not sure why,
137
+ try turning on verbose logging. This will print out more information from the
138
+ underlying git-svn process.
139
+
140
+ You can turn on verbose logging with the '-v' or '--verbose' flags, like so:
141
+
142
+ $ svn2git http://svn.yoursite.com/path/to/repo --verbose
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 1
2
+ :minor: 2
3
+ :patch: 0
3
4
  :major: 1
4
- :minor: 1
@@ -1,25 +1,21 @@
1
+ require 'optparse'
2
+ require 'pp'
3
+
1
4
  module Svn2Git
2
5
  DEFAULT_AUTHORS_FILE = "~/.svn2git/authors"
3
-
6
+
4
7
  class Migration
5
-
8
+
6
9
  attr_reader :dir
7
-
8
- def initialize(url, options = {})
9
- @url = url
10
- @dir = @url.scan(/[^\/]+/).last
11
-
12
- @options = options
13
- @options[:trunk] ||= 'trunk'
14
- @options[:branches] ||= 'branches'
15
- @options[:tags] ||= 'tags'
16
-
17
- @authors = options[:authors]
18
- if @authors.nil? && File.exists?(File.expand_path(DEFAULT_AUTHORS_FILE))
19
- @authors = DEFAULT_AUTHORS_FILE
20
- end
10
+
11
+ def initialize(args)
12
+ @options = parse(args)
13
+ show_help_message("Missing SVN_URL parameter") if args.empty?
14
+ show_help_message('Too many arguments') if args.size > 1
15
+
16
+ @url = args.first
21
17
  end
22
-
18
+
23
19
  def run!
24
20
  clone!
25
21
  fix_tags
@@ -27,43 +23,103 @@ module Svn2Git
27
23
  fix_trunk
28
24
  optimize_repos
29
25
  end
30
-
26
+
27
+ def parse(args)
28
+ # Set up reasonable defaults for options.
29
+ options = {}
30
+ options[:verbose] = false
31
+ options[:rootistrunk] = false
32
+ options[:trunk] = 'trunk'
33
+ options[:branches] = 'branches'
34
+ options[:tags] = 'tags'
35
+
36
+ if File.exists?(File.expand_path(DEFAULT_AUTHORS_FILE))
37
+ options[:authors] = DEFAULT_AUTHORS_FILE
38
+ end
39
+
40
+
41
+ # Parse the command-line arguments.
42
+ @opts = OptionParser.new do |opts|
43
+ opts.banner = 'Usage: svn2git SVN_URL [options]'
44
+
45
+ opts.separator ''
46
+ opts.separator 'Specific options:'
47
+
48
+ opts.on('--trunk TRUNK_PATH', 'Subpath to trunk from repository URL (default: trunk)') do |trunk|
49
+ options[:trunk] = trunk
50
+ end
51
+
52
+ opts.on('--branches BRANCHES_PATH', 'Subpath to branches from repository URL (default: branches)') do |branches|
53
+ options[:branches] = branches
54
+ end
55
+
56
+ opts.on('--tags TAGS_PATH', 'Subpath to tags from repository URL (default: tags)') do |tags|
57
+ options[:tags] = tags
58
+ end
59
+
60
+ opts.on('--authors AUTHORS_FILE', "Path to file containing svn-to-git authors mapping (default: #{DEFAULT_AUTHORS_FILE})") do |authors|
61
+ options[:authors] = authors
62
+ end
63
+
64
+ opts.on('--rootistrunk', 'Use this if the root level of the repo isequivalent to the trunk and there are no tags or branches') do
65
+ options[:rootistrunk] = true
66
+ end
67
+
68
+ opts.on('-v', '--verbose', 'Be verbose in logging -- useful for debugging issues') do
69
+ options[:verbose] = true
70
+ end
71
+
72
+ opts.separator ""
73
+
74
+ # No argument, shows at tail. This will print an options summary.
75
+ # Try it and see!
76
+ opts.on_tail('-h', '--help', 'Show this message') do
77
+ puts opts
78
+ exit
79
+ end
80
+ end
81
+
82
+ @opts.parse! args
83
+ options
84
+ end
85
+
31
86
  private
32
-
87
+
33
88
  def clone!
34
89
  trunk = @options[:trunk]
35
90
  branches = @options[:branches]
36
91
  tags = @options[:tags]
37
92
  rootistrunk = @options[:rootistrunk]
38
-
39
- if (!rootistrunk.nil?)
93
+ authors = @options[:authors]
94
+
95
+ if rootistrunk
40
96
  # Non-standard repository layout. The repository root is effectively 'trunk.'
41
97
  run_command("git svn init --no-metadata --trunk=#{@url}")
42
-
98
+
43
99
  else
44
100
  cmd = "git svn init --no-metadata "
45
-
101
+
46
102
  # Add each component to the command that was passed as an argument.
47
103
  cmd += "--trunk=#{trunk} " unless trunk.nil?
48
104
  cmd += "--tags=#{tags} " unless tags.nil?
49
105
  cmd += "--branches=#{branches} " unless branches.nil?
50
-
106
+
51
107
  cmd += @url
52
-
108
+
53
109
  run_command(cmd)
54
110
  end
55
-
56
- run_command("git config svn.authorsfile #{@authors}") if @authors
111
+
112
+ run_command("git config svn.authorsfile #{authors}") if authors
57
113
  run_command("git svn fetch")
58
-
114
+
59
115
  get_branches
60
116
  end
61
-
117
+
62
118
  def get_branches
63
119
  @remote = `git branch -r`.split(/\n/)
64
120
  @tags = @remote.find_all { |b| b.strip =~ %r{^#{@options[:tags]}\/} }
65
121
  end
66
-
122
+
67
123
  def fix_tags
68
124
  @tags.each do |tag|
69
125
  id = tag.strip.gsub(%r{^#{@options[:tags]}\/}, '')
@@ -74,7 +130,7 @@ module Svn2Git
74
130
  run_command("git branch -d -r #{tag.strip()}")
75
131
  end
76
132
  end
77
-
133
+
78
134
  def fix_branches
79
135
  svn_branches = @remote.find_all { |b| not @tags.include?(b) }
80
136
  svn_branches.each do |branch|
@@ -84,7 +140,7 @@ module Svn2Git
84
140
  run_command("git checkout -b #{branch}")
85
141
  end
86
142
  end
87
-
143
+
88
144
  def fix_trunk
89
145
  trunk = @remote.find { |b| b.strip == 'trunk' }
90
146
  if trunk
@@ -94,14 +150,14 @@ module Svn2Git
94
150
  run_command("git branch -d -r trunk")
95
151
  end
96
152
  end
97
-
153
+
98
154
  def optimize_repos
99
155
  run_command("git gc")
100
156
  end
101
-
157
+
102
158
  def run_command(cmd)
103
159
  log "Running command: #{cmd}"
104
-
160
+
105
161
  IO.popen(cmd) do |stdout|
106
162
  stdout.each do |line|
107
163
  log line
@@ -109,12 +165,16 @@ module Svn2Git
109
165
  end
110
166
  end
111
167
 
112
- private
113
-
114
168
  def log(msg)
115
169
  puts msg if @options[:verbose]
116
170
  end
117
171
 
172
+ def show_help_message(msg)
173
+ puts "Error starting script: #{msg}\n\n"
174
+ puts @opts.help
175
+ exit
176
+ end
177
+
118
178
  end
119
179
  end
120
180
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nirvdrum-svn2git
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Coglan
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-04-15 00:00:00 -07:00
13
+ date: 2009-04-17 00:00:00 -07:00
14
14
  default_executable: svn2git
15
15
  dependencies: []
16
16
 
@@ -21,14 +21,16 @@ executables:
21
21
  extensions: []
22
22
 
23
23
  extra_rdoc_files:
24
- - README
24
+ - ChangeLog.markdown
25
+ - README.markdown
25
26
  files:
27
+ - ChangeLog.markdown
28
+ - README.markdown
26
29
  - Rakefile
27
30
  - VERSION.yml
28
31
  - bin/svn2git
29
32
  - lib/svn2git.rb
30
33
  - lib/svn2git/migration.rb
31
- - README
32
34
  has_rdoc: true
33
35
  homepage: https://www.negativetwenty.net/redmine/projects/svn2git
34
36
  post_install_message:
@@ -53,7 +55,7 @@ requirements: []
53
55
  rubyforge_project:
54
56
  rubygems_version: 1.2.0
55
57
  signing_key:
56
- specification_version: 2
58
+ specification_version: 3
57
59
  summary: A tool for migrating svn projects to git
58
60
  test_files: []
59
61