~ubuntu-branches/debian/stretch/gnome-builder/stretch

« back to all changes in this revision

Viewing changes to libide/directory/ide-directory-vcs.c

  • Committer: Package Import Robot
  • Author(s): Andreas Henriksson
  • Date: 2015-10-11 12:38:45 UTC
  • Revision ID: package-import@ubuntu.com-20151011123845-a0hvkz01se0p1p5a
Tags: upstream-3.16.3
ImportĀ upstreamĀ versionĀ 3.16.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* ide-directory-vcs.c
 
2
 *
 
3
 * Copyright (C) 2015 Christian Hergert <christian@hergert.me>
 
4
 *
 
5
 * This program is free software: you can redistribute it and/or modify
 
6
 * it under the terms of the GNU General Public License as published by
 
7
 * the Free Software Foundation, either version 3 of the License, or
 
8
 * (at your option) any later version.
 
9
 *
 
10
 * This program is distributed in the hope that it will be useful,
 
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
 * GNU General Public License for more details.
 
14
 *
 
15
 * You should have received a copy of the GNU General Public License
 
16
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
17
 */
 
18
 
 
19
#include <glib/gi18n.h>
 
20
 
 
21
#include "ide-context.h"
 
22
#include "ide-directory-vcs.h"
 
23
#include "ide-project.h"
 
24
 
 
25
struct _IdeDirectoryVcs
 
26
{
 
27
  IdeVcs  parent_instance;
 
28
 
 
29
  GFile  *working_directory;
 
30
};
 
31
 
 
32
#define LOAD_MAX_FILES 5000
 
33
 
 
34
static void async_initable_iface_init (GAsyncInitableIface *iface);
 
35
 
 
36
G_DEFINE_TYPE_EXTENDED (IdeDirectoryVcs, ide_directory_vcs, IDE_TYPE_VCS, 0,
 
37
                        G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE,
 
38
                                               async_initable_iface_init))
 
39
 
 
40
static GFile *
 
41
ide_directory_vcs_get_working_directory (IdeVcs *vcs)
 
42
{
 
43
  IdeDirectoryVcs *self = (IdeDirectoryVcs *)vcs;
 
44
 
 
45
  g_return_val_if_fail (IDE_IS_DIRECTORY_VCS (vcs), NULL);
 
46
 
 
47
  return self->working_directory;
 
48
}
 
49
 
 
50
static gboolean
 
51
ide_directory_vcs_is_ignored (IdeVcs  *vcs,
 
52
                              GFile   *file,
 
53
                              GError **error)
 
54
{
 
55
  g_autofree gchar *reversed = NULL;
 
56
 
 
57
  g_assert (IDE_IS_VCS (vcs));
 
58
  g_assert (G_IS_FILE (file));
 
59
 
 
60
  reversed = g_strreverse (g_file_get_basename (file));
 
61
 
 
62
  /* check suffixes, in reverse */
 
63
  if ((reversed [0] == '~') ||
 
64
      (strncmp (reversed, "al.", 3) == 0) ||        /* .la */
 
65
      (strncmp (reversed, "ol.", 3) == 0) ||        /* .lo */
 
66
      (strncmp (reversed, "o.", 2) == 0) ||         /* .o */
 
67
      (strncmp (reversed, "pws.", 4) == 0) ||       /* .swp */
 
68
      (strncmp (reversed, "sped.", 5) == 0) ||      /* .deps */
 
69
      (strncmp (reversed, "sbil.", 5) == 0) ||      /* .libs */
 
70
      (strncmp (reversed, "cyp.", 4) == 0) ||       /* .pyc */
 
71
      (strncmp (reversed, "oyp.", 4) == 0) ||       /* .pyo */
 
72
      (strncmp (reversed, "omg.", 4) == 0) ||       /* .gmo */
 
73
      (strncmp (reversed, "tig.", 4) == 0) ||       /* .git */
 
74
      (strncmp (reversed, "rzb.", 4) == 0) ||       /* .bzr */
 
75
      (strncmp (reversed, "nvs.", 4) == 0) ||       /* .svn */
 
76
      (strncmp (reversed, "pmatsrid.", 9) == 0) ||  /* .dirstamp */
 
77
      (strncmp (reversed, "hcg.", 4) == 0))         /* .gch */
 
78
    return TRUE;
 
79
 
 
80
  return FALSE;
 
81
}
 
82
 
 
83
static void
 
