Skip to content

Instantly share code, notes, and snippets.

@ryangreenberg
Created September 3, 2019 16:35
Show Gist options
  • Save ryangreenberg/260d11109fa3858a38721bbc9b7f745c to your computer and use it in GitHub Desktop.
Save ryangreenberg/260d11109fa3858a38721bbc9b7f745c to your computer and use it in GitHub Desktop.
Create markdown files to redirect a batch of documents in a repository
#!/usr/bin/env ruby
require 'fileutils'
require 'pathname'
USAGE = "#{$PROGRAM_NAME} <src dir> <dest dir>"
abort USAGE unless ARGV.size == 2
src = ARGV[0]
dst = ARGV[1]
is_clean = `git diff HEAD`.strip.empty?
abort "Cannot run with other changes to files in git. Please commit or stash." unless is_clean
entries = Dir.glob(File.join(src, "**/*"))
files = entries.select {|e| File.file?(e) }
# Move src files
warn "Moving #{files.size} files from #{src} to #{dst}"
system("git mv #{src} #{dst}")
system("git commit -am 'Move files from #{src} to #{dst}'")
warn ""
# Create placeholders from dest back to src
root = `git rev-parse --show-toplevel`.strip
md_files = files.select {|f| f.end_with?('.md') }
warn "Creating redirects for #{md_files.size} .md files"
md_files.each do |src_file|
relative_src = src_file.sub(root, '')
relative_dst = relative_src.sub(src, dst)
src_pathname = Pathname.new(File.join(root, src_file))
dst_pathname = Pathname.new(File.join(root, relative_dst))
link_relative_path = dst_pathname.relative_path_from(src_pathname.dirname)
puts " - #{relative_src} => #{relative_dst}"
header = File.read(dst_pathname).split("\n").map {|line| line.strip }.detect {|line| line =~ /^#/ }
redirect_text = "This document has moved to [#{relative_dst}](#{link_relative_path})"
new_contents = "#{header}\n\n#{redirect_text}"
FileUtils.mkdir_p(src_pathname.dirname)
File.write(src_file, new_contents)
end
puts ""
system("git add #{src}")
system("git commit -am 'Add pointers to new content at #{dst}'")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment