sapling/lib/configparser/ConfigParser.cpp
Wez Furlong caad413499 load blobs using hg's rust config and datapack code
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
2018-10-31 17:58:17 -07:00

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