Skip to content

Instantly share code, notes, and snippets.

@hideki-a
Forked from tanakahisateru/export-diff.py
Last active August 29, 2015 14:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hideki-a/78f8d2ce4a24d26d4c88 to your computer and use it in GitHub Desktop.
Save hideki-a/78f8d2ce4a24d26d4c88 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
#!coding: utf-8
import sys, os, re, shutil
from optparse import OptionParser
parser = OptionParser(usage=
'''%prog [options] <target-dir>
Example:
svn diff -r{2011-01-01}:HEAD --summarize ./ | %prog ../diff-files
git diff --name-status HEAD~5 | %prog ../diff-files
%prog -c 'git diff --name-status HEAD~5' ../diff-files
''')
parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
help="show parsed diff status")
parser.add_option("-c", "--command", dest="cmd",
help="executable command line", metavar="COMMAND")
(options, args) = parser.parse_args()
if len(args) != 1:
parser.print_help()
exit(1)
target, = args
# clean target dir
if os.path.exists(target):
for root, dirs, files in os.walk(target, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
else:
os.makedirs(target)
if options.cmd:
fd = os.popen(options.cmd, 'r')
else:
fd = sys.stdin
# parse diff summary
overwrite = []
remove = []
for line in fd:
line = line.strip()
mo = re.match(r'^\s*([AMD])\s*(.*)$', line)
if mo:
if options.verbose:
sys.stdout.write(line)
sys.stdout.write("\n")
sys.stdout.flush()
if mo.group(1) in ['A', 'M']:
overwrite.append(mo.group(2).strip(" \n"))
elif mo.group(1) in ['D']:
remove.append(mo.group(2).strip(" \n"))
if options.cmd:
fd.close()
# copy added/modified files
for p in overwrite:
s = p
d = os.path.join(target, p)
if os.path.isfile(s):
if not os.path.exists(os.path.dirname(d)):
os.makedirs(os.path.dirname(d))
shutil.copy2(s, d)
elif os.path.isdir(s):
if not os.path.exists(d):
os.makedirs(d)
# report if removed files found
if remove:
fd = file(os.path.join(target, "__TO_BE_REMOVED__.txt"), "wt")
for p in remove:
fd.write("D %s\n" % p)
fd.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment