[PATCH v2 5/6] git-reflog: add create and exists functions

2015-06-25 Thread David Turner
These are necessary because ref backends manage reflogs. In a moment,
we will use these functions to make git stash work with alternate
ref backends.

Signed-off-by: David Turner dtur...@twopensource.com
---
 builtin/reflog.c | 79 +++-
 1 file changed, 78 insertions(+), 1 deletion(-)

diff --git a/builtin/reflog.c b/builtin/reflog.c
index c2eb8ff..a64158d 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -13,6 +13,10 @@ static const char reflog_expire_usage[] =
 git reflog expire [--expire=time] [--expire-unreachable=time] [--rewrite] 
[--updateref] [--stale-fix] [--dry-run | -n] [--verbose] [--all] refs...;
 static const char reflog_delete_usage[] =
 git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] 
refs...;
+static const char reflog_create_usage[] =
+git reflog create refs...;
+static const char reflog_exists_usage[] =
+git reflog exists refs...;
 
 static unsigned long default_reflog_expire;
 static unsigned long default_reflog_expire_unreachable;
@@ -699,12 +703,79 @@ static int cmd_reflog_delete(int argc, const char **argv, 
const char *prefix)
return status;
 }
 
+static int cmd_reflog_create(int argc, const char **argv, const char *prefix)
+{
+   int i, status = 0, start = 0;
+   struct strbuf err = STRBUF_INIT;
+
+   for (i = 1; i  argc; i++) {
+   const char *arg = argv[i];
+   if (!strcmp(arg, --)) {
+   i++;
+   break;
+   }
+   else if (arg[0] == '-')
+   usage(reflog_create_usage);
+   else
+   break;
+   }
+
+   start = i;
+
+   if (argc - start  1)
+   return error(Nothing to create?);
+
+   for (i = start ; i  argc; i++) {
+   if (check_refname_format(argv[i], REFNAME_ALLOW_ONELEVEL))
+   die(invalid ref format: %s, argv[i]);
+   }
+   for (i = start ; i  argc; i++) {
+   if (safe_create_reflog(argv[i], err)) {
+   error(could not create reflog %s: %s, argv[i],
+ err.buf);
+   status = 1;
+   strbuf_release(err);
+   }
+   }
+   return status;
+}
+
+static int cmd_reflog_exists(int argc, const char **argv, const char *prefix)
+{
+   int i, status = 0, start = 0;
+
+   for (i = 1; i  argc; i++) {
+   const char *arg = argv[i];
+   if (!strcmp(arg, --)) {
+   i++;
+   break;
+   }
+   else if (arg[0] == '-')
+   usage(reflog_exists_usage);
+   else
+   break;
+   }
+
+   start = i;
+
+   if (argc - start  1)
+   return error(Nothing to check?);
+
+   for (i = start ; i  argc; i++) {
+   if (check_refname_format(argv[i], REFNAME_ALLOW_ONELEVEL))
+   die(invalid ref format: %s, argv[i]);
+   if (!reflog_exists(argv[i]))
+   status = 1;
+   }
+   return status;
+}
+
 /*
  * main reflog
  */
 
 static const char reflog_usage[] =
-git reflog [ show | expire | delete ];
+git reflog [ show | expire | delete | create | exists ];
 
 int cmd_reflog(int argc, const char **argv, const char *prefix)
 {
@@ -724,5 +795,11 @@ int cmd_reflog(int argc, const char **argv, const char 
*prefix)
if (!strcmp(argv[1], delete))
return cmd_reflog_delete(argc - 1, argv + 1, prefix);
 
+   if (!strcmp(argv[1], create))
+   return cmd_reflog_create(argc - 1, argv + 1, prefix);
+
+   if (!strcmp(argv[1], exists))
+   return cmd_reflog_exists(argc - 1, argv + 1, prefix);
+
return cmd_log_reflog(argc, argv, prefix);
 }
-- 
2.0.4.314.gdbf7a51-twtrsrc

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


Re: [PATCH v2 5/6] git-reflog: add create and exists functions

2015-06-25 Thread Junio C Hamano
David Turner dtur...@twopensource.com writes:

Because...???

 These are necessary because ref backends manage reflogs.

Because ref backends manage reflogs may be a good explanation to
implement something as part of ref API, but it does not explain why
that something needs to be implemented in the first place.

 In a moment,
 we will use these functions to make git stash work with alternate
 ref backends.

 Signed-off-by: David Turner dtur...@twopensource.com
 ---
  builtin/reflog.c | 79 
 +++-
  1 file changed, 78 insertions(+), 1 deletion(-)

 diff --git a/builtin/reflog.c b/builtin/reflog.c
 index c2eb8ff..a64158d 100644
 --- a/builtin/reflog.c
 +++ b/builtin/reflog.c
 @@ -13,6 +13,10 @@ static const char reflog_expire_usage[] =
  git reflog expire [--expire=time] [--expire-unreachable=time] 
 [--rewrite] [--updateref] [--stale-fix] [--dry-run | -n] [--verbose] [--all] 
 refs...;
  static const char reflog_delete_usage[] =
  git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] 
 refs...;
 +static const char reflog_create_usage[] =
 +git reflog create refs...;

It makes sense to take more than one; you may want to prepare more
than one, and you would signal error by exiting with a non-zero
status if any of them failed.

 +static const char reflog_exists_usage[] =
 +git reflog exists refs...;

This is iffy, though.  git reflog exists foo bar says all of them
exist or some of them exist?  Why is it more useful to implement
all of them exist?

Perhaps dropping ... would be simpler to explain and less
confusing.

 @@ -699,12 +703,79 @@ static int cmd_reflog_delete(int argc, const char 
 **argv, const char *prefix)
   return status;
  }
  
 +static int cmd_reflog_create(int argc, const char **argv, const char *prefix)
 +{
 + int i, status = 0, start = 0;
 + struct strbuf err = STRBUF_INIT;
 +
 + for (i = 1; i  argc; i++) {
 + const char *arg = argv[i];
 + if (!strcmp(arg, --)) {
 + i++;
 + break;
 + }
 + else if (arg[0] == '-')
 + usage(reflog_create_usage);
 + else
 + break;
 + }
 +
 + start = i;
 +
 + if (argc - start  1)
 + return error(Nothing to create?);
 +
 + for (i = start ; i  argc; i++) {

s/start ;/start;/ (everywhere).
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 5/6] git-reflog: add create and exists functions

2015-06-25 Thread David Turner
On Thu, 2015-06-25 at 16:45 -0400, David Turner wrote:
 +static int cmd_reflog_create(int argc, const char **argv, const char *prefix)
 +{

While revising this patch, I noticed that safe_create_reflog (and this
cmd_reflog_create) only creates reflogs for refs of the form that git
itself would autocreate reflogs for.  In other words, it won't create a
reflog for foo, but will create a reflog for refs/heads/foo (even though
that is very likely to already exist).

So I'll fix that when I re-roll.

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