norbert-braid 0.4.13 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,120 @@
1
+ h1. Braid
2
+
3
+ Braid is a simple tool to help track git and svn vendor branches in a git repository.
4
+
5
+ The project homepage is at "http://github.com/evilchelu/braid/wikis/home":http://github.com/evilchelu/braid/wikis/home
6
+
7
+ h2. Requirements
8
+
9
+ * git 1.6+ (and git-svn if you want to mirror svn repositories)
10
+ * main >= 2.8.0
11
+ * open4 >= 0.9.6
12
+
13
+ h2. Installing using rubygems - official releases
14
+
15
+ gem install braid
16
+
17
+ h2. Installing using rubygems - development releases
18
+
19
+ gem sources -a http://gems.github.com
20
+ gem install evilchelu-braid
21
+
22
+ h2. Installing from source
23
+
24
+ git clone git://github.com/evilchelu/braid.git
25
+ cd braid
26
+ gem build braid.gemspec
27
+ sudo gem install braid-x.y.z.gem
28
+
29
+ h2. Quick usage - ruby project
30
+
31
+ Let's assume we're writing something like gitnub that needs grit in lib/grit. Initialize the repo (nothing braid related here):
32
+
33
+ git init gritty
34
+ cd gritty
35
+ touch README
36
+ git add README
37
+ git commit -m "initial commit"
38
+
39
+ Now let's vendor grit:
40
+
41
+ braid add git://github.com/mojombo/grit.git lib/grit
42
+
43
+ And you're done! Braid vendored grit into lib/grit. Feel free to inspect the changes with git log or git show.
44
+
45
+ If further down the line, you want to bring new changes from grit in your repository, just update the mirror:
46
+
47
+ braid update lib/grit
48
+
49
+ h2. Quick usage - rails project
50
+
51
+ Let's assume you want to start a new rails app called shiny. Initialize the repo (nothing braid related here):
52
+
53
+ git init shiny
54
+ cd shiny
55
+ touch README
56
+ git add README
57
+ git commit -m "initial commit"
58
+
59
+ Vendor rails (this might take a while because the rails repo is huge!):
60
+
61
+ braid add git://github.com/rails/rails.git vendor/rails
62
+
63
+ Create your new rails app (nothing braid related here):
64
+
65
+ ruby vendor/rails/railties/bin/rails .
66
+ git add .
67
+ git commit -m "rails ."
68
+
69
+ Add any plugins you might need:
70
+
71
+ braid add git://github.com/thoughtbot/shoulda.git -p
72
+ braid add git://github.com/thoughtbot/factory_girl.git -p
73
+ braid add git://github.com/mbleigh/subdomain-fu.git -p
74
+
75
+ And you're done! Braid vendored rails and your plugins. Feel free to inspect the changes with git log or git show.
76
+
77
+ If further down the line, you want to bring new changes from rails in your repository, just update the mirror:
78
+
79
+ braid update vendor/rails
80
+
81
+ Or, if you want all mirrors updated:
82
+
83
+ braid update
84
+
85
+ h2. More usage
86
+
87
+ Use the built in help system to find out about all commands and options:
88
+
89
+ braid help
90
+ braid help add # or braid add --help
91
+
92
+ You may also want to read "Usage and examples":http://github.com/evilchelu/braid/wikis/usage-and-examples.
93
+
94
+ h2. Troubleshooting
95
+
96
+ Check "Troubleshooting":http://github.com/evilchelu/braid/wikis/troubleshooting if you're having issues.
97
+
98
+ h2. Contributing
99
+
100
+ We appreciate any patches, error reports and usage ideas you may have. Please submit a lighthouse ticket or start a thread on the mailing list.
101
+
102
+ Bugs and feature requests: "*braid project on lighthouse*":http://evilchelu.lighthouseapp.com/projects/10600-braid
103
+
104
+ Discussions and community support: "*braid-gem google group*":http://groups.google.com/group/braid-gem
105
+
106
+ h2. Authors
107
+
108
+ * Cristi Balan (evilchelu)
109
+ * Norbert Crombach (norbert)
110
+
111
+ h2. Contributors (alphabetically)
112
+
113
+ * Alan Harper
114
+ * Christoph Sturm
115
+ * Dennis Muhlestein
116
+ * Ferdinand Svehla
117
+ * Michael Klishin
118
+ * Roman Heinrich
119
+ * Tyler Rick
120
+
data/bin/braid CHANGED
@@ -92,10 +92,6 @@ Main {
92
92
  * does NOT remove the git and git svn remotes in case you still need them around
93
93
  TXT
94
94
 
95
- examples <<-TXT
96
- . braid remove local/dir
97
- TXT
98
-
99
95
  mixin :argument_path, :option_verbose
100
96
 
101
97
  run {
@@ -104,36 +100,41 @@ Main {
104
100
  }
105
101
  }
106
102
 
107
- mode(:setup) {
103
+ mode(:diff) {
108
104
  description <<-TXT
109
- Set up git and git-svn remotes.
105
+ Show diff of local changes to mirror.
110
106
  TXT
111
107
 
112
- examples <<-TXT
113
- . braid setup local/dir
108
+ mixin :argument_path, :option_verbose
109
+
110
+ run {
111
+ Braid::Command.run(:diff, path)
112
+ }
113
+ }
114
+
115
+ mode(:push) {
116
+ description <<-TXT
117
+ Push local mirror changes to remote.
114
118
  TXT
115
119
 
116
- mixin :optional_path, :option_verbose
120
+ mixin :argument_path, :option_verbose
117
121
 
118
122
  run {
119
123
  Braid.verbose = verbose
120
- Braid::Command.run(:setup, path)
124
+ Braid::Command.run(:push, path)
121
125
  }
122
126
  }
123
127
 
124
- mode(:diff) {
128
+ mode(:setup) {
125
129
  description <<-TXT
126
- Show diff of local changes to mirror.
127
- TXT
128
-
129
- examples <<-TXT
130
- . braid diff local/dir
130
+ Set up git and git-svn remotes.
131
131
  TXT
132
132
 
133
- mixin :argument_path, :option_verbose
133
+ mixin :optional_path, :option_verbose
134
134
 
135
135
  run {
136
- Braid::Command.run(:diff, path)
136
+ Braid.verbose = verbose
137
+ Braid::Command.run(:setup, path)
137
138
  }
138
139
  }
139
140
 
@@ -1,21 +1,20 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{braid}
3
- s.version = "0.4.13"
3
+ s.version = "0.5.1"
4
4
 
5
5
  s.specification_version = 2 if s.respond_to? :specification_version=
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Cristi Balan", "Norbert Crombach"]
9
- s.date = %q{2008-10-23}
9
+ s.date = %q{2008-10-29}
10
10
  s.default_executable = %q{braid}
11
11
  s.description = %q{A simple tool for tracking vendor branches in git.}
12
12
  s.email = %q{evil@che.lu}
13
13
  s.executables = ["braid"]
14
- s.extra_rdoc_files = ["README.rdoc"]
15
- s.files = ["bin/braid", "braid.gemspec", "lib/braid/command.rb", "lib/braid/commands/add.rb", "lib/braid/commands/diff.rb", "lib/braid/commands/remove.rb", "lib/braid/commands/setup.rb", "lib/braid/commands/update.rb", "lib/braid/config.rb", "lib/braid/mirror.rb", "lib/braid/operations.rb", "lib/braid.rb", "LICENSE", "Rakefile", "README.rdoc", "test/braid_test.rb", "test/config_test.rb", "test/fixtures/shiny/README", "test/fixtures/skit1/layouts/layout.liquid", "test/fixtures/skit1/preview.png", "test/fixtures/skit1.1/layouts/layout.liquid", "test/fixtures/skit1.2/layouts/layout.liquid", "test/integration/adding_test.rb", "test/integration/updating_test.rb", "test/integration_helper.rb", "test/mirror_test.rb", "test/operations_test.rb", "test/test_helper.rb"]
16
- s.has_rdoc = true
14
+ s.files = ["LICENSE", "Rakefile", "README.textile", "braid.gemspec", "bin/braid", "lib/braid/command.rb", "lib/braid/commands/add.rb", "lib/braid/commands/diff.rb", "lib/braid/commands/push.rb", "lib/braid/commands/remove.rb", "lib/braid/commands/setup.rb", "lib/braid/commands/update.rb", "lib/braid/config.rb", "lib/braid/mirror.rb", "lib/braid/operations.rb", "lib/braid.rb", "lib/core_ext.rb", "test/braid_test.rb", "test/config_test.rb", "test/mirror_test.rb", "test/operations_test.rb", "test/test_helper.rb"]
15
+ s.has_rdoc = false
17
16
  s.homepage = %q{http://evil.che.lu/projects/braid}
18
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "braid", "--main", "README.rdoc"]
17
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "braid", "--main"]
19
18
  s.require_paths = ["lib"]
20
19
  s.rubyforge_project = %q{braid}
21
20
  s.rubygems_version = %q{1.1.0}
@@ -1,7 +1,7 @@
1
- $:.unshift File.dirname(__FILE__)
1
+ $:.unshift dirname = File.dirname(__FILE__)
2
2
 
3
3
  module Braid
4
- VERSION = "0.4.13"
4
+ VERSION = "0.5.1"
5
5
 
6
6
  CONFIG_FILE = ".braids"
7
7
  REQUIRED_GIT_VERSION = "1.6"
@@ -20,10 +20,11 @@ module Braid
20
20
  end
21
21
  end
22
22
 
23
+ require dirname + '/core_ext'
23
24
  require 'braid/operations'
24
25
  require 'braid/mirror'
25
26
  require 'braid/config'
26
27
  require 'braid/command'
27
- Dir[File.dirname(__FILE__) + '/braid/commands/*'].each do |file|
28
+ Dir[dirname + '/braid/commands/*'].each do |file|
28
29
  require file
29
30
  end
@@ -23,7 +23,7 @@ module Braid
23
23
  end
24
24
 
25
25
  def self.msg(str)
26
- puts str
26
+ puts "Braid: #{str}"
27
27
  end
28
28
 
29
29
  def msg(str)
@@ -34,7 +34,15 @@ module Braid
34
34
  @config ||= load_and_migrate_config
35
35
  end
36
36
 
37
+ def verbose?
38
+ Braid.verbose
39
+ end
40
+
37
41
  private
42
+ def setup_remote(mirror)
43
+ Command.run(:setup, mirror.path)
44
+ end
45
+
38
46
  def use_local_cache?
39
47
  Braid.use_local_cache
40
48
  end
@@ -30,15 +30,13 @@ module Braid
30
30
  config.update(mirror)
31
31
  add_config_file
32
32
 
33
- commit_message = "Add mirror '#{mirror.path}/'#{revision_message}"
33
+ commit_message = "Added mirror '#{mirror.path}' at #{display_revision(mirror)}"
34
+
34
35
  git.commit(commit_message)
36
+ msg commit_message
35
37
  end
36
38
  end
37
39
 
38
- private
39
- def setup_remote(mirror)
40
- Command.run(:setup, mirror.path)
41
- end
42
40
  end
43
41
  end
44
42
  end
@@ -3,6 +3,8 @@ module Braid
3
3
  class Diff < Command
4
4
  def run(path)
5
5
  mirror = config.get!(path)
6
+ setup_remote(mirror)
7
+
6
8
  diff = mirror.diff
7
9
  puts diff unless diff.empty?
8
10
  end
@@ -0,0 +1,47 @@
1
+ require 'fileutils'
2
+ require 'tmpdir'
3
+
4
+ module Braid
5
+ module Commands
6
+ class Push < Command
7
+ def run(path, options = {})
8
+ mirror = config.get!(path)
9
+
10
+ #mirror.fetch
11
+
12
+ base_revision = git.rev_parse(mirror.remote)
13
+ unless mirror.merged?(base_revision)
14
+ msg "Mirror is not up to date. Stopping."
15
+ return
16
+ end
17
+
18
+ diff = mirror.diff
19
+ if diff.empty?
20
+ msg "No local changes found. Stopping."
21
+ return
22
+ end
23
+
24
+ clone_dir = Dir.tmpdir + "/braid_push.#{$$}"
25
+ Dir.mkdir(clone_dir)
26
+ source_dir = Dir.pwd
27
+ remote_url = git.remote_url(mirror.remote)
28
+ if File.directory?(remote_url)
29
+ remote_url = File.expand_path(remote_url)
30
+ end
31
+ STDOUT.puts remote_url
32
+ Dir.chdir(clone_dir) do
33
+ msg "Cloning mirror with local changes."
34
+ git.init
35
+ git.fetch(source_dir)
36
+ git.fetch(remote_url)
37
+ git.checkout(base_revision)
38
+ git.apply(diff)
39
+ system("git commit -v")
40
+ msg "Pushing changes to remote."
41
+ git.push(remote_url, "HEAD:#{mirror.branch}")
42
+ end
43
+ FileUtils.rm_r(clone_dir)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -7,15 +7,19 @@ module Braid
7
7
  bail_on_local_changes!
8
8
 
9
9
  with_reset_on_error do
10
- msg "Removing mirror from '#{mirror.path}/'."
10
+ msg "Removing mirror from '#{mirror.path}'."
11
11
 
12
12
  git.rm_r(mirror.path)
13
13
 
14
+ # will need this in case we decide to remove the .git/config entry also
15
+ # setup_remote(mirror)
16
+
14
17
  config.remove(mirror)
15
18
  add_config_file
16
19
 
17
- commit_message = "Remove mirror '#{mirror.path}/'"
20
+ commit_message = "Removed mirror '#{mirror.path}'"
18
21
  git.commit(commit_message)
22
+ msg commit_message
19
23
  end
20
24
  end
21
25
  end
@@ -17,11 +17,11 @@ module Braid
17
17
  mirror = config.get!(path)
18
18
 
19
19
  if git.remote_url(mirror.remote)
20
- msg "Mirror '#{mirror.path}/' already has a remote. Skipping."
20
+ msg "Setup: Mirror '#{mirror.path}' already has a remote. Reusing it." if verbose?
21
21
  return
22
22
  end
23
23
 
24
- msg "Setting up remote for '#{mirror.path}/'."
24
+ msg "Setup: Creating remote for '#{mirror.path}'."
25
25
  unless mirror.type == "svn"
26
26
  url = use_local_cache? ? git_cache.path(mirror.url) : mirror.url
27
27
  git.remote_add(mirror.remote, url, mirror.branch)
@@ -21,24 +21,29 @@ module Braid
21
21
  def update_one(path, options = {})
22
22
  mirror = config.get!(path)
23
23
 
24
+ revision_message = options["revision"] ? " to #{display_revision(mirror, options["revision"])}" : ""
25
+ msg "Updating mirror '#{mirror.path}'#{revision_message}."
26
+
24
27
  # check options for lock modification
25
28
  if mirror.locked?
26
29
  if options["head"]
27
- msg "Unlocking mirror '#{mirror.path}/'."
30
+ msg "Unlocking mirror '#{mirror.path}'." if verbose?
28
31
  mirror.lock = nil
29
32
  elsif !options["revision"]
30
- msg "Mirror '#{mirror.path}/' is locked to #{display_revision(mirror, mirror.lock)}. Skipping."
33
+ msg "Mirror '#{mirror.path}' is locked to #{display_revision(mirror, mirror.lock)}. Use --head to force."
31
34
  return
32
35
  end
33
36
  end
34
37
 
38
+ setup_remote(mirror)
39
+ msg "Fetching new commits for '#{mirror.path}'." if verbose?
35
40
  mirror.fetch
36
41
 
37
42
  new_revision = validate_new_revision(mirror, options["revision"])
38
43
  target_revision = determine_target_revision(mirror, new_revision)
39
44
 
40
45
  if mirror.merged?(target_revision)
41
- msg "Mirror '#{mirror.path}/' is already up to date. Skipping."
46
+ msg "Mirror '#{mirror.path}' is already up to date."
42
47
  return
43
48
  end
44
49
 
@@ -50,11 +55,11 @@ module Braid
50
55
  mirror.revision = new_revision
51
56
  mirror.lock = new_revision if options["revision"]
52
57
 
53
- msg "Updating mirror '#{mirror.path}/'."
58
+ msg "Merging in mirror '#{mirror.path}'." if verbose?
54
59
  begin
55
60
  if mirror.squashed?
56
61
  local_hash = git.rev_parse("HEAD")
57
- if diff
62
+ if !diff.empty?
58
63
  base_hash = generate_tree_hash(mirror, base_revision)
59
64
  else
60
65
  base_hash = local_hash
@@ -73,20 +78,21 @@ module Braid
73
78
  config.update(mirror)
74
79
  add_config_file
75
80
 
76
- commit_message = "Update mirror '#{mirror.path}/' to #{display_revision(mirror)}"
81
+ commit_message = "Updated mirror '#{mirror.path}' to #{display_revision(mirror)}"
77
82
 
78
83
  if error
79
84
  File.open(".git/MERGE_MSG", 'w') { |f| f.puts(commit_message) }
80
85
  return
81
- else
82
- git.commit(commit_message)
83
86
  end
87
+
88
+ git.commit(commit_message)
89
+ msg commit_message
84
90
  end
85
91
 
86
92
  def generate_tree_hash(mirror, revision)
87
93
  git.rm_r(mirror.path)
88
94
  git.read_tree_prefix(revision, mirror.path)
89
- success = git.commit("Temporary commit for mirror '#{mirror.path}/'")
95
+ success = git.commit("Temporary commit for mirror '#{mirror.path}'")
90
96
  hash = git.rev_parse("HEAD")
91
97
  git.reset_hard("HEAD^") if success
92
98
  hash