// Encode transforms a Tag into a plumbing.EncodedObject. func (t *Tag) Encode(o plumbing.EncodedObject) error { o.SetType(plumbing.TagObject) w, err := o.Writer() if err != nil { return err } defer ioutil.CheckClose(w, &err) if _, err = fmt.Fprintf(w, "object %s\ntype %s\ntag %s\ntagger ", t.Target.String(), t.TargetType.Bytes(), t.Name); err != nil { return err } if err = t.Tagger.Encode(w); err != nil { return err } if _, err = fmt.Fprint(w, "\n\n"); err != nil { return err } if _, err = fmt.Fprint(w, t.Message); err != nil { return err } return err }
// Encode transforms a Blob into a plumbing.EncodedObject. func (b *Blob) Encode(o plumbing.EncodedObject) error { w, err := o.Writer() if err != nil { return err } defer ioutil.CheckClose(w, &err) r, err := b.Reader() if err != nil { return err } defer ioutil.CheckClose(r, &err) _, err = io.Copy(w, r) o.SetType(plumbing.BlobObject) return err }
// Encode transforms a Commit into a plumbing.EncodedObject. func (b *Commit) Encode(o plumbing.EncodedObject) error { o.SetType(plumbing.CommitObject) w, err := o.Writer() if err != nil { return err } defer ioutil.CheckClose(w, &err) if _, err = fmt.Fprintf(w, "tree %s\n", b.tree.String()); err != nil { return err } for _, parent := range b.parents { if _, err = fmt.Fprintf(w, "parent %s\n", parent.String()); err != nil { return err } } if _, err = fmt.Fprint(w, "author "); err != nil { return err } if err = b.Author.Encode(w); err != nil { return err } if _, err = fmt.Fprint(w, "\ncommitter "); err != nil { return err } if err = b.Committer.Encode(w); err != nil { return err } if _, err = fmt.Fprintf(w, "\n\n%s", b.Message); err != nil { return err } return err }
// Encode transforms a Tree into a plumbing.EncodedObject. func (t *Tree) Encode(o plumbing.EncodedObject) error { o.SetType(plumbing.TreeObject) w, err := o.Writer() if err != nil { return err } var size int defer ioutil.CheckClose(w, &err) for _, entry := range t.Entries { n, err := fmt.Fprintf(w, "%o %s", entry.Mode, entry.Name) if err != nil { return err } size += n n, err = w.Write([]byte{0x00}) if err != nil { return err } size += n n, err = w.Write([]byte(entry.Hash[:])) if err != nil { return err } size += n } o.SetSize(int64(size)) return err }
func (r *Remote) fetch(o *FetchOptions) (refs storer.ReferenceStorer, err error) { if o.RemoteName == "" { o.RemoteName = r.c.Name } if err := o.Validate(); err != nil { return nil, err } if len(o.RefSpecs) == 0 { o.RefSpecs = r.c.Fetch } s, err := newFetchPackSession(r.c.URL) if err != nil { return nil, err } defer ioutil.CheckClose(s, &err) ar, err := s.AdvertisedReferences() if err != nil { return nil, err } req, err := r.newUploadPackRequest(o, ar) if err != nil { return nil, err } remoteRefs, err := ar.AllReferences() if err != nil { return nil, err } req.Wants, err = getWants(o.RefSpecs, r.s, remoteRefs) if len(req.Wants) == 0 { return remoteRefs, NoErrAlreadyUpToDate } req.Haves, err = getHaves(r.s) if err != nil { return nil, err } if err := r.fetchPack(o, s, req); err != nil { return nil, err } if err := r.updateLocalReferenceStorage(o.RefSpecs, remoteRefs); err != nil { return nil, err } return remoteRefs, err }
// Decode transform an plumbing.EncodedObject into a Tree struct func (t *Tree) Decode(o plumbing.EncodedObject) (err error) { if o.Type() != plumbing.TreeObject { return ErrUnsupportedObject } t.Hash = o.Hash() if o.Size() == 0 { return nil } t.Entries = nil t.m = nil reader, err := o.Reader() if err != nil { return err } defer ioutil.CheckClose(reader, &err) r := bufio.NewReader(reader) for { mode, err := r.ReadString(' ') if err != nil { if err == io.EOF { break } return err } fm, err := t.decodeFileMode(mode[:len(mode)-1]) if err != nil && err != io.EOF { return err } name, err := r.ReadString(0) if err != nil && err != io.EOF { return err } var hash plumbing.Hash if _, err = io.ReadFull(r, hash[:]); err != nil { return err } baseName := name[:len(name)-1] t.Entries = append(t.Entries, TreeEntry{ Hash: hash, Mode: fm, Name: baseName, }) } return nil }
// Decode transforms a plumbing.EncodedObject into a Tag struct. func (t *Tag) Decode(o plumbing.EncodedObject) (err error) { if o.Type() != plumbing.TagObject { return ErrUnsupportedObject } t.Hash = o.Hash() reader, err := o.Reader() if err != nil { return err } defer ioutil.CheckClose(reader, &err) r := bufio.NewReader(reader) for { line, err := r.ReadSlice('\n') if err != nil && err != io.EOF { return err } line = bytes.TrimSpace(line) if len(line) == 0 { break // Start of message } split := bytes.SplitN(line, []byte{' '}, 2) switch string(split[0]) { case "object": t.Target = plumbing.NewHash(string(split[1])) case "type": t.TargetType, err = plumbing.ParseObjectType(string(split[1])) if err != nil { return err } case "tag": t.Name = string(split[1]) case "tagger": t.Tagger.Decode(split[1]) } if err == io.EOF { return nil } } data, err := stdioutil.ReadAll(r) if err != nil { return err } t.Message = string(data) return nil }
// Contents returns the contents of a file as a string. func (f *File) Contents() (content string, err error) { reader, err := f.Reader() if err != nil { return "", err } defer ioutil.CheckClose(reader, &err) buf := new(bytes.Buffer) if _, err := buf.ReadFrom(reader); err != nil { return "", err } return buf.String(), nil }
// Decode transforms a plumbing.EncodedObject into a Commit struct. func (c *Commit) Decode(o plumbing.EncodedObject) (err error) { if o.Type() != plumbing.CommitObject { return ErrUnsupportedObject } c.Hash = o.Hash() reader, err := o.Reader() if err != nil { return err } defer ioutil.CheckClose(reader, &err) r := bufio.NewReader(reader) var message bool for { line, err := r.ReadSlice('\n') if err != nil && err != io.EOF { return err } if !message { line = bytes.TrimSpace(line) if len(line) == 0 { message = true continue } split := bytes.SplitN(line, []byte{' '}, 2) switch string(split[0]) { case "tree": c.tree = plumbing.NewHash(string(split[1])) case "parent": c.parents = append(c.parents, plumbing.NewHash(string(split[1]))) case "author": c.Author.Decode(split[1]) case "committer": c.Committer.Decode(split[1]) } } else { c.Message += string(line) } if err == io.EOF { return nil } } }
func (r *Remote) fetchPack(o *FetchOptions, s transport.FetchPackSession, req *packp.UploadPackRequest) (err error) { reader, err := s.FetchPack(req) if err != nil { return err } defer ioutil.CheckClose(reader, &err) if err := r.updateShallow(o, reader); err != nil { return err } if err = r.updateObjectStorage( buildSidebandIfSupported(req.Capabilities, reader, r.p), ); err != nil { return err } return err }