Skip to content

v0.5.0

Compare
Choose a tag to compare
@cueckoo cueckoo released this 12 Apr 11:55
· 1664 commits to master since this release

This release focuses on changes to the implementation of comprehensions, the algorithm for detecting cycles in CUE, and the reimplementation of let comprehensions as fields.

Also included are a number of bug fixes and changes to help the KubeVela project upgrade off CUE v0.2.2 to the latest release. v0.5.0 is the first release since v0.4.3 back in April 2022. It has been a long time in the making, and is comprised of 277 commits.

It is worth noting that we do not plan nor wish for such long gaps between releases. For more details on upcoming releases and steps we are taking to increase release cadence as well as our confidence in each release, please see this discussion.

As a reminder: users can register their projects with unity, our regression and performance testing setup. unity is used to ensure that a project's CUE evaluations do not unexpectedly stop working, or regress in terms of performance. unity continues to catch multiple issues with each release. Adding your project to unity not only guarantees that we will not break your tests (if we do, we will work with you to fix your CUE code), but it also helps to improve the quality of each CUE release. We are currently in the process of releasing Unity as a GitHub App on the public Marketplace. Sign up to receive updates; we will be in touch as soon as the GitHub App is ready.

Thank you to @djosephsen, @joaopapereira, @mpvl, @mvdan, @myitcv, @qequ, @rogpeppe, @rytswd, @satotake, @spachava753, and @tmm1 for contributing to this release!

Project-level changes

Various CI-related changes have been made to simplify and streamline the GerritHub-based CI setup across the various CUE repositories. A common base package is vendored into each repository and used as a template for GitHub workflows and other configuration. For those interested in studying the setup, please see the files beneath internal/ci.

This release drops support for go1.16.x , go1.17.x and go1.18.x, is tested against go1.19.x and go1.20.x, and is built using go1.20.2.

Our dependency on github.com/rogpeppe/go-internal is upgraded to v1.9.0 and various testscript-related improvements have been made to CUE's tests.

GoReleaser has been upgrade to v1.16.2 as part of the release workflow. In a related change, CL 546920 moves us to a CUE-based source configuration for GoReleaser. This allows us to define the concept of 'latest', state which indicates whether we should perform the homebrew release and the Docker manifest latest steps. This fixes a long-standing bug whereby homebrew taps and Docker images were created for the latest release, regardless of whether that was a pre-release, or indeed a patch version of a non-current minor version.

As of CL 547507, CUE build artefacts published on GitHub are entirely reproducible, thanks to Go's support for reproducible, verifiable and verified builds.

Encoders

When cue import-ing YAML, the -R recursive flag now only recursively interprets text as YAML if it contains a newline CL 536902.

API

Various APIs have been transitioned to drop use of the deprecated cue.Runtime type, as well as migrating away from cue.Instance via cue.InstanceOrValue. Some use of these deprecated types remains: #1035, #1735, #1806. These will be tidied up in later releases as the API surface matures towards v1.0.0.

The cue package now supports InlineImports for Value.Syntax CL 541561. This leverages new support within the internal exporter to creating self-contained CUE. This change also deprecates Value.ResolveReferences().

Package cue adds Selector.Type to make it easier to pull out selector-specific information from a selector (for example, it makes it possible and cheap to retrieve the unquoted string label from a regular field selector) CL 542738.

Package cue adds Value.BuildInstance(). If a cue.Value exactly represents a package, BuildInstance() returns the build instance corresponding to the value CL 542769.

cue/stats is introduced as a new package for getting CUE operation statistics. The functionality is hoisted from internal/core/adt, but the package should for all practical purposes be seen as a new implementation. The stats have been aggregated as experimental functionality to the tools/flow package.

CL 546763 disallowed deprecated language features in the Go API. These features had long been deprecated in cmd/cue. This means that API operations will now fail on deprecated features whereas before they were handled in compatibility mode. The parser.FromVersion feature can be used to reenable these deprecated features.

Language

This release does not introduce any language changes. CL 537264 made some minor adjustments to the language specification to improve readability.

CL 541457 removes support for re-writing of old-style let declarations. This had already been deprecated for a long time and this change was made to enable support for aliases of embeddings.

Core evaluator

Per-field comprehensions

