static gboolean in_vc_bzr(const gchar * filename) { const gchar *argv[] = { "bzr", "log", NULL, NULL }; gchar *dir; gchar *base_name; gboolean ret = FALSE; gchar *std_output; if (!find_dir(filename, ".bzr", TRUE)) return FALSE; if (g_file_test(filename, G_FILE_TEST_IS_DIR)) return TRUE; dir = g_path_get_dirname(filename); base_name = g_path_get_basename(filename); argv[2] = base_name; execute_custom_command(dir, (const gchar **) argv, NULL, &std_output, NULL, filename, NULL, NULL); if (NZV(std_output)) { ret = TRUE; } g_free(std_output); g_free(base_name); g_free(dir); return ret; }
static gboolean in_vc_svn(const gchar * filename) { const gchar *argv[] = { "svn", "info", "--non-interactive", NULL, NULL }; gchar *dir; gchar *base_name; gboolean ret = FALSE; gchar *std_output; if (!find_dir(filename, ".svn", TRUE)) return FALSE; if (g_file_test(filename, G_FILE_TEST_IS_DIR)) return TRUE; dir = g_path_get_dirname(filename); base_name = g_path_get_basename(filename); argv[3] = base_name; execute_custom_command(dir, (const gchar **) argv, NULL, &std_output, NULL, dir, NULL, NULL); if (!EMPTY(std_output)) { ret = TRUE; g_free(std_output); } g_free(base_name); g_free(dir); return ret; }
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 gboolean in_vc_git(const gchar * filename) { gint exit_code; const gchar *argv[] = { "git", "ls-files", "--", NULL, NULL }; gchar *dir; gchar *base_name; gboolean ret = FALSE; gchar *std_output; if (!find_dir(filename, ".git", TRUE)) return FALSE; if (g_file_test(filename, G_FILE_TEST_IS_DIR)) return TRUE; dir = g_path_get_dirname(filename); base_name = g_path_get_basename(filename); argv[3] = base_name; exit_code = execute_custom_command(dir, (const gchar **) argv, NULL, &std_output, NULL, dir, NULL, NULL); if (NZV(std_output)) { ret = TRUE; g_free(std_output); } g_free(base_name); g_free(dir); return ret; }
static gint git_show(gchar ** std_out, gchar ** std_err, const gchar * filename, GSList * list, const gchar * message) { gchar *base_dir = get_base_dir(filename); gint len = strlen(base_dir); const gchar *argv[] = { "git", "show", NULL, NULL }; gint ret; g_return_val_if_fail(base_dir, -1); argv[2] = g_strdup_printf("HEAD:%s", filename + len + 1); ret = execute_custom_command(base_dir, argv, GIT_ENV_SHOW, std_out, std_err, base_dir, list, message); g_free(base_dir); g_free((gchar *) argv[2]); return ret; }
static gint git_commit(G_GNUC_UNUSED gchar ** std_out, G_GNUC_UNUSED gchar ** std_err, const gchar * filename, GSList * list, const gchar * message) { gchar *base_dir = get_base_dir(filename); gint len = strlen(base_dir); GSList *commit = NULL; GSList *tmp = NULL; const gchar *argv[] = { "git", "commit", "-m", MESSAGE, "--", FILE_LIST, NULL }; gint ret; g_return_val_if_fail(base_dir, -1); for (tmp = list; tmp != NULL; tmp = g_slist_next(tmp)) { commit = g_slist_prepend(commit, (gchar *) tmp->data + len + 1); } ret = execute_custom_command(base_dir, argv, NULL, NULL, NULL, base_dir, commit, message); g_slist_free(commit); g_free(base_dir); return ret; }
static GSList * get_commit_files_cvs(const gchar * dir) { enum { FIRST_CHAR, SKIP_SPACE, FILE_NAME, }; gchar *txt; GSList *ret = NULL; gint pstatus = FIRST_CHAR; const gchar *p; gchar *base_name; const gchar *start = NULL; CommitItem *item; const gchar *status = NULL; gchar *filename; const char *argv[] = { "cvs", "-nq", "update", NULL }; execute_custom_command(dir, argv, NULL, &txt, NULL, dir, NULL, NULL); if (!NZV(txt)) return NULL; p = txt; while (*p) { if (*p == '\r') { } else if (pstatus == FIRST_CHAR) { status = NULL; if (*p == '?') status = FILE_STATUS_UNKNOWN; else if (*p == 'M') status = FILE_STATUS_MODIFIED; else if (*p == 'D') status = FILE_STATUS_DELETED; else if (*p == 'A') status = FILE_STATUS_ADDED; if (!status || *(p + 1) != ' ') { /* skip unknown status line */ while (*p) { p++; if (*p == '\n') { p++; break; } } pstatus = FIRST_CHAR; continue; } 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(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); return ret; }
/* 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; }