mirror of
https://github.com/GoogleContainerTools/kaniko
synced 2026-10-17 20:53:08 +02:00
* somehow now the only thing that doesnt work is devices.Device Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * this gets rid of all the compiler errors in the vendored code Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * fixed some things but a bunch of tests and maybe some compiler steps are still failing Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * all the things i figured out how to fix so far Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * guess i had to redo go mods after rebasing again Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * update docker constants to be SHOUTY CASE now Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * include DestPath in resolveEnv Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * fix one mistake in Docker lib upgrade and some typos/deprecations in the file Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * last changes (hopefully) to update to new docker libs Signed-off-by: Joe Kimmel <jkimmel@vmware.com> --------- Signed-off-by: Joe Kimmel <jkimmel@vmware.com>
81 lines
1.8 KiB
Go
81 lines
1.8 KiB
Go
package asm
|
|
|
|
// Metadata contains metadata about an instruction.
|
|
type Metadata struct {
|
|
head *metaElement
|
|
}
|
|
|
|
type metaElement struct {
|
|
next *metaElement
|
|
key, value interface{}
|
|
}
|
|
|
|
// Find the element containing key.
|
|
//
|
|
// Returns nil if there is no such element.
|
|
func (m *Metadata) find(key interface{}) *metaElement {
|
|
for e := m.head; e != nil; e = e.next {
|
|
if e.key == key {
|
|
return e
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Remove an element from the linked list.
|
|
//
|
|
// Copies as many elements of the list as necessary to remove r, but doesn't
|
|
// perform a full copy.
|
|
func (m *Metadata) remove(r *metaElement) {
|
|
current := &m.head
|
|
for e := m.head; e != nil; e = e.next {
|
|
if e == r {
|
|
// We've found the element we want to remove.
|
|
*current = e.next
|
|
|
|
// No need to copy the tail.
|
|
return
|
|
}
|
|
|
|
// There is another element in front of the one we want to remove.
|
|
// We have to copy it to be able to change metaElement.next.
|
|
cpy := &metaElement{key: e.key, value: e.value}
|
|
*current = cpy
|
|
current = &cpy.next
|
|
}
|
|
}
|
|
|
|
// Set a key to a value.
|
|
//
|
|
// If value is nil, the key is removed. Avoids modifying old metadata by
|
|
// copying if necessary.
|
|
func (m *Metadata) Set(key, value interface{}) {
|
|
if e := m.find(key); e != nil {
|
|
if e.value == value {
|
|
// Key is present and the value is the same. Nothing to do.
|
|
return
|
|
}
|
|
|
|
// Key is present with a different value. Create a copy of the list
|
|
// which doesn't have the element in it.
|
|
m.remove(e)
|
|
}
|
|
|
|
// m.head is now a linked list that doesn't contain key.
|
|
if value == nil {
|
|
return
|
|
}
|
|
|
|
m.head = &metaElement{key: key, value: value, next: m.head}
|
|
}
|
|
|
|
// Get the value of a key.
|
|
//
|
|
// Returns nil if no value with the given key is present.
|
|
func (m *Metadata) Get(key interface{}) interface{} {
|
|
if e := m.find(key); e != nil {
|
|
return e.value
|
|
}
|
|
return nil
|
|
}
|