summaryrefslogtreecommitdiff
path: root/commit-remove-pointless-commit
blob: ba33522d4840155443992d00b06543a7cf61b29a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/ruby
# Executed like the following to trim off pointless commits (including merge commits)
# that doesn't change the tree 
#   git filter-branch -f --commit-filter '~/ws/jenkins/split2/helper.rb "$@"' HEAD
#
# parameters are "<tree> [ -p <parent> ]*" and is the same as git commit-tree

# system "echo executing #{ARGV.join(' ')} >> /tmp/log"

# extract parents
parents=[]
i=2
while i<ARGV.size do
  parents << ARGV[i]
  i+=2
end
parents=parents.uniq

tree=ARGV[0]

# is the commit 'c' already an ancestor of any of the commits given in 'commits'?
def subsumed_by(c,commits)
  commits.find do |c2|
    c!=c2 && c==`git merge-base #{c} #{c2}`.chomp()
  end
end

# only keep commits that are not subsumed by others
# subsumed parents are pointless merge
parents = parents.select do |p|
  !subsumed_by(p,parents)
end

# does any parent has a different tree?
non_empty_commit = parents.find do |p|
  tree != `git rev-parse #{p}^{tree}`.chomp()
end

if non_empty_commit!=nil || parents.size==0 then
  # if a commit has non-empty diff, make a commit
  args = []
  args << tree
  parents.each{ |c| args << "-p"; args << c; }
  # system "echo git commit-tree #{args.join(' ')} >> /tmp/log"
  exec "git commit-tree #{args.join(' ')}"
else
  # system "echo skipping >> /tmp/log"
  # otherwise don't create this as a commit
  puts parents  
end