1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2007 Imendio AB
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
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 GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public
16 * License along with this program; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
25 #include <glib/gstdio.h>
27 #include "giggle-remote.h"
29 typedef struct GiggleRemotePriv GiggleRemotePriv
;
31 struct GiggleRemotePriv
{
35 GList
*branches
; // of GiggleRemoteBranch
45 static void remote_finalize (GObject
*object
);
46 static void remote_get_property (GObject
*object
,
50 static void remote_set_property (GObject
*object
,
55 G_DEFINE_TYPE (GiggleRemote
, giggle_remote
, G_TYPE_OBJECT
)
57 #define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GIGGLE_TYPE_REMOTE, GiggleRemotePriv))
60 giggle_remote_class_init (GiggleRemoteClass
*class)
62 GObjectClass
*object_class
= G_OBJECT_CLASS (class);
64 object_class
->finalize
= remote_finalize
;
65 object_class
->get_property
= remote_get_property
;
66 object_class
->set_property
= remote_set_property
;
68 g_object_class_install_property (object_class
,
70 g_param_spec_pointer ("branches", "Branches",
71 "The list of remote branches",
73 g_object_class_install_property (object_class
,
75 g_param_spec_string ("name", "Name",
77 NULL
, G_PARAM_READWRITE
));
78 g_object_class_install_property (object_class
,
80 g_param_spec_string ("url", "URL",
82 NULL
, G_PARAM_READWRITE
));
84 g_type_class_add_private (object_class
, sizeof (GiggleRemotePriv
));
88 giggle_remote_init (GiggleRemote
*remote
)
90 GiggleRemotePriv
*priv
;
92 priv
= GET_PRIV (remote
);
96 remote_finalize (GObject
*object
)
98 GiggleRemotePriv
*priv
;
100 priv
= GET_PRIV (object
);
105 giggle_remote_remove_branches (GIGGLE_REMOTE (object
));
107 G_OBJECT_CLASS (giggle_remote_parent_class
)->finalize (object
);
111 remote_get_property (GObject
*object
,
116 GiggleRemotePriv
*priv
;
118 priv
= GET_PRIV (object
);
122 g_value_set_pointer (value
, priv
->branches
);
125 g_value_set_string (value
, priv
->name
);
128 g_value_set_string (value
, priv
->url
);
131 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, param_id
, pspec
);
137 remote_set_property (GObject
*object
,
142 GiggleRemotePriv
*priv
;
144 priv
= GET_PRIV (object
);
148 giggle_remote_set_name (GIGGLE_REMOTE (object
), g_value_get_string (value
));
151 giggle_remote_set_url (GIGGLE_REMOTE (object
), g_value_get_string (value
));
154 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, param_id
, pspec
);
160 giggle_remote_new (gchar
const *name
)
162 return g_object_new (GIGGLE_TYPE_REMOTE
, "name", name
, NULL
);
166 giggle_remote_add_branch (GiggleRemote
*remote
,
167 GiggleRemoteBranch
*branch
)
169 GiggleRemotePriv
*priv
;
171 priv
= GET_PRIV (remote
);
173 priv
->branches
= g_list_append (priv
->branches
, g_object_ref (branch
));
174 g_object_notify (G_OBJECT (remote
), "branches");
178 giggle_remote_new_from_file (gchar
const *filename
)
180 GiggleRemote
*remote
;
183 content
= g_path_get_basename (filename
);
184 remote
= giggle_remote_new (content
);
188 if(g_file_get_contents (filename
, &content
, NULL
, NULL
)) {
191 lines
= g_strsplit (content
, "\n", -1);
192 for (step
= lines
; step
&& *step
; step
++) {
193 GiggleRemoteBranch
* branch
= NULL
;
197 } else if(g_str_has_prefix(*step
, "URL: ")) {
198 giggle_remote_set_url (remote
, *step
+ strlen ("URL: "));
199 } else if(g_str_has_prefix(*step
, "Push: ")) {
200 branch
= giggle_remote_branch_new (GIGGLE_REMOTE_DIRECTION_PUSH
,
201 *step
+ strlen ("Push: "));
202 } else if(g_str_has_prefix(*step
, "Pull: ")) {
203 branch
= giggle_remote_branch_new (GIGGLE_REMOTE_DIRECTION_PULL
,
204 *step
+ strlen ("Pull: "));
206 gchar
* escaped
= g_strescape (*step
, NULL
);
207 g_warning ("Read unexpected line at %s:%td\n\"%s\"",
208 filename
, step
- lines
, escaped
);
212 if(GIGGLE_IS_REMOTE_BRANCH (branch
)) {
213 giggle_remote_add_branch (remote
, branch
);
214 g_object_unref (branch
);
226 giggle_remote_get_branches (GiggleRemote
*remote
)
228 g_return_val_if_fail (GIGGLE_IS_REMOTE (remote
), NULL
);
230 return GET_PRIV (remote
)->branches
;
234 giggle_remote_remove_branches (GiggleRemote
*self
)
236 GiggleRemotePriv
*priv
;
238 g_return_if_fail (GIGGLE_IS_REMOTE (self
));
240 priv
= GET_PRIV (self
);
242 g_list_foreach (priv
->branches
, (GFunc
)g_object_unref
, NULL
);
243 g_list_free (priv
->branches
);
244 priv
->branches
= NULL
;
245 g_object_notify (G_OBJECT (self
), "branches");
249 giggle_remote_get_name (GiggleRemote
*remote
)
251 g_return_val_if_fail (GIGGLE_IS_REMOTE (remote
), NULL
);
253 return GET_PRIV (remote
)->name
;
257 giggle_remote_set_name (GiggleRemote
*self
,
260 GiggleRemotePriv
*priv
;
262 g_return_if_fail (GIGGLE_IS_REMOTE (self
));
263 g_return_if_fail (name
&& *name
);
265 priv
= GET_PRIV (self
);
267 if (name
== priv
->name
) {
272 priv
->name
= g_strdup (name
);
274 g_object_notify (G_OBJECT (self
), "name");
278 giggle_remote_get_url (GiggleRemote
*remote
)
280 g_return_val_if_fail (GIGGLE_IS_REMOTE (remote
), NULL
);
282 return GET_PRIV (remote
)->url
;
286 giggle_remote_set_url (GiggleRemote
*remote
,
289 GiggleRemotePriv
*priv
;
291 g_return_if_fail (GIGGLE_IS_REMOTE (remote
));
292 priv
= GET_PRIV (remote
);
294 if(priv
->url
== url
) {
299 priv
->url
= g_strdup (url
);
301 g_object_notify (G_OBJECT (remote
), "url");
305 giggle_remote_save_to_file (GiggleRemote
*self
,
306 gchar
const *filename
)
311 g_return_if_fail (GIGGLE_IS_REMOTE (self
));
313 file
= g_fopen (filename
, "w");
315 g_return_if_fail (file
);
317 /* "URL: kenny.imendio.com:/var/git/public/sven/giggle.git" */
318 fprintf (file
, "URL: %s\n", giggle_remote_get_url (self
));
320 for (branches
= giggle_remote_get_branches (self
); branches
; branches
= g_list_next (branches
)) {
321 /* "Pull: refs/heads/master:refs/heads/origin" */
322 gchar
const* direction
;
324 switch(giggle_remote_branch_get_direction (branches
->data
)) {
325 case GIGGLE_REMOTE_DIRECTION_PULL
:
328 case GIGGLE_REMOTE_DIRECTION_PUSH
:
332 g_warning ("Got unexpected remote direction: %d",
333 giggle_remote_branch_get_direction (branches
->data
));
338 fprintf (file
, "%s: %s\n", direction
,
339 giggle_remote_branch_get_refspec (branches
->data
));