diff --git a/commands/command_clean.go b/commands/command_clean.go index a4353a99..087468db 100644 --- a/commands/command_clean.go +++ b/commands/command_clean.go @@ -69,7 +69,7 @@ func cleanCommand(cmd *cobra.Command, args []string) { Debug("Writing %s", mediafile) } - err = cleaned.CreateLink() + err = cleaned.CreateLink(filename) if err != nil { Panic(err, "Unable to write link file %s", err) } diff --git a/commands/command_push.go b/commands/command_push.go index 3c4b95dd..3bde9ebf 100644 --- a/commands/command_push.go +++ b/commands/command_push.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/github/git-media/gitmedia" "github.com/github/git-media/gitmediaclient" + "github.com/github/git-media/pointer" "github.com/spf13/cobra" "io/ioutil" "os" @@ -57,29 +58,33 @@ func pushCommand(cmd *cobra.Command, args []string) { } scanner := bufio.NewScanner(bytes.NewBuffer(output)) - blobOids := make([]string, 0) + links := make([]*pointer.Link, 0) for scanner.Scan() { line := strings.Split(scanner.Text(), " ") sha1 := line[0] linkPath := filepath.Join(gitmedia.LocalLinkDir, sha1[0:2], sha1[2:len(sha1)]) - if _, err := os.Stat(linkPath); err == nil { - oid, err := ioutil.ReadFile(linkPath) - if err != nil { - Panic(err, "Error reading link file") - } - blobOids = append(blobOids, string(oid)) - } - } - // TODO - filename - for i, oid := range blobOids { - if dryRun { - fmt.Println("push", oid) + linkFile, err := os.Open(linkPath) + if err != nil { continue } - if wErr := pushAsset(oid, "", i+1, len(blobOids)); wErr != nil { + + link, err := pointer.DecodeLink(linkFile) + if err != nil { + Panic(err, "Error decoding link file") // don't panic + } + + links = append(links, link) + } + + for i, link := range links { + if dryRun { + fmt.Println("push", link.Oid, link.Name) + continue + } + if wErr := pushAsset(link.Oid, link.Name, i+1, len(links)); wErr != nil { Panic(wErr.Err, wErr.Error()) } fmt.Printf("\n") diff --git a/pointer/pointer.go b/pointer/pointer.go index 1092d3e5..e7b60978 100644 --- a/pointer/pointer.go +++ b/pointer/pointer.go @@ -23,8 +23,11 @@ var ( oid sha256:%s size %d ` - matcher = []byte("git-media") - pointerKeys = []string{"version", "oid", "size"} + matcher = []byte("git-media") + pointerKeys = []string{"version", "oid", "size"} + linkTemplate = `oid %s +name %s +` ) type Pointer struct { @@ -34,6 +37,11 @@ type Pointer struct { OidType string } +type Link struct { + Oid string + Name string +} + func NewPointer(oid string, size int64) *Pointer { return &Pointer{latest, oid, size, oidType} } @@ -50,7 +58,7 @@ func (p *Pointer) Encoded() string { return fmt.Sprintf(template, latest, p.Oid, p.Size) } -func (p *Pointer) CreateLink() error { +func (p *Pointer) CreateLink(filename string) error { gitHash, err := gitmedia.NewGitHash() if err != nil { return err @@ -65,7 +73,7 @@ func (p *Pointer) CreateLink() error { return err } - return ioutil.WriteFile(linkFile, []byte(p.Oid), 0644) + return ioutil.WriteFile(linkFile, []byte(fmt.Sprintf(linkTemplate, latest, p.Oid, filename)), 0644) } func Encode(writer io.Writer, pointer *Pointer) (int, error) { @@ -88,6 +96,32 @@ func Decode(reader io.Reader) (*Pointer, error) { } } +func DecodeLink(reader io.Reader) (*Link, error) { + link := &Link{} + + m := make(map[string]string) + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + text := scanner.Text() + if len(text) == 0 { + continue + } + + parts := strings.SplitN(text, " ", 2) + key := parts[0] + m[key] = parts[1] + } + + oid, ok := m["oid"] + if !ok { + return nil, errors.New("No Oid in link file") + } + + link.Oid = oid + link.Name = m["name"] + return link, nil +} + func decodeKV(data []byte) (*Pointer, error) { parsed, err := decodeKVData(data) if err != nil {