--- /dev/null
+## Some tips on Debian Packaging
+
+- Debian New Maintainers' Guide [http://www.debian.org/doc/debian-policy/]
+- Debian Policy Manual [http://www.debian.org/doc/manuals/maint-guide/]
+- Machine-readable debian/copyright file [http://dep.debian.net/deps/dep5/]
+- DebSrc 3.0 guidelines [https://wiki.debian.org/Projects/DebSrc3.0]
+
+
+## Build using dpkg-buildpackage:
+
+```bash
+$ dpkg-buildpackage -d -tc
+ -d # do not check build dependencies and conflicts.
+ -tc # clean source tree when finished.
+```
+
+
+## Update changelog:
+
+```bash
+$ date -R
+```
+
+One can also install `devscripts` package and run:
+
+```bash
+$ dch -i
+```
+
+
+## Check packages:
+
+```bash
+$ dpkg -c *.deb
+$ lintian *.deb
+```
+
+
+## TODO
+
+Make it perfect!
--- /dev/null
+thrift (0.13.0-7) unstable; urgency=medium
+
+ * Remove python3-thrift-dbg package (closes: #994384).
+ * Update Standards-Version to 4.6.0 .
+ * Sync with Ubuntu.
+
+ [ Lucas Kanashiro <kanashiro@ubuntu.com> ]
+ * d/p/THRIFT-5318_support_php8.patch: Backport upstream patch to add support
+ for PHP 8 (LP: #1940473).
+ * d/rules: export GO111MODULE=off, this will make go.mod file not mandatory.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Fri, 24 Sep 2021 17:18:04 +0200
+
+thrift (0.13.0-6) unstable; urgency=medium
+
+ * Backport upstream fix for THRIFT-5322: Go compact_protocol allocating
+ unreasonable buffer size.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 14 Feb 2021 19:50:04 +0100
+
+thrift (0.13.0-5) unstable; urgency=medium
+
+ * Update Standards-Version to 4.5.0 .
+
+ [ Adrian Bunk <bunk@debian.org> ]
+ * Link with libatomic on ARMel and MIPSel (closes: #972948).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Mon, 26 Oct 2020 18:01:44 +0100
+
+thrift (0.13.0-4) unstable; urgency=medium
+
+ * Add XS-Go-Import-Path field.
+ * Correct installed Go source files location.
+ * Update supported Ruby version (closes: #950742).
+ * Remove unneeded composer build dependency (closes: #970587).
+ * Don't remove needed config.h header (closes: #972225).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Thu, 15 Oct 2020 17:07:25 +0200
+
+thrift (0.13.0-3) unstable; urgency=medium
+
+ * Backport upstream fix for wrong int to string conversions in Go testing
+ (closes: #971192).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 27 Sep 2020 21:31:25 +0200
+
+thrift (0.13.0-2) unstable; urgency=medium
+
+ * Link C++ tests with atomic.
+ * Upload to Sid.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 08 Dec 2019 12:24:18 +0000
+
+thrift (0.13.0-1) experimental; urgency=high
+
+ * New major upstream release:
+ - fixes CVE-2019-0205: endless loop when feed with specific input data,
+ - fixes CVE-2019-0210: Go server may panic when feed with invalid input
+ data,
+ - removed compiler plug-in mechanism (closes: #942337).
+ * Rework upstream distclean process (closes: #943653).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 01 Dec 2019 10:46:55 +0000
+
+thrift (0.12.0-1) experimental; urgency=medium
+
+ * New major upstream release.
+ * Rename related packages to -0.12.0 suffix.
+ * Remove Python 2 bindings (closes: #938662).
+ * Update debhelper level to 11 .
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 05 Oct 2019 08:58:11 +0000
+
+thrift (0.11.0-6) unstable; urgency=medium
+
+ * Update copyright file (closes: #935713).
+ * Update Python packaging bits (closes: #935715).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 25 Aug 2019 19:18:04 +0000
+
+thrift (0.11.0-5) experimental; urgency=medium
+
+ * Fix Python 3 packaging.
+ * Sync with Ubuntu.
+ * Update Standards-Version to 4.4.0 .
+
+ [ Adam Cecile <acecile@le-vert.net> ]
+ * Build python3 package (closes: #913724).
+
+ [ Gianfranco Costamagna <locutusofborg@debian.org> ]
+ * Export HOME to make the build happy (closes: #935620).
+ * Fix another failure due to new go with upstream patch.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 24 Aug 2019 15:47:34 +0000
+
+thrift (0.11.0-4) unstable; urgency=medium
+
+ * Backport upstream security fix for CVE-2018-11798: Node.js Filesever
+ webroot fixed path (closes: #918734).
+ * Update Standards-Version to 4.3.0 .
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Tue, 08 Jan 2019 21:31:07 +0000
+
+thrift (0.11.0-3) unstable; urgency=medium
+
+ * Build with latest PHP package version.
+ * Provide PHP package without version number.
+ * Upload to Sid (closes: #835294).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 27 Oct 2018 20:57:18 +0000
+
+thrift (0.11.0-2) experimental; urgency=medium
+
+ * Disable failing Python self-tests to fix mips and s390x FTBFS.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Fri, 12 Oct 2018 00:12:09 +0000
+
+thrift (0.11.0-1) experimental; urgency=medium
+
+ * New major upstream release.
+ * Fixes CVE-2016-5397: command injection in format_go_output
+ (closes: #894577).
+ * Fix FTBFS problems (closes: #909067).
+ * Rename related packages to -0.11.0 suffix.
+ * Build with PHP 7.2 version.
+ * Remove libmaven-ant-tasks-java build dependency (closes: #877126).
+ * Update patches.
+ * Use auto-generated debug packages.
+ * Change package priority to optional.
+ * Update Standards-Version to 4.2.1 .
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Thu, 20 Sep 2018 18:16:39 +0000
+
+thrift (0.10.0-1) experimental; urgency=low
+
+ * New upstream release.
+ * Rename related packages to -0.10.0 suffix.
+ * Correct Perl install directory (closes: #859128).
+ * Fix building with Boost 1.62 version.
+ * Only build Go bindings on supported architectures.
+ * Add python{,3}-six build dependency for testing support.
+ * Disable failing TSimpleServer testing for Python.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 13 May 2017 08:15:21 +0000
+
+thrift (0.9.3-2) experimental; urgency=low
+
+ * Build Go bindings.
+ * Update to build with Java Servlet API 3.1 .
+ * Fix build with GCC 6.2 .
+ * Fix build with Boost 1.61 .
+ * Update Standards-Version to 3.9.8 .
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 17 Jul 2016 19:31:46 +0000
+
+thrift (0.9.3-1) experimental; urgency=low
+
+ * New upstream release.
+ * Patch SSLv3 support to use SSLv23_method function (closes: #804668).
+ * Specify Qt version to build and move to version 5 of the library.
+ * This release contains TestValidators.thrift , remove its patch.
+ * Add debug package for Pyton bindings.
+ * Update OpenJDK build dependency to version 8.
+ * Update Perl build dependency.
+ * Update Standards-Version to 3.9.7 .
+ * Keep rebuildable.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 20 Mar 2016 11:10:27 +0000
+
+thrift (0.9.2-2) experimental; urgency=low
+
+ * Specify openjdk-7-jdk to build with.
+ * Disable parallel testing.
+ * Update Boost build dependency to be version 1.58.0 at least.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Mon, 03 Aug 2015 20:09:47 +0200
+
+thrift (0.9.2-1) experimental; urgency=low
+
+ * Use monolithic upstream source for Thrift packaging (closes: #792097).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 21 Mar 2015 17:45:29 +0000
--- /dev/null
+Source: thrift
+Section: devel
+Priority: optional
+Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Build-Depends: debhelper-compat (= 11), dh-python,
+ dh-golang, golang-golang-x-net-dev,
+ gem2deb (>= 0.3.0~),
+ bison, flex,
+ libboost-all-dev (>= 1.61.0), libevent-dev, zlib1g-dev,
+ libssl-dev,
+ libglib2.0-dev,
+ qtbase5-dev,
+ python3-all-dev,
+ python3-six,
+ golang-go, golang-github-golang-mock-dev,
+ pkg-php-tools (>= 1.14~), php-dev, phpunit, php-codesniffer,
+ perl (>= 5.22), libbit-vector-perl, libclass-accessor-perl,
+# openjdk-11-jdk, javahelper, maven-debian-helper (>= 1.5), ant (>= 1.7), ant-optional,
+# libhttpclient-java, libslf4j-java, libservlet3.1-java (>= 8),
+# nodejs, npm,
+ ruby-dev (>= 1:2.2), ruby, bundler,
+ rake,
+ ruby-daemons, ruby-diff-lcs, ruby-eventmachine, ruby-rspec-core,
+ ruby-rack, ruby-rack-test,
+ ruby-rspec, ruby-rspec-expectations, ruby-rspec-mocks,
+ thin,
+# erlang-dev, erlang-eunit,
+# liblua5.2-dev,
+# google-mock
+Build-Conflicts: rustc
+Standards-Version: 4.6.0
+Homepage: https://thrift.apache.org/
+XS-Ruby-Versions: ruby2.7
+XS-Go-Import-Path: github.com/apache/thrift/lib/go/thrift
+
+Package: libthrift-0.13.0
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Thrift C++ library
+ Thrift is a software framework for the development of reliable and
+ performant communication and data serialization. It combines a software
+ stack with code generation to build services that operate seamlessly
+ across a number of different development languages.
+ .
+ This package contains the runtime libraries needed for C++ applications
+ using Thrift.
+
+Package: libthrift-dev
+Architecture: any
+Section: libdevel
+Depends: libthrift-0.13.0 (= ${binary:Version}), ${misc:Depends}, pkg-config
+Description: Thrift C++ library (development headers)
+ Thrift is a software framework for the development of reliable and
+ performant communication and data serialization. It combines a software
+ stack with code generation to build services that operate seamlessly
+ across a number of different development languages.
+ .
+ This package contains the development libraries required for writing C++
+ applications using Thrift.
+
+Package: libthrift-c-glib0
+Section: libs
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Thrift glib library
+ Thrift is a software framework for the development of reliable and
+ performant communication and data serialization. It combines a software
+ stack with code generation to build services that operate seamlessly
+ across a number of different development languages.
+ .
+ This package contains the glib based runtime libraries needed for C
+ applications using Thrift.
+
+Package: libthrift-c-glib-dev
+Architecture: any
+Section: libdevel
+Depends: libthrift-c-glib0 (= ${binary:Version}), ${misc:Depends}, pkg-config
+Description: Thrift glib library (development headers)
+ Thrift is a software framework for the development of reliable and
+ performant communication and data serialization. It combines a software
+ stack with code generation to build services that operate seamlessly
+ across a number of different development languages.
+ .
+ This package contains the development libraries required for writing glib
+ based C applications using Thrift.
+
+Package: thrift-compiler
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Conflicts: thrift-compiler (<= 0.9.1-2)
+Replaces: thrift-compiler (<= 0.9.1-2)
+Description: code generator/compiler for Thrift definitions
+ Thrift is a software framework for the development of reliable and
+ performant communication and data serialization. It combines a software
+ stack with code generation to build services that operate seamlessly
+ across a number of different development languages.
+ .
+ This package contains the compiler used to generate language code from
+ Thrift definition files.
+
+Package: python3-thrift
+Section: python
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python3:Depends}
+Provides: ${python3:Provides}
+Description: Python 3 library for Thrift
+ Thrift is a software framework for the development of reliable and
+ performant communication and data serialization. It combines a software
+ stack with a code generation to build services that operate seamlessly
+ across a number of different development languages.
+ .
+ This package provides the Python 3 bindings for Thrift.
+
+#Package: libthrift-java
+#Section: java
+#Architecture: all
+#Depends: ${java:Depends}, ${misc:Depends}
+#Conflicts: libthrift-java (<= 0.9.1-2)
+#Replaces: libthrift-java (<= 0.9.1-2)
+#Description: Java language support for Thrift
+# Thrift is a software framework for the development of reliable and
+# performant communication and data serialization. It combines a software
+# stack with code generation to build services that operate seamlessly
+# across a number of different development languages.
+# .
+# This package provides the Java language support for Thrift.
+#
+#Package: libthrift-java-doc
+#Architecture: all
+#Section: doc
+#Depends: ${misc:Depends}
+#Suggests: libthrift-java
+#Description: Java language support for Thrift - documentation
+# Thrift is a software framework for the development of reliable and
+# performant communication and data serialization. It combines a software
+# stack with code generation to build services that operate seamlessly
+# across a number of different development languages.
+# .
+# This package contains Javadoc HTML documentation for libthrift-java .
+#
+Package: php-thrift
+Architecture: any
+Section: php
+Depends: ${phpcomposer:Debian-require}, ${shlibs:Depends}, ${misc:Depends}
+Provides: ${php:Provides}
+Conflicts: php7.0-thrift, php7.2-thrift
+Replaces: php7.0-thrift, php7.2-thrift
+Description: PHP language support for Thrift
+ Thrift is a software framework for the development of reliable and
+ performant communication and data serialization. It combines a software
+ stack with code generation to build services that operate seamlessly
+ across a number of different development languages.
+ .
+ This package provides the PHP5 language support for Thrift.
+
+Package: libthrift-perl
+Section: perl
+Architecture: all
+Depends: ${perl:Depends}, ${misc:Depends}
+Description: Perl language support for Thrift
+ Thrift is a software framework for the development of reliable and
+ performant communication and data serialization. It combines a software
+ stack with code generation to build services that operate seamlessly
+ across a number of different development languages.
+ .
+ This package provides the Perl language support for Thrift.
+
+Package: golang-thrift-dev
+Architecture: amd64 arm64 armel armhf i386 ppc64el
+Depends: ${misc:Depends}
+Description: Go language support for Thrift
+ Thrift is a software framework for the development of reliable and
+ performant communication and data serialization. It combines a software
+ stack with code generation to build services that operate seamlessly
+ across a number of different development languages.
+ .
+ This package provides the Go language support for Thrift.
+#
+#Package: ruby-thrift
+#Section: libs
+#Architecture: any
+#Depends: ${shlibs:Depends}, ${misc:Depends}
+#Description: Ruby library for Thrift
+# Thrift is a software framework for the development of reliable and
+# performant communication and data serialization. It combines a software
+# stack with a code generation to build services that operate seamlessly
+# across a number of different development languages.
+# .
+# This package provides the Ruby bindings for Thrift.
--- /dev/null
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: thrift
+Source: https://www.apache.org/dist/thrift
+
+Files: *
+Copyright: Copyright 2006- Apache Software Foundation
+License: Apache-2.0
+
+Files: compiler/cpp/src/thrift/thrifty.cc
+Copyright: Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+License: GPL-3+ with Bison exception or Apache-2.0
+
+Files: compiler/cpp/src/thrift/thrifty.hh
+Copyright: Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+License: GPL-3+ with Bison exception
+
+Files: compile ylwrap
+Copyright: Copyright (C) 1996-2014 Free Software Foundation, Inc.
+License: GPL-2+
+
+Files: build/cmake/FindGLIB.cmake
+Copyright: Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
+License: BSD-2-clause
+ All rights reserved.
+ .
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+ .
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Files: lib/php/src/ext/thrift_protocol/run-tests.php
+Copyright: Copyright (C) 1997-2017 The PHP Group
+License: PHP-3.01
+ --------------------------------------------------------------------
+ The PHP License, version 3.01
+ Copyright (c) 1999 - 2006 The PHP Group. All rights reserved.
+ --------------------------------------------------------------------
+ .
+ Redistribution and use in source and binary forms, with or without
+ modification, is permitted provided that the following conditions
+ are met:
+ .
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ .
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ .
+ 3. The name "PHP" must not be used to endorse or promote products
+ derived from this software without prior written permission. For
+ written permission, please contact group@php.net.
+ .
+ 4. Products derived from this software may not be called "PHP", nor
+ may "PHP" appear in their name, without prior written permission
+ from group@php.net. You may indicate that your software works in
+ conjunction with PHP by saying "Foo for PHP" instead of calling
+ it "PHP Foo" or "phpfoo"
+ .
+ 5. The PHP Group may publish revised and/or new versions of the
+ license from time to time. Each version will be given a
+ distinguishing version number.
+ Once covered code has been published under a particular version
+ of the license, you may always continue to use it under the terms
+ of that version. You may also choose to use such covered code
+ under the terms of any subsequent version of the license
+ published by the PHP Group. No one other than the PHP Group has
+ the right to modify the terms applicable to covered code created
+ under this License.
+ .
+ 6. Redistributions of any form whatsoever must retain the following
+ acknowledgment:
+ "This product includes PHP software, freely available from
+ <https://www.php.net/software/>".
+ .
+ THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND
+ ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP
+ DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ OF THE POSSIBILITY OF SUCH DAMAGE.
+ .
+ --------------------------------------------------------------------
+ .
+ This software consists of voluntary contributions made by many
+ individuals on behalf of the PHP Group.
+ .
+ The PHP Group can be contacted via Email at group@php.net.
+ .
+ For more information on the PHP Group and the PHP project,
+ please see <https://www.php.net>.
+ .
+ PHP includes the Zend Engine, freely available at
+ <https://www.zend.com>.
+
+Files: debian/*
+Copyright: Copyright 2012-2014 Eric Evans <eevans@debian.org>,
+ Copyright 2014- Laszlo Boszormenyi (GCS) <gcs@debian.org>
+License: GPL-2+
+
+License: GPL-2+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+ .
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+ .
+ You should have received a copy of the GNU General Public License along
+ with this package; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ .
+ On Debian systems, the full text of the GNU General Public License version
+ 2 can be found in the file `/usr/share/common-licenses/GPL-2'.
+
+License: GPL-3+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the full text of the GNU General Public License
+ version 3 can be found in the file `/usr/share/common-licenses/GPL-3'.
+
+License: GPL-3+ with Bison exception
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ .
+ As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+ .
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison.
+
+License: Apache-2.0
+ Licensed to the Apache Software Foundation (ASF) under one or more contributor
+ license agreements. The ASF licenses this work to You under the Apache License,
+ Version 2.0 (the "License"); you may not use this work except in compliance
+ with the License. You may obtain a copy of the License at
+ .
+ https://www.apache.org/licenses/LICENSE-2.0
+ .
+ On Debian systems, the complete text of the Apache License Version 2.0
+ can be found in the file '/usr/share/common-licenses/Apache-2.0'.
--- /dev/null
+lib/go/thrift /usr/share/gocode/src/github.com/apache/thrift/lib/go/
--- /dev/null
+usr/lib/*/libthrift-*.so
+usr/lib/*/libthriftnb-*.so
+usr/lib/*/libthriftqt5-*.so
+usr/lib/*/libthriftz-*.so
--- /dev/null
+libthrift 0.13.0 libthrift-0.13.0 (>= 0.13.0-1~)
+libthriftnb 0.13.0 libthrift-0.13.0 (>= 0.13.0-1~)
+libthriftqt5 0.13.0 libthrift-0.13.0 (>= 0.13.0-1~)
+libthriftz 0.13.0 libthrift-0.13.0 (>= 0.13.0-1~)
--- /dev/null
+usr/include/thrift/c_glib/
+usr/lib/*/libthrift_c_glib.a
+usr/lib/*/libthrift_c_glib.so
+usr/lib/*/pkgconfig/thrift_c_glib.pc
--- /dev/null
+usr/lib/*/libthrift_c_glib.so.*
--- /dev/null
+usr/include/thrift/*.h
+usr/include/thrift/async/
+usr/include/thrift/concurrency/
+usr/include/thrift/processor/
+usr/include/thrift/protocol/
+usr/include/thrift/qt/
+usr/include/thrift/server/
+usr/include/thrift/transport/
+usr/lib/*/libthrift.a
+usr/lib/*/libthriftnb.a
+usr/lib/*/libthriftqt5.a
+usr/lib/*/libthriftz.a
+usr/lib/*/libthriftnb.so
+usr/lib/*/libthriftqt5.so
+usr/lib/*/libthrift.so
+usr/lib/*/libthriftz.so
+usr/lib/*/pkgconfig/thrift-nb.pc
+usr/lib/*/pkgconfig/thrift.pc
+usr/lib/*/pkgconfig/thrift-qt5.pc
+usr/lib/*/pkgconfig/thrift-z.pc
--- /dev/null
+Document: libthrift-java-doc
+Title: Programmer API for Thrift Java support
+Author: Apache Software Foundation
+Section: Programming
+
+Format: HTML
+Index: /usr/share/doc/thrift/java/index.html
+Files: /usr/share/doc/thrift/java/*
--- /dev/null
+debian/_jh_build.javadoc/api/* /usr/share/doc/thrift/java/
--- /dev/null
+usr/lib/perl5/Thrift.pm /usr/share/perl5
+usr/lib/perl5/Thrift /usr/share/perl5
--- /dev/null
+usr/lib/libthrift.so*
+usr/lib/libthrift-*.so*
+usr/lib/libthriftnb*.so*
+usr/lib/libthriftqt*.so*
+usr/lib/libthriftz*.so*
--- /dev/null
+From 22b6c0c8bbc7089ce714f782366c2914c5e9eac5 Mon Sep 17 00:00:00 2001
+From: Yuxuan 'fishy' Wang <yuxuan.wang@reddit.com>
+Date: Fri, 28 Aug 2020 17:20:31 -0700
+Subject: [PATCH] THRIFT-5270: Fix wrong int to string conversions
+
+Client: go
+
+Starting from go 1.15, go test starts to complain about wrongly used int
+to string conversions:
+
+ ./field.go:58:83: conversion from int to string yields a string of one rune, not a string of digits (did you mean fmt.Sprint(x)?)
+ ./numeric.go:72:12: conversion from int64 to string yields a string of one rune, not a string of digits (did you mean fmt.Sprint(x)?)
+ ./json_protocol_test.go:612:92: conversion from int to string yields a string of one rune, not a string of digits (did you mean fmt.Sprint(x)?)
+ ./simple_json_protocol_test.go:685:96: conversion from int to string yields a string of one rune, not a string of digits (did you mean fmt.Sprint(x)?)
+
+json_protocol_test and simple_json_protocol_test usages are actually
+already in format arg so just remove the conversion is good enough.
+field is no longer used anywhere so just removed it (there's one line of
+commented out code in compact_protocol so remove that line as well). The
+one in numeric.go is actually a bug. We didn't set sValue correctly in
+NewNumericFromI64 and NewNumericFromI32 functions.
+---
+ lib/go/thrift/compact_protocol.go | 1 -
+ lib/go/thrift/field.go | 79 ----------------------
+ lib/go/thrift/json_protocol_test.go | 2 +-
+ lib/go/thrift/numeric.go | 4 +-
+ lib/go/thrift/simple_json_protocol_test.go | 2 +-
+ 5 files changed, 4 insertions(+), 84 deletions(-)
+ delete mode 100644 lib/go/thrift/field.go
+
+diff --git a/lib/go/thrift/compact_protocol.go b/lib/go/thrift/compact_protocol.go
+index 468935781d..8510f1f79e 100644
+--- a/lib/go/thrift/compact_protocol.go
++++ b/lib/go/thrift/compact_protocol.go
+@@ -209,7 +209,6 @@ func (p *TCompactProtocol) writeFieldBeginInternal(ctx context.Context, name str
+ }
+
+ p.lastFieldId = fieldId
+- // p.lastField.Push(field.id);
+ return written, nil
+ }
+
+diff --git a/lib/go/thrift/field.go b/lib/go/thrift/field.go
+deleted file mode 100644
+index 9d66525509..0000000000
+--- a/lib/go/thrift/field.go
++++ /dev/null
+@@ -1,79 +0,0 @@
+-/*
+- * Licensed to the Apache Software Foundation (ASF) under one
+- * or more contributor license agreements. See the NOTICE file
+- * distributed with this work for additional information
+- * regarding copyright ownership. The ASF licenses this file
+- * to you under the Apache License, Version 2.0 (the
+- * "License"); you may not use this file except in compliance
+- * with the License. You may obtain a copy of the License at
+- *
+- * http://www.apache.org/licenses/LICENSE-2.0
+- *
+- * Unless required by applicable law or agreed to in writing,
+- * software distributed under the License is distributed on an
+- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+- * KIND, either express or implied. See the License for the
+- * specific language governing permissions and limitations
+- * under the License.
+- */
+-
+-package thrift
+-
+-// Helper class that encapsulates field metadata.
+-type field struct {
+- name string
+- typeId TType
+- id int
+-}
+-
+-func newField(n string, t TType, i int) *field {
+- return &field{name: n, typeId: t, id: i}
+-}
+-
+-func (p *field) Name() string {
+- if p == nil {
+- return ""
+- }
+- return p.name
+-}
+-
+-func (p *field) TypeId() TType {
+- if p == nil {
+- return TType(VOID)
+- }
+- return p.typeId
+-}
+-
+-func (p *field) Id() int {
+- if p == nil {
+- return -1
+- }
+- return p.id
+-}
+-
+-func (p *field) String() string {
+- if p == nil {
+- return "<nil>"
+- }
+- return "<TField name:'" + p.name + "' type:" + string(p.typeId) + " field-id:" + string(p.id) + ">"
+-}
+-
+-var ANONYMOUS_FIELD *field
+-
+-type fieldSlice []field
+-
+-func (p fieldSlice) Len() int {
+- return len(p)
+-}
+-
+-func (p fieldSlice) Less(i, j int) bool {
+- return p[i].Id() < p[j].Id()
+-}
+-
+-func (p fieldSlice) Swap(i, j int) {
+- p[i], p[j] = p[j], p[i]
+-}
+-
+-func init() {
+- ANONYMOUS_FIELD = newField("", STOP, 0)
+-}
+diff --git a/lib/go/thrift/json_protocol_test.go b/lib/go/thrift/json_protocol_test.go
+index 07afa9683b..333d383216 100644
+--- a/lib/go/thrift/json_protocol_test.go
++++ b/lib/go/thrift/json_protocol_test.go
+@@ -609,7 +609,7 @@ func TestWriteJSONProtocolMap(t *testing
+ for k, value := range DOUBLE_VALUES {
+ ik, err := p.ReadI32()
+ if err != nil {
+- t.Fatalf("Bad key for %s index %v, wrote: %v, expected: %v, error: %s", thetype, k, ik, string(k), err.Error())
++ t.Fatalf("Bad key for %s index %v, wrote: %v, expected: %v, error: %s", thetype, k, ik, k, err.Error())
+ }
+ if int(ik) != k {
+ t.Fatalf("Bad key for %s index %v, wrote: %v, expected: %v", thetype, k, ik, k)
+diff --git a/lib/go/thrift/numeric.go b/lib/go/thrift/numeric.go
+index aa8daa9b54..e4512d204c 100644
+--- a/lib/go/thrift/numeric.go
++++ b/lib/go/thrift/numeric.go
+@@ -69,14 +69,14 @@ func NewNumericFromDouble(dValue float64) Numeric {
+
+ func NewNumericFromI64(iValue int64) Numeric {
+ dValue := float64(iValue)
+- sValue := string(iValue)
++ sValue := strconv.FormatInt(iValue, 10)
+ isNil := false
+ return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil}
+ }
+
+ func NewNumericFromI32(iValue int32) Numeric {
+ dValue := float64(iValue)
+- sValue := string(iValue)
++ sValue := strconv.FormatInt(int64(iValue), 10)
+ isNil := false
+ return &numeric{iValue: int64(iValue), dValue: dValue, sValue: sValue, isNil: isNil}
+ }
+diff --git a/lib/go/thrift/simple_json_protocol_test.go b/lib/go/thrift/simple_json_protocol_test.go
+index 951389a60d..986fff27e3 100644
+--- a/lib/go/thrift/simple_json_protocol_test.go
++++ b/lib/go/thrift/simple_json_protocol_test.go
+@@ -682,7 +682,7 @@ func TestWriteSimpleJSONProtocolMap(t *testing.T) {
+ strv := l[k*2+4]
+ ik, err := strconv.Atoi(strk)
+ if err != nil {
+- t.Fatalf("Bad value for %s index %v, wrote: %v, expected: %v, error: %s", thetype, k, strk, string(k), err.Error())
++ t.Fatalf("Bad value for %s index %v, wrote: %v, expected: %v, error: %s", thetype, k, strk, k, err.Error())
+ }
+ if ik != k {
+ t.Fatalf("Bad value for %s index %v, wrote: %v, expected: %v", thetype, k, strk, k)
--- /dev/null
+From b04e39a7e91d7828cce9168c4660b89400930ee5 Mon Sep 17 00:00:00 2001
+From: Tyler Christensen <tylerc@qualtrics.com>
+Date: Tue, 1 Dec 2020 17:13:29 -0700
+Subject: [PATCH] THRIFT-5318: Update PHP thrift_protocol extension for PHP 8
+ Client: php Patch: Tyler Christensen & Rasmus Lerdorf
+
+This closes #2288
+
+See https://github.com/php/php-src/blob/PHP-8.0.0/UPGRADING.INTERNALS
+
+Origin: backport, https://github.com/apache/thrift/commit/b04e39a7e91d7828cce916
+Reviewed-By: Lucas Kanashiro <kanashiro@ubuntu.com>
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/thrift/+bug/1940473
+Bug: https://issues.apache.org/jira/projects/THRIFT/issues/THRIFT-5318?filter=allissues
+Last-Updated: 2021-08-18
+---
+ .../thrift_protocol/php_thrift_protocol.cpp | 17 ++----
+ .../ext/thrift_protocol/php_thrift_protocol.h | 58 +++++++++++++++++--
+ .../php_thrift_protocol.stub.php | 10 ++++
+ .../php_thrift_protocol_arginfo.h | 33 +++++++++++
+ 4 files changed, 101 insertions(+), 17 deletions(-)
+ create mode 100644 lib/php/src/ext/thrift_protocol/php_thrift_protocol.stub.php
+ create mode 100644 lib/php/src/ext/thrift_protocol/php_thrift_protocol_arginfo.h
+
+diff --git a/lib/php/src/ext/thrift_protocol/php_thrift_protocol.cpp b/lib/php/src/ext/thrift_protocol/php_thrift_protocol.cpp
+index c8bc50ecc54..c016b070b6a 100644
+--- a/lib/php/src/ext/thrift_protocol/php_thrift_protocol.cpp
++++ b/lib/php/src/ext/thrift_protocol/php_thrift_protocol.cpp
+@@ -85,17 +85,10 @@ const int8_t T_EXCEPTION = 3;
+ const int INVALID_DATA = 1;
+ const int BAD_VERSION = 4;
+
+-static zend_function_entry thrift_protocol_functions[] = {
+- PHP_FE(thrift_protocol_write_binary, nullptr)
+- PHP_FE(thrift_protocol_read_binary, nullptr)
+- PHP_FE(thrift_protocol_read_binary_after_message_begin, nullptr)
+- {nullptr, nullptr, nullptr}
+-};
+-
+ zend_module_entry thrift_protocol_module_entry = {
+ STANDARD_MODULE_HEADER,
+ "thrift_protocol",
+- thrift_protocol_functions,
++ ext_functions,
+ nullptr,
+ nullptr,
+ nullptr,
+@@ -414,7 +407,7 @@ void createObject(const char* obj_typename, zval* return_value, int nargs = 0, z
+ object_and_properties_init(return_value, ce, nullptr);
+ zend_function* constructor = zend_std_get_constructor(Z_OBJ_P(return_value));
+ zval ctor_rv;
+- zend_call_method(return_value, ce, &constructor, NULL, 0, &ctor_rv, nargs, arg1, arg2);
++ zend_call_method(Z4_OBJ_P(return_value), ce, &constructor, NULL, 0, &ctor_rv, nargs, arg1, arg2);
+ zval_dtor(&ctor_rv);
+ if (EG(exception)) {
+ zend_object *ex = EG(exception);
+@@ -928,7 +921,7 @@ void validate_thrift_object(zval* object) {
+
+ zval* is_required = zend_hash_str_find(fieldspec, "isRequired", sizeof("isRequired")-1);
+ zval rv;
+- zval* prop = zend_read_property(object_class_entry, object, varname, strlen(varname), false, &rv);
++ zval* prop = zend_read_property(object_class_entry, Z4_OBJ_P(object), varname, strlen(varname), false, &rv);
+
+ if (Z_TYPE_INFO_P(is_required) == IS_TRUE && Z_TYPE_P(prop) == IS_NULL) {
+ char errbuf[128];
+@@ -969,7 +962,7 @@ void binary_deserialize_spec(zval* zthis, PHPInputTransport& transport, HashTabl
+ ZVAL_UNDEF(&rv);
+
+ binary_deserialize(ttype, transport, &rv, fieldspec);
+- zend_update_property(ce, zthis, varname, strlen(varname), &rv);
++ zend_update_property(ce, Z4_OBJ_P(zthis), varname, strlen(varname), &rv);
+
+ zval_ptr_dtor(&rv);
+ } else {
+@@ -1010,7 +1003,7 @@ void binary_serialize_spec(zval* zthis, PHPOutputTransport& transport, HashTable
+ int8_t ttype = Z_LVAL_P(val_ptr);
+
+ zval rv;
+- zval* prop = zend_read_property(Z_OBJCE_P(zthis), zthis, varname, strlen(varname), false, &rv);
++ zval* prop = zend_read_property(Z_OBJCE_P(zthis), Z4_OBJ_P(zthis), varname, strlen(varname), false, &rv);
+
+ if (Z_TYPE_P(prop) == IS_REFERENCE){
+ ZVAL_DEREF(prop);
+diff --git a/lib/php/src/ext/thrift_protocol/php_thrift_protocol.h b/lib/php/src/ext/thrift_protocol/php_thrift_protocol.h
+index 04209973cfa..b8dc7de7e3f 100644
+--- a/lib/php/src/ext/thrift_protocol/php_thrift_protocol.h
++++ b/lib/php/src/ext/thrift_protocol/php_thrift_protocol.h
+@@ -19,10 +19,58 @@
+
+ #pragma once
+
+-PHP_FUNCTION(thrift_protocol_write_binary);
+-PHP_FUNCTION(thrift_protocol_read_binary);
+-PHP_FUNCTION(thrift_protocol_read_binary_after_message_begin);
++/* backward compat macros */
+
+-extern zend_module_entry thrift_protocol_module_entry;
+-#define phpext_thrift_protocol_ptr &thrift_protocol_module_entry
++#if PHP_VERSION_ID >= 80000
++# define Z4_OBJ_P(zval) (Z_OBJ_P(zval))
++#else
++# define Z4_OBJ_P(zval) (zval)
++#endif
+
++#ifndef IS_MIXED
++# define IS_MIXED 0
++#endif
++
++#ifndef ZEND_PARSE_PARAMETERS_NONE
++#define ZEND_PARSE_PARAMETERS_NONE() \
++ ZEND_PARSE_PARAMETERS_START(0, 0) \
++ ZEND_PARSE_PARAMETERS_END()
++#endif
++#ifndef ZEND_ARG_INFO_WITH_DEFAULT_VALUE
++#define ZEND_ARG_INFO_WITH_DEFAULT_VALUE(pass_by_ref, name, default_value) \
++ ZEND_ARG_INFO(pass_by_ref, name)
++#endif
++
++#if PHP_VERSION_ID < 70200
++#undef ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX
++#define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, return_reference, required_num_args, class_name, allow_null) \
++ static const zend_internal_arg_info name[] = { \
++ { (const char*)(zend_uintptr_t)(required_num_args), ( #class_name ), 0, return_reference, allow_null, 0 },
++#endif
++
++#ifndef ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX
++# define ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, return_reference, required_num_args, class_name, allow_null) \
++ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, return_reference, required_num_args, class_name, allow_null)
++#endif
++
++#ifndef ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX
++# define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(name, return_reference, num_args, type) \
++ ZEND_BEGIN_ARG_INFO_EX(name, 0, return_reference, num_args)
++#endif
++
++#ifndef ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX
++# define ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(name, return_reference, required_num_args, class_name, type) \
++ ZEND_BEGIN_ARG_INFO_EX(name, 0, return_reference, required_num_args)
++#endif
++
++#ifndef ZEND_ARG_TYPE_MASK
++# define ZEND_ARG_TYPE_MASK(pass_by_ref, name, type_mask, default_value) \
++ ZEND_ARG_TYPE_INFO(pass_by_ref, name, 0, 0)
++#endif
++
++#ifndef ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE
++# define ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(pass_by_ref, name, type_hint, allow_null, default_value) \
++ ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null)
++#endif
++
++#include "php_thrift_protocol_arginfo.h"
+diff --git a/lib/php/src/ext/thrift_protocol/php_thrift_protocol.stub.php b/lib/php/src/ext/thrift_protocol/php_thrift_protocol.stub.php
+new file mode 100644
+index 00000000000..e9601c3aef0
+--- /dev/null
++++ b/lib/php/src/ext/thrift_protocol/php_thrift_protocol.stub.php
+@@ -0,0 +1,10 @@
++<?php
++/** @generate-function-entries */
++
++// php /path/to/php-src/build/gen_stub.php lib/php/src/ext/thrift_protocol/php_thrift_protocol.stub.php
++
++function thrift_protocol_write_binary(object $protocol, string $method_name, int $msgtype, object $request_struct, int $seqID, bool $strict_write): void {}
++
++function thrift_protocol_read_binary(object $protocol, string $obj_typename, bool $strict_read, int $buffer_size=8192): object {}
++
++function thrift_protocol_read_binary_after_message_begin(object $protocol, string $obj_typename, bool $strict_read, int $buffer_size=8192): object {}
+diff --git a/lib/php/src/ext/thrift_protocol/php_thrift_protocol_arginfo.h b/lib/php/src/ext/thrift_protocol/php_thrift_protocol_arginfo.h
+new file mode 100644
+index 00000000000..a727db08b2a
+--- /dev/null
++++ b/lib/php/src/ext/thrift_protocol/php_thrift_protocol_arginfo.h
+@@ -0,0 +1,33 @@
++/* This is a generated file, edit the .stub.php file instead.
++ * Stub hash: 3bd6e0bc99143d614ddb80ee0aec192e385c8927 */
++
++ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_thrift_protocol_write_binary, 0, 6, IS_VOID, 0)
++ ZEND_ARG_TYPE_INFO(0, protocol, IS_OBJECT, 0)
++ ZEND_ARG_TYPE_INFO(0, method_name, IS_STRING, 0)
++ ZEND_ARG_TYPE_INFO(0, msgtype, IS_LONG, 0)
++ ZEND_ARG_TYPE_INFO(0, request_struct, IS_OBJECT, 0)
++ ZEND_ARG_TYPE_INFO(0, seqID, IS_LONG, 0)
++ ZEND_ARG_TYPE_INFO(0, strict_write, _IS_BOOL, 0)
++ZEND_END_ARG_INFO()
++
++ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_thrift_protocol_read_binary, 0, 3, IS_OBJECT, 0)
++ ZEND_ARG_TYPE_INFO(0, protocol, IS_OBJECT, 0)
++ ZEND_ARG_TYPE_INFO(0, obj_typename, IS_STRING, 0)
++ ZEND_ARG_TYPE_INFO(0, strict_read, _IS_BOOL, 0)
++ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, buffer_size, IS_LONG, 0, "8192")
++ZEND_END_ARG_INFO()
++
++#define arginfo_thrift_protocol_read_binary_after_message_begin arginfo_thrift_protocol_read_binary
++
++
++ZEND_FUNCTION(thrift_protocol_write_binary);
++ZEND_FUNCTION(thrift_protocol_read_binary);
++ZEND_FUNCTION(thrift_protocol_read_binary_after_message_begin);
++
++
++static const zend_function_entry ext_functions[] = {
++ ZEND_FE(thrift_protocol_write_binary, arginfo_thrift_protocol_write_binary)
++ ZEND_FE(thrift_protocol_read_binary, arginfo_thrift_protocol_read_binary)
++ ZEND_FE(thrift_protocol_read_binary_after_message_begin, arginfo_thrift_protocol_read_binary_after_message_begin)
++ ZEND_FE_END
++};
--- /dev/null
+From 37c2ceb737cb40377346c63a05f407da1c119ba0 Mon Sep 17 00:00:00 2001
+From: Yuxuan 'fishy' Wang <yuxuan.wang@reddit.com>
+Date: Thu, 10 Dec 2020 14:42:37 -0800
+Subject: [PATCH] THRIFT-5322: Guard against large string/binary lengths in Go
+
+Client: go
+
+In TBinaryProtocol.ReadString, TBinaryProtocol.ReadBinary,
+TCompactProtocol.ReadString, and TCompactProtocol.ReadBinary, use
+safeReadBytes to prevent from large allocation on malformed sizes.
+
+ $ go test -bench=SafeReadBytes -benchmem
+ BenchmarkSafeReadBytes/normal-12 625057 1789 ns/op 2176 B/op 5 allocs/op
+ BenchmarkSafeReadBytes/max-askedSize-12 545271 2236 ns/op 14464 B/op 7 allocs/op
+ PASS
+---
+ lib/go/thrift/binary_protocol.go | 56 ++++------
+ lib/go/thrift/binary_protocol_test.go | 153 ++++++++++++++++++++++++++
+ lib/go/thrift/compact_protocol.go | 17 ++-
+ 3 files changed, 184 insertions(+), 42 deletions(-)
+
+diff --git a/lib/go/thrift/binary_protocol.go b/lib/go/thrift/binary_protocol.go
+index c87d23a1bb..58956f6732 100644
+--- a/lib/go/thrift/binary_protocol.go
++++ b/lib/go/thrift/binary_protocol.go
+@@ -432,6 +432,15 @@ func (p *TBinaryProtocol) ReadString(ctx context.Context) (value string, err err
+ err = invalidDataLength
+ return
+ }
++ if size == 0 {
++ return "", nil
++ }
++ if size < int32(len(p.buffer)) {
++ // Avoid allocation on small reads
++ buf := p.buffer[:size]
++ read, e := io.ReadFull(p.trans, buf)
++ return string(buf[:read]), NewTProtocolException(e)
++ }
+
+ return p.readStringBody(size)
+ }
+@@ -445,9 +454,7 @@ func (p *TBinaryProtocol) ReadBinary(ctx context.Context) ([]byte, error) {
+ return nil, invalidDataLength
+ }
+
+- isize := int(size)
+- buf := make([]byte, isize)
+- _, err := io.ReadFull(p.trans, buf)
++ buf, err := safeReadBytes(size, p.trans)
+ return buf, NewTProtocolException(err)
+ }
+
+@@ -468,38 +475,21 @@ func (p *TBinaryProtocol) readAll(ctx context.Context, buf []byte) (err error) {
+ return NewTProtocolException(err)
+ }
+
+-const readLimit = 32768
+-
+ func (p *TBinaryProtocol) readStringBody(size int32) (value string, err error) {
+- if size < 0 {
+- return "", nil
+- }
+-
+- var (
+- buf bytes.Buffer
+- e error
+- b []byte
+- )
++ buf, err := safeReadBytes(size, p.trans)
++ return string(buf), NewTProtocolException(err)
++}
+
+- switch {
+- case int(size) <= len(p.buffer):
+- b = p.buffer[:size] // avoids allocation for small reads
+- case int(size) < readLimit:
+- b = make([]byte, size)
+- default:
+- b = make([]byte, readLimit)
++// This function is shared between TBinaryProtocol and TCompactProtocol.
++//
++// It tries to read size bytes from trans, in a way that prevents large
++// allocations when size is insanely large (mostly caused by malformed message).
++func safeReadBytes(size int32, trans io.Reader) ([]byte, error) {
++ if size < 0 {
++ return nil, nil
+ }
+
+- for size > 0 {
+- _, e = io.ReadFull(p.trans, b)
+- buf.Write(b)
+- if e != nil {
+- break
+- }
+- size -= readLimit
+- if size < readLimit && size > 0 {
+- b = b[:size]
+- }
+- }
+- return buf.String(), NewTProtocolException(e)
++ buf := new(bytes.Buffer)
++ _, err := io.CopyN(buf, trans, int64(size))
++ return buf.Bytes(), err
+ }
+diff --git a/lib/go/thrift/binary_protocol_test.go b/lib/go/thrift/binary_protocol_test.go
+index 0462cc79de..88bfd26b7e 100644
+--- a/lib/go/thrift/binary_protocol_test.go
++++ b/lib/go/thrift/binary_protocol_test.go
+@@ -20,9 +20,162 @@
+ package thrift
+
+ import (
++ "bytes"
++ "math"
++ "strings"
+ "testing"
+ )
+
+ func TestReadWriteBinaryProtocol(t *testing.T) {
+ ReadWriteProtocolTest(t, NewTBinaryProtocolFactoryDefault())
+ }
++
++const (
++ safeReadBytesSource = `
++Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet
++tincidunt nibh. Phasellus vel convallis libero, sit amet posuere quam. Nullam
++blandit velit at nibh fringilla, sed egestas erat dapibus. Sed hendrerit
++tincidunt accumsan. Curabitur consectetur bibendum dui nec hendrerit. Fusce quis
++turpis nec magna efficitur volutpat a ut nibh. Vestibulum odio risus, tristique
++a nisi et, congue mattis mi. Vivamus a nunc justo. Mauris molestie sagittis
++magna, hendrerit auctor lectus egestas non. Phasellus pretium, odio sit amet
++bibendum feugiat, velit nunc luctus erat, ac bibendum mi dui molestie nulla.
++Nullam fermentum magna eu elit vehicula tincidunt. Etiam ornare laoreet
++dignissim. Ut sed nunc ac neque vulputate fermentum. Morbi volutpat dapibus
++magna, at porttitor quam facilisis a. Donec eget fermentum risus. Aliquam erat
++volutpat.
++
++Phasellus molestie id ante vel iaculis. Fusce eget quam nec quam viverra laoreet
++vitae a dui. Mauris blandit blandit dui, iaculis interdum diam mollis at. Morbi
++vel sem et.
++`
++ safeReadBytesSourceLen = len(safeReadBytesSource)
++)
++
++func TestSafeReadBytes(t *testing.T) {
++ srcData := []byte(safeReadBytesSource)
++
++ for _, c := range []struct {
++ label string
++ askedSize int32
++ dataSize int
++ }{
++ {
++ label: "normal",
++ askedSize: 100,
++ dataSize: 100,
++ },
++ {
++ label: "max-askedSize",
++ askedSize: math.MaxInt32,
++ dataSize: safeReadBytesSourceLen,
++ },
++ } {
++ t.Run(c.label, func(t *testing.T) {
++ data := bytes.NewReader(srcData[:c.dataSize])
++ buf, err := safeReadBytes(c.askedSize, data)
++ if len(buf) != c.dataSize {
++ t.Errorf(
++ "Expected to read %d bytes, got %d",
++ c.dataSize,
++ len(buf),
++ )
++ }
++ if !strings.HasPrefix(safeReadBytesSource, string(buf)) {
++ t.Errorf("Unexpected read data: %q", buf)
++ }
++ if int32(c.dataSize) < c.askedSize {
++ // We expect error in this case
++ if err == nil {
++ t.Errorf(
++ "Expected error when dataSize %d < askedSize %d, got nil",
++ c.dataSize,
++ c.askedSize,
++ )
++ }
++ } else {
++ // We expect no error in this case
++ if err != nil {
++ t.Errorf(
++ "Expected no error when dataSize %d >= askedSize %d, got: %v",
++ c.dataSize,
++ c.askedSize,
++ err,
++ )
++ }
++ }
++ })
++ }
++}
++
++func generateSafeReadBytesBenchmark(askedSize int32, dataSize int) func(b *testing.B) {
++ return func(b *testing.B) {
++ data := make([]byte, dataSize)
++ b.ResetTimer()
++ for i := 0; i < b.N; i++ {
++ safeReadBytes(askedSize, bytes.NewReader(data))
++ }
++ }
++}
++
++func TestSafeReadBytesAlloc(t *testing.T) {
++ if testing.Short() {
++ // NOTE: Since this test runs a benchmark test, it takes at
++ // least 1 second.
++ //
++ // In general we try to avoid unit tests taking that long to run,
++ // but it's to verify a security issue so we made an exception
++ // here:
++ // https://issues.apache.org/jira/browse/THRIFT-5322
++ t.Skip("skipping test in short mode.")
++ }
++
++ const (
++ askedSize = int32(math.MaxInt32)
++ dataSize = 4096
++ )
++
++ // The purpose of this test is that in the case a string header says
++ // that it has a string askedSize bytes long, the implementation should
++ // not just allocate askedSize bytes upfront. So when there're actually
++ // not enough data to be read (dataSize), the actual allocated bytes
++ // should be somewhere between dataSize and askedSize.
++ //
++ // Different approachs could have different memory overheads, so this
++ // target is arbitrary in nature. But when dataSize is small enough
++ // compare to askedSize, half the askedSize is a good and safe target.
++ const target = int64(askedSize) / 2
++
++ bm := testing.Benchmark(generateSafeReadBytesBenchmark(askedSize, dataSize))
++ actual := bm.AllocedBytesPerOp()
++ if actual > target {
++ t.Errorf(
++ "Expected allocated bytes per op to be <= %d, got %d",
++ target,
++ actual,
++ )
++ } else {
++ t.Logf("Allocated bytes: %d B/op", actual)
++ }
++}
++
++func BenchmarkSafeReadBytes(b *testing.B) {
++ for _, c := range []struct {
++ label string
++ askedSize int32
++ dataSize int
++ }{
++ {
++ label: "normal",
++ askedSize: 100,
++ dataSize: 100,
++ },
++ {
++ label: "max-askedSize",
++ askedSize: math.MaxInt32,
++ dataSize: 4096,
++ },
++ } {
++ b.Run(c.label, generateSafeReadBytesBenchmark(c.askedSize, c.dataSize))
++ }
++}
+diff --git a/lib/go/thrift/compact_protocol.go b/lib/go/thrift/compact_protocol.go
+index a0161959c8..424906d616 100644
+--- a/lib/go/thrift/compact_protocol.go
++++ b/lib/go/thrift/compact_protocol.go
+@@ -561,17 +561,17 @@ func (p *TCompactProtocol) ReadString(ctx context.Context) (value string, err er
+ if length < 0 {
+ return "", invalidDataLength
+ }
+-
+ if length == 0 {
+ return "", nil
+ }
+- var buf []byte
+- if length <= int32(len(p.buffer)) {
+- buf = p.buffer[0:length]
+- } else {
+- buf = make([]byte, length)
++ if length < int32(len(p.buffer)) {
++ // Avoid allocation on small reads
++ buf := p.buffer[:length]
++ read, e := io.ReadFull(p.trans, buf)
++ return string(buf[:read]), NewTProtocolException(e)
+ }
+- _, e = io.ReadFull(p.trans, buf)
++
++ buf, e := safeReadBytes(length, p.trans)
+ return string(buf), NewTProtocolException(e)
+ }
+
+@@ -588,8 +588,7 @@ func (p *TCompactProtocol) ReadBinary(ctx context.Context) (value []byte, err er
+ return nil, invalidDataLength
+ }
+
+- buf := make([]byte, length)
+- _, e = io.ReadFull(p.trans, buf)
++ buf, e := safeReadBytes(length, p.trans)
+ return buf, NewTProtocolException(e)
+ }
+
--- /dev/null
+Description: put back files used for testing
+ Needs for testing and while present up to 0.12.0 and in Git, missed from
+ the source of 0.13.0 release.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2019-10-23
+
+---
+
+--- /dev/null
++++ b/lib/go/test/ConflictNamespaceServiceTest.thrift
+@@ -0,0 +1,25 @@
++#
++# Licensed to the Apache Software Foundation (ASF) under one
++# or more contributor license agreements. See the NOTICE file
++# distributed with this work for additional information
++# regarding copyright ownership. The ASF licenses this file
++# to you under the Apache License, Version 2.0 (the
++# "License"); you may not use this file except in compliance
++# with the License. You may obtain a copy of the License at
++#
++# http://www.apache.org/licenses/LICENSE-2.0
++#
++# Unless required by applicable law or agreed to in writing,
++# software distributed under the License is distributed on an
++# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
++# KIND, either express or implied. See the License for the
++# specific language governing permissions and limitations
++# under the License.
++#
++namespace go conflict.context
++
++include "ConflictNamespaceTestD.thrift"
++
++service ConflictService {
++ ConflictNamespaceTestD.ThingD thingFunc()
++}
+--- /dev/null
++++ b/lib/php/test/TestValidators.thrift
+@@ -0,0 +1,31 @@
++/*
++ * Licensed to the Apache Software Foundation (ASF) under one
++ * or more contributor license agreements. See the NOTICE file
++ * distributed with this work for additional information
++ * regarding copyright ownership. The ASF licenses this file
++ * to you under the Apache License, Version 2.0 (the
++ * "License"); you may not use this file except in compliance
++ * with the License. You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing,
++ * software distributed under the License is distributed on an
++ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
++ * KIND, either express or implied. See the License for the
++ * specific language governing permissions and limitations
++ * under the License.
++ */
++
++namespace php TestValidators
++
++include "../../../test/ThriftTest.thrift"
++
++union UnionOfStrings {
++ 1: string aa;
++ 2: string bb;
++}
++
++service TestService {
++ void test() throws(1: ThriftTest.Xception xception);
++}
--- /dev/null
+Description: <short summary of the patch>
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2019-01-09
+
+---
+
+--- thrift-0.10.0.orig/lib/cpp/test/Makefile.am
++++ thrift-0.10.0/lib/cpp/test/Makefile.am
+@@ -116,9 +116,10 @@ check_PROGRAMS += \
+ endif
+
+ TESTS_ENVIRONMENT= \
+- BOOST_TEST_LOG_SINK=tests.xml \
+- BOOST_TEST_LOG_LEVEL=test_suite \
+- BOOST_TEST_LOG_FORMAT=XML
++ BOOST_TEST_LOGGER=XML,test_suite,tests.xml
++# BOOST_TEST_LOG_SINK=tests.xml \
++# BOOST_TEST_LOG_LEVEL=test_suite \
++# BOOST_TEST_LOG_FORMAT=XML
+
+ TESTS = \
+ $(check_PROGRAMS)
--- /dev/null
+Description: Disable TLS v1.0 and TLS v1.1 connection tests
+ TLS v1.0 and TLS v1.1 protocols are disabled as of OpenSSL 1.1.0f-4, see:
+ https://packages.qa.debian.org/o/openssl/news/20170806T233554Z.html
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Bug-Debian: https://bugs.debian.org/859128
+Last-Update: 2017-09-10
+
+---
+
+--- thrift-0.10.0.orig/lib/cpp/test/SecurityTest.cpp
++++ thrift-0.10.0/lib/cpp/test/SecurityTest.cpp
+@@ -222,11 +222,11 @@ BOOST_AUTO_TEST_CASE(ssl_security_matrix
+ {
+ // server = SSLTLS SSLv2 SSLv3 TLSv1_0 TLSv1_1 TLSv1_2
+ // client
+- /* SSLTLS */ { true, false, false, true, true, true },
++ /* SSLTLS */ { true, false, false, false, false, true },
+ /* SSLv2 */ { false, false, false, false, false, false },
+ /* SSLv3 */ { false, false, true, false, false, false },
+- /* TLSv1_0 */ { true, false, false, true, false, false },
+- /* TLSv1_1 */ { true, false, false, false, true, false },
++ /* TLSv1_0 */ { false, false, false, true, false, false },
++ /* TLSv1_1 */ { false, false, false, false, true, false },
+ /* TLSv1_2 */ { true, false, false, false, false, true }
+ };
+
--- /dev/null
+Description: disable failing tests
+ .
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2019-10-05
+
+---
+
+--- thrift-0.12.0.orig/lib/c_glib/test/Makefile.am
++++ thrift-0.12.0/lib/c_glib/test/Makefile.am
+@@ -47,7 +47,6 @@ check_PROGRAMS = \
+ testapplicationexception \
+ testcontainertest \
+ testtransportsocket \
+- testtransportsslsocket \
+ testbinaryprotocol \
+ testcompactprotocol \
+ testbufferedtransport \
+--- thrift-0.12.0.orig/lib/cpp/test/Makefile.am
++++ thrift-0.12.0/lib/cpp/test/Makefile.am
+@@ -98,7 +98,6 @@ check_PROGRAMS = \
+ TransportTest \
+ TInterruptTest \
+ TServerIntegrationTest \
+- SecurityTest \
+ ZlibTest \
+ TFileTransportTest \
+ link_test \
--- /dev/null
+Description: PHP tests are not phpunit 8 compatible
+ Disable those for now.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2019-09-22
+
+---
+
+--- thrift-0.12.0.orig/lib/php/test/Makefile.am
++++ thrift-0.12.0/lib/php/test/Makefile.am
+@@ -35,13 +35,13 @@ deps: $(top_srcdir)/composer.json
+ all-local: deps
+
+ check-json-serializer: deps stubs
+- $(PHPUNIT) --log-junit=TEST-log-json-serializer.xml JsonSerialize/
++# $(PHPUNIT) --log-junit=TEST-log-json-serializer.xml JsonSerialize/
+
+ check-validator: deps stubs
+- $(PHPUNIT) --log-junit=TEST-log-validator.xml Validator/
++# $(PHPUNIT) --log-junit=TEST-log-validator.xml Validator/
+
+ check-protocol: deps stubs
+- $(PHPUNIT) --log-junit=TEST-log-protocol.xml Protocol/
++# $(PHPUNIT) --log-junit=TEST-log-protocol.xml Protocol/
+
+ check: deps stubs \
+ check-protocol \
--- /dev/null
+Description: wait a second after go serve socket
+ Multiple upstream wait time by hundred.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2018-09-23
+
+---
+
+--- thrift-0.11.0.orig/lib/go/test/tests/multiplexed_protocol_test.go
++++ thrift-0.11.0/lib/go/test/tests/multiplexed_protocol_test.go
+@@ -66,7 +66,7 @@ func TestMultiplexedProtocolFirst(t *tes
+
+ defer server.Stop()
+ go server.Serve()
+- time.Sleep(10 * time.Millisecond)
++ time.Sleep(1000 * time.Millisecond)
+
+ transport, err := createTransport(addr)
+ if err != nil {
+@@ -105,7 +105,7 @@ func TestMultiplexedProtocolSecond(t *te
+
+ defer server.Stop()
+ go server.Serve()
+- time.Sleep(10 * time.Millisecond)
++ time.Sleep(1000 * time.Millisecond)
+
+ transport, err := createTransport(addr)
+ if err != nil {
--- /dev/null
+From a9efd1abd4fd4862d8e967ec207015af79494b6c Mon Sep 17 00:00:00 2001
+From: "D. Can Celasun" <can@dcc.im>
+Date: Thu, 15 Mar 2018 12:52:37 +0100
+Subject: [PATCH] THRIFT-4516: Fix "go vet" warnings for Go 1.10
+
+Client: go
+---
+ lib/go/test/dontexportrwtest/compile_test.go | 9 ++--
+ lib/go/thrift/application_exception_test.go | 4 +-
+ lib/go/thrift/compact_protocol.go | 2 +-
+ lib/go/thrift/json_protocol_test.go | 2 +-
+ lib/go/thrift/protocol_test.go | 34 +++++++--------
+ lib/go/thrift/simple_json_protocol.go | 2 +-
+ lib/go/thrift/simple_json_protocol_test.go | 2 +-
+ test/go/src/common/clientserver_test.go | 44 ++++++++++----------
+ 11 files changed, 53 insertions(+), 54 deletions(-)
+
+diff --git a/lib/go/test/dontexportrwtest/compile_test.go b/lib/go/test/dontexportrwtest/compile_test.go
+index 2b877e3b0d..cf6763e297 100644
+--- a/lib/go/test/dontexportrwtest/compile_test.go
++++ b/lib/go/test/dontexportrwtest/compile_test.go
+@@ -20,7 +20,6 @@
+ package dontexportrwtest
+
+ import (
+- "fmt"
+ "testing"
+ )
+
+@@ -29,10 +28,10 @@ import (
+ func TestReadWriteMethodsArePrivate(t *testing.T) {
+ // This will only compile if read/write methods exist
+ s := NewTestStruct()
+- fmt.Sprintf("%v", s.read)
+- fmt.Sprintf("%v", s.write)
++ _ = s.read
++ _ = s.write
+
+ is := NewInnerStruct()
+- fmt.Sprintf("%v", is.read)
+- fmt.Sprintf("%v", is.write)
++ _ = is.read
++ _ = is.write
+ }
+diff --git a/lib/go/thrift/application_exception_test.go b/lib/go/thrift/application_exception_test.go
+index b2687a6c84..77433575d5 100644
+--- a/lib/go/thrift/application_exception_test.go
++++ b/lib/go/thrift/application_exception_test.go
+@@ -29,13 +29,13 @@ func TestTApplicationException(t *testing.T) {
+ t.Fatalf("Expected empty string for exception but found '%s'", exc.Error())
+ }
+ if exc.TypeId() != UNKNOWN_APPLICATION_EXCEPTION {
+- t.Fatalf("Expected type UNKNOWN for exception but found '%s'", exc.TypeId())
++ t.Fatalf("Expected type UNKNOWN for exception but found '%v'", exc.TypeId())
+ }
+ exc = NewTApplicationException(WRONG_METHOD_NAME, "junk_method")
+ if exc.Error() != "junk_method" {
+ t.Fatalf("Expected 'junk_method' for exception but found '%s'", exc.Error())
+ }
+ if exc.TypeId() != WRONG_METHOD_NAME {
+- t.Fatalf("Expected type WRONG_METHOD_NAME for exception but found '%s'", exc.TypeId())
++ t.Fatalf("Expected type WRONG_METHOD_NAME for exception but found '%v'", exc.TypeId())
+ }
+ }
+diff --git a/lib/go/thrift/compact_protocol.go b/lib/go/thrift/compact_protocol.go
+index fc1d18287e..66fbf5c335 100644
+--- a/lib/go/thrift/compact_protocol.go
++++ b/lib/go/thrift/compact_protocol.go
+@@ -806,7 +806,7 @@ func (p *TCompactProtocol) getTType(t tCompactType) (TType, error) {
+ case COMPACT_STRUCT:
+ return STRUCT, nil
+ }
+- return STOP, TException(fmt.Errorf("don't know what type: %s", t&0x0f))
++ return STOP, TException(fmt.Errorf("don't know what type: %v", t&0x0f))
+ }
+
+ // Given a TType value, find the appropriate TCompactProtocol.Types constant.
+diff --git a/lib/go/thrift/json_protocol_test.go b/lib/go/thrift/json_protocol_test.go
+index 0902f1b21f..59c4d64a26 100644
+--- a/lib/go/thrift/json_protocol_test.go
++++ b/lib/go/thrift/json_protocol_test.go
+@@ -590,7 +590,7 @@ func TestWriteJSONProtocolMap(t *testing.T) {
+ }
+ str := trans.String()
+ if str[0] != '[' || str[len(str)-1] != ']' {
+- t.Fatalf("Bad value for %s, wrote: %q, in go: %q", thetype, str, DOUBLE_VALUES)
++ t.Fatalf("Bad value for %s, wrote: %v, in go: %v", thetype, str, DOUBLE_VALUES)
+ }
+ expectedKeyType, expectedValueType, expectedSize, err := p.ReadMapBegin()
+ if err != nil {
+diff --git a/lib/go/thrift/protocol_test.go b/lib/go/thrift/protocol_test.go
+index 2e3b65df99..e9118da88f 100644
+--- a/lib/go/thrift/protocol_test.go
++++ b/lib/go/thrift/protocol_test.go
+@@ -227,17 +227,17 @@ func ReadWriteBool(t testing.TB, p TProt
+ for k, v := range BOOL_VALUES {
+ err = p.WriteBool(v)
+ if err != nil {
+- t.Errorf("%s: %T %T %q Error writing bool in list at index %d: %q", "ReadWriteBool", p, trans, err, k, v)
++ t.Errorf("%s: %T %T %v Error writing bool in list at index %v: %v", "ReadWriteBool", p, trans, err, k, v)
+ }
+ }
+ p.WriteListEnd()
+ if err != nil {
+- t.Errorf("%s: %T %T %q Error writing list end: %q", "ReadWriteBool", p, trans, err, BOOL_VALUES)
++ t.Errorf("%s: %T %T %v Error writing list end: %v", "ReadWriteBool", p, trans, err, BOOL_VALUES)
+ }
+ p.Flush()
+ thetype2, thelen2, err := p.ReadListBegin()
+ if err != nil {
+- t.Errorf("%s: %T %T %q Error reading list: %q", "ReadWriteBool", p, trans, err, BOOL_VALUES)
++ t.Errorf("%s: %T %T %v Error reading list: %v", "ReadWriteBool", p, trans, err, BOOL_VALUES)
+ }
+ _, ok := p.(*TSimpleJSONProtocol)
+ if !ok {
+@@ -245,16 +245,16 @@ func ReadWriteBool(t testing.TB, p TProtocol, trans TTransport) {
+ t.Errorf("%s: %T %T type %s != type %s", "ReadWriteBool", p, trans, thetype, thetype2)
+ }
+ if thelen != thelen2 {
+- t.Errorf("%s: %T %T len %s != len %s", "ReadWriteBool", p, trans, thelen, thelen2)
++ t.Errorf("%s: %T %T len %v != len %v", "ReadWriteBool", p, trans, thelen, thelen2)
+ }
+ }
+ for k, v := range BOOL_VALUES {
+ value, err := p.ReadBool()
+ if err != nil {
+- t.Errorf("%s: %T %T %q Error reading bool at index %d: %q", "ReadWriteBool", p, trans, err, k, v)
++ t.Errorf("%s: %T %T %v Error reading bool at index %v: %v", "ReadWriteBool", p, trans, err, k, v)
+ }
+ if v != value {
+- t.Errorf("%s: index %d %q %q %q != %q", "ReadWriteBool", k, p, trans, v, value)
++ t.Errorf("%s: index %v %v %v %v != %v", "ReadWriteBool", k, p, trans, v, value)
+ }
+ }
+ err = p.ReadListEnd()
+@@ -294,7 +294,7 @@ func ReadWriteByte(t testing.TB, p TProtocol, trans TTransport) {
+ t.Errorf("%s: %T %T type %s != type %s", "ReadWriteByte", p, trans, thetype, thetype2)
+ }
+ if thelen != thelen2 {
+- t.Errorf("%s: %T %T len %s != len %s", "ReadWriteByte", p, trans, thelen, thelen2)
++ t.Errorf("%s: %T %T len %v != len %v", "ReadWriteByte", p, trans, thelen, thelen2)
+ }
+ }
+ for k, v := range BYTE_VALUES {
+@@ -331,7 +331,7 @@ func ReadWriteI16(t testing.TB, p TProtocol, trans TTransport) {
+ t.Errorf("%s: %T %T type %s != type %s", "ReadWriteI16", p, trans, thetype, thetype2)
+ }
+ if thelen != thelen2 {
+- t.Errorf("%s: %T %T len %s != len %s", "ReadWriteI16", p, trans, thelen, thelen2)
++ t.Errorf("%s: %T %T len %v != len %v", "ReadWriteI16", p, trans, thelen, thelen2)
+ }
+ }
+ for k, v := range INT16_VALUES {
+@@ -368,7 +368,7 @@ func ReadWriteI32(t testing.TB, p TProtocol, trans TTransport) {
+ t.Errorf("%s: %T %T type %s != type %s", "ReadWriteI32", p, trans, thetype, thetype2)
+ }
+ if thelen != thelen2 {
+- t.Errorf("%s: %T %T len %s != len %s", "ReadWriteI32", p, trans, thelen, thelen2)
++ t.Errorf("%s: %T %T len %v != len %v", "ReadWriteI32", p, trans, thelen, thelen2)
+ }
+ }
+ for k, v := range INT32_VALUES {
+@@ -404,7 +404,7 @@ func ReadWriteI64(t testing.TB, p TProtocol, trans TTransport) {
+ t.Errorf("%s: %T %T type %s != type %s", "ReadWriteI64", p, trans, thetype, thetype2)
+ }
+ if thelen != thelen2 {
+- t.Errorf("%s: %T %T len %s != len %s", "ReadWriteI64", p, trans, thelen, thelen2)
++ t.Errorf("%s: %T %T len %v != len %v", "ReadWriteI64", p, trans, thelen, thelen2)
+ }
+ }
+ for k, v := range INT64_VALUES {
+@@ -432,25 +432,25 @@ func ReadWriteDouble(t testing.TB, p TProtocol, trans TTransport) {
+ p.Flush()
+ thetype2, thelen2, err := p.ReadListBegin()
+ if err != nil {
+- t.Errorf("%s: %T %T %q Error reading list: %q", "ReadWriteDouble", p, trans, err, DOUBLE_VALUES)
++ t.Errorf("%s: %T %T %v Error reading list: %v", "ReadWriteDouble", p, trans, err, DOUBLE_VALUES)
+ }
+ if thetype != thetype2 {
+ t.Errorf("%s: %T %T type %s != type %s", "ReadWriteDouble", p, trans, thetype, thetype2)
+ }
+ if thelen != thelen2 {
+- t.Errorf("%s: %T %T len %s != len %s", "ReadWriteDouble", p, trans, thelen, thelen2)
++ t.Errorf("%s: %T %T len %v != len %v", "ReadWriteDouble", p, trans, thelen, thelen2)
+ }
+ for k, v := range DOUBLE_VALUES {
+ value, err := p.ReadDouble()
+ if err != nil {
+- t.Errorf("%s: %T %T %q Error reading double at index %d: %q", "ReadWriteDouble", p, trans, err, k, v)
++ t.Errorf("%s: %T %T %q Error reading double at index %d: %v", "ReadWriteDouble", p, trans, err, k, v)
+ }
+ if math.IsNaN(v) {
+ if !math.IsNaN(value) {
+- t.Errorf("%s: %T %T math.IsNaN(%q) != math.IsNaN(%q)", "ReadWriteDouble", p, trans, v, value)
++ t.Errorf("%s: %T %T math.IsNaN(%v) != math.IsNaN(%v)", "ReadWriteDouble", p, trans, v, value)
+ }
+ } else if v != value {
+- t.Errorf("%s: %T %T %v != %q", "ReadWriteDouble", p, trans, v, value)
++ t.Errorf("%s: %T %T %v != %v", "ReadWriteDouble", p, trans, v, value)
+ }
+ }
+ err = p.ReadListEnd()
+@@ -478,7 +478,7 @@ func ReadWriteString(t testing.TB, p TProtocol, trans TTransport) {
+ t.Errorf("%s: %T %T type %s != type %s", "ReadWriteString", p, trans, thetype, thetype2)
+ }
+ if thelen != thelen2 {
+- t.Errorf("%s: %T %T len %s != len %s", "ReadWriteString", p, trans, thelen, thelen2)
++ t.Errorf("%s: %T %T len %v != len %v", "ReadWriteString", p, trans, thelen, thelen2)
+ }
+ }
+ for k, v := range STRING_VALUES {
+@@ -487,7 +487,7 @@ func ReadWriteString(t testing.TB, p TProtocol, trans TTransport) {
+ t.Errorf("%s: %T %T %q Error reading string at index %d: %q", "ReadWriteString", p, trans, err, k, v)
+ }
+ if v != value {
+- t.Errorf("%s: %T %T %d != %d", "ReadWriteString", p, trans, v, value)
++ t.Errorf("%s: %T %T %v != %v", "ReadWriteString", p, trans, v, value)
+ }
+ }
+ if err != nil {
+diff --git a/lib/go/thrift/simple_json_protocol.go b/lib/go/thrift/simple_json_protocol.go
+index 88f569cc15..2e8a71112a 100644
+--- a/lib/go/thrift/simple_json_protocol.go
++++ b/lib/go/thrift/simple_json_protocol.go
+@@ -1064,7 +1064,7 @@ func (p *TSimpleJSONProtocol) ParseListEnd() error {
+ for _, char := range line {
+ switch char {
+ default:
+- e := fmt.Errorf("Expecting end of list \"]\", but found: \"", line, "\"")
++ e := fmt.Errorf("Expecting end of list \"]\", but found: \"%v\"", line)
+ return NewTProtocolExceptionWithType(INVALID_DATA, e)
+ case ' ', '\n', '\r', '\t', rune(JSON_RBRACKET[0]):
+ break
+diff --git a/lib/go/thrift/simple_json_protocol_test.go b/lib/go/thrift/simple_json_protocol_test.go
+index 49181ab199..7b98082a4e 100644
+--- a/lib/go/thrift/simple_json_protocol_test.go
++++ b/lib/go/thrift/simple_json_protocol_test.go
+@@ -658,7 +658,7 @@ func TestWriteSimpleJSONProtocolMap(t *testing.T) {
+ }
+ str := trans.String()
+ if str[0] != '[' || str[len(str)-1] != ']' {
+- t.Fatalf("Bad value for %s, wrote: %q, in go: %q", thetype, str, DOUBLE_VALUES)
++ t.Fatalf("Bad value for %s, wrote: %v, in go: %v", thetype, str, DOUBLE_VALUES)
+ }
+ l := strings.Split(str[1:len(str)-1], ",")
+ if len(l) < 3 {
+diff --git a/test/go/src/common/clientserver_test.go b/test/go/src/common/clientserver_test.go
+index cb1abf775c..9f93c4c6cc 100644
+--- a/test/go/src/common/clientserver_test.go
++++ b/test/go/src/common/clientserver_test.go
+@@ -127,12 +127,12 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+ )
+ var err error
+ if err = client.TestVoid(defaultCtx); err != nil {
+- t.Errorf("Unexpected error in TestVoid() call: ", err)
++ t.Errorf("Unexpected error in TestVoid() call: %s", err)
+ }
+
+ thing, err := client.TestString(defaultCtx, "thing")
+ if err != nil {
+- t.Errorf("Unexpected error in TestString() call: ", err)
++ t.Errorf("Unexpected error in TestString() call: %s", err)
+ }
+ if thing != "thing" {
+ t.Errorf("Unexpected TestString() result, expected 'thing' got '%s' ", thing)
+@@ -140,22 +140,22 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+
+ bl, err := client.TestBool(defaultCtx, true)
+ if err != nil {
+- t.Errorf("Unexpected error in TestBool() call: ", err)
++ t.Errorf("Unexpected error in TestBool() call: %s", err)
+ }
+ if !bl {
+- t.Errorf("Unexpected TestBool() result expected true, got %f ", bl)
++ t.Errorf("Unexpected TestBool() result expected true, got %v ", bl)
+ }
+ bl, err = client.TestBool(defaultCtx, false)
+ if err != nil {
+- t.Errorf("Unexpected error in TestBool() call: ", err)
++ t.Errorf("Unexpected error in TestBool() call: %s", err)
+ }
+ if bl {
+- t.Errorf("Unexpected TestBool() result expected false, got %f ", bl)
++ t.Errorf("Unexpected TestBool() result expected false, got %v ", bl)
+ }
+
+ b, err := client.TestByte(defaultCtx, 42)
+ if err != nil {
+- t.Errorf("Unexpected error in TestByte() call: ", err)
++ t.Errorf("Unexpected error in TestByte() call: %s", err)
+ }
+ if b != 42 {
+ t.Errorf("Unexpected TestByte() result expected 42, got %d ", b)
+@@ -163,7 +163,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+
+ i32, err := client.TestI32(defaultCtx, 4242)
+ if err != nil {
+- t.Errorf("Unexpected error in TestI32() call: ", err)
++ t.Errorf("Unexpected error in TestI32() call: %s", err)
+ }
+ if i32 != 4242 {
+ t.Errorf("Unexpected TestI32() result expected 4242, got %d ", i32)
+@@ -171,7 +171,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+
+ i64, err := client.TestI64(defaultCtx, 424242)
+ if err != nil {
+- t.Errorf("Unexpected error in TestI64() call: ", err)
++ t.Errorf("Unexpected error in TestI64() call: %s", err)
+ }
+ if i64 != 424242 {
+ t.Errorf("Unexpected TestI64() result expected 424242, got %d ", i64)
+@@ -179,7 +179,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+
+ d, err := client.TestDouble(defaultCtx, 42.42)
+ if err != nil {
+- t.Errorf("Unexpected error in TestDouble() call: ", err)
++ t.Errorf("Unexpected error in TestDouble() call: %s", err)
+ }
+ if d != 42.42 {
+ t.Errorf("Unexpected TestDouble() result expected 42.42, got %f ", d)
+@@ -194,7 +194,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+ xs.I64Thing = 424242
+ xsret, err := client.TestStruct(defaultCtx, xs)
+ if err != nil {
+- t.Errorf("Unexpected error in TestStruct() call: ", err)
++ t.Errorf("Unexpected error in TestStruct() call: %s", err)
+ }
+ if *xs != *xsret {
+ t.Errorf("Unexpected TestStruct() result expected %#v, got %#v ", xs, xsret)
+@@ -204,7 +204,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+ x2.StructThing = xs
+ x2ret, err := client.TestNest(defaultCtx, x2)
+ if err != nil {
+- t.Errorf("Unexpected error in TestNest() call: ", err)
++ t.Errorf("Unexpected error in TestNest() call: %s", err)
+ }
+ if !reflect.DeepEqual(x2, x2ret) {
+ t.Errorf("Unexpected TestNest() result expected %#v, got %#v ", x2, x2ret)
+@@ -213,7 +213,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+ m := map[int32]int32{1: 2, 3: 4, 5: 42}
+ mret, err := client.TestMap(defaultCtx, m)
+ if err != nil {
+- t.Errorf("Unexpected error in TestMap() call: ", err)
++ t.Errorf("Unexpected error in TestMap() call: %s", err)
+ }
+ if !reflect.DeepEqual(m, mret) {
+ t.Errorf("Unexpected TestMap() result expected %#v, got %#v ", m, mret)
+@@ -222,7 +222,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+ sm := map[string]string{"a": "2", "b": "blah", "some": "thing"}
+ smret, err := client.TestStringMap(defaultCtx, sm)
+ if err != nil {
+- t.Errorf("Unexpected error in TestStringMap() call: ", err)
++ t.Errorf("Unexpected error in TestStringMap() call: %s", err)
+ }
+ if !reflect.DeepEqual(sm, smret) {
+ t.Errorf("Unexpected TestStringMap() result expected %#v, got %#v ", sm, smret)
+@@ -231,7 +231,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+ s := []int32{1, 2, 42}
+ sret, err := client.TestSet(defaultCtx, s)
+ if err != nil {
+- t.Errorf("Unexpected error in TestSet() call: ", err)
++ t.Errorf("Unexpected error in TestSet() call: %s", err)
+ }
+ // Sets can be in any order, but Go slices are ordered, so reflect.DeepEqual won't work.
+ stemp := map[int32]struct{}{}
+@@ -247,7 +247,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+ l := []int32{1, 2, 42}
+ lret, err := client.TestList(defaultCtx, l)
+ if err != nil {
+- t.Errorf("Unexpected error in TestList() call: ", err)
++ t.Errorf("Unexpected error in TestList() call: %s", err)
+ }
+ if !reflect.DeepEqual(l, lret) {
+ t.Errorf("Unexpected TestList() result expected %#v, got %#v ", l, lret)
+@@ -255,7 +255,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+
+ eret, err := client.TestEnum(defaultCtx, thrifttest.Numberz_TWO)
+ if err != nil {
+- t.Errorf("Unexpected error in TestEnum() call: ", err)
++ t.Errorf("Unexpected error in TestEnum() call: %s", err)
+ }
+ if eret != thrifttest.Numberz_TWO {
+ t.Errorf("Unexpected TestEnum() result expected %#v, got %#v ", thrifttest.Numberz_TWO, eret)
+@@ -263,7 +263,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+
+ tret, err := client.TestTypedef(defaultCtx, thrifttest.UserId(42))
+ if err != nil {
+- t.Errorf("Unexpected error in TestTypedef() call: ", err)
++ t.Errorf("Unexpected error in TestTypedef() call: %s", err)
+ }
+ if tret != thrifttest.UserId(42) {
+ t.Errorf("Unexpected TestTypedef() result expected %#v, got %#v ", thrifttest.UserId(42), tret)
+@@ -271,7 +271,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+
+ mapmap, err := client.TestMapMap(defaultCtx, 42)
+ if err != nil {
+- t.Errorf("Unexpected error in TestMapmap() call: ", err)
++ t.Errorf("Unexpected error in TestMapmap() call: %s", err)
+ }
+ if !reflect.DeepEqual(mapmap, rmapmap) {
+ t.Errorf("Unexpected TestMapmap() result expected %#v, got %#v ", rmapmap, mapmap)
+@@ -279,7 +279,7 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+
+ xxsret, err := client.TestMulti(defaultCtx, 42, 4242, 424242, map[int16]string{1: "blah", 2: "thing"}, thrifttest.Numberz_EIGHT, thrifttest.UserId(24))
+ if err != nil {
+- t.Errorf("Unexpected error in TestMulti() call: %v", err)
++ t.Errorf("Unexpected error in TestMulti() call: %s", err)
+ }
+ if !reflect.DeepEqual(xxs, xxsret) {
+ t.Errorf("Unexpected TestMulti() result expected %#v, got %#v ", xxs, xxsret)
+@@ -323,11 +323,11 @@ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, h
+
+ err = client.TestOneway(defaultCtx, 2)
+ if err != nil {
+- t.Errorf("Unexpected error in TestOneway() call: ", err)
++ t.Errorf("Unexpected error in TestOneway() call: %s", err)
+ }
+
+ //Make sure the connection still alive
+ if err = client.TestVoid(defaultCtx); err != nil {
+- t.Errorf("Unexpected error in TestVoid() call: ", err)
++ t.Errorf("Unexpected error in TestVoid() call: %s", err)
+ }
+ }
--- /dev/null
+Description: golang dependencies already installed as build dependency
+Forwarded: no
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2019-12-01
+
+---
+
+--- thrift-0.13.0.orig/lib/go/test/Makefile.am
++++ thrift-0.13.0/lib/go/test/Makefile.am
+@@ -71,9 +71,9 @@ gopath: $(THRIFT) $(THRIFTTEST) \
+ $(THRIFT) $(THRIFTARGS) ConflictNamespaceTestD.thrift
+ $(THRIFT) $(THRIFTARGS) ConflictNamespaceTestSuperThing.thrift
+ $(THRIFT) $(THRIFTARGS) ConflictNamespaceServiceTest.thrift
+- GOPATH=`pwd`/gopath $(GO) get github.com/golang/mock/gomock || true
+- sed -i 's/\"context\"/\"golang.org\/x\/net\/context\"/g' gopath/src/github.com/golang/mock/gomock/controller.go || true
+- GOPATH=`pwd`/gopath $(GO) get github.com/golang/mock/gomock
++ echo GOPATH=`pwd`/gopath $(GO) get github.com/golang/mock/gomock || true
++ echo sed -i 's/\"context\"/\"golang.org\/x\/net\/context\"/g' gopath/src/github.com/golang/mock/gomock/controller.go || true
++ echo GOPATH=`pwd`/gopath $(GO) get github.com/golang/mock/gomock
+ ln -nfs ../../../thrift gopath/src/thrift
+ ln -nfs ../../tests gopath/src/tests
+ cp -r ./dontexportrwtest gopath/src
+--- thrift-0.13.0.orig/test/go/Makefile.am
++++ thrift-0.13.0/test/go/Makefile.am
+@@ -34,9 +34,9 @@ gopath: $(THRIFT) ThriftTest.thrift
+ mkdir -p src/gen
+ $(THRIFTCMD) ThriftTest.thrift
+ $(THRIFTCMD) ../StressTest.thrift
+- GOPATH=`pwd` $(GO) get github.com/golang/mock/gomock || true
+- sed -i 's/\"context\"/\"golang.org\/x\/net\/context\"/g' src/github.com/golang/mock/gomock/controller.go || true
+- GOPATH=`pwd` $(GO) get github.com/golang/mock/gomock
++ echo GOPATH=`pwd` $(GO) get github.com/golang/mock/gomock || true
++ echo sed -i 's/\"context\"/\"golang.org\/x\/net\/context\"/g' src/github.com/golang/mock/gomock/controller.go || true
++ echo GOPATH=`pwd` $(GO) get github.com/golang/mock/gomock
+ ln -nfs ../../../lib/go/thrift src/thrift
+ touch gopath
+
--- /dev/null
+Description: fix tests FTBFS with atomic link
+ On armel and at least mipsel needs atomic to link with.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Forwarded: no
+Last-Update: 2019-12-08
+
+---
+
+--- thrift-0.13.0.orig/lib/c_glib/test/Makefile.am
++++ thrift-0.13.0/lib/c_glib/test/Makefile.am
+@@ -186,7 +186,7 @@ testthrifttest_CFLAGS = -I$(top_srcdir)/
+
+ testthrifttestclient_SOURCES = testthrifttestclient.cpp
+ testthrifttestclient_CPPFLAGS = -I../../cpp/src $(BOOST_CPPFLAGS) -I./gen-cpp -I../src -I./gen-c_glib $(GLIB_CFLAGS)
+-testthrifttestclient_LDADD = ../../cpp/.libs/libthrift.la ../libthrift_c_glib.la libtestgenc.la libtestgencpp.la
++testthrifttestclient_LDADD = ../../cpp/.libs/libthrift.la ../libthrift_c_glib.la libtestgenc.la libtestgencpp.la -latomic
+ testthrifttestclient_LDFLAGS = -L../.libs -L../../cpp/.libs $(GLIB_LIBS) $(GOBJECT_LIBS)
+
+ check_LTLIBRARIES = libtestgenc.la
+--- thrift-0.13.0.orig/lib/cpp/test/Makefile.am
++++ thrift-0.13.0/lib/cpp/test/Makefile.am
+@@ -83,7 +83,8 @@ noinst_PROGRAMS = Benchmark \
+ Benchmark_SOURCES = \
+ Benchmark.cpp
+
+-Benchmark_LDADD = libtestgencpp.la
++Benchmark_LDADD = libtestgencpp.la \
++ -latomic
+
+ check_PROGRAMS = \
+ UnitTests \
+@@ -139,7 +140,8 @@ UnitTests_LDADD = \
+ libtestgencpp.la \
+ $(BOOST_TEST_LDADD) \
+ $(BOOST_SYSTEM_LDADD) \
+- $(BOOST_THREAD_LDADD)
++ $(BOOST_THREAD_LDADD) \
++ -latomic
+
+ TInterruptTest_SOURCES = \
+ TSocketInterruptTest.cpp \
+@@ -151,7 +153,8 @@ TInterruptTest_LDADD = \
+ $(BOOST_FILESYSTEM_LDADD) \
+ $(BOOST_CHRONO_LDADD) \
+ $(BOOST_SYSTEM_LDADD) \
+- $(BOOST_THREAD_LDADD)
++ $(BOOST_THREAD_LDADD) \
++ -latomic
+
+ TServerIntegrationTest_SOURCES = \
+ TServerIntegrationTest.cpp
+@@ -161,7 +164,8 @@ TServerIntegrationTest_LDADD = \
+ libprocessortest.la \
+ $(BOOST_TEST_LDADD) \
+ $(BOOST_SYSTEM_LDADD) \
+- $(BOOST_THREAD_LDADD)
++ $(BOOST_THREAD_LDADD) \
++ -latomic
+
+ SecurityTest_SOURCES = \
+ SecurityTest.cpp
+@@ -181,7 +185,8 @@ TransportTest_LDADD = \
+ libtestgencpp.la \
+ $(top_builddir)/lib/cpp/libthriftz.la \
+ $(BOOST_TEST_LDADD) \
+- -lz
++ -lz \
++ -latomic
+
+ ZlibTest_SOURCES = \
+ ZlibTest.cpp
+@@ -190,7 +195,8 @@ ZlibTest_LDADD = \
+ libtestgencpp.la \
+ $(top_builddir)/lib/cpp/libthriftz.la \
+ $(BOOST_TEST_LDADD) \
+- -lz
++ -lz \
++ -latomic
+
+ EnumTest_SOURCES = \
+ EnumTest.cpp
+@@ -215,7 +221,8 @@ TFileTransportTest_SOURCES = \
+
+ TFileTransportTest_LDADD = \
+ libtestgencpp.la \
+- $(BOOST_TEST_LDADD)
++ $(BOOST_TEST_LDADD) \
++ -latomic
+
+ #
+ # TFDTransportTest
+@@ -225,7 +232,8 @@ TFDTransportTest_SOURCES = \
+
+ TFDTransportTest_LDADD = \
+ $(top_builddir)/lib/cpp/libthrift.la \
+- $(BOOST_TEST_LDADD)
++ $(BOOST_TEST_LDADD) \
++ -latomic
+
+
+ #
+@@ -240,7 +248,8 @@ TPipedTransportTest_LDADD = \
+ $(top_builddir)/lib/cpp/libthrift.la \
+ $(BOOST_TEST_LDADD) \
+ $(BOOST_SYSTEM_LDADD) \
+- $(BOOST_THREAD_LDADD)
++ $(BOOST_THREAD_LDADD) \
++ -latomic
+
+ #
+ # AllProtocolsTest
+@@ -252,7 +261,8 @@ AllProtocolsTest_SOURCES = \
+
+ AllProtocolsTest_LDADD = \
+ libtestgencpp.la \
+- $(BOOST_TEST_LDADD)
++ $(BOOST_TEST_LDADD) \
++ -latomic
+
+ #
+ # DebugProtoTest
+@@ -262,7 +272,8 @@ DebugProtoTest_SOURCES = \
+
+ DebugProtoTest_LDADD = \
+ libtestgencpp.la \
+- $(BOOST_TEST_LDADD)
++ $(BOOST_TEST_LDADD) \
++ -latomic
+
+
+ #
+@@ -273,7 +284,8 @@ JSONProtoTest_SOURCES = \
+
+ JSONProtoTest_LDADD = \
+ libtestgencpp.la \
+- $(BOOST_TEST_LDADD)
++ $(BOOST_TEST_LDADD) \
++ -latomic
+
+ #
+ # TNonblockingServerTest
+@@ -285,7 +297,8 @@ TNonblockingServerTest_LDADD = libproces
+ $(top_builddir)/lib/cpp/libthriftnb.la \
+ $(BOOST_TEST_LDADD) \
+ $(BOOST_LDFLAGS) \
+- $(LIBEVENT_LIBS)
++ $(LIBEVENT_LIBS) \
++ -latomic
+ #
+ # TNonblockingSSLServerTest
+ #
+@@ -300,7 +313,8 @@ TNonblockingSSLServerTest_LDADD = libpro
+ $(BOOST_CHRONO_LDADD) \
+ $(BOOST_SYSTEM_LDADD) \
+ $(BOOST_THREAD_LDADD) \
+- $(LIBEVENT_LIBS)
++ $(LIBEVENT_LIBS) \
++ -latomic
+
+ #
+ # OptionalRequiredTest
+@@ -310,7 +324,8 @@ OptionalRequiredTest_SOURCES = \
+
+ OptionalRequiredTest_LDADD = \
+ libtestgencpp.la \
+- $(BOOST_TEST_LDADD)
++ $(BOOST_TEST_LDADD) \
++ -latomic
+
+ #
+ # OptionalRequiredTest
+@@ -320,7 +335,8 @@ RecursiveTest_SOURCES = \
+
+ RecursiveTest_LDADD = \
+ libtestgencpp.la \
+- $(BOOST_TEST_LDADD)
++ $(BOOST_TEST_LDADD) \
++ -latomic
+
+ #
+ # SpecializationTest
+@@ -330,7 +346,8 @@ SpecializationTest_SOURCES = \
+
+ SpecializationTest_LDADD = \
+ libtestgencpp.la \
+- $(BOOST_TEST_LDADD)
++ $(BOOST_TEST_LDADD) \
++ -latomic
+
+ concurrency_test_SOURCES = \
+ concurrency/Tests.cpp \
+@@ -339,7 +356,8 @@ concurrency_test_SOURCES = \
+ concurrency/TimerManagerTests.h
+
+ concurrency_test_LDADD = \
+- $(top_builddir)/lib/cpp/libthrift.la
++ $(top_builddir)/lib/cpp/libthrift.la \
++ -latomic
+
+ link_test_SOURCES = \
+ link/LinkTest.cpp \
+@@ -359,7 +377,8 @@ processor_test_LDADD = libprocessortest.
+ $(top_builddir)/lib/cpp/libthriftnb.la \
+ $(BOOST_TEST_LDADD) \
+ $(BOOST_LDFLAGS) \
+- $(LIBEVENT_LIBS)
++ $(LIBEVENT_LIBS) \
++ -latomic
+
+ OpenSSLManualInitTest_SOURCES = \
+ OpenSSLManualInitTest.cpp
+@@ -368,7 +387,8 @@ OpenSSLManualInitTest_LDADD = \
+ $(top_builddir)/lib/cpp/libthrift.la \
+ $(BOOST_TEST_LDADD) \
+ $(OPENSSL_LDFLAGS) \
+- $(OPENSSL_LIBS)
++ $(OPENSSL_LIBS) \
++ -latomic
+
+ #
+ # Common thrift code generation rules
+--- thrift-0.13.0.orig/test/cpp/Makefile.am
++++ thrift-0.13.0/test/cpp/Makefile.am
+@@ -73,7 +73,8 @@ TestServer_LDADD = \
+ $(top_builddir)/lib/cpp/libthrift.la \
+ $(top_builddir)/lib/cpp/libthriftz.la \
+ $(top_builddir)/lib/cpp/libthriftnb.la \
+- -levent -lboost_program_options -lboost_system -lboost_filesystem $(ZLIB_LIBS)
++ -levent -lboost_program_options -lboost_system -lboost_filesystem $(ZLIB_LIBS) \
++ -latomic
+
+ TestClient_SOURCES = \
+ src/TestClient.cpp
+@@ -83,14 +84,16 @@ TestClient_LDADD = \
+ $(top_builddir)/lib/cpp/libthrift.la \
+ $(top_builddir)/lib/cpp/libthriftz.la \
+ $(top_builddir)/lib/cpp/libthriftnb.la \
+- -levent -lboost_program_options -lboost_system -lboost_filesystem $(ZLIB_LIBS)
++ -levent -lboost_program_options -lboost_system -lboost_filesystem $(ZLIB_LIBS) \
++ -latomic
+
+ StressTest_SOURCES = \
+ src/StressTest.cpp
+
+ StressTest_LDADD = \
+ libstresstestgencpp.la \
+- $(top_builddir)/lib/cpp/libthrift.la
++ $(top_builddir)/lib/cpp/libthrift.la \
++ -latomic
+
+ StressTestNonBlocking_SOURCES = \
+ src/StressTestNonBlocking.cpp
+@@ -98,7 +101,8 @@ StressTestNonBlocking_SOURCES = \
+ StressTestNonBlocking_LDADD = \
+ libstresstestgencpp.la \
+ $(top_builddir)/lib/cpp/libthriftnb.la \
+- -levent
++ -levent \
++ -latomic
+ #
+ # Common thrift code generation rules
+ #
--- /dev/null
+Description: add zlib library to link with
+ Need to specify which library contain the zlib functions during linking.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+
+---
+
+--- thrift-0.9.2.orig/test/cpp/Makefile
++++ thrift-0.9.2/test/cpp/Makefile
+@@ -632,13 +632,13 @@ src/TestClient.$(OBJEXT): src/$(am__dirs
+
+ TestClient$(EXEEXT): $(TestClient_OBJECTS) $(TestClient_DEPENDENCIES) $(EXTRA_TestClient_DEPENDENCIES)
+ @rm -f TestClient$(EXEEXT)
+- $(AM_V_CXXLD)$(CXXLINK) $(TestClient_OBJECTS) $(TestClient_LDADD) $(LIBS)
++ $(AM_V_CXXLD)$(CXXLINK) $(TestClient_OBJECTS) $(TestClient_LDADD) $(LIBS) $(ZLIB_LIBS)
+ src/TestServer.$(OBJEXT): src/$(am__dirstamp) \
+ src/$(DEPDIR)/$(am__dirstamp)
+
+ TestServer$(EXEEXT): $(TestServer_OBJECTS) $(TestServer_DEPENDENCIES) $(EXTRA_TestServer_DEPENDENCIES)
+ @rm -f TestServer$(EXEEXT)
+- $(AM_V_CXXLD)$(CXXLINK) $(TestServer_OBJECTS) $(TestServer_LDADD) $(LIBS)
++ $(AM_V_CXXLD)$(CXXLINK) $(TestServer_OBJECTS) $(TestServer_LDADD) $(LIBS) $(ZLIB_LIBS)
+
+ mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+--- thrift-0.9.2.orig/test/cpp/Makefile.in
++++ thrift-0.9.2/test/cpp/Makefile.in
+@@ -632,13 +632,13 @@ src/TestClient.$(OBJEXT): src/$(am__dirs
+
+ TestClient$(EXEEXT): $(TestClient_OBJECTS) $(TestClient_DEPENDENCIES) $(EXTRA_TestClient_DEPENDENCIES)
+ @rm -f TestClient$(EXEEXT)
+- $(AM_V_CXXLD)$(CXXLINK) $(TestClient_OBJECTS) $(TestClient_LDADD) $(LIBS)
++ $(AM_V_CXXLD)$(CXXLINK) $(TestClient_OBJECTS) $(TestClient_LDADD) $(LIBS) $(ZLIB_LIBS)
+ src/TestServer.$(OBJEXT): src/$(am__dirstamp) \
+ src/$(DEPDIR)/$(am__dirstamp)
+
+ TestServer$(EXEEXT): $(TestServer_OBJECTS) $(TestServer_DEPENDENCIES) $(EXTRA_TestServer_DEPENDENCIES)
+ @rm -f TestServer$(EXEEXT)
+- $(AM_V_CXXLD)$(CXXLINK) $(TestServer_OBJECTS) $(TestServer_LDADD) $(LIBS)
++ $(AM_V_CXXLD)$(CXXLINK) $(TestServer_OBJECTS) $(TestServer_LDADD) $(LIBS) $(ZLIB_LIBS)
+
+ mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
--- /dev/null
+Description: don't try missing NewMockThriftTest test
+ Upstream doesn't ship NewMockThriftTest hence don't try to use it.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2019-11-30
+
+---
+
+--- thrift-0.13.0.orig/test/go/src/common/clientserver_test.go
++++ thrift-0.13.0/test/go/src/common/clientserver_test.go
+@@ -21,14 +21,10 @@ package common
+
+ import (
+ "context"
+- "errors"
+ "gen/thrifttest"
+- "reflect"
+ "sync"
+ "testing"
+- "thrift"
+
+- "github.com/golang/mock/gomock"
+ )
+
+ type test_unit struct {
+@@ -61,6 +57,7 @@ func TestAllConnection(t *testing.T) {
+ }
+
+ func doUnit(t *testing.T, unit *test_unit) {
++/*
+ ctrl := gomock.NewController(t)
+ defer ctrl.Finish()
+ handler := NewMockThriftTest(ctrl)
+@@ -81,6 +78,7 @@ func doUnit(t *testing.T, unit *test_uni
+ }
+ defer trans.Close()
+ callEverythingWithMock(t, client, handler)
++*/
+ }
+
+ var rmapmap = map[int32]map[int32]int32{
+@@ -98,6 +96,7 @@ var xxs = &thrifttest.Xtruct{
+ var xcept = &thrifttest.Xception{ErrorCode: 1001, Message: "some"}
+ var defaultCtx = context.Background()
+
++/*
+ func callEverythingWithMock(t *testing.T, client *thrifttest.ThriftTestClient, handler *MockThriftTest) {
+ gomock.InOrder(
+ handler.EXPECT().TestVoid(gomock.Any()),
+@@ -333,3 +332,4 @@ func callEverythingWithMock(t *testing.T
+ t.Errorf("Unexpected error in TestVoid() call: %s", err)
+ }
+ }
++*/
--- /dev/null
+Description: do not use bundler as per Ruby policy
+ .
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Bug-Debian: https://bugs.debian.org/804668
+Last-Update: 2019-10-23
+
+---
+
+--- a/lib/rb/Makefile.am
++++ b/lib/rb/Makefile.am
+@@ -22,20 +22,24 @@ DESTDIR ?= /
+ if HAVE_BUNDLER
+
+ all-local:
+- $(BUNDLER) install
+- $(BUNDLER) exec rake build_ext
++ echo Do not use bundler for all-local
++# $(BUNDLER) install
++# $(BUNDLER) exec rake build_ext
+
+ install-exec-hook:
+- $(BUNDLER) exec rake install
++ echo Do not use bundler for install-exec-hook
++# $(BUNDLER) exec rake install
+
+ clean-local:
+- $(BUNDLER) install
+- $(BUNDLER) exec rake clean
++ echo Do not use bundler for clean-local
++# $(BUNDLER) install
++# $(BUNDLER) exec rake clean
+ $(RM) -r spec/gen-rb/
+
+ check-local: all
+- $(BUNDLER) install
+- $(BUNDLER) exec rake
++ echo Do not use bundler for check-local
++# $(BUNDLER) install
++# $(BUNDLER) exec rake
+
+ endif
+
+--- a/test/rb/Makefile.am
++++ b/test/rb/Makefile.am
+@@ -26,8 +26,9 @@ precross: stubs
+
+ check: stubs
+ if HAVE_BUNDLER
+- $(BUNDLER) install
+- $(BUNDLER) exec $(RUBY) -I. test_suite.rb
++ echo Do not use bundler for check
++# $(BUNDLER) install
++# $(BUNDLER) exec $(RUBY) -I. test_suite.rb
+ endif
+
+ clean-local:
--- /dev/null
+Description: <short summary of the patch>
+ TODO: Put a short summary on the line above and replace this paragraph
+ with a longer explanation of this change. Complete the meta-information
+ with other relevant fields (see below for details). To make it easier, the
+ information below has been extracted from the changelog. Adjust it or drop
+ it.
+ .
+ thrift (0.12.0-1) experimental; urgency=medium
+ .
+ * New major upstream release.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+
+---
+The information above should follow the Patch Tagging Guidelines, please
+checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
+are templates for supplementary fields that you might want to add:
+
+Origin: <vendor|upstream|other>, <url of original patch>
+Bug: <url in upstream bugtracker>
+Bug-Debian: https://bugs.debian.org/<bugnumber>
+Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
+Forwarded: <no|not-needed|url proving that it has been forwarded>
+Reviewed-By: <name and email of someone who approved the patch>
+Last-Update: 2019-09-18
+
+--- thrift-0.12.0.orig/lib/php/test/Makefile.am
++++ thrift-0.12.0/lib/php/test/Makefile.am
+@@ -30,7 +30,7 @@ stubs: ../../../test/ThriftTest.thrift
+ $(THRIFT) --gen php:json -r --out ./packages/phpjs TestValidators.thrift
+
+ deps: $(top_srcdir)/composer.json
+- composer install --working-dir=$(top_srcdir)
++ echo Disabled composer install --working-dir=$(top_srcdir)
+
+ all-local: deps
+
--- /dev/null
+Description: run simple Go test only
+ Race testing is available on amd64, ppc64le and arm64 only.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2019-10-05
+
+---
+
+--- thrift-0.12.0.orig/lib/go/Makefile.am
++++ thrift-0.12.0/lib/go/Makefile.am
+@@ -31,7 +31,7 @@ install:
+ @echo '##############################################################'
+
+ check-local:
+- GOPATH=`pwd` $(GO) test -race ./thrift
++ GOPATH=`pwd` $(GO) test ./thrift
+
+ clean-local:
+ $(RM) -rf pkg
--- /dev/null
+Description: don't use gradlew in any way
+ Not enabled for compilation, but clean would like to use it anyway.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2019-10-23
+
+---
+
+--- a/lib/as3/Makefile.am
++++ b/lib/as3/Makefile.am
+@@ -28,7 +28,7 @@ install-exec-hook:
+ --console=plain
+
+ clean-local:
+- ./gradlew $(GRADLE_OPTS) clean \
++ echo ./gradlew $(GRADLE_OPTS) clean \
+ -Prelease=true \
+ --console=plain
+ $(RM) -r .gradle
--- /dev/null
+Description: no need for ANT Maven task
+ Just disable its download.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+
+---
+
+--- thrift-0.9.2.orig/lib/java/build.xml
++++ thrift-0.9.2/lib/java/build.xml
+@@ -295,7 +295,9 @@
+ </target>
+
+ <target name="mvn.ant.tasks.download" depends="setup.init,mvn.ant.tasks.check,proxy" unless="mvn.ant.tasks.found">
++<!--
+ <get src="${mvn.ant.task.url}/${mvn.ant.task.jar}" dest="${build.tools.dir}/${mvn.ant.task.jar}" usetimestamp="true"/>
++-->
+ </target>
+
+ <target name="mvn.ant.tasks.check">
--- /dev/null
+Description: don't test servers that need shmem
+ As buildd's don't have shmem enabled / mounted, tests would fail.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2017-09-11
+
+---
+
+--- thrift-0.9.2.orig/test/py/RunClientServer.py
++++ thrift-0.9.2/test/py/RunClientServer.py
+@@ -69,7 +69,8 @@ def default_servers():
+ 'THttpServer',
+ ]
+ if platform.system() != 'Windows':
+- servers.append('TProcessPoolServer')
++# buildd servers don't have shmem enabled
++# servers.append('TProcessPoolServer')
+ servers.append('TForkingServer')
+ return servers
+
--- /dev/null
+Description: node is called nodejs in Debian
+ Use the proper binary name.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2019-10-23
+
+---
+
+--- a/lib/nodejs/test/testAll.sh
++++ b/lib/nodejs/test/testAll.sh
+@@ -45,7 +45,7 @@ testServer()
+ ${ISTANBUL} cover ${DIR}/server.js --dir ${REPORT_PREFIX}${COUNT} --handle-sigint -- --type $2 -p $3 -t $4 $5 &
+ COUNT=$((COUNT+1))
+ else
+- node ${DIR}/server.js --${1} --type $2 -p $3 -t $4 $5 &
++ nodejs ${DIR}/server.js --${1} --type $2 -p $3 -t $4 $5 &
+ fi
+ SERVERPID=$!
+ sleep 0.1
+@@ -53,7 +53,7 @@ testServer()
+ ${ISTANBUL} cover ${DIR}/client.js --dir ${REPORT_PREFIX}${COUNT} -- --${1} --type $2 -p $3 -t $4 $5 || RET=1
+ COUNT=$((COUNT+1))
+ else
+- node ${DIR}/client.js --${1} --type $2 -p $3 -t $4 $5 || RET=1
++ nodejs ${DIR}/client.js --${1} --type $2 -p $3 -t $4 $5 || RET=1
+ fi
+ kill -2 $SERVERPID || RET=1
+ wait $SERVERPID
+@@ -117,9 +117,9 @@ fi
+
+ # unit tests
+
+-node ${DIR}/binary.test.js || TESTOK=1
+-node ${DIR}/int64.test.js || TESTOK=1
+-node ${DIR}/deep-constructor.test.js || TESTOK=1
++nodejs ${DIR}/binary.test.js || TESTOK=1
++nodejs ${DIR}/int64.test.js || TESTOK=1
++nodejs ${DIR}/deep-constructor.test.js || TESTOK=1
+
+ # integration tests
+
--- /dev/null
+##link_with_zlib.patch
+#no_pom.patch
+node_is_nodejs.patch
+no_bundler_use.patch
+golang_dependency_installed.patch
+broken_boost_1.62.patch
+disable_TLSv1_0_and_TLSv1_1.patch
+no_shmem.patch
+#golang_1.10_fix.patch
+disable_failing_tests.patch
+#go_test_fail_on_busy_machine.patch
+no_composer_install.patch
+disable_php_testing.patch
+no_go_race.patch
+no_gradlew.patch
+add_missing_test_files.patch
+missing_go_test.patch
+link_tests_atomic.patch
+Fix_wrong_int_to_string_conversions.patch
+THRIFT-5322.patch
+THRIFT-5318_support_php8.patch
--- /dev/null
+etc/php.d/thrift_protocol.ini /etc/php/7.3/mods-available/
+usr/lib/php/
--- /dev/null
+usr/lib/python3/*-packages/*.egg-info
+usr/lib/python3/*-packages/thrift/
--- /dev/null
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# for Java install
+#export CLASSPATH=/usr/share/java/commons-codec.jar:/usr/share/java/commons-logging.jar:/usr/share/java/slf4j-simple.jar:/usr/share/java/slf4j-api.jar:/usr/share/java/servlet-api-3.1.jar:/usr/share/java/httpcore.jar:/usr/share/java/httpclient.jar:/usr/share/java/junit4.jar:/usr/share/java/ant-junit.jar:.
+
+export DEB_LDFLAGS_MAINT_STRIP = -Wl,-Bsymbolic-functions
+
+ifneq (,$(filter $(DEB_HOST_ARCH), armel mipsel))
+ export DEB_LDFLAGS_MAINT_APPEND += -Wl,--no-as-needed -latomic -Wl,--as-needed
+endif
+
+# Go 1.16 expects a go.mod file by default and thrift Go extension does not
+# contain that, let's turn it off for now.
+export GO111MODULE=off
+
+# for Go install
+export DH_GOPKG=thrift
+export XDG_CACHE_HOME=$(CURDIR)/go-cache/
+
+# for Ruby install
+export DESTDIR=$(CURDIR)/debian/tmp/
+
+#export JAVA_PREFIX=/usr/share/java/
+export PERL_PREFIX=/usr/
+export INSTALLDIRS=vendor
+
+export QT_SELECT=qt5
+
+# Set install Perl locations
+ARCHLIB := $(shell perl -MConfig -e 'print $$Config{vendorarch}')
+
+RUBY_LIBDIR := $(shell ruby -rrbconfig -e'print RbConfig::CONFIG["vendordir"]')
+
+PYTHON3_VERSIONS = $(shell py3versions -r)
+
+override_dh_autoreconf:
+ $(CURDIR)/bootstrap.sh
+
+override_dh_auto_clean:
+ $(RM) -r $(CURDIR)/go-cache/
+ $(RM) $(CURDIR)/test/go/genmock.sh
+ $(RM) -r $(CURDIR)/lib/py/build/ \
+ $(CURDIR)/lib/py/thrift.egg-info/
+ $(RM) $(CURDIR)/test/go/src/github.com \
+ $(CURDIR)/test/go/src/golang.org/x/tools \
+ $(CURDIR)/test/go/src/golang.org/x/net \
+ $(CURDIR)/lib/go/test/gopath/src/golang.org/x/net \
+ $(CURDIR)/lib/go/test/gopath/src/github.com/golang/mock
+ [ ! -f Makefile ] || $(MAKE) clean
+ cd $(CURDIR)/lib/php/src/ext/thrift_protocol/ && phpize --clean
+ find $(CURDIR) \( -name Makefile -o -name Makefile.in \) -exec rm {} \;
+ find $(CURDIR) -name .dirstamp -exec rm {} \;
+ $(RM) aclocal.m4 config.h config.log config.status configure \
+ configure.scan libtool stamp-h1 \
+ lib/cpp/*.pc lib/c_glib/thrift_c_glib.pc
+ $(RM) compiler/cpp/src/thrift/version.h \
+ lib/c_glib/src/thrift/config.h \
+ lib/c_glib/src/thrift/stamp-h3 \
+ lib/cpp/src/thrift/config.h \
+ lib/cpp/src/thrift/stamp-h2 \
+ lib/cpp/test/tests.xml
+ $(RM) autoscan.log config.hin
+# jh_clean
+ # let dh clean
+ dh_auto_clean
+
+override_dh_auto_configure:
+ dh_auto_configure -- \
+ --with-cpp --with-c_glib --with-php --with-php_extension \
+ --with-perl --without-python --with-py3 --without-java \
+ --without-nodejs --without-erlang --without-lua \
+ --with-go --with-ruby \
+ --with-qt4=no --with-qt5=yes \
+ --without-rust \
+ --disable-tutorial
+
+override_dh_auto_build:
+# mkdir -p $(CURDIR)/lib/java/build/lib/
+ # symlinks for Go build
+ mkdir -p $(CURDIR)/lib/go/test/gopath/src/
+ ln -s /usr/share/gocode/src/github.com \
+ $(CURDIR)/test/go/src/
+ mkdir -p $(CURDIR)/lib/go/test/gopath/src/golang.org/x/
+ ln -s /usr/share/gocode/src/golang.org/x/net \
+ $(CURDIR)/lib/go/test/gopath/src/golang.org/x/
+
+ dh_auto_build --no-parallel
+ set -ex; cd lib/py && for python in $(PYTHON3_VERSIONS); do \
+ $$python setup.py build; \
+ done
+# jh_build thrift.jar $(CURDIR)/lib/java/src/
+
+override_dh_auto_install:
+ dh_auto_install -- INSTALLDIRS=vendor
+ set -ex; cd lib/py && for python in $(PYTHON3_VERSIONS); do \
+ $$python setup.py install --install-layout=deb --root=$(CURDIR)/debian/tmp; \
+ done
+# jh_installlibs -plibthrift-java thrift.jar
+# jh_installjavadoc
+# jh_depends
+
+ find $(CURDIR)/debian/tmp/ -name \*.la -exec rm {} \;
+
+override_dh_missing:
+ dh_missing --list-missing
+
+override_dh_auto_test:
+ cd $(CURDIR)/lib/c_glib/test/ && \
+ $(MAKE) gen-c_glib/t_test_enum_test_types.h
+ mkdir -p $(CURDIR)/vendor/bin/
+ ln -s /usr/bin/phpunit $(CURDIR)/vendor/bin/
+ ln -s $(CURDIR)/lib/php/src/autoload.php $(CURDIR)/vendor/
+ touch $(CURDIR)/test/go/genmock.sh
+ mkdir -p $(CURDIR)/lib/go/test/gopath/src/github.com/golang/
+ mkdir -p $(CURDIR)/test/go/src/golang.org/x/
+ # symlinks for Go testing
+ ln -s /usr/share/gocode/src/github.com/golang/mock \
+ $(CURDIR)/lib/go/test/gopath/src/github.com/golang/
+ ln -s /usr/share/gocode/src/golang.org/x/tools \
+ $(CURDIR)/test/go/src/golang.org/x/
+ ln -s /usr/share/gocode/src/golang.org/x/net/ \
+ $(CURDIR)/test/go/src/golang.org/x/
+ dh_auto_test --no-parallel
+
+%:
+ dh $@ --with python3,ruby,phpcomposer
+
+.PHONY: override_dh_autoreconf override_dh_auto_clean \
+ override_dh_auto_configure override_dh_auto_install \
+ override_dh_missing override_dh_auto_test
--- /dev/null
+3.0 (quilt)
--- /dev/null
+# Long lines only
+source-is-missing lib/js/test/phantom-client.js line 302 is 1532 characters long (>512)
+source-is-missing lib/js/test/test-async.js line 300 is 1534 characters long (>512)
+source-is-missing lib/js/test/test-es6.js line 305 is 1534 characters long (>512)
+source-is-missing lib/js/test/test.js line 290 is 1534 characters long (>512)
+
+# Only one file, not the whole source
+thrift source: license-problem-php-license debian/copyright
--- /dev/null
+tutorial/tutorial.thrift
+tutorial/shared.thrift
--- /dev/null
+debian/thrift.1
--- /dev/null
+.TH "THRIFT" "1" "July 9, 2012" "thrift-compiler" "thrift"
+.SH NAME
+thrift \ - code generator/compiler for Thrift IDL
+.SH SYNOPSIS
+.B thrift
+[options] \fIsource_file\fR
+.SH DESCRIPTION
+Thrift is a framework for efficient serialization and RPC services. The
+.B thrift
+compiler accepts a source file containing definitions of Thrift structs and services,
+and generates the language-specific code to implement them.
+.SH OPTIONS
+.TP
+\fB\-version\fR
+.RS 4
+print the compiler version and exit
+.RE
+.TP
+\fB\-o DIRECTORY\fR
+.RS 4
+Set the output directory for gen-* packages (default: current directory)
+.RE
+.TP
+\fB\-out DIRECTORY\fR
+.RS 4
+Set the ouput location for generated files. (no gen-* folder will be created)
+.RE
+.TP
+\fB\-I DIRECTORY\fR
+.RS 4
+Add a directory to the list of directories searched for include directives
+.RE
+.TP
+\fB\-nowarn\fR
+.RS 4
+Suppress all compiler warnings (BAD!)
+.RE
+.TP
+\fB\-strict\fR
+.RS 4
+Strict compiler warnings on
+.RE
+.TP
+\fB\-v[erbose]\fR
+.RS 4
+Verbose mode
+.RE
+.TP
+\fB\-r[ecurse]\fR
+.RS 4
+Also generate included files
+.RE
+.TP
+\fB\-debug\fR
+.RS 4
+Parse debug trace to stdout
+.RE
+.TP
+\fB\-\-gen STRING\fR
+.RS 4
+Generate code with a dynamically-registered generator. STRING has the form
+language[:key1=val1[,key2,[key3=val3]]]. Keys and values are options passed to
+the generator. Many options will not require values. For a complete list of
+supported generators, run
+.B thrift
+without arguments.
+.RE
+.SH AUTHOR
+Thrift is a top-level project of the Apache Software Foundation, (see
+http://thrift.apache.org).
+.PP
+This manual page was written by Eric Evans <eevans@debian.org> for the Debian
+system (but may be used by others). Permission is granted to copy, distribute
+and/or modify this document under the terms of the GNU General Public License,
+Version 2 or any later version published by the Free Software Foundation.
+.PP
+On Debian systems, the complete text of the GNU General Public License can be
+found in /usr/share/common-licenses/GPL.
--- /dev/null
+version=3
+https://thrift.apache.org/download .*/thrift-(\d[\d\.]+)\.(?:tgz|tar\.(?:gz|bz2|xz))