Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: DuFoxit/sing
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: dev
Choose a base ref
...
head repository: SagerNet/sing
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: dev
Choose a head ref
Able to merge. These branches can be automatically merged.

Commits on Mar 5, 2024

  1. Copy the full SHA
    ec2595f View commit details

Commits on Mar 10, 2024

  1. Copy the full SHA
    807a51b View commit details

Commits on Mar 13, 2024

  1. Fix TypedValue

    wwqgtxx authored and nekohasekai committed Mar 13, 2024
    Copy the full SHA
    a069af4 View commit details

Commits on Mar 23, 2024

  1. Fix canceler

    nekohasekai committed Mar 23, 2024
    Copy the full SHA
    04152ea View commit details

Commits on Mar 24, 2024

  1. Copy the full SHA
    5bfc326 View commit details

Commits on Apr 10, 2024

  1. Fix canceler.PacketConn

    dyhkwong authored and nekohasekai committed Apr 10, 2024
    Copy the full SHA
    8b68fc4 View commit details
  2. Improve bufio.NATPacketConn

    dyhkwong authored and nekohasekai committed Apr 10, 2024
    Copy the full SHA
    f9c59e9 View commit details
  3. Copy the full SHA
    4d96f15 View commit details
  4. Copy the full SHA
    3e2631e View commit details
  5. Add winpowrprof package

    wwqgtxx authored and nekohasekai committed Apr 10, 2024
    Copy the full SHA
    6b73a57 View commit details
  6. Copy the full SHA
    e5825dc View commit details
  7. Copy the full SHA
    2fa0399 View commit details

Commits on Apr 12, 2024

  1. Improve interface finder

    nekohasekai committed Apr 12, 2024
    Copy the full SHA
    eec2fc3 View commit details

Commits on Apr 23, 2024

  1. Update dependencies

    nekohasekai committed Apr 23, 2024
    Copy the full SHA
    4ab8cac View commit details

Commits on May 17, 2024

  1. Copy the full SHA
    8fb1634 View commit details
  2. Fix socks5 packet conn

    dyhkwong authored and nekohasekai committed May 17, 2024
    Copy the full SHA
    284cb5c View commit details

Commits on May 18, 2024

  1. Copy the full SHA
    e0ee7f4 View commit details
  2. Copy the full SHA
    f67a098 View commit details

Commits on May 21, 2024

  1. Copy the full SHA
    de1b0bd View commit details

Commits on May 27, 2024

  1. Update dependencies

    nekohasekai committed May 27, 2024
    Copy the full SHA
    0c110ad View commit details

Commits on Jun 6, 2024

  1. Update dependencies

    nekohasekai committed Jun 6, 2024
    Copy the full SHA
    967afcf View commit details
  2. Fix PrefixFromNet

    nekohasekai committed Jun 6, 2024
    Copy the full SHA
    ba68e01 View commit details
  3. Copy the full SHA
    e82ff8e View commit details

Commits on Jun 11, 2024

  1. Update workflows

    nekohasekai committed Jun 11, 2024
    Copy the full SHA
    b8736cc View commit details

Commits on Jun 17, 2024

  1. Fix http socks close

    xchacha20-poly1305 authored and nekohasekai committed Jun 17, 2024
    Copy the full SHA
    d9f2559 View commit details
  2. Copy the full SHA
    47cc308 View commit details
  3. Copy the full SHA
    2873799 View commit details
  4. Copy the full SHA
    589c7eb View commit details
  5. Copy the full SHA
    aca2a85 View commit details
  6. Copy the full SHA
    ad4d59e View commit details
  7. Copy the full SHA
    e0e490a View commit details
  8. Copy the full SHA
    ab4353d View commit details
  9. Copy the full SHA
    f3380c8 View commit details
  10. Recover context json for go1.20

    wwqgtxx authored and nekohasekai committed Jun 17, 2024
    Copy the full SHA
    0f95dfe View commit details
  11. Make RoutingMark uint32

    nekohasekai committed Jun 17, 2024
    Copy the full SHA
    1c495c9 View commit details

Commits on Jun 22, 2024

  1. Copy the full SHA
    9571124 View commit details

Commits on Jun 23, 2024

  1. Copy the full SHA
    a31dba8 View commit details

