Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
songlinfeng
k8s-device-plugin
Commits
8a683270
Commit
8a683270
authored
Nov 25, 2025
by
songlinfeng
💬
Browse files
add k8s-device-plugin
parent
f5f6fd20
Changes
165
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
2881 additions
and
0 deletions
+2881
-0
vendor/github.com/golang/glog/glog_file_linux.go
vendor/github.com/golang/glog/glog_file_linux.go
+39
-0
vendor/github.com/golang/glog/glog_file_nonwindows.go
vendor/github.com/golang/glog/glog_file_nonwindows.go
+19
-0
vendor/github.com/golang/glog/glog_file_other.go
vendor/github.com/golang/glog/glog_file_other.go
+30
-0
vendor/github.com/golang/glog/glog_file_posix.go
vendor/github.com/golang/glog/glog_file_posix.go
+53
-0
vendor/github.com/golang/glog/glog_file_windows.go
vendor/github.com/golang/glog/glog_file_windows.go
+43
-0
vendor/github.com/golang/glog/glog_flags.go
vendor/github.com/golang/glog/glog_flags.go
+398
-0
vendor/github.com/golang/glog/internal/logsink/logsink.go
vendor/github.com/golang/glog/internal/logsink/logsink.go
+393
-0
vendor/github.com/golang/glog/internal/logsink/logsink_fatal.go
.../github.com/golang/glog/internal/logsink/logsink_fatal.go
+35
-0
vendor/github.com/golang/glog/internal/stackdump/stackdump.go
...or/github.com/golang/glog/internal/stackdump/stackdump.go
+127
-0
vendor/github.com/golang/protobuf/AUTHORS
vendor/github.com/golang/protobuf/AUTHORS
+3
-0
vendor/github.com/golang/protobuf/CONTRIBUTORS
vendor/github.com/golang/protobuf/CONTRIBUTORS
+3
-0
vendor/github.com/golang/protobuf/LICENSE
vendor/github.com/golang/protobuf/LICENSE
+28
-0
vendor/github.com/golang/protobuf/proto/buffer.go
vendor/github.com/golang/protobuf/proto/buffer.go
+324
-0
vendor/github.com/golang/protobuf/proto/defaults.go
vendor/github.com/golang/protobuf/proto/defaults.go
+63
-0
vendor/github.com/golang/protobuf/proto/deprecated.go
vendor/github.com/golang/protobuf/proto/deprecated.go
+113
-0
vendor/github.com/golang/protobuf/proto/discard.go
vendor/github.com/golang/protobuf/proto/discard.go
+58
-0
vendor/github.com/golang/protobuf/proto/extensions.go
vendor/github.com/golang/protobuf/proto/extensions.go
+356
-0
vendor/github.com/golang/protobuf/proto/properties.go
vendor/github.com/golang/protobuf/proto/properties.go
+306
-0
vendor/github.com/golang/protobuf/proto/proto.go
vendor/github.com/golang/protobuf/proto/proto.go
+167
-0
vendor/github.com/golang/protobuf/proto/registry.go
vendor/github.com/golang/protobuf/proto/registry.go
+323
-0
No files found.
Too many changes to show.
To preserve performance only
165 of 165+
files are displayed.
Plain diff
Email patch
vendor/github.com/golang/glog/glog_file_linux.go
0 → 100644
View file @
8a683270
// Go support for leveled logs, analogous to https://github.com/google/glog.
//
// Copyright 2023 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build linux
package
glog
import
(
"errors"
"runtime"
"syscall"
)
// abortProcess attempts to kill the current process in a way that will dump the
// currently-running goroutines someplace useful (like stderr).
//
// It does this by sending SIGABRT to the current thread.
//
// If successful, abortProcess does not return.
func
abortProcess
()
error
{
runtime
.
LockOSThread
()
if
err
:=
syscall
.
Tgkill
(
syscall
.
Getpid
(),
syscall
.
Gettid
(),
syscall
.
SIGABRT
);
err
!=
nil
{
return
err
}
return
errors
.
New
(
"log: killed current thread with SIGABRT, but still running"
)
}
vendor/github.com/golang/glog/glog_file_nonwindows.go
0 → 100644
View file @
8a683270
//go:build !windows
package
glog
import
"os/user"
// shouldRegisterStderrSink determines whether we should register a log sink that writes to stderr.
// Today, this always returns true on non-Windows platforms, as it specifically checks for a
// condition that is only present on Windows.
func
shouldRegisterStderrSink
()
bool
{
return
true
}
func
lookupUser
()
string
{
if
current
,
err
:=
user
.
Current
();
err
==
nil
{
return
current
.
Username
}
return
""
}
vendor/github.com/golang/glog/glog_file_other.go
0 → 100644
View file @
8a683270
// Go support for leveled logs, analogous to https://github.com/google/glog.
//
// Copyright 2023 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build !(unix || windows)
package
glog
import
(
"fmt"
"runtime"
)
// abortProcess returns an error on platforms that presumably don't support signals.
func
abortProcess
()
error
{
return
fmt
.
Errorf
(
"not sending SIGABRT (%s/%s does not support signals), falling back"
,
runtime
.
GOOS
,
runtime
.
GOARCH
)
}
vendor/github.com/golang/glog/glog_file_posix.go
0 → 100644
View file @
8a683270
// Go support for leveled logs, analogous to https://github.com/google/glog.
//
// Copyright 2023 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build (unix || windows) && !linux
package
glog
import
(
"os"
"syscall"
"time"
)
// abortProcess attempts to kill the current process in a way that will dump the
// currently-running goroutines someplace useful (like stderr).
//
// It does this by sending SIGABRT to the current process. Unfortunately, the
// signal may or may not be delivered to the current thread; in order to do that
// portably, we would need to add a cgo dependency and call pthread_kill.
//
// If successful, abortProcess does not return.
func
abortProcess
()
error
{
p
,
err
:=
os
.
FindProcess
(
os
.
Getpid
())
if
err
!=
nil
{
return
err
}
if
err
:=
p
.
Signal
(
syscall
.
SIGABRT
);
err
!=
nil
{
return
err
}
// Sent the signal. Now we wait for it to arrive and any SIGABRT handlers to
// run (and eventually terminate the process themselves).
//
// We could just "select{}" here, but there's an outside chance that would
// trigger the runtime's deadlock detector if there happen not to be any
// background goroutines running. So we'll sleep a while first to give
// the signal some time.
time
.
Sleep
(
10
*
time
.
Second
)
select
{}
}
vendor/github.com/golang/glog/glog_file_windows.go
0 → 100644
View file @
8a683270
//go:build windows
package
glog
import
(
"os"
"syscall"
)
// shouldRegisterStderrSink determines whether we should register a log sink that writes to stderr.
// Today, this checks if stderr is "valid", in that it maps to a non-NULL Handle.
// Windows Services are spawned without Stdout and Stderr, so any attempt to use them equates to
// referencing an invalid file Handle.
// os.Stderr's FD is derived from a call to `syscall.GetStdHandle(syscall.STD_ERROR_HANDLE)`.
// Documentation[1] for the GetStdHandle function indicates the return value may be NULL if the
// application lacks the standard handle, so consider Stderr valid if its FD is non-NULL.
// [1]: https://learn.microsoft.com/en-us/windows/console/getstdhandle
func
shouldRegisterStderrSink
()
bool
{
return
os
.
Stderr
.
Fd
()
!=
0
}
// This follows the logic in the standard library's user.Current() function, except
// that it leaves out the potentially expensive calls required to look up the user's
// display name in Active Directory.
func
lookupUser
()
string
{
token
,
err
:=
syscall
.
OpenCurrentProcessToken
()
if
err
!=
nil
{
return
""
}
defer
token
.
Close
()
tokenUser
,
err
:=
token
.
GetTokenUser
()
if
err
!=
nil
{
return
""
}
username
,
_
,
accountType
,
err
:=
tokenUser
.
User
.
Sid
.
LookupAccount
(
""
)
if
err
!=
nil
{
return
""
}
if
accountType
!=
syscall
.
SidTypeUser
{
return
""
}
return
username
}
vendor/github.com/golang/glog/glog_flags.go
0 → 100644
View file @
8a683270
// Go support for leveled logs, analogous to https://github.com/google/glog.
//
// Copyright 2023 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package
glog
import
(
"bytes"
"errors"
"flag"
"fmt"
"path/filepath"
"runtime"
"strconv"
"strings"
"sync"
"sync/atomic"
"github.com/golang/glog/internal/logsink"
)
// modulePat contains a filter for the -vmodule flag.
// It holds a verbosity level and a file pattern to match.
type
modulePat
struct
{
pattern
string
literal
bool
// The pattern is a literal string
full
bool
// The pattern wants to match the full path
level
Level
}
// match reports whether the file matches the pattern. It uses a string
// comparison if the pattern contains no metacharacters.
func
(
m
*
modulePat
)
match
(
full
,
file
string
)
bool
{
if
m
.
literal
{
if
m
.
full
{
return
full
==
m
.
pattern
}
return
file
==
m
.
pattern
}
if
m
.
full
{
match
,
_
:=
filepath
.
Match
(
m
.
pattern
,
full
)
return
match
}
match
,
_
:=
filepath
.
Match
(
m
.
pattern
,
file
)
return
match
}
// isLiteral reports whether the pattern is a literal string, that is, has no metacharacters
// that require filepath.Match to be called to match the pattern.
func
isLiteral
(
pattern
string
)
bool
{
return
!
strings
.
ContainsAny
(
pattern
,
`\*?[]`
)
}
// isFull reports whether the pattern matches the full file path, that is,
// whether it contains /.
func
isFull
(
pattern
string
)
bool
{
return
strings
.
ContainsRune
(
pattern
,
'/'
)
}
// verboseFlags represents the setting of the -v and -vmodule flags.
type
verboseFlags
struct
{
// moduleLevelCache is a sync.Map storing the -vmodule Level for each V()
// call site, identified by PC. If there is no matching -vmodule filter,
// the cached value is exactly v. moduleLevelCache is replaced with a new
// Map whenever the -vmodule or -v flag changes state.
moduleLevelCache
atomic
.
Value
// mu guards all fields below.
mu
sync
.
Mutex
// v stores the value of the -v flag. It may be read safely using
// sync.LoadInt32, but is only modified under mu.
v
Level
// module stores the parsed -vmodule flag.
module
[]
modulePat
// moduleLength caches len(module). If greater than zero, it
// means vmodule is enabled. It may be read safely using sync.LoadInt32, but
// is only modified under mu.
moduleLength
int32
}
// NOTE: For compatibility with the open-sourced v1 version of this
// package (github.com/golang/glog) we need to retain that flag.Level
// implements the flag.Value interface. See also go/log-vs-glog.
// String is part of the flag.Value interface.
func
(
l
*
Level
)
String
()
string
{
return
strconv
.
FormatInt
(
int64
(
l
.
Get
()
.
(
Level
)),
10
)
}
// Get is part of the flag.Value interface.
func
(
l
*
Level
)
Get
()
any
{
if
l
==
&
vflags
.
v
{
// l is the value registered for the -v flag.
return
Level
(
atomic
.
LoadInt32
((
*
int32
)(
l
)))
}
return
*
l
}
// Set is part of the flag.Value interface.
func
(
l
*
Level
)
Set
(
value
string
)
error
{
v
,
err
:=
strconv
.
Atoi
(
value
)
if
err
!=
nil
{
return
err
}
if
l
==
&
vflags
.
v
{
// l is the value registered for the -v flag.
vflags
.
mu
.
Lock
()
defer
vflags
.
mu
.
Unlock
()
vflags
.
moduleLevelCache
.
Store
(
&
sync
.
Map
{})
atomic
.
StoreInt32
((
*
int32
)(
l
),
int32
(
v
))
return
nil
}
*
l
=
Level
(
v
)
return
nil
}
// vModuleFlag is the flag.Value for the --vmodule flag.
type
vModuleFlag
struct
{
*
verboseFlags
}
func
(
f
vModuleFlag
)
String
()
string
{
// Do not panic on the zero value.
// https://groups.google.com/g/golang-nuts/c/Atlr8uAjn6U/m/iId17Td5BQAJ.
if
f
.
verboseFlags
==
nil
{
return
""
}
f
.
mu
.
Lock
()
defer
f
.
mu
.
Unlock
()
var
b
bytes
.
Buffer
for
i
,
f
:=
range
f
.
module
{
if
i
>
0
{
b
.
WriteRune
(
','
)
}
fmt
.
Fprintf
(
&
b
,
"%s=%d"
,
f
.
pattern
,
f
.
level
)
}
return
b
.
String
()
}
// Get returns nil for this flag type since the struct is not exported.
func
(
f
vModuleFlag
)
Get
()
any
{
return
nil
}
var
errVmoduleSyntax
=
errors
.
New
(
"syntax error: expect comma-separated list of filename=N"
)
// Syntax: -vmodule=recordio=2,foo/bar/baz=1,gfs*=3
func
(
f
vModuleFlag
)
Set
(
value
string
)
error
{
var
filter
[]
modulePat
for
_
,
pat
:=
range
strings
.
Split
(
value
,
","
)
{
if
len
(
pat
)
==
0
{
// Empty strings such as from a trailing comma can be ignored.
continue
}
patLev
:=
strings
.
Split
(
pat
,
"="
)
if
len
(
patLev
)
!=
2
||
len
(
patLev
[
0
])
==
0
||
len
(
patLev
[
1
])
==
0
{
return
errVmoduleSyntax
}
pattern
:=
patLev
[
0
]
v
,
err
:=
strconv
.
Atoi
(
patLev
[
1
])
if
err
!=
nil
{
return
errors
.
New
(
"syntax error: expect comma-separated list of filename=N"
)
}
// TODO: check syntax of filter?
filter
=
append
(
filter
,
modulePat
{
pattern
,
isLiteral
(
pattern
),
isFull
(
pattern
),
Level
(
v
)})
}
f
.
mu
.
Lock
()
defer
f
.
mu
.
Unlock
()
f
.
module
=
filter
atomic
.
StoreInt32
((
*
int32
)(
&
f
.
moduleLength
),
int32
(
len
(
f
.
module
)))
f
.
moduleLevelCache
.
Store
(
&
sync
.
Map
{})
return
nil
}
func
(
f
*
verboseFlags
)
levelForPC
(
pc
uintptr
)
Level
{
if
level
,
ok
:=
f
.
moduleLevelCache
.
Load
()
.
(
*
sync
.
Map
)
.
Load
(
pc
);
ok
{
return
level
.
(
Level
)
}
f
.
mu
.
Lock
()
defer
f
.
mu
.
Unlock
()
level
:=
Level
(
f
.
v
)
fn
:=
runtime
.
FuncForPC
(
pc
)
file
,
_
:=
fn
.
FileLine
(
pc
)
// The file is something like /a/b/c/d.go. We want just the d for
// regular matches, /a/b/c/d for full matches.
file
=
strings
.
TrimSuffix
(
file
,
".go"
)
full
:=
file
if
slash
:=
strings
.
LastIndex
(
file
,
"/"
);
slash
>=
0
{
file
=
file
[
slash
+
1
:
]
}
for
_
,
filter
:=
range
f
.
module
{
if
filter
.
match
(
full
,
file
)
{
level
=
filter
.
level
break
// Use the first matching level.
}
}
f
.
moduleLevelCache
.
Load
()
.
(
*
sync
.
Map
)
.
Store
(
pc
,
level
)
return
level
}
func
(
f
*
verboseFlags
)
enabled
(
callerDepth
int
,
level
Level
)
bool
{
if
atomic
.
LoadInt32
(
&
f
.
moduleLength
)
==
0
{
// No vmodule values specified, so compare against v level.
return
Level
(
atomic
.
LoadInt32
((
*
int32
)(
&
f
.
v
)))
>=
level
}
pcs
:=
[
1
]
uintptr
{}
if
runtime
.
Callers
(
callerDepth
+
2
,
pcs
[
:
])
<
1
{
return
false
}
frame
,
_
:=
runtime
.
CallersFrames
(
pcs
[
:
])
.
Next
()
return
f
.
levelForPC
(
frame
.
Entry
)
>=
level
}
// traceLocation represents an entry in the -log_backtrace_at flag.
type
traceLocation
struct
{
file
string
line
int
}
var
errTraceSyntax
=
errors
.
New
(
"syntax error: expect file.go:234"
)
func
parseTraceLocation
(
value
string
)
(
traceLocation
,
error
)
{
fields
:=
strings
.
Split
(
value
,
":"
)
if
len
(
fields
)
!=
2
{
return
traceLocation
{},
errTraceSyntax
}
file
,
lineStr
:=
fields
[
0
],
fields
[
1
]
if
!
strings
.
Contains
(
file
,
"."
)
{
return
traceLocation
{},
errTraceSyntax
}
line
,
err
:=
strconv
.
Atoi
(
lineStr
)
if
err
!=
nil
{
return
traceLocation
{},
errTraceSyntax
}
if
line
<
0
{
return
traceLocation
{},
errors
.
New
(
"negative value for line"
)
}
return
traceLocation
{
file
,
line
},
nil
}
// match reports whether the specified file and line matches the trace location.
// The argument file name is the full path, not the basename specified in the flag.
func
(
t
traceLocation
)
match
(
file
string
,
line
int
)
bool
{
if
t
.
line
!=
line
{
return
false
}
if
i
:=
strings
.
LastIndex
(
file
,
"/"
);
i
>=
0
{
file
=
file
[
i
+
1
:
]
}
return
t
.
file
==
file
}
func
(
t
traceLocation
)
String
()
string
{
return
fmt
.
Sprintf
(
"%s:%d"
,
t
.
file
,
t
.
line
)
}
// traceLocations represents the -log_backtrace_at flag.
// Syntax: -log_backtrace_at=recordio.go:234,sstable.go:456
// Note that unlike vmodule the file extension is included here.
type
traceLocations
struct
{
mu
sync
.
Mutex
locsLen
int32
// Safe for atomic read without mu.
locs
[]
traceLocation
}
func
(
t
*
traceLocations
)
String
()
string
{
t
.
mu
.
Lock
()
defer
t
.
mu
.
Unlock
()
var
buf
bytes
.
Buffer
for
i
,
tl
:=
range
t
.
locs
{
if
i
>
0
{
buf
.
WriteString
(
","
)
}
buf
.
WriteString
(
tl
.
String
())
}
return
buf
.
String
()
}
// Get always returns nil for this flag type since the struct is not exported
func
(
t
*
traceLocations
)
Get
()
any
{
return
nil
}
func
(
t
*
traceLocations
)
Set
(
value
string
)
error
{
var
locs
[]
traceLocation
for
_
,
s
:=
range
strings
.
Split
(
value
,
","
)
{
if
s
==
""
{
continue
}
loc
,
err
:=
parseTraceLocation
(
s
)
if
err
!=
nil
{
return
err
}
locs
=
append
(
locs
,
loc
)
}
t
.
mu
.
Lock
()
defer
t
.
mu
.
Unlock
()
atomic
.
StoreInt32
(
&
t
.
locsLen
,
int32
(
len
(
locs
)))
t
.
locs
=
locs
return
nil
}
func
(
t
*
traceLocations
)
match
(
file
string
,
line
int
)
bool
{
if
atomic
.
LoadInt32
(
&
t
.
locsLen
)
==
0
{
return
false
}
t
.
mu
.
Lock
()
defer
t
.
mu
.
Unlock
()
for
_
,
tl
:=
range
t
.
locs
{
if
tl
.
match
(
file
,
line
)
{
return
true
}
}
return
false
}
// severityFlag is an atomic flag.Value implementation for logsink.Severity.
type
severityFlag
int32
func
(
s
*
severityFlag
)
get
()
logsink
.
Severity
{
return
logsink
.
Severity
(
atomic
.
LoadInt32
((
*
int32
)(
s
)))
}
func
(
s
*
severityFlag
)
String
()
string
{
return
strconv
.
FormatInt
(
int64
(
*
s
),
10
)
}
func
(
s
*
severityFlag
)
Get
()
any
{
return
s
.
get
()
}
func
(
s
*
severityFlag
)
Set
(
value
string
)
error
{
threshold
,
err
:=
logsink
.
ParseSeverity
(
value
)
if
err
!=
nil
{
// Not a severity name. Try a raw number.
v
,
err
:=
strconv
.
Atoi
(
value
)
if
err
!=
nil
{
return
err
}
threshold
=
logsink
.
Severity
(
v
)
if
threshold
<
logsink
.
Info
||
threshold
>
logsink
.
Fatal
{
return
fmt
.
Errorf
(
"Severity %d out of range (min %d, max %d)."
,
v
,
logsink
.
Info
,
logsink
.
Fatal
)
}
}
atomic
.
StoreInt32
((
*
int32
)(
s
),
int32
(
threshold
))
return
nil
}
var
(
vflags
verboseFlags
// The -v and -vmodule flags.
logBacktraceAt
traceLocations
// The -log_backtrace_at flag.
// Boolean flags. Not handled atomically because the flag.Value interface
// does not let us avoid the =true, and that shorthand is necessary for
// compatibility. TODO: does this matter enough to fix? Seems unlikely.
toStderr
bool
// The -logtostderr flag.
alsoToStderr
bool
// The -alsologtostderr flag.
stderrThreshold
severityFlag
// The -stderrthreshold flag.
)
// verboseEnabled returns whether the caller at the given depth should emit
// verbose logs at the given level, with depth 0 identifying the caller of
// verboseEnabled.
func
verboseEnabled
(
callerDepth
int
,
level
Level
)
bool
{
return
vflags
.
enabled
(
callerDepth
+
1
,
level
)
}
// backtraceAt returns whether the logging call at the given function and line
// should also emit a backtrace of the current call stack.
func
backtraceAt
(
file
string
,
line
int
)
bool
{
return
logBacktraceAt
.
match
(
file
,
line
)
}
func
init
()
{
vflags
.
moduleLevelCache
.
Store
(
&
sync
.
Map
{})
flag
.
Var
(
&
vflags
.
v
,
"v"
,
"log level for V logs"
)
flag
.
Var
(
vModuleFlag
{
&
vflags
},
"vmodule"
,
"comma-separated list of pattern=N settings for file-filtered logging"
)
flag
.
Var
(
&
logBacktraceAt
,
"log_backtrace_at"
,
"when logging hits line file:N, emit a stack trace"
)
stderrThreshold
=
severityFlag
(
logsink
.
Error
)
flag
.
BoolVar
(
&
toStderr
,
"logtostderr"
,
false
,
"log to standard error instead of files"
)
flag
.
BoolVar
(
&
alsoToStderr
,
"alsologtostderr"
,
false
,
"log to standard error as well as files"
)
flag
.
Var
(
&
stderrThreshold
,
"stderrthreshold"
,
"logs at or above this threshold go to stderr"
)
}
vendor/github.com/golang/glog/internal/logsink/logsink.go
0 → 100644
View file @
8a683270
// Copyright 2023 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package
logsink
import
(
"bytes"
"context"
"fmt"
"strconv"
"strings"
"sync"
"time"
"github.com/golang/glog/internal/stackdump"
)
// MaxLogMessageLen is the limit on length of a formatted log message, including
// the standard line prefix and trailing newline.
//
// Chosen to match C++ glog.
const
MaxLogMessageLen
=
15000
// A Severity is a severity at which a message can be logged.
type
Severity
int8
// These constants identify the log levels in order of increasing severity.
// A message written to a high-severity log file is also written to each
// lower-severity log file.
const
(
Info
Severity
=
iota
Warning
Error
// Fatal contains logs written immediately before the process terminates.
//
// Sink implementations should not terminate the process themselves: the log
// package will perform any necessary cleanup and terminate the process as
// appropriate.
Fatal
)
func
(
s
Severity
)
String
()
string
{
switch
s
{
case
Info
:
return
"INFO"
case
Warning
:
return
"WARNING"
case
Error
:
return
"ERROR"
case
Fatal
:
return
"FATAL"
}
return
fmt
.
Sprintf
(
"%T(%d)"
,
s
,
s
)
}
// ParseSeverity returns the case-insensitive Severity value for the given string.
func
ParseSeverity
(
name
string
)
(
Severity
,
error
)
{
name
=
strings
.
ToUpper
(
name
)
for
s
:=
Info
;
s
<=
Fatal
;
s
++
{
if
s
.
String
()
==
name
{
return
s
,
nil
}
}
return
-
1
,
fmt
.
Errorf
(
"logsink: invalid severity %q"
,
name
)
}
// Meta is metadata about a logging call.
type
Meta
struct
{
// The context with which the log call was made (or nil). If set, the context
// is only valid during the logsink.Structured.Printf call, it should not be
// retained.
Context
context
.
Context
// Time is the time at which the log call was made.
Time
time
.
Time
// File is the source file from which the log entry originates.
File
string
// Line is the line offset within the source file.
Line
int
// Depth is the number of stack frames between the logsink and the log call.
Depth
int
Severity
Severity
// Verbose indicates whether the call was made via "log.V". Log entries below
// the current verbosity threshold are not sent to the sink.
Verbose
bool
// Thread ID. This can be populated with a thread ID from another source,
// such as a system we are importing logs from. In the normal case, this
// will be set to the process ID (PID), since Go doesn't have threads.
Thread
int64
// Stack trace starting in the logging function. May be nil.
// A logsink should implement the StackWanter interface to request this.
//
// Even if WantStack returns false, this field may be set (e.g. if another
// sink wants a stack trace).
Stack
*
stackdump
.
Stack
}
// Structured is a logging destination that accepts structured data as input.
type
Structured
interface
{
// Printf formats according to a fmt.Printf format specifier and writes a log
// entry. The precise result of formatting depends on the sink, but should
// aim for consistency with fmt.Printf.
//
// Printf returns the number of bytes occupied by the log entry, which
// may not be equal to the total number of bytes written.
//
// Printf returns any error encountered *if* it is severe enough that the log
// package should terminate the process.
//
// The sink must not modify the *Meta parameter, nor reference it after
// Printf has returned: it may be reused in subsequent calls.
Printf
(
meta
*
Meta
,
format
string
,
a
...
any
)
(
n
int
,
err
error
)
}
// StackWanter can be implemented by a logsink.Structured to indicate that it
// wants a stack trace to accompany at least some of the log messages it receives.
type
StackWanter
interface
{
// WantStack returns true if the sink requires a stack trace for a log message
// with this metadata.
//
// NOTE: Returning true implies that meta.Stack will be non-nil. Returning
// false does NOT imply that meta.Stack will be nil.
WantStack
(
meta
*
Meta
)
bool
}
// Text is a logging destination that accepts pre-formatted log lines (instead of
// structured data).
type
Text
interface
{
// Enabled returns whether this sink should output messages for the given
// Meta. If the sink returns false for a given Meta, the Printf function will
// not call Emit on it for the corresponding log message.
Enabled
(
*
Meta
)
bool
// Emit writes a pre-formatted text log entry (including any applicable
// header) to the log. It returns the number of bytes occupied by the entry
// (which may differ from the length of the passed-in slice).
//
// Emit returns any error encountered *if* it is severe enough that the log
// package should terminate the process.
//
// The sink must not modify the *Meta parameter, nor reference it after
// Printf has returned: it may be reused in subsequent calls.
//
// NOTE: When developing a text sink, keep in mind the surface in which the
// logs will be displayed, and whether it's important that the sink be
// resistent to tampering in the style of b/211428300. Standard text sinks
// (like `stderrSink`) do not protect against this (e.g. by escaping
// characters) because the cases where they would show user-influenced bytes
// are vanishingly small.
Emit
(
*
Meta
,
[]
byte
)
(
n
int
,
err
error
)
}
// bufs is a pool of *bytes.Buffer used in formatting log entries.
var
bufs
sync
.
Pool
// Pool of *bytes.Buffer.
// textPrintf formats a text log entry and emits it to all specified Text sinks.
//
// The returned n is the maximum across all Emit calls.
// The returned err is the first non-nil error encountered.
// Sinks that are disabled by configuration should return (0, nil).
func
textPrintf
(
m
*
Meta
,
textSinks
[]
Text
,
format
string
,
args
...
any
)
(
n
int
,
err
error
)
{
// We expect at most file, stderr, and perhaps syslog. If there are more,
// we'll end up allocating - no big deal.
const
maxExpectedTextSinks
=
3
var
noAllocSinks
[
maxExpectedTextSinks
]
Text
sinks
:=
noAllocSinks
[
:
0
]
for
_
,
s
:=
range
textSinks
{
if
s
.
Enabled
(
m
)
{
sinks
=
append
(
sinks
,
s
)
}
}
if
len
(
sinks
)
==
0
&&
m
.
Severity
!=
Fatal
{
return
0
,
nil
// No TextSinks specified; don't bother formatting.
}
bufi
:=
bufs
.
Get
()
var
buf
*
bytes
.
Buffer
if
bufi
==
nil
{
buf
=
bytes
.
NewBuffer
(
nil
)
bufi
=
buf
}
else
{
buf
=
bufi
.
(
*
bytes
.
Buffer
)
buf
.
Reset
()
}
// Lmmdd hh:mm:ss.uuuuuu PID/GID file:line]
//
// The "PID" entry arguably ought to be TID for consistency with other
// environments, but TID is not meaningful in a Go program due to the
// multiplexing of goroutines across threads.
//
// Avoid Fprintf, for speed. The format is so simple that we can do it quickly by hand.
// It's worth about 3X. Fprintf is hard.
const
severityChar
=
"IWEF"
buf
.
WriteByte
(
severityChar
[
m
.
Severity
])
_
,
month
,
day
:=
m
.
Time
.
Date
()
hour
,
minute
,
second
:=
m
.
Time
.
Clock
()
twoDigits
(
buf
,
int
(
month
))
twoDigits
(
buf
,
day
)
buf
.
WriteByte
(
' '
)
twoDigits
(
buf
,
hour
)
buf
.
WriteByte
(
':'
)
twoDigits
(
buf
,
minute
)
buf
.
WriteByte
(
':'
)
twoDigits
(
buf
,
second
)
buf
.
WriteByte
(
'.'
)
nDigits
(
buf
,
6
,
uint64
(
m
.
Time
.
Nanosecond
()
/
1000
),
'0'
)
buf
.
WriteByte
(
' '
)
nDigits
(
buf
,
7
,
uint64
(
m
.
Thread
),
' '
)
buf
.
WriteByte
(
' '
)
{
file
:=
m
.
File
if
i
:=
strings
.
LastIndex
(
file
,
"/"
);
i
>=
0
{
file
=
file
[
i
+
1
:
]
}
buf
.
WriteString
(
file
)
}
buf
.
WriteByte
(
':'
)
{
var
tmp
[
19
]
byte
buf
.
Write
(
strconv
.
AppendInt
(
tmp
[
:
0
],
int64
(
m
.
Line
),
10
))
}
buf
.
WriteString
(
"] "
)
msgStart
:=
buf
.
Len
()
fmt
.
Fprintf
(
buf
,
format
,
args
...
)
if
buf
.
Len
()
>
MaxLogMessageLen
-
1
{
buf
.
Truncate
(
MaxLogMessageLen
-
1
)
}
msgEnd
:=
buf
.
Len
()
if
b
:=
buf
.
Bytes
();
b
[
len
(
b
)
-
1
]
!=
'\n'
{
buf
.
WriteByte
(
'\n'
)
}
for
_
,
s
:=
range
sinks
{
sn
,
sErr
:=
s
.
Emit
(
m
,
buf
.
Bytes
())
if
sn
>
n
{
n
=
sn
}
if
sErr
!=
nil
&&
err
==
nil
{
err
=
sErr
}
}
if
m
.
Severity
==
Fatal
{
savedM
:=
*
m
fatalMessageStore
(
savedEntry
{
meta
:
&
savedM
,
msg
:
buf
.
Bytes
()[
msgStart
:
msgEnd
],
})
}
else
{
bufs
.
Put
(
bufi
)
}
return
n
,
err
}
const
digits
=
"0123456789"
// twoDigits formats a zero-prefixed two-digit integer to buf.
func
twoDigits
(
buf
*
bytes
.
Buffer
,
d
int
)
{
buf
.
WriteByte
(
digits
[(
d
/
10
)
%
10
])
buf
.
WriteByte
(
digits
[
d
%
10
])
}
// nDigits formats an n-digit integer to buf, padding with pad on the left. It
// assumes d != 0.
func
nDigits
(
buf
*
bytes
.
Buffer
,
n
int
,
d
uint64
,
pad
byte
)
{
var
tmp
[
20
]
byte
cutoff
:=
len
(
tmp
)
-
n
j
:=
len
(
tmp
)
-
1
for
;
d
>
0
;
j
--
{
tmp
[
j
]
=
digits
[
d
%
10
]
d
/=
10
}
for
;
j
>=
cutoff
;
j
--
{
tmp
[
j
]
=
pad
}
j
++
buf
.
Write
(
tmp
[
j
:
])
}
// Printf writes a log entry to all registered TextSinks in this package, then
// to all registered StructuredSinks.
//
// The returned n is the maximum across all Emit and Printf calls.
// The returned err is the first non-nil error encountered.
// Sinks that are disabled by configuration should return (0, nil).
func
Printf
(
m
*
Meta
,
format
string
,
args
...
any
)
(
n
int
,
err
error
)
{
m
.
Depth
++
n
,
err
=
textPrintf
(
m
,
TextSinks
,
format
,
args
...
)
for
_
,
sink
:=
range
StructuredSinks
{
// TODO: Support TextSinks that implement StackWanter?
if
sw
,
ok
:=
sink
.
(
StackWanter
);
ok
&&
sw
.
WantStack
(
m
)
{
if
m
.
Stack
==
nil
{
// First, try to find a stacktrace in args, otherwise generate one.
for
_
,
arg
:=
range
args
{
if
stack
,
ok
:=
arg
.
(
stackdump
.
Stack
);
ok
{
m
.
Stack
=
&
stack
break
}
}
if
m
.
Stack
==
nil
{
stack
:=
stackdump
.
Caller
(
/* skipDepth = */
m
.
Depth
)
m
.
Stack
=
&
stack
}
}
}
sn
,
sErr
:=
sink
.
Printf
(
m
,
format
,
args
...
)
if
sn
>
n
{
n
=
sn
}
if
sErr
!=
nil
&&
err
==
nil
{
err
=
sErr
}
}
return
n
,
err
}
// The sets of sinks to which logs should be written.
//
// These must only be modified during package init, and are read-only thereafter.
var
(
// StructuredSinks is the set of Structured sink instances to which logs
// should be written.
StructuredSinks
[]
Structured
// TextSinks is the set of Text sink instances to which logs should be
// written.
//
// These are registered separately from Structured sink implementations to
// avoid the need to repeat the work of formatting a message for each Text
// sink that writes it. The package-level Printf function writes to both sets
// independenty, so a given log destination should only register a Structured
// *or* a Text sink (not both).
TextSinks
[]
Text
)
type
savedEntry
struct
{
meta
*
Meta
msg
[]
byte
}
// StructuredTextWrapper is a Structured sink which forwards logs to a set of Text sinks.
//
// The purpose of this sink is to allow applications to intercept logging calls before they are
// serialized and sent to Text sinks. For example, if one needs to redact PII from logging
// arguments before they reach STDERR, one solution would be to do the redacting in a Structured
// sink that forwards logs to a StructuredTextWrapper instance, and make STDERR a child of that
// StructuredTextWrapper instance. This is how one could set this up in their application:
//
// func init() {
//
// wrapper := logsink.StructuredTextWrapper{TextSinks: logsink.TextSinks}
// // sanitizersink will intercept logs and remove PII
// sanitizer := sanitizersink{Sink: &wrapper}
// logsink.StructuredSinks = append(logsink.StructuredSinks, &sanitizer)
// logsink.TextSinks = nil
//
// }
type
StructuredTextWrapper
struct
{
// TextSinks is the set of Text sinks that should receive logs from this
// StructuredTextWrapper instance.
TextSinks
[]
Text
}
// Printf forwards logs to all Text sinks registered in the StructuredTextWrapper.
func
(
w
*
StructuredTextWrapper
)
Printf
(
meta
*
Meta
,
format
string
,
args
...
any
)
(
n
int
,
err
error
)
{
return
textPrintf
(
meta
,
w
.
TextSinks
,
format
,
args
...
)
}
vendor/github.com/golang/glog/internal/logsink/logsink_fatal.go
0 → 100644
View file @
8a683270
package
logsink
import
(
"sync/atomic"
"unsafe"
)
func
fatalMessageStore
(
e
savedEntry
)
{
// Only put a new one in if we haven't assigned before.
atomic
.
CompareAndSwapPointer
(
&
fatalMessage
,
nil
,
unsafe
.
Pointer
(
&
e
))
}
var
fatalMessage
unsafe
.
Pointer
// savedEntry stored with CompareAndSwapPointer
// FatalMessage returns the Meta and message contents of the first message
// logged with Fatal severity, or false if none has occurred.
func
FatalMessage
()
(
*
Meta
,
[]
byte
,
bool
)
{
e
:=
(
*
savedEntry
)(
atomic
.
LoadPointer
(
&
fatalMessage
))
if
e
==
nil
{
return
nil
,
nil
,
false
}
return
e
.
meta
,
e
.
msg
,
true
}
// DoNotUseRacyFatalMessage is FatalMessage, but worse.
//
//go:norace
//go:nosplit
func
DoNotUseRacyFatalMessage
()
(
*
Meta
,
[]
byte
,
bool
)
{
e
:=
(
*
savedEntry
)(
fatalMessage
)
if
e
==
nil
{
return
nil
,
nil
,
false
}
return
e
.
meta
,
e
.
msg
,
true
}
vendor/github.com/golang/glog/internal/stackdump/stackdump.go
0 → 100644
View file @
8a683270
// Copyright 2023 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package stackdump provides wrappers for runtime.Stack and runtime.Callers
// with uniform support for skipping caller frames.
//
// ⚠ Unlike the functions in the runtime package, these may allocate a
// non-trivial quantity of memory: use them with care. ⚠
package
stackdump
import
(
"bytes"
"runtime"
)
// runtimeStackSelfFrames is 1 if runtime.Stack includes the call to
// runtime.Stack itself or 0 if it does not.
//
// As of 2016-04-27, the gccgo compiler includes runtime.Stack but the gc
// compiler does not.
var
runtimeStackSelfFrames
=
func
()
int
{
for
n
:=
1
<<
10
;
n
<
1
<<
20
;
n
*=
2
{
buf
:=
make
([]
byte
,
n
)
n
:=
runtime
.
Stack
(
buf
,
false
)
if
bytes
.
Contains
(
buf
[
:
n
],
[]
byte
(
"runtime.Stack"
))
{
return
1
}
else
if
n
<
len
(
buf
)
||
bytes
.
Count
(
buf
,
[]
byte
(
"
\n
"
))
>=
3
{
return
0
}
}
return
0
}()
// Stack is a stack dump for a single goroutine.
type
Stack
struct
{
// Text is a representation of the stack dump in a human-readable format.
Text
[]
byte
// PC is a representation of the stack dump using raw program counter values.
PC
[]
uintptr
}
func
(
s
Stack
)
String
()
string
{
return
string
(
s
.
Text
)
}
// Caller returns the Stack dump for the calling goroutine, starting skipDepth
// frames before the caller of Caller. (Caller(0) provides a dump starting at
// the caller of this function.)
func
Caller
(
skipDepth
int
)
Stack
{
return
Stack
{
Text
:
CallerText
(
skipDepth
+
1
),
PC
:
CallerPC
(
skipDepth
+
1
),
}
}
// CallerText returns a textual dump of the stack starting skipDepth frames before
// the caller. (CallerText(0) provides a dump starting at the caller of this
// function.)
func
CallerText
(
skipDepth
int
)
[]
byte
{
for
n
:=
1
<<
10
;
;
n
*=
2
{
buf
:=
make
([]
byte
,
n
)
n
:=
runtime
.
Stack
(
buf
,
false
)
if
n
<
len
(
buf
)
{
return
pruneFrames
(
skipDepth
+
1
+
runtimeStackSelfFrames
,
buf
[
:
n
])
}
}
}
// CallerPC returns a dump of the program counters of the stack starting
// skipDepth frames before the caller. (CallerPC(0) provides a dump starting at
// the caller of this function.)
func
CallerPC
(
skipDepth
int
)
[]
uintptr
{
for
n
:=
1
<<
8
;
;
n
*=
2
{
buf
:=
make
([]
uintptr
,
n
)
n
:=
runtime
.
Callers
(
skipDepth
+
2
,
buf
)
if
n
<
len
(
buf
)
{
return
buf
[
:
n
]
}
}
}
// pruneFrames removes the topmost skipDepth frames of the first goroutine in a
// textual stack dump. It overwrites the passed-in slice.
//
// If there are fewer than skipDepth frames in the first goroutine's stack,
// pruneFrames prunes it to an empty stack and leaves the remaining contents
// intact.
func
pruneFrames
(
skipDepth
int
,
stack
[]
byte
)
[]
byte
{
headerLen
:=
0
for
i
,
c
:=
range
stack
{
if
c
==
'\n'
{
headerLen
=
i
+
1
break
}
}
if
headerLen
==
0
{
return
stack
// No header line - not a well-formed stack trace.
}
skipLen
:=
headerLen
skipNewlines
:=
skipDepth
*
2
for
;
skipLen
<
len
(
stack
)
&&
skipNewlines
>
0
;
skipLen
++
{
c
:=
stack
[
skipLen
]
if
c
!=
'\n'
{
continue
}
skipNewlines
--
skipLen
++
if
skipNewlines
==
0
||
skipLen
==
len
(
stack
)
||
stack
[
skipLen
]
==
'\n'
{
break
}
}
pruned
:=
stack
[
skipLen
-
headerLen
:
]
copy
(
pruned
,
stack
[
:
headerLen
])
return
pruned
}
vendor/github.com/golang/protobuf/AUTHORS
0 → 100644
View file @
8a683270
# This source code refers to The Go Authors for copyright purposes.
# The master list of authors is in the main Go distribution,
# visible at http://tip.golang.org/AUTHORS.
vendor/github.com/golang/protobuf/CONTRIBUTORS
0 → 100644
View file @
8a683270
# This source code was written by the Go contributors.
# The master list of contributors is in the main Go distribution,
# visible at http://tip.golang.org/CONTRIBUTORS.
vendor/github.com/golang/protobuf/LICENSE
0 → 100644
View file @
8a683270
Copyright 2010 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
vendor/github.com/golang/protobuf/proto/buffer.go
0 → 100644
View file @
8a683270
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
import
(
"errors"
"fmt"
"google.golang.org/protobuf/encoding/prototext"
"google.golang.org/protobuf/encoding/protowire"
"google.golang.org/protobuf/runtime/protoimpl"
)
const
(
WireVarint
=
0
WireFixed32
=
5
WireFixed64
=
1
WireBytes
=
2
WireStartGroup
=
3
WireEndGroup
=
4
)
// EncodeVarint returns the varint encoded bytes of v.
func
EncodeVarint
(
v
uint64
)
[]
byte
{
return
protowire
.
AppendVarint
(
nil
,
v
)
}
// SizeVarint returns the length of the varint encoded bytes of v.
// This is equal to len(EncodeVarint(v)).
func
SizeVarint
(
v
uint64
)
int
{
return
protowire
.
SizeVarint
(
v
)
}
// DecodeVarint parses a varint encoded integer from b,
// returning the integer value and the length of the varint.
// It returns (0, 0) if there is a parse error.
func
DecodeVarint
(
b
[]
byte
)
(
uint64
,
int
)
{
v
,
n
:=
protowire
.
ConsumeVarint
(
b
)
if
n
<
0
{
return
0
,
0
}
return
v
,
n
}
// Buffer is a buffer for encoding and decoding the protobuf wire format.
// It may be reused between invocations to reduce memory usage.
type
Buffer
struct
{
buf
[]
byte
idx
int
deterministic
bool
}
// NewBuffer allocates a new Buffer initialized with buf,
// where the contents of buf are considered the unread portion of the buffer.
func
NewBuffer
(
buf
[]
byte
)
*
Buffer
{
return
&
Buffer
{
buf
:
buf
}
}
// SetDeterministic specifies whether to use deterministic serialization.
//
// Deterministic serialization guarantees that for a given binary, equal
// messages will always be serialized to the same bytes. This implies:
//
// - Repeated serialization of a message will return the same bytes.
// - Different processes of the same binary (which may be executing on
// different machines) will serialize equal messages to the same bytes.
//
// Note that the deterministic serialization is NOT canonical across
// languages. It is not guaranteed to remain stable over time. It is unstable
// across different builds with schema changes due to unknown fields.
// Users who need canonical serialization (e.g., persistent storage in a
// canonical form, fingerprinting, etc.) should define their own
// canonicalization specification and implement their own serializer rather
// than relying on this API.
//
// If deterministic serialization is requested, map entries will be sorted
// by keys in lexographical order. This is an implementation detail and
// subject to change.
func
(
b
*
Buffer
)
SetDeterministic
(
deterministic
bool
)
{
b
.
deterministic
=
deterministic
}
// SetBuf sets buf as the internal buffer,
// where the contents of buf are considered the unread portion of the buffer.
func
(
b
*
Buffer
)
SetBuf
(
buf
[]
byte
)
{
b
.
buf
=
buf
b
.
idx
=
0
}
// Reset clears the internal buffer of all written and unread data.
func
(
b
*
Buffer
)
Reset
()
{
b
.
buf
=
b
.
buf
[
:
0
]
b
.
idx
=
0
}
// Bytes returns the internal buffer.
func
(
b
*
Buffer
)
Bytes
()
[]
byte
{
return
b
.
buf
}
// Unread returns the unread portion of the buffer.
func
(
b
*
Buffer
)
Unread
()
[]
byte
{
return
b
.
buf
[
b
.
idx
:
]
}
// Marshal appends the wire-format encoding of m to the buffer.
func
(
b
*
Buffer
)
Marshal
(
m
Message
)
error
{
var
err
error
b
.
buf
,
err
=
marshalAppend
(
b
.
buf
,
m
,
b
.
deterministic
)
return
err
}
// Unmarshal parses the wire-format message in the buffer and
// places the decoded results in m.
// It does not reset m before unmarshaling.
func
(
b
*
Buffer
)
Unmarshal
(
m
Message
)
error
{
err
:=
UnmarshalMerge
(
b
.
Unread
(),
m
)
b
.
idx
=
len
(
b
.
buf
)
return
err
}
type
unknownFields
struct
{
XXX_unrecognized
protoimpl
.
UnknownFields
}
func
(
m
*
unknownFields
)
String
()
string
{
panic
(
"not implemented"
)
}
func
(
m
*
unknownFields
)
Reset
()
{
panic
(
"not implemented"
)
}
func
(
m
*
unknownFields
)
ProtoMessage
()
{
panic
(
"not implemented"
)
}
// DebugPrint dumps the encoded bytes of b with a header and footer including s
// to stdout. This is only intended for debugging.
func
(
*
Buffer
)
DebugPrint
(
s
string
,
b
[]
byte
)
{
m
:=
MessageReflect
(
new
(
unknownFields
))
m
.
SetUnknown
(
b
)
b
,
_
=
prototext
.
MarshalOptions
{
AllowPartial
:
true
,
Indent
:
"
\t
"
}
.
Marshal
(
m
.
Interface
())
fmt
.
Printf
(
"==== %s ====
\n
%s==== %s ====
\n
"
,
s
,
b
,
s
)
}
// EncodeVarint appends an unsigned varint encoding to the buffer.
func
(
b
*
Buffer
)
EncodeVarint
(
v
uint64
)
error
{
b
.
buf
=
protowire
.
AppendVarint
(
b
.
buf
,
v
)
return
nil
}
// EncodeZigzag32 appends a 32-bit zig-zag varint encoding to the buffer.
func
(
b
*
Buffer
)
EncodeZigzag32
(
v
uint64
)
error
{
return
b
.
EncodeVarint
(
uint64
((
uint32
(
v
)
<<
1
)
^
uint32
((
int32
(
v
)
>>
31
))))
}
// EncodeZigzag64 appends a 64-bit zig-zag varint encoding to the buffer.
func
(
b
*
Buffer
)
EncodeZigzag64
(
v
uint64
)
error
{
return
b
.
EncodeVarint
(
uint64
((
uint64
(
v
)
<<
1
)
^
uint64
((
int64
(
v
)
>>
63
))))
}
// EncodeFixed32 appends a 32-bit little-endian integer to the buffer.
func
(
b
*
Buffer
)
EncodeFixed32
(
v
uint64
)
error
{
b
.
buf
=
protowire
.
AppendFixed32
(
b
.
buf
,
uint32
(
v
))
return
nil
}
// EncodeFixed64 appends a 64-bit little-endian integer to the buffer.
func
(
b
*
Buffer
)
EncodeFixed64
(
v
uint64
)
error
{
b
.
buf
=
protowire
.
AppendFixed64
(
b
.
buf
,
uint64
(
v
))
return
nil
}
// EncodeRawBytes appends a length-prefixed raw bytes to the buffer.
func
(
b
*
Buffer
)
EncodeRawBytes
(
v
[]
byte
)
error
{
b
.
buf
=
protowire
.
AppendBytes
(
b
.
buf
,
v
)
return
nil
}
// EncodeStringBytes appends a length-prefixed raw bytes to the buffer.
// It does not validate whether v contains valid UTF-8.
func
(
b
*
Buffer
)
EncodeStringBytes
(
v
string
)
error
{
b
.
buf
=
protowire
.
AppendString
(
b
.
buf
,
v
)
return
nil
}
// EncodeMessage appends a length-prefixed encoded message to the buffer.
func
(
b
*
Buffer
)
EncodeMessage
(
m
Message
)
error
{
var
err
error
b
.
buf
=
protowire
.
AppendVarint
(
b
.
buf
,
uint64
(
Size
(
m
)))
b
.
buf
,
err
=
marshalAppend
(
b
.
buf
,
m
,
b
.
deterministic
)
return
err
}
// DecodeVarint consumes an encoded unsigned varint from the buffer.
func
(
b
*
Buffer
)
DecodeVarint
()
(
uint64
,
error
)
{
v
,
n
:=
protowire
.
ConsumeVarint
(
b
.
buf
[
b
.
idx
:
])
if
n
<
0
{
return
0
,
protowire
.
ParseError
(
n
)
}
b
.
idx
+=
n
return
uint64
(
v
),
nil
}
// DecodeZigzag32 consumes an encoded 32-bit zig-zag varint from the buffer.
func
(
b
*
Buffer
)
DecodeZigzag32
()
(
uint64
,
error
)
{
v
,
err
:=
b
.
DecodeVarint
()
if
err
!=
nil
{
return
0
,
err
}
return
uint64
((
uint32
(
v
)
>>
1
)
^
uint32
((
int32
(
v
&
1
)
<<
31
)
>>
31
)),
nil
}
// DecodeZigzag64 consumes an encoded 64-bit zig-zag varint from the buffer.
func
(
b
*
Buffer
)
DecodeZigzag64
()
(
uint64
,
error
)
{
v
,
err
:=
b
.
DecodeVarint
()
if
err
!=
nil
{
return
0
,
err
}
return
uint64
((
uint64
(
v
)
>>
1
)
^
uint64
((
int64
(
v
&
1
)
<<
63
)
>>
63
)),
nil
}
// DecodeFixed32 consumes a 32-bit little-endian integer from the buffer.
func
(
b
*
Buffer
)
DecodeFixed32
()
(
uint64
,
error
)
{
v
,
n
:=
protowire
.
ConsumeFixed32
(
b
.
buf
[
b
.
idx
:
])
if
n
<
0
{
return
0
,
protowire
.
ParseError
(
n
)
}
b
.
idx
+=
n
return
uint64
(
v
),
nil
}
// DecodeFixed64 consumes a 64-bit little-endian integer from the buffer.
func
(
b
*
Buffer
)
DecodeFixed64
()
(
uint64
,
error
)
{
v
,
n
:=
protowire
.
ConsumeFixed64
(
b
.
buf
[
b
.
idx
:
])
if
n
<
0
{
return
0
,
protowire
.
ParseError
(
n
)
}
b
.
idx
+=
n
return
uint64
(
v
),
nil
}
// DecodeRawBytes consumes a length-prefixed raw bytes from the buffer.
// If alloc is specified, it returns a copy the raw bytes
// rather than a sub-slice of the buffer.
func
(
b
*
Buffer
)
DecodeRawBytes
(
alloc
bool
)
([]
byte
,
error
)
{
v
,
n
:=
protowire
.
ConsumeBytes
(
b
.
buf
[
b
.
idx
:
])
if
n
<
0
{
return
nil
,
protowire
.
ParseError
(
n
)
}
b
.
idx
+=
n
if
alloc
{
v
=
append
([]
byte
(
nil
),
v
...
)
}
return
v
,
nil
}
// DecodeStringBytes consumes a length-prefixed raw bytes from the buffer.
// It does not validate whether the raw bytes contain valid UTF-8.
func
(
b
*
Buffer
)
DecodeStringBytes
()
(
string
,
error
)
{
v
,
n
:=
protowire
.
ConsumeString
(
b
.
buf
[
b
.
idx
:
])
if
n
<
0
{
return
""
,
protowire
.
ParseError
(
n
)
}
b
.
idx
+=
n
return
v
,
nil
}
// DecodeMessage consumes a length-prefixed message from the buffer.
// It does not reset m before unmarshaling.
func
(
b
*
Buffer
)
DecodeMessage
(
m
Message
)
error
{
v
,
err
:=
b
.
DecodeRawBytes
(
false
)
if
err
!=
nil
{
return
err
}
return
UnmarshalMerge
(
v
,
m
)
}
// DecodeGroup consumes a message group from the buffer.
// It assumes that the start group marker has already been consumed and
// consumes all bytes until (and including the end group marker).
// It does not reset m before unmarshaling.
func
(
b
*
Buffer
)
DecodeGroup
(
m
Message
)
error
{
v
,
n
,
err
:=
consumeGroup
(
b
.
buf
[
b
.
idx
:
])
if
err
!=
nil
{
return
err
}
b
.
idx
+=
n
return
UnmarshalMerge
(
v
,
m
)
}
// consumeGroup parses b until it finds an end group marker, returning
// the raw bytes of the message (excluding the end group marker) and the
// the total length of the message (including the end group marker).
func
consumeGroup
(
b
[]
byte
)
([]
byte
,
int
,
error
)
{
b0
:=
b
depth
:=
1
// assume this follows a start group marker
for
{
_
,
wtyp
,
tagLen
:=
protowire
.
ConsumeTag
(
b
)
if
tagLen
<
0
{
return
nil
,
0
,
protowire
.
ParseError
(
tagLen
)
}
b
=
b
[
tagLen
:
]
var
valLen
int
switch
wtyp
{
case
protowire
.
VarintType
:
_
,
valLen
=
protowire
.
ConsumeVarint
(
b
)
case
protowire
.
Fixed32Type
:
_
,
valLen
=
protowire
.
ConsumeFixed32
(
b
)
case
protowire
.
Fixed64Type
:
_
,
valLen
=
protowire
.
ConsumeFixed64
(
b
)
case
protowire
.
BytesType
:
_
,
valLen
=
protowire
.
ConsumeBytes
(
b
)
case
protowire
.
StartGroupType
:
depth
++
case
protowire
.
EndGroupType
:
depth
--
default
:
return
nil
,
0
,
errors
.
New
(
"proto: cannot parse reserved wire type"
)
}
if
valLen
<
0
{
return
nil
,
0
,
protowire
.
ParseError
(
valLen
)
}
b
=
b
[
valLen
:
]
if
depth
==
0
{
return
b0
[
:
len
(
b0
)
-
len
(
b
)
-
tagLen
],
len
(
b0
)
-
len
(
b
),
nil
}
}
}
vendor/github.com/golang/protobuf/proto/defaults.go
0 → 100644
View file @
8a683270
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
import
(
"google.golang.org/protobuf/reflect/protoreflect"
)
// SetDefaults sets unpopulated scalar fields to their default values.
// Fields within a oneof are not set even if they have a default value.
// SetDefaults is recursively called upon any populated message fields.
func
SetDefaults
(
m
Message
)
{
if
m
!=
nil
{
setDefaults
(
MessageReflect
(
m
))
}
}
func
setDefaults
(
m
protoreflect
.
Message
)
{
fds
:=
m
.
Descriptor
()
.
Fields
()
for
i
:=
0
;
i
<
fds
.
Len
();
i
++
{
fd
:=
fds
.
Get
(
i
)
if
!
m
.
Has
(
fd
)
{
if
fd
.
HasDefault
()
&&
fd
.
ContainingOneof
()
==
nil
{
v
:=
fd
.
Default
()
if
fd
.
Kind
()
==
protoreflect
.
BytesKind
{
v
=
protoreflect
.
ValueOf
(
append
([]
byte
(
nil
),
v
.
Bytes
()
...
))
// copy the default bytes
}
m
.
Set
(
fd
,
v
)
}
continue
}
}
m
.
Range
(
func
(
fd
protoreflect
.
FieldDescriptor
,
v
protoreflect
.
Value
)
bool
{
switch
{
// Handle singular message.
case
fd
.
Cardinality
()
!=
protoreflect
.
Repeated
:
if
fd
.
Message
()
!=
nil
{
setDefaults
(
m
.
Get
(
fd
)
.
Message
())
}
// Handle list of messages.
case
fd
.
IsList
()
:
if
fd
.
Message
()
!=
nil
{
ls
:=
m
.
Get
(
fd
)
.
List
()
for
i
:=
0
;
i
<
ls
.
Len
();
i
++
{
setDefaults
(
ls
.
Get
(
i
)
.
Message
())
}
}
// Handle map of messages.
case
fd
.
IsMap
()
:
if
fd
.
MapValue
()
.
Message
()
!=
nil
{
ms
:=
m
.
Get
(
fd
)
.
Map
()
ms
.
Range
(
func
(
_
protoreflect
.
MapKey
,
v
protoreflect
.
Value
)
bool
{
setDefaults
(
v
.
Message
())
return
true
})
}
}
return
true
})
}
vendor/github.com/golang/protobuf/proto/deprecated.go
0 → 100644
View file @
8a683270
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
import
(
"encoding/json"
"errors"
"fmt"
"strconv"
protoV2
"google.golang.org/protobuf/proto"
)
var
(
// Deprecated: No longer returned.
ErrNil
=
errors
.
New
(
"proto: Marshal called with nil"
)
// Deprecated: No longer returned.
ErrTooLarge
=
errors
.
New
(
"proto: message encodes to over 2 GB"
)
// Deprecated: No longer returned.
ErrInternalBadWireType
=
errors
.
New
(
"proto: internal error: bad wiretype for oneof"
)
)
// Deprecated: Do not use.
type
Stats
struct
{
Emalloc
,
Dmalloc
,
Encode
,
Decode
,
Chit
,
Cmiss
,
Size
uint64
}
// Deprecated: Do not use.
func
GetStats
()
Stats
{
return
Stats
{}
}
// Deprecated: Do not use.
func
MarshalMessageSet
(
interface
{})
([]
byte
,
error
)
{
return
nil
,
errors
.
New
(
"proto: not implemented"
)
}
// Deprecated: Do not use.
func
UnmarshalMessageSet
([]
byte
,
interface
{})
error
{
return
errors
.
New
(
"proto: not implemented"
)
}
// Deprecated: Do not use.
func
MarshalMessageSetJSON
(
interface
{})
([]
byte
,
error
)
{
return
nil
,
errors
.
New
(
"proto: not implemented"
)
}
// Deprecated: Do not use.
func
UnmarshalMessageSetJSON
([]
byte
,
interface
{})
error
{
return
errors
.
New
(
"proto: not implemented"
)
}
// Deprecated: Do not use.
func
RegisterMessageSetType
(
Message
,
int32
,
string
)
{}
// Deprecated: Do not use.
func
EnumName
(
m
map
[
int32
]
string
,
v
int32
)
string
{
s
,
ok
:=
m
[
v
]
if
ok
{
return
s
}
return
strconv
.
Itoa
(
int
(
v
))
}
// Deprecated: Do not use.
func
UnmarshalJSONEnum
(
m
map
[
string
]
int32
,
data
[]
byte
,
enumName
string
)
(
int32
,
error
)
{
if
data
[
0
]
==
'"'
{
// New style: enums are strings.
var
repr
string
if
err
:=
json
.
Unmarshal
(
data
,
&
repr
);
err
!=
nil
{
return
-
1
,
err
}
val
,
ok
:=
m
[
repr
]
if
!
ok
{
return
0
,
fmt
.
Errorf
(
"unrecognized enum %s value %q"
,
enumName
,
repr
)
}
return
val
,
nil
}
// Old style: enums are ints.
var
val
int32
if
err
:=
json
.
Unmarshal
(
data
,
&
val
);
err
!=
nil
{
return
0
,
fmt
.
Errorf
(
"cannot unmarshal %#q into enum %s"
,
data
,
enumName
)
}
return
val
,
nil
}
// Deprecated: Do not use; this type existed for intenal-use only.
type
InternalMessageInfo
struct
{}
// Deprecated: Do not use; this method existed for intenal-use only.
func
(
*
InternalMessageInfo
)
DiscardUnknown
(
m
Message
)
{
DiscardUnknown
(
m
)
}
// Deprecated: Do not use; this method existed for intenal-use only.
func
(
*
InternalMessageInfo
)
Marshal
(
b
[]
byte
,
m
Message
,
deterministic
bool
)
([]
byte
,
error
)
{
return
protoV2
.
MarshalOptions
{
Deterministic
:
deterministic
}
.
MarshalAppend
(
b
,
MessageV2
(
m
))
}
// Deprecated: Do not use; this method existed for intenal-use only.
func
(
*
InternalMessageInfo
)
Merge
(
dst
,
src
Message
)
{
protoV2
.
Merge
(
MessageV2
(
dst
),
MessageV2
(
src
))
}
// Deprecated: Do not use; this method existed for intenal-use only.
func
(
*
InternalMessageInfo
)
Size
(
m
Message
)
int
{
return
protoV2
.
Size
(
MessageV2
(
m
))
}
// Deprecated: Do not use; this method existed for intenal-use only.
func
(
*
InternalMessageInfo
)
Unmarshal
(
m
Message
,
b
[]
byte
)
error
{
return
protoV2
.
UnmarshalOptions
{
Merge
:
true
}
.
Unmarshal
(
b
,
MessageV2
(
m
))
}
vendor/github.com/golang/protobuf/proto/discard.go
0 → 100644
View file @
8a683270
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
import
(
"google.golang.org/protobuf/reflect/protoreflect"
)
// DiscardUnknown recursively discards all unknown fields from this message
// and all embedded messages.
//
// When unmarshaling a message with unrecognized fields, the tags and values
// of such fields are preserved in the Message. This allows a later call to
// marshal to be able to produce a message that continues to have those
// unrecognized fields. To avoid this, DiscardUnknown is used to
// explicitly clear the unknown fields after unmarshaling.
func
DiscardUnknown
(
m
Message
)
{
if
m
!=
nil
{
discardUnknown
(
MessageReflect
(
m
))
}
}
func
discardUnknown
(
m
protoreflect
.
Message
)
{
m
.
Range
(
func
(
fd
protoreflect
.
FieldDescriptor
,
val
protoreflect
.
Value
)
bool
{
switch
{
// Handle singular message.
case
fd
.
Cardinality
()
!=
protoreflect
.
Repeated
:
if
fd
.
Message
()
!=
nil
{
discardUnknown
(
m
.
Get
(
fd
)
.
Message
())
}
// Handle list of messages.
case
fd
.
IsList
()
:
if
fd
.
Message
()
!=
nil
{
ls
:=
m
.
Get
(
fd
)
.
List
()
for
i
:=
0
;
i
<
ls
.
Len
();
i
++
{
discardUnknown
(
ls
.
Get
(
i
)
.
Message
())
}
}
// Handle map of messages.
case
fd
.
IsMap
()
:
if
fd
.
MapValue
()
.
Message
()
!=
nil
{
ms
:=
m
.
Get
(
fd
)
.
Map
()
ms
.
Range
(
func
(
_
protoreflect
.
MapKey
,
v
protoreflect
.
Value
)
bool
{
discardUnknown
(
v
.
Message
())
return
true
})
}
}
return
true
})
// Discard unknown fields.
if
len
(
m
.
GetUnknown
())
>
0
{
m
.
SetUnknown
(
nil
)
}
}
vendor/github.com/golang/protobuf/proto/extensions.go
0 → 100644
View file @
8a683270
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
import
(
"errors"
"fmt"
"reflect"
"google.golang.org/protobuf/encoding/protowire"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
"google.golang.org/protobuf/runtime/protoiface"
"google.golang.org/protobuf/runtime/protoimpl"
)
type
(
// ExtensionDesc represents an extension descriptor and
// is used to interact with an extension field in a message.
//
// Variables of this type are generated in code by protoc-gen-go.
ExtensionDesc
=
protoimpl
.
ExtensionInfo
// ExtensionRange represents a range of message extensions.
// Used in code generated by protoc-gen-go.
ExtensionRange
=
protoiface
.
ExtensionRangeV1
// Deprecated: Do not use; this is an internal type.
Extension
=
protoimpl
.
ExtensionFieldV1
// Deprecated: Do not use; this is an internal type.
XXX_InternalExtensions
=
protoimpl
.
ExtensionFields
)
// ErrMissingExtension reports whether the extension was not present.
var
ErrMissingExtension
=
errors
.
New
(
"proto: missing extension"
)
var
errNotExtendable
=
errors
.
New
(
"proto: not an extendable proto.Message"
)
// HasExtension reports whether the extension field is present in m
// either as an explicitly populated field or as an unknown field.
func
HasExtension
(
m
Message
,
xt
*
ExtensionDesc
)
(
has
bool
)
{
mr
:=
MessageReflect
(
m
)
if
mr
==
nil
||
!
mr
.
IsValid
()
{
return
false
}
// Check whether any populated known field matches the field number.
xtd
:=
xt
.
TypeDescriptor
()
if
isValidExtension
(
mr
.
Descriptor
(),
xtd
)
{
has
=
mr
.
Has
(
xtd
)
}
else
{
mr
.
Range
(
func
(
fd
protoreflect
.
FieldDescriptor
,
_
protoreflect
.
Value
)
bool
{
has
=
int32
(
fd
.
Number
())
==
xt
.
Field
return
!
has
})
}
// Check whether any unknown field matches the field number.
for
b
:=
mr
.
GetUnknown
();
!
has
&&
len
(
b
)
>
0
;
{
num
,
_
,
n
:=
protowire
.
ConsumeField
(
b
)
has
=
int32
(
num
)
==
xt
.
Field
b
=
b
[
n
:
]
}
return
has
}
// ClearExtension removes the extension field from m
// either as an explicitly populated field or as an unknown field.
func
ClearExtension
(
m
Message
,
xt
*
ExtensionDesc
)
{
mr
:=
MessageReflect
(
m
)
if
mr
==
nil
||
!
mr
.
IsValid
()
{
return
}
xtd
:=
xt
.
TypeDescriptor
()
if
isValidExtension
(
mr
.
Descriptor
(),
xtd
)
{
mr
.
Clear
(
xtd
)
}
else
{
mr
.
Range
(
func
(
fd
protoreflect
.
FieldDescriptor
,
_
protoreflect
.
Value
)
bool
{
if
int32
(
fd
.
Number
())
==
xt
.
Field
{
mr
.
Clear
(
fd
)
return
false
}
return
true
})
}
clearUnknown
(
mr
,
fieldNum
(
xt
.
Field
))
}
// ClearAllExtensions clears all extensions from m.
// This includes populated fields and unknown fields in the extension range.
func
ClearAllExtensions
(
m
Message
)
{
mr
:=
MessageReflect
(
m
)
if
mr
==
nil
||
!
mr
.
IsValid
()
{
return
}
mr
.
Range
(
func
(
fd
protoreflect
.
FieldDescriptor
,
_
protoreflect
.
Value
)
bool
{
if
fd
.
IsExtension
()
{
mr
.
Clear
(
fd
)
}
return
true
})
clearUnknown
(
mr
,
mr
.
Descriptor
()
.
ExtensionRanges
())
}
// GetExtension retrieves a proto2 extended field from m.
//
// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil),
// then GetExtension parses the encoded field and returns a Go value of the specified type.
// If the field is not present, then the default value is returned (if one is specified),
// otherwise ErrMissingExtension is reported.
//
// If the descriptor is type incomplete (i.e., ExtensionDesc.ExtensionType is nil),
// then GetExtension returns the raw encoded bytes for the extension field.
func
GetExtension
(
m
Message
,
xt
*
ExtensionDesc
)
(
interface
{},
error
)
{
mr
:=
MessageReflect
(
m
)
if
mr
==
nil
||
!
mr
.
IsValid
()
||
mr
.
Descriptor
()
.
ExtensionRanges
()
.
Len
()
==
0
{
return
nil
,
errNotExtendable
}
// Retrieve the unknown fields for this extension field.
var
bo
protoreflect
.
RawFields
for
bi
:=
mr
.
GetUnknown
();
len
(
bi
)
>
0
;
{
num
,
_
,
n
:=
protowire
.
ConsumeField
(
bi
)
if
int32
(
num
)
==
xt
.
Field
{
bo
=
append
(
bo
,
bi
[
:
n
]
...
)
}
bi
=
bi
[
n
:
]
}
// For type incomplete descriptors, only retrieve the unknown fields.
if
xt
.
ExtensionType
==
nil
{
return
[]
byte
(
bo
),
nil
}
// If the extension field only exists as unknown fields, unmarshal it.
// This is rarely done since proto.Unmarshal eagerly unmarshals extensions.
xtd
:=
xt
.
TypeDescriptor
()
if
!
isValidExtension
(
mr
.
Descriptor
(),
xtd
)
{
return
nil
,
fmt
.
Errorf
(
"proto: bad extended type; %T does not extend %T"
,
xt
.
ExtendedType
,
m
)
}
if
!
mr
.
Has
(
xtd
)
&&
len
(
bo
)
>
0
{
m2
:=
mr
.
New
()
if
err
:=
(
proto
.
UnmarshalOptions
{
Resolver
:
extensionResolver
{
xt
},
}
.
Unmarshal
(
bo
,
m2
.
Interface
()));
err
!=
nil
{
return
nil
,
err
}
if
m2
.
Has
(
xtd
)
{
mr
.
Set
(
xtd
,
m2
.
Get
(
xtd
))
clearUnknown
(
mr
,
fieldNum
(
xt
.
Field
))
}
}
// Check whether the message has the extension field set or a default.
var
pv
protoreflect
.
Value
switch
{
case
mr
.
Has
(
xtd
)
:
pv
=
mr
.
Get
(
xtd
)
case
xtd
.
HasDefault
()
:
pv
=
xtd
.
Default
()
default
:
return
nil
,
ErrMissingExtension
}
v
:=
xt
.
InterfaceOf
(
pv
)
rv
:=
reflect
.
ValueOf
(
v
)
if
isScalarKind
(
rv
.
Kind
())
{
rv2
:=
reflect
.
New
(
rv
.
Type
())
rv2
.
Elem
()
.
Set
(
rv
)
v
=
rv2
.
Interface
()
}
return
v
,
nil
}
// extensionResolver is a custom extension resolver that stores a single
// extension type that takes precedence over the global registry.
type
extensionResolver
struct
{
xt
protoreflect
.
ExtensionType
}
func
(
r
extensionResolver
)
FindExtensionByName
(
field
protoreflect
.
FullName
)
(
protoreflect
.
ExtensionType
,
error
)
{
if
xtd
:=
r
.
xt
.
TypeDescriptor
();
xtd
.
FullName
()
==
field
{
return
r
.
xt
,
nil
}
return
protoregistry
.
GlobalTypes
.
FindExtensionByName
(
field
)
}
func
(
r
extensionResolver
)
FindExtensionByNumber
(
message
protoreflect
.
FullName
,
field
protoreflect
.
FieldNumber
)
(
protoreflect
.
ExtensionType
,
error
)
{
if
xtd
:=
r
.
xt
.
TypeDescriptor
();
xtd
.
ContainingMessage
()
.
FullName
()
==
message
&&
xtd
.
Number
()
==
field
{
return
r
.
xt
,
nil
}
return
protoregistry
.
GlobalTypes
.
FindExtensionByNumber
(
message
,
field
)
}
// GetExtensions returns a list of the extensions values present in m,
// corresponding with the provided list of extension descriptors, xts.
// If an extension is missing in m, the corresponding value is nil.
func
GetExtensions
(
m
Message
,
xts
[]
*
ExtensionDesc
)
([]
interface
{},
error
)
{
mr
:=
MessageReflect
(
m
)
if
mr
==
nil
||
!
mr
.
IsValid
()
{
return
nil
,
errNotExtendable
}
vs
:=
make
([]
interface
{},
len
(
xts
))
for
i
,
xt
:=
range
xts
{
v
,
err
:=
GetExtension
(
m
,
xt
)
if
err
!=
nil
{
if
err
==
ErrMissingExtension
{
continue
}
return
vs
,
err
}
vs
[
i
]
=
v
}
return
vs
,
nil
}
// SetExtension sets an extension field in m to the provided value.
func
SetExtension
(
m
Message
,
xt
*
ExtensionDesc
,
v
interface
{})
error
{
mr
:=
MessageReflect
(
m
)
if
mr
==
nil
||
!
mr
.
IsValid
()
||
mr
.
Descriptor
()
.
ExtensionRanges
()
.
Len
()
==
0
{
return
errNotExtendable
}
rv
:=
reflect
.
ValueOf
(
v
)
if
reflect
.
TypeOf
(
v
)
!=
reflect
.
TypeOf
(
xt
.
ExtensionType
)
{
return
fmt
.
Errorf
(
"proto: bad extension value type. got: %T, want: %T"
,
v
,
xt
.
ExtensionType
)
}
if
rv
.
Kind
()
==
reflect
.
Ptr
{
if
rv
.
IsNil
()
{
return
fmt
.
Errorf
(
"proto: SetExtension called with nil value of type %T"
,
v
)
}
if
isScalarKind
(
rv
.
Elem
()
.
Kind
())
{
v
=
rv
.
Elem
()
.
Interface
()
}
}
xtd
:=
xt
.
TypeDescriptor
()
if
!
isValidExtension
(
mr
.
Descriptor
(),
xtd
)
{
return
fmt
.
Errorf
(
"proto: bad extended type; %T does not extend %T"
,
xt
.
ExtendedType
,
m
)
}
mr
.
Set
(
xtd
,
xt
.
ValueOf
(
v
))
clearUnknown
(
mr
,
fieldNum
(
xt
.
Field
))
return
nil
}
// SetRawExtension inserts b into the unknown fields of m.
//
// Deprecated: Use Message.ProtoReflect.SetUnknown instead.
func
SetRawExtension
(
m
Message
,
fnum
int32
,
b
[]
byte
)
{
mr
:=
MessageReflect
(
m
)
if
mr
==
nil
||
!
mr
.
IsValid
()
{
return
}
// Verify that the raw field is valid.
for
b0
:=
b
;
len
(
b0
)
>
0
;
{
num
,
_
,
n
:=
protowire
.
ConsumeField
(
b0
)
if
int32
(
num
)
!=
fnum
{
panic
(
fmt
.
Sprintf
(
"mismatching field number: got %d, want %d"
,
num
,
fnum
))
}
b0
=
b0
[
n
:
]
}
ClearExtension
(
m
,
&
ExtensionDesc
{
Field
:
fnum
})
mr
.
SetUnknown
(
append
(
mr
.
GetUnknown
(),
b
...
))
}
// ExtensionDescs returns a list of extension descriptors found in m,
// containing descriptors for both populated extension fields in m and
// also unknown fields of m that are in the extension range.
// For the later case, an type incomplete descriptor is provided where only
// the ExtensionDesc.Field field is populated.
// The order of the extension descriptors is undefined.
func
ExtensionDescs
(
m
Message
)
([]
*
ExtensionDesc
,
error
)
{
mr
:=
MessageReflect
(
m
)
if
mr
==
nil
||
!
mr
.
IsValid
()
||
mr
.
Descriptor
()
.
ExtensionRanges
()
.
Len
()
==
0
{
return
nil
,
errNotExtendable
}
// Collect a set of known extension descriptors.
extDescs
:=
make
(
map
[
protoreflect
.
FieldNumber
]
*
ExtensionDesc
)
mr
.
Range
(
func
(
fd
protoreflect
.
FieldDescriptor
,
v
protoreflect
.
Value
)
bool
{
if
fd
.
IsExtension
()
{
xt
:=
fd
.
(
protoreflect
.
ExtensionTypeDescriptor
)
if
xd
,
ok
:=
xt
.
Type
()
.
(
*
ExtensionDesc
);
ok
{
extDescs
[
fd
.
Number
()]
=
xd
}
}
return
true
})
// Collect a set of unknown extension descriptors.
extRanges
:=
mr
.
Descriptor
()
.
ExtensionRanges
()
for
b
:=
mr
.
GetUnknown
();
len
(
b
)
>
0
;
{
num
,
_
,
n
:=
protowire
.
ConsumeField
(
b
)
if
extRanges
.
Has
(
num
)
&&
extDescs
[
num
]
==
nil
{
extDescs
[
num
]
=
nil
}
b
=
b
[
n
:
]
}
// Transpose the set of descriptors into a list.
var
xts
[]
*
ExtensionDesc
for
num
,
xt
:=
range
extDescs
{
if
xt
==
nil
{
xt
=
&
ExtensionDesc
{
Field
:
int32
(
num
)}
}
xts
=
append
(
xts
,
xt
)
}
return
xts
,
nil
}
// isValidExtension reports whether xtd is a valid extension descriptor for md.
func
isValidExtension
(
md
protoreflect
.
MessageDescriptor
,
xtd
protoreflect
.
ExtensionTypeDescriptor
)
bool
{
return
xtd
.
ContainingMessage
()
==
md
&&
md
.
ExtensionRanges
()
.
Has
(
xtd
.
Number
())
}
// isScalarKind reports whether k is a protobuf scalar kind (except bytes).
// This function exists for historical reasons since the representation of
// scalars differs between v1 and v2, where v1 uses *T and v2 uses T.
func
isScalarKind
(
k
reflect
.
Kind
)
bool
{
switch
k
{
case
reflect
.
Bool
,
reflect
.
Int32
,
reflect
.
Int64
,
reflect
.
Uint32
,
reflect
.
Uint64
,
reflect
.
Float32
,
reflect
.
Float64
,
reflect
.
String
:
return
true
default
:
return
false
}
}
// clearUnknown removes unknown fields from m where remover.Has reports true.
func
clearUnknown
(
m
protoreflect
.
Message
,
remover
interface
{
Has
(
protoreflect
.
FieldNumber
)
bool
})
{
var
bo
protoreflect
.
RawFields
for
bi
:=
m
.
GetUnknown
();
len
(
bi
)
>
0
;
{
num
,
_
,
n
:=
protowire
.
ConsumeField
(
bi
)
if
!
remover
.
Has
(
num
)
{
bo
=
append
(
bo
,
bi
[
:
n
]
...
)
}
bi
=
bi
[
n
:
]
}
if
bi
:=
m
.
GetUnknown
();
len
(
bi
)
!=
len
(
bo
)
{
m
.
SetUnknown
(
bo
)
}
}
type
fieldNum
protoreflect
.
FieldNumber
func
(
n1
fieldNum
)
Has
(
n2
protoreflect
.
FieldNumber
)
bool
{
return
protoreflect
.
FieldNumber
(
n1
)
==
n2
}
vendor/github.com/golang/protobuf/proto/properties.go
0 → 100644
View file @
8a683270
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
import
(
"fmt"
"reflect"
"strconv"
"strings"
"sync"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/runtime/protoimpl"
)
// StructProperties represents protocol buffer type information for a
// generated protobuf message in the open-struct API.
//
// Deprecated: Do not use.
type
StructProperties
struct
{
// Prop are the properties for each field.
//
// Fields belonging to a oneof are stored in OneofTypes instead, with a
// single Properties representing the parent oneof held here.
//
// The order of Prop matches the order of fields in the Go struct.
// Struct fields that are not related to protobufs have a "XXX_" prefix
// in the Properties.Name and must be ignored by the user.
Prop
[]
*
Properties
// OneofTypes contains information about the oneof fields in this message.
// It is keyed by the protobuf field name.
OneofTypes
map
[
string
]
*
OneofProperties
}
// Properties represents the type information for a protobuf message field.
//
// Deprecated: Do not use.
type
Properties
struct
{
// Name is a placeholder name with little meaningful semantic value.
// If the name has an "XXX_" prefix, the entire Properties must be ignored.
Name
string
// OrigName is the protobuf field name or oneof name.
OrigName
string
// JSONName is the JSON name for the protobuf field.
JSONName
string
// Enum is a placeholder name for enums.
// For historical reasons, this is neither the Go name for the enum,
// nor the protobuf name for the enum.
Enum
string
// Deprecated: Do not use.
// Weak contains the full name of the weakly referenced message.
Weak
string
// Wire is a string representation of the wire type.
Wire
string
// WireType is the protobuf wire type for the field.
WireType
int
// Tag is the protobuf field number.
Tag
int
// Required reports whether this is a required field.
Required
bool
// Optional reports whether this is a optional field.
Optional
bool
// Repeated reports whether this is a repeated field.
Repeated
bool
// Packed reports whether this is a packed repeated field of scalars.
Packed
bool
// Proto3 reports whether this field operates under the proto3 syntax.
Proto3
bool
// Oneof reports whether this field belongs within a oneof.
Oneof
bool
// Default is the default value in string form.
Default
string
// HasDefault reports whether the field has a default value.
HasDefault
bool
// MapKeyProp is the properties for the key field for a map field.
MapKeyProp
*
Properties
// MapValProp is the properties for the value field for a map field.
MapValProp
*
Properties
}
// OneofProperties represents the type information for a protobuf oneof.
//
// Deprecated: Do not use.
type
OneofProperties
struct
{
// Type is a pointer to the generated wrapper type for the field value.
// This is nil for messages that are not in the open-struct API.
Type
reflect
.
Type
// Field is the index into StructProperties.Prop for the containing oneof.
Field
int
// Prop is the properties for the field.
Prop
*
Properties
}
// String formats the properties in the protobuf struct field tag style.
func
(
p
*
Properties
)
String
()
string
{
s
:=
p
.
Wire
s
+=
","
+
strconv
.
Itoa
(
p
.
Tag
)
if
p
.
Required
{
s
+=
",req"
}
if
p
.
Optional
{
s
+=
",opt"
}
if
p
.
Repeated
{
s
+=
",rep"
}
if
p
.
Packed
{
s
+=
",packed"
}
s
+=
",name="
+
p
.
OrigName
if
p
.
JSONName
!=
""
{
s
+=
",json="
+
p
.
JSONName
}
if
len
(
p
.
Enum
)
>
0
{
s
+=
",enum="
+
p
.
Enum
}
if
len
(
p
.
Weak
)
>
0
{
s
+=
",weak="
+
p
.
Weak
}
if
p
.
Proto3
{
s
+=
",proto3"
}
if
p
.
Oneof
{
s
+=
",oneof"
}
if
p
.
HasDefault
{
s
+=
",def="
+
p
.
Default
}
return
s
}
// Parse populates p by parsing a string in the protobuf struct field tag style.
func
(
p
*
Properties
)
Parse
(
tag
string
)
{
// For example: "bytes,49,opt,name=foo,def=hello!"
for
len
(
tag
)
>
0
{
i
:=
strings
.
IndexByte
(
tag
,
','
)
if
i
<
0
{
i
=
len
(
tag
)
}
switch
s
:=
tag
[
:
i
];
{
case
strings
.
HasPrefix
(
s
,
"name="
)
:
p
.
OrigName
=
s
[
len
(
"name="
)
:
]
case
strings
.
HasPrefix
(
s
,
"json="
)
:
p
.
JSONName
=
s
[
len
(
"json="
)
:
]
case
strings
.
HasPrefix
(
s
,
"enum="
)
:
p
.
Enum
=
s
[
len
(
"enum="
)
:
]
case
strings
.
HasPrefix
(
s
,
"weak="
)
:
p
.
Weak
=
s
[
len
(
"weak="
)
:
]
case
strings
.
Trim
(
s
,
"0123456789"
)
==
""
:
n
,
_
:=
strconv
.
ParseUint
(
s
,
10
,
32
)
p
.
Tag
=
int
(
n
)
case
s
==
"opt"
:
p
.
Optional
=
true
case
s
==
"req"
:
p
.
Required
=
true
case
s
==
"rep"
:
p
.
Repeated
=
true
case
s
==
"varint"
||
s
==
"zigzag32"
||
s
==
"zigzag64"
:
p
.
Wire
=
s
p
.
WireType
=
WireVarint
case
s
==
"fixed32"
:
p
.
Wire
=
s
p
.
WireType
=
WireFixed32
case
s
==
"fixed64"
:
p
.
Wire
=
s
p
.
WireType
=
WireFixed64
case
s
==
"bytes"
:
p
.
Wire
=
s
p
.
WireType
=
WireBytes
case
s
==
"group"
:
p
.
Wire
=
s
p
.
WireType
=
WireStartGroup
case
s
==
"packed"
:
p
.
Packed
=
true
case
s
==
"proto3"
:
p
.
Proto3
=
true
case
s
==
"oneof"
:
p
.
Oneof
=
true
case
strings
.
HasPrefix
(
s
,
"def="
)
:
// The default tag is special in that everything afterwards is the
// default regardless of the presence of commas.
p
.
HasDefault
=
true
p
.
Default
,
i
=
tag
[
len
(
"def="
)
:
],
len
(
tag
)
}
tag
=
strings
.
TrimPrefix
(
tag
[
i
:
],
","
)
}
}
// Init populates the properties from a protocol buffer struct tag.
//
// Deprecated: Do not use.
func
(
p
*
Properties
)
Init
(
typ
reflect
.
Type
,
name
,
tag
string
,
f
*
reflect
.
StructField
)
{
p
.
Name
=
name
p
.
OrigName
=
name
if
tag
==
""
{
return
}
p
.
Parse
(
tag
)
if
typ
!=
nil
&&
typ
.
Kind
()
==
reflect
.
Map
{
p
.
MapKeyProp
=
new
(
Properties
)
p
.
MapKeyProp
.
Init
(
nil
,
"Key"
,
f
.
Tag
.
Get
(
"protobuf_key"
),
nil
)
p
.
MapValProp
=
new
(
Properties
)
p
.
MapValProp
.
Init
(
nil
,
"Value"
,
f
.
Tag
.
Get
(
"protobuf_val"
),
nil
)
}
}
var
propertiesCache
sync
.
Map
// map[reflect.Type]*StructProperties
// GetProperties returns the list of properties for the type represented by t,
// which must be a generated protocol buffer message in the open-struct API,
// where protobuf message fields are represented by exported Go struct fields.
//
// Deprecated: Use protobuf reflection instead.
func
GetProperties
(
t
reflect
.
Type
)
*
StructProperties
{
if
p
,
ok
:=
propertiesCache
.
Load
(
t
);
ok
{
return
p
.
(
*
StructProperties
)
}
p
,
_
:=
propertiesCache
.
LoadOrStore
(
t
,
newProperties
(
t
))
return
p
.
(
*
StructProperties
)
}
func
newProperties
(
t
reflect
.
Type
)
*
StructProperties
{
if
t
.
Kind
()
!=
reflect
.
Struct
{
panic
(
fmt
.
Sprintf
(
"%v is not a generated message in the open-struct API"
,
t
))
}
var
hasOneof
bool
prop
:=
new
(
StructProperties
)
// Construct a list of properties for each field in the struct.
for
i
:=
0
;
i
<
t
.
NumField
();
i
++
{
p
:=
new
(
Properties
)
f
:=
t
.
Field
(
i
)
tagField
:=
f
.
Tag
.
Get
(
"protobuf"
)
p
.
Init
(
f
.
Type
,
f
.
Name
,
tagField
,
&
f
)
tagOneof
:=
f
.
Tag
.
Get
(
"protobuf_oneof"
)
if
tagOneof
!=
""
{
hasOneof
=
true
p
.
OrigName
=
tagOneof
}
// Rename unrelated struct fields with the "XXX_" prefix since so much
// user code simply checks for this to exclude special fields.
if
tagField
==
""
&&
tagOneof
==
""
&&
!
strings
.
HasPrefix
(
p
.
Name
,
"XXX_"
)
{
p
.
Name
=
"XXX_"
+
p
.
Name
p
.
OrigName
=
"XXX_"
+
p
.
OrigName
}
else
if
p
.
Weak
!=
""
{
p
.
Name
=
p
.
OrigName
// avoid possible "XXX_" prefix on weak field
}
prop
.
Prop
=
append
(
prop
.
Prop
,
p
)
}
// Construct a mapping of oneof field names to properties.
if
hasOneof
{
var
oneofWrappers
[]
interface
{}
if
fn
,
ok
:=
reflect
.
PtrTo
(
t
)
.
MethodByName
(
"XXX_OneofFuncs"
);
ok
{
oneofWrappers
=
fn
.
Func
.
Call
([]
reflect
.
Value
{
reflect
.
Zero
(
fn
.
Type
.
In
(
0
))})[
3
]
.
Interface
()
.
([]
interface
{})
}
if
fn
,
ok
:=
reflect
.
PtrTo
(
t
)
.
MethodByName
(
"XXX_OneofWrappers"
);
ok
{
oneofWrappers
=
fn
.
Func
.
Call
([]
reflect
.
Value
{
reflect
.
Zero
(
fn
.
Type
.
In
(
0
))})[
0
]
.
Interface
()
.
([]
interface
{})
}
if
m
,
ok
:=
reflect
.
Zero
(
reflect
.
PtrTo
(
t
))
.
Interface
()
.
(
protoreflect
.
ProtoMessage
);
ok
{
if
m
,
ok
:=
m
.
ProtoReflect
()
.
(
interface
{
ProtoMessageInfo
()
*
protoimpl
.
MessageInfo
});
ok
{
oneofWrappers
=
m
.
ProtoMessageInfo
()
.
OneofWrappers
}
}
prop
.
OneofTypes
=
make
(
map
[
string
]
*
OneofProperties
)
for
_
,
wrapper
:=
range
oneofWrappers
{
p
:=
&
OneofProperties
{
Type
:
reflect
.
ValueOf
(
wrapper
)
.
Type
(),
// *T
Prop
:
new
(
Properties
),
}
f
:=
p
.
Type
.
Elem
()
.
Field
(
0
)
p
.
Prop
.
Name
=
f
.
Name
p
.
Prop
.
Parse
(
f
.
Tag
.
Get
(
"protobuf"
))
// Determine the struct field that contains this oneof.
// Each wrapper is assignable to exactly one parent field.
var
foundOneof
bool
for
i
:=
0
;
i
<
t
.
NumField
()
&&
!
foundOneof
;
i
++
{
if
p
.
Type
.
AssignableTo
(
t
.
Field
(
i
)
.
Type
)
{
p
.
Field
=
i
foundOneof
=
true
}
}
if
!
foundOneof
{
panic
(
fmt
.
Sprintf
(
"%v is not a generated message in the open-struct API"
,
t
))
}
prop
.
OneofTypes
[
p
.
Prop
.
OrigName
]
=
p
}
}
return
prop
}
func
(
sp
*
StructProperties
)
Len
()
int
{
return
len
(
sp
.
Prop
)
}
func
(
sp
*
StructProperties
)
Less
(
i
,
j
int
)
bool
{
return
false
}
func
(
sp
*
StructProperties
)
Swap
(
i
,
j
int
)
{
return
}
vendor/github.com/golang/protobuf/proto/proto.go
0 → 100644
View file @
8a683270
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package proto provides functionality for handling protocol buffer messages.
// In particular, it provides marshaling and unmarshaling between a protobuf
// message and the binary wire format.
//
// See https://developers.google.com/protocol-buffers/docs/gotutorial for
// more information.
//
// Deprecated: Use the "google.golang.org/protobuf/proto" package instead.
package
proto
import
(
protoV2
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/runtime/protoiface"
"google.golang.org/protobuf/runtime/protoimpl"
)
const
(
ProtoPackageIsVersion1
=
true
ProtoPackageIsVersion2
=
true
ProtoPackageIsVersion3
=
true
ProtoPackageIsVersion4
=
true
)
// GeneratedEnum is any enum type generated by protoc-gen-go
// which is a named int32 kind.
// This type exists for documentation purposes.
type
GeneratedEnum
interface
{}
// GeneratedMessage is any message type generated by protoc-gen-go
// which is a pointer to a named struct kind.
// This type exists for documentation purposes.
type
GeneratedMessage
interface
{}
// Message is a protocol buffer message.
//
// This is the v1 version of the message interface and is marginally better
// than an empty interface as it lacks any method to programatically interact
// with the contents of the message.
//
// A v2 message is declared in "google.golang.org/protobuf/proto".Message and
// exposes protobuf reflection as a first-class feature of the interface.
//
// To convert a v1 message to a v2 message, use the MessageV2 function.
// To convert a v2 message to a v1 message, use the MessageV1 function.
type
Message
=
protoiface
.
MessageV1
// MessageV1 converts either a v1 or v2 message to a v1 message.
// It returns nil if m is nil.
func
MessageV1
(
m
GeneratedMessage
)
protoiface
.
MessageV1
{
return
protoimpl
.
X
.
ProtoMessageV1Of
(
m
)
}
// MessageV2 converts either a v1 or v2 message to a v2 message.
// It returns nil if m is nil.
func
MessageV2
(
m
GeneratedMessage
)
protoV2
.
Message
{
return
protoimpl
.
X
.
ProtoMessageV2Of
(
m
)
}
// MessageReflect returns a reflective view for a message.
// It returns nil if m is nil.
func
MessageReflect
(
m
Message
)
protoreflect
.
Message
{
return
protoimpl
.
X
.
MessageOf
(
m
)
}
// Marshaler is implemented by messages that can marshal themselves.
// This interface is used by the following functions: Size, Marshal,
// Buffer.Marshal, and Buffer.EncodeMessage.
//
// Deprecated: Do not implement.
type
Marshaler
interface
{
// Marshal formats the encoded bytes of the message.
// It should be deterministic and emit valid protobuf wire data.
// The caller takes ownership of the returned buffer.
Marshal
()
([]
byte
,
error
)
}
// Unmarshaler is implemented by messages that can unmarshal themselves.
// This interface is used by the following functions: Unmarshal, UnmarshalMerge,
// Buffer.Unmarshal, Buffer.DecodeMessage, and Buffer.DecodeGroup.
//
// Deprecated: Do not implement.
type
Unmarshaler
interface
{
// Unmarshal parses the encoded bytes of the protobuf wire input.
// The provided buffer is only valid for during method call.
// It should not reset the receiver message.
Unmarshal
([]
byte
)
error
}
// Merger is implemented by messages that can merge themselves.
// This interface is used by the following functions: Clone and Merge.
//
// Deprecated: Do not implement.
type
Merger
interface
{
// Merge merges the contents of src into the receiver message.
// It clones all data structures in src such that it aliases no mutable
// memory referenced by src.
Merge
(
src
Message
)
}
// RequiredNotSetError is an error type returned when
// marshaling or unmarshaling a message with missing required fields.
type
RequiredNotSetError
struct
{
err
error
}
func
(
e
*
RequiredNotSetError
)
Error
()
string
{
if
e
.
err
!=
nil
{
return
e
.
err
.
Error
()
}
return
"proto: required field not set"
}
func
(
e
*
RequiredNotSetError
)
RequiredNotSet
()
bool
{
return
true
}
func
checkRequiredNotSet
(
m
protoV2
.
Message
)
error
{
if
err
:=
protoV2
.
CheckInitialized
(
m
);
err
!=
nil
{
return
&
RequiredNotSetError
{
err
:
err
}
}
return
nil
}
// Clone returns a deep copy of src.
func
Clone
(
src
Message
)
Message
{
return
MessageV1
(
protoV2
.
Clone
(
MessageV2
(
src
)))
}
// Merge merges src into dst, which must be messages of the same type.
//
// Populated scalar fields in src are copied to dst, while populated
// singular messages in src are merged into dst by recursively calling Merge.
// The elements of every list field in src is appended to the corresponded
// list fields in dst. The entries of every map field in src is copied into
// the corresponding map field in dst, possibly replacing existing entries.
// The unknown fields of src are appended to the unknown fields of dst.
func
Merge
(
dst
,
src
Message
)
{
protoV2
.
Merge
(
MessageV2
(
dst
),
MessageV2
(
src
))
}
// Equal reports whether two messages are equal.
// If two messages marshal to the same bytes under deterministic serialization,
// then Equal is guaranteed to report true.
//
// Two messages are equal if they are the same protobuf message type,
// have the same set of populated known and extension field values,
// and the same set of unknown fields values.
//
// Scalar values are compared with the equivalent of the == operator in Go,
// except bytes values which are compared using bytes.Equal and
// floating point values which specially treat NaNs as equal.
// Message values are compared by recursively calling Equal.
// Lists are equal if each element value is also equal.
// Maps are equal if they have the same set of keys, where the pair of values
// for each key is also equal.
func
Equal
(
x
,
y
Message
)
bool
{
return
protoV2
.
Equal
(
MessageV2
(
x
),
MessageV2
(
y
))
}
func
isMessageSet
(
md
protoreflect
.
MessageDescriptor
)
bool
{
ms
,
ok
:=
md
.
(
interface
{
IsMessageSet
()
bool
})
return
ok
&&
ms
.
IsMessageSet
()
}
vendor/github.com/golang/protobuf/proto/registry.go
0 → 100644
View file @
8a683270
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
import
(
"bytes"
"compress/gzip"
"fmt"
"io/ioutil"
"reflect"
"strings"
"sync"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
"google.golang.org/protobuf/runtime/protoimpl"
)
// filePath is the path to the proto source file.
type
filePath
=
string
// e.g., "google/protobuf/descriptor.proto"
// fileDescGZIP is the compressed contents of the encoded FileDescriptorProto.
type
fileDescGZIP
=
[]
byte
var
fileCache
sync
.
Map
// map[filePath]fileDescGZIP
// RegisterFile is called from generated code to register the compressed
// FileDescriptorProto with the file path for a proto source file.
//
// Deprecated: Use protoregistry.GlobalFiles.RegisterFile instead.
func
RegisterFile
(
s
filePath
,
d
fileDescGZIP
)
{
// Decompress the descriptor.
zr
,
err
:=
gzip
.
NewReader
(
bytes
.
NewReader
(
d
))
if
err
!=
nil
{
panic
(
fmt
.
Sprintf
(
"proto: invalid compressed file descriptor: %v"
,
err
))
}
b
,
err
:=
ioutil
.
ReadAll
(
zr
)
if
err
!=
nil
{
panic
(
fmt
.
Sprintf
(
"proto: invalid compressed file descriptor: %v"
,
err
))
}
// Construct a protoreflect.FileDescriptor from the raw descriptor.
// Note that DescBuilder.Build automatically registers the constructed
// file descriptor with the v2 registry.
protoimpl
.
DescBuilder
{
RawDescriptor
:
b
}
.
Build
()
// Locally cache the raw descriptor form for the file.
fileCache
.
Store
(
s
,
d
)
}
// FileDescriptor returns the compressed FileDescriptorProto given the file path
// for a proto source file. It returns nil if not found.
//
// Deprecated: Use protoregistry.GlobalFiles.FindFileByPath instead.
func
FileDescriptor
(
s
filePath
)
fileDescGZIP
{
if
v
,
ok
:=
fileCache
.
Load
(
s
);
ok
{
return
v
.
(
fileDescGZIP
)
}
// Find the descriptor in the v2 registry.
var
b
[]
byte
if
fd
,
_
:=
protoregistry
.
GlobalFiles
.
FindFileByPath
(
s
);
fd
!=
nil
{
if
fd
,
ok
:=
fd
.
(
interface
{
ProtoLegacyRawDesc
()
[]
byte
});
ok
{
b
=
fd
.
ProtoLegacyRawDesc
()
}
else
{
// TODO: Use protodesc.ToFileDescriptorProto to construct
// a descriptorpb.FileDescriptorProto and marshal it.
// However, doing so causes the proto package to have a dependency
// on descriptorpb, leading to cyclic dependency issues.
}
}
// Locally cache the raw descriptor form for the file.
if
len
(
b
)
>
0
{
v
,
_
:=
fileCache
.
LoadOrStore
(
s
,
protoimpl
.
X
.
CompressGZIP
(
b
))
return
v
.
(
fileDescGZIP
)
}
return
nil
}
// enumName is the name of an enum. For historical reasons, the enum name is
// neither the full Go name nor the full protobuf name of the enum.
// The name is the dot-separated combination of just the proto package that the
// enum is declared within followed by the Go type name of the generated enum.
type
enumName
=
string
// e.g., "my.proto.package.GoMessage_GoEnum"
// enumsByName maps enum values by name to their numeric counterpart.
type
enumsByName
=
map
[
string
]
int32
// enumsByNumber maps enum values by number to their name counterpart.
type
enumsByNumber
=
map
[
int32
]
string
var
enumCache
sync
.
Map
// map[enumName]enumsByName
var
numFilesCache
sync
.
Map
// map[protoreflect.FullName]int
// RegisterEnum is called from the generated code to register the mapping of
// enum value names to enum numbers for the enum identified by s.
//
// Deprecated: Use protoregistry.GlobalTypes.RegisterEnum instead.
func
RegisterEnum
(
s
enumName
,
_
enumsByNumber
,
m
enumsByName
)
{
if
_
,
ok
:=
enumCache
.
Load
(
s
);
ok
{
panic
(
"proto: duplicate enum registered: "
+
s
)
}
enumCache
.
Store
(
s
,
m
)
// This does not forward registration to the v2 registry since this API
// lacks sufficient information to construct a complete v2 enum descriptor.
}
// EnumValueMap returns the mapping from enum value names to enum numbers for
// the enum of the given name. It returns nil if not found.
//
// Deprecated: Use protoregistry.GlobalTypes.FindEnumByName instead.
func
EnumValueMap
(
s
enumName
)
enumsByName
{
if
v
,
ok
:=
enumCache
.
Load
(
s
);
ok
{
return
v
.
(
enumsByName
)
}
// Check whether the cache is stale. If the number of files in the current
// package differs, then it means that some enums may have been recently
// registered upstream that we do not know about.
var
protoPkg
protoreflect
.
FullName
if
i
:=
strings
.
LastIndexByte
(
s
,
'.'
);
i
>=
0
{
protoPkg
=
protoreflect
.
FullName
(
s
[
:
i
])
}
v
,
_
:=
numFilesCache
.
Load
(
protoPkg
)
numFiles
,
_
:=
v
.
(
int
)
if
protoregistry
.
GlobalFiles
.
NumFilesByPackage
(
protoPkg
)
==
numFiles
{
return
nil
// cache is up-to-date; was not found earlier
}
// Update the enum cache for all enums declared in the given proto package.
numFiles
=
0
protoregistry
.
GlobalFiles
.
RangeFilesByPackage
(
protoPkg
,
func
(
fd
protoreflect
.
FileDescriptor
)
bool
{
walkEnums
(
fd
,
func
(
ed
protoreflect
.
EnumDescriptor
)
{
name
:=
protoimpl
.
X
.
LegacyEnumName
(
ed
)
if
_
,
ok
:=
enumCache
.
Load
(
name
);
!
ok
{
m
:=
make
(
enumsByName
)
evs
:=
ed
.
Values
()
for
i
:=
evs
.
Len
()
-
1
;
i
>=
0
;
i
--
{
ev
:=
evs
.
Get
(
i
)
m
[
string
(
ev
.
Name
())]
=
int32
(
ev
.
Number
())
}
enumCache
.
LoadOrStore
(
name
,
m
)
}
})
numFiles
++
return
true
})
numFilesCache
.
Store
(
protoPkg
,
numFiles
)
// Check cache again for enum map.
if
v
,
ok
:=
enumCache
.
Load
(
s
);
ok
{
return
v
.
(
enumsByName
)
}
return
nil
}
// walkEnums recursively walks all enums declared in d.
func
walkEnums
(
d
interface
{
Enums
()
protoreflect
.
EnumDescriptors
Messages
()
protoreflect
.
MessageDescriptors
},
f
func
(
protoreflect
.
EnumDescriptor
))
{
eds
:=
d
.
Enums
()
for
i
:=
eds
.
Len
()
-
1
;
i
>=
0
;
i
--
{
f
(
eds
.
Get
(
i
))
}
mds
:=
d
.
Messages
()
for
i
:=
mds
.
Len
()
-
1
;
i
>=
0
;
i
--
{
walkEnums
(
mds
.
Get
(
i
),
f
)
}
}
// messageName is the full name of protobuf message.
type
messageName
=
string
var
messageTypeCache
sync
.
Map
// map[messageName]reflect.Type
// RegisterType is called from generated code to register the message Go type
// for a message of the given name.
//
// Deprecated: Use protoregistry.GlobalTypes.RegisterMessage instead.
func
RegisterType
(
m
Message
,
s
messageName
)
{
mt
:=
protoimpl
.
X
.
LegacyMessageTypeOf
(
m
,
protoreflect
.
FullName
(
s
))
if
err
:=
protoregistry
.
GlobalTypes
.
RegisterMessage
(
mt
);
err
!=
nil
{
panic
(
err
)
}
messageTypeCache
.
Store
(
s
,
reflect
.
TypeOf
(
m
))
}
// RegisterMapType is called from generated code to register the Go map type
// for a protobuf message representing a map entry.
//
// Deprecated: Do not use.
func
RegisterMapType
(
m
interface
{},
s
messageName
)
{
t
:=
reflect
.
TypeOf
(
m
)
if
t
.
Kind
()
!=
reflect
.
Map
{
panic
(
fmt
.
Sprintf
(
"invalid map kind: %v"
,
t
))
}
if
_
,
ok
:=
messageTypeCache
.
Load
(
s
);
ok
{
panic
(
fmt
.
Errorf
(
"proto: duplicate proto message registered: %s"
,
s
))
}
messageTypeCache
.
Store
(
s
,
t
)
}
// MessageType returns the message type for a named message.
// It returns nil if not found.
//
// Deprecated: Use protoregistry.GlobalTypes.FindMessageByName instead.
func
MessageType
(
s
messageName
)
reflect
.
Type
{
if
v
,
ok
:=
messageTypeCache
.
Load
(
s
);
ok
{
return
v
.
(
reflect
.
Type
)
}
// Derive the message type from the v2 registry.
var
t
reflect
.
Type
if
mt
,
_
:=
protoregistry
.
GlobalTypes
.
FindMessageByName
(
protoreflect
.
FullName
(
s
));
mt
!=
nil
{
t
=
messageGoType
(
mt
)
}
// If we could not get a concrete type, it is possible that it is a
// pseudo-message for a map entry.
if
t
==
nil
{
d
,
_
:=
protoregistry
.
GlobalFiles
.
FindDescriptorByName
(
protoreflect
.
FullName
(
s
))
if
md
,
_
:=
d
.
(
protoreflect
.
MessageDescriptor
);
md
!=
nil
&&
md
.
IsMapEntry
()
{
kt
:=
goTypeForField
(
md
.
Fields
()
.
ByNumber
(
1
))
vt
:=
goTypeForField
(
md
.
Fields
()
.
ByNumber
(
2
))
t
=
reflect
.
MapOf
(
kt
,
vt
)
}
}
// Locally cache the message type for the given name.
if
t
!=
nil
{
v
,
_
:=
messageTypeCache
.
LoadOrStore
(
s
,
t
)
return
v
.
(
reflect
.
Type
)
}
return
nil
}
func
goTypeForField
(
fd
protoreflect
.
FieldDescriptor
)
reflect
.
Type
{
switch
k
:=
fd
.
Kind
();
k
{
case
protoreflect
.
EnumKind
:
if
et
,
_
:=
protoregistry
.
GlobalTypes
.
FindEnumByName
(
fd
.
Enum
()
.
FullName
());
et
!=
nil
{
return
enumGoType
(
et
)
}
return
reflect
.
TypeOf
(
protoreflect
.
EnumNumber
(
0
))
case
protoreflect
.
MessageKind
,
protoreflect
.
GroupKind
:
if
mt
,
_
:=
protoregistry
.
GlobalTypes
.
FindMessageByName
(
fd
.
Message
()
.
FullName
());
mt
!=
nil
{
return
messageGoType
(
mt
)
}
return
reflect
.
TypeOf
((
*
protoreflect
.
Message
)(
nil
))
.
Elem
()
default
:
return
reflect
.
TypeOf
(
fd
.
Default
()
.
Interface
())
}
}
func
enumGoType
(
et
protoreflect
.
EnumType
)
reflect
.
Type
{
return
reflect
.
TypeOf
(
et
.
New
(
0
))
}
func
messageGoType
(
mt
protoreflect
.
MessageType
)
reflect
.
Type
{
return
reflect
.
TypeOf
(
MessageV1
(
mt
.
Zero
()
.
Interface
()))
}
// MessageName returns the full protobuf name for the given message type.
//
// Deprecated: Use protoreflect.MessageDescriptor.FullName instead.
func
MessageName
(
m
Message
)
messageName
{
if
m
==
nil
{
return
""
}
if
m
,
ok
:=
m
.
(
interface
{
XXX_MessageName
()
messageName
});
ok
{
return
m
.
XXX_MessageName
()
}
return
messageName
(
protoimpl
.
X
.
MessageDescriptorOf
(
m
)
.
FullName
())
}
// RegisterExtension is called from the generated code to register
// the extension descriptor.
//
// Deprecated: Use protoregistry.GlobalTypes.RegisterExtension instead.
func
RegisterExtension
(
d
*
ExtensionDesc
)
{
if
err
:=
protoregistry
.
GlobalTypes
.
RegisterExtension
(
d
);
err
!=
nil
{
panic
(
err
)
}
}
type
extensionsByNumber
=
map
[
int32
]
*
ExtensionDesc
var
extensionCache
sync
.
Map
// map[messageName]extensionsByNumber
// RegisteredExtensions returns a map of the registered extensions for the
// provided protobuf message, indexed by the extension field number.
//
// Deprecated: Use protoregistry.GlobalTypes.RangeExtensionsByMessage instead.
func
RegisteredExtensions
(
m
Message
)
extensionsByNumber
{
// Check whether the cache is stale. If the number of extensions for
// the given message differs, then it means that some extensions were
// recently registered upstream that we do not know about.
s
:=
MessageName
(
m
)
v
,
_
:=
extensionCache
.
Load
(
s
)
xs
,
_
:=
v
.
(
extensionsByNumber
)
if
protoregistry
.
GlobalTypes
.
NumExtensionsByMessage
(
protoreflect
.
FullName
(
s
))
==
len
(
xs
)
{
return
xs
// cache is up-to-date
}
// Cache is stale, re-compute the extensions map.
xs
=
make
(
extensionsByNumber
)
protoregistry
.
GlobalTypes
.
RangeExtensionsByMessage
(
protoreflect
.
FullName
(
s
),
func
(
xt
protoreflect
.
ExtensionType
)
bool
{
if
xd
,
ok
:=
xt
.
(
*
ExtensionDesc
);
ok
{
xs
[
int32
(
xt
.
TypeDescriptor
()
.
Number
())]
=
xd
}
else
{
// TODO: This implies that the protoreflect.ExtensionType is a
// custom type not generated by protoc-gen-go. We could try and
// convert the type to an ExtensionDesc.
}
return
true
})
extensionCache
.
Store
(
s
,
xs
)
return
xs
}
Prev
1
2
3
4
5
6
7
8
9
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment