scm: Fix initialisation to be based either on path or on CWD/edi_project_get

Refactoring lookups to be more re-usable as well. Should be a clearer API
This commit is contained in:
Andy Williams 2017-12-30 19:00:04 +00:00
parent f9e74bec45
commit 611c68175f
3 changed files with 60 additions and 79 deletions

View File

@ -53,8 +53,7 @@ int main(int argc, char **argv)
ecore_init(); ecore_init();
elm_init(argc, argv); elm_init(argc, argv);
if (!edi_scm_init())
if (!edi_scm_generic_init())
exit(1 << 0); exit(1 << 0);
win = _win_add(engine); win = _win_add(engine);

View File

@ -529,11 +529,7 @@ edi_scm_enabled(void)
EAPI Edi_Scm_Engine * EAPI Edi_Scm_Engine *
edi_scm_engine_get(void) edi_scm_engine_get(void)
{ {
Edi_Scm_Engine *engine = _edi_scm_global_object; return _edi_scm_global_object;
if (!engine)
return NULL;
return engine;
} }
EAPI void EAPI void
@ -544,8 +540,6 @@ edi_scm_shutdown()
if (!engine) if (!engine)
return; return;
eina_stringshare_del(engine->name);
eina_stringshare_del(engine->directory);
eina_stringshare_del(engine->path); eina_stringshare_del(engine->path);
free(engine->root_directory); free(engine->root_directory);
free(engine); free(engine);
@ -747,63 +741,20 @@ edi_scm_root_directory_get(void)
{ {
Edi_Scm_Engine *e = edi_scm_engine_get(); Edi_Scm_Engine *e = edi_scm_engine_get();
if (!e->root_directory)
return NULL;
return e->root_directory; return e->root_directory;
} }
static char *
_edi_scm_git_project_root_get(void)
{
Edi_Scm_Engine *engine;
char *directory, *engine_root, *path, *tmp;
engine = edi_scm_engine_get();
if (!engine)
return NULL;
tmp = path = engine_root = NULL;
directory = getcwd(NULL, PATH_MAX);
while (directory)
{
path = edi_path_append(directory, engine->directory);
if (ecore_file_exists(path) && ecore_file_is_dir(path))
{
engine_root = strdup(directory);
break;
}
tmp = ecore_file_dir_get(directory);
free(directory);
directory = tmp;
free(path);
path = NULL;
}
if (path)
free(path);
if (directory)
free(directory);
return engine_root;
}
static Edi_Scm_Engine * static Edi_Scm_Engine *
_edi_scm_git_init() _edi_scm_git_init(const char *rootdir)
{ {
Edi_Scm_Engine *engine; Edi_Scm_Engine *engine;
char *current_directory = NULL;
if (!ecore_file_app_installed("git")) if (!ecore_file_app_installed("git"))
return NULL; return NULL;
_edi_scm_global_object = engine = calloc(1, sizeof(Edi_Scm_Engine)); _edi_scm_global_object = engine = calloc(1, sizeof(Edi_Scm_Engine));
engine->name = eina_stringshare_add("git"); engine->name = "git";
engine->directory = eina_stringshare_add(".git"); engine->directory = ".git";
engine->file_stage = _edi_scm_git_file_stage; engine->file_stage = _edi_scm_git_file_stage;
engine->file_mod = _edi_scm_git_file_mod; engine->file_mod = _edi_scm_git_file_mod;
engine->file_del = _edi_scm_git_file_del; engine->file_del = _edi_scm_git_file_del;
@ -824,41 +775,70 @@ _edi_scm_git_init()
engine->credentials_set = _edi_scm_git_credentials_set; engine->credentials_set = _edi_scm_git_credentials_set;
engine->status_get = _edi_scm_git_status_get; engine->status_get = _edi_scm_git_status_get;
if (edi_project_get()) engine->root_directory = strdup(rootdir);
{
current_directory = getcwd(NULL, PATH_MAX);
chdir(edi_project_get());
}
engine->root_directory = _edi_scm_git_project_root_get();
if (current_directory)
{
chdir(current_directory);
free(current_directory);
}
engine->initialized = EINA_TRUE; engine->initialized = EINA_TRUE;
return engine; return engine;
} }
EAPI Edi_Scm_Engine * static char *
edi_scm_generic_init(void) _edi_scm_root_find(const char *dir, const char *scmdir)
{ {
if (!edi_exe_wait("git status")) char *directory, *engine_root, *path, *tmp;
return _edi_scm_git_init();
return NULL; engine_root = NULL;
directory = strdup(dir);
while (directory && strlen(directory) > 1)
{
path = edi_path_append(directory, scmdir);
if (ecore_file_exists(path) && ecore_file_is_dir(path))
{
engine_root = strdup(directory);
free(directory);
free(path);
break;
}
tmp = ecore_file_dir_get(directory);
free(directory);
directory = tmp;
free(path);
}
return engine_root;
}
EAPI Edi_Scm_Engine *
edi_scm_init_path(const char *path)
{
char *location;
Edi_Scm_Engine *engine;
engine = NULL;
location = _edi_scm_root_find(path, ".git");
if (location)
{
engine = _edi_scm_git_init(location);
free(location);
}
return engine;
} }
EAPI Edi_Scm_Engine * EAPI Edi_Scm_Engine *
edi_scm_init(void) edi_scm_init(void)
{ {
if (edi_project_file_exists(".git")) char *cwd;
return _edi_scm_git_init(); Edi_Scm_Engine *engine;
return NULL; if (edi_project_get())
return edi_scm_init_path(edi_project_get());
cwd = getcwd(NULL, PATH_MAX);
engine = edi_scm_init_path(cwd);
free(cwd);
return engine;
} }
EAPI const char * EAPI const char *

View File

@ -101,11 +101,13 @@ typedef struct _Edi_Scm_Engine
Edi_Scm_Engine *edi_scm_init(); Edi_Scm_Engine *edi_scm_init();
/** /**
* Init the SCM system. * Init the SCM system for the specified path.
*
* @param path The location to find the scm information.
* *
* @ingroup Scm * @ingroup Scm
*/ */
EAPI Edi_Scm_Engine *edi_scm_generic_init(void); EAPI Edi_Scm_Engine *edi_scm_init_path(const char *path);
/** /**
* Shutdown and free memory in use by SCM system. * Shutdown and free memory in use by SCM system.