[RFC 02/11] remote.c: add infrastructure for parsing --prune options

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



For now, only handle --prune/--no-prune.  But handle the option via a
callback so that in the future --prune=PATTERN can be implemented.

The new functions are not yet used.

Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx>
---
 remote.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 remote.h | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 97 insertions(+)

diff --git a/remote.c b/remote.c
index 075ed71..297e52f 100644
--- a/remote.c
+++ b/remote.c
@@ -7,6 +7,7 @@
 #include "dir.h"
 #include "tag.h"
 #include "string-list.h"
+#include "argv-array.h"
 #include "mergesort.h"
 
 enum map_direction { FROM_SRC, FROM_DST };
@@ -58,6 +59,67 @@ static struct rewrites rewrites_push;
 #define BUF_SIZE (2048)
 static char buffer[BUF_SIZE];
 
+int prune_option_parse(const struct option *opt, const char *arg, int unset)
+{
+	struct prune_option *target = opt->value;
+
+	if (unset) {
+		target->prune = 0;
+	} else {
+		target->prune = 1;
+	}
+	return 0;
+}
+
+static int git_fetch_config(const char *k, const char *v, void *cb)
+{
+	int *fetch_prune_config = cb;
+
+	if (!strcmp(k, "fetch.prune")) {
+		*fetch_prune_config = git_config_bool(k, v);
+		return 0;
+	}
+	return 0;
+}
+
+void prune_option_fill(struct remote *remote,
+		       struct prune_option *prune_option, int default_prune)
+{
+	if (prune_option->prune < 0) {
+		/*
+		 * The user specified neither --prune nor --no-prune;
+		 * use the configured value of remote.<name>.prune or
+		 * fetch.prune:
+		 */
+		if (remote->prune >= 0) {
+			prune_option->prune = remote->prune;
+		} else {
+			int fetch_prune_config = -1;
+
+			git_config(git_fetch_config, &fetch_prune_config);
+
+			if (fetch_prune_config >= 0)
+				prune_option->prune = fetch_prune_config;
+			else
+				prune_option->prune = default_prune;
+		}
+	}
+}
+
+void argv_push_prune_option(struct argv_array *argv,
+			    struct prune_option *prune_option)
+{
+	if (prune_option->prune != -1)
+		argv_array_pushf(argv,
+				 prune_option->prune
+				 ? "--prune"
+				 : "--no-prune");
+}
+
+void prune_option_clear(struct prune_option *prune_option)
+{
+}
+
 static int valid_remote(const struct remote *remote)
 {
 	return (!!remote->url) || (!!remote->foreign_vcs);
diff --git a/remote.h b/remote.h
index afa3792..21ff4cb 100644
--- a/remote.h
+++ b/remote.h
@@ -53,6 +53,40 @@ struct remote {
 	char *http_proxy;
 };
 
+/* Structure to hold parsed --prune/--no-prune options */
+struct prune_option {
+	/* Should we prune at all?  -1 is indeterminate. */
+	int prune;
+};
+
+#define PRUNE_OPTION_INIT { -1 }
+
+/* parse_opts() callback for --prune/--no-prune options */
+int prune_option_parse(const struct option *opt, const char *arg, int unset);
+
+/*
+ * Fill in prune_option for the specified remote, given the
+ * prune_option values parsed from the command-line.  default_prune
+ * specifies whether pruning should default to true or false if it has
+ * not been configured explicitly.
+ */
+void prune_option_fill(struct remote *remote,
+		       struct prune_option *prune_option, int default_prune);
+
+/*
+ * Add --prune/--prune=<pattern>/--no-prune options to the argv_array
+ * to represent the options in prune_options.
+ */
+struct argv_array;
+void argv_push_prune_option(struct argv_array *argv,
+			    struct prune_option *prune_option);
+
+/*
+ * Free any resources used by *prune_option (but not *prune_option
+ * itself).
+ */
+void prune_option_clear(struct prune_option *prune_option);
+
 struct remote *remote_get(const char *name);
 struct remote *pushremote_get(const char *name);
 int remote_is_configured(const char *name);
@@ -238,6 +272,7 @@ struct ref *guess_remote_head(const struct ref *head,
  * Return refs that no longer exist on remote and that match one of
  * the patterns.
  */
+struct string_list;
 struct ref *get_stale_heads(struct refspec *refs, int ref_count,
 			    struct ref *fetch_map,
 			    struct string_list *patterns);
-- 
1.8.4.3

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]