One of the major changes introduced in this release is how comprehensions are handled. CL 529524 move the evaluator to a model of per-field comprehensions.

Comprehensions are expanded for, if, and let clauses that yield zero or more structs to be embedded in the enclosing list or struct.

CUE does not allow cyclic dependencies between comprehensions if they result in an ambiguous set of fields. It does allow cascading insertions as in:

a?: int
b?: int
if a != _|_ {
    b: 2
}
if b != _|_ {
    c: 3
    d: 4
}

The way this works is that for fields with a fixed prefix path in a comprehension value, the comprehension is assigned to these respective fields.

More concretely, the above example is rewritten to:

a?: int
b: if a != _|_ { 2 }
c: if b != _|_ { 3 }
d: if b != _|_ { 4 }

where the fields with if clause are only inserted if their condition resolves to true. Note that this is not valid CUE; it may be in the future.

With this rewrite, dependencies in comprehension expressions are handled analogously to other expressions.

Note that a single comprehension may be distributed across multiple fields. The evaluator will ensure, however, that a comprehension is only evaluated once.

Analogous to reference cycles, as of CL 544129 we allow comprehensions to use the struct in which they are defined as source, as long as they do not introduce new fields, which would alter the source on which they iterate.

Reimplementation of cycle detection

The new algorithm is inspired by the cycle detection used by Tomabechi's 1 and Van Lohuizen's 2 graph unification algorithms.

Unlike with traditional graph unification, however, CUE uses references, which, unlike node equivalence, are unidirectional. This means that the technique to track equivalence through dereference, as common in graph unification algorithms like Tomabechi's, does not work unaltered.

The unidirectional nature of references imply that each reference equates an exact copy of the value it points to. This renders the original approach of node-pointer equivalence useless.

The new algorithm, a variant of Tomabechi's and Van Lohuizen's algorithm, looks at references equality on conjuncts, instead of node equality. This simplifies the accounting and allows for far simpler and precise accounting when using references instead of the traditional node equivalence.

More background info on cycles

We have to define when a cycle is detected. CUE implementations MUST report an error upon a structural cycle, and SHOULD report cycles at the shortest possible paths at which they occur, but MAY report these at deeper paths. For instance, the following CUE has a structural cycle:

f: g: f

The shortest path at which the cycle can be reported is f.g, but as all failed configurations are logically equal, it is fine for implementations to report them at f.g.g, for instance.

It is not, however, correct to assume that a reference to a parent is always a cycle. Consider this case:

a: [string]: b: a

Even though reference a refers to a parent node, the cycle needs to be fed by a concrete field in struct a to persist, meaning it cannot result in a cycle as defined in the spec as it is defined here. Note however, that a specialization of this configuration can result in a cycle. Consider

a: [string]: b: a
a: c: _

Here reference a is guaranteed to result in a structural cycle, as field c will match the pattern constraint unconditionally.

In other words, it is not possible to exclude tracking references across pattern constraints from cycle checking.

It is tempting to try to find a complete set of these edge cases with the aim to statically determine cases in which this occurs. But as Carpenter 3 demonstrates, it is possible for cycles to be created as a result of unifying two graphs that are themselves acyclic. The following example is a translation of Carpenters example to CUE:

y: {
	f: h: g
	g: _
}
x: {
	f: _
	g: f
}

Even though the above contains no cycles, the result of x & y is cyclic:

f: h: g
g: f

This means that, in practice, cycle detection has at least partially a dynamic component to it.

The language specification contains a higher-level and more complete overview of structural cycles.

Reimplementation of let comprehensions

CL 543362 made a change to internal/core to reimplement let comprehensions as fields. This makes it easier to track context as let comprehensions then follow the same paradigm as fields. It also allows debug information to be shown as to where lets are added in the tree. This change was accompanied by number of others that refined the approach.

Self-contained export

internal/core/export now implements an algorithm for generating self-contained CUE on export, an option that can further be refined by asking the exporter to inline imports. These internal changes manifest in changes to cue def and cuelang.org/go/cue that are described elsewhere.

Other changes

CL 545897 started tracking stats within the core CUE tests. This book keeping helps to spot likely regressions in performance early by collocating the stats with the CUE that is being evaluated.

Builtins

