more work on meta stuff and comments and mv

This commit is contained in:
Carsten Haitzler 2024-03-26 08:30:48 +00:00
parent 06cea493e8
commit 72fea7759a
3 changed files with 74 additions and 71 deletions

View File

@ -129,6 +129,7 @@ _meta_file_write(Meta_File *mf)
if (mf->list)
{
// XXX: should gain a lock!
// XXX: should write to tmp then rename atomically
f = fopen(meta_path, "w");
if (!f)
{ // can't write to dir - write to personal meta instead
@ -137,7 +138,7 @@ _meta_file_write(Meta_File *mf)
if (!meta_path) return;
dir = ecore_file_dir_get(meta_path);
if (!dir) return;
ecore_file_mkpath(dir);
if (!ecore_file_is_dir(dir)) ecore_file_mkpath(dir);
free(dir);
dir = NULL;
f = fopen(meta_path, "w");
@ -145,7 +146,9 @@ _meta_file_write(Meta_File *mf)
}
fprintf(f, "[Efm Meta]\n");
EINA_LIST_FOREACH(mf->list, l, m)
fprintf(f, "%s=%s\n", m->meta, m->data);
{
fprintf(f, "%s=%s\n", m->meta, m->data);
}
fclose(f);
}
else // no meta keys - delete it
@ -170,7 +173,7 @@ _cb_meta_flush_timer(void *data EINA_UNUSED)
_meta_flush_timer = NULL;
_meta_writes_flush();
// XXX: if flush took too long - queue another timer and try flush again
// in future. repeate until nothing left to flush
// in future. repeat until nothing left to flush
return EINA_FALSE;
}
@ -394,7 +397,7 @@ meta_path_prepare(const char *path)
Eina_Bool
meta_path_can_write(const char *path)
{ // can we write to the taget dir of "path" file for meta data?
{ // can we write to the target dir of "path" file for meta data?
// yes - this is racey. but then again anything is. we could make a
// .efm dir then have permission removed before we make the subdiors
// or meta files. anything that involves more than a single file and
@ -410,8 +413,8 @@ meta_path_can_write(const char *path)
if (!dir) return ret;
if (stat(dir, &st) == -1) goto err;
// policy - we only cosider direst owned by the user writable. want to
// avoid e.g. root browsing then modifying dirs owne by a user or dirs
// policy - we only consider dirs owned by the user writeable. want to
// avoid e.g. root browsing then modifying dirs ownee by a user or dirs
// that might have group write access being written to by multiple users
if ((st.st_uid == uid) && (st.st_mode & S_IWUSR))
{
@ -440,4 +443,4 @@ meta_path_can_write(const char *path)
err:
free(dir);
return ret;
}
}

View File

@ -18,13 +18,14 @@
static const char *config_dir = NULL;
int
main(int argc, char **argv)
{
// mv [src] [dst]
const char *src, *dst, *fname, *home_dir;
char *fdir;
Eina_Strbuf *buf = NULL, *buf2 = NULL;
Eina_Strbuf *buf = NULL;
if (argc < 3) return -1;
src = argv[1];
@ -39,10 +40,10 @@ main(int argc, char **argv)
if (!home_dir) return 77; // no $HOME? definitely an error!
if (!config_dir)
{
char buf[PATH_MAX];
char sbuf[PATH_MAX];
snprintf(buf, sizeof(buf), "%s/.e/e", home_dir);
config_dir = eina_stringshare_add(buf);
snprintf(sbuf, sizeof(sbuf), "%s/.e/e", home_dir);
config_dir = eina_stringshare_add(sbuf);
}
meta_init(config_dir);
@ -121,49 +122,49 @@ main(int argc, char **argv)
break;
case EROFS: // read only disk
break;
case EXDEV: // revert to cp -par
break;
case EXDEV: // revert t640k
default: // WAT???
break;
}
}
else
{
Eina_Bool src_can_write, dst_can_write;
const char *dstfile;
char *src_meta, *dst_meta;
fprintf(stderr, "MV: OK\n");
// XXX: use meta_path_find() or meta_path_user_find() based on
// XXX: meta_path_can_write() and prep the dest with meta_path_prepare()
fdir = ecore_file_dir_get(src);
if (fdir)
dstfile = eina_strbuf_string_get(buf);
src_can_write = meta_path_can_write(src);
dst_can_write = meta_path_can_write(eina_strbuf_string_get(buf));
if (src_can_write) src_meta = meta_path_find(src, "meta.efm");
else src_meta = meta_path_user_find(src, "meta.efm");
if (dst_can_write) dst_meta = meta_path_find(dstfile, "meta.efm");
else dst_meta = meta_path_user_find(dstfile, "meta.efm");
if ((src_meta) && (dst_meta) && (meta_path_prepare(dstfile)))
{
// mv the efm meta file if it exists...
buf2 = eina_strbuf_new();
// XXX" if buf2 is null?
eina_strbuf_append(buf2, dst);
eina_strbuf_append(buf2, "/.efm");
ecore_file_mkdir(eina_strbuf_string_get(buf2));
eina_strbuf_reset(buf2);
eina_strbuf_append(buf2, fdir);
eina_strbuf_append(buf2, "/.efm/");
eina_strbuf_append(buf2, fname);
eina_strbuf_append(buf2, ".efm");
eina_strbuf_reset(buf);
eina_strbuf_append(buf, dst);
eina_strbuf_append(buf, "/.efm/");
eina_strbuf_append(buf, fname);
eina_strbuf_append(buf, ".efm");
// XXX: what if the target meta file already exists???
rename(eina_strbuf_string_get(buf2), eina_strbuf_string_get(buf));
free(fdir);
// XXX: mv meta if in ~/.e/e/efm/meta
// XXX: mv thumb files in /.e/e/efm/thumbs
// XXX: use mv() rename wrapper than will cp
rename(src_meta, dst_meta);
}
free(src_meta);
free(dst_meta);
if (src_can_write) src_meta = meta_path_find(src, "thumb.efm");
else src_meta = meta_path_user_find(src, "thumb.efm");
if (dst_can_write) dst_meta = meta_path_find(dstfile, "thumb.efm");
else dst_meta = meta_path_user_find(dstfile, "thumb.efm");
if ((src_meta) && (dst_meta) && (meta_path_prepare(dstfile)))
{
// XXX: use mv() rename wrapper than will cp
rename(src_meta, dst_meta);
}
free(src_meta);
free(dst_meta);
}
err:
if (buf) eina_strbuf_free(buf);
if (buf2) eina_strbuf_free(buf2);
// XXX: delete status file
meta_shutdown();

