github.com/ernestokarim/closurer@v0.0.0-20130119214741-f245d086c750/build.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  	"os/exec"
     9  	"path/filepath"
    10  	"strings"
    11  
    12  	"github.com/ernestokarim/closurer/app"
    13  	"github.com/ernestokarim/closurer/config"
    14  	"github.com/ernestokarim/closurer/js"
    15  )
    16  
    17  var (
    18  	mapping = map[string]string{}
    19  )
    20  
    21  func build() error {
    22  	if err := js.FullCompile(); err != nil {
    23  		return err
    24  	}
    25  
    26  	if err := copyCssFile(); err != nil {
    27  		return err
    28  	}
    29  
    30  	if err := copyJsFile(); err != nil {
    31  		return err
    32  	}
    33  
    34  	if err := outputMap(); err != nil {
    35  		return err
    36  	}
    37  
    38  	return nil
    39  }
    40  
    41  func copyCssFile() error {
    42  	conf := config.Current()
    43  	target := conf.Gss.CurTarget()
    44  
    45  	if conf.Gss == nil {
    46  		return nil
    47  	}
    48  
    49  	srcName := filepath.Join(conf.Build, config.CSS_NAME)
    50  	filename := target.Output
    51  	if strings.Contains(filename, "{sha1}") {
    52  		sha1, err := calcFileSha1(srcName)
    53  		if err != nil {
    54  			return err
    55  		}
    56  		filename = strings.Replace(filename, "{sha1}", sha1, -1)
    57  	}
    58  
    59  	mapping[config.SelectedTarget+"-css"] = filename
    60  
    61  	if err := copyFile(srcName, filename); err != nil {
    62  		return err
    63  	}
    64  
    65  	return nil
    66  }
    67  
    68  func copyJsFile() error {
    69  	conf := config.Current()
    70  	target := conf.Js.CurTarget()
    71  
    72  	if conf.Js == nil {
    73  		return nil
    74  	}
    75  
    76  	srcName := filepath.Join(conf.Build, config.JS_NAME)
    77  
    78  	filename := filepath.Join(conf.Js.Root, target.Output)
    79  	if strings.Contains(filename, "{sha1}") {
    80  		sha1, err := calcFileSha1(srcName)
    81  		if err != nil {
    82  			return err
    83  		}
    84  		filename = strings.Replace(filename, "{sha1}", sha1, -1)
    85  	}
    86  
    87  	mapping[config.SelectedTarget+"-js"] = filename
    88  
    89  	files := []string{}
    90  	for _, n := range conf.Js.Prepends {
    91  		files = append(files, filepath.Join(conf.Js.Root, n.File))
    92  	}
    93  	files = append(files, srcName)
    94  
    95  	if err := copyFiles(files, filename); err != nil {
    96  		return err
    97  	}
    98  
    99  	return nil
   100  }
   101  
   102  func calcFileSha1(filename string) (string, error) {
   103  	cmd := exec.Command("sha1sum", filename)
   104  	output, err := cmd.CombinedOutput()
   105  	if err != nil {
   106  		return "", app.Error(err)
   107  	}
   108  
   109  	return strings.Split(string(output), " ")[0], nil
   110  }
   111  
   112  func outputMap() error {
   113  	conf := config.Current()
   114  	if conf.Map == nil {
   115  		return nil
   116  	}
   117  
   118  	f, err := os.Create(conf.Map.File)
   119  	if err != nil {
   120  		return app.Error(err)
   121  	}
   122  	defer f.Close()
   123  
   124  	fmt.Fprintf(f, "var mapping = ")
   125  	if err := json.NewEncoder(f).Encode(&mapping); err != nil {
   126  		return app.Error(err)
   127  	}
   128  
   129  	return nil
   130  }
   131  
   132  func copyFile(from, to string) error {
   133  	src, err := os.Open(from)
   134  	if err != nil {
   135  		return app.Error(err)
   136  	}
   137  	defer src.Close()
   138  
   139  	dest, err := os.Create(to)
   140  	if err != nil {
   141  		return app.Error(err)
   142  	}
   143  	defer dest.Close()
   144  
   145  	if _, err = io.Copy(dest, src); err != nil {
   146  		return app.Error(err)
   147  	}
   148  
   149  	return nil
   150  }
   151  
   152  func copyFiles(from []string, to string) error {
   153  	srcs := []io.Reader{}
   154  	for _, f := range from {
   155  		src, err := os.Open(f)
   156  		if err != nil {
   157  			return app.Error(err)
   158  		}
   159  		defer src.Close()
   160  
   161  		srcs = append(srcs, src)
   162  	}
   163  
   164  	src := io.MultiReader(srcs...)
   165  
   166  	dest, err := os.Create(to)
   167  	if err != nil {
   168  		return app.Error(err)
   169  	}
   170  	defer dest.Close()
   171  
   172  	if _, err = io.Copy(dest, src); err != nil {
   173  		return app.Error(err)
   174  	}
   175  
   176  	return nil
   177  }