← Back to team overview

deja-dup-team team mailing list archive

[Merge] lp:~kvdveer/deja-dup/fix-for-1155645 into lp:deja-dup

 

Cyril Feraudet has proposed merging lp:~kvdveer/deja-dup/fix-for-1155645 into lp:deja-dup.

Requested reviews:
  Déjà Dup Developers (deja-dup-hackers)
Related bugs:
  Bug #1155500 in Duplicity: "Support OpenstackSwift as a backend"
  https://bugs.launchpad.net/duplicity/+bug/1155500
  Bug #1155645 in Déjà Dup: "Openstack swift support"
  https://bugs.launchpad.net/deja-dup/+bug/1155645

For more details, see:
https://code.launchpad.net/~kvdveer/deja-dup/fix-for-1155645/+merge/278597
-- 
Your team Déjà Dup Developers is requested to review the proposed merge of lp:~kvdveer/deja-dup/fix-for-1155645 into lp:deja-dup.
=== modified file 'AUTHORS'
--- AUTHORS	2014-10-25 13:52:17 +0000
+++ AUTHORS	2015-11-25 14:33:37 +0000
@@ -27,7 +27,15 @@
            2011-2013 Canonical Ltd
 License: GPL-3+
 
+<<<<<<< TREE
 Files: deja-dup/preferences/PreferencesPanel.c
+=======
+Files: comon/Backendopenstack.c
+Copyright: 2013 Koert van der Veer <koert@xxxxxxxxxxxx>
+License: GPL-3+
+
+Files: preferences/PreferencesPanel.c
+>>>>>>> MERGE-SOURCE
 Copyright: 2010 Intel, Inc
            2011 Michael Terry <mike@xxxxxxxxxxx>
 License: GPL-3+

=== modified file 'data/org.gnome.DejaDup.gschema.xml.in'
--- data/org.gnome.DejaDup.gschema.xml.in	2014-04-29 02:38:47 +0000
+++ data/org.gnome.DejaDup.gschema.xml.in	2015-11-25 14:33:37 +0000
@@ -67,6 +67,7 @@
         <choice value='file'/>
         <choice value='gdrive'/>
         <choice value='rackspace'/>
+        <choice value='openstack'/>
         <choice value='s3'/>
         <choice value='u1'/>
       </choices>
@@ -75,6 +76,7 @@
       <_description>The type of backup location.  If ‘auto’, a default will be chosen based on what is available.</_description>
     </key>
     <child name="rackspace" schema="org.gnome.DejaDup.Rackspace"/>
+    <child name="openstack" schema="org.gnome.DejaDup.Openstack"/>
     <child name="s3" schema="org.gnome.DejaDup.S3"/>
     <child name="gdrive" schema="org.gnome.DejaDup.GDrive"/>
     <child name="file" schema="org.gnome.DejaDup.File"/>
@@ -120,6 +122,38 @@
       <_description>This is your username for the Rackspace Cloud Files service.</_description>
     </key>
   </schema>
+<<<<<<< TREE
+=======
+  <schema id="org.gnome.DejaDup.Openstack" path="/org/gnome/deja-dup/openstack/">
+    <key name="container" type="s">
+      <default>'$HOSTNAME'</default>
+      <_summary>The Openstack Swift container</_summary>
+      <_description>Which Openstack Swift container to store files in.  This does not need to exist already.  Only legal hostname strings are valid.</_description>
+    </key>
+    <key name="username" type="s">
+      <default>''</default>
+      <_summary>Your Openstack username</_summary>
+      <_description>This is your username for the Openstack Swift service.</_description>
+    </key>
+    <key name="tenant" type="s">
+      <default>''</default>
+      <_summary>Your Openstack tenant</_summary>
+      <_description>This is your tenant for the Openstack Swift service.</_description>
+    </key>
+    <key name="authurl" type="s">
+      <default>''</default>
+      <_summary>Authentication URL</_summary>
+      <_description>This is the Authentication URL, or keystone URL for the Openstack service</_description>
+    </key>
+  </schema>
+  <schema id="org.gnome.DejaDup.U1" path="/org/gnome/deja-dup/u1/">
+    <key name="folder" type="s">
+      <default>'/deja-dup/$HOSTNAME'</default>
+      <_summary>The Ubuntu One folder</_summary>
+      <_description>The folder name to store files in.  If ‘$HOSTNAME’, it will default to a folder based on the name of the computer.</_description>
+    </key>
+  </schema>
+>>>>>>> MERGE-SOURCE
   <schema id="org.gnome.DejaDup.File" path="/org/gnome/deja-dup/file/">
     <key name="path" type="s">
       <default>''</default>

