mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 08:47:12 +03:00
caad413499
Summary: This diff implements getBlob on top of the mercurial rust datapack code. It adds a C++ binding on top of the rust code to make it easier to use and hooks it up in the hg backing store. Need to figure this out for our opensource and windows builds: * Need to teach them how to build and link the rust code * need to add a windows version of the methods that accept paths; this is just a matter of adding a WCHAR version of the functions. Reviewed By: strager Differential Revision: D10433450 fbshipit-source-id: 45ce34fb9c383ea6018a0ca858581e0fe11ef3b5
95 lines
2.5 KiB
C++
95 lines
2.5 KiB
C++
// Copyright 2004-present Facebook. All Rights Reserved
|
|
|
|
#include "ConfigParser.h"
|
|
using namespace facebook::eden;
|
|
|
|
// The following functions are exported from this rust library:
|
|
// @dep=//scm/hg/lib/configparser:configparser
|
|
|
|
namespace {
|
|
struct BytesData {
|
|
const uint8_t* ptr;
|
|
size_t len;
|
|
};
|
|
} // namespace
|
|
|
|
extern "C" HgRcConfigSetStruct* hgrc_configset_new(void) noexcept;
|
|
extern "C" void hgrc_configset_free(HgRcConfigSetStruct* configset) noexcept;
|
|
extern "C" HgRcBytesStruct* hgrc_configset_load_path(
|
|
HgRcConfigSetStruct* ptr,
|
|
const char* path) noexcept;
|
|
extern "C" HgRcBytesStruct* hgrc_configset_load_system(
|
|
HgRcConfigSetStruct* ptr) noexcept;
|
|
extern "C" HgRcBytesStruct* hgrc_configset_load_user(
|
|
HgRcConfigSetStruct* ptr) noexcept;
|
|
extern "C" HgRcBytesStruct* hgrc_configset_get(
|
|
HgRcConfigSetStruct* ptr,
|
|
const uint8_t* section,
|
|
size_t section_len,
|
|
const uint8_t* name,
|
|
size_t name_len) noexcept;
|
|
|
|
extern "C" void hgrc_bytes_free(HgRcBytesStruct* bytes) noexcept;
|
|
extern "C" BytesData hgrc_bytes_data(HgRcBytesStruct* bytes) noexcept;
|
|
|
|
namespace facebook {
|
|
namespace eden {
|
|
|
|
HgRcBytes::HgRcBytes(HgRcBytesStruct* ptr) : ptr_(ptr) {}
|
|
|
|
void HgRcBytes::Deleter::operator()(HgRcBytesStruct* ptr) const {
|
|
hgrc_bytes_free(ptr);
|
|
}
|
|
|
|
folly::ByteRange HgRcBytes::bytes() const {
|
|
auto data = hgrc_bytes_data(ptr_.get());
|
|
return folly::ByteRange(data.ptr, data.len);
|
|
}
|
|
|
|
HgRcConfigSet::HgRcConfigSet() : ptr_(hgrc_configset_new()) {}
|
|
|
|
void HgRcConfigSet::Deleter::operator()(HgRcConfigSetStruct* ptr) const {
|
|
hgrc_configset_free(ptr);
|
|
}
|
|
|
|
void HgRcConfigSet::loadPath(const char* path) {
|
|
auto result = hgrc_configset_load_path(ptr_.get(), path);
|
|
if (!result) {
|
|
return;
|
|
}
|
|
HgRcBytes errorText(result);
|
|
throw HgRcConfigError(errorText.stringPiece().str());
|
|
}
|
|
|
|
void HgRcConfigSet::loadSystem() {
|
|
auto result = hgrc_configset_load_system(ptr_.get());
|
|
if (!result) {
|
|
return;
|
|
}
|
|
HgRcBytes errorText(result);
|
|
throw HgRcConfigError(errorText.stringPiece().str());
|
|
}
|
|
|
|
void HgRcConfigSet::loadUser() {
|
|
auto result = hgrc_configset_load_user(ptr_.get());
|
|
if (!result) {
|
|
return;
|
|
}
|
|
HgRcBytes errorText(result);
|
|
throw HgRcConfigError(errorText.stringPiece().str());
|
|
}
|
|
|
|
folly::Optional<HgRcBytes> HgRcConfigSet::get(
|
|
folly::ByteRange section,
|
|
folly::ByteRange name) const noexcept {
|
|
auto result = hgrc_configset_get(
|
|
ptr_.get(), section.data(), section.size(), name.data(), name.size());
|
|
if (result) {
|
|
return HgRcBytes(result);
|
|
}
|
|
return folly::none;
|
|
}
|
|
|
|
} // namespace eden
|
|
} // namespace facebook
|