123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- package gig
- import (
- "bufio"
- "fmt"
- "io"
- "strings"
- )
- func writeHeader(o Object, w *bufio.Writer) (n int64, err error) {
- x, err := w.WriteString(o.Type().String())
- n += int64(x)
- if err != nil {
- return n, err
- }
- x, err = w.WriteString(" ")
- n += int64(x)
- if err != nil {
- return n, err
- }
- x, err = w.WriteString(fmt.Sprintf("%d", o.Size()))
- n += int64(x)
- if err != nil {
- return n, err
- }
- err = w.WriteByte(0)
- if err != nil {
- return n, err
- }
- return n + 1, nil
- }
- //WriteTo writes the commit object to the writer in the on-disk format
- //i.e. as it would be stored in the git objects dir (although uncompressed).
- func (c *Commit) WriteTo(writer io.Writer) (int64, error) {
- w := bufio.NewWriter(writer)
- n, err := writeHeader(c, w)
- if err != nil {
- return n, err
- }
- x, err := w.WriteString(fmt.Sprintf("tree %s\n", c.Tree))
- n += int64(x)
- if err != nil {
- return n, err
- }
- for _, p := range c.Parent {
- x, err = w.WriteString(fmt.Sprintf("parent %s\n", p))
- n += int64(x)
- if err != nil {
- return n, err
- }
- }
- x, err = w.WriteString(fmt.Sprintf("author %s\n", c.Author))
- n += int64(x)
- if err != nil {
- return n, err
- }
- x, err = w.WriteString(fmt.Sprintf("committer %s\n", c.Committer))
- n += int64(x)
- if err != nil {
- return n, err
- }
- if c.GPGSig != "" {
- s := strings.Replace(c.GPGSig, "\n", "\n ", -1)
- x, err = w.WriteString(fmt.Sprintf("gpgsig %s\n", s))
- n += int64(x)
- if err != nil {
- return n, err
- }
- }
- x, err = w.WriteString(fmt.Sprintf("\n%s", c.Message))
- n += int64(x)
- if err != nil {
- return n, err
- }
- err = w.Flush()
- return n, err
- }
- //WriteTo writes the tree object to the writer in the on-disk format
- //i.e. as it would be stored in the git objects dir (although uncompressed).
- func (t *Tree) WriteTo(writer io.Writer) (int64, error) {
- w := bufio.NewWriter(writer)
- n, err := writeHeader(t, w)
- if err != nil {
- return n, err
- }
- for t.Next() {
- //format is: [mode{ASCII, octal}][space][name][\0][SHA1]
- entry := t.Entry()
- line := fmt.Sprintf("%o %s", entry.Mode, entry.Name)
- x, err := w.WriteString(line)
- n += int64(x)
- if err != nil {
- return n, err
- }
- err = w.WriteByte(0)
- if err != nil {
- return n, err
- }
- n++
- x, err = w.Write(entry.ID[:])
- n += int64(x)
- if err != nil {
- return n, err
- }
- }
- if err = t.Err(); err != nil {
- return n, err
- }
- err = w.Flush()
- return n, err
- }
- //WriteTo writes the blob object to the writer in the on-disk format
- //i.e. as it would be stored in the git objects dir (although uncompressed).
- func (b *Blob) WriteTo(writer io.Writer) (int64, error) {
- w := bufio.NewWriter(writer)
- n, err := writeHeader(b, w)
- if err != nil {
- return n, err
- }
- x, err := io.Copy(w, b.source)
- n += int64(x)
- if err != nil {
- return n, err
- }
- err = w.Flush()
- return n, err
- }
- //WriteTo writes the tag object to the writer in the on-disk format
- //i.e. as it would be stored in the git objects dir (although uncompressed).
- func (t *Tag) WriteTo(writer io.Writer) (int64, error) {
- w := bufio.NewWriter(writer)
- n, err := writeHeader(t, w)
- if err != nil {
- return n, err
- }
- x, err := w.WriteString(fmt.Sprintf("object %s\n", t.Object))
- n += int64(x)
- if err != nil {
- return n, err
- }
- x, err = w.WriteString(fmt.Sprintf("type %s\n", t.ObjType))
- n += int64(x)
- if err != nil {
- return n, err
- }
- x, err = w.WriteString(fmt.Sprintf("tag %s\n", t.Tag))
- n += int64(x)
- if err != nil {
- return n, err
- }
- x, err = w.WriteString(fmt.Sprintf("tagger %s\n\n", t.Tagger))
- n += int64(x)
- if err != nil {
- return n, err
- }
- x, err = w.WriteString(t.Message)
- n += int64(x)
- if err != nil {
- return n, err
- }
- if t.GPGSig != "" {
- x, err = w.WriteString(fmt.Sprintf("%s\n", t.GPGSig))
- n += int64(x)
- if err != nil {
- return n, err
- }
- }
- err = w.Flush()
- return n, err
- }
|