github.com/mhlo/force@v0.22.28-0.20150915022417-6d05ecfb0b47/import.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "os/user" 8 "path/filepath" 9 "strings" 10 ) 11 12 var cmdImport = &Command{ 13 Usage: "import [deployment options]", 14 Short: "Import metadata from a local directory", 15 Long: ` 16 Import metadata from a local directory 17 18 Deployment Options 19 -rollbackonerror, -r Indicates whether any failure causes a complete rollback 20 -runalltests, -t If set all Apex tests defined in the organization are run 21 -checkonly, -c Indicates whether classes and triggers are saved during deployment 22 -purgeondelete, -p If set the deleted components are not stored in recycle bin 23 -allowmissingfiles, -m Specifies whether a deploy succeeds even if files missing 24 -autoupdatepackage, -u Auto add files to the package if missing 25 -ignorewarnings, -i Indicates if warnings should fail deployment or not 26 -directory, -d Path to the package.xml file to import 27 -verbose, -v Provide detailed feedback on operation 28 29 Examples: 30 31 force import 32 33 force import -directory=my_metadata -c -r -v 34 35 force import -checkonly -runalltests 36 `, 37 } 38 39 var ( 40 rollBackOnErrorFlag = cmdImport.Flag.Bool("rollbackonerror", false, "set roll back on error") 41 runAllTestsFlag = cmdImport.Flag.Bool("runalltests", false, "set run all tests") 42 checkOnlyFlag = cmdImport.Flag.Bool("checkonly", false, "set check only") 43 purgeOnDeleteFlag = cmdImport.Flag.Bool("purgeondelete", false, "set purge on delete") 44 allowMissingFilesFlag = cmdImport.Flag.Bool("allowmissingfiles", false, "set allow missing files") 45 autoUpdatePackageFlag = cmdImport.Flag.Bool("autoupdatepackage", false, "set auto update package") 46 ignoreWarningsFlag = cmdImport.Flag.Bool("ignorewarnings", false, "set ignore warnings") 47 directory = cmdImport.Flag.String("directory", "metadata", "relative path to package.xml") 48 verbose = cmdImport.Flag.Bool("verbose", false, "give more verbose output") 49 ) 50 51 func init() { 52 cmdImport.Run = runImport 53 cmdImport.Flag.BoolVar(verbose, "v", false, "give more verbose output") 54 cmdImport.Flag.BoolVar(rollBackOnErrorFlag, "r", false, "set roll back on error") 55 cmdImport.Flag.BoolVar(runAllTestsFlag, "t", false, "set run all tests") 56 cmdImport.Flag.BoolVar(checkOnlyFlag, "c", false, "set check only") 57 cmdImport.Flag.BoolVar(purgeOnDeleteFlag, "p", false, "set purge on delete") 58 cmdImport.Flag.BoolVar(allowMissingFilesFlag, "m", false, "set allow missing files") 59 cmdImport.Flag.BoolVar(autoUpdatePackageFlag, "u", false, "set auto update package") 60 cmdImport.Flag.BoolVar(ignoreWarningsFlag, "i", false, "set ignore warnings") 61 cmdImport.Flag.StringVar(directory, "d", "metadata", "relative path to package.xml") 62 } 63 64 func runImport(cmd *Command, args []string) { 65 if len(args) > 0 { 66 ErrorAndExit("Unrecognized argument: " + args[0]) 67 } 68 69 wd, _ := os.Getwd() 70 usr, err := user.Current() 71 var dir string 72 73 //Manually handle shell expansion short cut 74 if err != nil { 75 if strings.HasPrefix(*directory, "~") { 76 ErrorAndExit("Cannot determine tilde expansion, please use relative or absolute path to directory.") 77 } else { 78 dir = *directory 79 } 80 } else { 81 if strings.HasPrefix(*directory, "~") { 82 dir = strings.Replace(*directory, "~", usr.HomeDir, 1) 83 } else { 84 dir = *directory 85 } 86 } 87 88 root := filepath.Join(wd, dir) 89 90 // Check for absolute path 91 if filepath.IsAbs(dir) { 92 root = dir 93 } 94 95 force, _ := ActiveForce() 96 files := make(ForceMetadataFiles) 97 if _, err := os.Stat(filepath.Join(root, "package.xml")); os.IsNotExist(err) { 98 ErrorAndExit(" \n" + filepath.Join(root, "package.xml") + "\ndoes not exist") 99 } 100 101 err = filepath.Walk(root, func(path string, f os.FileInfo, err error) error { 102 if f.Mode().IsRegular() { 103 if f.Name() != ".DS_Store" { 104 data, err := ioutil.ReadFile(path) 105 if err != nil { 106 ErrorAndExit(err.Error()) 107 } 108 files[strings.Replace(path, fmt.Sprintf("%s%s", root, string(os.PathSeparator)), "", -1)] = data 109 } 110 } 111 return nil 112 }) 113 if err != nil { 114 ErrorAndExit(err.Error()) 115 } 116 var DeploymentOptions ForceDeployOptions 117 DeploymentOptions.AllowMissingFiles = *allowMissingFilesFlag 118 DeploymentOptions.AutoUpdatePackage = *autoUpdatePackageFlag 119 DeploymentOptions.CheckOnly = *checkOnlyFlag 120 DeploymentOptions.IgnoreWarnings = *ignoreWarningsFlag 121 DeploymentOptions.PurgeOnDelete = *purgeOnDeleteFlag 122 DeploymentOptions.RollbackOnError = *rollBackOnErrorFlag 123 DeploymentOptions.RunAllTests = *runAllTestsFlag 124 125 successes, problems, err := force.Metadata.Deploy(files, DeploymentOptions) 126 if err != nil { 127 ErrorAndExit(err.Error()) 128 } 129 130 fmt.Printf("\nFailures - %d\n", len(problems)) 131 if *verbose { 132 for _, problem := range problems { 133 if problem.FullName == "" { 134 fmt.Println(problem.Problem) 135 } else { 136 fmt.Printf("%s: %s\n", problem.FullName, problem.Problem) 137 } 138 } 139 } 140 141 fmt.Printf("\nSuccesses - %d\n", len(successes)) 142 if *verbose { 143 for _, success := range successes { 144 if success.FullName != "package.xml" { 145 verb := "unchanged" 146 if success.Changed { 147 verb = "changed" 148 } else if success.Deleted { 149 verb = "deleted" 150 } else if success.Created { 151 verb = "created" 152 } 153 fmt.Printf("%s\n\tstatus: %s\n\tid=%s\n", success.FullName, verb, success.Id) 154 } 155 } 156 } 157 fmt.Printf("Imported from %s\n", root) 158 }