In the strconv package, strconv.FormatInt and strconv.FormatUint now support arbitary-precision format; see CL 538512.

CL 545898 improved the error messages for pkg builtins, by including the path in error in many cases, and passing a wrapped message for encoding/yaml.

CL 546237 allows incomplete list.MinItems constraints. Before it either returned false or true, ignoring that making a configuration more specific might still satisfy MinItems later on. CL 546238 made a similar change for struct.MinFields.

Tooling layer

Standard input is now parsed correctly in cue cmd-declared command tasks; see CL 541898.

cmd/cue

Version control system (VCS) information is included in cue version as of CL 540297. The Go version used to build cmd/cue is included as of CL 549302.

cue def now supports an --inline-imports flag which resolves imports to print a self-contained version of the command input. For example, given the txtar input:

-- cue.mod/module.cue --
module: "example.com/a"

-- in.cue --
package a

import "example.com/a/pkg"
import "list"

v: pkg.v

-- pkg/pkg.cue --
package pkg

v: { x: 3, y: x }

The running cue def --inline-imports in.cue will give:

package a

import "list"

v: {
	x: 3
	y: x
}

CL 546243 fixed a long-standing bug whereby the --ignore errors flag was not observed by cue eval.

Changelog

  • [release-branch.v0.5] internal/ci: use go1.19.8 for the release of v0.5.0 by @myitcv in d780488
  • internal/ci: fix cache eviction by @myitcv in a1d9054
  • internal/ci: address review feedback from CL 551352 by @myitcv in af01db1
  • internal/ci: allow trybot workflows to be workflow_dispatch-ed by @myitcv in 22156ef
  • internal/ci: refactor CI workflows by @myitcv in a4403eb
  • internal/ci: remove hard-codings in base package by @myitcv in 0eaee71
  • internal/ci: move evict_caches to base by @myitcv in 584b21e
  • internal/ci: remove mention of matrix and runner from base by @myitcv in 7c07680
  • internal/ci: remove trybot from push branches by @myitcv in 9f3af8f
  • internal/ci: refactor base caching pattern by @myitcv in 390bca5
  • internal/ci: drop pullThroughProxy step by @myitcv in a14fbf4
  • [release-branch.v0.5] internal/ci: bring inline with be0601b by @myitcv in f4d04a7
  • internal/ci: bump pinned version of Go for releases by @mvdan in 374a2cc
  • internal/core/adt: revert fix for 2209 by @mpvl in c0421b4
  • internal/core/adt: fix possible infinte loop for API usage by @mpvl in 1ce9120
  • internal/core/adt: fix regression in comparing to bottom by @mpvl in 87c79ef
  • internal/core/adt: remove unnecessary check by @mpvl in 28321f6
  • internal/core/adt: detect closed lists as fatal errors by @mpvl in 5d42c6c
  • internal/core/adt: sharpen condition for scalar setting by @mpvl in 3ba76ba
  • internal/ci: fix goreleaser in non-snapshot mode again by @mvdan in 576d0e4
  • internal/core/adt: fix 2235 by @mpvl in ca411de
  • internal/core/adt: add tests for 2235 by @mpvl in 89693e1
  • cmd/cue: include Go in the version command by @mvdan in 9b1f248
  • internal/ci: fix and test the release workflow on branches by @mvdan in 63749fe
  • cmd/cue: add evaluator stats support by @mpvl in d573e0c
  • cmd/cue: add tests for issue 345 by @mpvl in 352a736
  • internal/core/adt: filter more disjunctions by @mpvl in 5a6bd19
  • internal/core/adt: add tests for 2209 by @mpvl in 6b45d7e
  • internal/core/adt: improve mechanism for conjunct insertion by @mpvl in 887f564
  • internal/core/adt: add tests for conjunct insertion by @mpvl in 81e4cba
  • internal/core/adt: only set scalar if not already defined by @mpvl in f23e3d5
  • github: bring the bug report template up to date by @mvdan in b75fdc8
  • internal/ci: make github CLI shell invocations safer by @mvdan in 94765d6
  • internal/core: clone let upon use of for var references by @mpvl in 3a79e96
  • internal/core/debug: change notation for "multi" lets by @mpvl in fd05908
  • internal/core/adt: don't add errors to "void" arcs by @mpvl in 0b41dbb
  • cue/testdata/benchmarks: add benchmark for let key by @mpvl in a8d7c59
  • internal/core/adt: evaluate expressions directly by @mpvl in 8fb13d4
  • internal/core/eval: node should not finalize itself mid flight by @mpvl in 9d27e0d
  • cmd/cue: don't panic in vet if a schema has incomplete errors by @mvdan in f6841d1
  • internal/ci: deploy tip.cuelang.org via repository_dispatch by @myitcv in 632cc62
  • internal/ci: enable push_to_tip_trybot by @myitcv in fe692c5
  • internal/ci: apply various CI-related changes from cuelang.org repo by @myitcv in 4eaa946
  • internal/ci/goreleaser: actually make builds reproducible by @myitcv in 45aa5c0
  • internal/ci/goreleaser: make builds reproducible by @myitcv in 16edb00
  • cue/export/extract: fix comments with comprehensions by @mpvl in 959dc46
  • internal/core/adt: don't evaluate inlined structs prematurely by @mpvl in 45ff282
  • internal/core/adt: add tests for issue #2163 by @mpvl in a9f4fc3
  • internal/ci: review follow-up changes to goreleaser_tool.cue by @mvdan in 7ea44a3
  • internal/ci: switch to CUE based definition for goreleaser by @myitcv in 79a476b
  • internal/ci: import for current goreleaser configuration by @myitcv in e69c517
  • internal/ci: upgrade to later GitHub workflow schema by @myitcv in f036b34
  • internal/ci: upgrade to latest GoReleaser version by @myitcv in 248f2b3
  • goreleaser: formatting changes in Yaml file by @myitcv in e93b5ed
  • internal/ci: use newer versions of the docker github actions by @mvdan in f56600d
  • internal/core/adt: base error mode on requested state by @mpvl in 214e112
  • internal/core/adt: only set validation result when safe by @mpvl in 88857e0
  • internal/core/adt: pass desired state to more functions by @mpvl in 55cdb74
  • internal/core/adt: pass more state around by @mpvl in 3dfeb41
  • internal/core/adt: pass state to validation by @mpvl in 0954c6f
  • internal/core/adt: pass state to evaluate by @mpvl in 7d50228
  • internal/core/adt: avoid duplicate insertion of conjuncts by @mpvl in d341814
  • internal/core/adt: tighten uniqueness of conjuncts by @mpvl in a68c6ce
  • cue/parser: disallow deprecated language features in API by @mpvl in 67ace83
  • internal/core/adt: remove nested comprehension special casing by @mpvl in 3c0b2ec
  • README: fix the stale GitHub Actions badge by @mvdan in 4fee020
  • internal/core/adt: disambiguate let cache by @mpvl in 43fc681
  • internal/core/adt: update stats to fix build breakage by @mpvl in a800e6f
  • internal/core/adt: merge Conjunct and Partial processing by @mpvl in 121894c
  • internal/core/adt: remove assertion by @mpvl in 129c343
  • internal/core/adt: add test cases for issue 2119 by @mpvl in 2499719
  • internal/core/adt: add tests related to Issue #2113 by @mpvl in 525648d
  • internal/core/adt: evaluate let fields earlier in comprehensions by @mpvl in e5fb5af
  • internal/core/adt: detect cycles in patterns by @mpvl in c048135
  • cue: update Value.Source doc comment by @rogpeppe in 45ce7a3
  • tools/flow: add debug support via CUE_DEBUG_TOOLS_FLOW by @myitcv in d85f950
  • internal/core/adt: fix comprehension cycle regression by @mpvl in 32bfffd
  • internal/core/adt: add tests to address regressions by @mpvl in 82bf036
  • internal/core/adt: split some tests into files by @mpvl in 69ee994
  • infra: upgrade goreleaser by @myitcv in 7bdeb14
  • doc: simple whitespace change to track down GerritHub replication issue by @myitcv in 1bb7fed
  • cmd/cue: fix --ignore errors flag by @mpvl in ab14c86
  • pkg/list: make error of MaxItems consistent with MinItems by @mpvl in c5fbbab
  • pkg/struct: fix MinFields analogously to MinItems by @mpvl in 849371d
  • all: remove mistakenly added file by @mpvl in 68445d8
  • internal/core/adt: fix panic using builtin validators by @mpvl in 9bbc14b
  • internal/core/adt: don't bump state by @mpvl in b18d00f
  • internal/core/adt: prevent early error assignment by @mpvl in 27b6e87
  • internal/core/adt: relax cycle tracking by @mpvl in 9c761dd
  • pkg/internal: allow incomplete list.MinItems by @mpvl in 354f4e6
  • internal/core/adt: add tests for #2052 by @mpvl in 6162b95
  • internal/core/adt: fix redundant errors in calls by @mpvl in 959605e
  • drop support for Go 1.17.x ahead of the v0.5 release by @mvdan in 0292e7f
  • internal/core/adt: improved reporting disjunction errors by @mpvl in a8d68ad
  • internal/core/adt: avoid uninformative cyclic error by @mpvl in 1d8d8ff
  • internal/core/adt: remove over-aggressive deduplication by @mpvl in 74b4288
  • internal/core/adt: fix error checking bug by @mpvl in 28088ac
  • internal/core/adt: add cycle detection for alt evaluation path by @mpvl in 4eb2280
  • internal/core/adt: errors in let expressions are okay by @mpvl in 30b2007
  • pkg: improve error messages by @mpvl in fa36be4
  • internal/core/adt: add stats by @mpvl in e2a0ef6
  • internal/core/dep: handle recursive lets by @mpvl in 1d8663e
  • internal/core/adt: fix comprehension bug by @mpvl in 87347d2
  • internal/core/adt: remove redundant state change by @mpvl in 24576a0
  • cue/ast: fix StructLit.End by @rogpeppe in b23ece3
  • internal/third_party/yaml: fix float parsing by @rogpeppe in a4941ed
  • internal/third_party/yaml: slim down API by @rogpeppe in 794d078
  • doc/ref/spec.md: binary literals support _ separators as well by @spachava753 in 712d8c6
  • internal/core/adt: recursively pre-expand comprehensions by @mpvl in 102b034
  • internal/core/adt: represent comprehension clauses as list by @mpvl in b3bcc7a
  • internal/core/dep: remove useless code by @mpvl in 309b965
  • internal/core/adt: fix cycle detection bug for lets by @mpvl in f2b9479
  • internal/core/adt: allow self-referential comprehensions by @mpvl in f1daf4b
  • internal/core/adt: update state constants and docs by @mpvl in e4f4900
  • internal/core/adt: add conjuncts to dynamic list as well by @mpvl in 637a325
  • internal/core/adt: report cycle error in comprehension source by @mpvl in 6668dc8
  • internal/core/adt: rename test by @mpvl in f30a8e7
  • internal/core/adt: add IsDefined to filter out void arcs by @mpvl in 2ae37df
  • internal/core/adt: fix closedness regression by @mpvl in ed4f885
  • internal/core/dep: fix comprehension environment binding by @mpvl in 6824f7d
  • deps: bump golang.org/x/text dependency by @joaopapereira in dd1169c
  • .gitignore: add .DS_Store by @mpvl in 79d80ef
  • internal/core/adt: fix broken let lookup in embedded scalars by @mpvl in cad3f23
  • internal/core/adt: optimize cycle detection for disjunctions by @mpvl in 830b138
  • internal/ci: test and release on Go 1.19.x by @mvdan in fe50dff
  • internal/core/adt: remove problematic Ref deletion by @mpvl in 7518952
  • cue/testdata/benchmarks: add stats by @mpvl in 3bcf4a4
  • encoding/gocode: encode hex consistently like Go 1.19+ by @mvdan in f5c3e4e
  • doc/tutorial/kubernetes: mark both tests as long by @mvdan in 06aaef6
  • internal/core/adt: add test for issue 1837 by @mpvl in 839e33b
  • internal/core/adt: make some errors semi-permanent by @mpvl in 4a3a494
  • internal/core/adt: reduce size of ErrorCode by @mpvl in 53dfffa
  • internal/core/export: fix crash in dynamic fields by @mpvl in ad253ed
  • all: apply and follow Go 1.19's gofmt by @mvdan in 519d326
  • internal/core: implement let as fields by @mpvl in 36bd656
  • pkg: reuse pkg/gen to generate package godocs by @mvdan in df148ee
  • internal/core/adt: eliminate disjuncts for incomplete errors by @mpvl in c556a19
  • doc/tutorial/kubernetes: only run as a long test by @mvdan in 6551ea5
  • internal/core/adt: fix test by @mpvl in d3959eb
  • internal/core/adt: add tests for let by @mpvl in 7c7056c
  • internal/core/compile: prepare for let change by @mpvl in 739713c
  • internal/core/...: fix various attributes printing issues by @mpvl in 82933ad
  • internal/core/adt: remove StructInfo for unused structs by @mpvl in c89ab8b
  • internal/core/compile: add missing import in test by @mpvl in be9cc0d
  • internal/cuetxtar: add method for getting a single instance by @rogpeppe in e5f21db
  • internal/filetypes: not a file extension if the file starts with a dot by @rogpeppe in db0897b
  • internal/core/adt: defensive use of CloseInfo by @mpvl in 9e9786e
  • internal/filetypes: fix TestParseFile tests by @rogpeppe in 3290797
  • internal/cuetxtar: improve docs by @rogpeppe in d2250b9
  • encoding/gocode: be resilient to Go string literal changes by @rogpeppe in 1cfb57c
  • doc/tutorial/basics: make test scripts run again by @mvdan in 6cb877e
  • encoding/openapi: update API by @rogpeppe in 74566cf
  • cue/stats: new package for getting operation statistics by @mpvl in 535d188
  • errors: make Errors and Print respect wrapped errors by @rogpeppe in 4007775
  • internal/core/path: package for Selector to Feature conversion by @mpvl in 4c9d0ac
  • cue: tweaks to selector API by @mpvl in cd27b12
  • cue: add Value.BuildInstance method by @rogpeppe in a552c1f
  • encoding/yaml: be clearer about the role of the src argument by @rogpeppe in 351a9fb
  • internal/core/adt: fix cycles in evaluation by @mpvl in ac11215
  • internal/core/adt: tighten structural cycle detection by @mpvl in f8e363e
  • internal/core/adt: tighten structural cycle detection by @mpvl in 68152ec
  • internal/core/adt: fix spurious cycle for inline recursion by @mpvl in c997044
  • internal/core/adt: fix issue with references cycles by @mpvl in cd4bf2b
  • internal/core/adt: some fixes to structural cycle detection by @mpvl in 8133f55
  • internal/core/compile: fix aliases to dynamic fields by @mpvl in 353833c
  • cue: add Selector.Type API by @rogpeppe in 8e8f1cf
  • cue/load: deterministically sort CUE files when loading by @mvdan in 295786e
  • internal/core/adt: count conjuncts by @mpvl in 1a12916
  • internal/core/adt: finalize arcs that are almost done by @mpvl in 8ee1127
  • internal/core/adt: remove redundant line by @mpvl in 37ee967
  • internal/core/adt: clean up some span logic and add a comment by @mpvl in ce30e67
  • internal/core/adt: move Label for better bin packing by @mpvl in e398e10
  • internal/core/adt: clean up some closedness code by @mpvl in 9e15ca1
  • internal/core/adt: fix spurious child error by @mpvl in 830847b
  • all: start using testscript.Params.RequireExplicitExec by @mvdan in 37a2a07
  • internal/core/adt: pick defaults for label evaluation by @mpvl in 83d37e7
  • cmd/cue/cmd: testscript moved its gopath location by @mvdan in 4a73630
  • internal/core/adt: SpawnRef loop optimization by @rogpeppe in 7292034
  • all: use txtar filename extensions consistently by @mvdan in c1689bb
  • mod: drop x/xerrors from the module graph by @mvdan in 0460b47
  • mod: drop apd v1 from the module graph by @mvdan in d663a8c
  • all: apply Go 1.19's gofmt by @mvdan in 3f3f181
  • internal/core/adt: fix spurious cycle by @mpvl in e187f9f
  • internal/core/adt: reimplementation of cycle algorithm by @mpvl in 6b3fd65
  • internal/core/adt: hoist cycle logic by @mpvl in eab8c8e
  • internal/core/adt: pass Conjunct instead of Environment to Resolve by @mpvl in 428d395
  • internal/core/adt: don't spawn duplicate locations by @mpvl in 3bedf8e
  • internal/core/adt: fix env linking for comprehensions by @mpvl in b00f5d6
  • cmd/cue: remove all stdin buffering by @mvdan in b4d1b16
  • all: use the .test TLD for module paths in tests by @mvdan in 5a08d2f
  • CI: only pull master commits through a proxy on Linux by @mvdan in 395df20
  • CI: try "pull through proxy" go get up to five times by @mvdan in 4f15036
  • all: fix migration to x/tools/txtar by @myitcv in 0a46a16
  • cmd/cue/cmd: add --inline-imports flag by @mpvl in 974a09b
  • cue: support InlineImports for Syntax by @mpvl in ae56267
  • internal/core/export: don't inline for errors by @mpvl in e87bc25
  • internal/core/export: enhancements for import inlining by @mpvl in 62fedc3
  • internal/core/export: implement self-contained algo for export by @mpvl in c71f674
  • all: fix common pattern of calling cuextxtar.Load by @myitcv in bdaadc9
  • pkg/tool/cli: rework Stdin and make Ask read an entire line by @mvdan in 4432aa6
  • all: swap rogpeppe/go-internal/txtar for x/tools/txtar by @mvdan in 9f3d9d2
  • internal/ci: use consistent name for CUELANGORGTIPREBUILDHOOK by @myitcv in a9f8bd2
  • cmd/cue/cmd: remove bits of unused code by @mvdan in 4d7edeb
  • internal/diff: two different errors are equal by @mpvl in 6e95220
  • interal/diff: skip hidden fields by default by @mpvl in 5151417
  • .gitignore: ignore some binaries by @mpvl in 2d10d0f
  • internal/core/export: cleanup of initialization and finalize by @mpvl in 8a7ebf9
  • internal/core/export: simplify dynamic labels by @mpvl in 8edd739
  • internal/core/export: refactor uniqueFeature by @mpvl in 9777511
  • internal/core/export: fix bug exporting dynamic references by @mpvl in 360ef5f
  • internal/core/adt: clarify examples for references by @mpvl in 5cb52c8
  • internal/core/export: hoist FieldReference logic by @mpvl in 82a2513
  • internal/core/export: pass Environment by @mpvl in 254d0de
  • internal/core/export: move tests to subdir by @mpvl in 08c0689
  • tools/fix: remove rewriting support for old-style let by @mpvl in 9a66c51
  • internal/core/export: hoist reference logic by @mpvl in 580edf4
  • cue/format: fix StructLit trailing comma bug by @satotake in d16c799
  • internal/ci/github: skip non-race tests when running race tests by @myitcv in 4113ec3
  • internal/ci: refactor CI workflows by @myitcv in 236a565
  • internal/ci: split github workflows into separate files by @myitcv in 9d366cd
  • internal/ci: write netrc file for triggering trybots by @myitcv in 62ccbc0
  • internal/ci: move to using gerritstatusupdater by @myitcv in f28ad41
  • internal/ci: rename test and repository_dispatch workflows by @myitcv in d4526fe
  • cuego: fix example in docs by @rogpeppe in 2fea90a
  • internal/ci: move workflow declarations to their own package by @myitcv in 2795dcc
  • cue/load: actually apply the latest doc wording per the reviews by @mvdan in f32ea8e
  • cue/load: remove old reference to a "query tool" by @mvdan in 03ed417
  • internal/ci: stop using txtar tests for GitHub actions workflows by @myitcv in 1876276
  • cmd/cue: support buildinfo in version sub-command by @djosephsen in b8703c8
  • doc/spec: minor adjustments after a careful read by @mvdan in cf3ba23
  • pkg/gen: remove unreachable code by @rogpeppe in 2f05fc9
  • pkg/gen: generate (almost) all pkg.go files in one call by @rogpeppe in 23dc354
  • all: use go-cmp.Diff more consistently by @mvdan in b30eb99
  • cmd/cue: use cue in test scripts rather than exec cue by @mvdan in 621f437
  • internal/core/adt: remove stutter in error by @mpvl in 41ceff3
  • internal/core/adt: keep arc on comprehension error by @mpvl in 309f8e7
  • internal/core/adt: use per-field comprehensions by @mpvl in 748a685
  • cmd/cue/cmd: remove usage of cue.Runtime by @mpvl in 0b0f1d3
  • tools/flow: get rid of deprecated cue.Runtime by @mpvl in 3ac85dc
  • internal/core/adt: move closedness check by @mpvl in abd2ba3
  • internal/core/adt: prepare for comprehension change by @mpvl in 38b5fe2
  • internal/core/adt: remove redundant indirection by @mpvl in 5201fde
  • internal/core/adt: add convenience logging method by @mpvl in ee36170
  • internal/encoding: always validate when exporting by @qequ in 5b8860a
  • cue/pkg/strconv: support arbitary-precision format by @satotake in 9bda220
  • pkg/internal: make it clearer that const is exclusive to func by @rogpeppe in e77a879
  • cue/format: escape tabs when printing comments, literals, and attributes by @mvdan in dac4917
  • all: replace filepath.Walk with WalkDir by @mvdan in 79b324d
  • cmd/cue: initialize toTop and toString without go/packages by @mvdan in 0f66c58
  • doc/contribute.md: simplify code backticks by @rytswd in 193e320
  • internal/ci: avoid merge commits when testing GitHub PRs by @mvdan in 6de1c17
  • internal/encoding/yaml: update dependencies by @myitcv in ef1b8aa
  • encoding/protobuf: update dependencies by @mvdan in 31be9e3
  • Revert "all: avoid using too many packages.Need bits" by @mvdan in 87408d7
  • all: avoid using too many packages.Need bits by @mvdan in aa9b1bd
  • all: fix a few more staticcheck nits by @mvdan in 92b9a06
  • cmd/cue: remove the need for embedpkg by @mvdan in 89c6cdc
  • all: make use of t.TempDir and t.Setenv by @mvdan in 6634a00
  • pkg/strconv: Revert "pkg/strconv: allow string argument for format" by @rogpeppe in 1ed6195
  • pkg/strconv: allow string argument for format by @rogpeppe in 053c4ac
  • internal/core: comment improvements by @rogpeppe in 34782fe
  • cue/literal: allow escaped newlines in multiline strings by @rogpeppe in 618e530
  • all: drop support for Go 1.16.x by @mvdan in bd9ae53
  • all: make vet happy by @mvdan in a58ac53
  • doc/ref: mention that newlines can be escaped in multiline strings by @rogpeppe in 13918dd
  • all: check the filepath.Walk error parameter by @mvdan in 2caf6e0
  • bump x/tools and x/net dependencies by @mvdan in 79a3fa7
  • all: fix a few minor typos spotted by gospel by @mvdan in 7881588
  • cue/scanner: allow leading double-quote in #-quoted string by @rogpeppe in db398ad
  • internal/ci: remove gorelease check step by @mvdan in c942d0a
  • internal/ci: enforce Signed-off-by temporarily by @mvdan in 7dd325d
  • all: remove redundant interface type assertions by @mvdan in 74d55b7
  • pkg/list/sort: fix syntax in docs by @tmm1 in 00c5ddf
  • internal/ci: bump GitHub Actions OS versions by @mvdan in db3e6ac
  • cmd/cue: remove duplicate files from get_go_types.txt by @mvdan in eb0a4ff
  • internal/cuetest: drive long tests via an env var by @mvdan in 33b18be
  • cmd/cue: import -R: don't treat text with no newlines as YAML by @rogpeppe in f207b0b
  • cmd/cue: better test for import --recursive by @rogpeppe in 7f3c0a2
  1. https://aclanthology.org/C92-2068
    Hideto Tomabechi. 1992. Quasi-Destructive Graph Unification with
    Structure-Sharing. In COLING 1992 Volume 2: The 14th International
    Conference on Computational Linguistics.

  2. https://aclanthology.org/P00-1045/
    Marcel P. van Lohuizen. 2000. "Memory-Efficient and Thread-Safe
    Quasi-Destructive Graph Unification". In Proceedings of the 38th Annual
    Meeting of the Association for Computational Linguistics, pages 352–359,
    Hong Kong. Association for Computational Linguistics.

  3. Bob Carpenter, "The logic of typed feature structures."
    Cambridge University Press, ISBN:0-521-41932-8