=== modified file 'deja-dup/widgets/ConfigLabelLocation.vala'
--- deja-dup/widgets/ConfigLabelLocation.vala	2014-04-29 02:38:47 +0000
+++ deja-dup/widgets/ConfigLabelLocation.vala	2015-11-25 14:33:37 +0000
@@ -28,12 +28,13 @@
   FilteredSettings gdrive_root;
   FilteredSettings s3_root;
   FilteredSettings rackspace_root;
+  FilteredSettings openstack_root;
 
   public ConfigLabelLocation()
   {
     base(null);
   }
-  
+
   construct {
     img = new Gtk.Image.from_icon_name("folder", Gtk.IconSize.MENU);
     fill_box();
@@ -42,6 +43,7 @@
     watch_key(null, (gdrive_root = DejaDup.get_settings(GDRIVE_ROOT)));
     watch_key(null, (s3_root = DejaDup.get_settings(S3_ROOT)));
     watch_key(null, (rackspace_root = DejaDup.get_settings(RACKSPACE_ROOT)));
+    watch_key(null, (openstack_root = DejaDup.get_settings(OPENSTACK_ROOT)));
     set_from_config.begin();
   }
 

=== modified file 'deja-dup/widgets/ConfigLocation.vala'
--- deja-dup/widgets/ConfigLocation.vala	2014-04-29 02:38:47 +0000
+++ deja-dup/widgets/ConfigLocation.vala	2015-11-25 14:33:37 +0000
@@ -63,6 +63,7 @@
   int index_s3 = -2;
   int index_gdrive = -2;
   int index_rackspace = -2;
+  int index_openstack = -2;
   int index_u1 = -2;
   int index_cloud_sep = -2;
   int index_ssh;
@@ -114,6 +115,7 @@
     insert_s3();
     insert_gdrive();
     insert_rackspace();
+    insert_openstack();
 
     // Now insert remote servers
     index_ssh = add_entry(new ThemedIcon.with_default_fallbacks("folder-remote"),
@@ -208,7 +210,19 @@
                               ref index_rackspace, insert_rackspace);
   }
 
