@nathapp/na-cli 1.0.8 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/templates/db-schema/.gitlab-ci.yml +139 -0
- package/dist/templates/db-schema/Makefile +885 -0
- package/dist/templates/k8s-deployment/.gitlab-ci.yml +158 -0
- package/dist/templates/k8s-deployment/Makefile +233 -0
- package/dist/templates/k8s-deployment/resources/charts/mysql/charts/mysql-install/script/Makefile +12 -0
- package/dist/templates/k8s-deployment/resources/charts/redis/charts/redis-install/script/Makefile +8 -0
- package/dist/templates/k8s-deployment/services/charts/hooks/charts/pre-delete-rsc/script/Makefile +56 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-cypress/Makefile +9 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/script/Makefile +14 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/_t-0100-readiness-liveness.ts +84 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/hub.ts +372 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-contact.ts +158 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-contract.ts +328 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-kyc.ts +304 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-onboard-app.ts +823 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-onboard-web.ts +493 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-profile.ts +277 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-whitelist.ts +133 -0
- package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/t-0200-start.ts +172 -0
- package/dist/templates/nestjs-api/.dockerignore +9 -0
- package/dist/templates/nestjs-api/.env +31 -0
- package/dist/templates/nestjs-api/.gitlab-ci.yml +180 -0
- package/dist/templates/nestjs-api/.nvmrc +1 -0
- package/dist/templates/nestjs-api/.prettierrc +4 -0
- package/dist/templates/nestjs-api/Makefile +95 -0
- package/dist/templates/nestjs-api/nest-cli.json +10 -0
- package/dist/templates/nestjs-api/ormconfig.ts +18 -0
- package/dist/templates/nestjs-api/src/app.controller.spec.ts +24 -0
- package/dist/templates/nestjs-api/src/app.controller.ts +27 -0
- package/dist/templates/nestjs-api/src/app.module.ts +31 -0
- package/dist/templates/nestjs-api/src/app.service.ts +27 -0
- package/dist/templates/nestjs-api/src/main.ts +31 -0
- package/dist/templates/nestjs-api/test/app.e2e-spec.ts +47 -0
- package/dist/templates/nestjs-api/tsconfig.build.json +5 -0
- package/dist/templates/nestjs-api/tsconfig.json +28 -0
- package/dist/templates/nestjs-api/tsconfig.spec.json +9 -0
- package/dist/templates/nestjs-library/.gitlab-ci.yml +134 -0
- package/dist/templates/nestjs-library/.nvmrc +1 -0
- package/dist/templates/nestjs-library/.prettierrc +6 -0
- package/dist/templates/nestjs-library/Makefile +60 -0
- package/dist/templates/nestjs-library/lib/index.ts +2 -0
- package/dist/templates/nestjs-library/test/app/controller/hello.controller.spec.ts +20 -0
- package/dist/templates/nestjs-library/test/app/controller/hello.controller.ts +7 -0
- package/dist/templates/nestjs-library/tsconfig.build.json +8 -0
- package/dist/templates/nestjs-library/tsconfig.json +21 -0
- package/dist/templates/nestjs-library/tsconfig.spec.json +9 -0
- package/dist/templates/ts-library/.dockerignore +2 -0
- package/dist/templates/ts-library/.eslintrc.js +24 -0
- package/dist/templates/ts-library/.gitlab-ci.yml +136 -0
- package/dist/templates/ts-library/.prettierrc +6 -0
- package/dist/templates/ts-library/Makefile +58 -0
- package/dist/templates/ts-library/index.ts +1 -0
- package/dist/templates/ts-library/lib/index.ts +1 -0
- package/dist/templates/ts-library/lib/samples/index.ts +5 -0
- package/dist/templates/ts-library/lib/samples/samples-function.ts +3 -0
- package/dist/templates/ts-library/test/sample.e2e-spec.ts +10 -0
- package/dist/templates/ts-library/tsconfig.build.json +4 -0
- package/dist/templates/ts-library/tsconfig.json +18 -0
- package/dist/templates/turbo-nestjs-vuexy/.dockerignore +2 -0
- package/dist/templates/turbo-nestjs-vuexy/.gitignore-rename +40 -0
- package/dist/templates/turbo-nestjs-vuexy/.npmrc-rename +0 -0
- package/dist/templates/turbo-nestjs-vuexy/Makefile +48 -0
- package/dist/templates/vuexy-portal/.dockerignore +2 -0
- package/dist/templates/vuexy-portal/.env +1 -0
- package/dist/templates/vuexy-portal/.gitlab-ci.yml +233 -0
- package/dist/templates/vuexy-portal/.npmrc-rename +2 -0
- package/dist/templates/vuexy-portal/.nvmrc +1 -0
- package/dist/templates/vuexy-portal/Makefile +55 -0
- package/dist/templates/vuexy-portal/src/@core/composable/createUrl.ts +20 -0
- package/dist/templates/vuexy-portal/src/@core/composable/useCookie.ts +43 -0
- package/dist/templates/vuexy-portal/src/@core/composable/useGenerateImageVariant.ts +25 -0
- package/dist/templates/vuexy-portal/src/@core/composable/useResponsiveSidebar.ts +29 -0
- package/dist/templates/vuexy-portal/src/@core/composable/useSkins.ts +42 -0
- package/dist/templates/vuexy-portal/src/@core/enums.ts +21 -0
- package/dist/templates/vuexy-portal/src/@core/index.ts +43 -0
- package/dist/templates/vuexy-portal/src/@core/initCore.ts +93 -0
- package/dist/templates/vuexy-portal/src/@core/libs/apex-chart/apexCharConfig.ts +701 -0
- package/dist/templates/vuexy-portal/src/@core/libs/chartjs/chartjsConfig.ts +372 -0
- package/dist/templates/vuexy-portal/src/@core/libs/chartjs/components/BarChart.ts +58 -0
- package/dist/templates/vuexy-portal/src/@core/libs/chartjs/components/BubbleChart.ts +58 -0
- package/dist/templates/vuexy-portal/src/@core/libs/chartjs/components/DoughnutChart.ts +58 -0
- package/dist/templates/vuexy-portal/src/@core/libs/chartjs/components/LineChart.ts +58 -0
- package/dist/templates/vuexy-portal/src/@core/libs/chartjs/components/PolarAreaChart.ts +58 -0
- package/dist/templates/vuexy-portal/src/@core/libs/chartjs/components/RadarChart.ts +58 -0
- package/dist/templates/vuexy-portal/src/@core/libs/chartjs/components/ScatterChart.ts +58 -0
- package/dist/templates/vuexy-portal/src/@core/stores/config.ts +80 -0
- package/dist/templates/vuexy-portal/src/@core/types.ts +49 -0
- package/dist/templates/vuexy-portal/src/@core/utils/formatters.ts +48 -0
- package/dist/templates/vuexy-portal/src/@core/utils/helpers.ts +32 -0
- package/dist/templates/vuexy-portal/src/@core/utils/plugins.ts +53 -0
- package/dist/templates/vuexy-portal/src/@core/utils/validators.ts +105 -0
- package/dist/templates/vuexy-portal/src/@core/utils/vuetify.ts +13 -0
- package/dist/templates/vuexy-portal/src/@custom/composables/toasts.ts +45 -0
- package/dist/templates/vuexy-portal/src/@custom/composables/validator.ts +160 -0
- package/dist/templates/vuexy-portal/src/@custom/enums/index.ts +0 -0
- package/dist/templates/vuexy-portal/src/@custom/types/common.ts +17 -0
- package/dist/templates/vuexy-portal/src/@custom/types/index.ts +0 -0
- package/dist/templates/vuexy-portal/src/@custom/types/pagination.ts +19 -0
- package/dist/templates/vuexy-portal/src/@custom/types/user.ts +5 -0
- package/dist/templates/vuexy-portal/src/@custom/utils/formatters.ts +83 -0
- package/dist/templates/vuexy-portal/src/@custom/utils/index.ts +0 -0
- package/dist/templates/vuexy-portal/src/@custom/utils/validators.ts +51 -0
- package/dist/templates/vuexy-portal/src/@layouts/components.ts +11 -0
- package/dist/templates/vuexy-portal/src/@layouts/config.ts +43 -0
- package/dist/templates/vuexy-portal/src/@layouts/enums.ts +27 -0
- package/dist/templates/vuexy-portal/src/@layouts/index.ts +49 -0
- package/dist/templates/vuexy-portal/src/@layouts/plugins/casl.ts +48 -0
- package/dist/templates/vuexy-portal/src/@layouts/stores/config.ts +115 -0
- package/dist/templates/vuexy-portal/src/@layouts/symbols.ts +1 -0
- package/dist/templates/vuexy-portal/src/@layouts/types.ts +126 -0
- package/dist/templates/vuexy-portal/src/@layouts/utils.ts +180 -0
- package/dist/templates/vuexy-portal/src/api/api.ts +1 -0
- package/dist/templates/vuexy-portal/src/api/commonApi.ts +25 -0
- package/dist/templates/vuexy-portal/src/api/index.ts +58 -0
- package/dist/templates/vuexy-portal/src/api/requestInterceptor.ts +21 -0
- package/dist/templates/vuexy-portal/src/api/responseInterceptor.ts +52 -0
- package/dist/templates/vuexy-portal/src/api/types.ts +14 -0
- package/dist/templates/vuexy-portal/src/api/useApi.ts +68 -0
- package/dist/templates/vuexy-portal/src/api/useFetchApi.ts +41 -0
- package/dist/templates/vuexy-portal/src/api/userApi.ts +11 -0
- package/dist/templates/vuexy-portal/src/composables/useApiFetch.ts +48 -0
- package/dist/templates/vuexy-portal/src/composables/useJwt.ts +108 -0
- package/dist/templates/vuexy-portal/src/main.ts +17 -0
- package/dist/templates/vuexy-portal/src/navigation/horizontal/index.ts +5 -0
- package/dist/templates/vuexy-portal/src/navigation/index.ts +7 -0
- package/dist/templates/vuexy-portal/src/navigation/vertical/index.ts +5 -0
- package/dist/templates/vuexy-portal/src/plugins/1.router/additional-routes.ts +23 -0
- package/dist/templates/vuexy-portal/src/plugins/1.router/guards.ts +50 -0
- package/dist/templates/vuexy-portal/src/plugins/1.router/index.ts +45 -0
- package/dist/templates/vuexy-portal/src/plugins/2.pinia.ts +8 -0
- package/dist/templates/vuexy-portal/src/plugins/casl/ability.ts +10 -0
- package/dist/templates/vuexy-portal/src/plugins/casl/composables/useAbility.ts +4 -0
- package/dist/templates/vuexy-portal/src/plugins/casl/index.ts +14 -0
- package/dist/templates/vuexy-portal/src/plugins/i18n/index.ts +29 -0
- package/dist/templates/vuexy-portal/src/plugins/iconify/build-icons.ts +299 -0
- package/dist/templates/vuexy-portal/src/plugins/iconify/index.ts +5 -0
- package/dist/templates/vuexy-portal/src/plugins/layouts.ts +13 -0
- package/dist/templates/vuexy-portal/src/plugins/toast/index.ts +9 -0
- package/dist/templates/vuexy-portal/src/plugins/vuetify/defaults.ts +192 -0
- package/dist/templates/vuexy-portal/src/plugins/vuetify/icons.ts +84 -0
- package/dist/templates/vuexy-portal/src/plugins/vuetify/index.ts +47 -0
- package/dist/templates/vuexy-portal/src/plugins/vuetify/theme.ts +155 -0
- package/dist/templates/vuexy-portal/src/plugins/webfontloader.ts +19 -0
- package/dist/templates/vuexy-portal/src/stores/auth.ts +22 -0
- package/dist/templates/vuexy-portal/src/stores/common.ts +41 -0
- package/dist/templates/vuexy-portal/src/stores/index.ts +0 -0
- package/dist/templates/vuexy-portal/src/utils/constants.ts +3 -0
- package/dist/templates/vuexy-portal/src/utils/paginationMeta.ts +10 -0
- package/dist/templates/vuexy-portal/themeConfig.ts +66 -0
- package/dist/templates/vuexy-portal/tsconfig.json +86 -0
- package/dist/templates/vuexy-portal/vite.config.ts +111 -0
- package/dist/utils/template.js +2 -0
- package/dist/utils/template.js.map +1 -1
- package/package.json +4 -1
- package/alias-script.sh +0 -30
- package/bunfig.toml +0 -3
- package/nax/config.json +0 -23
- package/nax/features/enhancements/prd.json +0 -61
|
@@ -0,0 +1,885 @@
|
|
|
1
|
+
# REQUIREMENT:
|
|
2
|
+
# - GET_VERSION.sql file must be exists in repo root folder
|
|
3
|
+
# - SET_VERSION.sql file must be exists in repo root folder, {{VERSION}} keyword in the script will be replace with actual target version number
|
|
4
|
+
# - All script must be on repo root folder, and filename start with XXX_*.sql or XXX-*.sql
|
|
5
|
+
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# PRERELEASE_TAG (default=false): true=prerelease only, false=otherwise
|
|
8
|
+
# GIT_TAG: the target version
|
|
9
|
+
# VERSION: the installed version
|
|
10
|
+
|
|
11
|
+
MAKEFILE := $(abspath $(lastword $(MAKEFILE_LIST)))
|
|
12
|
+
ROOT_PATH := $(shell pwd)
|
|
13
|
+
REPO_PATH := $(ROOT_PATH)
|
|
14
|
+
GIT_PATH := $(REPO_PATH)/.git
|
|
15
|
+
|
|
16
|
+
.PHONY:
|
|
17
|
+
|
|
18
|
+
release: version-sync
|
|
19
|
+
@bash -e -o pipefail -c '\
|
|
20
|
+
docker-compose up --no-deps --build --force-recreate --abort-on-container-exit --remove-orphans mysql release || \
|
|
21
|
+
((docker-compose down --remove-orphans -v --rmi local | true); exit 1); \
|
|
22
|
+
docker-compose down --remove-orphans -v --rmi local | true; \
|
|
23
|
+
echo ">>== DONE ==<<"'
|
|
24
|
+
|
|
25
|
+
run-release: prepare-patch wait-for
|
|
26
|
+
@set -e -o pipefail; \
|
|
27
|
+
if [ -f $(REPO_PATH)/patch.sql ]; then \
|
|
28
|
+
((cat $(REPO_PATH)/patch.sql | (mysql --abort-source-on-error=1 --comments -h"mysql" -u"root" 2> $(REPO_PATH)/error.txt)) && \
|
|
29
|
+
( \
|
|
30
|
+
make --no-print-directory -f$(MAKEFILE) run-exp-table; \
|
|
31
|
+
make --no-print-directory -f$(MAKEFILE) run-exp-sp; \
|
|
32
|
+
make --no-print-directory -f$(MAKEFILE) run-exp-init-data; \
|
|
33
|
+
make --no-print-directory -f$(MAKEFILE) run-exp-grant; \
|
|
34
|
+
echo ">>== EXTRACTED ==<<"; \
|
|
35
|
+
)) || \
|
|
36
|
+
( \
|
|
37
|
+
make --no-print-directory -f$(MAKEFILE) test-show-patch-error; \
|
|
38
|
+
exit 1; \
|
|
39
|
+
) \
|
|
40
|
+
fi;
|
|
41
|
+
|
|
42
|
+
run-exp-table:
|
|
43
|
+
@for schema in `make --no-print-directory -f$(MAKEFILE) schemas`; do \
|
|
44
|
+
echo "EXTRACTING TABLE: $$schema"; \
|
|
45
|
+
mysqldump -h"mysql" -u"root" \
|
|
46
|
+
-n --comments --quote-names --no-tablespaces --no-data --compact --skip-set-charset \
|
|
47
|
+
--databases $$schema | \
|
|
48
|
+
sed 's/ AUTO_INCREMENT=[0-9]*//g' > /out/100_$$schema\_Tbl.sql; \
|
|
49
|
+
done;
|
|
50
|
+
|
|
51
|
+
run-exp-sp:
|
|
52
|
+
@for schema in `make --no-print-directory -f$(MAKEFILE) schemas`; do \
|
|
53
|
+
echo "EXTRACTING SP: $$schema"; \
|
|
54
|
+
echo "USE $$schema;" > /out/500_$$schema\_SP.sql; \
|
|
55
|
+
echo "" >> /out/500_$$schema\_SP.sql; \
|
|
56
|
+
echo "" >> /out/500_$$schema\_SP.sql; \
|
|
57
|
+
echo " \
|
|
58
|
+
SET SESSION group_concat_max_len = 1000000; \
|
|
59
|
+
SELECT CONCAT( \
|
|
60
|
+
'DELIMITER \$$\$$ \nDROP PROCEDURE IF EXISTS \`', db, '\`.\`', name, '\` \$$\$$ \nCREATE PROCEDURE \`', db, \
|
|
61
|
+
'\`.\`', name, '\` (', IFNULL(param_list, ''), '\n) SQL SECURITY INVOKER \n', body, ' \$$\$$\nDELIMITER ;\n\n') \
|
|
62
|
+
FROM ( \
|
|
63
|
+
SELECT R.ROUTINE_SCHEMA db \
|
|
64
|
+
, R.ROUTINE_NAME name \
|
|
65
|
+
, (SELECT GROUP_CONCAT(CONCAT('\n ' \
|
|
66
|
+
, P.PARAMETER_MODE, ' ' \
|
|
67
|
+
, P.PARAMETER_NAME, ' ' \
|
|
68
|
+
, CASE P.DATA_TYPE \
|
|
69
|
+
WHEN 'int' THEN P.DATA_TYPE \
|
|
70
|
+
WHEN 'tinyint' THEN P.DATA_TYPE \
|
|
71
|
+
WHEN 'smallint' THEN P.DATA_TYPE \
|
|
72
|
+
WHEN 'bigint' THEN P.DATA_TYPE \
|
|
73
|
+
ELSE P.DTD_IDENTIFIER \
|
|
74
|
+
END)) \
|
|
75
|
+
FROM INFORMATION_SCHEMA.PARAMETERS P \
|
|
76
|
+
WHERE P.SPECIFIC_SCHEMA = R.ROUTINE_SCHEMA \
|
|
77
|
+
AND P.SPECIFIC_NAME = R.ROUTINE_NAME \
|
|
78
|
+
AND P.ORDINAL_POSITION > 0 \
|
|
79
|
+
ORDER BY P.ORDINAL_POSITION \
|
|
80
|
+
) param_list \
|
|
81
|
+
, R.ROUTINE_DEFINITION body \
|
|
82
|
+
FROM INFORMATION_SCHEMA.ROUTINES R \
|
|
83
|
+
WHERE R.ROUTINE_SCHEMA = '$$schema' \
|
|
84
|
+
AND R.ROUTINE_TYPE = 'PROCEDURE' \
|
|
85
|
+
ORDER BY R.ROUTINE_NAME \
|
|
86
|
+
) R;" | \
|
|
87
|
+
mysql -h"mysql" -u"root" --skip-column-names | \
|
|
88
|
+
awk '{gsub(/\\n/,"\n")}1' | awk '{gsub(/\\t/,"\t")}2' >> /out/500_$$schema\_SP.sql; \
|
|
89
|
+
echo " \
|
|
90
|
+
SET SESSION group_concat_max_len = 1000000; \
|
|
91
|
+
SELECT CONCAT( \
|
|
92
|
+
'DELIMITER \$$\$$ \nDROP FUNCTION IF EXISTS \`', db, '\`.\`', name, '\` \$$\$$ \nCREATE FUNCTION \`', db, \
|
|
93
|
+
'\`.\`', name, '\` (', IFNULL(param_list, ''), '\n)\nRETURNS ', returns, '\nSQL SECURITY INVOKER \n', body, ' \$$\$$\nDELIMITER ;\n\n') \
|
|
94
|
+
FROM ( \
|
|
95
|
+
SELECT R.ROUTINE_SCHEMA db \
|
|
96
|
+
, R.ROUTINE_NAME name \
|
|
97
|
+
, (SELECT GROUP_CONCAT(CONCAT('\n ' \
|
|
98
|
+
, P.PARAMETER_NAME, ' ' \
|
|
99
|
+
, CASE P.DATA_TYPE \
|
|
100
|
+
WHEN 'int' THEN P.DATA_TYPE \
|
|
101
|
+
WHEN 'tinyint' THEN P.DATA_TYPE \
|
|
102
|
+
WHEN 'smallint' THEN P.DATA_TYPE \
|
|
103
|
+
WHEN 'bigint' THEN P.DATA_TYPE \
|
|
104
|
+
ELSE P.DTD_IDENTIFIER \
|
|
105
|
+
END)) \
|
|
106
|
+
FROM INFORMATION_SCHEMA.PARAMETERS P \
|
|
107
|
+
WHERE P.SPECIFIC_SCHEMA = R.ROUTINE_SCHEMA \
|
|
108
|
+
AND P.SPECIFIC_NAME = R.ROUTINE_NAME \
|
|
109
|
+
AND P.ORDINAL_POSITION > 0 \
|
|
110
|
+
ORDER BY P.ORDINAL_POSITION \
|
|
111
|
+
) param_list \
|
|
112
|
+
, R.ROUTINE_DEFINITION body \
|
|
113
|
+
, CASE R.DATA_TYPE \
|
|
114
|
+
WHEN 'int' THEN R.DATA_TYPE \
|
|
115
|
+
WHEN 'tinyint' THEN R.DATA_TYPE \
|
|
116
|
+
WHEN 'smallint' THEN R.DATA_TYPE \
|
|
117
|
+
WHEN 'bigint' THEN R.DATA_TYPE \
|
|
118
|
+
ELSE R.DTD_IDENTIFIER \
|
|
119
|
+
END returns \
|
|
120
|
+
FROM INFORMATION_SCHEMA.ROUTINES R \
|
|
121
|
+
WHERE R.ROUTINE_SCHEMA = '$$schema' \
|
|
122
|
+
AND R.ROUTINE_TYPE = 'FUNCTION' \
|
|
123
|
+
ORDER BY R.ROUTINE_NAME \
|
|
124
|
+
) F;" | \
|
|
125
|
+
mysql -h"mysql" -u"root" --skip-column-names | \
|
|
126
|
+
awk '{gsub(/\\n/,"\n")}1' | awk '{gsub(/\\t/,"\t")}2' >> /out/500_$$schema\_SP.sql; \
|
|
127
|
+
done;
|
|
128
|
+
|
|
129
|
+
run-exp-init-data:
|
|
130
|
+
@if ls $(REPO_PATH)/890_*.sql > /dev/null 2>&1; then \
|
|
131
|
+
for file in $(REPO_PATH)/890_*.sql; do \
|
|
132
|
+
echo "EXTRACTING INIT DATA FROM FILE: `basename $$file`"; \
|
|
133
|
+
cp $$file `echo $$file | awk -F"/890_" '{ printf("/out/300_%s", $$2)}'`; \
|
|
134
|
+
done; \
|
|
135
|
+
fi;
|
|
136
|
+
@if ls $(REPO_PATH)/990_*.sql > /dev/null 2>&1; then \
|
|
137
|
+
for file in $(REPO_PATH)/990_*.sql; do \
|
|
138
|
+
echo "EXTRACTING INIT DATA FROM TABLE: `basename $$file`"; \
|
|
139
|
+
export OUTPUT=`echo $$file | awk -F"/990_" '{ printf("/out/300_%s", $$2)}'`; \
|
|
140
|
+
cat $$file | (mysql -h"mysql" -u"root" --skip-column-names) | \
|
|
141
|
+
awk '{gsub(/\\n/,"\n")}1' | awk '{gsub(/\\t/,"\t")}2' \
|
|
142
|
+
> $$OUTPUT; \
|
|
143
|
+
done; \
|
|
144
|
+
fi;
|
|
145
|
+
|
|
146
|
+
run-exp-grant:
|
|
147
|
+
@export PASSWORD='MyAppP@ssw0rd!!'; \
|
|
148
|
+
export SCHEMAS=`make --no-print-directory -f$(MAKEFILE) schemas | \
|
|
149
|
+
awk -F"." 'BEGIN{first=1} \
|
|
150
|
+
{ \
|
|
151
|
+
printf("%s", (1 != first) ? "," : ""); \
|
|
152
|
+
first = 0; \
|
|
153
|
+
printf("'\''%s'\''", $$1) \
|
|
154
|
+
}'`; \
|
|
155
|
+
\
|
|
156
|
+
echo "-- GRANT FOR: $$SCHEMAS" > /out/910_DB_Grant_User.sql; \
|
|
157
|
+
echo "" >> /out/910_DB_Grant_User.sql; \
|
|
158
|
+
\
|
|
159
|
+
for grantee in `make --no-print-directory -f$(MAKEFILE) run-exp-grantee`; do \
|
|
160
|
+
echo "DROP USER IF EXISTS $$grantee;" >> /out/910_DB_Grant_User.sql; \
|
|
161
|
+
done; \
|
|
162
|
+
echo "" >> /out/910_DB_Grant_User.sql; \
|
|
163
|
+
\
|
|
164
|
+
for grantee in `make --no-print-directory -f$(MAKEFILE) run-exp-grantee`; do \
|
|
165
|
+
echo "CREATE USER $$grantee IDENTIFIED BY '$$PASSWORD';" >> /out/910_DB_Grant_User.sql; \
|
|
166
|
+
done; \
|
|
167
|
+
echo "" >> /out/910_DB_Grant_User.sql; \
|
|
168
|
+
\
|
|
169
|
+
for grantee in `make --no-print-directory -f$(MAKEFILE) run-exp-grantee`; do \
|
|
170
|
+
echo "EXTRACTING GRANT: $$grantee"; \
|
|
171
|
+
\
|
|
172
|
+
echo "$$grantee" | awk -F"@" '{printf("-- %s\n", toupper($$1))}' >> /out/910_DB_Grant_User.sql; \
|
|
173
|
+
echo " \
|
|
174
|
+
SHOW GRANTS FOR $$grantee;" | \
|
|
175
|
+
mysql -h"mysql" -u"root" --skip-column-names | \
|
|
176
|
+
awk '{gsub(/\\n/,"\n")}1' | awk '{gsub(/\\t/,"\t")}2' | awk '{printf("%s;\n", $$0)}' > grant_sort.sql; \
|
|
177
|
+
\
|
|
178
|
+
for item in `cat grant_sort.sql | awk -F"ON " '{printf("%dON %s\n",NR,$$0)}' | \
|
|
179
|
+
awk -F"ON " '{printf("%s.%s\n", $$1, $$3)}' | \
|
|
180
|
+
awk -F"." '{printf("%s:::::%s\n", $$2, $$1)}' | sort`; \
|
|
181
|
+
do \
|
|
182
|
+
export LINE=`echo $$item | awk -F":::::" '{printf("%s",$$2)}'`; \
|
|
183
|
+
cat grant_sort.sql | awk '{if (NR == ENVIRON["LINE"]) print}' >> /out/910_DB_Grant_User.sql; \
|
|
184
|
+
done; \
|
|
185
|
+
echo "" >> /out/910_DB_Grant_User.sql; \
|
|
186
|
+
done;
|
|
187
|
+
|
|
188
|
+
run-exp-grantee:
|
|
189
|
+
@export SCHEMAS=`make --no-print-directory -f$(MAKEFILE) schemas | \
|
|
190
|
+
awk -F"." 'BEGIN{first=1} \
|
|
191
|
+
{ \
|
|
192
|
+
printf("%s", (1 != first) ? "," : ""); \
|
|
193
|
+
first = 0; \
|
|
194
|
+
printf("'\''%s'\''", $$1) \
|
|
195
|
+
}'`; \
|
|
196
|
+
echo " \
|
|
197
|
+
SET SESSION group_concat_max_len = 1000000; \
|
|
198
|
+
SELECT DISTINCT GRANTEE FROM INFORMATION_SCHEMA.SCHEMA_PRIVILEGES \
|
|
199
|
+
WHERE TABLE_SCHEMA IN ($$SCHEMAS) \
|
|
200
|
+
ORDER BY GRANTEE;" | \
|
|
201
|
+
mysql -h"mysql" -u"root" --skip-column-names | \
|
|
202
|
+
awk '{gsub(/\\n/,"\n")}1' | awk '{gsub(/\\t/,"\t")}2';
|
|
203
|
+
|
|
204
|
+
schemas:
|
|
205
|
+
@echo "" | \
|
|
206
|
+
(cat - $(REPO_PATH)/0*.sql 2>/dev/null || cat -) | \
|
|
207
|
+
grep "CREATE DATABASE IF NOT EXISTS " | \
|
|
208
|
+
awk -F"CREATE DATABASE IF NOT EXISTS " '{ print $$2}' | \
|
|
209
|
+
awk -F" " '{ gsub("\`", "", $$1); print $$1 }'
|
|
210
|
+
|
|
211
|
+
cli:
|
|
212
|
+
@docker run --rm -it -v $(REPO_PATH):/sql $$(docker build -q .)
|
|
213
|
+
|
|
214
|
+
dup:
|
|
215
|
+
@(make --no-print-directory -f$(MAKEFILE) dup-list) | sort | uniq -d;
|
|
216
|
+
|
|
217
|
+
dup-count:
|
|
218
|
+
@(make --no-print-directory -f$(MAKEFILE) dup-list) | wc -l | awk '{$$1=$$1};1';
|
|
219
|
+
|
|
220
|
+
dup-list:
|
|
221
|
+
@if [ -f $(REPO_PATH)/DEV_MODE.txt ]; then \
|
|
222
|
+
cat $(REPO_PATH)/DEV_8*.sql 2>/dev/null | \
|
|
223
|
+
awk -F"CREATE PROCEDURE " '{printf("%s\n",$$2)}' | \
|
|
224
|
+
awk NF | \
|
|
225
|
+
awk -F"(" '{print $$1;}' | \
|
|
226
|
+
awk '{$$1=$$1};1' | \
|
|
227
|
+
awk '{gsub("\\`","")}1' | \
|
|
228
|
+
sort; \
|
|
229
|
+
else \
|
|
230
|
+
cat $(REPO_PATH)/8*.sql 2>/dev/null | \
|
|
231
|
+
awk -F"CREATE PROCEDURE " '{printf("%s\n",$$2)}' | \
|
|
232
|
+
awk NF | \
|
|
233
|
+
awk -F"(" '{print $$1;}' | \
|
|
234
|
+
awk '{$$1=$$1};1' | \
|
|
235
|
+
awk '{gsub("\\`","")}1' | \
|
|
236
|
+
sort; \
|
|
237
|
+
fi;
|
|
238
|
+
|
|
239
|
+
# Clone the database repo according to target version (GIt_TAG), and do a prerequisite check
|
|
240
|
+
# Install database when it is not exists, otherwise patching process will be trigger
|
|
241
|
+
install: prerequisite
|
|
242
|
+
@echo "Target version: $(GIT_TAG)"
|
|
243
|
+
@set -e -o pipefail; \
|
|
244
|
+
make --no-print-directory -f$(MAKEFILE) version-get > $(REPO_PATH)/version.txt; \
|
|
245
|
+
if [ -z "$$(cat $(REPO_PATH)/version.txt)" ]; then \
|
|
246
|
+
make --no-print-directory -f$(MAKEFILE) run-init; \
|
|
247
|
+
else \
|
|
248
|
+
make --no-print-directory -f$(MAKEFILE) run-patch; \
|
|
249
|
+
fi;
|
|
250
|
+
|
|
251
|
+
# Initialize database, it will run all the script files (0XX, 1XX, 3XX, 5XX, 6XX, 9XX) except 7XX & 8XX
|
|
252
|
+
# NOTE: MySQL doesn't support transactional DDL, any error on script will lead to database half-migrated
|
|
253
|
+
run-init: version-set
|
|
254
|
+
@set -e -o pipefail; \
|
|
255
|
+
make --no-print-directory -f$(MAKEFILE) get-init > $(REPO_PATH)/all.sql;
|
|
256
|
+
@echo "DATABASE installed version: N/A"
|
|
257
|
+
@echo "DATABASE target version: $(GIT_TAG)"
|
|
258
|
+
@echo "==> DATABASE installation in progress..."
|
|
259
|
+
@set -e -o pipefail; \
|
|
260
|
+
((cat $(REPO_PATH)/all.sql | (mysql --abort-source-on-error=1 --comments -h"$(HOST_IP)" -u"$(USERNAME)" -p"$(PASSWORD)" 2> $(REPO_PATH)/error.txt)) && \
|
|
261
|
+
( \
|
|
262
|
+
echo "==> DATABASE has been installed"; \
|
|
263
|
+
)) || \
|
|
264
|
+
( \
|
|
265
|
+
make --no-print-directory -f$(MAKEFILE) test-show-init-error; \
|
|
266
|
+
exit 1; \
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
# Patch database, it will run all the 7XX, 8XX script files from the installed version to target version (including current repo if it is not versioned)
|
|
270
|
+
# NOTE: MySQL doesn't support transactional DDL, any error on script will lead to database half-migrated
|
|
271
|
+
run-patch: version-set
|
|
272
|
+
@set -e -o pipefail; \
|
|
273
|
+
make --no-print-directory -f$(MAKEFILE) get-patch FROM="$$(make --no-print-directory -f$(MAKEFILE) version-get)" TO="$(GIT_TAG)" > $(REPO_PATH)/patch.sql;
|
|
274
|
+
@echo "DATABASE installed version: $$(cat $(REPO_PATH)/version.txt)"
|
|
275
|
+
@echo "DATABASE target version: $(GIT_TAG)"
|
|
276
|
+
@echo
|
|
277
|
+
@set -e -o pipefail; \
|
|
278
|
+
if [ "$(GIT_TAG)" == "$$(cat $(REPO_PATH)/version.txt)" ]; then \
|
|
279
|
+
echo "==> DATABASE is latest version"; \
|
|
280
|
+
else \
|
|
281
|
+
echo "==> DATABASE patching in progress..."; \
|
|
282
|
+
((cat $(REPO_PATH)/patch.sql | (mysql --abort-source-on-error=1 --comments -h"$(HOST_IP)" -u"$(USERNAME)" -p"$(PASSWORD)" 2> $(REPO_PATH)/error.txt)) && \
|
|
283
|
+
( \
|
|
284
|
+
cat $(REPO_PATH)/patch.sql | grep " PATCH - "; \
|
|
285
|
+
echo "==> DATABASE has been patched"; \
|
|
286
|
+
)) || \
|
|
287
|
+
( \
|
|
288
|
+
make --no-print-directory -f$(MAKEFILE) test-show-patch-error; \
|
|
289
|
+
exit 1; \
|
|
290
|
+
); \
|
|
291
|
+
fi;
|
|
292
|
+
|
|
293
|
+
run-test: version-sync
|
|
294
|
+
@set -e -o pipefail; \
|
|
295
|
+
if ! [ -z `make --no-print-directory -f$(MAKEFILE) dup` ]; then \
|
|
296
|
+
echo ">>== DUPLICATED STORED PROCEDURE ==<<"; \
|
|
297
|
+
make --no-print-directory -f$(MAKEFILE) dup; \
|
|
298
|
+
echo ">>== \"-_- ==<<"; \
|
|
299
|
+
echo ""; \
|
|
300
|
+
exit 1; \
|
|
301
|
+
else \
|
|
302
|
+
echo ">>== CHECKED `make --no-print-directory -f$(MAKEFILE) dup-count` STORED PROCEDURE(S) ==<<"; \
|
|
303
|
+
fi;
|
|
304
|
+
@set -e -o pipefail; \
|
|
305
|
+
if (ls $(REPO_PATH)/7*.sql > /dev/null 2>&1) || (ls $(REPO_PATH)/8*.sql > /dev/null 2>&1); then \
|
|
306
|
+
docker-compose up --no-deps --build --force-recreate --abort-on-container-exit mysql patch || \
|
|
307
|
+
((docker-compose down --remove-orphans -v --rmi local | true); exit 1); \
|
|
308
|
+
docker-compose down --remove-orphans -v --rmi local | true; \
|
|
309
|
+
fi;
|
|
310
|
+
@set -e -o pipefail; \
|
|
311
|
+
docker-compose up --no-deps --build --force-recreate --abort-on-container-exit mysql init || \
|
|
312
|
+
((docker-compose down --remove-orphans -v --rmi local | true); exit 1); \
|
|
313
|
+
docker-compose down --remove-orphans -v --rmi local | true; \
|
|
314
|
+
echo ">>== DONE ==<<"
|
|
315
|
+
|
|
316
|
+
test: version-sync
|
|
317
|
+
@bash -e -o pipefail -c '\
|
|
318
|
+
if ! [ -z `make --no-print-directory -f$(MAKEFILE) dup` ]; then \
|
|
319
|
+
echo ">>== DUPLICATED STORED PROCEDURE ==<<"; \
|
|
320
|
+
make --no-print-directory -f$(MAKEFILE) dup; \
|
|
321
|
+
echo ">>== \"-_- ==<<"; \
|
|
322
|
+
echo ""; \
|
|
323
|
+
exit 1; \
|
|
324
|
+
else \
|
|
325
|
+
echo ">>== CHECKED `make --no-print-directory -f$(MAKEFILE) dup-count` STORED PROCEDURE(S) ==<<"; \
|
|
326
|
+
fi';
|
|
327
|
+
@bash -e -o pipefail -c '\
|
|
328
|
+
if [ -f $(REPO_PATH)/DEV_MODE.txt ]; then \
|
|
329
|
+
if (ls $(REPO_PATH)/DEV_7*.sql > /dev/null 2>&1) || (ls $(REPO_PATH)/DEV_8*.sql > /dev/null 2>&1); then \
|
|
330
|
+
docker-compose up --no-deps --build --force-recreate --abort-on-container-exit mysql patch || \
|
|
331
|
+
((docker-compose down --remove-orphans -v --rmi local | true); exit 1); \
|
|
332
|
+
docker-compose down --remove-orphans -v --rmi local | true; \
|
|
333
|
+
fi; \
|
|
334
|
+
else \
|
|
335
|
+
if (ls $(REPO_PATH)/7*.sql > /dev/null 2>&1) || (ls $(REPO_PATH)/8*.sql > /dev/null 2>&1); then \
|
|
336
|
+
docker-compose up --no-deps --build --force-recreate --abort-on-container-exit mysql patch || \
|
|
337
|
+
((docker-compose down --remove-orphans -v --rmi local | true); exit 1); \
|
|
338
|
+
docker-compose down --remove-orphans -v --rmi local | true; \
|
|
339
|
+
fi; \
|
|
340
|
+
fi';
|
|
341
|
+
@bash -e -o pipefail -c '\
|
|
342
|
+
docker-compose up --no-deps --build --force-recreate --abort-on-container-exit mysql init || \
|
|
343
|
+
((docker-compose down --remove-orphans -v --rmi local | true); exit 1); \
|
|
344
|
+
docker-compose down --remove-orphans -v --rmi local | true; \
|
|
345
|
+
echo ">>== DONE ==<<"'
|
|
346
|
+
|
|
347
|
+
wait-for:
|
|
348
|
+
@echo "Waiting for database ready..."
|
|
349
|
+
@until nc -w 1 mysql 3306; do sleep 1; done
|
|
350
|
+
@echo "Database is ready!"
|
|
351
|
+
|
|
352
|
+
test-show-init-error:
|
|
353
|
+
@echo ">>== INIT ==<<"
|
|
354
|
+
@echo "..."
|
|
355
|
+
@export ERROR_LINE=`cat $(REPO_PATH)/error.txt | grep "at line " | awk -F"at line " '{ split($$2,e,":"); printf("%s",e[1]); exit 0; }'`; \
|
|
356
|
+
cat $(REPO_PATH)/all.sql | awk 'BEGIN { \
|
|
357
|
+
line = 0; \
|
|
358
|
+
start = 0; \
|
|
359
|
+
limit = 50; \
|
|
360
|
+
if ("" != ENVIRON["ERROR_LINE"]) { \
|
|
361
|
+
start = ENVIRON["ERROR_LINE"]; \
|
|
362
|
+
if (20 <= start) { \
|
|
363
|
+
start = start - 20; \
|
|
364
|
+
} \
|
|
365
|
+
} \
|
|
366
|
+
} \
|
|
367
|
+
{ \
|
|
368
|
+
if (line++ > start) { \
|
|
369
|
+
printf("%06d %s\n", line, $$0); \
|
|
370
|
+
if (0 >= limit--) { \
|
|
371
|
+
exit 0; \
|
|
372
|
+
} \
|
|
373
|
+
} \
|
|
374
|
+
}'
|
|
375
|
+
@echo "..."
|
|
376
|
+
@cat $(REPO_PATH)/error.txt
|
|
377
|
+
@echo ">>== INIT ==<<"
|
|
378
|
+
|
|
379
|
+
test-show-patch-error:
|
|
380
|
+
@echo ">>== PATCH ==<<"
|
|
381
|
+
@echo "..."
|
|
382
|
+
@export ERROR_LINE=`cat $(REPO_PATH)/error.txt | grep "at line " | awk -F"at line " '{ split($$2,e,":"); printf("%s",e[1]); exit 0; }'`; \
|
|
383
|
+
cat $(REPO_PATH)/patch.sql | awk 'BEGIN { \
|
|
384
|
+
line = 0; \
|
|
385
|
+
start = 0; \
|
|
386
|
+
limit = 50; \
|
|
387
|
+
if ("" != ENVIRON["ERROR_LINE"]) { \
|
|
388
|
+
start = ENVIRON["ERROR_LINE"]; \
|
|
389
|
+
if (20 <= start) { \
|
|
390
|
+
start = start - 20; \
|
|
391
|
+
} \
|
|
392
|
+
} \
|
|
393
|
+
} \
|
|
394
|
+
{ \
|
|
395
|
+
if (line++ > start) { \
|
|
396
|
+
printf("%06d %s\n", line, $$0); \
|
|
397
|
+
if (0 >= limit--) { \
|
|
398
|
+
exit 0; \
|
|
399
|
+
} \
|
|
400
|
+
} \
|
|
401
|
+
}'
|
|
402
|
+
@echo "..."
|
|
403
|
+
@cat $(REPO_PATH)/error.txt
|
|
404
|
+
@echo ">>== PATCH ==<<"
|
|
405
|
+
|
|
406
|
+
test-init: test-run-init test-check-sp-invoker
|
|
407
|
+
@echo ">>== PASSED ==<<";
|
|
408
|
+
|
|
409
|
+
test-run-init: prepare-init wait-for
|
|
410
|
+
@(cat $(REPO_PATH)/all.sql | (mysql --abort-source-on-error=1 --comments -h"mysql" -u"root" 2> $(REPO_PATH)/error.txt)) || \
|
|
411
|
+
( \
|
|
412
|
+
make --no-print-directory -f$(MAKEFILE) test-show-init-error; \
|
|
413
|
+
exit 1; \
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
test-patch: test-run-patch test-check-sp-invoker
|
|
417
|
+
@echo ">>== PASSED ==<<";
|
|
418
|
+
|
|
419
|
+
test-run-patch: prepare-patch wait-for
|
|
420
|
+
@set -e -o pipefail; \
|
|
421
|
+
if [ -f $(REPO_PATH)/patch.sql ]; then \
|
|
422
|
+
((cat $(REPO_PATH)/patch.sql | (mysql --abort-source-on-error=1 --comments -h"mysql" -u"root" 2> $(REPO_PATH)/error.txt)) && \
|
|
423
|
+
( \
|
|
424
|
+
cat $(REPO_PATH)/patch.sql | \
|
|
425
|
+
grep " PATCH - " | \
|
|
426
|
+
awk -F" PATCH - " '{ split($$2,v," "); print "* PATCH " v[1]}' | \
|
|
427
|
+
uniq; \
|
|
428
|
+
)) || \
|
|
429
|
+
( \
|
|
430
|
+
make --no-print-directory -f$(MAKEFILE) test-show-patch-error; \
|
|
431
|
+
exit 1; \
|
|
432
|
+
) \
|
|
433
|
+
fi;
|
|
434
|
+
|
|
435
|
+
test-check-sp-invoker:
|
|
436
|
+
@set -e -o pipefail; \
|
|
437
|
+
if [ ! -z "`make --no-print-directory -f$(MAKEFILE) test-run-check-sp-invoker`" ]; then \
|
|
438
|
+
echo "ERROR: Enforced security type INVOKER for STORED PROCEDURES"; \
|
|
439
|
+
echo `make --no-print-directory -f$(MAKEFILE) test-run-check-sp-invoker`; \
|
|
440
|
+
exit 1; \
|
|
441
|
+
fi; \
|
|
442
|
+
|
|
443
|
+
test-run-check-sp-invoker:
|
|
444
|
+
@set -e -o pipefail; \
|
|
445
|
+
for schema in `make --no-print-directory -f$(MAKEFILE) schemas`; do \
|
|
446
|
+
mysql -h"mysql" -u"root" \
|
|
447
|
+
-D $$schema --skip-column-names \
|
|
448
|
+
-e "SELECT CONCAT('\`', db, '\`.\`', name, '\`') sp FROM mysql.proc WHERE db = '$$schema' AND type = 'PROCEDURE' AND security_type != 'INVOKER' ORDER BY name"; \
|
|
449
|
+
done;
|
|
450
|
+
|
|
451
|
+
prepare-init:
|
|
452
|
+
@(make --no-print-directory -f$(MAKEFILE) view-init) > $(REPO_PATH)/all.sql
|
|
453
|
+
|
|
454
|
+
prepare-patch:
|
|
455
|
+
@set -e -o pipefail; \
|
|
456
|
+
if [ ! -z "`make --no-print-directory -f$(MAKEFILE) version-first`" ]; then \
|
|
457
|
+
make --no-print-directory -f$(MAKEFILE) prepare-first-init > $(REPO_PATH)/patch.sql; \
|
|
458
|
+
make --no-print-directory -f$(MAKEFILE) view-patch FROM=`make --no-print-directory -f$(MAKEFILE) version-first` >> $(REPO_PATH)/patch.sql; \
|
|
459
|
+
else \
|
|
460
|
+
make --no-print-directory -f$(MAKEFILE) view-init > $(REPO_PATH)/patch.sql; \
|
|
461
|
+
fi; \
|
|
462
|
+
make --no-print-directory -f$(MAKEFILE) tagged 2>/dev/null || \
|
|
463
|
+
make --no-print-directory -f$(MAKEFILE) view-patch FROM="" >> $(REPO_PATH)/patch.sql; \
|
|
464
|
+
|
|
465
|
+
prepare-first-init:
|
|
466
|
+
@for version in `make --no-print-directory -f$(MAKEFILE) version-first`; do \
|
|
467
|
+
for file in `make --no-print-directory -f$(MAKEFILE) version-files VERSION="$$version" | \
|
|
468
|
+
make --no-print-directory -f$(MAKEFILE) version-init-file`; do \
|
|
469
|
+
echo "-- INIT - $$version $$file --"; \
|
|
470
|
+
git --git-dir=$(GIT_PATH) --no-pager show $$file; \
|
|
471
|
+
echo "-- INIT END --"; \
|
|
472
|
+
echo; \
|
|
473
|
+
done; \
|
|
474
|
+
echo; \
|
|
475
|
+
done;
|
|
476
|
+
|
|
477
|
+
view-init: get-init
|
|
478
|
+
|
|
479
|
+
# Based on DEV_MODE.txt file to determine which group of file need to take for different environment needs
|
|
480
|
+
# DEV_MODE.txt file should be remove when version release
|
|
481
|
+
view-patch:
|
|
482
|
+
@if [ -z "$(FROM)" ]; then \
|
|
483
|
+
if [ -f $(REPO_PATH)/DEV_MODE.txt ]; then \
|
|
484
|
+
if (ls $(REPO_PATH)/DEV_7*.sql > /dev/null 2>&1); then \
|
|
485
|
+
(for file in $(REPO_PATH)/DEV_7*.sql; do \
|
|
486
|
+
echo "-- PATCH - HEAD $$file --"; \
|
|
487
|
+
cat $$file; \
|
|
488
|
+
echo; \
|
|
489
|
+
echo "-- PATCH END --"; \
|
|
490
|
+
echo; \
|
|
491
|
+
done) 2>/dev/null; \
|
|
492
|
+
fi; \
|
|
493
|
+
if (ls $(REPO_PATH)/DEV_8*.sql > /dev/null 2>&1); then \
|
|
494
|
+
(for file in $(REPO_PATH)/DEV_8*.sql; do \
|
|
495
|
+
echo "-- PATCH - HEAD $$file --"; \
|
|
496
|
+
cat $$file; \
|
|
497
|
+
echo; \
|
|
498
|
+
echo "-- PATCH END --"; \
|
|
499
|
+
echo; \
|
|
500
|
+
done) 2>/dev/null; \
|
|
501
|
+
fi; \
|
|
502
|
+
else \
|
|
503
|
+
if (ls $(REPO_PATH)/7*.sql > /dev/null 2>&1); then \
|
|
504
|
+
(for file in $(REPO_PATH)/7*.sql; do \
|
|
505
|
+
echo "-- PATCH - HEAD $$file --"; \
|
|
506
|
+
cat $$file; \
|
|
507
|
+
echo; \
|
|
508
|
+
echo "-- PATCH END --"; \
|
|
509
|
+
echo; \
|
|
510
|
+
done) 2>/dev/null; \
|
|
511
|
+
fi; \
|
|
512
|
+
if (ls $(REPO_PATH)/8*.sql > /dev/null 2>&1); then \
|
|
513
|
+
(for file in $(REPO_PATH)/8*.sql; do \
|
|
514
|
+
echo "-- PATCH - HEAD $$file --"; \
|
|
515
|
+
cat $$file; \
|
|
516
|
+
echo; \
|
|
517
|
+
echo "-- PATCH END --"; \
|
|
518
|
+
echo; \
|
|
519
|
+
done) 2>/dev/null; \
|
|
520
|
+
fi; \
|
|
521
|
+
fi; \
|
|
522
|
+
else \
|
|
523
|
+
make --no-print-directory -f$(MAKEFILE) get-patch; \
|
|
524
|
+
fi;
|
|
525
|
+
|
|
526
|
+
view-patch-file:
|
|
527
|
+
@make --no-print-directory -f$(MAKEFILE) get-patch NO_OUT=1
|
|
528
|
+
|
|
529
|
+
get-init:
|
|
530
|
+
@(for file in $(REPO_PATH)/0*.sql; do cat $$file; echo; done) 2>/dev/null; \
|
|
531
|
+
(for file in $(REPO_PATH)/1*.sql; do cat $$file; echo; done) 2>/dev/null; \
|
|
532
|
+
(for file in $(REPO_PATH)/3*.sql; do cat $$file; echo; done) 2>/dev/null; \
|
|
533
|
+
(for file in $(REPO_PATH)/5*.sql; do cat $$file; echo; done) 2>/dev/null; \
|
|
534
|
+
(for file in $(REPO_PATH)/6*.sql; do cat $$file; echo; done) 2>/dev/null; \
|
|
535
|
+
(for file in $(REPO_PATH)/910_*.sql; do cat $$file; echo; done) 2>/dev/null; \
|
|
536
|
+
(cat $(REPO_PATH)/VERSION.sql 2>/dev/null); echo;
|
|
537
|
+
|
|
538
|
+
# Combine all the 7XX script from installed version to target version (including current repo if it is not tagged)
|
|
539
|
+
get-patch:
|
|
540
|
+
@make --no-print-directory -f$(MAKEFILE) get-prepare-patch | \
|
|
541
|
+
(cat - $(REPO_PATH)/VERSION.sql 2>/dev/null || cat -) | awk 'BEGIN { printf("\n") } { print }';
|
|
542
|
+
|
|
543
|
+
get-prepare-patch:
|
|
544
|
+
@for version in `make --no-print-directory -f$(MAKEFILE) version-range`; do \
|
|
545
|
+
for file in `make --no-print-directory -f$(MAKEFILE) version-files VERSION="$$version" | \
|
|
546
|
+
make --no-print-directory -f$(MAKEFILE) version-patch-file`; do \
|
|
547
|
+
echo "-- PATCH - $$version $$file --"; \
|
|
548
|
+
if [ -z "$(NO_OUT)" ]; then \
|
|
549
|
+
git --git-dir=$(GIT_PATH) --no-pager show $$file; \
|
|
550
|
+
echo; \
|
|
551
|
+
echo "-- PATCH END --"; \
|
|
552
|
+
echo; \
|
|
553
|
+
fi; \
|
|
554
|
+
done; \
|
|
555
|
+
done
|
|
556
|
+
|
|
557
|
+
# Retrieve all the version from the installed version to target version
|
|
558
|
+
version-range:
|
|
559
|
+
@set -e -o pipefail; \
|
|
560
|
+
git --git-dir=$(GIT_PATH) tag --sort=creatordate | \
|
|
561
|
+
awk 'BEGIN { \
|
|
562
|
+
from = 0; \
|
|
563
|
+
to = 0; \
|
|
564
|
+
} \
|
|
565
|
+
{ \
|
|
566
|
+
if (from == 0) { \
|
|
567
|
+
if ($$1 != ENVIRON["FROM"]) { \
|
|
568
|
+
next; \
|
|
569
|
+
} \
|
|
570
|
+
from = 1; \
|
|
571
|
+
next; \
|
|
572
|
+
} \
|
|
573
|
+
if (to == 0) { \
|
|
574
|
+
if ($$1 == ENVIRON["TO"]) { \
|
|
575
|
+
to = 1; \
|
|
576
|
+
} \
|
|
577
|
+
if (ENVIRON["PRERELEASE_TAG"] == "true") { \
|
|
578
|
+
if (0 < index($$1, "-rc")) { \
|
|
579
|
+
print $$1; \
|
|
580
|
+
} \
|
|
581
|
+
} \
|
|
582
|
+
else { \
|
|
583
|
+
if (0 == index($$1, "-rc")) { \
|
|
584
|
+
print $$1; \
|
|
585
|
+
} \
|
|
586
|
+
} \
|
|
587
|
+
} \
|
|
588
|
+
}'
|
|
589
|
+
|
|
590
|
+
# Retrieve all the file according to environment variable VERSION
|
|
591
|
+
version-files:
|
|
592
|
+
@for file in `git --git-dir=$(GIT_PATH) ls-tree --name-only $(VERSION):`; \
|
|
593
|
+
do \
|
|
594
|
+
echo "$$file" | awk 'END { printf("%s==>", $$0) }'; \
|
|
595
|
+
git --git-dir=$(GIT_PATH) log --pretty=short $(VERSION) -- $$file | grep commit | cut -b8- | head -n 1; \
|
|
596
|
+
done;
|
|
597
|
+
|
|
598
|
+
# Filter out 7XX script and 8XX script
|
|
599
|
+
version-init-file:
|
|
600
|
+
@awk -F"==>" '{ \
|
|
601
|
+
file = $$1; \
|
|
602
|
+
if (file ~ /^[0-6|9][0-9][0-9][_-].*[.]sql$$/) { \
|
|
603
|
+
hash = $$2; \
|
|
604
|
+
print hash ":" file; \
|
|
605
|
+
} \
|
|
606
|
+
}'
|
|
607
|
+
|
|
608
|
+
# Filter for 7XX script and 8XX script
|
|
609
|
+
version-patch-file:
|
|
610
|
+
@awk -F"==>" '{ \
|
|
611
|
+
file = $$1; \
|
|
612
|
+
if (file ~ /^[7|8][0-9][0-9][_-].*[.]sql$$/) { \
|
|
613
|
+
hash = $$2; \
|
|
614
|
+
print hash ":" file; \
|
|
615
|
+
} \
|
|
616
|
+
}'
|
|
617
|
+
|
|
618
|
+
# Check wheather the cloned repo has been tagged or not
|
|
619
|
+
tagged:
|
|
620
|
+
@if [ -z "$(FROM)" ]; then \
|
|
621
|
+
export FROM=HEAD; \
|
|
622
|
+
fi; \
|
|
623
|
+
for tag in `git --git-dir=$(GIT_PATH) describe --tags $$(git --git-dir=$(GIT_PATH) rev-parse $(FROM))`; do \
|
|
624
|
+
for version in `make --no-print-directory -f$(MAKEFILE) versions`; do \
|
|
625
|
+
if [ $$tag == $$version ]; then \
|
|
626
|
+
exit 0; \
|
|
627
|
+
fi; \
|
|
628
|
+
done; \
|
|
629
|
+
done; \
|
|
630
|
+
exit 1;
|
|
631
|
+
|
|
632
|
+
# Retrieve all the tagged version
|
|
633
|
+
versions:
|
|
634
|
+
@(git tag --sort=-creatordate || echo) | \
|
|
635
|
+
awk '{ \
|
|
636
|
+
if (ENVIRON["PRERELEASE_TAG"] == "false") { \
|
|
637
|
+
if (0 == index($$1, "-rc")) { \
|
|
638
|
+
print $$1; \
|
|
639
|
+
} \
|
|
640
|
+
} \
|
|
641
|
+
else { \
|
|
642
|
+
print $$1; \
|
|
643
|
+
} \
|
|
644
|
+
}' | \
|
|
645
|
+
awk NF
|
|
646
|
+
|
|
647
|
+
# Get the installed version number from database
|
|
648
|
+
version-get:
|
|
649
|
+
@if [ ! -z "$$VERSION" ]; then \
|
|
650
|
+
echo -n $$VERSION; \
|
|
651
|
+
exit 0; \
|
|
652
|
+
fi;
|
|
653
|
+
@set -e; set -o pipefail; cat $(REPO_PATH)/GET_VERSION.sql | \
|
|
654
|
+
awk '{ gsub(/\{\{VERSION\}\}/, ENVIRON["GIT_TAG"], $$0); print }' | \
|
|
655
|
+
mysql -h"$(HOST_IP)" -u"$(USERNAME)" -p"$(PASSWORD)" | \
|
|
656
|
+
awk 'NR==2 { printf("%s", $$0) }'
|
|
657
|
+
|
|
658
|
+
# Set the target version number into database
|
|
659
|
+
# {{VERSION}} keyword will be replace by GIT_TAG value
|
|
660
|
+
# {{CI_PIPELINE_URL}} keyword will be replace by CI pipeline URL
|
|
661
|
+
version-set: prerequisite
|
|
662
|
+
@cat $(REPO_PATH)/SET_VERSION.sql | \
|
|
663
|
+
awk '{ gsub(/\{\{VERSION\}\}/, ENVIRON["GIT_TAG"], $$0); print }' | \
|
|
664
|
+
awk '{ gsub(/\{\{CI_PIPELINE_URL\}\}/, ENVIRON["CI_PIPELINE_URL"], $$0); print }' > $(REPO_PATH)/VERSION.sql
|
|
665
|
+
|
|
666
|
+
# Prerequisite check wheather the get & set version methods are exists
|
|
667
|
+
prerequisite:
|
|
668
|
+
@if [ ! -f $(REPO_PATH)/GET_VERSION.sql ]; then \
|
|
669
|
+
echo "MISSING GET_VERSION SCRIPT!!" && exit 1; \
|
|
670
|
+
else \
|
|
671
|
+
if [ ! -f $(REPO_PATH)/SET_VERSION.sql ]; then \
|
|
672
|
+
echo "MISSING SET_VERSION SCRIPT!!" && exit 1; \
|
|
673
|
+
fi; \
|
|
674
|
+
fi;
|
|
675
|
+
|
|
676
|
+
pre-build: version-prerelease
|
|
677
|
+
|
|
678
|
+
build: version-patch
|
|
679
|
+
|
|
680
|
+
name:
|
|
681
|
+
@echo -n $(PROJECT_NAME)
|
|
682
|
+
|
|
683
|
+
separator:
|
|
684
|
+
@echo -n ":"
|
|
685
|
+
|
|
686
|
+
image: name separator version
|
|
687
|
+
|
|
688
|
+
version:
|
|
689
|
+
@cat package.json | jq -r '.version'
|
|
690
|
+
|
|
691
|
+
version-major: version-sync
|
|
692
|
+
@npm -s version major --no-git-tag-version
|
|
693
|
+
|
|
694
|
+
version-minor: version-sync
|
|
695
|
+
@npm -s version minor --no-git-tag-version
|
|
696
|
+
|
|
697
|
+
version-patch: version-sync
|
|
698
|
+
@npm -s version patch --no-git-tag-version
|
|
699
|
+
|
|
700
|
+
version-prerelease: version-sync
|
|
701
|
+
@npm -s version prerelease --preid=rc --no-git-tag-version
|
|
702
|
+
|
|
703
|
+
version-first:
|
|
704
|
+
@(git tag --sort=-creatordate || echo) | tac | awk 'NR==1 { \
|
|
705
|
+
split($$0, n, "-"); \
|
|
706
|
+
if (n[1] != "") { \
|
|
707
|
+
split(n[1], v, "."); \
|
|
708
|
+
if (v[1] ~ /^[0-9]+$$/ && v[2] ~ /^[0-9]+$$/ && v[3] ~ /^[0-9]+$$/) { \
|
|
709
|
+
if (ENVIRON["PRERELEASE_TAG"] == "true") { \
|
|
710
|
+
printf("%s", $$0); \
|
|
711
|
+
exit 0; \
|
|
712
|
+
} \
|
|
713
|
+
else { \
|
|
714
|
+
if (0 == index($$0, "-rc")) { \
|
|
715
|
+
printf("%s", $$0); \
|
|
716
|
+
exit 0; \
|
|
717
|
+
} \
|
|
718
|
+
} \
|
|
719
|
+
} \
|
|
720
|
+
} \
|
|
721
|
+
}'
|
|
722
|
+
|
|
723
|
+
version-latest:
|
|
724
|
+
@(git tag --sort=-creatordate || echo) | awk 'NR==1 { \
|
|
725
|
+
split($$0, n, "-"); \
|
|
726
|
+
if (n[1] != "") { \
|
|
727
|
+
split(n[1], v, "."); \
|
|
728
|
+
if (v[1] ~ /^[0-9]+$$/ && v[2] ~ /^[0-9]+$$/ && v[3] ~ /^[0-9]+$$/) { \
|
|
729
|
+
if (ENVIRON["PRERELEASE_TAG"] == "true") { \
|
|
730
|
+
printf("%s", $$0); \
|
|
731
|
+
exit 0; \
|
|
732
|
+
} \
|
|
733
|
+
else { \
|
|
734
|
+
if (0 == index($$0, "-rc")) { \
|
|
735
|
+
printf("%s", $$0); \
|
|
736
|
+
exit 0; \
|
|
737
|
+
} \
|
|
738
|
+
} \
|
|
739
|
+
} \
|
|
740
|
+
} \
|
|
741
|
+
}'
|
|
742
|
+
|
|
743
|
+
version-previous:
|
|
744
|
+
@if [ -z "$(FROM)" ]; then \
|
|
745
|
+
export FROM=HEAD; \
|
|
746
|
+
fi; \
|
|
747
|
+
git log --format="%D" `git rev-parse $(FROM)` | grep tag | awk NF | \
|
|
748
|
+
awk '{ \
|
|
749
|
+
split($$0, n, "tag: "); \
|
|
750
|
+
if ("" != n[2]) { \
|
|
751
|
+
split(n[2], v, ", "); \
|
|
752
|
+
if (ENVIRON["PRERELEASE_TAG"] == "true" || 0 == index(v[1], "-rc")) { \
|
|
753
|
+
printf("%s", v[1]); \
|
|
754
|
+
exit 0; \
|
|
755
|
+
} \
|
|
756
|
+
} \
|
|
757
|
+
}'
|
|
758
|
+
|
|
759
|
+
version-sync:
|
|
760
|
+
@if [ ! -z "$(CI_COMMIT_BRANCH)" ]; then \
|
|
761
|
+
git checkout $(CI_COMMIT_BRANCH); \
|
|
762
|
+
fi;
|
|
763
|
+
@git pull 2>/dev/null || true
|
|
764
|
+
@git pull --tags 2>/dev/null || true
|
|
765
|
+
@git tag --sort=-creatordate | head -10
|
|
766
|
+
@echo '{"version": ""}' | jq -r --arg PKG_VERSION `(make --no-print-directory -f$(MAKEFILE) version-latest PRERELEASE_TAG=true) | \
|
|
767
|
+
awk 'END{ \
|
|
768
|
+
if (0 == NR) { \
|
|
769
|
+
printf("1.0.0-rc.0"); \
|
|
770
|
+
} \
|
|
771
|
+
else { \
|
|
772
|
+
print; \
|
|
773
|
+
} \
|
|
774
|
+
}'` '.version=$$PKG_VERSION' > package.json;
|
|
775
|
+
@echo -n "Current Git tag: "; cat package.json | jq -r '.version'
|
|
776
|
+
|
|
777
|
+
sync: version-sync
|
|
778
|
+
@docker-compose up --no-deps --build --force-recreate --abort-on-container-exit mysql run-sync || \
|
|
779
|
+
((docker-compose down --remove-orphans -v --rmi local | true); exit 1)
|
|
780
|
+
@docker-compose down --remove-orphans -v --rmi local | true
|
|
781
|
+
@echo ">>== DONE ==<<"
|
|
782
|
+
|
|
783
|
+
run-sync: prepare-init wait-for
|
|
784
|
+
@echo ">>== SYNC ==<<"
|
|
785
|
+
@cat $(REPO_PATH)/all.sql | awk 'BEGIN { line = 0 } { printf("%06d %s\n", ++line, $$0) }'
|
|
786
|
+
@echo ">>== SYNC ==<<"
|
|
787
|
+
@set -e -o pipefail; \
|
|
788
|
+
(cat $(REPO_PATH)/all.sql | mysql --abort-source-on-error=1 -h"mysql" -u"root")
|
|
789
|
+
|
|
790
|
+
## generata insert statement for nm_email_template,required ${TEMPLATE_CODE}-en_US-content.html file to generate new record,
|
|
791
|
+
## other locale only required ${LOCALE}-content.html & ${LOCALE}-subject.html
|
|
792
|
+
gen-update-statement-email-template-file:
|
|
793
|
+
@make --no-print-directory -f$(MAKEFILE) update-statement-email-template | \
|
|
794
|
+
awk '{ lines = lines $$0 "\n"; } END{ printf("%s;", substr(lines,0,length(lines)-2))}' > push.sh;
|
|
795
|
+
|
|
796
|
+
update-statement-email-template:
|
|
797
|
+
@echo "INSERT INTO \`nm_email_template\` (\`id\`,\`name\`,\`code\`,\`desc\`,\`content\`,\`stored_procedure\`,\`provider_id\`,\`grp\`,\`type\`,\`flag\`,\`status\`,\`cby\`,\`cdate\`,\`mby\`,\`mdate\`,\`aby\`,\`adate\`,\`remarks\`) VALUES";
|
|
798
|
+
@for file in `make --no-print-directory -f$(MAKEFILE) email-template-file`; do \
|
|
799
|
+
echo "(" | tr -d \\n; \
|
|
800
|
+
cat `echo $$file | awk '{ f=$$1; gsub("-content","-id",f); printf(f)}'` | tr -d \\n; \
|
|
801
|
+
TEMPLATECODE=`echo "$$file" | awk -F":" '{ \
|
|
802
|
+
m = split($$1, a, "/"); \
|
|
803
|
+
fileName = a[m]; \
|
|
804
|
+
n = split(fileName, a, "-"); \
|
|
805
|
+
code = a[1]; \
|
|
806
|
+
printf(code); \
|
|
807
|
+
}'`; \
|
|
808
|
+
echo ",'$$TEMPLATECODE','$$TEMPLATECODE',NULL," | tr -d \\n; \
|
|
809
|
+
TOTALFILES=`find $(REPO_PATH)/Email-Templates/Individual -iname "$$TEMPLATECODE-*-content.html" | wc -l`; \
|
|
810
|
+
f=0; \
|
|
811
|
+
echo "'{" | tr -d \\n; \
|
|
812
|
+
for localFile in `find $(REPO_PATH)/Email-Templates/Individual -iname "$$TEMPLATECODE-*-content.html" | sort -n`; do \
|
|
813
|
+
f=$$((f + 1)); \
|
|
814
|
+
LOCALE=`echo "$$localFile" | awk -F":" '{ \
|
|
815
|
+
m = split($$1, a, "/"); \
|
|
816
|
+
fileName = a[m]; \
|
|
817
|
+
n = split(fileName, a, "-"); \
|
|
818
|
+
locale = a[2]; \
|
|
819
|
+
printf(locale); \
|
|
820
|
+
}'`; \
|
|
821
|
+
echo "\"$$LOCALE\":{\"subject\":\"" | tr -d \\n; \
|
|
822
|
+
cat `echo $$localFile | awk '{ f=$$1; gsub("-content","-subject",f); printf(f)}'` | base64 | tr -d \\n; \
|
|
823
|
+
echo "\",\"content\":\"" | tr -d \\n; \
|
|
824
|
+
cat `echo $$localFile` | base64 | tr -d \\n; \
|
|
825
|
+
if (( f == TOTALFILES ));then \
|
|
826
|
+
echo "\"}" | tr -d \\n; \
|
|
827
|
+
else \
|
|
828
|
+
echo "\"}," | tr -d \\n; \
|
|
829
|
+
fi \
|
|
830
|
+
done; \
|
|
831
|
+
echo "}','" | tr -d \\n; \
|
|
832
|
+
cat `echo $$file | awk '{ f=$$1; gsub("-content","-sp",f); printf(f)}'` | tr -d \\n; \
|
|
833
|
+
echo "',1,0,0,0,1,'SYS',UTC_TIMESTAMP(),'SYS',UTC_TIMESTAMP(),NULL,NULL,NULL),"; \
|
|
834
|
+
done;
|
|
835
|
+
|
|
836
|
+
email-template-file:
|
|
837
|
+
@find $(REPO_PATH)/Email-Templates/Individual -iname "*-en_US-content.html"
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
bus-gen-insert-statement-email-template-file:
|
|
841
|
+
@make --no-print-directory -f$(MAKEFILE) bus-insert-statement-email-template | \
|
|
842
|
+
awk '{ lines = lines $$0 "\n"; } END{ printf("%s;", substr(lines,0,length(lines)-2))}' > push.sh;
|
|
843
|
+
|
|
844
|
+
bus-insert-statement-email-template:
|
|
845
|
+
@echo "INSERT INTO \`nm_email_template\` (\`id\`,\`name\`,\`code\`,\`desc\`,\`content\`,\`stored_procedure\`,\`provider_id\`,\`grp\`,\`type\`,\`flag\`,\`status\`,\`cby\`,\`cdate\`,\`mby\`,\`mdate\`,\`aby\`,\`adate\`,\`remarks\`) VALUES";
|
|
846
|
+
@for file in `make --no-print-directory -f$(MAKEFILE) bus-email-template-file`; do \
|
|
847
|
+
echo "(" | tr -d \\n; \
|
|
848
|
+
cat `echo $$file | awk '{ f=$$1; gsub("-content","-id",f); printf(f)}'` | tr -d \\n; \
|
|
849
|
+
TEMPLATECODE=`echo "$$file" | awk -F":" '{ \
|
|
850
|
+
m = split($$1, a, "/"); \
|
|
851
|
+
fileName = a[m]; \
|
|
852
|
+
n = split(fileName, a, "-"); \
|
|
853
|
+
code = a[1]; \
|
|
854
|
+
printf(code); \
|
|
855
|
+
}'`; \
|
|
856
|
+
echo ",'$$TEMPLATECODE','$$TEMPLATECODE',NULL," | tr -d \\n; \
|
|
857
|
+
TOTALFILES=`find $(REPO_PATH)/Email-Templates/Enterprise -iname "$$TEMPLATECODE-*-content.html" | wc -l`; \
|
|
858
|
+
f=0; \
|
|
859
|
+
echo "'{" | tr -d \\n; \
|
|
860
|
+
for localFile in `find $(REPO_PATH)/Email-Templates/Enterprise -iname "$$TEMPLATECODE-*-content.html" | sort -n`; do \
|
|
861
|
+
f=$$((f + 1)); \
|
|
862
|
+
LOCALE=`echo "$$localFile" | awk -F":" '{ \
|
|
863
|
+
m = split($$1, a, "/"); \
|
|
864
|
+
fileName = a[m]; \
|
|
865
|
+
n = split(fileName, a, "-"); \
|
|
866
|
+
locale = a[2]; \
|
|
867
|
+
printf(locale); \
|
|
868
|
+
}'`; \
|
|
869
|
+
echo "\"$$LOCALE\":{\"subject\":\"" | tr -d \\n; \
|
|
870
|
+
cat `echo $$localFile | awk '{ f=$$1; gsub("-content","-subject",f); printf(f)}'` | base64 | tr -d \\n; \
|
|
871
|
+
echo "\",\"content\":\"" | tr -d \\n; \
|
|
872
|
+
cat `echo $$localFile` | base64 | tr -d \\n; \
|
|
873
|
+
if (( f == TOTALFILES ));then \
|
|
874
|
+
echo "\"}" | tr -d \\n; \
|
|
875
|
+
else \
|
|
876
|
+
echo "\"}," | tr -d \\n; \
|
|
877
|
+
fi \
|
|
878
|
+
done; \
|
|
879
|
+
echo "}','" | tr -d \\n; \
|
|
880
|
+
cat `echo $$file | awk '{ f=$$1; gsub("-content","-sp",f); printf(f)}'` | tr -d \\n; \
|
|
881
|
+
echo "',1,0,0,0,1,'SYS',UTC_TIMESTAMP(),'SYS',UTC_TIMESTAMP(),NULL,NULL,NULL),"; \
|
|
882
|
+
done;
|
|
883
|
+
|
|
884
|
+
bus-email-template-file:
|
|
885
|
+
@find $(REPO_PATH)/Email-Templates/Enterprise -iname "*-en_US-content.html"
|