git_bpf 0.0.2 → 1.0.0

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.
data/README.md CHANGED
@@ -63,6 +63,9 @@ git_bpf is packaged as a Ruby Gem and hosted on [RubyGems]
63
63
  - If <target-repository> is not provided, <target-repository> defaults to your current directory (will fail if current directory is not a git repository).
64
64
  - The script requires the <target-repository> to have a remote named 'origin'.
65
65
 
66
+ ## Upgrading
67
+
68
+ Upgrading from older development versions of these scripts is a little bit sketchy. The steps possible steps involved are detailed [here](https://gist.github.com/tnightingale/59f44847526e1cc20bf7). Read through the document and run the steps that apply to you.
66
69
 
67
70
  [Branch-per-Feature]: https://github.com/affinitybridge/git-bpf/wiki/Branch-per-feature-process
68
71
  [RubyGems]: http://rubygems.org/
@@ -1,6 +1,7 @@
1
1
  require 'git_bpf/lib/gitflow'
2
2
  require 'git_bpf/lib/git-helpers'
3
3
  require 'git_bpf/lib/repository'
4
+ require 'Find'
4
5
 
5
6
  #
6
7
  # init:
@@ -29,16 +30,63 @@ class Init < GitFlow/'init'
29
30
  ]
30
31
  end
31
32
 
33
+ # Removes all aliases to git-bpf commands.
34
+ def removeCommandAliases(repo)
35
+ config = repo.config(true, '--list').lines.each do |line|
36
+ next unless line.start_with? 'alias.' and line.match /\!_git\-bpf/
37
+ a = /alias\.([a-zA-Z0-9\-_]+)\=(.)*/.match(line)[1]
38
+ repo.config(true, '--unset', "alias.#{a}")
39
+ end
40
+ end
41
+
42
+ # Removes all symlinks to targets within source_location that are found
43
+ # within path.
44
+ def rmSymlinks(path, source_location)
45
+ targets_to_check = [source_location]
46
+ all_targets = []
47
+
48
+ # Find all symlink targets that represent a path within source_location.
49
+ while targets_to_check.length > 0
50
+ git_bpf_target = targets_to_check.pop
51
+ Find.find(path) do |p|
52
+ if File.symlink?(p)
53
+ target = File.readlink(p)
54
+ if target.include? git_bpf_target and not targets_to_check.include? p
55
+ targets_to_check.push p
56
+ end
57
+ end
58
+ end
59
+ all_targets.push git_bpf_target
60
+ end
61
+
62
+ # Now delete any symlink whose target path includes any of the paths we
63
+ # have identified.
64
+ Find.find(path) do |p|
65
+ if File.symlink? p
66
+ target = File.readlink p
67
+ all_targets.each do |t|
68
+ if target.include? t
69
+ File.unlink p
70
+ break
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+
32
77
  def execute(opts, argv)
33
78
  if argv.length > 1
34
79
  run 'init', '--help'
35
80
  terminate
36
81
  end
37
82
 
38
- # TODO: There's likely a better way to do this.
39
- source_path = File.join File.dirname(__FILE__), '..'
83
+ source_path = File.expand_path("..", File.dirname(__FILE__))
40
84
  target = Repository.new(argv.length == 1 ? argv.pop : Dir.getwd)
41
85
 
86
+ # Perform some cleanup in case this repo was previously initalized.
87
+ target.config(true, '--remove-section', 'gitbpf') rescue nil
88
+ removeCommandAliases target
89
+ rmSymlinks(target.git_dir, source_path)
42
90
 
43
91
  #
44
92
  # 1. Link source scripts directory.
@@ -80,11 +128,13 @@ class Init < GitFlow/'init'
80
128
  target.config(true, "rerere.enabled", "true")
81
129
  target.config(true, "rerere.autoupdate", "true")
82
130
 
131
+ target.config(true, "gitbpf.remotename", opts.remote_name)
132
+
83
133
  rerere_path = File.join(target.git_dir, 'rr-cache')
84
134
  target_remote_url = target.remoteUrl(opts.remote_name)
85
135
 
86
136
  if not File.directory? rerere_path
87
- rerere = Repository::clone target_remote_url, rerere_path
137
+ rerere = Repository::clone target_remote_url, rerere_path, opts.remote_name
88
138
  elsif not File.directory? File.join(rerere_path, '.git')
89
139
  opoo "Rerere cache directory already exists; Initializing repository in existing rr-cache directory."
90
140
  rerere = Repository.init rerere_path
@@ -115,7 +165,7 @@ class Init < GitFlow/'init'
115
165
  #
116
166
  hooks_dir = File.join(target.git_dir, "hooks")
117
167
  hooks = [
118
- 'post-merge',
168
+ 'post-commit',
119
169
  'post-checkout'
120
170
  ]
121
171
 
@@ -30,6 +30,13 @@ class RecreateBranch < GitFlow/'recreate-branch'
30
30
  ['-l', '--list',
31
31
  "Process source branch for merge commits and list them. Will not make any changes to any branches.",
32
32
  lambda { |n| opts.list = true }],
33
+ ['-d', '--discard',
34
+ "Discard the existing local source branch and checkout a new source branch from the remote if one exists. If no remote is specified with -r, gitbpf will use the configured remote, or origin if none is configured.",
35
+ lambda { |n| opts.discard = true }],
36
+ ['-r', '--remote NAME',
37
+ "Specify the remote repository to work with. Only works with the -d option.",
38
+ lambda { |n| opts.remote = n }],
39
+
33
40
  ]
34
41
  end
35
42
 
@@ -44,6 +51,28 @@ class RecreateBranch < GitFlow/'recreate-branch'
44
51
  # If no new branch name provided, replace the source branch.
45
52
  opts.branch = source if opts.branch == nil
46
53
 
54
+ if not refExists? opts.base
55
+ terminate "Cannot find reference '#{opts.base}' to use as a base for new branch: #{opts.branch}."
56
+ end
57
+
58
+ if opts.discard
59
+ unless opts.remote
60
+ repo = Repository.new(Dir.getwd)
61
+ remote_name = repo.config(true, "--get", "gitbpf.remotename").chomp
62
+ opts.remote = remote_name.empty? ? 'origin' : remote_name
63
+ end
64
+ git('fetch', opts.remote)
65
+ if branchExists?(source, opts.remote)
66
+ opoo "This will delete your local '#{source}' branch if it exists and create it afresh from the #{opts.remote} remote."
67
+ if not promptYN "Continue?"
68
+ terminate "Aborting."
69
+ end
70
+ git('checkout', opts.base)
71
+ git('branch', '-D', source) if branchExists? source
72
+ git('checkout', source)
73
+ end
74
+ end
75
+
47
76
  # Perform some validation.
48
77
  if not branchExists? source
49
78
  terminate "Cannot recreate branch #{source} as it doesn't exist."
@@ -53,10 +82,6 @@ class RecreateBranch < GitFlow/'recreate-branch'
53
82
  terminate "Cannot create branch #{opts.branch} as it already exists."
54
83
  end
55
84
 
56
- if not refExists? opts.base
57
- terminate "Cannot find reference '#{opts.base}' to use as a base for new branch: #{opts.branch}."
58
- end
59
-
60
85
  #
61
86
  # 1. Compile a list of merged branches from source branch.
62
87
  #
@@ -169,7 +194,13 @@ class RecreateBranch < GitFlow/'recreate-branch'
169
194
  alt_base = git('name-rev', base, '--name-only').strip
170
195
  remote_heads = /remote\/\w+\/HEAD/
171
196
  unless name.include? source or name.include? alt_base or name.match remote_heads
