2014-07-10 17:21:34 +00:00
import os
2016-04-27 13:51:46 +00:00
from . utils import ( exec_cmd , get_frappe , check_git_for_shallow_clone , build_assets ,
2018-04-11 16:55:47 +00:00
restart_supervisor_processes , get_cmd_output , run_frappe_cmd , CommandFailedError ,
restart_systemd_processes )
2016-03-15 11:27:48 +00:00
from . config . common_site_config import get_config
2014-07-10 17:21:34 +00:00
2014-07-11 09:33:07 +00:00
import logging
2014-07-21 06:10:03 +00:00
import requests
2015-02-24 07:46:22 +00:00
import semantic_version
2014-07-21 06:10:03 +00:00
import json
2015-02-24 07:46:22 +00:00
import re
import subprocess
2016-06-16 05:48:51 +00:00
import bench
2016-07-18 05:57:05 +00:00
import sys
import shutil
2015-02-24 07:46:22 +00:00
2016-01-11 06:58:02 +00:00
logging . basicConfig ( level = " DEBUG " )
2014-07-11 09:33:07 +00:00
logger = logging . getLogger ( __name__ )
2014-07-10 17:21:34 +00:00
2016-06-08 06:41:47 +00:00
class InvalidBranchException ( Exception ) : pass
class InvalidRemoteException ( Exception ) : pass
2015-02-24 07:46:22 +00:00
class MajorVersionUpgradeException ( Exception ) :
def __init__ ( self , message , upstream_version , local_version ) :
super ( MajorVersionUpgradeException , self ) . __init__ ( message )
self . upstream_version = upstream_version
self . local_version = local_version
2016-06-16 05:48:51 +00:00
def get_apps ( bench_path = ' . ' ) :
2014-07-10 17:21:34 +00:00
try :
2016-06-16 05:48:51 +00:00
with open ( os . path . join ( bench_path , ' sites ' , ' apps.txt ' ) ) as f :
2014-07-10 17:21:34 +00:00
return f . read ( ) . strip ( ) . split ( ' \n ' )
except IOError :
return [ ]
2016-06-16 05:48:51 +00:00
def add_to_appstxt ( app , bench_path = ' . ' ) :
apps = get_apps ( bench_path = bench_path )
2014-07-10 17:21:34 +00:00
if app not in apps :
apps . append ( app )
2016-06-16 05:48:51 +00:00
return write_appstxt ( apps , bench_path = bench_path )
2014-11-20 07:30:57 +00:00
2016-06-16 05:48:51 +00:00
def remove_from_appstxt ( app , bench_path = ' . ' ) :
apps = get_apps ( bench_path = bench_path )
2014-11-20 07:30:57 +00:00
if app in apps :
apps . remove ( app )
2016-06-16 05:48:51 +00:00
return write_appstxt ( apps , bench_path = bench_path )
2014-11-20 07:30:57 +00:00
2016-06-16 05:48:51 +00:00
def write_appstxt ( apps , bench_path = ' . ' ) :
with open ( os . path . join ( bench_path , ' sites ' , ' apps.txt ' ) , ' w ' ) as f :
2014-11-20 07:30:57 +00:00
return f . write ( ' \n ' . join ( apps ) )
2014-07-10 17:21:34 +00:00
2018-02-07 11:42:32 +00:00
def check_url ( url , raise_err = True ) :
try :
from urlparse import urlparse
except ImportError :
from urllib . parse import urlparse
parsed = urlparse ( url )
if not parsed . scheme :
if raise_err :
raise TypeError ( ' {url} Not a valid URL ' . format ( url = url ) )
else :
return False
2018-02-22 07:08:26 +00:00
2018-02-07 11:42:32 +00:00
return True
2018-02-22 07:08:26 +00:00
2017-12-12 11:16:31 +00:00
def get_excluded_apps ( bench_path = ' . ' ) :
try :
with open ( os . path . join ( bench_path , ' sites ' , ' excluded_apps.txt ' ) ) as f :
return f . read ( ) . strip ( ) . split ( ' \n ' )
except IOError :
return [ ]
2018-01-20 10:51:16 +00:00
def add_to_excluded_apps_txt ( app , bench_path = ' . ' ) :
2018-04-13 20:38:05 +00:00
if app == ' frappe ' :
raise ValueError ( ' Frappe app cannot be excludeed from update ' )
if app not in os . listdir ( ' apps ' ) :
raise ValueError ( ' The app {} does not exist ' . format ( app ) )
2017-12-12 11:16:31 +00:00
apps = get_excluded_apps ( bench_path = bench_path )
if app not in apps :
apps . append ( app )
2018-01-20 10:51:16 +00:00
return write_excluded_apps_txt ( apps , bench_path = bench_path )
2017-12-12 11:16:31 +00:00
2018-01-20 10:51:16 +00:00
def write_excluded_apps_txt ( apps , bench_path = ' . ' ) :
2017-12-12 11:16:31 +00:00
with open ( os . path . join ( bench_path , ' sites ' , ' excluded_apps.txt ' ) , ' w ' ) as f :
return f . write ( ' \n ' . join ( apps ) )
2018-01-20 10:51:16 +00:00
def remove_from_excluded_apps_txt ( app , bench_path = ' . ' ) :
apps = get_excluded_apps ( bench_path = bench_path )
2017-12-12 12:45:41 +00:00
if app in apps :
apps . remove ( app )
2018-01-20 10:51:16 +00:00
return write_excluded_apps_txt ( apps , bench_path = bench_path )
2017-12-12 12:45:41 +00:00
2016-06-16 05:48:51 +00:00
def get_app ( git_url , branch = None , bench_path = ' . ' , build_asset_files = True , verbose = False ) :
2018-02-07 11:42:32 +00:00
# from bench.utils import check_url
try :
from urlparse import urljoin
except ImportError :
from urllib . parse import urljoin
if not check_url ( git_url , raise_err = False ) :
orgs = [ ' frappe ' , ' erpnext ' ]
for org in orgs :
url = ' https://api.github.com/repos/ {org} / {app} ' . format ( org = org , app = git_url )
res = requests . get ( url )
if res . ok :
data = res . json ( )
if ' name ' in data :
if git_url == data [ ' name ' ] :
git_url = ' https://github.com/ {org} / {app} ' . format ( org = org , app = git_url )
break
2016-05-04 09:07:10 +00:00
#Gets repo name from URL
repo_name = git_url . rsplit ( ' / ' , 1 ) [ 1 ] . rsplit ( ' . ' , 1 ) [ 0 ]
logger . info ( ' getting app {} ' . format ( repo_name ) )
2016-03-16 07:33:09 +00:00
shallow_clone = ' --depth 1 ' if check_git_for_shallow_clone ( ) else ' '
2014-09-12 09:30:18 +00:00
branch = ' --branch {branch} ' . format ( branch = branch ) if branch else ' '
2016-04-27 13:51:46 +00:00
2016-05-04 09:07:10 +00:00
exec_cmd ( " git clone {git_url} {branch} {shallow_clone} --origin upstream " . format (
2015-06-08 03:19:07 +00:00
git_url = git_url ,
shallow_clone = shallow_clone ,
branch = branch ) ,
2016-06-16 05:48:51 +00:00
cwd = os . path . join ( bench_path , ' apps ' ) )
2016-05-04 09:07:10 +00:00
#Retrieves app name from setup.py
2016-06-16 05:48:51 +00:00
app_path = os . path . join ( bench_path , ' apps ' , repo_name , ' setup.py ' )
2016-05-04 09:07:10 +00:00
with open ( app_path , ' rb ' ) as f :
app_name = re . search ( r ' name \ s*= \ s*[ \' " ](.*)[ \' " ] ' , f . read ( ) . decode ( ' utf-8 ' ) ) . group ( 1 )
if repo_name != app_name :
2016-06-16 05:48:51 +00:00
apps_path = os . path . join ( os . path . abspath ( bench_path ) , ' apps ' )
2016-06-08 06:41:47 +00:00
os . rename ( os . path . join ( apps_path , repo_name ) , os . path . join ( apps_path , app_name ) )
2016-05-04 09:07:10 +00:00
2017-04-17 11:58:18 +00:00
print ( ' installing ' , app_name )
2016-06-16 05:48:51 +00:00
install_app ( app = app_name , bench_path = bench_path , verbose = verbose )
2014-12-03 05:35:12 +00:00
if build_asset_files :
2016-06-16 05:48:51 +00:00
build_assets ( bench_path = bench_path )
conf = get_config ( bench_path = bench_path )
2014-09-10 11:20:17 +00:00
if conf . get ( ' restart_supervisor_on_update ' ) :
2016-06-16 05:48:51 +00:00
restart_supervisor_processes ( bench_path = bench_path )
2018-04-11 16:55:47 +00:00
if conf . get ( ' restart_systemd_on_update ' ) :
restart_systemd_processes ( bench_path = bench_path )
2014-07-10 17:21:34 +00:00
2016-06-16 05:48:51 +00:00
def new_app ( app , bench_path = ' . ' ) :
2016-04-29 10:06:46 +00:00
# For backwards compatibility
2016-05-18 11:50:47 +00:00
app = app . lower ( ) . replace ( " " , " _ " ) . replace ( " - " , " _ " )
2014-07-11 09:33:07 +00:00
logger . info ( ' creating new app {} ' . format ( app ) )
2016-06-16 05:48:51 +00:00
apps = os . path . abspath ( os . path . join ( bench_path , ' apps ' ) )
bench . set_frappe_version ( bench_path = bench_path )
if bench . FRAPPE_VERSION == 4 :
exec_cmd ( " {frappe} --make_app {apps} {app} " . format ( frappe = get_frappe ( bench_path = bench_path ) ,
2015-08-15 17:30:33 +00:00
apps = apps , app = app ) )
2015-03-03 11:04:35 +00:00
else :
2016-06-16 05:48:51 +00:00
run_frappe_cmd ( ' make-app ' , apps , app , bench_path = bench_path )
install_app ( app , bench_path = bench_path )
2014-07-10 17:21:34 +00:00
2017-04-03 07:25:42 +00:00
def install_app ( app , bench_path = ' . ' , verbose = False , no_cache = False ) :
2014-07-11 09:33:07 +00:00
logger . info ( ' installing {} ' . format ( app ) )
2015-12-09 13:11:34 +00:00
# find_links = '--find-links={}'.format(conf.get('wheel_cache_dir')) if conf.get('wheel_cache_dir') else ''
find_links = ' '
2017-04-03 07:25:42 +00:00
exec_cmd ( " {pip} install {quiet} {find_links} -e {app} {no_cache} " . format (
2016-06-16 05:48:51 +00:00
pip = os . path . join ( bench_path , ' env ' , ' bin ' , ' pip ' ) ,
2015-12-08 18:52:16 +00:00
quiet = " -q " if not verbose else " " ,
2017-04-03 07:25:42 +00:00
no_cache = ' --no-cache-dir ' if not no_cache else ' ' ,
2016-06-16 05:48:51 +00:00
app = os . path . join ( bench_path , ' apps ' , app ) ,
2015-06-08 03:19:07 +00:00
find_links = find_links ) )
2016-06-16 05:48:51 +00:00
add_to_appstxt ( app , bench_path = bench_path )
2014-07-10 17:21:34 +00:00
2016-07-18 05:57:05 +00:00
def remove_app ( app , bench_path = ' . ' ) :
2016-07-21 06:09:44 +00:00
if not app in get_apps ( bench_path ) :
2017-04-17 11:58:18 +00:00
print ( " No app named {0} " . format ( app ) )
2016-07-18 05:57:05 +00:00
sys . exit ( 1 )
app_path = os . path . join ( bench_path , ' apps ' , app )
site_path = os . path . join ( bench_path , ' sites ' )
pip = os . path . join ( bench_path , ' env ' , ' bin ' , ' pip ' )
for site in os . listdir ( site_path ) :
req_file = os . path . join ( site_path , site , ' site_config.json ' )
if os . path . exists ( req_file ) :
out = subprocess . check_output ( [ " bench " , " --site " , site , " list-apps " ] , cwd = bench_path )
if re . search ( r ' \ b ' + app + r ' \ b ' , out ) :
2017-04-17 11:58:18 +00:00
print ( " Cannot remove, app is installed on site: {0} " . format ( site ) )
2016-07-18 05:57:05 +00:00
sys . exit ( 1 )
2016-07-21 06:09:44 +00:00
exec_cmd ( [ " {0} uninstall -y {1} " . format ( pip , app_path ) ] )
2016-07-18 05:57:05 +00:00
remove_from_appstxt ( app , bench_path )
shutil . rmtree ( app_path )
2016-07-21 06:09:44 +00:00
run_frappe_cmd ( " build " , bench_path = bench_path )
2016-07-18 05:57:05 +00:00
if get_config ( bench_path ) . get ( ' restart_supervisor_on_update ' ) :
restart_supervisor_processes ( bench_path = bench_path )
2018-04-11 16:55:47 +00:00
if get_config ( bench_path ) . get ( ' restart_systemd_on_update ' ) :
restart_systemd_processes ( bench_path = bench_path )
2016-07-18 05:57:05 +00:00
2017-04-03 07:25:42 +00:00
def pull_all_apps ( bench_path = ' . ' , reset = False ) :
''' Check all apps if there no local changes, pull '''
2016-06-16 05:48:51 +00:00
rebase = ' --rebase ' if get_config ( bench_path ) . get ( ' rebase_on_pull ' ) else ' '
2018-02-22 07:08:26 +00:00
2017-04-03 07:25:42 +00:00
# chech for local changes
2017-04-07 08:03:25 +00:00
if not reset :
for app in get_apps ( bench_path = bench_path ) :
2017-12-12 11:16:31 +00:00
excluded_apps = get_excluded_apps ( )
2018-04-13 20:38:05 +00:00
if app in excluded_apps :
2017-12-12 11:16:31 +00:00
print ( " Skipping reset for app {} " . format ( app ) )
2017-12-12 09:10:23 +00:00
continue
2017-04-07 08:03:25 +00:00
app_dir = get_repo_dir ( app , bench_path = bench_path )
if os . path . exists ( os . path . join ( app_dir , ' .git ' ) ) :
out = subprocess . check_output ( [ " git " , " status " ] , cwd = app_dir )
2018-03-12 12:55:00 +00:00
out = out . decode ( ' utf-8 ' )
2017-04-07 08:03:25 +00:00
if not re . search ( r ' nothing to commit, working (directory|tree) clean ' , out ) :
2017-04-17 11:58:18 +00:00
print ( '''
2017-04-03 07:41:51 +00:00
Cannot proceed with update : You have local changes in app " {0} " that are not committed .
Here are your choices :
2017-04-03 07:25:42 +00:00
1. Merge the { 0 } app manually with " git pull " / " git pull --rebase " and fix conflicts .
2017-04-03 07:41:51 +00:00
1. Temporarily remove your changes with " git stash " or discard them completely
2017-04-07 08:03:25 +00:00
with " bench update --reset " or for individual repositries " git reset --hard "
2017-04-03 07:41:51 +00:00
2. If your changes are helpful for others , send in a pull request via GitHub and
2017-04-17 11:58:18 +00:00
wait for them to be merged in the core . ''' .format(app))
2017-04-07 11:48:21 +00:00
sys . exit ( 1 )
2017-04-03 07:25:42 +00:00
2016-06-16 05:48:51 +00:00
for app in get_apps ( bench_path = bench_path ) :
2017-12-12 11:16:31 +00:00
excluded_apps = get_excluded_apps ( )
2018-04-13 20:38:05 +00:00
if app in excluded_apps :
2017-12-12 11:16:31 +00:00
print ( " Skipping pull for app {} " . format ( app ) )
continue
2016-06-16 05:48:51 +00:00
app_dir = get_repo_dir ( app , bench_path = bench_path )
2014-07-10 17:21:34 +00:00
if os . path . exists ( os . path . join ( app_dir , ' .git ' ) ) :
2016-08-28 12:50:48 +00:00
remote = get_remote ( app )
2014-09-05 03:58:55 +00:00
logger . info ( ' pulling {0} ' . format ( app ) )
2016-11-07 11:53:25 +00:00
if reset :
exec_cmd ( " git fetch --all " , cwd = app_dir )
exec_cmd ( " git reset --hard {remote} / {branch} " . format (
remote = remote , branch = get_current_branch ( app , bench_path = bench_path ) ) , cwd = app_dir )
else :
exec_cmd ( " git pull {rebase} {remote} {branch} " . format ( rebase = rebase ,
remote = remote , branch = get_current_branch ( app , bench_path = bench_path ) ) , cwd = app_dir )
2016-05-18 11:50:47 +00:00
exec_cmd ( ' find . -name " *.pyc " -delete ' , cwd = app_dir )
2016-06-16 05:48:51 +00:00
def is_version_upgrade ( app = ' frappe ' , bench_path = ' . ' , branch = None ) :
2016-04-28 11:56:28 +00:00
try :
2016-06-16 05:48:51 +00:00
fetch_upstream ( app , bench_path = bench_path )
2016-06-13 12:34:54 +00:00
except CommandFailedError :
2016-06-08 06:41:47 +00:00
raise InvalidRemoteException ( " No remote named upstream for {0} " . format ( app ) )
2016-04-28 11:56:28 +00:00
2016-06-16 05:48:51 +00:00
upstream_version = get_upstream_version ( app = app , branch = branch , bench_path = bench_path )
2015-02-24 07:46:22 +00:00
if not upstream_version :
2016-06-08 06:41:47 +00:00
raise InvalidBranchException ( " Specified branch of app {0} is not in upstream " . format ( app ) )
2015-02-24 07:46:22 +00:00
2016-06-16 05:48:51 +00:00
local_version = get_major_version ( get_current_version ( app , bench_path = bench_path ) )
2015-02-24 07:46:22 +00:00
upstream_version = get_major_version ( upstream_version )
2017-12-12 11:16:31 +00:00
2015-07-04 08:36:53 +00:00
if upstream_version - local_version > 0 :
2015-08-17 10:28:01 +00:00
return ( True , local_version , upstream_version )
return ( False , local_version , upstream_version )
2015-02-24 07:46:22 +00:00
2016-06-16 05:48:51 +00:00
def get_current_frappe_version ( bench_path = ' . ' ) :
2015-03-03 11:09:07 +00:00
try :
2016-06-16 05:48:51 +00:00
return get_major_version ( get_current_version ( ' frappe ' , bench_path = bench_path ) )
2015-03-03 11:09:07 +00:00
except IOError :
2016-04-27 13:51:46 +00:00
return 0
2015-02-24 09:40:30 +00:00
2016-06-16 05:48:51 +00:00
def get_current_branch ( app , bench_path = ' . ' ) :
repo_dir = get_repo_dir ( app , bench_path = bench_path )
2014-10-30 07:08:02 +00:00
return get_cmd_output ( " basename $(git symbolic-ref -q HEAD) " , cwd = repo_dir )
2014-07-21 06:10:03 +00:00
2016-08-28 12:50:48 +00:00
def get_remote ( app , bench_path = ' . ' ) :
repo_dir = get_repo_dir ( app , bench_path = bench_path )
contents = subprocess . check_output ( [ ' git ' , ' remote ' , ' -v ' ] , cwd = repo_dir ,
stderr = subprocess . STDOUT )
2018-03-12 12:55:00 +00:00
contents = contents . decode ( ' utf-8 ' )
2016-08-28 12:50:48 +00:00
if re . findall ( ' upstream[ \ s]+ ' , contents ) :
remote = ' upstream '
else :
# get the first remote
remote = contents . splitlines ( ) [ 0 ] . split ( ) [ 0 ]
return remote
2016-05-05 10:53:00 +00:00
def use_rq ( bench_path ) :
bench_path = os . path . abspath ( bench_path )
celery_app = os . path . join ( bench_path , ' apps ' , ' frappe ' , ' frappe ' , ' celery_app.py ' )
return not os . path . exists ( celery_app )
2016-06-16 05:48:51 +00:00
def fetch_upstream ( app , bench_path = ' . ' ) :
repo_dir = get_repo_dir ( app , bench_path = bench_path )
2016-04-28 11:56:28 +00:00
return subprocess . call ( [ " git " , " fetch " , " upstream " ] , cwd = repo_dir )
2015-02-24 07:46:22 +00:00
2016-06-16 05:48:51 +00:00
def get_current_version ( app , bench_path = ' . ' ) :
repo_dir = get_repo_dir ( app , bench_path = bench_path )
2016-06-09 12:56:46 +00:00
try :
with open ( os . path . join ( repo_dir , os . path . basename ( repo_dir ) , ' __init__.py ' ) ) as f :
return get_version_from_string ( f . read ( ) )
except AttributeError :
# backward compatibility
with open ( os . path . join ( repo_dir , ' setup.py ' ) ) as f :
2016-06-09 13:24:41 +00:00
return get_version_from_string ( f . read ( ) , field = ' version ' )
2015-02-24 07:46:22 +00:00
2018-02-28 13:18:11 +00:00
def get_develop_version ( app , bench_path = ' . ' ) :
repo_dir = get_repo_dir ( app , bench_path = bench_path )
with open ( os . path . join ( repo_dir , os . path . basename ( repo_dir ) , ' hooks.py ' ) ) as f :
return get_version_from_string ( f . read ( ) , field = ' develop_version ' )
2016-06-16 05:48:51 +00:00
def get_upstream_version ( app , branch = None , bench_path = ' . ' ) :
repo_dir = get_repo_dir ( app , bench_path = bench_path )
2015-05-04 04:12:25 +00:00
if not branch :
2016-06-16 05:48:51 +00:00
branch = get_current_branch ( app , bench_path = bench_path )
2015-02-24 07:46:22 +00:00
try :
2016-06-09 12:46:15 +00:00
contents = subprocess . check_output ( [ ' git ' , ' show ' , ' upstream/ {branch} : {app} /__init__.py ' . format ( branch = branch , app = app ) ] , cwd = repo_dir , stderr = subprocess . STDOUT )
2018-03-12 12:55:00 +00:00
contents = contents . decode ( ' utf-8 ' )
2017-04-17 11:58:18 +00:00
except subprocess . CalledProcessError as e :
2018-02-15 07:15:05 +00:00
if b " Invalid object " in e . output :
2015-02-24 07:46:22 +00:00
return None
else :
raise
return get_version_from_string ( contents )
2016-06-16 05:48:51 +00:00
def get_upstream_url ( app , bench_path = ' . ' ) :
repo_dir = get_repo_dir ( app , bench_path = bench_path )
2015-07-04 08:36:53 +00:00
return subprocess . check_output ( [ ' git ' , ' config ' , ' --get ' , ' remote.upstream.url ' ] , cwd = repo_dir ) . strip ( )
2016-06-16 05:48:51 +00:00
def get_repo_dir ( app , bench_path = ' . ' ) :
return os . path . join ( bench_path , ' apps ' , app )
2015-07-04 08:36:53 +00:00
2016-06-16 05:48:51 +00:00
def switch_branch ( branch , apps = None , bench_path = ' . ' , upgrade = False , check_upgrade = True ) :
2018-02-22 07:08:26 +00:00
from . utils import update_requirements , update_node_packages , backup_all_sites , patch_sites , build_assets , pre_upgrade , post_upgrade
2017-04-17 11:58:18 +00:00
from . import utils
2016-06-16 05:48:51 +00:00
apps_dir = os . path . join ( bench_path , ' apps ' )
2016-04-28 11:56:28 +00:00
version_upgrade = ( False , )
switched_apps = [ ]
2015-05-04 04:12:25 +00:00
2015-03-17 03:28:49 +00:00
if not apps :
2016-04-28 11:56:28 +00:00
apps = [ name for name in os . listdir ( apps_dir )
if os . path . isdir ( os . path . join ( apps_dir , name ) ) ]
2015-09-03 05:58:34 +00:00
if branch == " v4.x.x " :
apps . append ( ' shopping_cart ' )
2016-06-08 06:41:47 +00:00
2015-03-17 03:28:49 +00:00
for app in apps :
app_dir = os . path . join ( apps_dir , app )
if os . path . exists ( app_dir ) :
2016-04-28 11:56:28 +00:00
try :
if check_upgrade :
2016-06-16 05:48:51 +00:00
version_upgrade = is_version_upgrade ( app = app , bench_path = bench_path , branch = branch )
2016-04-28 11:56:28 +00:00
if version_upgrade [ 0 ] and not upgrade :
raise MajorVersionUpgradeException ( " Switching to {0} will cause upgrade from {1} to {2} . Pass --upgrade to confirm " . format ( branch , version_upgrade [ 1 ] , version_upgrade [ 2 ] ) , version_upgrade [ 1 ] , version_upgrade [ 2 ] )
2017-04-17 11:58:18 +00:00
print ( " Switching for " + app )
2016-04-28 11:56:28 +00:00
unshallow = " --unshallow " if os . path . exists ( os . path . join ( app_dir , " .git " , " shallow " ) ) else " "
exec_cmd ( " git config --unset-all remote.upstream.fetch " , cwd = app_dir )
exec_cmd ( " git config --add remote.upstream.fetch ' +refs/heads/*:refs/remotes/upstream/* ' " , cwd = app_dir )
exec_cmd ( " git fetch upstream {unshallow} " . format ( unshallow = unshallow ) , cwd = app_dir )
exec_cmd ( " git checkout {branch} " . format ( branch = branch ) , cwd = app_dir )
exec_cmd ( " git merge upstream/ {branch} " . format ( branch = branch ) , cwd = app_dir )
switched_apps . append ( app )
except CommandFailedError :
2017-04-17 11:58:18 +00:00
print ( " Error switching to branch {0} for {1} " . format ( branch , app ) )
2016-04-28 11:56:28 +00:00
except InvalidRemoteException :
2017-04-17 11:58:18 +00:00
print ( " Remote does not exist for app " + app )
2016-04-28 11:56:28 +00:00
except InvalidBranchException :
2017-04-17 11:58:18 +00:00
print ( " Branch {0} does not exist in Upstream for {1} " . format ( branch , app ) )
2016-04-28 11:56:28 +00:00
if switched_apps :
2017-04-17 11:58:18 +00:00
print ( " Successfully switched branches for: \n " + " \n " . join ( switched_apps ) )
2015-03-17 03:28:49 +00:00
2015-08-17 10:28:01 +00:00
if version_upgrade [ 0 ] and upgrade :
2015-05-04 04:12:25 +00:00
update_requirements ( )
2018-02-22 07:08:26 +00:00
update_node_packages ( )
2015-08-17 10:28:01 +00:00
pre_upgrade ( version_upgrade [ 1 ] , version_upgrade [ 2 ] )
2015-05-04 04:12:25 +00:00
reload ( utils )
backup_all_sites ( )
patch_sites ( )
build_assets ( )
2015-08-17 10:28:01 +00:00
post_upgrade ( version_upgrade [ 1 ] , version_upgrade [ 2 ] )
2015-05-04 04:12:25 +00:00
2016-06-16 05:48:51 +00:00
def switch_to_branch ( branch = None , apps = None , bench_path = ' . ' , upgrade = False ) :
switch_branch ( branch , apps = apps , bench_path = bench_path , upgrade = upgrade )
2016-04-28 11:56:28 +00:00
2017-09-27 08:12:43 +00:00
def switch_to_master ( apps = None , bench_path = ' . ' , upgrade = True ) :
2016-06-16 05:48:51 +00:00
switch_branch ( ' master ' , apps = apps , bench_path = bench_path , upgrade = upgrade )
2015-03-17 03:28:49 +00:00
2017-09-27 08:12:43 +00:00
def switch_to_develop ( apps = None , bench_path = ' . ' , upgrade = True ) :
2016-06-16 05:48:51 +00:00
switch_branch ( ' develop ' , apps = apps , bench_path = bench_path , upgrade = upgrade )
2015-03-17 11:20:43 +00:00
2016-06-09 13:24:41 +00:00
def get_version_from_string ( contents , field = ' __version__ ' ) :
match = re . search ( r " ^( \ s* %s \ s*= \ s*[ ' \\ \" ])(.+?)([ ' \" ])(?sm) " % field ,
2015-06-08 03:19:07 +00:00
contents )
2015-02-24 07:46:22 +00:00
return match . group ( 2 )
def get_major_version ( version ) :
return semantic_version . Version ( version ) . major
2016-06-16 05:48:51 +00:00
def install_apps_from_path ( path , bench_path = ' . ' ) :
2014-08-01 11:11:05 +00:00
apps = get_apps_json ( path )
for app in apps :
2016-06-16 05:48:51 +00:00
get_app ( app [ ' url ' ] , branch = app . get ( ' branch ' ) , bench_path = bench_path , build_asset_files = False )
2014-07-21 06:10:03 +00:00
2014-08-01 11:11:05 +00:00
def get_apps_json ( path ) :
2014-07-21 06:10:03 +00:00
if path . startswith ( ' http ' ) :
r = requests . get ( path )
return r . json ( )
else :
with open ( path ) as f :
return json . load ( f )