// Prepare creates temporary directory, copies file there and verifies checksums func (c *Changes) Prepare() error { var err error for _, file := range c.Files { if filepath.Dir(file.Filename) != "." { return fmt.Errorf("file is not in the same folder as .changes file: %s", file.Filename) } file.Filename = filepath.Base(file.Filename) err = utils.CopyFile(filepath.Join(c.BasePath, file.Filename), filepath.Join(c.TempDir, file.Filename)) if err != nil { return err } } for _, file := range c.Files { var info utils.ChecksumInfo info, err = utils.ChecksumsForFile(filepath.Join(c.TempDir, file.Filename)) if err != nil { return err } if info.Size != file.Checksums.Size { return fmt.Errorf("size mismatch: expected %v != obtained %v", file.Checksums.Size, info.Size) } if info.MD5 != file.Checksums.MD5 { return fmt.Errorf("checksum mismatch MD5: expected %v != obtained %v", file.Checksums.MD5, info.MD5) } if info.SHA1 != file.Checksums.SHA1 { return fmt.Errorf("checksum mismatch SHA1: expected %v != obtained %v", file.Checksums.SHA1, info.SHA1) } if info.SHA256 != file.Checksums.SHA256 { return fmt.Errorf("checksum mismatch SHA256 expected %v != obtained %v", file.Checksums.SHA256, info.SHA256) } } return nil }
// NewChanges moves .changes file into temporary directory and creates Changes structure func NewChanges(path string) (*Changes, error) { var err error c := &Changes{ BasePath: filepath.Dir(path), ChangesName: filepath.Base(path), } c.TempDir, err = ioutil.TempDir(os.TempDir(), "aptly") if err != nil { return nil, err } // copy .changes file into temporary directory err = utils.CopyFile(filepath.Join(c.BasePath, c.ChangesName), filepath.Join(c.TempDir, c.ChangesName)) if err != nil { return nil, err } return c, nil }
func aptlyGraph(cmd *commander.Command, args []string) error { var err error if len(args) != 0 { cmd.Usage() return commander.ErrCommandError } fmt.Printf("Generating graph...\n") graph, err := deb.BuildGraph(context.CollectionFactory()) if err != nil { return err } buf := bytes.NewBufferString(graph.String()) tempfile, err := ioutil.TempFile("", "aptly-graph") if err != nil { return err } tempfile.Close() os.Remove(tempfile.Name()) format := context.Flags().Lookup("format").Value.String() output := context.Flags().Lookup("output").Value.String() if filepath.Ext(output) != "" { format = filepath.Ext(output)[1:] } tempfilename := tempfile.Name() + "." + format command := exec.Command("dot", "-T"+format, "-o"+tempfilename) command.Stderr = os.Stderr stdin, err := command.StdinPipe() if err != nil { return err } err = command.Start() if err != nil { return fmt.Errorf("unable to execute dot: %s (is graphviz package installed?)", err) } _, err = io.Copy(stdin, buf) if err != nil { return err } err = stdin.Close() if err != nil { return err } err = command.Wait() if err != nil { return err } if output != "" { err = utils.CopyFile(tempfilename, output) if err != nil { return fmt.Errorf("unable to copy %s -> %s: %s", tempfilename, output, err) } _ = os.Remove(tempfilename) fmt.Printf("Output saved to %s\n", output) } else { fmt.Printf("Rendered to %s file: %s, trying to open it...\n", format, tempfilename) _ = exec.Command("open", tempfilename).Run() } return err }