public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Peter Lemenkov <lemenkov@gmail.com>
To: git-commits@fedoraproject.org
Subject: [rpms/erlang-ebloom] rawhide: Fix FTBFS
Date: Wed, 29 Jul 2026 15:21:07 GMT [thread overview]
Message-ID: <178533846733.1.118896005274959705.rpms-erlang-ebloom-1b39c5c8f4f4@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/erlang-ebloom
Branch : rawhide
Commit : 1b39c5c8f4f486106fc84f3c9129cda55817778f
Author : Peter Lemenkov <lemenkov@gmail.com>
Date : 2026-07-29T17:13:32+02:00
Stats : +590/-1 in 3 file(s)
URL : https://src.fedoraproject.org/rpms/erlang-ebloom/c/1b39c5c8f4f486106fc84f3c9129cda55817778f?branch=rawhide
Log:
Fix FTBFS
Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
---
diff --git a/erlang-ebloom-0001-bloom_filter-replace-custom-serializer-with-portable.patch b/erlang-ebloom-0001-bloom_filter-replace-custom-serializer-with-portable.patch
new file mode 100644
index 0000000..1e24b59
--- /dev/null
+++ b/erlang-ebloom-0001-bloom_filter-replace-custom-serializer-with-portable.patch
@@ -0,0 +1,441 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Peter Lemenkov <lemenkov@gmail.com>
+Date: Wed, 29 Jul 2026 16:13:19 +0200
+Subject: [PATCH] bloom_filter: replace custom serializer with portable
+ fixed-width I/O
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The previous serialization was built on a custom serializer class with
+several issues: an off-by-one bug (buffer_ initialized to
+original_buffer_ + 1 leaving the first byte uninitialized), native byte
+order writes making the format platform-specific, and use of size_t
+whose width varies between 32-bit and 64-bit platforms.
+
+These issues were masked on x86_64 by consistent allocator behaviour but
+manifested as a test failure on s390x (big-endian) with newer GCC.
+
+Replace serializer.hpp with simple portable read_*/write_* primitives
+using fixed-width types (uint32_t, uint64_t) and explicit big-endian
+byte order (htobe64/be64toh, htonl/ntohl). All size_t fields are now
+serialized as uint64_t ensuring cross-platform compatibility.
+
+Drop erl_nif_compat.h — compatibility shims for pre-R14B NIF API no
+longer needed with modern Erlang/OTP.
+
+Addresses the upstream TODO: "Make this format platform independent!"
+
+Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
+Assisted-by: Claude (Anthropic) <https://claude.ai>
+
+diff --git a/c_src/bloom_filter.hpp b/c_src/bloom_filter.hpp
+index 724643f..be625ab 100644
+--- a/c_src/bloom_filter.hpp
++++ b/c_src/bloom_filter.hpp
+@@ -276,72 +276,67 @@ public:
+
+ const cell_type* table() const { return bit_table_; }
+
+- inline size_t serialized_size() const
++ inline size_t serialized_size() const
+ {
+- return ((table_size_/bits_per_char)+(5*sizeof(size_t) + sizeof(double))+(salt_.size()*sizeof(bloom_type)));
++ return sizeof(uint64_t) * 5 // salt_count_, table_size_,
++ // predicted_element_count_,
++ // inserted_element_count_,
++ // random_seed_
++ + sizeof(uint64_t) // desired_false_positive_probability_
++ + sizeof(uint32_t) * salt_.size() // salt entries
++ + (table_size_ / bits_per_char); // bit_table_
+ }
+
+- inline void serialize(unsigned char** data, unsigned int* len)
++ inline void serialize(unsigned char* p)
+ {
+- // TODO: Make this format platform independent!
+- size_t buf_sz = serialized_size();
+- char *buffer = new char[ buf_sz ];
+- serializer s(buffer, buf_sz);
+- s.clear();
++ write_u64(p, (uint64_t)salt_count_);
++ write_u64(p, (uint64_t)table_size_);
++ write_u64(p, (uint64_t)predicted_element_count_);
++ write_u64(p, (uint64_t)inserted_element_count_);
++ write_u64(p, (uint64_t)random_seed_);
++ write_f64(p, desired_false_positive_probability_);
+
+- s << salt_count_;
+- s << table_size_;
+- s << predicted_element_count_;
+- s << inserted_element_count_;
+- s << random_seed_;
+- s << desired_false_positive_probability_;
+-
+- for(std::vector<bloom_type>::iterator it = salt_.begin(); it != salt_.end(); ++it)
+- {
+- s << *it;
+- }
+- for(std::size_t i=0; i<(table_size_ / bits_per_char); i++) {
+- s << bit_table_[i];
+- }
+- *len = s.length();
+- s.write_to_buffer(reinterpret_cast<char *>(*data));
+- delete[] buffer;
++ for (std::vector<bloom_type>::iterator it = salt_.begin(); it != salt_.end(); ++it)
++ {
++ write_u32(p, (uint32_t)*it);
++ }
++
++ for (std::size_t i = 0; i < (table_size_ / bits_per_char); i++)
++ {
++ write_u8(p, bit_table_[i]);
++ }
+ }
+
+ static bloom_filter* deserialize(unsigned char* data, unsigned int len)
+ {
+- std::size_t table_size_;
+- std::size_t salt_count_;
+- std::size_t predicted_element_count_;
+- std::size_t inserted_element_count_;
+- std::size_t random_seed_;
+- double desired_false_positive_probability_;
+-
+- serializer s((char*)data, len);
+- s.reset();
+-
+- s >> salt_count_;
+- s >> table_size_;
+- s >> predicted_element_count_;
+- s >> inserted_element_count_;
+- s >> random_seed_;
+- s >> desired_false_positive_probability_;
+- bloom_filter* filter = new bloom_filter(predicted_element_count_,
+- desired_false_positive_probability_,
+- random_seed_);
+-
+- filter->table_size_ = table_size_;
+- filter->salt_count_ = salt_count_;
+- filter->inserted_element_count_ = inserted_element_count_;
+-
+- for (std::size_t i=0; i<salt_count_; i++) {
+- s >> filter->salt_[i];
+- }
+- for (std::size_t i=0; i<(table_size_ / bits_per_char); i++) {
+- s >> filter->bit_table_[i];
+- }
+-
+- return filter;
++ const unsigned char* p = data;
++
++ std::size_t salt_count_ = (std::size_t)read_u64(p);
++ std::size_t table_size_ = (std::size_t)read_u64(p);
++ std::size_t predicted_element_count_ = (std::size_t)read_u64(p);
++ std::size_t inserted_element_count_ = (std::size_t)read_u64(p);
++ std::size_t random_seed_ = (std::size_t)read_u64(p);
++ double desired_false_positive_probability_ = read_f64(p);
++
++ bloom_filter* filter = new bloom_filter(predicted_element_count_,
++ desired_false_positive_probability_,
++ random_seed_);
++
++ filter->table_size_ = table_size_;
++ filter->salt_count_ = salt_count_;
++ filter->inserted_element_count_ = inserted_element_count_;
++
++ for (std::size_t i = 0; i < salt_count_; i++)
++ {
++ filter->salt_[i] = (bloom_type)read_u32(p);
++ }
++
++ for (std::size_t i = 0; i < (table_size_ / bits_per_char); i++)
++ {
++ filter->bit_table_[i] = read_u8(p);
++ }
++
++ return filter;
+ }
+
+ protected:
+diff --git a/c_src/ebloom_nifs.cpp b/c_src/ebloom_nifs.cpp
+index 206bbd8..8ecbcaa 100644
+--- a/c_src/ebloom_nifs.cpp
++++ b/c_src/ebloom_nifs.cpp
+@@ -244,8 +244,9 @@ ERL_NIF_TERM ebloom_serialize(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
+ if (enif_get_resource(env, argv[0], BLOOM_FILTER_RESOURCE, (void**)&handle))
+ {
+ ErlNifBinary bin;
+- enif_alloc_binary_compat(env, handle->filter->serialized_size(), &bin);
+- handle->filter->serialize(&bin.data, (unsigned int *)&bin.size);
++ size_t sz = handle->filter->serialized_size();
++ enif_alloc_binary_compat(env, sz, &bin);
++ handle->filter->serialize(bin.data);
+ return enif_make_binary(env, &bin);
+ }
+ else
+diff --git a/c_src/serializer.hpp b/c_src/serializer.hpp
+index 2c4aaed..a661fc9 100644
+--- a/c_src/serializer.hpp
++++ b/c_src/serializer.hpp
+@@ -1,199 +1,62 @@
+ /*
+- **************************************************************************
+- * *
+- * Binary Data Serializer Library *
+- * *
+- * Author: Arash Partow - 2001 *
+- * URL: http://www.partow.net *
+- * *
+- * Copyright notice: *
+- * Free use of the Binary Data Serializer Library is permitted under the *
+- * guidelines and in accordance with the most current version of the *
+- * Common Public License. *
+- * http://www.opensource.org/licenses/cpl.php *
+- * *
+- **************************************************************************
+-*/
+-
+-#ifndef INCLUDE_SERIALIZER_HPP
+-#define INCLUDE_SERIALIZER_HPP
+-
+-
+-#include <iostream>
+-#include <string>
+-#include <algorithm>
+-#include <fstream>
+-
+-
+-class serializer
+-{
+-public:
+-
+- serializer(char* buffer, const unsigned int& buffer_length)
+- : original_buffer_(buffer),
+- buffer_(buffer + 1),
+- buffer_length_(buffer_length)
+- {
+- }
+-
+- void reset()
+- {
+- written_buffer_size_ = 0;
+- read_buffer_size_ = 0;
+- buffer_ = original_buffer_;
+- }
+-
+- void clear()
+- {
+- reset();
+- for(unsigned int i = 0; i < buffer_length_; ++i)
+- {
+- buffer_[i] = 0;
+- }
+- }
+-
+- void delete_internal_buffer()
+- {
+- delete[] original_buffer_;
+- original_buffer_ = 0;
+- buffer_ = 0;
+- }
+-
+- unsigned int length() { return written_buffer_size_; }
+-
+- template<typename T> inline bool operator >> (T& output) { return read (output); }
+- template<typename T> inline bool operator << (T& output) { return write(output); }
+-
+- inline bool read(char& output) { return read_pod(output); }
+- inline bool read(int& output) { return read_pod(output); }
+- inline bool read(unsigned int& output) { return read_pod(output); }
+- inline bool read(float& output) { return read_pod(output); }
+- inline bool read(double& output) { return read_pod(output); }
+- inline bool read(long unsigned int& output) { return read_pod(output); }
+- inline bool read(unsigned char& output) { return read_pod(output); }
+-
+- inline bool read(std::string& output)
+- {
+- unsigned int length = 0;
+- if (!read_pod(length))
+- {
+- return false;
+- }
+-
+- if ((length + sizeof(unsigned int) + read_buffer_size_) > buffer_length_)
+- {
+- return false;
+- }
+- output.resize(length);
+- std::copy(buffer_, buffer_ + length,output.begin());
+- buffer_ += length;
+- read_buffer_size_ += length;
+- return true;
+- }
+-
+- inline bool write(const char& input) { return write_pod(input); }
+- inline bool write(const int& input) { return write_pod(input); }
+- inline bool write(const unsigned int& input) { return write_pod(input); }
+- inline bool write(const float& input) { return write_pod(input); }
+- inline bool write(const double& input) { return write_pod(input); }
+- inline bool write(const short& input) { return write_pod(input); }
+- inline bool write(const long unsigned int& input) { return write_pod(input); }
+- inline bool write(const unsigned char& input) { return write_pod(input); }
+-
+- inline bool write(std::string& input)
+- {
+- return write(input.c_str(),static_cast<unsigned int>(input.size()));
+- }
+-
+- inline bool write(const char* data, unsigned int length)
+- {
+- if ((length + sizeof(unsigned int) + written_buffer_size_) > buffer_length_)
+- {
+- return false;
+- }
+- write(length);
+- std::copy(data,data + length,buffer_);
+- buffer_ += length;
+- written_buffer_size_ += length;
+- return true;
+- }
+-
+- inline void write_to_stream(std::ofstream& stream)
+- {
+- stream.write(original_buffer_,written_buffer_size_);
+- }
+-
+- inline void read_from_stream(std::ifstream& stream, const unsigned int length)
+- {
+- if (length > buffer_length_)
+- {
+- return;
+- }
+- stream.read(original_buffer_,length);
+- }
+-
+- inline void write_to_buffer(char data[])
+- {
+- std::copy(original_buffer_,original_buffer_ + written_buffer_size_,data);
+- }
+-
+- inline void read_from_buffer(const char data[], const unsigned int& length)
+- {
+- if (length > buffer_length_)
+- {
+- return;
+- }
+- std::copy(data,data + length,original_buffer_);
+- }
+-
+-private:
+-
+- serializer();
+- serializer(const serializer& s);
+- serializer& operator=(const serializer& s);
+-
+- template<typename T>
+- inline bool write_pod(const T& data)
+- {
+- const unsigned int data_length = sizeof(T);
+- if ((data_length + written_buffer_size_) > buffer_length_)
+- {
+- return false;
+- }
+- const char* ptr = reinterpret_cast<const char*>(&data);
+- const char* end = reinterpret_cast<const char*>(&data) + sizeof(T);
+- for(; ptr != end; ++buffer_, ++ptr)
+- {
+- *buffer_ = *ptr;
+- }
+- written_buffer_size_ += data_length;
+- return true;
+- }
+-
+- template<typename T>
+- inline bool read_pod(T& data)
+- {
+- const unsigned int data_length = sizeof(T);
+- if ((data_length + read_buffer_size_) > buffer_length_)
+- {
+- return false;
+- }
+- char* ptr = reinterpret_cast<char*>(&data);
+- char* end = reinterpret_cast<char*>(&data) + sizeof(T);
+- for(; ptr != end; ++buffer_, ++ptr)
+- {
+- *ptr = *buffer_;
+- }
+- read_buffer_size_ += data_length;
+- return true;
+- }
+-
+- char* original_buffer_;
+- char* buffer_;
+- unsigned int buffer_length_;
+- unsigned int written_buffer_size_;
+- unsigned int read_buffer_size_;
+-};
+-
+-#endif
+-
++ * SPDX-FileCopyrightText: © 2026 Peter Lemenkov
++ * SPDX-License-Identifier: Apache-2.0
++ */
++
++#ifndef EBLOOM_SERIALIZER_HPP
++#define EBLOOM_SERIALIZER_HPP
++
++#include <arpa/inet.h>
++#include <stdint.h>
++#include <cstring>
++
++/* Portable write helpers — always big-endian on wire */
++static void write_u64(unsigned char*& p, uint64_t v) {
++ v = htobe64(v);
++ memcpy(p, &v, 8);
++ p += 8;
++}
++
++static void write_u32(unsigned char*& p, uint32_t v) {
++ v = htonl(v);
++ memcpy(p, &v, 4);
++ p += 4;
++}
++
++static void write_f64(unsigned char*& p, double v) {
++ uint64_t bits;
++ memcpy(&bits, &v, 8);
++ write_u64(p, bits);
++}
++
++static void write_u8(unsigned char*& p, unsigned char v) {
++ *p++ = v;
++}
++
++/* Read helpers */
++static uint64_t read_u64(const unsigned char*& p) {
++ uint64_t v;
++ memcpy(&v, p, 8);
++ p += 8;
++ return be64toh(v);
++}
++
++static uint32_t read_u32(const unsigned char*& p) {
++ uint32_t v;
++ memcpy(&v, p, 4);
++ p += 4;
++ return ntohl(v);
++}
++
++static double read_f64(const unsigned char*& p) {
++ uint64_t bits = read_u64(p);
++ double v;
++ memcpy(&v, &bits, 8);
++ return v;
++}
++
++static unsigned char read_u8(const unsigned char*& p) {
++ return *p++;
++}
++
++#endif // EBLOOM_SERIALIZER_HPP
diff --git a/erlang-ebloom-0002-Drop-compat-script.patch b/erlang-ebloom-0002-Drop-compat-script.patch
new file mode 100644
index 0000000..34e9026
--- /dev/null
+++ b/erlang-ebloom-0002-Drop-compat-script.patch
@@ -0,0 +1,146 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Peter Lemenkov <lemenkov@gmail.com>
+Date: Wed, 29 Jul 2026 16:22:21 +0200
+Subject: [PATCH] Drop compat script
+
+Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
+
+diff --git a/c_src/ebloom_nifs.cpp b/c_src/ebloom_nifs.cpp
+index 8ecbcaa..7f9df62 100644
+--- a/c_src/ebloom_nifs.cpp
++++ b/c_src/ebloom_nifs.cpp
+@@ -18,8 +18,8 @@
+ //
+ // -------------------------------------------------------------------
+
++#include <erl_nif.h>
+ #include "ebloom_nifs.h"
+-#include "erl_nif_compat.h"
+ #include "bloom_filter.hpp"
+
+ static ErlNifResourceType* BLOOM_FILTER_RESOURCE;
+@@ -81,13 +81,13 @@ ERL_NIF_TERM ebloom_new_filter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv
+ enif_get_double(env, argv[1], &false_positive_probability) &&
+ enif_get_long(env, argv[2], &random_seed))
+ {
+- bhandle* handle = (bhandle*)enif_alloc_resource_compat(env, BLOOM_FILTER_RESOURCE,
++ bhandle* handle = (bhandle*)enif_alloc_resource(BLOOM_FILTER_RESOURCE,
+ sizeof(bhandle));
+ handle->filter = new bloom_filter(predicted_element_count,
+ false_positive_probability,
+ random_seed);
+ ERL_NIF_TERM result = enif_make_resource(env, handle);
+- enif_release_resource_compat(env, handle);
++ enif_release_resource(handle);
+ return enif_make_tuple2(env, enif_make_atom(env, "ok"), result);
+ }
+ else
+@@ -245,7 +245,7 @@ ERL_NIF_TERM ebloom_serialize(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
+ {
+ ErlNifBinary bin;
+ size_t sz = handle->filter->serialized_size();
+- enif_alloc_binary_compat(env, sz, &bin);
++ enif_alloc_binary(sz, &bin);
+ handle->filter->serialize(bin.data);
+ return enif_make_binary(env, &bin);
+ }
+@@ -260,11 +260,11 @@ ERL_NIF_TERM ebloom_deserialize(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
+ ErlNifBinary bin;
+ if (enif_inspect_binary(env, argv[0], &bin))
+ {
+- bhandle* handle = (bhandle*)enif_alloc_resource_compat(env, BLOOM_FILTER_RESOURCE,
++ bhandle* handle = (bhandle*)enif_alloc_resource(BLOOM_FILTER_RESOURCE,
+ sizeof(bhandle));
+ handle->filter = bloom_filter::deserialize(bin.data, bin.size);
+ ERL_NIF_TERM result = enif_make_resource(env, handle);
+- enif_release_resource_compat(env, handle);
++ enif_release_resource(handle);
+ return enif_make_tuple2(env, enif_make_atom(env, "ok"), result);
+ }
+ else
+@@ -282,7 +282,7 @@ void ebloom_filter_dtor(ErlNifEnv* env, void* arg)
+ int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+ {
+ ErlNifResourceFlags flags = (ErlNifResourceFlags)(ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER);
+- BLOOM_FILTER_RESOURCE = enif_open_resource_type_compat(env, "bloom_filter_resource",
++ BLOOM_FILTER_RESOURCE = enif_open_resource_type(env, NULL, "bloom_filter_resource",
+ &ebloom_filter_dtor,
+ flags,
+ 0);
+diff --git a/c_src/erl_nif_compat.h b/c_src/erl_nif_compat.h
+deleted file mode 100644
+index b464c23..0000000
+--- a/c_src/erl_nif_compat.h
++++ /dev/null
+@@ -1,71 +0,0 @@
+-/* Copyright (c) 2010-2011 Basho Technologies, Inc.
+- *
+- * This file is provided 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.
+-*/
+-
+-#ifndef ERL_NIF_COMPAT_H_
+-#define ERL_NIF_COMPAT_H_
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif /* __cplusplus */
+-
+-#include "erl_nif.h"
+-
+-#if ERL_NIF_MAJOR_VERSION == 1 && ERL_NIF_MINOR_VERSION == 0
+-
+-#define enif_open_resource_type_compat enif_open_resource_type
+-#define enif_alloc_resource_compat enif_alloc_resource
+-#define enif_release_resource_compat enif_release_resource
+-#define enif_alloc_binary_compat enif_alloc_binary
+-#define enif_alloc_compat enif_alloc
+-#define enif_free_compat enif_free
+-#define enif_cond_create erl_drv_cond_create
+-#define enif_cond_destroy erl_drv_cond_destroy
+-#define enif_cond_signal erl_drv_cond_signal
+-#define enif_cond_broadcast erl_drv_cond_broadcast
+-#define enif_cond_wait erl_drv_cond_wait
+-#define ErlNifCond ErlDrvCond
+-#endif /* R13B04 */
+-
+-#if ERL_NIF_MAJOR_VERSION == 2 && ERL_NIF_MINOR_VERSION >= 0
+-
+-#define enif_open_resource_type_compat(E, N, D, F, T) \
+- enif_open_resource_type(E, NULL, N, D, F, T)
+-
+-#define enif_alloc_resource_compat(E, T, S) \
+- enif_alloc_resource(T, S)
+-
+-#define enif_release_resource_compat(E, H) \
+- enif_release_resource(H)
+-
+-#define enif_alloc_binary_compat(E, S, B) \
+- enif_alloc_binary(S, B)
+-
+-#define enif_alloc_compat(E, S) \
+- enif_alloc(S)
+-
+-#define enif_free_compat(E, P) \
+- enif_free(P)
+-
+-#endif /* R14 */
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif /* __cplusplus */
+-
+-#endif /* ERL_NIF_COMPAT_H_ */
diff --git a/erlang-ebloom.spec b/erlang-ebloom.spec
index adaa52a..4085cdb 100644
--- a/erlang-ebloom.spec
+++ b/erlang-ebloom.spec
@@ -9,7 +9,9 @@ Summary: A NIF wrapper around a basic bloom filter
License: Apache-2.0 AND CPL-1.0
URL: https://github.com/basho/%{realname}
VCS: git:%{url}.git
-Source0: %{url}/archive/%{version}/%{realname}-%{version}.tar.gz
+Source: %{url}/archive/%{version}/%{realname}-%{version}.tar.gz
+Patch: erlang-ebloom-0001-bloom_filter-replace-custom-serializer-with-portable.patch
+Patch: erlang-ebloom-0002-Drop-compat-script.patch
BuildRequires: erlang-rebar3-pc
BuildRequires: gcc-c++
BuildSystem: rebar3
reply other threads:[~2026-07-29 15:21 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=178533846733.1.118896005274959705.rpms-erlang-ebloom-1b39c5c8f4f4@fedoraproject.org \
--to=lemenkov@gmail.com \
--cc=git-commits@fedoraproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox