index 589bc5329c4a0b99d1b93ce435d2a2c78a67b3be..54d99a721378cee897c49df99e728b61357dba55 100644 (file)
--- a/tig.c
+++ b/tig.c
static void __NORETURN die(const char *err, ...);
static void warn(const char *msg, ...);
static void report(const char *msg, ...);
static void __NORETURN die(const char *err, ...);
static void warn(const char *msg, ...);
static void report(const char *msg, ...);
-static void set_nonblocking_input(bool loading);
static size_t utf8_length(const char **start, size_t skip, int *width, size_t max_width, int *trimmed, bool reserve, int tab_size);
static inline unsigned char utf8_char_length(const char *string, const char *end);
static size_t utf8_length(const char **start, size_t skip, int *width, size_t max_width, int *trimmed, bool reserve, int tab_size);
static inline unsigned char utf8_char_length(const char *string, const char *end);
struct ref **refs; /* References for this ID. */
};
struct ref **refs; /* References for this ID. */
};
+static struct ref *get_ref_head();
static struct ref_list *get_ref_list(const char *id);
static void foreach_ref(bool (*visitor)(void *data, const struct ref *ref), void *data);
static int load_refs(void);
static struct ref_list *get_ref_list(const char *id);
static void foreach_ref(bool (*visitor)(void *data, const struct ref *ref), void *data);
static int load_refs(void);
static char opt_file[SIZEOF_STR] = "";
static char opt_ref[SIZEOF_REF] = "";
static char opt_head[SIZEOF_REF] = "";
static char opt_file[SIZEOF_STR] = "";
static char opt_ref[SIZEOF_REF] = "";
static char opt_head[SIZEOF_REF] = "";
-static char opt_head_rev[SIZEOF_REV] = "";
static char opt_remote[SIZEOF_REF] = "";
static char opt_encoding[20] = "UTF-8";
static iconv_t opt_iconv_in = ICONV_NONE;
static char opt_remote[SIZEOF_REF] = "";
static char opt_encoding[20] = "UTF-8";
static iconv_t opt_iconv_in = ICONV_NONE;
static char opt_editor[SIZEOF_STR] = "";
static FILE *opt_tty = NULL;
static char opt_editor[SIZEOF_STR] = "";
static FILE *opt_tty = NULL;
-#define is_initial_commit() (!*opt_head_rev)
-#define is_head_commit(rev) (!strcmp((rev), "HEAD") || !strcmp(opt_head_rev, (rev)))
+#define is_initial_commit() (!get_ref_head())
+#define is_head_commit(rev) (!strcmp((rev), "HEAD") || (get_ref_head() && !strcmp(rev, get_ref_head()->id)))
#define mkdate(time) string_date(time, opt_date)
#define mkdate(time) string_date(time, opt_date)
while (!view->ops->read(view, NULL))
if (!force)
return;
while (!view->ops->read(view, NULL))
if (!force)
return;
- set_nonblocking_input(FALSE);
if (force)
kill_io(view->pipe);
done_io(view->pipe);
if (force)
kill_io(view->pipe);
done_io(view->pipe);
static void
setup_update(struct view *view, const char *vid)
{
static void
setup_update(struct view *view, const char *vid)
{
- set_nonblocking_input(TRUE);
reset_view(view);
string_copy_rev(view->vid, vid);
view->pipe = &view->io;
reset_view(view);
string_copy_rev(view->vid, vid);
view->pipe = &view->io;
update_view_title(view);
}
update_view_title(view);
}
-/* Controls when nodelay should be in effect when polling user input. */
-static void
-set_nonblocking_input(bool loading)
-{
- static unsigned int loading_views;
-
- if ((loading == FALSE && loading_views-- == 1) ||
- (loading == TRUE && loading_views++ == 0))
- nodelay(status_win, loading);
-}
-
static void
init_display(void)
{
static void
init_display(void)
{
{
struct view *view;
int i, key, cursor_y, cursor_x;
{
struct view *view;
int i, key, cursor_y, cursor_x;
+ bool loading = FALSE;
if (prompt_position)
input_mode = TRUE;
if (prompt_position)
input_mode = TRUE;
use_scroll_redrawwin)
redrawwin(view->win);
view->has_scrolled = FALSE;
use_scroll_redrawwin)
redrawwin(view->win);
view->has_scrolled = FALSE;
+ if (view->pipe)
+ loading = TRUE;
}
/* Update the cursor position. */
}
/* Update the cursor position. */
/* Refresh, accept single keystroke of input */
doupdate();
/* Refresh, accept single keystroke of input */
doupdate();
+ nodelay(status_win, loading);
key = wgetch(status_win);
/* wgetch() with nodelay() enabled returns ERR when
key = wgetch(status_win);
/* wgetch() with nodelay() enabled returns ERR when
@@ -7259,6 +7249,7 @@ static bool prompt_menu(const char *prompt, const struct menu_item *items, int *
static struct ref **refs = NULL;
static size_t refs_size = 0;
static struct ref **refs = NULL;
static size_t refs_size = 0;
+static struct ref *refs_head = NULL;
static struct ref_list **ref_lists = NULL;
static size_t ref_lists_size = 0;
static struct ref_list **ref_lists = NULL;
static size_t ref_lists_size = 0;
break;
}
break;
}
+static struct ref *
+get_ref_head()
+{
+ return refs_head;
+}
+
static struct ref_list *
get_ref_list(const char *id)
{
static struct ref_list *
get_ref_list(const char *id)
{
} else if (!prefixcmp(name, "refs/heads/")) {
namelen -= STRING_SIZE("refs/heads/");
name += STRING_SIZE("refs/heads/");
} else if (!prefixcmp(name, "refs/heads/")) {
namelen -= STRING_SIZE("refs/heads/");
name += STRING_SIZE("refs/heads/");
- head = !strncmp(opt_head, name, namelen);
+ if (!strncmp(opt_head, name, namelen))
+ return OK;
} else if (!strcmp(name, "HEAD")) {
} else if (!strcmp(name, "HEAD")) {
- string_ncopy(opt_head_rev, id, idlen);
- return OK;
+ head = TRUE;
+ if (*opt_head) {
+ namelen = strlen(opt_head);
+ name = opt_head;
+ }
}
/* If we are reloading or it's an annotated tag, replace the
}
/* If we are reloading or it's an annotated tag, replace the
ref->tracked = tracked;
string_copy_rev(ref->id, id);
ref->tracked = tracked;
string_copy_rev(ref->id, id);
+ if (head)
+ refs_head = ref;
return OK;
}
return OK;
}
memmove(opt_head, offset, strlen(offset) + 1);
}
memmove(opt_head, offset, strlen(offset) + 1);
}
+ refs_head = NULL;
for (i = 0; i < refs_size; i++)
refs[i]->id[0] = 0;
for (i = 0; i < refs_size; i++)
refs[i]->id[0] = 0;