fix: fix ramdisk readdir inconsistency.
This commit is contained in:
@@ -124,23 +124,54 @@ bool installer_list_dir(const char* abs_dir, DirList* out) {
|
||||
int scanned = 0;
|
||||
int capacity = 0;
|
||||
|
||||
// The filesystem API returns direct-child names. Keep this installer's
|
||||
// historical root-relative representation because component filtering
|
||||
// and recursive source paths operate on paths such as "sdk/tcc".
|
||||
const char* dir_rel = abs_dir;
|
||||
for (int i = 0; dir_rel[i]; i++) {
|
||||
if (dir_rel[i] == ':') {
|
||||
dir_rel += i + 1;
|
||||
if (dir_rel[0] == '/') dir_rel++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
int dir_rel_len = slen(dir_rel);
|
||||
while (dir_rel_len > 0 && dir_rel[dir_rel_len - 1] == '/') dir_rel_len--;
|
||||
|
||||
int got = montauk::readdir_at(abs_dir, batch, BATCH, 0);
|
||||
if (got < 0) return false;
|
||||
|
||||
while (got > 0) {
|
||||
for (int i = 0; i < got; i++) {
|
||||
const char* raw = batch[i];
|
||||
int len = slen(raw);
|
||||
int raw_len = slen(raw);
|
||||
|
||||
bool is_dir = (len > 0 && raw[len - 1] == '/');
|
||||
if (is_dir) len--;
|
||||
if (len <= 0) continue;
|
||||
bool is_dir = (raw_len > 0 && raw[raw_len - 1] == '/');
|
||||
if (is_dir) raw_len--;
|
||||
if (raw_len <= 0) continue;
|
||||
|
||||
bool already_root_relative = false;
|
||||
if (dir_rel_len > 0 && raw_len > dir_rel_len &&
|
||||
raw[dir_rel_len] == '/') {
|
||||
already_root_relative = true;
|
||||
for (int k = 0; k < dir_rel_len; k++) {
|
||||
if (raw[k] != dir_rel[k]) {
|
||||
already_root_relative = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int len = raw_len;
|
||||
if (dir_rel_len > 0 && !already_root_relative) {
|
||||
len += dir_rel_len + 1;
|
||||
}
|
||||
|
||||
// Skip "." and ".."
|
||||
const char* base = raw;
|
||||
for (int k = 0; k < len; k++)
|
||||
for (int k = 0; k < raw_len; k++)
|
||||
if (raw[k] == '/') base = raw + k + 1;
|
||||
int base_len = (int)(len - (base - raw));
|
||||
int base_len = (int)(raw_len - (base - raw));
|
||||
if (base_len == 1 && base[0] == '.') continue;
|
||||
if (base_len == 2 && base[0] == '.' && base[1] == '.') continue;
|
||||
|
||||
@@ -156,7 +187,13 @@ bool installer_list_dir(const char* abs_dir, DirList* out) {
|
||||
|
||||
char* rel = (char*)montauk::malloc(len + 1);
|
||||
if (!rel) { installer_free_dir_list(out); return false; }
|
||||
montauk::memcpy(rel, raw, len);
|
||||
int pos = 0;
|
||||
if (dir_rel_len > 0 && !already_root_relative) {
|
||||
montauk::memcpy(rel, dir_rel, dir_rel_len);
|
||||
pos = dir_rel_len;
|
||||
rel[pos++] = '/';
|
||||
}
|
||||
montauk::memcpy(rel + pos, raw, raw_len);
|
||||
rel[len] = '\0';
|
||||
|
||||
out->entries[out->count].rel = rel;
|
||||
|
||||
Reference in New Issue
Block a user