replace g_build_path("/" with g_build_filename
[geanyvc.git] / vc_svk.c
blobeab7d83ab0a51ec7daa5c6722e0b3586361d9bf0
1 /*
2 * Copyright 2007 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
3 * Copyright 2007 Enrico Tröger <enrico.troeger@uvena.de>
4 * Copyright 2007 Nick Treleaven <nick.treleaven@btinternet.com>
5 * Copyright 2007 Yura Siamashka <yurand2@gmail.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 #include "geany.h"
23 #include "support.h"
24 #include "plugindata.h"
25 #include "document.h"
26 #include "filetypes.h"
27 #include "utils.h"
28 #include "project.h"
29 #include "pluginmacros.h"
31 #include "geanyvc.h"
33 static const gchar *SVK_CMD_DIFF_FILE[] = { "svk", "diff", FILENAME, NULL };
34 static const gchar *SVK_CMD_DIFF_DIR[] = { "svk", "diff", DIRNAME, NULL };
35 static const gchar *SVK_CMD_REVERT_FILE[] = { "svk", "revert", BASE_FILENAME, NULL };
36 static const gchar *SVK_CMD_STATUS[] = { "svk", "status", NULL };
37 static const gchar *SVK_CMD_ADD[] = { "svk", "add", BASE_FILENAME, NULL };
38 static const gchar *SVK_CMD_REMOVE[] = { "svk", "remove", BASE_FILENAME, NULL };
39 static const gchar *SVK_CMD_LOG_FILE[] = { "svk", "log", BASE_FILENAME, NULL };
40 static const gchar *SVK_CMD_LOG_DIR[] = { "svk", "log", DIRNAME, NULL };
41 static const gchar *SVK_CMD_COMMIT[] = { "svk", "commit", "-m", MESSAGE, FILE_LIST, NULL };
42 static const gchar *SVK_CMD_BLAME[] = { "svk", "blame", BASE_FILENAME, NULL };
44 static void *SVK_COMMANDS[] = { SVK_CMD_DIFF_FILE,
45 SVK_CMD_DIFF_DIR,
46 SVK_CMD_REVERT_FILE,
47 SVK_CMD_STATUS,
48 SVK_CMD_ADD,
49 SVK_CMD_REMOVE,
50 SVK_CMD_LOG_FILE,
51 SVK_CMD_LOG_DIR,
52 SVK_CMD_COMMIT,
53 SVK_CMD_BLAME,
56 static gboolean
57 in_vc_svk(const gchar * filename)
59 gint exit_code;
60 gchar *argv[] = { "svk", "info", NULL, NULL };
61 gchar *dir;
62 gchar *base_name = NULL;
63 gboolean ret = FALSE;
66 if (g_file_test(filename, G_FILE_TEST_IS_DIR))
68 g_spawn_sync(filename, argv, NULL,
69 G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL |
70 G_SPAWN_STDOUT_TO_DEV_NULL, NULL, NULL, NULL, NULL, &exit_code, NULL);
72 else
74 base_name = g_path_get_basename(filename);
75 dir = g_path_get_dirname(filename);
77 argv[2] = base_name;
79 g_spawn_sync(dir, argv, NULL,
80 G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL |
81 G_SPAWN_STDOUT_TO_DEV_NULL, NULL, NULL, NULL, NULL, &exit_code, NULL);
82 g_free(dir);
83 g_free(base_name);
86 if (exit_code == 0)
88 ret = TRUE;
91 return ret;
94 static GSList *
95 get_commit_files_svk(const gchar * dir)
97 enum
99 FIRST_CHAR,
100 SKIP_SPACE,
101 FILE_NAME,
104 gchar *txt;
105 GSList *ret = NULL;
106 gint pstatus = FIRST_CHAR;
107 const gchar *p;
108 gchar *base_name;
109 const gchar *start = NULL;
110 CommitItem *item;
112 const gchar *status;
113 gchar *filename;
114 const char *argv[] = { "svk", "status", NULL };
116 execute_custom_command(argv, NULL, &txt, NULL, dir, NULL, NULL);
117 if (!NZV(txt))
118 return NULL;
119 p = txt;
121 while (*p)
123 if (*p == '\r')
126 else if (pstatus == FIRST_CHAR)
128 if (*p == '?')
129 status = FILE_STATUS_UNKNOWN;
130 else if (*p == 'M')
131 status = FILE_STATUS_MODIFIED;
132 else if (*p == 'D')
133 status = FILE_STATUS_DELETED;
134 else if (*p == 'A')
135 status = FILE_STATUS_ADDED;
136 pstatus = SKIP_SPACE;
138 else if (pstatus == SKIP_SPACE)
140 if (*p == ' ' || *p == '\t')
143 else
145 start = p;
146 pstatus = FILE_NAME;
149 else if (pstatus == FILE_NAME)
151 if (*p == '\n')
153 if (status != FILE_STATUS_UNKNOWN)
155 base_name = g_malloc0(p - start + 1);
156 memcpy(base_name, start, p - start);
157 filename = g_build_filename(dir, base_name, NULL);
158 g_free(base_name);
159 item = g_new(CommitItem, 1);
160 item->status = status;
161 item->path = filename;
162 ret = g_slist_append(ret, item);
164 pstatus = FIRST_CHAR;
167 p++;
169 g_free(txt);
170 return ret;
174 VC_RECORD VC_SVK = { SVK_COMMANDS, NO_ENV, "svk", in_vc_svk, get_commit_files_svk };