Commit fd33950
* Fix to respect special bit specified in the mode of copier
Signed-off-by: Kotaro Inoue <inoue.kotaro@linecorp.com>
* Add tests
Signed-off-by: Kotaro Inoue <inoue.kotaro@linecorp.com>
* Add support for always overwriting existing paths
Before this, copy would always refuse to replace an existing path in the
dest with something from the source of a different type. E.g. if there
was a symlink at the dest, you'd get an error if copying src meant
replacing the symlink w/ a directory.
This is the right default behavior but there are situations in which
callers may want to opt in to instead always replacing what's in dest
with what's in source.
This adds an option to enable that behavior.
Signed-off-by: Erik Sipsma <erik@sipsma.dev>
* Migrate off of gogo/protobuf
gogo/protobuf has been deprecated since 2022. This change uses Google's
code generator instead of gogo/protobuf.
Signed-off-by: Kazuyoshi Kato <kato.kazuyoshi@gmail.com>
* Fix to use internal representation for setting special bits
Signed-off-by: Kotaro Inoue <k.musaino@gmail.com>
* Fix cross-device copy failing on macOS
Downstream issue: https://github.com/macOScontainers/rund/issues/28
Signed-off-by: Marat Radchenko <marat@slonopotamus.org>
* followlinks: sanitize root path
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* chore: fix typos in NewFilterFS docstring
Signed-off-by: Justin Chadwell <me@jedevc.com>
* Revert "Migrate off of gogo/protobuf"
This reverts commit bea810c.
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* chore: run once on vagrant init
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: increase vm boot time to 15m
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: switch to macos-13 runner for freebsd job
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: retry logic for freebsd test step
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: add windows to test matrix
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* diskwriter: fix test scope
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* fix file path separator
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* test with coverage and send to codecov
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: align events
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* readme badges
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: fix test step for windows
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: bump actions to latest stable
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* chore: dependabot to keep gha up to date
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* update to go 1.21
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* update golangci-lint to 1.54.2
also update config to show all issues at once and
set linter setting for io/ioutil.
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* dockerfile: update xx to 1.4.0
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* filter: allow SkipDir return with lazy parents
When using include/exclude options in a file walk, we lazily store the
parents, and only later call the target function with them when we find
a file inside. This handles the case where `**/*.go` should only walk
directories that contain `.go` files, and not every directory in the
tree.
However, when storing lazy parents, we weren't appropriately handling
the `SkipDir` value that could be returned. We were making two incorrect
assumptions:
1. An error value from `fn()` was always an error case - this isn't
true, since we have control error values like `SkipDir`. Because of
this, we need to ensure that `calledFn` is *always* set to true when
calling `fn` (even in an error case).
2. We can return `SkipDir` to skip this parent directory. This isn't
*quite* right, since returning `SkipDir` would return it only for the
child directory - we need to make sure it's called everytime for each
child directory of this parent directory, by storing it as a boolean
`skipFn` field.
With these changes, the new test passes, and we don't end up with
duplicate parent calls, as was happening before:
Error: Not equal:
expected: []string{"foo"}
actual : []string{"foo", "foo"}
Signed-off-by: Justin Chadwell <me@jedevc.com>
* filter: ensure MapResult is followed for parent directories
Similar to the previous commit, we weren't properly respecting MapResult
return values for parent directories. To resolve this, we just store
into `skipFn` just like previously, and return `SkipDir` instead of
`continue`ing on.
After these changes, the new test passes, and we don't end up including
entries that were in excluded directories, as was happening before:
Error: Not equal:
expected: "dir y\nfile y/b.txt\n"
actual : "file x/a.txt\ndir y\nfile y/b.txt\n"
Signed-off-by: Justin Chadwell <me@jedevc.com>
* chore: codecov config
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: set codecov token
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: set workflow_dispatch event
this is for manual testing from a fork
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* send: ensure file path to unix form when sending files
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* fix data race in progressCb
Fixes a silly data race where progressCurrent is incremented (and
later accessed) by 1 of 4 threads.
Signed-off-by: Alex Couture-Beil <alex@earthly.dev>
* receive: ensure callback errors are propagated
Previously, it was possible for errors returned by an asyncronous
callback function to not be propagated, and to instead return "context
canceled" from `Receive`.
This could happen based on this specific sequence of events:
- An asyncronous callback is called from `HandleChange`, and returns an
error, completing the async errorgroup context with an error state.
- Another call to `HandleChange` completes, and uses the context
syncronously, returning `context.Canceled`.
- This in turn propagates to `doubleWalkDiff`, which returns the
canceled error, instead of calling `Wait` which would contain the
actual error group error.
This behavior is racy, based on exactly how and when the asyncronous
callback is called.
The fix to this is relatively straightforward: we just need to make sure
that syncronous and asyncronous function calls are kept separate, and
don't reuse the same context. This means that a failure in an async
callback, doesn't cause later sync ones to fail.
Signed-off-by: Justin Chadwell <me@jedevc.com>
* receive: translate unix-paths off the wire to native
Then, inside all our validations, and our double walking, we don't have
to worry about translating between different path formats.
Additionally, we ensure that all received paths can be represented on
the target host system. A path like `foo/bar\baz` can only be stored on
linux (a dir with `foo`, containing a file `bar\baz`). On windows, this
would later be interpreted to be `foo\bar\baz` (a dir with `foo`,
containing a dir `bar`, containing a file `baz`).
Signed-off-by: Justin Chadwell <me@jedevc.com>
* chore: remove old windows todo comments
Signed-off-by: Justin Chadwell <me@jedevc.com>
* chore: add fsutil protocol description
Signed-off-by: Justin Chadwell <me@jedevc.com>
* recv: translate linkname to wire format
Signed-off-by: Justin Chadwell <me@jedevc.com>
* fix hardlink filter regression
With the refactor to FilterFS the hardlink handling
was changed so that the hardlink detection is in a
separate FS instance and then FilterFS is layered on
top of it. This means that the file that was the source
for the hardlink could be filtered out, but the Stat pointing
to that link is still sent as is.
New function validates if source files are not present in FS
anymore and correct the linking. It could be better if all
the FS implementation did this automatically, but there is
quite a lot of layering going on atm. with multiple layers
of FilterFS that would all need to keep own hardlink memory,
so atm. the new function is only called before send.
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* chore(deps): Bump docker/bake-action from 4 to 5
Bumps [docker/bake-action](https://github.com/docker/bake-action) from 4 to 5.
- [Release notes](https://github.com/docker/bake-action/releases)
- [Commits](docker/bake-action@v4...v5)
---
updated-dependencies:
- dependency-name: docker/bake-action
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
* Fixup fallout with new FS changed API
* ci: switch to ubuntu runner for freebsd job
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* deps: remove deprecated gogo proto
This removes the deprecated gogo proto in favor of the standard
implementation.
Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
* types: stat clone drops hidden proto fields
The stat clone returned by protobuf returns a version of `types.Stat`
that isn't compatible with some tests in buildkit. This changes clone to
create a new type without cloning the hidden protobuf types.
Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
* update Go to 1.23
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* update golangci-lint to 1.61.0
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* update xx to v1.5.0
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* add support for non-octal mode setting
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* protobuf: add vtproto to supplement protobuf marshaling
This adds the vtproto generator to generate code that results in faster
marshaling and unmarshaling. vtproto is similar to gogo but it generates
additional code on top of the existing protobuf structures rather than
changing the generator itself.
Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
* fix correcting timestamps for created destination dir after copy
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* Fixed build on OpenBSD
This fixes docker/buildx#2772
* build and test openbsd
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* bench: bump modules
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* enable golangci-lint for supported platforms
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* fix issues in .golangci.yml
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* fix lint issues
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* fixes for netbsd
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* build and test netbsd
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* chore(deps): Bump codecov/codecov-action from 4 to 5
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](codecov/codecov-action@v4...v5)
---
updated-dependencies:
- dependency-name: codecov/codecov-action
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
* ci: fix deprecated input for codecov-action
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* update xx to v1.6.1 for compatibility with alpine 3.21 and file 5.46+
This fixes compatibility with alpine 3.21 and file 5.46+
- Fix additional possible `xx-cc`/`xx-cargo` compatibility issue with Alpine 3.21
- Support for Alpine 3.21
- Fix `xx-verify` with `file` 5.46+
- Fix possible error taking lock in `xx-apk` in latest Alpine without `coreutils`
full diff: tonistiigi/xx@v1.5.0...v1.6.1
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
* fix error message for invalid includepatterns
The patterns returned in the error message were missing
the ones added via opts.FollowLinks
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* ci: update bake-action to v6
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* copy: fix custom chmod for parent directories
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* chore(deps): Bump nick-fields/retry from 3.0.0 to 3.0.2
Bumps [nick-fields/retry](https://github.com/nick-fields/retry) from 3.0.0 to 3.0.2.
- [Release notes](https://github.com/nick-fields/retry/releases)
- [Changelog](https://github.com/nick-fields/retry/blob/master/.releaserc.js)
- [Commits](nick-fields/retry@7152eba...ce71cc2)
---
updated-dependencies:
- dependency-name: nick-fields/retry
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
* add gopls linter fixes
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* fix linter after merge conflict
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* copy: support for linux X mode
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* ci: install latest vagrant
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: infer go version from workflow for bsd tests
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* ci: fix freebsd package repository
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
* Allow metadata-only receivers
This optional mode allows skipping transferring the file data
if remote side just hopes to analyze how the local files look like.
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* receive: add parent memory for metadata transfers
This is needed because metadata-only parent may have
a data file as a child.
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
* stat: ignore apple extended attributes
Extended attributes from `com.apple` will bust remote layer caches
and shouldn't be transferred to a Linux environment. Skip loading these
extended attributes as part of loading xattrs.
Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
* fix: send: use platform-specific root path
Using "/" was causing a silent bug later on at
`fs.go:121` that is expecting platform-specific
separators. See discussion at moby/buildkit#6007
Fix this by using `\\` on Windows and `/` on unix.
Signed-off-by: Anthony Nandaa <profnandaa@gmail.com>
* ci: add CODEOWNERS
* chore: tidy ci.yml
---------
Signed-off-by: Kotaro Inoue <inoue.kotaro@linecorp.com>
Signed-off-by: Erik Sipsma <erik@sipsma.dev>
Signed-off-by: Kazuyoshi Kato <kato.kazuyoshi@gmail.com>
Signed-off-by: Kotaro Inoue <k.musaino@gmail.com>
Signed-off-by: Marat Radchenko <marat@slonopotamus.org>
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
Signed-off-by: Justin Chadwell <me@jedevc.com>
Signed-off-by: Alex Couture-Beil <alex@earthly.dev>
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Signed-off-by: Anthony Nandaa <profnandaa@gmail.com>
Co-authored-by: Kotaro Inoue <inoue.kotaro@linecorp.com>
Co-authored-by: Erik Sipsma <erik@sipsma.dev>
Co-authored-by: Kazuyoshi Kato <kato.kazuyoshi@gmail.com>
Co-authored-by: Tõnis Tiigi <tonistiigi@gmail.com>
Co-authored-by: Kotaro Inoue <k.musaino@gmail.com>
Co-authored-by: Marat Radchenko <marat@slonopotamus.org>
Co-authored-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
Co-authored-by: Justin Chadwell <me@jedevc.com>
Co-authored-by: Alex Couture-Beil <alex@earthly.dev>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nilesh Patra <nilesh@nileshpatra.info>
Co-authored-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
Co-authored-by: Kirill A. Korinsky <kirill@korins.ky>
Co-authored-by: Sebastiaan van Stijn <github@gone.nl>
Co-authored-by: Anthony Nandaa <profnandaa@gmail.com>
1 parent 2ea1c94 commit fd33950
73 files changed
Lines changed: 4162 additions & 2930 deletions
File tree
- .github
- workflows
- bench
- copy
- hack
- dockerfiles
- tools
- types
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
12 | | - | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | | - | |
16 | | - | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
17 | 19 | | |
18 | 20 | | |
19 | 21 | | |
20 | 22 | | |
21 | 23 | | |
22 | 24 | | |
23 | 25 | | |
24 | | - | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
25 | 29 | | |
26 | 30 | | |
27 | 31 | | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | 32 | | |
32 | 33 | | |
33 | | - | |
| 34 | + | |
34 | 35 | | |
35 | 36 | | |
36 | | - | |
| 37 | + | |
37 | 38 | | |
38 | 39 | | |
39 | 40 | | |
| |||
45 | 46 | | |
46 | 47 | | |
47 | 48 | | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | 49 | | |
52 | 50 | | |
53 | | - | |
| 51 | + | |
54 | 52 | | |
55 | 53 | | |
56 | | - | |
| 54 | + | |
57 | 55 | | |
58 | 56 | | |
59 | 57 | | |
60 | 58 | | |
61 | 59 | | |
62 | 60 | | |
63 | 61 | | |
64 | | - | |
65 | | - | |
66 | | - | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
67 | 69 | | |
68 | | - | |
| 70 | + | |
69 | 71 | | |
70 | | - | |
71 | | - | |
72 | | - | |
73 | 72 | | |
74 | 73 | | |
75 | | - | |
| 74 | + | |
76 | 75 | | |
77 | 76 | | |
78 | | - | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
79 | 85 | | |
80 | | - | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
81 | 89 | | |
82 | | - | |
83 | | - | |
| 90 | + | |
| 91 | + | |
84 | 92 | | |
85 | 93 | | |
86 | 94 | | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
87 | 98 | | |
88 | | - | |
89 | | - | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
90 | 102 | | |
91 | 103 | | |
92 | 104 | | |
93 | | - | |
| 105 | + | |
94 | 106 | | |
95 | 107 | | |
96 | | - | |
| 108 | + | |
97 | 109 | | |
98 | 110 | | |
99 | 111 | | |
100 | 112 | | |
101 | 113 | | |
102 | | - | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
103 | 126 | | |
104 | | - | |
105 | | - | |
106 | | - | |
107 | | - | |
108 | | - | |
109 | | - | |
110 | | - | |
111 | | - | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
112 | 136 | | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
113 | 145 | | |
114 | 146 | | |
115 | | - | |
| 147 | + | |
116 | 148 | | |
117 | 149 | | |
118 | | - | |
| 150 | + | |
119 | 151 | | |
120 | 152 | | |
121 | | - | |
| 153 | + | |
122 | 154 | | |
123 | | - | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
124 | 168 | | |
125 | 169 | | |
126 | | - | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
127 | 173 | | |
128 | 174 | | |
129 | | - | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
4 | | - | |
5 | | - | |
6 | | - | |
7 | | - | |
| 3 | + | |
8 | 4 | | |
9 | 5 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
3 | | - | |
4 | | - | |
| 2 | + | |
5 | 3 | | |
6 | 4 | | |
7 | 5 | | |
| |||
14 | 12 | | |
15 | 13 | | |
16 | 14 | | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | | - | |
| 1 | + | |
3 | 2 | | |
4 | | - | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
5 | 7 | | |
6 | 8 | | |
7 | 9 | | |
| |||
18 | 20 | | |
19 | 21 | | |
20 | 22 | | |
21 | | - | |
| 23 | + | |
22 | 24 | | |
23 | 25 | | |
24 | 26 | | |
25 | 27 | | |
26 | 28 | | |
27 | 29 | | |
28 | | - | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
29 | 37 | | |
30 | 38 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
25 | 29 | | |
26 | 30 | | |
27 | 31 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | | - | |
| 6 | + | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
20 | | - | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
21 | 18 | | |
22 | | - | |
23 | | - | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
24 | 22 | | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
31 | 28 | | |
32 | 29 | | |
33 | 30 | | |
0 commit comments