172
- branches.push name
197
+ # Make sure not to include the tilde part of a branch name (e.g. '~2')
198
+ # as this signifies a commit that's behind the head of the branch but
199
+ # we want to merge in the head of the branch.
200
+ name = name.partition('~')[0]
201
+ # This can lead to duplicate branches, because the name may have only
202
+ # differed in the tilde portion ('mybranch~1', 'mybranch~2', etc.)
203
+ branches.push name unless branches.include? name
173
204
  end
174
205
  end
175
206
  end
@@ -1,4 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # Pull latest conflict resolutions.
4
- `git share-rerere pull`
4
+ remote_name = `git config --get gitbpf.remotename`.chomp
5
+ if remote_name.empty?
6
+ STDERR.puts "You have not configured the remote repository to be used by git-bpf. This is needed for rerere sharing. To use the 'origin' remote, run \n \`git config gitbpf.remotename 'origin'\`\n You can specify a remote name of your choosing."
7
+ exit 1
8
+ end
9
+ `git share-rerere pull -r #{remote_name}`
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ parents = `git rev-list -n 1 --parents HEAD`.split("\s")
4
+
5
+ # Shift off the last commit.
6
+ last = parents.shift
7
+
8
+ if parents.length >= 2
9
+ remote_name = `git config --get gitbpf.remotename`.chomp
10
+ if remote_name.empty?
11
+ STDERR.puts "You have not configured the remote repository to be used by git-bpf. This is needed for rerere sharing. To use the 'origin' remote, run \n \`git config gitbpf.remotename 'origin'\`\n You can specify a remote name of your choosing."
12
+ exit 1
13
+ end
14
+ `git share-rerere pull -r #{remote_name}`
15
+ `git share-rerere push -r #{remote_name}`
16
+ end
@@ -83,8 +83,12 @@ module GitHelpersMixin
83
83
  return params + args
84
84
  end
85
85
 
86
- def branchExists?(branch)
87
- ref = (branch.include? "refs/heads/") ? branch : "refs/heads/#{branch}"
86
+ def branchExists?(branch, remote = nil)
87
+ if remote
88
+ ref = "refs/remotes/#{remote}/#{branch}"
89
+ else
90
+ ref = (branch.include? "refs/heads/") ? branch : "refs/heads/#{branch}"
91
+ end
88
92
  begin
89
93
  git('show-ref', '--verify', '--quiet', ref)
90
94
  rescue
@@ -86,8 +86,8 @@ class Repository
86
86
  return true
87
87
  end
88
88
 
89
- def self.clone(url, dest)
90
- git('clone', url, dest)
89
+ def self.clone(url, dest, name = 'origin')
90
+ git('clone', '-o', name, url, dest)
91
91
  Repository.new dest
92
92
  end
93
93
 
@@ -1,3 +1,3 @@
1
1
  module GitBpf
2
- VERSION = "0.0.2"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -3,10 +3,10 @@ name: git_bpf
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
+ - 1
6
7
  - 0
7
8
  - 0
8
- - 2
9
- version: 0.0.2
9
+ version: 1.0.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - tnightingale
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2013-03-25 00:00:00 -07:00
17
+ date: 2013-09-09 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -66,7 +66,7 @@ files:
66
66
  - lib/git_bpf/commands/recreate-branch.rb
67
67
  - lib/git_bpf/commands/share-rerere-cache.rb
68
68
  - lib/git_bpf/hooks/post-checkout.rb
69
- - lib/git_bpf/hooks/post-merge.rb
69
+ - lib/git_bpf/hooks/post-commit.rb
70
70
  - lib/git_bpf/lib/git-helpers.rb
71
71
  - lib/git_bpf/lib/gitflow.rb
72
72
  - lib/git_bpf/lib/repository.rb
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- parents = `git rev-list -n 1 --parents HEAD`.split("\s")
4
-
5
- # Shift off the last commit.
6
- last = parents.shift
7
-
8
- if parents.length >= 2
9
- `git share-rerere pull`
10
- `git share-rerere push`
11
- end