summarylogtreecommitdiffstats
path: root/commonify
blob: 90548697a26d652ce934281874270c576cae9c7a (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
#!/usr/bin/env ruby
require 'set'
require 'fileutils'

common = ARGV.shift
targets = ARGV.dup
first, *rest = targets

files = targets.map do |dir|
  Dir.chdir dir
  g = Dir.glob("**/*").select { |file| test(?f, file) }
  Dir.chdir ".."
  puts "#{dir}: Found #{g.size} files"
  Set.new(g)
end

commonfiles = files.inject(:&)
puts "#{commonfiles.size} common files"

samefiles = 0
commonfiles.each do |file|
  firstfile = File.join first, file
  targetfiles = rest.map { |target| File.join target, file }

  is_same = targetfiles.all? do |targetfile|
    system "diff", "-q", firstfile, targetfile,
      in: "/dev/null", out: "/dev/null", err: [:child, :out]
  end

  if is_same
    commonfile = File.join common, file
    FileUtils.mkdir_p File.dirname(commonfile)
    FileUtils.mv firstfile, commonfile
    FileUtils.rm(targetfiles)
    samefiles += 1
  else
    puts "Divergent common file: #{file}"
  end
end

puts "#{common}: #{samefiles} identical common files"