+<<<<<<< TREE
   void insert_cloud_if_available(string id, Checker? checker,
+=======
+  void insert_openstack() {
+    insert_cloud_if_available("openstack", BackendOpenstack.get_checker(),
+                              new ThemedIcon("deja-dup-cloud"),
+                              _("Openstack Swift"),
+                              new ConfigLocationOpenstack(label_sizes),
+                              ref index_openstack, insert_openstack);
+  }
+
+  void insert_cloud_if_available(string id, Checker checker,
+>>>>>>> MERGE-SOURCE
                                  Icon icon, string name,
                                  Gtk.Widget? w, ref int index,
                                  CloudCallback cb)
@@ -428,6 +442,8 @@
       index = index_gdrive;
     else if (backend == "rackspace")
       index = index_rackspace;
+    else if (backend == "openstack")
+      index = index_openstack;
     else if (backend == "u1")
       index = index_u1;
     else if (backend == "file") {
@@ -520,6 +536,8 @@
       settings.set_string(BACKEND_KEY, "gdrive");
     else if (index == index_rackspace)
       settings.set_string(BACKEND_KEY, "rackspace");
+    else if (index == index_openstack)
+      settings.set_string(BACKEND_KEY, "openstack");
     else if (index == index_u1)
       settings.set_string(BACKEND_KEY, "u1");
     else if (index == index_ssh)

=== added file 'deja-dup/widgets/ConfigLocationOpenstack.vala'
--- deja-dup/widgets/ConfigLocationOpenstack.vala	1970-01-01 00:00:00 +0000
+++ deja-dup/widgets/ConfigLocationOpenstack.vala	2015-11-25 14:33:37 +0000
@@ -0,0 +1,43 @@
+/* -*- Mode: Vala; indent-tabs-mode: nil; tab-width: 2 -*- */
+/*
+    This file is part of Déjà Dup.
+    For copyright information, see AUTHORS.
+
+    Déjà Dup is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Déjà Dup is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Déjà Dup.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+using GLib;
+
+namespace DejaDup {
+
+public class ConfigLocationOpenstack : ConfigLocationTable
+{
+  public ConfigLocationOpenstack(Gtk.SizeGroup sg) {
+    Object(label_sizes: sg);
+  }
+
+  construct {
+    add_widget(_("_Username"),
+               new ConfigEntry(DejaDup.OPENSTACK_USERNAME_KEY, DejaDup.OPENSTACK_ROOT));
+    add_widget(_("_Container"),
+               new ConfigFolder(DejaDup.OPENSTACK_CONTAINER_KEY, DejaDup.OPENSTACK_ROOT));
+    add_widget(_("_Authentication URL"),
+               new ConfigFolder(DejaDup.OPENSTACK_AUTHURL_KEY, DejaDup.OPENSTACK_ROOT));
+    add_widget(_("_Tenant name"),
+               new ConfigFolder(DejaDup.OPENSTACK_TENANT_KEY, DejaDup.OPENSTACK_ROOT));
+  }
+}
+
+}
+

=== added file 'deja-dup/widgets/Makefile.am.OTHER'
--- deja-dup/widgets/Makefile.am.OTHER	1970-01-01 00:00:00 +0000
+++ deja-dup/widgets/Makefile.am.OTHER	2015-11-25 14:33:37 +0000
@@ -0,0 +1,98 @@
+# -*- Mode: Makefile; indent-tabs-mode: t; tab-width: 2 -*-
+#
+# This file is part of Déjà Dup.
+# For copyright information, see AUTHORS.
+#
+# Déjà Dup is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Déjà Dup is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Déjà Dup.  If not, see <http://www.gnu.org/licenses/>.
+
+pkglib_LTLIBRARIES = libwidgets.la
+
+libwidgets_la_CFLAGS = \
+	-I$(top_srcdir)/common \
+	$(WIDGETS_CFLAGS) \
+	$(UNITY_CFLAGS) \
+	-w \
+	-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\"
+
+libwidgets_la_LDFLAGS = -avoid-version
+
+libwidgets_la_LIBADD = \
+	$(WIDGETS_LIBS) \
+	$(UNITY_LIBS) \
+	@INTLLIBS@ \
+	$(top_builddir)/common/libcommon.la
+
+libwidgets_la_VALASOURCES = \
+	ConfigBool.vala \
+	ConfigChoice.vala \
+	ConfigDelete.vala \
+	ConfigEntry.vala \
+	ConfigFolder.vala \
+	ConfigLabel.vala \
+	ConfigLabelBackupDate.vala \
+	ConfigLabelBool.vala \
+	ConfigLabelList.vala \
+	ConfigLabelLocation.vala \
+	ConfigLabelPolicy.vala \
+	ConfigList.vala \
+	ConfigLocation.vala \
+	ConfigLocationCustom.vala \
+	ConfigLocationDAV.vala \
+	ConfigLocationFile.vala \
+	ConfigLocationFTP.vala \
+	ConfigLocationRackspace.vala \
+	ConfigLocationOpenstack.vala \
+	ConfigLocationS3.vala \
+	ConfigLocationSSH.vala \
+	ConfigLocationSMB.vala \
+	ConfigLocationTable.vala \
+	ConfigLocationU1.vala \
+	ConfigLocationVolume.vala \
+	ConfigNumber.vala \
+	ConfigPeriod.vala \
+	ConfigRelPath.vala \
+	ConfigSwitch.vala \
+	ConfigURLPart.vala \
+	ConfigURLPartBool.vala \
+	ConfigWidget.vala \
+	ToggleGroup.vala \
+	WidgetUtils.vala
+
+libwidgets_la_SOURCES = \
+	$(libwidgets_la_VALASOURCES)
+
+AM_VALAFLAGS = \
+	--library=libwidgets \
+	-H widgets.h \
+	--vapidir=$(top_srcdir)/common \
+	--vapidir=$(top_srcdir)/vapi \
+	$(SHARED_VALAFLAGS) \
+	$(UNITY_VALAFLAGS) \
+	--pkg libcommon \
+	--pkg @GTK_MODULE@ \
+	--pkg uriutils \
+	--pkg libnotify \
+	--pkg config
+
+libwidgets_la_vala.stamp: $(top_srcdir)/config.h
+
+dist-hook:
+	cd $(distdir) && rm -f $(libwidgets_la_VALASOURCES:.vala=.c) \
+	                       widgets.h libwidgets_la_vala.stamp
+	rm -f libwidgets_la_vala.stamp # Start distcheck workarounds
+$(srcdir)/libwidgets_la_vala.stamp: chmod-srcdir
+chmod-srcdir:
+	@chmod u+w $(srcdir) # End distcheck workarounds
+
+CLEANFILES = libwidgets_la_vala.stamp

=== modified file 'libdeja/Backend.vala'
--- libdeja/Backend.vala	2014-04-29 02:38:47 +0000
+++ libdeja/Backend.vala	2015-11-25 14:33:37 +0000
@@ -43,13 +43,13 @@
   public static uint64 INFINITE_SPACE = uint64.MAX;
   public virtual async uint64 get_space(bool free = true) {return INFINITE_SPACE;}
   public virtual bool space_can_be_infinite() {return true;}
-  
+
   // Arguments needed only when the particular mode is active
   // If mode == INVALID, arguments needed any time the backup is referenced.
   public virtual void add_argv(ToolJob.Mode mode, ref List<string> argv) {}
-  
+
   public abstract Backend clone();
-  
+
   public static string get_default_type()
   {
     var settings = get_settings();
@@ -59,6 +59,7 @@
         backend != "s3" &&
         backend != "gdrive" &&
         backend != "rackspace" &&
+        backend != "openstack" &&
         backend != "u1" &&
         backend != "file")
       backend = "auto"; // default to auto if string is not known
@@ -77,6 +78,8 @@
       return new BackendU1();
     else if (backend_name == "rackspace")
       return new BackendRackspace();
+    else if (backend_name == "openstack")
+      return new BackendOpenstack();
     else if (backend_name == "file")
       return new BackendFile();
     else

=== added file 'libdeja/BackendOpenstack.vala'
--- libdeja/BackendOpenstack.vala	1970-01-01 00:00:00 +0000
+++ libdeja/BackendOpenstack.vala	2015-11-25 14:33:37 +0000
@@ -0,0 +1,181 @@
+/* -*- Mode: Vala; indent-tabs-mode: nil; tab-width: 2 -*- */
+/*
+    This file is part of Déjà Dup.
+    For copyright information, see AUTHORS.
+
+    Déjà Dup is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Déjà Dup is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Déjà Dup.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+using GLib;
+
+namespace DejaDup {
+
+public const string OPENSTACK_ROOT = "Openstack";
+public const string OPENSTACK_USERNAME_KEY = "username";
+public const string OPENSTACK_CONTAINER_KEY = "container";
+public const string OPENSTACK_TENANT_KEY = "tenant";
+public const string OPENSTACK_AUTHURL_KEY = "authurl";
+
+public class BackendOpenstack : Backend
+{
+  public static Checker get_checker() {
+    return PythonChecker.get_checker("swiftclient");
+  }
+
+  public override Backend clone() {
+    return new BackendOpenstack();
+  }
+
+  public override bool is_native() {
+    return false;
+  }
+
+  public override Icon? get_icon() {
+    return new ThemedIcon("deja-dup-cloud");
+  }
+
+  public override async bool is_ready(out string when) {
+    var settings = get_settings(OPENSTACK_ROOT);
+    var authurl = get_folder_key(settings, OPENSTACK_AUTHURL_KEY);
+    when = _("Backup will begin when a network connection becomes available.");
+    return yield Network.get().can_reach (authurl);
+  }
+
+  public override string get_location(ref bool as_root)
+  {
+    var settings = get_settings(OPENSTACK_ROOT);
+    var container = get_folder_key(settings, OPENSTACK_CONTAINER_KEY);
+    if (container == "") {
+      container = Environment.get_host_name();
+      settings.set_string(OPENSTACK_CONTAINER_KEY, container);
+    }
+    return "swift://%s".printf(container);
+  }
+
+  public override string get_location_pretty()
+  {
+    var settings = get_settings(OPENSTACK_ROOT);
+    var container = settings.get_string(OPENSTACK_CONTAINER_KEY);
+    if (container == "")
+      return _("Openstack Swift");
+    else
+      // Translators: %s is a folder.
+      return _("%s on Openstack Swift").printf(container);
+  }
+
+  string settings_id;
+  string id;
+  string secret_key;
+  public override async void get_envp() throws Error
+  {
+    var settings = get_settings(OPENSTACK_ROOT);
+    settings_id = settings.get_string(OPENSTACK_USERNAME_KEY);
+    id = settings_id == null ? "" : settings_id;
+
+    var authurl = settings.get_string(OPENSTACK_AUTHURL_KEY);
+
+    if (id != "" && secret_key != null) {
+      // We've already been run before and got the key
+      got_secret_key();
+      return;
+    }
+
+    if (id != "") {
+      // First, try user's keyring
+      try {
+        secret_key = yield Secret.password_lookup(Secret.SCHEMA_COMPAT_NETWORK,
+                                                  null,
+                                                  "user", id,
+                                                  "server", authurl,
+                                                  "protocol", "https");
+        if (secret_key != null) {
+          got_secret_key();
+          return;
+        }
+      }
+      catch (Error e) {
+        // fall through to ask_password below
+      }
+    }
+
+    // Didn't find it, so ask user
+    ask_password();
+  }
+
+  async void got_password_reply(MountOperation mount_op, MountOperationResult result)
+  {
+    if (result != MountOperationResult.HANDLED) {
+      envp_ready(false, new List<string>(), _("Permission denied"));
+      return;
+    }
+
+    id = mount_op.username;
+    secret_key = mount_op.password;
+
+    // Save it
+    var remember = mount_op.password_save;
+    if (remember != PasswordSave.NEVER) {
+      string where = (remember == PasswordSave.FOR_SESSION) ?
+                     Secret.COLLECTION_SESSION : Secret.COLLECTION_DEFAULT;
+
+      var settings = get_settings(OPENSTACK_ROOT);
+      var authurl = get_folder_key(settings, OPENSTACK_AUTHURL_KEY);
+      var tenant = get_folder_key(settings, OPENSTACK_TENANT_KEY);
+
+      try {
+        yield Secret.password_store(Secret.SCHEMA_COMPAT_NETWORK,
+                                    where,
+                                    "%s:%s@%s".printf(tenant, id, authurl),
+                                    secret_key,
+                                    null,
+                                    "user", id,
+                                    "server", authurl,
+                                    "protocol", "https");
+      }
+      catch (Error e) {
+        warning("%s\n", e.message);
+      }
+    }
+
+    got_secret_key();
+  }
+
+  void ask_password() {
+    mount_op.reply.connect(got_password_reply);
+    mount_op.ask_password("", id, "",
+                          AskPasswordFlags.NEED_PASSWORD |
+                          AskPasswordFlags.NEED_USERNAME |
+                          AskPasswordFlags.SAVING_SUPPORTED);
+  }
+
+  void got_secret_key() {
+    var settings = get_settings(OPENSTACK_ROOT);
+
+    if (id != settings_id)
+      settings.set_string(OPENSTACK_USERNAME_KEY, id);
+
+    var tenantName = settings.set_string(OPENSTACK_TENANT_KEY, id);
+    var authurl = settings.set_string(OPENSTACK_TENANT_KEY, id);
+
+    List<string> envp = new List<string>();
+    envp.append("SWIFT_TENANTNAME=%s".printf(tenantName));
+    envp.append("SWIFT_AUTHURL=%s".printf(authurl));
+    envp.append("SWIFT_USERNAME=%s".printf(id));
+    envp.append("SWIFT_PASSWORD=%s".printf(secret_key));
+    envp_ready(true, envp);
+  }
+}
+
+} // end namespace
+

=== added file 'libdeja/Makefile.am.OTHER'
--- libdeja/Makefile.am.OTHER	1970-01-01 00:00:00 +0000
+++ libdeja/Makefile.am.OTHER	2015-11-25 14:33:37 +0000
@@ -0,0 +1,92 @@
+# -*- Mode: Makefile; indent-tabs-mode: t; tab-width: 2 -*-
+#
+# This file is part of Déjà Dup.
+# For copyright information, see AUTHORS.
+#
+# Déjà Dup is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Déjà Dup is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Déjà Dup.  If not, see <http://www.gnu.org/licenses/>.
+
+pkglib_LTLIBRARIES = libcommon.la
+
+libcommon_la_CFLAGS = \
+	$(COMMON_CFLAGS) \
+	-w \
+	-DPKG_LIBEXEC_DIR=\"$(pkglibexecdir)\" \
+	-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\"
+
+libcommon_la_LDFLAGS = -avoid-version
+
+libcommon_la_LIBADD = \
+	$(COMMON_LIBS) \
+	@INTLLIBS@
+
+noinst_HEADERS = \
+	uriutils.h
+
+libcommon_la_VALASOURCES = \
+	AsyncCommand.vala \
+	Backend.vala \
+	BackendAuto.vala \
+	BackendFile.vala \
+	BackendRackspace.vala \
+	BackendOpenstack.vala \
+	BackendS3.vala \
+	BackendU1.vala \
+	Checker.vala \
+	CommonUtils.vala \
+	DirHandling.vala \
+	FilteredSettings.vala \
+	Network.vala \
+	Operation.vala \
+	OperationBackup.vala \
+	OperationFiles.vala \
+	OperationRestore.vala \
+	OperationStatus.vala \
+	OperationVerify.vala \
+	PythonChecker.vala \
+	RecursiveDelete.vala \
+	RecursiveMove.vala \
+	RecursiveOp.vala \
+	ToolPlugin.vala
+
+libcommon_la_SOURCES = \
+	uriutils.c \
+	$(libcommon_la_VALASOURCES)
+
+AM_VALAFLAGS = \
+	--library=libcommon \
+	-H common.h \
+	--vapidir=$(top_srcdir)/vapi \
+	$(SHARED_VALAFLAGS) \
+	--pkg gio-2.0 \
+	--pkg gio-unix-2.0 \
+	--pkg libsecret-1 \
+	--pkg secret \
+	--pkg libpeas-1.0 \
+	--pkg uriutils \
+	--pkg posix \
+	--pkg config
+
+libcommon_la_vala.stamp: $(top_srcdir)/config.h
+
+dist-hook:
+	cd $(distdir) && rm -f $(libcommon_la_VALASOURCES:.vala=.c) \
+	                       common.h libcommon_la_vala.stamp
+	rm -f libcommon_la_vala.stamp # Start distcheck workarounds
+$(srcdir)/libcommon_la_vala.stamp: chmod-srcdir
+chmod-srcdir:
+	@chmod u+w $(srcdir) # End distcheck workarounds
+
+CLEANFILES = libcommon_la_vala.stamp
+
+EXTRA_DIST = libcommon.deps


Follow ups