github.com/hwaf/hwaf@v0.0.0-20140814122253-5465f73b20f1/cmd_init.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"runtime"
    10  	"strings"
    11  
    12  	"github.com/gonuts/commander"
    13  	"github.com/gonuts/flag"
    14  	"github.com/hwaf/gas"
    15  )
    16  
    17  func hwaf_make_cmd_init() *commander.Command {
    18  	cmd := &commander.Command{
    19  		Run:       hwaf_run_cmd_init,
    20  		UsageLine: "init [options] <workarea>",
    21  		Short:     "initialize a new workarea",
    22  		Long: `
    23  init initializes a new workarea.
    24  
    25  ex:
    26   $ hwaf init
    27   $ hwaf init .
    28   $ hwaf init my-work-area
    29  `,
    30  		Flag: *flag.NewFlagSet("hwaf-init", flag.ExitOnError),
    31  	}
    32  	cmd.Flag.Bool("v", false, "enable verbose output")
    33  	return cmd
    34  }
    35  
    36  func hwaf_run_cmd_init(cmd *commander.Command, args []string) error {
    37  	var err error
    38  	n := "hwaf-" + cmd.Name()
    39  	dirname := ""
    40  
    41  	switch len(args) {
    42  	case 0:
    43  		dirname = "."
    44  	case 1:
    45  		dirname = args[0]
    46  	default:
    47  		return fmt.Errorf("%s: you need to give a directory name", n)
    48  	}
    49  
    50  	dirname = os.ExpandEnv(dirname)
    51  	dirname = filepath.Clean(dirname)
    52  
    53  	verbose := cmd.Flag.Lookup("v").Value.Get().(bool)
    54  	proj_name := dirname
    55  	if proj_name == "." {
    56  		pwd, err := os.Getwd()
    57  		if err != nil {
    58  			return err
    59  		}
    60  		proj_name = filepath.Base(pwd)
    61  	} else {
    62  		proj_name = filepath.Base(dirname)
    63  	}
    64  
    65  	if verbose {
    66  		fmt.Printf("%s: creating workarea [%s]...\n", n, dirname)
    67  	}
    68  
    69  	if !path_exists(dirname) {
    70  		err = os.MkdirAll(dirname, 0700)
    71  		if err != nil {
    72  			return err
    73  		}
    74  	}
    75  
    76  	pwd, err := os.Getwd()
    77  	if err != nil {
    78  		return err
    79  	}
    80  	defer os.Chdir(pwd)
    81  
    82  	err = os.Chdir(dirname)
    83  	if err != nil {
    84  		return err
    85  	}
    86  
    87  	// setup hep-waf-tools
    88  	if verbose {
    89  		fmt.Printf("%s: add .hwaf/tools...\n", n)
    90  	}
    91  	hwaf_tools_dir := ""
    92  	switch g_ctx.Root {
    93  	default:
    94  		hwaf_tools_dir = filepath.Join(g_ctx.Root, "share", "hwaf", "tools")
    95  	case "":
    96  		hwaf_tools_dir, err = gas.Abs("github.com/hwaf/hwaf/py-hwaftools")
    97  		if err != nil {
    98  			return err
    99  		}
   100  	}
   101  
   102  	hwaf_tools_dir = os.ExpandEnv(hwaf_tools_dir)
   103  	if verbose {
   104  		fmt.Printf("%s: using hwaf/tools from [%s]...\n", n, hwaf_tools_dir)
   105  	}
   106  	if !path_exists(hwaf_tools_dir) {
   107  		return fmt.Errorf("no such directory [%s]", hwaf_tools_dir)
   108  	}
   109  	if !path_exists(".hwaf") {
   110  		err = os.MkdirAll(".hwaf", 0700)
   111  		if err != nil {
   112  			return err
   113  		}
   114  	}
   115  
   116  	// add waf-bin
   117  	{
   118  		if verbose {
   119  			fmt.Printf("%s: add .hwaf/bin...\n", n)
   120  		}
   121  		hwaf_bin_dir := ""
   122  		switch g_ctx.Root {
   123  		default:
   124  			hwaf_bin_dir = filepath.Join(g_ctx.Root, "bin")
   125  		case "":
   126  			hwaf_bin_dir, err = gas.Abs("github.com/hwaf/hwaf")
   127  			if err != nil {
   128  				return err
   129  			}
   130  		}
   131  		hwaf_bin_dir = os.ExpandEnv(hwaf_bin_dir)
   132  		if verbose {
   133  			fmt.Printf("%s: using hwaf-bin from [%s]...\n", n, hwaf_bin_dir)
   134  		}
   135  		if !path_exists(hwaf_bin_dir) {
   136  			err = fmt.Errorf("no such hwaf-bin dir [%s]", hwaf_bin_dir)
   137  			if err != nil {
   138  				return err
   139  			}
   140  		}
   141  		src_waf, err := os.Open(filepath.Join(hwaf_bin_dir, "waf"))
   142  		if err != nil {
   143  			return err
   144  		}
   145  		defer src_waf.Close()
   146  
   147  		if !path_exists(".hwaf/bin") {
   148  			err = os.MkdirAll(".hwaf/bin", 0700)
   149  			if err != nil {
   150  				return err
   151  			}
   152  		}
   153  
   154  		waf_bin, err := os.Create(filepath.Join(".hwaf", "bin", "waf"))
   155  		if err != nil {
   156  			return err
   157  		}
   158  		defer waf_bin.Close()
   159  
   160  		if runtime.GOOS != "windows" {
   161  			err = waf_bin.Chmod(0755)
   162  			if err != nil {
   163  				return err
   164  			}
   165  		}
   166  
   167  		_, err = io.Copy(waf_bin, src_waf)
   168  		if err != nil {
   169  			return err
   170  		}
   171  
   172  		err = waf_bin.Sync()
   173  		if err != nil {
   174  			return err
   175  		}
   176  	}
   177  
   178  	// add pkgdb
   179  	err = ioutil.WriteFile(
   180  		filepath.Join(".hwaf", "pkgdb.json"),
   181  		[]byte("{}\n"),
   182  		0755,
   183  	)
   184  	if err != nil {
   185  		return err
   186  	}
   187  
   188  	// add template wscript
   189  	if verbose {
   190  		fmt.Printf("%s: add top-level wscript...\n", n)
   191  	}
   192  
   193  	if !path_exists("wscript") {
   194  		wscript_tmpl, err := os.Open(filepath.Join(hwaf_tools_dir, "hwaf-wscript"))
   195  		if err != nil {
   196  			return err
   197  		}
   198  		defer wscript_tmpl.Close()
   199  
   200  		wscript_b, err := ioutil.ReadAll(wscript_tmpl)
   201  		if err != nil {
   202  			return err
   203  		}
   204  
   205  		// replace 'hwaf-workarea' with workarea name
   206  		wscript_s := strings.Replace(
   207  			string(wscript_b),
   208  			"APPNAME = 'hwaf-workarea'",
   209  			fmt.Sprintf("APPNAME = '%s'", proj_name),
   210  			-1)
   211  
   212  		wscript, err := os.Create("wscript")
   213  		if err != nil {
   214  			return err
   215  		}
   216  		defer wscript.Close()
   217  
   218  		_, err = io.WriteString(wscript, wscript_s)
   219  		if err != nil {
   220  			return err
   221  		}
   222  		err = wscript.Sync()
   223  		if err != nil {
   224  			return err
   225  		}
   226  		err = wscript.Close()
   227  		if err != nil {
   228  			return err
   229  		}
   230  	}
   231  
   232  	// create 'src' directory
   233  	if !path_exists("src") {
   234  		err = os.MkdirAll("src", 0700)
   235  		if err != nil {
   236  			return err
   237  		}
   238  	}
   239  
   240  	if verbose {
   241  		fmt.Printf("%s: creating workarea [%s]... [ok]\n", n, dirname)
   242  	}
   243  
   244  	return err
   245  }
   246  
   247  // EOF