Commits on Jun 24, 2024

  1. Copy the full SHA
    caa4340 View commit details
  2. Copy the full SHA
    3155c16 View commit details
  3. Remove bad linkname usage

    nekohasekai committed Jun 24, 2024
    Copy the full SHA
    a333493 View commit details
  4. Deprecated bad rw funcs

    nekohasekai committed Jun 24, 2024
    Copy the full SHA
    d8ec9c4 View commit details
  5. Remove bad rw usages

    nekohasekai committed Jun 24, 2024
    Copy the full SHA
    e019640 View commit details
  6. Copy the full SHA
    4745c34 View commit details
  7. Copy the full SHA
    0b4c0a1 View commit details

Commits on Jul 2, 2024

  1. Copy the full SHA
    c37f988 View commit details
  2. Copy the full SHA
    8806e42 View commit details
  3. [dependencies] Update github-actions

    Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
    renovate[bot] authored Jul 2, 2024
    Copy the full SHA
    7ceaf63 View commit details
  4. Copy the full SHA
    7748939 View commit details

Commits on Jul 17, 2024

  1. Copy the full SHA
    bf8fc10 View commit details
  2. Copy the full SHA
    2bf9cc7 View commit details
Showing with 8,862 additions and 5,547 deletions.
  1. +5 −3 .github/renovate.json
  2. +7 −5 .github/workflows/lint.yml
  3. +25 −48 .github/workflows/{debug.yml → test.yml}
  4. +8 −1 .golangci.yml
  5. +6 −6 Makefile
  6. +3 −0 README.md
  7. +16 −5 common/atomic/typed.go
  8. +2 −4 common/baderror/baderror.go
  9. +3 −0 common/binary/README.md
  10. +817 −0 common/binary/binary.go
  11. +18 −0 common/binary/export.go
  12. +14 −0 common/binary/native_endian_big.go
  13. +14 −0 common/binary/native_endian_little.go
  14. +166 −0 common/binary/varint.go
  15. +6 −5 common/bufio/addr_conn.go
  16. +55 −2 common/bufio/bind.go
  17. +28 −8 common/bufio/bind_wait.go
  18. +20 −0 common/bufio/buffer.go
  19. +3 −9 common/bufio/cache.go
  20. +1 −8 common/bufio/conn.go
  21. +62 −82 common/bufio/copy.go
  22. +13 −14 common/bufio/copy_direct_posix.go
  23. +7 −29 common/bufio/copy_direct_windows.go
  24. +39 −0 common/bufio/io.go
  25. +122 −13 common/bufio/nat.go
  26. +39 −0 common/bufio/nat_wait.go
  27. +1 −1 common/bufio/net_test.go
  28. +5 −0 common/bufio/syscall_windows.go
  29. +0 −1 common/bufio/vectorised_unix.go
  30. +57 −0 common/bufio/zsyscall_windows.go
  31. +2 −2 common/canceler/instance.go
  32. +9 −7 common/canceler/packet.go
  33. +6 −4 common/canceler/packet_timeout.go
  34. +20 −19 common/cond.go
  35. +1 −0 common/context.go
  36. +2 −2 common/control/bind_darwin.go
  37. +44 −15 common/control/bind_finder.go
  38. +89 −0 common/control/bind_finder_default.go
  39. +2 −2 common/control/bind_linux.go
  40. +3 −3 common/control/bind_windows.go
  41. +12 −5 common/control/frag_darwin.go
  42. +9 −7 common/control/frag_linux.go
  43. +9 −7 common/control/frag_windows.go
  44. +20 −0 common/control/interface.go
  45. +2 −2 common/control/mark_linux.go
  46. +1 −1 common/control/mark_other.go
  47. +58 −0 common/control/redirect_darwin.go
  48. +38 −0 common/control/redirect_linux.go
  49. +13 −0 common/control/redirect_other.go
  50. +30 −0 common/control/tcp_keep_alive_linux.go
  51. +11 −0 common/control/tcp_keep_alive_stub.go
  52. +56 −0 common/control/tproxy_linux.go
  53. +20 −0 common/control/tproxy_other.go
  54. +67 −0 common/domain/adguard_matcher_test.go
  55. +172 −0 common/domain/adgurad_matcher.go
  56. +90 −79 common/domain/matcher.go
  57. +80 −0 common/domain/matcher_test.go
  58. +50 −24 common/domain/set.go
  59. +3 −2 common/exceptions/error.go
  60. +6 −16 common/exceptions/inner.go
  61. +1 −8 common/exceptions/multi.go
  62. +8 −4 common/exceptions/timeout.go
  63. +13 −0 common/json/badjson/array.go
  64. +5 −0 common/json/badjson/empty.go
  65. +3 −2 common/json/badjson/json.go
  66. +34 −31 common/json/badjson/merge.go
  67. +68 −0 common/json/badjson/merge_objects.go
  68. +26 −5 common/json/badjson/object.go
  69. +16 −7 common/json/badjson/typed.go
  70. +32 −0 common/json/badoption/duration.go
  71. +15 −0 common/json/badoption/http.go
  72. +226 −0 common/json/badoption/internal/my_time/format.go
  73. +35 −0 common/json/badoption/listable.go
  74. +98 −0 common/json/badoption/netip.go
  75. +31 −0 common/json/badoption/regexp.go
  76. +1 −1 common/json/context.go
  77. +0 −23 common/json/context_120.go
  78. +23 −0 common/json/context_ext.go
  79. +11 −0 common/json/internal/contextjson/context.go
  80. +43 −0 common/json/internal/contextjson/context_test.go
  81. +42 −7 common/json/internal/contextjson/decode.go
  82. +73 −19 common/json/internal/contextjson/encode.go
  83. +8 −3 common/json/internal/contextjson/indent.go
  84. +20 −0 common/json/internal/contextjson/keys.go
  85. +26 −0 common/json/internal/contextjson/keys_test.go
  86. +2 −2 common/json/internal/contextjson/scanner.go
  87. +57 −6 common/json/internal/contextjson/stream.go
  88. +26 −0 common/json/internal/contextjson/unmarshal.go
  89. +0 −3 common/json/internal/contextjson_120/README.md
  90. +0 −1,345 common/json/internal/contextjson_120/decode.go
  91. +0 −49 common/json/internal/contextjson_120/decode_context.go
  92. +0 −1,417 common/json/internal/contextjson_120/encode.go
  93. +0 −141 common/json/internal/contextjson_120/fold.go
  94. +0 −42 common/json/internal/contextjson_120/fuzz.go
  95. +0 −143 common/json/internal/contextjson_120/indent.go
  96. +0 −610 common/json/internal/contextjson_120/scanner.go
  97. +0 −517 common/json/internal/contextjson_120/stream.go
  98. +0 −218 common/json/internal/contextjson_120/tables.go
  99. +0 −38 common/json/internal/contextjson_120/tags.go
  100. +9 −2 common/json/unmarshal.go
  101. +9 −0 common/json/unmarshal_context.go
  102. +13 −0 common/json/unmarshal_std.go
  103. +11 −1 common/metadata/addr.go
  104. +1 −0 common/metadata/metadata.go
  105. +14 −7 common/metadata/serializer.go
  106. +15 −0 common/minmax.go
  107. +19 −0 common/minmax_compat.go
  108. +1 −1 common/network/addr.go
  109. +49 −8 common/network/conn.go
  110. +0 −4 common/network/dialer.go
  111. +24 −4 common/network/direct.go
  112. +1 −1 common/{rw → network}/duplex.go
  113. +65 −4 common/network/handshake.go
  114. +35 −0 common/network/packet.go
  115. +31 −6 common/network/thread.go
  116. +60 −24 common/ntp/service.go
  117. +6 −0 common/ntp/syscall_windows.go
  118. +12 −0 common/ntp/time_stub.go
  119. +14 −0 common/ntp/time_unix.go
  120. +20 −0 common/ntp/time_windows.go
  121. +52 −0 common/ntp/zsyscall_windows.go
  122. +20 −0 common/oncefunc.go
  123. +104 −0 common/oncefunc_compat.go
  124. +22 −22 common/pipe/pipe.go
  125. +2 −2 common/pipe/pipe_wait.go
  126. +0 −1 common/random/seed_go119.go
  127. +3 −0 common/ranges/range_test.go
  128. +0 −27 common/rw/count.go
  129. +45 −12 common/rw/file.go
  130. +8 −4 common/rw/read.go
  131. +10 −23 common/rw/varint.go
  132. +18 −12 common/rw/write.go
  133. +10 −18 common/task/task.go
  134. +2 −0 common/task/task_deprecated.go
  135. +3 −0 common/udpnat/conn_wait.go
  136. +63 −20 common/udpnat/service.go
  137. +138 −0 common/udpnat2/conn.go
  138. +103 −0 common/udpnat2/service.go
  139. +0 −4 common/unsafe.go
  140. +419 −0 common/varbin/data.go
  141. +34 −0 common/varbin/data_if.go
  142. +41 −0 common/varbin/uvarint.go
  143. +106 −0 common/varbin/value_slices_unsafe.go
  144. +37 −0 common/varbin/value_slices_unsafe_test.go
  145. +9 −0 common/windnsapi/dnsapi_stub.go
  146. +14 −0 common/windnsapi/dnsapi_test.go
  147. +0 −21 common/windnsapi/dnsapi_windows.go
  148. +6 −0 common/windnsapi/syscall_windows.go
  149. +52 −0 common/windnsapi/zsyscall_windows.go
  150. +217 −0 common/winiphlpapi/helper.go
  151. +313 −0 common/winiphlpapi/iphlpapi.go
  152. +90 −0 common/winiphlpapi/iphlpapi_test.go
  153. +27 −0 common/winiphlpapi/syscall_windows.go
  154. +131 −0 common/winiphlpapi/zsyscall_windows.go
  155. +14 −0 common/winpowrprof/event.go
  156. +11 −0 common/winpowrprof/event_stub.go
  157. +20 −0 common/winpowrprof/event_test.go
  158. +77 −0 common/winpowrprof/event_windows.go
  159. +7 −0 common/winpowrprof/pinner.go
  160. +11 −0 common/winpowrprof/pinner_compat.go
  161. +24 −0 common/winpowrprof/syscall_windows.go
  162. +61 −0 common/winpowrprof/zsyscall_windows.go
  163. +201 −0 contrab/freelru/LICENSE
  164. +2 −0 contrab/freelru/NOTICE
  165. +4 −0 contrab/freelru/README.md
  166. +102 −0 contrab/freelru/cache.go
  167. +767 −0 contrab/freelru/lru.go
  168. +100 −0 contrab/freelru/lru_test.go
  169. +398 −0 contrab/freelru/shardedlru.go
  170. +270 −0 contrab/freelru/syncedlru.go
  171. +3 −0 contrab/maphash/README.md
  172. +53 −0 contrab/maphash/hasher.go
  173. +114 −0 contrab/maphash/runtime.go
  174. +2 −2 go.mod
  175. +2 −2 go.sum
  176. +1 −0 protocol/http/addr.go
  177. +2 −0 protocol/http/client.go
  178. +127 −73 protocol/http/handshake.go
  179. +3 −2 protocol/socks/client.go
  180. +91 −60 protocol/socks/handshake.go
  181. +146 −0 protocol/socks/handshake_tor.go
  182. +215 −0 protocol/socks/lazy.go
  183. +29 −38 protocol/socks/packet.go
  184. +4 −14 protocol/socks/packet_vectorised.go
  185. +5 −5 protocol/socks/packet_wait.go
  186. +12 −12 protocol/socks/socks4/protocol.go
  187. +45 −28 protocol/socks/socks5/protocol.go
  188. +1 −1 service/filemanager/default.go
