mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 16:57:49 +03:00
46890ae1ec
Summary: Merge the fb-mercurial code into the Eden repository, under the `eden/scm` subdirectory. Reviewed By: quark-zju Differential Revision: D18445774 fbshipit-source-id: fc3307f9937e0c7e1c8f7d03c5102c4fe5dedb10
104 lines
3.0 KiB
C++
104 lines
3.0 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This software may be used and distributed according to the terms of the
|
|
* GNU General Public License version 2.
|
|
*/
|
|
#include "RevisionStore.h"
|
|
using namespace facebook::eden;
|
|
|
|
// The following functions are exported from this rust library:
|
|
// @dep=//eden/scm/lib/revisionstore:revisionstore
|
|
|
|
namespace {
|
|
struct ByteData {
|
|
const uint8_t* ptr;
|
|
size_t len;
|
|
};
|
|
|
|
struct GetData {
|
|
RevisionStoreByteVecStruct* value;
|
|
RevisionStoreStringStruct* error;
|
|
bool is_key_error;
|
|
};
|
|
} // namespace
|
|
|
|
extern "C" DataPackUnionStruct* revisionstore_datapackunion_new(
|
|
const char* const paths[],
|
|
size_t num_paths) noexcept;
|
|
extern "C" void revisionstore_datapackunion_free(
|
|
DataPackUnionStruct* store) noexcept;
|
|
extern "C" GetData revisionstore_datapackunion_get(
|
|
DataPackUnionStruct* store,
|
|
const uint8_t* name,
|
|
size_t name_len,
|
|
const uint8_t* hgid,
|
|
size_t hgid_len) noexcept;
|
|
|
|
extern "C" void revisionstore_string_free(
|
|
RevisionStoreStringStruct* str) noexcept;
|
|
extern "C" ByteData revisionstore_string_data(
|
|
RevisionStoreStringStruct* str) noexcept;
|
|
|
|
extern "C" void revisionstore_bytevec_free(
|
|
RevisionStoreByteVecStruct* bytes) noexcept;
|
|
extern "C" ByteData revisionstore_bytevec_data(
|
|
RevisionStoreByteVecStruct* bytes) noexcept;
|
|
|
|
namespace facebook {
|
|
namespace eden {
|
|
|
|
void DataPackUnion::Deleter::operator()(DataPackUnionStruct* ptr) const
|
|
noexcept {
|
|
revisionstore_datapackunion_free(ptr);
|
|
}
|
|
|
|
DataPackUnion::DataPackUnion(const char* const paths[], size_t num_paths)
|
|
: store_(revisionstore_datapackunion_new(paths, num_paths)) {}
|
|
|
|
folly::Optional<RevisionStoreByteVec> DataPackUnion::get(
|
|
folly::ByteRange name,
|
|
folly::ByteRange hgid) {
|
|
// This implementation is strongly coupled to that of
|
|
// revisionstore_datapackunion_get in eden/scm/lib/revisionstore/src/c_api.rs
|
|
auto got = revisionstore_datapackunion_get(
|
|
store_.get(), name.data(), name.size(), hgid.data(), hgid.size());
|
|
if (got.value) {
|
|
return RevisionStoreByteVec(got.value);
|
|
}
|
|
if (got.is_key_error) {
|
|
return folly::none;
|
|
}
|
|
RevisionStoreString error(got.error);
|
|
throw DataPackUnionGetError(error.stringPiece().str());
|
|
}
|
|
|
|
RevisionStoreString::RevisionStoreString(RevisionStoreStringStruct* ptr)
|
|
: ptr_(ptr) {}
|
|
|
|
void RevisionStoreString::Deleter::operator()(
|
|
RevisionStoreStringStruct* ptr) const noexcept {
|
|
revisionstore_string_free(ptr);
|
|
}
|
|
|
|
folly::StringPiece RevisionStoreString::stringPiece() const noexcept {
|
|
auto data = revisionstore_string_data(ptr_.get());
|
|
return folly::StringPiece(reinterpret_cast<const char*>(data.ptr), data.len);
|
|
}
|
|
|
|
RevisionStoreByteVec::RevisionStoreByteVec(RevisionStoreByteVecStruct* ptr)
|
|
: ptr_(ptr) {}
|
|
|
|
void RevisionStoreByteVec::Deleter::operator()(
|
|
RevisionStoreByteVecStruct* ptr) const noexcept {
|
|
revisionstore_bytevec_free(ptr);
|
|
}
|
|
|
|
folly::ByteRange RevisionStoreByteVec::bytes() const noexcept {
|
|
auto data = revisionstore_bytevec_data(ptr_.get());
|
|
return folly::ByteRange(data.ptr, data.len);
|
|
}
|
|
|
|
} // namespace eden
|
|
} // namespace facebook
|