View File

@ -538,7 +538,7 @@ _file_thumb_handle(Eina_Strbuf *strbuf, const char *path, const char *mime,
else
{ // add the thumb property with full path to thumb
cmd_strbuf_append(strbuf, "thumb", thumb);
// XXX: add if tumb has alpha or not...
// XXX: add if thumb has alpha or not...
free(thumb);
}
}
@ -637,6 +637,17 @@ _mime_get(const char *file)
return efreet_mime_type_get(file);
}
static void
_file_add_mod_meta_append(const char *path, const char *meta, const char *key,
Eina_Strbuf *strbuf)
{
Eina_Stringshare *s = meta_get(path, meta);
if (!s) return;
cmd_strbuf_append(strbuf, key, s);
eina_stringshare_del(s);
}
static Eina_Bool
_file_add_mod_info(Eina_Strbuf *strbuf, const char *path, Eina_Bool delay)
{ // add file metadata info on file add or modfiy
@ -648,8 +659,6 @@ _file_add_mod_info(Eina_Strbuf *strbuf, const char *path, Eina_Bool delay)
const char *mime, *ext, *icon;
Efreet_Desktop *desktop;
Eina_Bool have_label = EINA_FALSE;
Eina_Stringshare *s;
// XXX: x & y pos @ wxh view
if (lstat(path, &st) != 0) return EINA_FALSE;
if ((st.st_mode & S_IFMT) == S_IFLNK)
@ -1051,18 +1060,9 @@ _file_add_mod_info(Eina_Strbuf *strbuf, const char *path, Eina_Bool delay)
cmd_strbuf_append(strbuf, "mtime", buf);
snprintf(buf, sizeof(buf), "%llu", (unsigned long long)st.st_ctime);
cmd_strbuf_append(strbuf, "ctime", buf);
s = meta_get(path, "xy");
if (s)
{
cmd_strbuf_append(strbuf, "meta.xy", s);
eina_stringshare_del(s);
}
s = meta_get(path, "wh");
if (s)
{
cmd_strbuf_append(strbuf, "meta.wh", s);
eina_stringshare_del(s);
}
// add extra meta keys that might be used for immediate icon/file display
_file_add_mod_meta_append(path, "xy", "meta.xy", strbuf);
_file_add_mod_meta_append(path, "wh", "meta.wh", strbuf);
return EINA_TRUE;
}
@ -1197,7 +1197,7 @@ _monitor(const char *path)
can_write = meta_path_can_write(eina_strbuf_string_get(strbuf));
if (strbuf) eina_strbuf_free(strbuf);
// tell the front end out listing is beginning
// tell the front end our listing is beginning
strbuf = cmd_strbuf_new("list-begin");
cmd_strbuf_print_consume(strbuf);
@ -1211,7 +1211,7 @@ _monitor(const char *path)
EINA_ITERATOR_FOREACH(it, info) _file_add(info->path);
eina_iterator_free(it);
err:
// tell the front end out listing is done
// tell the front end our listing is done
strbuf = cmd_strbuf_new("list-end");
cmd_strbuf_print_consume(strbuf);
}
@ -1266,7 +1266,7 @@ _handle_drop_paste(const char *over, const char *action, const char *path)
mondir = ecore_file_monitor_path_get(mon);
if (!mondir) return;
if (over)
{ // if you are dropping over a dir then spint up a sub open and pass
{ // if you are dropping over a dir then spin up a sub open and pass
// the dnd to it
Eina_Strbuf *strbuf;
Sub *sub;
@ -1285,24 +1285,24 @@ _handle_drop_paste(const char *over, const char *action, const char *path)
fprintf(stderr, "DROP in [%s] action=[%s] > [%s]\n", mondir, action,
path);
if ((!action) || (!strcmp(action, "copy")))
{
{ // XXX: implement
}
else if (!strcmp(action, "move"))
_op_run("mv", path, mondir);
else if (!strcmp(action, "ask"))
{
{ // XXX: implement
}
else if (!strcmp(action, "list"))
{
{ // XXX: implement
}
else if (!strcmp(action, "link"))
{
{ // XXX: implement
}
else if (!strcmp(action, "description"))
{
{ // XXX: implement
}
else
{
{ // XXX: implement
}
}
}
@ -1407,8 +1407,7 @@ do_handle_cmd(Cmd *c)
KEY_WALK_END
}
else if (!strcmp(c->command, "dnd-drop"))
{
// "over" key means dnd was on that dir
{ // "over" key means dnd was on that dir
const char *over = cmd_key_find(c, "over");
const char *action = cmd_key_find(c, "action");
@ -1427,7 +1426,7 @@ do_handle_cmd(Cmd *c)
KEY_WALK_END
}
else if (!strcmp(c->command, "cnp-paste"))
{
{ // XXX: implement
}
// cmd_dump_sterr(c);
}
@ -1453,7 +1452,7 @@ do_init(int argc EINA_UNUSED, const char **argv EINA_UNUSED)
config_dir = eina_stringshare_add(buf);
}
// maximum number of back-end thumbnailer slaves is num cores - 2
// maximum number of back-end thumbnailer slaves is num_cores - 2
// with a minimum of 1 (so dual core systems will be limited to 1
// thumbnailer at once. quad core will run 2. 8 core will run 6, 16
// core will run 14, 32 core will run 30 etc. - this can get overidden