frida 16.2.1 → 16.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BSDmakefile +6 -0
- package/Makefile +16 -0
- package/README.md +14 -11
- package/configure +18 -0
- package/configure.bat +22 -0
- package/dist/native.js +0 -8
- package/lib/application.ts +98 -0
- package/lib/authentication.ts +3 -0
- package/lib/build.py +50 -0
- package/lib/bus.ts +30 -0
- package/lib/cancellable.ts +33 -0
- package/lib/child.ts +15 -0
- package/lib/crash.ts +11 -0
- package/lib/device.ts +329 -0
- package/lib/device_manager.ts +69 -0
- package/lib/endpoint_parameters.ts +56 -0
- package/lib/icon.ts +15 -0
- package/lib/index.ts +311 -0
- package/lib/iostream.ts +78 -0
- package/lib/meson.build +53 -0
- package/lib/native.ts +9 -0
- package/lib/portal_membership.ts +10 -0
- package/lib/portal_service.ts +105 -0
- package/lib/process.ts +57 -0
- package/lib/relay.ts +44 -0
- package/lib/script.ts +352 -0
- package/lib/session.ts +113 -0
- package/lib/signals.ts +45 -0
- package/lib/socket_address.ts +35 -0
- package/lib/spawn.ts +4 -0
- package/lib/system_parameters.ts +78 -0
- package/make.bat +23 -0
- package/meson.build +160 -0
- package/meson.options +11 -0
- package/package.json +27 -6
- package/releng/deps.py +1133 -0
- package/releng/deps.toml +391 -0
- package/releng/devkit-assets/frida-core-example-unix.c +188 -0
- package/releng/devkit-assets/frida-core-example-windows.c +197 -0
- package/releng/devkit-assets/frida-core-example.sln +28 -0
- package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
- package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
- package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
- package/releng/devkit-assets/frida-gum-example.sln +28 -0
- package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
- package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
- package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
- package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
- package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
- package/releng/devkit.py +535 -0
- package/releng/env.py +420 -0
- package/releng/env_android.py +150 -0
- package/releng/env_apple.py +176 -0
- package/releng/env_generic.py +373 -0
- package/releng/frida_version.py +69 -0
- package/releng/machine_file.py +44 -0
- package/releng/machine_spec.py +290 -0
- package/releng/meson/meson.py +27 -0
- package/releng/meson/mesonbuild/__init__.py +0 -0
- package/releng/meson/mesonbuild/_pathlib.py +63 -0
- package/releng/meson/mesonbuild/_typing.py +69 -0
- package/releng/meson/mesonbuild/arglist.py +321 -0
- package/releng/meson/mesonbuild/ast/__init__.py +23 -0
- package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
- package/releng/meson/mesonbuild/ast/introspection.py +374 -0
- package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
- package/releng/meson/mesonbuild/ast/printer.py +620 -0
- package/releng/meson/mesonbuild/ast/visitor.py +161 -0
- package/releng/meson/mesonbuild/backend/__init__.py +0 -0
- package/releng/meson/mesonbuild/backend/backends.py +2047 -0
- package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
- package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
- package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
- package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
- package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
- package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
- package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
- package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
- package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
- package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
- package/releng/meson/mesonbuild/build.py +3249 -0
- package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
- package/releng/meson/mesonbuild/cargo/builder.py +238 -0
- package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
- package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
- package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
- package/releng/meson/mesonbuild/cargo/version.py +95 -0
- package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
- package/releng/meson/mesonbuild/cmake/common.py +331 -0
- package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
- package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
- package/releng/meson/mesonbuild/cmake/executor.py +241 -0
- package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
- package/releng/meson/mesonbuild/cmake/generator.py +186 -0
- package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
- package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
- package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
- package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
- package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
- package/releng/meson/mesonbuild/compilers/asm.py +307 -0
- package/releng/meson/mesonbuild/compilers/c.py +788 -0
- package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
- package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
- package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
- package/releng/meson/mesonbuild/compilers/cs.py +136 -0
- package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
- package/releng/meson/mesonbuild/compilers/cython.py +91 -0
- package/releng/meson/mesonbuild/compilers/d.py +861 -0
- package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
- package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
- package/releng/meson/mesonbuild/compilers/java.py +113 -0
- package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
- package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
- package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
- package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
- package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
- package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
- package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
- package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
- package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
- package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
- package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
- package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
- package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
- package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
- package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
- package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
- package/releng/meson/mesonbuild/compilers/objc.py +120 -0
- package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
- package/releng/meson/mesonbuild/compilers/rust.py +230 -0
- package/releng/meson/mesonbuild/compilers/swift.py +131 -0
- package/releng/meson/mesonbuild/compilers/vala.py +121 -0
- package/releng/meson/mesonbuild/coredata.py +1532 -0
- package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
- package/releng/meson/mesonbuild/dependencies/base.py +663 -0
- package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
- package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
- package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
- package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
- package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
- package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
- package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
- package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
- package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
- package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
- package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
- package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
- package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
- package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
- package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
- package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
- package/releng/meson/mesonbuild/dependencies/python.py +431 -0
- package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
- package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
- package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
- package/releng/meson/mesonbuild/depfile.py +82 -0
- package/releng/meson/mesonbuild/envconfig.py +480 -0
- package/releng/meson/mesonbuild/environment.py +987 -0
- package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
- package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
- package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
- package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
- package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
- package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
- package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
- package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
- package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
- package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
- package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
- package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
- package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
- package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
- package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
- package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
- package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
- package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
- package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
- package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
- package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
- package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
- package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
- package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
- package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
- package/releng/meson/mesonbuild/linkers/base.py +39 -0
- package/releng/meson/mesonbuild/linkers/detect.py +229 -0
- package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
- package/releng/meson/mesonbuild/mcompile.py +380 -0
- package/releng/meson/mesonbuild/mconf.py +368 -0
- package/releng/meson/mesonbuild/mdevenv.py +234 -0
- package/releng/meson/mesonbuild/mdist.py +376 -0
- package/releng/meson/mesonbuild/mesondata.py +38 -0
- package/releng/meson/mesonbuild/mesonlib.py +23 -0
- package/releng/meson/mesonbuild/mesonmain.py +289 -0
- package/releng/meson/mesonbuild/minit.py +204 -0
- package/releng/meson/mesonbuild/minstall.py +864 -0
- package/releng/meson/mesonbuild/mintro.py +667 -0
- package/releng/meson/mesonbuild/mlog.py +542 -0
- package/releng/meson/mesonbuild/modules/__init__.py +270 -0
- package/releng/meson/mesonbuild/modules/cmake.py +442 -0
- package/releng/meson/mesonbuild/modules/cuda.py +377 -0
- package/releng/meson/mesonbuild/modules/dlang.py +117 -0
- package/releng/meson/mesonbuild/modules/external_project.py +306 -0
- package/releng/meson/mesonbuild/modules/fs.py +323 -0
- package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
- package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
- package/releng/meson/mesonbuild/modules/i18n.py +405 -0
- package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
- package/releng/meson/mesonbuild/modules/java.py +112 -0
- package/releng/meson/mesonbuild/modules/keyval.py +65 -0
- package/releng/meson/mesonbuild/modules/modtest.py +33 -0
- package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
- package/releng/meson/mesonbuild/modules/python.py +556 -0
- package/releng/meson/mesonbuild/modules/python3.py +85 -0
- package/releng/meson/mesonbuild/modules/qt.py +621 -0
- package/releng/meson/mesonbuild/modules/qt4.py +23 -0
- package/releng/meson/mesonbuild/modules/qt5.py +23 -0
- package/releng/meson/mesonbuild/modules/qt6.py +22 -0
- package/releng/meson/mesonbuild/modules/rust.py +355 -0
- package/releng/meson/mesonbuild/modules/simd.py +114 -0
- package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
- package/releng/meson/mesonbuild/modules/wayland.py +151 -0
- package/releng/meson/mesonbuild/modules/windows.py +207 -0
- package/releng/meson/mesonbuild/mparser.py +1114 -0
- package/releng/meson/mesonbuild/msetup.py +365 -0
- package/releng/meson/mesonbuild/msubprojects.py +764 -0
- package/releng/meson/mesonbuild/mtest.py +2201 -0
- package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
- package/releng/meson/mesonbuild/optinterpreter.py +276 -0
- package/releng/meson/mesonbuild/programs.py +367 -0
- package/releng/meson/mesonbuild/rewriter.py +1075 -0
- package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
- package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
- package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
- package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
- package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
- package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
- package/releng/meson/mesonbuild/scripts/copy.py +19 -0
- package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
- package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
- package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
- package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
- package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
- package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
- package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
- package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
- package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
- package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
- package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
- package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
- package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
- package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
- package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
- package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
- package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
- package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
- package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
- package/releng/meson/mesonbuild/scripts/tags.py +44 -0
- package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
- package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
- package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
- package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
- package/releng/meson/mesonbuild/templates/__init__.py +0 -0
- package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
- package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
- package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
- package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
- package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
- package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
- package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
- package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
- package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
- package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
- package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
- package/releng/meson/mesonbuild/utils/__init__.py +0 -0
- package/releng/meson/mesonbuild/utils/core.py +166 -0
- package/releng/meson/mesonbuild/utils/platform.py +27 -0
- package/releng/meson/mesonbuild/utils/posix.py +32 -0
- package/releng/meson/mesonbuild/utils/universal.py +2445 -0
- package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
- package/releng/meson/mesonbuild/utils/win32.py +29 -0
- package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
- package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
- package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
- package/releng/meson-scripts/BSDmakefile +6 -0
- package/releng/meson-scripts/Makefile +16 -0
- package/releng/meson-scripts/configure +18 -0
- package/releng/meson-scripts/configure.bat +22 -0
- package/releng/meson-scripts/make.bat +23 -0
- package/releng/meson_configure.py +506 -0
- package/releng/meson_make.py +131 -0
- package/releng/mkdevkit.py +107 -0
- package/releng/mkfatmacho.py +54 -0
- package/releng/post-process-oabi.py +97 -0
- package/releng/progress.py +14 -0
- package/releng/sync-from-upstream.py +185 -0
- package/releng/tomlkit/tomlkit/__init__.py +59 -0
- package/releng/tomlkit/tomlkit/_compat.py +22 -0
- package/releng/tomlkit/tomlkit/_types.py +83 -0
- package/releng/tomlkit/tomlkit/_utils.py +158 -0
- package/releng/tomlkit/tomlkit/api.py +308 -0
- package/releng/tomlkit/tomlkit/container.py +875 -0
- package/releng/tomlkit/tomlkit/exceptions.py +227 -0
- package/releng/tomlkit/tomlkit/items.py +1967 -0
- package/releng/tomlkit/tomlkit/parser.py +1141 -0
- package/releng/tomlkit/tomlkit/py.typed +0 -0
- package/releng/tomlkit/tomlkit/source.py +180 -0
- package/releng/tomlkit/tomlkit/toml_char.py +52 -0
- package/releng/tomlkit/tomlkit/toml_document.py +7 -0
- package/releng/tomlkit/tomlkit/toml_file.py +58 -0
- package/releng/winenv.py +140 -0
- package/scripts/adjust-version.py +19 -0
- package/scripts/detect-version.py +40 -0
- package/scripts/fetch-abi-bits.py +343 -0
- package/scripts/install.js +23 -0
- package/scripts/package.py +15 -0
- package/src/addon.cc +76 -0
- package/src/application.cc +148 -0
- package/src/application.h +31 -0
- package/src/authentication.cc +174 -0
- package/src/authentication.h +24 -0
- package/src/bus.cc +167 -0
- package/src/bus.h +33 -0
- package/src/cancellable.cc +117 -0
- package/src/cancellable.h +31 -0
- package/src/child.cc +150 -0
- package/src/child.h +32 -0
- package/src/crash.cc +122 -0
- package/src/crash.h +30 -0
- package/src/device.cc +1302 -0
- package/src/device.h +55 -0
- package/src/device_manager.cc +362 -0
- package/src/device_manager.h +35 -0
- package/src/endpoint_parameters.cc +171 -0
- package/src/endpoint_parameters.h +28 -0
- package/src/glib_context.cc +62 -0
- package/src/glib_context.h +29 -0
- package/src/glib_object.cc +25 -0
- package/src/glib_object.h +37 -0
- package/src/iostream.cc +247 -0
- package/src/iostream.h +30 -0
- package/src/meson.build +26 -0
- package/src/operation.h +94 -0
- package/src/portal_membership.cc +100 -0
- package/src/portal_membership.h +26 -0
- package/src/portal_service.cc +401 -0
- package/src/portal_service.h +40 -0
- package/src/process.cc +135 -0
- package/src/process.h +30 -0
- package/src/relay.cc +139 -0
- package/src/relay.h +31 -0
- package/src/runtime.cc +443 -0
- package/src/runtime.h +64 -0
- package/src/script.cc +301 -0
- package/src/script.h +36 -0
- package/src/session.cc +860 -0
- package/src/session.h +42 -0
- package/src/signals.cc +334 -0
- package/src/signals.h +47 -0
- package/src/spawn.cc +95 -0
- package/src/spawn.h +27 -0
- package/src/usage_monitor.h +117 -0
- package/src/uv_context.cc +118 -0
- package/src/uv_context.h +40 -0
- package/src/win_delay_load_hook.cc +63 -0
- package/subprojects/frida-core.wrap +8 -0
- package/subprojects/nan.wrap +9 -0
- package/subprojects/packagefiles/nan.patch +13 -0
- package/test/data/index.ts +13 -0
- package/test/data/unixvictim-linux-x86 +0 -0
- package/test/data/unixvictim-linux-x86_64 +0 -0
- package/test/data/unixvictim-macos +0 -0
- package/test/device.ts +27 -0
- package/test/device_manager.ts +16 -0
- package/test/labrat.ts +32 -0
- package/test/script.ts +176 -0
- package/test/session.ts +73 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import hashlib
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
from typing import Optional
|
|
9
|
+
|
|
10
|
+
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
11
|
+
sys.path.insert(0, str(REPO_ROOT))
|
|
12
|
+
from releng import devkit, env, machine_spec
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def main():
|
|
16
|
+
raw_args: list[str] = []
|
|
17
|
+
ool_optvals: dict[str, list[str]] = {}
|
|
18
|
+
pending_raw_args = sys.argv[1:]
|
|
19
|
+
while len(pending_raw_args) > 0:
|
|
20
|
+
cur = pending_raw_args.pop(0)
|
|
21
|
+
if cur == ">>>":
|
|
22
|
+
ool_hash = hashlib.sha256()
|
|
23
|
+
ool_strv = []
|
|
24
|
+
while True:
|
|
25
|
+
cur = pending_raw_args.pop(0)
|
|
26
|
+
if cur == "<<<":
|
|
27
|
+
break
|
|
28
|
+
ool_hash.update(cur.encode("utf-8"))
|
|
29
|
+
ool_strv.append(cur)
|
|
30
|
+
val_id = "ool:" + ool_hash.hexdigest()
|
|
31
|
+
ool_optvals[val_id] = ool_strv
|
|
32
|
+
raw_args.append(val_id)
|
|
33
|
+
else:
|
|
34
|
+
raw_args.append(cur)
|
|
35
|
+
|
|
36
|
+
parser = argparse.ArgumentParser()
|
|
37
|
+
parser.add_argument("kit")
|
|
38
|
+
parser.add_argument("machine",
|
|
39
|
+
type=machine_spec.MachineSpec.parse)
|
|
40
|
+
parser.add_argument("outdir",
|
|
41
|
+
type=Path)
|
|
42
|
+
parser.add_argument("-t", "--thin",
|
|
43
|
+
help="build without cross-arch support",
|
|
44
|
+
action="store_const",
|
|
45
|
+
dest="flavor",
|
|
46
|
+
const="_thin",
|
|
47
|
+
default="")
|
|
48
|
+
parser.add_argument("--cc",
|
|
49
|
+
help="C compiler to use",
|
|
50
|
+
type=lambda v: parse_array_option_value(v, ool_optvals))
|
|
51
|
+
machine_options = dict.fromkeys(["c_args", "lib", "libtool", "ar", "nm", "objcopy", "pkg_config", "pkg_config_path"])
|
|
52
|
+
for name in machine_options.keys():
|
|
53
|
+
pretty_name = name.replace("_", "-")
|
|
54
|
+
parser.add_argument("--" + pretty_name,
|
|
55
|
+
help=f"The {pretty_name} to use",
|
|
56
|
+
type=lambda v: parse_array_option_value(v, ool_optvals))
|
|
57
|
+
|
|
58
|
+
options = parser.parse_args(raw_args)
|
|
59
|
+
|
|
60
|
+
kit = options.kit
|
|
61
|
+
machine = options.machine
|
|
62
|
+
outdir = options.outdir.resolve()
|
|
63
|
+
flavor = options.flavor
|
|
64
|
+
|
|
65
|
+
cc = options.cc
|
|
66
|
+
if cc is not None:
|
|
67
|
+
meson_config = {"c": cc}
|
|
68
|
+
for k, v in vars(options).items():
|
|
69
|
+
if k in machine_options and v is not None:
|
|
70
|
+
name = "pkg-config" if k == "pkg_config" else k
|
|
71
|
+
meson_config[name] = v
|
|
72
|
+
else:
|
|
73
|
+
build_dir = REPO_ROOT / "build"
|
|
74
|
+
|
|
75
|
+
if flavor == "":
|
|
76
|
+
fat_machine_file = env.query_machine_file_path(machine, flavor, build_dir)
|
|
77
|
+
if not fat_machine_file.exists() \
|
|
78
|
+
and env.query_machine_file_path(machine, "_thin", build_dir).exists():
|
|
79
|
+
flavor = "_thin"
|
|
80
|
+
|
|
81
|
+
meson_config = env.load_meson_config(machine, flavor, build_dir)
|
|
82
|
+
assert meson_config is not None
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
app = devkit.CompilerApplication(kit, machine, meson_config, outdir)
|
|
86
|
+
app.run()
|
|
87
|
+
except subprocess.CalledProcessError as e:
|
|
88
|
+
print(e, file=sys.stderr)
|
|
89
|
+
if e.output:
|
|
90
|
+
print("Stdout:", e.output, file=sys.stderr)
|
|
91
|
+
if e.stderr:
|
|
92
|
+
print("Stderr:", e.stderr, file=sys.stderr)
|
|
93
|
+
sys.exit(1)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def parse_array_option_value(val: str, ool_optvals: dict[str, list[str]]) -> Optional[list[str]]:
|
|
97
|
+
if val == "":
|
|
98
|
+
return None
|
|
99
|
+
if val.startswith("ool:"):
|
|
100
|
+
ool_val = ool_optvals.get(val)
|
|
101
|
+
if ool_val is not None:
|
|
102
|
+
return ool_val
|
|
103
|
+
return [val]
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
if __name__ == "__main__":
|
|
107
|
+
main()
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import shutil
|
|
5
|
+
import struct
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def make_fat_macho(output_path, input_paths):
|
|
10
|
+
"""
|
|
11
|
+
Used to create a FAT Mach-O when Apple's lipo tool refuses to do so, such as
|
|
12
|
+
when needing two arm64e slices to support both the new and the old arm64e ABI.
|
|
13
|
+
"""
|
|
14
|
+
input_slices = []
|
|
15
|
+
offset = 0x8000
|
|
16
|
+
slice_alignment = 0x4000
|
|
17
|
+
for input_path in input_paths:
|
|
18
|
+
delta = offset % slice_alignment
|
|
19
|
+
if delta != 0:
|
|
20
|
+
offset += slice_alignment - delta
|
|
21
|
+
|
|
22
|
+
offset_bits = bin(offset)
|
|
23
|
+
alignment = len(offset_bits[offset_bits.rfind("1") + 1:])
|
|
24
|
+
|
|
25
|
+
f = open(input_path, "rb+")
|
|
26
|
+
|
|
27
|
+
f.seek(4)
|
|
28
|
+
cpu_type, cpu_subtype = struct.unpack("<II", f.read(8))
|
|
29
|
+
|
|
30
|
+
f.seek(0, os.SEEK_END)
|
|
31
|
+
size = f.tell()
|
|
32
|
+
|
|
33
|
+
input_slices.append((f, cpu_type, cpu_subtype, offset, size, alignment))
|
|
34
|
+
|
|
35
|
+
offset += size
|
|
36
|
+
|
|
37
|
+
with open(output_path, "wb") as output_file:
|
|
38
|
+
header = struct.pack(">II", 0xcafebabe, len(input_slices))
|
|
39
|
+
output_file.write(header)
|
|
40
|
+
|
|
41
|
+
for (_, cpu_type, cpu_subtype, offset, size, alignment) in input_slices:
|
|
42
|
+
slice_spec = struct.pack(">IIIII", cpu_type, cpu_subtype, offset, size, alignment)
|
|
43
|
+
output_file.write(slice_spec)
|
|
44
|
+
|
|
45
|
+
for (input_file, _, _, offset, _, _) in input_slices:
|
|
46
|
+
input_file.seek(0)
|
|
47
|
+
output_file.seek(offset)
|
|
48
|
+
shutil.copyfileobj(input_file, output_file)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
if __name__ == '__main__':
|
|
52
|
+
output_path = sys.argv[1]
|
|
53
|
+
input_paths = sys.argv[2:]
|
|
54
|
+
make_fat_macho(output_path, input_paths)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
import argparse
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
import shutil
|
|
5
|
+
import struct
|
|
6
|
+
import subprocess
|
|
7
|
+
import tarfile
|
|
8
|
+
import tempfile
|
|
9
|
+
import urllib.request
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
ARM64E_URL = "https://build.frida.re/deps/{version}/sdk-ios-arm64e.tar.xz"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class CommandError(Exception):
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def main():
|
|
20
|
+
parser = argparse.ArgumentParser()
|
|
21
|
+
parser.add_argument("--bundle", required=True)
|
|
22
|
+
parser.add_argument("--host", required=True)
|
|
23
|
+
parser.add_argument("--artifact", required=True)
|
|
24
|
+
parser.add_argument("--version", required=True)
|
|
25
|
+
args = parser.parse_args()
|
|
26
|
+
|
|
27
|
+
if args.bundle != "sdk":
|
|
28
|
+
raise CommandError("wrong bundle")
|
|
29
|
+
if args.host != "ios-arm64eoabi":
|
|
30
|
+
raise CommandError("wrong host")
|
|
31
|
+
|
|
32
|
+
arm64e_sdk_url = ARM64E_URL.format(version=args.version)
|
|
33
|
+
|
|
34
|
+
print(f"Downloading {arm64e_sdk_url}")
|
|
35
|
+
with urllib.request.urlopen(arm64e_sdk_url) as response, \
|
|
36
|
+
tempfile.NamedTemporaryFile(suffix=".tar.xz") as archive:
|
|
37
|
+
shutil.copyfileobj(response, archive)
|
|
38
|
+
archive.flush()
|
|
39
|
+
arm64e_artifact_path = Path(archive.name)
|
|
40
|
+
|
|
41
|
+
with tempfile.TemporaryDirectory() as patched_artifact_dir:
|
|
42
|
+
patched_artifact_file = Path(patched_artifact_dir) / "patched.tar.xz"
|
|
43
|
+
|
|
44
|
+
with tempfile.TemporaryDirectory() as artifact_extracted_dir, \
|
|
45
|
+
tempfile.TemporaryDirectory() as arm64e_extracted_dir:
|
|
46
|
+
artifact_extracted_path = Path(artifact_extracted_dir)
|
|
47
|
+
arm64e_extracted_path = Path(arm64e_extracted_dir)
|
|
48
|
+
|
|
49
|
+
with tarfile.open(arm64e_artifact_path, "r:xz") as arm64e_tar:
|
|
50
|
+
arm64e_tar.extractall(arm64e_extracted_path)
|
|
51
|
+
|
|
52
|
+
artifact_path = Path(args.artifact)
|
|
53
|
+
with tarfile.open(artifact_path, "r:xz") as tar:
|
|
54
|
+
tar.extractall(artifact_extracted_path)
|
|
55
|
+
|
|
56
|
+
print("Patching libffi.a...")
|
|
57
|
+
steal_object(artifact_extracted_path / "lib" / "libffi.a",
|
|
58
|
+
arm64e_extracted_path / "lib" / "libffi.a")
|
|
59
|
+
with tarfile.open(patched_artifact_file, "w:xz") as patched_tar:
|
|
60
|
+
patched_tar.add(artifact_extracted_path, arcname="./")
|
|
61
|
+
|
|
62
|
+
print(f"Overwriting {artifact_path}")
|
|
63
|
+
shutil.copy(patched_artifact_file, artifact_path)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def steal_object(arm64eoabi_libffi_a_path: Path, arm64e_libffi_a_path: Path):
|
|
67
|
+
"""
|
|
68
|
+
Steal just the aarch64_sysv.S.o object file from the arm64e libffi.a in
|
|
69
|
+
order to get the CIE info from the future compiler. Then patch the Mach-O
|
|
70
|
+
header of the stolen object to match the old arm64e ABI. It works because
|
|
71
|
+
the __text section is exactly the same.
|
|
72
|
+
"""
|
|
73
|
+
if not arm64eoabi_libffi_a_path.exists():
|
|
74
|
+
raise RuntimeError("input arm64eoabi libffi.a not found")
|
|
75
|
+
if not arm64e_libffi_a_path.exists():
|
|
76
|
+
raise RuntimeError("input arm64e libffi.a not found")
|
|
77
|
+
|
|
78
|
+
with tempfile.TemporaryDirectory() as oabi_dir, tempfile.TemporaryDirectory() as nabi_dir:
|
|
79
|
+
perform("ar", "-x", arm64eoabi_libffi_a_path.absolute(), cwd=oabi_dir)
|
|
80
|
+
perform("ar", "-x", arm64e_libffi_a_path.absolute(), cwd=nabi_dir)
|
|
81
|
+
dst = Path(oabi_dir) / "aarch64_sysv.S.o"
|
|
82
|
+
dst.unlink()
|
|
83
|
+
shutil.copy(Path(nabi_dir) / "aarch64_sysv.S.o", dst)
|
|
84
|
+
with dst.open("rb+") as f:
|
|
85
|
+
f.seek(0xb)
|
|
86
|
+
f.write(struct.pack("B", 0))
|
|
87
|
+
|
|
88
|
+
perform("ar", "-r", arm64eoabi_libffi_a_path.absolute(), dst.name, cwd=oabi_dir)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def perform(*args, **kwargs):
|
|
92
|
+
print(">", " ".join([str(arg) for arg in args]), flush=True)
|
|
93
|
+
return subprocess.run(args, check=True, **kwargs)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
if __name__ == "__main__":
|
|
97
|
+
main()
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Callable
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@dataclass
|
|
6
|
+
class Progress:
|
|
7
|
+
message: str
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
ProgressCallback = Callable[[Progress], None]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def print_progress(progress: Progress):
|
|
14
|
+
print(f"{progress.message}...", flush=True)
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
import re
|
|
4
|
+
import subprocess
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def make_gnome_url(repo_name):
|
|
9
|
+
return "https://gitlab.gnome.org/GNOME/{}.git".format(repo_name)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
upstreams = {
|
|
13
|
+
"meson": ("https://github.com/mesonbuild/meson.git", "master"),
|
|
14
|
+
"termux-elf-cleaner": "https://github.com/termux/termux-elf-cleaner.git",
|
|
15
|
+
"libiconv": "https://git.savannah.gnu.org/git/libiconv.git",
|
|
16
|
+
"zlib": "https://github.com/madler/zlib.git",
|
|
17
|
+
"brotli": "https://github.com/google/brotli.git",
|
|
18
|
+
"minizip": "https://github.com/zlib-ng/minizip-ng.git",
|
|
19
|
+
"libffi": "https://github.com/libffi/libffi.git",
|
|
20
|
+
"libunwind": "https://github.com/libunwind/libunwind.git",
|
|
21
|
+
"glib": make_gnome_url("glib"),
|
|
22
|
+
"glib-networking": make_gnome_url("glib-networking"),
|
|
23
|
+
"libnice": "https://gitlab.freedesktop.org/libnice/libnice.git",
|
|
24
|
+
"usrsctp": "https://github.com/sctplab/usrsctp.git",
|
|
25
|
+
"libgee": make_gnome_url("libgee"),
|
|
26
|
+
"json-glib": make_gnome_url("json-glib"),
|
|
27
|
+
"libpsl": "https://github.com/rockdaboot/libpsl.git",
|
|
28
|
+
"libxml2": make_gnome_url("libxml2"),
|
|
29
|
+
"libsoup": make_gnome_url("libsoup"),
|
|
30
|
+
"vala": make_gnome_url("vala"),
|
|
31
|
+
"xz": "https://git.tukaani.org/xz.git",
|
|
32
|
+
"pkg-config": "https://gitlab.freedesktop.org/pkg-config/pkg-config.git",
|
|
33
|
+
"quickjs": ("https://github.com/bellard/quickjs.git", "master"),
|
|
34
|
+
"gn": "https://gn.googlesource.com/gn",
|
|
35
|
+
"v8": "https://chromium.googlesource.com/v8/v8",
|
|
36
|
+
"capstone": ("https://github.com/capstone-engine/capstone.git", "v5"),
|
|
37
|
+
"tinycc": "https://repo.or.cz/tinycc.git",
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def sync(repo_path):
|
|
42
|
+
repo_name = os.path.basename(repo_path)
|
|
43
|
+
|
|
44
|
+
patches_path = os.path.join(str(Path.home()), ".frida-sync-" + re.sub(r"[^\w\d]", "-", repo_path.lower()).lstrip("-"))
|
|
45
|
+
if os.path.exists(patches_path):
|
|
46
|
+
patches = PendingPatches.load(patches_path)
|
|
47
|
+
|
|
48
|
+
print("Applying {} pending patches".format(patches.count))
|
|
49
|
+
else:
|
|
50
|
+
entry = upstreams.get(repo_name, None)
|
|
51
|
+
if entry is None:
|
|
52
|
+
raise UnknownUpstreamError("Unknown upstream: {}".format(repo_name))
|
|
53
|
+
if isinstance(entry, tuple):
|
|
54
|
+
upstream_url, upstream_branch = entry
|
|
55
|
+
else:
|
|
56
|
+
upstream_url = entry
|
|
57
|
+
upstream_branch = "main"
|
|
58
|
+
upstream_target = "upstream/" + upstream_branch
|
|
59
|
+
|
|
60
|
+
print("Synchronizing with {}".format(upstream_url))
|
|
61
|
+
|
|
62
|
+
subprocess.run(["git", "checkout", "main"], cwd=repo_path, capture_output=True, check=True)
|
|
63
|
+
subprocess.run(["git", "pull"], cwd=repo_path, capture_output=True, check=True)
|
|
64
|
+
result = subprocess.run(["git", "status"], cwd=repo_path, capture_output=True, check=True, encoding='utf-8')
|
|
65
|
+
if not "working tree clean" in result.stdout:
|
|
66
|
+
raise WorkingTreeDirtyError("Working tree is dirty")
|
|
67
|
+
|
|
68
|
+
subprocess.run(["git", "remote", "add", "upstream", upstream_url], cwd=repo_path, capture_output=True)
|
|
69
|
+
subprocess.run(["git", "fetch", "upstream"], cwd=repo_path, check=True)
|
|
70
|
+
|
|
71
|
+
patches, base = list_our_patches(repo_path)
|
|
72
|
+
print("We have {} patches on top of upstream".format(patches.count))
|
|
73
|
+
|
|
74
|
+
new_entries = list_upstream_changes(repo_path, upstream_target, base)
|
|
75
|
+
if len(new_entries) == 0:
|
|
76
|
+
print("Already up-to-date")
|
|
77
|
+
return
|
|
78
|
+
|
|
79
|
+
print("Upstream has {} new commits".format(len(new_entries)))
|
|
80
|
+
|
|
81
|
+
print("Merging...")
|
|
82
|
+
subprocess.run(["git", "merge", "-s", "ours", upstream_target], cwd=repo_path, capture_output=True, check=True)
|
|
83
|
+
subprocess.run(["git", "checkout", "--detach", upstream_target], cwd=repo_path, capture_output=True, check=True)
|
|
84
|
+
subprocess.run(["git", "reset", "--soft", "main"], cwd=repo_path, capture_output=True, check=True)
|
|
85
|
+
subprocess.run(["git", "checkout", "main"], cwd=repo_path, capture_output=True, check=True)
|
|
86
|
+
subprocess.run(["git", "commit", "--amend", "-C", "HEAD"], cwd=repo_path, capture_output=True, check=True)
|
|
87
|
+
|
|
88
|
+
patches.save(patches_path)
|
|
89
|
+
|
|
90
|
+
while True:
|
|
91
|
+
index, cid, message = patches.try_pop()
|
|
92
|
+
if index is None:
|
|
93
|
+
break
|
|
94
|
+
|
|
95
|
+
print("Cherry-picking {}/{}: {}".format(index + 1, patches.count, message))
|
|
96
|
+
try:
|
|
97
|
+
subprocess.run(["git", "cherry-pick", cid], cwd=repo_path, capture_output=True, encoding='utf-8', check=True)
|
|
98
|
+
except subprocess.CalledProcessError as e:
|
|
99
|
+
patches.save(patches_path)
|
|
100
|
+
|
|
101
|
+
print("\n*** Unable to apply this patch:")
|
|
102
|
+
print(e.stderr)
|
|
103
|
+
print("Run `git cherry-pick --abort` and re-run script to skip it.")
|
|
104
|
+
|
|
105
|
+
return
|
|
106
|
+
|
|
107
|
+
os.remove(patches_path)
|
|
108
|
+
print("Done!")
|
|
109
|
+
|
|
110
|
+
def list_our_patches(repo_path):
|
|
111
|
+
items = []
|
|
112
|
+
base = None
|
|
113
|
+
entries = list_recent_commits(repo_path, "--max-count=1000")
|
|
114
|
+
for index, entry in enumerate(entries):
|
|
115
|
+
cid, message = entry
|
|
116
|
+
if message.startswith("Merge"):
|
|
117
|
+
base = entries[index + 1][0]
|
|
118
|
+
break
|
|
119
|
+
items.append(("pending", cid, message))
|
|
120
|
+
items.reverse()
|
|
121
|
+
return (PendingPatches(items), base)
|
|
122
|
+
|
|
123
|
+
def list_upstream_changes(repo_path, upstream_target, since):
|
|
124
|
+
return list(reversed(list_recent_commits(repo_path, since + ".." + upstream_target)))
|
|
125
|
+
|
|
126
|
+
def list_recent_commits(repo_path, *args):
|
|
127
|
+
result = subprocess.run(["git", "log", "--pretty=oneline", "--abbrev-commit", "--topo-order"] + list(args),
|
|
128
|
+
cwd=repo_path, capture_output=True, check=True, encoding='utf-8', errors='surrogateescape')
|
|
129
|
+
return [line.split(" ", 1) for line in result.stdout.rstrip().split("\n")]
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class PendingPatches(object):
|
|
133
|
+
def __init__(self, items):
|
|
134
|
+
self._items = items
|
|
135
|
+
|
|
136
|
+
offset = 0
|
|
137
|
+
for status, cid, message in items:
|
|
138
|
+
if status == "applied":
|
|
139
|
+
offset += 1
|
|
140
|
+
else:
|
|
141
|
+
break
|
|
142
|
+
self._offset = offset
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def count(self):
|
|
146
|
+
return len(self._items)
|
|
147
|
+
|
|
148
|
+
def try_pop(self):
|
|
149
|
+
index = self._offset
|
|
150
|
+
if index == len(self._items):
|
|
151
|
+
return (None, None, None)
|
|
152
|
+
|
|
153
|
+
_, cid, message = self._items[index]
|
|
154
|
+
self._items[index] = ("applied", cid, message)
|
|
155
|
+
self._offset += 1
|
|
156
|
+
|
|
157
|
+
return (index, cid, message)
|
|
158
|
+
|
|
159
|
+
@classmethod
|
|
160
|
+
def load(cls, path):
|
|
161
|
+
with open(path, "r", encoding='utf-8') as f:
|
|
162
|
+
data = f.read()
|
|
163
|
+
|
|
164
|
+
items = []
|
|
165
|
+
for line in data.strip().split("\n"):
|
|
166
|
+
status, cid, message = line.split(" ", maxsplit=2)
|
|
167
|
+
items.append((status, cid, message))
|
|
168
|
+
return PendingPatches(items)
|
|
169
|
+
|
|
170
|
+
def save(self, path):
|
|
171
|
+
data = "\n".join([" ".join(item) for item in self._items]) + "\n"
|
|
172
|
+
with open(path, "w", encoding='utf-8') as f:
|
|
173
|
+
f.write(data)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class WorkingTreeDirtyError(Exception):
|
|
177
|
+
pass
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class UnknownUpstreamError(Exception):
|
|
181
|
+
pass
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
if __name__ == '__main__':
|
|
185
|
+
sync(os.path.abspath(sys.argv[1]))
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from tomlkit.api import TOMLDocument
|
|
2
|
+
from tomlkit.api import aot
|
|
3
|
+
from tomlkit.api import array
|
|
4
|
+
from tomlkit.api import boolean
|
|
5
|
+
from tomlkit.api import comment
|
|
6
|
+
from tomlkit.api import date
|
|
7
|
+
from tomlkit.api import datetime
|
|
8
|
+
from tomlkit.api import document
|
|
9
|
+
from tomlkit.api import dump
|
|
10
|
+
from tomlkit.api import dumps
|
|
11
|
+
from tomlkit.api import float_
|
|
12
|
+
from tomlkit.api import inline_table
|
|
13
|
+
from tomlkit.api import integer
|
|
14
|
+
from tomlkit.api import item
|
|
15
|
+
from tomlkit.api import key
|
|
16
|
+
from tomlkit.api import key_value
|
|
17
|
+
from tomlkit.api import load
|
|
18
|
+
from tomlkit.api import loads
|
|
19
|
+
from tomlkit.api import nl
|
|
20
|
+
from tomlkit.api import parse
|
|
21
|
+
from tomlkit.api import register_encoder
|
|
22
|
+
from tomlkit.api import string
|
|
23
|
+
from tomlkit.api import table
|
|
24
|
+
from tomlkit.api import time
|
|
25
|
+
from tomlkit.api import unregister_encoder
|
|
26
|
+
from tomlkit.api import value
|
|
27
|
+
from tomlkit.api import ws
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
__version__ = "0.12.4"
|
|
31
|
+
__all__ = [
|
|
32
|
+
"aot",
|
|
33
|
+
"array",
|
|
34
|
+
"boolean",
|
|
35
|
+
"comment",
|
|
36
|
+
"date",
|
|
37
|
+
"datetime",
|
|
38
|
+
"document",
|
|
39
|
+
"dump",
|
|
40
|
+
"dumps",
|
|
41
|
+
"float_",
|
|
42
|
+
"inline_table",
|
|
43
|
+
"integer",
|
|
44
|
+
"item",
|
|
45
|
+
"key",
|
|
46
|
+
"key_value",
|
|
47
|
+
"load",
|
|
48
|
+
"loads",
|
|
49
|
+
"nl",
|
|
50
|
+
"parse",
|
|
51
|
+
"string",
|
|
52
|
+
"table",
|
|
53
|
+
"time",
|
|
54
|
+
"TOMLDocument",
|
|
55
|
+
"value",
|
|
56
|
+
"ws",
|
|
57
|
+
"register_encoder",
|
|
58
|
+
"unregister_encoder",
|
|
59
|
+
]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import contextlib
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
PY38 = sys.version_info >= (3, 8)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def decode(string: Any, encodings: list[str] | None = None):
|
|
13
|
+
if not isinstance(string, bytes):
|
|
14
|
+
return string
|
|
15
|
+
|
|
16
|
+
encodings = encodings or ["utf-8", "latin1", "ascii"]
|
|
17
|
+
|
|
18
|
+
for encoding in encodings:
|
|
19
|
+
with contextlib.suppress(UnicodeEncodeError, UnicodeDecodeError):
|
|
20
|
+
return string.decode(encoding)
|
|
21
|
+
|
|
22
|
+
return string.decode(encodings[0], errors="ignore")
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
from typing import Any
|
|
5
|
+
from typing import TypeVar
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
WT = TypeVar("WT", bound="WrapperType")
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
11
|
+
# Define _CustomList and _CustomDict as a workaround for:
|
|
12
|
+
# https://github.com/python/mypy/issues/11427
|
|
13
|
+
#
|
|
14
|
+
# According to this issue, the typeshed contains a "lie"
|
|
15
|
+
# (it adds MutableSequence to the ancestry of list and MutableMapping to
|
|
16
|
+
# the ancestry of dict) which completely messes with the type inference for
|
|
17
|
+
# Table, InlineTable, Array and Container.
|
|
18
|
+
#
|
|
19
|
+
# Importing from builtins is preferred over simple assignment, see issues:
|
|
20
|
+
# https://github.com/python/mypy/issues/8715
|
|
21
|
+
# https://github.com/python/mypy/issues/10068
|
|
22
|
+
from builtins import dict as _CustomDict # noqa: N812
|
|
23
|
+
from builtins import float as _CustomFloat # noqa: N812
|
|
24
|
+
from builtins import int as _CustomInt # noqa: N812
|
|
25
|
+
from builtins import list as _CustomList # noqa: N812
|
|
26
|
+
from typing import Callable
|
|
27
|
+
from typing import Concatenate
|
|
28
|
+
from typing import ParamSpec
|
|
29
|
+
from typing import Protocol
|
|
30
|
+
|
|
31
|
+
P = ParamSpec("P")
|
|
32
|
+
|
|
33
|
+
class WrapperType(Protocol):
|
|
34
|
+
def _new(self: WT, value: Any) -> WT:
|
|
35
|
+
...
|
|
36
|
+
|
|
37
|
+
else:
|
|
38
|
+
from collections.abc import MutableMapping
|
|
39
|
+
from collections.abc import MutableSequence
|
|
40
|
+
from numbers import Integral
|
|
41
|
+
from numbers import Real
|
|
42
|
+
|
|
43
|
+
class _CustomList(MutableSequence, list):
|
|
44
|
+
"""Adds MutableSequence mixin while pretending to be a builtin list"""
|
|
45
|
+
|
|
46
|
+
def __add__(self, other):
|
|
47
|
+
new_list = self.copy()
|
|
48
|
+
new_list.extend(other)
|
|
49
|
+
return new_list
|
|
50
|
+
|
|
51
|
+
def __iadd__(self, other):
|
|
52
|
+
self.extend(other)
|
|
53
|
+
return self
|
|
54
|
+
|
|
55
|
+
class _CustomDict(MutableMapping, dict):
|
|
56
|
+
"""Adds MutableMapping mixin while pretending to be a builtin dict"""
|
|
57
|
+
|
|
58
|
+
def __or__(self, other):
|
|
59
|
+
new_dict = self.copy()
|
|
60
|
+
new_dict.update(other)
|
|
61
|
+
return new_dict
|
|
62
|
+
|
|
63
|
+
def __ior__(self, other):
|
|
64
|
+
self.update(other)
|
|
65
|
+
return self
|
|
66
|
+
|
|
67
|
+
class _CustomInt(Integral, int):
|
|
68
|
+
"""Adds Integral mixin while pretending to be a builtin int"""
|
|
69
|
+
|
|
70
|
+
class _CustomFloat(Real, float):
|
|
71
|
+
"""Adds Real mixin while pretending to be a builtin float"""
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def wrap_method(
|
|
75
|
+
original_method: Callable[Concatenate[WT, P], Any],
|
|
76
|
+
) -> Callable[Concatenate[WT, P], Any]:
|
|
77
|
+
def wrapper(self: WT, *args: P.args, **kwargs: P.kwargs) -> Any:
|
|
78
|
+
result = original_method(self, *args, **kwargs)
|
|
79
|
+
if result is NotImplemented:
|
|
80
|
+
return result
|
|
81
|
+
return self._new(result)
|
|
82
|
+
|
|
83
|
+
return wrapper
|