Re: [PATCH v7 2/3] branch: mark missing tracking branch as gone

2013-08-21 Thread Matthieu Moy
Jiang Xin worldhello@gmail.com writes:

 $ git status
 # On branch topic
 # Your branch is based on 'topicbase', but the upstream is gone.
 #   (use git branch --unset-upstream to fixup)

Sorry, I didn't follow closely the previous discussions. I'm not sure
gone is right either, since the user may just have configured an
upstream that does not exist and never existed. Perhaps absent would
be better.

Just a thought, shouldn't block the patch.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
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 v7 2/3] branch: mark missing tracking branch as gone

2013-08-21 Thread Jiang Xin
2013/8/21 Matthieu Moy matthieu@grenoble-inp.fr:
 Jiang Xin worldhello@gmail.com writes:

 $ git status
 # On branch topic
 # Your branch is based on 'topicbase', but the upstream is gone.
 #   (use git branch --unset-upstream to fixup)

 Sorry, I didn't follow closely the previous discussions. I'm not sure
 gone is right either, since the user may just have configured an
 upstream that does not exist and never existed. Perhaps absent would
 be better.

 Just a thought, shouldn't block the patch.

Thank you for following this, and offering better statements. I will
make another reroll after the end of my business trip this week.

-- 
Jiang Xin
--
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


[PATCH v7 2/3] branch: mark missing tracking branch as gone

2013-08-15 Thread Jiang Xin
If a branch has been set to track a upstream, but the upstream branch
is missing, the tracking info is silently ignored in the output of
some commands such as git branch -vv and git status, as if there
were no such tracking settings.

Junio suggested missing upstream should be reported [1], such as:

$ git branch -v -v
  mastere67ac84 initial
* topic 3fc0f2a [topicbase: gone] topic

$ git status
# On branch topic
# Your branch is based on 'topicbase', but the upstream is gone.
#   (use git branch --unset-upstream to fixup)
...

$ git status -b -s
## topic...topicbase [gone]
...

In order to do like that, we need to distinguish these three cases
(i.e. no tracking, with configured but no longer valid tracking, and
with tracking) in function stat_tracking_info(). So the refactored
function stat_tracking_info() has three return values: -1 (with gone
base), 0 (no base), and 1 (with base).

[1]: http://thread.gmane.org/gmane.comp.version-control.git/231830/focus=232288

Suggested-by: Junio C Hamano gits...@pobox.com
Signed-off-by: Jiang Xin worldhello@gmail.com
---
 builtin/branch.c | 18 --
 remote.c | 44 +++
 t/t6040-tracking-info.sh | 49 ++--
 wt-status.c  | 28 +--
 4 files changed, 113 insertions(+), 26 deletions(-)

diff --git a/builtin/branch.c b/builtin/branch.c
index 3e016a6..ad0f86d 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -423,9 +423,20 @@ static void fill_tracking_info(struct strbuf *stat, const 
char *branch_name,
char *ref = NULL;
struct branch *branch = branch_get(branch_name);
struct strbuf fancy = STRBUF_INIT;
+   int upstream_is_gone = 0;
 
-   if (!stat_tracking_info(branch, ours, theirs))
+   switch (stat_tracking_info(branch, ours, theirs)) {
+   case 0:
+   /* no base */
return;
+   case -1:
+   /* with gone base */
+   upstream_is_gone = 1;
+   break;
+   default:
+   /* with base */
+   break;
+   }
 
if (show_upstream_ref) {
ref = shorten_unambiguous_ref(branch-merge[0]-dst, 0);
@@ -437,7 +448,10 @@ static void fill_tracking_info(struct strbuf *stat, const 
char *branch_name,
strbuf_addstr(fancy, ref);
}
 
-   if (!ours  !theirs) {
+   if (upstream_is_gone) {
+   if (show_upstream_ref)
+   strbuf_addf(stat, _([%s: gone]), fancy.buf);
+   } else if (!ours  !theirs) {
if (show_upstream_ref)
strbuf_addf(stat, _([%s]), fancy.buf);
} else if (!ours) {
diff --git a/remote.c b/remote.c
index 26bd543..4caccb5 100644
--- a/remote.c
+++ b/remote.c
@@ -1729,8 +1729,11 @@ int ref_newer(const unsigned char *new_sha1, const 
unsigned char *old_sha1)
 }
 
 /*
- * Return false if cannot stat a tracking branch (not exist or invalid),
- * otherwise true.
+ * Compare a branch with its upstream, and save their differences (number
+ * of commits) in *num_ours and *num_theirs.
+ *
+ * Return 0 if branch has no upstream (no base), -1 if upstream is missing
+ * (with gone base), otherwise 1 (with base).
  */
 int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs)
 {
@@ -1749,16 +1752,16 @@ int stat_tracking_info(struct branch *branch, int 
*num_ours, int *num_theirs)
/* Cannot stat if what we used to build on no longer exists */
base = branch-merge[0]-dst;
if (read_ref(base, sha1))
-   return 0;
+   return -1;
theirs = lookup_commit_reference(sha1);
if (!theirs)
-   return 0;
+   return -1;
 
if (read_ref(branch-refname, sha1))
-   return 0;
+   return -1;
ours = lookup_commit_reference(sha1);
if (!ours)
-   return 0;
+   return -1;
 
/* are we the same? */
if (theirs == ours) {
@@ -1808,17 +1811,34 @@ int format_tracking_info(struct branch *branch, struct 
strbuf *sb)
 {
int ours, theirs;
const char *base;
+   int upstream_is_gone = 0;
 
-   if (!stat_tracking_info(branch, ours, theirs))
-   return 0;
-
-   /* Nothing to report if neither side has changes. */
-   if (!ours  !theirs)
+   switch (stat_tracking_info(branch, ours, theirs)) {
+   case 0:
+   /* no base */
return 0;
+   case -1:
+   /* with gone base */
+   upstream_is_gone = 1;
+   break;
+   default:
+   /* Nothing to report if neither side has changes. */
+   if (!ours  !theirs)
+   return 0;
+   /* with base */
+   break;
+   }
 
base =