2014-06-03 15:08:58 +00:00
|
|
|
package commands
|
2013-10-04 17:09:03 +00:00
|
|
|
|
|
|
|
import (
|
2014-09-18 20:31:09 +00:00
|
|
|
"bufio"
|
|
|
|
"bytes"
|
2014-06-24 14:30:33 +00:00
|
|
|
"fmt"
|
2014-06-03 15:08:58 +00:00
|
|
|
"github.com/github/git-media/gitmedia"
|
|
|
|
"github.com/github/git-media/gitmediaclient"
|
2014-09-19 16:52:03 +00:00
|
|
|
"github.com/github/git-media/pointer"
|
2014-06-26 20:53:37 +00:00
|
|
|
"github.com/spf13/cobra"
|
2014-09-18 20:31:09 +00:00
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"path/filepath"
|
2014-03-12 14:55:01 +00:00
|
|
|
"strings"
|
2013-10-04 17:09:03 +00:00
|
|
|
)
|
|
|
|
|
2014-06-26 20:53:37 +00:00
|
|
|
var (
|
|
|
|
pushCmd = &cobra.Command{
|
|
|
|
Use: "push",
|
2014-06-26 21:22:24 +00:00
|
|
|
Short: "Push files to the media endpoint",
|
2014-06-26 20:53:37 +00:00
|
|
|
Run: pushCommand,
|
|
|
|
}
|
2014-09-19 16:07:00 +00:00
|
|
|
dryRun = false
|
|
|
|
z40 = "0000000000000000000000000000000000000000"
|
|
|
|
deleteBranch = "(delete)"
|
2014-06-26 20:53:37 +00:00
|
|
|
)
|
2013-10-04 17:09:03 +00:00
|
|
|
|
2014-06-26 20:53:37 +00:00
|
|
|
func pushCommand(cmd *cobra.Command, args []string) {
|
2014-09-19 00:40:37 +00:00
|
|
|
// TODO handle (delete) case, not sending anything
|
2014-09-18 20:31:09 +00:00
|
|
|
refsData, err := ioutil.ReadAll(os.Stdin)
|
2014-06-05 18:48:23 +00:00
|
|
|
if err != nil {
|
2014-09-18 20:31:09 +00:00
|
|
|
Panic(err, "Error reading refs on stdin")
|
2014-06-05 18:48:23 +00:00
|
|
|
}
|
|
|
|
|
2014-09-18 20:31:09 +00:00
|
|
|
if len(refsData) == 0 {
|
|
|
|
return
|
|
|
|
}
|
2014-08-07 18:11:07 +00:00
|
|
|
|
2014-09-18 21:07:06 +00:00
|
|
|
// TODO let's pull this into a nice iteratable thing like the queue provides
|
2014-09-18 20:31:09 +00:00
|
|
|
refs := strings.Split(strings.TrimSpace(string(refsData)), " ")
|
2014-03-12 14:55:01 +00:00
|
|
|
|
2014-09-19 16:07:00 +00:00
|
|
|
if refs[0] == deleteBranch {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2014-09-18 21:07:06 +00:00
|
|
|
refArgs := []string{"rev-list", "--objects"}
|
|
|
|
if len(refs) > 1 {
|
|
|
|
refArgs = append(refArgs, refs[1])
|
|
|
|
}
|
|
|
|
if len(refs) > 3 && refs[3] != z40 {
|
|
|
|
refArgs = append(refArgs, "^"+refs[3])
|
|
|
|
}
|
|
|
|
|
|
|
|
output, err := exec.Command("git", refArgs...).Output()
|
2014-09-18 20:31:09 +00:00
|
|
|
if err != nil {
|
2014-09-18 21:07:06 +00:00
|
|
|
Panic(err, "Error running git rev-list --objects %v", refArgs)
|
2014-09-18 20:31:09 +00:00
|
|
|
}
|
2014-03-12 14:55:01 +00:00
|
|
|
|
2014-09-18 20:31:09 +00:00
|
|
|
scanner := bufio.NewScanner(bytes.NewBuffer(output))
|
2014-09-19 16:52:03 +00:00
|
|
|
links := make([]*pointer.Link, 0)
|
2014-04-01 15:17:04 +00:00
|
|
|
|
2014-09-18 20:31:09 +00:00
|
|
|
for scanner.Scan() {
|
|
|
|
line := strings.Split(scanner.Text(), " ")
|
|
|
|
sha1 := line[0]
|
2013-10-21 18:42:29 +00:00
|
|
|
|
2014-09-18 20:31:09 +00:00
|
|
|
linkPath := filepath.Join(gitmedia.LocalLinkDir, sha1[0:2], sha1[2:len(sha1)])
|
2014-09-19 16:52:03 +00:00
|
|
|
|
|
|
|
linkFile, err := os.Open(linkPath)
|
|
|
|
if err != nil {
|
|
|
|
continue
|
2013-10-21 20:02:15 +00:00
|
|
|
}
|
2014-09-19 16:52:03 +00:00
|
|
|
|
|
|
|
link, err := pointer.DecodeLink(linkFile)
|
|
|
|
if err != nil {
|
|
|
|
Panic(err, "Error decoding link file") // don't panic
|
|
|
|
}
|
|
|
|
|
|
|
|
links = append(links, link)
|
2014-09-18 20:31:09 +00:00
|
|
|
}
|
2014-06-24 14:30:33 +00:00
|
|
|
|
2014-09-19 16:52:03 +00:00
|
|
|
for i, link := range links {
|
2014-09-19 00:40:37 +00:00
|
|
|
if dryRun {
|
2014-09-19 16:52:03 +00:00
|
|
|
fmt.Println("push", link.Oid, link.Name)
|
2014-09-19 00:40:37 +00:00
|
|
|
continue
|
|
|
|
}
|
2014-09-19 16:52:03 +00:00
|
|
|
if wErr := pushAsset(link.Oid, link.Name, i+1, len(links)); wErr != nil {
|
2014-09-18 20:31:09 +00:00
|
|
|
Panic(wErr.Err, wErr.Error())
|
|
|
|
}
|
|
|
|
fmt.Printf("\n")
|
|
|
|
}
|
2013-10-04 17:09:03 +00:00
|
|
|
}
|
|
|
|
|
2014-08-08 19:37:41 +00:00
|
|
|
func pushAsset(oid, filename string, index, totalFiles int) *gitmedia.WrappedError {
|
2014-08-07 17:15:28 +00:00
|
|
|
path, err := gitmedia.LocalMediaPath(oid)
|
2014-09-22 15:46:19 +00:00
|
|
|
if err != nil {
|
|
|
|
return gitmedia.Errorf(err, "Error uploading file %s (%s)", filename, oid)
|
2014-08-07 17:15:28 +00:00
|
|
|
}
|
|
|
|
|
2014-09-22 15:46:19 +00:00
|
|
|
status, err := gitmediaclient.Options(path)
|
|
|
|
if err != nil {
|
|
|
|
return gitmedia.Errorf(err, "Error uploading file %s (%s)", filename, oid)
|
|
|
|
}
|
2014-08-07 17:37:04 +00:00
|
|
|
|
2014-09-22 15:46:19 +00:00
|
|
|
if status == 200 {
|
|
|
|
return nil
|
2014-08-07 17:15:28 +00:00
|
|
|
}
|
|
|
|
|
2014-09-22 15:46:19 +00:00
|
|
|
cb, file, cbErr := gitmedia.CopyCallbackFile("push", filename, index, totalFiles)
|
|
|
|
if cbErr != nil {
|
|
|
|
Error(cbErr.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
err = gitmediaclient.Put(path, filename, cb)
|
|
|
|
if file != nil {
|
|
|
|
file.Close()
|
2014-08-07 17:15:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2013-10-04 17:09:03 +00:00
|
|
|
func init() {
|
2014-09-19 00:40:37 +00:00
|
|
|
pushCmd.Flags().BoolVarP(&dryRun, "dry-run", "d", false, "Do everything except actually send the updates")
|
2014-06-26 20:53:37 +00:00
|
|
|
RootCmd.AddCommand(pushCmd)
|
2013-10-04 17:09:03 +00:00
|
|
|
}
|