static GSList * get_commit_files_git(const gchar * file) { gint exit_code; const gchar *argv[] = { "git", "status", NULL }; const gchar *env[] = { "PAGES=cat", NULL }; gchar *std_out = NULL; gchar *base_dir = find_subdir_path(file, ".git"); GSList *ret = NULL; g_return_val_if_fail(base_dir, NULL); exit_code = execute_custom_command(base_dir, (const gchar **) argv, (const gchar **) env, &std_out, NULL, base_dir, NULL, NULL); g_return_val_if_fail(std_out, NULL); ret = parse_git_status(ret, base_dir, std_out, "modified:", FILE_STATUS_MODIFIED); ret = parse_git_status(ret, base_dir, std_out, "deleted:", FILE_STATUS_DELETED); ret = parse_git_status(ret, base_dir, std_out, "new file:", FILE_STATUS_ADDED); g_free(std_out); g_free(base_dir); return ret; }
static gchar * get_base_dir(const gchar * path) { gchar *test_dir; gchar *base; gchar *base_prev = NULL; if (g_file_test(path, G_FILE_TEST_IS_DIR)) base = g_strdup(path); else base = g_path_get_dirname(path); do { test_dir = g_build_filename(base, ".svn", NULL); if (!g_file_test(test_dir, G_FILE_TEST_IS_DIR)) { g_free(test_dir); break; } g_free(test_dir); g_free(base_prev); base_prev = base; base = g_path_get_dirname(base); /* check for svn layout */ test_dir = g_build_filename(base, "trunk", NULL); if (!g_file_test(test_dir, G_FILE_TEST_IS_DIR)) { g_free(test_dir); continue; } setptr(test_dir, g_build_filename(base, "branches", NULL)); if (!g_file_test(test_dir, G_FILE_TEST_IS_DIR)) { g_free(test_dir); continue; } setptr(test_dir, g_build_filename(base, "tags", NULL)); if (!g_file_test(test_dir, G_FILE_TEST_IS_DIR)) { g_free(test_dir); continue; } g_free(test_dir); break; } while (strcmp(base, base_prev) != 0); if (base_prev == NULL) { /* fallback for Subversion 1.7: try to climb up the tree until we * find a .svn subdirectory */ base_prev = find_subdir_path(path, ".svn"); } g_free(base); return base_prev; }
/* parse "bzr status --short" output, see "bzr help status-flags" for details */ static GSList * get_commit_files_bzr(const gchar * dir) { enum { FIRST_CHAR, SECOND_CHAR, THIRD_CHAR, SKIP_SPACE, FILE_NAME, }; gchar *txt = NULL; GSList *ret = NULL; gint pstatus = FIRST_CHAR; const gchar *p; gchar *base_name; gchar *base_dir = find_subdir_path(dir, ".bzr"); const gchar *start = NULL; CommitItem *item; const gchar *status = NULL; gchar *filename; const char *argv[] = { "bzr", "status", "--short", NULL }; g_return_val_if_fail(base_dir, NULL); execute_custom_command(base_dir, argv, NULL, &txt, NULL, base_dir, NULL, NULL); if (!NZV(txt)) { g_free(base_dir); g_free(txt); return NULL; } p = txt; while (*p) { if (*p == '\r') { } else if (pstatus == FIRST_CHAR) { if (*p == '+') status = FILE_STATUS_ADDED; else if (*p == '-') status = FILE_STATUS_DELETED; else if (*p == '?') status = FILE_STATUS_UNKNOWN; pstatus = SECOND_CHAR; } else if (pstatus == SECOND_CHAR) { if (*p == 'N') status = FILE_STATUS_ADDED; else if (*p == 'D') status = FILE_STATUS_DELETED; else if (*p == 'M') status = FILE_STATUS_MODIFIED; pstatus = THIRD_CHAR; } else if (pstatus == THIRD_CHAR) { pstatus = SKIP_SPACE; } else if (pstatus == SKIP_SPACE) { if (*p == ' ' || *p == '\t') { } else { start = p; pstatus = FILE_NAME; } } else if (pstatus == FILE_NAME) { if (*p == '\n') { if (status != FILE_STATUS_UNKNOWN) { base_name = g_malloc0(p - start + 1); memcpy(base_name, start, p - start); filename = g_build_filename(base_dir, base_name, NULL); g_free(base_name); item = g_new(CommitItem, 1); item->status = status; item->path = filename; ret = g_slist_append(ret, item); } pstatus = FIRST_CHAR; } } p++; } g_free(txt); g_free(base_dir); return ret; }
static gchar * get_base_dir(const gchar * path) { return find_subdir_path(path, ".bzr"); }