seitime-frappe/wnf.py
2011-12-28 15:04:14 +05:30

186 lines
5.2 KiB
Python
Executable file

#!/usr/bin/env python
import os, sys
from py.build import version
version.verbose = True
def print_help():
print "wnframework version control utility"
print
print "Usage:"
print "python lib/wnf.py build : scan all folders and commit versions with latest changes"
print "python lib/wnf.py setup : setup the local system (from master or fresh)"
print "python lib/wnf.py merge : merge from local into master"
print "python lib/wnf.py log : list last 10 commits"
print "python lib/wnf.py pull : pull from git"
print "python lib/wnf.py replace txt1 txt2 extn"
print "python lib/wnf.py patch -vp patch1 .. : run patches from patches module if not executed"
print "python lib/wnf.py patch -fvp patch1 .. : run patches from patches module, force rerun"
def setup():
import os, sys
if not os.path.exists('versions-local.db'):
if os.path.exists('versions-master.db'):
import shutil
shutil.copyfile('versions-master.db', 'versions-local.db')
print "created versions-local.db from versions-master.db"
else:
vc = version.VersionControl()
vc.repo.setup()
vc.close()
print "created fresh versions-local.db"
else:
if len(sys.argv)==3 and sys.argv[2]=='master':
import shutil
shutil.copyfile('versions-local.db', 'versions-master.db')
print "created versions-master.db from versions-local.db"
else:
print "versions-local.db already exists. Nothing to do."
"""simple replacement script"""
def replace_code(start, txt1, txt2, extn):
"""replace all txt1 by txt2 in files with extension (extn)"""
import os, re
for wt in os.walk(start, followlinks=1):
for fn in wt[2]:
if fn.split('.')[-1]==extn:
fpath = os.path.join(wt[0], fn)
f = open(fpath, 'r')
content = f.read()
f.close()
if re.search(txt1, content):
f = open(fpath, 'w')
f.write(re.sub(txt1, txt2, content))
f.close()
print 'updated in %s' % fpath
def run():
sys.path.append('lib')
sys.path.append('lib/py')
import webnotes
import webnotes.defs
sys.path.append(webnotes.defs.modules_path)
if len(sys.argv)<2:
print_help()
return
cmd = sys.argv[1]
if cmd=='watch':
from py import build
import time
while True:
build.run()
vc = version.VersionControl()
print 'version %s' % vc.repo.get_value('last_version_number')
time.sleep(5)
elif cmd=='build':
from py import build
build.run()
vc = version.VersionControl()
print 'version %s' % vc.repo.get_value('last_version_number')
elif cmd=='merge':
vc = version.VersionControl()
vc.setup_master()
vc.merge(vc.repo, vc.master)
vc.close()
elif cmd=='merge-local':
vc = version.VersionControl()
vc.setup_master()
vc.merge(vc.master, vc.repo)
vc.close()
elif cmd=='setup':
setup()
elif cmd=='clear_startup':
# experimental
from webnotes import startup
startup.clear_info('all')
vc = version.VersionControl()
print 'version %s' % vc.repo.get_value('last_version_number')
elif cmd=='log':
vc = version.VersionControl()
for l in vc.repo.sql("select * from log order by rowid desc limit 10 ", as_dict =1):
print 'file:'+ l['fname'] + ' | version: ' + l['version']
print 'version %s' % vc.repo.get_value('last_version_number')
vc.close()
elif cmd=='files':
vc = version.VersionControl()
for f in vc.repo.sql("select fname from files where fname like ?", ((sys.argv[2] + '%'),)):
print f[0]
vc.close()
# pull from remote and merge with local
elif cmd=='gitpull':
branch = 'master'
if len(sys.argv)>2:
branch = sys.argv[2]
print "pulling erpnext"
os.system('git pull origin %s' % branch)
vc = version.VersionControl()
vc.setup_master()
vc.merge(vc.master, vc.repo)
vc.close()
print "pulling framework"
os.chdir('lib')
os.system('git pull origin %s' % branch)
# replace code
elif cmd=='replace':
replace_code('.', sys.argv[2], sys.argv[3], sys.argv[4])
elif cmd=='patch':
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-q", "--quiet",
action="store_false", dest="verbose", default=True,
help="Do not print status messages to stdout")
parser.add_option("-l", "--latest",
action="store_true", dest="run_latest", default=False,
help="Apply the latest patches")
parser.add_option("-p", "--patch", dest="patch_list", metavar='PATCH_MODULE.PATCH_FILE',
action="append",
help="Apply patch PATCH_MODULE.PATCH_FILE\n\
Can be used more than once for applying multiple patches")
parser.add_option("-f", "--force",
action="store_true", dest="force", default=False,
help="Force Apply all patches specified using option -p or --patch")
(options, args) = parser.parse_args()
if options.patch_list:
for patch in options.patch_list:
patch_split = patch.split(".")
idx = options.patch_list.index(patch)
patch_module = ".".join(patch_split[:-1])
options.patch_list[idx] = {
'patch_module': patch_module or "patches",
'patch_file': patch_split[-1]
}
options.db_name = hasattr(webnotes.defs, 'default_db_name') and getattr(webnotes.defs, 'default_db_name') or None
from webnotes.modules.patch_handler import PatchHandler
PatchHandler(**options.__dict__).run(**options.__dict__)
if __name__=='__main__':
run()