84
ide_directory_vcs_dispose (GObject *object)
 
85
{
 
86
  IdeDirectoryVcs *self = (IdeDirectoryVcs *)object;
 
87
 
 
88
  g_clear_object (&self->working_directory);
 
89
 
 
90
  G_OBJECT_CLASS (ide_directory_vcs_parent_class)->dispose (object);
 
91
}
 
92
 
 
93
static void
 
94
ide_directory_vcs_class_init (IdeDirectoryVcsClass *klass)
 
95
{
 
96
  IdeVcsClass *vcs_class = IDE_VCS_CLASS (klass);
 
97
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
98
 
 
99
  vcs_class->get_working_directory = ide_directory_vcs_get_working_directory;
 
100
  vcs_class->is_ignored = ide_directory_vcs_is_ignored;
 
101
 
 
102
  object_class->dispose = ide_directory_vcs_dispose;
 
103
}
 
104
 
 
105
static void
 
106
ide_directory_vcs_init (IdeDirectoryVcs *self)
 
107
{
 
108
}
 
109
 
 
110
static void
 
111
ide_directory_vcs_init_worker (GTask        *task,
 
112
                               gpointer      source_object,
 
113
                               gpointer      task_data,
 
114
                               GCancellable *cancellable)
 
115
{
 
116
  IdeDirectoryVcs *self = source_object;
 
117
  g_autoptr(GFileInfo) file_info = NULL;
 
118
  GFile *file = task_data;
 
119
  GError *error = NULL;
 
120
  GFileType file_type;
 
121
 
 
122
  g_assert (IDE_IS_DIRECTORY_VCS (self));
 
123
  g_assert (G_IS_FILE (file));
 
124
 
 
125
  file_info = g_file_query_info (file,
 
126
                                 G_FILE_ATTRIBUTE_STANDARD_TYPE,
 
127
                                 G_FILE_QUERY_INFO_NONE,
 
128
                                 cancellable,
 
129
                                 &error);
 
130
 
 
131
  if (file_info == NULL)
 
132
    {
 
133
      g_task_return_error (task, error);
 
134
      return;
 
135
    }
 
136
 
 
137
  file_type = g_file_info_get_file_type (file_info);
 
138
 
 
139
  if (file_type == G_FILE_TYPE_DIRECTORY)
 
140
    self->working_directory = g_object_ref (file);
 
141
  else
 
142
    self->working_directory = g_file_get_parent (file);
 
143
 
 
144
  g_task_return_boolean (task, TRUE);
 
145
}
 
146
 
 
147
static void
 
148
ide_directory_vcs_init_async (GAsyncInitable      *initable,
 
149
                              int                  io_priority,
 
150
                              GCancellable        *cancellable,
 
151
                              GAsyncReadyCallback  callback,
 
152
                              gpointer             user_data)
 
153
{
 
154
  IdeDirectoryVcs *self = (IdeDirectoryVcs *)initable;
 
155
  g_autoptr(GTask) task = NULL;
 
156
  IdeContext *context;
 
157
  GFile *project_file;
 
158
 
 
159
  g_return_if_fail (IDE_IS_DIRECTORY_VCS (self));
 
160
  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
 
161
 
 
162
  context = ide_object_get_context (IDE_OBJECT (initable));
 
163
  project_file = ide_context_get_project_file (context);
 
164
 
 
165
  task = g_task_new (self, cancellable, callback, user_data);
 
166
  g_task_set_task_data (task, g_object_ref (project_file), g_object_unref);
 
167
  g_task_run_in_thread (task, ide_directory_vcs_init_worker);
 
168
}
 
169
 
 
170
static gboolean
 
171
ide_directory_vcs_init_finish (GAsyncInitable  *initable,
 
172
                               GAsyncResult    *result,
 
173
                               GError         **error)
 
174
{
 
175
  GTask *task = (GTask *)result;
 
176
 
 
177
  g_return_val_if_fail (IDE_IS_DIRECTORY_VCS (initable), FALSE);
 
178
  g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
 
179
  g_return_val_if_fail (G_IS_TASK (task), FALSE);
 
180
 
 
181
  return g_task_propagate_boolean (task, error);
 
182
}
 
183
 
 
184
static void
 
185
async_initable_iface_init (GAsyncInitableIface *iface)
 
186
{
 
187
  iface->init_async = ide_directory_vcs_init_async;
 
188
  iface->init_finish = ide_directory_vcs_init_finish;
 
189
}