Saturday, July 07, 2007

Automatic Backup of All Projects

I wrote a script in groovy that backups all my source code projects automatically. I know this is actually the job of a version control system. But for the time, this script works for me well. The nice thing in this script is that it excludes all the fat files like zip, jar etc. So the generated backup is very small.

Here is the source code of the script:


import java.util.zip.*
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CharacterCodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
// Aşağıda belirtilen klasördeki tüm klasörleri zipler.
// Ancak arşiv dosyalarını (jar, ear gibi) hariç bırakır.
// klasorundenItıbaren klasörleri zipler

def zipIt = new File("D:/projects/groovy-deney-01")
def klasorundenItibaren = 'aaa'
def String arsivlenmeyecekDosyaUzantilari = /\S*\.(class|jar|ear|war|pdf|rar|7z|log|gz|swf|tld|index|psd|iws|ipr|pdb|dll|cab|obj|ocx|zip|ttf|log|mdb|bak|mat|aux)/
zipIt.listFiles().grep( {it.name > klasorundenItibaren}).each{ folder ->
if(folder.file) return
println(folder.name)

def buf = new byte[1024]
def out = new ZipOutputStream(new FileOutputStream(folder.name + ".zip"))
if(eklenecekDosyaYok(folder, arsivlenmeyecekDosyaUzantilari)) return
folder.eachFileRecurse {
if( it.file && !(it.name ==~ arsivlenmeyecekDosyaUzantilari)) {
println it.name
println it.canonicalPath
input = new FileInputStream(it.absolutePath)

String s = it.canonicalPath.substring(folder.canonicalPath.size()+1)

out.putNextEntry(new ZipEntry(s))
while((len = input.read(buf)) > 0) {
out.write(buf,0,len)
}
out.closeEntry();
input.close()
}
}
out.close()
}

def boolean eklenecekDosyaYok(File folder, String arsivlenmeyecekDosyaUzantilari){
println folder.name
println folder.listFiles().findAll{ !(it.name ==~ arsivlenmeyecekDosyaUzantilari)}.empty
println folder.listFiles().findAll{ !(it.name ==~ arsivlenmeyecekDosyaUzantilari)}
return folder.listFiles().findAll{ it.file && !(it.name ==~ arsivlenmeyecekDosyaUzantilari)}.empty
}

No comments: