#!/usr/bin/env python
# -*- coding: utf-8-with-signature-unix; fill-column: 77 -*-
# -*- indent-tabs-mode: nil -*-

import os, re

def lineify_fileobjs(ifo, ofo, strip=False):
	from pyutil.strutil import pop_trailing_newlines, split_on_newlines
	for l in ifo:
		for sl in split_on_newlines(pop_trailing_newlines(l)):
			if strip:
				sl = sl.strip()
			ofo.write(pop_trailing_newlines(sl) + '\n')

def lineify_file(fname, strip=False, nobak=True):
	f = open(fname, "rU")
	from pyutil.fileutil import ReopenableNamedTemporaryFile
	rntf = ReopenableNamedTemporaryFile()
	fo = open(rntf.name, "wb")
	for l in f:
		if strip:
			l = l.strip() + '\n'
		fo.write(l)
	fo.close()
	import shutil
	if not nobak:
		shutil.copyfile(fname, fname + ".lines.py-bak")
	import shutil
	try:
		shutil.move(rntf.name, fname)
	except EnvironmentError:
		# Couldn't atomically overwrite, so just hope that this process doesn't die
		# and the target file doesn't get recreated in between the following two
		# operations:
		if nobak:
			os.remove(fname)
		else:
			shutil.move(fname, fname + ".lines.py-bak-2")
		shutil.move(rntf.name, fname)

def darcs_metadir_dirpruner(dirs):
	if "_darcs" in dirs:
		dirs.remove("_darcs")

SCRE=re.compile("\\.(py|php|c|h|cpp|hpp|txt|sh|pyx|pxi|html|htm)$|makefile$", re.IGNORECASE)
def source_code_filepruner(fname):
	return SCRE.search(fname)

def all_filepruner(fname):
	return True

def all_dirpruner(dirs):
	return

def lineify_all_files(dirname, strip=False, nobak=True, dirpruner=all_dirpruner, filepruner=all_filepruner):
	for (root, dirs, files,) in os.walk(dirname):
		dirpruner(dirs)
		for fname in files:
			fullfname = os.path.join(root, fname)
			if filepruner(fullfname):
				lineify_file(fullfname, strip=strip, nobak=nobak)