8 changes: 5 additions & 3 deletions .github/renovate.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"commitMessagePrefix": "[dependencies]",
"branchName": "main",
"extends": [
"config:base",
":disableRateLimiting"
],
"baseBranches": [
"dev"
],
"packageRules": [
{
"matchManagers": [
@@ -15,9 +17,9 @@
},
{
"matchManagers": [
"gomod"
"dockerfile"
],
"groupName": "gomod"
"groupName": "Dockerfile"
}
]
}
12 changes: 7 additions & 5 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
name: Lint
name: lint

on:
push:
branches:
- main
- dev
paths-ignore:
- '**.md'
- '.github/**'
- '!.github/workflows/lint.yml'
pull_request:
branches:
- main
- dev

jobs:
@@ -22,16 +24,16 @@ jobs:
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version: ^1.22
go-version: ^1.23
- name: Cache go module
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: |
~/go/pkg/mod
key: go-${{ hashFiles('**/go.sum') }}
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
uses: golangci/golangci-lint-action@v6
with:
version: latest
73 changes: 25 additions & 48 deletions .github/workflows/debug.yml → .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,134 +1,111 @@
name: Debug build
name: test

on:
push:
branches:
- main
- dev
paths-ignore:
- '**.md'
- '.github/**'
- '!.github/workflows/debug.yml'
pull_request:
branches:
- main
- dev

jobs:
build:
name: Linux Debug build
name: Linux
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version: ^1.22
- name: Add cache to Go proxy
run: |
version=`git rev-parse HEAD`
mkdir build
pushd build
go mod init build
go get -v github.com/sagernet/sing@$version
popd
continue-on-error: true
- name: Build
run: |
make test
build_go118:
name: Linux Debug build (Go 1.18)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: ~1.18
continue-on-error: true
go-version: ^1.23
- name: Build
run: |
make test
build_go119:
name: Linux Debug build (Go 1.19)
build_go120:
name: Linux (Go 1.20)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version: ~1.19
go-version: ~1.20
continue-on-error: true
- name: Build
run: |
make test
build_go120:
name: Linux Debug build (Go 1.20)
build_go121:
name: Linux (Go 1.21)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version: ~1.20
go-version: ~1.21
continue-on-error: true
- name: Build
run: |
make test
build_go121:
name: Linux Debug build (Go 1.21)
build_go122:
name: Linux (Go 1.22)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version: ~1.21
go-version: ~1.22
continue-on-error: true
- name: Build
run: |
make test
build__windows:
name: Windows Debug build
build_windows:
name: Windows
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version: ^1.22
go-version: ^1.23
continue-on-error: true
- name: Build
run: |
make test
build_darwin:
name: macOS Debug build
name: macOS
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version: ^1.22
go-version: ^1.23
continue-on-error: true
- name: Build
run: |
9 changes: 8 additions & 1 deletion .golangci.yml
Original file line number Diff line number Diff line change
@@ -5,6 +5,8 @@ linters:
- govet
- gci
- staticcheck
- paralleltest
- ineffassign

linters-settings:
gci:
@@ -14,4 +16,9 @@ linters-settings:
- prefix(github.com/sagernet/)
- default
staticcheck:
go: '1.20'
checks:
- all
- -SA1003

run:
go: "1.23"
12 changes: 6 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
@@ -8,14 +8,14 @@ fmt_install:
go install -v github.com/daixiang0/gci@latest

lint:
GOOS=linux golangci-lint run ./...
GOOS=android golangci-lint run ./...
GOOS=windows golangci-lint run ./...
GOOS=darwin golangci-lint run ./...
GOOS=freebsd golangci-lint run ./...
GOOS=linux golangci-lint run
GOOS=android golangci-lint run
GOOS=windows golangci-lint run
GOOS=darwin golangci-lint run
GOOS=freebsd golangci-lint run

lint_install:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

test:
go test $(shell go list ./... | grep -v /internal/)
go test ./...
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# sing

![test](https://github.com/sagernet/sing/actions/workflows/test.yml/badge.svg)
![lint](https://github.com/sagernet/sing/actions/workflows/lint.yml/badge.svg)

Do you hear the people sing?
21 changes: 16 additions & 5 deletions common/atomic/typed.go
Original file line number Diff line number Diff line change
@@ -10,26 +10,37 @@ type TypedValue[T any] struct {
value atomic.Value
}

// typedValue is a struct with determined type to resolve atomic.Value usages with interface types
// https://github.com/golang/go/issues/22550
//
// The intention to have an atomic value store for errors. However, running this code panics:
// panic: sync/atomic: store of inconsistently typed value into Value
// This is because atomic.Value requires that the underlying concrete type be the same (which is a reasonable expectation for its implementation).
// When going through the atomic.Value.Store method call, the fact that both these are of the error interface is lost.
type typedValue[T any] struct {
value T
}

func (t *TypedValue[T]) Load() T {
value := t.value.Load()
if value == nil {
return common.DefaultValue[T]()
}
return value.(T)
return value.(typedValue[T]).value
}

func (t *TypedValue[T]) Store(value T) {
t.value.Store(value)
t.value.Store(typedValue[T]{value})
}

func (t *TypedValue[T]) Swap(new T) T {
old := t.value.Swap(new)
old := t.value.Swap(typedValue[T]{new})
if old == nil {
return common.DefaultValue[T]()
}
return old.(T)
return old.(typedValue[T]).value
}

func (t *TypedValue[T]) CompareAndSwap(old, new T) bool {
return t.value.CompareAndSwap(old, new)
return t.value.CompareAndSwap(typedValue[T]{old}, typedValue[T]{new})
}
6 changes: 2 additions & 4 deletions common/baderror/baderror.go
Original file line number Diff line number Diff line change
@@ -2,11 +2,10 @@ package baderror

import (
"context"
"errors"
"io"
"net"
"strings"

E "github.com/sagernet/sing/common/exceptions"
)

func Contains(err error, msgList ...string) bool {
@@ -22,8 +21,7 @@ func WrapH2(err error) error {
if err == nil {
return nil
}
err = E.Unwrap(err)
if err == io.ErrUnexpectedEOF {
if errors.Is(err, io.ErrUnexpectedEOF) {
return io.EOF
}
if Contains(err, "client disconnected", "body closed by handler", "response body closed", "; CANCEL") {
3 changes: 3 additions & 0 deletions common/binary/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# binary

mod from go 1.22.3
Loading