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  }