Fixed detection for newer repositories

This commit is contained in:
Pierre Pronchery 2013-11-27 21:40:02 +01:00
parent 026969172f
commit a90fdd39fd

View File

@ -22,6 +22,7 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <libgen.h>
#include <errno.h> #include <errno.h>
#include "common.c" #include "common.c"
@ -62,6 +63,9 @@ static void _subversion_destroy(SVN * svn);
static GtkWidget * _subversion_get_widget(SVN * svn); static GtkWidget * _subversion_get_widget(SVN * svn);
static void _subversion_refresh(SVN * svn, GList * selection); static void _subversion_refresh(SVN * svn, GList * selection);
/* accessors */
static gboolean _subversion_is_managed(char const * filename);
/* useful */ /* useful */
static int _subversion_add_task(SVN * svn, char const * title, static int _subversion_add_task(SVN * svn, char const * title,
char const * directory, char * argv[]); char const * directory, char * argv[]);
@ -263,29 +267,33 @@ static void _subversion_refresh(SVN * svn, GList * selection)
static void _refresh_dir(SVN * svn) static void _refresh_dir(SVN * svn)
{ {
char const dir[] = ".svn"; char const dir[] = "/.svn";
size_t len = strlen(svn->filename); size_t len = strlen(svn->filename);
char * p; char * p;
struct stat st; struct stat st;
/* consider ".svn" folders like their parent */ /* consider ".svn" folders like their parent */
if((len = strlen(svn->filename)) >= 4 && strcmp(&svn->filename[len - 4], if((len = strlen(svn->filename)) >= (sizeof(dir) - 1)
"/.svn") == 0) && strcmp(&svn->filename[len - 4], dir) == 0)
svn->filename[len - 4] = '\0'; svn->filename[len - 4] = '\0';
/* check if it is a SVN repository */ /* check if it is an old SVN repository */
len = strlen(svn->filename) + sizeof(dir) + 1; len = strlen(svn->filename) + sizeof(dir) + 1;
if((p = malloc(len)) != NULL) if((p = malloc(len)) != NULL)
{ {
snprintf(p, len, "%s/%s", svn->filename, dir); snprintf(p, len, "%s%s", svn->filename, dir);
if(lstat(p, &st) != 0) if(lstat(p, &st) == 0)
{ {
_refresh_status(svn, _("Not a Subversion repository"));
free(p); free(p);
gtk_widget_show(svn->directory);
return; return;
} }
} }
free(p); free(p);
gtk_widget_show(svn->directory); /* check if it is a newer SVN repository */
if(_subversion_is_managed(svn->filename))
gtk_widget_show(svn->directory);
else
_refresh_status(svn, _("Not a Subversion repository"));
} }
static void _refresh_status(SVN * svn, char const * status) static void _refresh_status(SVN * svn, char const * status)
@ -296,6 +304,45 @@ static void _refresh_status(SVN * svn, char const * status)
} }
/* accessors */
/* subversion_is_managed */
static gboolean _subversion_is_managed(char const * filename)
{
char * base = strdup(filename);
char * dir = base;
String * p;
struct stat st;
int res;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, filename);
#endif
for(; strcmp(dir, ".") != 0; dir = dirname(dir))
{
if((p = string_new_append(dir, "/.svn", NULL)) == NULL)
{
free(base);
return FALSE;
}
res = lstat(p, &st);
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s() \"%s\" %d\n", __func__, p, res);
#endif
string_delete(p);
if(res == 0)
{
/* FIXME really implement */
free(base);
return TRUE;
}
if(strcmp(dir, "/") == 0)
break;
}
free(base);
return FALSE;
}
/* useful */ /* useful */
/* svn_add_task */ /* svn_add_task */
static int _subversion_add_task(SVN * svn, char const * title, static int _subversion_add_task(SVN * svn, char const * title,