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.
26
#include "plugindata.h"
28
#include "filetypes.h"
30
#include "geanyfunctions.h"
34
extern GeanyData *geany_data;
37
static const gchar *SVK_CMD_DIFF_FILE[] = { "svk", "diff", ABS_FILENAME, NULL };
38
static const gchar *SVK_CMD_DIFF_DIR[] = { "svk", "diff", ABS_DIRNAME, NULL };
39
static const gchar *SVK_CMD_REVERT_FILE[] = { "svk", "revert", BASENAME, NULL };
40
static const gchar *SVK_CMD_REVERT_DIR[] = { "svk", "revert", "--recursive", BASE_DIRNAME, NULL };
41
static const gchar *SVK_CMD_STATUS[] = { "svk", "status", NULL };
42
static const gchar *SVK_CMD_ADD[] = { "svk", "add", BASENAME, NULL };
43
static const gchar *SVK_CMD_REMOVE[] = { "svk", "remove", BASENAME, NULL };
44
static const gchar *SVK_CMD_LOG_FILE[] = { "svk", "log", BASENAME, NULL };
45
static const gchar *SVK_CMD_LOG_DIR[] = { "svk", "log", ABS_DIRNAME, NULL };
46
static const gchar *SVK_CMD_COMMIT[] = { "svk", "commit", "-m", MESSAGE, FILE_LIST, NULL };
47
static const gchar *SVK_CMD_BLAME[] = { "svk", "blame", BASENAME, NULL };
48
static const gchar *SVK_CMD_SHOW[] = { "svk", "cat", BASENAME, NULL };
49
static const gchar *SVK_CMD_UPDATE[] = { "svk", "up", NULL };
51
static const VC_COMMAND commands[] = {
53
.startdir = VC_COMMAND_STARTDIR_FILE,
54
.command = SVK_CMD_DIFF_FILE,
58
.startdir = VC_COMMAND_STARTDIR_FILE,
59
.command = SVK_CMD_DIFF_DIR,
63
.startdir = VC_COMMAND_STARTDIR_FILE,
64
.command = SVK_CMD_REVERT_FILE,
68
.startdir = VC_COMMAND_STARTDIR_BASE,
69
.command = SVK_CMD_REVERT_DIR,
73
.startdir = VC_COMMAND_STARTDIR_FILE,
74
.command = SVK_CMD_STATUS,
78
.startdir = VC_COMMAND_STARTDIR_FILE,
79
.command = SVK_CMD_ADD,
83
.startdir = VC_COMMAND_STARTDIR_FILE,
84
.command = SVK_CMD_REMOVE,
88
.startdir = VC_COMMAND_STARTDIR_FILE,
89
.command = SVK_CMD_LOG_FILE,
93
.startdir = VC_COMMAND_STARTDIR_FILE,
94
.command = SVK_CMD_LOG_DIR,
98
.startdir = VC_COMMAND_STARTDIR_FILE,
99
.command = SVK_CMD_COMMIT,
103
.startdir = VC_COMMAND_STARTDIR_FILE,
104
.command = SVK_CMD_BLAME,
108
.startdir = VC_COMMAND_STARTDIR_FILE,
109
.command = SVK_CMD_SHOW,
113
.startdir = VC_COMMAND_STARTDIR_BASE,
114
.command = SVK_CMD_UPDATE,
121
get_base_dir(const gchar * path)
124
return g_path_get_dirname(path);
128
in_vc_svk(const gchar * filename)
131
gchar *argv[] = { "svk", "info", NULL, NULL };
133
gchar *base_name = NULL;
134
gboolean ret = FALSE;
137
if (g_file_test(filename, G_FILE_TEST_IS_DIR))
140
execute_custom_command(filename, (const gchar **) argv, NULL, NULL, NULL,
141
filename, NULL, NULL);
146
base_name = g_path_get_basename(filename);
147
dir = g_path_get_dirname(filename);
151
exit_code = execute_custom_command(dir, (const gchar **) argv, NULL, NULL, NULL,
167
get_commit_files_svk(const gchar * dir)
178
gint pstatus = FIRST_CHAR;
181
const gchar *start = NULL;
186
const char *argv[] = { "svk", "status", NULL };
188
execute_custom_command(dir, argv, NULL, &txt, NULL, dir, NULL, NULL);
198
else if (pstatus == FIRST_CHAR)
202
status = FILE_STATUS_UNKNOWN;
204
status = FILE_STATUS_MODIFIED;
206
status = FILE_STATUS_DELETED;
208
status = FILE_STATUS_ADDED;
210
if (!status || *(p + 1) != ' ')
212
// skip unknown status line
222
pstatus = FIRST_CHAR;
225
pstatus = SKIP_SPACE;
227
else if (pstatus == SKIP_SPACE)
229
if (*p == ' ' || *p == '\t')
238
else if (pstatus == FILE_NAME)
242
if (status != FILE_STATUS_UNKNOWN)
244
base_name = g_malloc0(p - start + 1);
245
memcpy(base_name, start, p - start);
246
filename = g_build_filename(dir, base_name, NULL);
248
item = g_new(CommitItem, 1);
249
item->status = status;
250
item->path = filename;
251
ret = g_slist_append(ret, item);
253
pstatus = FIRST_CHAR;
263
.commands = commands,
265
.get_base_dir = get_base_dir,
267
.get_commit_files = get_commit_files_svk,