vendor
github.com
Microsoft
ProtonMail
go-crypto
openpgp
packet
aead_config.go aead_crypter.go aead_encrypted.go compressed.go config.go config_v5.go encrypted_key.go literal.go marker.go notation.go ocfb.go one_pass_signature.go opaque.go packet.go packet_sequence.go packet_unsupported.go padding.go private_key.go private_key_test_data.go public_key.go public_key_test_data.go reader.go recipient.go signature.go symmetric_key_encrypted.go symmetrically_encrypted.go symmetrically_encrypted_aead.go symmetrically_encrypted_mdc.go userattribute.go userid.goalecthomas
chroma
v2
lexers
embedded
abap.xml abnf.xml actionscript.xml actionscript_3.xml ada.xml agda.xml al.xml alloy.xml ampl.xml angular2.xml antlr.xml apacheconf.xml apl.xml applescript.xml arangodb_aql.xml arduino.xml armasm.xml atl.xml autohotkey.xml autoit.xml awk.xml ballerina.xml bash.xml bash_session.xml batchfile.xml beef.xml bibtex.xml bicep.xml blitzbasic.xml bnf.xml bqn.xml brainfuck.xml c#.xml c++.xml c.xml c3.xml cap_n_proto.xml cassandra_cql.xml ceylon.xml cfengine3.xml cfstatement.xml chaiscript.xml chapel.xml cheetah.xml clojure.xml cmake.xml cobol.xml coffeescript.xml common_lisp.xml coq.xml core.xml crystal.xml css.xml csv.xml cue.xml cython.xml d.xml dart.xml dax.xml desktop_entry.xml devicetree.xml diff.xml django_jinja.xml dns.xml docker.xml dtd.xml dylan.xml ebnf.xml elixir.xml elm.xml emacslisp.xml erb.xml erlang.xml factor.xml fennel.xml fish.xml forth.xml fortran.xml fortranfixed.xml fsharp.xml gas.xml gdscript.xml gdscript3.xml gettext.xml gherkin.xml gleam.xml glsl.xml gnuplot.xml go_template.xml graphql.xml groff.xml groovy.xml handlebars.xml hare.xml haskell.xml hcl.xml hexdump.xml hlb.xml hlsl.xml holyc.xml html.xml hy.xml idris.xml igor.xml ini.xml io.xml iscdhcpd.xml j.xml janet.xml java.xml javascript.xml json.xml jsonata.xml jsonnet.xml julia.xml jungle.xml kakoune.xml kdl.xml kotlin.xml lateralus.xml lean.xml lighttpd_configuration_file.xml llvm.xml lox.xml lua.xml luau.xml makefile.xml mako.xml mason.xml materialize_sql_dialect.xml mathematica.xml matlab.xml mcfunction.xml meson.xml metal.xml microcad.xml minizinc.xml mlir.xml modelica.xml modula-2.xml mojo.xml monkeyc.xml moonbit.xml moonscript.xml morrowindscript.xml myghty.xml mysql.xml nasm.xml natural.xml ndisasm.xml newspeak.xml nginx_configuration_file.xml nim.xml nix.xml nsis.xml nu.xml objective-c.xml objectpascal.xml ocaml.xml octave.xml odin.xml onesenterprise.xml openedge_abl.xml openscad.xml org_mode.xml pacmanconf.xml perl.xml php.xml pig.xml pkgconfig.xml pl_pgsql.xml plaintext.xml plutus_core.xml pony.xml postgresql_sql_dialect.xml postscript.xml povray.xml powerquery.xml powershell.xml prolog.xml promela.xml promql.xml properties.xml protocol_buffer.xml prql.xml psl.xml puppet.xml python.xml python_2.xml qbasic.xml qml.xml r.xml racket.xml ragel.xml react.xml reasonml.xml reg.xml rego.xml rexx.xml rgbasm.xml ring.xml rpgle.xml rpm_spec.xml ruby.xml rust.xml sas.xml sass.xml scala.xml scdoc.xml scheme.xml scilab.xml scss.xml sed.xml sieve.xml smali.xml smalltalk.xml smarty.xml snbt.xml snobol.xml solidity.xml sourcepawn.xml spade.xml sparql.xml sql.xml squidconf.xml standard_ml.xml stas.xml stylus.xml swift.xml systemd.xml systemverilog.xml tablegen.xml tal.xml tasm.xml tcl.xml tcsh.xml termcap.xml terminfo.xml terraform.xml tex.xml thrift.xml toml.xml tradingview.xml transact-sql.xml turing.xml turtle.xml twig.xml txtpb.xml typescript.xml typoscript.xml typoscriptcssdata.xml typoscripthtmldata.xml typst.xml ucode.xml v.xml v_shell.xml vala.xml vb_net.xml verilog.xml vhdl.xml vhs.xml viml.xml vue.xml wat.xml wdte.xml webgpu_shading_language.xml webvtt.xml whiley.xml xml.xml xorg.xml yaml.xml yang.xml z80_assembly.xml zed.xml zig.xmlstyles
abap.xml algol.xml algol_nu.xml api.go arduino.xml ashen.xml aura-theme-dark-soft.xml aura-theme-dark.xml autumn.xml average.xml base16-snazzy.xml borland.xml bw.xml catppuccin-frappe.xml catppuccin-latte.xml catppuccin-macchiato.xml catppuccin-mocha.xml colorful.xml compat.go darcula.xml doom-one.xml doom-one2.xml dracula.xml emacs.xml evergarden.xml friendly.xml fruity.xml github-dark.xml github.xml gruvbox-light.xml gruvbox.xml hr_high_contrast.xml hrdark.xml igor.xml kanagawa-dragon.xml kanagawa-lotus.xml kanagawa-wave.xml lovelace.xml manni.xml modus-operandi.xml modus-vivendi.xml monokai.xml monokailight.xml murphy.xml native.xml nord.xml nordic.xml onedark.xml onesenterprise.xml paraiso-dark.xml paraiso-light.xml pastie.xml perldoc.xml pygments.xml rainbow_dash.xml rose-pine-dawn.xml rose-pine-moon.xml rose-pine.xml rpgle.xml rrt.xml solarized-dark.xml solarized-dark256.xml solarized-light.xml swapoff.xml tango.xml tokyonight-day.xml tokyonight-moon.xml tokyonight-night.xml tokyonight-storm.xml trac.xml vim.xml vs.xml vulcan.xml witchhazel.xml xcode-dark.xml xcode.xmlcloudflare
go-enry
go-enry
v2
data
alias.go colors.go commit.go content.go doc.go documentation.go extension.go filename.go frequencies.go generated.go groups.go heuristics.go id.go interpreter.go languageInfo.go mimeType.go test.go type.go vendor.gogo-git
go-git
v5
plumbing
format
object
blob.go change.go change_adaptor.go commit.go commit_scanner.go commit_walker.go commit_walker_bfs.go commit_walker_bfs_filtered.go commit_walker_ctime.go commit_walker_limit.go commit_walker_path.go difftree.go file.go merge_base.go object.go patch.go rename.go signature.go tag.go tag_scanner.go tree.go treenoder.goprotocol
storage
filesystem
dotgit
dotgit.go dotgit_rewrite_packed_refs.go dotgit_setref.go reader.go repository_filesystem.go writers.go writers_unix.go writers_windows.goklauspost
cpuid
v2
.gitignore .goreleaser.yml CONTRIBUTING.txt LICENSE README.md cpuid.go cpuid_386.s cpuid_amd64.s cpuid_arm64.s detect_arm64.go detect_ref.go detect_x86.go featureid_string.go os_darwin_arm64.go os_linux_arm64.go os_other_arm64.go os_safe_linux_arm64.go os_unsafe_linux_arm64.go test-architectures.shyuin
goldmark
extension
cjk.go definition_list.go footnote.go gfm.go linkify.go package.go strikethrough.go table.go tasklist.go typographer.goparser
attribute.go atx_heading.go auto_link.go blockquote.go code_block.go code_span.go delimiter.go emphasis.go fcode_block.go html_block.go link.go link_ref.go list.go list_item.go paragraph.go parser.go raw_html.go setext_headings.go thematic_break.goutil
html5entities.gen.go html5entities.go unicode_case_folding.gen.go unicode_case_folding.go util.go util_cjk.go util_safe.go util_unsafe_go120.go util_unsafe_go121.gogolang.org
x
crypto
blake2b
blake2b.go blake2bAVX2_amd64.go blake2bAVX2_amd64.s blake2b_amd64.s blake2b_generic.go blake2b_ref.go blake2x.go go125.go register.gochacha20
chacha_arm64.go chacha_arm64.s chacha_generic.go chacha_noasm.go chacha_ppc64x.go chacha_ppc64x.s chacha_s390x.go chacha_s390x.s xor.gossh
buffer.go certs.go channel.go cipher.go client.go client_auth.go common.go connection.go doc.go handshake.go kex.go keys.go mac.go messages.go mlkem.go mux.go server.go session.go ssh_gss.go streamlocal.go tcpip.go transport.gosys
cpu
asm_aix_ppc64.s asm_darwin_arm64_gc.s asm_darwin_x86_gc.s byteorder.go cpu.go cpu_aix.go cpu_arm.go cpu_arm64.go cpu_arm64.s cpu_darwin_arm64.go cpu_darwin_arm64_other.go cpu_darwin_x86.go cpu_gc_arm64.go cpu_gc_s390x.go cpu_gc_x86.go cpu_gc_x86.s cpu_gccgo_arm64.go cpu_gccgo_s390x.go cpu_gccgo_x86.c cpu_gccgo_x86.go cpu_linux.go cpu_linux_arm.go cpu_linux_arm64.go cpu_linux_loong64.go cpu_linux_mips64x.go cpu_linux_noinit.go cpu_linux_ppc64x.go cpu_linux_riscv64.go cpu_linux_s390x.go cpu_loong64.go cpu_loong64.s cpu_mips64x.go cpu_mipsx.go cpu_netbsd_arm64.go cpu_openbsd_arm64.go cpu_openbsd_arm64.s cpu_other_arm.go cpu_other_arm64.go cpu_other_mips64x.go cpu_other_ppc64x.go cpu_other_riscv64.go cpu_other_x86.go cpu_ppc64x.go cpu_riscv64.go cpu_s390x.go cpu_s390x.s cpu_wasm.go cpu_x86.go cpu_zos.go cpu_zos_s390x.go endian_big.go endian_little.go hwcap_linux.go parse.go proc_cpuinfo_linux.go runtime_auxv.go runtime_auxv_go121.go syscall_aix_gccgo.go syscall_aix_ppc64_gc.go syscall_darwin_arm64_gc.go syscall_darwin_x86_gc.gounix
.gitignore README.md affinity_linux.go aliases.go asm_aix_ppc64.s asm_bsd_386.s asm_bsd_amd64.s asm_bsd_arm.s asm_bsd_arm64.s asm_bsd_ppc64.s asm_bsd_riscv64.s asm_linux_386.s asm_linux_amd64.s asm_linux_arm.s asm_linux_arm64.s asm_linux_loong64.s asm_linux_mips64x.s asm_linux_mipsx.s asm_linux_ppc64x.s asm_linux_riscv64.s asm_linux_s390x.s asm_openbsd_mips64.s asm_solaris_amd64.s asm_zos_s390x.s auxv.go auxv_unsupported.go bluetooth_linux.go bpxsvc_zos.go bpxsvc_zos.s cap_freebsd.go constants.go dev_aix_ppc.go dev_aix_ppc64.go dev_darwin.go dev_dragonfly.go dev_freebsd.go dev_linux.go dev_netbsd.go dev_openbsd.go dev_zos.go dirent.go endian_big.go endian_little.go env_unix.go fcntl.go fcntl_darwin.go fcntl_linux_32bit.go fdset.go gccgo.go gccgo_c.c gccgo_linux_amd64.go ifreq_linux.go ioctl_linux.go ioctl_signed.go ioctl_unsigned.go ioctl_zos.go mkall.sh mkerrors.sh mmap_nomremap.go mremap.go pagesize_unix.go pledge_openbsd.go ptrace_darwin.go ptrace_ios.go race.go race0.go readdirent_getdents.go readdirent_getdirentries.go sockcmsg_dragonfly.go sockcmsg_linux.go sockcmsg_unix.go sockcmsg_unix_other.go sockcmsg_zos.go symaddr_zos_s390x.s syscall.go syscall_aix.go syscall_aix_ppc.go syscall_aix_ppc64.go syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go syscall_darwin_arm64.go syscall_darwin_libSystem.go syscall_dragonfly.go syscall_dragonfly_amd64.go syscall_freebsd.go syscall_freebsd_386.go syscall_freebsd_amd64.go syscall_freebsd_arm.go syscall_freebsd_arm64.go syscall_freebsd_riscv64.go syscall_hurd.go syscall_hurd_386.go syscall_illumos.go syscall_linux.go syscall_linux_386.go syscall_linux_alarm.go syscall_linux_amd64.go syscall_linux_amd64_gc.go syscall_linux_arm.go syscall_linux_arm64.go syscall_linux_gc.go syscall_linux_gc_386.go syscall_linux_gc_arm.go syscall_linux_gccgo_386.go syscall_linux_gccgo_arm.go syscall_linux_loong64.go syscall_linux_mips64x.go syscall_linux_mipsx.go syscall_linux_ppc.go syscall_linux_ppc64x.go syscall_linux_riscv64.go syscall_linux_s390x.go syscall_linux_sparc64.go syscall_netbsd.go syscall_netbsd_386.go syscall_netbsd_amd64.go syscall_netbsd_arm.go syscall_netbsd_arm64.go syscall_openbsd.go syscall_openbsd_386.go syscall_openbsd_amd64.go syscall_openbsd_arm.go syscall_openbsd_arm64.go syscall_openbsd_libc.go syscall_openbsd_mips64.go syscall_openbsd_ppc64.go syscall_openbsd_riscv64.go syscall_solaris.go syscall_solaris_amd64.go syscall_unix.go syscall_unix_gc.go syscall_unix_gc_ppc64x.go syscall_zos_s390x.go sysvshm_linux.go sysvshm_unix.go sysvshm_unix_other.go timestruct.go unveil_openbsd.go vgetrandom_linux.go vgetrandom_unsupported.go xattr_bsd.go zerrors_aix_ppc.go zerrors_aix_ppc64.go zerrors_darwin_amd64.go zerrors_darwin_arm64.go zerrors_dragonfly_amd64.go zerrors_freebsd_386.go zerrors_freebsd_amd64.go zerrors_freebsd_arm.go zerrors_freebsd_arm64.go zerrors_freebsd_riscv64.go zerrors_linux.go zerrors_linux_386.go zerrors_linux_amd64.go zerrors_linux_arm.go zerrors_linux_arm64.go zerrors_linux_loong64.go zerrors_linux_mips.go zerrors_linux_mips64.go zerrors_linux_mips64le.go zerrors_linux_mipsle.go zerrors_linux_ppc.go zerrors_linux_ppc64.go zerrors_linux_ppc64le.go zerrors_linux_riscv64.go zerrors_linux_s390x.go zerrors_linux_sparc64.go zerrors_netbsd_386.go zerrors_netbsd_amd64.go zerrors_netbsd_arm.go zerrors_netbsd_arm64.go zerrors_openbsd_386.go zerrors_openbsd_amd64.go zerrors_openbsd_arm.go zerrors_openbsd_arm64.go zerrors_openbsd_mips64.go zerrors_openbsd_ppc64.go zerrors_openbsd_riscv64.go zerrors_solaris_amd64.go zerrors_zos_s390x.go zptrace_armnn_linux.go zptrace_linux_arm64.go zptrace_mipsnn_linux.go zptrace_mipsnnle_linux.go zptrace_x86_linux.go zsymaddr_zos_s390x.s zsyscall_aix_ppc.go zsyscall_aix_ppc64.go zsyscall_aix_ppc64_gc.go zsyscall_aix_ppc64_gccgo.go zsyscall_darwin_amd64.go zsyscall_darwin_amd64.s zsyscall_darwin_arm64.go zsyscall_darwin_arm64.s zsyscall_dragonfly_amd64.go zsyscall_freebsd_386.go zsyscall_freebsd_amd64.go zsyscall_freebsd_arm.go zsyscall_freebsd_arm64.go zsyscall_freebsd_riscv64.go zsyscall_illumos_amd64.go zsyscall_linux.go zsyscall_linux_386.go zsyscall_linux_amd64.go zsyscall_linux_arm.go zsyscall_linux_arm64.go zsyscall_linux_loong64.go zsyscall_linux_mips.go zsyscall_linux_mips64.go zsyscall_linux_mips64le.go zsyscall_linux_mipsle.go zsyscall_linux_ppc.go zsyscall_linux_ppc64.go zsyscall_linux_ppc64le.go zsyscall_linux_riscv64.go zsyscall_linux_s390x.go zsyscall_linux_sparc64.go zsyscall_netbsd_386.go zsyscall_netbsd_amd64.go zsyscall_netbsd_arm.go zsyscall_netbsd_arm64.go zsyscall_openbsd_386.go zsyscall_openbsd_386.s zsyscall_openbsd_amd64.go zsyscall_openbsd_amd64.s zsyscall_openbsd_arm.go zsyscall_openbsd_arm.s zsyscall_openbsd_arm64.go zsyscall_openbsd_arm64.s zsyscall_openbsd_mips64.go zsyscall_openbsd_mips64.s zsyscall_openbsd_ppc64.go zsyscall_openbsd_ppc64.s zsyscall_openbsd_riscv64.go zsyscall_openbsd_riscv64.s zsyscall_solaris_amd64.go zsyscall_zos_s390x.go zsysctl_openbsd_386.go zsysctl_openbsd_amd64.go zsysctl_openbsd_arm.go zsysctl_openbsd_arm64.go zsysctl_openbsd_mips64.go zsysctl_openbsd_ppc64.go zsysctl_openbsd_riscv64.go zsysnum_darwin_amd64.go zsysnum_darwin_arm64.go zsysnum_dragonfly_amd64.go zsysnum_freebsd_386.go zsysnum_freebsd_amd64.go zsysnum_freebsd_arm.go zsysnum_freebsd_arm64.go zsysnum_freebsd_riscv64.go zsysnum_linux_386.go zsysnum_linux_amd64.go zsysnum_linux_arm.go zsysnum_linux_arm64.go zsysnum_linux_loong64.go zsysnum_linux_mips.go zsysnum_linux_mips64.go zsysnum_linux_mips64le.go zsysnum_linux_mipsle.go zsysnum_linux_ppc.go zsysnum_linux_ppc64.go zsysnum_linux_ppc64le.go zsysnum_linux_riscv64.go zsysnum_linux_s390x.go zsysnum_linux_sparc64.go zsysnum_netbsd_386.go zsysnum_netbsd_amd64.go zsysnum_netbsd_arm.go zsysnum_netbsd_arm64.go zsysnum_openbsd_386.go zsysnum_openbsd_amd64.go zsysnum_openbsd_arm.go zsysnum_openbsd_arm64.go zsysnum_openbsd_mips64.go zsysnum_openbsd_ppc64.go zsysnum_openbsd_riscv64.go zsysnum_zos_s390x.go ztypes_aix_ppc.go ztypes_aix_ppc64.go ztypes_darwin_amd64.go ztypes_darwin_arm64.go ztypes_dragonfly_amd64.go ztypes_freebsd_386.go ztypes_freebsd_amd64.go ztypes_freebsd_arm.go ztypes_freebsd_arm64.go ztypes_freebsd_riscv64.go ztypes_linux.go ztypes_linux_386.go ztypes_linux_amd64.go ztypes_linux_arm.go ztypes_linux_arm64.go ztypes_linux_loong64.go ztypes_linux_mips.go ztypes_linux_mips64.go ztypes_linux_mips64le.go ztypes_linux_mipsle.go ztypes_linux_ppc.go ztypes_linux_ppc64.go ztypes_linux_ppc64le.go ztypes_linux_riscv64.go ztypes_linux_s390x.go ztypes_linux_sparc64.go ztypes_netbsd_386.go ztypes_netbsd_amd64.go ztypes_netbsd_arm.go ztypes_netbsd_arm64.go ztypes_openbsd_386.go ztypes_openbsd_amd64.go ztypes_openbsd_arm.go ztypes_openbsd_arm64.go ztypes_openbsd_mips64.go ztypes_openbsd_ppc64.go ztypes_openbsd_riscv64.go ztypes_solaris_amd64.go ztypes_zos_s390x.gowindows
aliases.go dll_windows.go env_windows.go eventlog.go exec_windows.go memory_windows.go mkerrors.bash mkknownfolderids.bash mksyscall.go race.go race0.go security_windows.go service.go setupapi_windows.go str.go syscall.go syscall_windows.go types_windows.go types_windows_386.go types_windows_amd64.go types_windows_arm.go types_windows_arm64.go zerrors_windows.go zknownfolderids_windows.go zsyscall_windows.goviews
blob.html commit.html files.html footer.html license.html markers.html nav-main.html nav-repository.html readme.html repositories.html repository.html tree.html
vendor/github.com/go-git/go-git/v5/plumbing/object/object.go
raw
1// Package object contains implementations of all Git objects and utility
2// functions to work with them.
3package object
4
5import (
6 "bytes"
7 "errors"
8 "fmt"
9 "io"
10 "strconv"
11 "time"
12
13 "github.com/go-git/go-git/v5/plumbing"
14 "github.com/go-git/go-git/v5/plumbing/storer"
15)
16
17// ErrUnsupportedObject trigger when a non-supported object is being decoded.
18var ErrUnsupportedObject = errors.New("unsupported object type")
19
20// Object is a generic representation of any git object. It is implemented by
21// Commit, Tree, Blob, and Tag, and includes the functions that are common to
22// them.
23//
24// Object is returned when an object can be of any type. It is frequently used
25// with a type cast to acquire the specific type of object:
26//
27// func process(obj Object) {
28// switch o := obj.(type) {
29// case *Commit:
30// // o is a Commit
31// case *Tree:
32// // o is a Tree
33// case *Blob:
34// // o is a Blob
35// case *Tag:
36// // o is a Tag
37// }
38// }
39//
40// This interface is intentionally different from plumbing.EncodedObject, which
41// is a lower level interface used by storage implementations to read and write
42// objects in its encoded form.
43type Object interface {
44 ID() plumbing.Hash
45 Type() plumbing.ObjectType
46 Decode(plumbing.EncodedObject) error
47 Encode(plumbing.EncodedObject) error
48}
49
50// GetObject gets an object from an object storer and decodes it.
51func GetObject(s storer.EncodedObjectStorer, h plumbing.Hash) (Object, error) {
52 o, err := s.EncodedObject(plumbing.AnyObject, h)
53 if err != nil {
54 return nil, err
55 }
56
57 return DecodeObject(s, o)
58}
59
60// DecodeObject decodes an encoded object into an Object and associates it to
61// the given object storer.
62func DecodeObject(s storer.EncodedObjectStorer, o plumbing.EncodedObject) (Object, error) {
63 switch o.Type() {
64 case plumbing.CommitObject:
65 return DecodeCommit(s, o)
66 case plumbing.TreeObject:
67 return DecodeTree(s, o)
68 case plumbing.BlobObject:
69 return DecodeBlob(o)
70 case plumbing.TagObject:
71 return DecodeTag(s, o)
72 default:
73 return nil, plumbing.ErrInvalidType
74 }
75}
76
77// DateFormat is the format being used in the original git implementation
78const DateFormat = "Mon Jan 02 15:04:05 2006 -0700"
79
80// Signature is used to identify who and when created a commit or tag.
81type Signature struct {
82 // Name represents a person name. It is an arbitrary string.
83 Name string
84 // Email is an email, but it cannot be assumed to be well-formed.
85 Email string
86 // When is the timestamp of the signature.
87 When time.Time
88}
89
90// Decode decodes a byte slice into a signature
91func (s *Signature) Decode(b []byte) {
92 open := bytes.LastIndexByte(b, '<')
93 close := bytes.LastIndexByte(b, '>')
94 if open == -1 || close == -1 {
95 return
96 }
97
98 if close < open {
99 return
100 }
101
102 s.Name = string(bytes.Trim(b[:open], " "))
103 s.Email = string(b[open+1 : close])
104
105 hasTime := close+2 < len(b)
106 if hasTime {
107 s.decodeTimeAndTimeZone(b[close+2:])
108 }
109}
110
111// Encode encodes a Signature into a writer.
112func (s *Signature) Encode(w io.Writer) error {
113 if _, err := fmt.Fprintf(w, "%s <%s> ", s.Name, s.Email); err != nil {
114 return err
115 }
116 if err := s.encodeTimeAndTimeZone(w); err != nil {
117 return err
118 }
119 return nil
120}
121
122var timeZoneLength = 5
123
124func (s *Signature) decodeTimeAndTimeZone(b []byte) {
125 space := bytes.IndexByte(b, ' ')
126 if space == -1 {
127 space = len(b)
128 }
129
130 ts, err := strconv.ParseInt(string(b[:space]), 10, 64)
131 if err != nil {
132 return
133 }
134
135 s.When = time.Unix(ts, 0).In(time.UTC)
136 var tzStart = space + 1
137 if tzStart >= len(b) || tzStart+timeZoneLength > len(b) {
138 return
139 }
140
141 timezone := string(b[tzStart : tzStart+timeZoneLength])
142 tzhours, err1 := strconv.ParseInt(timezone[0:3], 10, 64)
143 tzmins, err2 := strconv.ParseInt(timezone[3:], 10, 64)
144 if err1 != nil || err2 != nil {
145 return
146 }
147 if tzhours < 0 {
148 tzmins *= -1
149 }
150
151 tz := time.FixedZone("", int(tzhours*60*60+tzmins*60))
152
153 s.When = s.When.In(tz)
154}
155
156func (s *Signature) encodeTimeAndTimeZone(w io.Writer) error {
157 u := s.When.Unix()
158 if u < 0 {
159 u = 0
160 }
161 _, err := fmt.Fprintf(w, "%d %s", u, s.When.Format("-0700"))
162 return err
163}
164
165func (s *Signature) String() string {
166 return fmt.Sprintf("%s <%s>", s.Name, s.Email)
167}
168
169// ObjectIter provides an iterator for a set of objects.
170type ObjectIter struct {
171 storer.EncodedObjectIter
172 s storer.EncodedObjectStorer
173}
174
175// NewObjectIter takes a storer.EncodedObjectStorer and a
176// storer.EncodedObjectIter and returns an *ObjectIter that iterates over all
177// objects contained in the storer.EncodedObjectIter.
178func NewObjectIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) *ObjectIter {
179 return &ObjectIter{iter, s}
180}
181
182// Next moves the iterator to the next object and returns a pointer to it. If
183// there are no more objects, it returns io.EOF.
184func (iter *ObjectIter) Next() (Object, error) {
185 for {
186 obj, err := iter.EncodedObjectIter.Next()
187 if err != nil {
188 return nil, err
189 }
190
191 o, err := iter.toObject(obj)
192 if err == plumbing.ErrInvalidType {
193 continue
194 }
195
196 if err != nil {
197 return nil, err
198 }
199
200 return o, nil
201 }
202}
203
204// ForEach call the cb function for each object contained on this iter until
205// an error happens or the end of the iter is reached. If ErrStop is sent
206// the iteration is stop but no error is returned. The iterator is closed.
207func (iter *ObjectIter) ForEach(cb func(Object) error) error {
208 return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error {
209 o, err := iter.toObject(obj)
210 if err == plumbing.ErrInvalidType {
211 return nil
212 }
213
214 if err != nil {
215 return err
216 }
217
218 return cb(o)
219 })
220}
221
222func (iter *ObjectIter) toObject(obj plumbing.EncodedObject) (Object, error) {
223 switch obj.Type() {
224 case plumbing.BlobObject:
225 blob := &Blob{}
226 return blob, blob.Decode(obj)
227 case plumbing.TreeObject:
228 tree := &Tree{s: iter.s}
229 return tree, tree.Decode(obj)
230 case plumbing.CommitObject:
231 commit := &Commit{}
232 return commit, commit.Decode(obj)
233 case plumbing.TagObject:
234 tag := &Tag{}
235 return tag, tag.Decode(obj)
236 default:
237 return nil, plumbing.ErrInvalidType
238 }
239}