-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
173 lines (148 loc) · 5.43 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
package main
import (
"bufio"
"flag"
"fmt"
"log"
"os"
"os/exec"
"strings"
"github.com/pkg/errors"
)
const envPath = "GOSFANTPROJECTPATH"
var dFlag = flag.String("d", "", "a path to the directory where go-sf-ant will create the ANT project")
var packageXMLString = `<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>*</members>
<name>ApexClass</name>
</types>
<types>
<members>*</members>
<name>ApexComponent</name>
</types>
<types>
<members>*</members>
<name>ApexPage</name>
</types>
<types>
<members>*</members>
<name>ApexTrigger</name>
</types>
<types>
<members>*</members>
<name>AuraDefinitionBundle</name>
</types>
<types>
<members>*</members>
<name>StaticResource</name>
</types>
<version>48.0</version>
</Package>`
var buildXMLString = `<project name="antProject" default="main" basedir="." xmlns:sf="antlib:com.salesforce">
<property file="build.properties"/>
<property environment="env"/>
<!-- Setting default value for username, password and session id properties to empty string
so unset values are treated as empty. Without this, ant expressions such as ${sf.username}
will be treated literally. -->
<condition property="sf.username" value=""> <not> <isset property="sf.username"/> </not> </condition>
<condition property="sf.password" value=""> <not> <isset property="sf.password"/> </not> </condition>
<condition property="sf.sessionId" value=""> <not> <isset property="sf.sessionId"/> </not> </condition>
<condition property="sfdeploy.username" value=""> <not> <isset property="sfdeploy.username"/> </not> </condition>
<condition property="sfdeploy.password" value=""> <not> <isset property="sfdeploy.password"/> </not> </condition>
<condition property="sfdeploy.sessionId" value=""> <not> <isset property="sfdeploy.sessionId"/> </not> </condition>
<taskdef resource="com/salesforce/antlib.xml" uri="antlib:com.salesforce">
<classpath>
<pathelement location="../ant-salesforce.jar" />
</classpath>
</taskdef>
<target name="retrieve">
<sf:retrieve
username="${sf.username}"
password="${sf.password}"
serverurl="${sf.serverurl}"
maxPoll="${sf.maxPoll}"
retrieveTarget="src"
unpackaged="src/package.xml"/>
</target>
<target name="deploy">
<sf:deploy
username="${sfdeploy.username}"
password="${sfdeploy.password}"
serverurl="${sfdeploy.serverurl}"
checkOnly="true"
maxPoll="${sfdeploy.maxPoll}"
deployRoot="src"
rollbackOnError="true">
</sf:deploy>
</target>
</project>`
var buildPropertiesString = `# Retrieve from Org:
# Specify the login credentials for the desired Salesforce organization
sf.username =
sf.password =
#sf.sessionId = <Insert your Salesforce session id here. Use this or username/password above. Cannot use both>
#sf.pkgName = <Insert comma separated package names to be retrieved>
#sf.zipFile = <Insert path of the zipfile to be retrieved>
#sf.metadataType = <Insert metadata type name for which listMetadata or bulkRetrieve operations are to be performed>
# Use 'https://login.salesforce.com' for production or developer edition (the default if not specified).
# Use 'https://test.salesforce.com for sandbox.
sf.serverurl = https://test.salesforce.com
sf.maxPoll = 20
# If your network requires an HTTP proxy, see http://ant.apache.org/manual/proxy.html for configuration.
# Deploy to Org:
sfdeploy.username =
sfdeploy.password =
sfdeploy.serverurl = https://login.salesforce.com
sfdeploy.maxPoll = 20`
func main() {
var projectPath string
flag.Parse()
if *dFlag != "" {
customProjectPath := *dFlag
for !strings.HasPrefix(customProjectPath, "/") || !strings.HasSuffix(customProjectPath, "/") {
fmt.Println("Dirctory paths must begin and end with '/'. Please enter a valid direcotry path (ex: '/Users/username/documents/'")
var err error
customProjectPath, err = bufio.NewReader(os.Stdin).ReadString('\n')
checkErr(err)
customProjectPath = strings.Replace(customProjectPath, "\n", "", -1)
projectPath = customProjectPath
}
}
if projectPath == "" {
if value, ok := os.LookupEnv(envPath); ok {
projectPath = value
} else {
dir, err := os.Getwd()
checkErr(err)
projectPath = dir + "/"
}
}
fmt.Println("What would you like to name the new ANT project folder?")
projectFolderName, err := bufio.NewReader(os.Stdin).ReadString('\n')
checkErr(err)
projectFolderName = strings.Replace(projectFolderName, "\n", "", -1)
// Create empty directories for proejct
checkErr(os.MkdirAll(projectPath+projectFolderName, os.ModePerm))
checkErr(os.MkdirAll(projectPath+projectFolderName+"/src/", os.ModePerm))
// Create build files and package.xml from temp
createFile(projectPath+projectFolderName+"/src/package.xml", packageXMLString)
createFile(projectPath+projectFolderName+"/build.xml", buildXMLString)
createFile(projectPath+projectFolderName+"/build.properties", buildPropertiesString)
cmd := exec.Command("code", ".")
cmd.Dir = projectPath + projectFolderName
checkErr(cmd.Run())
}
func checkErr(e error) {
if e != nil {
log.Fatal(e)
}
}
func createFile(fullNamedPath string, fileString string) {
file, err := os.Create(fullNamedPath)
if err != nil {
errors.Wrap(err, "Cannot create file")
}
defer file.Close()
fmt.Fprintf(file, fileString)
}